From 7651948127b36ea8879f2f8d60022d2b8227b74e Mon Sep 17 00:00:00 2001 From: "Graydon, Tracy" Date: Thu, 12 Jul 2012 11:57:04 -0700 Subject: [PATCH 1/1] Recreate the navit git/gerrit project that vanished --- ABOUT-NLS | 768 + AUTHORS | 7 + COPYING | 164 + COPYRIGHT | 2 + ChangeLog | 4 + GPL-2 | 339 + INSTALL | 365 + LGPL-2 | 481 + Makefile.am | 25 + Makefile.in | 951 + Makefile.inc | 15 + NEWS | 0 README | 101 + aclocal.m4 | 1189 + compile | 143 + config.guess | 1511 + config.h.in | 522 + config.rpath | 548 + config.sub | 1705 ++ configure | 28502 +++++++++++++++++++ configure.in | 1337 + depcomp | 630 + install-sh | 520 + intl/ChangeLog | 4 + intl/Makefile.in | 493 + intl/VERSION | 1 + intl/bindtextdom.c | 363 + intl/config.charset | 608 + intl/dcgettext.c | 56 + intl/dcigettext.c | 1219 + intl/dcngettext.c | 57 + intl/dgettext.c | 58 + intl/dngettext.c | 59 + intl/eval-plural.h | 108 + intl/explodename.c | 185 + intl/finddomain.c | 192 + intl/gettext.c | 63 + intl/gettextP.h | 215 + intl/gmo.h | 149 + intl/hash-string.h | 48 + intl/intl-compat.c | 131 + intl/l10nflist.c | 421 + intl/libgnuintl.h.in | 383 + intl/loadinfo.h | 145 + intl/loadmsgcat.c | 1420 + intl/localcharset.c | 398 + intl/localcharset.h | 42 + intl/locale.alias | 78 + intl/localealias.c | 414 + intl/localename.c | 1142 + intl/log.c | 98 + intl/ngettext.c | 65 + intl/os2compat.c | 98 + intl/os2compat.h | 46 + intl/osdep.c | 24 + intl/plural-exp.c | 154 + intl/plural-exp.h | 118 + intl/plural.c | 1977 ++ intl/plural.y | 381 + intl/printf-args.c | 119 + intl/printf-args.h | 137 + intl/printf-parse.c | 537 + intl/printf-parse.h | 75 + intl/printf.c | 371 + intl/ref-add.sin | 31 + intl/ref-del.sin | 26 + intl/relocatable.c | 449 + intl/relocatable.h | 77 + intl/textdomain.c | 141 + intl/vasnprintf.c | 887 + intl/vasnprintf.h | 61 + intl/vasnwprintf.h | 46 + intl/wprintf-parse.h | 75 + intl/xsize.h | 109 + ltmain.sh | 8406 ++++++ m4/codeset.m4 | 23 + m4/gettext.m4 | 487 + m4/glibc21.m4 | 32 + m4/iconv.m4 | 103 + m4/intdiv0.m4 | 72 + m4/intmax.m4 | 32 + m4/inttypes-pri.m4 | 32 + m4/inttypes.m4 | 27 + m4/inttypes_h.m4 | 28 + m4/isc-posix.m4 | 26 + m4/lcmessage.m4 | 32 + m4/lib-ld.m4 | 112 + m4/lib-link.m4 | 551 + m4/lib-prefix.m4 | 155 + m4/libtool.m4 | 7365 +++++ m4/longdouble.m4 | 30 + m4/longlong.m4 | 25 + m4/ltoptions.m4 | 368 + m4/ltsugar.m4 | 123 + m4/ltversion.m4 | 23 + m4/lt~obsolete.m4 | 92 + m4/nls.m4 | 49 + m4/po.m4 | 426 + m4/printf-posix.m4 | 46 + m4/progtest.m4 | 91 + m4/signed.m4 | 19 + m4/size_max.m4 | 61 + m4/stdint_h.m4 | 28 + m4/uintmax_t.m4 | 32 + m4/ulonglong.m4 | 25 + m4/wchar_t.m4 | 22 + m4/wint_t.m4 | 22 + m4/xsize.m4 | 14 + man/Makefile.am | 1 + man/Makefile.in | 589 + man/maptool.1 | 86 + man/navit.1 | 49 + missing | 376 + mkinstalldirs | 111 + navit/Makefile.am | 244 + navit/Makefile.in | 1235 + navit/android.c | 450 + navit/android.h | 23 + navit/announcement.c | 68 + navit/announcement.h | 24 + navit/atom.c | 31 + navit/atom.h | 9 + navit/attr.c | 731 + navit/attr.h | 197 + navit/attr_def.h | 460 + navit/autoload/Makefile.am | 6 + navit/autoload/Makefile.in | 709 + navit/autoload/osso/Makefile.am | 6 + navit/autoload/osso/Makefile.in | 691 + navit/autoload/osso/osso.c | 100 + navit/binding/Makefile.am | 15 + navit/binding/Makefile.in | 711 + navit/binding/dbus/Makefile.am | 18 + navit/binding/dbus/Makefile.in | 725 + navit/binding/dbus/binding_dbus.c | 1823 ++ .../dbus/org.navit_project.navit.service.in | 3 + navit/binding/python/Makefile.am | 6 + navit/binding/python/Makefile.in | 698 + navit/binding/python/attr.c | 99 + navit/binding/python/binding_python.c | 370 + navit/binding/python/common.h | 55 + navit/binding/python/config.c | 73 + navit/binding/python/navigation.c | 82 + navit/binding/python/navit.c | 135 + navit/binding/python/pcoord.c | 88 + navit/binding/python/route.c | 84 + navit/binding/win32/Makefile.am | 15 + navit/binding/win32/Makefile.in | 764 + navit/binding/win32/binding_win32.c | 143 + navit/binding/win32/binding_win32.h | 37 + navit/binding/win32/tell_navit.c | 176 + navit/bookmarks.c | 753 + navit/bookmarks.h | 63 + navit/builtin.c | 3 + navit/cache.c | 397 + navit/cache.h | 13 + navit/callback.c | 268 + navit/callback.h | 89 + navit/color.h | 41 + navit/command.c | 1156 + navit/command.h | 60 + navit/compass.c | 156 + navit/compass.h | 26 + navit/config_.c | 174 + navit/config_.h | 25 + navit/coord.c | 398 + navit/coord.h | 164 + navit/country.c | 429 + navit/country.h | 41 + navit/data.h | 108 + navit/data_window.c | 41 + navit/data_window.h | 44 + navit/data_window_int.h | 31 + navit/debug.c | 437 + navit/debug.h | 90 + navit/destination.h | 29 + navit/draw_info.h | 30 + navit/endianess.h | 113 + navit/event.c | 125 + navit/event.h | 72 + navit/event_glib.c | 199 + navit/event_glib.h | 3 + navit/fib-1.1/Makefile.am | 3 + navit/fib-1.1/Makefile.in | 622 + navit/fib-1.1/README | 26 + navit/fib-1.1/configure.in | 17 + navit/fib-1.1/fh_extractmin.3 | 97 + navit/fib-1.1/fh_makeheap.3 | 17 + navit/fib-1.1/fh_makekeyheap.3 | 84 + navit/fib-1.1/fib.c | 699 + navit/fib-1.1/fib.h | 64 + navit/fib-1.1/fibpriv.h | 98 + navit/fib-1.1/fibtest.c | 108 + navit/fib-1.1/fibtest2.c | 96 + navit/fib-1.1/tt.c | 91 + navit/fib-1.1/use.c | 153 + navit/file.c | 930 + navit/file.h | 105 + navit/font/Makefile.am | 4 + navit/font/Makefile.in | 709 + navit/font/freetype/Makefile.am | 9 + navit/font/freetype/Makefile.in | 703 + navit/font/freetype/font_freetype.c | 802 + navit/font/freetype/font_freetype.h | 55 + navit/fonts/Makefile.am | 15 + navit/fonts/Makefile.in | 575 + navit/fonts/README | 68 + navit/glib_slice.h | 7 + navit/graphics.c | 2639 ++ navit/graphics.h | 205 + navit/graphics/Makefile.am | 25 + navit/graphics/Makefile.in | 719 + navit/graphics/android/Makefile.am | 9 + navit/graphics/android/Makefile.in | 705 + navit/graphics/android/graphics_android.c | 886 + navit/graphics/gd/Makefile.am | 9 + navit/graphics/gd/Makefile.in | 704 + navit/graphics/gd/graphics_gd.c | 894 + navit/graphics/gtk_drawing_area/Makefile.am | 5 + navit/graphics/gtk_drawing_area/Makefile.in | 694 + .../gtk_drawing_area/graphics_gtk_drawing_area.c | 1252 + navit/graphics/null/Makefile.am | 9 + navit/graphics/null/Makefile.in | 705 + navit/graphics/null/graphics_null.c | 369 + navit/graphics/opengl/Makefile.am | 6 + navit/graphics/opengl/Makefile.in | 692 + navit/graphics/opengl/graphics_opengl.c | 1856 ++ navit/graphics/qt_qpainter/Makefile.am | 13 + navit/graphics/qt_qpainter/Makefile.in | 715 + navit/graphics/qt_qpainter/RenderArea.cpp | 318 + navit/graphics/qt_qpainter/RenderArea.h | 71 + navit/graphics/qt_qpainter/RenderArea.moc | 79 + .../graphics/qt_qpainter/graphics_qt_qpainter.cpp | 1008 + navit/graphics/qt_qpainter/graphics_qt_qpainter.h | 156 + navit/graphics/sdl/Makefile.am | 5 + navit/graphics/sdl/Makefile.in | 692 + navit/graphics/sdl/graphics_sdl.c | 2601 ++ navit/graphics/sdl/raster.c | 2022 ++ navit/graphics/sdl/raster.h | 25 + navit/graphics/win32/Makefile.am | 12 + navit/graphics/win32/Makefile.in | 708 + navit/graphics/win32/graphics_win32.c | 1751 ++ navit/graphics/win32/xpm2bmp.c | 597 + navit/gtkext.h | 25 + navit/gui.c | 187 + navit/gui.h | 77 + navit/gui/Makefile.am | 13 + navit/gui/Makefile.in | 713 + navit/gui/gtk/Makefile.am | 6 + navit/gui/gtk/Makefile.in | 696 + navit/gui/gtk/datawindow.c | 214 + navit/gui/gtk/destination.c | 585 + navit/gui/gtk/gui_gtk.h | 62 + navit/gui/gtk/gui_gtk_action.c | 633 + navit/gui/gtk/gui_gtk_statusbar.c | 178 + navit/gui/gtk/gui_gtk_window.c | 811 + navit/gui/internal/Makefile.am | 10 + navit/gui/internal/Makefile.in | 704 + navit/gui/internal/gui_internal.c | 7571 +++++ navit/gui/internal/gui_internal.h | 77 + navit/gui/qml/Makefile.am | 14 + navit/gui/qml/Makefile.in | 865 + navit/gui/qml/bookmarksProxy.h | 171 + navit/gui/qml/bookmarksProxy.moc | 0 navit/gui/qml/guiProxy.h | 152 + navit/gui/qml/guiProxy.moc | 0 navit/gui/qml/gui_qml.cpp | 473 + navit/gui/qml/gui_qml.moc | 0 navit/gui/qml/navitProxy.h | 150 + navit/gui/qml/navitProxy.moc | 0 navit/gui/qml/ngqpoint.h | 382 + navit/gui/qml/ngqpoint.moc | 0 navit/gui/qml/proxy.h | 109 + navit/gui/qml/proxy.moc | 0 navit/gui/qml/routeProxy.h | 72 + navit/gui/qml/searchProxy.h | 229 + navit/gui/qml/searchProxy.moc | 0 navit/gui/qml/skins/Makefile.am | 1 + navit/gui/qml/skins/Makefile.in | 708 + navit/gui/qml/skins/navit/Makefile.am | 9 + navit/gui/qml/skins/navit/Makefile.in | 580 + navit/gui/qml/vehicleProxy.h | 24 + navit/gui/qml/vehicleProxy.moc | 0 navit/gui/win32/Makefile.am | 10 + navit/gui/win32/Makefile.in | 708 + navit/gui/win32/ceglue.c | 77 + navit/gui/win32/ceglue.h | 16 + navit/gui/win32/gui_win32.c | 643 + navit/gui/win32/win32_gui_destination.c | 412 + navit/gui/win32/win32_gui_notify.c | 132 + navit/item.c | 358 + navit/item.h | 154 + navit/item_def.h | 584 + navit/keys.h | 12 + navit/layer.h | 31 + navit/layout.c | 565 + navit/layout.h | 127 + navit/linguistics.c | 315 + navit/linguistics.h | 13 + navit/log.c | 356 + navit/log.h | 51 + navit/main.c | 430 + navit/main.h | 47 + navit/map-share.h | 27 + navit/map.c | 714 + navit/map.h | 274 + navit/map/Makefile.am | 24 + navit/map/Makefile.in | 717 + navit/map/binfile/Makefile.am | 9 + navit/map/binfile/Makefile.in | 703 + navit/map/binfile/binfile.c | 2625 ++ navit/map/csv/Makefile.am | 9 + navit/map/csv/Makefile.in | 704 + navit/map/csv/csv.c | 743 + navit/map/csv/csv.h | 53 + navit/map/csv/quadtree.c | 477 + navit/map/csv/quadtree.h | 58 + navit/map/filter/Makefile.am | 9 + navit/map/filter/Makefile.in | 703 + navit/map/filter/filter.c | 430 + navit/map/garmin/Makefile.am | 33 + navit/map/garmin/Makefile.in | 732 + navit/map/garmin/gar2navit.c | 219 + navit/map/garmin/gar2navit.h | 52 + navit/map/garmin/garmin.c | 997 + navit/map/garmin/garmin.h | 32 + navit/map/garmin/garmintypes.txt | 707 + navit/map/garmin/gentypes.c | 148 + navit/map/mg/Makefile.am | 9 + navit/map/mg/Makefile.in | 709 + navit/map/mg/block.c | 298 + navit/map/mg/map.c | 613 + navit/map/mg/mg.h | 372 + navit/map/mg/poly.c | 265 + navit/map/mg/street.c | 1390 + navit/map/mg/town.c | 287 + navit/map/mg/tree.c | 280 + navit/map/shapefile/Makefile.am | 14 + navit/map/shapefile/Makefile.in | 705 + navit/map/shapefile/shapefile.c | 801 + navit/map/textfile/Makefile.am | 9 + navit/map/textfile/Makefile.in | 703 + navit/map/textfile/textfile.c | 394 + navit/map/textfile/textfile.h | 56 + navit/map_data.h | 54 + navit/maps/Makefile.am | 51 + navit/maps/Makefile.in | 615 + navit/mapset.c | 379 + navit/mapset.h | 54 + navit/maptool/Makefile.am | 10 + navit/maptool/Makefile.in | 745 + navit/maptool/boundaries.c | 302 + navit/maptool/buffer.c | 73 + navit/maptool/ch.c | 548 + navit/maptool/coastline.c | 631 + navit/maptool/generated-code/fileformat.pb-c.c | 248 + navit/maptool/generated-code/fileformat.pb-c.h | 110 + navit/maptool/generated-code/osmformat.pb-c.c | 1582 + navit/maptool/generated-code/osmformat.pb-c.h | 523 + navit/maptool/geom.c | 622 + .../maptool/google/protobuf-c/protobuf-c-private.h | 72 + navit/maptool/google/protobuf-c/protobuf-c.c | 2596 ++ navit/maptool/google/protobuf-c/protobuf-c.h | 444 + navit/maptool/itembin.c | 582 + navit/maptool/itembin_buffer.c | 74 + navit/maptool/maptool.c | 921 + navit/maptool/maptool.h | 401 + navit/maptool/misc.c | 429 + navit/maptool/osm.c | 2695 ++ navit/maptool/osm_o5m.c | 342 + navit/maptool/osm_protobuf.c | 370 + navit/maptool/osm_protobufdb.c | 861 + navit/maptool/osm_psql.c | 189 + navit/maptool/osm_relations.c | 126 + navit/maptool/osm_xml.c | 231 + navit/maptool/sourcesink.c | 169 + navit/maptool/tempfile.c | 64 + navit/maptool/tile.c | 676 + navit/maptool/zip.c | 475 + navit/maptype.c | 51 + navit/maptype.h | 40 + navit/menu.c | 47 + navit/menu.h | 49 + navit/messages.c | 157 + navit/messages.h | 41 + navit/navigation.c | 2372 ++ navit/navigation.h | 53 + navit/navit.c | 3271 +++ navit/navit.dtd | 139 + navit/navit.h | 123 + navit/navit_nls.h | 27 + navit/navit_shipped.xml | 6520 +++++ navit/obj_filter.c | 867 + navit/obj_filter.h | 23 + navit/osd.c | 369 + navit/osd.h | 76 + navit/osd/Makefile.am | 6 + navit/osd/Makefile.in | 709 + navit/osd/core/Makefile.am | 10 + navit/osd/core/Makefile.in | 703 + navit/osd/core/osd_core.c | 3589 +++ navit/param.c | 65 + navit/param.h | 34 + navit/phrase.c | 53 + navit/phrase.h | 27 + navit/plugin.c | 427 + navit/plugin.h | 158 + navit/plugin/Makefile.am | 6 + navit/plugin/Makefile.in | 709 + navit/plugin/pedestrian/Makefile.am | 11 + navit/plugin/pedestrian/Makefile.in | 696 + navit/plugin/pedestrian/pedestrian.c | 1382 + navit/plugin_def.h | 33 + navit/point.h | 32 + navit/popup.c | 399 + navit/popup.h | 27 + navit/profile.c | 66 + navit/profile.h | 39 + navit/projection.c | 73 + navit/projection.h | 36 + navit/roadprofile.c | 83 + navit/roadprofile.h | 38 + navit/route.c | 3675 +++ navit/route.h | 124 + navit/routech.c | 578 + navit/search.c | 1195 + navit/search.h | 94 + navit/speech.c | 143 + navit/speech.h | 42 + navit/speech/Makefile.am | 16 + navit/speech/Makefile.in | 714 + navit/speech/android/Makefile.am | 17 + navit/speech/android/Makefile.in | 711 + navit/speech/android/speech_android.c | 148 + navit/speech/cmdline/Makefile.am | 9 + navit/speech/cmdline/Makefile.in | 704 + navit/speech/cmdline/speech_cmdline.c | 247 + navit/speech/dbus/Makefile.am | 5 + navit/speech/dbus/Makefile.in | 690 + navit/speech/dbus/speech_dbus.c | 77 + navit/speech/espeak/Makefile.am | 13 + navit/speech/espeak/Makefile.in | 706 + navit/speech/espeak/speak.c | 518 + navit/speech/speech_dispatcher/Makefile.am | 6 + navit/speech/speech_dispatcher/Makefile.in | 694 + .../speech_dispatcher/speech_speech_dispatcher.c | 81 + navit/start.c | 26 + navit/start_real.c | 229 + navit/start_real.h | 25 + navit/sunriset.c | 300 + navit/sunriset.h | 117 + navit/support/Makefile.am | 32 + navit/support/Makefile.in | 721 + navit/support/espeak/Makefile.am | 67 + navit/support/espeak/Makefile.in | 797 + navit/support/espeak/compiledict.c | 1671 ++ navit/support/espeak/dictionary.c | 3490 +++ navit/support/espeak/intonation.c | 1104 + navit/support/espeak/klatt.c | 1303 + navit/support/espeak/numbers.c | 1507 + navit/support/espeak/phonemelist.c | 686 + navit/support/espeak/readclause.c | 2440 ++ navit/support/espeak/setlengths.c | 673 + navit/support/espeak/speak_init.c | 6 + navit/support/espeak/synth_mbrola.c | 760 + navit/support/espeak/synthdata.c | 682 + navit/support/espeak/synthesize.c | 1658 ++ navit/support/espeak/tr_languages.c | 1335 + navit/support/espeak/translate.c | 2800 ++ navit/support/espeak/voices.c | 1746 ++ navit/support/espeak/wavegen.c | 1941 ++ navit/support/ezxml/Makefile.am | 4 + navit/support/ezxml/Makefile.in | 639 + navit/support/ezxml/ezxml.c | 1022 + navit/support/ezxml/ezxml.h | 167 + navit/support/ezxml/ezxml_init.c | 6 + navit/support/glib/Makefile.am | 9 + navit/support/glib/Makefile.in | 663 + navit/support/glib/fake.c | 119 + navit/support/glib/fake.h | 50 + navit/support/glib/galias.h | 0 navit/support/glib/galiasdef.c | 0 navit/support/glib/gatomic.c | 946 + navit/support/glib/gerror.c | 381 + navit/support/glib/gerror.h | 92 + navit/support/glib/ghash.c | 1202 + navit/support/glib/ghash.h | 145 + navit/support/glib/glib.h | 42 + navit/support/glib/glib_init.c | 6 + navit/support/glib/glibconfig.h | 262 + navit/support/glib/glibintl.h | 43 + navit/support/glib/glist.c | 999 + navit/support/glib/glist.h | 120 + navit/support/glib/gmacros.h | 273 + navit/support/glib/gmem.c | 742 + navit/support/glib/gmem.h | 152 + navit/support/glib/gmessages.c | 1126 + navit/support/glib/gmessages.h | 341 + navit/support/glib/gprimes.c | 90 + navit/support/glib/gprintf.c | 342 + navit/support/glib/gprintf.h | 52 + navit/support/glib/gprintfint.h | 69 + navit/support/glib/gquark.h | 52 + navit/support/glib/gslice.c | 1496 + navit/support/glib/gslice.h | 90 + navit/support/glib/gslist.c | 1088 + navit/support/glib/gslist.h | 116 + navit/support/glib/gstrfuncs.c | 3133 ++ navit/support/glib/gstrfuncs.h | 266 + navit/support/glib/gstring.c | 1488 + navit/support/glib/gthreadprivate.h | 68 + navit/support/glib/gtypes.h | 432 + navit/support/glib/gutf8.c | 1891 ++ navit/support/glib/gutils.c | 3421 +++ navit/support/libc/Makefile.am | 8 + navit/support/libc/Makefile.in | 656 + navit/support/libc/libc.c | 254 + navit/support/libc/libc_init.c | 6 + navit/support/libpng/Makefile.am | 8 + navit/support/libpng/Makefile.in | 653 + navit/support/libpng/libpng_init.c | 6 + navit/support/libpng/png.c | 912 + navit/support/libpng/pngerror.c | 359 + navit/support/libpng/pngget.c | 900 + navit/support/libpng/pngmem.c | 610 + navit/support/libpng/pngread.c | 1459 + navit/support/libpng/pngrio.c | 168 + navit/support/libpng/pngrtran.c | 4296 +++ navit/support/libpng/pngrutil.c | 3223 +++ navit/support/libpng/pngset.c | 1253 + navit/support/libpng/pngtrans.c | 662 + navit/support/shapefile/Makefile.am | 4 + navit/support/shapefile/Makefile.in | 641 + navit/support/shapefile/dbfopen.c | 1869 ++ navit/support/shapefile/shapefil.h | 609 + navit/support/shapefile/shpopen.c | 2283 ++ navit/support/shapefile/shptree.c | 1050 + navit/support/win32/ConvertUTF.c | 539 + navit/support/win32/ConvertUTF.h | 149 + navit/support/win32/Makefile.am | 5 + navit/support/win32/Makefile.in | 643 + navit/support/win32/addwinsock.c | 8 + navit/support/win32/mmap.c | 43 + navit/support/win32/serial_io.c | 166 + navit/support/win32/sys/mman.h | 8 + navit/support/win32/win32_init.c | 6 + navit/support/wordexp/Makefile.am | 4 + navit/support/wordexp/Makefile.in | 640 + navit/support/wordexp/glob.c | 197 + navit/support/wordexp/glob.h | 19 + navit/support/wordexp/wordexp.c | 135 + navit/support/wordexp/wordexp.h | 42 + navit/support/wordexp/wordexp_init.c | 6 + navit/support/zlib/Makefile.am | 4 + navit/support/zlib/Makefile.in | 646 + navit/support/zlib/adler32.c | 149 + navit/support/zlib/crc32.c | 423 + navit/support/zlib/crc32.h | 441 + navit/support/zlib/infback.c | 623 + navit/support/zlib/inffast.c | 318 + navit/support/zlib/inffast.h | 11 + navit/support/zlib/inffixed.h | 94 + navit/support/zlib/inflate.c | 1368 + navit/support/zlib/inflate.h | 115 + navit/support/zlib/inftrees.c | 329 + navit/support/zlib/inftrees.h | 55 + navit/support/zlib/zconf.h | 332 + navit/support/zlib/zlib.h | 1357 + navit/support/zlib/zlib_init.c | 6 + navit/support/zlib/zutil.c | 318 + navit/support/zlib/zutil.h | 269 + navit/track.c | 1157 + navit/track.h | 62 + navit/transform.c | 1499 + navit/transform.h | 110 + navit/types.h | 38 + navit/util.c | 695 + navit/util.h | 58 + navit/vehicle.c | 723 + navit/vehicle.h | 63 + navit/vehicle/Makefile.am | 34 + navit/vehicle/Makefile.in | 723 + navit/vehicle/android/Makefile.am | 5 + navit/vehicle/android/Makefile.in | 690 + navit/vehicle/android/vehicle_android.c | 229 + navit/vehicle/demo/Makefile.am | 9 + navit/vehicle/demo/Makefile.in | 703 + navit/vehicle/demo/vehicle_demo.c | 235 + navit/vehicle/file/Makefile.am | 15 + navit/vehicle/file/Makefile.in | 765 + navit/vehicle/file/vehicle_file.c | 1047 + navit/vehicle/file/vehicle_pipe.c | 27 + navit/vehicle/file/vehicle_serial.c | 27 + navit/vehicle/file/vehicle_socket.c | 27 + navit/vehicle/gpsd/Makefile.am | 6 + navit/vehicle/gpsd/Makefile.in | 691 + navit/vehicle/gpsd/vehicle_gpsd.c | 464 + navit/vehicle/gpsd_dbus/Makefile.am | 6 + navit/vehicle/gpsd_dbus/Makefile.in | 692 + navit/vehicle/gpsd_dbus/vehicle_gpsd_dbus.c | 244 + navit/vehicle/gypsy/Makefile.am | 6 + navit/vehicle/gypsy/Makefile.in | 691 + navit/vehicle/gypsy/vehicle_gypsy.c | 497 + navit/vehicle/iphone/Makefile.am | 6 + navit/vehicle/iphone/Makefile.in | 722 + navit/vehicle/iphone/corelocation.m | 114 + navit/vehicle/iphone/vehicle_iphone.c | 165 + navit/vehicle/maemo/Makefile.am | 6 + navit/vehicle/maemo/Makefile.in | 691 + navit/vehicle/maemo/vehicle_maemo.c | 329 + navit/vehicle/null/Makefile.am | 9 + navit/vehicle/null/Makefile.in | 703 + navit/vehicle/null/vehicle_null.c | 183 + navit/vehicle/webos/Makefile.am | 5 + navit/vehicle/webos/Makefile.in | 690 + navit/vehicle/webos/vehicle_webos.c | 349 + navit/vehicle/wince/Makefile.am | 9 + navit/vehicle/wince/Makefile.in | 704 + navit/vehicle/wince/vehicle_wince.c | 925 + navit/vehicleprofile.c | 157 + navit/vehicleprofile.h | 55 + navit/window.h | 24 + navit/xmlconfig.c | 1201 + navit/xmlconfig.h | 80 + navit/xpm/Makefile.am | 258 + navit/xpm/Makefile.in | 814 + navit/xpm/airport.png | Bin 0 -> 807 bytes navit/xpm/airport.svg | 112 + navit/xpm/airport_16_16.png | Bin 0 -> 605 bytes navit/xpm/airport_32_32.png | Bin 0 -> 1079 bytes navit/xpm/airport_48_48.png | Bin 0 -> 1477 bytes navit/xpm/airport_8_8.png | Bin 0 -> 290 bytes navit/xpm/airport_96_96.png | Bin 0 -> 2689 bytes navit/xpm/attraction.png | Bin 0 -> 806 bytes navit/xpm/attraction.svg | 108 + navit/xpm/attraction_16_16.png | Bin 0 -> 591 bytes navit/xpm/attraction_32_32.png | Bin 0 -> 1222 bytes navit/xpm/attraction_48_48.png | Bin 0 -> 1841 bytes navit/xpm/attraction_8_8.png | Bin 0 -> 304 bytes navit/xpm/attraction_96_96.png | Bin 0 -> 3983 bytes navit/xpm/bank.png | Bin 0 -> 876 bytes navit/xpm/bank.svg | 193 + navit/xpm/bank_16_16.png | Bin 0 -> 632 bytes navit/xpm/bank_32_32.png | Bin 0 -> 1421 bytes navit/xpm/bank_48_48.png | Bin 0 -> 2258 bytes navit/xpm/bank_8_8.png | Bin 0 -> 300 bytes navit/xpm/bank_96_96.png | Bin 0 -> 4772 bytes navit/xpm/bar.png | Bin 0 -> 658 bytes navit/xpm/bar.svg | 139 + navit/xpm/bar_16_16.png | Bin 0 -> 535 bytes navit/xpm/bar_32_32.png | Bin 0 -> 962 bytes navit/xpm/bar_48_48.png | Bin 0 -> 1400 bytes navit/xpm/bar_8_8.png | Bin 0 -> 288 bytes navit/xpm/bar_96_96.png | Bin 0 -> 2733 bytes navit/xpm/beer.png | Bin 0 -> 658 bytes navit/xpm/beer.svg | 139 + navit/xpm/beer_16_16.png | Bin 0 -> 535 bytes navit/xpm/beer_32_32.png | Bin 0 -> 962 bytes navit/xpm/beer_48_48.png | Bin 0 -> 1400 bytes navit/xpm/beer_8_8.png | Bin 0 -> 288 bytes navit/xpm/beer_96_96.png | Bin 0 -> 2733 bytes navit/xpm/bench.png | Bin 0 -> 653 bytes navit/xpm/bench.svg | 469 + navit/xpm/bench_16_16.png | Bin 0 -> 455 bytes navit/xpm/bench_32_32.png | Bin 0 -> 1126 bytes navit/xpm/bench_48_48.png | Bin 0 -> 1930 bytes navit/xpm/bench_8_8.png | Bin 0 -> 221 bytes navit/xpm/bench_96_96.png | Bin 0 -> 4566 bytes navit/xpm/biergarten.xpm | 111 + navit/xpm/boat_ramp.png | Bin 0 -> 729 bytes navit/xpm/boat_ramp.svg | 94 + navit/xpm/boat_ramp_16_16.png | Bin 0 -> 573 bytes navit/xpm/boat_ramp_32_32.png | Bin 0 -> 1042 bytes navit/xpm/boat_ramp_48_48.png | Bin 0 -> 1534 bytes navit/xpm/boat_ramp_8_8.png | Bin 0 -> 319 bytes navit/xpm/boat_ramp_96_96.png | Bin 0 -> 3027 bytes navit/xpm/boundary_stone.png | Bin 0 -> 841 bytes navit/xpm/boundary_stone.svg | 320 + navit/xpm/boundary_stone_16_16.png | Bin 0 -> 559 bytes navit/xpm/boundary_stone_32_32.png | Bin 0 -> 1306 bytes navit/xpm/boundary_stone_48_48.png | Bin 0 -> 2392 bytes navit/xpm/boundary_stone_8_8.png | Bin 0 -> 242 bytes navit/xpm/boundary_stone_96_96.png | Bin 0 -> 5806 bytes navit/xpm/bus.png | Bin 0 -> 694 bytes navit/xpm/bus.svg | 198 + navit/xpm/bus_16_16.png | Bin 0 -> 616 bytes navit/xpm/bus_32_32.png | Bin 0 -> 1106 bytes navit/xpm/bus_48_48.png | Bin 0 -> 1551 bytes navit/xpm/bus_8_8.png | Bin 0 -> 309 bytes navit/xpm/bus_96_96.png | Bin 0 -> 2732 bytes navit/xpm/bus_halt.xpm | 51 + navit/xpm/cafe.png | Bin 0 -> 261 bytes navit/xpm/cafe.svg | 107 + navit/xpm/cafe_16_16.png | Bin 0 -> 223 bytes navit/xpm/cafe_32_32.png | Bin 0 -> 346 bytes navit/xpm/cafe_48_48.png | Bin 0 -> 485 bytes navit/xpm/cafe_8_8.png | Bin 0 -> 159 bytes navit/xpm/cafe_96_96.png | Bin 0 -> 915 bytes navit/xpm/camping.png | Bin 0 -> 316 bytes navit/xpm/camping.svg | 117 + navit/xpm/camping_16_16.png | Bin 0 -> 267 bytes navit/xpm/camping_32_32.png | Bin 0 -> 432 bytes navit/xpm/camping_48_48.png | Bin 0 -> 632 bytes navit/xpm/camping_8_8.png | Bin 0 -> 167 bytes navit/xpm/camping_96_96.png | Bin 0 -> 1225 bytes navit/xpm/car_dealer.xpm | 23 + navit/xpm/castle.xpm | 22 + navit/xpm/cemetery.xpm | 27 + navit/xpm/church.png | Bin 0 -> 730 bytes navit/xpm/church.svg | 149 + navit/xpm/church_16_16.png | Bin 0 -> 643 bytes navit/xpm/church_32_32.png | Bin 0 -> 1119 bytes navit/xpm/church_48_48.png | Bin 0 -> 1501 bytes navit/xpm/church_8_8.png | Bin 0 -> 326 bytes navit/xpm/church_96_96.png | Bin 0 -> 2730 bytes navit/xpm/cinema.png | Bin 0 -> 942 bytes navit/xpm/cinema.svg | 130 + navit/xpm/cinema_16_16.png | Bin 0 -> 676 bytes navit/xpm/cinema_32_32.png | Bin 0 -> 1260 bytes navit/xpm/cinema_48_48.png | Bin 0 -> 1605 bytes navit/xpm/cinema_8_8.png | Bin 0 -> 303 bytes navit/xpm/cinema_96_96.png | Bin 0 -> 2743 bytes navit/xpm/country_.svgz | Bin 0 -> 2167 bytes navit/xpm/country_AD.svgz | Bin 0 -> 16542 bytes navit/xpm/country_AD_16_16.png | Bin 0 -> 351 bytes navit/xpm/country_AD_32_32.png | Bin 0 -> 673 bytes navit/xpm/country_AD_48_48.png | Bin 0 -> 1183 bytes navit/xpm/country_AD_8_8.png | Bin 0 -> 220 bytes navit/xpm/country_AD_96_96.png | Bin 0 -> 3406 bytes navit/xpm/country_AE.svgz | Bin 0 -> 321 bytes navit/xpm/country_AE_16_16.png | Bin 0 -> 140 bytes navit/xpm/country_AE_32_32.png | Bin 0 -> 176 bytes navit/xpm/country_AE_48_48.png | Bin 0 -> 189 bytes navit/xpm/country_AE_8_8.png | Bin 0 -> 135 bytes navit/xpm/country_AE_96_96.png | Bin 0 -> 323 bytes navit/xpm/country_AF.svgz | Bin 0 -> 46096 bytes navit/xpm/country_AF_16_16.png | Bin 0 -> 341 bytes navit/xpm/country_AF_32_32.png | Bin 0 -> 704 bytes navit/xpm/country_AF_48_48.png | Bin 0 -> 1213 bytes navit/xpm/country_AF_8_8.png | Bin 0 -> 202 bytes navit/xpm/country_AF_96_96.png | Bin 0 -> 3607 bytes navit/xpm/country_AG.svgz | Bin 0 -> 613 bytes navit/xpm/country_AG_16_16.png | Bin 0 -> 416 bytes navit/xpm/country_AG_32_32.png | Bin 0 -> 757 bytes navit/xpm/country_AG_48_48.png | Bin 0 -> 1107 bytes navit/xpm/country_AG_8_8.png | Bin 0 -> 248 bytes navit/xpm/country_AG_96_96.png | Bin 0 -> 2171 bytes navit/xpm/country_AI.svgz | Bin 0 -> 1952 bytes navit/xpm/country_AI_16_16.png | Bin 0 -> 482 bytes navit/xpm/country_AI_32_32.png | Bin 0 -> 1111 bytes navit/xpm/country_AI_48_48.png | Bin 0 -> 1499 bytes navit/xpm/country_AI_8_8.png | Bin 0 -> 233 bytes navit/xpm/country_AI_96_96.png | Bin 0 -> 2788 bytes navit/xpm/country_AL.svgz | Bin 0 -> 5624 bytes navit/xpm/country_AL_16_16.png | Bin 0 -> 320 bytes navit/xpm/country_AL_32_32.png | Bin 0 -> 791 bytes navit/xpm/country_AL_48_48.png | Bin 0 -> 1445 bytes navit/xpm/country_AL_8_8.png | Bin 0 -> 180 bytes navit/xpm/country_AL_96_96.png | Bin 0 -> 3869 bytes navit/xpm/country_AM.svgz | Bin 0 -> 320 bytes navit/xpm/country_AM_16_16.png | Bin 0 -> 127 bytes navit/xpm/country_AM_32_32.png | Bin 0 -> 155 bytes navit/xpm/country_AM_48_48.png | Bin 0 -> 165 bytes navit/xpm/country_AM_8_8.png | Bin 0 -> 124 bytes navit/xpm/country_AM_96_96.png | Bin 0 -> 299 bytes navit/xpm/country_AN.svgz | Bin 0 -> 494 bytes navit/xpm/country_AN_16_16.png | Bin 0 -> 230 bytes navit/xpm/country_AN_32_32.png | Bin 0 -> 378 bytes navit/xpm/country_AN_48_48.png | Bin 0 -> 458 bytes navit/xpm/country_AN_8_8.png | Bin 0 -> 182 bytes navit/xpm/country_AN_96_96.png | Bin 0 -> 1030 bytes navit/xpm/country_AO.svgz | Bin 0 -> 2264 bytes navit/xpm/country_AO_16_16.png | Bin 0 -> 252 bytes navit/xpm/country_AO_32_32.png | Bin 0 -> 583 bytes navit/xpm/country_AO_48_48.png | Bin 0 -> 938 bytes navit/xpm/country_AO_8_8.png | Bin 0 -> 151 bytes navit/xpm/country_AO_96_96.png | Bin 0 -> 2126 bytes navit/xpm/country_AQ.svgz | Bin 0 -> 680 bytes navit/xpm/country_AQ_16_16.png | Bin 0 -> 100 bytes navit/xpm/country_AQ_32_32.png | Bin 0 -> 116 bytes navit/xpm/country_AQ_48_48.png | Bin 0 -> 147 bytes navit/xpm/country_AQ_8_8.png | Bin 0 -> 96 bytes navit/xpm/country_AQ_96_96.png | Bin 0 -> 287 bytes navit/xpm/country_AR.svgz | Bin 0 -> 1170 bytes navit/xpm/country_AR_16_16.png | Bin 0 -> 215 bytes navit/xpm/country_AR_32_32.png | Bin 0 -> 335 bytes navit/xpm/country_AR_48_48.png | Bin 0 -> 515 bytes navit/xpm/country_AR_8_8.png | Bin 0 -> 140 bytes navit/xpm/country_AR_96_96.png | Bin 0 -> 1497 bytes navit/xpm/country_AS.svgz | Bin 0 -> 8267 bytes navit/xpm/country_AS_16_16.png | Bin 0 -> 464 bytes navit/xpm/country_AS_32_32.png | Bin 0 -> 1019 bytes navit/xpm/country_AS_48_48.png | Bin 0 -> 1581 bytes navit/xpm/country_AS_8_8.png | Bin 0 -> 229 bytes navit/xpm/country_AS_96_96.png | Bin 0 -> 4083 bytes navit/xpm/country_AT.svgz | Bin 0 -> 258 bytes navit/xpm/country_AT_16_16.png | Bin 0 -> 122 bytes navit/xpm/country_AT_32_32.png | Bin 0 -> 146 bytes navit/xpm/country_AT_48_48.png | Bin 0 -> 165 bytes navit/xpm/country_AT_8_8.png | Bin 0 -> 118 bytes navit/xpm/country_AT_96_96.png | Bin 0 -> 302 bytes navit/xpm/country_AU.svgz | Bin 0 -> 1449 bytes navit/xpm/country_AU_16_16.png | Bin 0 -> 520 bytes navit/xpm/country_AU_32_32.png | Bin 0 -> 1038 bytes navit/xpm/country_AU_48_48.png | Bin 0 -> 1357 bytes navit/xpm/country_AU_8_8.png | Bin 0 -> 237 bytes navit/xpm/country_AU_96_96.png | Bin 0 -> 2564 bytes navit/xpm/country_AW.svgz | Bin 0 -> 641 bytes navit/xpm/country_AW_16_16.png | Bin 0 -> 202 bytes navit/xpm/country_AW_32_32.png | Bin 0 -> 345 bytes navit/xpm/country_AW_48_48.png | Bin 0 -> 540 bytes navit/xpm/country_AW_8_8.png | Bin 0 -> 147 bytes navit/xpm/country_AW_96_96.png | Bin 0 -> 1097 bytes navit/xpm/country_AX.svgz | Bin 0 -> 319 bytes navit/xpm/country_AX_16_16.png | Bin 0 -> 207 bytes navit/xpm/country_AX_32_32.png | Bin 0 -> 266 bytes navit/xpm/country_AX_48_48.png | Bin 0 -> 328 bytes navit/xpm/country_AX_8_8.png | Bin 0 -> 174 bytes navit/xpm/country_AX_96_96.png | Bin 0 -> 473 bytes navit/xpm/country_AZ.svgz | Bin 0 -> 645 bytes navit/xpm/country_AZ_16_16.png | Bin 0 -> 187 bytes navit/xpm/country_AZ_32_32.png | Bin 0 -> 365 bytes navit/xpm/country_AZ_48_48.png | Bin 0 -> 504 bytes navit/xpm/country_AZ_8_8.png | Bin 0 -> 153 bytes navit/xpm/country_AZ_96_96.png | Bin 0 -> 1117 bytes navit/xpm/country_BA.svgz | Bin 0 -> 708 bytes navit/xpm/country_BA_16_16.png | Bin 0 -> 242 bytes navit/xpm/country_BA_32_32.png | Bin 0 -> 432 bytes navit/xpm/country_BA_48_48.png | Bin 0 -> 589 bytes navit/xpm/country_BA_8_8.png | Bin 0 -> 183 bytes navit/xpm/country_BA_96_96.png | Bin 0 -> 1140 bytes navit/xpm/country_BB.svgz | Bin 0 -> 1744 bytes navit/xpm/country_BB_16_16.png | Bin 0 -> 281 bytes navit/xpm/country_BB_32_32.png | Bin 0 -> 489 bytes navit/xpm/country_BB_48_48.png | Bin 0 -> 653 bytes navit/xpm/country_BB_8_8.png | Bin 0 -> 182 bytes navit/xpm/country_BB_96_96.png | Bin 0 -> 1408 bytes navit/xpm/country_BD.svgz | Bin 0 -> 294 bytes navit/xpm/country_BD_16_16.png | Bin 0 -> 296 bytes navit/xpm/country_BD_32_32.png | Bin 0 -> 442 bytes navit/xpm/country_BD_48_48.png | Bin 0 -> 673 bytes navit/xpm/country_BD_8_8.png | Bin 0 -> 168 bytes navit/xpm/country_BD_96_96.png | Bin 0 -> 1321 bytes navit/xpm/country_BE.svgz | Bin 0 -> 304 bytes navit/xpm/country_BE_16_16.png | Bin 0 -> 114 bytes navit/xpm/country_BE_32_32.png | Bin 0 -> 136 bytes navit/xpm/country_BE_48_48.png | Bin 0 -> 162 bytes navit/xpm/country_BE_8_8.png | Bin 0 -> 115 bytes navit/xpm/country_BE_96_96.png | Bin 0 -> 300 bytes navit/xpm/country_BF.svgz | Bin 0 -> 378 bytes navit/xpm/country_BF_16_16.png | Bin 0 -> 193 bytes navit/xpm/country_BF_32_32.png | Bin 0 -> 320 bytes navit/xpm/country_BF_48_48.png | Bin 0 -> 461 bytes navit/xpm/country_BF_8_8.png | Bin 0 -> 139 bytes navit/xpm/country_BF_96_96.png | Bin 0 -> 876 bytes navit/xpm/country_BG.svgz | Bin 0 -> 341 bytes navit/xpm/country_BG_16_16.png | Bin 0 -> 132 bytes navit/xpm/country_BG_32_32.png | Bin 0 -> 158 bytes navit/xpm/country_BG_48_48.png | Bin 0 -> 172 bytes navit/xpm/country_BG_8_8.png | Bin 0 -> 126 bytes navit/xpm/country_BG_96_96.png | Bin 0 -> 306 bytes navit/xpm/country_BH.svgz | Bin 0 -> 346 bytes navit/xpm/country_BH_16_16.png | Bin 0 -> 277 bytes navit/xpm/country_BH_32_32.png | Bin 0 -> 520 bytes navit/xpm/country_BH_48_48.png | Bin 0 -> 663 bytes navit/xpm/country_BH_8_8.png | Bin 0 -> 156 bytes navit/xpm/country_BH_96_96.png | Bin 0 -> 1349 bytes navit/xpm/country_BI.svgz | Bin 0 -> 632 bytes navit/xpm/country_BI_16_16.png | Bin 0 -> 567 bytes navit/xpm/country_BI_32_32.png | Bin 0 -> 820 bytes navit/xpm/country_BI_48_48.png | Bin 0 -> 1296 bytes navit/xpm/country_BI_8_8.png | Bin 0 -> 318 bytes navit/xpm/country_BI_96_96.png | Bin 0 -> 2339 bytes navit/xpm/country_BJ.svgz | Bin 0 -> 299 bytes navit/xpm/country_BJ_16_16.png | Bin 0 -> 130 bytes navit/xpm/country_BJ_32_32.png | Bin 0 -> 159 bytes navit/xpm/country_BJ_48_48.png | Bin 0 -> 201 bytes navit/xpm/country_BJ_8_8.png | Bin 0 -> 123 bytes navit/xpm/country_BJ_96_96.png | Bin 0 -> 353 bytes navit/xpm/country_BL.svgz | Bin 0 -> 273 bytes navit/xpm/country_BL_16_16.png | Bin 0 -> 117 bytes navit/xpm/country_BL_32_32.png | Bin 0 -> 139 bytes navit/xpm/country_BL_48_48.png | Bin 0 -> 166 bytes navit/xpm/country_BL_8_8.png | Bin 0 -> 115 bytes navit/xpm/country_BL_96_96.png | Bin 0 -> 304 bytes navit/xpm/country_BM.svgz | Bin 0 -> 37210 bytes navit/xpm/country_BM_16_16.png | Bin 0 -> 463 bytes navit/xpm/country_BM_32_32.png | Bin 0 -> 1054 bytes navit/xpm/country_BM_48_48.png | Bin 0 -> 1624 bytes navit/xpm/country_BM_8_8.png | Bin 0 -> 236 bytes navit/xpm/country_BM_96_96.png | Bin 0 -> 3537 bytes navit/xpm/country_BN.svgz | Bin 0 -> 12559 bytes navit/xpm/country_BN_16_16.png | Bin 0 -> 505 bytes navit/xpm/country_BN_32_32.png | Bin 0 -> 1142 bytes navit/xpm/country_BN_48_48.png | Bin 0 -> 1802 bytes navit/xpm/country_BN_8_8.png | Bin 0 -> 248 bytes navit/xpm/country_BN_96_96.png | Bin 0 -> 4103 bytes navit/xpm/country_BO.svgz | Bin 0 -> 848 bytes navit/xpm/country_BO_16_16.png | Bin 0 -> 129 bytes navit/xpm/country_BO_32_32.png | Bin 0 -> 162 bytes navit/xpm/country_BO_48_48.png | Bin 0 -> 176 bytes navit/xpm/country_BO_8_8.png | Bin 0 -> 125 bytes navit/xpm/country_BO_96_96.png | Bin 0 -> 311 bytes navit/xpm/country_BR.svgz | Bin 0 -> 1765 bytes navit/xpm/country_BR_16_16.png | Bin 0 -> 511 bytes navit/xpm/country_BR_32_32.png | Bin 0 -> 1177 bytes navit/xpm/country_BR_48_48.png | Bin 0 -> 1880 bytes navit/xpm/country_BR_8_8.png | Bin 0 -> 233 bytes navit/xpm/country_BR_96_96.png | Bin 0 -> 3996 bytes navit/xpm/country_BS.svgz | Bin 0 -> 404 bytes navit/xpm/country_BS_16_16.png | Bin 0 -> 292 bytes navit/xpm/country_BS_32_32.png | Bin 0 -> 494 bytes navit/xpm/country_BS_48_48.png | Bin 0 -> 747 bytes navit/xpm/country_BS_8_8.png | Bin 0 -> 169 bytes navit/xpm/country_BS_96_96.png | Bin 0 -> 1453 bytes navit/xpm/country_BT.svgz | Bin 0 -> 24770 bytes navit/xpm/country_BT_16_16.png | Bin 0 -> 462 bytes navit/xpm/country_BT_32_32.png | Bin 0 -> 1082 bytes navit/xpm/country_BT_48_48.png | Bin 0 -> 1986 bytes navit/xpm/country_BT_8_8.png | Bin 0 -> 228 bytes navit/xpm/country_BT_96_96.png | Bin 0 -> 6038 bytes navit/xpm/country_BV.svgz | Bin 0 -> 282 bytes navit/xpm/country_BV_16_16.png | Bin 0 -> 170 bytes navit/xpm/country_BV_32_32.png | Bin 0 -> 206 bytes navit/xpm/country_BV_48_48.png | Bin 0 -> 264 bytes navit/xpm/country_BV_8_8.png | Bin 0 -> 129 bytes navit/xpm/country_BV_96_96.png | Bin 0 -> 405 bytes navit/xpm/country_BW.svgz | Bin 0 -> 309 bytes navit/xpm/country_BW_16_16.png | Bin 0 -> 123 bytes navit/xpm/country_BW_32_32.png | Bin 0 -> 149 bytes navit/xpm/country_BW_48_48.png | Bin 0 -> 169 bytes navit/xpm/country_BW_8_8.png | Bin 0 -> 113 bytes navit/xpm/country_BW_96_96.png | Bin 0 -> 285 bytes navit/xpm/country_BY.svgz | Bin 0 -> 2215 bytes navit/xpm/country_BY_16_16.png | Bin 0 -> 249 bytes navit/xpm/country_BY_32_32.png | Bin 0 -> 553 bytes navit/xpm/country_BY_48_48.png | Bin 0 -> 916 bytes navit/xpm/country_BY_8_8.png | Bin 0 -> 149 bytes navit/xpm/country_BY_96_96.png | Bin 0 -> 2717 bytes navit/xpm/country_BZ.svgz | Bin 0 -> 66107 bytes navit/xpm/country_BZ_16_16.png | Bin 0 -> 495 bytes navit/xpm/country_BZ_32_32.png | Bin 0 -> 1369 bytes navit/xpm/country_BZ_48_48.png | Bin 0 -> 2665 bytes navit/xpm/country_BZ_8_8.png | Bin 0 -> 232 bytes navit/xpm/country_BZ_96_96.png | Bin 0 -> 8060 bytes navit/xpm/country_CA.svgz | Bin 0 -> 835 bytes navit/xpm/country_CA_16_16.png | Bin 0 -> 278 bytes navit/xpm/country_CA_32_32.png | Bin 0 -> 514 bytes navit/xpm/country_CA_48_48.png | Bin 0 -> 709 bytes navit/xpm/country_CA_8_8.png | Bin 0 -> 180 bytes navit/xpm/country_CA_96_96.png | Bin 0 -> 1415 bytes navit/xpm/country_CC.svgz | Bin 0 -> 5345 bytes navit/xpm/country_CC_16_16.png | Bin 0 -> 395 bytes navit/xpm/country_CC_32_32.png | Bin 0 -> 810 bytes navit/xpm/country_CC_48_48.png | Bin 0 -> 1179 bytes navit/xpm/country_CC_8_8.png | Bin 0 -> 214 bytes navit/xpm/country_CC_96_96.png | Bin 0 -> 2714 bytes navit/xpm/country_CD.svgz | Bin 0 -> 679 bytes navit/xpm/country_CD_16_16.png | Bin 0 -> 538 bytes navit/xpm/country_CD_32_32.png | Bin 0 -> 925 bytes navit/xpm/country_CD_48_48.png | Bin 0 -> 1195 bytes navit/xpm/country_CD_8_8.png | Bin 0 -> 255 bytes navit/xpm/country_CD_96_96.png | Bin 0 -> 2030 bytes navit/xpm/country_CF.svgz | Bin 0 -> 609 bytes navit/xpm/country_CF_16_16.png | Bin 0 -> 249 bytes navit/xpm/country_CF_32_32.png | Bin 0 -> 321 bytes navit/xpm/country_CF_48_48.png | Bin 0 -> 441 bytes navit/xpm/country_CF_8_8.png | Bin 0 -> 172 bytes navit/xpm/country_CF_96_96.png | Bin 0 -> 830 bytes navit/xpm/country_CG.svgz | Bin 0 -> 315 bytes navit/xpm/country_CG_16_16.png | Bin 0 -> 224 bytes navit/xpm/country_CG_32_32.png | Bin 0 -> 306 bytes navit/xpm/country_CG_48_48.png | Bin 0 -> 378 bytes navit/xpm/country_CG_8_8.png | Bin 0 -> 189 bytes navit/xpm/country_CG_96_96.png | Bin 0 -> 687 bytes navit/xpm/country_CH.svgz | Bin 0 -> 375 bytes navit/xpm/country_CH_16_16.png | Bin 0 -> 246 bytes navit/xpm/country_CH_32_32.png | Bin 0 -> 267 bytes navit/xpm/country_CH_48_48.png | Bin 0 -> 257 bytes navit/xpm/country_CH_8_8.png | Bin 0 -> 163 bytes navit/xpm/country_CH_96_96.png | Bin 0 -> 415 bytes navit/xpm/country_CI.svgz | Bin 0 -> 274 bytes navit/xpm/country_CI_16_16.png | Bin 0 -> 116 bytes navit/xpm/country_CI_32_32.png | Bin 0 -> 138 bytes navit/xpm/country_CI_48_48.png | Bin 0 -> 162 bytes navit/xpm/country_CI_8_8.png | Bin 0 -> 115 bytes navit/xpm/country_CI_96_96.png | Bin 0 -> 300 bytes navit/xpm/country_CK.svgz | Bin 0 -> 882 bytes navit/xpm/country_CK_16_16.png | Bin 0 -> 596 bytes navit/xpm/country_CK_32_32.png | Bin 0 -> 1339 bytes navit/xpm/country_CK_48_48.png | Bin 0 -> 2036 bytes navit/xpm/country_CK_8_8.png | Bin 0 -> 256 bytes navit/xpm/country_CK_96_96.png | Bin 0 -> 4190 bytes navit/xpm/country_CL.svgz | Bin 0 -> 430 bytes navit/xpm/country_CL_16_16.png | Bin 0 -> 174 bytes navit/xpm/country_CL_32_32.png | Bin 0 -> 281 bytes navit/xpm/country_CL_48_48.png | Bin 0 -> 422 bytes navit/xpm/country_CL_8_8.png | Bin 0 -> 138 bytes navit/xpm/country_CL_96_96.png | Bin 0 -> 814 bytes navit/xpm/country_CM.svgz | Bin 0 -> 468 bytes navit/xpm/country_CM_16_16.png | Bin 0 -> 201 bytes navit/xpm/country_CM_32_32.png | Bin 0 -> 327 bytes navit/xpm/country_CM_48_48.png | Bin 0 -> 403 bytes navit/xpm/country_CM_8_8.png | Bin 0 -> 158 bytes navit/xpm/country_CM_96_96.png | Bin 0 -> 777 bytes navit/xpm/country_CN.svgz | Bin 0 -> 1145 bytes navit/xpm/country_CN_16_16.png | Bin 0 -> 231 bytes navit/xpm/country_CN_32_32.png | Bin 0 -> 436 bytes navit/xpm/country_CN_48_48.png | Bin 0 -> 667 bytes navit/xpm/country_CN_8_8.png | Bin 0 -> 159 bytes navit/xpm/country_CN_96_96.png | Bin 0 -> 1397 bytes navit/xpm/country_CO.svgz | Bin 0 -> 210 bytes navit/xpm/country_CO_16_16.png | Bin 0 -> 115 bytes navit/xpm/country_CO_32_32.png | Bin 0 -> 137 bytes navit/xpm/country_CO_48_48.png | Bin 0 -> 176 bytes navit/xpm/country_CO_8_8.png | Bin 0 -> 107 bytes navit/xpm/country_CO_96_96.png | Bin 0 -> 310 bytes navit/xpm/country_CR.svgz | Bin 0 -> 296 bytes navit/xpm/country_CR_16_16.png | Bin 0 -> 147 bytes navit/xpm/country_CR_32_32.png | Bin 0 -> 167 bytes navit/xpm/country_CR_48_48.png | Bin 0 -> 176 bytes navit/xpm/country_CR_8_8.png | Bin 0 -> 128 bytes navit/xpm/country_CR_96_96.png | Bin 0 -> 312 bytes navit/xpm/country_CU.svgz | Bin 0 -> 639 bytes navit/xpm/country_CU_16_16.png | Bin 0 -> 347 bytes navit/xpm/country_CU_32_32.png | Bin 0 -> 641 bytes navit/xpm/country_CU_48_48.png | Bin 0 -> 968 bytes navit/xpm/country_CU_8_8.png | Bin 0 -> 182 bytes navit/xpm/country_CU_96_96.png | Bin 0 -> 1956 bytes navit/xpm/country_CV.svgz | Bin 0 -> 912 bytes navit/xpm/country_CV_16_16.png | Bin 0 -> 286 bytes navit/xpm/country_CV_32_32.png | Bin 0 -> 484 bytes navit/xpm/country_CV_48_48.png | Bin 0 -> 750 bytes navit/xpm/country_CV_8_8.png | Bin 0 -> 163 bytes navit/xpm/country_CV_96_96.png | Bin 0 -> 1688 bytes navit/xpm/country_CX.svgz | Bin 0 -> 3919 bytes navit/xpm/country_CX_16_16.png | Bin 0 -> 497 bytes navit/xpm/country_CX_32_32.png | Bin 0 -> 1000 bytes navit/xpm/country_CX_48_48.png | Bin 0 -> 1554 bytes navit/xpm/country_CX_8_8.png | Bin 0 -> 255 bytes navit/xpm/country_CX_96_96.png | Bin 0 -> 3372 bytes navit/xpm/country_CY.svgz | Bin 0 -> 2522 bytes navit/xpm/country_CY_16_16.png | Bin 0 -> 283 bytes navit/xpm/country_CY_32_32.png | Bin 0 -> 599 bytes navit/xpm/country_CY_48_48.png | Bin 0 -> 898 bytes navit/xpm/country_CY_8_8.png | Bin 0 -> 185 bytes navit/xpm/country_CY_96_96.png | Bin 0 -> 2198 bytes navit/xpm/country_CZ.svgz | Bin 0 -> 422 bytes navit/xpm/country_CZ_16_16.png | Bin 0 -> 213 bytes navit/xpm/country_CZ_32_32.png | Bin 0 -> 286 bytes navit/xpm/country_CZ_48_48.png | Bin 0 -> 383 bytes navit/xpm/country_CZ_8_8.png | Bin 0 -> 170 bytes navit/xpm/country_CZ_96_96.png | Bin 0 -> 674 bytes navit/xpm/country_DE.svgz | Bin 0 -> 325 bytes navit/xpm/country_DE_16_16.png | Bin 0 -> 117 bytes navit/xpm/country_DE_32_32.png | Bin 0 -> 135 bytes navit/xpm/country_DE_48_48.png | Bin 0 -> 151 bytes navit/xpm/country_DE_8_8.png | Bin 0 -> 106 bytes navit/xpm/country_DE_96_96.png | Bin 0 -> 247 bytes navit/xpm/country_DJ.svgz | Bin 0 -> 1175 bytes navit/xpm/country_DJ_16_16.png | Bin 0 -> 359 bytes navit/xpm/country_DJ_32_32.png | Bin 0 -> 618 bytes navit/xpm/country_DJ_48_48.png | Bin 0 -> 861 bytes navit/xpm/country_DJ_8_8.png | Bin 0 -> 203 bytes navit/xpm/country_DJ_96_96.png | Bin 0 -> 1697 bytes navit/xpm/country_DK.svgz | Bin 0 -> 308 bytes navit/xpm/country_DK_16_16.png | Bin 0 -> 167 bytes navit/xpm/country_DK_32_32.png | Bin 0 -> 212 bytes navit/xpm/country_DK_48_48.png | Bin 0 -> 270 bytes navit/xpm/country_DK_8_8.png | Bin 0 -> 146 bytes navit/xpm/country_DK_96_96.png | Bin 0 -> 392 bytes navit/xpm/country_DM.svgz | Bin 0 -> 7038 bytes navit/xpm/country_DM_16_16.png | Bin 0 -> 291 bytes navit/xpm/country_DM_32_32.png | Bin 0 -> 631 bytes navit/xpm/country_DM_48_48.png | Bin 0 -> 944 bytes navit/xpm/country_DM_8_8.png | Bin 0 -> 177 bytes navit/xpm/country_DM_96_96.png | Bin 0 -> 2360 bytes navit/xpm/country_DO.svgz | Bin 0 -> 26339 bytes navit/xpm/country_DO_16_16.png | Bin 0 -> 241 bytes navit/xpm/country_DO_32_32.png | Bin 0 -> 389 bytes navit/xpm/country_DO_48_48.png | Bin 0 -> 601 bytes navit/xpm/country_DO_8_8.png | Bin 0 -> 171 bytes navit/xpm/country_DO_96_96.png | Bin 0 -> 1532 bytes navit/xpm/country_DZ.svgz | Bin 0 -> 511 bytes navit/xpm/country_DZ_16_16.png | Bin 0 -> 271 bytes navit/xpm/country_DZ_32_32.png | Bin 0 -> 589 bytes navit/xpm/country_DZ_48_48.png | Bin 0 -> 865 bytes navit/xpm/country_DZ_8_8.png | Bin 0 -> 163 bytes navit/xpm/country_DZ_96_96.png | Bin 0 -> 1859 bytes navit/xpm/country_EC.svgz | Bin 0 -> 61120 bytes navit/xpm/country_EC_16_16.png | Bin 0 -> 248 bytes navit/xpm/country_EC_32_32.png | Bin 0 -> 610 bytes navit/xpm/country_EC_48_48.png | Bin 0 -> 1041 bytes navit/xpm/country_EC_8_8.png | Bin 0 -> 149 bytes navit/xpm/country_EC_96_96.png | Bin 0 -> 3066 bytes navit/xpm/country_EE.svgz | Bin 0 -> 207 bytes navit/xpm/country_EE_16_16.png | Bin 0 -> 122 bytes navit/xpm/country_EE_32_32.png | Bin 0 -> 143 bytes navit/xpm/country_EE_48_48.png | Bin 0 -> 151 bytes navit/xpm/country_EE_8_8.png | Bin 0 -> 119 bytes navit/xpm/country_EE_96_96.png | Bin 0 -> 248 bytes navit/xpm/country_EG.svgz | Bin 0 -> 5583 bytes navit/xpm/country_EG_16_16.png | Bin 0 -> 260 bytes navit/xpm/country_EG_32_32.png | Bin 0 -> 379 bytes navit/xpm/country_EG_48_48.png | Bin 0 -> 577 bytes navit/xpm/country_EG_8_8.png | Bin 0 -> 190 bytes navit/xpm/country_EG_96_96.png | Bin 0 -> 1424 bytes navit/xpm/country_EH.svgz | Bin 0 -> 622 bytes navit/xpm/country_EH_16_16.png | Bin 0 -> 306 bytes navit/xpm/country_EH_32_32.png | Bin 0 -> 546 bytes navit/xpm/country_EH_48_48.png | Bin 0 -> 663 bytes navit/xpm/country_EH_8_8.png | Bin 0 -> 186 bytes navit/xpm/country_EH_96_96.png | Bin 0 -> 1586 bytes navit/xpm/country_ER.svgz | Bin 0 -> 5002 bytes navit/xpm/country_ER_16_16.png | Bin 0 -> 403 bytes navit/xpm/country_ER_32_32.png | Bin 0 -> 799 bytes navit/xpm/country_ER_48_48.png | Bin 0 -> 1286 bytes navit/xpm/country_ER_8_8.png | Bin 0 -> 236 bytes navit/xpm/country_ER_96_96.png | Bin 0 -> 3214 bytes navit/xpm/country_ES.svgz | Bin 0 -> 52198 bytes navit/xpm/country_ES_16_16.png | Bin 0 -> 216 bytes navit/xpm/country_ES_32_32.png | Bin 0 -> 459 bytes navit/xpm/country_ES_48_48.png | Bin 0 -> 821 bytes navit/xpm/country_ES_8_8.png | Bin 0 -> 151 bytes navit/xpm/country_ES_96_96.png | Bin 0 -> 2289 bytes navit/xpm/country_ET.svgz | Bin 0 -> 931 bytes navit/xpm/country_ET_16_16.png | Bin 0 -> 260 bytes navit/xpm/country_ET_32_32.png | Bin 0 -> 588 bytes navit/xpm/country_ET_48_48.png | Bin 0 -> 939 bytes navit/xpm/country_ET_8_8.png | Bin 0 -> 161 bytes navit/xpm/country_ET_96_96.png | Bin 0 -> 2234 bytes navit/xpm/country_FI.svgz | Bin 0 -> 319 bytes navit/xpm/country_FI_16_16.png | Bin 0 -> 184 bytes navit/xpm/country_FI_32_32.png | Bin 0 -> 194 bytes navit/xpm/country_FI_48_48.png | Bin 0 -> 272 bytes navit/xpm/country_FI_8_8.png | Bin 0 -> 164 bytes navit/xpm/country_FI_96_96.png | Bin 0 -> 404 bytes navit/xpm/country_FJ.svgz | Bin 0 -> 14167 bytes navit/xpm/country_FJ_16_16.png | Bin 0 -> 449 bytes navit/xpm/country_FJ_32_32.png | Bin 0 -> 1035 bytes navit/xpm/country_FJ_48_48.png | Bin 0 -> 1516 bytes navit/xpm/country_FJ_8_8.png | Bin 0 -> 228 bytes navit/xpm/country_FJ_96_96.png | Bin 0 -> 3114 bytes navit/xpm/country_FK.svgz | Bin 0 -> 24773 bytes navit/xpm/country_FK_16_16.png | Bin 0 -> 461 bytes navit/xpm/country_FK_32_32.png | Bin 0 -> 1174 bytes navit/xpm/country_FK_48_48.png | Bin 0 -> 1784 bytes navit/xpm/country_FK_8_8.png | Bin 0 -> 234 bytes navit/xpm/country_FK_96_96.png | Bin 0 -> 4280 bytes navit/xpm/country_FM.svgz | Bin 0 -> 435 bytes navit/xpm/country_FM_16_16.png | Bin 0 -> 265 bytes navit/xpm/country_FM_32_32.png | Bin 0 -> 445 bytes navit/xpm/country_FM_48_48.png | Bin 0 -> 708 bytes navit/xpm/country_FM_8_8.png | Bin 0 -> 175 bytes navit/xpm/country_FM_96_96.png | Bin 0 -> 1436 bytes navit/xpm/country_FO.svgz | Bin 0 -> 320 bytes navit/xpm/country_FO_16_16.png | Bin 0 -> 178 bytes navit/xpm/country_FO_32_32.png | Bin 0 -> 219 bytes navit/xpm/country_FO_48_48.png | Bin 0 -> 263 bytes navit/xpm/country_FO_8_8.png | Bin 0 -> 128 bytes navit/xpm/country_FO_96_96.png | Bin 0 -> 407 bytes navit/xpm/country_FR.svgz | Bin 0 -> 273 bytes navit/xpm/country_FR_16_16.png | Bin 0 -> 117 bytes navit/xpm/country_FR_32_32.png | Bin 0 -> 139 bytes navit/xpm/country_FR_48_48.png | Bin 0 -> 166 bytes navit/xpm/country_FR_8_8.png | Bin 0 -> 115 bytes navit/xpm/country_FR_96_96.png | Bin 0 -> 304 bytes navit/xpm/country_GA.svgz | Bin 0 -> 284 bytes navit/xpm/country_GA_16_16.png | Bin 0 -> 129 bytes navit/xpm/country_GA_32_32.png | Bin 0 -> 162 bytes navit/xpm/country_GA_48_48.png | Bin 0 -> 176 bytes navit/xpm/country_GA_8_8.png | Bin 0 -> 125 bytes navit/xpm/country_GA_96_96.png | Bin 0 -> 310 bytes navit/xpm/country_GB.svgz | Bin 0 -> 628 bytes navit/xpm/country_GB_16_16.png | Bin 0 -> 602 bytes navit/xpm/country_GB_32_32.png | Bin 0 -> 1002 bytes navit/xpm/country_GB_48_48.png | Bin 0 -> 911 bytes navit/xpm/country_GB_8_8.png | Bin 0 -> 272 bytes navit/xpm/country_GB_96_96.png | Bin 0 -> 1354 bytes navit/xpm/country_GD.svgz | Bin 0 -> 1375 bytes navit/xpm/country_GD_16_16.png | Bin 0 -> 540 bytes navit/xpm/country_GD_32_32.png | Bin 0 -> 1070 bytes navit/xpm/country_GD_48_48.png | Bin 0 -> 1706 bytes navit/xpm/country_GD_8_8.png | Bin 0 -> 274 bytes navit/xpm/country_GD_96_96.png | Bin 0 -> 3546 bytes navit/xpm/country_GE.svgz | Bin 0 -> 537 bytes navit/xpm/country_GE_16_16.png | Bin 0 -> 323 bytes navit/xpm/country_GE_32_32.png | Bin 0 -> 670 bytes navit/xpm/country_GE_48_48.png | Bin 0 -> 966 bytes navit/xpm/country_GE_8_8.png | Bin 0 -> 238 bytes navit/xpm/country_GE_96_96.png | Bin 0 -> 1747 bytes navit/xpm/country_GF.svgz | Bin 0 -> 273 bytes navit/xpm/country_GF_16_16.png | Bin 0 -> 117 bytes navit/xpm/country_GF_32_32.png | Bin 0 -> 139 bytes navit/xpm/country_GF_48_48.png | Bin 0 -> 166 bytes navit/xpm/country_GF_8_8.png | Bin 0 -> 115 bytes navit/xpm/country_GF_96_96.png | Bin 0 -> 304 bytes navit/xpm/country_GG.svgz | Bin 0 -> 346 bytes navit/xpm/country_GG_16_16.png | Bin 0 -> 251 bytes navit/xpm/country_GG_32_32.png | Bin 0 -> 373 bytes navit/xpm/country_GG_48_48.png | Bin 0 -> 393 bytes navit/xpm/country_GG_8_8.png | Bin 0 -> 184 bytes navit/xpm/country_GG_96_96.png | Bin 0 -> 686 bytes navit/xpm/country_GH.svgz | Bin 0 -> 411 bytes navit/xpm/country_GH_16_16.png | Bin 0 -> 234 bytes navit/xpm/country_GH_32_32.png | Bin 0 -> 386 bytes navit/xpm/country_GH_48_48.png | Bin 0 -> 489 bytes navit/xpm/country_GH_8_8.png | Bin 0 -> 173 bytes navit/xpm/country_GH_96_96.png | Bin 0 -> 944 bytes navit/xpm/country_GI.svgz | Bin 0 -> 6046 bytes navit/xpm/country_GI_16_16.png | Bin 0 -> 345 bytes navit/xpm/country_GI_32_32.png | Bin 0 -> 707 bytes navit/xpm/country_GI_48_48.png | Bin 0 -> 1075 bytes navit/xpm/country_GI_8_8.png | Bin 0 -> 214 bytes navit/xpm/country_GI_96_96.png | Bin 0 -> 2387 bytes navit/xpm/country_GL.svgz | Bin 0 -> 361 bytes navit/xpm/country_GL_16_16.png | Bin 0 -> 277 bytes navit/xpm/country_GL_32_32.png | Bin 0 -> 484 bytes navit/xpm/country_GL_48_48.png | Bin 0 -> 731 bytes navit/xpm/country_GL_8_8.png | Bin 0 -> 191 bytes navit/xpm/country_GL_96_96.png | Bin 0 -> 1496 bytes navit/xpm/country_GM.svgz | Bin 0 -> 809 bytes navit/xpm/country_GM_16_16.png | Bin 0 -> 145 bytes navit/xpm/country_GM_32_32.png | Bin 0 -> 182 bytes navit/xpm/country_GM_48_48.png | Bin 0 -> 203 bytes navit/xpm/country_GM_8_8.png | Bin 0 -> 133 bytes navit/xpm/country_GM_96_96.png | Bin 0 -> 361 bytes navit/xpm/country_GN.svgz | Bin 0 -> 210 bytes navit/xpm/country_GN_16_16.png | Bin 0 -> 126 bytes navit/xpm/country_GN_32_32.png | Bin 0 -> 152 bytes navit/xpm/country_GN_48_48.png | Bin 0 -> 168 bytes navit/xpm/country_GN_8_8.png | Bin 0 -> 123 bytes navit/xpm/country_GN_96_96.png | Bin 0 -> 305 bytes navit/xpm/country_GP.svgz | Bin 0 -> 273 bytes navit/xpm/country_GP_16_16.png | Bin 0 -> 117 bytes navit/xpm/country_GP_32_32.png | Bin 0 -> 139 bytes navit/xpm/country_GP_48_48.png | Bin 0 -> 166 bytes navit/xpm/country_GP_8_8.png | Bin 0 -> 115 bytes navit/xpm/country_GP_96_96.png | Bin 0 -> 304 bytes navit/xpm/country_GQ.svgz | Bin 0 -> 12153 bytes navit/xpm/country_GQ_16_16.png | Bin 0 -> 383 bytes navit/xpm/country_GQ_32_32.png | Bin 0 -> 607 bytes navit/xpm/country_GQ_48_48.png | Bin 0 -> 899 bytes navit/xpm/country_GQ_8_8.png | Bin 0 -> 230 bytes navit/xpm/country_GQ_96_96.png | Bin 0 -> 1797 bytes navit/xpm/country_GR.svgz | Bin 0 -> 949 bytes navit/xpm/country_GR_16_16.png | Bin 0 -> 352 bytes navit/xpm/country_GR_32_32.png | Bin 0 -> 445 bytes navit/xpm/country_GR_48_48.png | Bin 0 -> 439 bytes navit/xpm/country_GR_8_8.png | Bin 0 -> 225 bytes navit/xpm/country_GR_96_96.png | Bin 0 -> 595 bytes navit/xpm/country_GS.svgz | Bin 0 -> 27699 bytes navit/xpm/country_GS_16_16.png | Bin 0 -> 551 bytes navit/xpm/country_GS_32_32.png | Bin 0 -> 1337 bytes navit/xpm/country_GS_48_48.png | Bin 0 -> 2099 bytes navit/xpm/country_GS_8_8.png | Bin 0 -> 251 bytes navit/xpm/country_GS_96_96.png | Bin 0 -> 5233 bytes navit/xpm/country_GT.svgz | Bin 0 -> 37657 bytes navit/xpm/country_GT_16_16.png | Bin 0 -> 260 bytes navit/xpm/country_GT_32_32.png | Bin 0 -> 477 bytes navit/xpm/country_GT_48_48.png | Bin 0 -> 674 bytes navit/xpm/country_GT_8_8.png | Bin 0 -> 180 bytes navit/xpm/country_GT_96_96.png | Bin 0 -> 1966 bytes navit/xpm/country_GU.svgz | Bin 0 -> 5490 bytes navit/xpm/country_GU_16_16.png | Bin 0 -> 272 bytes navit/xpm/country_GU_32_32.png | Bin 0 -> 531 bytes navit/xpm/country_GU_48_48.png | Bin 0 -> 856 bytes navit/xpm/country_GU_8_8.png | Bin 0 -> 166 bytes navit/xpm/country_GU_96_96.png | Bin 0 -> 2218 bytes navit/xpm/country_GW.svgz | Bin 0 -> 410 bytes navit/xpm/country_GW_16_16.png | Bin 0 -> 202 bytes navit/xpm/country_GW_32_32.png | Bin 0 -> 343 bytes navit/xpm/country_GW_48_48.png | Bin 0 -> 441 bytes navit/xpm/country_GW_8_8.png | Bin 0 -> 154 bytes navit/xpm/country_GW_96_96.png | Bin 0 -> 797 bytes navit/xpm/country_GY.svgz | Bin 0 -> 636 bytes navit/xpm/country_GY_16_16.png | Bin 0 -> 404 bytes navit/xpm/country_GY_32_32.png | Bin 0 -> 590 bytes navit/xpm/country_GY_48_48.png | Bin 0 -> 709 bytes navit/xpm/country_GY_8_8.png | Bin 0 -> 232 bytes navit/xpm/country_GY_96_96.png | Bin 0 -> 1176 bytes navit/xpm/country_HK.svgz | Bin 0 -> 790 bytes navit/xpm/country_HK_16_16.png | Bin 0 -> 267 bytes navit/xpm/country_HK_32_32.png | Bin 0 -> 549 bytes navit/xpm/country_HK_48_48.png | Bin 0 -> 953 bytes navit/xpm/country_HK_8_8.png | Bin 0 -> 162 bytes navit/xpm/country_HK_96_96.png | Bin 0 -> 2175 bytes navit/xpm/country_HM.svgz | Bin 0 -> 1449 bytes navit/xpm/country_HM_16_16.png | Bin 0 -> 520 bytes navit/xpm/country_HM_32_32.png | Bin 0 -> 1038 bytes navit/xpm/country_HM_48_48.png | Bin 0 -> 1357 bytes navit/xpm/country_HM_8_8.png | Bin 0 -> 237 bytes navit/xpm/country_HM_96_96.png | Bin 0 -> 2564 bytes navit/xpm/country_HN.svgz | Bin 0 -> 422 bytes navit/xpm/country_HN_16_16.png | Bin 0 -> 209 bytes navit/xpm/country_HN_32_32.png | Bin 0 -> 335 bytes navit/xpm/country_HN_48_48.png | Bin 0 -> 399 bytes navit/xpm/country_HN_8_8.png | Bin 0 -> 145 bytes navit/xpm/country_HN_96_96.png | Bin 0 -> 859 bytes navit/xpm/country_HR.svgz | Bin 0 -> 13999 bytes navit/xpm/country_HR_16_16.png | Bin 0 -> 359 bytes navit/xpm/country_HR_32_32.png | Bin 0 -> 707 bytes navit/xpm/country_HR_48_48.png | Bin 0 -> 1001 bytes navit/xpm/country_HR_8_8.png | Bin 0 -> 198 bytes navit/xpm/country_HR_96_96.png | Bin 0 -> 2283 bytes navit/xpm/country_HT.svgz | Bin 0 -> 31729 bytes navit/xpm/country_HT_16_16.png | Bin 0 -> 206 bytes navit/xpm/country_HT_32_32.png | Bin 0 -> 364 bytes navit/xpm/country_HT_48_48.png | Bin 0 -> 559 bytes navit/xpm/country_HT_8_8.png | Bin 0 -> 143 bytes navit/xpm/country_HT_96_96.png | Bin 0 -> 1451 bytes navit/xpm/country_HU.svgz | Bin 0 -> 229 bytes navit/xpm/country_HU_16_16.png | Bin 0 -> 130 bytes navit/xpm/country_HU_32_32.png | Bin 0 -> 153 bytes navit/xpm/country_HU_48_48.png | Bin 0 -> 171 bytes navit/xpm/country_HU_8_8.png | Bin 0 -> 120 bytes navit/xpm/country_HU_96_96.png | Bin 0 -> 306 bytes navit/xpm/country_ID.svgz | Bin 0 -> 184 bytes navit/xpm/country_ID_16_16.png | Bin 0 -> 108 bytes navit/xpm/country_ID_32_32.png | Bin 0 -> 129 bytes navit/xpm/country_ID_48_48.png | Bin 0 -> 162 bytes navit/xpm/country_ID_8_8.png | Bin 0 -> 102 bytes navit/xpm/country_ID_96_96.png | Bin 0 -> 298 bytes navit/xpm/country_IE.svgz | Bin 0 -> 220 bytes navit/xpm/country_IE_16_16.png | Bin 0 -> 125 bytes navit/xpm/country_IE_32_32.png | Bin 0 -> 152 bytes navit/xpm/country_IE_48_48.png | Bin 0 -> 167 bytes navit/xpm/country_IE_8_8.png | Bin 0 -> 123 bytes navit/xpm/country_IE_96_96.png | Bin 0 -> 303 bytes navit/xpm/country_IL.svgz | Bin 0 -> 981 bytes navit/xpm/country_IL_16_16.png | Bin 0 -> 256 bytes navit/xpm/country_IL_32_32.png | Bin 0 -> 480 bytes navit/xpm/country_IL_48_48.png | Bin 0 -> 750 bytes navit/xpm/country_IL_8_8.png | Bin 0 -> 150 bytes navit/xpm/country_IL_96_96.png | Bin 0 -> 1594 bytes navit/xpm/country_IM.svgz | Bin 0 -> 7644 bytes navit/xpm/country_IM_16_16.png | Bin 0 -> 256 bytes navit/xpm/country_IM_32_32.png | Bin 0 -> 522 bytes navit/xpm/country_IM_48_48.png | Bin 0 -> 854 bytes navit/xpm/country_IM_8_8.png | Bin 0 -> 161 bytes navit/xpm/country_IM_96_96.png | Bin 0 -> 2194 bytes navit/xpm/country_IN.svgz | Bin 0 -> 3420 bytes navit/xpm/country_IN_16_16.png | Bin 0 -> 202 bytes navit/xpm/country_IN_32_32.png | Bin 0 -> 375 bytes navit/xpm/country_IN_48_48.png | Bin 0 -> 606 bytes navit/xpm/country_IN_8_8.png | Bin 0 -> 149 bytes navit/xpm/country_IN_96_96.png | Bin 0 -> 1804 bytes navit/xpm/country_IO.svgz | Bin 0 -> 13180 bytes navit/xpm/country_IO_16_16.png | Bin 0 -> 870 bytes navit/xpm/country_IO_32_32.png | Bin 0 -> 2649 bytes navit/xpm/country_IO_48_48.png | Bin 0 -> 4484 bytes navit/xpm/country_IO_8_8.png | Bin 0 -> 286 bytes navit/xpm/country_IO_96_96.png | Bin 0 -> 10532 bytes navit/xpm/country_IQ.svgz | Bin 0 -> 2450 bytes navit/xpm/country_IQ_16_16.png | Bin 0 -> 239 bytes navit/xpm/country_IQ_32_32.png | Bin 0 -> 418 bytes navit/xpm/country_IQ_48_48.png | Bin 0 -> 587 bytes navit/xpm/country_IQ_8_8.png | Bin 0 -> 165 bytes navit/xpm/country_IQ_96_96.png | Bin 0 -> 1309 bytes navit/xpm/country_IR.svgz | Bin 0 -> 721 bytes navit/xpm/country_IR_16_16.png | Bin 0 -> 306 bytes navit/xpm/country_IR_32_32.png | Bin 0 -> 725 bytes navit/xpm/country_IR_48_48.png | Bin 0 -> 1234 bytes navit/xpm/country_IR_8_8.png | Bin 0 -> 167 bytes navit/xpm/country_IR_96_96.png | Bin 0 -> 3854 bytes navit/xpm/country_IS.svgz | Bin 0 -> 334 bytes navit/xpm/country_IS_16_16.png | Bin 0 -> 197 bytes navit/xpm/country_IS_32_32.png | Bin 0 -> 270 bytes navit/xpm/country_IS_48_48.png | Bin 0 -> 332 bytes navit/xpm/country_IS_8_8.png | Bin 0 -> 130 bytes navit/xpm/country_IS_96_96.png | Bin 0 -> 511 bytes navit/xpm/country_IT.svgz | Bin 0 -> 209 bytes navit/xpm/country_IT_16_16.png | Bin 0 -> 126 bytes navit/xpm/country_IT_32_32.png | Bin 0 -> 152 bytes navit/xpm/country_IT_48_48.png | Bin 0 -> 167 bytes navit/xpm/country_IT_8_8.png | Bin 0 -> 123 bytes navit/xpm/country_IT_96_96.png | Bin 0 -> 305 bytes navit/xpm/country_JE.svgz | Bin 0 -> 13121 bytes navit/xpm/country_JE_16_16.png | Bin 0 -> 418 bytes navit/xpm/country_JE_32_32.png | Bin 0 -> 1014 bytes navit/xpm/country_JE_48_48.png | Bin 0 -> 1427 bytes navit/xpm/country_JE_8_8.png | Bin 0 -> 242 bytes navit/xpm/country_JE_96_96.png | Bin 0 -> 3034 bytes navit/xpm/country_JM.svgz | Bin 0 -> 313 bytes navit/xpm/country_JM_16_16.png | Bin 0 -> 397 bytes navit/xpm/country_JM_32_32.png | Bin 0 -> 507 bytes navit/xpm/country_JM_48_48.png | Bin 0 -> 679 bytes navit/xpm/country_JM_8_8.png | Bin 0 -> 232 bytes navit/xpm/country_JM_96_96.png | Bin 0 -> 1054 bytes navit/xpm/country_JO.svgz | Bin 0 -> 752 bytes navit/xpm/country_JO_16_16.png | Bin 0 -> 266 bytes navit/xpm/country_JO_32_32.png | Bin 0 -> 382 bytes navit/xpm/country_JO_48_48.png | Bin 0 -> 507 bytes navit/xpm/country_JO_8_8.png | Bin 0 -> 181 bytes navit/xpm/country_JO_96_96.png | Bin 0 -> 930 bytes navit/xpm/country_JP.svgz | Bin 0 -> 271 bytes navit/xpm/country_JP_16_16.png | Bin 0 -> 271 bytes navit/xpm/country_JP_32_32.png | Bin 0 -> 412 bytes navit/xpm/country_JP_48_48.png | Bin 0 -> 685 bytes navit/xpm/country_JP_8_8.png | Bin 0 -> 170 bytes navit/xpm/country_JP_96_96.png | Bin 0 -> 1317 bytes navit/xpm/country_KE.svgz | Bin 0 -> 683 bytes navit/xpm/country_KE_16_16.png | Bin 0 -> 317 bytes navit/xpm/country_KE_32_32.png | Bin 0 -> 648 bytes navit/xpm/country_KE_48_48.png | Bin 0 -> 965 bytes navit/xpm/country_KE_8_8.png | Bin 0 -> 184 bytes navit/xpm/country_KE_96_96.png | Bin 0 -> 2104 bytes navit/xpm/country_KG.svgz | Bin 0 -> 3063 bytes navit/xpm/country_KG_16_16.png | Bin 0 -> 294 bytes navit/xpm/country_KG_32_32.png | Bin 0 -> 680 bytes navit/xpm/country_KG_48_48.png | Bin 0 -> 1375 bytes navit/xpm/country_KG_8_8.png | Bin 0 -> 173 bytes navit/xpm/country_KG_96_96.png | Bin 0 -> 4212 bytes navit/xpm/country_KH.svgz | Bin 0 -> 6017 bytes navit/xpm/country_KH_16_16.png | Bin 0 -> 328 bytes navit/xpm/country_KH_32_32.png | Bin 0 -> 652 bytes navit/xpm/country_KH_48_48.png | Bin 0 -> 1000 bytes navit/xpm/country_KH_8_8.png | Bin 0 -> 181 bytes navit/xpm/country_KH_96_96.png | Bin 0 -> 2589 bytes navit/xpm/country_KI.svgz | Bin 0 -> 3554 bytes navit/xpm/country_KI_16_16.png | Bin 0 -> 599 bytes navit/xpm/country_KI_32_32.png | Bin 0 -> 1459 bytes navit/xpm/country_KI_48_48.png | Bin 0 -> 2305 bytes navit/xpm/country_KI_8_8.png | Bin 0 -> 222 bytes navit/xpm/country_KI_96_96.png | Bin 0 -> 5343 bytes navit/xpm/country_KM.svgz | Bin 0 -> 887 bytes navit/xpm/country_KM_16_16.png | Bin 0 -> 346 bytes navit/xpm/country_KM_32_32.png | Bin 0 -> 662 bytes navit/xpm/country_KM_48_48.png | Bin 0 -> 992 bytes navit/xpm/country_KM_8_8.png | Bin 0 -> 191 bytes navit/xpm/country_KM_96_96.png | Bin 0 -> 1937 bytes navit/xpm/country_KN.svgz | Bin 0 -> 557 bytes navit/xpm/country_KN_16_16.png | Bin 0 -> 420 bytes navit/xpm/country_KN_32_32.png | Bin 0 -> 674 bytes navit/xpm/country_KN_48_48.png | Bin 0 -> 950 bytes navit/xpm/country_KN_8_8.png | Bin 0 -> 231 bytes navit/xpm/country_KN_96_96.png | Bin 0 -> 1798 bytes navit/xpm/country_KP.svgz | Bin 0 -> 615 bytes navit/xpm/country_KP_16_16.png | Bin 0 -> 309 bytes navit/xpm/country_KP_32_32.png | Bin 0 -> 545 bytes navit/xpm/country_KP_48_48.png | Bin 0 -> 809 bytes navit/xpm/country_KP_8_8.png | Bin 0 -> 178 bytes navit/xpm/country_KP_96_96.png | Bin 0 -> 1646 bytes navit/xpm/country_KR.svgz | Bin 0 -> 475 bytes navit/xpm/country_KR_16_16.png | Bin 0 -> 526 bytes navit/xpm/country_KR_32_32.png | Bin 0 -> 1153 bytes navit/xpm/country_KR_48_48.png | Bin 0 -> 1844 bytes navit/xpm/country_KR_8_8.png | Bin 0 -> 242 bytes navit/xpm/country_KR_96_96.png | Bin 0 -> 4542 bytes navit/xpm/country_KW.svgz | Bin 0 -> 215 bytes navit/xpm/country_KW_16_16.png | Bin 0 -> 250 bytes navit/xpm/country_KW_32_32.png | Bin 0 -> 346 bytes navit/xpm/country_KW_48_48.png | Bin 0 -> 390 bytes navit/xpm/country_KW_8_8.png | Bin 0 -> 169 bytes navit/xpm/country_KW_96_96.png | Bin 0 -> 637 bytes navit/xpm/country_KY.svgz | Bin 0 -> 22215 bytes navit/xpm/country_KY_16_16.png | Bin 0 -> 483 bytes navit/xpm/country_KY_32_32.png | Bin 0 -> 1150 bytes navit/xpm/country_KY_48_48.png | Bin 0 -> 1722 bytes navit/xpm/country_KY_8_8.png | Bin 0 -> 227 bytes navit/xpm/country_KY_96_96.png | Bin 0 -> 4184 bytes navit/xpm/country_KZ.svgz | Bin 0 -> 8180 bytes navit/xpm/country_KZ_16_16.png | Bin 0 -> 377 bytes navit/xpm/country_KZ_32_32.png | Bin 0 -> 818 bytes navit/xpm/country_KZ_48_48.png | Bin 0 -> 1531 bytes navit/xpm/country_KZ_8_8.png | Bin 0 -> 209 bytes navit/xpm/country_KZ_96_96.png | Bin 0 -> 4480 bytes navit/xpm/country_LA.svgz | Bin 0 -> 208 bytes navit/xpm/country_LA_16_16.png | Bin 0 -> 215 bytes navit/xpm/country_LA_32_32.png | Bin 0 -> 361 bytes navit/xpm/country_LA_48_48.png | Bin 0 -> 500 bytes navit/xpm/country_LA_8_8.png | Bin 0 -> 163 bytes navit/xpm/country_LA_96_96.png | Bin 0 -> 1095 bytes navit/xpm/country_LB.svgz | Bin 0 -> 10942 bytes navit/xpm/country_LB_16_16.png | Bin 0 -> 251 bytes navit/xpm/country_LB_32_32.png | Bin 0 -> 573 bytes navit/xpm/country_LB_48_48.png | Bin 0 -> 976 bytes navit/xpm/country_LB_8_8.png | Bin 0 -> 164 bytes navit/xpm/country_LB_96_96.png | Bin 0 -> 2353 bytes navit/xpm/country_LC.svgz | Bin 0 -> 1018 bytes navit/xpm/country_LC_16_16.png | Bin 0 -> 304 bytes navit/xpm/country_LC_32_32.png | Bin 0 -> 592 bytes navit/xpm/country_LC_48_48.png | Bin 0 -> 789 bytes navit/xpm/country_LC_8_8.png | Bin 0 -> 195 bytes navit/xpm/country_LC_96_96.png | Bin 0 -> 1705 bytes navit/xpm/country_LI.svgz | Bin 0 -> 13590 bytes navit/xpm/country_LI_16_16.png | Bin 0 -> 219 bytes navit/xpm/country_LI_32_32.png | Bin 0 -> 381 bytes navit/xpm/country_LI_48_48.png | Bin 0 -> 607 bytes navit/xpm/country_LI_8_8.png | Bin 0 -> 143 bytes navit/xpm/country_LI_96_96.png | Bin 0 -> 1613 bytes navit/xpm/country_LK.svgz | Bin 0 -> 6279 bytes navit/xpm/country_LK_16_16.png | Bin 0 -> 455 bytes navit/xpm/country_LK_32_32.png | Bin 0 -> 952 bytes navit/xpm/country_LK_48_48.png | Bin 0 -> 1530 bytes navit/xpm/country_LK_8_8.png | Bin 0 -> 235 bytes navit/xpm/country_LK_96_96.png | Bin 0 -> 3764 bytes navit/xpm/country_LR.svgz | Bin 0 -> 1067 bytes navit/xpm/country_LR_16_16.png | Bin 0 -> 362 bytes navit/xpm/country_LR_32_32.png | Bin 0 -> 550 bytes navit/xpm/country_LR_48_48.png | Bin 0 -> 712 bytes navit/xpm/country_LR_8_8.png | Bin 0 -> 221 bytes navit/xpm/country_LR_96_96.png | Bin 0 -> 1152 bytes navit/xpm/country_LS.svgz | Bin 0 -> 1517 bytes navit/xpm/country_LS_16_16.png | Bin 0 -> 210 bytes navit/xpm/country_LS_32_32.png | Bin 0 -> 368 bytes navit/xpm/country_LS_48_48.png | Bin 0 -> 579 bytes navit/xpm/country_LS_8_8.png | Bin 0 -> 164 bytes navit/xpm/country_LS_96_96.png | Bin 0 -> 1427 bytes navit/xpm/country_LT.svgz | Bin 0 -> 214 bytes navit/xpm/country_LT_16_16.png | Bin 0 -> 129 bytes navit/xpm/country_LT_32_32.png | Bin 0 -> 152 bytes navit/xpm/country_LT_48_48.png | Bin 0 -> 176 bytes navit/xpm/country_LT_8_8.png | Bin 0 -> 119 bytes navit/xpm/country_LT_96_96.png | Bin 0 -> 310 bytes navit/xpm/country_LU.svgz | Bin 0 -> 194 bytes navit/xpm/country_LU_16_16.png | Bin 0 -> 129 bytes navit/xpm/country_LU_32_32.png | Bin 0 -> 155 bytes navit/xpm/country_LU_48_48.png | Bin 0 -> 172 bytes navit/xpm/country_LU_8_8.png | Bin 0 -> 123 bytes navit/xpm/country_LU_96_96.png | Bin 0 -> 306 bytes navit/xpm/country_LV.svgz | Bin 0 -> 268 bytes navit/xpm/country_LV_16_16.png | Bin 0 -> 123 bytes navit/xpm/country_LV_32_32.png | Bin 0 -> 150 bytes navit/xpm/country_LV_48_48.png | Bin 0 -> 184 bytes navit/xpm/country_LV_8_8.png | Bin 0 -> 104 bytes navit/xpm/country_LV_96_96.png | Bin 0 -> 319 bytes navit/xpm/country_LY.svgz | Bin 0 -> 239 bytes navit/xpm/country_LY_16_16.png | Bin 0 -> 100 bytes navit/xpm/country_LY_32_32.png | Bin 0 -> 117 bytes navit/xpm/country_LY_48_48.png | Bin 0 -> 148 bytes navit/xpm/country_LY_8_8.png | Bin 0 -> 95 bytes navit/xpm/country_LY_96_96.png | Bin 0 -> 289 bytes navit/xpm/country_MA.svgz | Bin 0 -> 1700 bytes navit/xpm/country_MA_16_16.png | Bin 0 -> 290 bytes navit/xpm/country_MA_32_32.png | Bin 0 -> 561 bytes navit/xpm/country_MA_48_48.png | Bin 0 -> 893 bytes navit/xpm/country_MA_8_8.png | Bin 0 -> 179 bytes navit/xpm/country_MA_96_96.png | Bin 0 -> 1880 bytes navit/xpm/country_MC.svgz | Bin 0 -> 186 bytes navit/xpm/country_MC_16_16.png | Bin 0 -> 108 bytes navit/xpm/country_MC_32_32.png | Bin 0 -> 129 bytes navit/xpm/country_MC_48_48.png | Bin 0 -> 162 bytes navit/xpm/country_MC_8_8.png | Bin 0 -> 102 bytes navit/xpm/country_MC_96_96.png | Bin 0 -> 298 bytes navit/xpm/country_MD.svgz | Bin 0 -> 24497 bytes navit/xpm/country_MD_16_16.png | Bin 0 -> 262 bytes navit/xpm/country_MD_32_32.png | Bin 0 -> 497 bytes navit/xpm/country_MD_48_48.png | Bin 0 -> 813 bytes navit/xpm/country_MD_8_8.png | Bin 0 -> 171 bytes navit/xpm/country_MD_96_96.png | Bin 0 -> 2237 bytes navit/xpm/country_ME.svgz | Bin 0 -> 48825 bytes navit/xpm/country_ME_16_16.png | Bin 0 -> 312 bytes navit/xpm/country_ME_32_32.png | Bin 0 -> 638 bytes navit/xpm/country_ME_48_48.png | Bin 0 -> 1114 bytes navit/xpm/country_ME_8_8.png | Bin 0 -> 194 bytes navit/xpm/country_ME_96_96.png | Bin 0 -> 3310 bytes navit/xpm/country_MF.svgz | Bin 0 -> 273 bytes navit/xpm/country_MF_16_16.png | Bin 0 -> 117 bytes navit/xpm/country_MF_32_32.png | Bin 0 -> 139 bytes navit/xpm/country_MF_48_48.png | Bin 0 -> 166 bytes navit/xpm/country_MF_8_8.png | Bin 0 -> 115 bytes navit/xpm/country_MF_96_96.png | Bin 0 -> 304 bytes navit/xpm/country_MG.svgz | Bin 0 -> 211 bytes navit/xpm/country_MG_16_16.png | Bin 0 -> 122 bytes navit/xpm/country_MG_32_32.png | Bin 0 -> 145 bytes navit/xpm/country_MG_48_48.png | Bin 0 -> 175 bytes navit/xpm/country_MG_8_8.png | Bin 0 -> 117 bytes navit/xpm/country_MG_96_96.png | Bin 0 -> 309 bytes navit/xpm/country_MH.svgz | Bin 0 -> 1001 bytes navit/xpm/country_MH_16_16.png | Bin 0 -> 576 bytes navit/xpm/country_MH_32_32.png | Bin 0 -> 1267 bytes navit/xpm/country_MH_48_48.png | Bin 0 -> 2030 bytes navit/xpm/country_MH_8_8.png | Bin 0 -> 250 bytes navit/xpm/country_MH_96_96.png | Bin 0 -> 4201 bytes navit/xpm/country_MK.svgz | Bin 0 -> 589 bytes navit/xpm/country_MK_16_16.png | Bin 0 -> 574 bytes navit/xpm/country_MK_32_32.png | Bin 0 -> 1144 bytes navit/xpm/country_MK_48_48.png | Bin 0 -> 1542 bytes navit/xpm/country_MK_8_8.png | Bin 0 -> 259 bytes navit/xpm/country_MK_96_96.png | Bin 0 -> 2998 bytes navit/xpm/country_ML.svgz | Bin 0 -> 194 bytes navit/xpm/country_ML_16_16.png | Bin 0 -> 126 bytes navit/xpm/country_ML_32_32.png | Bin 0 -> 152 bytes navit/xpm/country_ML_48_48.png | Bin 0 -> 168 bytes navit/xpm/country_ML_8_8.png | Bin 0 -> 123 bytes navit/xpm/country_ML_96_96.png | Bin 0 -> 305 bytes navit/xpm/country_MM.svgz | Bin 0 -> 4619 bytes navit/xpm/country_MM_16_16.png | Bin 0 -> 272 bytes navit/xpm/country_MM_32_32.png | Bin 0 -> 542 bytes navit/xpm/country_MM_48_48.png | Bin 0 -> 929 bytes navit/xpm/country_MM_8_8.png | Bin 0 -> 156 bytes navit/xpm/country_MM_96_96.png | Bin 0 -> 2537 bytes navit/xpm/country_MN.svgz | Bin 0 -> 682 bytes navit/xpm/country_MN_16_16.png | Bin 0 -> 266 bytes navit/xpm/country_MN_32_32.png | Bin 0 -> 481 bytes navit/xpm/country_MN_48_48.png | Bin 0 -> 724 bytes navit/xpm/country_MN_8_8.png | Bin 0 -> 182 bytes navit/xpm/country_MN_96_96.png | Bin 0 -> 1538 bytes navit/xpm/country_MO.svgz | Bin 0 -> 2739 bytes navit/xpm/country_MO_16_16.png | Bin 0 -> 322 bytes navit/xpm/country_MO_32_32.png | Bin 0 -> 725 bytes navit/xpm/country_MO_48_48.png | Bin 0 -> 1197 bytes navit/xpm/country_MO_8_8.png | Bin 0 -> 179 bytes navit/xpm/country_MO_96_96.png | Bin 0 -> 2715 bytes navit/xpm/country_MP.svgz | Bin 0 -> 20896 bytes navit/xpm/country_MP_16_16.png | Bin 0 -> 510 bytes navit/xpm/country_MP_32_32.png | Bin 0 -> 1288 bytes navit/xpm/country_MP_48_48.png | Bin 0 -> 2331 bytes navit/xpm/country_MP_8_8.png | Bin 0 -> 228 bytes navit/xpm/country_MP_96_96.png | Bin 0 -> 6664 bytes navit/xpm/country_MQ.svgz | Bin 0 -> 273 bytes navit/xpm/country_MQ_16_16.png | Bin 0 -> 117 bytes navit/xpm/country_MQ_32_32.png | Bin 0 -> 139 bytes navit/xpm/country_MQ_48_48.png | Bin 0 -> 166 bytes navit/xpm/country_MQ_8_8.png | Bin 0 -> 115 bytes navit/xpm/country_MQ_96_96.png | Bin 0 -> 304 bytes navit/xpm/country_MR.svgz | Bin 0 -> 461 bytes navit/xpm/country_MR_16_16.png | Bin 0 -> 325 bytes navit/xpm/country_MR_32_32.png | Bin 0 -> 592 bytes navit/xpm/country_MR_48_48.png | Bin 0 -> 854 bytes navit/xpm/country_MR_8_8.png | Bin 0 -> 199 bytes navit/xpm/country_MR_96_96.png | Bin 0 -> 1732 bytes navit/xpm/country_MS.svgz | Bin 0 -> 7097 bytes navit/xpm/country_MS_16_16.png | Bin 0 -> 455 bytes navit/xpm/country_MS_32_32.png | Bin 0 -> 1063 bytes navit/xpm/country_MS_48_48.png | Bin 0 -> 1463 bytes navit/xpm/country_MS_8_8.png | Bin 0 -> 227 bytes navit/xpm/country_MS_96_96.png | Bin 0 -> 2821 bytes navit/xpm/country_MT.svgz | Bin 0 -> 16688 bytes navit/xpm/country_MT_16_16.png | Bin 0 -> 183 bytes navit/xpm/country_MT_32_32.png | Bin 0 -> 293 bytes navit/xpm/country_MT_48_48.png | Bin 0 -> 473 bytes navit/xpm/country_MT_8_8.png | Bin 0 -> 134 bytes navit/xpm/country_MT_96_96.png | Bin 0 -> 912 bytes navit/xpm/country_MU.svgz | Bin 0 -> 218 bytes navit/xpm/country_MU_16_16.png | Bin 0 -> 123 bytes navit/xpm/country_MU_32_32.png | Bin 0 -> 145 bytes navit/xpm/country_MU_48_48.png | Bin 0 -> 186 bytes navit/xpm/country_MU_8_8.png | Bin 0 -> 114 bytes navit/xpm/country_MU_96_96.png | Bin 0 -> 320 bytes navit/xpm/country_MV.svgz | Bin 0 -> 348 bytes navit/xpm/country_MV_16_16.png | Bin 0 -> 218 bytes navit/xpm/country_MV_32_32.png | Bin 0 -> 335 bytes navit/xpm/country_MV_48_48.png | Bin 0 -> 461 bytes navit/xpm/country_MV_8_8.png | Bin 0 -> 156 bytes navit/xpm/country_MV_96_96.png | Bin 0 -> 979 bytes navit/xpm/country_MW.svgz | Bin 0 -> 4352 bytes navit/xpm/country_MW_16_16.png | Bin 0 -> 251 bytes navit/xpm/country_MW_32_32.png | Bin 0 -> 444 bytes navit/xpm/country_MW_48_48.png | Bin 0 -> 719 bytes navit/xpm/country_MW_8_8.png | Bin 0 -> 173 bytes navit/xpm/country_MW_96_96.png | Bin 0 -> 2124 bytes navit/xpm/country_MX.svgz | Bin 0 -> 191629 bytes navit/xpm/country_MX_16_16.png | Bin 0 -> 249 bytes navit/xpm/country_MX_32_32.png | Bin 0 -> 481 bytes navit/xpm/country_MX_48_48.png | Bin 0 -> 847 bytes navit/xpm/country_MX_8_8.png | Bin 0 -> 164 bytes navit/xpm/country_MX_96_96.png | Bin 0 -> 2495 bytes navit/xpm/country_MY.svgz | Bin 0 -> 889 bytes navit/xpm/country_MY_16_16.png | Bin 0 -> 341 bytes navit/xpm/country_MY_32_32.png | Bin 0 -> 689 bytes navit/xpm/country_MY_48_48.png | Bin 0 -> 1108 bytes navit/xpm/country_MY_8_8.png | Bin 0 -> 178 bytes navit/xpm/country_MY_96_96.png | Bin 0 -> 2366 bytes navit/xpm/country_MZ.svgz | Bin 0 -> 2365 bytes navit/xpm/country_MZ_16_16.png | Bin 0 -> 364 bytes navit/xpm/country_MZ_32_32.png | Bin 0 -> 758 bytes navit/xpm/country_MZ_48_48.png | Bin 0 -> 1182 bytes navit/xpm/country_MZ_8_8.png | Bin 0 -> 188 bytes navit/xpm/country_MZ_96_96.png | Bin 0 -> 2576 bytes navit/xpm/country_NA.svgz | Bin 0 -> 804 bytes navit/xpm/country_NA_16_16.png | Bin 0 -> 379 bytes navit/xpm/country_NA_32_32.png | Bin 0 -> 628 bytes navit/xpm/country_NA_48_48.png | Bin 0 -> 948 bytes navit/xpm/country_NA_8_8.png | Bin 0 -> 230 bytes navit/xpm/country_NA_96_96.png | Bin 0 -> 2059 bytes navit/xpm/country_NC.svgz | Bin 0 -> 273 bytes navit/xpm/country_NC_16_16.png | Bin 0 -> 117 bytes navit/xpm/country_NC_32_32.png | Bin 0 -> 139 bytes navit/xpm/country_NC_48_48.png | Bin 0 -> 166 bytes navit/xpm/country_NC_8_8.png | Bin 0 -> 115 bytes navit/xpm/country_NC_96_96.png | Bin 0 -> 304 bytes navit/xpm/country_NE.svgz | Bin 0 -> 1097 bytes navit/xpm/country_NE_16_16.png | Bin 0 -> 203 bytes navit/xpm/country_NE_32_32.png | Bin 0 -> 289 bytes navit/xpm/country_NE_48_48.png | Bin 0 -> 441 bytes navit/xpm/country_NE_8_8.png | Bin 0 -> 153 bytes navit/xpm/country_NE_96_96.png | Bin 0 -> 937 bytes navit/xpm/country_NF.svgz | Bin 0 -> 16417 bytes navit/xpm/country_NF_16_16.png | Bin 0 -> 362 bytes navit/xpm/country_NF_32_32.png | Bin 0 -> 761 bytes navit/xpm/country_NF_48_48.png | Bin 0 -> 1366 bytes navit/xpm/country_NF_8_8.png | Bin 0 -> 208 bytes navit/xpm/country_NF_96_96.png | Bin 0 -> 4101 bytes navit/xpm/country_NG.svgz | Bin 0 -> 261 bytes navit/xpm/country_NG_16_16.png | Bin 0 -> 117 bytes navit/xpm/country_NG_32_32.png | Bin 0 -> 138 bytes navit/xpm/country_NG_48_48.png | Bin 0 -> 164 bytes navit/xpm/country_NG_8_8.png | Bin 0 -> 115 bytes navit/xpm/country_NG_96_96.png | Bin 0 -> 301 bytes navit/xpm/country_NI.svgz | Bin 0 -> 13230 bytes navit/xpm/country_NI_16_16.png | Bin 0 -> 236 bytes navit/xpm/country_NI_32_32.png | Bin 0 -> 414 bytes navit/xpm/country_NI_48_48.png | Bin 0 -> 625 bytes navit/xpm/country_NI_8_8.png | Bin 0 -> 191 bytes navit/xpm/country_NI_96_96.png | Bin 0 -> 1589 bytes navit/xpm/country_NL.svgz | Bin 0 -> 337 bytes navit/xpm/country_NL_16_16.png | Bin 0 -> 130 bytes navit/xpm/country_NL_32_32.png | Bin 0 -> 153 bytes navit/xpm/country_NL_48_48.png | Bin 0 -> 173 bytes navit/xpm/country_NL_8_8.png | Bin 0 -> 120 bytes navit/xpm/country_NL_96_96.png | Bin 0 -> 307 bytes navit/xpm/country_NO.svgz | Bin 0 -> 282 bytes navit/xpm/country_NO_16_16.png | Bin 0 -> 170 bytes navit/xpm/country_NO_32_32.png | Bin 0 -> 206 bytes navit/xpm/country_NO_48_48.png | Bin 0 -> 264 bytes navit/xpm/country_NO_8_8.png | Bin 0 -> 129 bytes navit/xpm/country_NO_96_96.png | Bin 0 -> 405 bytes navit/xpm/country_NP.svgz | Bin 0 -> 841 bytes navit/xpm/country_NP_16_16.png | Bin 0 -> 647 bytes navit/xpm/country_NP_32_32.png | Bin 0 -> 1446 bytes navit/xpm/country_NP_48_48.png | Bin 0 -> 2217 bytes navit/xpm/country_NP_8_8.png | Bin 0 -> 311 bytes navit/xpm/country_NP_96_96.png | Bin 0 -> 4822 bytes navit/xpm/country_NR.svgz | Bin 0 -> 699 bytes navit/xpm/country_NR_16_16.png | Bin 0 -> 193 bytes navit/xpm/country_NR_32_32.png | Bin 0 -> 382 bytes navit/xpm/country_NR_48_48.png | Bin 0 -> 530 bytes navit/xpm/country_NR_8_8.png | Bin 0 -> 141 bytes navit/xpm/country_NR_96_96.png | Bin 0 -> 1215 bytes navit/xpm/country_NU.svgz | Bin 0 -> 1756 bytes navit/xpm/country_NU_16_16.png | Bin 0 -> 341 bytes navit/xpm/country_NU_32_32.png | Bin 0 -> 825 bytes navit/xpm/country_NU_48_48.png | Bin 0 -> 1032 bytes navit/xpm/country_NU_8_8.png | Bin 0 -> 163 bytes navit/xpm/country_NU_96_96.png | Bin 0 -> 1882 bytes navit/xpm/country_NZ.svgz | Bin 0 -> 1102 bytes navit/xpm/country_NZ_16_16.png | Bin 0 -> 441 bytes navit/xpm/country_NZ_32_32.png | Bin 0 -> 904 bytes navit/xpm/country_NZ_48_48.png | Bin 0 -> 1165 bytes navit/xpm/country_NZ_8_8.png | Bin 0 -> 215 bytes navit/xpm/country_NZ_96_96.png | Bin 0 -> 2174 bytes navit/xpm/country_OM.svgz | Bin 0 -> 10171 bytes navit/xpm/country_OM_16_16.png | Bin 0 -> 227 bytes navit/xpm/country_OM_32_32.png | Bin 0 -> 376 bytes navit/xpm/country_OM_48_48.png | Bin 0 -> 603 bytes navit/xpm/country_OM_8_8.png | Bin 0 -> 156 bytes navit/xpm/country_OM_96_96.png | Bin 0 -> 1327 bytes navit/xpm/country_PA.svgz | Bin 0 -> 495 bytes navit/xpm/country_PA_16_16.png | Bin 0 -> 239 bytes navit/xpm/country_PA_32_32.png | Bin 0 -> 441 bytes navit/xpm/country_PA_48_48.png | Bin 0 -> 622 bytes navit/xpm/country_PA_8_8.png | Bin 0 -> 159 bytes navit/xpm/country_PA_96_96.png | Bin 0 -> 1232 bytes navit/xpm/country_PE.svgz | Bin 0 -> 268 bytes navit/xpm/country_PE_16_16.png | Bin 0 -> 115 bytes navit/xpm/country_PE_32_32.png | Bin 0 -> 137 bytes navit/xpm/country_PE_48_48.png | Bin 0 -> 160 bytes navit/xpm/country_PE_8_8.png | Bin 0 -> 111 bytes navit/xpm/country_PE_96_96.png | Bin 0 -> 297 bytes navit/xpm/country_PF.svgz | Bin 0 -> 5854 bytes navit/xpm/country_PF_16_16.png | Bin 0 -> 259 bytes navit/xpm/country_PF_32_32.png | Bin 0 -> 554 bytes navit/xpm/country_PF_48_48.png | Bin 0 -> 998 bytes navit/xpm/country_PF_8_8.png | Bin 0 -> 159 bytes navit/xpm/country_PF_96_96.png | Bin 0 -> 2742 bytes navit/xpm/country_PG.svgz | Bin 0 -> 2988 bytes navit/xpm/country_PG_16_16.png | Bin 0 -> 444 bytes navit/xpm/country_PG_32_32.png | Bin 0 -> 894 bytes navit/xpm/country_PG_48_48.png | Bin 0 -> 1360 bytes navit/xpm/country_PG_8_8.png | Bin 0 -> 254 bytes navit/xpm/country_PG_96_96.png | Bin 0 -> 3086 bytes navit/xpm/country_PH.svgz | Bin 0 -> 1919 bytes navit/xpm/country_PH_16_16.png | Bin 0 -> 366 bytes navit/xpm/country_PH_32_32.png | Bin 0 -> 771 bytes navit/xpm/country_PH_48_48.png | Bin 0 -> 1224 bytes navit/xpm/country_PH_8_8.png | Bin 0 -> 190 bytes navit/xpm/country_PH_96_96.png | Bin 0 -> 2957 bytes navit/xpm/country_PK.svgz | Bin 0 -> 451 bytes navit/xpm/country_PK_16_16.png | Bin 0 -> 331 bytes navit/xpm/country_PK_32_32.png | Bin 0 -> 587 bytes navit/xpm/country_PK_48_48.png | Bin 0 -> 883 bytes navit/xpm/country_PK_8_8.png | Bin 0 -> 177 bytes navit/xpm/country_PK_96_96.png | Bin 0 -> 1837 bytes navit/xpm/country_PL.svgz | Bin 0 -> 271 bytes navit/xpm/country_PL_16_16.png | Bin 0 -> 108 bytes navit/xpm/country_PL_32_32.png | Bin 0 -> 129 bytes navit/xpm/country_PL_48_48.png | Bin 0 -> 162 bytes navit/xpm/country_PL_8_8.png | Bin 0 -> 102 bytes navit/xpm/country_PL_96_96.png | Bin 0 -> 298 bytes navit/xpm/country_PM.svgz | Bin 0 -> 273 bytes navit/xpm/country_PM_16_16.png | Bin 0 -> 117 bytes navit/xpm/country_PM_32_32.png | Bin 0 -> 139 bytes navit/xpm/country_PM_48_48.png | Bin 0 -> 166 bytes navit/xpm/country_PM_8_8.png | Bin 0 -> 115 bytes navit/xpm/country_PM_96_96.png | Bin 0 -> 304 bytes navit/xpm/country_PN.svgz | Bin 0 -> 11106 bytes navit/xpm/country_PN_16_16.png | Bin 0 -> 580 bytes navit/xpm/country_PN_32_32.png | Bin 0 -> 1412 bytes navit/xpm/country_PN_48_48.png | Bin 0 -> 2195 bytes navit/xpm/country_PN_8_8.png | Bin 0 -> 244 bytes navit/xpm/country_PN_96_96.png | Bin 0 -> 5368 bytes navit/xpm/country_PR.svgz | Bin 0 -> 563 bytes navit/xpm/country_PR_16_16.png | Bin 0 -> 396 bytes navit/xpm/country_PR_32_32.png | Bin 0 -> 724 bytes navit/xpm/country_PR_48_48.png | Bin 0 -> 1102 bytes navit/xpm/country_PR_8_8.png | Bin 0 -> 212 bytes navit/xpm/country_PR_96_96.png | Bin 0 -> 2142 bytes navit/xpm/country_PS.svgz | Bin 0 -> 1012 bytes navit/xpm/country_PS_16_16.png | Bin 0 -> 247 bytes navit/xpm/country_PS_32_32.png | Bin 0 -> 342 bytes navit/xpm/country_PS_48_48.png | Bin 0 -> 404 bytes navit/xpm/country_PS_8_8.png | Bin 0 -> 167 bytes navit/xpm/country_PS_96_96.png | Bin 0 -> 678 bytes navit/xpm/country_PT.svgz | Bin 0 -> 45410 bytes navit/xpm/country_PT_16_16.png | Bin 0 -> 341 bytes navit/xpm/country_PT_32_32.png | Bin 0 -> 763 bytes navit/xpm/country_PT_48_48.png | Bin 0 -> 1336 bytes navit/xpm/country_PT_8_8.png | Bin 0 -> 179 bytes navit/xpm/country_PT_96_96.png | Bin 0 -> 3517 bytes navit/xpm/country_PW.svgz | Bin 0 -> 287 bytes navit/xpm/country_PW_16_16.png | Bin 0 -> 256 bytes navit/xpm/country_PW_32_32.png | Bin 0 -> 417 bytes navit/xpm/country_PW_48_48.png | Bin 0 -> 681 bytes navit/xpm/country_PW_8_8.png | Bin 0 -> 169 bytes navit/xpm/country_PW_96_96.png | Bin 0 -> 1326 bytes navit/xpm/country_PY.svgz | Bin 0 -> 23337 bytes navit/xpm/country_PY_16_16.png | Bin 0 -> 231 bytes navit/xpm/country_PY_32_32.png | Bin 0 -> 361 bytes navit/xpm/country_PY_48_48.png | Bin 0 -> 531 bytes navit/xpm/country_PY_8_8.png | Bin 0 -> 147 bytes navit/xpm/country_PY_96_96.png | Bin 0 -> 1456 bytes navit/xpm/country_QA.svgz | Bin 0 -> 814 bytes navit/xpm/country_QA_16_16.png | Bin 0 -> 238 bytes navit/xpm/country_QA_32_32.png | Bin 0 -> 510 bytes navit/xpm/country_QA_48_48.png | Bin 0 -> 413 bytes navit/xpm/country_QA_8_8.png | Bin 0 -> 131 bytes navit/xpm/country_QA_96_96.png | Bin 0 -> 824 bytes navit/xpm/country_RE.svgz | Bin 0 -> 273 bytes navit/xpm/country_RE_16_16.png | Bin 0 -> 117 bytes navit/xpm/country_RE_32_32.png | Bin 0 -> 139 bytes navit/xpm/country_RE_48_48.png | Bin 0 -> 166 bytes navit/xpm/country_RE_8_8.png | Bin 0 -> 115 bytes navit/xpm/country_RE_96_96.png | Bin 0 -> 304 bytes navit/xpm/country_RO.svgz | Bin 0 -> 221 bytes navit/xpm/country_RO_16_16.png | Bin 0 -> 126 bytes navit/xpm/country_RO_32_32.png | Bin 0 -> 152 bytes navit/xpm/country_RO_48_48.png | Bin 0 -> 168 bytes navit/xpm/country_RO_8_8.png | Bin 0 -> 123 bytes navit/xpm/country_RO_96_96.png | Bin 0 -> 305 bytes navit/xpm/country_RS.svgz | Bin 0 -> 60907 bytes navit/xpm/country_RS_16_16.png | Bin 0 -> 324 bytes navit/xpm/country_RS_32_32.png | Bin 0 -> 717 bytes navit/xpm/country_RS_48_48.png | Bin 0 -> 1192 bytes navit/xpm/country_RS_8_8.png | Bin 0 -> 191 bytes navit/xpm/country_RS_96_96.png | Bin 0 -> 3548 bytes navit/xpm/country_RU.svgz | Bin 0 -> 186 bytes navit/xpm/country_RU_16_16.png | Bin 0 -> 128 bytes navit/xpm/country_RU_32_32.png | Bin 0 -> 145 bytes navit/xpm/country_RU_48_48.png | Bin 0 -> 160 bytes navit/xpm/country_RU_8_8.png | Bin 0 -> 124 bytes navit/xpm/country_RU_96_96.png | Bin 0 -> 296 bytes navit/xpm/country_RW.svgz | Bin 0 -> 816 bytes navit/xpm/country_RW_16_16.png | Bin 0 -> 248 bytes navit/xpm/country_RW_32_32.png | Bin 0 -> 462 bytes navit/xpm/country_RW_48_48.png | Bin 0 -> 800 bytes navit/xpm/country_RW_8_8.png | Bin 0 -> 147 bytes navit/xpm/country_RW_96_96.png | Bin 0 -> 2204 bytes navit/xpm/country_SA.svgz | Bin 0 -> 17866 bytes navit/xpm/country_SA_16_16.png | Bin 0 -> 326 bytes navit/xpm/country_SA_32_32.png | Bin 0 -> 751 bytes navit/xpm/country_SA_48_48.png | Bin 0 -> 1334 bytes navit/xpm/country_SA_8_8.png | Bin 0 -> 185 bytes navit/xpm/country_SA_96_96.png | Bin 0 -> 4061 bytes navit/xpm/country_SB.svgz | Bin 0 -> 553 bytes navit/xpm/country_SB_16_16.png | Bin 0 -> 340 bytes navit/xpm/country_SB_32_32.png | Bin 0 -> 646 bytes navit/xpm/country_SB_48_48.png | Bin 0 -> 1029 bytes navit/xpm/country_SB_8_8.png | Bin 0 -> 222 bytes navit/xpm/country_SB_96_96.png | Bin 0 -> 2130 bytes navit/xpm/country_SC.svgz | Bin 0 -> 270 bytes navit/xpm/country_SC_16_16.png | Bin 0 -> 477 bytes navit/xpm/country_SC_32_32.png | Bin 0 -> 685 bytes navit/xpm/country_SC_48_48.png | Bin 0 -> 855 bytes navit/xpm/country_SC_8_8.png | Bin 0 -> 315 bytes navit/xpm/country_SC_96_96.png | Bin 0 -> 1423 bytes navit/xpm/country_SD.svgz | Bin 0 -> 233 bytes navit/xpm/country_SD_16_16.png | Bin 0 -> 275 bytes navit/xpm/country_SD_32_32.png | Bin 0 -> 406 bytes navit/xpm/country_SD_48_48.png | Bin 0 -> 484 bytes navit/xpm/country_SD_8_8.png | Bin 0 -> 177 bytes navit/xpm/country_SD_96_96.png | Bin 0 -> 781 bytes navit/xpm/country_SE.svgz | Bin 0 -> 257 bytes navit/xpm/country_SE_16_16.png | Bin 0 -> 143 bytes navit/xpm/country_SE_32_32.png | Bin 0 -> 176 bytes navit/xpm/country_SE_48_48.png | Bin 0 -> 219 bytes navit/xpm/country_SE_8_8.png | Bin 0 -> 129 bytes navit/xpm/country_SE_96_96.png | Bin 0 -> 356 bytes navit/xpm/country_SG.svgz | Bin 0 -> 582 bytes navit/xpm/country_SG_16_16.png | Bin 0 -> 225 bytes navit/xpm/country_SG_32_32.png | Bin 0 -> 466 bytes navit/xpm/country_SG_48_48.png | Bin 0 -> 706 bytes navit/xpm/country_SG_8_8.png | Bin 0 -> 152 bytes navit/xpm/country_SG_96_96.png | Bin 0 -> 1618 bytes navit/xpm/country_SH.svgz | Bin 0 -> 30078 bytes navit/xpm/country_SH_16_16.png | Bin 0 -> 453 bytes navit/xpm/country_SH_32_32.png | Bin 0 -> 1057 bytes navit/xpm/country_SH_48_48.png | Bin 0 -> 1636 bytes navit/xpm/country_SH_8_8.png | Bin 0 -> 213 bytes navit/xpm/country_SH_96_96.png | Bin 0 -> 3621 bytes navit/xpm/country_SI.svgz | Bin 0 -> 2859 bytes navit/xpm/country_SI_16_16.png | Bin 0 -> 213 bytes navit/xpm/country_SI_32_32.png | Bin 0 -> 367 bytes navit/xpm/country_SI_48_48.png | Bin 0 -> 543 bytes navit/xpm/country_SI_8_8.png | Bin 0 -> 157 bytes navit/xpm/country_SI_96_96.png | Bin 0 -> 1249 bytes navit/xpm/country_SJ.svgz | Bin 0 -> 282 bytes navit/xpm/country_SJ_16_16.png | Bin 0 -> 170 bytes navit/xpm/country_SJ_32_32.png | Bin 0 -> 206 bytes navit/xpm/country_SJ_48_48.png | Bin 0 -> 264 bytes navit/xpm/country_SJ_8_8.png | Bin 0 -> 129 bytes navit/xpm/country_SJ_96_96.png | Bin 0 -> 405 bytes navit/xpm/country_SK.svgz | Bin 0 -> 1775 bytes navit/xpm/country_SK_16_16.png | Bin 0 -> 326 bytes navit/xpm/country_SK_32_32.png | Bin 0 -> 656 bytes navit/xpm/country_SK_48_48.png | Bin 0 -> 965 bytes navit/xpm/country_SK_8_8.png | Bin 0 -> 187 bytes navit/xpm/country_SK_96_96.png | Bin 0 -> 1990 bytes navit/xpm/country_SL.svgz | Bin 0 -> 202 bytes navit/xpm/country_SL_16_16.png | Bin 0 -> 129 bytes navit/xpm/country_SL_32_32.png | Bin 0 -> 162 bytes navit/xpm/country_SL_48_48.png | Bin 0 -> 172 bytes navit/xpm/country_SL_8_8.png | Bin 0 -> 125 bytes navit/xpm/country_SL_96_96.png | Bin 0 -> 306 bytes navit/xpm/country_SM.svgz | Bin 0 -> 24564 bytes navit/xpm/country_SM_16_16.png | Bin 0 -> 284 bytes navit/xpm/country_SM_32_32.png | Bin 0 -> 652 bytes navit/xpm/country_SM_48_48.png | Bin 0 -> 1150 bytes navit/xpm/country_SM_8_8.png | Bin 0 -> 177 bytes navit/xpm/country_SM_96_96.png | Bin 0 -> 3465 bytes navit/xpm/country_SN.svgz | Bin 0 -> 607 bytes navit/xpm/country_SN_16_16.png | Bin 0 -> 223 bytes navit/xpm/country_SN_32_32.png | Bin 0 -> 356 bytes navit/xpm/country_SN_48_48.png | Bin 0 -> 452 bytes navit/xpm/country_SN_8_8.png | Bin 0 -> 166 bytes navit/xpm/country_SN_96_96.png | Bin 0 -> 842 bytes navit/xpm/country_SO.svgz | Bin 0 -> 309 bytes navit/xpm/country_SO_16_16.png | Bin 0 -> 194 bytes navit/xpm/country_SO_32_32.png | Bin 0 -> 349 bytes navit/xpm/country_SO_48_48.png | Bin 0 -> 482 bytes navit/xpm/country_SO_8_8.png | Bin 0 -> 136 bytes navit/xpm/country_SO_96_96.png | Bin 0 -> 886 bytes navit/xpm/country_SR.svgz | Bin 0 -> 1141 bytes navit/xpm/country_SR_16_16.png | Bin 0 -> 250 bytes navit/xpm/country_SR_32_32.png | Bin 0 -> 414 bytes navit/xpm/country_SR_48_48.png | Bin 0 -> 587 bytes navit/xpm/country_SR_8_8.png | Bin 0 -> 194 bytes navit/xpm/country_SR_96_96.png | Bin 0 -> 1110 bytes navit/xpm/country_ST.svgz | Bin 0 -> 566 bytes navit/xpm/country_ST_16_16.png | Bin 0 -> 298 bytes navit/xpm/country_ST_32_32.png | Bin 0 -> 483 bytes navit/xpm/country_ST_48_48.png | Bin 0 -> 630 bytes navit/xpm/country_ST_8_8.png | Bin 0 -> 189 bytes navit/xpm/country_ST_96_96.png | Bin 0 -> 1120 bytes navit/xpm/country_SV.svgz | Bin 0 -> 95287 bytes navit/xpm/country_SV_16_16.png | Bin 0 -> 205 bytes navit/xpm/country_SV_32_32.png | Bin 0 -> 365 bytes navit/xpm/country_SV_48_48.png | Bin 0 -> 579 bytes navit/xpm/country_SV_8_8.png | Bin 0 -> 155 bytes navit/xpm/country_SV_96_96.png | Bin 0 -> 1639 bytes navit/xpm/country_SY.svgz | Bin 0 -> 340 bytes navit/xpm/country_SY_16_16.png | Bin 0 -> 189 bytes navit/xpm/country_SY_32_32.png | Bin 0 -> 315 bytes navit/xpm/country_SY_48_48.png | Bin 0 -> 497 bytes navit/xpm/country_SY_8_8.png | Bin 0 -> 158 bytes navit/xpm/country_SY_96_96.png | Bin 0 -> 982 bytes navit/xpm/country_SZ.svgz | Bin 0 -> 4646 bytes navit/xpm/country_SZ_16_16.png | Bin 0 -> 405 bytes navit/xpm/country_SZ_32_32.png | Bin 0 -> 940 bytes navit/xpm/country_SZ_48_48.png | Bin 0 -> 1468 bytes navit/xpm/country_SZ_8_8.png | Bin 0 -> 205 bytes navit/xpm/country_SZ_96_96.png | Bin 0 -> 3427 bytes navit/xpm/country_TC.svgz | Bin 0 -> 7949 bytes navit/xpm/country_TC_16_16.png | Bin 0 -> 437 bytes navit/xpm/country_TC_32_32.png | Bin 0 -> 937 bytes navit/xpm/country_TC_48_48.png | Bin 0 -> 1378 bytes navit/xpm/country_TC_8_8.png | Bin 0 -> 218 bytes navit/xpm/country_TC_96_96.png | Bin 0 -> 2664 bytes navit/xpm/country_TD.svgz | Bin 0 -> 342 bytes navit/xpm/country_TD_16_16.png | Bin 0 -> 126 bytes navit/xpm/country_TD_32_32.png | Bin 0 -> 152 bytes navit/xpm/country_TD_48_48.png | Bin 0 -> 167 bytes navit/xpm/country_TD_8_8.png | Bin 0 -> 123 bytes navit/xpm/country_TD_96_96.png | Bin 0 -> 305 bytes navit/xpm/country_TF.svgz | Bin 0 -> 1806 bytes navit/xpm/country_TF_16_16.png | Bin 0 -> 314 bytes navit/xpm/country_TF_32_32.png | Bin 0 -> 700 bytes navit/xpm/country_TF_48_48.png | Bin 0 -> 1075 bytes navit/xpm/country_TF_8_8.png | Bin 0 -> 206 bytes navit/xpm/country_TF_96_96.png | Bin 0 -> 2132 bytes navit/xpm/country_TG.svgz | Bin 0 -> 483 bytes navit/xpm/country_TG_16_16.png | Bin 0 -> 290 bytes navit/xpm/country_TG_32_32.png | Bin 0 -> 444 bytes navit/xpm/country_TG_48_48.png | Bin 0 -> 620 bytes navit/xpm/country_TG_8_8.png | Bin 0 -> 176 bytes navit/xpm/country_TG_96_96.png | Bin 0 -> 1141 bytes navit/xpm/country_TH.svgz | Bin 0 -> 369 bytes navit/xpm/country_TH_16_16.png | Bin 0 -> 147 bytes navit/xpm/country_TH_32_32.png | Bin 0 -> 167 bytes navit/xpm/country_TH_48_48.png | Bin 0 -> 176 bytes navit/xpm/country_TH_8_8.png | Bin 0 -> 128 bytes navit/xpm/country_TH_96_96.png | Bin 0 -> 312 bytes navit/xpm/country_TJ.svgz | Bin 0 -> 1974 bytes navit/xpm/country_TJ_16_16.png | Bin 0 -> 230 bytes navit/xpm/country_TJ_32_32.png | Bin 0 -> 420 bytes navit/xpm/country_TJ_48_48.png | Bin 0 -> 632 bytes navit/xpm/country_TJ_8_8.png | Bin 0 -> 175 bytes navit/xpm/country_TJ_96_96.png | Bin 0 -> 1465 bytes navit/xpm/country_TK.svgz | Bin 0 -> 1089 bytes navit/xpm/country_TK_16_16.png | Bin 0 -> 445 bytes navit/xpm/country_TK_32_32.png | Bin 0 -> 834 bytes navit/xpm/country_TK_48_48.png | Bin 0 -> 1248 bytes navit/xpm/country_TK_8_8.png | Bin 0 -> 259 bytes navit/xpm/country_TK_96_96.png | Bin 0 -> 2466 bytes navit/xpm/country_TL.svgz | Bin 0 -> 1024 bytes navit/xpm/country_TL_16_16.png | Bin 0 -> 352 bytes navit/xpm/country_TL_32_32.png | Bin 0 -> 634 bytes navit/xpm/country_TL_48_48.png | Bin 0 -> 901 bytes navit/xpm/country_TL_8_8.png | Bin 0 -> 181 bytes navit/xpm/country_TL_96_96.png | Bin 0 -> 1634 bytes navit/xpm/country_TM.svgz | Bin 0 -> 17172 bytes navit/xpm/country_TM_16_16.png | Bin 0 -> 399 bytes navit/xpm/country_TM_32_32.png | Bin 0 -> 1002 bytes navit/xpm/country_TM_48_48.png | Bin 0 -> 1755 bytes navit/xpm/country_TM_8_8.png | Bin 0 -> 204 bytes navit/xpm/country_TM_96_96.png | Bin 0 -> 4848 bytes navit/xpm/country_TN.svgz | Bin 0 -> 508 bytes navit/xpm/country_TN_16_16.png | Bin 0 -> 269 bytes navit/xpm/country_TN_32_32.png | Bin 0 -> 626 bytes navit/xpm/country_TN_48_48.png | Bin 0 -> 1013 bytes navit/xpm/country_TN_8_8.png | Bin 0 -> 164 bytes navit/xpm/country_TN_96_96.png | Bin 0 -> 2191 bytes navit/xpm/country_TO.svgz | Bin 0 -> 253 bytes navit/xpm/country_TO_16_16.png | Bin 0 -> 160 bytes navit/xpm/country_TO_32_32.png | Bin 0 -> 207 bytes navit/xpm/country_TO_48_48.png | Bin 0 -> 222 bytes navit/xpm/country_TO_8_8.png | Bin 0 -> 140 bytes navit/xpm/country_TO_96_96.png | Bin 0 -> 338 bytes navit/xpm/country_TR.svgz | Bin 0 -> 493 bytes navit/xpm/country_TR_16_16.png | Bin 0 -> 286 bytes navit/xpm/country_TR_32_32.png | Bin 0 -> 597 bytes navit/xpm/country_TR_48_48.png | Bin 0 -> 860 bytes navit/xpm/country_TR_8_8.png | Bin 0 -> 167 bytes navit/xpm/country_TR_96_96.png | Bin 0 -> 1858 bytes navit/xpm/country_TT.svgz | Bin 0 -> 313 bytes navit/xpm/country_TT_16_16.png | Bin 0 -> 538 bytes navit/xpm/country_TT_32_32.png | Bin 0 -> 1211 bytes navit/xpm/country_TT_48_48.png | Bin 0 -> 1937 bytes navit/xpm/country_TT_8_8.png | Bin 0 -> 239 bytes navit/xpm/country_TT_96_96.png | Bin 0 -> 3956 bytes navit/xpm/country_TV.svgz | Bin 0 -> 1713 bytes navit/xpm/country_TV_16_16.png | Bin 0 -> 542 bytes navit/xpm/country_TV_32_32.png | Bin 0 -> 1249 bytes navit/xpm/country_TV_48_48.png | Bin 0 -> 1794 bytes navit/xpm/country_TV_8_8.png | Bin 0 -> 246 bytes navit/xpm/country_TV_96_96.png | Bin 0 -> 3566 bytes navit/xpm/country_TW.svgz | Bin 0 -> 344 bytes navit/xpm/country_TW_16_16.png | Bin 0 -> 216 bytes navit/xpm/country_TW_32_32.png | Bin 0 -> 409 bytes navit/xpm/country_TW_48_48.png | Bin 0 -> 662 bytes navit/xpm/country_TW_8_8.png | Bin 0 -> 145 bytes navit/xpm/country_TW_96_96.png | Bin 0 -> 1615 bytes navit/xpm/country_TZ.svgz | Bin 0 -> 416 bytes navit/xpm/country_TZ_16_16.png | Bin 0 -> 278 bytes navit/xpm/country_TZ_32_32.png | Bin 0 -> 420 bytes navit/xpm/country_TZ_48_48.png | Bin 0 -> 490 bytes navit/xpm/country_TZ_8_8.png | Bin 0 -> 180 bytes navit/xpm/country_TZ_96_96.png | Bin 0 -> 765 bytes navit/xpm/country_UA.svgz | Bin 0 -> 266 bytes navit/xpm/country_UA_16_16.png | Bin 0 -> 108 bytes navit/xpm/country_UA_32_32.png | Bin 0 -> 129 bytes navit/xpm/country_UA_48_48.png | Bin 0 -> 165 bytes navit/xpm/country_UA_8_8.png | Bin 0 -> 102 bytes navit/xpm/country_UA_96_96.png | Bin 0 -> 301 bytes navit/xpm/country_UG.svgz | Bin 0 -> 2902 bytes navit/xpm/country_UG_16_16.png | Bin 0 -> 222 bytes navit/xpm/country_UG_32_32.png | Bin 0 -> 398 bytes navit/xpm/country_UG_48_48.png | Bin 0 -> 606 bytes navit/xpm/country_UG_8_8.png | Bin 0 -> 170 bytes navit/xpm/country_UG_96_96.png | Bin 0 -> 1497 bytes navit/xpm/country_UM.svgz | Bin 0 -> 590 bytes navit/xpm/country_UM_16_16.png | Bin 0 -> 335 bytes navit/xpm/country_UM_32_32.png | Bin 0 -> 879 bytes navit/xpm/country_UM_48_48.png | Bin 0 -> 1552 bytes navit/xpm/country_UM_8_8.png | Bin 0 -> 185 bytes navit/xpm/country_UM_96_96.png | Bin 0 -> 3689 bytes navit/xpm/country_US.svgz | Bin 0 -> 590 bytes navit/xpm/country_US_16_16.png | Bin 0 -> 335 bytes navit/xpm/country_US_32_32.png | Bin 0 -> 879 bytes navit/xpm/country_US_48_48.png | Bin 0 -> 1552 bytes navit/xpm/country_US_8_8.png | Bin 0 -> 185 bytes navit/xpm/country_US_96_96.png | Bin 0 -> 3689 bytes navit/xpm/country_UY.svgz | Bin 0 -> 918 bytes navit/xpm/country_UY_16_16.png | Bin 0 -> 296 bytes navit/xpm/country_UY_32_32.png | Bin 0 -> 625 bytes navit/xpm/country_UY_48_48.png | Bin 0 -> 986 bytes navit/xpm/country_UY_8_8.png | Bin 0 -> 169 bytes navit/xpm/country_UY_96_96.png | Bin 0 -> 2598 bytes navit/xpm/country_UZ.svgz | Bin 0 -> 648 bytes navit/xpm/country_UZ_16_16.png | Bin 0 -> 263 bytes navit/xpm/country_UZ_32_32.png | Bin 0 -> 442 bytes navit/xpm/country_UZ_48_48.png | Bin 0 -> 697 bytes navit/xpm/country_UZ_8_8.png | Bin 0 -> 180 bytes navit/xpm/country_UZ_96_96.png | Bin 0 -> 1436 bytes navit/xpm/country_VA.svgz | Bin 0 -> 49864 bytes navit/xpm/country_VA_16_16.png | Bin 0 -> 257 bytes navit/xpm/country_VA_32_32.png | Bin 0 -> 565 bytes navit/xpm/country_VA_48_48.png | Bin 0 -> 976 bytes navit/xpm/country_VA_8_8.png | Bin 0 -> 151 bytes navit/xpm/country_VA_96_96.png | Bin 0 -> 2807 bytes navit/xpm/country_VC.svgz | Bin 0 -> 766 bytes navit/xpm/country_VC_16_16.png | Bin 0 -> 246 bytes navit/xpm/country_VC_32_32.png | Bin 0 -> 466 bytes navit/xpm/country_VC_48_48.png | Bin 0 -> 519 bytes navit/xpm/country_VC_8_8.png | Bin 0 -> 153 bytes navit/xpm/country_VC_96_96.png | Bin 0 -> 914 bytes navit/xpm/country_VE.svgz | Bin 0 -> 540 bytes navit/xpm/country_VE_16_16.png | Bin 0 -> 278 bytes navit/xpm/country_VE_32_32.png | Bin 0 -> 460 bytes navit/xpm/country_VE_48_48.png | Bin 0 -> 704 bytes navit/xpm/country_VE_8_8.png | Bin 0 -> 191 bytes navit/xpm/country_VE_96_96.png | Bin 0 -> 1654 bytes navit/xpm/country_VG.svgz | Bin 0 -> 15568 bytes navit/xpm/country_VG_16_16.png | Bin 0 -> 494 bytes navit/xpm/country_VG_32_32.png | Bin 0 -> 1195 bytes navit/xpm/country_VG_48_48.png | Bin 0 -> 1812 bytes navit/xpm/country_VG_8_8.png | Bin 0 -> 238 bytes navit/xpm/country_VG_96_96.png | Bin 0 -> 4215 bytes navit/xpm/country_VI.svgz | Bin 0 -> 9326 bytes navit/xpm/country_VI_16_16.png | Bin 0 -> 609 bytes navit/xpm/country_VI_32_32.png | Bin 0 -> 1539 bytes navit/xpm/country_VI_48_48.png | Bin 0 -> 2858 bytes navit/xpm/country_VI_8_8.png | Bin 0 -> 248 bytes navit/xpm/country_VI_96_96.png | Bin 0 -> 7837 bytes navit/xpm/country_VN.svgz | Bin 0 -> 442 bytes navit/xpm/country_VN_16_16.png | Bin 0 -> 295 bytes navit/xpm/country_VN_32_32.png | Bin 0 -> 491 bytes navit/xpm/country_VN_48_48.png | Bin 0 -> 669 bytes navit/xpm/country_VN_8_8.png | Bin 0 -> 170 bytes navit/xpm/country_VN_96_96.png | Bin 0 -> 1321 bytes navit/xpm/country_VU.svgz | Bin 0 -> 3061 bytes navit/xpm/country_VU_16_16.png | Bin 0 -> 432 bytes navit/xpm/country_VU_32_32.png | Bin 0 -> 962 bytes navit/xpm/country_VU_48_48.png | Bin 0 -> 1511 bytes navit/xpm/country_VU_8_8.png | Bin 0 -> 209 bytes navit/xpm/country_VU_96_96.png | Bin 0 -> 3459 bytes navit/xpm/country_WF.svgz | Bin 0 -> 273 bytes navit/xpm/country_WF_16_16.png | Bin 0 -> 117 bytes navit/xpm/country_WF_32_32.png | Bin 0 -> 139 bytes navit/xpm/country_WF_48_48.png | Bin 0 -> 166 bytes navit/xpm/country_WF_8_8.png | Bin 0 -> 115 bytes navit/xpm/country_WF_96_96.png | Bin 0 -> 304 bytes navit/xpm/country_WS.svgz | Bin 0 -> 933 bytes navit/xpm/country_WS_16_16.png | Bin 0 -> 216 bytes navit/xpm/country_WS_32_32.png | Bin 0 -> 369 bytes navit/xpm/country_WS_48_48.png | Bin 0 -> 547 bytes navit/xpm/country_WS_8_8.png | Bin 0 -> 147 bytes navit/xpm/country_WS_96_96.png | Bin 0 -> 1211 bytes navit/xpm/country_YE.svgz | Bin 0 -> 350 bytes navit/xpm/country_YE_16_16.png | Bin 0 -> 129 bytes navit/xpm/country_YE_32_32.png | Bin 0 -> 150 bytes navit/xpm/country_YE_48_48.png | Bin 0 -> 151 bytes navit/xpm/country_YE_8_8.png | Bin 0 -> 125 bytes navit/xpm/country_YE_96_96.png | Bin 0 -> 247 bytes navit/xpm/country_YT.svgz | Bin 0 -> 273 bytes navit/xpm/country_YT_16_16.png | Bin 0 -> 117 bytes navit/xpm/country_YT_32_32.png | Bin 0 -> 139 bytes navit/xpm/country_YT_48_48.png | Bin 0 -> 166 bytes navit/xpm/country_YT_8_8.png | Bin 0 -> 115 bytes navit/xpm/country_YT_96_96.png | Bin 0 -> 304 bytes navit/xpm/country_ZA.svgz | Bin 0 -> 465 bytes navit/xpm/country_ZA_16_16.png | Bin 0 -> 388 bytes navit/xpm/country_ZA_32_32.png | Bin 0 -> 616 bytes navit/xpm/country_ZA_48_48.png | Bin 0 -> 754 bytes navit/xpm/country_ZA_8_8.png | Bin 0 -> 222 bytes navit/xpm/country_ZA_96_96.png | Bin 0 -> 1072 bytes navit/xpm/country_ZM.svgz | Bin 0 -> 5486 bytes navit/xpm/country_ZM_16_16.png | Bin 0 -> 222 bytes navit/xpm/country_ZM_32_32.png | Bin 0 -> 385 bytes navit/xpm/country_ZM_48_48.png | Bin 0 -> 550 bytes navit/xpm/country_ZM_8_8.png | Bin 0 -> 139 bytes navit/xpm/country_ZM_96_96.png | Bin 0 -> 1416 bytes navit/xpm/country_ZW.svgz | Bin 0 -> 1910 bytes navit/xpm/country_ZW_16_16.png | Bin 0 -> 350 bytes navit/xpm/country_ZW_32_32.png | Bin 0 -> 737 bytes navit/xpm/country_ZW_48_48.png | Bin 0 -> 1140 bytes navit/xpm/country_ZW_8_8.png | Bin 0 -> 185 bytes navit/xpm/country_ZW_96_96.png | Bin 0 -> 2322 bytes navit/xpm/country__16_16.png | Bin 0 -> 559 bytes navit/xpm/country__32_32.png | Bin 0 -> 1469 bytes navit/xpm/country__48_48.png | Bin 0 -> 2339 bytes navit/xpm/country__8_8.png | Bin 0 -> 249 bytes navit/xpm/country__96_96.png | Bin 0 -> 5227 bytes navit/xpm/cursor.png | Bin 0 -> 887 bytes navit/xpm/cursor.svg | 187 + navit/xpm/cursor_16_16.png | Bin 0 -> 685 bytes navit/xpm/cursor_32_32.png | Bin 0 -> 1272 bytes navit/xpm/cursor_48_48.png | Bin 0 -> 1951 bytes navit/xpm/cursor_8_8.png | Bin 0 -> 311 bytes navit/xpm/cursor_96_96.png | Bin 0 -> 3980 bytes navit/xpm/danger.png | Bin 0 -> 2670 bytes navit/xpm/danger.svg | 84 + navit/xpm/danger_16_16.png | Bin 0 -> 581 bytes navit/xpm/danger_32_32.png | Bin 0 -> 1213 bytes navit/xpm/danger_48_48.png | Bin 0 -> 2017 bytes navit/xpm/danger_8_8.png | Bin 0 -> 292 bytes navit/xpm/danger_96_96.png | Bin 0 -> 4691 bytes navit/xpm/desktop_icons/128x128/navit.png | Bin 0 -> 14299 bytes navit/xpm/desktop_icons/22x22/navit.png | Bin 0 -> 956 bytes navit/xpm/desktop_icons/navit.desktop | 16 + navit/xpm/dumping_station.xpm | 112 + navit/xpm/exit.png | Bin 0 -> 443 bytes navit/xpm/exit.svg | 167 + navit/xpm/exit_16_16.png | Bin 0 -> 449 bytes navit/xpm/exit_32_32.png | Bin 0 -> 764 bytes navit/xpm/exit_48_48.png | Bin 0 -> 923 bytes navit/xpm/exit_8_8.png | Bin 0 -> 234 bytes navit/xpm/exit_96_96.png | Bin 0 -> 1519 bytes navit/xpm/fastfood.png | Bin 0 -> 865 bytes navit/xpm/fastfood.svg | 217 + navit/xpm/fastfood_16_16.png | Bin 0 -> 689 bytes navit/xpm/fastfood_32_32.png | Bin 0 -> 1434 bytes navit/xpm/fastfood_48_48.png | Bin 0 -> 1977 bytes navit/xpm/fastfood_8_8.png | Bin 0 -> 310 bytes navit/xpm/fastfood_96_96.png | Bin 0 -> 3664 bytes navit/xpm/firebrigade.png | Bin 0 -> 632 bytes navit/xpm/firebrigade.svg | 109 + navit/xpm/firebrigade_16_16.png | Bin 0 -> 458 bytes navit/xpm/firebrigade_32_32.png | Bin 0 -> 943 bytes navit/xpm/firebrigade_48_48.png | Bin 0 -> 1384 bytes navit/xpm/firebrigade_8_8.png | Bin 0 -> 259 bytes navit/xpm/firebrigade_96_96.png | Bin 0 -> 2869 bytes navit/xpm/flag_bk_tr.xpm | 27 + navit/xpm/flag_bk_wh.xpm | 28 + navit/xpm/flag_bl_wh.xpm | 28 + navit/xpm/flag_wh_bk.xpm | 28 + navit/xpm/fountain.png | Bin 0 -> 975 bytes navit/xpm/fountain.svg | 452 + navit/xpm/fountain_16_16.png | Bin 0 -> 647 bytes navit/xpm/fountain_32_32.png | Bin 0 -> 1719 bytes navit/xpm/fountain_48_48.png | Bin 0 -> 3162 bytes navit/xpm/fountain_8_8.png | Bin 0 -> 269 bytes navit/xpm/fountain_96_96.png | Bin 0 -> 8780 bytes navit/xpm/fuel.png | Bin 0 -> 568 bytes navit/xpm/fuel.svg | 201 + navit/xpm/fuel_16_16.png | Bin 0 -> 504 bytes navit/xpm/fuel_32_32.png | Bin 0 -> 897 bytes navit/xpm/fuel_48_48.png | Bin 0 -> 1363 bytes navit/xpm/fuel_8_8.png | Bin 0 -> 281 bytes navit/xpm/fuel_96_96.png | Bin 0 -> 2687 bytes navit/xpm/gc_event.xpm | 41 + navit/xpm/gc_multi.xpm | 50 + navit/xpm/gc_mystery.xpm | 40 + navit/xpm/gc_question.xpm | 25 + navit/xpm/gc_reference.xpm | 40 + navit/xpm/gc_stages.xpm | 45 + navit/xpm/gc_tradi.xpm | 41 + navit/xpm/gc_webcam.xpm | 44 + navit/xpm/golf.png | Bin 0 -> 458 bytes navit/xpm/golf.svg | 186 + navit/xpm/golf_16_16.png | Bin 0 -> 344 bytes navit/xpm/golf_32_32.png | Bin 0 -> 755 bytes navit/xpm/golf_48_48.png | Bin 0 -> 1282 bytes navit/xpm/golf_8_8.png | Bin 0 -> 190 bytes navit/xpm/golf_96_96.png | Bin 0 -> 3553 bytes navit/xpm/gui_about.png | Bin 0 -> 2777 bytes navit/xpm/gui_about.svg | 361 + navit/xpm/gui_about_16_16.png | Bin 0 -> 618 bytes navit/xpm/gui_about_32_32.png | Bin 0 -> 1544 bytes navit/xpm/gui_about_48_48.png | Bin 0 -> 2777 bytes navit/xpm/gui_about_8_8.png | Bin 0 -> 265 bytes navit/xpm/gui_about_96_96.png | Bin 0 -> 7434 bytes navit/xpm/gui_actions.png | Bin 0 -> 1971 bytes navit/xpm/gui_actions.svg | 591 + navit/xpm/gui_actions_16_16.png | Bin 0 -> 577 bytes navit/xpm/gui_actions_32_32.png | Bin 0 -> 1305 bytes navit/xpm/gui_actions_48_48.png | Bin 0 -> 1971 bytes navit/xpm/gui_actions_8_8.png | Bin 0 -> 271 bytes navit/xpm/gui_actions_96_96.png | Bin 0 -> 4821 bytes navit/xpm/gui_active.png | Bin 0 -> 3587 bytes navit/xpm/gui_active.svg | 237 + navit/xpm/gui_active_16_16.png | Bin 0 -> 851 bytes navit/xpm/gui_active_32_32.png | Bin 0 -> 2105 bytes navit/xpm/gui_active_48_48.png | Bin 0 -> 3587 bytes navit/xpm/gui_active_8_8.png | Bin 0 -> 346 bytes navit/xpm/gui_active_96_96.png | Bin 0 -> 9137 bytes navit/xpm/gui_arrow_down.png | Bin 0 -> 996 bytes navit/xpm/gui_arrow_down.svg | 73 + navit/xpm/gui_arrow_down_16_16.png | Bin 0 -> 351 bytes navit/xpm/gui_arrow_down_32_32.png | Bin 0 -> 673 bytes navit/xpm/gui_arrow_down_48_48.png | Bin 0 -> 996 bytes navit/xpm/gui_arrow_down_8_8.png | Bin 0 -> 195 bytes navit/xpm/gui_arrow_down_96_96.png | Bin 0 -> 2030 bytes navit/xpm/gui_arrow_left.png | Bin 0 -> 936 bytes navit/xpm/gui_arrow_left.svg | 73 + navit/xpm/gui_arrow_left_16_16.png | Bin 0 -> 353 bytes navit/xpm/gui_arrow_left_32_32.png | Bin 0 -> 681 bytes navit/xpm/gui_arrow_left_48_48.png | Bin 0 -> 936 bytes navit/xpm/gui_arrow_left_8_8.png | Bin 0 -> 211 bytes navit/xpm/gui_arrow_left_96_96.png | Bin 0 -> 1910 bytes navit/xpm/gui_arrow_right.png | Bin 0 -> 994 bytes navit/xpm/gui_arrow_right.svg | 73 + navit/xpm/gui_arrow_right_16_16.png | Bin 0 -> 360 bytes navit/xpm/gui_arrow_right_32_32.png | Bin 0 -> 665 bytes navit/xpm/gui_arrow_right_48_48.png | Bin 0 -> 994 bytes navit/xpm/gui_arrow_right_8_8.png | Bin 0 -> 209 bytes navit/xpm/gui_arrow_right_96_96.png | Bin 0 -> 1935 bytes navit/xpm/gui_arrow_up.png | Bin 0 -> 979 bytes navit/xpm/gui_arrow_up.svg | 73 + navit/xpm/gui_arrow_up_16_16.png | Bin 0 -> 350 bytes navit/xpm/gui_arrow_up_32_32.png | Bin 0 -> 655 bytes navit/xpm/gui_arrow_up_48_48.png | Bin 0 -> 979 bytes navit/xpm/gui_arrow_up_8_8.png | Bin 0 -> 194 bytes navit/xpm/gui_arrow_up_96_96.png | Bin 0 -> 2047 bytes navit/xpm/gui_bookmark.png | Bin 0 -> 1555 bytes navit/xpm/gui_bookmark.svg | 470 + navit/xpm/gui_bookmark_16_16.png | Bin 0 -> 465 bytes navit/xpm/gui_bookmark_32_32.png | Bin 0 -> 976 bytes navit/xpm/gui_bookmark_48_48.png | Bin 0 -> 1555 bytes navit/xpm/gui_bookmark_8_8.png | Bin 0 -> 250 bytes navit/xpm/gui_bookmark_96_96.png | Bin 0 -> 3719 bytes navit/xpm/gui_display.png | Bin 0 -> 2834 bytes navit/xpm/gui_display.svg | 1752 ++ navit/xpm/gui_display_16_16.png | Bin 0 -> 679 bytes navit/xpm/gui_display_32_32.png | Bin 0 -> 1716 bytes navit/xpm/gui_display_48_48.png | Bin 0 -> 2834 bytes navit/xpm/gui_display_8_8.png | Bin 0 -> 301 bytes navit/xpm/gui_display_96_96.png | Bin 0 -> 6891 bytes navit/xpm/gui_formerdests.png | Bin 0 -> 2686 bytes navit/xpm/gui_formerdests.svg | 251 + navit/xpm/gui_formerdests_16_16.png | Bin 0 -> 657 bytes navit/xpm/gui_formerdests_32_32.png | Bin 0 -> 1603 bytes navit/xpm/gui_formerdests_48_48.png | Bin 0 -> 2686 bytes navit/xpm/gui_formerdests_8_8.png | Bin 0 -> 282 bytes navit/xpm/gui_formerdests_96_96.png | Bin 0 -> 6076 bytes navit/xpm/gui_fullscreen.png | Bin 0 -> 1207 bytes navit/xpm/gui_fullscreen.svg | 261 + navit/xpm/gui_fullscreen_16_16.png | Bin 0 -> 457 bytes navit/xpm/gui_fullscreen_32_32.png | Bin 0 -> 917 bytes navit/xpm/gui_fullscreen_48_48.png | Bin 0 -> 1207 bytes navit/xpm/gui_fullscreen_8_8.png | Bin 0 -> 255 bytes navit/xpm/gui_fullscreen_96_96.png | Bin 0 -> 2509 bytes navit/xpm/gui_help.png | Bin 0 -> 4622 bytes navit/xpm/gui_help.svg | 398 + navit/xpm/gui_help_16_16.png | Bin 0 -> 914 bytes navit/xpm/gui_help_32_32.png | Bin 0 -> 2479 bytes navit/xpm/gui_help_48_48.png | Bin 0 -> 4622 bytes navit/xpm/gui_help_8_8.png | Bin 0 -> 350 bytes navit/xpm/gui_help_96_96.png | Bin 0 -> 12676 bytes navit/xpm/gui_home.png | Bin 0 -> 1828 bytes navit/xpm/gui_home.svg | 248 + navit/xpm/gui_home_16_16.png | Bin 0 -> 535 bytes navit/xpm/gui_home_32_32.png | Bin 0 -> 1137 bytes navit/xpm/gui_home_48_48.png | Bin 0 -> 1828 bytes navit/xpm/gui_home_8_8.png | Bin 0 -> 280 bytes navit/xpm/gui_home_96_96.png | Bin 0 -> 4064 bytes navit/xpm/gui_inactive.png | Bin 0 -> 2339 bytes navit/xpm/gui_inactive.svg | 233 + navit/xpm/gui_inactive_16_16.png | Bin 0 -> 559 bytes navit/xpm/gui_inactive_32_32.png | Bin 0 -> 1469 bytes navit/xpm/gui_inactive_48_48.png | Bin 0 -> 2339 bytes navit/xpm/gui_inactive_8_8.png | Bin 0 -> 249 bytes navit/xpm/gui_inactive_96_96.png | Bin 0 -> 5227 bytes navit/xpm/gui_leave_fullscreen.png | Bin 0 -> 1497 bytes navit/xpm/gui_leave_fullscreen.svg | 422 + navit/xpm/gui_leave_fullscreen_16_16.png | Bin 0 -> 499 bytes navit/xpm/gui_leave_fullscreen_32_32.png | Bin 0 -> 1037 bytes navit/xpm/gui_leave_fullscreen_48_48.png | Bin 0 -> 1497 bytes navit/xpm/gui_leave_fullscreen_8_8.png | Bin 0 -> 277 bytes navit/xpm/gui_leave_fullscreen_96_96.png | Bin 0 -> 3430 bytes navit/xpm/gui_log.png | Bin 0 -> 666 bytes navit/xpm/gui_log.svg | 352 + navit/xpm/gui_log_16_16.png | Bin 0 -> 336 bytes navit/xpm/gui_log_32_32.png | Bin 0 -> 578 bytes navit/xpm/gui_log_48_48.png | Bin 0 -> 666 bytes navit/xpm/gui_log_8_8.png | Bin 0 -> 244 bytes navit/xpm/gui_log_96_96.png | Bin 0 -> 1436 bytes navit/xpm/gui_map.png | Bin 0 -> 3910 bytes navit/xpm/gui_map.svg | 1015 + navit/xpm/gui_map_16_16.png | Bin 0 -> 821 bytes navit/xpm/gui_map_32_32.png | Bin 0 -> 2159 bytes navit/xpm/gui_map_48_48.png | Bin 0 -> 3910 bytes navit/xpm/gui_map_8_8.png | Bin 0 -> 350 bytes navit/xpm/gui_map_96_96.png | Bin 0 -> 10285 bytes navit/xpm/gui_maps.png | Bin 0 -> 3088 bytes navit/xpm/gui_maps.svg | 577 + navit/xpm/gui_maps_16_16.png | Bin 0 -> 817 bytes navit/xpm/gui_maps_32_32.png | Bin 0 -> 1866 bytes navit/xpm/gui_maps_48_48.png | Bin 0 -> 3088 bytes navit/xpm/gui_maps_8_8.png | Bin 0 -> 343 bytes navit/xpm/gui_maps_96_96.png | Bin 0 -> 6984 bytes navit/xpm/gui_menu.png | Bin 0 -> 4559 bytes navit/xpm/gui_menu.svg | 658 + navit/xpm/gui_menu_16_16.png | Bin 0 -> 654 bytes navit/xpm/gui_menu_32_32.png | Bin 0 -> 1844 bytes navit/xpm/gui_menu_48_48.png | Bin 0 -> 3339 bytes navit/xpm/gui_menu_8_8.png | Bin 0 -> 289 bytes navit/xpm/gui_menu_96_96.png | Bin 0 -> 9077 bytes navit/xpm/gui_minus.png | Bin 0 -> 178 bytes navit/xpm/gui_minus.svg | 83 + navit/xpm/gui_minus_16_16.png | Bin 0 -> 149 bytes navit/xpm/gui_minus_32_32.png | Bin 0 -> 145 bytes navit/xpm/gui_minus_48_48.png | Bin 0 -> 165 bytes navit/xpm/gui_minus_8_8.png | Bin 0 -> 120 bytes navit/xpm/gui_minus_96_96.png | Bin 0 -> 202 bytes navit/xpm/gui_plus.png | Bin 0 -> 294 bytes navit/xpm/gui_plus.svg | 94 + navit/xpm/gui_plus_16_16.png | Bin 0 -> 200 bytes navit/xpm/gui_plus_32_32.png | Bin 0 -> 210 bytes navit/xpm/gui_plus_48_48.png | Bin 0 -> 259 bytes navit/xpm/gui_plus_8_8.png | Bin 0 -> 167 bytes navit/xpm/gui_plus_96_96.png | Bin 0 -> 354 bytes navit/xpm/gui_quit.png | Bin 0 -> 3436 bytes navit/xpm/gui_quit.svg | 77 + navit/xpm/gui_quit_16_16.png | Bin 0 -> 811 bytes navit/xpm/gui_quit_32_32.png | Bin 0 -> 2052 bytes navit/xpm/gui_quit_48_48.png | Bin 0 -> 3436 bytes navit/xpm/gui_quit_8_8.png | Bin 0 -> 322 bytes navit/xpm/gui_quit_96_96.png | Bin 0 -> 8263 bytes navit/xpm/gui_rules.png | Bin 0 -> 4042 bytes navit/xpm/gui_rules.svg | 562 + navit/xpm/gui_rules_16_16.png | Bin 0 -> 858 bytes navit/xpm/gui_rules_32_32.png | Bin 0 -> 2427 bytes navit/xpm/gui_rules_48_48.png | Bin 0 -> 4042 bytes navit/xpm/gui_rules_8_8.png | Bin 0 -> 326 bytes navit/xpm/gui_rules_96_96.png | Bin 0 -> 10761 bytes navit/xpm/gui_search.png | Bin 0 -> 5698 bytes navit/xpm/gui_search.svg | 812 + navit/xpm/gui_search_16_16.png | Bin 0 -> 687 bytes navit/xpm/gui_search_32_32.png | Bin 0 -> 1913 bytes navit/xpm/gui_search_48_48.png | Bin 0 -> 3582 bytes navit/xpm/gui_search_8_8.png | Bin 0 -> 295 bytes navit/xpm/gui_search_96_96.png | Bin 0 -> 10478 bytes navit/xpm/gui_select_country.png | Bin 0 -> 2339 bytes navit/xpm/gui_select_country.svg | 233 + navit/xpm/gui_select_country_16_16.png | Bin 0 -> 559 bytes navit/xpm/gui_select_country_32_32.png | Bin 0 -> 1469 bytes navit/xpm/gui_select_country_48_48.png | Bin 0 -> 2339 bytes navit/xpm/gui_select_country_8_8.png | Bin 0 -> 249 bytes navit/xpm/gui_select_country_96_96.png | Bin 0 -> 5227 bytes navit/xpm/gui_select_street.png | Bin 0 -> 3587 bytes navit/xpm/gui_select_street.svg | 237 + navit/xpm/gui_select_street_16_16.png | Bin 0 -> 851 bytes navit/xpm/gui_select_street_32_32.png | Bin 0 -> 2105 bytes navit/xpm/gui_select_street_48_48.png | Bin 0 -> 3587 bytes navit/xpm/gui_select_street_8_8.png | Bin 0 -> 346 bytes navit/xpm/gui_select_street_96_96.png | Bin 0 -> 9137 bytes navit/xpm/gui_select_town.png | Bin 0 -> 2339 bytes navit/xpm/gui_select_town.svg | 233 + navit/xpm/gui_select_town_16_16.png | Bin 0 -> 559 bytes navit/xpm/gui_select_town_32_32.png | Bin 0 -> 1469 bytes navit/xpm/gui_select_town_48_48.png | Bin 0 -> 2339 bytes navit/xpm/gui_select_town_8_8.png | Bin 0 -> 249 bytes navit/xpm/gui_select_town_96_96.png | Bin 0 -> 5227 bytes navit/xpm/gui_settings.png | Bin 0 -> 1935 bytes navit/xpm/gui_settings.svg | 408 + navit/xpm/gui_settings_16_16.png | Bin 0 -> 606 bytes navit/xpm/gui_settings_32_32.png | Bin 0 -> 1296 bytes navit/xpm/gui_settings_48_48.png | Bin 0 -> 1935 bytes navit/xpm/gui_settings_8_8.png | Bin 0 -> 283 bytes navit/xpm/gui_settings_96_96.png | Bin 0 -> 4473 bytes navit/xpm/gui_sound.png | Bin 0 -> 2962 bytes navit/xpm/gui_sound.svg | 798 + navit/xpm/gui_sound_16_16.png | Bin 0 -> 721 bytes navit/xpm/gui_sound_32_32.png | Bin 0 -> 1763 bytes navit/xpm/gui_sound_48_48.png | Bin 0 -> 2962 bytes navit/xpm/gui_sound_8_8.png | Bin 0 -> 305 bytes navit/xpm/gui_sound_96_96.png | Bin 0 -> 7795 bytes navit/xpm/gui_sound_off.png | Bin 0 -> 1618 bytes navit/xpm/gui_sound_off.svg | 771 + navit/xpm/gui_sound_off_16_16.png | Bin 0 -> 443 bytes navit/xpm/gui_sound_off_32_32.png | Bin 0 -> 1026 bytes navit/xpm/gui_sound_off_48_48.png | Bin 0 -> 1618 bytes navit/xpm/gui_sound_off_8_8.png | Bin 0 -> 197 bytes navit/xpm/gui_sound_off_96_96.png | Bin 0 -> 3899 bytes navit/xpm/gui_stop.png | Bin 0 -> 2701 bytes navit/xpm/gui_stop.svg | 214 + navit/xpm/gui_stop_16_16.png | Bin 0 -> 686 bytes navit/xpm/gui_stop_32_32.png | Bin 0 -> 1637 bytes navit/xpm/gui_stop_48_48.png | Bin 0 -> 2701 bytes navit/xpm/gui_stop_8_8.png | Bin 0 -> 316 bytes navit/xpm/gui_stop_96_96.png | Bin 0 -> 6518 bytes navit/xpm/gui_strength_0.png | Bin 0 -> 290 bytes navit/xpm/gui_strength_0.svg | 100 + navit/xpm/gui_strength_0_16_16.png | Bin 0 -> 188 bytes navit/xpm/gui_strength_0_32_32.png | Bin 0 -> 199 bytes navit/xpm/gui_strength_0_48_48.png | Bin 0 -> 295 bytes navit/xpm/gui_strength_0_8_8.png | Bin 0 -> 169 bytes navit/xpm/gui_strength_0_96_96.png | Bin 0 -> 360 bytes navit/xpm/gui_strength_1.png | Bin 0 -> 290 bytes navit/xpm/gui_strength_1.svg | 100 + navit/xpm/gui_strength_1_16_16.png | Bin 0 -> 215 bytes navit/xpm/gui_strength_1_32_32.png | Bin 0 -> 198 bytes navit/xpm/gui_strength_1_48_48.png | Bin 0 -> 286 bytes navit/xpm/gui_strength_1_8_8.png | Bin 0 -> 172 bytes navit/xpm/gui_strength_1_96_96.png | Bin 0 -> 364 bytes navit/xpm/gui_strength_2.png | Bin 0 -> 284 bytes navit/xpm/gui_strength_2.svg | 100 + navit/xpm/gui_strength_2_16_16.png | Bin 0 -> 229 bytes navit/xpm/gui_strength_2_32_32.png | Bin 0 -> 194 bytes navit/xpm/gui_strength_2_48_48.png | Bin 0 -> 286 bytes navit/xpm/gui_strength_2_8_8.png | Bin 0 -> 183 bytes navit/xpm/gui_strength_2_96_96.png | Bin 0 -> 355 bytes navit/xpm/gui_strength_3.png | Bin 0 -> 282 bytes navit/xpm/gui_strength_3.svg | 100 + navit/xpm/gui_strength_3_16_16.png | Bin 0 -> 228 bytes navit/xpm/gui_strength_3_32_32.png | Bin 0 -> 191 bytes navit/xpm/gui_strength_3_48_48.png | Bin 0 -> 271 bytes navit/xpm/gui_strength_3_8_8.png | Bin 0 -> 178 bytes navit/xpm/gui_strength_3_96_96.png | Bin 0 -> 349 bytes navit/xpm/gui_strength_4.png | Bin 0 -> 277 bytes navit/xpm/gui_strength_4.svg | 100 + navit/xpm/gui_strength_4_16_16.png | Bin 0 -> 214 bytes navit/xpm/gui_strength_4_32_32.png | Bin 0 -> 184 bytes navit/xpm/gui_strength_4_48_48.png | Bin 0 -> 253 bytes navit/xpm/gui_strength_4_8_8.png | Bin 0 -> 186 bytes navit/xpm/gui_strength_4_96_96.png | Bin 0 -> 340 bytes navit/xpm/gui_strength_5.png | Bin 0 -> 252 bytes navit/xpm/gui_strength_5.svg | 100 + navit/xpm/gui_strength_5_16_16.png | Bin 0 -> 193 bytes navit/xpm/gui_strength_5_32_32.png | Bin 0 -> 167 bytes navit/xpm/gui_strength_5_48_48.png | Bin 0 -> 222 bytes navit/xpm/gui_strength_5_8_8.png | Bin 0 -> 167 bytes navit/xpm/gui_strength_5_96_96.png | Bin 0 -> 315 bytes navit/xpm/gui_tools.png | Bin 0 -> 3369 bytes navit/xpm/gui_tools.svg | 364 + navit/xpm/gui_tools_16_16.png | Bin 0 -> 733 bytes navit/xpm/gui_tools_32_32.png | Bin 0 -> 1964 bytes navit/xpm/gui_tools_48_48.png | Bin 0 -> 3369 bytes navit/xpm/gui_tools_8_8.png | Bin 0 -> 312 bytes navit/xpm/gui_tools_96_96.png | Bin 0 -> 7979 bytes navit/xpm/gui_town.png | Bin 0 -> 1481 bytes navit/xpm/gui_town.svg | 81 + navit/xpm/gui_town_16_16.png | Bin 0 -> 548 bytes navit/xpm/gui_town_32_32.png | Bin 0 -> 1006 bytes navit/xpm/gui_town_48_48.png | Bin 0 -> 1481 bytes navit/xpm/gui_town_8_8.png | Bin 0 -> 315 bytes navit/xpm/gui_town_96_96.png | Bin 0 -> 2795 bytes navit/xpm/gui_vehicle.png | Bin 0 -> 1529 bytes navit/xpm/gui_vehicle.svg | 81 + navit/xpm/gui_vehicle_16_16.png | Bin 0 -> 450 bytes navit/xpm/gui_vehicle_32_32.png | Bin 0 -> 822 bytes navit/xpm/gui_vehicle_48_48.png | Bin 0 -> 1202 bytes navit/xpm/gui_vehicle_8_8.png | Bin 0 -> 226 bytes navit/xpm/gui_vehicle_96_96.png | Bin 0 -> 2273 bytes navit/xpm/gui_vehicle_pedestrian.png | Bin 0 -> 1651 bytes navit/xpm/gui_vehicle_pedestrian.svg | 77 + navit/xpm/gui_vehicle_pedestrian_16_16.png | Bin 0 -> 419 bytes navit/xpm/gui_vehicle_pedestrian_32_32.png | Bin 0 -> 815 bytes navit/xpm/gui_vehicle_pedestrian_48_48.png | Bin 0 -> 1274 bytes navit/xpm/gui_vehicle_pedestrian_8_8.png | Bin 0 -> 218 bytes navit/xpm/gui_vehicle_pedestrian_96_96.png | Bin 0 -> 2534 bytes navit/xpm/gui_zoom_in.png | Bin 0 -> 4094 bytes navit/xpm/gui_zoom_in.svg | 554 + navit/xpm/gui_zoom_in_16_16.png | Bin 0 -> 830 bytes navit/xpm/gui_zoom_in_32_32.png | Bin 0 -> 2322 bytes navit/xpm/gui_zoom_in_48_48.png | Bin 0 -> 4094 bytes navit/xpm/gui_zoom_in_8_8.png | Bin 0 -> 333 bytes navit/xpm/gui_zoom_in_96_96.png | Bin 0 -> 11125 bytes navit/xpm/gui_zoom_out.png | Bin 0 -> 4047 bytes navit/xpm/gui_zoom_out.svg | 554 + navit/xpm/gui_zoom_out_16_16.png | Bin 0 -> 815 bytes navit/xpm/gui_zoom_out_32_32.png | Bin 0 -> 2275 bytes navit/xpm/gui_zoom_out_48_48.png | Bin 0 -> 4047 bytes navit/xpm/gui_zoom_out_8_8.png | Bin 0 -> 333 bytes navit/xpm/gui_zoom_out_96_96.png | Bin 0 -> 11109 bytes navit/xpm/heliport.png | Bin 0 -> 492 bytes navit/xpm/heliport.svg | 21 + navit/xpm/heliport_16_16.png | Bin 0 -> 492 bytes navit/xpm/heliport_32_32.png | Bin 0 -> 1631 bytes navit/xpm/heliport_48_48.png | Bin 0 -> 2325 bytes navit/xpm/heliport_8_8.png | Bin 0 -> 269 bytes navit/xpm/heliport_96_96.png | Bin 0 -> 6832 bytes navit/xpm/highway_exit.xpm | 65 + navit/xpm/hospital.png | Bin 0 -> 242 bytes navit/xpm/hospital.svg | 97 + navit/xpm/hospital_16_16.png | Bin 0 -> 273 bytes navit/xpm/hospital_32_32.png | Bin 0 -> 292 bytes navit/xpm/hospital_48_48.png | Bin 0 -> 348 bytes navit/xpm/hospital_8_8.png | Bin 0 -> 211 bytes navit/xpm/hospital_96_96.png | Bin 0 -> 504 bytes navit/xpm/hotel.png | Bin 0 -> 384 bytes navit/xpm/hotel.svg | 147 + navit/xpm/hotel_16_16.png | Bin 0 -> 318 bytes navit/xpm/hotel_32_32.png | Bin 0 -> 428 bytes navit/xpm/hotel_48_48.png | Bin 0 -> 562 bytes navit/xpm/hotel_8_8.png | Bin 0 -> 211 bytes navit/xpm/hotel_96_96.png | Bin 0 -> 724 bytes navit/xpm/hunting_stand.xpm | 23 + navit/xpm/information.png | Bin 0 -> 546 bytes navit/xpm/information.svg | 120 + navit/xpm/information_16_16.png | Bin 0 -> 410 bytes navit/xpm/information_32_32.png | Bin 0 -> 773 bytes navit/xpm/information_48_48.png | Bin 0 -> 1225 bytes navit/xpm/information_8_8.png | Bin 0 -> 248 bytes navit/xpm/information_96_96.png | Bin 0 -> 2424 bytes navit/xpm/justice.png | Bin 0 -> 498 bytes navit/xpm/justice.svg | 144 + navit/xpm/justice_16_16.png | Bin 0 -> 352 bytes navit/xpm/justice_32_32.png | Bin 0 -> 677 bytes navit/xpm/justice_48_48.png | Bin 0 -> 1142 bytes navit/xpm/justice_8_8.png | Bin 0 -> 195 bytes navit/xpm/justice_96_96.png | Bin 0 -> 2466 bytes navit/xpm/level_crossing.xpm | 46 + navit/xpm/library.xpm | 34 + navit/xpm/mark.png | Bin 0 -> 1169 bytes navit/xpm/mark.svg | 78 + navit/xpm/mark_16_16.png | Bin 0 -> 492 bytes navit/xpm/mark_32_32.png | Bin 0 -> 863 bytes navit/xpm/mark_48_48.png | Bin 0 -> 1169 bytes navit/xpm/mark_8_8.png | Bin 0 -> 251 bytes navit/xpm/mark_96_96.png | Bin 0 -> 2028 bytes navit/xpm/memorial.xpm | 51 + navit/xpm/menu.xpm | 101 + navit/xpm/military.png | Bin 0 -> 407 bytes navit/xpm/military.svg | 310 + navit/xpm/military_16_16.png | Bin 0 -> 309 bytes navit/xpm/military_32_32.png | Bin 0 -> 603 bytes navit/xpm/military_48_48.png | Bin 0 -> 924 bytes navit/xpm/military_8_8.png | Bin 0 -> 183 bytes navit/xpm/military_96_96.png | Bin 0 -> 1896 bytes navit/xpm/mini_roundabout.png | Bin 0 -> 284 bytes navit/xpm/mini_roundabout.svg | 190 + navit/xpm/mini_roundabout_16_16.png | Bin 0 -> 224 bytes navit/xpm/mini_roundabout_32_32.png | Bin 0 -> 407 bytes navit/xpm/mini_roundabout_48_48.png | Bin 0 -> 598 bytes navit/xpm/mini_roundabout_8_8.png | Bin 0 -> 150 bytes navit/xpm/mini_roundabout_96_96.png | Bin 0 -> 1184 bytes navit/xpm/museum.png | Bin 0 -> 344 bytes navit/xpm/museum.svg | 168 + navit/xpm/museum_16_16.png | Bin 0 -> 295 bytes navit/xpm/museum_32_32.png | Bin 0 -> 410 bytes navit/xpm/museum_48_48.png | Bin 0 -> 443 bytes navit/xpm/museum_8_8.png | Bin 0 -> 189 bytes navit/xpm/museum_96_96.png | Bin 0 -> 611 bytes navit/xpm/nav_destination_bk.svg | 147 + navit/xpm/nav_destination_bk_16_16.png | Bin 0 -> 357 bytes navit/xpm/nav_destination_bk_32_32.png | Bin 0 -> 640 bytes navit/xpm/nav_destination_bk_48_48.png | Bin 0 -> 1047 bytes navit/xpm/nav_destination_bk_8_8.png | Bin 0 -> 191 bytes navit/xpm/nav_destination_bk_96_96.png | Bin 0 -> 1572 bytes navit/xpm/nav_destination_wh.svg | 147 + navit/xpm/nav_destination_wh_16_16.png | Bin 0 -> 394 bytes navit/xpm/nav_destination_wh_32_32.png | Bin 0 -> 697 bytes navit/xpm/nav_destination_wh_48_48.png | Bin 0 -> 1130 bytes navit/xpm/nav_destination_wh_8_8.png | Bin 0 -> 201 bytes navit/xpm/nav_destination_wh_96_96.png | Bin 0 -> 1689 bytes navit/xpm/nav_left_1.xpm | 69 + navit/xpm/nav_left_1_32.xpm | 41 + navit/xpm/nav_left_1_bk.svg | 18 + navit/xpm/nav_left_1_bk_16_16.png | Bin 0 -> 246 bytes navit/xpm/nav_left_1_bk_32_32.png | Bin 0 -> 394 bytes navit/xpm/nav_left_1_bk_48_48.png | Bin 0 -> 582 bytes navit/xpm/nav_left_1_bk_8_8.png | Bin 0 -> 166 bytes navit/xpm/nav_left_1_bk_96_96.png | Bin 0 -> 978 bytes navit/xpm/nav_left_1_wh.svg | 18 + navit/xpm/nav_left_1_wh_16_16.png | Bin 0 -> 251 bytes navit/xpm/nav_left_1_wh_32_32.png | Bin 0 -> 408 bytes navit/xpm/nav_left_1_wh_48_48.png | Bin 0 -> 606 bytes navit/xpm/nav_left_1_wh_8_8.png | Bin 0 -> 175 bytes navit/xpm/nav_left_1_wh_96_96.png | Bin 0 -> 1155 bytes navit/xpm/nav_left_2.xpm | 69 + navit/xpm/nav_left_2_32.xpm | 41 + navit/xpm/nav_left_2_bk.svg | 18 + navit/xpm/nav_left_2_bk_16_16.png | Bin 0 -> 232 bytes navit/xpm/nav_left_2_bk_32_32.png | Bin 0 -> 320 bytes navit/xpm/nav_left_2_bk_48_48.png | Bin 0 -> 440 bytes navit/xpm/nav_left_2_bk_8_8.png | Bin 0 -> 162 bytes navit/xpm/nav_left_2_bk_96_96.png | Bin 0 -> 850 bytes navit/xpm/nav_left_2_wh.svg | 18 + navit/xpm/nav_left_2_wh_16_16.png | Bin 0 -> 242 bytes navit/xpm/nav_left_2_wh_32_32.png | Bin 0 -> 345 bytes navit/xpm/nav_left_2_wh_48_48.png | Bin 0 -> 464 bytes navit/xpm/nav_left_2_wh_8_8.png | Bin 0 -> 171 bytes navit/xpm/nav_left_2_wh_96_96.png | Bin 0 -> 887 bytes navit/xpm/nav_left_3_bk.svg | 18 + navit/xpm/nav_left_3_bk_16_16.png | Bin 0 -> 260 bytes navit/xpm/nav_left_3_bk_32_32.png | Bin 0 -> 446 bytes navit/xpm/nav_left_3_bk_48_48.png | Bin 0 -> 606 bytes navit/xpm/nav_left_3_bk_8_8.png | Bin 0 -> 171 bytes navit/xpm/nav_left_3_bk_96_96.png | Bin 0 -> 1174 bytes navit/xpm/nav_left_3_wh.svg | 18 + navit/xpm/nav_left_3_wh_16_16.png | Bin 0 -> 278 bytes navit/xpm/nav_left_3_wh_32_32.png | Bin 0 -> 462 bytes navit/xpm/nav_left_3_wh_48_48.png | Bin 0 -> 671 bytes navit/xpm/nav_left_3_wh_8_8.png | Bin 0 -> 182 bytes navit/xpm/nav_left_3_wh_96_96.png | Bin 0 -> 1257 bytes navit/xpm/nav_right_1.xpm | 69 + navit/xpm/nav_right_1_32.xpm | 41 + navit/xpm/nav_right_1_bk.svg | 18 + navit/xpm/nav_right_1_bk_16_16.png | Bin 0 -> 240 bytes navit/xpm/nav_right_1_bk_32_32.png | Bin 0 -> 378 bytes navit/xpm/nav_right_1_bk_48_48.png | Bin 0 -> 575 bytes navit/xpm/nav_right_1_bk_8_8.png | Bin 0 -> 162 bytes navit/xpm/nav_right_1_bk_96_96.png | Bin 0 -> 982 bytes navit/xpm/nav_right_1_wh.svg | 18 + navit/xpm/nav_right_1_wh_16_16.png | Bin 0 -> 246 bytes navit/xpm/nav_right_1_wh_32_32.png | Bin 0 -> 392 bytes navit/xpm/nav_right_1_wh_48_48.png | Bin 0 -> 625 bytes navit/xpm/nav_right_1_wh_8_8.png | Bin 0 -> 175 bytes navit/xpm/nav_right_1_wh_96_96.png | Bin 0 -> 1149 bytes navit/xpm/nav_right_2.xpm | 69 + navit/xpm/nav_right_2_32.xpm | 41 + navit/xpm/nav_right_2_bk.svg | 18 + navit/xpm/nav_right_2_bk_16_16.png | Bin 0 -> 226 bytes navit/xpm/nav_right_2_bk_32_32.png | Bin 0 -> 316 bytes navit/xpm/nav_right_2_bk_48_48.png | Bin 0 -> 419 bytes navit/xpm/nav_right_2_bk_8_8.png | Bin 0 -> 160 bytes navit/xpm/nav_right_2_bk_96_96.png | Bin 0 -> 785 bytes navit/xpm/nav_right_2_wh.svg | 18 + navit/xpm/nav_right_2_wh_16_16.png | Bin 0 -> 237 bytes navit/xpm/nav_right_2_wh_32_32.png | Bin 0 -> 360 bytes navit/xpm/nav_right_2_wh_48_48.png | Bin 0 -> 458 bytes navit/xpm/nav_right_2_wh_8_8.png | Bin 0 -> 169 bytes navit/xpm/nav_right_2_wh_96_96.png | Bin 0 -> 852 bytes navit/xpm/nav_right_3_bk.svg | 18 + navit/xpm/nav_right_3_bk_16_16.png | Bin 0 -> 260 bytes navit/xpm/nav_right_3_bk_32_32.png | Bin 0 -> 448 bytes navit/xpm/nav_right_3_bk_48_48.png | Bin 0 -> 602 bytes navit/xpm/nav_right_3_bk_8_8.png | Bin 0 -> 165 bytes navit/xpm/nav_right_3_bk_96_96.png | Bin 0 -> 1089 bytes navit/xpm/nav_right_3_wh.svg | 18 + navit/xpm/nav_right_3_wh_16_16.png | Bin 0 -> 274 bytes navit/xpm/nav_right_3_wh_32_32.png | Bin 0 -> 475 bytes navit/xpm/nav_right_3_wh_48_48.png | Bin 0 -> 678 bytes navit/xpm/nav_right_3_wh_8_8.png | Bin 0 -> 174 bytes navit/xpm/nav_right_3_wh_96_96.png | Bin 0 -> 1167 bytes navit/xpm/nav_roundabout_l1_bk.svg | 20 + navit/xpm/nav_roundabout_l1_bk_16_16.png | Bin 0 -> 263 bytes navit/xpm/nav_roundabout_l1_bk_32_32.png | Bin 0 -> 432 bytes navit/xpm/nav_roundabout_l1_bk_48_48.png | Bin 0 -> 608 bytes navit/xpm/nav_roundabout_l1_bk_8_8.png | Bin 0 -> 170 bytes navit/xpm/nav_roundabout_l1_bk_96_96.png | Bin 0 -> 1137 bytes navit/xpm/nav_roundabout_l1_wh.svg | 20 + navit/xpm/nav_roundabout_l1_wh_16_16.png | Bin 0 -> 278 bytes navit/xpm/nav_roundabout_l1_wh_32_32.png | Bin 0 -> 474 bytes navit/xpm/nav_roundabout_l1_wh_48_48.png | Bin 0 -> 647 bytes navit/xpm/nav_roundabout_l1_wh_8_8.png | Bin 0 -> 182 bytes navit/xpm/nav_roundabout_l1_wh_96_96.png | Bin 0 -> 1298 bytes navit/xpm/nav_roundabout_l2_bk.svg | 20 + navit/xpm/nav_roundabout_l2_bk_16_16.png | Bin 0 -> 228 bytes navit/xpm/nav_roundabout_l2_bk_32_32.png | Bin 0 -> 355 bytes navit/xpm/nav_roundabout_l2_bk_48_48.png | Bin 0 -> 522 bytes navit/xpm/nav_roundabout_l2_bk_8_8.png | Bin 0 -> 162 bytes navit/xpm/nav_roundabout_l2_bk_96_96.png | Bin 0 -> 972 bytes navit/xpm/nav_roundabout_l2_wh.svg | 20 + navit/xpm/nav_roundabout_l2_wh_16_16.png | Bin 0 -> 231 bytes navit/xpm/nav_roundabout_l2_wh_32_32.png | Bin 0 -> 375 bytes navit/xpm/nav_roundabout_l2_wh_48_48.png | Bin 0 -> 570 bytes navit/xpm/nav_roundabout_l2_wh_8_8.png | Bin 0 -> 177 bytes navit/xpm/nav_roundabout_l2_wh_96_96.png | Bin 0 -> 1086 bytes navit/xpm/nav_roundabout_l3_bk.svg | 20 + navit/xpm/nav_roundabout_l3_bk_16_16.png | Bin 0 -> 263 bytes navit/xpm/nav_roundabout_l3_bk_32_32.png | Bin 0 -> 446 bytes navit/xpm/nav_roundabout_l3_bk_48_48.png | Bin 0 -> 643 bytes navit/xpm/nav_roundabout_l3_bk_8_8.png | Bin 0 -> 178 bytes navit/xpm/nav_roundabout_l3_bk_96_96.png | Bin 0 -> 1226 bytes navit/xpm/nav_roundabout_l3_wh.svg | 20 + navit/xpm/nav_roundabout_l3_wh_16_16.png | Bin 0 -> 270 bytes navit/xpm/nav_roundabout_l3_wh_32_32.png | Bin 0 -> 475 bytes navit/xpm/nav_roundabout_l3_wh_48_48.png | Bin 0 -> 635 bytes navit/xpm/nav_roundabout_l3_wh_8_8.png | Bin 0 -> 184 bytes navit/xpm/nav_roundabout_l3_wh_96_96.png | Bin 0 -> 1354 bytes navit/xpm/nav_roundabout_l4_bk.svg | 20 + navit/xpm/nav_roundabout_l4_bk_16_16.png | Bin 0 -> 235 bytes navit/xpm/nav_roundabout_l4_bk_32_32.png | Bin 0 -> 413 bytes navit/xpm/nav_roundabout_l4_bk_48_48.png | Bin 0 -> 608 bytes navit/xpm/nav_roundabout_l4_bk_8_8.png | Bin 0 -> 168 bytes navit/xpm/nav_roundabout_l4_bk_96_96.png | Bin 0 -> 1103 bytes navit/xpm/nav_roundabout_l4_wh.svg | 20 + navit/xpm/nav_roundabout_l4_wh_16_16.png | Bin 0 -> 253 bytes navit/xpm/nav_roundabout_l4_wh_32_32.png | Bin 0 -> 437 bytes navit/xpm/nav_roundabout_l4_wh_48_48.png | Bin 0 -> 661 bytes navit/xpm/nav_roundabout_l4_wh_8_8.png | Bin 0 -> 170 bytes navit/xpm/nav_roundabout_l4_wh_96_96.png | Bin 0 -> 1312 bytes navit/xpm/nav_roundabout_l5_bk.svg | 20 + navit/xpm/nav_roundabout_l5_bk_16_16.png | Bin 0 -> 261 bytes navit/xpm/nav_roundabout_l5_bk_32_32.png | Bin 0 -> 461 bytes navit/xpm/nav_roundabout_l5_bk_48_48.png | Bin 0 -> 656 bytes navit/xpm/nav_roundabout_l5_bk_8_8.png | Bin 0 -> 178 bytes navit/xpm/nav_roundabout_l5_bk_96_96.png | Bin 0 -> 1281 bytes navit/xpm/nav_roundabout_l5_wh.svg | 20 + navit/xpm/nav_roundabout_l5_wh_16_16.png | Bin 0 -> 276 bytes navit/xpm/nav_roundabout_l5_wh_32_32.png | Bin 0 -> 504 bytes navit/xpm/nav_roundabout_l5_wh_48_48.png | Bin 0 -> 694 bytes navit/xpm/nav_roundabout_l5_wh_8_8.png | Bin 0 -> 187 bytes navit/xpm/nav_roundabout_l5_wh_96_96.png | Bin 0 -> 1467 bytes navit/xpm/nav_roundabout_l6_bk.svg | 20 + navit/xpm/nav_roundabout_l6_bk_16_16.png | Bin 0 -> 227 bytes navit/xpm/nav_roundabout_l6_bk_32_32.png | Bin 0 -> 386 bytes navit/xpm/nav_roundabout_l6_bk_48_48.png | Bin 0 -> 595 bytes navit/xpm/nav_roundabout_l6_bk_8_8.png | Bin 0 -> 168 bytes navit/xpm/nav_roundabout_l6_bk_96_96.png | Bin 0 -> 1056 bytes navit/xpm/nav_roundabout_l6_wh.svg | 20 + navit/xpm/nav_roundabout_l6_wh_16_16.png | Bin 0 -> 231 bytes navit/xpm/nav_roundabout_l6_wh_32_32.png | Bin 0 -> 424 bytes navit/xpm/nav_roundabout_l6_wh_48_48.png | Bin 0 -> 627 bytes navit/xpm/nav_roundabout_l6_wh_8_8.png | Bin 0 -> 179 bytes navit/xpm/nav_roundabout_l6_wh_96_96.png | Bin 0 -> 1222 bytes navit/xpm/nav_roundabout_l7_bk.svg | 20 + navit/xpm/nav_roundabout_l7_bk_16_16.png | Bin 0 -> 257 bytes navit/xpm/nav_roundabout_l7_bk_32_32.png | Bin 0 -> 489 bytes navit/xpm/nav_roundabout_l7_bk_48_48.png | Bin 0 -> 691 bytes navit/xpm/nav_roundabout_l7_bk_8_8.png | Bin 0 -> 172 bytes navit/xpm/nav_roundabout_l7_bk_96_96.png | Bin 0 -> 1343 bytes navit/xpm/nav_roundabout_l7_wh.svg | 20 + navit/xpm/nav_roundabout_l7_wh_16_16.png | Bin 0 -> 256 bytes navit/xpm/nav_roundabout_l7_wh_32_32.png | Bin 0 -> 504 bytes navit/xpm/nav_roundabout_l7_wh_48_48.png | Bin 0 -> 734 bytes navit/xpm/nav_roundabout_l7_wh_8_8.png | Bin 0 -> 176 bytes navit/xpm/nav_roundabout_l7_wh_96_96.png | Bin 0 -> 1542 bytes navit/xpm/nav_roundabout_l8_bk.svg | 20 + navit/xpm/nav_roundabout_l8_bk_16_16.png | Bin 0 -> 283 bytes navit/xpm/nav_roundabout_l8_bk_32_32.png | Bin 0 -> 462 bytes navit/xpm/nav_roundabout_l8_bk_48_48.png | Bin 0 -> 753 bytes navit/xpm/nav_roundabout_l8_bk_8_8.png | Bin 0 -> 170 bytes navit/xpm/nav_roundabout_l8_bk_96_96.png | Bin 0 -> 1292 bytes navit/xpm/nav_roundabout_l8_wh.svg | 20 + navit/xpm/nav_roundabout_l8_wh_16_16.png | Bin 0 -> 284 bytes navit/xpm/nav_roundabout_l8_wh_32_32.png | Bin 0 -> 462 bytes navit/xpm/nav_roundabout_l8_wh_48_48.png | Bin 0 -> 797 bytes navit/xpm/nav_roundabout_l8_wh_8_8.png | Bin 0 -> 175 bytes navit/xpm/nav_roundabout_l8_wh_96_96.png | Bin 0 -> 1474 bytes navit/xpm/nav_roundabout_r1_bk.svg | 20 + navit/xpm/nav_roundabout_r1_bk_16_16.png | Bin 0 -> 258 bytes navit/xpm/nav_roundabout_r1_bk_32_32.png | Bin 0 -> 439 bytes navit/xpm/nav_roundabout_r1_bk_48_48.png | Bin 0 -> 607 bytes navit/xpm/nav_roundabout_r1_bk_8_8.png | Bin 0 -> 166 bytes navit/xpm/nav_roundabout_r1_bk_96_96.png | Bin 0 -> 1144 bytes navit/xpm/nav_roundabout_r1_wh.svg | 20 + navit/xpm/nav_roundabout_r1_wh_16_16.png | Bin 0 -> 273 bytes navit/xpm/nav_roundabout_r1_wh_32_32.png | Bin 0 -> 465 bytes navit/xpm/nav_roundabout_r1_wh_48_48.png | Bin 0 -> 651 bytes navit/xpm/nav_roundabout_r1_wh_8_8.png | Bin 0 -> 180 bytes navit/xpm/nav_roundabout_r1_wh_96_96.png | Bin 0 -> 1282 bytes navit/xpm/nav_roundabout_r2_bk.svg | 20 + navit/xpm/nav_roundabout_r2_bk_16_16.png | Bin 0 -> 234 bytes navit/xpm/nav_roundabout_r2_bk_32_32.png | Bin 0 -> 372 bytes navit/xpm/nav_roundabout_r2_bk_48_48.png | Bin 0 -> 516 bytes navit/xpm/nav_roundabout_r2_bk_8_8.png | Bin 0 -> 162 bytes navit/xpm/nav_roundabout_r2_bk_96_96.png | Bin 0 -> 962 bytes navit/xpm/nav_roundabout_r2_wh.svg | 20 + navit/xpm/nav_roundabout_r2_wh_16_16.png | Bin 0 -> 242 bytes navit/xpm/nav_roundabout_r2_wh_32_32.png | Bin 0 -> 386 bytes navit/xpm/nav_roundabout_r2_wh_48_48.png | Bin 0 -> 535 bytes navit/xpm/nav_roundabout_r2_wh_8_8.png | Bin 0 -> 170 bytes navit/xpm/nav_roundabout_r2_wh_96_96.png | Bin 0 -> 1015 bytes navit/xpm/nav_roundabout_r3_bk.svg | 20 + navit/xpm/nav_roundabout_r3_bk_16_16.png | Bin 0 -> 245 bytes navit/xpm/nav_roundabout_r3_bk_32_32.png | Bin 0 -> 456 bytes navit/xpm/nav_roundabout_r3_bk_48_48.png | Bin 0 -> 616 bytes navit/xpm/nav_roundabout_r3_bk_8_8.png | Bin 0 -> 171 bytes navit/xpm/nav_roundabout_r3_bk_96_96.png | Bin 0 -> 1242 bytes navit/xpm/nav_roundabout_r3_wh.svg | 20 + navit/xpm/nav_roundabout_r3_wh_16_16.png | Bin 0 -> 268 bytes navit/xpm/nav_roundabout_r3_wh_32_32.png | Bin 0 -> 477 bytes navit/xpm/nav_roundabout_r3_wh_48_48.png | Bin 0 -> 631 bytes navit/xpm/nav_roundabout_r3_wh_8_8.png | Bin 0 -> 186 bytes navit/xpm/nav_roundabout_r3_wh_96_96.png | Bin 0 -> 1389 bytes navit/xpm/nav_roundabout_r4_bk.svg | 20 + navit/xpm/nav_roundabout_r4_bk_16_16.png | Bin 0 -> 242 bytes navit/xpm/nav_roundabout_r4_bk_32_32.png | Bin 0 -> 422 bytes navit/xpm/nav_roundabout_r4_bk_48_48.png | Bin 0 -> 620 bytes navit/xpm/nav_roundabout_r4_bk_8_8.png | Bin 0 -> 160 bytes navit/xpm/nav_roundabout_r4_bk_96_96.png | Bin 0 -> 1153 bytes navit/xpm/nav_roundabout_r4_wh.svg | 20 + navit/xpm/nav_roundabout_r4_wh_16_16.png | Bin 0 -> 250 bytes navit/xpm/nav_roundabout_r4_wh_32_32.png | Bin 0 -> 442 bytes navit/xpm/nav_roundabout_r4_wh_48_48.png | Bin 0 -> 661 bytes navit/xpm/nav_roundabout_r4_wh_8_8.png | Bin 0 -> 172 bytes navit/xpm/nav_roundabout_r4_wh_96_96.png | Bin 0 -> 1338 bytes navit/xpm/nav_roundabout_r5_bk.svg | 20 + navit/xpm/nav_roundabout_r5_bk_16_16.png | Bin 0 -> 265 bytes navit/xpm/nav_roundabout_r5_bk_32_32.png | Bin 0 -> 461 bytes navit/xpm/nav_roundabout_r5_bk_48_48.png | Bin 0 -> 666 bytes navit/xpm/nav_roundabout_r5_bk_8_8.png | Bin 0 -> 186 bytes navit/xpm/nav_roundabout_r5_bk_96_96.png | Bin 0 -> 1294 bytes navit/xpm/nav_roundabout_r5_wh.svg | 20 + navit/xpm/nav_roundabout_r5_wh_16_16.png | Bin 0 -> 271 bytes navit/xpm/nav_roundabout_r5_wh_32_32.png | Bin 0 -> 488 bytes navit/xpm/nav_roundabout_r5_wh_48_48.png | Bin 0 -> 685 bytes navit/xpm/nav_roundabout_r5_wh_8_8.png | Bin 0 -> 192 bytes navit/xpm/nav_roundabout_r5_wh_96_96.png | Bin 0 -> 1442 bytes navit/xpm/nav_roundabout_r6_bk.svg | 20 + navit/xpm/nav_roundabout_r6_bk_16_16.png | Bin 0 -> 232 bytes navit/xpm/nav_roundabout_r6_bk_32_32.png | Bin 0 -> 392 bytes navit/xpm/nav_roundabout_r6_bk_48_48.png | Bin 0 -> 599 bytes navit/xpm/nav_roundabout_r6_bk_8_8.png | Bin 0 -> 165 bytes navit/xpm/nav_roundabout_r6_bk_96_96.png | Bin 0 -> 1144 bytes navit/xpm/nav_roundabout_r6_wh.svg | 20 + navit/xpm/nav_roundabout_r6_wh_16_16.png | Bin 0 -> 240 bytes navit/xpm/nav_roundabout_r6_wh_32_32.png | Bin 0 -> 415 bytes navit/xpm/nav_roundabout_r6_wh_48_48.png | Bin 0 -> 622 bytes navit/xpm/nav_roundabout_r6_wh_8_8.png | Bin 0 -> 176 bytes navit/xpm/nav_roundabout_r6_wh_96_96.png | Bin 0 -> 1266 bytes navit/xpm/nav_roundabout_r7_bk.svg | 20 + navit/xpm/nav_roundabout_r7_bk_16_16.png | Bin 0 -> 249 bytes navit/xpm/nav_roundabout_r7_bk_32_32.png | Bin 0 -> 477 bytes navit/xpm/nav_roundabout_r7_bk_48_48.png | Bin 0 -> 701 bytes navit/xpm/nav_roundabout_r7_bk_8_8.png | Bin 0 -> 166 bytes navit/xpm/nav_roundabout_r7_bk_96_96.png | Bin 0 -> 1379 bytes navit/xpm/nav_roundabout_r7_wh.svg | 20 + navit/xpm/nav_roundabout_r7_wh_16_16.png | Bin 0 -> 250 bytes navit/xpm/nav_roundabout_r7_wh_32_32.png | Bin 0 -> 488 bytes navit/xpm/nav_roundabout_r7_wh_48_48.png | Bin 0 -> 745 bytes navit/xpm/nav_roundabout_r7_wh_8_8.png | Bin 0 -> 177 bytes navit/xpm/nav_roundabout_r7_wh_96_96.png | Bin 0 -> 1544 bytes navit/xpm/nav_roundabout_r8_bk.svg | 20 + navit/xpm/nav_roundabout_r8_bk_16_16.png | Bin 0 -> 270 bytes navit/xpm/nav_roundabout_r8_bk_32_32.png | Bin 0 -> 462 bytes navit/xpm/nav_roundabout_r8_bk_48_48.png | Bin 0 -> 738 bytes navit/xpm/nav_roundabout_r8_bk_8_8.png | Bin 0 -> 170 bytes navit/xpm/nav_roundabout_r8_bk_96_96.png | Bin 0 -> 1297 bytes navit/xpm/nav_roundabout_r8_wh.svg | 20 + navit/xpm/nav_roundabout_r8_wh_16_16.png | Bin 0 -> 287 bytes navit/xpm/nav_roundabout_r8_wh_32_32.png | Bin 0 -> 465 bytes navit/xpm/nav_roundabout_r8_wh_48_48.png | Bin 0 -> 780 bytes navit/xpm/nav_roundabout_r8_wh_8_8.png | Bin 0 -> 175 bytes navit/xpm/nav_roundabout_r8_wh_96_96.png | Bin 0 -> 1482 bytes navit/xpm/nav_straight.xpm | 69 + navit/xpm/nav_straight_32.xpm | 41 + navit/xpm/nav_straight_bk.svg | 18 + navit/xpm/nav_straight_bk_16_16.png | Bin 0 -> 215 bytes navit/xpm/nav_straight_bk_32_32.png | Bin 0 -> 307 bytes navit/xpm/nav_straight_bk_48_48.png | Bin 0 -> 358 bytes navit/xpm/nav_straight_bk_8_8.png | Bin 0 -> 154 bytes navit/xpm/nav_straight_bk_96_96.png | Bin 0 -> 760 bytes navit/xpm/nav_straight_wh.svg | 18 + navit/xpm/nav_straight_wh_16_16.png | Bin 0 -> 223 bytes navit/xpm/nav_straight_wh_32_32.png | Bin 0 -> 331 bytes navit/xpm/nav_straight_wh_48_48.png | Bin 0 -> 384 bytes navit/xpm/nav_straight_wh_8_8.png | Bin 0 -> 156 bytes navit/xpm/nav_straight_wh_96_96.png | Bin 0 -> 871 bytes navit/xpm/nav_turnaround_left_bk.svg | 18 + navit/xpm/nav_turnaround_left_bk_16_16.png | Bin 0 -> 305 bytes navit/xpm/nav_turnaround_left_bk_32_32.png | Bin 0 -> 499 bytes navit/xpm/nav_turnaround_left_bk_48_48.png | Bin 0 -> 707 bytes navit/xpm/nav_turnaround_left_bk_8_8.png | Bin 0 -> 192 bytes navit/xpm/nav_turnaround_left_bk_96_96.png | Bin 0 -> 1360 bytes navit/xpm/nav_turnaround_left_wh.svg | 18 + navit/xpm/nav_turnaround_left_wh_16_16.png | Bin 0 -> 330 bytes navit/xpm/nav_turnaround_left_wh_32_32.png | Bin 0 -> 532 bytes navit/xpm/nav_turnaround_left_wh_48_48.png | Bin 0 -> 771 bytes navit/xpm/nav_turnaround_left_wh_8_8.png | Bin 0 -> 202 bytes navit/xpm/nav_turnaround_left_wh_96_96.png | Bin 0 -> 1496 bytes navit/xpm/nav_turnaround_right_bk.svg | 18 + navit/xpm/nav_turnaround_right_bk_16_16.png | Bin 0 -> 304 bytes navit/xpm/nav_turnaround_right_bk_32_32.png | Bin 0 -> 495 bytes navit/xpm/nav_turnaround_right_bk_48_48.png | Bin 0 -> 711 bytes navit/xpm/nav_turnaround_right_bk_8_8.png | Bin 0 -> 191 bytes navit/xpm/nav_turnaround_right_bk_96_96.png | Bin 0 -> 1350 bytes navit/xpm/nav_turnaround_right_wh.svg | 18 + navit/xpm/nav_turnaround_right_wh_16_16.png | Bin 0 -> 322 bytes navit/xpm/nav_turnaround_right_wh_32_32.png | Bin 0 -> 530 bytes navit/xpm/nav_turnaround_right_wh_48_48.png | Bin 0 -> 758 bytes navit/xpm/nav_turnaround_right_wh_8_8.png | Bin 0 -> 204 bytes navit/xpm/nav_turnaround_right_wh_96_96.png | Bin 0 -> 1484 bytes navit/xpm/navit_svg2png | 74 + navit/xpm/parking.png | Bin 0 -> 341 bytes navit/xpm/parking.svg | 90 + navit/xpm/parking_16_16.png | Bin 0 -> 299 bytes navit/xpm/parking_32_32.png | Bin 0 -> 396 bytes navit/xpm/parking_48_48.png | Bin 0 -> 526 bytes navit/xpm/parking_8_8.png | Bin 0 -> 185 bytes navit/xpm/parking_96_96.png | Bin 0 -> 998 bytes navit/xpm/peak.png | Bin 0 -> 901 bytes navit/xpm/peak.svg | 124 + navit/xpm/peak_16_16.png | Bin 0 -> 629 bytes navit/xpm/peak_32_32.png | Bin 0 -> 1335 bytes navit/xpm/peak_48_48.png | Bin 0 -> 2170 bytes navit/xpm/peak_8_8.png | Bin 0 -> 314 bytes navit/xpm/peak_96_96.png | Bin 0 -> 4760 bytes navit/xpm/pharmacy.png | Bin 0 -> 396 bytes navit/xpm/pharmacy.svg | 102 + navit/xpm/pharmacy_16_16.png | Bin 0 -> 363 bytes navit/xpm/pharmacy_32_32.png | Bin 0 -> 423 bytes navit/xpm/pharmacy_48_48.png | Bin 0 -> 484 bytes navit/xpm/pharmacy_8_8.png | Bin 0 -> 235 bytes navit/xpm/pharmacy_96_96.png | Bin 0 -> 675 bytes navit/xpm/picnic.xpm | 38 + navit/xpm/police.png | Bin 0 -> 570 bytes navit/xpm/police.svg | 99 + navit/xpm/police_16_16.png | Bin 0 -> 447 bytes navit/xpm/police_32_32.png | Bin 0 -> 857 bytes navit/xpm/police_48_48.png | Bin 0 -> 1210 bytes navit/xpm/police_8_8.png | Bin 0 -> 241 bytes navit/xpm/police_96_96.png | Bin 0 -> 2461 bytes navit/xpm/post.png | Bin 0 -> 592 bytes navit/xpm/post.svg | 88 + navit/xpm/post_16_16.png | Bin 0 -> 451 bytes navit/xpm/post_32_32.png | Bin 0 -> 953 bytes navit/xpm/post_48_48.png | Bin 0 -> 1530 bytes navit/xpm/post_8_8.png | Bin 0 -> 246 bytes navit/xpm/post_96_96.png | Bin 0 -> 3062 bytes navit/xpm/potable_water.xpm | 32 + navit/xpm/public_office.xpm | 32 + navit/xpm/repair_service.png | Bin 0 -> 429 bytes navit/xpm/repair_service.svg | 51 + navit/xpm/repair_service_16_16.png | Bin 0 -> 331 bytes navit/xpm/repair_service_32_32.png | Bin 0 -> 593 bytes navit/xpm/repair_service_48_48.png | Bin 0 -> 946 bytes navit/xpm/repair_service_8_8.png | Bin 0 -> 187 bytes navit/xpm/repair_service_96_96.png | Bin 0 -> 1686 bytes navit/xpm/resort.png | Bin 0 -> 621 bytes navit/xpm/resort.svg | 45 + navit/xpm/resort_16_16.png | Bin 0 -> 463 bytes navit/xpm/resort_32_32.png | Bin 0 -> 785 bytes navit/xpm/resort_48_48.png | Bin 0 -> 1076 bytes navit/xpm/resort_8_8.png | Bin 0 -> 252 bytes navit/xpm/resort_96_96.png | Bin 0 -> 1914 bytes navit/xpm/restaurant.png | Bin 0 -> 728 bytes navit/xpm/restaurant.svg | 114 + navit/xpm/restaurant_16_16.png | Bin 0 -> 467 bytes navit/xpm/restaurant_32_32.png | Bin 0 -> 1075 bytes navit/xpm/restaurant_48_48.png | Bin 0 -> 1857 bytes navit/xpm/restaurant_8_8.png | Bin 0 -> 245 bytes navit/xpm/restaurant_96_96.png | Bin 0 -> 4620 bytes navit/xpm/restroom.xpm | 134 + navit/xpm/ruins.png | Bin 0 -> 870 bytes navit/xpm/ruins.svg | 801 + navit/xpm/ruins_16_16.png | Bin 0 -> 569 bytes navit/xpm/ruins_32_32.png | Bin 0 -> 1482 bytes navit/xpm/ruins_48_48.png | Bin 0 -> 2561 bytes navit/xpm/ruins_8_8.png | Bin 0 -> 253 bytes navit/xpm/ruins_96_96.png | Bin 0 -> 6899 bytes navit/xpm/school.png | Bin 0 -> 669 bytes navit/xpm/school.svg | 114 + navit/xpm/school_16_16.png | Bin 0 -> 467 bytes navit/xpm/school_32_32.png | Bin 0 -> 1010 bytes navit/xpm/school_48_48.png | Bin 0 -> 1592 bytes navit/xpm/school_8_8.png | Bin 0 -> 238 bytes navit/xpm/school_96_96.png | Bin 0 -> 3256 bytes navit/xpm/shelter.xpm | 42 + navit/xpm/shop_grocery.png | Bin 0 -> 980 bytes navit/xpm/shop_grocery.svg | 63 + navit/xpm/shop_grocery_16_16.png | Bin 0 -> 699 bytes navit/xpm/shop_grocery_32_32.png | Bin 0 -> 1444 bytes navit/xpm/shop_grocery_48_48.png | Bin 0 -> 2023 bytes navit/xpm/shop_grocery_8_8.png | Bin 0 -> 318 bytes navit/xpm/shop_grocery_96_96.png | Bin 0 -> 3936 bytes navit/xpm/shopping.png | Bin 0 -> 714 bytes navit/xpm/shopping.svg | 158 + navit/xpm/shopping_16_16.png | Bin 0 -> 531 bytes navit/xpm/shopping_32_32.png | Bin 0 -> 996 bytes navit/xpm/shopping_48_48.png | Bin 0 -> 1483 bytes navit/xpm/shopping_8_8.png | Bin 0 -> 288 bytes navit/xpm/shopping_96_96.png | Bin 0 -> 2948 bytes navit/xpm/skiing.png | Bin 0 -> 448 bytes navit/xpm/skiing.svg | 332 + navit/xpm/skiing_16_16.png | Bin 0 -> 331 bytes navit/xpm/skiing_32_32.png | Bin 0 -> 614 bytes navit/xpm/skiing_48_48.png | Bin 0 -> 951 bytes navit/xpm/skiing_8_8.png | Bin 0 -> 187 bytes navit/xpm/skiing_96_96.png | Bin 0 -> 1909 bytes navit/xpm/sport.xpm | 75 + navit/xpm/stadium.png | Bin 0 -> 836 bytes navit/xpm/stadium.svg | 207 + navit/xpm/stadium_16_16.png | Bin 0 -> 655 bytes navit/xpm/stadium_32_32.png | Bin 0 -> 1271 bytes navit/xpm/stadium_48_48.png | Bin 0 -> 1852 bytes navit/xpm/stadium_8_8.png | Bin 0 -> 317 bytes navit/xpm/stadium_96_96.png | Bin 0 -> 3697 bytes navit/xpm/swimming.png | Bin 0 -> 445 bytes navit/xpm/swimming.svg | 335 + navit/xpm/swimming_16_16.png | Bin 0 -> 313 bytes navit/xpm/swimming_32_32.png | Bin 0 -> 596 bytes navit/xpm/swimming_48_48.png | Bin 0 -> 1058 bytes navit/xpm/swimming_8_8.png | Bin 0 -> 180 bytes navit/xpm/swimming_96_96.png | Bin 0 -> 2112 bytes navit/xpm/tec_common.png | Bin 0 -> 3753 bytes navit/xpm/tec_common.svg | 2953 ++ navit/xpm/tec_common_16_16.png | Bin 0 -> 854 bytes navit/xpm/tec_common_32_32.png | Bin 0 -> 2191 bytes navit/xpm/tec_common_48_48.png | Bin 0 -> 3753 bytes navit/xpm/tec_common_8_8.png | Bin 0 -> 350 bytes navit/xpm/tec_common_96_96.png | Bin 0 -> 9250 bytes navit/xpm/telephone.png | Bin 0 -> 293 bytes navit/xpm/telephone.svg | 111 + navit/xpm/telephone_16_16.png | Bin 0 -> 234 bytes navit/xpm/telephone_32_32.png | Bin 0 -> 381 bytes navit/xpm/telephone_48_48.png | Bin 0 -> 575 bytes navit/xpm/telephone_8_8.png | Bin 0 -> 154 bytes navit/xpm/telephone_96_96.png | Bin 0 -> 1069 bytes navit/xpm/theater.xpm | 72 + navit/xpm/toggle_fullscreen.xpm | 101 + navit/xpm/toilets.png | Bin 0 -> 525 bytes navit/xpm/toilets.svg | 129 + navit/xpm/toilets_16_16.png | Bin 0 -> 425 bytes navit/xpm/toilets_32_32.png | Bin 0 -> 776 bytes navit/xpm/toilets_48_48.png | Bin 0 -> 1072 bytes navit/xpm/toilets_8_8.png | Bin 0 -> 240 bytes navit/xpm/toilets_96_96.png | Bin 0 -> 2071 bytes navit/xpm/tower.xpm | 35 + navit/xpm/townhall.xpm | 109 + navit/xpm/traffic_signals.png | Bin 0 -> 522 bytes navit/xpm/traffic_signals.svg | 132 + navit/xpm/traffic_signals_16_16.png | Bin 0 -> 395 bytes navit/xpm/traffic_signals_32_32.png | Bin 0 -> 765 bytes navit/xpm/traffic_signals_48_48.png | Bin 0 -> 1198 bytes navit/xpm/traffic_signals_8_8.png | Bin 0 -> 212 bytes navit/xpm/traffic_signals_96_96.png | Bin 0 -> 2328 bytes navit/xpm/trailerpark.xpm | 110 + navit/xpm/unknown.png | Bin 0 -> 6333 bytes navit/xpm/unknown.svg | 41 + navit/xpm/unknown_16_16.png | Bin 0 -> 429 bytes navit/xpm/unknown_32_32.png | Bin 0 -> 664 bytes navit/xpm/unknown_48_48.png | Bin 0 -> 946 bytes navit/xpm/unknown_8_8.png | Bin 0 -> 242 bytes navit/xpm/unknown_96_96.png | Bin 0 -> 1741 bytes navit/xpm/viewpoint.png | Bin 0 -> 198 bytes navit/xpm/viewpoint.svg | 28 + navit/xpm/viewpoint_16_16.png | Bin 0 -> 198 bytes navit/xpm/viewpoint_32_32.png | Bin 0 -> 699 bytes navit/xpm/viewpoint_48_48.png | Bin 0 -> 911 bytes navit/xpm/viewpoint_8_8.png | Bin 0 -> 145 bytes navit/xpm/viewpoint_96_96.png | Bin 0 -> 2788 bytes navit/xpm/wifi.png | Bin 0 -> 493 bytes navit/xpm/wifi.svg | 127 + navit/xpm/wifi_16_16.png | Bin 0 -> 348 bytes navit/xpm/wifi_32_32.png | Bin 0 -> 760 bytes navit/xpm/wifi_48_48.png | Bin 0 -> 1284 bytes navit/xpm/wifi_8_8.png | Bin 0 -> 189 bytes navit/xpm/wifi_96_96.png | Bin 0 -> 2863 bytes navit/xpm/zoo.png | Bin 0 -> 469 bytes navit/xpm/zoo.svg | 31 + navit/xpm/zoo_16_16.png | Bin 0 -> 469 bytes navit/xpm/zoo_32_32.png | Bin 0 -> 1779 bytes navit/xpm/zoo_48_48.png | Bin 0 -> 2533 bytes navit/xpm/zoo_8_8.png | Bin 0 -> 253 bytes navit/xpm/zoo_96_96.png | Bin 0 -> 6987 bytes navit/xpm/zoom_in.png | Bin 0 -> 1567 bytes navit/xpm/zoom_in.svg | 100 + navit/xpm/zoom_in_16_16.png | Bin 0 -> 502 bytes navit/xpm/zoom_in_32_32.png | Bin 0 -> 1033 bytes navit/xpm/zoom_in_48_48.png | Bin 0 -> 1567 bytes navit/xpm/zoom_in_8_8.png | Bin 0 -> 267 bytes navit/xpm/zoom_in_96_96.png | Bin 0 -> 3042 bytes navit/xpm/zoom_out.png | Bin 0 -> 1478 bytes navit/xpm/zoom_out.svg | 108 + navit/xpm/zoom_out_16_16.png | Bin 0 -> 460 bytes navit/xpm/zoom_out_32_32.png | Bin 0 -> 962 bytes navit/xpm/zoom_out_48_48.png | Bin 0 -> 1478 bytes navit/xpm/zoom_out_8_8.png | Bin 0 -> 260 bytes navit/xpm/zoom_out_96_96.png | Bin 0 -> 2915 bytes navit/zipfile.h | 177 + .../0001-fix-build-issues-with-qt-backend.patch | 90 + packaging/0002-fix-undefined-symbol-error.patch | 11 + packaging/0003-center-map.patch | 12 + packaging/0004-connect-demo-gps-nmea-log.patch | 22 + packaging/0005-defaults-to-qt-backend.patch | 12 + packaging/0006-custom-layout.patch | 59 + packaging/0007-increase_icon_size_patch | 12 + packaging/gpsdata.nmea | 561 + packaging/navit.changes | 49 + packaging/navit.spec | 119 + po/Makefile.am | 85 + po/Makefile.in | 583 + po/af.po.in | 1763 ++ po/ar.po.in | 1778 ++ po/ast.po.in | 1760 ++ po/bg.po.in | 1763 ++ po/ca.po.in | 1757 ++ po/cs.po.in | 1767 ++ po/da.po.in | 1763 ++ po/de.po.in | 1762 ++ po/de_CH.po.in | 1749 ++ po/el.po.in | 1767 ++ po/en_AU.po.in | 1760 ++ po/en_GB.po.in | 1765 ++ po/eo.po.in | 1750 ++ po/es.po.in | 1734 ++ po/et.po.in | 1756 ++ po/eu.po.in | 1760 ++ po/fi.po.in | 1773 ++ po/fo.po.in | 1765 ++ po/fr.po.in | 1774 ++ po/fr_CH.po.in | 1772 ++ po/gl.po.in | 1756 ++ po/he.po.in | 1763 ++ po/hr.po.in | 1762 ++ po/hu.po.in | 1769 ++ po/id.po.in | 1754 ++ po/it.po.in | 1768 ++ po/ja.po.in | 1751 ++ po/jv.po.in | 1756 ++ po/kk.po.in | 1747 ++ po/lt.po.in | 1768 ++ po/lv.po.in | 1757 ++ po/mk.po.in | 1763 ++ po/nb.po.in | 1764 ++ po/nds.po.in | 1763 ++ po/nl.po.in | 1770 ++ po/nn.po.in | 1760 ++ po/pl.po.in | 1770 ++ po/pt.po.in | 1763 ++ po/pt_BR.po.in | 1774 ++ po/ro.po.in | 1768 ++ po/ru.po.in | 1775 ++ po/sk.po.in | 1767 ++ po/sl.po.in | 1768 ++ po/sr.po.in | 1763 ++ po/sv.po.in | 1763 ++ po/ta.po.in | 1750 ++ po/te.po.in | 1750 ++ po/th.po.in | 1752 ++ po/tr.po.in | 1757 ++ po/uk.po.in | 1768 ++ po/ur.po.in | 1761 ++ po/vi.po.in | 1755 ++ po/zh_CN.po.in | 1755 ++ po/zh_HK.po.in | 1751 ++ repomd.xml | 66 + 3223 files changed, 442222 insertions(+) create mode 100644 ABOUT-NLS create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 COPYRIGHT create mode 100644 ChangeLog create mode 100644 GPL-2 create mode 100644 INSTALL create mode 100644 LGPL-2 create mode 100644 Makefile.am create mode 100644 Makefile.in create mode 100644 Makefile.inc create mode 100644 NEWS create mode 100644 README create mode 100644 aclocal.m4 create mode 100755 compile create mode 100755 config.guess create mode 100644 config.h.in create mode 100755 config.rpath create mode 100755 config.sub create mode 100755 configure create mode 100644 configure.in create mode 100755 depcomp create mode 100755 install-sh create mode 100644 intl/ChangeLog create mode 100644 intl/Makefile.in create mode 100644 intl/VERSION create mode 100644 intl/bindtextdom.c create mode 100755 intl/config.charset create mode 100644 intl/dcgettext.c create mode 100644 intl/dcigettext.c create mode 100644 intl/dcngettext.c create mode 100644 intl/dgettext.c create mode 100644 intl/dngettext.c create mode 100644 intl/eval-plural.h create mode 100644 intl/explodename.c create mode 100644 intl/finddomain.c create mode 100644 intl/gettext.c create mode 100644 intl/gettextP.h create mode 100644 intl/gmo.h create mode 100644 intl/hash-string.h create mode 100644 intl/intl-compat.c create mode 100644 intl/l10nflist.c create mode 100644 intl/libgnuintl.h.in create mode 100644 intl/loadinfo.h create mode 100644 intl/loadmsgcat.c create mode 100644 intl/localcharset.c create mode 100644 intl/localcharset.h create mode 100644 intl/locale.alias create mode 100644 intl/localealias.c create mode 100644 intl/localename.c create mode 100644 intl/log.c create mode 100644 intl/ngettext.c create mode 100644 intl/os2compat.c create mode 100644 intl/os2compat.h create mode 100644 intl/osdep.c create mode 100644 intl/plural-exp.c create mode 100644 intl/plural-exp.h create mode 100644 intl/plural.c create mode 100644 intl/plural.y create mode 100644 intl/printf-args.c create mode 100644 intl/printf-args.h create mode 100644 intl/printf-parse.c create mode 100644 intl/printf-parse.h create mode 100644 intl/printf.c create mode 100644 intl/ref-add.sin create mode 100644 intl/ref-del.sin create mode 100644 intl/relocatable.c create mode 100644 intl/relocatable.h create mode 100644 intl/textdomain.c create mode 100644 intl/vasnprintf.c create mode 100644 intl/vasnprintf.h create mode 100644 intl/vasnwprintf.h create mode 100644 intl/wprintf-parse.h create mode 100644 intl/xsize.h create mode 100755 ltmain.sh create mode 100644 m4/codeset.m4 create mode 100644 m4/gettext.m4 create mode 100644 m4/glibc21.m4 create mode 100644 m4/iconv.m4 create mode 100644 m4/intdiv0.m4 create mode 100644 m4/intmax.m4 create mode 100644 m4/inttypes-pri.m4 create mode 100644 m4/inttypes.m4 create mode 100644 m4/inttypes_h.m4 create mode 100644 m4/isc-posix.m4 create mode 100644 m4/lcmessage.m4 create mode 100644 m4/lib-ld.m4 create mode 100644 m4/lib-link.m4 create mode 100644 m4/lib-prefix.m4 create mode 100644 m4/libtool.m4 create mode 100644 m4/longdouble.m4 create mode 100644 m4/longlong.m4 create mode 100644 m4/ltoptions.m4 create mode 100644 m4/ltsugar.m4 create mode 100644 m4/ltversion.m4 create mode 100644 m4/lt~obsolete.m4 create mode 100644 m4/nls.m4 create mode 100644 m4/po.m4 create mode 100644 m4/printf-posix.m4 create mode 100644 m4/progtest.m4 create mode 100644 m4/signed.m4 create mode 100644 m4/size_max.m4 create mode 100644 m4/stdint_h.m4 create mode 100644 m4/uintmax_t.m4 create mode 100644 m4/ulonglong.m4 create mode 100644 m4/wchar_t.m4 create mode 100644 m4/wint_t.m4 create mode 100644 m4/xsize.m4 create mode 100644 man/Makefile.am create mode 100644 man/Makefile.in create mode 100644 man/maptool.1 create mode 100644 man/navit.1 create mode 100755 missing create mode 100755 mkinstalldirs create mode 100644 navit/Makefile.am create mode 100644 navit/Makefile.in create mode 100644 navit/android.c create mode 100644 navit/android.h create mode 100644 navit/announcement.c create mode 100644 navit/announcement.h create mode 100644 navit/atom.c create mode 100644 navit/atom.h create mode 100644 navit/attr.c create mode 100644 navit/attr.h create mode 100644 navit/attr_def.h create mode 100644 navit/autoload/Makefile.am create mode 100644 navit/autoload/Makefile.in create mode 100644 navit/autoload/osso/Makefile.am create mode 100644 navit/autoload/osso/Makefile.in create mode 100644 navit/autoload/osso/osso.c create mode 100644 navit/binding/Makefile.am create mode 100644 navit/binding/Makefile.in create mode 100644 navit/binding/dbus/Makefile.am create mode 100644 navit/binding/dbus/Makefile.in create mode 100644 navit/binding/dbus/binding_dbus.c create mode 100644 navit/binding/dbus/org.navit_project.navit.service.in create mode 100644 navit/binding/python/Makefile.am create mode 100644 navit/binding/python/Makefile.in create mode 100644 navit/binding/python/attr.c create mode 100644 navit/binding/python/binding_python.c create mode 100644 navit/binding/python/common.h create mode 100644 navit/binding/python/config.c create mode 100644 navit/binding/python/navigation.c create mode 100644 navit/binding/python/navit.c create mode 100644 navit/binding/python/pcoord.c create mode 100644 navit/binding/python/route.c create mode 100644 navit/binding/win32/Makefile.am create mode 100644 navit/binding/win32/Makefile.in create mode 100644 navit/binding/win32/binding_win32.c create mode 100644 navit/binding/win32/binding_win32.h create mode 100644 navit/binding/win32/tell_navit.c create mode 100644 navit/bookmarks.c create mode 100644 navit/bookmarks.h create mode 100644 navit/builtin.c create mode 100644 navit/cache.c create mode 100644 navit/cache.h create mode 100644 navit/callback.c create mode 100644 navit/callback.h create mode 100644 navit/color.h create mode 100644 navit/command.c create mode 100644 navit/command.h create mode 100644 navit/compass.c create mode 100644 navit/compass.h create mode 100644 navit/config_.c create mode 100644 navit/config_.h create mode 100644 navit/coord.c create mode 100644 navit/coord.h create mode 100644 navit/country.c create mode 100644 navit/country.h create mode 100644 navit/data.h create mode 100644 navit/data_window.c create mode 100644 navit/data_window.h create mode 100644 navit/data_window_int.h create mode 100644 navit/debug.c create mode 100644 navit/debug.h create mode 100644 navit/destination.h create mode 100644 navit/draw_info.h create mode 100644 navit/endianess.h create mode 100644 navit/event.c create mode 100644 navit/event.h create mode 100644 navit/event_glib.c create mode 100644 navit/event_glib.h create mode 100644 navit/fib-1.1/Makefile.am create mode 100644 navit/fib-1.1/Makefile.in create mode 100644 navit/fib-1.1/README create mode 100644 navit/fib-1.1/configure.in create mode 100644 navit/fib-1.1/fh_extractmin.3 create mode 100644 navit/fib-1.1/fh_makeheap.3 create mode 100644 navit/fib-1.1/fh_makekeyheap.3 create mode 100644 navit/fib-1.1/fib.c create mode 100644 navit/fib-1.1/fib.h create mode 100644 navit/fib-1.1/fibpriv.h create mode 100644 navit/fib-1.1/fibtest.c create mode 100644 navit/fib-1.1/fibtest2.c create mode 100644 navit/fib-1.1/tt.c create mode 100644 navit/fib-1.1/use.c create mode 100644 navit/file.c create mode 100644 navit/file.h create mode 100644 navit/font/Makefile.am create mode 100644 navit/font/Makefile.in create mode 100644 navit/font/freetype/Makefile.am create mode 100644 navit/font/freetype/Makefile.in create mode 100644 navit/font/freetype/font_freetype.c create mode 100644 navit/font/freetype/font_freetype.h create mode 100644 navit/fonts/Makefile.am create mode 100644 navit/fonts/Makefile.in create mode 100644 navit/fonts/README create mode 100644 navit/glib_slice.h create mode 100644 navit/graphics.c create mode 100644 navit/graphics.h create mode 100644 navit/graphics/Makefile.am create mode 100644 navit/graphics/Makefile.in create mode 100644 navit/graphics/android/Makefile.am create mode 100644 navit/graphics/android/Makefile.in create mode 100644 navit/graphics/android/graphics_android.c create mode 100644 navit/graphics/gd/Makefile.am create mode 100644 navit/graphics/gd/Makefile.in create mode 100644 navit/graphics/gd/graphics_gd.c create mode 100644 navit/graphics/gtk_drawing_area/Makefile.am create mode 100644 navit/graphics/gtk_drawing_area/Makefile.in create mode 100644 navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c create mode 100644 navit/graphics/null/Makefile.am create mode 100644 navit/graphics/null/Makefile.in create mode 100644 navit/graphics/null/graphics_null.c create mode 100644 navit/graphics/opengl/Makefile.am create mode 100644 navit/graphics/opengl/Makefile.in create mode 100644 navit/graphics/opengl/graphics_opengl.c create mode 100644 navit/graphics/qt_qpainter/Makefile.am create mode 100644 navit/graphics/qt_qpainter/Makefile.in create mode 100644 navit/graphics/qt_qpainter/RenderArea.cpp create mode 100644 navit/graphics/qt_qpainter/RenderArea.h create mode 100644 navit/graphics/qt_qpainter/RenderArea.moc create mode 100644 navit/graphics/qt_qpainter/graphics_qt_qpainter.cpp create mode 100644 navit/graphics/qt_qpainter/graphics_qt_qpainter.h create mode 100644 navit/graphics/sdl/Makefile.am create mode 100644 navit/graphics/sdl/Makefile.in create mode 100644 navit/graphics/sdl/graphics_sdl.c create mode 100644 navit/graphics/sdl/raster.c create mode 100644 navit/graphics/sdl/raster.h create mode 100644 navit/graphics/win32/Makefile.am create mode 100644 navit/graphics/win32/Makefile.in create mode 100644 navit/graphics/win32/graphics_win32.c create mode 100644 navit/graphics/win32/xpm2bmp.c create mode 100644 navit/gtkext.h create mode 100644 navit/gui.c create mode 100644 navit/gui.h create mode 100644 navit/gui/Makefile.am create mode 100644 navit/gui/Makefile.in create mode 100644 navit/gui/gtk/Makefile.am create mode 100644 navit/gui/gtk/Makefile.in create mode 100644 navit/gui/gtk/datawindow.c create mode 100644 navit/gui/gtk/destination.c create mode 100644 navit/gui/gtk/gui_gtk.h create mode 100644 navit/gui/gtk/gui_gtk_action.c create mode 100644 navit/gui/gtk/gui_gtk_statusbar.c create mode 100644 navit/gui/gtk/gui_gtk_window.c create mode 100644 navit/gui/internal/Makefile.am create mode 100644 navit/gui/internal/Makefile.in create mode 100644 navit/gui/internal/gui_internal.c create mode 100644 navit/gui/internal/gui_internal.h create mode 100644 navit/gui/qml/Makefile.am create mode 100644 navit/gui/qml/Makefile.in create mode 100644 navit/gui/qml/bookmarksProxy.h create mode 100644 navit/gui/qml/bookmarksProxy.moc create mode 100644 navit/gui/qml/guiProxy.h create mode 100644 navit/gui/qml/guiProxy.moc create mode 100644 navit/gui/qml/gui_qml.cpp create mode 100644 navit/gui/qml/gui_qml.moc create mode 100644 navit/gui/qml/navitProxy.h create mode 100644 navit/gui/qml/navitProxy.moc create mode 100644 navit/gui/qml/ngqpoint.h create mode 100644 navit/gui/qml/ngqpoint.moc create mode 100644 navit/gui/qml/proxy.h create mode 100644 navit/gui/qml/proxy.moc create mode 100644 navit/gui/qml/routeProxy.h create mode 100644 navit/gui/qml/searchProxy.h create mode 100644 navit/gui/qml/searchProxy.moc create mode 100644 navit/gui/qml/skins/Makefile.am create mode 100644 navit/gui/qml/skins/Makefile.in create mode 100644 navit/gui/qml/skins/navit/Makefile.am create mode 100644 navit/gui/qml/skins/navit/Makefile.in create mode 100644 navit/gui/qml/vehicleProxy.h create mode 100644 navit/gui/qml/vehicleProxy.moc create mode 100644 navit/gui/win32/Makefile.am create mode 100644 navit/gui/win32/Makefile.in create mode 100644 navit/gui/win32/ceglue.c create mode 100644 navit/gui/win32/ceglue.h create mode 100644 navit/gui/win32/gui_win32.c create mode 100644 navit/gui/win32/win32_gui_destination.c create mode 100644 navit/gui/win32/win32_gui_notify.c create mode 100644 navit/item.c create mode 100644 navit/item.h create mode 100644 navit/item_def.h create mode 100644 navit/keys.h create mode 100644 navit/layer.h create mode 100644 navit/layout.c create mode 100644 navit/layout.h create mode 100644 navit/linguistics.c create mode 100644 navit/linguistics.h create mode 100644 navit/log.c create mode 100644 navit/log.h create mode 100644 navit/main.c create mode 100644 navit/main.h create mode 100644 navit/map-share.h create mode 100644 navit/map.c create mode 100644 navit/map.h create mode 100644 navit/map/Makefile.am create mode 100644 navit/map/Makefile.in create mode 100644 navit/map/binfile/Makefile.am create mode 100644 navit/map/binfile/Makefile.in create mode 100644 navit/map/binfile/binfile.c create mode 100644 navit/map/csv/Makefile.am create mode 100644 navit/map/csv/Makefile.in create mode 100644 navit/map/csv/csv.c create mode 100644 navit/map/csv/csv.h create mode 100644 navit/map/csv/quadtree.c create mode 100644 navit/map/csv/quadtree.h create mode 100644 navit/map/filter/Makefile.am create mode 100644 navit/map/filter/Makefile.in create mode 100644 navit/map/filter/filter.c create mode 100644 navit/map/garmin/Makefile.am create mode 100644 navit/map/garmin/Makefile.in create mode 100644 navit/map/garmin/gar2navit.c create mode 100644 navit/map/garmin/gar2navit.h create mode 100644 navit/map/garmin/garmin.c create mode 100644 navit/map/garmin/garmin.h create mode 100644 navit/map/garmin/garmintypes.txt create mode 100644 navit/map/garmin/gentypes.c create mode 100644 navit/map/mg/Makefile.am create mode 100644 navit/map/mg/Makefile.in create mode 100644 navit/map/mg/block.c create mode 100644 navit/map/mg/map.c create mode 100644 navit/map/mg/mg.h create mode 100644 navit/map/mg/poly.c create mode 100644 navit/map/mg/street.c create mode 100644 navit/map/mg/town.c create mode 100644 navit/map/mg/tree.c create mode 100644 navit/map/shapefile/Makefile.am create mode 100644 navit/map/shapefile/Makefile.in create mode 100644 navit/map/shapefile/shapefile.c create mode 100644 navit/map/textfile/Makefile.am create mode 100644 navit/map/textfile/Makefile.in create mode 100644 navit/map/textfile/textfile.c create mode 100644 navit/map/textfile/textfile.h create mode 100644 navit/map_data.h create mode 100644 navit/maps/Makefile.am create mode 100644 navit/maps/Makefile.in create mode 100644 navit/mapset.c create mode 100644 navit/mapset.h create mode 100644 navit/maptool/Makefile.am create mode 100644 navit/maptool/Makefile.in create mode 100644 navit/maptool/boundaries.c create mode 100644 navit/maptool/buffer.c create mode 100644 navit/maptool/ch.c create mode 100644 navit/maptool/coastline.c create mode 100644 navit/maptool/generated-code/fileformat.pb-c.c create mode 100644 navit/maptool/generated-code/fileformat.pb-c.h create mode 100644 navit/maptool/generated-code/osmformat.pb-c.c create mode 100644 navit/maptool/generated-code/osmformat.pb-c.h create mode 100644 navit/maptool/geom.c create mode 100644 navit/maptool/google/protobuf-c/protobuf-c-private.h create mode 100644 navit/maptool/google/protobuf-c/protobuf-c.c create mode 100644 navit/maptool/google/protobuf-c/protobuf-c.h create mode 100644 navit/maptool/itembin.c create mode 100644 navit/maptool/itembin_buffer.c create mode 100644 navit/maptool/maptool.c create mode 100644 navit/maptool/maptool.h create mode 100644 navit/maptool/misc.c create mode 100644 navit/maptool/osm.c create mode 100644 navit/maptool/osm_o5m.c create mode 100644 navit/maptool/osm_protobuf.c create mode 100644 navit/maptool/osm_protobufdb.c create mode 100644 navit/maptool/osm_psql.c create mode 100644 navit/maptool/osm_relations.c create mode 100644 navit/maptool/osm_xml.c create mode 100644 navit/maptool/sourcesink.c create mode 100644 navit/maptool/tempfile.c create mode 100644 navit/maptool/tile.c create mode 100644 navit/maptool/zip.c create mode 100644 navit/maptype.c create mode 100644 navit/maptype.h create mode 100644 navit/menu.c create mode 100644 navit/menu.h create mode 100644 navit/messages.c create mode 100644 navit/messages.h create mode 100644 navit/navigation.c create mode 100644 navit/navigation.h create mode 100644 navit/navit.c create mode 100644 navit/navit.dtd create mode 100644 navit/navit.h create mode 100644 navit/navit_nls.h create mode 100644 navit/navit_shipped.xml create mode 100755 navit/obj_filter.c create mode 100644 navit/obj_filter.h create mode 100644 navit/osd.c create mode 100644 navit/osd.h create mode 100644 navit/osd/Makefile.am create mode 100644 navit/osd/Makefile.in create mode 100644 navit/osd/core/Makefile.am create mode 100644 navit/osd/core/Makefile.in create mode 100644 navit/osd/core/osd_core.c create mode 100644 navit/param.c create mode 100644 navit/param.h create mode 100644 navit/phrase.c create mode 100644 navit/phrase.h create mode 100644 navit/plugin.c create mode 100644 navit/plugin.h create mode 100644 navit/plugin/Makefile.am create mode 100644 navit/plugin/Makefile.in create mode 100644 navit/plugin/pedestrian/Makefile.am create mode 100644 navit/plugin/pedestrian/Makefile.in create mode 100644 navit/plugin/pedestrian/pedestrian.c create mode 100644 navit/plugin_def.h create mode 100644 navit/point.h create mode 100644 navit/popup.c create mode 100644 navit/popup.h create mode 100644 navit/profile.c create mode 100644 navit/profile.h create mode 100644 navit/projection.c create mode 100644 navit/projection.h create mode 100644 navit/roadprofile.c create mode 100644 navit/roadprofile.h create mode 100644 navit/route.c create mode 100644 navit/route.h create mode 100644 navit/routech.c create mode 100644 navit/search.c create mode 100644 navit/search.h create mode 100644 navit/speech.c create mode 100644 navit/speech.h create mode 100644 navit/speech/Makefile.am create mode 100644 navit/speech/Makefile.in create mode 100644 navit/speech/android/Makefile.am create mode 100644 navit/speech/android/Makefile.in create mode 100644 navit/speech/android/speech_android.c create mode 100644 navit/speech/cmdline/Makefile.am create mode 100644 navit/speech/cmdline/Makefile.in create mode 100644 navit/speech/cmdline/speech_cmdline.c create mode 100644 navit/speech/dbus/Makefile.am create mode 100644 navit/speech/dbus/Makefile.in create mode 100644 navit/speech/dbus/speech_dbus.c create mode 100644 navit/speech/espeak/Makefile.am create mode 100644 navit/speech/espeak/Makefile.in create mode 100644 navit/speech/espeak/speak.c create mode 100644 navit/speech/speech_dispatcher/Makefile.am create mode 100644 navit/speech/speech_dispatcher/Makefile.in create mode 100644 navit/speech/speech_dispatcher/speech_speech_dispatcher.c create mode 100644 navit/start.c create mode 100644 navit/start_real.c create mode 100644 navit/start_real.h create mode 100644 navit/sunriset.c create mode 100644 navit/sunriset.h create mode 100644 navit/support/Makefile.am create mode 100644 navit/support/Makefile.in create mode 100755 navit/support/espeak/Makefile.am create mode 100644 navit/support/espeak/Makefile.in create mode 100755 navit/support/espeak/compiledict.c create mode 100755 navit/support/espeak/dictionary.c create mode 100755 navit/support/espeak/intonation.c create mode 100644 navit/support/espeak/klatt.c create mode 100644 navit/support/espeak/numbers.c create mode 100755 navit/support/espeak/phonemelist.c create mode 100644 navit/support/espeak/readclause.c create mode 100755 navit/support/espeak/setlengths.c create mode 100644 navit/support/espeak/speak_init.c create mode 100755 navit/support/espeak/synth_mbrola.c create mode 100755 navit/support/espeak/synthdata.c create mode 100755 navit/support/espeak/synthesize.c create mode 100644 navit/support/espeak/tr_languages.c create mode 100755 navit/support/espeak/translate.c create mode 100755 navit/support/espeak/voices.c create mode 100755 navit/support/espeak/wavegen.c create mode 100644 navit/support/ezxml/Makefile.am create mode 100644 navit/support/ezxml/Makefile.in create mode 100644 navit/support/ezxml/ezxml.c create mode 100644 navit/support/ezxml/ezxml.h create mode 100644 navit/support/ezxml/ezxml_init.c create mode 100644 navit/support/glib/Makefile.am create mode 100644 navit/support/glib/Makefile.in create mode 100644 navit/support/glib/fake.c create mode 100644 navit/support/glib/fake.h create mode 100644 navit/support/glib/galias.h create mode 100644 navit/support/glib/galiasdef.c create mode 100644 navit/support/glib/gatomic.c create mode 100644 navit/support/glib/gerror.c create mode 100644 navit/support/glib/gerror.h create mode 100644 navit/support/glib/ghash.c create mode 100644 navit/support/glib/ghash.h create mode 100644 navit/support/glib/glib.h create mode 100644 navit/support/glib/glib_init.c create mode 100644 navit/support/glib/glibconfig.h create mode 100644 navit/support/glib/glibintl.h create mode 100644 navit/support/glib/glist.c create mode 100644 navit/support/glib/glist.h create mode 100644 navit/support/glib/gmacros.h create mode 100644 navit/support/glib/gmem.c create mode 100644 navit/support/glib/gmem.h create mode 100644 navit/support/glib/gmessages.c create mode 100644 navit/support/glib/gmessages.h create mode 100644 navit/support/glib/gprimes.c create mode 100644 navit/support/glib/gprintf.c create mode 100644 navit/support/glib/gprintf.h create mode 100644 navit/support/glib/gprintfint.h create mode 100644 navit/support/glib/gquark.h create mode 100644 navit/support/glib/gslice.c create mode 100644 navit/support/glib/gslice.h create mode 100644 navit/support/glib/gslist.c create mode 100644 navit/support/glib/gslist.h create mode 100644 navit/support/glib/gstrfuncs.c create mode 100644 navit/support/glib/gstrfuncs.h create mode 100644 navit/support/glib/gstring.c create mode 100644 navit/support/glib/gthreadprivate.h create mode 100644 navit/support/glib/gtypes.h create mode 100644 navit/support/glib/gutf8.c create mode 100644 navit/support/glib/gutils.c create mode 100644 navit/support/libc/Makefile.am create mode 100644 navit/support/libc/Makefile.in create mode 100644 navit/support/libc/libc.c create mode 100644 navit/support/libc/libc_init.c create mode 100644 navit/support/libpng/Makefile.am create mode 100644 navit/support/libpng/Makefile.in create mode 100644 navit/support/libpng/libpng_init.c create mode 100644 navit/support/libpng/png.c create mode 100644 navit/support/libpng/pngerror.c create mode 100644 navit/support/libpng/pngget.c create mode 100644 navit/support/libpng/pngmem.c create mode 100644 navit/support/libpng/pngread.c create mode 100644 navit/support/libpng/pngrio.c create mode 100644 navit/support/libpng/pngrtran.c create mode 100644 navit/support/libpng/pngrutil.c create mode 100644 navit/support/libpng/pngset.c create mode 100644 navit/support/libpng/pngtrans.c create mode 100644 navit/support/shapefile/Makefile.am create mode 100644 navit/support/shapefile/Makefile.in create mode 100644 navit/support/shapefile/dbfopen.c create mode 100644 navit/support/shapefile/shapefil.h create mode 100644 navit/support/shapefile/shpopen.c create mode 100644 navit/support/shapefile/shptree.c create mode 100644 navit/support/win32/ConvertUTF.c create mode 100644 navit/support/win32/ConvertUTF.h create mode 100644 navit/support/win32/Makefile.am create mode 100644 navit/support/win32/Makefile.in create mode 100644 navit/support/win32/addwinsock.c create mode 100644 navit/support/win32/mmap.c create mode 100644 navit/support/win32/serial_io.c create mode 100644 navit/support/win32/sys/mman.h create mode 100644 navit/support/win32/win32_init.c create mode 100644 navit/support/wordexp/Makefile.am create mode 100644 navit/support/wordexp/Makefile.in create mode 100644 navit/support/wordexp/glob.c create mode 100644 navit/support/wordexp/glob.h create mode 100644 navit/support/wordexp/wordexp.c create mode 100644 navit/support/wordexp/wordexp.h create mode 100644 navit/support/wordexp/wordexp_init.c create mode 100644 navit/support/zlib/Makefile.am create mode 100644 navit/support/zlib/Makefile.in create mode 100644 navit/support/zlib/adler32.c create mode 100644 navit/support/zlib/crc32.c create mode 100644 navit/support/zlib/crc32.h create mode 100644 navit/support/zlib/infback.c create mode 100644 navit/support/zlib/inffast.c create mode 100644 navit/support/zlib/inffast.h create mode 100644 navit/support/zlib/inffixed.h create mode 100644 navit/support/zlib/inflate.c create mode 100644 navit/support/zlib/inflate.h create mode 100644 navit/support/zlib/inftrees.c create mode 100644 navit/support/zlib/inftrees.h create mode 100644 navit/support/zlib/zconf.h create mode 100644 navit/support/zlib/zlib.h create mode 100644 navit/support/zlib/zlib_init.c create mode 100644 navit/support/zlib/zutil.c create mode 100644 navit/support/zlib/zutil.h create mode 100644 navit/track.c create mode 100644 navit/track.h create mode 100644 navit/transform.c create mode 100644 navit/transform.h create mode 100644 navit/types.h create mode 100644 navit/util.c create mode 100644 navit/util.h create mode 100644 navit/vehicle.c create mode 100644 navit/vehicle.h create mode 100644 navit/vehicle/Makefile.am create mode 100644 navit/vehicle/Makefile.in create mode 100644 navit/vehicle/android/Makefile.am create mode 100644 navit/vehicle/android/Makefile.in create mode 100644 navit/vehicle/android/vehicle_android.c create mode 100644 navit/vehicle/demo/Makefile.am create mode 100644 navit/vehicle/demo/Makefile.in create mode 100644 navit/vehicle/demo/vehicle_demo.c create mode 100644 navit/vehicle/file/Makefile.am create mode 100644 navit/vehicle/file/Makefile.in create mode 100644 navit/vehicle/file/vehicle_file.c create mode 100644 navit/vehicle/file/vehicle_pipe.c create mode 100644 navit/vehicle/file/vehicle_serial.c create mode 100644 navit/vehicle/file/vehicle_socket.c create mode 100644 navit/vehicle/gpsd/Makefile.am create mode 100644 navit/vehicle/gpsd/Makefile.in create mode 100644 navit/vehicle/gpsd/vehicle_gpsd.c create mode 100644 navit/vehicle/gpsd_dbus/Makefile.am create mode 100644 navit/vehicle/gpsd_dbus/Makefile.in create mode 100644 navit/vehicle/gpsd_dbus/vehicle_gpsd_dbus.c create mode 100644 navit/vehicle/gypsy/Makefile.am create mode 100644 navit/vehicle/gypsy/Makefile.in create mode 100644 navit/vehicle/gypsy/vehicle_gypsy.c create mode 100644 navit/vehicle/iphone/Makefile.am create mode 100644 navit/vehicle/iphone/Makefile.in create mode 100644 navit/vehicle/iphone/corelocation.m create mode 100644 navit/vehicle/iphone/vehicle_iphone.c create mode 100644 navit/vehicle/maemo/Makefile.am create mode 100644 navit/vehicle/maemo/Makefile.in create mode 100644 navit/vehicle/maemo/vehicle_maemo.c create mode 100644 navit/vehicle/null/Makefile.am create mode 100644 navit/vehicle/null/Makefile.in create mode 100644 navit/vehicle/null/vehicle_null.c create mode 100644 navit/vehicle/webos/Makefile.am create mode 100644 navit/vehicle/webos/Makefile.in create mode 100644 navit/vehicle/webos/vehicle_webos.c create mode 100644 navit/vehicle/wince/Makefile.am create mode 100644 navit/vehicle/wince/Makefile.in create mode 100644 navit/vehicle/wince/vehicle_wince.c create mode 100644 navit/vehicleprofile.c create mode 100644 navit/vehicleprofile.h create mode 100644 navit/window.h create mode 100644 navit/xmlconfig.c create mode 100644 navit/xmlconfig.h create mode 100644 navit/xpm/Makefile.am create mode 100644 navit/xpm/Makefile.in create mode 100644 navit/xpm/airport.png create mode 100644 navit/xpm/airport.svg create mode 100644 navit/xpm/airport_16_16.png create mode 100644 navit/xpm/airport_32_32.png create mode 100644 navit/xpm/airport_48_48.png create mode 100644 navit/xpm/airport_8_8.png create mode 100644 navit/xpm/airport_96_96.png create mode 100644 navit/xpm/attraction.png create mode 100644 navit/xpm/attraction.svg create mode 100644 navit/xpm/attraction_16_16.png create mode 100644 navit/xpm/attraction_32_32.png create mode 100644 navit/xpm/attraction_48_48.png create mode 100644 navit/xpm/attraction_8_8.png create mode 100644 navit/xpm/attraction_96_96.png create mode 100644 navit/xpm/bank.png create mode 100644 navit/xpm/bank.svg create mode 100644 navit/xpm/bank_16_16.png create mode 100644 navit/xpm/bank_32_32.png create mode 100644 navit/xpm/bank_48_48.png create mode 100644 navit/xpm/bank_8_8.png create mode 100644 navit/xpm/bank_96_96.png create mode 100644 navit/xpm/bar.png create mode 100644 navit/xpm/bar.svg create mode 100644 navit/xpm/bar_16_16.png create mode 100644 navit/xpm/bar_32_32.png create mode 100644 navit/xpm/bar_48_48.png create mode 100644 navit/xpm/bar_8_8.png create mode 100644 navit/xpm/bar_96_96.png create mode 100644 navit/xpm/beer.png create mode 100644 navit/xpm/beer.svg create mode 100644 navit/xpm/beer_16_16.png create mode 100644 navit/xpm/beer_32_32.png create mode 100644 navit/xpm/beer_48_48.png create mode 100644 navit/xpm/beer_8_8.png create mode 100644 navit/xpm/beer_96_96.png create mode 100644 navit/xpm/bench.png create mode 100644 navit/xpm/bench.svg create mode 100644 navit/xpm/bench_16_16.png create mode 100644 navit/xpm/bench_32_32.png create mode 100644 navit/xpm/bench_48_48.png create mode 100644 navit/xpm/bench_8_8.png create mode 100644 navit/xpm/bench_96_96.png create mode 100644 navit/xpm/biergarten.xpm create mode 100644 navit/xpm/boat_ramp.png create mode 100644 navit/xpm/boat_ramp.svg create mode 100644 navit/xpm/boat_ramp_16_16.png create mode 100644 navit/xpm/boat_ramp_32_32.png create mode 100644 navit/xpm/boat_ramp_48_48.png create mode 100644 navit/xpm/boat_ramp_8_8.png create mode 100644 navit/xpm/boat_ramp_96_96.png create mode 100644 navit/xpm/boundary_stone.png create mode 100644 navit/xpm/boundary_stone.svg create mode 100644 navit/xpm/boundary_stone_16_16.png create mode 100644 navit/xpm/boundary_stone_32_32.png create mode 100644 navit/xpm/boundary_stone_48_48.png create mode 100644 navit/xpm/boundary_stone_8_8.png create mode 100644 navit/xpm/boundary_stone_96_96.png create mode 100644 navit/xpm/bus.png create mode 100644 navit/xpm/bus.svg create mode 100644 navit/xpm/bus_16_16.png create mode 100644 navit/xpm/bus_32_32.png create mode 100644 navit/xpm/bus_48_48.png create mode 100644 navit/xpm/bus_8_8.png create mode 100644 navit/xpm/bus_96_96.png create mode 100644 navit/xpm/bus_halt.xpm create mode 100644 navit/xpm/cafe.png create mode 100644 navit/xpm/cafe.svg create mode 100644 navit/xpm/cafe_16_16.png create mode 100644 navit/xpm/cafe_32_32.png create mode 100644 navit/xpm/cafe_48_48.png create mode 100644 navit/xpm/cafe_8_8.png create mode 100644 navit/xpm/cafe_96_96.png create mode 100644 navit/xpm/camping.png create mode 100644 navit/xpm/camping.svg create mode 100644 navit/xpm/camping_16_16.png create mode 100644 navit/xpm/camping_32_32.png create mode 100644 navit/xpm/camping_48_48.png create mode 100644 navit/xpm/camping_8_8.png create mode 100644 navit/xpm/camping_96_96.png create mode 100644 navit/xpm/car_dealer.xpm create mode 100644 navit/xpm/castle.xpm create mode 100644 navit/xpm/cemetery.xpm create mode 100644 navit/xpm/church.png create mode 100644 navit/xpm/church.svg create mode 100644 navit/xpm/church_16_16.png create mode 100644 navit/xpm/church_32_32.png create mode 100644 navit/xpm/church_48_48.png create mode 100644 navit/xpm/church_8_8.png create mode 100644 navit/xpm/church_96_96.png create mode 100644 navit/xpm/cinema.png create mode 100644 navit/xpm/cinema.svg create mode 100644 navit/xpm/cinema_16_16.png create mode 100644 navit/xpm/cinema_32_32.png create mode 100644 navit/xpm/cinema_48_48.png create mode 100644 navit/xpm/cinema_8_8.png create mode 100644 navit/xpm/cinema_96_96.png create mode 100644 navit/xpm/country_.svgz create mode 100644 navit/xpm/country_AD.svgz create mode 100644 navit/xpm/country_AD_16_16.png create mode 100644 navit/xpm/country_AD_32_32.png create mode 100644 navit/xpm/country_AD_48_48.png create mode 100644 navit/xpm/country_AD_8_8.png create mode 100644 navit/xpm/country_AD_96_96.png create mode 100644 navit/xpm/country_AE.svgz create mode 100644 navit/xpm/country_AE_16_16.png create mode 100644 navit/xpm/country_AE_32_32.png create mode 100644 navit/xpm/country_AE_48_48.png create mode 100644 navit/xpm/country_AE_8_8.png create mode 100644 navit/xpm/country_AE_96_96.png create mode 100644 navit/xpm/country_AF.svgz create mode 100644 navit/xpm/country_AF_16_16.png create mode 100644 navit/xpm/country_AF_32_32.png create mode 100644 navit/xpm/country_AF_48_48.png create mode 100644 navit/xpm/country_AF_8_8.png create mode 100644 navit/xpm/country_AF_96_96.png create mode 100644 navit/xpm/country_AG.svgz create mode 100644 navit/xpm/country_AG_16_16.png create mode 100644 navit/xpm/country_AG_32_32.png create mode 100644 navit/xpm/country_AG_48_48.png create mode 100644 navit/xpm/country_AG_8_8.png create mode 100644 navit/xpm/country_AG_96_96.png create mode 100644 navit/xpm/country_AI.svgz create mode 100644 navit/xpm/country_AI_16_16.png create mode 100644 navit/xpm/country_AI_32_32.png create mode 100644 navit/xpm/country_AI_48_48.png create mode 100644 navit/xpm/country_AI_8_8.png create mode 100644 navit/xpm/country_AI_96_96.png create mode 100644 navit/xpm/country_AL.svgz create mode 100644 navit/xpm/country_AL_16_16.png create mode 100644 navit/xpm/country_AL_32_32.png create mode 100644 navit/xpm/country_AL_48_48.png create mode 100644 navit/xpm/country_AL_8_8.png create mode 100644 navit/xpm/country_AL_96_96.png create mode 100644 navit/xpm/country_AM.svgz create mode 100644 navit/xpm/country_AM_16_16.png create mode 100644 navit/xpm/country_AM_32_32.png create mode 100644 navit/xpm/country_AM_48_48.png create mode 100644 navit/xpm/country_AM_8_8.png create mode 100644 navit/xpm/country_AM_96_96.png create mode 100644 navit/xpm/country_AN.svgz create mode 100644 navit/xpm/country_AN_16_16.png create mode 100644 navit/xpm/country_AN_32_32.png create mode 100644 navit/xpm/country_AN_48_48.png create mode 100644 navit/xpm/country_AN_8_8.png create mode 100644 navit/xpm/country_AN_96_96.png create mode 100644 navit/xpm/country_AO.svgz create mode 100644 navit/xpm/country_AO_16_16.png create mode 100644 navit/xpm/country_AO_32_32.png create mode 100644 navit/xpm/country_AO_48_48.png create mode 100644 navit/xpm/country_AO_8_8.png create mode 100644 navit/xpm/country_AO_96_96.png create mode 100644 navit/xpm/country_AQ.svgz create mode 100644 navit/xpm/country_AQ_16_16.png create mode 100644 navit/xpm/country_AQ_32_32.png create mode 100644 navit/xpm/country_AQ_48_48.png create mode 100644 navit/xpm/country_AQ_8_8.png create mode 100644 navit/xpm/country_AQ_96_96.png create mode 100644 navit/xpm/country_AR.svgz create mode 100644 navit/xpm/country_AR_16_16.png create mode 100644 navit/xpm/country_AR_32_32.png create mode 100644 navit/xpm/country_AR_48_48.png create mode 100644 navit/xpm/country_AR_8_8.png create mode 100644 navit/xpm/country_AR_96_96.png create mode 100644 navit/xpm/country_AS.svgz create mode 100644 navit/xpm/country_AS_16_16.png create mode 100644 navit/xpm/country_AS_32_32.png create mode 100644 navit/xpm/country_AS_48_48.png create mode 100644 navit/xpm/country_AS_8_8.png create mode 100644 navit/xpm/country_AS_96_96.png create mode 100644 navit/xpm/country_AT.svgz create mode 100644 navit/xpm/country_AT_16_16.png create mode 100644 navit/xpm/country_AT_32_32.png create mode 100644 navit/xpm/country_AT_48_48.png create mode 100644 navit/xpm/country_AT_8_8.png create mode 100644 navit/xpm/country_AT_96_96.png create mode 100644 navit/xpm/country_AU.svgz create mode 100644 navit/xpm/country_AU_16_16.png create mode 100644 navit/xpm/country_AU_32_32.png create mode 100644 navit/xpm/country_AU_48_48.png create mode 100644 navit/xpm/country_AU_8_8.png create mode 100644 navit/xpm/country_AU_96_96.png create mode 100644 navit/xpm/country_AW.svgz create mode 100644 navit/xpm/country_AW_16_16.png create mode 100644 navit/xpm/country_AW_32_32.png create mode 100644 navit/xpm/country_AW_48_48.png create mode 100644 navit/xpm/country_AW_8_8.png create mode 100644 navit/xpm/country_AW_96_96.png create mode 100644 navit/xpm/country_AX.svgz create mode 100644 navit/xpm/country_AX_16_16.png create mode 100644 navit/xpm/country_AX_32_32.png create mode 100644 navit/xpm/country_AX_48_48.png create mode 100644 navit/xpm/country_AX_8_8.png create mode 100644 navit/xpm/country_AX_96_96.png create mode 100644 navit/xpm/country_AZ.svgz create mode 100644 navit/xpm/country_AZ_16_16.png create mode 100644 navit/xpm/country_AZ_32_32.png create mode 100644 navit/xpm/country_AZ_48_48.png create mode 100644 navit/xpm/country_AZ_8_8.png create mode 100644 navit/xpm/country_AZ_96_96.png create mode 100644 navit/xpm/country_BA.svgz create mode 100644 navit/xpm/country_BA_16_16.png create mode 100644 navit/xpm/country_BA_32_32.png create mode 100644 navit/xpm/country_BA_48_48.png create mode 100644 navit/xpm/country_BA_8_8.png create mode 100644 navit/xpm/country_BA_96_96.png create mode 100644 navit/xpm/country_BB.svgz create mode 100644 navit/xpm/country_BB_16_16.png create mode 100644 navit/xpm/country_BB_32_32.png create mode 100644 navit/xpm/country_BB_48_48.png create mode 100644 navit/xpm/country_BB_8_8.png create mode 100644 navit/xpm/country_BB_96_96.png create mode 100644 navit/xpm/country_BD.svgz create mode 100644 navit/xpm/country_BD_16_16.png create mode 100644 navit/xpm/country_BD_32_32.png create mode 100644 navit/xpm/country_BD_48_48.png create mode 100644 navit/xpm/country_BD_8_8.png create mode 100644 navit/xpm/country_BD_96_96.png create mode 100644 navit/xpm/country_BE.svgz create mode 100644 navit/xpm/country_BE_16_16.png create mode 100644 navit/xpm/country_BE_32_32.png create mode 100644 navit/xpm/country_BE_48_48.png create mode 100644 navit/xpm/country_BE_8_8.png create mode 100644 navit/xpm/country_BE_96_96.png create mode 100644 navit/xpm/country_BF.svgz create mode 100644 navit/xpm/country_BF_16_16.png create mode 100644 navit/xpm/country_BF_32_32.png create mode 100644 navit/xpm/country_BF_48_48.png create mode 100644 navit/xpm/country_BF_8_8.png create mode 100644 navit/xpm/country_BF_96_96.png create mode 100644 navit/xpm/country_BG.svgz create mode 100644 navit/xpm/country_BG_16_16.png create mode 100644 navit/xpm/country_BG_32_32.png create mode 100644 navit/xpm/country_BG_48_48.png create mode 100644 navit/xpm/country_BG_8_8.png create mode 100644 navit/xpm/country_BG_96_96.png create mode 100644 navit/xpm/country_BH.svgz create mode 100644 navit/xpm/country_BH_16_16.png create mode 100644 navit/xpm/country_BH_32_32.png create mode 100644 navit/xpm/country_BH_48_48.png create mode 100644 navit/xpm/country_BH_8_8.png create mode 100644 navit/xpm/country_BH_96_96.png create mode 100644 navit/xpm/country_BI.svgz create mode 100644 navit/xpm/country_BI_16_16.png create mode 100644 navit/xpm/country_BI_32_32.png create mode 100644 navit/xpm/country_BI_48_48.png create mode 100644 navit/xpm/country_BI_8_8.png create mode 100644 navit/xpm/country_BI_96_96.png create mode 100644 navit/xpm/country_BJ.svgz create mode 100644 navit/xpm/country_BJ_16_16.png create mode 100644 navit/xpm/country_BJ_32_32.png create mode 100644 navit/xpm/country_BJ_48_48.png create mode 100644 navit/xpm/country_BJ_8_8.png create mode 100644 navit/xpm/country_BJ_96_96.png create mode 100644 navit/xpm/country_BL.svgz create mode 100644 navit/xpm/country_BL_16_16.png create mode 100644 navit/xpm/country_BL_32_32.png create mode 100644 navit/xpm/country_BL_48_48.png create mode 100644 navit/xpm/country_BL_8_8.png create mode 100644 navit/xpm/country_BL_96_96.png create mode 100644 navit/xpm/country_BM.svgz create mode 100644 navit/xpm/country_BM_16_16.png create mode 100644 navit/xpm/country_BM_32_32.png create mode 100644 navit/xpm/country_BM_48_48.png create mode 100644 navit/xpm/country_BM_8_8.png create mode 100644 navit/xpm/country_BM_96_96.png create mode 100644 navit/xpm/country_BN.svgz create mode 100644 navit/xpm/country_BN_16_16.png create mode 100644 navit/xpm/country_BN_32_32.png create mode 100644 navit/xpm/country_BN_48_48.png create mode 100644 navit/xpm/country_BN_8_8.png create mode 100644 navit/xpm/country_BN_96_96.png create mode 100644 navit/xpm/country_BO.svgz create mode 100644 navit/xpm/country_BO_16_16.png create mode 100644 navit/xpm/country_BO_32_32.png create mode 100644 navit/xpm/country_BO_48_48.png create mode 100644 navit/xpm/country_BO_8_8.png create mode 100644 navit/xpm/country_BO_96_96.png create mode 100644 navit/xpm/country_BR.svgz create mode 100644 navit/xpm/country_BR_16_16.png create mode 100644 navit/xpm/country_BR_32_32.png create mode 100644 navit/xpm/country_BR_48_48.png create mode 100644 navit/xpm/country_BR_8_8.png create mode 100644 navit/xpm/country_BR_96_96.png create mode 100644 navit/xpm/country_BS.svgz create mode 100644 navit/xpm/country_BS_16_16.png create mode 100644 navit/xpm/country_BS_32_32.png create mode 100644 navit/xpm/country_BS_48_48.png create mode 100644 navit/xpm/country_BS_8_8.png create mode 100644 navit/xpm/country_BS_96_96.png create mode 100644 navit/xpm/country_BT.svgz create mode 100644 navit/xpm/country_BT_16_16.png create mode 100644 navit/xpm/country_BT_32_32.png create mode 100644 navit/xpm/country_BT_48_48.png create mode 100644 navit/xpm/country_BT_8_8.png create mode 100644 navit/xpm/country_BT_96_96.png create mode 100644 navit/xpm/country_BV.svgz create mode 100644 navit/xpm/country_BV_16_16.png create mode 100644 navit/xpm/country_BV_32_32.png create mode 100644 navit/xpm/country_BV_48_48.png create mode 100644 navit/xpm/country_BV_8_8.png create mode 100644 navit/xpm/country_BV_96_96.png create mode 100644 navit/xpm/country_BW.svgz create mode 100644 navit/xpm/country_BW_16_16.png create mode 100644 navit/xpm/country_BW_32_32.png create mode 100644 navit/xpm/country_BW_48_48.png create mode 100644 navit/xpm/country_BW_8_8.png create mode 100644 navit/xpm/country_BW_96_96.png create mode 100644 navit/xpm/country_BY.svgz create mode 100644 navit/xpm/country_BY_16_16.png create mode 100644 navit/xpm/country_BY_32_32.png create mode 100644 navit/xpm/country_BY_48_48.png create mode 100644 navit/xpm/country_BY_8_8.png create mode 100644 navit/xpm/country_BY_96_96.png create mode 100644 navit/xpm/country_BZ.svgz create mode 100644 navit/xpm/country_BZ_16_16.png create mode 100644 navit/xpm/country_BZ_32_32.png create mode 100644 navit/xpm/country_BZ_48_48.png create mode 100644 navit/xpm/country_BZ_8_8.png create mode 100644 navit/xpm/country_BZ_96_96.png create mode 100644 navit/xpm/country_CA.svgz create mode 100644 navit/xpm/country_CA_16_16.png create mode 100644 navit/xpm/country_CA_32_32.png create mode 100644 navit/xpm/country_CA_48_48.png create mode 100644 navit/xpm/country_CA_8_8.png create mode 100644 navit/xpm/country_CA_96_96.png create mode 100644 navit/xpm/country_CC.svgz create mode 100644 navit/xpm/country_CC_16_16.png create mode 100644 navit/xpm/country_CC_32_32.png create mode 100644 navit/xpm/country_CC_48_48.png create mode 100644 navit/xpm/country_CC_8_8.png create mode 100644 navit/xpm/country_CC_96_96.png create mode 100644 navit/xpm/country_CD.svgz create mode 100644 navit/xpm/country_CD_16_16.png create mode 100644 navit/xpm/country_CD_32_32.png create mode 100644 navit/xpm/country_CD_48_48.png create mode 100644 navit/xpm/country_CD_8_8.png create mode 100644 navit/xpm/country_CD_96_96.png create mode 100644 navit/xpm/country_CF.svgz create mode 100644 navit/xpm/country_CF_16_16.png create mode 100644 navit/xpm/country_CF_32_32.png create mode 100644 navit/xpm/country_CF_48_48.png create mode 100644 navit/xpm/country_CF_8_8.png create mode 100644 navit/xpm/country_CF_96_96.png create mode 100644 navit/xpm/country_CG.svgz create mode 100644 navit/xpm/country_CG_16_16.png create mode 100644 navit/xpm/country_CG_32_32.png create mode 100644 navit/xpm/country_CG_48_48.png create mode 100644 navit/xpm/country_CG_8_8.png create mode 100644 navit/xpm/country_CG_96_96.png create mode 100644 navit/xpm/country_CH.svgz create mode 100644 navit/xpm/country_CH_16_16.png create mode 100644 navit/xpm/country_CH_32_32.png create mode 100644 navit/xpm/country_CH_48_48.png create mode 100644 navit/xpm/country_CH_8_8.png create mode 100644 navit/xpm/country_CH_96_96.png create mode 100644 navit/xpm/country_CI.svgz create mode 100644 navit/xpm/country_CI_16_16.png create mode 100644 navit/xpm/country_CI_32_32.png create mode 100644 navit/xpm/country_CI_48_48.png create mode 100644 navit/xpm/country_CI_8_8.png create mode 100644 navit/xpm/country_CI_96_96.png create mode 100644 navit/xpm/country_CK.svgz create mode 100644 navit/xpm/country_CK_16_16.png create mode 100644 navit/xpm/country_CK_32_32.png create mode 100644 navit/xpm/country_CK_48_48.png create mode 100644 navit/xpm/country_CK_8_8.png create mode 100644 navit/xpm/country_CK_96_96.png create mode 100644 navit/xpm/country_CL.svgz create mode 100644 navit/xpm/country_CL_16_16.png create mode 100644 navit/xpm/country_CL_32_32.png create mode 100644 navit/xpm/country_CL_48_48.png create mode 100644 navit/xpm/country_CL_8_8.png create mode 100644 navit/xpm/country_CL_96_96.png create mode 100644 navit/xpm/country_CM.svgz create mode 100644 navit/xpm/country_CM_16_16.png create mode 100644 navit/xpm/country_CM_32_32.png create mode 100644 navit/xpm/country_CM_48_48.png create mode 100644 navit/xpm/country_CM_8_8.png create mode 100644 navit/xpm/country_CM_96_96.png create mode 100644 navit/xpm/country_CN.svgz create mode 100644 navit/xpm/country_CN_16_16.png create mode 100644 navit/xpm/country_CN_32_32.png create mode 100644 navit/xpm/country_CN_48_48.png create mode 100644 navit/xpm/country_CN_8_8.png create mode 100644 navit/xpm/country_CN_96_96.png create mode 100644 navit/xpm/country_CO.svgz create mode 100644 navit/xpm/country_CO_16_16.png create mode 100644 navit/xpm/country_CO_32_32.png create mode 100644 navit/xpm/country_CO_48_48.png create mode 100644 navit/xpm/country_CO_8_8.png create mode 100644 navit/xpm/country_CO_96_96.png create mode 100644 navit/xpm/country_CR.svgz create mode 100644 navit/xpm/country_CR_16_16.png create mode 100644 navit/xpm/country_CR_32_32.png create mode 100644 navit/xpm/country_CR_48_48.png create mode 100644 navit/xpm/country_CR_8_8.png create mode 100644 navit/xpm/country_CR_96_96.png create mode 100644 navit/xpm/country_CU.svgz create mode 100644 navit/xpm/country_CU_16_16.png create mode 100644 navit/xpm/country_CU_32_32.png create mode 100644 navit/xpm/country_CU_48_48.png create mode 100644 navit/xpm/country_CU_8_8.png create mode 100644 navit/xpm/country_CU_96_96.png create mode 100644 navit/xpm/country_CV.svgz create mode 100644 navit/xpm/country_CV_16_16.png create mode 100644 navit/xpm/country_CV_32_32.png create mode 100644 navit/xpm/country_CV_48_48.png create mode 100644 navit/xpm/country_CV_8_8.png create mode 100644 navit/xpm/country_CV_96_96.png create mode 100644 navit/xpm/country_CX.svgz create mode 100644 navit/xpm/country_CX_16_16.png create mode 100644 navit/xpm/country_CX_32_32.png create mode 100644 navit/xpm/country_CX_48_48.png create mode 100644 navit/xpm/country_CX_8_8.png create mode 100644 navit/xpm/country_CX_96_96.png create mode 100644 navit/xpm/country_CY.svgz create mode 100644 navit/xpm/country_CY_16_16.png create mode 100644 navit/xpm/country_CY_32_32.png create mode 100644 navit/xpm/country_CY_48_48.png create mode 100644 navit/xpm/country_CY_8_8.png create mode 100644 navit/xpm/country_CY_96_96.png create mode 100644 navit/xpm/country_CZ.svgz create mode 100644 navit/xpm/country_CZ_16_16.png create mode 100644 navit/xpm/country_CZ_32_32.png create mode 100644 navit/xpm/country_CZ_48_48.png create mode 100644 navit/xpm/country_CZ_8_8.png create mode 100644 navit/xpm/country_CZ_96_96.png create mode 100644 navit/xpm/country_DE.svgz create mode 100644 navit/xpm/country_DE_16_16.png create mode 100644 navit/xpm/country_DE_32_32.png create mode 100644 navit/xpm/country_DE_48_48.png create mode 100644 navit/xpm/country_DE_8_8.png create mode 100644 navit/xpm/country_DE_96_96.png create mode 100644 navit/xpm/country_DJ.svgz create mode 100644 navit/xpm/country_DJ_16_16.png create mode 100644 navit/xpm/country_DJ_32_32.png create mode 100644 navit/xpm/country_DJ_48_48.png create mode 100644 navit/xpm/country_DJ_8_8.png create mode 100644 navit/xpm/country_DJ_96_96.png create mode 100644 navit/xpm/country_DK.svgz create mode 100644 navit/xpm/country_DK_16_16.png create mode 100644 navit/xpm/country_DK_32_32.png create mode 100644 navit/xpm/country_DK_48_48.png create mode 100644 navit/xpm/country_DK_8_8.png create mode 100644 navit/xpm/country_DK_96_96.png create mode 100644 navit/xpm/country_DM.svgz create mode 100644 navit/xpm/country_DM_16_16.png create mode 100644 navit/xpm/country_DM_32_32.png create mode 100644 navit/xpm/country_DM_48_48.png create mode 100644 navit/xpm/country_DM_8_8.png create mode 100644 navit/xpm/country_DM_96_96.png create mode 100644 navit/xpm/country_DO.svgz create mode 100644 navit/xpm/country_DO_16_16.png create mode 100644 navit/xpm/country_DO_32_32.png create mode 100644 navit/xpm/country_DO_48_48.png create mode 100644 navit/xpm/country_DO_8_8.png create mode 100644 navit/xpm/country_DO_96_96.png create mode 100644 navit/xpm/country_DZ.svgz create mode 100644 navit/xpm/country_DZ_16_16.png create mode 100644 navit/xpm/country_DZ_32_32.png create mode 100644 navit/xpm/country_DZ_48_48.png create mode 100644 navit/xpm/country_DZ_8_8.png create mode 100644 navit/xpm/country_DZ_96_96.png create mode 100644 navit/xpm/country_EC.svgz create mode 100644 navit/xpm/country_EC_16_16.png create mode 100644 navit/xpm/country_EC_32_32.png create mode 100644 navit/xpm/country_EC_48_48.png create mode 100644 navit/xpm/country_EC_8_8.png create mode 100644 navit/xpm/country_EC_96_96.png create mode 100644 navit/xpm/country_EE.svgz create mode 100644 navit/xpm/country_EE_16_16.png create mode 100644 navit/xpm/country_EE_32_32.png create mode 100644 navit/xpm/country_EE_48_48.png create mode 100644 navit/xpm/country_EE_8_8.png create mode 100644 navit/xpm/country_EE_96_96.png create mode 100644 navit/xpm/country_EG.svgz create mode 100644 navit/xpm/country_EG_16_16.png create mode 100644 navit/xpm/country_EG_32_32.png create mode 100644 navit/xpm/country_EG_48_48.png create mode 100644 navit/xpm/country_EG_8_8.png create mode 100644 navit/xpm/country_EG_96_96.png create mode 100644 navit/xpm/country_EH.svgz create mode 100644 navit/xpm/country_EH_16_16.png create mode 100644 navit/xpm/country_EH_32_32.png create mode 100644 navit/xpm/country_EH_48_48.png create mode 100644 navit/xpm/country_EH_8_8.png create mode 100644 navit/xpm/country_EH_96_96.png create mode 100644 navit/xpm/country_ER.svgz create mode 100644 navit/xpm/country_ER_16_16.png create mode 100644 navit/xpm/country_ER_32_32.png create mode 100644 navit/xpm/country_ER_48_48.png create mode 100644 navit/xpm/country_ER_8_8.png create mode 100644 navit/xpm/country_ER_96_96.png create mode 100644 navit/xpm/country_ES.svgz create mode 100644 navit/xpm/country_ES_16_16.png create mode 100644 navit/xpm/country_ES_32_32.png create mode 100644 navit/xpm/country_ES_48_48.png create mode 100644 navit/xpm/country_ES_8_8.png create mode 100644 navit/xpm/country_ES_96_96.png create mode 100644 navit/xpm/country_ET.svgz create mode 100644 navit/xpm/country_ET_16_16.png create mode 100644 navit/xpm/country_ET_32_32.png create mode 100644 navit/xpm/country_ET_48_48.png create mode 100644 navit/xpm/country_ET_8_8.png create mode 100644 navit/xpm/country_ET_96_96.png create mode 100644 navit/xpm/country_FI.svgz create mode 100644 navit/xpm/country_FI_16_16.png create mode 100644 navit/xpm/country_FI_32_32.png create mode 100644 navit/xpm/country_FI_48_48.png create mode 100644 navit/xpm/country_FI_8_8.png create mode 100644 navit/xpm/country_FI_96_96.png create mode 100644 navit/xpm/country_FJ.svgz create mode 100644 navit/xpm/country_FJ_16_16.png create mode 100644 navit/xpm/country_FJ_32_32.png create mode 100644 navit/xpm/country_FJ_48_48.png create mode 100644 navit/xpm/country_FJ_8_8.png create mode 100644 navit/xpm/country_FJ_96_96.png create mode 100644 navit/xpm/country_FK.svgz create mode 100644 navit/xpm/country_FK_16_16.png create mode 100644 navit/xpm/country_FK_32_32.png create mode 100644 navit/xpm/country_FK_48_48.png create mode 100644 navit/xpm/country_FK_8_8.png create mode 100644 navit/xpm/country_FK_96_96.png create mode 100644 navit/xpm/country_FM.svgz create mode 100644 navit/xpm/country_FM_16_16.png create mode 100644 navit/xpm/country_FM_32_32.png create mode 100644 navit/xpm/country_FM_48_48.png create mode 100644 navit/xpm/country_FM_8_8.png create mode 100644 navit/xpm/country_FM_96_96.png create mode 100644 navit/xpm/country_FO.svgz create mode 100644 navit/xpm/country_FO_16_16.png create mode 100644 navit/xpm/country_FO_32_32.png create mode 100644 navit/xpm/country_FO_48_48.png create mode 100644 navit/xpm/country_FO_8_8.png create mode 100644 navit/xpm/country_FO_96_96.png create mode 100644 navit/xpm/country_FR.svgz create mode 100644 navit/xpm/country_FR_16_16.png create mode 100644 navit/xpm/country_FR_32_32.png create mode 100644 navit/xpm/country_FR_48_48.png create mode 100644 navit/xpm/country_FR_8_8.png create mode 100644 navit/xpm/country_FR_96_96.png create mode 100644 navit/xpm/country_GA.svgz create mode 100644 navit/xpm/country_GA_16_16.png create mode 100644 navit/xpm/country_GA_32_32.png create mode 100644 navit/xpm/country_GA_48_48.png create mode 100644 navit/xpm/country_GA_8_8.png create mode 100644 navit/xpm/country_GA_96_96.png create mode 100644 navit/xpm/country_GB.svgz create mode 100644 navit/xpm/country_GB_16_16.png create mode 100644 navit/xpm/country_GB_32_32.png create mode 100644 navit/xpm/country_GB_48_48.png create mode 100644 navit/xpm/country_GB_8_8.png create mode 100644 navit/xpm/country_GB_96_96.png create mode 100644 navit/xpm/country_GD.svgz create mode 100644 navit/xpm/country_GD_16_16.png create mode 100644 navit/xpm/country_GD_32_32.png create mode 100644 navit/xpm/country_GD_48_48.png create mode 100644 navit/xpm/country_GD_8_8.png create mode 100644 navit/xpm/country_GD_96_96.png create mode 100644 navit/xpm/country_GE.svgz create mode 100644 navit/xpm/country_GE_16_16.png create mode 100644 navit/xpm/country_GE_32_32.png create mode 100644 navit/xpm/country_GE_48_48.png create mode 100644 navit/xpm/country_GE_8_8.png create mode 100644 navit/xpm/country_GE_96_96.png create mode 100644 navit/xpm/country_GF.svgz create mode 100644 navit/xpm/country_GF_16_16.png create mode 100644 navit/xpm/country_GF_32_32.png create mode 100644 navit/xpm/country_GF_48_48.png create mode 100644 navit/xpm/country_GF_8_8.png create mode 100644 navit/xpm/country_GF_96_96.png create mode 100644 navit/xpm/country_GG.svgz create mode 100644 navit/xpm/country_GG_16_16.png create mode 100644 navit/xpm/country_GG_32_32.png create mode 100644 navit/xpm/country_GG_48_48.png create mode 100644 navit/xpm/country_GG_8_8.png create mode 100644 navit/xpm/country_GG_96_96.png create mode 100644 navit/xpm/country_GH.svgz create mode 100644 navit/xpm/country_GH_16_16.png create mode 100644 navit/xpm/country_GH_32_32.png create mode 100644 navit/xpm/country_GH_48_48.png create mode 100644 navit/xpm/country_GH_8_8.png create mode 100644 navit/xpm/country_GH_96_96.png create mode 100644 navit/xpm/country_GI.svgz create mode 100644 navit/xpm/country_GI_16_16.png create mode 100644 navit/xpm/country_GI_32_32.png create mode 100644 navit/xpm/country_GI_48_48.png create mode 100644 navit/xpm/country_GI_8_8.png create mode 100644 navit/xpm/country_GI_96_96.png create mode 100644 navit/xpm/country_GL.svgz create mode 100644 navit/xpm/country_GL_16_16.png create mode 100644 navit/xpm/country_GL_32_32.png create mode 100644 navit/xpm/country_GL_48_48.png create mode 100644 navit/xpm/country_GL_8_8.png create mode 100644 navit/xpm/country_GL_96_96.png create mode 100644 navit/xpm/country_GM.svgz create mode 100644 navit/xpm/country_GM_16_16.png create mode 100644 navit/xpm/country_GM_32_32.png create mode 100644 navit/xpm/country_GM_48_48.png create mode 100644 navit/xpm/country_GM_8_8.png create mode 100644 navit/xpm/country_GM_96_96.png create mode 100644 navit/xpm/country_GN.svgz create mode 100644 navit/xpm/country_GN_16_16.png create mode 100644 navit/xpm/country_GN_32_32.png create mode 100644 navit/xpm/country_GN_48_48.png create mode 100644 navit/xpm/country_GN_8_8.png create mode 100644 navit/xpm/country_GN_96_96.png create mode 100644 navit/xpm/country_GP.svgz create mode 100644 navit/xpm/country_GP_16_16.png create mode 100644 navit/xpm/country_GP_32_32.png create mode 100644 navit/xpm/country_GP_48_48.png create mode 100644 navit/xpm/country_GP_8_8.png create mode 100644 navit/xpm/country_GP_96_96.png create mode 100644 navit/xpm/country_GQ.svgz create mode 100644 navit/xpm/country_GQ_16_16.png create mode 100644 navit/xpm/country_GQ_32_32.png create mode 100644 navit/xpm/country_GQ_48_48.png create mode 100644 navit/xpm/country_GQ_8_8.png create mode 100644 navit/xpm/country_GQ_96_96.png create mode 100644 navit/xpm/country_GR.svgz create mode 100644 navit/xpm/country_GR_16_16.png create mode 100644 navit/xpm/country_GR_32_32.png create mode 100644 navit/xpm/country_GR_48_48.png create mode 100644 navit/xpm/country_GR_8_8.png create mode 100644 navit/xpm/country_GR_96_96.png create mode 100644 navit/xpm/country_GS.svgz create mode 100644 navit/xpm/country_GS_16_16.png create mode 100644 navit/xpm/country_GS_32_32.png create mode 100644 navit/xpm/country_GS_48_48.png create mode 100644 navit/xpm/country_GS_8_8.png create mode 100644 navit/xpm/country_GS_96_96.png create mode 100644 navit/xpm/country_GT.svgz create mode 100644 navit/xpm/country_GT_16_16.png create mode 100644 navit/xpm/country_GT_32_32.png create mode 100644 navit/xpm/country_GT_48_48.png create mode 100644 navit/xpm/country_GT_8_8.png create mode 100644 navit/xpm/country_GT_96_96.png create mode 100644 navit/xpm/country_GU.svgz create mode 100644 navit/xpm/country_GU_16_16.png create mode 100644 navit/xpm/country_GU_32_32.png create mode 100644 navit/xpm/country_GU_48_48.png create mode 100644 navit/xpm/country_GU_8_8.png create mode 100644 navit/xpm/country_GU_96_96.png create mode 100644 navit/xpm/country_GW.svgz create mode 100644 navit/xpm/country_GW_16_16.png create mode 100644 navit/xpm/country_GW_32_32.png create mode 100644 navit/xpm/country_GW_48_48.png create mode 100644 navit/xpm/country_GW_8_8.png create mode 100644 navit/xpm/country_GW_96_96.png create mode 100644 navit/xpm/country_GY.svgz create mode 100644 navit/xpm/country_GY_16_16.png create mode 100644 navit/xpm/country_GY_32_32.png create mode 100644 navit/xpm/country_GY_48_48.png create mode 100644 navit/xpm/country_GY_8_8.png create mode 100644 navit/xpm/country_GY_96_96.png create mode 100644 navit/xpm/country_HK.svgz create mode 100644 navit/xpm/country_HK_16_16.png create mode 100644 navit/xpm/country_HK_32_32.png create mode 100644 navit/xpm/country_HK_48_48.png create mode 100644 navit/xpm/country_HK_8_8.png create mode 100644 navit/xpm/country_HK_96_96.png create mode 100644 navit/xpm/country_HM.svgz create mode 100644 navit/xpm/country_HM_16_16.png create mode 100644 navit/xpm/country_HM_32_32.png create mode 100644 navit/xpm/country_HM_48_48.png create mode 100644 navit/xpm/country_HM_8_8.png create mode 100644 navit/xpm/country_HM_96_96.png create mode 100644 navit/xpm/country_HN.svgz create mode 100644 navit/xpm/country_HN_16_16.png create mode 100644 navit/xpm/country_HN_32_32.png create mode 100644 navit/xpm/country_HN_48_48.png create mode 100644 navit/xpm/country_HN_8_8.png create mode 100644 navit/xpm/country_HN_96_96.png create mode 100644 navit/xpm/country_HR.svgz create mode 100644 navit/xpm/country_HR_16_16.png create mode 100644 navit/xpm/country_HR_32_32.png create mode 100644 navit/xpm/country_HR_48_48.png create mode 100644 navit/xpm/country_HR_8_8.png create mode 100644 navit/xpm/country_HR_96_96.png create mode 100644 navit/xpm/country_HT.svgz create mode 100644 navit/xpm/country_HT_16_16.png create mode 100644 navit/xpm/country_HT_32_32.png create mode 100644 navit/xpm/country_HT_48_48.png create mode 100644 navit/xpm/country_HT_8_8.png create mode 100644 navit/xpm/country_HT_96_96.png create mode 100644 navit/xpm/country_HU.svgz create mode 100644 navit/xpm/country_HU_16_16.png create mode 100644 navit/xpm/country_HU_32_32.png create mode 100644 navit/xpm/country_HU_48_48.png create mode 100644 navit/xpm/country_HU_8_8.png create mode 100644 navit/xpm/country_HU_96_96.png create mode 100644 navit/xpm/country_ID.svgz create mode 100644 navit/xpm/country_ID_16_16.png create mode 100644 navit/xpm/country_ID_32_32.png create mode 100644 navit/xpm/country_ID_48_48.png create mode 100644 navit/xpm/country_ID_8_8.png create mode 100644 navit/xpm/country_ID_96_96.png create mode 100644 navit/xpm/country_IE.svgz create mode 100644 navit/xpm/country_IE_16_16.png create mode 100644 navit/xpm/country_IE_32_32.png create mode 100644 navit/xpm/country_IE_48_48.png create mode 100644 navit/xpm/country_IE_8_8.png create mode 100644 navit/xpm/country_IE_96_96.png create mode 100644 navit/xpm/country_IL.svgz create mode 100644 navit/xpm/country_IL_16_16.png create mode 100644 navit/xpm/country_IL_32_32.png create mode 100644 navit/xpm/country_IL_48_48.png create mode 100644 navit/xpm/country_IL_8_8.png create mode 100644 navit/xpm/country_IL_96_96.png create mode 100644 navit/xpm/country_IM.svgz create mode 100644 navit/xpm/country_IM_16_16.png create mode 100644 navit/xpm/country_IM_32_32.png create mode 100644 navit/xpm/country_IM_48_48.png create mode 100644 navit/xpm/country_IM_8_8.png create mode 100644 navit/xpm/country_IM_96_96.png create mode 100644 navit/xpm/country_IN.svgz create mode 100644 navit/xpm/country_IN_16_16.png create mode 100644 navit/xpm/country_IN_32_32.png create mode 100644 navit/xpm/country_IN_48_48.png create mode 100644 navit/xpm/country_IN_8_8.png create mode 100644 navit/xpm/country_IN_96_96.png create mode 100644 navit/xpm/country_IO.svgz create mode 100644 navit/xpm/country_IO_16_16.png create mode 100644 navit/xpm/country_IO_32_32.png create mode 100644 navit/xpm/country_IO_48_48.png create mode 100644 navit/xpm/country_IO_8_8.png create mode 100644 navit/xpm/country_IO_96_96.png create mode 100644 navit/xpm/country_IQ.svgz create mode 100644 navit/xpm/country_IQ_16_16.png create mode 100644 navit/xpm/country_IQ_32_32.png create mode 100644 navit/xpm/country_IQ_48_48.png create mode 100644 navit/xpm/country_IQ_8_8.png create mode 100644 navit/xpm/country_IQ_96_96.png create mode 100644 navit/xpm/country_IR.svgz create mode 100644 navit/xpm/country_IR_16_16.png create mode 100644 navit/xpm/country_IR_32_32.png create mode 100644 navit/xpm/country_IR_48_48.png create mode 100644 navit/xpm/country_IR_8_8.png create mode 100644 navit/xpm/country_IR_96_96.png create mode 100644 navit/xpm/country_IS.svgz create mode 100644 navit/xpm/country_IS_16_16.png create mode 100644 navit/xpm/country_IS_32_32.png create mode 100644 navit/xpm/country_IS_48_48.png create mode 100644 navit/xpm/country_IS_8_8.png create mode 100644 navit/xpm/country_IS_96_96.png create mode 100644 navit/xpm/country_IT.svgz create mode 100644 navit/xpm/country_IT_16_16.png create mode 100644 navit/xpm/country_IT_32_32.png create mode 100644 navit/xpm/country_IT_48_48.png create mode 100644 navit/xpm/country_IT_8_8.png create mode 100644 navit/xpm/country_IT_96_96.png create mode 100644 navit/xpm/country_JE.svgz create mode 100644 navit/xpm/country_JE_16_16.png create mode 100644 navit/xpm/country_JE_32_32.png create mode 100644 navit/xpm/country_JE_48_48.png create mode 100644 navit/xpm/country_JE_8_8.png create mode 100644 navit/xpm/country_JE_96_96.png create mode 100644 navit/xpm/country_JM.svgz create mode 100644 navit/xpm/country_JM_16_16.png create mode 100644 navit/xpm/country_JM_32_32.png create mode 100644 navit/xpm/country_JM_48_48.png create mode 100644 navit/xpm/country_JM_8_8.png create mode 100644 navit/xpm/country_JM_96_96.png create mode 100644 navit/xpm/country_JO.svgz create mode 100644 navit/xpm/country_JO_16_16.png create mode 100644 navit/xpm/country_JO_32_32.png create mode 100644 navit/xpm/country_JO_48_48.png create mode 100644 navit/xpm/country_JO_8_8.png create mode 100644 navit/xpm/country_JO_96_96.png create mode 100644 navit/xpm/country_JP.svgz create mode 100644 navit/xpm/country_JP_16_16.png create mode 100644 navit/xpm/country_JP_32_32.png create mode 100644 navit/xpm/country_JP_48_48.png create mode 100644 navit/xpm/country_JP_8_8.png create mode 100644 navit/xpm/country_JP_96_96.png create mode 100644 navit/xpm/country_KE.svgz create mode 100644 navit/xpm/country_KE_16_16.png create mode 100644 navit/xpm/country_KE_32_32.png create mode 100644 navit/xpm/country_KE_48_48.png create mode 100644 navit/xpm/country_KE_8_8.png create mode 100644 navit/xpm/country_KE_96_96.png create mode 100644 navit/xpm/country_KG.svgz create mode 100644 navit/xpm/country_KG_16_16.png create mode 100644 navit/xpm/country_KG_32_32.png create mode 100644 navit/xpm/country_KG_48_48.png create mode 100644 navit/xpm/country_KG_8_8.png create mode 100644 navit/xpm/country_KG_96_96.png create mode 100644 navit/xpm/country_KH.svgz create mode 100644 navit/xpm/country_KH_16_16.png create mode 100644 navit/xpm/country_KH_32_32.png create mode 100644 navit/xpm/country_KH_48_48.png create mode 100644 navit/xpm/country_KH_8_8.png create mode 100644 navit/xpm/country_KH_96_96.png create mode 100644 navit/xpm/country_KI.svgz create mode 100644 navit/xpm/country_KI_16_16.png create mode 100644 navit/xpm/country_KI_32_32.png create mode 100644 navit/xpm/country_KI_48_48.png create mode 100644 navit/xpm/country_KI_8_8.png create mode 100644 navit/xpm/country_KI_96_96.png create mode 100644 navit/xpm/country_KM.svgz create mode 100644 navit/xpm/country_KM_16_16.png create mode 100644 navit/xpm/country_KM_32_32.png create mode 100644 navit/xpm/country_KM_48_48.png create mode 100644 navit/xpm/country_KM_8_8.png create mode 100644 navit/xpm/country_KM_96_96.png create mode 100644 navit/xpm/country_KN.svgz create mode 100644 navit/xpm/country_KN_16_16.png create mode 100644 navit/xpm/country_KN_32_32.png create mode 100644 navit/xpm/country_KN_48_48.png create mode 100644 navit/xpm/country_KN_8_8.png create mode 100644 navit/xpm/country_KN_96_96.png create mode 100644 navit/xpm/country_KP.svgz create mode 100644 navit/xpm/country_KP_16_16.png create mode 100644 navit/xpm/country_KP_32_32.png create mode 100644 navit/xpm/country_KP_48_48.png create mode 100644 navit/xpm/country_KP_8_8.png create mode 100644 navit/xpm/country_KP_96_96.png create mode 100644 navit/xpm/country_KR.svgz create mode 100644 navit/xpm/country_KR_16_16.png create mode 100644 navit/xpm/country_KR_32_32.png create mode 100644 navit/xpm/country_KR_48_48.png create mode 100644 navit/xpm/country_KR_8_8.png create mode 100644 navit/xpm/country_KR_96_96.png create mode 100644 navit/xpm/country_KW.svgz create mode 100644 navit/xpm/country_KW_16_16.png create mode 100644 navit/xpm/country_KW_32_32.png create mode 100644 navit/xpm/country_KW_48_48.png create mode 100644 navit/xpm/country_KW_8_8.png create mode 100644 navit/xpm/country_KW_96_96.png create mode 100644 navit/xpm/country_KY.svgz create mode 100644 navit/xpm/country_KY_16_16.png create mode 100644 navit/xpm/country_KY_32_32.png create mode 100644 navit/xpm/country_KY_48_48.png create mode 100644 navit/xpm/country_KY_8_8.png create mode 100644 navit/xpm/country_KY_96_96.png create mode 100644 navit/xpm/country_KZ.svgz create mode 100644 navit/xpm/country_KZ_16_16.png create mode 100644 navit/xpm/country_KZ_32_32.png create mode 100644 navit/xpm/country_KZ_48_48.png create mode 100644 navit/xpm/country_KZ_8_8.png create mode 100644 navit/xpm/country_KZ_96_96.png create mode 100644 navit/xpm/country_LA.svgz create mode 100644 navit/xpm/country_LA_16_16.png create mode 100644 navit/xpm/country_LA_32_32.png create mode 100644 navit/xpm/country_LA_48_48.png create mode 100644 navit/xpm/country_LA_8_8.png create mode 100644 navit/xpm/country_LA_96_96.png create mode 100644 navit/xpm/country_LB.svgz create mode 100644 navit/xpm/country_LB_16_16.png create mode 100644 navit/xpm/country_LB_32_32.png create mode 100644 navit/xpm/country_LB_48_48.png create mode 100644 navit/xpm/country_LB_8_8.png create mode 100644 navit/xpm/country_LB_96_96.png create mode 100644 navit/xpm/country_LC.svgz create mode 100644 navit/xpm/country_LC_16_16.png create mode 100644 navit/xpm/country_LC_32_32.png create mode 100644 navit/xpm/country_LC_48_48.png create mode 100644 navit/xpm/country_LC_8_8.png create mode 100644 navit/xpm/country_LC_96_96.png create mode 100644 navit/xpm/country_LI.svgz create mode 100644 navit/xpm/country_LI_16_16.png create mode 100644 navit/xpm/country_LI_32_32.png create mode 100644 navit/xpm/country_LI_48_48.png create mode 100644 navit/xpm/country_LI_8_8.png create mode 100644 navit/xpm/country_LI_96_96.png create mode 100644 navit/xpm/country_LK.svgz create mode 100644 navit/xpm/country_LK_16_16.png create mode 100644 navit/xpm/country_LK_32_32.png create mode 100644 navit/xpm/country_LK_48_48.png create mode 100644 navit/xpm/country_LK_8_8.png create mode 100644 navit/xpm/country_LK_96_96.png create mode 100644 navit/xpm/country_LR.svgz create mode 100644 navit/xpm/country_LR_16_16.png create mode 100644 navit/xpm/country_LR_32_32.png create mode 100644 navit/xpm/country_LR_48_48.png create mode 100644 navit/xpm/country_LR_8_8.png create mode 100644 navit/xpm/country_LR_96_96.png create mode 100644 navit/xpm/country_LS.svgz create mode 100644 navit/xpm/country_LS_16_16.png create mode 100644 navit/xpm/country_LS_32_32.png create mode 100644 navit/xpm/country_LS_48_48.png create mode 100644 navit/xpm/country_LS_8_8.png create mode 100644 navit/xpm/country_LS_96_96.png create mode 100644 navit/xpm/country_LT.svgz create mode 100644 navit/xpm/country_LT_16_16.png create mode 100644 navit/xpm/country_LT_32_32.png create mode 100644 navit/xpm/country_LT_48_48.png create mode 100644 navit/xpm/country_LT_8_8.png create mode 100644 navit/xpm/country_LT_96_96.png create mode 100644 navit/xpm/country_LU.svgz create mode 100644 navit/xpm/country_LU_16_16.png create mode 100644 navit/xpm/country_LU_32_32.png create mode 100644 navit/xpm/country_LU_48_48.png create mode 100644 navit/xpm/country_LU_8_8.png create mode 100644 navit/xpm/country_LU_96_96.png create mode 100644 navit/xpm/country_LV.svgz create mode 100644 navit/xpm/country_LV_16_16.png create mode 100644 navit/xpm/country_LV_32_32.png create mode 100644 navit/xpm/country_LV_48_48.png create mode 100644 navit/xpm/country_LV_8_8.png create mode 100644 navit/xpm/country_LV_96_96.png create mode 100644 navit/xpm/country_LY.svgz create mode 100644 navit/xpm/country_LY_16_16.png create mode 100644 navit/xpm/country_LY_32_32.png create mode 100644 navit/xpm/country_LY_48_48.png create mode 100644 navit/xpm/country_LY_8_8.png create mode 100644 navit/xpm/country_LY_96_96.png create mode 100644 navit/xpm/country_MA.svgz create mode 100644 navit/xpm/country_MA_16_16.png create mode 100644 navit/xpm/country_MA_32_32.png create mode 100644 navit/xpm/country_MA_48_48.png create mode 100644 navit/xpm/country_MA_8_8.png create mode 100644 navit/xpm/country_MA_96_96.png create mode 100644 navit/xpm/country_MC.svgz create mode 100644 navit/xpm/country_MC_16_16.png create mode 100644 navit/xpm/country_MC_32_32.png create mode 100644 navit/xpm/country_MC_48_48.png create mode 100644 navit/xpm/country_MC_8_8.png create mode 100644 navit/xpm/country_MC_96_96.png create mode 100644 navit/xpm/country_MD.svgz create mode 100644 navit/xpm/country_MD_16_16.png create mode 100644 navit/xpm/country_MD_32_32.png create mode 100644 navit/xpm/country_MD_48_48.png create mode 100644 navit/xpm/country_MD_8_8.png create mode 100644 navit/xpm/country_MD_96_96.png create mode 100644 navit/xpm/country_ME.svgz create mode 100644 navit/xpm/country_ME_16_16.png create mode 100644 navit/xpm/country_ME_32_32.png create mode 100644 navit/xpm/country_ME_48_48.png create mode 100644 navit/xpm/country_ME_8_8.png create mode 100644 navit/xpm/country_ME_96_96.png create mode 100644 navit/xpm/country_MF.svgz create mode 100644 navit/xpm/country_MF_16_16.png create mode 100644 navit/xpm/country_MF_32_32.png create mode 100644 navit/xpm/country_MF_48_48.png create mode 100644 navit/xpm/country_MF_8_8.png create mode 100644 navit/xpm/country_MF_96_96.png create mode 100644 navit/xpm/country_MG.svgz create mode 100644 navit/xpm/country_MG_16_16.png create mode 100644 navit/xpm/country_MG_32_32.png create mode 100644 navit/xpm/country_MG_48_48.png create mode 100644 navit/xpm/country_MG_8_8.png create mode 100644 navit/xpm/country_MG_96_96.png create mode 100644 navit/xpm/country_MH.svgz create mode 100644 navit/xpm/country_MH_16_16.png create mode 100644 navit/xpm/country_MH_32_32.png create mode 100644 navit/xpm/country_MH_48_48.png create mode 100644 navit/xpm/country_MH_8_8.png create mode 100644 navit/xpm/country_MH_96_96.png create mode 100644 navit/xpm/country_MK.svgz create mode 100644 navit/xpm/country_MK_16_16.png create mode 100644 navit/xpm/country_MK_32_32.png create mode 100644 navit/xpm/country_MK_48_48.png create mode 100644 navit/xpm/country_MK_8_8.png create mode 100644 navit/xpm/country_MK_96_96.png create mode 100644 navit/xpm/country_ML.svgz create mode 100644 navit/xpm/country_ML_16_16.png create mode 100644 navit/xpm/country_ML_32_32.png create mode 100644 navit/xpm/country_ML_48_48.png create mode 100644 navit/xpm/country_ML_8_8.png create mode 100644 navit/xpm/country_ML_96_96.png create mode 100644 navit/xpm/country_MM.svgz create mode 100644 navit/xpm/country_MM_16_16.png create mode 100644 navit/xpm/country_MM_32_32.png create mode 100644 navit/xpm/country_MM_48_48.png create mode 100644 navit/xpm/country_MM_8_8.png create mode 100644 navit/xpm/country_MM_96_96.png create mode 100644 navit/xpm/country_MN.svgz create mode 100644 navit/xpm/country_MN_16_16.png create mode 100644 navit/xpm/country_MN_32_32.png create mode 100644 navit/xpm/country_MN_48_48.png create mode 100644 navit/xpm/country_MN_8_8.png create mode 100644 navit/xpm/country_MN_96_96.png create mode 100644 navit/xpm/country_MO.svgz create mode 100644 navit/xpm/country_MO_16_16.png create mode 100644 navit/xpm/country_MO_32_32.png create mode 100644 navit/xpm/country_MO_48_48.png create mode 100644 navit/xpm/country_MO_8_8.png create mode 100644 navit/xpm/country_MO_96_96.png create mode 100644 navit/xpm/country_MP.svgz create mode 100644 navit/xpm/country_MP_16_16.png create mode 100644 navit/xpm/country_MP_32_32.png create mode 100644 navit/xpm/country_MP_48_48.png create mode 100644 navit/xpm/country_MP_8_8.png create mode 100644 navit/xpm/country_MP_96_96.png create mode 100644 navit/xpm/country_MQ.svgz create mode 100644 navit/xpm/country_MQ_16_16.png create mode 100644 navit/xpm/country_MQ_32_32.png create mode 100644 navit/xpm/country_MQ_48_48.png create mode 100644 navit/xpm/country_MQ_8_8.png create mode 100644 navit/xpm/country_MQ_96_96.png create mode 100644 navit/xpm/country_MR.svgz create mode 100644 navit/xpm/country_MR_16_16.png create mode 100644 navit/xpm/country_MR_32_32.png create mode 100644 navit/xpm/country_MR_48_48.png create mode 100644 navit/xpm/country_MR_8_8.png create mode 100644 navit/xpm/country_MR_96_96.png create mode 100644 navit/xpm/country_MS.svgz create mode 100644 navit/xpm/country_MS_16_16.png create mode 100644 navit/xpm/country_MS_32_32.png create mode 100644 navit/xpm/country_MS_48_48.png create mode 100644 navit/xpm/country_MS_8_8.png create mode 100644 navit/xpm/country_MS_96_96.png create mode 100644 navit/xpm/country_MT.svgz create mode 100644 navit/xpm/country_MT_16_16.png create mode 100644 navit/xpm/country_MT_32_32.png create mode 100644 navit/xpm/country_MT_48_48.png create mode 100644 navit/xpm/country_MT_8_8.png create mode 100644 navit/xpm/country_MT_96_96.png create mode 100644 navit/xpm/country_MU.svgz create mode 100644 navit/xpm/country_MU_16_16.png create mode 100644 navit/xpm/country_MU_32_32.png create mode 100644 navit/xpm/country_MU_48_48.png create mode 100644 navit/xpm/country_MU_8_8.png create mode 100644 navit/xpm/country_MU_96_96.png create mode 100644 navit/xpm/country_MV.svgz create mode 100644 navit/xpm/country_MV_16_16.png create mode 100644 navit/xpm/country_MV_32_32.png create mode 100644 navit/xpm/country_MV_48_48.png create mode 100644 navit/xpm/country_MV_8_8.png create mode 100644 navit/xpm/country_MV_96_96.png create mode 100644 navit/xpm/country_MW.svgz create mode 100644 navit/xpm/country_MW_16_16.png create mode 100644 navit/xpm/country_MW_32_32.png create mode 100644 navit/xpm/country_MW_48_48.png create mode 100644 navit/xpm/country_MW_8_8.png create mode 100644 navit/xpm/country_MW_96_96.png create mode 100644 navit/xpm/country_MX.svgz create mode 100644 navit/xpm/country_MX_16_16.png create mode 100644 navit/xpm/country_MX_32_32.png create mode 100644 navit/xpm/country_MX_48_48.png create mode 100644 navit/xpm/country_MX_8_8.png create mode 100644 navit/xpm/country_MX_96_96.png create mode 100644 navit/xpm/country_MY.svgz create mode 100644 navit/xpm/country_MY_16_16.png create mode 100644 navit/xpm/country_MY_32_32.png create mode 100644 navit/xpm/country_MY_48_48.png create mode 100644 navit/xpm/country_MY_8_8.png create mode 100644 navit/xpm/country_MY_96_96.png create mode 100644 navit/xpm/country_MZ.svgz create mode 100644 navit/xpm/country_MZ_16_16.png create mode 100644 navit/xpm/country_MZ_32_32.png create mode 100644 navit/xpm/country_MZ_48_48.png create mode 100644 navit/xpm/country_MZ_8_8.png create mode 100644 navit/xpm/country_MZ_96_96.png create mode 100644 navit/xpm/country_NA.svgz create mode 100644 navit/xpm/country_NA_16_16.png create mode 100644 navit/xpm/country_NA_32_32.png create mode 100644 navit/xpm/country_NA_48_48.png create mode 100644 navit/xpm/country_NA_8_8.png create mode 100644 navit/xpm/country_NA_96_96.png create mode 100644 navit/xpm/country_NC.svgz create mode 100644 navit/xpm/country_NC_16_16.png create mode 100644 navit/xpm/country_NC_32_32.png create mode 100644 navit/xpm/country_NC_48_48.png create mode 100644 navit/xpm/country_NC_8_8.png create mode 100644 navit/xpm/country_NC_96_96.png create mode 100644 navit/xpm/country_NE.svgz create mode 100644 navit/xpm/country_NE_16_16.png create mode 100644 navit/xpm/country_NE_32_32.png create mode 100644 navit/xpm/country_NE_48_48.png create mode 100644 navit/xpm/country_NE_8_8.png create mode 100644 navit/xpm/country_NE_96_96.png create mode 100644 navit/xpm/country_NF.svgz create mode 100644 navit/xpm/country_NF_16_16.png create mode 100644 navit/xpm/country_NF_32_32.png create mode 100644 navit/xpm/country_NF_48_48.png create mode 100644 navit/xpm/country_NF_8_8.png create mode 100644 navit/xpm/country_NF_96_96.png create mode 100644 navit/xpm/country_NG.svgz create mode 100644 navit/xpm/country_NG_16_16.png create mode 100644 navit/xpm/country_NG_32_32.png create mode 100644 navit/xpm/country_NG_48_48.png create mode 100644 navit/xpm/country_NG_8_8.png create mode 100644 navit/xpm/country_NG_96_96.png create mode 100644 navit/xpm/country_NI.svgz create mode 100644 navit/xpm/country_NI_16_16.png create mode 100644 navit/xpm/country_NI_32_32.png create mode 100644 navit/xpm/country_NI_48_48.png create mode 100644 navit/xpm/country_NI_8_8.png create mode 100644 navit/xpm/country_NI_96_96.png create mode 100644 navit/xpm/country_NL.svgz create mode 100644 navit/xpm/country_NL_16_16.png create mode 100644 navit/xpm/country_NL_32_32.png create mode 100644 navit/xpm/country_NL_48_48.png create mode 100644 navit/xpm/country_NL_8_8.png create mode 100644 navit/xpm/country_NL_96_96.png create mode 100644 navit/xpm/country_NO.svgz create mode 100644 navit/xpm/country_NO_16_16.png create mode 100644 navit/xpm/country_NO_32_32.png create mode 100644 navit/xpm/country_NO_48_48.png create mode 100644 navit/xpm/country_NO_8_8.png create mode 100644 navit/xpm/country_NO_96_96.png create mode 100644 navit/xpm/country_NP.svgz create mode 100644 navit/xpm/country_NP_16_16.png create mode 100644 navit/xpm/country_NP_32_32.png create mode 100644 navit/xpm/country_NP_48_48.png create mode 100644 navit/xpm/country_NP_8_8.png create mode 100644 navit/xpm/country_NP_96_96.png create mode 100644 navit/xpm/country_NR.svgz create mode 100644 navit/xpm/country_NR_16_16.png create mode 100644 navit/xpm/country_NR_32_32.png create mode 100644 navit/xpm/country_NR_48_48.png create mode 100644 navit/xpm/country_NR_8_8.png create mode 100644 navit/xpm/country_NR_96_96.png create mode 100644 navit/xpm/country_NU.svgz create mode 100644 navit/xpm/country_NU_16_16.png create mode 100644 navit/xpm/country_NU_32_32.png create mode 100644 navit/xpm/country_NU_48_48.png create mode 100644 navit/xpm/country_NU_8_8.png create mode 100644 navit/xpm/country_NU_96_96.png create mode 100644 navit/xpm/country_NZ.svgz create mode 100644 navit/xpm/country_NZ_16_16.png create mode 100644 navit/xpm/country_NZ_32_32.png create mode 100644 navit/xpm/country_NZ_48_48.png create mode 100644 navit/xpm/country_NZ_8_8.png create mode 100644 navit/xpm/country_NZ_96_96.png create mode 100644 navit/xpm/country_OM.svgz create mode 100644 navit/xpm/country_OM_16_16.png create mode 100644 navit/xpm/country_OM_32_32.png create mode 100644 navit/xpm/country_OM_48_48.png create mode 100644 navit/xpm/country_OM_8_8.png create mode 100644 navit/xpm/country_OM_96_96.png create mode 100644 navit/xpm/country_PA.svgz create mode 100644 navit/xpm/country_PA_16_16.png create mode 100644 navit/xpm/country_PA_32_32.png create mode 100644 navit/xpm/country_PA_48_48.png create mode 100644 navit/xpm/country_PA_8_8.png create mode 100644 navit/xpm/country_PA_96_96.png create mode 100644 navit/xpm/country_PE.svgz create mode 100644 navit/xpm/country_PE_16_16.png create mode 100644 navit/xpm/country_PE_32_32.png create mode 100644 navit/xpm/country_PE_48_48.png create mode 100644 navit/xpm/country_PE_8_8.png create mode 100644 navit/xpm/country_PE_96_96.png create mode 100644 navit/xpm/country_PF.svgz create mode 100644 navit/xpm/country_PF_16_16.png create mode 100644 navit/xpm/country_PF_32_32.png create mode 100644 navit/xpm/country_PF_48_48.png create mode 100644 navit/xpm/country_PF_8_8.png create mode 100644 navit/xpm/country_PF_96_96.png create mode 100644 navit/xpm/country_PG.svgz create mode 100644 navit/xpm/country_PG_16_16.png create mode 100644 navit/xpm/country_PG_32_32.png create mode 100644 navit/xpm/country_PG_48_48.png create mode 100644 navit/xpm/country_PG_8_8.png create mode 100644 navit/xpm/country_PG_96_96.png create mode 100644 navit/xpm/country_PH.svgz create mode 100644 navit/xpm/country_PH_16_16.png create mode 100644 navit/xpm/country_PH_32_32.png create mode 100644 navit/xpm/country_PH_48_48.png create mode 100644 navit/xpm/country_PH_8_8.png create mode 100644 navit/xpm/country_PH_96_96.png create mode 100644 navit/xpm/country_PK.svgz create mode 100644 navit/xpm/country_PK_16_16.png create mode 100644 navit/xpm/country_PK_32_32.png create mode 100644 navit/xpm/country_PK_48_48.png create mode 100644 navit/xpm/country_PK_8_8.png create mode 100644 navit/xpm/country_PK_96_96.png create mode 100644 navit/xpm/country_PL.svgz create mode 100644 navit/xpm/country_PL_16_16.png create mode 100644 navit/xpm/country_PL_32_32.png create mode 100644 navit/xpm/country_PL_48_48.png create mode 100644 navit/xpm/country_PL_8_8.png create mode 100644 navit/xpm/country_PL_96_96.png create mode 100644 navit/xpm/country_PM.svgz create mode 100644 navit/xpm/country_PM_16_16.png create mode 100644 navit/xpm/country_PM_32_32.png create mode 100644 navit/xpm/country_PM_48_48.png create mode 100644 navit/xpm/country_PM_8_8.png create mode 100644 navit/xpm/country_PM_96_96.png create mode 100644 navit/xpm/country_PN.svgz create mode 100644 navit/xpm/country_PN_16_16.png create mode 100644 navit/xpm/country_PN_32_32.png create mode 100644 navit/xpm/country_PN_48_48.png create mode 100644 navit/xpm/country_PN_8_8.png create mode 100644 navit/xpm/country_PN_96_96.png create mode 100644 navit/xpm/country_PR.svgz create mode 100644 navit/xpm/country_PR_16_16.png create mode 100644 navit/xpm/country_PR_32_32.png create mode 100644 navit/xpm/country_PR_48_48.png create mode 100644 navit/xpm/country_PR_8_8.png create mode 100644 navit/xpm/country_PR_96_96.png create mode 100644 navit/xpm/country_PS.svgz create mode 100644 navit/xpm/country_PS_16_16.png create mode 100644 navit/xpm/country_PS_32_32.png create mode 100644 navit/xpm/country_PS_48_48.png create mode 100644 navit/xpm/country_PS_8_8.png create mode 100644 navit/xpm/country_PS_96_96.png create mode 100644 navit/xpm/country_PT.svgz create mode 100644 navit/xpm/country_PT_16_16.png create mode 100644 navit/xpm/country_PT_32_32.png create mode 100644 navit/xpm/country_PT_48_48.png create mode 100644 navit/xpm/country_PT_8_8.png create mode 100644 navit/xpm/country_PT_96_96.png create mode 100644 navit/xpm/country_PW.svgz create mode 100644 navit/xpm/country_PW_16_16.png create mode 100644 navit/xpm/country_PW_32_32.png create mode 100644 navit/xpm/country_PW_48_48.png create mode 100644 navit/xpm/country_PW_8_8.png create mode 100644 navit/xpm/country_PW_96_96.png create mode 100644 navit/xpm/country_PY.svgz create mode 100644 navit/xpm/country_PY_16_16.png create mode 100644 navit/xpm/country_PY_32_32.png create mode 100644 navit/xpm/country_PY_48_48.png create mode 100644 navit/xpm/country_PY_8_8.png create mode 100644 navit/xpm/country_PY_96_96.png create mode 100644 navit/xpm/country_QA.svgz create mode 100644 navit/xpm/country_QA_16_16.png create mode 100644 navit/xpm/country_QA_32_32.png create mode 100644 navit/xpm/country_QA_48_48.png create mode 100644 navit/xpm/country_QA_8_8.png create mode 100644 navit/xpm/country_QA_96_96.png create mode 100644 navit/xpm/country_RE.svgz create mode 100644 navit/xpm/country_RE_16_16.png create mode 100644 navit/xpm/country_RE_32_32.png create mode 100644 navit/xpm/country_RE_48_48.png create mode 100644 navit/xpm/country_RE_8_8.png create mode 100644 navit/xpm/country_RE_96_96.png create mode 100644 navit/xpm/country_RO.svgz create mode 100644 navit/xpm/country_RO_16_16.png create mode 100644 navit/xpm/country_RO_32_32.png create mode 100644 navit/xpm/country_RO_48_48.png create mode 100644 navit/xpm/country_RO_8_8.png create mode 100644 navit/xpm/country_RO_96_96.png create mode 100644 navit/xpm/country_RS.svgz create mode 100644 navit/xpm/country_RS_16_16.png create mode 100644 navit/xpm/country_RS_32_32.png create mode 100644 navit/xpm/country_RS_48_48.png create mode 100644 navit/xpm/country_RS_8_8.png create mode 100644 navit/xpm/country_RS_96_96.png create mode 100644 navit/xpm/country_RU.svgz create mode 100644 navit/xpm/country_RU_16_16.png create mode 100644 navit/xpm/country_RU_32_32.png create mode 100644 navit/xpm/country_RU_48_48.png create mode 100644 navit/xpm/country_RU_8_8.png create mode 100644 navit/xpm/country_RU_96_96.png create mode 100644 navit/xpm/country_RW.svgz create mode 100644 navit/xpm/country_RW_16_16.png create mode 100644 navit/xpm/country_RW_32_32.png create mode 100644 navit/xpm/country_RW_48_48.png create mode 100644 navit/xpm/country_RW_8_8.png create mode 100644 navit/xpm/country_RW_96_96.png create mode 100644 navit/xpm/country_SA.svgz create mode 100644 navit/xpm/country_SA_16_16.png create mode 100644 navit/xpm/country_SA_32_32.png create mode 100644 navit/xpm/country_SA_48_48.png create mode 100644 navit/xpm/country_SA_8_8.png create mode 100644 navit/xpm/country_SA_96_96.png create mode 100644 navit/xpm/country_SB.svgz create mode 100644 navit/xpm/country_SB_16_16.png create mode 100644 navit/xpm/country_SB_32_32.png create mode 100644 navit/xpm/country_SB_48_48.png create mode 100644 navit/xpm/country_SB_8_8.png create mode 100644 navit/xpm/country_SB_96_96.png create mode 100644 navit/xpm/country_SC.svgz create mode 100644 navit/xpm/country_SC_16_16.png create mode 100644 navit/xpm/country_SC_32_32.png create mode 100644 navit/xpm/country_SC_48_48.png create mode 100644 navit/xpm/country_SC_8_8.png create mode 100644 navit/xpm/country_SC_96_96.png create mode 100644 navit/xpm/country_SD.svgz create mode 100644 navit/xpm/country_SD_16_16.png create mode 100644 navit/xpm/country_SD_32_32.png create mode 100644 navit/xpm/country_SD_48_48.png create mode 100644 navit/xpm/country_SD_8_8.png create mode 100644 navit/xpm/country_SD_96_96.png create mode 100644 navit/xpm/country_SE.svgz create mode 100644 navit/xpm/country_SE_16_16.png create mode 100644 navit/xpm/country_SE_32_32.png create mode 100644 navit/xpm/country_SE_48_48.png create mode 100644 navit/xpm/country_SE_8_8.png create mode 100644 navit/xpm/country_SE_96_96.png create mode 100644 navit/xpm/country_SG.svgz create mode 100644 navit/xpm/country_SG_16_16.png create mode 100644 navit/xpm/country_SG_32_32.png create mode 100644 navit/xpm/country_SG_48_48.png create mode 100644 navit/xpm/country_SG_8_8.png create mode 100644 navit/xpm/country_SG_96_96.png create mode 100644 navit/xpm/country_SH.svgz create mode 100644 navit/xpm/country_SH_16_16.png create mode 100644 navit/xpm/country_SH_32_32.png create mode 100644 navit/xpm/country_SH_48_48.png create mode 100644 navit/xpm/country_SH_8_8.png create mode 100644 navit/xpm/country_SH_96_96.png create mode 100644 navit/xpm/country_SI.svgz create mode 100644 navit/xpm/country_SI_16_16.png create mode 100644 navit/xpm/country_SI_32_32.png create mode 100644 navit/xpm/country_SI_48_48.png create mode 100644 navit/xpm/country_SI_8_8.png create mode 100644 navit/xpm/country_SI_96_96.png create mode 100644 navit/xpm/country_SJ.svgz create mode 100644 navit/xpm/country_SJ_16_16.png create mode 100644 navit/xpm/country_SJ_32_32.png create mode 100644 navit/xpm/country_SJ_48_48.png create mode 100644 navit/xpm/country_SJ_8_8.png create mode 100644 navit/xpm/country_SJ_96_96.png create mode 100644 navit/xpm/country_SK.svgz create mode 100644 navit/xpm/country_SK_16_16.png create mode 100644 navit/xpm/country_SK_32_32.png create mode 100644 navit/xpm/country_SK_48_48.png create mode 100644 navit/xpm/country_SK_8_8.png create mode 100644 navit/xpm/country_SK_96_96.png create mode 100644 navit/xpm/country_SL.svgz create mode 100644 navit/xpm/country_SL_16_16.png create mode 100644 navit/xpm/country_SL_32_32.png create mode 100644 navit/xpm/country_SL_48_48.png create mode 100644 navit/xpm/country_SL_8_8.png create mode 100644 navit/xpm/country_SL_96_96.png create mode 100644 navit/xpm/country_SM.svgz create mode 100644 navit/xpm/country_SM_16_16.png create mode 100644 navit/xpm/country_SM_32_32.png create mode 100644 navit/xpm/country_SM_48_48.png create mode 100644 navit/xpm/country_SM_8_8.png create mode 100644 navit/xpm/country_SM_96_96.png create mode 100644 navit/xpm/country_SN.svgz create mode 100644 navit/xpm/country_SN_16_16.png create mode 100644 navit/xpm/country_SN_32_32.png create mode 100644 navit/xpm/country_SN_48_48.png create mode 100644 navit/xpm/country_SN_8_8.png create mode 100644 navit/xpm/country_SN_96_96.png create mode 100644 navit/xpm/country_SO.svgz create mode 100644 navit/xpm/country_SO_16_16.png create mode 100644 navit/xpm/country_SO_32_32.png create mode 100644 navit/xpm/country_SO_48_48.png create mode 100644 navit/xpm/country_SO_8_8.png create mode 100644 navit/xpm/country_SO_96_96.png create mode 100644 navit/xpm/country_SR.svgz create mode 100644 navit/xpm/country_SR_16_16.png create mode 100644 navit/xpm/country_SR_32_32.png create mode 100644 navit/xpm/country_SR_48_48.png create mode 100644 navit/xpm/country_SR_8_8.png create mode 100644 navit/xpm/country_SR_96_96.png create mode 100644 navit/xpm/country_ST.svgz create mode 100644 navit/xpm/country_ST_16_16.png create mode 100644 navit/xpm/country_ST_32_32.png create mode 100644 navit/xpm/country_ST_48_48.png create mode 100644 navit/xpm/country_ST_8_8.png create mode 100644 navit/xpm/country_ST_96_96.png create mode 100644 navit/xpm/country_SV.svgz create mode 100644 navit/xpm/country_SV_16_16.png create mode 100644 navit/xpm/country_SV_32_32.png create mode 100644 navit/xpm/country_SV_48_48.png create mode 100644 navit/xpm/country_SV_8_8.png create mode 100644 navit/xpm/country_SV_96_96.png create mode 100644 navit/xpm/country_SY.svgz create mode 100644 navit/xpm/country_SY_16_16.png create mode 100644 navit/xpm/country_SY_32_32.png create mode 100644 navit/xpm/country_SY_48_48.png create mode 100644 navit/xpm/country_SY_8_8.png create mode 100644 navit/xpm/country_SY_96_96.png create mode 100644 navit/xpm/country_SZ.svgz create mode 100644 navit/xpm/country_SZ_16_16.png create mode 100644 navit/xpm/country_SZ_32_32.png create mode 100644 navit/xpm/country_SZ_48_48.png create mode 100644 navit/xpm/country_SZ_8_8.png create mode 100644 navit/xpm/country_SZ_96_96.png create mode 100644 navit/xpm/country_TC.svgz create mode 100644 navit/xpm/country_TC_16_16.png create mode 100644 navit/xpm/country_TC_32_32.png create mode 100644 navit/xpm/country_TC_48_48.png create mode 100644 navit/xpm/country_TC_8_8.png create mode 100644 navit/xpm/country_TC_96_96.png create mode 100644 navit/xpm/country_TD.svgz create mode 100644 navit/xpm/country_TD_16_16.png create mode 100644 navit/xpm/country_TD_32_32.png create mode 100644 navit/xpm/country_TD_48_48.png create mode 100644 navit/xpm/country_TD_8_8.png create mode 100644 navit/xpm/country_TD_96_96.png create mode 100644 navit/xpm/country_TF.svgz create mode 100644 navit/xpm/country_TF_16_16.png create mode 100644 navit/xpm/country_TF_32_32.png create mode 100644 navit/xpm/country_TF_48_48.png create mode 100644 navit/xpm/country_TF_8_8.png create mode 100644 navit/xpm/country_TF_96_96.png create mode 100644 navit/xpm/country_TG.svgz create mode 100644 navit/xpm/country_TG_16_16.png create mode 100644 navit/xpm/country_TG_32_32.png create mode 100644 navit/xpm/country_TG_48_48.png create mode 100644 navit/xpm/country_TG_8_8.png create mode 100644 navit/xpm/country_TG_96_96.png create mode 100644 navit/xpm/country_TH.svgz create mode 100644 navit/xpm/country_TH_16_16.png create mode 100644 navit/xpm/country_TH_32_32.png create mode 100644 navit/xpm/country_TH_48_48.png create mode 100644 navit/xpm/country_TH_8_8.png create mode 100644 navit/xpm/country_TH_96_96.png create mode 100644 navit/xpm/country_TJ.svgz create mode 100644 navit/xpm/country_TJ_16_16.png create mode 100644 navit/xpm/country_TJ_32_32.png create mode 100644 navit/xpm/country_TJ_48_48.png create mode 100644 navit/xpm/country_TJ_8_8.png create mode 100644 navit/xpm/country_TJ_96_96.png create mode 100644 navit/xpm/country_TK.svgz create mode 100644 navit/xpm/country_TK_16_16.png create mode 100644 navit/xpm/country_TK_32_32.png create mode 100644 navit/xpm/country_TK_48_48.png create mode 100644 navit/xpm/country_TK_8_8.png create mode 100644 navit/xpm/country_TK_96_96.png create mode 100644 navit/xpm/country_TL.svgz create mode 100644 navit/xpm/country_TL_16_16.png create mode 100644 navit/xpm/country_TL_32_32.png create mode 100644 navit/xpm/country_TL_48_48.png create mode 100644 navit/xpm/country_TL_8_8.png create mode 100644 navit/xpm/country_TL_96_96.png create mode 100644 navit/xpm/country_TM.svgz create mode 100644 navit/xpm/country_TM_16_16.png create mode 100644 navit/xpm/country_TM_32_32.png create mode 100644 navit/xpm/country_TM_48_48.png create mode 100644 navit/xpm/country_TM_8_8.png create mode 100644 navit/xpm/country_TM_96_96.png create mode 100644 navit/xpm/country_TN.svgz create mode 100644 navit/xpm/country_TN_16_16.png create mode 100644 navit/xpm/country_TN_32_32.png create mode 100644 navit/xpm/country_TN_48_48.png create mode 100644 navit/xpm/country_TN_8_8.png create mode 100644 navit/xpm/country_TN_96_96.png create mode 100644 navit/xpm/country_TO.svgz create mode 100644 navit/xpm/country_TO_16_16.png create mode 100644 navit/xpm/country_TO_32_32.png create mode 100644 navit/xpm/country_TO_48_48.png create mode 100644 navit/xpm/country_TO_8_8.png create mode 100644 navit/xpm/country_TO_96_96.png create mode 100644 navit/xpm/country_TR.svgz create mode 100644 navit/xpm/country_TR_16_16.png create mode 100644 navit/xpm/country_TR_32_32.png create mode 100644 navit/xpm/country_TR_48_48.png create mode 100644 navit/xpm/country_TR_8_8.png create mode 100644 navit/xpm/country_TR_96_96.png create mode 100644 navit/xpm/country_TT.svgz create mode 100644 navit/xpm/country_TT_16_16.png create mode 100644 navit/xpm/country_TT_32_32.png create mode 100644 navit/xpm/country_TT_48_48.png create mode 100644 navit/xpm/country_TT_8_8.png create mode 100644 navit/xpm/country_TT_96_96.png create mode 100644 navit/xpm/country_TV.svgz create mode 100644 navit/xpm/country_TV_16_16.png create mode 100644 navit/xpm/country_TV_32_32.png create mode 100644 navit/xpm/country_TV_48_48.png create mode 100644 navit/xpm/country_TV_8_8.png create mode 100644 navit/xpm/country_TV_96_96.png create mode 100644 navit/xpm/country_TW.svgz create mode 100644 navit/xpm/country_TW_16_16.png create mode 100644 navit/xpm/country_TW_32_32.png create mode 100644 navit/xpm/country_TW_48_48.png create mode 100644 navit/xpm/country_TW_8_8.png create mode 100644 navit/xpm/country_TW_96_96.png create mode 100644 navit/xpm/country_TZ.svgz create mode 100644 navit/xpm/country_TZ_16_16.png create mode 100644 navit/xpm/country_TZ_32_32.png create mode 100644 navit/xpm/country_TZ_48_48.png create mode 100644 navit/xpm/country_TZ_8_8.png create mode 100644 navit/xpm/country_TZ_96_96.png create mode 100644 navit/xpm/country_UA.svgz create mode 100644 navit/xpm/country_UA_16_16.png create mode 100644 navit/xpm/country_UA_32_32.png create mode 100644 navit/xpm/country_UA_48_48.png create mode 100644 navit/xpm/country_UA_8_8.png create mode 100644 navit/xpm/country_UA_96_96.png create mode 100644 navit/xpm/country_UG.svgz create mode 100644 navit/xpm/country_UG_16_16.png create mode 100644 navit/xpm/country_UG_32_32.png create mode 100644 navit/xpm/country_UG_48_48.png create mode 100644 navit/xpm/country_UG_8_8.png create mode 100644 navit/xpm/country_UG_96_96.png create mode 100644 navit/xpm/country_UM.svgz create mode 100644 navit/xpm/country_UM_16_16.png create mode 100644 navit/xpm/country_UM_32_32.png create mode 100644 navit/xpm/country_UM_48_48.png create mode 100644 navit/xpm/country_UM_8_8.png create mode 100644 navit/xpm/country_UM_96_96.png create mode 100644 navit/xpm/country_US.svgz create mode 100644 navit/xpm/country_US_16_16.png create mode 100644 navit/xpm/country_US_32_32.png create mode 100644 navit/xpm/country_US_48_48.png create mode 100644 navit/xpm/country_US_8_8.png create mode 100644 navit/xpm/country_US_96_96.png create mode 100644 navit/xpm/country_UY.svgz create mode 100644 navit/xpm/country_UY_16_16.png create mode 100644 navit/xpm/country_UY_32_32.png create mode 100644 navit/xpm/country_UY_48_48.png create mode 100644 navit/xpm/country_UY_8_8.png create mode 100644 navit/xpm/country_UY_96_96.png create mode 100644 navit/xpm/country_UZ.svgz create mode 100644 navit/xpm/country_UZ_16_16.png create mode 100644 navit/xpm/country_UZ_32_32.png create mode 100644 navit/xpm/country_UZ_48_48.png create mode 100644 navit/xpm/country_UZ_8_8.png create mode 100644 navit/xpm/country_UZ_96_96.png create mode 100644 navit/xpm/country_VA.svgz create mode 100644 navit/xpm/country_VA_16_16.png create mode 100644 navit/xpm/country_VA_32_32.png create mode 100644 navit/xpm/country_VA_48_48.png create mode 100644 navit/xpm/country_VA_8_8.png create mode 100644 navit/xpm/country_VA_96_96.png create mode 100644 navit/xpm/country_VC.svgz create mode 100644 navit/xpm/country_VC_16_16.png create mode 100644 navit/xpm/country_VC_32_32.png create mode 100644 navit/xpm/country_VC_48_48.png create mode 100644 navit/xpm/country_VC_8_8.png create mode 100644 navit/xpm/country_VC_96_96.png create mode 100644 navit/xpm/country_VE.svgz create mode 100644 navit/xpm/country_VE_16_16.png create mode 100644 navit/xpm/country_VE_32_32.png create mode 100644 navit/xpm/country_VE_48_48.png create mode 100644 navit/xpm/country_VE_8_8.png create mode 100644 navit/xpm/country_VE_96_96.png create mode 100644 navit/xpm/country_VG.svgz create mode 100644 navit/xpm/country_VG_16_16.png create mode 100644 navit/xpm/country_VG_32_32.png create mode 100644 navit/xpm/country_VG_48_48.png create mode 100644 navit/xpm/country_VG_8_8.png create mode 100644 navit/xpm/country_VG_96_96.png create mode 100644 navit/xpm/country_VI.svgz create mode 100644 navit/xpm/country_VI_16_16.png create mode 100644 navit/xpm/country_VI_32_32.png create mode 100644 navit/xpm/country_VI_48_48.png create mode 100644 navit/xpm/country_VI_8_8.png create mode 100644 navit/xpm/country_VI_96_96.png create mode 100644 navit/xpm/country_VN.svgz create mode 100644 navit/xpm/country_VN_16_16.png create mode 100644 navit/xpm/country_VN_32_32.png create mode 100644 navit/xpm/country_VN_48_48.png create mode 100644 navit/xpm/country_VN_8_8.png create mode 100644 navit/xpm/country_VN_96_96.png create mode 100644 navit/xpm/country_VU.svgz create mode 100644 navit/xpm/country_VU_16_16.png create mode 100644 navit/xpm/country_VU_32_32.png create mode 100644 navit/xpm/country_VU_48_48.png create mode 100644 navit/xpm/country_VU_8_8.png create mode 100644 navit/xpm/country_VU_96_96.png create mode 100644 navit/xpm/country_WF.svgz create mode 100644 navit/xpm/country_WF_16_16.png create mode 100644 navit/xpm/country_WF_32_32.png create mode 100644 navit/xpm/country_WF_48_48.png create mode 100644 navit/xpm/country_WF_8_8.png create mode 100644 navit/xpm/country_WF_96_96.png create mode 100644 navit/xpm/country_WS.svgz create mode 100644 navit/xpm/country_WS_16_16.png create mode 100644 navit/xpm/country_WS_32_32.png create mode 100644 navit/xpm/country_WS_48_48.png create mode 100644 navit/xpm/country_WS_8_8.png create mode 100644 navit/xpm/country_WS_96_96.png create mode 100644 navit/xpm/country_YE.svgz create mode 100644 navit/xpm/country_YE_16_16.png create mode 100644 navit/xpm/country_YE_32_32.png create mode 100644 navit/xpm/country_YE_48_48.png create mode 100644 navit/xpm/country_YE_8_8.png create mode 100644 navit/xpm/country_YE_96_96.png create mode 100644 navit/xpm/country_YT.svgz create mode 100644 navit/xpm/country_YT_16_16.png create mode 100644 navit/xpm/country_YT_32_32.png create mode 100644 navit/xpm/country_YT_48_48.png create mode 100644 navit/xpm/country_YT_8_8.png create mode 100644 navit/xpm/country_YT_96_96.png create mode 100644 navit/xpm/country_ZA.svgz create mode 100644 navit/xpm/country_ZA_16_16.png create mode 100644 navit/xpm/country_ZA_32_32.png create mode 100644 navit/xpm/country_ZA_48_48.png create mode 100644 navit/xpm/country_ZA_8_8.png create mode 100644 navit/xpm/country_ZA_96_96.png create mode 100644 navit/xpm/country_ZM.svgz create mode 100644 navit/xpm/country_ZM_16_16.png create mode 100644 navit/xpm/country_ZM_32_32.png create mode 100644 navit/xpm/country_ZM_48_48.png create mode 100644 navit/xpm/country_ZM_8_8.png create mode 100644 navit/xpm/country_ZM_96_96.png create mode 100644 navit/xpm/country_ZW.svgz create mode 100644 navit/xpm/country_ZW_16_16.png create mode 100644 navit/xpm/country_ZW_32_32.png create mode 100644 navit/xpm/country_ZW_48_48.png create mode 100644 navit/xpm/country_ZW_8_8.png create mode 100644 navit/xpm/country_ZW_96_96.png create mode 100644 navit/xpm/country__16_16.png create mode 100644 navit/xpm/country__32_32.png create mode 100644 navit/xpm/country__48_48.png create mode 100644 navit/xpm/country__8_8.png create mode 100644 navit/xpm/country__96_96.png create mode 100644 navit/xpm/cursor.png create mode 100644 navit/xpm/cursor.svg create mode 100644 navit/xpm/cursor_16_16.png create mode 100644 navit/xpm/cursor_32_32.png create mode 100644 navit/xpm/cursor_48_48.png create mode 100644 navit/xpm/cursor_8_8.png create mode 100644 navit/xpm/cursor_96_96.png create mode 100644 navit/xpm/danger.png create mode 100644 navit/xpm/danger.svg create mode 100644 navit/xpm/danger_16_16.png create mode 100644 navit/xpm/danger_32_32.png create mode 100644 navit/xpm/danger_48_48.png create mode 100644 navit/xpm/danger_8_8.png create mode 100644 navit/xpm/danger_96_96.png create mode 100644 navit/xpm/desktop_icons/128x128/navit.png create mode 100644 navit/xpm/desktop_icons/22x22/navit.png create mode 100644 navit/xpm/desktop_icons/navit.desktop create mode 100644 navit/xpm/dumping_station.xpm create mode 100644 navit/xpm/exit.png create mode 100644 navit/xpm/exit.svg create mode 100644 navit/xpm/exit_16_16.png create mode 100644 navit/xpm/exit_32_32.png create mode 100644 navit/xpm/exit_48_48.png create mode 100644 navit/xpm/exit_8_8.png create mode 100644 navit/xpm/exit_96_96.png create mode 100644 navit/xpm/fastfood.png create mode 100644 navit/xpm/fastfood.svg create mode 100644 navit/xpm/fastfood_16_16.png create mode 100644 navit/xpm/fastfood_32_32.png create mode 100644 navit/xpm/fastfood_48_48.png create mode 100644 navit/xpm/fastfood_8_8.png create mode 100644 navit/xpm/fastfood_96_96.png create mode 100644 navit/xpm/firebrigade.png create mode 100644 navit/xpm/firebrigade.svg create mode 100644 navit/xpm/firebrigade_16_16.png create mode 100644 navit/xpm/firebrigade_32_32.png create mode 100644 navit/xpm/firebrigade_48_48.png create mode 100644 navit/xpm/firebrigade_8_8.png create mode 100644 navit/xpm/firebrigade_96_96.png create mode 100644 navit/xpm/flag_bk_tr.xpm create mode 100644 navit/xpm/flag_bk_wh.xpm create mode 100644 navit/xpm/flag_bl_wh.xpm create mode 100644 navit/xpm/flag_wh_bk.xpm create mode 100644 navit/xpm/fountain.png create mode 100644 navit/xpm/fountain.svg create mode 100644 navit/xpm/fountain_16_16.png create mode 100644 navit/xpm/fountain_32_32.png create mode 100644 navit/xpm/fountain_48_48.png create mode 100644 navit/xpm/fountain_8_8.png create mode 100644 navit/xpm/fountain_96_96.png create mode 100644 navit/xpm/fuel.png create mode 100644 navit/xpm/fuel.svg create mode 100644 navit/xpm/fuel_16_16.png create mode 100644 navit/xpm/fuel_32_32.png create mode 100644 navit/xpm/fuel_48_48.png create mode 100644 navit/xpm/fuel_8_8.png create mode 100644 navit/xpm/fuel_96_96.png create mode 100644 navit/xpm/gc_event.xpm create mode 100644 navit/xpm/gc_multi.xpm create mode 100644 navit/xpm/gc_mystery.xpm create mode 100644 navit/xpm/gc_question.xpm create mode 100644 navit/xpm/gc_reference.xpm create mode 100644 navit/xpm/gc_stages.xpm create mode 100644 navit/xpm/gc_tradi.xpm create mode 100644 navit/xpm/gc_webcam.xpm create mode 100644 navit/xpm/golf.png create mode 100644 navit/xpm/golf.svg create mode 100644 navit/xpm/golf_16_16.png create mode 100644 navit/xpm/golf_32_32.png create mode 100644 navit/xpm/golf_48_48.png create mode 100644 navit/xpm/golf_8_8.png create mode 100644 navit/xpm/golf_96_96.png create mode 100644 navit/xpm/gui_about.png create mode 100644 navit/xpm/gui_about.svg create mode 100644 navit/xpm/gui_about_16_16.png create mode 100644 navit/xpm/gui_about_32_32.png create mode 100644 navit/xpm/gui_about_48_48.png create mode 100644 navit/xpm/gui_about_8_8.png create mode 100644 navit/xpm/gui_about_96_96.png create mode 100644 navit/xpm/gui_actions.png create mode 100644 navit/xpm/gui_actions.svg create mode 100644 navit/xpm/gui_actions_16_16.png create mode 100644 navit/xpm/gui_actions_32_32.png create mode 100644 navit/xpm/gui_actions_48_48.png create mode 100644 navit/xpm/gui_actions_8_8.png create mode 100644 navit/xpm/gui_actions_96_96.png create mode 100644 navit/xpm/gui_active.png create mode 100644 navit/xpm/gui_active.svg create mode 100644 navit/xpm/gui_active_16_16.png create mode 100644 navit/xpm/gui_active_32_32.png create mode 100644 navit/xpm/gui_active_48_48.png create mode 100644 navit/xpm/gui_active_8_8.png create mode 100644 navit/xpm/gui_active_96_96.png create mode 100644 navit/xpm/gui_arrow_down.png create mode 100644 navit/xpm/gui_arrow_down.svg create mode 100644 navit/xpm/gui_arrow_down_16_16.png create mode 100644 navit/xpm/gui_arrow_down_32_32.png create mode 100644 navit/xpm/gui_arrow_down_48_48.png create mode 100644 navit/xpm/gui_arrow_down_8_8.png create mode 100644 navit/xpm/gui_arrow_down_96_96.png create mode 100644 navit/xpm/gui_arrow_left.png create mode 100644 navit/xpm/gui_arrow_left.svg create mode 100644 navit/xpm/gui_arrow_left_16_16.png create mode 100644 navit/xpm/gui_arrow_left_32_32.png create mode 100644 navit/xpm/gui_arrow_left_48_48.png create mode 100644 navit/xpm/gui_arrow_left_8_8.png create mode 100644 navit/xpm/gui_arrow_left_96_96.png create mode 100644 navit/xpm/gui_arrow_right.png create mode 100644 navit/xpm/gui_arrow_right.svg create mode 100644 navit/xpm/gui_arrow_right_16_16.png create mode 100644 navit/xpm/gui_arrow_right_32_32.png create mode 100644 navit/xpm/gui_arrow_right_48_48.png create mode 100644 navit/xpm/gui_arrow_right_8_8.png create mode 100644 navit/xpm/gui_arrow_right_96_96.png create mode 100644 navit/xpm/gui_arrow_up.png create mode 100644 navit/xpm/gui_arrow_up.svg create mode 100644 navit/xpm/gui_arrow_up_16_16.png create mode 100644 navit/xpm/gui_arrow_up_32_32.png create mode 100644 navit/xpm/gui_arrow_up_48_48.png create mode 100644 navit/xpm/gui_arrow_up_8_8.png create mode 100644 navit/xpm/gui_arrow_up_96_96.png create mode 100644 navit/xpm/gui_bookmark.png create mode 100644 navit/xpm/gui_bookmark.svg create mode 100644 navit/xpm/gui_bookmark_16_16.png create mode 100644 navit/xpm/gui_bookmark_32_32.png create mode 100644 navit/xpm/gui_bookmark_48_48.png create mode 100644 navit/xpm/gui_bookmark_8_8.png create mode 100644 navit/xpm/gui_bookmark_96_96.png create mode 100644 navit/xpm/gui_display.png create mode 100644 navit/xpm/gui_display.svg create mode 100644 navit/xpm/gui_display_16_16.png create mode 100644 navit/xpm/gui_display_32_32.png create mode 100644 navit/xpm/gui_display_48_48.png create mode 100644 navit/xpm/gui_display_8_8.png create mode 100644 navit/xpm/gui_display_96_96.png create mode 100644 navit/xpm/gui_formerdests.png create mode 100644 navit/xpm/gui_formerdests.svg create mode 100644 navit/xpm/gui_formerdests_16_16.png create mode 100644 navit/xpm/gui_formerdests_32_32.png create mode 100644 navit/xpm/gui_formerdests_48_48.png create mode 100644 navit/xpm/gui_formerdests_8_8.png create mode 100644 navit/xpm/gui_formerdests_96_96.png create mode 100644 navit/xpm/gui_fullscreen.png create mode 100644 navit/xpm/gui_fullscreen.svg create mode 100644 navit/xpm/gui_fullscreen_16_16.png create mode 100644 navit/xpm/gui_fullscreen_32_32.png create mode 100644 navit/xpm/gui_fullscreen_48_48.png create mode 100644 navit/xpm/gui_fullscreen_8_8.png create mode 100644 navit/xpm/gui_fullscreen_96_96.png create mode 100644 navit/xpm/gui_help.png create mode 100644 navit/xpm/gui_help.svg create mode 100644 navit/xpm/gui_help_16_16.png create mode 100644 navit/xpm/gui_help_32_32.png create mode 100644 navit/xpm/gui_help_48_48.png create mode 100644 navit/xpm/gui_help_8_8.png create mode 100644 navit/xpm/gui_help_96_96.png create mode 100644 navit/xpm/gui_home.png create mode 100644 navit/xpm/gui_home.svg create mode 100644 navit/xpm/gui_home_16_16.png create mode 100644 navit/xpm/gui_home_32_32.png create mode 100644 navit/xpm/gui_home_48_48.png create mode 100644 navit/xpm/gui_home_8_8.png create mode 100644 navit/xpm/gui_home_96_96.png create mode 100644 navit/xpm/gui_inactive.png create mode 100644 navit/xpm/gui_inactive.svg create mode 100644 navit/xpm/gui_inactive_16_16.png create mode 100644 navit/xpm/gui_inactive_32_32.png create mode 100644 navit/xpm/gui_inactive_48_48.png create mode 100644 navit/xpm/gui_inactive_8_8.png create mode 100644 navit/xpm/gui_inactive_96_96.png create mode 100644 navit/xpm/gui_leave_fullscreen.png create mode 100644 navit/xpm/gui_leave_fullscreen.svg create mode 100644 navit/xpm/gui_leave_fullscreen_16_16.png create mode 100644 navit/xpm/gui_leave_fullscreen_32_32.png create mode 100644 navit/xpm/gui_leave_fullscreen_48_48.png create mode 100644 navit/xpm/gui_leave_fullscreen_8_8.png create mode 100644 navit/xpm/gui_leave_fullscreen_96_96.png create mode 100644 navit/xpm/gui_log.png create mode 100644 navit/xpm/gui_log.svg create mode 100644 navit/xpm/gui_log_16_16.png create mode 100644 navit/xpm/gui_log_32_32.png create mode 100644 navit/xpm/gui_log_48_48.png create mode 100644 navit/xpm/gui_log_8_8.png create mode 100644 navit/xpm/gui_log_96_96.png create mode 100644 navit/xpm/gui_map.png create mode 100644 navit/xpm/gui_map.svg create mode 100644 navit/xpm/gui_map_16_16.png create mode 100644 navit/xpm/gui_map_32_32.png create mode 100644 navit/xpm/gui_map_48_48.png create mode 100644 navit/xpm/gui_map_8_8.png create mode 100644 navit/xpm/gui_map_96_96.png create mode 100644 navit/xpm/gui_maps.png create mode 100644 navit/xpm/gui_maps.svg create mode 100644 navit/xpm/gui_maps_16_16.png create mode 100644 navit/xpm/gui_maps_32_32.png create mode 100644 navit/xpm/gui_maps_48_48.png create mode 100644 navit/xpm/gui_maps_8_8.png create mode 100644 navit/xpm/gui_maps_96_96.png create mode 100644 navit/xpm/gui_menu.png create mode 100644 navit/xpm/gui_menu.svg create mode 100644 navit/xpm/gui_menu_16_16.png create mode 100644 navit/xpm/gui_menu_32_32.png create mode 100644 navit/xpm/gui_menu_48_48.png create mode 100644 navit/xpm/gui_menu_8_8.png create mode 100644 navit/xpm/gui_menu_96_96.png create mode 100644 navit/xpm/gui_minus.png create mode 100644 navit/xpm/gui_minus.svg create mode 100644 navit/xpm/gui_minus_16_16.png create mode 100644 navit/xpm/gui_minus_32_32.png create mode 100644 navit/xpm/gui_minus_48_48.png create mode 100644 navit/xpm/gui_minus_8_8.png create mode 100644 navit/xpm/gui_minus_96_96.png create mode 100644 navit/xpm/gui_plus.png create mode 100644 navit/xpm/gui_plus.svg create mode 100644 navit/xpm/gui_plus_16_16.png create mode 100644 navit/xpm/gui_plus_32_32.png create mode 100644 navit/xpm/gui_plus_48_48.png create mode 100644 navit/xpm/gui_plus_8_8.png create mode 100644 navit/xpm/gui_plus_96_96.png create mode 100644 navit/xpm/gui_quit.png create mode 100644 navit/xpm/gui_quit.svg create mode 100644 navit/xpm/gui_quit_16_16.png create mode 100644 navit/xpm/gui_quit_32_32.png create mode 100644 navit/xpm/gui_quit_48_48.png create mode 100644 navit/xpm/gui_quit_8_8.png create mode 100644 navit/xpm/gui_quit_96_96.png create mode 100644 navit/xpm/gui_rules.png create mode 100644 navit/xpm/gui_rules.svg create mode 100644 navit/xpm/gui_rules_16_16.png create mode 100644 navit/xpm/gui_rules_32_32.png create mode 100644 navit/xpm/gui_rules_48_48.png create mode 100644 navit/xpm/gui_rules_8_8.png create mode 100644 navit/xpm/gui_rules_96_96.png create mode 100644 navit/xpm/gui_search.png create mode 100644 navit/xpm/gui_search.svg create mode 100644 navit/xpm/gui_search_16_16.png create mode 100644 navit/xpm/gui_search_32_32.png create mode 100644 navit/xpm/gui_search_48_48.png create mode 100644 navit/xpm/gui_search_8_8.png create mode 100644 navit/xpm/gui_search_96_96.png create mode 100644 navit/xpm/gui_select_country.png create mode 100644 navit/xpm/gui_select_country.svg create mode 100644 navit/xpm/gui_select_country_16_16.png create mode 100644 navit/xpm/gui_select_country_32_32.png create mode 100644 navit/xpm/gui_select_country_48_48.png create mode 100644 navit/xpm/gui_select_country_8_8.png create mode 100644 navit/xpm/gui_select_country_96_96.png create mode 100644 navit/xpm/gui_select_street.png create mode 100644 navit/xpm/gui_select_street.svg create mode 100644 navit/xpm/gui_select_street_16_16.png create mode 100644 navit/xpm/gui_select_street_32_32.png create mode 100644 navit/xpm/gui_select_street_48_48.png create mode 100644 navit/xpm/gui_select_street_8_8.png create mode 100644 navit/xpm/gui_select_street_96_96.png create mode 100644 navit/xpm/gui_select_town.png create mode 100644 navit/xpm/gui_select_town.svg create mode 100644 navit/xpm/gui_select_town_16_16.png create mode 100644 navit/xpm/gui_select_town_32_32.png create mode 100644 navit/xpm/gui_select_town_48_48.png create mode 100644 navit/xpm/gui_select_town_8_8.png create mode 100644 navit/xpm/gui_select_town_96_96.png create mode 100644 navit/xpm/gui_settings.png create mode 100644 navit/xpm/gui_settings.svg create mode 100644 navit/xpm/gui_settings_16_16.png create mode 100644 navit/xpm/gui_settings_32_32.png create mode 100644 navit/xpm/gui_settings_48_48.png create mode 100644 navit/xpm/gui_settings_8_8.png create mode 100644 navit/xpm/gui_settings_96_96.png create mode 100644 navit/xpm/gui_sound.png create mode 100644 navit/xpm/gui_sound.svg create mode 100644 navit/xpm/gui_sound_16_16.png create mode 100644 navit/xpm/gui_sound_32_32.png create mode 100644 navit/xpm/gui_sound_48_48.png create mode 100644 navit/xpm/gui_sound_8_8.png create mode 100644 navit/xpm/gui_sound_96_96.png create mode 100644 navit/xpm/gui_sound_off.png create mode 100644 navit/xpm/gui_sound_off.svg create mode 100644 navit/xpm/gui_sound_off_16_16.png create mode 100644 navit/xpm/gui_sound_off_32_32.png create mode 100644 navit/xpm/gui_sound_off_48_48.png create mode 100644 navit/xpm/gui_sound_off_8_8.png create mode 100644 navit/xpm/gui_sound_off_96_96.png create mode 100644 navit/xpm/gui_stop.png create mode 100644 navit/xpm/gui_stop.svg create mode 100644 navit/xpm/gui_stop_16_16.png create mode 100644 navit/xpm/gui_stop_32_32.png create mode 100644 navit/xpm/gui_stop_48_48.png create mode 100644 navit/xpm/gui_stop_8_8.png create mode 100644 navit/xpm/gui_stop_96_96.png create mode 100644 navit/xpm/gui_strength_0.png create mode 100644 navit/xpm/gui_strength_0.svg create mode 100644 navit/xpm/gui_strength_0_16_16.png create mode 100644 navit/xpm/gui_strength_0_32_32.png create mode 100644 navit/xpm/gui_strength_0_48_48.png create mode 100644 navit/xpm/gui_strength_0_8_8.png create mode 100644 navit/xpm/gui_strength_0_96_96.png create mode 100644 navit/xpm/gui_strength_1.png create mode 100644 navit/xpm/gui_strength_1.svg create mode 100644 navit/xpm/gui_strength_1_16_16.png create mode 100644 navit/xpm/gui_strength_1_32_32.png create mode 100644 navit/xpm/gui_strength_1_48_48.png create mode 100644 navit/xpm/gui_strength_1_8_8.png create mode 100644 navit/xpm/gui_strength_1_96_96.png create mode 100644 navit/xpm/gui_strength_2.png create mode 100644 navit/xpm/gui_strength_2.svg create mode 100644 navit/xpm/gui_strength_2_16_16.png create mode 100644 navit/xpm/gui_strength_2_32_32.png create mode 100644 navit/xpm/gui_strength_2_48_48.png create mode 100644 navit/xpm/gui_strength_2_8_8.png create mode 100644 navit/xpm/gui_strength_2_96_96.png create mode 100644 navit/xpm/gui_strength_3.png create mode 100644 navit/xpm/gui_strength_3.svg create mode 100644 navit/xpm/gui_strength_3_16_16.png create mode 100644 navit/xpm/gui_strength_3_32_32.png create mode 100644 navit/xpm/gui_strength_3_48_48.png create mode 100644 navit/xpm/gui_strength_3_8_8.png create mode 100644 navit/xpm/gui_strength_3_96_96.png create mode 100644 navit/xpm/gui_strength_4.png create mode 100644 navit/xpm/gui_strength_4.svg create mode 100644 navit/xpm/gui_strength_4_16_16.png create mode 100644 navit/xpm/gui_strength_4_32_32.png create mode 100644 navit/xpm/gui_strength_4_48_48.png create mode 100644 navit/xpm/gui_strength_4_8_8.png create mode 100644 navit/xpm/gui_strength_4_96_96.png create mode 100644 navit/xpm/gui_strength_5.png create mode 100644 navit/xpm/gui_strength_5.svg create mode 100644 navit/xpm/gui_strength_5_16_16.png create mode 100644 navit/xpm/gui_strength_5_32_32.png create mode 100644 navit/xpm/gui_strength_5_48_48.png create mode 100644 navit/xpm/gui_strength_5_8_8.png create mode 100644 navit/xpm/gui_strength_5_96_96.png create mode 100644 navit/xpm/gui_tools.png create mode 100644 navit/xpm/gui_tools.svg create mode 100644 navit/xpm/gui_tools_16_16.png create mode 100644 navit/xpm/gui_tools_32_32.png create mode 100644 navit/xpm/gui_tools_48_48.png create mode 100644 navit/xpm/gui_tools_8_8.png create mode 100644 navit/xpm/gui_tools_96_96.png create mode 100644 navit/xpm/gui_town.png create mode 100644 navit/xpm/gui_town.svg create mode 100644 navit/xpm/gui_town_16_16.png create mode 100644 navit/xpm/gui_town_32_32.png create mode 100644 navit/xpm/gui_town_48_48.png create mode 100644 navit/xpm/gui_town_8_8.png create mode 100644 navit/xpm/gui_town_96_96.png create mode 100644 navit/xpm/gui_vehicle.png create mode 100644 navit/xpm/gui_vehicle.svg create mode 100644 navit/xpm/gui_vehicle_16_16.png create mode 100644 navit/xpm/gui_vehicle_32_32.png create mode 100644 navit/xpm/gui_vehicle_48_48.png create mode 100644 navit/xpm/gui_vehicle_8_8.png create mode 100644 navit/xpm/gui_vehicle_96_96.png create mode 100644 navit/xpm/gui_vehicle_pedestrian.png create mode 100644 navit/xpm/gui_vehicle_pedestrian.svg create mode 100644 navit/xpm/gui_vehicle_pedestrian_16_16.png create mode 100644 navit/xpm/gui_vehicle_pedestrian_32_32.png create mode 100644 navit/xpm/gui_vehicle_pedestrian_48_48.png create mode 100644 navit/xpm/gui_vehicle_pedestrian_8_8.png create mode 100644 navit/xpm/gui_vehicle_pedestrian_96_96.png create mode 100644 navit/xpm/gui_zoom_in.png create mode 100644 navit/xpm/gui_zoom_in.svg create mode 100644 navit/xpm/gui_zoom_in_16_16.png create mode 100644 navit/xpm/gui_zoom_in_32_32.png create mode 100644 navit/xpm/gui_zoom_in_48_48.png create mode 100644 navit/xpm/gui_zoom_in_8_8.png create mode 100644 navit/xpm/gui_zoom_in_96_96.png create mode 100644 navit/xpm/gui_zoom_out.png create mode 100644 navit/xpm/gui_zoom_out.svg create mode 100644 navit/xpm/gui_zoom_out_16_16.png create mode 100644 navit/xpm/gui_zoom_out_32_32.png create mode 100644 navit/xpm/gui_zoom_out_48_48.png create mode 100644 navit/xpm/gui_zoom_out_8_8.png create mode 100644 navit/xpm/gui_zoom_out_96_96.png create mode 100644 navit/xpm/heliport.png create mode 100644 navit/xpm/heliport.svg create mode 100644 navit/xpm/heliport_16_16.png create mode 100644 navit/xpm/heliport_32_32.png create mode 100644 navit/xpm/heliport_48_48.png create mode 100644 navit/xpm/heliport_8_8.png create mode 100644 navit/xpm/heliport_96_96.png create mode 100644 navit/xpm/highway_exit.xpm create mode 100644 navit/xpm/hospital.png create mode 100644 navit/xpm/hospital.svg create mode 100644 navit/xpm/hospital_16_16.png create mode 100644 navit/xpm/hospital_32_32.png create mode 100644 navit/xpm/hospital_48_48.png create mode 100644 navit/xpm/hospital_8_8.png create mode 100644 navit/xpm/hospital_96_96.png create mode 100644 navit/xpm/hotel.png create mode 100644 navit/xpm/hotel.svg create mode 100644 navit/xpm/hotel_16_16.png create mode 100644 navit/xpm/hotel_32_32.png create mode 100644 navit/xpm/hotel_48_48.png create mode 100644 navit/xpm/hotel_8_8.png create mode 100644 navit/xpm/hotel_96_96.png create mode 100644 navit/xpm/hunting_stand.xpm create mode 100644 navit/xpm/information.png create mode 100644 navit/xpm/information.svg create mode 100644 navit/xpm/information_16_16.png create mode 100644 navit/xpm/information_32_32.png create mode 100644 navit/xpm/information_48_48.png create mode 100644 navit/xpm/information_8_8.png create mode 100644 navit/xpm/information_96_96.png create mode 100644 navit/xpm/justice.png create mode 100644 navit/xpm/justice.svg create mode 100644 navit/xpm/justice_16_16.png create mode 100644 navit/xpm/justice_32_32.png create mode 100644 navit/xpm/justice_48_48.png create mode 100644 navit/xpm/justice_8_8.png create mode 100644 navit/xpm/justice_96_96.png create mode 100644 navit/xpm/level_crossing.xpm create mode 100644 navit/xpm/library.xpm create mode 100644 navit/xpm/mark.png create mode 100644 navit/xpm/mark.svg create mode 100644 navit/xpm/mark_16_16.png create mode 100644 navit/xpm/mark_32_32.png create mode 100644 navit/xpm/mark_48_48.png create mode 100644 navit/xpm/mark_8_8.png create mode 100644 navit/xpm/mark_96_96.png create mode 100644 navit/xpm/memorial.xpm create mode 100644 navit/xpm/menu.xpm create mode 100644 navit/xpm/military.png create mode 100644 navit/xpm/military.svg create mode 100644 navit/xpm/military_16_16.png create mode 100644 navit/xpm/military_32_32.png create mode 100644 navit/xpm/military_48_48.png create mode 100644 navit/xpm/military_8_8.png create mode 100644 navit/xpm/military_96_96.png create mode 100644 navit/xpm/mini_roundabout.png create mode 100644 navit/xpm/mini_roundabout.svg create mode 100644 navit/xpm/mini_roundabout_16_16.png create mode 100644 navit/xpm/mini_roundabout_32_32.png create mode 100644 navit/xpm/mini_roundabout_48_48.png create mode 100644 navit/xpm/mini_roundabout_8_8.png create mode 100644 navit/xpm/mini_roundabout_96_96.png create mode 100644 navit/xpm/museum.png create mode 100644 navit/xpm/museum.svg create mode 100644 navit/xpm/museum_16_16.png create mode 100644 navit/xpm/museum_32_32.png create mode 100644 navit/xpm/museum_48_48.png create mode 100644 navit/xpm/museum_8_8.png create mode 100644 navit/xpm/museum_96_96.png create mode 100644 navit/xpm/nav_destination_bk.svg create mode 100644 navit/xpm/nav_destination_bk_16_16.png create mode 100644 navit/xpm/nav_destination_bk_32_32.png create mode 100644 navit/xpm/nav_destination_bk_48_48.png create mode 100644 navit/xpm/nav_destination_bk_8_8.png create mode 100644 navit/xpm/nav_destination_bk_96_96.png create mode 100644 navit/xpm/nav_destination_wh.svg create mode 100644 navit/xpm/nav_destination_wh_16_16.png create mode 100644 navit/xpm/nav_destination_wh_32_32.png create mode 100644 navit/xpm/nav_destination_wh_48_48.png create mode 100644 navit/xpm/nav_destination_wh_8_8.png create mode 100644 navit/xpm/nav_destination_wh_96_96.png create mode 100644 navit/xpm/nav_left_1.xpm create mode 100644 navit/xpm/nav_left_1_32.xpm create mode 100644 navit/xpm/nav_left_1_bk.svg create mode 100644 navit/xpm/nav_left_1_bk_16_16.png create mode 100644 navit/xpm/nav_left_1_bk_32_32.png create mode 100644 navit/xpm/nav_left_1_bk_48_48.png create mode 100644 navit/xpm/nav_left_1_bk_8_8.png create mode 100644 navit/xpm/nav_left_1_bk_96_96.png create mode 100644 navit/xpm/nav_left_1_wh.svg create mode 100644 navit/xpm/nav_left_1_wh_16_16.png create mode 100644 navit/xpm/nav_left_1_wh_32_32.png create mode 100644 navit/xpm/nav_left_1_wh_48_48.png create mode 100644 navit/xpm/nav_left_1_wh_8_8.png create mode 100644 navit/xpm/nav_left_1_wh_96_96.png create mode 100644 navit/xpm/nav_left_2.xpm create mode 100644 navit/xpm/nav_left_2_32.xpm create mode 100644 navit/xpm/nav_left_2_bk.svg create mode 100644 navit/xpm/nav_left_2_bk_16_16.png create mode 100644 navit/xpm/nav_left_2_bk_32_32.png create mode 100644 navit/xpm/nav_left_2_bk_48_48.png create mode 100644 navit/xpm/nav_left_2_bk_8_8.png create mode 100644 navit/xpm/nav_left_2_bk_96_96.png create mode 100644 navit/xpm/nav_left_2_wh.svg create mode 100644 navit/xpm/nav_left_2_wh_16_16.png create mode 100644 navit/xpm/nav_left_2_wh_32_32.png create mode 100644 navit/xpm/nav_left_2_wh_48_48.png create mode 100644 navit/xpm/nav_left_2_wh_8_8.png create mode 100644 navit/xpm/nav_left_2_wh_96_96.png create mode 100644 navit/xpm/nav_left_3_bk.svg create mode 100644 navit/xpm/nav_left_3_bk_16_16.png create mode 100644 navit/xpm/nav_left_3_bk_32_32.png create mode 100644 navit/xpm/nav_left_3_bk_48_48.png create mode 100644 navit/xpm/nav_left_3_bk_8_8.png create mode 100644 navit/xpm/nav_left_3_bk_96_96.png create mode 100644 navit/xpm/nav_left_3_wh.svg create mode 100644 navit/xpm/nav_left_3_wh_16_16.png create mode 100644 navit/xpm/nav_left_3_wh_32_32.png create mode 100644 navit/xpm/nav_left_3_wh_48_48.png create mode 100644 navit/xpm/nav_left_3_wh_8_8.png create mode 100644 navit/xpm/nav_left_3_wh_96_96.png create mode 100644 navit/xpm/nav_right_1.xpm create mode 100644 navit/xpm/nav_right_1_32.xpm create mode 100644 navit/xpm/nav_right_1_bk.svg create mode 100644 navit/xpm/nav_right_1_bk_16_16.png create mode 100644 navit/xpm/nav_right_1_bk_32_32.png create mode 100644 navit/xpm/nav_right_1_bk_48_48.png create mode 100644 navit/xpm/nav_right_1_bk_8_8.png create mode 100644 navit/xpm/nav_right_1_bk_96_96.png create mode 100644 navit/xpm/nav_right_1_wh.svg create mode 100644 navit/xpm/nav_right_1_wh_16_16.png create mode 100644 navit/xpm/nav_right_1_wh_32_32.png create mode 100644 navit/xpm/nav_right_1_wh_48_48.png create mode 100644 navit/xpm/nav_right_1_wh_8_8.png create mode 100644 navit/xpm/nav_right_1_wh_96_96.png create mode 100644 navit/xpm/nav_right_2.xpm create mode 100644 navit/xpm/nav_right_2_32.xpm create mode 100644 navit/xpm/nav_right_2_bk.svg create mode 100644 navit/xpm/nav_right_2_bk_16_16.png create mode 100644 navit/xpm/nav_right_2_bk_32_32.png create mode 100644 navit/xpm/nav_right_2_bk_48_48.png create mode 100644 navit/xpm/nav_right_2_bk_8_8.png create mode 100644 navit/xpm/nav_right_2_bk_96_96.png create mode 100644 navit/xpm/nav_right_2_wh.svg create mode 100644 navit/xpm/nav_right_2_wh_16_16.png create mode 100644 navit/xpm/nav_right_2_wh_32_32.png create mode 100644 navit/xpm/nav_right_2_wh_48_48.png create mode 100644 navit/xpm/nav_right_2_wh_8_8.png create mode 100644 navit/xpm/nav_right_2_wh_96_96.png create mode 100644 navit/xpm/nav_right_3_bk.svg create mode 100644 navit/xpm/nav_right_3_bk_16_16.png create mode 100644 navit/xpm/nav_right_3_bk_32_32.png create mode 100644 navit/xpm/nav_right_3_bk_48_48.png create mode 100644 navit/xpm/nav_right_3_bk_8_8.png create mode 100644 navit/xpm/nav_right_3_bk_96_96.png create mode 100644 navit/xpm/nav_right_3_wh.svg create mode 100644 navit/xpm/nav_right_3_wh_16_16.png create mode 100644 navit/xpm/nav_right_3_wh_32_32.png create mode 100644 navit/xpm/nav_right_3_wh_48_48.png create mode 100644 navit/xpm/nav_right_3_wh_8_8.png create mode 100644 navit/xpm/nav_right_3_wh_96_96.png create mode 100644 navit/xpm/nav_roundabout_l1_bk.svg create mode 100644 navit/xpm/nav_roundabout_l1_bk_16_16.png create mode 100644 navit/xpm/nav_roundabout_l1_bk_32_32.png create mode 100644 navit/xpm/nav_roundabout_l1_bk_48_48.png create mode 100644 navit/xpm/nav_roundabout_l1_bk_8_8.png create mode 100644 navit/xpm/nav_roundabout_l1_bk_96_96.png create mode 100644 navit/xpm/nav_roundabout_l1_wh.svg create mode 100644 navit/xpm/nav_roundabout_l1_wh_16_16.png create mode 100644 navit/xpm/nav_roundabout_l1_wh_32_32.png create mode 100644 navit/xpm/nav_roundabout_l1_wh_48_48.png create mode 100644 navit/xpm/nav_roundabout_l1_wh_8_8.png create mode 100644 navit/xpm/nav_roundabout_l1_wh_96_96.png create mode 100644 navit/xpm/nav_roundabout_l2_bk.svg create mode 100644 navit/xpm/nav_roundabout_l2_bk_16_16.png create mode 100644 navit/xpm/nav_roundabout_l2_bk_32_32.png create mode 100644 navit/xpm/nav_roundabout_l2_bk_48_48.png create mode 100644 navit/xpm/nav_roundabout_l2_bk_8_8.png create mode 100644 navit/xpm/nav_roundabout_l2_bk_96_96.png create mode 100644 navit/xpm/nav_roundabout_l2_wh.svg create mode 100644 navit/xpm/nav_roundabout_l2_wh_16_16.png create mode 100644 navit/xpm/nav_roundabout_l2_wh_32_32.png create mode 100644 navit/xpm/nav_roundabout_l2_wh_48_48.png create mode 100644 navit/xpm/nav_roundabout_l2_wh_8_8.png create mode 100644 navit/xpm/nav_roundabout_l2_wh_96_96.png create mode 100644 navit/xpm/nav_roundabout_l3_bk.svg create mode 100644 navit/xpm/nav_roundabout_l3_bk_16_16.png create mode 100644 navit/xpm/nav_roundabout_l3_bk_32_32.png create mode 100644 navit/xpm/nav_roundabout_l3_bk_48_48.png create mode 100644 navit/xpm/nav_roundabout_l3_bk_8_8.png create mode 100644 navit/xpm/nav_roundabout_l3_bk_96_96.png create mode 100644 navit/xpm/nav_roundabout_l3_wh.svg create mode 100644 navit/xpm/nav_roundabout_l3_wh_16_16.png create mode 100644 navit/xpm/nav_roundabout_l3_wh_32_32.png create mode 100644 navit/xpm/nav_roundabout_l3_wh_48_48.png create mode 100644 navit/xpm/nav_roundabout_l3_wh_8_8.png create mode 100644 navit/xpm/nav_roundabout_l3_wh_96_96.png create mode 100644 navit/xpm/nav_roundabout_l4_bk.svg create mode 100644 navit/xpm/nav_roundabout_l4_bk_16_16.png create mode 100644 navit/xpm/nav_roundabout_l4_bk_32_32.png create mode 100644 navit/xpm/nav_roundabout_l4_bk_48_48.png create mode 100644 navit/xpm/nav_roundabout_l4_bk_8_8.png create mode 100644 navit/xpm/nav_roundabout_l4_bk_96_96.png create mode 100644 navit/xpm/nav_roundabout_l4_wh.svg create mode 100644 navit/xpm/nav_roundabout_l4_wh_16_16.png create mode 100644 navit/xpm/nav_roundabout_l4_wh_32_32.png create mode 100644 navit/xpm/nav_roundabout_l4_wh_48_48.png create mode 100644 navit/xpm/nav_roundabout_l4_wh_8_8.png create mode 100644 navit/xpm/nav_roundabout_l4_wh_96_96.png create mode 100644 navit/xpm/nav_roundabout_l5_bk.svg create mode 100644 navit/xpm/nav_roundabout_l5_bk_16_16.png create mode 100644 navit/xpm/nav_roundabout_l5_bk_32_32.png create mode 100644 navit/xpm/nav_roundabout_l5_bk_48_48.png create mode 100644 navit/xpm/nav_roundabout_l5_bk_8_8.png create mode 100644 navit/xpm/nav_roundabout_l5_bk_96_96.png create mode 100644 navit/xpm/nav_roundabout_l5_wh.svg create mode 100644 navit/xpm/nav_roundabout_l5_wh_16_16.png create mode 100644 navit/xpm/nav_roundabout_l5_wh_32_32.png create mode 100644 navit/xpm/nav_roundabout_l5_wh_48_48.png create mode 100644 navit/xpm/nav_roundabout_l5_wh_8_8.png create mode 100644 navit/xpm/nav_roundabout_l5_wh_96_96.png create mode 100644 navit/xpm/nav_roundabout_l6_bk.svg create mode 100644 navit/xpm/nav_roundabout_l6_bk_16_16.png create mode 100644 navit/xpm/nav_roundabout_l6_bk_32_32.png create mode 100644 navit/xpm/nav_roundabout_l6_bk_48_48.png create mode 100644 navit/xpm/nav_roundabout_l6_bk_8_8.png create mode 100644 navit/xpm/nav_roundabout_l6_bk_96_96.png create mode 100644 navit/xpm/nav_roundabout_l6_wh.svg create mode 100644 navit/xpm/nav_roundabout_l6_wh_16_16.png create mode 100644 navit/xpm/nav_roundabout_l6_wh_32_32.png create mode 100644 navit/xpm/nav_roundabout_l6_wh_48_48.png create mode 100644 navit/xpm/nav_roundabout_l6_wh_8_8.png create mode 100644 navit/xpm/nav_roundabout_l6_wh_96_96.png create mode 100644 navit/xpm/nav_roundabout_l7_bk.svg create mode 100644 navit/xpm/nav_roundabout_l7_bk_16_16.png create mode 100644 navit/xpm/nav_roundabout_l7_bk_32_32.png create mode 100644 navit/xpm/nav_roundabout_l7_bk_48_48.png create mode 100644 navit/xpm/nav_roundabout_l7_bk_8_8.png create mode 100644 navit/xpm/nav_roundabout_l7_bk_96_96.png create mode 100644 navit/xpm/nav_roundabout_l7_wh.svg create mode 100644 navit/xpm/nav_roundabout_l7_wh_16_16.png create mode 100644 navit/xpm/nav_roundabout_l7_wh_32_32.png create mode 100644 navit/xpm/nav_roundabout_l7_wh_48_48.png create mode 100644 navit/xpm/nav_roundabout_l7_wh_8_8.png create mode 100644 navit/xpm/nav_roundabout_l7_wh_96_96.png create mode 100644 navit/xpm/nav_roundabout_l8_bk.svg create mode 100644 navit/xpm/nav_roundabout_l8_bk_16_16.png create mode 100644 navit/xpm/nav_roundabout_l8_bk_32_32.png create mode 100644 navit/xpm/nav_roundabout_l8_bk_48_48.png create mode 100644 navit/xpm/nav_roundabout_l8_bk_8_8.png create mode 100644 navit/xpm/nav_roundabout_l8_bk_96_96.png create mode 100644 navit/xpm/nav_roundabout_l8_wh.svg create mode 100644 navit/xpm/nav_roundabout_l8_wh_16_16.png create mode 100644 navit/xpm/nav_roundabout_l8_wh_32_32.png create mode 100644 navit/xpm/nav_roundabout_l8_wh_48_48.png create mode 100644 navit/xpm/nav_roundabout_l8_wh_8_8.png create mode 100644 navit/xpm/nav_roundabout_l8_wh_96_96.png create mode 100644 navit/xpm/nav_roundabout_r1_bk.svg create mode 100644 navit/xpm/nav_roundabout_r1_bk_16_16.png create mode 100644 navit/xpm/nav_roundabout_r1_bk_32_32.png create mode 100644 navit/xpm/nav_roundabout_r1_bk_48_48.png create mode 100644 navit/xpm/nav_roundabout_r1_bk_8_8.png create mode 100644 navit/xpm/nav_roundabout_r1_bk_96_96.png create mode 100644 navit/xpm/nav_roundabout_r1_wh.svg create mode 100644 navit/xpm/nav_roundabout_r1_wh_16_16.png create mode 100644 navit/xpm/nav_roundabout_r1_wh_32_32.png create mode 100644 navit/xpm/nav_roundabout_r1_wh_48_48.png create mode 100644 navit/xpm/nav_roundabout_r1_wh_8_8.png create mode 100644 navit/xpm/nav_roundabout_r1_wh_96_96.png create mode 100644 navit/xpm/nav_roundabout_r2_bk.svg create mode 100644 navit/xpm/nav_roundabout_r2_bk_16_16.png create mode 100644 navit/xpm/nav_roundabout_r2_bk_32_32.png create mode 100644 navit/xpm/nav_roundabout_r2_bk_48_48.png create mode 100644 navit/xpm/nav_roundabout_r2_bk_8_8.png create mode 100644 navit/xpm/nav_roundabout_r2_bk_96_96.png create mode 100644 navit/xpm/nav_roundabout_r2_wh.svg create mode 100644 navit/xpm/nav_roundabout_r2_wh_16_16.png create mode 100644 navit/xpm/nav_roundabout_r2_wh_32_32.png create mode 100644 navit/xpm/nav_roundabout_r2_wh_48_48.png create mode 100644 navit/xpm/nav_roundabout_r2_wh_8_8.png create mode 100644 navit/xpm/nav_roundabout_r2_wh_96_96.png create mode 100644 navit/xpm/nav_roundabout_r3_bk.svg create mode 100644 navit/xpm/nav_roundabout_r3_bk_16_16.png create mode 100644 navit/xpm/nav_roundabout_r3_bk_32_32.png create mode 100644 navit/xpm/nav_roundabout_r3_bk_48_48.png create mode 100644 navit/xpm/nav_roundabout_r3_bk_8_8.png create mode 100644 navit/xpm/nav_roundabout_r3_bk_96_96.png create mode 100644 navit/xpm/nav_roundabout_r3_wh.svg create mode 100644 navit/xpm/nav_roundabout_r3_wh_16_16.png create mode 100644 navit/xpm/nav_roundabout_r3_wh_32_32.png create mode 100644 navit/xpm/nav_roundabout_r3_wh_48_48.png create mode 100644 navit/xpm/nav_roundabout_r3_wh_8_8.png create mode 100644 navit/xpm/nav_roundabout_r3_wh_96_96.png create mode 100644 navit/xpm/nav_roundabout_r4_bk.svg create mode 100644 navit/xpm/nav_roundabout_r4_bk_16_16.png create mode 100644 navit/xpm/nav_roundabout_r4_bk_32_32.png create mode 100644 navit/xpm/nav_roundabout_r4_bk_48_48.png create mode 100644 navit/xpm/nav_roundabout_r4_bk_8_8.png create mode 100644 navit/xpm/nav_roundabout_r4_bk_96_96.png create mode 100644 navit/xpm/nav_roundabout_r4_wh.svg create mode 100644 navit/xpm/nav_roundabout_r4_wh_16_16.png create mode 100644 navit/xpm/nav_roundabout_r4_wh_32_32.png create mode 100644 navit/xpm/nav_roundabout_r4_wh_48_48.png create mode 100644 navit/xpm/nav_roundabout_r4_wh_8_8.png create mode 100644 navit/xpm/nav_roundabout_r4_wh_96_96.png create mode 100644 navit/xpm/nav_roundabout_r5_bk.svg create mode 100644 navit/xpm/nav_roundabout_r5_bk_16_16.png create mode 100644 navit/xpm/nav_roundabout_r5_bk_32_32.png create mode 100644 navit/xpm/nav_roundabout_r5_bk_48_48.png create mode 100644 navit/xpm/nav_roundabout_r5_bk_8_8.png create mode 100644 navit/xpm/nav_roundabout_r5_bk_96_96.png create mode 100644 navit/xpm/nav_roundabout_r5_wh.svg create mode 100644 navit/xpm/nav_roundabout_r5_wh_16_16.png create mode 100644 navit/xpm/nav_roundabout_r5_wh_32_32.png create mode 100644 navit/xpm/nav_roundabout_r5_wh_48_48.png create mode 100644 navit/xpm/nav_roundabout_r5_wh_8_8.png create mode 100644 navit/xpm/nav_roundabout_r5_wh_96_96.png create mode 100644 navit/xpm/nav_roundabout_r6_bk.svg create mode 100644 navit/xpm/nav_roundabout_r6_bk_16_16.png create mode 100644 navit/xpm/nav_roundabout_r6_bk_32_32.png create mode 100644 navit/xpm/nav_roundabout_r6_bk_48_48.png create mode 100644 navit/xpm/nav_roundabout_r6_bk_8_8.png create mode 100644 navit/xpm/nav_roundabout_r6_bk_96_96.png create mode 100644 navit/xpm/nav_roundabout_r6_wh.svg create mode 100644 navit/xpm/nav_roundabout_r6_wh_16_16.png create mode 100644 navit/xpm/nav_roundabout_r6_wh_32_32.png create mode 100644 navit/xpm/nav_roundabout_r6_wh_48_48.png create mode 100644 navit/xpm/nav_roundabout_r6_wh_8_8.png create mode 100644 navit/xpm/nav_roundabout_r6_wh_96_96.png create mode 100644 navit/xpm/nav_roundabout_r7_bk.svg create mode 100644 navit/xpm/nav_roundabout_r7_bk_16_16.png create mode 100644 navit/xpm/nav_roundabout_r7_bk_32_32.png create mode 100644 navit/xpm/nav_roundabout_r7_bk_48_48.png create mode 100644 navit/xpm/nav_roundabout_r7_bk_8_8.png create mode 100644 navit/xpm/nav_roundabout_r7_bk_96_96.png create mode 100644 navit/xpm/nav_roundabout_r7_wh.svg create mode 100644 navit/xpm/nav_roundabout_r7_wh_16_16.png create mode 100644 navit/xpm/nav_roundabout_r7_wh_32_32.png create mode 100644 navit/xpm/nav_roundabout_r7_wh_48_48.png create mode 100644 navit/xpm/nav_roundabout_r7_wh_8_8.png create mode 100644 navit/xpm/nav_roundabout_r7_wh_96_96.png create mode 100644 navit/xpm/nav_roundabout_r8_bk.svg create mode 100644 navit/xpm/nav_roundabout_r8_bk_16_16.png create mode 100644 navit/xpm/nav_roundabout_r8_bk_32_32.png create mode 100644 navit/xpm/nav_roundabout_r8_bk_48_48.png create mode 100644 navit/xpm/nav_roundabout_r8_bk_8_8.png create mode 100644 navit/xpm/nav_roundabout_r8_bk_96_96.png create mode 100644 navit/xpm/nav_roundabout_r8_wh.svg create mode 100644 navit/xpm/nav_roundabout_r8_wh_16_16.png create mode 100644 navit/xpm/nav_roundabout_r8_wh_32_32.png create mode 100644 navit/xpm/nav_roundabout_r8_wh_48_48.png create mode 100644 navit/xpm/nav_roundabout_r8_wh_8_8.png create mode 100644 navit/xpm/nav_roundabout_r8_wh_96_96.png create mode 100644 navit/xpm/nav_straight.xpm create mode 100644 navit/xpm/nav_straight_32.xpm create mode 100644 navit/xpm/nav_straight_bk.svg create mode 100644 navit/xpm/nav_straight_bk_16_16.png create mode 100644 navit/xpm/nav_straight_bk_32_32.png create mode 100644 navit/xpm/nav_straight_bk_48_48.png create mode 100644 navit/xpm/nav_straight_bk_8_8.png create mode 100644 navit/xpm/nav_straight_bk_96_96.png create mode 100644 navit/xpm/nav_straight_wh.svg create mode 100644 navit/xpm/nav_straight_wh_16_16.png create mode 100644 navit/xpm/nav_straight_wh_32_32.png create mode 100644 navit/xpm/nav_straight_wh_48_48.png create mode 100644 navit/xpm/nav_straight_wh_8_8.png create mode 100644 navit/xpm/nav_straight_wh_96_96.png create mode 100644 navit/xpm/nav_turnaround_left_bk.svg create mode 100644 navit/xpm/nav_turnaround_left_bk_16_16.png create mode 100644 navit/xpm/nav_turnaround_left_bk_32_32.png create mode 100644 navit/xpm/nav_turnaround_left_bk_48_48.png create mode 100644 navit/xpm/nav_turnaround_left_bk_8_8.png create mode 100644 navit/xpm/nav_turnaround_left_bk_96_96.png create mode 100644 navit/xpm/nav_turnaround_left_wh.svg create mode 100644 navit/xpm/nav_turnaround_left_wh_16_16.png create mode 100644 navit/xpm/nav_turnaround_left_wh_32_32.png create mode 100644 navit/xpm/nav_turnaround_left_wh_48_48.png create mode 100644 navit/xpm/nav_turnaround_left_wh_8_8.png create mode 100644 navit/xpm/nav_turnaround_left_wh_96_96.png create mode 100644 navit/xpm/nav_turnaround_right_bk.svg create mode 100644 navit/xpm/nav_turnaround_right_bk_16_16.png create mode 100644 navit/xpm/nav_turnaround_right_bk_32_32.png create mode 100644 navit/xpm/nav_turnaround_right_bk_48_48.png create mode 100644 navit/xpm/nav_turnaround_right_bk_8_8.png create mode 100644 navit/xpm/nav_turnaround_right_bk_96_96.png create mode 100644 navit/xpm/nav_turnaround_right_wh.svg create mode 100644 navit/xpm/nav_turnaround_right_wh_16_16.png create mode 100644 navit/xpm/nav_turnaround_right_wh_32_32.png create mode 100644 navit/xpm/nav_turnaround_right_wh_48_48.png create mode 100644 navit/xpm/nav_turnaround_right_wh_8_8.png create mode 100644 navit/xpm/nav_turnaround_right_wh_96_96.png create mode 100755 navit/xpm/navit_svg2png create mode 100644 navit/xpm/parking.png create mode 100644 navit/xpm/parking.svg create mode 100644 navit/xpm/parking_16_16.png create mode 100644 navit/xpm/parking_32_32.png create mode 100644 navit/xpm/parking_48_48.png create mode 100644 navit/xpm/parking_8_8.png create mode 100644 navit/xpm/parking_96_96.png create mode 100644 navit/xpm/peak.png create mode 100644 navit/xpm/peak.svg create mode 100644 navit/xpm/peak_16_16.png create mode 100644 navit/xpm/peak_32_32.png create mode 100644 navit/xpm/peak_48_48.png create mode 100644 navit/xpm/peak_8_8.png create mode 100644 navit/xpm/peak_96_96.png create mode 100644 navit/xpm/pharmacy.png create mode 100644 navit/xpm/pharmacy.svg create mode 100644 navit/xpm/pharmacy_16_16.png create mode 100644 navit/xpm/pharmacy_32_32.png create mode 100644 navit/xpm/pharmacy_48_48.png create mode 100644 navit/xpm/pharmacy_8_8.png create mode 100644 navit/xpm/pharmacy_96_96.png create mode 100644 navit/xpm/picnic.xpm create mode 100644 navit/xpm/police.png create mode 100644 navit/xpm/police.svg create mode 100644 navit/xpm/police_16_16.png create mode 100644 navit/xpm/police_32_32.png create mode 100644 navit/xpm/police_48_48.png create mode 100644 navit/xpm/police_8_8.png create mode 100644 navit/xpm/police_96_96.png create mode 100644 navit/xpm/post.png create mode 100644 navit/xpm/post.svg create mode 100644 navit/xpm/post_16_16.png create mode 100644 navit/xpm/post_32_32.png create mode 100644 navit/xpm/post_48_48.png create mode 100644 navit/xpm/post_8_8.png create mode 100644 navit/xpm/post_96_96.png create mode 100644 navit/xpm/potable_water.xpm create mode 100644 navit/xpm/public_office.xpm create mode 100644 navit/xpm/repair_service.png create mode 100644 navit/xpm/repair_service.svg create mode 100644 navit/xpm/repair_service_16_16.png create mode 100644 navit/xpm/repair_service_32_32.png create mode 100644 navit/xpm/repair_service_48_48.png create mode 100644 navit/xpm/repair_service_8_8.png create mode 100644 navit/xpm/repair_service_96_96.png create mode 100644 navit/xpm/resort.png create mode 100644 navit/xpm/resort.svg create mode 100644 navit/xpm/resort_16_16.png create mode 100644 navit/xpm/resort_32_32.png create mode 100644 navit/xpm/resort_48_48.png create mode 100644 navit/xpm/resort_8_8.png create mode 100644 navit/xpm/resort_96_96.png create mode 100644 navit/xpm/restaurant.png create mode 100644 navit/xpm/restaurant.svg create mode 100644 navit/xpm/restaurant_16_16.png create mode 100644 navit/xpm/restaurant_32_32.png create mode 100644 navit/xpm/restaurant_48_48.png create mode 100644 navit/xpm/restaurant_8_8.png create mode 100644 navit/xpm/restaurant_96_96.png create mode 100644 navit/xpm/restroom.xpm create mode 100644 navit/xpm/ruins.png create mode 100644 navit/xpm/ruins.svg create mode 100644 navit/xpm/ruins_16_16.png create mode 100644 navit/xpm/ruins_32_32.png create mode 100644 navit/xpm/ruins_48_48.png create mode 100644 navit/xpm/ruins_8_8.png create mode 100644 navit/xpm/ruins_96_96.png create mode 100644 navit/xpm/school.png create mode 100644 navit/xpm/school.svg create mode 100644 navit/xpm/school_16_16.png create mode 100644 navit/xpm/school_32_32.png create mode 100644 navit/xpm/school_48_48.png create mode 100644 navit/xpm/school_8_8.png create mode 100644 navit/xpm/school_96_96.png create mode 100644 navit/xpm/shelter.xpm create mode 100644 navit/xpm/shop_grocery.png create mode 100644 navit/xpm/shop_grocery.svg create mode 100644 navit/xpm/shop_grocery_16_16.png create mode 100644 navit/xpm/shop_grocery_32_32.png create mode 100644 navit/xpm/shop_grocery_48_48.png create mode 100644 navit/xpm/shop_grocery_8_8.png create mode 100644 navit/xpm/shop_grocery_96_96.png create mode 100644 navit/xpm/shopping.png create mode 100644 navit/xpm/shopping.svg create mode 100644 navit/xpm/shopping_16_16.png create mode 100644 navit/xpm/shopping_32_32.png create mode 100644 navit/xpm/shopping_48_48.png create mode 100644 navit/xpm/shopping_8_8.png create mode 100644 navit/xpm/shopping_96_96.png create mode 100644 navit/xpm/skiing.png create mode 100644 navit/xpm/skiing.svg create mode 100644 navit/xpm/skiing_16_16.png create mode 100644 navit/xpm/skiing_32_32.png create mode 100644 navit/xpm/skiing_48_48.png create mode 100644 navit/xpm/skiing_8_8.png create mode 100644 navit/xpm/skiing_96_96.png create mode 100644 navit/xpm/sport.xpm create mode 100644 navit/xpm/stadium.png create mode 100644 navit/xpm/stadium.svg create mode 100644 navit/xpm/stadium_16_16.png create mode 100644 navit/xpm/stadium_32_32.png create mode 100644 navit/xpm/stadium_48_48.png create mode 100644 navit/xpm/stadium_8_8.png create mode 100644 navit/xpm/stadium_96_96.png create mode 100644 navit/xpm/swimming.png create mode 100644 navit/xpm/swimming.svg create mode 100644 navit/xpm/swimming_16_16.png create mode 100644 navit/xpm/swimming_32_32.png create mode 100644 navit/xpm/swimming_48_48.png create mode 100644 navit/xpm/swimming_8_8.png create mode 100644 navit/xpm/swimming_96_96.png create mode 100644 navit/xpm/tec_common.png create mode 100644 navit/xpm/tec_common.svg create mode 100644 navit/xpm/tec_common_16_16.png create mode 100644 navit/xpm/tec_common_32_32.png create mode 100644 navit/xpm/tec_common_48_48.png create mode 100644 navit/xpm/tec_common_8_8.png create mode 100644 navit/xpm/tec_common_96_96.png create mode 100644 navit/xpm/telephone.png create mode 100644 navit/xpm/telephone.svg create mode 100644 navit/xpm/telephone_16_16.png create mode 100644 navit/xpm/telephone_32_32.png create mode 100644 navit/xpm/telephone_48_48.png create mode 100644 navit/xpm/telephone_8_8.png create mode 100644 navit/xpm/telephone_96_96.png create mode 100644 navit/xpm/theater.xpm create mode 100644 navit/xpm/toggle_fullscreen.xpm create mode 100644 navit/xpm/toilets.png create mode 100644 navit/xpm/toilets.svg create mode 100644 navit/xpm/toilets_16_16.png create mode 100644 navit/xpm/toilets_32_32.png create mode 100644 navit/xpm/toilets_48_48.png create mode 100644 navit/xpm/toilets_8_8.png create mode 100644 navit/xpm/toilets_96_96.png create mode 100644 navit/xpm/tower.xpm create mode 100644 navit/xpm/townhall.xpm create mode 100644 navit/xpm/traffic_signals.png create mode 100644 navit/xpm/traffic_signals.svg create mode 100644 navit/xpm/traffic_signals_16_16.png create mode 100644 navit/xpm/traffic_signals_32_32.png create mode 100644 navit/xpm/traffic_signals_48_48.png create mode 100644 navit/xpm/traffic_signals_8_8.png create mode 100644 navit/xpm/traffic_signals_96_96.png create mode 100644 navit/xpm/trailerpark.xpm create mode 100644 navit/xpm/unknown.png create mode 100644 navit/xpm/unknown.svg create mode 100644 navit/xpm/unknown_16_16.png create mode 100644 navit/xpm/unknown_32_32.png create mode 100644 navit/xpm/unknown_48_48.png create mode 100644 navit/xpm/unknown_8_8.png create mode 100644 navit/xpm/unknown_96_96.png create mode 100644 navit/xpm/viewpoint.png create mode 100644 navit/xpm/viewpoint.svg create mode 100644 navit/xpm/viewpoint_16_16.png create mode 100644 navit/xpm/viewpoint_32_32.png create mode 100644 navit/xpm/viewpoint_48_48.png create mode 100644 navit/xpm/viewpoint_8_8.png create mode 100644 navit/xpm/viewpoint_96_96.png create mode 100644 navit/xpm/wifi.png create mode 100644 navit/xpm/wifi.svg create mode 100644 navit/xpm/wifi_16_16.png create mode 100644 navit/xpm/wifi_32_32.png create mode 100644 navit/xpm/wifi_48_48.png create mode 100644 navit/xpm/wifi_8_8.png create mode 100644 navit/xpm/wifi_96_96.png create mode 100644 navit/xpm/zoo.png create mode 100644 navit/xpm/zoo.svg create mode 100644 navit/xpm/zoo_16_16.png create mode 100644 navit/xpm/zoo_32_32.png create mode 100644 navit/xpm/zoo_48_48.png create mode 100644 navit/xpm/zoo_8_8.png create mode 100644 navit/xpm/zoo_96_96.png create mode 100644 navit/xpm/zoom_in.png create mode 100644 navit/xpm/zoom_in.svg create mode 100644 navit/xpm/zoom_in_16_16.png create mode 100644 navit/xpm/zoom_in_32_32.png create mode 100644 navit/xpm/zoom_in_48_48.png create mode 100644 navit/xpm/zoom_in_8_8.png create mode 100644 navit/xpm/zoom_in_96_96.png create mode 100644 navit/xpm/zoom_out.png create mode 100644 navit/xpm/zoom_out.svg create mode 100644 navit/xpm/zoom_out_16_16.png create mode 100644 navit/xpm/zoom_out_32_32.png create mode 100644 navit/xpm/zoom_out_48_48.png create mode 100644 navit/xpm/zoom_out_8_8.png create mode 100644 navit/xpm/zoom_out_96_96.png create mode 100644 navit/zipfile.h create mode 100644 packaging/0001-fix-build-issues-with-qt-backend.patch create mode 100644 packaging/0002-fix-undefined-symbol-error.patch create mode 100644 packaging/0003-center-map.patch create mode 100644 packaging/0004-connect-demo-gps-nmea-log.patch create mode 100644 packaging/0005-defaults-to-qt-backend.patch create mode 100644 packaging/0006-custom-layout.patch create mode 100644 packaging/0007-increase_icon_size_patch create mode 100644 packaging/gpsdata.nmea create mode 100644 packaging/navit.changes create mode 100644 packaging/navit.spec create mode 100644 po/Makefile.am create mode 100644 po/Makefile.in create mode 100644 po/af.po.in create mode 100644 po/ar.po.in create mode 100644 po/ast.po.in create mode 100644 po/bg.po.in create mode 100644 po/ca.po.in create mode 100644 po/cs.po.in create mode 100644 po/da.po.in create mode 100644 po/de.po.in create mode 100644 po/de_CH.po.in create mode 100644 po/el.po.in create mode 100644 po/en_AU.po.in create mode 100644 po/en_GB.po.in create mode 100644 po/eo.po.in create mode 100644 po/es.po.in create mode 100644 po/et.po.in create mode 100644 po/eu.po.in create mode 100644 po/fi.po.in create mode 100644 po/fo.po.in create mode 100644 po/fr.po.in create mode 100644 po/fr_CH.po.in create mode 100644 po/gl.po.in create mode 100644 po/he.po.in create mode 100644 po/hr.po.in create mode 100644 po/hu.po.in create mode 100644 po/id.po.in create mode 100644 po/it.po.in create mode 100644 po/ja.po.in create mode 100644 po/jv.po.in create mode 100644 po/kk.po.in create mode 100644 po/lt.po.in create mode 100644 po/lv.po.in create mode 100644 po/mk.po.in create mode 100644 po/nb.po.in create mode 100644 po/nds.po.in create mode 100644 po/nl.po.in create mode 100644 po/nn.po.in create mode 100644 po/pl.po.in create mode 100644 po/pt.po.in create mode 100644 po/pt_BR.po.in create mode 100644 po/ro.po.in create mode 100644 po/ru.po.in create mode 100644 po/sk.po.in create mode 100644 po/sl.po.in create mode 100644 po/sr.po.in create mode 100644 po/sv.po.in create mode 100644 po/ta.po.in create mode 100644 po/te.po.in create mode 100644 po/th.po.in create mode 100644 po/tr.po.in create mode 100644 po/uk.po.in create mode 100644 po/ur.po.in create mode 100644 po/vi.po.in create mode 100644 po/zh_CN.po.in create mode 100644 po/zh_HK.po.in create mode 100644 repomd.xml diff --git a/ABOUT-NLS b/ABOUT-NLS new file mode 100644 index 0000000..2f50c66 --- /dev/null +++ b/ABOUT-NLS @@ -0,0 +1,768 @@ +Notes on the Free Translation Project +************************************* + +Free software is going international! The Free Translation Project is +a way to get maintainers of free software, translators, and users all +together, so that will gradually become able to speak many languages. +A few packages already provide translations for their messages. + + If you found this `ABOUT-NLS' file inside a distribution, you may +assume that the distributed package does use GNU `gettext' internally, +itself available at your nearest GNU archive site. But you do _not_ +need to install GNU `gettext' prior to configuring, installing or using +this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work at translations should contact the appropriate team. + + When reporting bugs in the `intl/' directory or bugs which may be +related to internationalization, you should tell about the version of +`gettext' which is used. The information can be found in the +`intl/VERSION' file, in internationalized packages. + +Quick configuration advice +========================== + +If you want to exploit the full power of internationalization, you +should configure it using + + ./configure --with-included-gettext + +to force usage of internationalizing routines provided within this +package, despite the existence of internationalizing capabilities in the +operating system where this package is being installed. So far, only +the `gettext' implementation in the GNU C library version 2 provides as +many features (such as locale alias, message inheritance, automatic +charset conversion or plural form handling) as the implementation here. +It is also not possible to offer this additional functionality on top +of a `catgets' implementation. Future versions of GNU `gettext' will +very likely convey even more functionality. So it might be a good idea +to change to GNU `gettext' as soon as possible. + + So you need _not_ provide this option if you are using GNU libc 2 or +you have installed a recent copy of the GNU gettext package with the +included `libintl'. + +INSTALL Matters +=============== + +Some packages are "localizable" when properly installed; the programs +they contain can be made to speak your own native language. Most such +packages use GNU `gettext'. Other packages have their own ways to +internationalization, predating GNU `gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system already +provides the GNU `gettext' functions. If not, the GNU `gettext' own +library will be used. This library is wholly contained within this +package, usually in the `intl/' subdirectory, so prior installation of +the GNU `gettext' package is _not_ required. Installers may use +special options at configuration time for changing the default +behaviour. The commands: + + ./configure --with-included-gettext + ./configure --disable-nls + +will respectively bypass any pre-existing `gettext' to use the +internationalizing routines provided within this package, or else, +_totally_ disable translation of messages. + + When you already have GNU `gettext' installed on your system and run +configure without an option for your new package, `configure' will +probably detect the previously built and installed `libintl.a' file and +will decide to use this. This might be not what is desirable. You +should use the more recent version of the GNU `gettext' library. I.e. +if the file `intl/VERSION' shows that the library which comes with this +package is more recent, you should use + + ./configure --with-included-gettext + +to prevent auto-detection. + + The configuration process will not test for the `catgets' function +and therefore it will not be used. The reason is that even an +emulation of `gettext' on top of `catgets' could not provide all the +extensions of the GNU `gettext' library. + + Internationalized packages have usually many `po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at `configure' time by using the +`--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable `LINGUAS' +may be set, prior to configuration, to limit the installed set. +`LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +Using This Package +================== + +As a user, if your language has been installed for this package, you +only have to set the `LANG' environment variable to the appropriate +`LL_CC' combination. Here `LL' is an ISO 639 two-letter language code, +and `CC' is an ISO 3166 two-letter country code. For example, let's +suppose that you speak German and live in Germany. At the shell +prompt, merely execute `setenv LANG de_DE' (in `csh'), +`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). +This can be done from your `.login' or `.profile' file, once and for +all. + + You might think that the country code specification is redundant. +But in fact, some languages have dialects in different countries. For +example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The +country code serves to distinguish the dialects. + + The locale naming convention of `LL_CC', with `LL' denoting the +language and `CC' denoting the country, is the one use on systems based +on GNU libc. On other systems, some variations of this scheme are +used, such as `LL' or `LL_CC.ENCODING'. You can get the list of +locales supported by your system for your country by running the command +`locale -a | grep '^LL''. + + Not all programs have translations for all languages. By default, an +English message is shown in place of a nonexistent translation. If you +understand other languages, you can set up a priority list of languages. +This is done through a different environment variable, called +`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' +for the purpose of message handling, but you still need to have `LANG' +set to the primary language; this is required by other parts of the +system libraries. For example, some Swedish users who would rather +read translations in German than English for when Swedish is not +available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. + + Special advice for Norwegian users: The language code for Norwegian +bokma*l changed from `no' to `nb' recently (in 2003). During the +transition period, while some message catalogs for this language are +installed under `nb' and some older ones under `no', it's recommended +for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and +older translations are used. + + In the `LANGUAGE' environment variable, but not in the `LANG' +environment variable, `LL_CC' combinations can be abbreviated as `LL' +to denote the language's main dialect. For example, `de' is equivalent +to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' +(Portuguese as spoken in Portugal) in this context. + +Translating Teams +================= + +For the Free Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list. The up-to-date list of +teams can be found at the Free Translation Project's homepage, +`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams" +area. + + If you'd like to volunteer to _work_ at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is _not_ the same as the list itself, it has +`-request' appended. For example, speakers of Swedish can send a +message to `sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate +_actively_ in translations, or at solving translational difficulties, +rather than merely lurking around. If your team does not exist yet and +you want to start one, or if you are unsure about what to do or how to +get started, please write to `translation@iro.umontreal.ca' to reach the +coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology in use. Proven linguistic skill are praised more than +programming skill, here. + +Available Packages +================== + +Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of January +2004. The matrix shows, in regard of each package, for which languages +PO files have been submitted to translation coordination, with a +translation percentage of at least 50%. + + Ready PO files af am ar az be bg bs ca cs da de el en en_GB eo es + +----------------------------------------------------+ + a2ps | [] [] [] [] | + aegis | () | + ant-phone | () | + anubis | | + ap-utils | | + aspell | [] | + bash | [] [] [] [] | + batchelor | | + bfd | [] [] | + binutils | [] [] | + bison | [] [] [] | + bluez-pin | [] [] [] | + clisp | | + clisp | [] [] [] | + console-tools | [] [] | + coreutils | [] [] [] [] | + cpio | [] [] [] | + darkstat | [] () [] | + diffutils | [] [] [] [] [] [] [] | + e2fsprogs | [] [] [] | + enscript | [] [] [] [] | + error | [] [] [] [] [] | + fetchmail | [] () [] [] [] [] | + fileutils | [] [] [] | + findutils | [] [] [] [] [] [] [] | + flex | [] [] [] [] | + fslint | | + gas | [] | + gawk | [] [] [] [] | + gbiff | [] | + gcal | [] | + gcc | [] [] | + gettext | [] [] [] [] [] | + gettext-examples | [] [] [] [] | + gettext-runtime | [] [] [] [] [] | + gettext-tools | [] [] [] | + gimp-print | [] [] [] [] [] | + gliv | | + glunarclock | [] [] | + gnubiff | [] | + gnucash | [] () [] [] | + gnucash-glossary | [] () [] | + gnupg | [] () [] [] [] [] | + gpe-aerial | [] | + gpe-beam | [] [] | + gpe-calendar | [] [] | + gpe-clock | [] [] | + gpe-conf | [] [] | + gpe-contacts | [] [] | + gpe-edit | [] | + gpe-go | [] | + gpe-login | [] [] | + gpe-ownerinfo | [] [] | + gpe-sketchbook | [] [] | + gpe-su | [] [] | + gpe-taskmanager | [] [] | + gpe-timesheet | [] | + gpe-today | [] [] | + gpe-todo | [] [] | + gphoto2 | [] [] [] [] | + gprof | [] [] [] | + gpsdrive | () () () | + gramadoir | [] | + grep | [] [] [] [] [] [] | + gretl | [] | + gtick | [] () | + hello | [] [] [] [] [] [] | + id-utils | [] [] | + indent | [] [] [] [] | + iso_3166 | [] [] [] [] [] [] [] [] [] [] | + iso_3166_1 | [] [] [] [] [] [] | + iso_3166_2 | | + iso_3166_3 | [] | + iso_4217 | [] [] [] [] | + iso_639 | | + jpilot | [] [] [] | + jtag | | + jwhois | [] | + kbd | [] [] [] [] [] | + latrine | () | + ld | [] [] | + libc | [] [] [] [] [] [] | + libgpewidget | [] [] | + libiconv | [] [] [] [] [] | + lifelines | [] () | + lilypond | [] | + lingoteach | | + lingoteach_lessons | () () | + lynx | [] [] [] [] | + m4 | [] [] [] [] | + mailutils | [] [] | + make | [] [] [] | + man-db | [] () [] [] () | + minicom | [] [] [] | + mysecretdiary | [] [] [] | + nano | [] () [] [] [] | + nano_1_0 | [] () [] [] [] | + opcodes | [] | + parted | [] [] [] [] [] | + ptx | [] [] [] [] [] | + python | | + radius | [] | + recode | [] [] [] [] [] [] [] | + rpm | [] [] | + screem | | + scrollkeeper | [] [] [] [] [] [] | + sed | [] [] [] [] [] [] | + sh-utils | [] [] [] | + shared-mime-info | | + sharutils | [] [] [] [] [] [] | + silky | () | + skencil | [] () [] | + sketch | [] () [] | + soundtracker | [] [] [] | + sp | [] | + tar | [] [] [] [] | + texinfo | [] [] [] | + textutils | [] [] [] [] | + tin | () () | + tp-robot | | + tuxpaint | [] [] [] [] [] [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] [] [] [] | + vorbis-tools | [] [] [] [] | + wastesedge | () | + wdiff | [] [] [] [] | + wget | [] [] [] [] [] [] | + xchat | [] [] [] [] | + xfree86_xkb_xml | [] [] | + xpad | [] | + +----------------------------------------------------+ + af am ar az be bg bs ca cs da de el en en_GB eo es + 4 0 0 1 9 4 1 40 41 60 78 17 1 5 13 68 + + et eu fa fi fr ga gl he hr hu id is it ja ko lg + +-------------------------------------------------+ + a2ps | [] [] [] () () | + aegis | | + ant-phone | [] | + anubis | [] | + ap-utils | [] | + aspell | [] [] | + bash | [] [] | + batchelor | [] [] | + bfd | [] | + binutils | [] [] | + bison | [] [] [] [] | + bluez-pin | [] [] [] [] [] | + clisp | | + clisp | [] | + console-tools | | + coreutils | [] [] [] [] [] [] | + cpio | [] [] [] [] | + darkstat | () [] [] [] | + diffutils | [] [] [] [] [] [] [] | + e2fsprogs | | + enscript | [] [] | + error | [] [] [] [] | + fetchmail | [] | + fileutils | [] [] [] [] [] [] | + findutils | [] [] [] [] [] [] [] [] [] [] [] | + flex | [] [] [] | + fslint | [] | + gas | [] | + gawk | [] [] [] | + gbiff | [] | + gcal | [] | + gcc | [] | + gettext | [] [] [] | + gettext-examples | [] [] | + gettext-runtime | [] [] [] [] [] | + gettext-tools | [] [] [] | + gimp-print | [] [] | + gliv | () | + glunarclock | [] [] [] [] | + gnubiff | [] | + gnucash | () [] | + gnucash-glossary | [] | + gnupg | [] [] [] [] [] [] [] | + gpe-aerial | [] | + gpe-beam | [] | + gpe-calendar | [] [] [] | + gpe-clock | [] | + gpe-conf | [] | + gpe-contacts | [] [] | + gpe-edit | [] [] | + gpe-go | [] | + gpe-login | [] [] | + gpe-ownerinfo | [] [] [] | + gpe-sketchbook | [] | + gpe-su | [] | + gpe-taskmanager | [] | + gpe-timesheet | [] [] [] | + gpe-today | [] [] | + gpe-todo | [] [] | + gphoto2 | [] [] [] | + gprof | [] [] | + gpsdrive | () () () | + gramadoir | [] [] | + grep | [] [] [] [] [] [] [] [] [] [] [] | + gretl | [] [] | + gtick | [] [] [] | + hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | + id-utils | [] [] [] [] | + indent | [] [] [] [] [] [] [] [] [] | + iso_3166 | [] [] [] [] [] [] [] | + iso_3166_1 | [] [] [] [] [] | + iso_3166_2 | | + iso_3166_3 | | + iso_4217 | [] [] [] [] [] [] | + iso_639 | | + jpilot | [] () | + jtag | [] | + jwhois | [] [] [] [] | + kbd | [] | + latrine | [] | + ld | [] | + libc | [] [] [] [] [] [] | + libgpewidget | [] [] [] [] | + libiconv | [] [] [] [] [] [] [] [] [] | + lifelines | () | + lilypond | [] | + lingoteach | [] [] | + lingoteach_lessons | | + lynx | [] [] [] [] | + m4 | [] [] [] [] | + mailutils | | + make | [] [] [] [] [] [] | + man-db | () () | + minicom | [] [] [] [] | + mysecretdiary | [] [] | + nano | [] [] [] [] | + nano_1_0 | [] [] [] [] | + opcodes | [] | + parted | [] [] [] | + ptx | [] [] [] [] [] [] [] | + python | | + radius | [] | + recode | [] [] [] [] [] [] | + rpm | [] [] | + screem | | + scrollkeeper | [] | + sed | [] [] [] [] [] [] [] [] [] | + sh-utils | [] [] [] [] [] [] [] | + shared-mime-info | [] [] [] | + sharutils | [] [] [] [] [] | + silky | () [] () () | + skencil | [] | + sketch | [] | + soundtracker | [] [] | + sp | [] () | + tar | [] [] [] [] [] [] [] [] [] | + texinfo | [] [] [] [] | + textutils | [] [] [] [] [] [] | + tin | [] () | + tp-robot | [] | + tuxpaint | [] [] [] [] [] [] [] [] [] | + unicode-han-tra... | | + unicode-transla... | [] [] | + util-linux | [] [] [] [] () [] | + vorbis-tools | [] | + wastesedge | () | + wdiff | [] [] [] [] [] [] | + wget | [] [] [] [] [] [] [] | + xchat | [] [] [] | + xfree86_xkb_xml | [] [] | + xpad | [] [] | + +-------------------------------------------------+ + et eu fa fi fr ga gl he hr hu id is it ja ko lg + 22 2 1 26 106 28 24 8 10 41 33 1 26 33 12 0 + + lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru + +-----------------------------------------------------+ + a2ps | [] [] () () [] [] [] | + aegis | () () () | + ant-phone | [] [] | + anubis | [] [] [] [] [] [] | + ap-utils | [] () [] | + aspell | [] | + bash | [] [] [] | + batchelor | [] | + bfd | [] | + binutils | [] | + bison | [] [] [] [] [] | + bluez-pin | [] [] [] | + clisp | | + clisp | [] | + console-tools | [] | + coreutils | [] [] | + cpio | [] [] [] [] [] | + darkstat | [] [] [] [] | + diffutils | [] [] [] [] [] [] | + e2fsprogs | [] | + enscript | [] [] [] [] | + error | [] [] [] | + fetchmail | [] [] () [] | + fileutils | [] [] [] | + findutils | [] [] [] [] [] | + flex | [] [] [] [] | + fslint | [] [] | + gas | | + gawk | [] [] [] | + gbiff | [] [] | + gcal | | + gcc | | + gettext | [] [] [] | + gettext-examples | [] [] [] | + gettext-runtime | [] [] [] [] | + gettext-tools | [] [] | + gimp-print | [] | + gliv | [] [] [] | + glunarclock | [] [] [] [] | + gnubiff | [] | + gnucash | [] [] () [] | + gnucash-glossary | [] [] | + gnupg | [] | + gpe-aerial | [] [] [] [] | + gpe-beam | [] [] [] [] | + gpe-calendar | [] [] [] [] | + gpe-clock | [] [] [] [] | + gpe-conf | [] [] [] [] | + gpe-contacts | [] [] [] [] | + gpe-edit | [] [] [] [] | + gpe-go | [] [] [] | + gpe-login | [] [] [] [] | + gpe-ownerinfo | [] [] [] [] | + gpe-sketchbook | [] [] [] [] | + gpe-su | [] [] [] [] | + gpe-taskmanager | [] [] [] [] | + gpe-timesheet | [] [] [] [] | + gpe-today | [] [] [] [] | + gpe-todo | [] [] [] [] | + gphoto2 | [] | + gprof | [] [] | + gpsdrive | () () [] | + gramadoir | () [] | + grep | [] [] [] [] [] | + gretl | | + gtick | [] [] [] | + hello | [] [] [] [] [] [] [] [] [] [] | + id-utils | [] [] [] [] | + indent | [] [] [] [] | + iso_3166 | [] [] [] | + iso_3166_1 | [] [] | + iso_3166_2 | | + iso_3166_3 | [] | + iso_4217 | [] [] [] [] [] [] [] [] | + iso_639 | [] | + jpilot | () () | + jtag | | + jwhois | [] [] [] [] () | + kbd | [] [] [] | + latrine | [] | + ld | | + libc | [] [] [] [] | + libgpewidget | [] [] [] | + libiconv | [] [] [] [] [] | + lifelines | | + lilypond | | + lingoteach | | + lingoteach_lessons | | + lynx | [] [] [] | + m4 | [] [] [] [] [] | + mailutils | [] [] [] | + make | [] [] [] [] | + man-db | [] | + minicom | [] [] [] [] | + mysecretdiary | [] [] [] | + nano | [] [] [] [] [] | + nano_1_0 | [] [] [] [] [] [] | + opcodes | [] [] | + parted | [] [] [] [] | + ptx | [] [] [] [] [] [] [] [] | + python | | + radius | [] [] | + recode | [] [] [] [] | + rpm | [] [] [] | + screem | | + scrollkeeper | [] [] [] [] [] | + sed | [] [] [] | + sh-utils | [] [] | + shared-mime-info | [] [] | + sharutils | [] [] | + silky | () | + skencil | [] [] | + sketch | [] [] | + soundtracker | | + sp | | + tar | [] [] [] [] [] [] | + texinfo | [] [] [] [] | + textutils | [] [] | + tin | | + tp-robot | [] | + tuxpaint | [] [] [] [] [] [] [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] [] | + vorbis-tools | [] [] [] | + wastesedge | | + wdiff | [] [] [] [] [] | + wget | [] [] [] | + xchat | [] [] [] | + xfree86_xkb_xml | [] [] | + xpad | [] [] | + +-----------------------------------------------------+ + lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru + 1 2 0 3 12 0 10 69 6 7 1 40 26 36 76 63 + + sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu + +-----------------------------------------------------+ + a2ps | [] [] [] [] | 16 + aegis | | 0 + ant-phone | | 3 + anubis | [] [] | 9 + ap-utils | () | 3 + aspell | | 4 + bash | | 9 + batchelor | | 3 + bfd | [] [] | 6 + binutils | [] [] [] | 8 + bison | [] [] | 14 + bluez-pin | [] [] [] | 14 + clisp | | 0 + clisp | | 5 + console-tools | | 3 + coreutils | [] [] [] [] | 16 + cpio | [] [] | 14 + darkstat | [] [] [] () () | 12 + diffutils | [] [] [] | 23 + e2fsprogs | [] [] | 6 + enscript | [] [] | 12 + error | [] [] [] | 15 + fetchmail | [] [] | 11 + fileutils | [] [] [] [] [] | 17 + findutils | [] [] [] [] [] [] | 29 + flex | [] [] | 13 + fslint | | 3 + gas | [] | 3 + gawk | [] [] | 12 + gbiff | | 4 + gcal | [] [] | 4 + gcc | [] | 4 + gettext | [] [] [] [] [] | 16 + gettext-examples | [] [] [] [] [] | 14 + gettext-runtime | [] [] [] [] [] [] [] [] | 22 + gettext-tools | [] [] [] [] [] [] | 14 + gimp-print | [] [] | 10 + gliv | | 3 + glunarclock | [] [] [] | 13 + gnubiff | | 3 + gnucash | [] [] | 9 + gnucash-glossary | [] [] [] | 8 + gnupg | [] [] [] [] | 17 + gpe-aerial | [] | 7 + gpe-beam | [] | 8 + gpe-calendar | [] [] [] [] | 13 + gpe-clock | [] [] [] | 10 + gpe-conf | [] [] | 9 + gpe-contacts | [] [] [] | 11 + gpe-edit | [] [] [] [] [] | 12 + gpe-go | | 5 + gpe-login | [] [] [] [] [] | 13 + gpe-ownerinfo | [] [] [] [] | 13 + gpe-sketchbook | [] [] | 9 + gpe-su | [] [] [] | 10 + gpe-taskmanager | [] [] [] | 10 + gpe-timesheet | [] [] [] [] | 12 + gpe-today | [] [] [] [] [] | 13 + gpe-todo | [] [] [] [] | 12 + gphoto2 | [] [] [] | 11 + gprof | [] [] | 9 + gpsdrive | [] [] | 3 + gramadoir | [] | 5 + grep | [] [] [] [] | 26 + gretl | | 3 + gtick | | 7 + hello | [] [] [] [] [] | 34 + id-utils | [] [] | 12 + indent | [] [] [] [] | 21 + iso_3166 | [] [] [] [] [] [] [] | 27 + iso_3166_1 | [] [] [] | 16 + iso_3166_2 | | 0 + iso_3166_3 | | 2 + iso_4217 | [] [] [] [] [] [] | 24 + iso_639 | | 1 + jpilot | [] [] [] [] [] | 9 + jtag | [] | 2 + jwhois | () [] [] | 11 + kbd | [] [] | 11 + latrine | | 2 + ld | [] [] | 5 + libc | [] [] [] [] | 20 + libgpewidget | [] [] [] [] | 13 + libiconv | [] [] [] [] [] [] [] [] | 27 + lifelines | [] | 2 + lilypond | [] | 3 + lingoteach | | 2 + lingoteach_lessons | () | 0 + lynx | [] [] [] | 14 + m4 | [] [] | 15 + mailutils | | 5 + make | [] [] [] | 16 + man-db | [] | 5 + minicom | | 11 + mysecretdiary | [] [] | 10 + nano | [] [] [] [] | 17 + nano_1_0 | [] [] [] | 17 + opcodes | [] [] | 6 + parted | [] [] [] | 15 + ptx | [] [] | 22 + python | | 0 + radius | | 4 + recode | [] [] [] | 20 + rpm | [] [] | 9 + screem | [] [] | 2 + scrollkeeper | [] [] [] | 15 + sed | [] [] [] [] [] [] | 24 + sh-utils | [] [] | 14 + shared-mime-info | [] [] | 7 + sharutils | [] [] [] [] | 17 + silky | () | 3 + skencil | [] | 6 + sketch | [] | 6 + soundtracker | [] [] | 7 + sp | [] | 3 + tar | [] [] [] [] [] | 24 + texinfo | [] [] [] | 14 + textutils | [] [] [] [] | 16 + tin | | 1 + tp-robot | | 2 + tuxpaint | [] [] [] [] [] | 29 + unicode-han-tra... | | 0 + unicode-transla... | | 2 + util-linux | [] [] | 15 + vorbis-tools | | 8 + wastesedge | | 0 + wdiff | [] [] [] | 18 + wget | [] [] [] [] [] [] [] [] | 24 + xchat | [] [] [] [] [] | 15 + xfree86_xkb_xml | [] [] [] [] [] | 11 + xpad | | 5 + +-----------------------------------------------------+ + 63 teams sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu + 131 domains 47 19 28 83 0 0 59 13 1 1 11 0 22 22 0 1373 + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and +distributed as such by its maintainer. There might be an observable +lag between the mere existence a PO file and its wide availability in a +distribution. + + If January 2004 seems to be old, you may fetch a more recent copy of +this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date +matrix with full percentage details can be found at +`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. + +Using `gettext' in new packages +=============================== + +If you are writing a freely available program and want to +internationalize it you are welcome to use GNU `gettext' in your +package. Of course you have to respect the GNU Library General Public +License which covers the use of the GNU `gettext' library. This means +in particular that even non-free programs can use `libintl' as a shared +library, whereas only free software can use `libintl' as a static +library or use modified versions of `libintl'. + + Once the sources are changed appropriately and the setup can handle +the use of `gettext' the only thing missing are the translations. The +Free Translation Project is also available for packages which are not +developed inside the GNU project. Therefore the information given above +applies also for every other Free Software Project. Contact +`translation@iro.umontreal.ca' to make the `.pot' files available to +the translation teams. + diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..426de51 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,7 @@ +Michael Farmbauer +Martin Schaller +Pierre Grandin +Alexander Atanasov + +And all the Navit Team members and contributors. +See http://wiki.navit-project.org/index.php/Navit_project_members_and_contributors for the full list! diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..20d23ef --- /dev/null +++ b/COPYING @@ -0,0 +1,164 @@ +The following files are lincensed under the terms of the +GNU General Public License (see GPL-2): + +navit/tools/gpx2navit_txt/src/utils.c +navit/tools/gpx2navit_txt/src/setmeta.c +navit/tools/gpx2navit_txt/src/setpath.c +navit/tools/gpx2navit_txt/src/emess.h +navit/tools/gpx2navit_txt/src/main.c +navit/tools/gpx2navit_txt/src/geod_for.c +navit/tools/gpx2navit_txt/src/setwpt.c +navit/tools/gpx2navit_txt/src/gpx2navit_txt.h +navit/tools/gpx2navit_txt/src/geodesic.h +navit/tools/gpx2navit_txt/src/geod_set.c +navit/tools/gpx2navit_txt/src/errorcode.h +navit/tools/gpx2navit_txt/src/geod_inv.c +navit/tools/gpx2navit_txt/src/elementControl.c +navit/tools/gpx2navit_txt/src/misc.c +navit/tools/gpx2navit_txt/src/parser.c +navit/tools/gpx2navit_txt/depcomp +navit/tools/gpx2navit_txt/config.guess +navit/tools/gpx2navit_txt/config.sub +navit/tools/gpx2navit_txt/COPYING +navit/tools/gpx2navit_txt/missing +navit/vehicle/file/vehicle_file.c +navit/vehicle/demo/vehicle_demo.c +navit/vehicle/gpsd/vehicle_gpsd.c +navit/gui/sdl/cegui_keyboard.h +navit/gui/sdl/wmcontrol.c +navit/gui/sdl/sdl_events.cpp +navit/gui/sdl/wmcontrol.h +navit/gui/sdl/gui_sdl.h +navit/gui/sdl/sdl_events.h +navit/gui/sdl/cegui_keyboard.cpp +navit/gui/sdl/gui_sdl_window.cpp +navit/gui/gtk/gui_gtk.h +navit/gui/gtk/gui_gtk_window.c +navit/gui/gtk/datawindow.c +navit/gui/gtk/destination.c +navit/gui/gtk/gui_gtk_statusbar.c +navit/gui/gtk/gui_gtk_action.c +navit/gui/internal/gui_internal.c +navit/graphics/opengl/graphics_opengl.c +navit/graphics/gtk_gl_ext/graphics_gtk_gl_ext.c +navit/graphics/qt_qpainter/graphics_qt_qpainter.cpp +navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c +navit/graphics/null/graphics_null.c +navit/speech/cmdline/speech_cmdline.c +navit/speech/speech_dispatcher/speech_speech_dispatcher.c +navit/data/mg/tree.c +navit/data/mg/poly.c +navit/data/mg/street.c +navit/data/mg/town.c +navit/data/mg/mg.h +navit/data/mg/block.c +navit/data/mg/map.c +navit/data/textfile/textfile.c +navit/data/textfile/textfile.h +navit/data/csv/csv.c +navit/data/csv/csv.h +navit/data/binfile/binfile.c +navit/data/garmin_img/garmin_img.c +navit/data/garmin/gentypes.c +navit/data/garmin/gar2navit.c +navit/data/garmin/garmin.c +navit/osd/core/osd_core.c +navit/binding/python/binding_python.c +navit/binding/dbus/binding_dbus.c +navit/country.c +navit/track.c +navit/compass.c +navit/util.c +navit/debug.c +navit/route.c +navit/param.c +navit/menu.c +navit/speech.c +navit/attr.c +navit/transform.c +navit/projection.c +navit/layout.c +navit/cursor.c +navit/event.c +navit/gui.c +navit/osd.c +navit/item.c +navit/navigation.c +navit/graphics.c +navit/profile.c +navit/popup.c +navit/coord.c +navit/maptool.c +navit/mapset.c +navit/plugin.c +navit/data_window.c +navit/search.c +navit/map.c +navit/maptype.c +navit/file.c +navit/vehicle.c +navit/navit.c +navit/log.c +navit/phrase.c +navit/main.c +navit/xmlconfig.c +navit/callback.c + + +The following files are lincensed under the terms of the +GNU Library General Public License (see LGPL): + +navit/callback.h +navit/country.h +navit/track.h +navit/compass.h +navit/item_def.h +navit/util.h +navit/debug.h +navit/point.h +navit/route.h +navit/param.h +navit/zipfile.h +navit/menu.h +navit/map_data.h +navit/speech.h +navit/data.h +navit/attr.h +navit/data_window_int.h +navit/transform.h +navit/plugin_def.h +navit/projection.h +navit/layout.h +navit/cursor.h +navit/color.h +navit/destination.h +navit/event.h +navit/gui.h +navit/osd.h +navit/item.h +navit/navigation.h +navit/graphics.h +navit/profile.h +navit/popup.h +navit/types.h +navit/coord.h +navit/draw_info.h +navit/endianess.h +navit/map-share.h +navit/mapset.h +navit/plugin.h +navit/data_window.h +navit/search.h +navit/gtkext.h +navit/layer.h +navit/map.h +navit/maptype.h +navit/file.h +navit/vehicle.h +navit/log.h +navit/navit.h +navit/phrase.h +navit/main.h +navit/xmlconfig.h +navit/attr_def.h + diff --git a/COPYRIGHT b/COPYRIGHT new file mode 100644 index 0000000..bc6a0e4 --- /dev/null +++ b/COPYRIGHT @@ -0,0 +1,2 @@ +Unless stated otherwise, all files are: +Copyright 2005 - 2008 Navit Team (see AUTHORS) and are licensed under the GPLv2 (see GPL-2 and COPYING) diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..411115f --- /dev/null +++ b/ChangeLog @@ -0,0 +1,4 @@ +Changes and documentation about Navit can be found in the wiki at: + http://wiki.navit-project.org +A timeline of opened and closed issue tickets can be found at our trac instance: + http://trac.navit-project.org diff --git a/GPL-2 b/GPL-2 new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/GPL-2 @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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; either version 2 of the License, or + (at your option) any later version. + + 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. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..7d1c323 --- /dev/null +++ b/INSTALL @@ -0,0 +1,365 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006, 2007, 2008, 2009 Free Software Foundation, Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + + The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type `make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 5. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/LGPL-2 b/LGPL-2 new file mode 100644 index 0000000..2676d08 --- /dev/null +++ b/LGPL-2 @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..81f011c --- /dev/null +++ b/Makefile.am @@ -0,0 +1,25 @@ +ACLOCAL_AMFLAGS= -I m4 +include $(top_srcdir)/Makefile.inc +SUBDIRS= +if ENABLE_NLS +XCFLAGS=-DINSTALLPREFIX=INSTALLDIR +if SUPPORT_WIN32 +XCFLAGS+=-DSUBLANG_BENGALI_BANGLADESH=0x03 -DSUBLANG_PUNJABI_PAKISTAN=0x03 -DSUBLANG_ROMANIAN_MOLDOVA=0x03 +if SUPPORT_WIN32CE +if SHARED_LIBNAVIT +XCFLAGS+=-L../navit/support/libc -lsupport_libc +AM_MAKEFLAGS=l=l +SUBDIRS+=navit/support/libc +endif +endif +endif +if SUPPORT_ANDROID +XCFLAGS+=-Xcompiler -nostartfiles +endif +export XCFLAGS +SUBDIRS+=intl po man +endif +SUBDIRS+=navit +pkgdoc_DATA = README +EXTRA_DIST = README COPYRIGHT LGPL-2 GPL-2 COPYING INSTALL +DIST_SUBDIRS=intl po navit man diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..0c74f38 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,951 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/config.h.in \ + $(top_srcdir)/Makefile.inc $(top_srcdir)/configure \ + $(top_srcdir)/intl/Makefile.in ABOUT-NLS AUTHORS COPYING \ + ChangeLog INSTALL NEWS compile config.guess config.rpath \ + config.sub depcomp install-sh ltmain.sh missing mkinstalldirs +@ENABLE_NLS_TRUE@@SUPPORT_WIN32_TRUE@am__append_1 = -DSUBLANG_BENGALI_BANGLADESH=0x03 -DSUBLANG_PUNJABI_PAKISTAN=0x03 -DSUBLANG_ROMANIAN_MOLDOVA=0x03 +@ENABLE_NLS_TRUE@@SHARED_LIBNAVIT_TRUE@@SUPPORT_WIN32CE_TRUE@@SUPPORT_WIN32_TRUE@am__append_2 = -L../navit/support/libc -lsupport_libc +@ENABLE_NLS_TRUE@@SHARED_LIBNAVIT_TRUE@@SUPPORT_WIN32CE_TRUE@@SUPPORT_WIN32_TRUE@am__append_3 = navit/support/libc +@ENABLE_NLS_TRUE@@SUPPORT_ANDROID_TRUE@am__append_4 = -Xcompiler -nostartfiles +@ENABLE_NLS_TRUE@am__append_5 = intl po man +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = intl/Makefile +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(pkgdocdir)" +DATA = $(pkgdoc_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir dist dist-all distcheck +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d "$(distdir)" \ + || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr "$(distdir)"; }; } +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +ACLOCAL_AMFLAGS = -I m4 +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +SUBDIRS = $(am__append_3) $(am__append_5) navit +@ENABLE_NLS_TRUE@XCFLAGS = -DINSTALLPREFIX=INSTALLDIR $(am__append_1) \ +@ENABLE_NLS_TRUE@ $(am__append_2) $(am__append_4) +@ENABLE_NLS_TRUE@@SHARED_LIBNAVIT_TRUE@@SUPPORT_WIN32CE_TRUE@@SUPPORT_WIN32_TRUE@AM_MAKEFLAGS = l=l +pkgdoc_DATA = README +EXTRA_DIST = README COPYRIGHT LGPL-2 GPL-2 COPYING INSTALL +DIST_SUBDIRS = intl po navit man +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +am--refresh: + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +intl/Makefile: $(top_builddir)/config.status $(top_srcdir)/intl/Makefile.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt +install-pkgdocDATA: $(pkgdoc_DATA) + @$(NORMAL_INSTALL) + test -z "$(pkgdocdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgdocdir)" + @list='$(pkgdoc_DATA)'; test -n "$(pkgdocdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdocdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdocdir)" || exit $$?; \ + done + +uninstall-pkgdocDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgdoc_DATA)'; test -n "$(pkgdocdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(pkgdocdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(pkgdocdir)" && rm -f $$files + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + --with-included-gettext \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @$(am__cd) '$(distuninstallcheck_dir)' \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(DATA) config.h +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(pkgdocdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-hdr \ + distclean-libtool distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-pkgdocDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-pkgdocDATA + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ + ctags-recursive install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-generic \ + clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ + dist-gzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \ + distcheck distclean distclean-generic distclean-hdr \ + distclean-libtool distclean-tags distcleancheck distdir \ + distuninstallcheck dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pkgdocDATA install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-pkgdocDATA + +@ENABLE_NLS_TRUE@export XCFLAGS + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Makefile.inc b/Makefile.inc new file mode 100644 index 0000000..8aa47a6 --- /dev/null +++ b/Makefile.inc @@ -0,0 +1,15 @@ +modulebindingdir=$(pkglibdir)/binding +modulemapdir=$(pkglibdir)/map +modulefontdir=$(pkglibdir)/font +modulegraphicsdir=$(pkglibdir)/graphics +moduleguidir=$(pkglibdir)/gui +modulespeechdir=$(pkglibdir)/speech +moduleosddir=$(pkglibdir)/osd +modulevehicledir=$(pkglibdir)/vehicle +moduleplugindir=$(pkglibdir)/plugin +moduleautoloaddir=$(pkglibdir)/autoload +pkgdocdir=$(pkgdatadir) +xpmdir=$(pkgdatadir)/xpm +skinsdir=$(pkgdatadir)/skins +fontsdir=$(pkgdatadir)/fonts +mapsdir=$(pkgdatadir)/maps diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/README b/README new file mode 100644 index 0000000..3641dcb --- /dev/null +++ b/README @@ -0,0 +1,101 @@ +NavIT +===== + +Navit is a open source (GPL) car navigation system with routing engine. + +It's modular design is capable of using vector maps of various formats +for routing and rendering of the displayed map. It's even possible to +use multiple maps at a time. + +The GTK+ or SDL user interfaces are designed to work well with touch +screen displays. Points of Interest of various formats are displayed +on the map. + +The current vehicle position is either read from gpsd or directly from +NMEA GPS sensors. + +The routing engine not only calculates an optimal route to your +destination, but also generates directions and even speaks to you. + +Navit currently speaks 27 languages : +- Brazilian Portuguese +- Bulgarian +- Chinese (Hong Kong) +- Czech +- Danish +- Dutch +- English +- Estonian +- Finnish +- French +- German +- Hebrew +- Hungarian +- Italian +- Japanese +- Norwegian Bokmal +- Polish +- Portuguese +- Romanian +- Russian +- Slovak +- Slovenian +- Spanish +- Swedish +- Telugu +- Thai +- Turkish + +You can help translating via our web based translation page : + http://translations.launchpad.net/navit/trunk/+pots/navit + + +For help or more information, please refer to the wiki : + http://wiki.navit-project.org + +If you don't know where to start, we recommend you to read the +Interactive Help : http://wiki.navit-project.org/index.php/Interactive_help + + +Maps: +===== + +The best navigation system is useless without maps. Those three maps +are known to work: + +- OpenStreetMaps : display, routing, but street name search isn't complete + (see http://wiki.navit-project.org/index.php/OpenStreetMaps ) + +- Grosser Reiseplaner and compliant maps : full support + (see http://wiki.navit-project.org/index.php/European_maps ) + +- Garmin maps : display, routing, search is being worked on + (see http://wiki.navit-project.org/index.php/Garmin_maps ) + + +GPS Support: +============ + +Navit read the current vehicle position : +- directly from a file +- from gpsd (local or remote) +- from udp server (friends tracking) (experimental) + + +Routing algorithm +================= + +NavIt uses a Dijkstra algorithm for routing. The routing starts at the +destination by assigning a value to each point directly connected to +destination point. The value represents the estimated time needed to +pass this distance. + +Now the point with the lowest value is choosen using the Fibonacci +heap and a value is assigned to connected points whos are +unevaluated or whos current value ist greater than the new one. + +The search is repeated until the origin is found. + +Once the origin is reached, all that needs to be done is to follow the +points with the lowest values to the destination. + diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..b721378 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,1189 @@ +# generated automatically by aclocal 1.11.1 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],, +[m4_warning([this file was generated for autoconf 2.68. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) + +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 1 (pkg-config-0.24) +# +# Copyright © 2004 Scott James Remnant . +# +# 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; either version 2 of the License, or +# (at your option) any later version. +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# PKG_PROG_PKG_CONFIG([MIN-VERSION]) +# ---------------------------------- +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])# PKG_PROG_PKG_CONFIG + +# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# +# Check to see whether a particular set of modules exists. Similar +# to PKG_CHECK_MODULES(), but does not set variables or print errors. +# +# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +# only at the first occurence in configure.ac, so if the first place +# it's called might be skipped (such as if it is within an "if", you +# have to call PKG_CHECK_EXISTS manually +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +# --------------------------------------------- +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])# _PKG_CONFIG + +# _PKG_SHORT_ERRORS_SUPPORTED +# ----------------------------- +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])# _PKG_SHORT_ERRORS_SUPPORTED + + +# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# +# +# Note that if there is a possibility the first call to +# PKG_CHECK_MODULES might not happen, you should be sure to include an +# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +# +# +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])# PKG_CHECK_MODULES + +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.11.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 9 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 10 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 5 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 8 + +# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. +AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 16 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.62])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) + +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 + +# AM_PROG_CC_C_O +# -------------- +# Like AC_PROG_CC_C_O, but changed for automake. +AC_DEFUN([AM_PROG_CC_C_O], +[AC_REQUIRE([AC_PROG_CC_C_O])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +dnl Make sure AC_PROG_CC is never called again, or it will override our +dnl setting of CC. +m4_define([AC_PROG_CC], + [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/codeset.m4]) +m4_include([m4/gettext.m4]) +m4_include([m4/glibc21.m4]) +m4_include([m4/iconv.m4]) +m4_include([m4/intdiv0.m4]) +m4_include([m4/intmax.m4]) +m4_include([m4/inttypes-pri.m4]) +m4_include([m4/inttypes.m4]) +m4_include([m4/inttypes_h.m4]) +m4_include([m4/isc-posix.m4]) +m4_include([m4/lcmessage.m4]) +m4_include([m4/lib-ld.m4]) +m4_include([m4/lib-link.m4]) +m4_include([m4/lib-prefix.m4]) +m4_include([m4/libtool.m4]) +m4_include([m4/longdouble.m4]) +m4_include([m4/longlong.m4]) +m4_include([m4/ltoptions.m4]) +m4_include([m4/ltsugar.m4]) +m4_include([m4/ltversion.m4]) +m4_include([m4/lt~obsolete.m4]) +m4_include([m4/nls.m4]) +m4_include([m4/po.m4]) +m4_include([m4/printf-posix.m4]) +m4_include([m4/progtest.m4]) +m4_include([m4/signed.m4]) +m4_include([m4/size_max.m4]) +m4_include([m4/stdint_h.m4]) +m4_include([m4/uintmax_t.m4]) +m4_include([m4/ulonglong.m4]) +m4_include([m4/wchar_t.m4]) +m4_include([m4/wint_t.m4]) +m4_include([m4/xsize.m4]) diff --git a/compile b/compile new file mode 100755 index 0000000..c0096a7 --- /dev/null +++ b/compile @@ -0,0 +1,143 @@ +#! /bin/sh +# Wrapper for compilers which do not understand `-c -o'. + +scriptversion=2009-10-06.20; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009 Free Software +# Foundation, Inc. +# Written by Tom Tromey . +# +# 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; either version 2, or (at your option) +# any later version. +# +# 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand `-c -o'. +Remove `-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file `INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; +esac + +ofile= +cfile= +eat= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as `compile cc -o foo foo.c'. + # So we strip `-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no `-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # `.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use `[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/config.guess b/config.guess new file mode 100755 index 0000000..666c5ad --- /dev/null +++ b/config.guess @@ -0,0 +1,1511 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 +# Free Software Foundation, Inc. + +timestamp='2009-11-20' + +# This file 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; either version 2 of the License, or +# (at your option) any later version. +# +# 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. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner. Please send patches (context +# diff format) to and include a ChangeLog +# entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "${UNAME_MACHINE}" in + i?86) + test -z "$VENDOR" && VENDOR=pc + ;; + *) + test -z "$VENDOR" && VENDOR=unknown + ;; +esac +test -f /etc/SuSE-release -o -f /.buildenv && VENDOR=suse + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-${VENDOR}-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-${VENDOR}-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-${VENDOR}-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-${VENDOR}-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-${VENDOR}-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[456]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-${VENDOR}-osf1mk + else + echo ${UNAME_MACHINE}-${VENDOR}-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-${VENDOR}-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-${VENDOR}-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-${VENDOR}-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-${VENDOR}-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-${VENDOR}-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-${VENDOR}-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-${VENDOR}-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-${VENDOR}-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-${VENDOR}-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-${VENDOR}-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-${VENDOR}-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu + else + echo ${UNAME_MACHINE}-${VENDOR}-linux-gnueabi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-${VENDOR}-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-${VENDOR}-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-${VENDOR}-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-${VENDOR}-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-${VENDOR}-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-${VENDOR}-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-${VENDOR}-linux-gnu ;; + PA8*) echo hppa2.0-${VENDOR}-linux-gnu ;; + *) echo hppa-${VENDOR}-linux-gnu ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-${VENDOR}-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-${VENDOR}-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-${VENDOR}-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-${VENDOR}-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-${VENDOR}-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-${VENDOR}-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-${VENDOR}-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-${VENDOR}-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-${VENDOR}-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-${VENDOR}-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-${VENDOR}-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-${VENDOR}-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + UNAME_PROCESSOR="x86_64" + fi + fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-${VENDOR}-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-${VENDOR}-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-${VENDOR}-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-${VENDOR}-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-${VENDOR}-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..fa38695 --- /dev/null +++ b/config.h.in @@ -0,0 +1,522 @@ +/* config.h.in. Generated from configure.in by autoheader. */ + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* Define to avoid floating point */ +#undef AVOID_FLOAT + +/* Define to avoid unaligned access */ +#undef AVOID_UNALIGNED + +/* Size of Cache in Bytes */ +#undef CACHE_SIZE + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +#undef C_ALLOCA + +/* Use system bus instead of session bus for binding dbus */ +#undef DBUS_USE_SYSTEM_BUS + +/* Define to 1 if translation of program messages to the user's native + language is requested. */ +#undef ENABLE_NLS + +/* Define to add support for specifying roll angle in transformation */ +#undef ENABLE_ROLL + +/* Freetype fonts to use */ +#undef FREETYPE_FONTS + +/* Build with fribidi support for older versions of fribidi */ +#undef FRIBIDIOLD + +/* Build with graphics sdl */ +#undef GRAPHICS_SDL + +/* Define to 1 if you have `alloca', as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#undef HAVE_ALLOCA_H + +/* Have Android API */ +#undef HAVE_API_ANDROID + +/* Have Windows API */ +#undef HAVE_API_WIN32 + +/* Have Windows Base API */ +#undef HAVE_API_WIN32_BASE + +/* Have Windows CE API */ +#undef HAVE_API_WIN32_CE + +/* Define to 1 if you have the header file. */ +#undef HAVE_ARGZ_H + +/* Define to 1 if you have the `asprintf' function. */ +#undef HAVE_ASPRINTF + +/* Define to 1 if you have byteswap.h */ +#undef HAVE_BYTESWAP_H + +/* Define to 1 if you have the `CreateProcess' function. */ +#undef HAVE_CREATEPROCESS + +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +#undef HAVE_DCGETTEXT + +/* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you + don't. */ +#undef HAVE_DECL_FEOF_UNLOCKED + +/* Define to 1 if you have the declaration of `fgets_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_FGETS_UNLOCKED + +/* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you + don't. */ +#undef HAVE_DECL_GETC_UNLOCKED + +/* Define to 1 if you have the declaration of `_snprintf', and to 0 if you + don't. */ +#undef HAVE_DECL__SNPRINTF + +/* Define to 1 if you have the declaration of `_snwprintf', and to 0 if you + don't. */ +#undef HAVE_DECL__SNWPRINTF + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have dlopen */ +#undef HAVE_DLOPEN + +/* Define to 1 if you have fontconfig */ +#undef HAVE_FONTCONFIG + +/* Define to 1 if you have the header file. */ +#undef HAVE_FREEGLUT + +/* Define to 1 if you have the header file. */ +#undef HAVE_FREEIMAGE + +/* Define to 1 if you have the `fsync' function. */ +#undef HAVE_FSYNC + +/* Define to 1 if you have the `fwprintf' function. */ +#undef HAVE_FWPRINTF + +/* Define to 1 if you have the `getcwd' function. */ +#undef HAVE_GETCWD + +/* Define to 1 if you have the `getegid' function. */ +#undef HAVE_GETEGID + +/* Define to 1 if you have the `geteuid' function. */ +#undef HAVE_GETEUID + +/* Define to 1 if you have the `getgid' function. */ +#undef HAVE_GETGID + +/* Define to 1 if you have the getopt header */ +#undef HAVE_GETOPT_H + +/* Define to 1 if you have the `getpagesize' function. */ +#undef HAVE_GETPAGESIZE + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#undef HAVE_GETTEXT + +/* Define to 1 if you have the `getuid' function. */ +#undef HAVE_GETUID + +/* Define to 1 if you have the header file. */ +#undef HAVE_GLC + +/* Define to 1 if you have (external) glib library */ +#undef HAVE_GLIB + +/* Define to 1 if you have the header file. */ +#undef HAVE_GLUT + +/* Define to 1 if you have gmodule */ +#undef HAVE_GMODULE + +/* Have the gpsbt library */ +#undef HAVE_GPSBT + +/* Define to 1 if you have png support in gd. */ +#undef HAVE_GRAPHICS_GD_PNG + +/* Define to 1 if you have gtk2 */ +#undef HAVE_GTK2 + +/* Define if you have the iconv() function. */ +#undef HAVE_ICONV + +/* Define to 1 if you have imlib2 */ +#undef HAVE_IMLIB2 + +/* Define if you have the 'intmax_t' type in or . */ +#undef HAVE_INTMAX_T + +/* Define if exists and doesn't clash with . */ +#undef HAVE_INTTYPES_H + +/* Define if exists, doesn't clash with , and + declares uintmax_t. */ +#undef HAVE_INTTYPES_H_WITH_UINTMAX + +/* Define if you have and nl_langinfo(CODESET). */ +#undef HAVE_LANGINFO_CODESET + +/* Define if your file defines LC_MESSAGES. */ +#undef HAVE_LC_MESSAGES + +/* Define to 1 if you have libcrypto */ +#undef HAVE_LIBCRYPTO + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBGPS + +/* Define to 1 if you have libgps19. */ +#undef HAVE_LIBGPS19 + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBSHP_SHAPEFIL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBSPEECHD + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define if you have the 'long double' type. */ +#undef HAVE_LONG_DOUBLE + +/* Define if you have the 'long long' type. */ +#undef HAVE_LONG_LONG + +/* Define to 1 if you have the header file. */ +#undef HAVE_MALLOC_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `mempcpy' function. */ +#undef HAVE_MEMPCPY + +/* Define to 1 if you have a working `mmap' system call. */ +#undef HAVE_MMAP + +/* Define to 1 if you have the `munmap' function. */ +#undef HAVE_MUNMAP + +/* Define to 1 if you have the header file. */ +#undef HAVE_NL_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_OPENGL + +/* Define if your printf() function supports format strings with positions. */ +#undef HAVE_POSIX_PRINTF + +/* Postgresql libraries available */ +#undef HAVE_POSTGRESQL + +/* Have pragma pack */ +#undef HAVE_PRAGMA_PACK + +/* Define to 1 if you have the `putenv' function. */ +#undef HAVE_PUTENV + +/* Define to 1 if qt supports svg */ +#undef HAVE_QT_SVG + +/* Define to 1 if you have the `sbrk' function. */ +#undef HAVE_SBRK + +/* Define to 1 if you have the `setenv' function. */ +#undef HAVE_SETENV + +/* Define to 1 if you have the `setlocale' function. */ +#undef HAVE_SETLOCALE + +/* Define to 1 if you have the header file. */ +#undef HAVE_SHAPEFIL_H + +/* Define to 1 if you have shared memory */ +#undef HAVE_SHMEM + +/* Define to 1 if you have the `snprintf' function. */ +#undef HAVE_SNPRINTF + +/* Define to 1 if you have sockets */ +#undef HAVE_SOCKET + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDDEF_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define if exists, doesn't clash with , and declares + uintmax_t. */ +#undef HAVE_STDINT_H_WITH_UINTMAX + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `stpcpy' function. */ +#undef HAVE_STPCPY + +/* Define to 1 if you have the `strcasecmp' function. */ +#undef HAVE_STRCASECMP + +/* Define to 1 if you have the `strdup' function. */ +#undef HAVE_STRDUP + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strtoul' function. */ +#undef HAVE_STRTOUL + +/* Define to 1 if you have the `system' function. */ +#undef HAVE_SYSTEM + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PARAM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SHAPEFILELIB + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the `tsearch' function. */ +#undef HAVE_TSEARCH + +/* Define if you have the 'uintmax_t' type in or . */ +#undef HAVE_UINTMAX_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define if you have the 'unsigned long long' type. */ +#undef HAVE_UNSIGNED_LONG_LONG + +/* Define if you have the 'wchar_t' type. */ +#undef HAVE_WCHAR_T + +/* Define to 1 if you have the `wcslen' function. */ +#undef HAVE_WCSLEN + +/* Define to 1 if you have Windows sockets */ +#undef HAVE_WINSOCK + +/* Define if you have the 'wint_t' type. */ +#undef HAVE_WINT_T + +/* Define to 1 if you have xpm header */ +#undef HAVE_XPM + +/* Define to 1 if you have the header file. */ +#undef HAVE_ZLIB + +/* Define to 1 if you have the `__argz_count' function. */ +#undef HAVE___ARGZ_COUNT + +/* Define to 1 if you have the `__argz_next' function. */ +#undef HAVE___ARGZ_NEXT + +/* Define to 1 if you have the `__argz_stringify' function. */ +#undef HAVE___ARGZ_STRINGIFY + +/* Define to 1 if you have the `__fsetlocking' function. */ +#undef HAVE___FSETLOCKING + +/* Define as const if the declaration of iconv() needs const. */ +#undef ICONV_CONST + +/* Define if integer division by zero raises signal SIGFPE. */ +#undef INTDIV0_RAISES_SIGFPE + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +#undef NO_MINUS_C_MINUS_O + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define if exists and defines unusable PRI* macros. */ +#undef PRI_MACROS_BROKEN + +/* Define as the maximum value of type 'size_t', if the system doesn't define + it. */ +#undef SIZE_MAX + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +#undef STACK_DIRECTION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Build with binding dbus */ +#undef USE_BINDING_DBUS + +/* Build with binding python */ +#undef USE_BINDING_PYTHON + +/* Build with binding win32 */ +#undef USE_BINDING_WIN32 + +/* Build with fribidi support */ +#undef USE_FRIBIDI + +/* Define to 1 if you want to use graphics. */ +#undef USE_GRAPHICS + +/* Build with graphics qt_qpainter */ +#undef USE_GRAPICS_QT_QPAINTER + +/* Build with gui qml */ +#undef USE_GUI_QML + +/* Build with maemo/hildon support */ +#undef USE_HILDON + +/* Build with maemo/osso support */ +#undef USE_OSSO + +/* Define to 1 if you have plugins. */ +#undef USE_PLUGINS + +/* Define to 1 if you want to have routing. */ +#undef USE_ROUTING + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif + + +/* Define to 1 if you have sys/endian.h */ +#undef USE_SYS_ENDIAN_H + +/* Build with webOS support */ +#undef USE_WEBOS + +/* Version number of package */ +#undef VERSION + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + +/* Define to 1 if on MINIX. */ +#undef _MINIX + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +#undef _POSIX_1_SOURCE + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +#undef _POSIX_SOURCE + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Define to `long int' if does not define. */ +#undef off_t + +/* Define as the type of the result of subtracting two pointers, if the system + doesn't define it. */ +#undef ptrdiff_t + +/* Define to empty if the C compiler doesn't support this keyword. */ +#undef signed + +/* Define to `unsigned int' if does not define. */ +#undef size_t + +/* Define to unsigned long or unsigned long long if and + don't define. */ +#undef uintmax_t diff --git a/config.rpath b/config.rpath new file mode 100755 index 0000000..4db13e5 --- /dev/null +++ b/config.rpath @@ -0,0 +1,548 @@ +#! /bin/sh +# Output a system dependent set of variables, describing how to set the +# run time search path of shared libraries in an executable. +# +# Copyright 1996-2003 Free Software Foundation, Inc. +# Taken from GNU libtool, 2001 +# Originally by Gordon Matzigkeit , 1996 +# +# 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; either version 2 of the License, or +# (at your option) any later version. +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld +# should be set by the caller. +# +# The set of defined variables is at the end of this script. + +# Known limitations: +# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer +# than 256 bytes, otherwise the compiler driver will dump core. The only +# known workaround is to choose shorter directory names for the build +# directory and/or the installation directory. + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +shrext=.so + +host="$1" +host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. + +wl= +if test "$GCC" = yes; then + wl='-Wl,' +else + case "$host_os" in + aix*) + wl='-Wl,' + ;; + mingw* | pw32* | os2*) + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6* | nonstopux*) + wl='-Wl,' + ;; + newsos6) + ;; + linux*) + case $CC in + icc|ecc) + wl='-Wl,' + ;; + ccc) + wl='-Wl,' + ;; + esac + ;; + osf3* | osf4* | osf5*) + wl='-Wl,' + ;; + sco3.2v5*) + ;; + solaris*) + wl='-Wl,' + ;; + sunos4*) + wl='-Qoption ld ' + ;; + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + wl='-Wl,' + ;; + sysv4*MP*) + ;; + uts4*) + ;; + esac +fi + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. + +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no + +case "$host_os" in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + case "$host_os" in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can use + # them. + ld_shlibs=no + ;; + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + cygwin* | mingw* | pw32*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + netbsd*) + ;; + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + sunos4*) + hardcode_direct=yes + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + esac + if test "$ld_shlibs" = yes; then + # Unlike libtool, we use -rpath here, not --rpath, since the documented + # option of GNU ld is called -rpath, not --rpath. + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + fi +else + case "$host_os" in + aix3*) + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + else + aix_use_runtimelinking=no + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + fi + hardcode_direct=yes + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + fi + # Begin _LT_AC_SYS_LIBPATH_AIX. + echo 'int main () { return 0; }' > conftest.c + ${CC} ${LDFLAGS} conftest.c -o conftest + aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + fi + if test -z "$aix_libpath"; then + aix_libpath="/usr/lib:/lib" + fi + rm -f conftest.c conftest + # End _LT_AC_SYS_LIBPATH_AIX. + if test "$aix_use_runtimelinking" = yes; then + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + else + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + fi + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + bsdi4*) + ;; + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + libext=lib + ;; + darwin* | rhapsody*) + if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then + hardcode_direct=no + fi + ;; + dgux*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + freebsd1*) + ld_shlibs=no + ;; + freebsd2.2*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + freebsd2*) + hardcode_direct=yes + hardcode_minus_L=yes + ;; + freebsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + hpux9*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + hpux10* | hpux11*) + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=no + ;; + ia64*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=no + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + *) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + irix5* | irix6* | nonstopux*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + netbsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + newsos6) + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + openbsd*) + hardcode_direct=yes + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + osf3*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + osf4* | osf5*) + if test "$GCC" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + # Both cc and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + sco3.2v5*) + ;; + solaris*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + sunos4*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + ;; + sysv4) + case $host_vendor in + sni) + hardcode_direct=yes # is this really true??? + ;; + siemens) + hardcode_direct=no + ;; + motorola) + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + ;; + sysv4.3*) + ;; + sysv4*MP*) + if test -d /usr/nec; then + ld_shlibs=yes + fi + ;; + sysv4.2uw2*) + hardcode_direct=yes + hardcode_minus_L=no + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + ;; + sysv5*) + hardcode_libdir_flag_spec= + ;; + uts4*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + *) + ld_shlibs=no + ;; + esac +fi + +# Check dynamic linker characteristics +# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. +libname_spec='lib$name' +case "$host_os" in + aix3*) + ;; + aix4* | aix5*) + ;; + amigaos*) + ;; + beos*) + ;; + bsdi4*) + ;; + cygwin* | mingw* | pw32*) + shrext=.dll + ;; + darwin* | rhapsody*) + shrext=.dylib + ;; + dgux*) + ;; + freebsd1*) + ;; + freebsd*) + ;; + gnu*) + ;; + hpux9* | hpux10* | hpux11*) + case "$host_cpu" in + ia64*) + shrext=.so + ;; + hppa*64*) + shrext=.sl + ;; + *) + shrext=.sl + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case "$host_os" in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; + *) libsuff= shlibsuff= ;; + esac + ;; + esac + ;; + linux*oldld* | linux*aout* | linux*coff*) + ;; + linux*) + ;; + netbsd*) + ;; + newsos6) + ;; + nto-qnx) + ;; + openbsd*) + ;; + os2*) + libname_spec='$name' + shrext=.dll + ;; + osf3* | osf4* | osf5*) + ;; + sco3.2v5*) + ;; + solaris*) + ;; + sunos4*) + ;; + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + ;; + sysv4*MP*) + ;; + uts4*) + ;; +esac + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` +shlibext=`echo "$shrext" | sed -e 's,^\.,,'` +escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` + +sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. Submit a context +# diff and a properly formatted GNU ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | picochip) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze) + basic_machine=microblaze-xilinx + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/configure b/configure new file mode 100755 index 0000000..d13b2cc --- /dev/null +++ b/configure @@ -0,0 +1,28502 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.68 for navit 0.5.0. +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + # Preserve -v and -x to the replacement shell. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; + esac + exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$lt_ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','` + ;; +esac + +ECHO=${lt_ECHO-echo} +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<_LT_EOF +$* +_LT_EOF + exit 0 +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test -z "$lt_ECHO"; then + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if { echo_test_string=`eval $cmd`; } 2>/dev/null && + { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null + then + break + fi + done + fi + + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : + else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$ECHO" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + ECHO='print -r' + elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + ECHO='printf %s\n' + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + ECHO="$CONFIG_SHELL $0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + ECHO=echo + fi + fi + fi + fi + fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +lt_ECHO=$ECHO +if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then + lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +fi + + + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='navit' +PACKAGE_TARNAME='navit' +PACKAGE_VERSION='0.5.0' +PACKAGE_STRING='navit 0.5.0' +PACKAGE_BUGREPORT='' +PACKAGE_URL='' + +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_header_list= +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +WINDRES +LIBC_LIBS +WORDEXP_LIBS +NAVIT_LIBS +NAVIT_CFLAGS +LIBPDL_LIBS +LIBPDL_CFLAGS +VEHICLE_WEBOS_FALSE +VEHICLE_WEBOS_TRUE +IPHONE_LIBS +IPHONE_CFLAGS +VEHICLE_IPHONE_FALSE +VEHICLE_IPHONE_TRUE +VEHICLE_WINCE_FALSE +VEHICLE_WINCE_TRUE +VEHICLE_NULL_FALSE +VEHICLE_NULL_TRUE +VEHICLE_MAEMO_FALSE +VEHICLE_MAEMO_TRUE +LIBLOCATION_LIBS +LIBLOCATION_CFLAGS +VEHICLE_GYPSY_FALSE +VEHICLE_GYPSY_TRUE +GYPSY_LIBS +GYPSY_CFLAGS +VEHICLE_GPSD_FALSE +VEHICLE_GPSD_TRUE +LIBGPS19_LIBS +LIBGPS19_CFLAGS +GPSD_LIBS +GPSD_CFLAGS +VEHICLE_FILE_FALSE +VEHICLE_FILE_TRUE +VEHICLE_DEMO_FALSE +VEHICLE_DEMO_TRUE +VEHICLE_ANDROID_FALSE +VEHICLE_ANDROID_TRUE +SUPPORT_ESPEAK_FALSE +SUPPORT_ESPEAK_TRUE +SPEECH_SPEECH_DISPATCHER_FALSE +SPEECH_SPEECH_DISPATCHER_TRUE +SPEECHD_LIBS +SPEECHD_CFLAGS +SPEECH_ESPEAK_FALSE +SPEECH_ESPEAK_TRUE +SPEECH_CMDLINE_FALSE +SPEECH_CMDLINE_TRUE +SPEECH_ANDROID_FALSE +SPEECH_ANDROID_TRUE +ROUTING_FALSE +ROUTING_TRUE +PLUGIN_PEDESTRIAN_FALSE +PLUGIN_PEDESTRIAN_TRUE +GUI_QML_FALSE +GUI_QML_TRUE +QT_DECLARATIVE_LIBS +QT_DECLARATIVE_CFLAGS +QT_XML_LIBS +QT_XML_CFLAGS +GUI_WIN32_FALSE +GUI_WIN32_TRUE +GUI_INTERNAL_FALSE +GUI_INTERNAL_TRUE +GUI_GTK_FALSE +GUI_GTK_TRUE +OSD_CORE_FALSE +OSD_CORE_TRUE +MAP_CSV_FALSE +MAP_CSV_TRUE +MAP_TEXTFILE_FALSE +MAP_TEXTFILE_TRUE +MAP_SHAPEFILE_FALSE +MAP_SHAPEFILE_TRUE +MAP_MG_FALSE +MAP_MG_TRUE +MAP_FILTER_FALSE +MAP_FILTER_TRUE +MAP_BINFILE_FALSE +MAP_BINFILE_TRUE +MOC +GRAPHICS_QT_QPAINTER_FALSE +GRAPHICS_QT_QPAINTER_TRUE +QT_SVG_LIBS +QT_SVG_CFLAGS +QT_GUI_LIBS +QT_GUI_CFLAGS +GRAPHICS_WIN32_FALSE +GRAPHICS_WIN32_TRUE +GRAPHICS_NULL_FALSE +GRAPHICS_NULL_TRUE +GRAPHICS_GTK_DRAWING_AREA_FALSE +GRAPHICS_GTK_DRAWING_AREA_TRUE +GRAPHICS_GD_FALSE +GRAPHICS_GD_TRUE +GD_LIBS +GD_CFLAGS +GDLIB_CONFIG +GRAPHICS_ANDROID_FALSE +GRAPHICS_ANDROID_TRUE +GRAPHICS_FALSE +GRAPHICS_TRUE +SUPPORT_LIBC_FALSE +SUPPORT_LIBC_TRUE +SUPPORT_WORDEXP_FALSE +SUPPORT_WORDEXP_TRUE +XGETTEXT_GLADE_FALSE +XGETTEXT_GLADE_TRUE +ENABLE_NLS_FALSE +ENABLE_NLS_TRUE +POSUB +LTLIBINTL +LIBINTL +INTLLIBS +INTL_LIBTOOL_SUFFIX_PREFIX +INTLOBJS +GENCAT +INSTOBJEXT +DATADIRNAME +CATOBJEXT +USE_INCLUDED_LIBINTL +BUILD_INCLUDED_LIBINTL +INTLBISON +LTLIBICONV +LIBICONV +HAVE_WPRINTF +HAVE_SNPRINTF +HAVE_ASPRINTF +HAVE_POSIX_PRINTF +GLIBC21 +ALLOCA +GMSGFMT +USE_NLS +MKINSTALLDIRS +POIFILES +POFILES +MOFILES +INTLIBS +MSGFMT +MSGMERGE +XGETTEXT +ANDROID_PROJECT +ANDROID_PERMISSIONS +SAXON +XSLTS +USE_SVG_FALSE +USE_SVG_TRUE +USE_SVG2PNG_FALSE +USE_SVG2PNG_TRUE +USE_SVG2PNG_SCALES_NAV_FALSE +USE_SVG2PNG_SCALES_NAV_TRUE +USE_SVG2PNG_SCALES_FLAG_FALSE +USE_SVG2PNG_SCALES_FLAG_TRUE +USE_SVG2PNG_SCALES_FALSE +USE_SVG2PNG_SCALES_TRUE +SVG2PNG_SCALES_NAV +SVG2PNG_SCALES_FLAG +SVG2PNG_SCALES +SVG2PNG +BINDING_WIN32_FALSE +BINDING_WIN32_TRUE +DBUS_SERVICE_DIR +SPEECH_DBUS_FALSE +SPEECH_DBUS_TRUE +VEHICLE_GPSD_DBUS_FALSE +VEHICLE_GPSD_DBUS_TRUE +BINDING_DBUS_FALSE +BINDING_DBUS_TRUE +DBUS_LIBS +DBUS_CFLAGS +BINDING_PYTHON_FALSE +BINDING_PYTHON_TRUE +PYTHON_LIBS +PYTHON_CFLAGS +PYTHONCONFIG +_PATH_PYTHON +HAVELIBGARMIN_FALSE +HAVELIBGARMIN_TRUE +LIBGARMIN_LIBS +LIBGARMIN_CFLAGS +HAVE_SYSTEM_SHAPEFILELIB_FALSE +HAVE_SYSTEM_SHAPEFILELIB_TRUE +SHAPEFILE_LIBS +SHAPEFILE_CFLAGS +GRAPHICS_OPENGL_FALSE +GRAPHICS_OPENGL_TRUE +GLC_LIBS +GLC_CFLAGS +FREEIMAGE_LIBS +OPENGL_LIBS +OPENGL_CFLAGS +IMLIB2_LIBS +IMLIB2_CFLAGS +FRIBIDI_LIBS +FRIBIDI_CFLAGS +FRIBIDI2_LIBS +FRIBIDI2_CFLAGS +FONTS_FALSE +FONTS_TRUE +FONTCONFIG_LIBS +FONTCONFIG_CFLAGS +FONT_FREETYPE_FALSE +FONT_FREETYPE_TRUE +FREETYPE2_LIBS +FREETYPE2_CFLAGS +HAVE_POSTGRESQL_FALSE +HAVE_POSTGRESQL_TRUE +POSTGRESQL_LIBS +POSTGRESQL_CFLAGS +PG_CONFIG +GRAPHICS_SDL_FALSE +GRAPHICS_SDL_TRUE +SDL_IMAGE_LIBS +SDL_LIBS +SDL_CFLAGS +GTK2_LIBS +GTK2_CFLAGS +ZLIB_LIBS +ZLIB_CFLAGS +SUPPORT_ZLIB_FALSE +SUPPORT_ZLIB_TRUE +SUPPORT_EZXML_FALSE +SUPPORT_EZXML_TRUE +SUPPORT_GLIB_FALSE +SUPPORT_GLIB_TRUE +EVENT_GLIB_FALSE +EVENT_GLIB_TRUE +LIBNAVIT +CXXCPP +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +lt_ECHO +RANLIB +AR +OBJDUMP +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +SED +LIBTOOL +BIN_NAVIT_FALSE +BIN_NAVIT_TRUE +SHARED_LIBNAVIT_FALSE +SHARED_LIBNAVIT_TRUE +PLUGINS_FALSE +PLUGINS_TRUE +CRYPTO_LIBS +GMODULE_LIBS +GMODULE_CFLAGS +GLIB_LIBS +GLIB_CFLAGS +FASTMATH_FALSE +FASTMATH_TRUE +BUILD_SAMPLEMAP_FALSE +BUILD_SAMPLEMAP_TRUE +MAPTOOL_FALSE +MAPTOOL_TRUE +_PATH_BZCAT +USE_OSSO_FALSE +USE_OSSO_TRUE +LIBOSSO_LIBS +LIBOSSO_CFLAGS +USE_HILDON_FALSE +USE_HILDON_TRUE +GPSBT_LIBS +GPSBT_CFLAGS +HILDON_LIBS +HILDON_CFLAGS +NAVIT_VARIANT +CCLD_FOR_BUILD +CROSS_COMPILING_FALSE +CROSS_COMPILING_TRUE +cross_compiling +CC_FOR_BUILD +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +am__fastdepOBJC_FALSE +am__fastdepOBJC_TRUE +OBJCDEPMODE +ac_ct_OBJC +OBJCFLAGS +OBJC +EGREP +GREP +CPP +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +NAVIT_SOCKET_LDFLAGS +NAVIT_MODULE_LDFLAGS +MODULE_LIBADD +MODULE_LDFLAGS +SUPPORT_LIBPNG_FALSE +SUPPORT_LIBPNG_TRUE +SUPPORT_ANDROID_FALSE +SUPPORT_ANDROID_TRUE +SUPPORT_WIN32CE_FALSE +SUPPORT_WIN32CE_TRUE +SUPPORT_WIN32_FALSE +SUPPORT_WIN32_TRUE +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +SOURCE_MODE_SVN_FALSE +SOURCE_MODE_SVN_TRUE +SOURCE_MODE +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_maintainer_mode +enable_dependency_tracking +enable_variant +enable_cache_size +enable_avoid_unaligned +enable_avoid_float +enable_transformation_roll +enable_hildon +enable_osso +enable_garmin +enable_maptool +enable_samplemap +enable_fastmath +enable_glib +enable_gmodule +enable_plugins +enable_shared_libnavit +enable_shared +enable_static +with_pic +enable_fast_install +with_gnu_ld +enable_libtool_lock +enable_graphics_sdl +enable_postgresql +enable_font_freetype +with_freetype_fonts +enable_fontconfig +enable_fribidi +enable_graphics_opengl +enable_binding_python +enable_binding_dbus +enable_binding_dbus_use_system_bus +with_dbus_service_dir +enable_binding_win32 +enable_svg +enable_svg2png +enable_svg2png_scaling +enable_svg2png_scaling_flag +enable_svg2png_scaling_nav +with_svg2png_use_convert +with_svg2png_use_rsvg_convert +with_svg2png_use_inkscape +with_svg2png_use_ksvgtopng4 +with_svg2png_use_ksvgtopng +with_xslts +with_saxon +with_android_permissions +with_android_project +enable_nls +enable_rpath +with_libiconv_prefix +with_included_gettext +with_libintl_prefix +enable_support_libc +enable_graphics +enable_graphics_android +enable_graphics_gd +enable_graphics_gtk_drawing_area +enable_graphics_null +enable_graphics_win32 +enable_graphics_qt_qpainter +enable_map_binfile +enable_map_filter +enable_map_mg +enable_map_shapefile +enable_map_textfile +enable_map_csv +enable_osd_core +enable_gui_gtk +enable_gui_internal +enable_gui_win32 +enable_gui_qml +enable_plugin_pedestrian +enable_routing +enable_speech_android +enable_speech_cmdline +enable_speech_espeak +enable_speech_speech_dispatcher +enable_vehicle_android +enable_vehicle_demo +enable_vehicle_file +enable_vehicle_gpsd +enable_vehicle_gypsy +enable_vehicle_maemo +enable_vehicle_null +enable_vehicle_wince +enable_vehicle_iphone +enable_vehicle_webos +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +OBJC +OBJCFLAGS +CXX +CXXFLAGS +CCC +PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR +HILDON_CFLAGS +HILDON_LIBS +GPSBT_CFLAGS +GPSBT_LIBS +LIBOSSO_CFLAGS +LIBOSSO_LIBS +GLIB_CFLAGS +GLIB_LIBS +GMODULE_CFLAGS +GMODULE_LIBS +CXXCPP +GTK2_CFLAGS +GTK2_LIBS +SDL_CFLAGS +SDL_LIBS +FREETYPE2_CFLAGS +FREETYPE2_LIBS +FONTCONFIG_CFLAGS +FONTCONFIG_LIBS +FRIBIDI2_CFLAGS +FRIBIDI2_LIBS +FRIBIDI_CFLAGS +FRIBIDI_LIBS +IMLIB2_CFLAGS +IMLIB2_LIBS +LIBGARMIN_CFLAGS +LIBGARMIN_LIBS +DBUS_CFLAGS +DBUS_LIBS +QT_GUI_CFLAGS +QT_GUI_LIBS +QT_SVG_CFLAGS +QT_SVG_LIBS +QT_XML_CFLAGS +QT_XML_LIBS +QT_DECLARATIVE_CFLAGS +QT_DECLARATIVE_LIBS +GPSD_CFLAGS +GPSD_LIBS +LIBGPS19_CFLAGS +LIBGPS19_LIBS +GYPSY_CFLAGS +GYPSY_LIBS +LIBLOCATION_CFLAGS +LIBLOCATION_LIBS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures navit 0.5.0 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/navit] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of navit 0.5.0:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --enable-variant=something set variant + --enable-cache-size=size in bytes set cache size + --enable-avoid-unaligned avoid unaligned accesses + --enable-avoid-float avoid floating point calculations + --enable-transformation-roll add support for specifying roll angle in transformation + --disable-hildon build without maemo/hildon support + --disable-osso build without maemo/osso support + --disable-garmin disable garmin support + --disable-maptool don't build maptool + --disable-samplemap don't build the samplemap + --disable-fastmath don't build with fastmath + --disable-glib don't build with external glib + --disable-gmodule don't build with gmodule + --disable-plugins disable plugins + --enable-shared-libnavit + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=no] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --disable-graphics-sdl don't create graphics sdl + --disable-postgresql don't add postgresql support to maptool + --disable-font-freetype don't add freetype support + --disable-fontconfig don't' add fontconfig support + --disable-fribidi dont build with fribidi + --disable-graphics-opengl disable graphics type OpenGL + --disable-binding-python don't create binding python + --disable-binding-dbus don't create binding dbus + --enable-binding-dbus-use-system-bus use system bus for dbus binding + --disable-binding-win32 don't create binding win32 + --disable-svg disable Scalable Vector Graphics + --disable-svg2png disable conversion of svgs to pngs + --enable-svg2png-scaling enable conversion of svgs to pngs with specified sizes + --enable-svg2png-scaling-flag enable conversion of flag svgs to pngs with specified sizes + --enable-svg2png-scaling-nav enable conversion of nav svgs to pngs with specified sizes + --disable-nls disable Native Language Support ( gettext/libintl ) + --disable-nls do not use Native Language Support + --disable-rpath do not hardcode runtime library paths + --enable-support-libc enable builtin mini libc + --disable-graphics disable graphics + --disable-graphics-android disable graphics type android + --enable-graphics-gd enable graphics type gd + --disable-graphics-gtk-drawing-area disable graphics type gtk_drawing_area + --disable-graphics-null disable graphics type null + --disable-graphics-win32 disable graphics type win32 + --disable-graphics-qt-qpainter disable graphics type qt-qpainter + --disable-map-binfile disable map binfile + --disable-map-filter disable map filter + --disable-map-mg disable map mg + --disable-map-shapefile disable map shapefile + --disable-map-textfile disable map textfile + --disable-map-csv disable map csv + --disable-osd-core disable osd core + --disable-gui-gtk disable gui type gtk + --disable-gui-internal disable gui type internal + --disable-gui-win32 disable gui type win32 + --disable-gui-qml disable gui type QML + --enable-plugin-pedestrian enable pedestrian plugin + --disable-routing disable routing + --disable-speech-android disable speech type android + --disable-speech-cmdline disable speech type cmdline + --disable-speech-espeak disable speech type espeak + --disable-speech-speech-dispatcher disable speech type speech-dispatcher + --disable-vehicle-android disable vehicle type android + --disable-vehicle-demo disable vehicle type demo + --disable-vehicle-file disable vehicle type file + --disable-vehicle-gpsd disable vehicle type gpsd + --disable-vehicle-gypsy disable vehicle type gypsy + --disable-vehicle-maemo disable vehicle type maemo + --enable-vehicle-null enable vehicle type null + --disable-vehicle-wince disable vehicle type wince + --disable-vehicle-iphone disable vehicle type iphone + --enable-vehicle-webos enable vehicle type webos + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic try to use only PIC/non-PIC objects [default=use + both] + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-freetype-fonts specify what fonts to use + --with-dbus-service-dir specify where the dbus service dir resides + --with-svg2png-use-convert use imagemagick's convert for png creation + --with-svg2png-use-rsvg-convert use librsvg's rsvg-convert for png creation + --with-svg2png-use-inkscape use inkscapes internal convert routines for png creation + --with-svg2png-use-ksvgtopng4 use kde4's ksvgtopng4 for png creation + --with-svg2png-use-ksvgtopng use kde3's convert for png creation + --with-xslts enable processing of navit.xml with given xslt scripts + --with-saxon specify the saxon xslt processor + --with-android-permissions Set additional android permissions + --with-android-project Set android project + --with-gnu-ld assume the C compiler uses GNU ld default=no + --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib + --without-libiconv-prefix don't search for libiconv in includedir and libdir + --with-included-gettext use the GNU gettext library included here + --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib + --without-libintl-prefix don't search for libintl in includedir and libdir + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + OBJC Objective C compiler command + OBJCFLAGS Objective C compiler flags + CXX C++ compiler command + CXXFLAGS C++ compiler flags + PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path + HILDON_CFLAGS + C compiler flags for HILDON, overriding pkg-config + HILDON_LIBS linker flags for HILDON, overriding pkg-config + GPSBT_CFLAGS + C compiler flags for GPSBT, overriding pkg-config + GPSBT_LIBS linker flags for GPSBT, overriding pkg-config + LIBOSSO_CFLAGS + C compiler flags for LIBOSSO, overriding pkg-config + LIBOSSO_LIBS + linker flags for LIBOSSO, overriding pkg-config + GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config + GLIB_LIBS linker flags for GLIB, overriding pkg-config + GMODULE_CFLAGS + C compiler flags for GMODULE, overriding pkg-config + GMODULE_LIBS + linker flags for GMODULE, overriding pkg-config + CXXCPP C++ preprocessor + GTK2_CFLAGS C compiler flags for GTK2, overriding pkg-config + GTK2_LIBS linker flags for GTK2, overriding pkg-config + SDL_CFLAGS C compiler flags for SDL, overriding pkg-config + SDL_LIBS linker flags for SDL, overriding pkg-config + FREETYPE2_CFLAGS + C compiler flags for FREETYPE2, overriding pkg-config + FREETYPE2_LIBS + linker flags for FREETYPE2, overriding pkg-config + FONTCONFIG_CFLAGS + C compiler flags for FONTCONFIG, overriding pkg-config + FONTCONFIG_LIBS + linker flags for FONTCONFIG, overriding pkg-config + FRIBIDI2_CFLAGS + C compiler flags for FRIBIDI2, overriding pkg-config + FRIBIDI2_LIBS + linker flags for FRIBIDI2, overriding pkg-config + FRIBIDI_CFLAGS + C compiler flags for FRIBIDI, overriding pkg-config + FRIBIDI_LIBS + linker flags for FRIBIDI, overriding pkg-config + IMLIB2_CFLAGS + C compiler flags for IMLIB2, overriding pkg-config + IMLIB2_LIBS linker flags for IMLIB2, overriding pkg-config + LIBGARMIN_CFLAGS + C compiler flags for LIBGARMIN, overriding pkg-config + LIBGARMIN_LIBS + linker flags for LIBGARMIN, overriding pkg-config + DBUS_CFLAGS C compiler flags for DBUS, overriding pkg-config + DBUS_LIBS linker flags for DBUS, overriding pkg-config + QT_GUI_CFLAGS + C compiler flags for QT_GUI, overriding pkg-config + QT_GUI_LIBS linker flags for QT_GUI, overriding pkg-config + QT_SVG_CFLAGS + C compiler flags for QT_SVG, overriding pkg-config + QT_SVG_LIBS linker flags for QT_SVG, overriding pkg-config + QT_XML_CFLAGS + C compiler flags for QT_XML, overriding pkg-config + QT_XML_LIBS linker flags for QT_XML, overriding pkg-config + QT_DECLARATIVE_CFLAGS + C compiler flags for QT_DECLARATIVE, overriding pkg-config + QT_DECLARATIVE_LIBS + linker flags for QT_DECLARATIVE, overriding pkg-config + GPSD_CFLAGS C compiler flags for GPSD, overriding pkg-config + GPSD_LIBS linker flags for GPSD, overriding pkg-config + LIBGPS19_CFLAGS + C compiler flags for LIBGPS19, overriding pkg-config + LIBGPS19_LIBS + linker flags for LIBGPS19, overriding pkg-config + GYPSY_CFLAGS + C compiler flags for GYPSY, overriding pkg-config + GYPSY_LIBS linker flags for GYPSY, overriding pkg-config + LIBLOCATION_CFLAGS + C compiler flags for LIBLOCATION, overriding pkg-config + LIBLOCATION_LIBS + linker flags for LIBLOCATION, overriding pkg-config + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +navit configure 0.5.0 +generated by GNU Autoconf 2.68 + +Copyright (C) 2010 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_objc_try_compile LINENO +# ----------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_objc_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_objc_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_objc_try_compile + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_cpp + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +# -------------------------------------------- +# Tries to find the compile-time value of EXPR in a program that includes +# INCLUDES, setting VAR accordingly. Returns whether the value could be +# computed +ac_fn_c_compute_int () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid; break +else + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=$ac_mid; break +else + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + ac_lo= ac_hi= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid +else + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in #(( +?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +'') ac_retval=1 ;; +esac + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +static long int longval () { return $2; } +static unsigned long int ulongval () { return $2; } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (($2) < 0) + { + long int i = longval (); + if (i != ($2)) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ($2)) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + echo >>conftest.val; read $3 config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by navit $as_me 0.5.0, which was +generated by GNU Autoconf 2.68. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +as_fn_append ac_header_list " stdlib.h" +as_fn_append ac_header_list " unistd.h" +as_fn_append ac_header_list " sys/param.h" +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +SOURCE_MODE=svn + +am__api_version='1.11' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='navit' + VERSION='0.5.0' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + +ac_config_headers="$ac_config_headers config.h" + + + + if test "x${SOURCE_MODE}" = "xsvn"; then + SOURCE_MODE_SVN_TRUE= + SOURCE_MODE_SVN_FALSE='#' +else + SOURCE_MODE_SVN_TRUE='#' + SOURCE_MODE_SVN_FALSE= +fi + + +if test "x${SOURCE_MODE}" = "xsvn" ; then + USE_MAINTAINER_MODE=yes +else + USE_MAINTAINER_MODE=no +fi + + + +# This is what autoupdate's m4 run will expand. It fires +# the warning (with _au_warn_XXX), outputs it into the +# updated configure.ac (with AC_DIAGNOSE), and then outputs +# the replacement expansion. + + +# This is an auxiliary macro that is also run when +# autoupdate runs m4. It simply calls m4_warning, but +# we need a wrapper so that each warning is emitted only +# once. We break the quoting in m4_warning's argument in +# order to expand this macro's arguments, not AU_DEFUN's. + + +# Finally, this is the expansion that is picked up by +# autoconf. It tells the user to run autoupdate, and +# then outputs the replacement expansion. We do not care +# about autoupdate's warning because that contains +# information on what to do *after* running autoupdate. + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +$as_echo "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + + +plugins=yes; plugins_reason=default +postgresql=yes; postgresql_reason=default +samplemap=yes; samplemap_reason=default +binding_dbus=yes; binding_dbus_reason=default +binding_dbus_use_system_bus=no +binding_python=yes; binding_python_reason=default +binding_win32=no; binding_win32_reason=default +font_freetype=yes; font_freetype_reason=default +fontconfig=yes; fontconfig_reason=default +fribidi=yes; fribidi_reason=default +gui_gtk=no; gui_gtk_reason=default +gui_win32=no; gui_win32_reason=default +gui_internal=yes; gui_internal_reason=default +gui_qml=no; gui_qml_reason=default +graphics=yes; graphics_reason=default +graphics_gd=no; graphics_gd_reason=default +graphics_gtk_drawing_area=no; graphics_gtk_drawing_area_reason=default +graphics_qt_qpainter=yes; graphics_qt_qpainter_reason=default +graphics_null=yes; graphics_null_reason=default +graphics_opengl=yes; graphics_opengl_reason=default +graphics_sdl=yes; graphics_sdl_reason=default +graphics_win32=no; graphics_win32_reason=default +maptool=yes; maptool_reason=default +map_binfile=yes; map_binfile_reason=default +map_filter=yes; map_filter_reason=default +map_mg=yes; map_mg_reason=default +map_shapefile=yes; map_shapefile_reason=default +map_textfile=yes; map_textfile_reason=default +map_csv=yes; map_csv_reason=default +osd_core=yes; osd_core_reason=default +plugin_pedestrian=no; plugin_pedestrian_reason=default +routing=yes; routing_reason=default +speech_android=no; speech_android_reason=default +speech_cmdline=yes; speech_cmdline_reason=default +speech_dbus=no; speech_dbus_reason=default +speech_espeak=no; speech_espeak_reason=default +speech_speech_dispatcher=yes; speech_speech_dispatcher_reason=default +vehicle_demo=yes; vehicle_demo_reason=default +vehicle_file=yes; vehicle_file_reason=default +vehicle_gpsd=yes; vehicle_gpsd_reason=default +vehicle_gpsd_dbus=no; vehicle_gpsd_dbus_reason=default +vehicle_gypsy=yes; vehicle_gypsy_reason=default +vehicle_null=no; vehicle_null_reason=default +vehicle_wince=no; vehicle_wince_reason=default +vehicle_iphone=no; vehicle_iphone_reason=default +vehicle_android=no; vehicle_android_reason=default +graphics_android=no; graphics_android_reason=default +vehicle_maemo=no; vehicle_maemo_reason=default +vehicle_webos=no; vehicle_webos_reason=default + +shared_libnavit=no +LIBNAVIT=navit +bin_navit=yes + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +win32=no +win32ce=no +case $host_os in +wince|mingw32ce|cegcc) + win32=yes + win32ce=yes + +$as_echo "#define HAVE_API_WIN32_BASE 1" >>confdefs.h + + +$as_echo "#define HAVE_API_WIN32_CE 1" >>confdefs.h + + +$as_echo "#define HAVE_PRAGMA_PACK 1" >>confdefs.h + + binding_win32=yes; binding_win32_reason="host_os is wince" + gui_win32=yes; gui_win32_reason="host_os is wince" + graphics_win32=yes; graphics_win32_reason="host_os is wince" + vehicle_wince=yes; vehcile_wince_reason="host_os is wince" + speech_espeak=yes; speech_espeak_reason="host_os is wince" + support_libpng=yes + maptool=no; maptool_reason="host_os is wince" + ;; +mingw32) + win32=yes + +$as_echo "#define HAVE_API_WIN32_BASE 1" >>confdefs.h + + +$as_echo "#define HAVE_API_WIN32 1" >>confdefs.h + + binding_win32=yes; binding_win32_reason="host_os is mingw32" + gui_win32=yes; gui_win32_reason="host_os is mingw32" + graphics_win32=yes; graphics_win32_reason="host_os is mingw32" + speech_espeak=yes; speech_espeak_reason="host_os is mingw32" + support_libpng=yes + ;; +linux*_android) + android=yes + shared_libnavit=yes + bin_navit=no + +$as_echo "#define HAVE_API_ANDROID 1" >>confdefs.h + + echo "void dl_unwind_find_exidx(void) {}" >crt0.c + $CC -c crt0.c + $AR r libg.a crt0.o + vehicle_android=yes; vehicle_android_reason="host_os is android" + graphics_android=yes; graphics_android_reason="host_os is android" + speech_android=yes; speech_android_reason="host_os is android" + MODULE_LDFLAGS="-module -Xcompiler -nostdlib -Xcompiler -Wl,-rpath -Xcompiler -Wl,/data/data/org.navitproject.navit/lib" + MODULE_LIBADD="-llog" + LIBNAVIT=_data_data_org.navitproject.navit_lib_navit + NAVIT_MODULE_LDFLAGS="$MODULE_LDFLAGS -L\$(top_builddir)/navit -l$LIBNAVIT" + ;; +esac +if test "x$win32" = "xyes" +then + NAVIT_CFLAGS="$NAVIT_CFLAGS -I\$(top_srcdir)/navit/support/win32" + NAVIT_LIBS="$NAVIT_LIBS -L\$(top_builddir)/navit/support/win32 -lsupport_win32" + NAVIT_SOCKET_LDFLAGS="$MODULE_LDFLAGS -lws2_32" +fi + + + if test "x$win32" = "xyes"; then + SUPPORT_WIN32_TRUE= + SUPPORT_WIN32_FALSE='#' +else + SUPPORT_WIN32_TRUE='#' + SUPPORT_WIN32_FALSE= +fi + + if test "x$win32ce" = "xyes"; then + SUPPORT_WIN32CE_TRUE= + SUPPORT_WIN32CE_FALSE='#' +else + SUPPORT_WIN32CE_TRUE='#' + SUPPORT_WIN32CE_FALSE= +fi + + if test "x$android" = "xyes"; then + SUPPORT_ANDROID_TRUE= + SUPPORT_ANDROID_FALSE='#' +else + SUPPORT_ANDROID_TRUE='#' + SUPPORT_ANDROID_FALSE= +fi + + +if test "x$support_libpng" = "xyes" +then + NAVIT_CFLAGS="$NAVIT_CFLAGS -I\$(top_srcdir)/navit/support/libpng" + NAVIT_LIBS="$NAVIT_LIBS -L\$(top_builddir)/navit/support/libpng -lsupport_libpng" +fi + if test "x$support_libpng" = "xyes"; then + SUPPORT_LIBPNG_TRUE= + SUPPORT_LIBPNG_FALSE='#' +else + SUPPORT_LIBPNG_TRUE='#' + SUPPORT_LIBPNG_FALSE= +fi + + + + + + + +LIBS="$LIBS -lm" +if test "$win32" == "no" -a test "$host_os" != "cygwin"; then + LIBS="$LIBS -rdynamic" +fi + + + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" +if test "x$ac_cv_header_minix_config_h" = xyes; then : + MINIX=yes +else + MINIX= +fi + + + if test "$MINIX" = yes; then + +$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h + + +$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h + + +$as_echo "#define _MINIX 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 +$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } +if ${ac_cv_safe_to_define___extensions__+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# define __EXTENSIONS__ 1 + $ac_includes_default +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_safe_to_define___extensions__=yes +else + ac_cv_safe_to_define___extensions__=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 +$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } + test $ac_cv_safe_to_define___extensions__ = yes && + $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h + + $as_echo "#define _ALL_SOURCE 1" >>confdefs.h + + $as_echo "#define _GNU_SOURCE 1" >>confdefs.h + + $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + + $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h + + + +ac_ext=m +ac_cpp='$OBJCPP $CPPFLAGS' +ac_compile='$OBJC -c $OBJCFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$OBJC -o conftest$ac_exeext $OBJCFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_objc_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in gcc objcc objc cc CC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJC"; then + ac_cv_prog_OBJC="$OBJC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OBJC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJC=$ac_cv_prog_OBJC +if test -n "$OBJC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJC" >&5 +$as_echo "$OBJC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$OBJC" && break + done +fi +if test -z "$OBJC"; then + ac_ct_OBJC=$OBJC + for ac_prog in gcc objcc objc cc CC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJC"; then + ac_cv_prog_ac_ct_OBJC="$ac_ct_OBJC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OBJC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJC=$ac_cv_prog_ac_ct_OBJC +if test -n "$ac_ct_OBJC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJC" >&5 +$as_echo "$ac_ct_OBJC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_OBJC" && break +done + + if test "x$ac_ct_OBJC" = x; then + OBJC="gcc" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJC=$ac_ct_OBJC + fi +fi + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for Objective C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Objective C compiler" >&5 +$as_echo_n "checking whether we are using the GNU Objective C compiler... " >&6; } +if ${ac_cv_objc_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_objc_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_objc_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objc_compiler_gnu" >&5 +$as_echo "$ac_cv_objc_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GOBJC=yes +else + GOBJC= +fi +ac_test_OBJCFLAGS=${OBJCFLAGS+set} +ac_save_OBJCFLAGS=$OBJCFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $OBJC accepts -g" >&5 +$as_echo_n "checking whether $OBJC accepts -g... " >&6; } +if ${ac_cv_prog_objc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_objc_werror_flag=$ac_objc_werror_flag + ac_objc_werror_flag=yes + ac_cv_prog_objc_g=no + OBJCFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_objc_try_compile "$LINENO"; then : + ac_cv_prog_objc_g=yes +else + OBJCFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_objc_try_compile "$LINENO"; then : + +else + ac_objc_werror_flag=$ac_save_objc_werror_flag + OBJCFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_objc_try_compile "$LINENO"; then : + ac_cv_prog_objc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_objc_werror_flag=$ac_save_objc_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_objc_g" >&5 +$as_echo "$ac_cv_prog_objc_g" >&6; } +if test "$ac_test_OBJCFLAGS" = set; then + OBJCFLAGS=$ac_save_OBJCFLAGS +elif test $ac_cv_prog_objc_g = yes; then + if test "$GOBJC" = yes; then + OBJCFLAGS="-g -O2" + else + OBJCFLAGS="-g" + fi +else + if test "$GOBJC" = yes; then + OBJCFLAGS="-O2" + else + OBJCFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$OBJC" am_compiler_list='gcc3 gcc' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_OBJC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_OBJC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_OBJC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_OBJC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_OBJC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_OBJC_dependencies_compiler_type" >&6; } +OBJCDEPMODE=depmode=$am_cv_OBJC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_OBJC_dependencies_compiler_type" = gcc3; then + am__fastdepOBJC_TRUE= + am__fastdepOBJC_FALSE='#' +else + am__fastdepOBJC_TRUE='#' + am__fastdepOBJC_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +ac_ext=m +ac_cpp='$OBJCPP $CPPFLAGS' +ac_compile='$OBJC -c $OBJCFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$OBJC -o conftest$ac_exeext $OBJCFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_objc_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in gcc objcc objc cc CC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJC"; then + ac_cv_prog_OBJC="$OBJC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OBJC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJC=$ac_cv_prog_OBJC +if test -n "$OBJC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJC" >&5 +$as_echo "$OBJC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$OBJC" && break + done +fi +if test -z "$OBJC"; then + ac_ct_OBJC=$OBJC + for ac_prog in gcc objcc objc cc CC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJC"; then + ac_cv_prog_ac_ct_OBJC="$ac_ct_OBJC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OBJC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJC=$ac_cv_prog_ac_ct_OBJC +if test -n "$ac_ct_OBJC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJC" >&5 +$as_echo "$ac_ct_OBJC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_OBJC" && break +done + + if test "x$ac_ct_OBJC" = x; then + OBJC="gcc" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJC=$ac_ct_OBJC + fi +fi + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for Objective C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Objective C compiler" >&5 +$as_echo_n "checking whether we are using the GNU Objective C compiler... " >&6; } +if ${ac_cv_objc_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_objc_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_objc_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objc_compiler_gnu" >&5 +$as_echo "$ac_cv_objc_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GOBJC=yes +else + GOBJC= +fi +ac_test_OBJCFLAGS=${OBJCFLAGS+set} +ac_save_OBJCFLAGS=$OBJCFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $OBJC accepts -g" >&5 +$as_echo_n "checking whether $OBJC accepts -g... " >&6; } +if ${ac_cv_prog_objc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_objc_werror_flag=$ac_objc_werror_flag + ac_objc_werror_flag=yes + ac_cv_prog_objc_g=no + OBJCFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_objc_try_compile "$LINENO"; then : + ac_cv_prog_objc_g=yes +else + OBJCFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_objc_try_compile "$LINENO"; then : + +else + ac_objc_werror_flag=$ac_save_objc_werror_flag + OBJCFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_objc_try_compile "$LINENO"; then : + ac_cv_prog_objc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_objc_werror_flag=$ac_save_objc_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_objc_g" >&5 +$as_echo "$ac_cv_prog_objc_g" >&6; } +if test "$ac_test_OBJCFLAGS" = set; then + OBJCFLAGS=$ac_save_OBJCFLAGS +elif test $ac_cv_prog_objc_g = yes; then + if test "$GOBJC" = yes; then + OBJCFLAGS="-g -O2" + else + OBJCFLAGS="-g" + fi +else + if test "$GOBJC" = yes; then + OBJCFLAGS="-O2" + else + OBJCFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$OBJC" am_compiler_list='gcc3 gcc' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_OBJC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_OBJC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_OBJC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_OBJC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_OBJC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_OBJC_dependencies_compiler_type" >&6; } +OBJCDEPMODE=depmode=$am_cv_OBJC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_OBJC_dependencies_compiler_type" = gcc3; then + am__fastdepOBJC_TRUE= + am__fastdepOBJC_FALSE='#' +else + am__fastdepOBJC_TRUE='#' + am__fastdepOBJC_FALSE= +fi + + + + +if eval "test x`uname` = xDarwin"; then + CFLAGS="$CFLAGS -I/opt/local/include -L/opt/local/lib" +fi +if eval "test x$GCC = xyes"; then + CFLAGS="$CFLAGS -Wall -Wcast-align -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wpointer-arith -Wreturn-type -D_GNU_SOURCE" +fi +if test "x$CC" != xcc; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 +$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 +$as_echo_n "checking whether cc understands -c and -o together... " >&6; } +fi +set dummy $CC; ac_cc=`$as_echo "$2" | + sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +# Make sure it works both with $CC and with simple cc. +# We do the test twice because some compilers refuse to overwrite an +# existing .o file with -o, though they will create one. +ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' +rm -f conftest2.* +if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; +then + eval ac_cv_prog_cc_${ac_cc}_c_o=yes + if test "x$CC" != xcc; then + # Test first that cc exists at all. + if { ac_try='cc -c conftest.$ac_ext >&5' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' + rm -f conftest2.* + if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; + then + # cc works too. + : + else + # cc exists but doesn't like -o. + eval ac_cv_prog_cc_${ac_cc}_c_o=no + fi + fi + fi +else + eval ac_cv_prog_cc_${ac_cc}_c_o=no +fi +rm -f core conftest* + +fi +if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h + +fi + +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi + + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + +if eval "test x$GXX = xyes"; then + CXXFLAGS="$CXXFLAGS -Wall -Wcast-align -Wpointer-arith -Wreturn-type -D_GNU_SOURCE" +fi + + + + + + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi +fi +if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\""; } >&5 + ($PKG_CONFIG --exists --print-errors "") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + : +fi +if test "x${cross_compiling}" = "xyes"; then + samplemap="no";samplemap_reason="not supported for cross compiling" + binding_python="no";binding_python_reason="not supported for cross compiling" + postgresql="no";postgresql_reason="not supported for cross compiling" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a C compiler for build tools" >&5 +$as_echo_n "checking for a C compiler for build tools... " >&6; } + for ac_prog in gcc cc +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC_FOR_BUILD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC_FOR_BUILD"; then + ac_cv_prog_CC_FOR_BUILD="$CC_FOR_BUILD" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC_FOR_BUILD="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC_FOR_BUILD=$ac_cv_prog_CC_FOR_BUILD +if test -n "$CC_FOR_BUILD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC_FOR_BUILD" >&5 +$as_echo "$CC_FOR_BUILD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC_FOR_BUILD" && break +done + +else + CC_FOR_BUILD=$CC +fi +CCLD_FOR_BUILD="$CC_FOR_BUILD" + + if test "x${cross_compiling}" = "xyes"; then + CROSS_COMPILING_TRUE= + CROSS_COMPILING_FALSE='#' +else + CROSS_COMPILING_TRUE='#' + CROSS_COMPILING_FALSE= +fi + + + + +# Endianness +# defines WORDS_BIGENDIAN for big-endian systems + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +if ${ac_cv_c_bigendian+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes; then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main () +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_bigendian=no +else + ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +$as_echo "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h +;; #( + no) + ;; #( + universal) + +$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) + as_fn_error $? "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + + +# Check whether --enable-variant was given. +if test "${enable_variant+set}" = set; then : + enableval=$enable_variant; NAVIT_VARIANT=$enableval +fi + + + +# Check whether --enable-cache-size was given. +if test "${enable_cache_size+set}" = set; then : + enableval=$enable_cache_size; +cat >>confdefs.h <<_ACEOF +#define CACHE_SIZE ${enableval} +_ACEOF + +fi + + +# Check whether --enable-avoid-unaligned was given. +if test "${enable_avoid_unaligned+set}" = set; then : + enableval=$enable_avoid_unaligned; AVOID_UNALIGNED=$enableval +else + AVOID_UNALIGNED=no +fi + +test x"${AVOID_UNALIGNED}" = xyes && +$as_echo "#define AVOID_UNALIGNED /**/" >>confdefs.h + + +# Check whether --enable-avoid-float was given. +if test "${enable_avoid_float+set}" = set; then : + enableval=$enable_avoid_float; AVOID_FLOAT=$enableval +else + AVOID_FLOAT=no +fi + +test x"${AVOID_FLOAT}" = xyes && +$as_echo "#define AVOID_FLOAT /**/" >>confdefs.h + + +# Check whether --enable-transformation-roll was given. +if test "${enable_transformation_roll+set}" = set; then : + enableval=$enable_transformation_roll; ENABLE_ROLL=$enableval +else + ENABLE_ROLL=no +fi + +test x"${ENABLE_ROLL}" = xyes && +$as_echo "#define ENABLE_ROLL /**/" >>confdefs.h + + +# Check whether --enable-hildon was given. +if test "${enable_hildon+set}" = set; then : + enableval=$enable_hildon; enable_hildon=$enableval +else + enable_hildon=yes +fi + +if test "x${enable_hildon}" = "xyes" ; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for HILDON" >&5 +$as_echo_n "checking for HILDON... " >&6; } + +if test -n "$HILDON_CFLAGS"; then + pkg_cv_HILDON_CFLAGS="$HILDON_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"hildon-1 >= 0.9.9\""; } >&5 + ($PKG_CONFIG --exists --print-errors "hildon-1 >= 0.9.9") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_HILDON_CFLAGS=`$PKG_CONFIG --cflags "hildon-1 >= 0.9.9" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$HILDON_LIBS"; then + pkg_cv_HILDON_LIBS="$HILDON_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"hildon-1 >= 0.9.9\""; } >&5 + ($PKG_CONFIG --exists --print-errors "hildon-1 >= 0.9.9") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_HILDON_LIBS=`$PKG_CONFIG --libs "hildon-1 >= 0.9.9" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + HILDON_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "hildon-1 >= 0.9.9" 2>&1` + else + HILDON_PKG_ERRORS=`$PKG_CONFIG --print-errors "hildon-1 >= 0.9.9" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$HILDON_PKG_ERRORS" >&5 + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + enable_hildon=no + +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + enable_hildon=no + +else + HILDON_CFLAGS=$pkg_cv_HILDON_CFLAGS + HILDON_LIBS=$pkg_cv_HILDON_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GPSBT" >&5 +$as_echo_n "checking for GPSBT... " >&6; } + +if test -n "$GPSBT_CFLAGS"; then + pkg_cv_GPSBT_CFLAGS="$GPSBT_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gpsbt\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gpsbt") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GPSBT_CFLAGS=`$PKG_CONFIG --cflags "gpsbt" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GPSBT_LIBS"; then + pkg_cv_GPSBT_LIBS="$GPSBT_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gpsbt\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gpsbt") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GPSBT_LIBS=`$PKG_CONFIG --libs "gpsbt" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GPSBT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "gpsbt" 2>&1` + else + GPSBT_PKG_ERRORS=`$PKG_CONFIG --print-errors "gpsbt" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GPSBT_PKG_ERRORS" >&5 + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +else + GPSBT_CFLAGS=$pkg_cv_GPSBT_CFLAGS + GPSBT_LIBS=$pkg_cv_GPSBT_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + +$as_echo "#define HAVE_GPSBT 1" >>confdefs.h + + + + +fi + if test x"${enable_hildon}" = xyes ; then + +$as_echo "#define USE_HILDON 1" >>confdefs.h + + + + fi +fi + if test "${enable_hildon}" = "xyes"; then + USE_HILDON_TRUE= + USE_HILDON_FALSE='#' +else + USE_HILDON_TRUE='#' + USE_HILDON_FALSE= +fi + + +# Check whether --enable-osso was given. +if test "${enable_osso+set}" = set; then : + enableval=$enable_osso; enable_osso=$enableval +else + enable_osso=yes +fi + +if test "x${enable_osso}" = "xyes" ; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBOSSO" >&5 +$as_echo_n "checking for LIBOSSO... " >&6; } + +if test -n "$LIBOSSO_CFLAGS"; then + pkg_cv_LIBOSSO_CFLAGS="$LIBOSSO_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libosso\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libosso") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBOSSO_CFLAGS=`$PKG_CONFIG --cflags "libosso" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LIBOSSO_LIBS"; then + pkg_cv_LIBOSSO_LIBS="$LIBOSSO_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libosso\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libosso") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBOSSO_LIBS=`$PKG_CONFIG --libs "libosso" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBOSSO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "libosso" 2>&1` + else + LIBOSSO_PKG_ERRORS=`$PKG_CONFIG --print-errors "libosso" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBOSSO_PKG_ERRORS" >&5 + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + enable_osso=no + +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + enable_osso=no + +else + LIBOSSO_CFLAGS=$pkg_cv_LIBOSSO_CFLAGS + LIBOSSO_LIBS=$pkg_cv_LIBOSSO_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi + if test x"${enable_osso}" = xyes ; then + +$as_echo "#define USE_OSSO 1" >>confdefs.h + + + + fi +fi +echo ${enable_osso} + if test "x${enable_osso}" = "xyes"; then + USE_OSSO_TRUE= + USE_OSSO_FALSE='#' +else + USE_OSSO_TRUE='#' + USE_OSSO_FALSE= +fi + + +# Check whether --enable-garmin was given. +if test "${enable_garmin+set}" = set; then : + enableval=$enable_garmin; USE_GARMIN=$enableval +else + USE_GARMIN=yes +fi + + +# samplemap +# Extract the first word of "bzcat", so it can be a program name with args. +set dummy bzcat; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path__PATH_BZCAT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $_PATH_BZCAT in + [\\/]* | ?:[\\/]*) + ac_cv_path__PATH_BZCAT="$_PATH_BZCAT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path__PATH_BZCAT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +_PATH_BZCAT=$ac_cv_path__PATH_BZCAT +if test -n "$_PATH_BZCAT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_PATH_BZCAT" >&5 +$as_echo "$_PATH_BZCAT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test "x${_PATH_BZCAT}" = "x" ; then + samplemap=no; samplemap_reason="bzcat missing" +fi +# Check whether --enable-maptool was given. +if test "${enable_maptool+set}" = set; then : + enableval=$enable_maptool; maptool=$enableval;maptool_reason="configure parameter" +fi + + if test "x$maptool" = "xyes"; then + MAPTOOL_TRUE= + MAPTOOL_FALSE='#' +else + MAPTOOL_TRUE='#' + MAPTOOL_FALSE= +fi + +if test "x$maptool" != "xyes"; then + samplemap=no; samplemap_reason="maptool disabled" +fi +# Check whether --enable-samplemap was given. +if test "${enable_samplemap+set}" = set; then : + enableval=$enable_samplemap; samplemap=$enableval;samplemap_reason="configure parameter" +fi + + if test "x$samplemap" = "xyes"; then + BUILD_SAMPLEMAP_TRUE= + BUILD_SAMPLEMAP_FALSE='#' +else + BUILD_SAMPLEMAP_TRUE='#' + BUILD_SAMPLEMAP_FALSE= +fi + + +# Check whether --enable-fastmath was given. +if test "${enable_fastmath+set}" = set; then : + enableval=$enable_fastmath; fastmath=$enableval +else + fastmath=yes +fi + + if test "x$fastmath" = "xyes"; then + FASTMATH_TRUE= + FASTMATH_FALSE='#' +else + FASTMATH_TRUE='#' + FASTMATH_FALSE= +fi + + +if test x"$fastmath" = xyes; then + if eval "test x$GCC = xyes"; then + CFLAGS="$CFLAGS -ffast-math" + fi +fi + +X_CFLAGS="-I$x_includes" +if test -n "$ac_x_libraries"; then : + X_LIBS="-L$ac_x_libraries" +fi + +# glib +# Check whether --enable-glib was given. +if test "${enable_glib+set}" = set; then : + enableval=$enable_glib; glib=$enableval +else + glib=yes +fi + +if test "x${glib}" = "xyes" -a "x${GLIB_CFLAGS}" = "x" -a "x${GLIB_LIBS}" = "x"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5 +$as_echo_n "checking for GLIB... " >&6; } + +if test -n "$GLIB_CFLAGS"; then + pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 gthread-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 gthread-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 gthread-2.0" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GLIB_LIBS"; then + pkg_cv_GLIB_LIBS="$GLIB_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 gthread-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "glib-2.0 gthread-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0 gthread-2.0" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "glib-2.0 gthread-2.0" 2>&1` + else + GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors "glib-2.0 gthread-2.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GLIB_PKG_ERRORS" >&5 + + glib=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + glib=no +else + GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS + GLIB_LIBS=$pkg_cv_GLIB_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + glib=yes +fi +fi +if test "x${glib}" = "xyes"; then + +$as_echo "#define HAVE_GLIB 1" >>confdefs.h + +else + GLIB_CFLAGS="-I\$(top_srcdir)/navit/support -I\$(top_srcdir)/navit/support/glib -I\$(top_srcdir)/navit/support/ezxml" + GLIB_LIBS="-L\$(top_builddir)/navit/support/glib -lsupport_glib -L\$(top_builddir)/navit/support/ezxml -lsupport_ezxml" + if test "x${win32}" != "xyes" -a "x${android}" != "xyes"; then + GLIB_LIBS="$GLIB_LIBS -lpthread" + fi +fi + +# gmodule +# Check whether --enable-gmodule was given. +if test "${enable_gmodule+set}" = set; then : + enableval=$enable_gmodule; gmodule=$enableval +else + gmodule=yes +fi + +if test x"${gmodule}" = "xyes"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GMODULE" >&5 +$as_echo_n "checking for GMODULE... " >&6; } + +if test -n "$GMODULE_CFLAGS"; then + pkg_cv_GMODULE_CFLAGS="$GMODULE_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gmodule-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gmodule-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GMODULE_CFLAGS=`$PKG_CONFIG --cflags "gmodule-2.0" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GMODULE_LIBS"; then + pkg_cv_GMODULE_LIBS="$GMODULE_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gmodule-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gmodule-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GMODULE_LIBS=`$PKG_CONFIG --libs "gmodule-2.0" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GMODULE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "gmodule-2.0" 2>&1` + else + GMODULE_PKG_ERRORS=`$PKG_CONFIG --print-errors "gmodule-2.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GMODULE_PKG_ERRORS" >&5 + + gmodule=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + gmodule=no +else + GMODULE_CFLAGS=$pkg_cv_GMODULE_CFLAGS + GMODULE_LIBS=$pkg_cv_GMODULE_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + gmodule=yes +fi +fi +if test "x${gmodule}" = "xyes"; then + +$as_echo "#define HAVE_GMODULE 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + plugins_reason="default, via dlopen";GMODULE_LIBS="-ldl"; +$as_echo "#define HAVE_DLOPEN 1" >>confdefs.h + +else + plugins="no"; plugins_reason="package gmodule and dlopen missing" + +fi + +fi + +# libcrypto +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for AES_encrypt in -lcrypto" >&5 +$as_echo_n "checking for AES_encrypt in -lcrypto... " >&6; } +if ${ac_cv_lib_crypto_AES_encrypt+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcrypto $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char AES_encrypt (); +int +main () +{ +return AES_encrypt (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_crypto_AES_encrypt=yes +else + ac_cv_lib_crypto_AES_encrypt=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_AES_encrypt" >&5 +$as_echo "$ac_cv_lib_crypto_AES_encrypt" >&6; } +if test "x$ac_cv_lib_crypto_AES_encrypt" = xyes; then : + CRYPTO_LIBS="-lcrypto"; +$as_echo "#define HAVE_LIBCRYPTO 1" >>confdefs.h + +fi + + + +# plugins +# Check whether --enable-plugins was given. +if test "${enable_plugins+set}" = set; then : + enableval=$enable_plugins; plugins=$enableval;plugin_reason="configure parameter" +fi + +# Check whether --enable-shared-libnavit was given. +if test "${enable_shared_libnavit+set}" = set; then : + enableval=$enable_shared_libnavit; shared_libnavit=$enableval +fi + +if test "x${plugins}" = "xyes"; then + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=no +fi + + + + + + + + + + +$as_echo "#define USE_PLUGINS /**/" >>confdefs.h + + if test "x${win32}" = "xyes"; then + shared_libnavit=yes + NAVIT_MODULE_LDFLAGS="-no-undefined -L\$(top_builddir)/navit -l$LIBNAVIT -L\$(top_builddir)/intl -lintl" + fi +else + if test "x${shared_libnavit}" = "xyes"; then + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=no +fi + + + + + + + else + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=no +fi + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + + + + + + fi +fi + if test "x$plugins" = "xyes"; then + PLUGINS_TRUE= + PLUGINS_FALSE='#' +else + PLUGINS_TRUE='#' + PLUGINS_FALSE= +fi + + if test "x$shared_libnavit" = "xyes"; then + SHARED_LIBNAVIT_TRUE= + SHARED_LIBNAVIT_FALSE='#' +else + SHARED_LIBNAVIT_TRUE='#' + SHARED_LIBNAVIT_FALSE= +fi + + if test "x$bin_navit" = "xyes"; then + BIN_NAVIT_TRUE= + BIN_NAVIT_FALSE='#' +else + BIN_NAVIT_TRUE='#' + BIN_NAVIT_FALSE= +fi + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.2.6b' +macro_revision='1.3018' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$ac_tool_prefix"; then + for ac_prog in "dumpbin -symbols" "link -dump -symbols" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in "dumpbin -symbols" "link -dump -symbols" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:9321: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:9324: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:9327: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ + = "XX$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 +$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 +$as_echo "$xsi_shell" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 +$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } +lt_shell_append=no +( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 +$as_echo "$lt_shell_append" >&6; } + + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AR="ar" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +else + AR="$ac_cv_prog_AR" +fi + +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + + + + + + + + + + + + + + + + + + + + + + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 10532 "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +_lt_caught_CXX_error=yes; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + + + + + +# Set options + + + + enable_dlopen=no + + + enable_win32_dll=no + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; pic_mode="$withval" +else + pic_mode=default +fi + + +test -z "$pic_mode" && pic_mode=default + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + + + + + + + + + + + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag=' -fno-builtin' + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:12261: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:12265: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl*) + # IBM XL C 8.0/Fortran 10.1 on PPC + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5 +$as_echo "$lt_prog_compiler_pic" >&6; } + + + + + + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:12600: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:12604: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:12705: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:12709: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:12760: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:12764: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag= + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + xl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld='-rpath $libdir' + archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes=yes + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='' + link_all_deplibs=yes + allow_undefined_flag="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=echo + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld='+b $libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='${wl}-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + archive_cmds_need_lc=no + else + archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5 +$as_echo "$archive_cmds_need_lc" >&6; } + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # Some binutils ld are patched to set DT_RUNPATH + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink || + test "$inherit_rpath" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line 15128 "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line 15224 "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report which library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_flag_spec_ld_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + compiler=$CC + compiler_CXX=$CC + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec_CXX='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + whole_archive_flag_spec_CXX='' + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=echo + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + gnu*) + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5]* | *pgcpp\ [1-5]*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 will use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + xl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=echo + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } + test "$ld_shlibs_CXX" = no && can_build_shared=no + + GCC_CXX="$GXX" + LD_CXX="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC*) + # IBM XL 8.0 on PPC + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_prog_compiler_pic_CXX" >&6; } + + + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:17180: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:17184: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:17279: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:17283: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:17331: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:17335: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + archive_cmds_need_lc_CXX=no + else + archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_CXX" >&5 +$as_echo "$archive_cmds_need_lc_CXX" >&6; } + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # Some binutils ld are patched to set DT_RUNPATH + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink || + test "$inherit_rpath_CXX" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + + + if test "x$glib" = "xyes"; then + EVENT_GLIB_TRUE= + EVENT_GLIB_FALSE='#' +else + EVENT_GLIB_TRUE='#' + EVENT_GLIB_FALSE= +fi + + if test "x$glib" = "xno"; then + SUPPORT_GLIB_TRUE= + SUPPORT_GLIB_FALSE='#' +else + SUPPORT_GLIB_TRUE='#' + SUPPORT_GLIB_FALSE= +fi + + if test "x$glib" = "xno"; then + SUPPORT_EZXML_TRUE= + SUPPORT_EZXML_FALSE='#' +else + SUPPORT_EZXML_TRUE='#' + SUPPORT_EZXML_FALSE= +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_time_h" = xyes; then : + +$as_echo "#define HAVE_SYS_TIME_H 1" >>confdefs.h + + +fi + + + +if test "x${ZLIB_CFLAGS}" = "x" -a "x${ZLIB_LIBS}" = "x"; then +ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" +if test "x$ac_cv_header_zlib_h" = xyes; then : + +$as_echo "#define HAVE_ZLIB /**/" >>confdefs.h + + ZLIB_LIBS="-lz" + zlib=yes +else + ZLIB_CFLAGS="-I\$(top_srcdir)/navit/support/zlib" + ZLIB_LIBS="-L\$(top_builddir)/navit/support/zlib -lsupport_zlib" + zlib=no + +fi + + +else + zlib=yes +fi + if test "x$zlib" = "xno"; then + SUPPORT_ZLIB_TRUE= + SUPPORT_ZLIB_FALSE='#' +else + SUPPORT_ZLIB_TRUE='#' + SUPPORT_ZLIB_FALSE= +fi + + + + +ac_fn_c_check_header_mongrel "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_socket_h" = xyes; then : + +$as_echo "#define HAVE_SOCKET /**/" >>confdefs.h + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" +if test "x$ac_cv_header_winsock2_h" = xyes; then : + +$as_echo "#define HAVE_WINSOCK /**/" >>confdefs.h + +fi + + + +# gtk + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK2" >&5 +$as_echo_n "checking for GTK2... " >&6; } + +if test -n "$GTK2_CFLAGS"; then + pkg_cv_GTK2_CFLAGS="$GTK2_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gtk+-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTK2_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GTK2_LIBS"; then + pkg_cv_GTK2_LIBS="$GTK2_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gtk+-2.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GTK2_LIBS=`$PKG_CONFIG --libs "gtk+-2.0" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GTK2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "gtk+-2.0" 2>&1` + else + GTK2_PKG_ERRORS=`$PKG_CONFIG --print-errors "gtk+-2.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GTK2_PKG_ERRORS" >&5 + + gtk2_pkgconfig=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + gtk2_pkgconfig=no +else + GTK2_CFLAGS=$pkg_cv_GTK2_CFLAGS + GTK2_LIBS=$pkg_cv_GTK2_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + gtk2_pkgconfig=yes +fi +if test "x$gtk2_pkgconfig" = "xyes"; then + +$as_echo "#define HAVE_GTK2 1" >>confdefs.h + + graphics_gtk_drawing_area=yes; graphics_gtk_drawing_area_reason="gtk+-2.0 present" + gui_gtk=yes; gui_gtk_reason="gtk+-2.0 present" +fi + +# fsync +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fsync" >&5 +$as_echo_n "checking for fsync... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +fsync(0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; }; +$as_echo "#define HAVE_FSYNC 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +# system +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for system" >&5 +$as_echo_n "checking for system... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +system("/bin/true"); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; }; +$as_echo "#define HAVE_SYSTEM 1" >>confdefs.h + +else + speech_cmdline=no; speech_cmdline_reason="not supported without system()"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CreateProcess" >&5 +$as_echo_n "checking for CreateProcess... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +CreateProcess(NULL,NULL,NULL,NULL,0,0,NULL,NULL,NULL,NULL); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; }; +$as_echo "#define HAVE_CREATEPROCESS 1" >>confdefs.h + speech_cmdline=yes; speech_cmdline_reason="CreateProcess exists" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +# sbrk +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sbrk" >&5 +$as_echo_n "checking for sbrk... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +sbrk(0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; }; +$as_echo "#define HAVE_SBRK 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + +# Check whether --enable-graphics-sdl was given. +if test "${enable_graphics_sdl+set}" = set; then : + enableval=$enable_graphics_sdl; graphics_sdl=$enableval;graphics_sdl_reason="configure parameter" +fi + + +if test "x${graphics_sdl}" = "xyes" ; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SDL" >&5 +$as_echo_n "checking for SDL... " >&6; } + +if test -n "$SDL_CFLAGS"; then + pkg_cv_SDL_CFLAGS="$SDL_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sdl\""; } >&5 + ($PKG_CONFIG --exists --print-errors "sdl") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SDL_CFLAGS=`$PKG_CONFIG --cflags "sdl" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$SDL_LIBS"; then + pkg_cv_SDL_LIBS="$SDL_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sdl\""; } >&5 + ($PKG_CONFIG --exists --print-errors "sdl") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_SDL_LIBS=`$PKG_CONFIG --libs "sdl" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + SDL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "sdl" 2>&1` + else + SDL_PKG_ERRORS=`$PKG_CONFIG --print-errors "sdl" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$SDL_PKG_ERRORS" >&5 + + graphics_sdl="no" + graphics_sdl_reason="sdl not available" + +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + graphics_sdl="no" + graphics_sdl_reason="sdl not available" + +else + SDL_CFLAGS=$pkg_cv_SDL_CFLAGS + SDL_LIBS=$pkg_cv_SDL_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + graphics_sdl="yes" + graphics_sdl_reason="sdl present" +fi + + +fi +if test "x${graphics_sdl}" = "xyes" ; then + save_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$SDL_CFLAGS $CPPFLAGS" + ac_fn_c_check_header_mongrel "$LINENO" "SDL_image.h" "ac_cv_header_SDL_image_h" "$ac_includes_default" +if test "x$ac_cv_header_SDL_image_h" = xyes; then : + SDL_IMAGE_LIBS=-lSDL_image +else + graphics_sdl="no";graphics_sdl_reason="SDL_image.h missing" +fi + + + + CPPFLAGS=$save_CPPFLAGS +fi +if test "x${graphics_sdl}" = "xyes" ; then + +$as_echo "#define GRAPHICS_SDL 1" >>confdefs.h + +fi + if test "x${graphics_sdl}" = "xyes"; then + GRAPHICS_SDL_TRUE= + GRAPHICS_SDL_FALSE='#' +else + GRAPHICS_SDL_TRUE='#' + GRAPHICS_SDL_FALSE= +fi + + +# Check whether --enable-postgresql was given. +if test "${enable_postgresql+set}" = set; then : + enableval=$enable_postgresql; postgresql=$enableval;postgresql_reason="configure parameter" +fi + +if test "x${postgresql}" = "xyes" ; then + if test -z "$PG_CONFIG"; then + # Extract the first word of "pg_config", so it can be a program name with args. +set dummy pg_config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PG_CONFIG="$PG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PG_CONFIG=$ac_cv_path_PG_CONFIG +if test -n "$PG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PG_CONFIG" >&5 +$as_echo "$PG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PostgreSQL libraries with $PG_CONFIG" >&5 +$as_echo_n "checking for PostgreSQL libraries with $PG_CONFIG... " >&6; } + if test ! -x "$PG_CONFIG"; then + if test "x${PG_CONFIG}" = "x" ; then + postgresql_reason="$PG_CONFIG not executable" + else + postgresql_reason="pg_config missing" + fi + postgresql=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + else + POSTGRESQL_CFLAGS="-I`$PG_CONFIG --includedir`" + POSTGRESQL_LIBS="-L`$PG_CONFIG --libdir` -lpq" + +$as_echo "#define HAVE_POSTGRESQL 1" >>confdefs.h + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + fi +fi + if test "x${postgresql}" = "xyes"; then + HAVE_POSTGRESQL_TRUE= + HAVE_POSTGRESQL_FALSE='#' +else + HAVE_POSTGRESQL_TRUE='#' + HAVE_POSTGRESQL_FALSE= +fi + +# font +# freetype +# Check whether --enable-font-freetype was given. +if test "${enable_font_freetype+set}" = set; then : + enableval=$enable_font_freetype; font_freetype=$enableval;font_freetype_reason="configure parameter" +fi + +if test "x${font_freetype}" = "xyes" -a "x${FREETYPE2_CFLAGS}" = "x" -a "x${FREETYPE2_LIBS}" = "x"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FREETYPE2" >&5 +$as_echo_n "checking for FREETYPE2... " >&6; } + +if test -n "$FREETYPE2_CFLAGS"; then + pkg_cv_FREETYPE2_CFLAGS="$FREETYPE2_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FREETYPE2_CFLAGS=`$PKG_CONFIG --cflags "freetype2" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$FREETYPE2_LIBS"; then + pkg_cv_FREETYPE2_LIBS="$FREETYPE2_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FREETYPE2_LIBS=`$PKG_CONFIG --libs "freetype2" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + FREETYPE2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "freetype2" 2>&1` + else + FREETYPE2_PKG_ERRORS=`$PKG_CONFIG --print-errors "freetype2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$FREETYPE2_PKG_ERRORS" >&5 + + font_freetype=no;font_freetype_reason="Package freetype2 missing" +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + font_freetype=no;font_freetype_reason="Package freetype2 missing" +else + FREETYPE2_CFLAGS=$pkg_cv_FREETYPE2_CFLAGS + FREETYPE2_LIBS=$pkg_cv_FREETYPE2_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi +else + fribidi=no +fi + + + if test "x${font_freetype}" = "xyes"; then + FONT_FREETYPE_TRUE= + FONT_FREETYPE_FALSE='#' +else + FONT_FREETYPE_TRUE='#' + FONT_FREETYPE_FALSE= +fi + + +# Check whether --with-freetype-fonts was given. +if test "${with_freetype_fonts+set}" = set; then : + withval=$with_freetype_fonts; +cat >>confdefs.h <<_ACEOF +#define FREETYPE_FONTS ${withval} +_ACEOF + +fi + + +# Check whether --enable-fontconfig was given. +if test "${enable_fontconfig+set}" = set; then : + enableval=$enable_fontconfig; fontconfig=$enableval;fontconfig_reason="configure parameter" +fi + +if test "x${fontconfig}" = "xyes"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FONTCONFIG" >&5 +$as_echo_n "checking for FONTCONFIG... " >&6; } + +if test -n "$FONTCONFIG_CFLAGS"; then + pkg_cv_FONTCONFIG_CFLAGS="$FONTCONFIG_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fontconfig\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fontconfig") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FONTCONFIG_CFLAGS=`$PKG_CONFIG --cflags "fontconfig" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$FONTCONFIG_LIBS"; then + pkg_cv_FONTCONFIG_LIBS="$FONTCONFIG_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fontconfig\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fontconfig") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FONTCONFIG_LIBS=`$PKG_CONFIG --libs "fontconfig" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "fontconfig" 2>&1` + else + FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --print-errors "fontconfig" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$FONTCONFIG_PKG_ERRORS" >&5 + + fontconfig=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fontconfig=no +else + FONTCONFIG_CFLAGS=$pkg_cv_FONTCONFIG_CFLAGS + FONTCONFIG_LIBS=$pkg_cv_FONTCONFIG_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + fontconfig=yes +fi +fi +if test "x$fontconfig" = "xyes"; then + +$as_echo "#define HAVE_FONTCONFIG 1" >>confdefs.h + +fi + + + + if test "x${font_freetype}" = "xyes" -a "x$fontconfig" != "xyes"; then + FONTS_TRUE= + FONTS_FALSE='#' +else + FONTS_TRUE='#' + FONTS_FALSE= +fi + + +# fribidi +# Check whether --enable-fribidi was given. +if test "${enable_fribidi+set}" = set; then : + enableval=$enable_fribidi; fribidi=$enableval;fribidi_reason="configure parameter" +else + fribidi=yes +fi + +if test x"${fribidi}" = "xyes"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FRIBIDI2" >&5 +$as_echo_n "checking for FRIBIDI2... " >&6; } + +if test -n "$FRIBIDI2_CFLAGS"; then + pkg_cv_FRIBIDI2_CFLAGS="$FRIBIDI2_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fribidi >= 0.19.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fribidi >= 0.19.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FRIBIDI2_CFLAGS=`$PKG_CONFIG --cflags "fribidi >= 0.19.0" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$FRIBIDI2_LIBS"; then + pkg_cv_FRIBIDI2_LIBS="$FRIBIDI2_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fribidi >= 0.19.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fribidi >= 0.19.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FRIBIDI2_LIBS=`$PKG_CONFIG --libs "fribidi >= 0.19.0" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + FRIBIDI2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "fribidi >= 0.19.0" 2>&1` + else + FRIBIDI2_PKG_ERRORS=`$PKG_CONFIG --print-errors "fribidi >= 0.19.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$FRIBIDI2_PKG_ERRORS" >&5 + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FRIBIDI" >&5 +$as_echo_n "checking for FRIBIDI... " >&6; } + +if test -n "$FRIBIDI_CFLAGS"; then + pkg_cv_FRIBIDI_CFLAGS="$FRIBIDI_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fribidi\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fribidi") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FRIBIDI_CFLAGS=`$PKG_CONFIG --cflags "fribidi" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$FRIBIDI_LIBS"; then + pkg_cv_FRIBIDI_LIBS="$FRIBIDI_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fribidi\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fribidi") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FRIBIDI_LIBS=`$PKG_CONFIG --libs "fribidi" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + FRIBIDI_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "fribidi" 2>&1` + else + FRIBIDI_PKG_ERRORS=`$PKG_CONFIG --print-errors "fribidi" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$FRIBIDI_PKG_ERRORS" >&5 + + fribidi=no;fribidi_reason="FriBidi library not found" +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fribidi=no;fribidi_reason="FriBidi library not found" +else + FRIBIDI_CFLAGS=$pkg_cv_FRIBIDI_CFLAGS + FRIBIDI_LIBS=$pkg_cv_FRIBIDI_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + fribidi=yes;oldfribidi=yes;fribid_reason="using old version" +fi + +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FRIBIDI" >&5 +$as_echo_n "checking for FRIBIDI... " >&6; } + +if test -n "$FRIBIDI_CFLAGS"; then + pkg_cv_FRIBIDI_CFLAGS="$FRIBIDI_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fribidi\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fribidi") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FRIBIDI_CFLAGS=`$PKG_CONFIG --cflags "fribidi" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$FRIBIDI_LIBS"; then + pkg_cv_FRIBIDI_LIBS="$FRIBIDI_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fribidi\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fribidi") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_FRIBIDI_LIBS=`$PKG_CONFIG --libs "fribidi" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + FRIBIDI_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "fribidi" 2>&1` + else + FRIBIDI_PKG_ERRORS=`$PKG_CONFIG --print-errors "fribidi" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$FRIBIDI_PKG_ERRORS" >&5 + + fribidi=no;fribidi_reason="FriBidi library not found" +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fribidi=no;fribidi_reason="FriBidi library not found" +else + FRIBIDI_CFLAGS=$pkg_cv_FRIBIDI_CFLAGS + FRIBIDI_LIBS=$pkg_cv_FRIBIDI_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + fribidi=yes;oldfribidi=yes;fribid_reason="using old version" +fi + +else + FRIBIDI2_CFLAGS=$pkg_cv_FRIBIDI2_CFLAGS + FRIBIDI2_LIBS=$pkg_cv_FRIBIDI2_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + fribidi=yes;oldfribidi=no +fi +fi +if test x"${fribidi}" = "xyes"; then + +$as_echo "#define USE_FRIBIDI 1" >>confdefs.h + +fi +if test x"${oldfribidi}" = "xyes"; then + +$as_echo "#define FRIBIDIOLD 1" >>confdefs.h + +fi + + + + + + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for IMLIB2" >&5 +$as_echo_n "checking for IMLIB2... " >&6; } + +if test -n "$IMLIB2_CFLAGS"; then + pkg_cv_IMLIB2_CFLAGS="$IMLIB2_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"imlib2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "imlib2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_IMLIB2_CFLAGS=`$PKG_CONFIG --cflags "imlib2" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$IMLIB2_LIBS"; then + pkg_cv_IMLIB2_LIBS="$IMLIB2_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"imlib2\""; } >&5 + ($PKG_CONFIG --exists --print-errors "imlib2") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_IMLIB2_LIBS=`$PKG_CONFIG --libs "imlib2" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + IMLIB2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "imlib2" 2>&1` + else + IMLIB2_PKG_ERRORS=`$PKG_CONFIG --print-errors "imlib2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$IMLIB2_PKG_ERRORS" >&5 + + imlib2_pkgconfig=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + imlib2_pkgconfig=no +else + IMLIB2_CFLAGS=$pkg_cv_IMLIB2_CFLAGS + IMLIB2_LIBS=$pkg_cv_IMLIB2_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + imlib2_pkgconfig=yes +fi +if test "x$imlib2_pkgconfig" = "xyes"; then + +$as_echo "#define HAVE_IMLIB2 1" >>confdefs.h + +fi + + + +# Check whether --enable-graphics-opengl was given. +if test "${enable_graphics_opengl+set}" = set; then : + enableval=$enable_graphics_opengl; graphics_opengl=$enableval;graphics_opengl_reason="configure parameter" +fi + +if test "x${graphics_opengl}" = "xyes" ; then + +ac_fn_c_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default" +if test "x$ac_cv_header_GL_gl_h" = xyes; then : + +$as_echo "#define HAVE_OPENGL /**/" >>confdefs.h + + OPENGL_LIBS="$X_LIBS -lGL -lglut -lfreeimage" + opengl=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** no GL/gl.h -- opengl graphics support disabled;graphics_opengl=no;graphics_opengl_reason=\"GL/gl.h header missing\"" >&5 +$as_echo "$as_me: WARNING: *** no GL/gl.h -- opengl graphics support disabled;graphics_opengl=no;graphics_opengl_reason=\"GL/gl.h header missing\"" >&2;} + +fi + + + +ac_fn_c_check_header_mongrel "$LINENO" "GL/glut.h" "ac_cv_header_GL_glut_h" "$ac_includes_default" +if test "x$ac_cv_header_GL_glut_h" = xyes; then : + +$as_echo "#define HAVE_GLUT /**/" >>confdefs.h + + glut=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** no GL/glut.h -- opengl graphics support disabled" >&5 +$as_echo "$as_me: WARNING: *** no GL/glut.h -- opengl graphics support disabled" >&2;};graphics_opengl=no;graphics_opengl_reason="GL/glut.h header missing" + +fi + + + +ac_fn_c_check_header_mongrel "$LINENO" "GL/freeglut.h" "ac_cv_header_GL_freeglut_h" "$ac_includes_default" +if test "x$ac_cv_header_GL_freeglut_h" = xyes; then : + +$as_echo "#define HAVE_FREEGLUT /**/" >>confdefs.h + + freeglut=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** no GL/freeglut.h -- opengl support disabled" >&5 +$as_echo "$as_me: WARNING: *** no GL/freeglut.h -- opengl support disabled" >&2;};graphics_opengl=no;graphics_opengl_reason="Headers missing" + +fi + + + + + + +ac_fn_c_check_header_mongrel "$LINENO" "GL/glc.h" "ac_cv_header_GL_glc_h" "$ac_includes_default" +if test "x$ac_cv_header_GL_glc_h" = xyes; then : + +$as_echo "#define HAVE_GLC /**/" >>confdefs.h + + GLC_LIBS="-lGLC" + glc=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** no GL/glc.h -- opengl graphics support disabled" >&5 +$as_echo "$as_me: WARNING: *** no GL/glc.h -- opengl graphics support disabled" >&2;};graphics_opengl=no;graphics_opengl_reason="GL/glc.h header missing" + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "FreeImage.h" "ac_cv_header_FreeImage_h" "$ac_includes_default" +if test "x$ac_cv_header_FreeImage_h" = xyes; then : + +$as_echo "#define HAVE_FREEIMAGE /**/" >>confdefs.h + + FREEIMAGE_LIBS="-lfreeimage" + freeimage=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** no FreeImage.h -- opengl support disabled" >&5 +$as_echo "$as_me: WARNING: *** no FreeImage.h -- opengl support disabled" >&2;};graphics_opengl=no;graphics_opengl_reason="Headers missing" + +fi + + + + + +fi + + if test "x$glut" = "xyes" -a "x$freeglut" = "xyes" -a "x$opengl" = "xyes" -a "x$freeimage" = "xyes" -a "x$glc" = "xyes" ; then + GRAPHICS_OPENGL_TRUE= + GRAPHICS_OPENGL_FALSE='#' +else + GRAPHICS_OPENGL_TRUE='#' + GRAPHICS_OPENGL_FALSE= +fi + + + +system_shapefile=no +if test x"${map_shapefile}" = xyes +then +for ac_header in shapefil.h libshp/shapefil.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +$as_echo "#define HAVE_SYS_SHAPEFILELIB 1" >>confdefs.h + +else + SHAPEFILE_CFLAGS="-I\$(top_srcdir)/navit/support/shapefile" + +fi + +done + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for DBFDeleteField in -lshp" >&5 +$as_echo_n "checking for DBFDeleteField in -lshp... " >&6; } +if ${ac_cv_lib_shp_DBFDeleteField+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lshp $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char DBFDeleteField (); +int +main () +{ +return DBFDeleteField (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_shp_DBFDeleteField=yes +else + ac_cv_lib_shp_DBFDeleteField=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_shp_DBFDeleteField" >&5 +$as_echo "$ac_cv_lib_shp_DBFDeleteField" >&6; } +if test "x$ac_cv_lib_shp_DBFDeleteField" = xyes; then : + SHAPEFILE_LIBS="-lshp" + system_shapefile=yes +else + SHAPEFILE_LIBS="-L\$(top_builddir)/navit/support/shapefile -lsupport_shapefile" + system_shapefile=no + +fi + + +if test x"${system_shapefile}" = xno +then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** The shapefile library(libshp) from the system is to old or not found! -- using included copy" >&5 +$as_echo "$as_me: WARNING: *** The shapefile library(libshp) from the system is to old or not found! -- using included copy" >&2;} +fi + +fi + + + if test "x$system_shapefile" = "xyes" ; then + HAVE_SYSTEM_SHAPEFILELIB_TRUE= + HAVE_SYSTEM_SHAPEFILELIB_FALSE='#' +else + HAVE_SYSTEM_SHAPEFILELIB_TRUE='#' + HAVE_SYSTEM_SHAPEFILELIB_FALSE= +fi + + +if test x"${USE_GARMIN}" = xyes +then + # check for libgarmin + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBGARMIN" >&5 +$as_echo_n "checking for LIBGARMIN... " >&6; } + +if test -n "$LIBGARMIN_CFLAGS"; then + pkg_cv_LIBGARMIN_CFLAGS="$LIBGARMIN_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libgarmin\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libgarmin") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBGARMIN_CFLAGS=`$PKG_CONFIG --cflags "libgarmin" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LIBGARMIN_LIBS"; then + pkg_cv_LIBGARMIN_LIBS="$LIBGARMIN_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libgarmin\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libgarmin") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBGARMIN_LIBS=`$PKG_CONFIG --libs "libgarmin" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBGARMIN_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "libgarmin" 2>&1` + else + LIBGARMIN_PKG_ERRORS=`$PKG_CONFIG --print-errors "libgarmin" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBGARMIN_PKG_ERRORS" >&5 + + use_libgarmin=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + use_libgarmin=no +else + LIBGARMIN_CFLAGS=$pkg_cv_LIBGARMIN_CFLAGS + LIBGARMIN_LIBS=$pkg_cv_LIBGARMIN_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + use_libgarmin=yes +fi + + +fi + if test "x$use_libgarmin" = "xyes"; then + HAVELIBGARMIN_TRUE= + HAVELIBGARMIN_FALSE='#' +else + HAVELIBGARMIN_TRUE='#' + HAVELIBGARMIN_FALSE= +fi + + +## binding +# python +# Check whether --enable-binding-python was given. +if test "${enable_binding_python+set}" = set; then : + enableval=$enable_binding_python; binding_python=$enableval;binding_python_reason="configure parameter" +fi + +if test "x${binding_python}" = "xyes"; then + # Extract the first word of "python", so it can be a program name with args. +set dummy python; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path__PATH_PYTHON+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $_PATH_PYTHON in + [\\/]* | ?:[\\/]*) + ac_cv_path__PATH_PYTHON="$_PATH_PYTHON" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path__PATH_PYTHON="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +_PATH_PYTHON=$ac_cv_path__PATH_PYTHON +if test -n "$_PATH_PYTHON"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_PATH_PYTHON" >&5 +$as_echo "$_PATH_PYTHON" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x${_PATH_PYTHON}" != "x" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python linkage" >&5 +$as_echo_n "checking for Python linkage... " >&6; } + # Extract the first word of "python-config", so it can be a program name with args. +set dummy python-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PYTHONCONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PYTHONCONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PYTHONCONFIG="$PYTHONCONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PYTHONCONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PYTHONCONFIG=$ac_cv_path_PYTHONCONFIG +if test -n "$PYTHONCONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHONCONFIG" >&5 +$as_echo "$PYTHONCONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x${PYTHONCONFIG}" = "x" ; then + py_prefix=`$_PATH_PYTHON -c 'import sys; print sys.prefix'` + py_ver=`$_PATH_PYTHON -c 'import sys; print sys.version[:3]'` + py_lib=`$_PATH_PYTHON -c 'import sys; print sys.lib'` + py_libdir="${py_prefix}/${py_lib}/python${py_ver}" + PYTHON_CFLAGS="-I${py_prefix}/include/python${py_ver}" + if test -f $py_libdir/config/Makefile -a -f $py_prefix/include/python${py_ver}/Python.h; then + py_libs=`grep '^LIBS=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` + py_libc=`grep '^LIBC=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` + py_libm=`grep '^LIBM=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` + py_liblocalmod=`grep '^LOCALMODLIBS=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` + py_libbasemod=`grep '^BASEMODLIBS=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` + PYTHON_LIBS="-L$py_libdir/config $py_libs $py_libc $py_libm -lpython$py_ver $py_liblocalmod $py_libbasemod" + PYTHON_LIBS=`echo $PYTHON_LIBS | sed -e 's/ \\t*/ /g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $py_libdir" >&5 +$as_echo "$py_libdir" >&6; } + else + binding_python="no" + binding_python_reason="$py_libdir/config/Makefile or $py_prefix/include/python${py_ver}/Python.h missing" + fi + + else + PYTHON_CFLAGS="`${PYTHONCONFIG} --cflags`" + PYTHON_LIBS="`${PYTHONCONFIG} --ldflags`" + fi + else + binding_python="no" + binding_python_reason="python executable missing" + fi +fi +if test "x${binding_python}" = xyes ; then + +$as_echo "#define USE_BINDING_PYTHON 1" >>confdefs.h + +fi + + + if test "x${binding_python}" = "xyes"; then + BINDING_PYTHON_TRUE= + BINDING_PYTHON_FALSE='#' +else + BINDING_PYTHON_TRUE='#' + BINDING_PYTHON_FALSE= +fi + + +# dbus +# Check whether --enable-binding-dbus was given. +if test "${enable_binding_dbus+set}" = set; then : + enableval=$enable_binding_dbus; binding_dbus=$enableval;binding_dbus_reason="configure parameter" +fi + +# Check whether --enable-binding-dbus-use-system-bus was given. +if test "${enable_binding_dbus_use_system_bus+set}" = set; then : + enableval=$enable_binding_dbus_use_system_bus; binding_dbus_use_system_bus=$enableval +fi + +if test "x${binding_dbus}" = "xyes" ; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for DBUS" >&5 +$as_echo_n "checking for DBUS... " >&6; } + +if test -n "$DBUS_CFLAGS"; then + pkg_cv_DBUS_CFLAGS="$DBUS_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dbus-glib-1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "dbus-glib-1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_DBUS_CFLAGS=`$PKG_CONFIG --cflags "dbus-glib-1" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$DBUS_LIBS"; then + pkg_cv_DBUS_LIBS="$DBUS_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dbus-glib-1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "dbus-glib-1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_DBUS_LIBS=`$PKG_CONFIG --libs "dbus-glib-1" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + DBUS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "dbus-glib-1" 2>&1` + else + DBUS_PKG_ERRORS=`$PKG_CONFIG --print-errors "dbus-glib-1" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$DBUS_PKG_ERRORS" >&5 + + binding_dbus=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + binding_dbus=no +else + DBUS_CFLAGS=$pkg_cv_DBUS_CFLAGS + DBUS_LIBS=$pkg_cv_DBUS_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi +fi +if test "x${binding_dbus}" = "xyes" ; then + +$as_echo "#define USE_BINDING_DBUS 1" >>confdefs.h + + vehicle_gpsd_dbus="yes" + vehicle_gpsd_dbus_reason="dbus binding present" + speech_dbus="yes" + speech_dbus_reason="dbus binding present" +fi +if test "x${binding_dbus_use_system_bus}" = "xyes" ; then + +$as_echo "#define DBUS_USE_SYSTEM_BUS 1" >>confdefs.h + +fi + + + if test "x${binding_dbus}" = "xyes"; then + BINDING_DBUS_TRUE= + BINDING_DBUS_FALSE='#' +else + BINDING_DBUS_TRUE='#' + BINDING_DBUS_FALSE= +fi + + if test "x${vehicle_gpsd_dbus}" = "xyes"; then + VEHICLE_GPSD_DBUS_TRUE= + VEHICLE_GPSD_DBUS_FALSE='#' +else + VEHICLE_GPSD_DBUS_TRUE='#' + VEHICLE_GPSD_DBUS_FALSE= +fi + + if test "x${speech_dbus}" = "xyes"; then + SPEECH_DBUS_TRUE= + SPEECH_DBUS_FALSE='#' +else + SPEECH_DBUS_TRUE='#' + SPEECH_DBUS_FALSE= +fi + + +# Check whether --with-dbus-service-dir was given. +if test "${with_dbus_service_dir+set}" = set; then : + withval=$with_dbus_service_dir; DBUS_SERVICE_DIR=$withval +else + DBUS_SERVICE_DIR="$datarootdir/dbus-1/services" +fi + + + +# win32 binding +# Check whether --enable-binding-win32 was given. +if test "${enable_binding_win32+set}" = set; then : + enableval=$enable_binding_win32; binding_win32=$enableval;binding_win32_reason="configure parameter" +fi + +if test "x${binding_win32}" = "xyes" ; then + +$as_echo "#define USE_BINDING_WIN32 1" >>confdefs.h + +fi + if test "x${binding_win32}" = "xyes"; then + BINDING_WIN32_TRUE= + BINDING_WIN32_FALSE='#' +else + BINDING_WIN32_TRUE='#' + BINDING_WIN32_FALSE= +fi + + +# svg +# Check whether --enable-svg was given. +if test "${enable_svg+set}" = set; then : + enableval=$enable_svg; enable_svg=$enableval +else + enable_svg=yes +fi + +# Check whether --enable-svg2png was given. +if test "${enable_svg2png+set}" = set; then : + enableval=$enable_svg2png; enable_svg2png=$enableval +else + enable_svg2png=yes +fi + +# Check whether --enable-svg2png-scaling was given. +if test "${enable_svg2png_scaling+set}" = set; then : + enableval=$enable_svg2png_scaling; SVG2PNG_SCALES=$enableval +else + SVG2PNG_SCALES="8 16 32 48 96" +fi + +# Check whether --enable-svg2png-scaling-flag was given. +if test "${enable_svg2png_scaling_flag+set}" = set; then : + enableval=$enable_svg2png_scaling_flag; SVG2PNG_SCALES_FLAG=$enableval +else + SVG2PNG_SCALES_FLAG="8 16 32 48 96" +fi + +# Check whether --enable-svg2png-scaling-nav was given. +if test "${enable_svg2png_scaling_nav+set}" = set; then : + enableval=$enable_svg2png_scaling_nav; SVG2PNG_SCALES_NAV=$enableval +else + SVG2PNG_SCALES_NAV="8 16 32 48 96" +fi + + +# Check whether --with-svg2png-use-convert was given. +if test "${with_svg2png_use_convert+set}" = set; then : + withval=$with_svg2png_use_convert; SVG2PNG_CONVERTER="convert" +fi + + +# Check whether --with-svg2png-use-rsvg-convert was given. +if test "${with_svg2png_use_rsvg_convert+set}" = set; then : + withval=$with_svg2png_use_rsvg_convert; SVG2PNG_CONVERTER="rsvg-convert" +fi + + +# Check whether --with-svg2png-use-inkscape was given. +if test "${with_svg2png_use_inkscape+set}" = set; then : + withval=$with_svg2png_use_inkscape; SVG2PNG_CONVERTER="inkscape" +fi + + +# Check whether --with-svg2png-use-ksvgtopng4 was given. +if test "${with_svg2png_use_ksvgtopng4+set}" = set; then : + withval=$with_svg2png_use_ksvgtopng4; SVG2PNG_CONVERTER="ksvgtopng4" +fi + + +# Check whether --with-svg2png-use-ksvgtopng was given. +if test "${with_svg2png_use_ksvgtopng+set}" = set; then : + withval=$with_svg2png_use_ksvgtopng; SVG2PNG_CONVERTER="ksvgtopng" +fi + +if test "x${enable_svg2png}" = "xyes" ; then + if test "x${SVG2PNG_CONVERTER}" = "x"; then + SVG2PNG_CONVERTER="rsvg-convert ksvgtopng ksvgtopng4 inkscape convert" + fi + for ac_prog in ${SVG2PNG_CONVERTER} +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_SVG2PNG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $SVG2PNG in + [\\/]* | ?:[\\/]*) + ac_cv_path_SVG2PNG="$SVG2PNG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_SVG2PNG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +SVG2PNG=$ac_cv_path_SVG2PNG +if test -n "$SVG2PNG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SVG2PNG" >&5 +$as_echo "$SVG2PNG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$SVG2PNG" && break +done +test -n "$SVG2PNG" || SVG2PNG="none" + + if test "x${SVG2PNG}" = "xnone"; then + enable_svg2png="no" + fi +fi + + + + + if test "x${SVG2PNG_SCALES}" != "xyes" -a "x${SVG2PNG_SCALES}" != "x"; then + USE_SVG2PNG_SCALES_TRUE= + USE_SVG2PNG_SCALES_FALSE='#' +else + USE_SVG2PNG_SCALES_TRUE='#' + USE_SVG2PNG_SCALES_FALSE= +fi + + if test "x${SVG2PNG_SCALES_FLAG}" != "xyes" -a "x${SVG2PNG_SCALES_FLAG}" != "x"; then + USE_SVG2PNG_SCALES_FLAG_TRUE= + USE_SVG2PNG_SCALES_FLAG_FALSE='#' +else + USE_SVG2PNG_SCALES_FLAG_TRUE='#' + USE_SVG2PNG_SCALES_FLAG_FALSE= +fi + + if test "x${SVG2PNG_SCALES_NAV}" != "xyes" -a "x${SVG2PNG_SCALES_NAV}" != "x"; then + USE_SVG2PNG_SCALES_NAV_TRUE= + USE_SVG2PNG_SCALES_NAV_FALSE='#' +else + USE_SVG2PNG_SCALES_NAV_TRUE='#' + USE_SVG2PNG_SCALES_NAV_FALSE= +fi + + if test "x${enable_svg2png}" = "xyes"; then + USE_SVG2PNG_TRUE= + USE_SVG2PNG_FALSE='#' +else + USE_SVG2PNG_TRUE='#' + USE_SVG2PNG_FALSE= +fi + + if test "x${enable_svg}" = "xyes"; then + USE_SVG_TRUE= + USE_SVG_FALSE='#' +else + USE_SVG_TRUE='#' + USE_SVG_FALSE= +fi + + +# XSLTS + +# Check whether --with-xslts was given. +if test "${with_xslts+set}" = set; then : + withval=$with_xslts; XSLTS=$withval +else + XSLTS="" +fi + + + +# Check whether --with-saxon was given. +if test "${with_saxon+set}" = set; then : + withval=$with_saxon; SAXON=$withval +else + SAXON="saxon" +fi + + + +# Android Permissions + +# Check whether --with-android-permissions was given. +if test "${with_android_permissions+set}" = set; then : + withval=$with_android_permissions; ANDROID_PERMISSIONS=$withval +else + ANDROID_PERMISSIONS="" +fi + + +# Android Project + +# Check whether --with-android-project was given. +if test "${with_android_project+set}" = set; then : + withval=$with_android_project; ANDROID_PROJECT=$withval +else + ANDROID_PROJECT="3" +fi + + + +# NLS + +# Check whether --enable-nls was given. +if test "${enable_nls+set}" = set; then : + enableval=$enable_nls; enable_nls=$enableval +else + enable_nls=yes +fi + + + +INTLIBS="" +MOFILES="" +POFILES="" +POIFILES="" +LINGUAS="" + +xgettext_glade=no +if test "x$enable_nls" = "xyes"; then + + ac_fn_c_check_func "$LINENO" "gettext" "ac_cv_func_gettext" +if test "x$ac_cv_func_gettext" = xyes; then : + HAVEGETTEXT="yes" +else + INTLIBS="-lintl" HAVEGETTEXT="yes" +fi + + # Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_XGETTEXT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$XGETTEXT"; then + ac_cv_prog_XGETTEXT="$XGETTEXT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_XGETTEXT="xgettext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +XGETTEXT=$ac_cv_prog_XGETTEXT +if test -n "$XGETTEXT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 +$as_echo "$XGETTEXT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # Extract the first word of "msgmerge", so it can be a program name with args. +set dummy msgmerge; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MSGMERGE+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MSGMERGE"; then + ac_cv_prog_MSGMERGE="$MSGMERGE" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_MSGMERGE="msgmerge" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MSGMERGE=$ac_cv_prog_MSGMERGE +if test -n "$MSGMERGE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 +$as_echo "$MSGMERGE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MSGFMT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MSGFMT"; then + ac_cv_prog_MSGFMT="$MSGFMT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_MSGFMT="msgfmt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MSGFMT=$ac_cv_prog_MSGFMT +if test -n "$MSGFMT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 +$as_echo "$MSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + if test "$XGETTEXT" != ""; then + if $XGETTEXT --help 2>&1 | grep illegal >/dev/null ; then + echo "xgettext isn't GNU version" + XGETTEXT="" + else + if echo '' | $XGETTEXT -L Glade - ; then + xgettext_glade=yes + fi + fi + fi + + if test "$XGETTEXT" != "" ; then + PO="" + if test "$LINGUAS" = ""; then + ling=` (cd $srcdir/po; /bin/ls *.po.in) ` + for l in $ling; do + lcode=`basename $l .po.in` + LINGUAS="$LINGUAS$lcode " + done + fi + +$as_echo "#define ENABLE_NLS 1" >>confdefs.h + + echo "xgettext and gettext() exist; will build i18n support for $LINGUAS" + else + LINGUAS="" + PO="" + echo "xgettext doesn't exist; will not build i18n support" + enable_nls=no + fi + for lang in $LINGUAS; do + MOFILES="$MOFILES $lang.mo" + done + for lang in $LINGUAS; do + POFILES="$POFILES $lang.po" + done + for lang in $LINGUAS; do + POIFILES="$POIFILES $lang.po.in" + done + + + + + + + + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + case "$ac_aux_dir" in + /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;; + *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;; + esac + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 +$as_echo_n "checking whether NLS is requested... " >&6; } + # Check whether --enable-nls was given. +if test "${enable_nls+set}" = set; then : + enableval=$enable_nls; USE_NLS=$enableval +else + USE_NLS=yes +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 +$as_echo "$USE_NLS" >&6; } + + + + + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MSGFMT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case "$MSGFMT" in + [\\/]* | ?:[\\/]*) + ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + if $ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" + ;; +esac +fi +MSGFMT="$ac_cv_path_MSGFMT" +if test "$MSGFMT" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 +$as_echo "$MSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + # Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GMSGFMT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GMSGFMT in + [\\/]* | ?:[\\/]*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" + ;; +esac +fi +GMSGFMT=$ac_cv_path_GMSGFMT +if test -n "$GMSGFMT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 +$as_echo "$GMSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_XGETTEXT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case "$XGETTEXT" in + [\\/]* | ?:[\\/]*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" + ;; +esac +fi +XGETTEXT="$ac_cv_path_XGETTEXT" +if test "$XGETTEXT" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 +$as_echo "$XGETTEXT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + rm -f messages.po + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "msgmerge", so it can be a program name with args. +set dummy msgmerge; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_MSGMERGE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case "$MSGMERGE" in + [\\/]* | ?:[\\/]*) + ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + if $ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1; then + ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" + ;; +esac +fi +MSGMERGE="$ac_cv_path_MSGMERGE" +if test "$MSGMERGE" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 +$as_echo "$MSGMERGE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "$GMSGFMT" != ":"; then + if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && + (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5 +$as_echo "found $GMSGFMT program is not GNU msgfmt; ignore it" >&6; } + GMSGFMT=":" + fi + fi + + if test "$XGETTEXT" != ":"; then + if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && + (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 +$as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } + XGETTEXT=":" + fi + rm -f messages.po + fi + + ac_config_commands="$ac_config_commands default-1" + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strerror in -lcposix" >&5 +$as_echo_n "checking for strerror in -lcposix... " >&6; } +if ${ac_cv_lib_cposix_strerror+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcposix $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char strerror (); +int +main () +{ +return strerror (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_cposix_strerror=yes +else + ac_cv_lib_cposix_strerror=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cposix_strerror" >&5 +$as_echo "$ac_cv_lib_cposix_strerror" >&6; } +if test "x$ac_cv_lib_cposix_strerror" = xyes; then : + LIBS="$LIBS -lcposix" +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if ${ac_cv_c_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "#define const /**/" >>confdefs.h + +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signed" >&5 +$as_echo_n "checking for signed... " >&6; } +if ${bh_cv_c_signed+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +signed char x; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + bh_cv_c_signed=yes +else + bh_cv_c_signed=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $bh_cv_c_signed" >&5 +$as_echo "$bh_cv_c_signed" >&6; } + if test $bh_cv_c_signed = no; then + +$as_echo "#define signed /**/" >>confdefs.h + + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" +if test "x$ac_cv_type_off_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define off_t long int +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long" >&5 +$as_echo_n "checking for long long... " >&6; } +if ${ac_cv_type_long_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +long long ll = 1LL; int i = 63; +int +main () +{ +long long llmax = (long long) -1; + return ll << i | ll >> i | llmax / ll | llmax % ll; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_type_long_long=yes +else + ac_cv_type_long_long=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_long" >&5 +$as_echo "$ac_cv_type_long_long" >&6; } + if test $ac_cv_type_long_long = yes; then + +$as_echo "#define HAVE_LONG_LONG 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double" >&5 +$as_echo_n "checking for long double... " >&6; } +if ${gt_cv_c_long_double+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$GCC" = yes; then + gt_cv_c_long_double=yes + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + /* The Stardent Vistra knows sizeof(long double), but does not support it. */ + long double foo = 0.0; + /* On Ultrix 4.3 cc, long double is 4 and double is 8. */ + int array [2*(sizeof(long double) >= sizeof(double)) - 1]; + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gt_cv_c_long_double=yes +else + gt_cv_c_long_double=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_long_double" >&5 +$as_echo "$gt_cv_c_long_double" >&6; } + if test $gt_cv_c_long_double = yes; then + +$as_echo "#define HAVE_LONG_DOUBLE 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wchar_t" >&5 +$as_echo_n "checking for wchar_t... " >&6; } +if ${gt_cv_c_wchar_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + wchar_t foo = (wchar_t)'\0'; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gt_cv_c_wchar_t=yes +else + gt_cv_c_wchar_t=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wchar_t" >&5 +$as_echo "$gt_cv_c_wchar_t" >&6; } + if test $gt_cv_c_wchar_t = yes; then + +$as_echo "#define HAVE_WCHAR_T 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wint_t" >&5 +$as_echo_n "checking for wint_t... " >&6; } +if ${gt_cv_c_wint_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + wint_t foo = (wchar_t)'\0'; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gt_cv_c_wint_t=yes +else + gt_cv_c_wint_t=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wint_t" >&5 +$as_echo "$gt_cv_c_wint_t" >&6; } + if test $gt_cv_c_wint_t = yes; then + +$as_echo "#define HAVE_WINT_T 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5 +$as_echo_n "checking for inttypes.h... " >&6; } +if ${jm_ac_cv_header_inttypes_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +uintmax_t i = (uintmax_t) -1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + jm_ac_cv_header_inttypes_h=yes +else + jm_ac_cv_header_inttypes_h=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $jm_ac_cv_header_inttypes_h" >&5 +$as_echo "$jm_ac_cv_header_inttypes_h" >&6; } + if test $jm_ac_cv_header_inttypes_h = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_INTTYPES_H_WITH_UINTMAX 1 +_ACEOF + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint.h" >&5 +$as_echo_n "checking for stdint.h... " >&6; } +if ${jm_ac_cv_header_stdint_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +uintmax_t i = (uintmax_t) -1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + jm_ac_cv_header_stdint_h=yes +else + jm_ac_cv_header_stdint_h=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $jm_ac_cv_header_stdint_h" >&5 +$as_echo "$jm_ac_cv_header_stdint_h" >&6; } + if test $jm_ac_cv_header_stdint_h = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_STDINT_H_WITH_UINTMAX 1 +_ACEOF + + fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intmax_t" >&5 +$as_echo_n "checking for intmax_t... " >&6; } +if ${gt_cv_c_intmax_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#if HAVE_STDINT_H_WITH_UINTMAX +#include +#endif +#if HAVE_INTTYPES_H_WITH_UINTMAX +#include +#endif + +int +main () +{ +intmax_t x = -1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gt_cv_c_intmax_t=yes +else + gt_cv_c_intmax_t=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_intmax_t" >&5 +$as_echo "$gt_cv_c_intmax_t" >&6; } + if test $gt_cv_c_intmax_t = yes; then + +$as_echo "#define HAVE_INTMAX_T 1" >>confdefs.h + + fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf() supports POSIX/XSI format strings" >&5 +$as_echo_n "checking whether printf() supports POSIX/XSI format strings... " >&6; } +if ${gt_cv_func_printf_posix+:} false; then : + $as_echo_n "(cached) " >&6 +else + + if test "$cross_compiling" = yes; then : + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#if defined __NetBSD__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__ + notposix +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "notposix" >/dev/null 2>&1; then : + gt_cv_func_printf_posix="guessing no" +else + gt_cv_func_printf_posix="guessing yes" +fi +rm -f conftest* + + +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +/* The string "%2$d %1$d", with dollar characters protected from the shell's + dollar expansion (possibly an autoconf bug). */ +static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; +static char buf[100]; +int main () +{ + sprintf (buf, format, 33, 55); + return (strcmp (buf, "55 33") != 0); +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + gt_cv_func_printf_posix=yes +else + gt_cv_func_printf_posix=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_printf_posix" >&5 +$as_echo "$gt_cv_func_printf_posix" >&6; } + case $gt_cv_func_printf_posix in + *yes) + +$as_echo "#define HAVE_POSIX_PRINTF 1" >>confdefs.h + + ;; + esac + +# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +# for constant arguments. Useless! +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 +$as_echo_n "checking for working alloca.h... " >&6; } +if ${ac_cv_working_alloca_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +char *p = (char *) alloca (2 * sizeof (int)); + if (p) return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_working_alloca_h=yes +else + ac_cv_working_alloca_h=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 +$as_echo "$ac_cv_working_alloca_h" >&6; } +if test $ac_cv_working_alloca_h = yes; then + +$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 +$as_echo_n "checking for alloca... " >&6; } +if ${ac_cv_func_alloca_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# ifdef _MSC_VER +# include +# define alloca _alloca +# else +# ifdef HAVE_ALLOCA_H +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +void *alloca (size_t); +# endif +# endif +# endif +# endif +#endif + +int +main () +{ +char *p = (char *) alloca (1); + if (p) return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_func_alloca_works=yes +else + ac_cv_func_alloca_works=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 +$as_echo "$ac_cv_func_alloca_works" >&6; } + +if test $ac_cv_func_alloca_works = yes; then + +$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h + +else + # The SVR3 libPW and SVR4 libucb both contain incompatible functions +# that cause trouble. Some versions do not even contain alloca or +# contain a buggy version. If you still want to use their alloca, +# use ar to extract alloca.o from them instead of compiling alloca.c. + +ALLOCA=\${LIBOBJDIR}alloca.$ac_objext + +$as_echo "#define C_ALLOCA 1" >>confdefs.h + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 +$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } +if ${ac_cv_os_cray+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if defined CRAY && ! defined CRAY2 +webecray +#else +wenotbecray +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "webecray" >/dev/null 2>&1; then : + ac_cv_os_cray=yes +else + ac_cv_os_cray=no +fi +rm -f conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 +$as_echo "$ac_cv_os_cray" >&6; } +if test $ac_cv_os_cray = yes; then + for ac_func in _getb67 GETB67 getb67; do + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + +cat >>confdefs.h <<_ACEOF +#define CRAY_STACKSEG_END $ac_func +_ACEOF + + break +fi + + done +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 +$as_echo_n "checking stack direction for C alloca... " >&6; } +if ${ac_cv_c_stack_direction+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_c_stack_direction=0 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +find_stack_direction () +{ + static char *addr = 0; + auto char dummy; + if (addr == 0) + { + addr = &dummy; + return find_stack_direction (); + } + else + return (&dummy > addr) ? 1 : -1; +} + +int +main () +{ + return find_stack_direction () < 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_stack_direction=1 +else + ac_cv_c_stack_direction=-1 +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 +$as_echo "$ac_cv_c_stack_direction" >&6; } +cat >>confdefs.h <<_ACEOF +#define STACK_DIRECTION $ac_cv_c_stack_direction +_ACEOF + + +fi + + + + + for ac_header in $ac_header_list +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + + + + + +for ac_func in getpagesize +do : + ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" +if test "x$ac_cv_func_getpagesize" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETPAGESIZE 1 +_ACEOF + +fi +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 +$as_echo_n "checking for working mmap... " >&6; } +if ${ac_cv_func_mmap_fixed_mapped+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_mmap_fixed_mapped=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +/* malloc might have been renamed as rpl_malloc. */ +#undef malloc + +/* Thanks to Mike Haertel and Jim Avera for this test. + Here is a matrix of mmap possibilities: + mmap private not fixed + mmap private fixed at somewhere currently unmapped + mmap private fixed at somewhere already mapped + mmap shared not fixed + mmap shared fixed at somewhere currently unmapped + mmap shared fixed at somewhere already mapped + For private mappings, we should verify that changes cannot be read() + back from the file, nor mmap's back from the file at a different + address. (There have been systems where private was not correctly + implemented like the infamous i386 svr4.0, and systems where the + VM page cache was not coherent with the file system buffer cache + like early versions of FreeBSD and possibly contemporary NetBSD.) + For shared mappings, we should conversely verify that changes get + propagated back to all the places they're supposed to be. + + Grep wants private fixed already mapped. + The main things grep needs to know about mmap are: + * does it exist and is it safe to write into the mmap'd area + * how to use it (BSD variants) */ + +#include +#include + +#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H +char *malloc (); +#endif + +/* This mess was copied from the GNU getpagesize.h. */ +#ifndef HAVE_GETPAGESIZE +# ifdef _SC_PAGESIZE +# define getpagesize() sysconf(_SC_PAGESIZE) +# else /* no _SC_PAGESIZE */ +# ifdef HAVE_SYS_PARAM_H +# include +# ifdef EXEC_PAGESIZE +# define getpagesize() EXEC_PAGESIZE +# else /* no EXEC_PAGESIZE */ +# ifdef NBPG +# define getpagesize() NBPG * CLSIZE +# ifndef CLSIZE +# define CLSIZE 1 +# endif /* no CLSIZE */ +# else /* no NBPG */ +# ifdef NBPC +# define getpagesize() NBPC +# else /* no NBPC */ +# ifdef PAGESIZE +# define getpagesize() PAGESIZE +# endif /* PAGESIZE */ +# endif /* no NBPC */ +# endif /* no NBPG */ +# endif /* no EXEC_PAGESIZE */ +# else /* no HAVE_SYS_PARAM_H */ +# define getpagesize() 8192 /* punt totally */ +# endif /* no HAVE_SYS_PARAM_H */ +# endif /* no _SC_PAGESIZE */ + +#endif /* no HAVE_GETPAGESIZE */ + +int +main () +{ + char *data, *data2, *data3; + const char *cdata2; + int i, pagesize; + int fd, fd2; + + pagesize = getpagesize (); + + /* First, make a file with some known garbage in it. */ + data = (char *) malloc (pagesize); + if (!data) + return 1; + for (i = 0; i < pagesize; ++i) + *(data + i) = rand (); + umask (0); + fd = creat ("conftest.mmap", 0600); + if (fd < 0) + return 2; + if (write (fd, data, pagesize) != pagesize) + return 3; + close (fd); + + /* Next, check that the tail of a page is zero-filled. File must have + non-zero length, otherwise we risk SIGBUS for entire page. */ + fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); + if (fd2 < 0) + return 4; + cdata2 = ""; + if (write (fd2, cdata2, 1) != 1) + return 5; + data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); + if (data2 == MAP_FAILED) + return 6; + for (i = 0; i < pagesize; ++i) + if (*(data2 + i)) + return 7; + close (fd2); + if (munmap (data2, pagesize)) + return 8; + + /* Next, try to mmap the file at a fixed address which already has + something else allocated at it. If we can, also make sure that + we see the same garbage. */ + fd = open ("conftest.mmap", O_RDWR); + if (fd < 0) + return 9; + if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_FIXED, fd, 0L)) + return 10; + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data2 + i)) + return 11; + + /* Finally, make sure that changes to the mapped area do not + percolate back to the file as seen by read(). (This is a bug on + some variants of i386 svr4.0.) */ + for (i = 0; i < pagesize; ++i) + *(data2 + i) = *(data2 + i) + 1; + data3 = (char *) malloc (pagesize); + if (!data3) + return 12; + if (read (fd, data3, pagesize) != pagesize) + return 13; + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data3 + i)) + return 14; + close (fd); + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_mmap_fixed_mapped=yes +else + ac_cv_func_mmap_fixed_mapped=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 +$as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } +if test $ac_cv_func_mmap_fixed_mapped = yes; then + +$as_echo "#define HAVE_MMAP 1" >>confdefs.h + +fi +rm -f conftest.mmap conftest.txt + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C Library 2.1 or newer" >&5 +$as_echo_n "checking whether we are using the GNU C Library 2.1 or newer... " >&6; } +if ${ac_cv_gnu_library_2_1+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef __GNU_LIBRARY__ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) + Lucky GNU user + #endif +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Lucky GNU user" >/dev/null 2>&1; then : + ac_cv_gnu_library_2_1=yes +else + ac_cv_gnu_library_2_1=no +fi +rm -f conftest* + + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gnu_library_2_1" >&5 +$as_echo "$ac_cv_gnu_library_2_1" >&6; } + + GLIBC21="$ac_cv_gnu_library_2_1" + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether integer division by zero raises SIGFPE" >&5 +$as_echo_n "checking whether integer division by zero raises SIGFPE... " >&6; } +if ${gt_cv_int_divbyzero_sigfpe+:} false; then : + $as_echo_n "(cached) " >&6 +else + + if test "$cross_compiling" = yes; then : + + # Guess based on the CPU. + case "$host_cpu" in + alpha* | i3456786 | m68k | s390*) + gt_cv_int_divbyzero_sigfpe="guessing yes";; + *) + gt_cv_int_divbyzero_sigfpe="guessing no";; + esac + +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +static void +#ifdef __cplusplus +sigfpe_handler (int sig) +#else +sigfpe_handler (sig) int sig; +#endif +{ + /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ + exit (sig != SIGFPE); +} + +int x = 1; +int y = 0; +int z; +int nan; + +int main () +{ + signal (SIGFPE, sigfpe_handler); +/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */ +#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP) + signal (SIGTRAP, sigfpe_handler); +#endif +/* Linux/SPARC yields signal SIGILL. */ +#if defined (__sparc__) && defined (__linux__) + signal (SIGILL, sigfpe_handler); +#endif + + z = x / y; + nan = y / y; + exit (1); +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + gt_cv_int_divbyzero_sigfpe=yes +else + gt_cv_int_divbyzero_sigfpe=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_int_divbyzero_sigfpe" >&5 +$as_echo "$gt_cv_int_divbyzero_sigfpe" >&6; } + case "$gt_cv_int_divbyzero_sigfpe" in + *yes) value=1;; + *) value=0;; + esac + +cat >>confdefs.h <<_ACEOF +#define INTDIV0_RAISES_SIGFPE $value +_ACEOF + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned long long" >&5 +$as_echo_n "checking for unsigned long long... " >&6; } +if ${ac_cv_type_unsigned_long_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +unsigned long long ull = 1ULL; int i = 63; +int +main () +{ +unsigned long long ullmax = (unsigned long long) -1; + return ull << i | ull >> i | ullmax / ull | ullmax % ull; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_type_unsigned_long_long=yes +else + ac_cv_type_unsigned_long_long=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long" >&5 +$as_echo "$ac_cv_type_unsigned_long_long" >&6; } + if test $ac_cv_type_unsigned_long_long = yes; then + +$as_echo "#define HAVE_UNSIGNED_LONG_LONG 1" >>confdefs.h + + fi + + + + + if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then + + test $ac_cv_type_unsigned_long_long = yes \ + && ac_type='unsigned long long' \ + || ac_type='unsigned long' + +cat >>confdefs.h <<_ACEOF +#define uintmax_t $ac_type +_ACEOF + + else + +$as_echo "#define HAVE_UINTMAX_T 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5 +$as_echo_n "checking for inttypes.h... " >&6; } +if ${gt_cv_header_inttypes_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gt_cv_header_inttypes_h=yes +else + gt_cv_header_inttypes_h=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_header_inttypes_h" >&5 +$as_echo "$gt_cv_header_inttypes_h" >&6; } + if test $gt_cv_header_inttypes_h = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_INTTYPES_H 1 +_ACEOF + + fi + + + + if test $gt_cv_header_inttypes_h = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the inttypes.h PRIxNN macros are broken" >&5 +$as_echo_n "checking whether the inttypes.h PRIxNN macros are broken... " >&6; } +if ${gt_cv_inttypes_pri_broken+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#ifdef PRId32 +char *p = PRId32; +#endif + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gt_cv_inttypes_pri_broken=no +else + gt_cv_inttypes_pri_broken=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_inttypes_pri_broken" >&5 +$as_echo "$gt_cv_inttypes_pri_broken" >&6; } + fi + if test "$gt_cv_inttypes_pri_broken" = yes; then + +cat >>confdefs.h <<_ACEOF +#define PRI_MACROS_BROKEN 1 +_ACEOF + + fi + + + for ac_header in stdint.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" +if test "x$ac_cv_header_stdint_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STDINT_H 1 +_ACEOF + +fi + +done + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SIZE_MAX" >&5 +$as_echo_n "checking for SIZE_MAX... " >&6; } + result= + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#if HAVE_STDINT_H +#include +#endif +#ifdef SIZE_MAX +Found it +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Found it" >/dev/null 2>&1; then : + result=yes +fi +rm -f conftest* + + if test -z "$result"; then + if ac_fn_c_compute_int "$LINENO" "~(size_t)0 / 10" "res_hi" "#include "; then : + +else + result=? +fi + + + if ac_fn_c_compute_int "$LINENO" "~(size_t)0 % 10" "res_lo" "#include "; then : + +else + result=? +fi + + + if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) <= sizeof (unsigned int)" "fits_in_uint" "#include "; then : + +else + result=? +fi + + + if test "$fits_in_uint" = 1; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + extern size_t foo; + extern unsigned long foo; + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + fits_in_uint=0 +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test -z "$result"; then + if test "$fits_in_uint" = 1; then + result="$res_hi$res_lo"U + else + result="$res_hi$res_lo"UL + fi + else + result='~(size_t)0' + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5 +$as_echo "$result" >&6; } + if test "$result" != yes; then + +cat >>confdefs.h <<_ACEOF +#define SIZE_MAX $result +_ACEOF + + fi + + + + for ac_header in stdint.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" +if test "x$ac_cv_header_stdint_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STDINT_H 1 +_ACEOF + +fi + +done + + + + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 +$as_echo_n "checking for ld used by GCC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${acl_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$acl_cv_path_LD" +if test -n "$LD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${acl_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$acl_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$acl_cv_prog_gnu_ld + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 +$as_echo_n "checking for shared library run path origin... " >&6; } +if ${acl_cv_rpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 +$as_echo "$acl_cv_rpath" >&6; } + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + # Check whether --enable-rpath was given. +if test "${enable_rpath+set}" = set; then : + enableval=$enable_rpath; : +else + enable_rpath=yes +fi + + + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libiconv-prefix was given. +if test "${with_libiconv_prefix+set}" = set; then : + withval=$with_libiconv_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi + +fi + + LIBICONV= + LTLIBICONV= + INCICONV= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='iconv ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$hardcode_direct" = yes; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" + ;; + esac + done + fi + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" + done + fi + + + + + + + + + ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" +if test "x$ac_cv_type_ptrdiff_t" = xyes; then : + +else + +$as_echo "#define ptrdiff_t long" >>confdefs.h + + +fi + + for ac_header in argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ +stdlib.h string.h unistd.h sys/param.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + for ac_func in asprintf fwprintf getcwd getegid geteuid getgid getuid \ +mempcpy munmap putenv setenv setlocale snprintf stpcpy strcasecmp strdup \ +strtoul tsearch wcslen __argz_count __argz_stringify __argz_next \ +__fsetlocking +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether _snprintf is declared" >&5 +$as_echo_n "checking whether _snprintf is declared... " >&6; } +if ${ac_cv_have_decl__snprintf+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + +#ifndef _snprintf + char *p = (char *) _snprintf; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_have_decl__snprintf=yes +else + ac_cv_have_decl__snprintf=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl__snprintf" >&5 +$as_echo "$ac_cv_have_decl__snprintf" >&6; } + if test $ac_cv_have_decl__snprintf = yes; then + gt_value=1 + else + gt_value=0 + fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL__SNPRINTF $gt_value +_ACEOF + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether _snwprintf is declared" >&5 +$as_echo_n "checking whether _snwprintf is declared... " >&6; } +if ${ac_cv_have_decl__snwprintf+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + +#ifndef _snwprintf + char *p = (char *) _snwprintf; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_have_decl__snwprintf=yes +else + ac_cv_have_decl__snwprintf=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl__snwprintf" >&5 +$as_echo "$ac_cv_have_decl__snwprintf" >&6; } + if test $ac_cv_have_decl__snwprintf = yes; then + gt_value=1 + else + gt_value=0 + fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL__SNWPRINTF $gt_value +_ACEOF + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether feof_unlocked is declared" >&5 +$as_echo_n "checking whether feof_unlocked is declared... " >&6; } +if ${ac_cv_have_decl_feof_unlocked+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + +#ifndef feof_unlocked + char *p = (char *) feof_unlocked; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_have_decl_feof_unlocked=yes +else + ac_cv_have_decl_feof_unlocked=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_feof_unlocked" >&5 +$as_echo "$ac_cv_have_decl_feof_unlocked" >&6; } + if test $ac_cv_have_decl_feof_unlocked = yes; then + gt_value=1 + else + gt_value=0 + fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FEOF_UNLOCKED $gt_value +_ACEOF + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fgets_unlocked is declared" >&5 +$as_echo_n "checking whether fgets_unlocked is declared... " >&6; } +if ${ac_cv_have_decl_fgets_unlocked+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + +#ifndef fgets_unlocked + char *p = (char *) fgets_unlocked; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_have_decl_fgets_unlocked=yes +else + ac_cv_have_decl_fgets_unlocked=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_fgets_unlocked" >&5 +$as_echo "$ac_cv_have_decl_fgets_unlocked" >&6; } + if test $ac_cv_have_decl_fgets_unlocked = yes; then + gt_value=1 + else + gt_value=0 + fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FGETS_UNLOCKED $gt_value +_ACEOF + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getc_unlocked is declared" >&5 +$as_echo_n "checking whether getc_unlocked is declared... " >&6; } +if ${ac_cv_have_decl_getc_unlocked+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + +#ifndef getc_unlocked + char *p = (char *) getc_unlocked; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_have_decl_getc_unlocked=yes +else + ac_cv_have_decl_getc_unlocked=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_getc_unlocked" >&5 +$as_echo "$ac_cv_have_decl_getc_unlocked" >&6; } + if test $ac_cv_have_decl_getc_unlocked = yes; then + gt_value=1 + else + gt_value=0 + fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETC_UNLOCKED $gt_value +_ACEOF + + + + case $gt_cv_func_printf_posix in + *yes) HAVE_POSIX_PRINTF=1 ;; + *) HAVE_POSIX_PRINTF=0 ;; + esac + + if test "$ac_cv_func_asprintf" = yes; then + HAVE_ASPRINTF=1 + else + HAVE_ASPRINTF=0 + fi + + if test "$ac_cv_func_snprintf" = yes; then + HAVE_SNPRINTF=1 + else + HAVE_SNPRINTF=0 + fi + + if test "$ac_cv_func_wprintf" = yes; then + HAVE_WPRINTF=1 + else + HAVE_WPRINTF=0 + fi + + + + + + + + am_save_CPPFLAGS="$CPPFLAGS" + + for element in $INCICONV; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 +$as_echo_n "checking for iconv... " >&6; } +if ${am_cv_func_iconv+:} false; then : + $as_echo_n "(cached) " >&6 +else + + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_func_iconv=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_lib_iconv=yes + am_cv_func_iconv=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$am_save_LIBS" + fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 +$as_echo "$am_cv_func_iconv" >&6; } + if test "$am_cv_func_iconv" = yes; then + +$as_echo "#define HAVE_ICONV 1" >>confdefs.h + + fi + if test "$am_cv_lib_iconv" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 +$as_echo_n "checking how to link with libiconv... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 +$as_echo "$LIBICONV" >&6; } + else + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + + + + if test "$am_cv_func_iconv" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5 +$as_echo_n "checking for iconv declaration... " >&6; } + if ${am_cv_proto_iconv+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + am_cv_proto_iconv_arg1="" +else + am_cv_proto_iconv_arg1="const" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" +fi + + am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_t:- + }$am_cv_proto_iconv" >&5 +$as_echo "${ac_t:- + }$am_cv_proto_iconv" >&6; } + +cat >>confdefs.h <<_ACEOF +#define ICONV_CONST $am_cv_proto_iconv_arg1 +_ACEOF + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5 +$as_echo_n "checking for nl_langinfo and CODESET... " >&6; } +if ${am_cv_langinfo_codeset+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +char* cs = nl_langinfo(CODESET); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_langinfo_codeset=yes +else + am_cv_langinfo_codeset=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5 +$as_echo "$am_cv_langinfo_codeset" >&6; } + if test $am_cv_langinfo_codeset = yes; then + +$as_echo "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h + + fi + + if test $ac_cv_header_locale_h = yes; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5 +$as_echo_n "checking for LC_MESSAGES... " >&6; } +if ${am_cv_val_LC_MESSAGES+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +return LC_MESSAGES + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_val_LC_MESSAGES=yes +else + am_cv_val_LC_MESSAGES=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_val_LC_MESSAGES" >&5 +$as_echo "$am_cv_val_LC_MESSAGES" >&6; } + if test $am_cv_val_LC_MESSAGES = yes; then + +$as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h + + fi + + fi + + for ac_prog in bison +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_INTLBISON+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$INTLBISON"; then + ac_cv_prog_INTLBISON="$INTLBISON" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_INTLBISON="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +INTLBISON=$ac_cv_prog_INTLBISON +if test -n "$INTLBISON"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLBISON" >&5 +$as_echo "$INTLBISON" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$INTLBISON" && break +done + + if test -z "$INTLBISON"; then + ac_verc_fail=yes + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking version of bison" >&5 +$as_echo_n "checking version of bison... " >&6; } + ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; + 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5 +$as_echo "$ac_prog_version" >&6; } + fi + if test $ac_verc_fail = yes; then + INTLBISON=: + fi + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 +$as_echo_n "checking whether NLS is requested... " >&6; } + # Check whether --enable-nls was given. +if test "${enable_nls+set}" = set; then : + enableval=$enable_nls; USE_NLS=$enableval +else + USE_NLS=yes +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 +$as_echo "$USE_NLS" >&6; } + + + + + BUILD_INCLUDED_LIBINTL=no + USE_INCLUDED_LIBINTL=no + + LIBINTL= + LTLIBINTL= + POSUB= + + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether included gettext is requested" >&5 +$as_echo_n "checking whether included gettext is requested... " >&6; } + +# Check whether --with-included-gettext was given. +if test "${with_included_gettext+set}" = set; then : + withval=$with_included_gettext; nls_cv_force_use_gnu_gettext=$withval +else + nls_cv_force_use_gnu_gettext=no +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nls_cv_force_use_gnu_gettext" >&5 +$as_echo "$nls_cv_force_use_gnu_gettext" >&6; } + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 +$as_echo_n "checking for GNU gettext in libc... " >&6; } +if ${gt_cv_func_gnugettext2_libc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings; +int +main () +{ +bindtextdomain ("", ""); +return (int) gettext ("") + (int) ngettext ("", "", 0) + _nl_msg_cat_cntr + *_nl_domain_bindings + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_gnugettext2_libc=yes +else + gt_cv_func_gnugettext2_libc=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_gnugettext2_libc" >&5 +$as_echo "$gt_cv_func_gnugettext2_libc" >&6; } + + if test "$gt_cv_func_gnugettext2_libc" != "yes"; then + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libintl-prefix was given. +if test "${with_libintl_prefix+set}" = set; then : + withval=$with_libintl_prefix; + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi + +fi + + LIBINTL= + LTLIBINTL= + INCINTL= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='intl ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$hardcode_direct" = yes; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" + ;; + esac + done + fi + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" + done + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 +$as_echo_n "checking for GNU gettext in libintl... " >&6; } +if ${gt_cv_func_gnugettext2_libintl+:} false; then : + $as_echo_n "(cached) " >&6 +else + gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (); +int +main () +{ +bindtextdomain ("", ""); +return (int) gettext ("") + (int) ngettext ("", "", 0) + _nl_msg_cat_cntr + *_nl_expand_alias (0) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_gnugettext2_libintl=yes +else + gt_cv_func_gnugettext2_libintl=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test "$gt_cv_func_gnugettext2_libintl" != yes && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (); +int +main () +{ +bindtextdomain ("", ""); +return (int) gettext ("") + (int) ngettext ("", "", 0) + _nl_msg_cat_cntr + *_nl_expand_alias (0) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + gt_cv_func_gnugettext2_libintl=yes + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_gnugettext2_libintl" >&5 +$as_echo "$gt_cv_func_gnugettext2_libintl" >&6; } + fi + + if test "$gt_cv_func_gnugettext2_libc" = "yes" \ + || { test "$gt_cv_func_gnugettext2_libintl" = "yes" \ + && test "$PACKAGE" != gettext-runtime \ + && test "$PACKAGE" != gettext-tools; }; then + gt_use_preinstalled_gnugettext=yes + else + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + + if test "$gt_use_preinstalled_gnugettext" != "yes"; then + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + BUILD_INCLUDED_LIBINTL=yes + USE_INCLUDED_LIBINTL=yes + LIBINTL="\$(top_builddir)/intl//libintl.a $LIBICONV" + LTLIBINTL="\$(top_builddir)/intl//libintl.a $LTLIBICONV" + LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` + fi + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + CATOBJEXT=.gmo + fi + + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + +$as_echo "#define ENABLE_NLS 1" >>confdefs.h + + else + USE_NLS=no + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 +$as_echo_n "checking whether to use NLS... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 +$as_echo "$USE_NLS" >&6; } + if test "$USE_NLS" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 +$as_echo_n "checking where the gettext function comes from... " >&6; } + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext2_libintl" = "yes"; then + gt_source="external libintl" + else + gt_source="libc" + fi + else + gt_source="included intl directory" + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 +$as_echo "$gt_source" >&6; } + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext2_libintl" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 +$as_echo_n "checking how to link with libintl... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 +$as_echo "$LIBINTL" >&6; } + + for element in $INCINTL; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + fi + + +$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h + + +$as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h + + fi + + POSUB=po + fi + + + if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then + BUILD_INCLUDED_LIBINTL=yes + fi + + + + + + nls_cv_header_intl= + nls_cv_header_libgt= + + DATADIRNAME=share + + + INSTOBJEXT=.mo + + + GENCAT=gencat + + + if test "$USE_INCLUDED_LIBINTL" = yes; then + INTLOBJS="\$(GETTOBJS)" + fi + + + INTL_LIBTOOL_SUFFIX_PREFIX= + + + + INTLLIBS="$LIBINTL" + + + + + + +if test "x${shared_libnavit}" = "xyes" -a "x${win32ce}" = "xyes"; then + INTLLIBS="\$(top_builddir)/intl/libintl.la" + LIBINTL=$INTLLIBS + LTLIBINTL=$INTLLIBS +fi + + +if test x"$LIBINTL" != "x" ;then + CFLAGS="$CFLAGS -I\$(top_builddir)/intl/" +fi + +fi + if test "x$enable_nls" = "xyes"; then + ENABLE_NLS_TRUE= + ENABLE_NLS_FALSE='#' +else + ENABLE_NLS_TRUE='#' + ENABLE_NLS_FALSE= +fi + + if test "x$xgettext_glade" = "xyes"; then + XGETTEXT_GLADE_TRUE= + XGETTEXT_GLADE_FALSE='#' +else + XGETTEXT_GLADE_TRUE='#' + XGETTEXT_GLADE_FALSE= +fi + +ac_fn_c_check_header_mongrel "$LINENO" "byteswap.h" "ac_cv_header_byteswap_h" "$ac_includes_default" +if test "x$ac_cv_header_byteswap_h" = xyes; then : + +$as_echo "#define HAVE_BYTESWAP_H 1" >>confdefs.h + + +fi + + + +ac_fn_c_check_header_mongrel "$LINENO" "sys/endian.h" "ac_cv_header_sys_endian_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_endian_h" = xyes; then : + +$as_echo "#define USE_SYS_ENDIAN_H 1" >>confdefs.h + +fi + + + +PACKAGE=navit +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + + + + +ac_fn_c_check_header_mongrel "$LINENO" "wordexp.h" "ac_cv_header_wordexp_h" "$ac_includes_default" +if test "x$ac_cv_header_wordexp_h" = xyes; then : + wordexp_h=yes +else + wordexp_h=no;NAVIT_CFLAGS="$NAVIT_CFLAGS -I\$(top_srcdir)/navit/support/wordexp";WORDEXP_LIBS="-L\$(top_builddir)/navit/support/wordexp -lsupport_wordexp" +fi + + + if test "x$wordexp_h" = "xno"; then + SUPPORT_WORDEXP_TRUE= + SUPPORT_WORDEXP_FALSE='#' +else + SUPPORT_WORDEXP_TRUE='#' + SUPPORT_WORDEXP_FALSE= +fi + + +support_libc=no +# Check whether --enable-support_libc was given. +if test "${enable_support_libc+set}" = set; then : + enableval=$enable_support_libc; support_libc=$enableval +fi + + if test "x$support_libc" = "xyes"; then + SUPPORT_LIBC_TRUE= + SUPPORT_LIBC_FALSE='#' +else + SUPPORT_LIBC_TRUE='#' + SUPPORT_LIBC_FALSE= +fi + +if test "x$support_libc" = "xyes"; then + CFLAGS="$CFLAGS -I\$(top_srcdir)/navit/support/libc" + LIBC_LIBS="-L\$(top_builddir)/navit/support/libc -lsupport_libc" +fi + +## graphics +# Check whether --enable-graphics was given. +if test "${enable_graphics+set}" = set; then : + enableval=$enable_graphics; graphics=$enableval;graphics_reason="configure parameter" +fi + + if test "x${graphics}" = "xyes"; then + GRAPHICS_TRUE= + GRAPHICS_FALSE='#' +else + GRAPHICS_TRUE='#' + GRAPHICS_FALSE= +fi + +if test "x$graphics" = "xyes"; then + +$as_echo "#define USE_GRAPHICS 1" >>confdefs.h + +fi + +# gd + +# android +# Check whether --enable-graphics-android was given. +if test "${enable_graphics_android+set}" = set; then : + enableval=$enable_graphics_android; graphics_android=$enableval;graphics_android_reason="configure parameter" +fi + + if test "x${graphics_android}" = "xyes"; then + GRAPHICS_ANDROID_TRUE= + GRAPHICS_ANDROID_FALSE='#' +else + GRAPHICS_ANDROID_TRUE='#' + GRAPHICS_ANDROID_FALSE= +fi + +# gd +# Check whether --enable-graphics-gd was given. +if test "${enable_graphics_gd+set}" = set; then : + enableval=$enable_graphics_gd; graphics_gd=$enableval;graphics_gd_reason="configure parameter" +fi + +if test "x${graphics_gd}" = "xyes" ; then + if test -z "$GDLIB_CONFIG"; then + # Extract the first word of "gdlib-config", so it can be a program name with args. +set dummy gdlib-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_GDLIB_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $GDLIB_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_GDLIB_CONFIG="$GDLIB_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_GDLIB_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +GDLIB_CONFIG=$ac_cv_path_GDLIB_CONFIG +if test -n "$GDLIB_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GDLIB_CONFIG" >&5 +$as_echo "$GDLIB_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdlib with $GDLIB_CONFIG" >&5 +$as_echo_n "checking for gdlib with $GDLIB_CONFIG... " >&6; } + if test ! -x "$GDLIB_CONFIG"; then + if test "x${GDLIB_CONFIG}" = "x" ; then + graphics_gd_reason="$GDLIB_CONFIG not executable" + else + graphics_gd_reason="gdlib-config missing" + fi + graphics_gd=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + else + if test "x${GD_CFLAGS}" = "x" ; then + GD_CFLAGS="-I`$GDLIB_CONFIG --includedir`" + fi + if test "x${GD_LIBS}" = "x" ; then + GD_LIBS="-L`$GDLIB_CONFIG --libdir` -lgd `$GDLIB_CONFIG --libs`" + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + fi +fi + if test "x${graphics_gd}" = "xyes"; then + GRAPHICS_GD_TRUE= + GRAPHICS_GD_FALSE='#' +else + GRAPHICS_GD_TRUE='#' + GRAPHICS_GD_FALSE= +fi + +ac_fn_c_check_header_mongrel "$LINENO" "sys/shm.h" "ac_cv_header_sys_shm_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_shm_h" = xyes; then : + +$as_echo "#define HAVE_SHMEM /**/" >>confdefs.h + + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "X11/xpm.h" "ac_cv_header_X11_xpm_h" "$ac_includes_default" +if test "x$ac_cv_header_X11_xpm_h" = xyes; then : + +$as_echo "#define HAVE_XPM /**/" >>confdefs.h + + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "getopt.h" "ac_cv_header_getopt_h" "$ac_includes_default" +if test "x$ac_cv_header_getopt_h" = xyes; then : + +$as_echo "#define HAVE_GETOPT_H /**/" >>confdefs.h + + +fi + + +if test "x${graphics_gd}" = "xyes" ; then + save_CPPFLAGS=$CPPFLAGS + save_LIBS=$LIBS + LIBS="$GD_LIBS $LIBS" + CPPFLAGS="$GD_CFLAGS $CPPFLAGS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +gdImageCreateFromPng(0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; }; +$as_echo "#define HAVE_GRAPHICS_GD_PNG 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CPPFLAGS=$save_CPPFLAGS + LIBS=$save_LIBS +fi + +# gtk_drawing_area +# Check whether --enable-graphics-gtk-drawing-area was given. +if test "${enable_graphics_gtk_drawing_area+set}" = set; then : + enableval=$enable_graphics_gtk_drawing_area; graphics_gtk_drawing_area=$enableval;graphics_gtk_drawing_area_reason="configure parameter" +fi + + if test "x${graphics_gtk_drawing_area}" = "xyes"; then + GRAPHICS_GTK_DRAWING_AREA_TRUE= + GRAPHICS_GTK_DRAWING_AREA_FALSE='#' +else + GRAPHICS_GTK_DRAWING_AREA_TRUE='#' + GRAPHICS_GTK_DRAWING_AREA_FALSE= +fi + +# null +# Check whether --enable-graphics-null was given. +if test "${enable_graphics_null+set}" = set; then : + enableval=$enable_graphics_null; graphics_null=$enableval;graphics_null_reason="configure parameter" +fi + + if test "x${graphics_null}" = "xyes"; then + GRAPHICS_NULL_TRUE= + GRAPHICS_NULL_FALSE='#' +else + GRAPHICS_NULL_TRUE='#' + GRAPHICS_NULL_FALSE= +fi + +# win32 +# Check whether --enable-graphics-win32 was given. +if test "${enable_graphics_win32+set}" = set; then : + enableval=$enable_graphics_win32; graphics_win32=$enableval;graphics_win32_reason="configure parameter" +fi + + if test "x${graphics_win32}" = "xyes"; then + GRAPHICS_WIN32_TRUE= + GRAPHICS_WIN32_FALSE='#' +else + GRAPHICS_WIN32_TRUE='#' + GRAPHICS_WIN32_FALSE= +fi + +# qt_qpainter +# Check whether --enable-graphics-qt-qpainter was given. +if test "${enable_graphics_qt_qpainter+set}" = set; then : + enableval=$enable_graphics_qt_qpainter; graphics_qt_qpainter=$enableval;graphics_qt_qpainter_reason="configure parameter" +fi + +if test "x${graphics_qt_qpainter}" = "xyes" -a "x${QT_GUI_CFLAGS}" = "x" -a "x${QT_GUI_LIBS}" = "x"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for QT_GUI" >&5 +$as_echo_n "checking for QT_GUI... " >&6; } + +if test -n "$QT_GUI_CFLAGS"; then + pkg_cv_QT_GUI_CFLAGS="$QT_GUI_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtGui QtCore\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtGui QtCore") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_QT_GUI_CFLAGS=`$PKG_CONFIG --cflags "QtGui QtCore" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$QT_GUI_LIBS"; then + pkg_cv_QT_GUI_LIBS="$QT_GUI_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtGui QtCore\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtGui QtCore") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_QT_GUI_LIBS=`$PKG_CONFIG --libs "QtGui QtCore" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + QT_GUI_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "QtGui QtCore" 2>&1` + else + QT_GUI_PKG_ERRORS=`$PKG_CONFIG --print-errors "QtGui QtCore" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$QT_GUI_PKG_ERRORS" >&5 + + graphics_qt_qpainter=no;graphics_qt_qpainter_reason="Packages QtGui and/or QtCore missing" +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + graphics_qt_qpainter=no;graphics_qt_qpainter_reason="Packages QtGui and/or QtCore missing" +else + QT_GUI_CFLAGS=$pkg_cv_QT_GUI_CFLAGS + QT_GUI_LIBS=$pkg_cv_QT_GUI_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + graphics_qt_qpainter=yes +fi + if test "x${graphics_qt_qpainter}" = "xno"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for QT_GUI" >&5 +$as_echo_n "checking for QT_GUI... " >&6; } + +if test -n "$QT_GUI_CFLAGS"; then + pkg_cv_QT_GUI_CFLAGS="$QT_GUI_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"qt-mt\""; } >&5 + ($PKG_CONFIG --exists --print-errors "qt-mt") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_QT_GUI_CFLAGS=`$PKG_CONFIG --cflags "qt-mt" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$QT_GUI_LIBS"; then + pkg_cv_QT_GUI_LIBS="$QT_GUI_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"qt-mt\""; } >&5 + ($PKG_CONFIG --exists --print-errors "qt-mt") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_QT_GUI_LIBS=`$PKG_CONFIG --libs "qt-mt" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + QT_GUI_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "qt-mt" 2>&1` + else + QT_GUI_PKG_ERRORS=`$PKG_CONFIG --print-errors "qt-mt" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$QT_GUI_PKG_ERRORS" >&5 + + graphics_qt_qpainter=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + graphics_qt_qpainter=no +else + QT_GUI_CFLAGS=$pkg_cv_QT_GUI_CFLAGS + QT_GUI_LIBS=$pkg_cv_QT_GUI_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + graphics_qt_qpainter=yes;graphics_qt_qpainter_reason="Package qt-mt present" +fi + fi +fi +if test "x${graphics_qt_qpainter}" = "xyes" ; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for QT_SVG" >&5 +$as_echo_n "checking for QT_SVG... " >&6; } + +if test -n "$QT_SVG_CFLAGS"; then + pkg_cv_QT_SVG_CFLAGS="$QT_SVG_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtSvg\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtSvg") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_QT_SVG_CFLAGS=`$PKG_CONFIG --cflags "QtSvg" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$QT_SVG_LIBS"; then + pkg_cv_QT_SVG_LIBS="$QT_SVG_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtSvg\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtSvg") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_QT_SVG_LIBS=`$PKG_CONFIG --libs "QtSvg" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + QT_SVG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "QtSvg" 2>&1` + else + QT_SVG_PKG_ERRORS=`$PKG_CONFIG --print-errors "QtSvg" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$QT_SVG_PKG_ERRORS" >&5 + + have_qt_svg=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_qt_svg=no +else + QT_SVG_CFLAGS=$pkg_cv_QT_SVG_CFLAGS + QT_SVG_LIBS=$pkg_cv_QT_SVG_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_qt_svg=yes +fi + if test "x${have_qt_svg}" = "xyes"; then + +$as_echo "#define HAVE_QT_SVG /**/" >>confdefs.h + + fi +fi +if test "x${graphics_qt_qpainter}" = "xyes" ; then + +$as_echo "#define USE_GRAPICS_QT_QPAINTER 1" >>confdefs.h + +fi + + + + + if test "x${graphics_qt_qpainter}" = "xyes"; then + GRAPHICS_QT_QPAINTER_TRUE= + GRAPHICS_QT_QPAINTER_FALSE='#' +else + GRAPHICS_QT_QPAINTER_TRUE='#' + GRAPHICS_QT_QPAINTER_FALSE= +fi + +MOC=`$PKG_CONFIG QtGui --variable=moc_location` +if test "x${MOC}" = "x"; then + # Extract the first word of "moc", so it can be a program name with args. +set dummy moc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MOC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MOC"; then + ac_cv_prog_MOC="$MOC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_MOC="moc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MOC=$ac_cv_prog_MOC +if test -n "$MOC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MOC" >&5 +$as_echo "$MOC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi + + + +## map +# binfile +# Check whether --enable-map-binfile was given. +if test "${enable_map_binfile+set}" = set; then : + enableval=$enable_map_binfile; map_binfile=$enableval;map_binfile_reason="configure parameter" +fi + + if test "x${map_binfile}" = "xyes"; then + MAP_BINFILE_TRUE= + MAP_BINFILE_FALSE='#' +else + MAP_BINFILE_TRUE='#' + MAP_BINFILE_FALSE= +fi + +# filter +# Check whether --enable-map-filter was given. +if test "${enable_map_filter+set}" = set; then : + enableval=$enable_map_filter; map_filter=$enableval;map_filter_reason="configure parameter" +fi + + if test "x${map_filter}" = "xyes"; then + MAP_FILTER_TRUE= + MAP_FILTER_FALSE='#' +else + MAP_FILTER_TRUE='#' + MAP_FILTER_FALSE= +fi + +# mg +# Check whether --enable-map-mg was given. +if test "${enable_map_mg+set}" = set; then : + enableval=$enable_map_mg; map_mg=$enableval;map_mg_reason="configure parameter" +fi + + if test "x${map_mg}" = "xyes"; then + MAP_MG_TRUE= + MAP_MG_FALSE='#' +else + MAP_MG_TRUE='#' + MAP_MG_FALSE= +fi + +# shapefile +# Check whether --enable-map-shapefile was given. +if test "${enable_map_shapefile+set}" = set; then : + enableval=$enable_map_shapefile; map_shapefile=$enableval;map_shapefile_reason="configure parameter" +fi + + if test "x${map_shapefile}" = "xyes"; then + MAP_SHAPEFILE_TRUE= + MAP_SHAPEFILE_FALSE='#' +else + MAP_SHAPEFILE_TRUE='#' + MAP_SHAPEFILE_FALSE= +fi + +# textfile +# Check whether --enable-map-textfile was given. +if test "${enable_map_textfile+set}" = set; then : + enableval=$enable_map_textfile; map_textfile=$enableval;map_textfile_reason="configure parameter" +fi + + if test "x${map_textfile}" = "xyes"; then + MAP_TEXTFILE_TRUE= + MAP_TEXTFILE_FALSE='#' +else + MAP_TEXTFILE_TRUE='#' + MAP_TEXTFILE_FALSE= +fi + +# csv +# Check whether --enable-map-csv was given. +if test "${enable_map_csv+set}" = set; then : + enableval=$enable_map_csv; map_csv=$enableval;map_csv_reason="configure parameter" +fi + + if test "x${map_csv}" = "xyes"; then + MAP_CSV_TRUE= + MAP_CSV_FALSE='#' +else + MAP_CSV_TRUE='#' + MAP_CSV_FALSE= +fi + + +## osd +# core +# Check whether --enable-osd-core was given. +if test "${enable_osd_core+set}" = set; then : + enableval=$enable_osd_core; osd_core=$enableval;osd_core_reason="configure parameter" +fi + + if test "x${osd_core}" = "xyes"; then + OSD_CORE_TRUE= + OSD_CORE_FALSE='#' +else + OSD_CORE_TRUE='#' + OSD_CORE_FALSE= +fi + + +## gui +# gtk +# Check whether --enable-gui-gtk was given. +if test "${enable_gui_gtk+set}" = set; then : + enableval=$enable_gui_gtk; gui_gtk=$enableval +fi + + if test "x${gui_gtk}" = "xyes"; then + GUI_GTK_TRUE= + GUI_GTK_FALSE='#' +else + GUI_GTK_TRUE='#' + GUI_GTK_FALSE= +fi + +# internal +# Check whether --enable-gui-internal was given. +if test "${enable_gui_internal+set}" = set; then : + enableval=$enable_gui_internal; gui_internal=$enableval;gui_internal_reason="configure parameter" +fi + + if test "x${gui_internal}" = "xyes"; then + GUI_INTERNAL_TRUE= + GUI_INTERNAL_FALSE='#' +else + GUI_INTERNAL_TRUE='#' + GUI_INTERNAL_FALSE= +fi + +# win32 +# Check whether --enable-gui-win32 was given. +if test "${enable_gui_win32+set}" = set; then : + enableval=$enable_gui_win32; gui_win32=$enableval;gui_win32_reason="configure parameter" +fi + + if test "x${gui_win32}" = "xyes"; then + GUI_WIN32_TRUE= + GUI_WIN32_FALSE='#' +else + GUI_WIN32_TRUE='#' + GUI_WIN32_FALSE= +fi + +# qml +# Check whether --enable-gui-qml was given. +if test "${enable_gui_qml+set}" = set; then : + enableval=$enable_gui_qml; gui_qml=$enableval;gui_qml_reason="configure parameter" +fi + +if test "x${gui_qml}" = "xyes" -a "x${QT_GUI_CFLAGS}" = "x" -a "x${QT_GUI_LIBS}" = "x"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for QT_GUI" >&5 +$as_echo_n "checking for QT_GUI... " >&6; } + +if test -n "$QT_GUI_CFLAGS"; then + pkg_cv_QT_GUI_CFLAGS="$QT_GUI_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtGui QtCore\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtGui QtCore") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_QT_GUI_CFLAGS=`$PKG_CONFIG --cflags "QtGui QtCore" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$QT_GUI_LIBS"; then + pkg_cv_QT_GUI_LIBS="$QT_GUI_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtGui QtCore\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtGui QtCore") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_QT_GUI_LIBS=`$PKG_CONFIG --libs "QtGui QtCore" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + QT_GUI_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "QtGui QtCore" 2>&1` + else + QT_GUI_PKG_ERRORS=`$PKG_CONFIG --print-errors "QtGui QtCore" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$QT_GUI_PKG_ERRORS" >&5 + + gui_qml=no;gui_qml_reason="Packages QtGui and/or QtCore are missing" +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + gui_qml=no;gui_qml_reason="Packages QtGui and/or QtCore are missing" +else + QT_GUI_CFLAGS=$pkg_cv_QT_GUI_CFLAGS + QT_GUI_LIBS=$pkg_cv_QT_GUI_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi +fi +if test "x${gui_qml}" = "xyes" -a "x${QT_XML_CFLAGS}" = "x" -a "x${QT_XML_LIBS}" = "x"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for QT_XML" >&5 +$as_echo_n "checking for QT_XML... " >&6; } + +if test -n "$QT_XML_CFLAGS"; then + pkg_cv_QT_XML_CFLAGS="$QT_XML_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtXml\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtXml") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_QT_XML_CFLAGS=`$PKG_CONFIG --cflags "QtXml" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$QT_XML_LIBS"; then + pkg_cv_QT_XML_LIBS="$QT_XML_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtXml\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtXml") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_QT_XML_LIBS=`$PKG_CONFIG --libs "QtXml" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + QT_XML_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "QtXml" 2>&1` + else + QT_XML_PKG_ERRORS=`$PKG_CONFIG --print-errors "QtXml" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$QT_XML_PKG_ERRORS" >&5 + + gui_qml=no;gui_qml_reason="Package QtXml is missing" +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + gui_qml=no;gui_qml_reason="Package QtXml is missing" +else + QT_XML_CFLAGS=$pkg_cv_QT_XML_CFLAGS + QT_XML_LIBS=$pkg_cv_QT_XML_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi +fi +if test "x${gui_qml}" = "xyes" -a "x${QT_DECLARATIVE_CFLAGS}" = "x" -a "x${QT_DECLARATIVE_LIBS}" = "x"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for QT_DECLARATIVE" >&5 +$as_echo_n "checking for QT_DECLARATIVE... " >&6; } + +if test -n "$QT_DECLARATIVE_CFLAGS"; then + pkg_cv_QT_DECLARATIVE_CFLAGS="$QT_DECLARATIVE_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtDeclarative >= 4.6.0 \""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtDeclarative >= 4.6.0 ") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_QT_DECLARATIVE_CFLAGS=`$PKG_CONFIG --cflags "QtDeclarative >= 4.6.0 " 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$QT_DECLARATIVE_LIBS"; then + pkg_cv_QT_DECLARATIVE_LIBS="$QT_DECLARATIVE_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtDeclarative >= 4.6.0 \""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtDeclarative >= 4.6.0 ") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_QT_DECLARATIVE_LIBS=`$PKG_CONFIG --libs "QtDeclarative >= 4.6.0 " 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + QT_DECLARATIVE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "QtDeclarative >= 4.6.0 " 2>&1` + else + QT_DECLARATIVE_PKG_ERRORS=`$PKG_CONFIG --print-errors "QtDeclarative >= 4.6.0 " 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$QT_DECLARATIVE_PKG_ERRORS" >&5 + + gui_qml=no;gui_qml_reason="Packages QtDeclarative is missing" +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + gui_qml=no;gui_qml_reason="Packages QtDeclarative is missing" +else + QT_DECLARATIVE_CFLAGS=$pkg_cv_QT_DECLARATIVE_CFLAGS + QT_DECLARATIVE_LIBS=$pkg_cv_QT_DECLARATIVE_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi +fi +if test "x${gui_qml}" = "xyes" ; then + +$as_echo "#define USE_GUI_QML 1" >>confdefs.h + +fi + + + + + + + if test "x${gui_qml}" = "xyes"; then + GUI_QML_TRUE= + GUI_QML_FALSE='#' +else + GUI_QML_TRUE='#' + GUI_QML_FALSE= +fi + + +## plugins +# pedestrian +# Check whether --enable-plugin-pedestrian was given. +if test "${enable_plugin_pedestrian+set}" = set; then : + enableval=$enable_plugin_pedestrian; plugin_pedestrian=$enableval;plugin_pedestrian_reason="configure parameter" +fi + + if test "x${plugin_pedestrian}" = "xyes"; then + PLUGIN_PEDESTRIAN_TRUE= + PLUGIN_PEDESTRIAN_FALSE='#' +else + PLUGIN_PEDESTRIAN_TRUE='#' + PLUGIN_PEDESTRIAN_FALSE= +fi + + +## routing +# Check whether --enable-routing was given. +if test "${enable_routing+set}" = set; then : + enableval=$enable_routing; routing=$enableval;routing_reason="configure parameter" +fi + + if test "x${routing}" = "xyes"; then + ROUTING_TRUE= + ROUTING_FALSE='#' +else + ROUTING_TRUE='#' + ROUTING_FALSE= +fi + +if test "x$routing" = "xyes"; then + +$as_echo "#define USE_ROUTING 1" >>confdefs.h + +fi + +## speech +# android +# Check whether --enable-speech-android was given. +if test "${enable_speech_android+set}" = set; then : + enableval=$enable_speech_android; speech_android=$enableval;speech_android_reason="configure parameter" +fi + + if test "x${speech_android}" = "xyes"; then + SPEECH_ANDROID_TRUE= + SPEECH_ANDROID_FALSE='#' +else + SPEECH_ANDROID_TRUE='#' + SPEECH_ANDROID_FALSE= +fi + +# cmdline +# Check whether --enable-speech-cmdline was given. +if test "${enable_speech_cmdline+set}" = set; then : + enableval=$enable_speech_cmdline; speech_cmdline=$enableval;speech_cmdline_reason="configure parameter" +fi + + if test "x${speech_cmdline}" = "xyes"; then + SPEECH_CMDLINE_TRUE= + SPEECH_CMDLINE_FALSE='#' +else + SPEECH_CMDLINE_TRUE='#' + SPEECH_CMDLINE_FALSE= +fi + +# espeak +# Check whether --enable-speech-espeak was given. +if test "${enable_speech_espeak+set}" = set; then : + enableval=$enable_speech_espeak; speech_espeak=$enableval;speech_espeak_reason="configure parameter" +fi + + if test "x${speech_espeak}" = "xyes"; then + SPEECH_ESPEAK_TRUE= + SPEECH_ESPEAK_FALSE='#' +else + SPEECH_ESPEAK_TRUE='#' + SPEECH_ESPEAK_FALSE= +fi + +# speech-dispatcher +# Check whether --enable-speech-speech-dispatcher was given. +if test "${enable_speech_speech_dispatcher+set}" = set; then : + enableval=$enable_speech_speech_dispatcher; speech_speech_dispatcher=$enableval;speech_speech_dispatcher_reason="configure parameter" +fi + +if test "x$speech_speech_dispatcher" = "xyes"; then + ac_fn_c_check_header_mongrel "$LINENO" "libspeechd.h" "ac_cv_header_libspeechd_h" "$ac_includes_default" +if test "x$ac_cv_header_libspeechd_h" = xyes; then : + +$as_echo "#define HAVE_LIBSPEECHD /**/" >>confdefs.h + SPEECHD_LIBS="-lspeechd" +else + speech_speech_dispatcher=no; speech_speech_dispatcher_reason="libspeechd.h missing" +fi + + +fi + + + if test "x${speech_speech_dispatcher}" = "xyes"; then + SPEECH_SPEECH_DISPATCHER_TRUE= + SPEECH_SPEECH_DISPATCHER_FALSE='#' +else + SPEECH_SPEECH_DISPATCHER_TRUE='#' + SPEECH_SPEECH_DISPATCHER_FALSE= +fi + + if test "x${support_espeak}" = "xyes"; then + SUPPORT_ESPEAK_TRUE= + SUPPORT_ESPEAK_FALSE='#' +else + SUPPORT_ESPEAK_TRUE='#' + SUPPORT_ESPEAK_FALSE= +fi + + +## vehicle +# android +# Check whether --enable-vehicle-android was given. +if test "${enable_vehicle_android+set}" = set; then : + enableval=$enable_vehicle_android; vehicle_android=$enableval;vehicle_android_reason="configure parameter" +fi + + if test "x${vehicle_android}" = "xyes"; then + VEHICLE_ANDROID_TRUE= + VEHICLE_ANDROID_FALSE='#' +else + VEHICLE_ANDROID_TRUE='#' + VEHICLE_ANDROID_FALSE= +fi + +# demo +# Check whether --enable-vehicle-demo was given. +if test "${enable_vehicle_demo+set}" = set; then : + enableval=$enable_vehicle_demo; vehicle_demo=$enableval;vehicle_demo_reason="configure parameter" +fi + + if test "x${vehicle_demo}" = "xyes"; then + VEHICLE_DEMO_TRUE= + VEHICLE_DEMO_FALSE='#' +else + VEHICLE_DEMO_TRUE='#' + VEHICLE_DEMO_FALSE= +fi + +# file +# Check whether --enable-vehicle-file was given. +if test "${enable_vehicle_file+set}" = set; then : + enableval=$enable_vehicle_file; vehicle_file=$enableval;vehicle_file_reason="configure parameter" +fi + + if test "x${vehicle_file}" = "xyes"; then + VEHICLE_FILE_TRUE= + VEHICLE_FILE_FALSE='#' +else + VEHICLE_FILE_TRUE='#' + VEHICLE_FILE_FALSE= +fi + +# gpsd +# Check whether --enable-vehicle-gpsd was given. +if test "${enable_vehicle_gpsd+set}" = set; then : + enableval=$enable_vehicle_gpsd; vehicle_gpsd=$enableval;vehicle_gpsd_reason="configure parameter" +fi + +if test "x${vehicle_gpsd}" = xyes +then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GPSD" >&5 +$as_echo_n "checking for GPSD... " >&6; } + +if test -n "$GPSD_CFLAGS"; then + pkg_cv_GPSD_CFLAGS="$GPSD_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libgps\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libgps") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GPSD_CFLAGS=`$PKG_CONFIG --cflags "libgps" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GPSD_LIBS"; then + pkg_cv_GPSD_LIBS="$GPSD_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libgps\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libgps") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GPSD_LIBS=`$PKG_CONFIG --libs "libgps" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GPSD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "libgps" 2>&1` + else + GPSD_PKG_ERRORS=`$PKG_CONFIG --print-errors "libgps" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GPSD_PKG_ERRORS" >&5 + + have_libgps="no" +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_libgps="no" +else + GPSD_CFLAGS=$pkg_cv_GPSD_CFLAGS + GPSD_LIBS=$pkg_cv_GPSD_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_libgps="yes" +fi + if test "x$have_libgps" = "xyes"; then + +$as_echo "#define HAVE_LIBGPS /**/" >>confdefs.h + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBGPS19" >&5 +$as_echo_n "checking for LIBGPS19... " >&6; } + +if test -n "$LIBGPS19_CFLAGS"; then + pkg_cv_LIBGPS19_CFLAGS="$LIBGPS19_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libgps >= 2.90\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libgps >= 2.90") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBGPS19_CFLAGS=`$PKG_CONFIG --cflags "libgps >= 2.90" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LIBGPS19_LIBS"; then + pkg_cv_LIBGPS19_LIBS="$LIBGPS19_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libgps >= 2.90\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libgps >= 2.90") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBGPS19_LIBS=`$PKG_CONFIG --libs "libgps >= 2.90" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBGPS19_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "libgps >= 2.90" 2>&1` + else + LIBGPS19_PKG_ERRORS=`$PKG_CONFIG --print-errors "libgps >= 2.90" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBGPS19_PKG_ERRORS" >&5 + + have_libgps19="no" +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + have_libgps19="no" +else + LIBGPS19_CFLAGS=$pkg_cv_LIBGPS19_CFLAGS + LIBGPS19_LIBS=$pkg_cv_LIBGPS19_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + have_libgps19="yes" +fi + if test "x$have_libgps19" = "xyes"; then + +$as_echo "#define HAVE_LIBGPS19 /**/" >>confdefs.h + + fi + else + ac_fn_c_check_header_mongrel "$LINENO" "gps.h" "ac_cv_header_gps_h" "$ac_includes_default" +if test "x$ac_cv_header_gps_h" = xyes; then : + +$as_echo "#define HAVE_LIBGPS /**/" >>confdefs.h + GPSD_LIBS="-lgps" +else + vehicle_gpsd=no; vehicle_gpsd_reason="no gps.h and no gpsd pkgconfig" +fi + + + fi +fi + + + if test "x${vehicle_gpsd}" = "xyes"; then + VEHICLE_GPSD_TRUE= + VEHICLE_GPSD_FALSE='#' +else + VEHICLE_GPSD_TRUE='#' + VEHICLE_GPSD_FALSE= +fi + +# gypsy +# Check whether --enable-vehicle-gypsy was given. +if test "${enable_vehicle_gypsy+set}" = set; then : + enableval=$enable_vehicle_gypsy; vehicle_gypsy=$enableval;vehicle_gypsy_reason="configure parameter" +fi + +if test "x${vehicle_gypsy}" = "xyes" +then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GYPSY" >&5 +$as_echo_n "checking for GYPSY... " >&6; } + +if test -n "$GYPSY_CFLAGS"; then + pkg_cv_GYPSY_CFLAGS="$GYPSY_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gypsy\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gypsy") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GYPSY_CFLAGS=`$PKG_CONFIG --cflags "gypsy" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GYPSY_LIBS"; then + pkg_cv_GYPSY_LIBS="$GYPSY_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gypsy\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gypsy") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GYPSY_LIBS=`$PKG_CONFIG --libs "gypsy" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GYPSY_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "gypsy" 2>&1` + else + GYPSY_PKG_ERRORS=`$PKG_CONFIG --print-errors "gypsy" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GYPSY_PKG_ERRORS" >&5 + + vehicle_gypsy=no;vehicle_gypsy_reason="package gypsy missing" +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + vehicle_gypsy=no;vehicle_gypsy_reason="package gypsy missing" +else + GYPSY_CFLAGS=$pkg_cv_GYPSY_CFLAGS + GYPSY_LIBS=$pkg_cv_GYPSY_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi +fi + + + if test "x${vehicle_gypsy}" = "xyes"; then + VEHICLE_GYPSY_TRUE= + VEHICLE_GYPSY_FALSE='#' +else + VEHICLE_GYPSY_TRUE='#' + VEHICLE_GYPSY_FALSE= +fi + +# maemo +# Check whether --enable-vehicle-maemo was given. +if test "${enable_vehicle_maemo+set}" = set; then : + enableval=$enable_vehicle_maemo; vehicle_maemo=$enableval;vehicle_maemo_reason="configure parameter" +fi + +if test "x${vehicle_maemo}" = "xyes" ; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBLOCATION" >&5 +$as_echo_n "checking for LIBLOCATION... " >&6; } + +if test -n "$LIBLOCATION_CFLAGS"; then + pkg_cv_LIBLOCATION_CFLAGS="$LIBLOCATION_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"liblocation\""; } >&5 + ($PKG_CONFIG --exists --print-errors "liblocation") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBLOCATION_CFLAGS=`$PKG_CONFIG --cflags "liblocation" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LIBLOCATION_LIBS"; then + pkg_cv_LIBLOCATION_LIBS="$LIBLOCATION_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"liblocation\""; } >&5 + ($PKG_CONFIG --exists --print-errors "liblocation") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBLOCATION_LIBS=`$PKG_CONFIG --libs "liblocation" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBLOCATION_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "liblocation" 2>&1` + else + LIBLOCATION_PKG_ERRORS=`$PKG_CONFIG --print-errors "liblocation" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBLOCATION_PKG_ERRORS" >&5 + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + vehicle_maemo=no + vehicle_maemo_reason="no maemo location library found" + +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + vehicle_maemo=no + vehicle_maemo_reason="no maemo location library found" + +else + LIBLOCATION_CFLAGS=$pkg_cv_LIBLOCATION_CFLAGS + LIBLOCATION_LIBS=$pkg_cv_LIBLOCATION_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + + + +fi +fi + if test "x${vehicle_maemo}" = "xyes"; then + VEHICLE_MAEMO_TRUE= + VEHICLE_MAEMO_FALSE='#' +else + VEHICLE_MAEMO_TRUE='#' + VEHICLE_MAEMO_FALSE= +fi + +# null +# Check whether --enable-vehicle-null was given. +if test "${enable_vehicle_null+set}" = set; then : + enableval=$enable_vehicle_null; vehicle_null=$enableval;vehicle_null_reason="configure parameter" +fi + + if test "x${vehicle_null}" = "xyes"; then + VEHICLE_NULL_TRUE= + VEHICLE_NULL_FALSE='#' +else + VEHICLE_NULL_TRUE='#' + VEHICLE_NULL_FALSE= +fi + +# wince +# Check whether --enable-vehicle-wince was given. +if test "${enable_vehicle_wince+set}" = set; then : + enableval=$enable_vehicle_wince; vehicle_wince=$enableval;vehicle_wince_reason="configure parameter" +fi + + if test "x${vehicle_wince}" = "xyes"; then + VEHICLE_WINCE_TRUE= + VEHICLE_WINCE_FALSE='#' +else + VEHICLE_WINCE_TRUE='#' + VEHICLE_WINCE_FALSE= +fi + +# iphone +# Check whether --enable-vehicle-iphone was given. +if test "${enable_vehicle_iphone+set}" = set; then : + enableval=$enable_vehicle_iphone; vehicle_iphone=$enableval;vehicle_iphone_reason="configure parameter" +fi + + if test "x${vehicle_iphone}" = "xyes"; then + VEHICLE_IPHONE_TRUE= + VEHICLE_IPHONE_FALSE='#' +else + VEHICLE_IPHONE_TRUE='#' + VEHICLE_IPHONE_FALSE= +fi + +if test "x${vehicle_iphone}" = "xyes" +then + IPHONE_LIBS=-Wl,-framework,CoreLocation +fi + + +# webos +# Check whether --enable-vehicle-webos was given. +if test "${enable_vehicle_webos+set}" = set; then : + enableval=$enable_vehicle_webos; vehicle_webos=$enableval;vehicle_webos_reason="configure parameter" +fi + + if test "x${vehicle_webos}" = "xyes"; then + VEHICLE_WEBOS_TRUE= + VEHICLE_WEBOS_FALSE='#' +else + VEHICLE_WEBOS_TRUE='#' + VEHICLE_WEBOS_FALSE= +fi + +if test "x${vehicle_webos}" = "xyes" +then + +$as_echo "#define USE_WEBOS /**/" >>confdefs.h + + LIBPDL_CFLAGS="$SDL_CFLAGS -I/usr/local/include" + LIBPDL_LIBS="-L/usr/local/lib -lpdl" + + +fi +NAVIT_CFLAGS="$NAVIT_CFLAGS $GLIB_CFLAGS $GMODULE_CFLAGS" +NAVIT_LIBS="$NAVIT_LIBS $GLIB_LIBS $GMODULE_LIBS $LIBINTL" + + + + + + +ac_config_files="$ac_config_files Makefile navit/Makefile navit/autoload/Makefile navit/autoload/osso/Makefile navit/binding/Makefile navit/binding/python/Makefile navit/binding/dbus/Makefile navit/binding/win32/Makefile navit/map/Makefile navit/map/mg/Makefile navit/map/textfile/Makefile navit/map/csv/Makefile navit/map/shapefile/Makefile navit/map/filter/Makefile navit/map/binfile/Makefile navit/map/garmin/Makefile navit/maptool/Makefile navit/fib-1.1/Makefile navit/font/Makefile navit/font/freetype/Makefile navit/fonts/Makefile navit/graphics/Makefile navit/graphics/android/Makefile navit/graphics/gd/Makefile navit/graphics/gtk_drawing_area/Makefile navit/graphics/opengl/Makefile navit/graphics/null/Makefile navit/graphics/sdl/Makefile navit/graphics/qt_qpainter/Makefile navit/graphics/win32/Makefile navit/gui/Makefile navit/gui/gtk/Makefile navit/gui/internal/Makefile navit/gui/win32/Makefile navit/gui/qml/Makefile navit/gui/qml/skins/Makefile navit/gui/qml/skins/navit/Makefile navit/osd/Makefile navit/osd/core/Makefile navit/plugin/Makefile navit/plugin/pedestrian/Makefile navit/speech/Makefile navit/speech/android/Makefile navit/speech/cmdline/Makefile navit/speech/dbus/Makefile navit/speech/espeak/Makefile navit/speech/speech_dispatcher/Makefile navit/support/Makefile navit/support/espeak/Makefile navit/support/ezxml/Makefile navit/support/glib/Makefile navit/support/libc/Makefile navit/support/libpng/Makefile navit/support/shapefile/Makefile navit/support/win32/Makefile navit/support/wordexp/Makefile navit/support/zlib/Makefile navit/vehicle/Makefile navit/vehicle/android/Makefile navit/vehicle/file/Makefile navit/vehicle/gpsd/Makefile navit/vehicle/gpsd_dbus/Makefile navit/vehicle/gypsy/Makefile navit/vehicle/maemo/Makefile navit/vehicle/null/Makefile navit/vehicle/demo/Makefile navit/vehicle/wince/Makefile navit/vehicle/iphone/Makefile navit/vehicle/webos/Makefile navit/xpm/Makefile navit/maps/Makefile intl/Makefile po/Makefile man/Makefile" + +#src/data/garmin_img/Makefile + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${SOURCE_MODE_SVN_TRUE}" && test -z "${SOURCE_MODE_SVN_FALSE}"; then + as_fn_error $? "conditional \"SOURCE_MODE_SVN\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SUPPORT_WIN32_TRUE}" && test -z "${SUPPORT_WIN32_FALSE}"; then + as_fn_error $? "conditional \"SUPPORT_WIN32\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SUPPORT_WIN32CE_TRUE}" && test -z "${SUPPORT_WIN32CE_FALSE}"; then + as_fn_error $? "conditional \"SUPPORT_WIN32CE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SUPPORT_ANDROID_TRUE}" && test -z "${SUPPORT_ANDROID_FALSE}"; then + as_fn_error $? "conditional \"SUPPORT_ANDROID\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SUPPORT_LIBPNG_TRUE}" && test -z "${SUPPORT_LIBPNG_FALSE}"; then + as_fn_error $? "conditional \"SUPPORT_LIBPNG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepOBJC_TRUE}" && test -z "${am__fastdepOBJC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepOBJC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepOBJC_TRUE}" && test -z "${am__fastdepOBJC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepOBJC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CROSS_COMPILING_TRUE}" && test -z "${CROSS_COMPILING_FALSE}"; then + as_fn_error $? "conditional \"CROSS_COMPILING\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +if test -z "${USE_HILDON_TRUE}" && test -z "${USE_HILDON_FALSE}"; then + as_fn_error $? "conditional \"USE_HILDON\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_OSSO_TRUE}" && test -z "${USE_OSSO_FALSE}"; then + as_fn_error $? "conditional \"USE_OSSO\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MAPTOOL_TRUE}" && test -z "${MAPTOOL_FALSE}"; then + as_fn_error $? "conditional \"MAPTOOL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_SAMPLEMAP_TRUE}" && test -z "${BUILD_SAMPLEMAP_FALSE}"; then + as_fn_error $? "conditional \"BUILD_SAMPLEMAP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${FASTMATH_TRUE}" && test -z "${FASTMATH_FALSE}"; then + as_fn_error $? "conditional \"FASTMATH\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${PLUGINS_TRUE}" && test -z "${PLUGINS_FALSE}"; then + as_fn_error $? "conditional \"PLUGINS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SHARED_LIBNAVIT_TRUE}" && test -z "${SHARED_LIBNAVIT_FALSE}"; then + as_fn_error $? "conditional \"SHARED_LIBNAVIT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BIN_NAVIT_TRUE}" && test -z "${BIN_NAVIT_FALSE}"; then + as_fn_error $? "conditional \"BIN_NAVIT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${EVENT_GLIB_TRUE}" && test -z "${EVENT_GLIB_FALSE}"; then + as_fn_error $? "conditional \"EVENT_GLIB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SUPPORT_GLIB_TRUE}" && test -z "${SUPPORT_GLIB_FALSE}"; then + as_fn_error $? "conditional \"SUPPORT_GLIB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SUPPORT_EZXML_TRUE}" && test -z "${SUPPORT_EZXML_FALSE}"; then + as_fn_error $? "conditional \"SUPPORT_EZXML\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SUPPORT_ZLIB_TRUE}" && test -z "${SUPPORT_ZLIB_FALSE}"; then + as_fn_error $? "conditional \"SUPPORT_ZLIB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GRAPHICS_SDL_TRUE}" && test -z "${GRAPHICS_SDL_FALSE}"; then + as_fn_error $? "conditional \"GRAPHICS_SDL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_POSTGRESQL_TRUE}" && test -z "${HAVE_POSTGRESQL_FALSE}"; then + as_fn_error $? "conditional \"HAVE_POSTGRESQL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${FONT_FREETYPE_TRUE}" && test -z "${FONT_FREETYPE_FALSE}"; then + as_fn_error $? "conditional \"FONT_FREETYPE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${FONTS_TRUE}" && test -z "${FONTS_FALSE}"; then + as_fn_error $? "conditional \"FONTS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GRAPHICS_OPENGL_TRUE}" && test -z "${GRAPHICS_OPENGL_FALSE}"; then + as_fn_error $? "conditional \"GRAPHICS_OPENGL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_SYSTEM_SHAPEFILELIB_TRUE}" && test -z "${HAVE_SYSTEM_SHAPEFILELIB_FALSE}"; then + as_fn_error $? "conditional \"HAVE_SYSTEM_SHAPEFILELIB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVELIBGARMIN_TRUE}" && test -z "${HAVELIBGARMIN_FALSE}"; then + as_fn_error $? "conditional \"HAVELIBGARMIN\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BINDING_PYTHON_TRUE}" && test -z "${BINDING_PYTHON_FALSE}"; then + as_fn_error $? "conditional \"BINDING_PYTHON\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BINDING_DBUS_TRUE}" && test -z "${BINDING_DBUS_FALSE}"; then + as_fn_error $? "conditional \"BINDING_DBUS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${VEHICLE_GPSD_DBUS_TRUE}" && test -z "${VEHICLE_GPSD_DBUS_FALSE}"; then + as_fn_error $? "conditional \"VEHICLE_GPSD_DBUS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SPEECH_DBUS_TRUE}" && test -z "${SPEECH_DBUS_FALSE}"; then + as_fn_error $? "conditional \"SPEECH_DBUS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BINDING_WIN32_TRUE}" && test -z "${BINDING_WIN32_FALSE}"; then + as_fn_error $? "conditional \"BINDING_WIN32\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_SVG2PNG_SCALES_TRUE}" && test -z "${USE_SVG2PNG_SCALES_FALSE}"; then + as_fn_error $? "conditional \"USE_SVG2PNG_SCALES\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_SVG2PNG_SCALES_FLAG_TRUE}" && test -z "${USE_SVG2PNG_SCALES_FLAG_FALSE}"; then + as_fn_error $? "conditional \"USE_SVG2PNG_SCALES_FLAG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_SVG2PNG_SCALES_NAV_TRUE}" && test -z "${USE_SVG2PNG_SCALES_NAV_FALSE}"; then + as_fn_error $? "conditional \"USE_SVG2PNG_SCALES_NAV\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_SVG2PNG_TRUE}" && test -z "${USE_SVG2PNG_FALSE}"; then + as_fn_error $? "conditional \"USE_SVG2PNG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_SVG_TRUE}" && test -z "${USE_SVG_FALSE}"; then + as_fn_error $? "conditional \"USE_SVG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ENABLE_NLS_TRUE}" && test -z "${ENABLE_NLS_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_NLS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${XGETTEXT_GLADE_TRUE}" && test -z "${XGETTEXT_GLADE_FALSE}"; then + as_fn_error $? "conditional \"XGETTEXT_GLADE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SUPPORT_WORDEXP_TRUE}" && test -z "${SUPPORT_WORDEXP_FALSE}"; then + as_fn_error $? "conditional \"SUPPORT_WORDEXP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SUPPORT_LIBC_TRUE}" && test -z "${SUPPORT_LIBC_FALSE}"; then + as_fn_error $? "conditional \"SUPPORT_LIBC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GRAPHICS_TRUE}" && test -z "${GRAPHICS_FALSE}"; then + as_fn_error $? "conditional \"GRAPHICS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GRAPHICS_ANDROID_TRUE}" && test -z "${GRAPHICS_ANDROID_FALSE}"; then + as_fn_error $? "conditional \"GRAPHICS_ANDROID\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GRAPHICS_GD_TRUE}" && test -z "${GRAPHICS_GD_FALSE}"; then + as_fn_error $? "conditional \"GRAPHICS_GD\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GRAPHICS_GTK_DRAWING_AREA_TRUE}" && test -z "${GRAPHICS_GTK_DRAWING_AREA_FALSE}"; then + as_fn_error $? "conditional \"GRAPHICS_GTK_DRAWING_AREA\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GRAPHICS_NULL_TRUE}" && test -z "${GRAPHICS_NULL_FALSE}"; then + as_fn_error $? "conditional \"GRAPHICS_NULL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GRAPHICS_WIN32_TRUE}" && test -z "${GRAPHICS_WIN32_FALSE}"; then + as_fn_error $? "conditional \"GRAPHICS_WIN32\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GRAPHICS_QT_QPAINTER_TRUE}" && test -z "${GRAPHICS_QT_QPAINTER_FALSE}"; then + as_fn_error $? "conditional \"GRAPHICS_QT_QPAINTER\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MAP_BINFILE_TRUE}" && test -z "${MAP_BINFILE_FALSE}"; then + as_fn_error $? "conditional \"MAP_BINFILE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MAP_FILTER_TRUE}" && test -z "${MAP_FILTER_FALSE}"; then + as_fn_error $? "conditional \"MAP_FILTER\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MAP_MG_TRUE}" && test -z "${MAP_MG_FALSE}"; then + as_fn_error $? "conditional \"MAP_MG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MAP_SHAPEFILE_TRUE}" && test -z "${MAP_SHAPEFILE_FALSE}"; then + as_fn_error $? "conditional \"MAP_SHAPEFILE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MAP_TEXTFILE_TRUE}" && test -z "${MAP_TEXTFILE_FALSE}"; then + as_fn_error $? "conditional \"MAP_TEXTFILE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MAP_CSV_TRUE}" && test -z "${MAP_CSV_FALSE}"; then + as_fn_error $? "conditional \"MAP_CSV\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${OSD_CORE_TRUE}" && test -z "${OSD_CORE_FALSE}"; then + as_fn_error $? "conditional \"OSD_CORE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GUI_GTK_TRUE}" && test -z "${GUI_GTK_FALSE}"; then + as_fn_error $? "conditional \"GUI_GTK\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GUI_INTERNAL_TRUE}" && test -z "${GUI_INTERNAL_FALSE}"; then + as_fn_error $? "conditional \"GUI_INTERNAL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GUI_WIN32_TRUE}" && test -z "${GUI_WIN32_FALSE}"; then + as_fn_error $? "conditional \"GUI_WIN32\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GUI_QML_TRUE}" && test -z "${GUI_QML_FALSE}"; then + as_fn_error $? "conditional \"GUI_QML\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${PLUGIN_PEDESTRIAN_TRUE}" && test -z "${PLUGIN_PEDESTRIAN_FALSE}"; then + as_fn_error $? "conditional \"PLUGIN_PEDESTRIAN\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ROUTING_TRUE}" && test -z "${ROUTING_FALSE}"; then + as_fn_error $? "conditional \"ROUTING\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SPEECH_ANDROID_TRUE}" && test -z "${SPEECH_ANDROID_FALSE}"; then + as_fn_error $? "conditional \"SPEECH_ANDROID\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SPEECH_CMDLINE_TRUE}" && test -z "${SPEECH_CMDLINE_FALSE}"; then + as_fn_error $? "conditional \"SPEECH_CMDLINE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SPEECH_ESPEAK_TRUE}" && test -z "${SPEECH_ESPEAK_FALSE}"; then + as_fn_error $? "conditional \"SPEECH_ESPEAK\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SPEECH_SPEECH_DISPATCHER_TRUE}" && test -z "${SPEECH_SPEECH_DISPATCHER_FALSE}"; then + as_fn_error $? "conditional \"SPEECH_SPEECH_DISPATCHER\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SUPPORT_ESPEAK_TRUE}" && test -z "${SUPPORT_ESPEAK_FALSE}"; then + as_fn_error $? "conditional \"SUPPORT_ESPEAK\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${VEHICLE_ANDROID_TRUE}" && test -z "${VEHICLE_ANDROID_FALSE}"; then + as_fn_error $? "conditional \"VEHICLE_ANDROID\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${VEHICLE_DEMO_TRUE}" && test -z "${VEHICLE_DEMO_FALSE}"; then + as_fn_error $? "conditional \"VEHICLE_DEMO\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${VEHICLE_FILE_TRUE}" && test -z "${VEHICLE_FILE_FALSE}"; then + as_fn_error $? "conditional \"VEHICLE_FILE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${VEHICLE_GPSD_TRUE}" && test -z "${VEHICLE_GPSD_FALSE}"; then + as_fn_error $? "conditional \"VEHICLE_GPSD\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${VEHICLE_GYPSY_TRUE}" && test -z "${VEHICLE_GYPSY_FALSE}"; then + as_fn_error $? "conditional \"VEHICLE_GYPSY\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${VEHICLE_MAEMO_TRUE}" && test -z "${VEHICLE_MAEMO_FALSE}"; then + as_fn_error $? "conditional \"VEHICLE_MAEMO\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${VEHICLE_NULL_TRUE}" && test -z "${VEHICLE_NULL_FALSE}"; then + as_fn_error $? "conditional \"VEHICLE_NULL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${VEHICLE_WINCE_TRUE}" && test -z "${VEHICLE_WINCE_FALSE}"; then + as_fn_error $? "conditional \"VEHICLE_WINCE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${VEHICLE_IPHONE_TRUE}" && test -z "${VEHICLE_IPHONE_FALSE}"; then + as_fn_error $? "conditional \"VEHICLE_IPHONE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${VEHICLE_WEBOS_TRUE}" && test -z "${VEHICLE_WEBOS_FALSE}"; then + as_fn_error $? "conditional \"VEHICLE_WEBOS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by navit $as_me 0.5.0, which was +generated by GNU Autoconf 2.68. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +navit config.status 0.5.0 +configured by $0, generated by GNU Autoconf 2.68, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`' +enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' +macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`' +macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`' +pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`' +host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`' +host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`' +host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`' +build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`' +build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`' +build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`' +SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`' +Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`' +GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`' +EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`' +FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`' +LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`' +NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`' +LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`' +ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`' +exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`' +lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`' +reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`' +AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`' +STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`' +RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' +CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`' +compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`' +GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' +objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`' +SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`' +ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`' +need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`' +LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`' +OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`' +libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' +module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`' +fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' +need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`' +version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`' +runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`' +libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`' +soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`' +finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`' +old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`' +striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "X$compiler_lib_search_dirs" | $Xsed -e "$delay_single_quote_subst"`' +predep_objects='`$ECHO "X$predep_objects" | $Xsed -e "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "X$postdep_objects" | $Xsed -e "$delay_single_quote_subst"`' +predeps='`$ECHO "X$predeps" | $Xsed -e "$delay_single_quote_subst"`' +postdeps='`$ECHO "X$postdeps" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "X$compiler_lib_search_path" | $Xsed -e "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "X$LD_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "X$old_archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "X$compiler_CXX" | $Xsed -e "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "X$GCC_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "X$lt_prog_compiler_no_builtin_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "X$lt_prog_compiler_wl_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "X$lt_prog_compiler_pic_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "X$lt_prog_compiler_static_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "X$lt_cv_prog_compiler_c_o_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "X$archive_cmds_need_lc_CXX" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "X$enable_shared_with_static_runtimes_CXX" | $Xsed -e "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "X$export_dynamic_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "X$whole_archive_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "X$compiler_needs_object_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "X$old_archive_from_new_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "X$old_archive_from_expsyms_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "X$archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "X$archive_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "X$module_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "X$module_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "X$with_gnu_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "X$allow_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "X$no_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "X$hardcode_libdir_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld_CXX='`$ECHO "X$hardcode_libdir_flag_spec_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "X$hardcode_libdir_separator_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "X$hardcode_direct_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "X$hardcode_direct_absolute_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "X$hardcode_minus_L_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "X$hardcode_shlibpath_var_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "X$hardcode_automatic_CXX" | $Xsed -e "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "X$inherit_rpath_CXX" | $Xsed -e "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "X$link_all_deplibs_CXX" | $Xsed -e "$delay_single_quote_subst"`' +fix_srcfile_path_CXX='`$ECHO "X$fix_srcfile_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "X$always_export_symbols_CXX" | $Xsed -e "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "X$export_symbols_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "X$exclude_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "X$include_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "X$prelink_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "X$file_list_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "X$hardcode_action_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "X$compiler_lib_search_dirs_CXX" | $Xsed -e "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "X$predep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "X$postdep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "X$predeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "X$postdeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "X$compiler_lib_search_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# Quote evaled strings. +for var in SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +AR \ +AR_FLAGS \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +SHELL \ +ECHO \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_wl \ +lt_prog_compiler_pic \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_flag_spec_ld \ +hardcode_libdir_separator \ +fix_srcfile_path \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_flag_spec_ld_CXX \ +hardcode_libdir_separator_CXX \ +fix_srcfile_path_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX; do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Fix-up fallback echo if it was mangled by the above quoting rules. +case \$lt_ECHO in +*'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\` + ;; +esac + +ac_aux_dir='$ac_aux_dir' +xsi_shell='$xsi_shell' +lt_shell_append='$lt_shell_append' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile' + + + + + +# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it + # from automake. + eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "navit/Makefile") CONFIG_FILES="$CONFIG_FILES navit/Makefile" ;; + "navit/autoload/Makefile") CONFIG_FILES="$CONFIG_FILES navit/autoload/Makefile" ;; + "navit/autoload/osso/Makefile") CONFIG_FILES="$CONFIG_FILES navit/autoload/osso/Makefile" ;; + "navit/binding/Makefile") CONFIG_FILES="$CONFIG_FILES navit/binding/Makefile" ;; + "navit/binding/python/Makefile") CONFIG_FILES="$CONFIG_FILES navit/binding/python/Makefile" ;; + "navit/binding/dbus/Makefile") CONFIG_FILES="$CONFIG_FILES navit/binding/dbus/Makefile" ;; + "navit/binding/win32/Makefile") CONFIG_FILES="$CONFIG_FILES navit/binding/win32/Makefile" ;; + "navit/map/Makefile") CONFIG_FILES="$CONFIG_FILES navit/map/Makefile" ;; + "navit/map/mg/Makefile") CONFIG_FILES="$CONFIG_FILES navit/map/mg/Makefile" ;; + "navit/map/textfile/Makefile") CONFIG_FILES="$CONFIG_FILES navit/map/textfile/Makefile" ;; + "navit/map/csv/Makefile") CONFIG_FILES="$CONFIG_FILES navit/map/csv/Makefile" ;; + "navit/map/shapefile/Makefile") CONFIG_FILES="$CONFIG_FILES navit/map/shapefile/Makefile" ;; + "navit/map/filter/Makefile") CONFIG_FILES="$CONFIG_FILES navit/map/filter/Makefile" ;; + "navit/map/binfile/Makefile") CONFIG_FILES="$CONFIG_FILES navit/map/binfile/Makefile" ;; + "navit/map/garmin/Makefile") CONFIG_FILES="$CONFIG_FILES navit/map/garmin/Makefile" ;; + "navit/maptool/Makefile") CONFIG_FILES="$CONFIG_FILES navit/maptool/Makefile" ;; + "navit/fib-1.1/Makefile") CONFIG_FILES="$CONFIG_FILES navit/fib-1.1/Makefile" ;; + "navit/font/Makefile") CONFIG_FILES="$CONFIG_FILES navit/font/Makefile" ;; + "navit/font/freetype/Makefile") CONFIG_FILES="$CONFIG_FILES navit/font/freetype/Makefile" ;; + "navit/fonts/Makefile") CONFIG_FILES="$CONFIG_FILES navit/fonts/Makefile" ;; + "navit/graphics/Makefile") CONFIG_FILES="$CONFIG_FILES navit/graphics/Makefile" ;; + "navit/graphics/android/Makefile") CONFIG_FILES="$CONFIG_FILES navit/graphics/android/Makefile" ;; + "navit/graphics/gd/Makefile") CONFIG_FILES="$CONFIG_FILES navit/graphics/gd/Makefile" ;; + "navit/graphics/gtk_drawing_area/Makefile") CONFIG_FILES="$CONFIG_FILES navit/graphics/gtk_drawing_area/Makefile" ;; + "navit/graphics/opengl/Makefile") CONFIG_FILES="$CONFIG_FILES navit/graphics/opengl/Makefile" ;; + "navit/graphics/null/Makefile") CONFIG_FILES="$CONFIG_FILES navit/graphics/null/Makefile" ;; + "navit/graphics/sdl/Makefile") CONFIG_FILES="$CONFIG_FILES navit/graphics/sdl/Makefile" ;; + "navit/graphics/qt_qpainter/Makefile") CONFIG_FILES="$CONFIG_FILES navit/graphics/qt_qpainter/Makefile" ;; + "navit/graphics/win32/Makefile") CONFIG_FILES="$CONFIG_FILES navit/graphics/win32/Makefile" ;; + "navit/gui/Makefile") CONFIG_FILES="$CONFIG_FILES navit/gui/Makefile" ;; + "navit/gui/gtk/Makefile") CONFIG_FILES="$CONFIG_FILES navit/gui/gtk/Makefile" ;; + "navit/gui/internal/Makefile") CONFIG_FILES="$CONFIG_FILES navit/gui/internal/Makefile" ;; + "navit/gui/win32/Makefile") CONFIG_FILES="$CONFIG_FILES navit/gui/win32/Makefile" ;; + "navit/gui/qml/Makefile") CONFIG_FILES="$CONFIG_FILES navit/gui/qml/Makefile" ;; + "navit/gui/qml/skins/Makefile") CONFIG_FILES="$CONFIG_FILES navit/gui/qml/skins/Makefile" ;; + "navit/gui/qml/skins/navit/Makefile") CONFIG_FILES="$CONFIG_FILES navit/gui/qml/skins/navit/Makefile" ;; + "navit/osd/Makefile") CONFIG_FILES="$CONFIG_FILES navit/osd/Makefile" ;; + "navit/osd/core/Makefile") CONFIG_FILES="$CONFIG_FILES navit/osd/core/Makefile" ;; + "navit/plugin/Makefile") CONFIG_FILES="$CONFIG_FILES navit/plugin/Makefile" ;; + "navit/plugin/pedestrian/Makefile") CONFIG_FILES="$CONFIG_FILES navit/plugin/pedestrian/Makefile" ;; + "navit/speech/Makefile") CONFIG_FILES="$CONFIG_FILES navit/speech/Makefile" ;; + "navit/speech/android/Makefile") CONFIG_FILES="$CONFIG_FILES navit/speech/android/Makefile" ;; + "navit/speech/cmdline/Makefile") CONFIG_FILES="$CONFIG_FILES navit/speech/cmdline/Makefile" ;; + "navit/speech/dbus/Makefile") CONFIG_FILES="$CONFIG_FILES navit/speech/dbus/Makefile" ;; + "navit/speech/espeak/Makefile") CONFIG_FILES="$CONFIG_FILES navit/speech/espeak/Makefile" ;; + "navit/speech/speech_dispatcher/Makefile") CONFIG_FILES="$CONFIG_FILES navit/speech/speech_dispatcher/Makefile" ;; + "navit/support/Makefile") CONFIG_FILES="$CONFIG_FILES navit/support/Makefile" ;; + "navit/support/espeak/Makefile") CONFIG_FILES="$CONFIG_FILES navit/support/espeak/Makefile" ;; + "navit/support/ezxml/Makefile") CONFIG_FILES="$CONFIG_FILES navit/support/ezxml/Makefile" ;; + "navit/support/glib/Makefile") CONFIG_FILES="$CONFIG_FILES navit/support/glib/Makefile" ;; + "navit/support/libc/Makefile") CONFIG_FILES="$CONFIG_FILES navit/support/libc/Makefile" ;; + "navit/support/libpng/Makefile") CONFIG_FILES="$CONFIG_FILES navit/support/libpng/Makefile" ;; + "navit/support/shapefile/Makefile") CONFIG_FILES="$CONFIG_FILES navit/support/shapefile/Makefile" ;; + "navit/support/win32/Makefile") CONFIG_FILES="$CONFIG_FILES navit/support/win32/Makefile" ;; + "navit/support/wordexp/Makefile") CONFIG_FILES="$CONFIG_FILES navit/support/wordexp/Makefile" ;; + "navit/support/zlib/Makefile") CONFIG_FILES="$CONFIG_FILES navit/support/zlib/Makefile" ;; + "navit/vehicle/Makefile") CONFIG_FILES="$CONFIG_FILES navit/vehicle/Makefile" ;; + "navit/vehicle/android/Makefile") CONFIG_FILES="$CONFIG_FILES navit/vehicle/android/Makefile" ;; + "navit/vehicle/file/Makefile") CONFIG_FILES="$CONFIG_FILES navit/vehicle/file/Makefile" ;; + "navit/vehicle/gpsd/Makefile") CONFIG_FILES="$CONFIG_FILES navit/vehicle/gpsd/Makefile" ;; + "navit/vehicle/gpsd_dbus/Makefile") CONFIG_FILES="$CONFIG_FILES navit/vehicle/gpsd_dbus/Makefile" ;; + "navit/vehicle/gypsy/Makefile") CONFIG_FILES="$CONFIG_FILES navit/vehicle/gypsy/Makefile" ;; + "navit/vehicle/maemo/Makefile") CONFIG_FILES="$CONFIG_FILES navit/vehicle/maemo/Makefile" ;; + "navit/vehicle/null/Makefile") CONFIG_FILES="$CONFIG_FILES navit/vehicle/null/Makefile" ;; + "navit/vehicle/demo/Makefile") CONFIG_FILES="$CONFIG_FILES navit/vehicle/demo/Makefile" ;; + "navit/vehicle/wince/Makefile") CONFIG_FILES="$CONFIG_FILES navit/vehicle/wince/Makefile" ;; + "navit/vehicle/iphone/Makefile") CONFIG_FILES="$CONFIG_FILES navit/vehicle/iphone/Makefile" ;; + "navit/vehicle/webos/Makefile") CONFIG_FILES="$CONFIG_FILES navit/vehicle/webos/Makefile" ;; + "navit/xpm/Makefile") CONFIG_FILES="$CONFIG_FILES navit/xpm/Makefile" ;; + "navit/maps/Makefile") CONFIG_FILES="$CONFIG_FILES navit/maps/Makefile" ;; + "intl/Makefile") CONFIG_FILES="$CONFIG_FILES intl/Makefile" ;; + "po/Makefile") CONFIG_FILES="$CONFIG_FILES po/Makefile" ;; + "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool 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; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="CXX " + +# ### BEGIN LIBTOOL CONFIG + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that does not interpret backslashes. +ECHO=$lt_ECHO + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + case $xsi_shell in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +func_stripname () +{ + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"} +} + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=${1%%=*} + func_opt_split_arg=${1#*=} +} + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=${1%.*}.lo +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=$(( $* )) +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=${#1} +} + +_LT_EOF + ;; + *) # Bourne compatible functions. + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; + esac +} + +# sed scripts: +my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q' +my_sed_long_arg='1s/^-[^=]*=//' + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` + func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +} + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'` +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "$@"` +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` +} + +_LT_EOF +esac + +case $lt_shell_append in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$1+=\$2" +} +_LT_EOF + ;; + *) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$1=\$$1\$2" +} + +_LT_EOF + ;; + esac + + + sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + "default-1":C) + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + POMAKEFILEDEPS="POTFILES.in" + # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$OBSOLETE_ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" + else + # The set of available languages was given in configure.in. + eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' + fi + # Compute POFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) + # Compute UPDATEPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) + # Compute DUMMYPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) + # Compute GMOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + UPDATEPOFILES= + DUMMYPOFILES= + GMOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + + +echo "" +echo "" +echo "Summary of your installation :" +# FIXME : maybe elaborate missing dependencies +if test x"$graphics_sdl" != xyes + then + sdl_failures="(libsdl maybe?) " +fi +if test x"$glut" != xyes + then + sdl_failures=$sdl_failures"glut " +fi +if test x"$glc" != xyes + then + sdl_failures=$sdl_failures"quesoglc " +fi +if test -z "$sdl_failures" + then + echo "OpenGL gui : ENABLED, with $CEGUI_LIBS" + else + echo "OpenGL gui : DISABLED : you are missing $sdl_failures" +fi +if test x"$enable_hildon" = xyes + then + echo "Maemo/Hildon: ENABLED" + else + echo "Maemo/Hildon: DISABLED" +fi +if test x"$enable_osso" = xyes + then + echo "Maemo/OSSO: ENABLED" + else + echo "Maemo/OSSO: DISABLED" +fi +if test x"${USE_GARMIN}" = xyes + then + if test "x$use_libgarmin" = "xyes" + then + echo "Garmin IMG : ENABLED" + else + echo "Garmin IMG : DISABLED (you don't have libgarmin)" + fi + else + echo "Garmin IMG : DISABLED (you requested it)" +fi + +if test x"$LIBINTL" = "x" ;then + nls_libs="system gettext support" +else + nls_libs="$LIBINTL" +fi +echo "Plugins: $plugins ($plugins_reason)" +echo "Postgresql: $postgresql ($postgresql_reason)" +echo "Samplemap: $samplemap ($samplemap_reason)" +echo "NLS Support: $enable_nls ($nls_libs)" +echo "Routing: $routing ($routing_reason)" +echo "Font renderers:" +echo " freetype: $font_freetype ($font_freetype_reason)" +echo " FriBidi enabled: $fribidi ($fribidi_reason)" + +echo "Graphics types: $graphics ($graphics_reason)" +echo " android: $graphics_android ($graphics_android_reason)" +echo " gtk_drawing_area: $graphics_gtk_drawing_area ($graphics_gtk_drawing_area_reason)" +echo " null: $graphics_null ($graphics_null_reason)" +echo " qt_qpainter: $graphics_qt_qpainter ($graphics_qt_qpainter_reason)" +echo " win32: $graphics_win32 ($graphics_win32_reason)" +echo " OpenGL: $graphics_opengl ($graphics_opengl_reason)" +echo " gd: $graphics_gd ($graphics_gd_reason)" +echo " sdl: $graphics_sdl ($graphics_sdl_reason)" + +echo "GUI types:" +echo " gtk: $gui_gtk ($gui_gtk_reason)" +echo " internal: $gui_internal ($gui_internal_reason)" +echo " win32: $gui_win32 ($gui_win32_reason)" +echo " qml: $gui_qml ($gui_qml_reason)" + +echo "Map types:" +echo " binfile: $map_binfile ($map_binfile_reason)" +echo " filter: $map_filter ($map_filter_reason)" +echo " mg: $map_mg ($map_mg_reason)" +echo " shapefile: $map_shapefile ($map_shapefile_reason)" +echo " textfile: $map_textfile ($map_textfile_reason)" +echo " csv: $map_csv ($map_csv_reason)" + + +echo "Bindings:" +echo " dbus: $binding_dbus ($binding_dbus_reason)" +echo " python: $binding_python ($binding_python_reason)" + +echo "OSD types:" +echo " core: $osd_core ($osd_core_reason)" + +echo "Plugins:" +echo " pedestrian: $plugin_pedestrian ($plugin_pedestrian_reason)" + +echo "Speech types:" +echo " android: $speech_android ($speech_android_reason)" +echo " cmdline: $speech_cmdline ($speech_cmdline_reason)" +echo " dbus: $speech_dbus ($speech_dbus_reason)" +echo " espeak: $speech_espeak ($speech_espeak_reason)" +echo " speech_dispatcher: $speech_speech_dispatcher ($speech_speech_dispatcher_reason)" + +echo "Vehicle types:" +echo " android: $vehicle_android ($vehicle_android_reason)" +echo " demo: $vehicle_demo ($vehicle_demo_reason)" +echo " file: $vehicle_file ($vehicle_file_reason)" +echo " gpsd: $vehicle_gpsd ($vehicle_gpsd_reason)" +echo " gpsd_dbus: $vehicle_gpsd_dbus ($vehicle_gpsd_dbus_reason)" +echo " gypsy: $vehicle_gypsy ($vehicle_gypsy_reason)" +echo " maemo: $vehicle_maemo ($vehicle_maemo_reason)" +echo " null: $vehicle_null ($vehicle_null_reason)" +echo " wince: $vehicle_wince ($vehicle_wince_reason)" +echo " iphone: $vehicle_iphone ($vehicle_iphone_reason)" +echo " webos: $vehicle_webos ($vehicle_webos_reason)" + +if test "x${gtk2_pkgconfig}" != "xyes" -a "x${gui_win32}" != "xyes" -a "x${gui_internal}" != "xyes" -a "x${gui_qml}" != "xyes" +then + echo "" + echo "" + echo "*** WARNING! you have no gui that can be built! ***" + echo "Please install the dependency for at least gtk or sdl gui" + echo "For more details, see the wiki at http://wiki.navit-project.org/" + echo "" +fi + diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..8ddc83c --- /dev/null +++ b/configure.in @@ -0,0 +1,1337 @@ +AC_INIT(navit, 0.5.0) +AC_CONFIG_MACRO_DIR([m4]) +SOURCE_MODE=svn + +AM_INIT_AUTOMAKE +AM_CONFIG_HEADER(config.h) + +AC_SUBST(SOURCE_MODE) +AM_CONDITIONAL(SOURCE_MODE_SVN, [test "x${SOURCE_MODE}" = "xsvn"]) + +if test "x${SOURCE_MODE}" = "xsvn" ; then + USE_MAINTAINER_MODE=yes +else + USE_MAINTAINER_MODE=no +fi + +AC_DEFUN([AM_MAINTAINER_MODE], +[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode is enabled by default (reason of inclusion of this function) + AC_ARG_ENABLE(maintainer-mode, +[ --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer], + USE_MAINTAINER_MODE=$enableval) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST(MAINT)dnl +] +) + +AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) + +AM_MAINTAINER_MODE + + +plugins=yes; plugins_reason=default +postgresql=yes; postgresql_reason=default +samplemap=yes; samplemap_reason=default +binding_dbus=yes; binding_dbus_reason=default +binding_dbus_use_system_bus=no +binding_python=yes; binding_python_reason=default +binding_win32=no; binding_win32_reason=default +font_freetype=yes; font_freetype_reason=default +fontconfig=yes; fontconfig_reason=default +fribidi=yes; fribidi_reason=default +gui_gtk=no; gui_gtk_reason=default +gui_win32=no; gui_win32_reason=default +gui_internal=yes; gui_internal_reason=default +gui_qml=no; gui_qml_reason=default +graphics=yes; graphics_reason=default +graphics_gd=no; graphics_gd_reason=default +graphics_gtk_drawing_area=no; graphics_gtk_drawing_area_reason=default +graphics_qt_qpainter=yes; graphics_qt_qpainter_reason=default +graphics_null=yes; graphics_null_reason=default +graphics_opengl=yes; graphics_opengl_reason=default +graphics_sdl=yes; graphics_sdl_reason=default +graphics_win32=no; graphics_win32_reason=default +maptool=yes; maptool_reason=default +map_binfile=yes; map_binfile_reason=default +map_filter=yes; map_filter_reason=default +map_mg=yes; map_mg_reason=default +map_shapefile=yes; map_shapefile_reason=default +map_textfile=yes; map_textfile_reason=default +map_csv=yes; map_csv_reason=default +osd_core=yes; osd_core_reason=default +plugin_pedestrian=no; plugin_pedestrian_reason=default +routing=yes; routing_reason=default +speech_android=no; speech_android_reason=default +speech_cmdline=yes; speech_cmdline_reason=default +speech_dbus=no; speech_dbus_reason=default +speech_espeak=no; speech_espeak_reason=default +speech_speech_dispatcher=yes; speech_speech_dispatcher_reason=default +vehicle_demo=yes; vehicle_demo_reason=default +vehicle_file=yes; vehicle_file_reason=default +vehicle_gpsd=yes; vehicle_gpsd_reason=default +vehicle_gpsd_dbus=no; vehicle_gpsd_dbus_reason=default +vehicle_gypsy=yes; vehicle_gypsy_reason=default +vehicle_null=no; vehicle_null_reason=default +vehicle_wince=no; vehicle_wince_reason=default +vehicle_iphone=no; vehicle_iphone_reason=default +vehicle_android=no; vehicle_android_reason=default +graphics_android=no; graphics_android_reason=default +vehicle_maemo=no; vehicle_maemo_reason=default +vehicle_webos=no; vehicle_webos_reason=default + +shared_libnavit=no +LIBNAVIT=navit +bin_navit=yes + +AC_CANONICAL_HOST +win32=no +win32ce=no +case $host_os in +wince|mingw32ce|cegcc) + win32=yes + win32ce=yes + AC_DEFINE(HAVE_API_WIN32_BASE, 1, [Have Windows Base API]) + AC_DEFINE(HAVE_API_WIN32_CE, 1, [Have Windows CE API]) + AC_DEFINE(HAVE_PRAGMA_PACK, 1, [Have pragma pack]) + binding_win32=yes; binding_win32_reason="host_os is wince" + gui_win32=yes; gui_win32_reason="host_os is wince" + graphics_win32=yes; graphics_win32_reason="host_os is wince" + vehicle_wince=yes; vehcile_wince_reason="host_os is wince" + speech_espeak=yes; speech_espeak_reason="host_os is wince" + support_libpng=yes + maptool=no; maptool_reason="host_os is wince" + ;; +mingw32) + win32=yes + AC_DEFINE(HAVE_API_WIN32_BASE, 1, [Have Windows Base API]) + AC_DEFINE(HAVE_API_WIN32, 1, [Have Windows API]) + binding_win32=yes; binding_win32_reason="host_os is mingw32" + gui_win32=yes; gui_win32_reason="host_os is mingw32" + graphics_win32=yes; graphics_win32_reason="host_os is mingw32" + speech_espeak=yes; speech_espeak_reason="host_os is mingw32" + support_libpng=yes + ;; +linux*_android) + android=yes + shared_libnavit=yes + bin_navit=no + AC_DEFINE(HAVE_API_ANDROID, 1, [Have Android API]) + echo "void dl_unwind_find_exidx(void) {}" >crt0.c + $CC -c crt0.c + $AR r libg.a crt0.o + vehicle_android=yes; vehicle_android_reason="host_os is android" + graphics_android=yes; graphics_android_reason="host_os is android" + speech_android=yes; speech_android_reason="host_os is android" + MODULE_LDFLAGS="-module -Xcompiler -nostdlib -Xcompiler -Wl,-rpath -Xcompiler -Wl,/data/data/org.navitproject.navit/lib" + MODULE_LIBADD="-llog" + LIBNAVIT=_data_data_org.navitproject.navit_lib_navit + NAVIT_MODULE_LDFLAGS="$MODULE_LDFLAGS -L\$(top_builddir)/navit -l$LIBNAVIT" + ;; +esac +if test "x$win32" = "xyes" +then + NAVIT_CFLAGS="$NAVIT_CFLAGS -I\$(top_srcdir)/navit/support/win32" + NAVIT_LIBS="$NAVIT_LIBS -L\$(top_builddir)/navit/support/win32 -lsupport_win32" + NAVIT_SOCKET_LDFLAGS="$MODULE_LDFLAGS -lws2_32" +fi + + +AM_CONDITIONAL(SUPPORT_WIN32, [test "x$win32" = "xyes"]) +AM_CONDITIONAL(SUPPORT_WIN32CE, [test "x$win32ce" = "xyes"]) +AM_CONDITIONAL(SUPPORT_ANDROID, [test "x$android" = "xyes"]) + +if test "x$support_libpng" = "xyes" +then + NAVIT_CFLAGS="$NAVIT_CFLAGS -I\$(top_srcdir)/navit/support/libpng" + NAVIT_LIBS="$NAVIT_LIBS -L\$(top_builddir)/navit/support/libpng -lsupport_libpng" +fi +AM_CONDITIONAL(SUPPORT_LIBPNG, [test "x$support_libpng" = "xyes"]) + +AC_SUBST(MODULE_LDFLAGS) +AC_SUBST(MODULE_LIBADD) +AC_SUBST(NAVIT_MODULE_LDFLAGS) +AC_SUBST(NAVIT_SOCKET_LDFLAGS) + +LIBS="$LIBS -lm" +if test "$win32" == "no" -a test "$host_os" != "cygwin"; then + LIBS="$LIBS -rdynamic" +fi + +m4_ifndef([AC_USE_SYSTEM_EXTENSIONS], + [AC_DEFUN([AC_USE_SYSTEM_EXTENSIONS], [AC_GNU_SOURCE])]) + +AC_USE_SYSTEM_EXTENSIONS + +m4_ifdef([AC_PROG_OBJC],[AC_PROG_OBJC]) +AC_PROG_CC +m4_ifdef([AC_PROG_OBJC],[AC_PROG_OBJC],[AC_SUBST([OBJC],["$CC"]) +AC_SUBST([OBJCFLAGS],["$CFLAGS"])]) +m4_ifndef([AC_PROG_OBJC],[_AM_DEPENDENCIES(OBJC)]) + +if eval "test x`uname` = xDarwin"; then + CFLAGS="$CFLAGS -I/opt/local/include -L/opt/local/lib" +fi +if eval "test x$GCC = xyes"; then + CFLAGS="$CFLAGS -Wall -Wcast-align -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wpointer-arith -Wreturn-type -D_GNU_SOURCE" +fi +AM_PROG_CC_C_O + +AC_PROG_CXX +if eval "test x$GXX = xyes"; then + CXXFLAGS="$CXXFLAGS -Wall -Wcast-align -Wpointer-arith -Wreturn-type -D_GNU_SOURCE" +fi + +PKG_CHECK_EXISTS +if test "x${cross_compiling}" = "xyes"; then + samplemap="no";samplemap_reason="not supported for cross compiling" + binding_python="no";binding_python_reason="not supported for cross compiling" + postgresql="no";postgresql_reason="not supported for cross compiling" + AC_MSG_CHECKING([for a C compiler for build tools]) + AC_CHECK_PROGS(CC_FOR_BUILD, gcc cc) +else + CC_FOR_BUILD=$CC +fi +CCLD_FOR_BUILD="$CC_FOR_BUILD" +AC_SUBST(cross_compiling) +AM_CONDITIONAL(CROSS_COMPILING, test "x${cross_compiling}" = "xyes") +AC_SUBST(CC_FOR_BUILD) +AC_SUBST(CCLD_FOR_BUILD) + +# Endianness +# defines WORDS_BIGENDIAN for big-endian systems +AC_C_BIGENDIAN + +AC_ARG_ENABLE(variant, [ --enable-variant=something set variant], NAVIT_VARIANT=$enableval) +AC_SUBST(NAVIT_VARIANT) + +AC_ARG_ENABLE(cache-size, [ --enable-cache-size=size in bytes set cache size], AC_DEFINE_UNQUOTED(CACHE_SIZE,[${enableval}], [Size of Cache in Bytes])) + +AC_ARG_ENABLE(avoid-unaligned, [ --enable-avoid-unaligned avoid unaligned accesses], AVOID_UNALIGNED=$enableval, AVOID_UNALIGNED=no) +test x"${AVOID_UNALIGNED}" = xyes && AC_DEFINE(AVOID_UNALIGNED,[],Define to avoid unaligned access) + +AC_ARG_ENABLE(avoid-float, [ --enable-avoid-float avoid floating point calculations], AVOID_FLOAT=$enableval, AVOID_FLOAT=no) +test x"${AVOID_FLOAT}" = xyes && AC_DEFINE(AVOID_FLOAT,[],Define to avoid floating point) + +AC_ARG_ENABLE(transformation-roll, [ --enable-transformation-roll add support for specifying roll angle in transformation], ENABLE_ROLL=$enableval, ENABLE_ROLL=no) +test x"${ENABLE_ROLL}" = xyes && AC_DEFINE(ENABLE_ROLL,[],Define to add support for specifying roll angle in transformation) + +AC_ARG_ENABLE(hildon, [ --disable-hildon build without maemo/hildon support], enable_hildon=$enableval, enable_hildon=yes) +if test "x${enable_hildon}" = "xyes" ; then + PKG_CHECK_MODULES(HILDON, hildon-1 >= 0.9.9, , [ + AC_MSG_RESULT(no) + enable_hildon=no + ]) + PKG_CHECK_MODULES(GPSBT, gpsbt, [ + AC_DEFINE(HAVE_GPSBT, 1, [Have the gpsbt library]) + AC_SUBST(GPSBT_CFLAGS) + AC_SUBST(GPSBT_LIBS) + ], [ + AC_MSG_RESULT(no) + ]) + if test x"${enable_hildon}" = xyes ; then + AC_DEFINE(USE_HILDON, 1, [Build with maemo/hildon support]) + AC_SUBST(HILDON_CFLAGS) + AC_SUBST(HILDON_LIBS) + fi +fi +AM_CONDITIONAL(USE_HILDON, test "${enable_hildon}" = "xyes") + +AC_ARG_ENABLE(osso, [ --disable-osso build without maemo/osso support], enable_osso=$enableval, enable_osso=yes) +if test "x${enable_osso}" = "xyes" ; then + PKG_CHECK_MODULES(LIBOSSO, libosso, , [ + AC_MSG_RESULT(no) + enable_osso=no + ]) + if test x"${enable_osso}" = xyes ; then + AC_DEFINE(USE_OSSO, 1, [Build with maemo/osso support]) + AC_SUBST(LIBOSSO_CFLAGS) + AC_SUBST(LIBOSSO_LIBS) + fi +fi +echo ${enable_osso} +AM_CONDITIONAL(USE_OSSO, test "x${enable_osso}" = "xyes") + +AC_ARG_ENABLE(garmin, [ --disable-garmin disable garmin support], USE_GARMIN=$enableval, USE_GARMIN=yes) + +# samplemap +AC_PATH_PROG(_PATH_BZCAT,[bzcat]) +if test "x${_PATH_BZCAT}" = "x" ; then + samplemap=no; samplemap_reason="bzcat missing" +fi +AC_ARG_ENABLE(maptool, [ --disable-maptool don't build maptool], maptool=$enableval;maptool_reason="configure parameter") +AM_CONDITIONAL(MAPTOOL, [test "x$maptool" = "xyes"]) +if test "x$maptool" != "xyes"; then + samplemap=no; samplemap_reason="maptool disabled" +fi +AC_ARG_ENABLE(samplemap, [ --disable-samplemap don't build the samplemap], samplemap=$enableval;samplemap_reason="configure parameter") +AM_CONDITIONAL(BUILD_SAMPLEMAP, [test "x$samplemap" = "xyes"]) + +AC_ARG_ENABLE(fastmath, [ --disable-fastmath don't build with fastmath], fastmath=$enableval, fastmath=yes) +AM_CONDITIONAL(FASTMATH, [test "x$fastmath" = "xyes"]) + +if test x"$fastmath" = xyes; then + if eval "test x$GCC = xyes"; then + CFLAGS="$CFLAGS -ffast-math" + fi +fi + +X_CFLAGS="-I$x_includes" +AS_IF([test -n "$ac_x_libraries"], [X_LIBS="-L$ac_x_libraries"]) + +# glib +AC_ARG_ENABLE(glib, [ --disable-glib don't build with external glib], glib=$enableval, glib=yes) +if test "x${glib}" = "xyes" -a "x${GLIB_CFLAGS}" = "x" -a "x${GLIB_LIBS}" = "x"; then + PKG_CHECK_MODULES(GLIB, [glib-2.0 gthread-2.0], [glib=yes],[glib=no]) +fi +if test "x${glib}" = "xyes"; then + AC_DEFINE(HAVE_GLIB, 1, [Define to 1 if you have (external) glib library]) +else + GLIB_CFLAGS="-I\$(top_srcdir)/navit/support -I\$(top_srcdir)/navit/support/glib -I\$(top_srcdir)/navit/support/ezxml" + GLIB_LIBS="-L\$(top_builddir)/navit/support/glib -lsupport_glib -L\$(top_builddir)/navit/support/ezxml -lsupport_ezxml" + if test "x${win32}" != "xyes" -a "x${android}" != "xyes"; then + GLIB_LIBS="$GLIB_LIBS -lpthread" + fi +fi + +# gmodule +AC_ARG_ENABLE(gmodule, [ --disable-gmodule don't build with gmodule], gmodule=$enableval, gmodule=yes) +if test x"${gmodule}" = "xyes"; then + PKG_CHECK_MODULES(GMODULE, [gmodule-2.0], [gmodule=yes], [gmodule=no]) +fi +if test "x${gmodule}" = "xyes"; then + AC_DEFINE(HAVE_GMODULE, 1, [Define to 1 if you have gmodule]) +else + AC_CHECK_LIB(dl, dlopen, + [plugins_reason="default, via dlopen";GMODULE_LIBS="-ldl";AC_DEFINE(HAVE_DLOPEN, 1, [Define to 1 if you have dlopen])], + [plugins="no"; plugins_reason="package gmodule and dlopen missing"] + ) +fi + +# libcrypto +AC_CHECK_LIB(crypto, AES_encrypt, [CRYPTO_LIBS="-lcrypto";AC_DEFINE(HAVE_LIBCRYPTO, 1, [Define to 1 if you have libcrypto])]) +AC_SUBST(CRYPTO_LIBS) + +# plugins +AC_ARG_ENABLE(plugins, [ --disable-plugins disable plugins], [ plugins=$enableval;plugin_reason="configure parameter" ]) +AC_ARG_ENABLE(shared-libnavit, [ --enable-shared-libnavit], [ shared_libnavit=$enableval]) +if test "x${plugins}" = "xyes"; then + AC_ENABLE_SHARED + AC_DISABLE_STATIC + AC_DEFINE( + [USE_PLUGINS], + [], + Define to 1 if you have plugins. + ) + if test "x${win32}" = "xyes"; then + shared_libnavit=yes + NAVIT_MODULE_LDFLAGS="-no-undefined -L\$(top_builddir)/navit -l$LIBNAVIT -L\$(top_builddir)/intl -lintl" + fi +else + if test "x${shared_libnavit}" = "xyes"; then + AC_ENABLE_SHARED + AC_DISABLE_STATIC + else + AC_DISABLE_SHARED + AC_ENABLE_STATIC + fi +fi +AM_CONDITIONAL(PLUGINS, [test "x$plugins" = "xyes"]) +AM_CONDITIONAL(SHARED_LIBNAVIT, [test "x$shared_libnavit" = "xyes"]) +AM_CONDITIONAL(BIN_NAVIT, [test "x$bin_navit" = "xyes"]) +AC_PROG_LIBTOOL +AC_SUBST(LIBNAVIT) + +AM_CONDITIONAL(EVENT_GLIB, [test "x$glib" = "xyes"]) +AM_CONDITIONAL(SUPPORT_GLIB, [test "x$glib" = "xno"]) +AM_CONDITIONAL(SUPPORT_EZXML, [test "x$glib" = "xno"]) + +AC_CHECK_HEADER([sys/time.h], + [AC_DEFINE( + [HAVE_SYS_TIME_H], + [1], + [Define to 1 if you have the header file.]) + ]) + +if test "x${ZLIB_CFLAGS}" = "x" -a "x${ZLIB_LIBS}" = "x"; then +AC_CHECK_HEADER( + zlib.h, + AC_DEFINE( + [HAVE_ZLIB], + [], + Define to 1 if you have the header file. + ) + ZLIB_LIBS="-lz" + zlib=yes, + ZLIB_CFLAGS="-I\$(top_srcdir)/navit/support/zlib" + ZLIB_LIBS="-L\$(top_builddir)/navit/support/zlib -lsupport_zlib" + zlib=no +) +else + zlib=yes +fi +AM_CONDITIONAL(SUPPORT_ZLIB, [test "x$zlib" = "xno"]) +AC_SUBST(ZLIB_CFLAGS) +AC_SUBST(ZLIB_LIBS) + +AC_CHECK_HEADER(sys/socket.h, AC_DEFINE([HAVE_SOCKET],[],Define to 1 if you have sockets)) +AC_CHECK_HEADER(winsock2.h, AC_DEFINE([HAVE_WINSOCK],[],Define to 1 if you have Windows sockets)) + +# gtk +PKG_CHECK_MODULES(GTK2, [gtk+-2.0], [gtk2_pkgconfig=yes], [gtk2_pkgconfig=no]) +if test "x$gtk2_pkgconfig" = "xyes"; then + AC_DEFINE(HAVE_GTK2, 1, [Define to 1 if you have gtk2]) + graphics_gtk_drawing_area=yes; graphics_gtk_drawing_area_reason="gtk+-2.0 present" + gui_gtk=yes; gui_gtk_reason="gtk+-2.0 present" +fi + +# fsync +AC_MSG_CHECKING(for fsync) +AC_TRY_LINK([#include ], [fsync(0);],AC_MSG_RESULT(yes);AC_DEFINE(HAVE_FSYNC, 1, [Define to 1 if you have the `fsync' function.]),AC_MSG_RESULT(no)) + +# system +AC_MSG_CHECKING(for system) +AC_TRY_LINK([#include ], [system("/bin/true");],AC_MSG_RESULT(yes);AC_DEFINE(HAVE_SYSTEM, 1, [Define to 1 if you have the `system' function.]),speech_cmdline=no; speech_cmdline_reason="not supported without system()"; AC_MSG_RESULT(no)) + +AC_MSG_CHECKING(for CreateProcess) +AC_TRY_LINK([#include ], [CreateProcess(NULL,NULL,NULL,NULL,0,0,NULL,NULL,NULL,NULL);],AC_MSG_RESULT(yes);AC_DEFINE(HAVE_CREATEPROCESS, 1, [Define to 1 if you have the `CreateProcess' function.]) speech_cmdline=yes; speech_cmdline_reason="CreateProcess exists", AC_MSG_RESULT(no)) + +# sbrk +AC_MSG_CHECKING(for sbrk) +AC_TRY_LINK([#include ], [sbrk(0);],AC_MSG_RESULT(yes);AC_DEFINE(HAVE_SBRK, 1, [Define to 1 if you have the `sbrk' function.]),AC_MSG_RESULT(no)) + + +AC_ARG_ENABLE(graphics-sdl, [ --disable-graphics-sdl don't create graphics sdl], graphics_sdl=$enableval;graphics_sdl_reason="configure parameter") + +if test "x${graphics_sdl}" = "xyes" ; then + PKG_CHECK_MODULES(SDL, + [sdl], + [graphics_sdl="yes" + graphics_sdl_reason="sdl present"] , + [graphics_sdl="no" + graphics_sdl_reason="sdl not available"] + ) + AC_SUBST(SDL_CFLAGS) + AC_SUBST(SDL_LIBS) +fi +if test "x${graphics_sdl}" = "xyes" ; then + save_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$SDL_CFLAGS $CPPFLAGS" + AC_CHECK_HEADER(SDL_image.h,SDL_IMAGE_LIBS=-lSDL_image,graphics_sdl="no";graphics_sdl_reason="SDL_image.h missing") + AC_SUBST(SDL_IMAGE_LIBS) + CPPFLAGS=$save_CPPFLAGS +fi +if test "x${graphics_sdl}" = "xyes" ; then + AC_DEFINE(GRAPHICS_SDL, 1, [Build with graphics sdl]) +fi +AM_CONDITIONAL(GRAPHICS_SDL, test "x${graphics_sdl}" = "xyes") + +AC_ARG_ENABLE(postgresql, [ --disable-postgresql don't add postgresql support to maptool], postgresql=$enableval;postgresql_reason="configure parameter") +if test "x${postgresql}" = "xyes" ; then + if test -z "$PG_CONFIG"; then + AC_PATH_PROG([PG_CONFIG], [pg_config], []) + fi + AC_MSG_CHECKING([for PostgreSQL libraries with $PG_CONFIG]) + if test ! -x "$PG_CONFIG"; then + if test "x${PG_CONFIG}" = "x" ; then + postgresql_reason="$PG_CONFIG not executable" + else + postgresql_reason="pg_config missing" + fi + postgresql=no + AC_MSG_RESULT([no]) + else + POSTGRESQL_CFLAGS="-I`$PG_CONFIG --includedir`" + POSTGRESQL_LIBS="-L`$PG_CONFIG --libdir` -lpq" + AC_DEFINE(HAVE_POSTGRESQL, 1, [Postgresql libraries available]) + AC_SUBST(POSTGRESQL_CFLAGS) + AC_SUBST(POSTGRESQL_LIBS) + AC_MSG_RESULT([yes]) + fi +fi +AM_CONDITIONAL(HAVE_POSTGRESQL, test "x${postgresql}" = "xyes") +# font +# freetype +AC_ARG_ENABLE(font-freetype, [ --disable-font-freetype don't add freetype support], font_freetype=$enableval;font_freetype_reason="configure parameter") +if test "x${font_freetype}" = "xyes" -a "x${FREETYPE2_CFLAGS}" = "x" -a "x${FREETYPE2_LIBS}" = "x"; then + PKG_CHECK_MODULES(FREETYPE2, [freetype2], , [font_freetype=no;font_freetype_reason="Package freetype2 missing"]) +else + fribidi=no +fi +AC_SUBST(FREETYPE2_CFLAGS) +AC_SUBST(FREETYPE2_LIBS) +AM_CONDITIONAL(FONT_FREETYPE, test "x${font_freetype}" = "xyes") +AC_ARG_WITH(freetype-fonts, [ --with-freetype-fonts specify what fonts to use], AC_DEFINE_UNQUOTED(FREETYPE_FONTS,[${withval}],[Freetype fonts to use])) + +AC_ARG_ENABLE(fontconfig, [ --disable-fontconfig don't' add fontconfig support], fontconfig=$enableval;fontconfig_reason="configure parameter") +if test "x${fontconfig}" = "xyes"; then + PKG_CHECK_MODULES(FONTCONFIG, [fontconfig], [fontconfig=yes], [fontconfig=no]) +fi +if test "x$fontconfig" = "xyes"; then + AC_DEFINE(HAVE_FONTCONFIG, 1, [Define to 1 if you have fontconfig]) +fi +AC_SUBST(FONTCONFIG_CFLAGS) +AC_SUBST(FONTCONFIG_LIBS) + +AM_CONDITIONAL(FONTS, test "x${font_freetype}" = "xyes" -a "x$fontconfig" != "xyes") + +# fribidi +AC_ARG_ENABLE(fribidi, [ --disable-fribidi dont build with fribidi], fribidi=$enableval;fribidi_reason="configure parameter", fribidi=yes) +if test x"${fribidi}" = "xyes"; then + PKG_CHECK_MODULES(FRIBIDI2, [fribidi >= 0.19.0], [fribidi=yes;oldfribidi=no], + [ PKG_CHECK_MODULES([FRIBIDI], [fribidi], + [fribidi=yes;oldfribidi=yes;fribid_reason="using old version"], [fribidi=no;fribidi_reason="FriBidi library not found"]) + ]) +fi +if test x"${fribidi}" = "xyes"; then + AC_DEFINE(USE_FRIBIDI, 1, [Build with fribidi support]) +fi +if test x"${oldfribidi}" = "xyes"; then + AC_DEFINE(FRIBIDIOLD, 1, [Build with fribidi support for older versions of fribidi]) +fi + +AC_SUBST(FRIBIDI2_CFLAGS) +AC_SUBST(FRIBIDI2_LIBS) +AC_SUBST(FRIBIDI_CFLAGS) +AC_SUBST(FRIBIDI_LIBS) + +PKG_CHECK_MODULES(IMLIB2, [imlib2], [imlib2_pkgconfig=yes], [imlib2_pkgconfig=no]) +if test "x$imlib2_pkgconfig" = "xyes"; then + AC_DEFINE(HAVE_IMLIB2, 1, [Define to 1 if you have imlib2]) +fi +AC_SUBST(IMLIB2_CFLAGS) +AC_SUBST(IMLIB2_LIBS) + +AC_ARG_ENABLE(graphics-opengl, [ --disable-graphics-opengl disable graphics type OpenGL], graphics_opengl=$enableval;graphics_opengl_reason="configure parameter") +if test "x${graphics_opengl}" = "xyes" ; then + +AC_CHECK_HEADER( + GL/gl.h, + AC_DEFINE( + [HAVE_OPENGL], + [], + Define to 1 if you have the header file. + ) + OPENGL_LIBS="$X_LIBS -lGL -lglut -lfreeimage" + opengl=yes, + AC_MSG_WARN([*** no GL/gl.h -- opengl graphics support disabled];graphics_opengl=no;graphics_opengl_reason="GL/gl.h header missing") +) + +AC_CHECK_HEADER( + GL/glut.h, + AC_DEFINE( + [HAVE_GLUT], + [], + Define to 1 if you have the header file. + ) + glut=yes, + AC_MSG_WARN([*** no GL/glut.h -- opengl graphics support disabled]);graphics_opengl=no;graphics_opengl_reason="GL/glut.h header missing" +) + +AC_CHECK_HEADER( + GL/freeglut.h, + AC_DEFINE( + [HAVE_FREEGLUT], + [], + Define to 1 if you have the header file. + ) + freeglut=yes, + AC_MSG_WARN([*** no GL/freeglut.h -- opengl support disabled]);graphics_opengl=no;graphics_opengl_reason="Headers missing" +) + +AC_SUBST(OPENGL_CFLAGS) +AC_SUBST(OPENGL_LIBS) + +AC_CHECK_HEADER( + GL/glc.h, + AC_DEFINE( + [HAVE_GLC], + [], + Define to 1 if you have the header file. + ) + GLC_LIBS="-lGLC" + glc=yes, + AC_MSG_WARN([*** no GL/glc.h -- opengl graphics support disabled]);graphics_opengl=no;graphics_opengl_reason="GL/glc.h header missing" +) +AC_CHECK_HEADER( + FreeImage.h, + AC_DEFINE( + [HAVE_FREEIMAGE], + [], + Define to 1 if you have the header file. + ) + FREEIMAGE_LIBS="-lfreeimage" + freeimage=yes, + AC_MSG_WARN([*** no FreeImage.h -- opengl support disabled]);graphics_opengl=no;graphics_opengl_reason="Headers missing" +) +AC_SUBST(FREEIMAGE_LIBS) +AC_SUBST(GLC_CFLAGS) +AC_SUBST(GLC_LIBS) +fi + +AM_CONDITIONAL(GRAPHICS_OPENGL, [test "x$glut" = "xyes" -a "x$freeglut" = "xyes" -a "x$opengl" = "xyes" -a "x$freeimage" = "xyes" -a "x$glc" = "xyes" ]) + + +system_shapefile=no +if test x"${map_shapefile}" = xyes +then +AC_CHECK_HEADERS( + [shapefil.h libshp/shapefil.h], + [AC_DEFINE( + [HAVE_SYS_SHAPEFILELIB], + [1], + Define to 1 if you have the header file. + )], + [SHAPEFILE_CFLAGS="-I\$(top_srcdir)/navit/support/shapefile"] + ) + +AC_CHECK_LIB( + [shp], + [DBFDeleteField], + [SHAPEFILE_LIBS="-lshp" + system_shapefile=yes], + [SHAPEFILE_LIBS="-L\$(top_builddir)/navit/support/shapefile -lsupport_shapefile" + system_shapefile=no] + ) + +if test x"${system_shapefile}" = xno +then + AC_MSG_WARN([*** The shapefile library(libshp) from the system is to old or not found! -- using included copy]) +fi + +fi +AC_SUBST(SHAPEFILE_CFLAGS) +AC_SUBST(SHAPEFILE_LIBS) +AM_CONDITIONAL(HAVE_SYSTEM_SHAPEFILELIB, [test "x$system_shapefile" = "xyes" ]) + +if test x"${USE_GARMIN}" = xyes +then + # check for libgarmin + PKG_CHECK_MODULES(LIBGARMIN, libgarmin, use_libgarmin=yes, use_libgarmin=no) + AC_SUBST(LIBGARMIN_CFLAGS) + AC_SUBST(LIBGARMIN_LIBS) +fi + AM_CONDITIONAL(HAVELIBGARMIN, [test "x$use_libgarmin" = "xyes"]) + +## binding +# python +AC_ARG_ENABLE(binding-python, [ --disable-binding-python don't create binding python], binding_python=$enableval;binding_python_reason="configure parameter") +if test "x${binding_python}" = "xyes"; then + AC_PATH_PROG(_PATH_PYTHON,[python]) + dnl Libraries and flags for embedded Python. + dnl FIXME: I wish there was a less icky way to get this. + if test "x${_PATH_PYTHON}" != "x" ; then + AC_MSG_CHECKING(for Python linkage) + AC_PATH_PROG([PYTHONCONFIG], [python-config], []) + if test "x${PYTHONCONFIG}" = "x" ; then + py_prefix=`$_PATH_PYTHON -c 'import sys; print sys.prefix'` + py_ver=`$_PATH_PYTHON -c 'import sys; print sys.version[[:3]]'` + py_lib=`$_PATH_PYTHON -c 'import sys; print sys.lib'` + py_libdir="${py_prefix}/${py_lib}/python${py_ver}" + PYTHON_CFLAGS="-I${py_prefix}/include/python${py_ver}" + if test -f $py_libdir/config/Makefile -a -f $py_prefix/include/python${py_ver}/Python.h; then + py_libs=`grep '^LIBS=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` + py_libc=`grep '^LIBC=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` + py_libm=`grep '^LIBM=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` + py_liblocalmod=`grep '^LOCALMODLIBS=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` + py_libbasemod=`grep '^BASEMODLIBS=' $py_libdir/config/Makefile | sed -e 's/^.*=//'` + PYTHON_LIBS="-L$py_libdir/config $py_libs $py_libc $py_libm -lpython$py_ver $py_liblocalmod $py_libbasemod" + PYTHON_LIBS=`echo $PYTHON_LIBS | sed -e 's/[ \\t]*/ /g'` + AC_MSG_RESULT($py_libdir) + else + binding_python="no" + binding_python_reason="$py_libdir/config/Makefile or $py_prefix/include/python${py_ver}/Python.h missing" + fi + + else + PYTHON_CFLAGS="`${PYTHONCONFIG} --cflags`" + PYTHON_LIBS="`${PYTHONCONFIG} --ldflags`" + fi + else + binding_python="no" + binding_python_reason="python executable missing" + fi +fi +if test "x${binding_python}" = xyes ; then + AC_DEFINE(USE_BINDING_PYTHON, 1, [Build with binding python]) +fi +AC_SUBST(PYTHON_CFLAGS) +AC_SUBST(PYTHON_LIBS) +AM_CONDITIONAL(BINDING_PYTHON, test "x${binding_python}" = "xyes") + +# dbus +AC_ARG_ENABLE(binding-dbus, [ --disable-binding-dbus don't create binding dbus], binding_dbus=$enableval;binding_dbus_reason="configure parameter") +AC_ARG_ENABLE(binding-dbus-use-system-bus, [ --enable-binding-dbus-use-system-bus use system bus for dbus binding], binding_dbus_use_system_bus=$enableval) +if test "x${binding_dbus}" = "xyes" ; then + PKG_CHECK_MODULES(DBUS, [dbus-glib-1], ,binding_dbus=no) +fi +if test "x${binding_dbus}" = "xyes" ; then + AC_DEFINE(USE_BINDING_DBUS, 1, [Build with binding dbus]) + vehicle_gpsd_dbus="yes" + vehicle_gpsd_dbus_reason="dbus binding present" + speech_dbus="yes" + speech_dbus_reason="dbus binding present" +fi +if test "x${binding_dbus_use_system_bus}" = "xyes" ; then + AC_DEFINE(DBUS_USE_SYSTEM_BUS, 1, [Use system bus instead of session bus for binding dbus]) +fi +AC_SUBST(DBUS_CFLAGS) +AC_SUBST(DBUS_LIBS) +AM_CONDITIONAL(BINDING_DBUS, test "x${binding_dbus}" = "xyes") +AM_CONDITIONAL(VEHICLE_GPSD_DBUS, test "x${vehicle_gpsd_dbus}" = "xyes") +AM_CONDITIONAL(SPEECH_DBUS, test "x${speech_dbus}" = "xyes") +AC_ARG_WITH(dbus-service-dir, [ --with-dbus-service-dir specify where the dbus service dir resides], DBUS_SERVICE_DIR=$withval, DBUS_SERVICE_DIR="$datarootdir/dbus-1/services") +AC_SUBST(DBUS_SERVICE_DIR) + +# win32 binding +AC_ARG_ENABLE(binding-win32, [ --disable-binding-win32 don't create binding win32], binding_win32=$enableval;binding_win32_reason="configure parameter") +if test "x${binding_win32}" = "xyes" ; then + AC_DEFINE(USE_BINDING_WIN32, 1, [Build with binding win32]) +fi +AM_CONDITIONAL(BINDING_WIN32, test "x${binding_win32}" = "xyes") + +# svg +AC_ARG_ENABLE(svg, [ --disable-svg disable Scalable Vector Graphics], enable_svg=$enableval, enable_svg=yes) +AC_ARG_ENABLE(svg2png, [ --disable-svg2png disable conversion of svgs to pngs], enable_svg2png=$enableval, enable_svg2png=yes) +AC_ARG_ENABLE(svg2png-scaling, [ --enable-svg2png-scaling enable conversion of svgs to pngs with specified sizes], SVG2PNG_SCALES=$enableval, SVG2PNG_SCALES="8 16 32 48 96") +AC_ARG_ENABLE(svg2png-scaling-flag, [ --enable-svg2png-scaling-flag enable conversion of flag svgs to pngs with specified sizes], SVG2PNG_SCALES_FLAG=$enableval, SVG2PNG_SCALES_FLAG="8 16 32 48 96") +AC_ARG_ENABLE(svg2png-scaling-nav, [ --enable-svg2png-scaling-nav enable conversion of nav svgs to pngs with specified sizes], SVG2PNG_SCALES_NAV=$enableval, SVG2PNG_SCALES_NAV="8 16 32 48 96") +AC_ARG_WITH(svg2png-use-convert, [ --with-svg2png-use-convert use imagemagick's convert for png creation], SVG2PNG_CONVERTER="convert") +AC_ARG_WITH(svg2png-use-rsvg-convert, [ --with-svg2png-use-rsvg-convert use librsvg's rsvg-convert for png creation], SVG2PNG_CONVERTER="rsvg-convert") +AC_ARG_WITH(svg2png-use-inkscape, [ --with-svg2png-use-inkscape use inkscapes internal convert routines for png creation], SVG2PNG_CONVERTER="inkscape") +AC_ARG_WITH(svg2png-use-ksvgtopng4, [ --with-svg2png-use-ksvgtopng4 use kde4's ksvgtopng4 for png creation], SVG2PNG_CONVERTER="ksvgtopng4") +AC_ARG_WITH(svg2png-use-ksvgtopng, [ --with-svg2png-use-ksvgtopng use kde3's convert for png creation], SVG2PNG_CONVERTER="ksvgtopng") +if test "x${enable_svg2png}" = "xyes" ; then + if test "x${SVG2PNG_CONVERTER}" = "x"; then + SVG2PNG_CONVERTER="rsvg-convert ksvgtopng ksvgtopng4 inkscape convert" + fi + AC_PATH_PROGS([SVG2PNG], ${SVG2PNG_CONVERTER}, [none]) + if test "x${SVG2PNG}" = "xnone"; then + enable_svg2png="no" + fi +fi +AC_SUBST(SVG2PNG) +AC_SUBST(SVG2PNG_SCALES) +AC_SUBST(SVG2PNG_SCALES_FLAG) +AC_SUBST(SVG2PNG_SCALES_NAV) +AM_CONDITIONAL(USE_SVG2PNG_SCALES, test "x${SVG2PNG_SCALES}" != "xyes" -a "x${SVG2PNG_SCALES}" != "x") +AM_CONDITIONAL(USE_SVG2PNG_SCALES_FLAG, test "x${SVG2PNG_SCALES_FLAG}" != "xyes" -a "x${SVG2PNG_SCALES_FLAG}" != "x") +AM_CONDITIONAL(USE_SVG2PNG_SCALES_NAV, test "x${SVG2PNG_SCALES_NAV}" != "xyes" -a "x${SVG2PNG_SCALES_NAV}" != "x") +AM_CONDITIONAL(USE_SVG2PNG, test "x${enable_svg2png}" = "xyes") +AM_CONDITIONAL(USE_SVG, test "x${enable_svg}" = "xyes") + +# XSLTS +AC_ARG_WITH(xslts, [ --with-xslts enable processing of navit.xml with given xslt scripts], XSLTS=$withval, XSLTS="") +AC_SUBST(XSLTS) +AC_ARG_WITH(saxon, [ --with-saxon specify the saxon xslt processor], SAXON=$withval, SAXON="saxon") +AC_SUBST(SAXON) + +# Android Permissions +AC_ARG_WITH(android-permissions, [ --with-android-permissions Set additional android permissions], ANDROID_PERMISSIONS=$withval, ANDROID_PERMISSIONS="") +AC_SUBST(ANDROID_PERMISSIONS) +# Android Project +AC_ARG_WITH(android-project, [ --with-android-project Set android project], ANDROID_PROJECT=$withval, ANDROID_PROJECT="3") +AC_SUBST(ANDROID_PROJECT) + +# NLS + +AC_ARG_ENABLE(nls, + [ --disable-nls disable Native Language Support ( gettext/libintl )], + enable_nls=$enableval, enable_nls=yes) + + +INTLIBS="" +MOFILES="" +POFILES="" +POIFILES="" +LINGUAS="" + +xgettext_glade=no +if test "x$enable_nls" = "xyes"; then + + AC_CHECK_FUNC(gettext, [HAVEGETTEXT="yes"],[INTLIBS="-lintl" HAVEGETTEXT="yes"]) + AC_CHECK_PROG(XGETTEXT, xgettext, xgettext) + AC_CHECK_PROG(MSGMERGE, msgmerge, msgmerge) + AC_CHECK_PROG(MSGFMT, msgfmt, msgfmt) + + if test "$XGETTEXT" != ""; then + if $XGETTEXT --help 2>&1 | grep illegal >/dev/null ; then + echo "xgettext isn't GNU version" + XGETTEXT="" + else + if echo '' | $XGETTEXT -L Glade - ; then + xgettext_glade=yes + fi + fi + fi + + if test "$XGETTEXT" != "" ; then + PO="" + if test "$LINGUAS" = ""; then + ling=` (cd $srcdir/po; /bin/ls *.po.in) ` + for l in $ling; do + lcode=`basename $l .po.in` + LINGUAS="$LINGUAS$lcode " + done + fi + AC_DEFINE(ENABLE_NLS, [1], [NLS Please]) + echo "xgettext and gettext() exist; will build i18n support for $LINGUAS" + else + LINGUAS="" + PO="" + echo "xgettext doesn't exist; will not build i18n support" + enable_nls=no + fi + for lang in $LINGUAS; do + MOFILES="$MOFILES $lang.mo" + done + for lang in $LINGUAS; do + POFILES="$POFILES $lang.po" + done + for lang in $LINGUAS; do + POIFILES="$POIFILES $lang.po.in" + done + +AC_SUBST(INTLIBS) +AC_SUBST(MOFILES) +AC_SUBST(POFILES) +AC_SUBST(POIFILES) +AM_GNU_GETTEXT_VERSION +AM_GNU_GETTEXT(no-libtool, need-ngettext, \$(top_builddir)/intl/) +if test "x${shared_libnavit}" = "xyes" -a "x${win32ce}" = "xyes"; then + INTLLIBS="\$(top_builddir)/intl/libintl.la" + LIBINTL=$INTLLIBS + LTLIBINTL=$INTLLIBS +fi +AC_SUBST(LIBINTL) +AC_SUBST(LTLIBINTL) +if test x"$LIBINTL" != "x" ;then + CFLAGS="$CFLAGS -I\$(top_builddir)/intl/" +fi + +fi +AM_CONDITIONAL(ENABLE_NLS, [test "x$enable_nls" = "xyes"]) +AM_CONDITIONAL(XGETTEXT_GLADE, [test "x$xgettext_glade" = "xyes"]) +AC_CHECK_HEADER( + byteswap.h, + AC_DEFINE( + [HAVE_BYTESWAP_H], + [1], + [Define to 1 if you have byteswap.h], + ) + , +) + +AC_CHECK_HEADER(sys/endian.h,AC_DEFINE([USE_SYS_ENDIAN_H], [1], [Define to 1 if you have sys/endian.h],),) + +PACKAGE=navit +AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE") +AC_DEFINE_UNQUOTED(VERSION, "$VERSION") +AC_SUBST(PACKAGE) +AC_SUBST(VERSION) + +AC_CHECK_HEADER(wordexp.h,wordexp_h=yes,wordexp_h=no;NAVIT_CFLAGS="$NAVIT_CFLAGS -I\$(top_srcdir)/navit/support/wordexp";WORDEXP_LIBS="-L\$(top_builddir)/navit/support/wordexp -lsupport_wordexp") +AM_CONDITIONAL(SUPPORT_WORDEXP, [test "x$wordexp_h" = "xno"]) + +support_libc=no +AC_ARG_ENABLE(support_libc, [ --enable-support-libc enable builtin mini libc ], support_libc=$enableval) +AM_CONDITIONAL(SUPPORT_LIBC, [test "x$support_libc" = "xyes"]) +if test "x$support_libc" = "xyes"; then + CFLAGS="$CFLAGS -I\$(top_srcdir)/navit/support/libc" + LIBC_LIBS="-L\$(top_builddir)/navit/support/libc -lsupport_libc" +fi + +## graphics +AC_ARG_ENABLE(graphics, [ --disable-graphics disable graphics], graphics=$enableval;graphics_reason="configure parameter") +AM_CONDITIONAL(GRAPHICS, test "x${graphics}" = "xyes") +if test "x$graphics" = "xyes"; then + AC_DEFINE([USE_GRAPHICS],[1],Define to 1 if you want to use graphics.) +fi + +# gd + +# android +AC_ARG_ENABLE(graphics-android, [ --disable-graphics-android disable graphics type android], graphics_android=$enableval;graphics_android_reason="configure parameter") +AM_CONDITIONAL(GRAPHICS_ANDROID, test "x${graphics_android}" = "xyes") +# gd +AC_ARG_ENABLE(graphics-gd, [ --enable-graphics-gd enable graphics type gd], graphics_gd=$enableval;graphics_gd_reason="configure parameter") +if test "x${graphics_gd}" = "xyes" ; then + if test -z "$GDLIB_CONFIG"; then + AC_PATH_PROG([GDLIB_CONFIG], [gdlib-config], []) + fi + AC_MSG_CHECKING([for gdlib with $GDLIB_CONFIG]) + if test ! -x "$GDLIB_CONFIG"; then + if test "x${GDLIB_CONFIG}" = "x" ; then + graphics_gd_reason="$GDLIB_CONFIG not executable" + else + graphics_gd_reason="gdlib-config missing" + fi + graphics_gd=no + AC_MSG_RESULT([no]) + else + if test "x${GD_CFLAGS}" = "x" ; then + GD_CFLAGS="-I`$GDLIB_CONFIG --includedir`" + fi + if test "x${GD_LIBS}" = "x" ; then + GD_LIBS="-L`$GDLIB_CONFIG --libdir` -lgd `$GDLIB_CONFIG --libs`" + fi + AC_SUBST(GD_CFLAGS) + AC_SUBST(GD_LIBS) + AC_MSG_RESULT([yes]) + fi +fi +AM_CONDITIONAL(GRAPHICS_GD, test "x${graphics_gd}" = "xyes") +AC_CHECK_HEADER( + sys/shm.h, + AC_DEFINE( + [HAVE_SHMEM], + [], + Define to 1 if you have shared memory + ) +) +AC_CHECK_HEADER( + X11/xpm.h, + AC_DEFINE( + [HAVE_XPM], + [], + Define to 1 if you have xpm header + ) +) +AC_CHECK_HEADER( + getopt.h, + AC_DEFINE( + [HAVE_GETOPT_H], + [], + Define to 1 if you have the getopt header + ) +) +if test "x${graphics_gd}" = "xyes" ; then + save_CPPFLAGS=$CPPFLAGS + save_LIBS=$LIBS + LIBS="$GD_LIBS $LIBS" + CPPFLAGS="$GD_CFLAGS $CPPFLAGS" + AC_TRY_LINK([#include ], [gdImageCreateFromPng(0);],AC_MSG_RESULT(yes);AC_DEFINE(HAVE_GRAPHICS_GD_PNG, 1, [Define to 1 if you have png support in gd.]),AC_MSG_RESULT(no)) + CPPFLAGS=$save_CPPFLAGS + LIBS=$save_LIBS +fi + +# gtk_drawing_area +AC_ARG_ENABLE(graphics-gtk-drawing-area, [ --disable-graphics-gtk-drawing-area disable graphics type gtk_drawing_area], graphics_gtk_drawing_area=$enableval;graphics_gtk_drawing_area_reason="configure parameter") +AM_CONDITIONAL(GRAPHICS_GTK_DRAWING_AREA, [test "x${graphics_gtk_drawing_area}" = "xyes"]) +# null +AC_ARG_ENABLE(graphics-null, [ --disable-graphics-null disable graphics type null], graphics_null=$enableval;graphics_null_reason="configure parameter") +AM_CONDITIONAL(GRAPHICS_NULL, test "x${graphics_null}" = "xyes") +# win32 +AC_ARG_ENABLE(graphics-win32, [ --disable-graphics-win32 disable graphics type win32], graphics_win32=$enableval;graphics_win32_reason="configure parameter") +AM_CONDITIONAL(GRAPHICS_WIN32, test "x${graphics_win32}" = "xyes") +# qt_qpainter +AC_ARG_ENABLE(graphics-qt-qpainter, [ --disable-graphics-qt-qpainter disable graphics type qt-qpainter], graphics_qt_qpainter=$enableval;graphics_qt_qpainter_reason="configure parameter") +if test "x${graphics_qt_qpainter}" = "xyes" -a "x${QT_GUI_CFLAGS}" = "x" -a "x${QT_GUI_LIBS}" = "x"; then + PKG_CHECK_MODULES(QT_GUI, [QtGui QtCore],graphics_qt_qpainter=yes,graphics_qt_qpainter=no;graphics_qt_qpainter_reason="Packages QtGui and/or QtCore missing") + if test "x${graphics_qt_qpainter}" = "xno"; then + PKG_CHECK_MODULES(QT_GUI, [qt-mt],graphics_qt_qpainter=yes;graphics_qt_qpainter_reason="Package qt-mt present",graphics_qt_qpainter=no) + fi +fi +if test "x${graphics_qt_qpainter}" = "xyes" ; then + PKG_CHECK_MODULES(QT_SVG, [QtSvg], have_qt_svg=yes, have_qt_svg=no) + if test "x${have_qt_svg}" = "xyes"; then + AC_DEFINE([HAVE_QT_SVG],[],Define to 1 if qt supports svg) + fi +fi +if test "x${graphics_qt_qpainter}" = "xyes" ; then + AC_DEFINE(USE_GRAPICS_QT_QPAINTER, 1, [Build with graphics qt_qpainter]) +fi +AC_SUBST(QT_GUI_CFLAGS) +AC_SUBST(QT_GUI_LIBS) +AC_SUBST(QT_SVG_CFLAGS) +AC_SUBST(QT_SVG_LIBS) +AM_CONDITIONAL(GRAPHICS_QT_QPAINTER, test "x${graphics_qt_qpainter}" = "xyes") +MOC=`$PKG_CONFIG QtGui --variable=moc_location` +if test "x${MOC}" = "x"; then + AC_CHECK_PROG(MOC, moc, moc) +fi +AC_SUBST(MOC) + + +## map +# binfile +AC_ARG_ENABLE(map-binfile, [ --disable-map-binfile disable map binfile], map_binfile=$enableval;map_binfile_reason="configure parameter") +AM_CONDITIONAL(MAP_BINFILE, test "x${map_binfile}" = "xyes") +# filter +AC_ARG_ENABLE(map-filter, [ --disable-map-filter disable map filter], map_filter=$enableval;map_filter_reason="configure parameter") +AM_CONDITIONAL(MAP_FILTER, test "x${map_filter}" = "xyes") +# mg +AC_ARG_ENABLE(map-mg, [ --disable-map-mg disable map mg], map_mg=$enableval;map_mg_reason="configure parameter") +AM_CONDITIONAL(MAP_MG, test "x${map_mg}" = "xyes") +# shapefile +AC_ARG_ENABLE(map-shapefile, [ --disable-map-shapefile disable map shapefile], map_shapefile=$enableval;map_shapefile_reason="configure parameter") +AM_CONDITIONAL(MAP_SHAPEFILE, test "x${map_shapefile}" = "xyes") +# textfile +AC_ARG_ENABLE(map-textfile, [ --disable-map-textfile disable map textfile], map_textfile=$enableval;map_textfile_reason="configure parameter") +AM_CONDITIONAL(MAP_TEXTFILE, test "x${map_textfile}" = "xyes") +# csv +AC_ARG_ENABLE(map-csv, [ --disable-map-csv disable map csv], map_csv=$enableval;map_csv_reason="configure parameter") +AM_CONDITIONAL(MAP_CSV, test "x${map_csv}" = "xyes") + +## osd +# core +AC_ARG_ENABLE(osd-core, [ --disable-osd-core disable osd core], osd_core=$enableval;osd_core_reason="configure parameter") +AM_CONDITIONAL(OSD_CORE, test "x${osd_core}" = "xyes") + +## gui +# gtk +AC_ARG_ENABLE(gui-gtk, [ --disable-gui-gtk disable gui type gtk ], gui_gtk=$enableval) +AM_CONDITIONAL(GUI_GTK, [test "x${gui_gtk}" = "xyes"]) +# internal +AC_ARG_ENABLE(gui-internal, [ --disable-gui-internal disable gui type internal], gui_internal=$enableval;gui_internal_reason="configure parameter") +AM_CONDITIONAL(GUI_INTERNAL, test "x${gui_internal}" = "xyes") +# win32 +AC_ARG_ENABLE(gui-win32, [ --disable-gui-win32 disable gui type win32], gui_win32=$enableval;gui_win32_reason="configure parameter") +AM_CONDITIONAL(GUI_WIN32, test "x${gui_win32}" = "xyes") +# qml +AC_ARG_ENABLE(gui-qml, [ --disable-gui-qml disable gui type QML], gui_qml=$enableval;gui_qml_reason="configure parameter") +if test "x${gui_qml}" = "xyes" -a "x${QT_GUI_CFLAGS}" = "x" -a "x${QT_GUI_LIBS}" = "x"; then + PKG_CHECK_MODULES(QT_GUI, [QtGui QtCore], ,gui_qml=no;gui_qml_reason="Packages QtGui and/or QtCore are missing") +fi +if test "x${gui_qml}" = "xyes" -a "x${QT_XML_CFLAGS}" = "x" -a "x${QT_XML_LIBS}" = "x"; then + PKG_CHECK_MODULES(QT_XML, [QtXml], ,gui_qml=no;gui_qml_reason="Package QtXml is missing") +fi +if test "x${gui_qml}" = "xyes" -a "x${QT_DECLARATIVE_CFLAGS}" = "x" -a "x${QT_DECLARATIVE_LIBS}" = "x"; then + PKG_CHECK_MODULES(QT_DECLARATIVE, [QtDeclarative >= 4.6.0 ], ,gui_qml=no;gui_qml_reason="Packages QtDeclarative is missing") +fi +if test "x${gui_qml}" = "xyes" ; then + AC_DEFINE(USE_GUI_QML, 1, [Build with gui qml]) +fi +AC_SUBST(QT_GUI_CFLAGS) +AC_SUBST(QT_GUI_LIBS) +AC_SUBST(QT_DECLARATIVE_CFLAGS) +AC_SUBST(QT_DECLARATIVE_LIBS) +AC_SUBST(QT_XML_CFLAGS) +AC_SUBST(QT_XML_LIBS) +AM_CONDITIONAL(GUI_QML, test "x${gui_qml}" = "xyes") + +## plugins +# pedestrian +AC_ARG_ENABLE(plugin-pedestrian, [ --enable-plugin-pedestrian enable pedestrian plugin], plugin_pedestrian=$enableval;plugin_pedestrian_reason="configure parameter") +AM_CONDITIONAL(PLUGIN_PEDESTRIAN, test "x${plugin_pedestrian}" = "xyes") + +## routing +AC_ARG_ENABLE(routing, [ --disable-routing disable routing], routing=$enableval;routing_reason="configure parameter") +AM_CONDITIONAL(ROUTING, test "x${routing}" = "xyes") +if test "x$routing" = "xyes"; then + AC_DEFINE([USE_ROUTING],[1],Define to 1 if you want to have routing.) +fi + +## speech +# android +AC_ARG_ENABLE(speech-android, [ --disable-speech-android disable speech type android], speech_android=$enableval;speech_android_reason="configure parameter") +AM_CONDITIONAL(SPEECH_ANDROID, test "x${speech_android}" = "xyes") +# cmdline +AC_ARG_ENABLE(speech-cmdline, [ --disable-speech-cmdline disable speech type cmdline], speech_cmdline=$enableval;speech_cmdline_reason="configure parameter") +AM_CONDITIONAL(SPEECH_CMDLINE, test "x${speech_cmdline}" = "xyes") +# espeak +AC_ARG_ENABLE(speech-espeak, [ --disable-speech-espeak disable speech type espeak], speech_espeak=$enableval;speech_espeak_reason="configure parameter") +AM_CONDITIONAL(SPEECH_ESPEAK, test "x${speech_espeak}" = "xyes") +# speech-dispatcher +AC_ARG_ENABLE(speech-speech-dispatcher, [ --disable-speech-speech-dispatcher disable speech type speech-dispatcher], speech_speech_dispatcher=$enableval;speech_speech_dispatcher_reason="configure parameter") +if test "x$speech_speech_dispatcher" = "xyes"; then + AC_CHECK_HEADER(libspeechd.h, AC_DEFINE([HAVE_LIBSPEECHD],[],Define to 1 if you have the header file.) SPEECHD_LIBS="-lspeechd", speech_speech_dispatcher=no; speech_speech_dispatcher_reason="libspeechd.h missing") +fi +AC_SUBST(SPEECHD_CFLAGS) +AC_SUBST(SPEECHD_LIBS) +AM_CONDITIONAL(SPEECH_SPEECH_DISPATCHER, test "x${speech_speech_dispatcher}" = "xyes") +AM_CONDITIONAL(SUPPORT_ESPEAK, test "x${support_espeak}" = "xyes") + +## vehicle +# android +AC_ARG_ENABLE(vehicle-android, [ --disable-vehicle-android disable vehicle type android], vehicle_android=$enableval;vehicle_android_reason="configure parameter") +AM_CONDITIONAL(VEHICLE_ANDROID, test "x${vehicle_android}" = "xyes") +# demo +AC_ARG_ENABLE(vehicle-demo, [ --disable-vehicle-demo disable vehicle type demo], vehicle_demo=$enableval;vehicle_demo_reason="configure parameter") +AM_CONDITIONAL(VEHICLE_DEMO, test "x${vehicle_demo}" = "xyes") +# file +AC_ARG_ENABLE(vehicle-file, [ --disable-vehicle-file disable vehicle type file], vehicle_file=$enableval;vehicle_file_reason="configure parameter") +AM_CONDITIONAL(VEHICLE_FILE, test "x${vehicle_file}" = "xyes") +# gpsd +AC_ARG_ENABLE(vehicle-gpsd, [ --disable-vehicle-gpsd disable vehicle type gpsd], vehicle_gpsd=$enableval;vehicle_gpsd_reason="configure parameter") +if test "x${vehicle_gpsd}" = xyes +then + PKG_CHECK_MODULES([GPSD], [libgps], have_libgps="yes", have_libgps="no") + if test "x$have_libgps" = "xyes"; then + AC_DEFINE([HAVE_LIBGPS],[],Define to 1 if you have libgps.) + PKG_CHECK_MODULES([LIBGPS19], [libgps >= 2.90], have_libgps19="yes", have_libgps19="no") + if test "x$have_libgps19" = "xyes"; then + AC_DEFINE([HAVE_LIBGPS19],[],Define to 1 if you have libgps19.) + fi + else + AC_CHECK_HEADER(gps.h, AC_DEFINE([HAVE_LIBGPS],[],Define to 1 if you have the header file.) GPSD_LIBS="-lgps", vehicle_gpsd=no; vehicle_gpsd_reason="no gps.h and no gpsd pkgconfig" ) + fi +fi +AC_SUBST(GPSD_CFLAGS) +AC_SUBST(GPSD_LIBS) +AM_CONDITIONAL(VEHICLE_GPSD, [test "x${vehicle_gpsd}" = "xyes"]) +# gypsy +AC_ARG_ENABLE(vehicle-gypsy,[ --disable-vehicle-gypsy disable vehicle type gypsy], vehicle_gypsy=$enableval;vehicle_gypsy_reason="configure parameter") +if test "x${vehicle_gypsy}" = "xyes" +then + PKG_CHECK_MODULES(GYPSY, gypsy, ,vehicle_gypsy=no;vehicle_gypsy_reason="package gypsy missing") +fi +AC_SUBST(GYPSY_CFLAGS) +AC_SUBST(GYPSY_LIBS) +AM_CONDITIONAL(VEHICLE_GYPSY, test "x${vehicle_gypsy}" = "xyes") +# maemo +AC_ARG_ENABLE(vehicle-maemo, [ --disable-vehicle-maemo disable vehicle type maemo], vehicle_maemo=$enableval;vehicle_maemo_reason="configure parameter") +if test "x${vehicle_maemo}" = "xyes" ; then + PKG_CHECK_MODULES(LIBLOCATION, liblocation, [ + AC_SUBST(LIBLOCATION_CFLAGS) + AC_SUBST(LIBLOCATION_LIBS) + ], [ + AC_MSG_RESULT(no) + vehicle_maemo=no + vehicle_maemo_reason="no maemo location library found" + ]) +fi +AM_CONDITIONAL(VEHICLE_MAEMO, test "x${vehicle_maemo}" = "xyes") +# null +AC_ARG_ENABLE(vehicle-null, [ --enable-vehicle-null enable vehicle type null], vehicle_null=$enableval;vehicle_null_reason="configure parameter") +AM_CONDITIONAL(VEHICLE_NULL, test "x${vehicle_null}" = "xyes") +# wince +AC_ARG_ENABLE(vehicle-wince, [ --disable-vehicle-wince disable vehicle type wince], vehicle_wince=$enableval;vehicle_wince_reason="configure parameter") +AM_CONDITIONAL(VEHICLE_WINCE, test "x${vehicle_wince}" = "xyes") +# iphone +AC_ARG_ENABLE(vehicle-iphone, [ --disable-vehicle-iphone disable vehicle type iphone], vehicle_iphone=$enableval;vehicle_iphone_reason="configure parameter") +AM_CONDITIONAL(VEHICLE_IPHONE, test "x${vehicle_iphone}" = "xyes") +if test "x${vehicle_iphone}" = "xyes" +then + IPHONE_LIBS=-Wl,-framework,CoreLocation +fi +AC_SUBST(IPHONE_CFLAGS) +AC_SUBST(IPHONE_LIBS) +# webos +AC_ARG_ENABLE(vehicle-webos, [ --enable-vehicle-webos enable vehicle type webos], vehicle_webos=$enableval;vehicle_webos_reason="configure parameter") +AM_CONDITIONAL(VEHICLE_WEBOS, test "x${vehicle_webos}" = "xyes") +if test "x${vehicle_webos}" = "xyes" +then + AC_DEFINE(USE_WEBOS,[],Build with webOS support) + LIBPDL_CFLAGS="$SDL_CFLAGS -I/usr/local/include" + LIBPDL_LIBS="-L/usr/local/lib -lpdl" + AC_SUBST(LIBPDL_CFLAGS) + AC_SUBST(LIBPDL_LIBS) +fi +NAVIT_CFLAGS="$NAVIT_CFLAGS $GLIB_CFLAGS $GMODULE_CFLAGS" +NAVIT_LIBS="$NAVIT_LIBS $GLIB_LIBS $GMODULE_LIBS $LIBINTL" +AC_SUBST(NAVIT_CFLAGS) +AC_SUBST(NAVIT_LIBS) +AC_SUBST(WORDEXP_LIBS) +AC_SUBST(LIBC_LIBS) +AC_SUBST(WINDRES) + +AC_CONFIG_FILES([ +Makefile +navit/Makefile +navit/autoload/Makefile +navit/autoload/osso/Makefile +navit/binding/Makefile +navit/binding/python/Makefile +navit/binding/dbus/Makefile +navit/binding/win32/Makefile +navit/map/Makefile +navit/map/mg/Makefile +navit/map/textfile/Makefile +navit/map/csv/Makefile +navit/map/shapefile/Makefile +navit/map/filter/Makefile +navit/map/binfile/Makefile +navit/map/garmin/Makefile +navit/maptool/Makefile +navit/fib-1.1/Makefile +navit/font/Makefile +navit/font/freetype/Makefile +navit/fonts/Makefile +navit/graphics/Makefile +navit/graphics/android/Makefile +navit/graphics/gd/Makefile +navit/graphics/gtk_drawing_area/Makefile +navit/graphics/opengl/Makefile +navit/graphics/null/Makefile +navit/graphics/sdl/Makefile +navit/graphics/qt_qpainter/Makefile +navit/graphics/win32/Makefile +navit/gui/Makefile +navit/gui/gtk/Makefile +navit/gui/internal/Makefile +navit/gui/win32/Makefile +navit/gui/qml/Makefile +navit/gui/qml/skins/Makefile +navit/gui/qml/skins/navit/Makefile +navit/osd/Makefile +navit/osd/core/Makefile +navit/plugin/Makefile +navit/plugin/pedestrian/Makefile +navit/speech/Makefile +navit/speech/android/Makefile +navit/speech/cmdline/Makefile +navit/speech/dbus/Makefile +navit/speech/espeak/Makefile +navit/speech/speech_dispatcher/Makefile +navit/support/Makefile +navit/support/espeak/Makefile +navit/support/ezxml/Makefile +navit/support/glib/Makefile +navit/support/libc/Makefile +navit/support/libpng/Makefile +navit/support/shapefile/Makefile +navit/support/win32/Makefile +navit/support/wordexp/Makefile +navit/support/zlib/Makefile +navit/vehicle/Makefile +navit/vehicle/android/Makefile +navit/vehicle/file/Makefile +navit/vehicle/gpsd/Makefile +navit/vehicle/gpsd_dbus/Makefile +navit/vehicle/gypsy/Makefile +navit/vehicle/maemo/Makefile +navit/vehicle/null/Makefile +navit/vehicle/demo/Makefile +navit/vehicle/wince/Makefile +navit/vehicle/iphone/Makefile +navit/vehicle/webos/Makefile +navit/xpm/Makefile +navit/maps/Makefile +intl/Makefile +po/Makefile +man/Makefile +]) +#src/data/garmin_img/Makefile + +AC_OUTPUT + + +echo "" +echo "" +echo "Summary of your installation :" +# FIXME : maybe elaborate missing dependencies +if test x"$graphics_sdl" != xyes + then + sdl_failures="(libsdl maybe?) " +fi +if test x"$glut" != xyes + then + sdl_failures=$sdl_failures"glut " +fi +if test x"$glc" != xyes + then + sdl_failures=$sdl_failures"quesoglc " +fi +if test -z "$sdl_failures" + then + echo "OpenGL gui : ENABLED, with $CEGUI_LIBS" + else + echo "OpenGL gui : DISABLED : you are missing $sdl_failures" +fi +if test x"$enable_hildon" = xyes + then + echo "Maemo/Hildon: ENABLED" + else + echo "Maemo/Hildon: DISABLED" +fi +if test x"$enable_osso" = xyes + then + echo "Maemo/OSSO: ENABLED" + else + echo "Maemo/OSSO: DISABLED" +fi +if test x"${USE_GARMIN}" = xyes + then + if test "x$use_libgarmin" = "xyes" + then + echo "Garmin IMG : ENABLED" + else + echo "Garmin IMG : DISABLED (you don't have libgarmin)" + fi + else + echo "Garmin IMG : DISABLED (you requested it)" +fi + +if test x"$LIBINTL" = "x" ;then + nls_libs="system gettext support" +else + nls_libs="$LIBINTL" +fi +echo "Plugins: $plugins ($plugins_reason)" +echo "Postgresql: $postgresql ($postgresql_reason)" +echo "Samplemap: $samplemap ($samplemap_reason)" +echo "NLS Support: $enable_nls ($nls_libs)" +echo "Routing: $routing ($routing_reason)" +echo "Font renderers:" +echo " freetype: $font_freetype ($font_freetype_reason)" +echo " FriBidi enabled: $fribidi ($fribidi_reason)" + +echo "Graphics types: $graphics ($graphics_reason)" +echo " android: $graphics_android ($graphics_android_reason)" +echo " gtk_drawing_area: $graphics_gtk_drawing_area ($graphics_gtk_drawing_area_reason)" +echo " null: $graphics_null ($graphics_null_reason)" +echo " qt_qpainter: $graphics_qt_qpainter ($graphics_qt_qpainter_reason)" +echo " win32: $graphics_win32 ($graphics_win32_reason)" +echo " OpenGL: $graphics_opengl ($graphics_opengl_reason)" +echo " gd: $graphics_gd ($graphics_gd_reason)" +echo " sdl: $graphics_sdl ($graphics_sdl_reason)" + +echo "GUI types:" +echo " gtk: $gui_gtk ($gui_gtk_reason)" +echo " internal: $gui_internal ($gui_internal_reason)" +echo " win32: $gui_win32 ($gui_win32_reason)" +echo " qml: $gui_qml ($gui_qml_reason)" + +echo "Map types:" +echo " binfile: $map_binfile ($map_binfile_reason)" +echo " filter: $map_filter ($map_filter_reason)" +echo " mg: $map_mg ($map_mg_reason)" +echo " shapefile: $map_shapefile ($map_shapefile_reason)" +echo " textfile: $map_textfile ($map_textfile_reason)" +echo " csv: $map_csv ($map_csv_reason)" + + +echo "Bindings:" +echo " dbus: $binding_dbus ($binding_dbus_reason)" +echo " python: $binding_python ($binding_python_reason)" + +echo "OSD types:" +echo " core: $osd_core ($osd_core_reason)" + +echo "Plugins:" +echo " pedestrian: $plugin_pedestrian ($plugin_pedestrian_reason)" + +echo "Speech types:" +echo " android: $speech_android ($speech_android_reason)" +echo " cmdline: $speech_cmdline ($speech_cmdline_reason)" +echo " dbus: $speech_dbus ($speech_dbus_reason)" +echo " espeak: $speech_espeak ($speech_espeak_reason)" +echo " speech_dispatcher: $speech_speech_dispatcher ($speech_speech_dispatcher_reason)" + +echo "Vehicle types:" +echo " android: $vehicle_android ($vehicle_android_reason)" +echo " demo: $vehicle_demo ($vehicle_demo_reason)" +echo " file: $vehicle_file ($vehicle_file_reason)" +echo " gpsd: $vehicle_gpsd ($vehicle_gpsd_reason)" +echo " gpsd_dbus: $vehicle_gpsd_dbus ($vehicle_gpsd_dbus_reason)" +echo " gypsy: $vehicle_gypsy ($vehicle_gypsy_reason)" +echo " maemo: $vehicle_maemo ($vehicle_maemo_reason)" +echo " null: $vehicle_null ($vehicle_null_reason)" +echo " wince: $vehicle_wince ($vehicle_wince_reason)" +echo " iphone: $vehicle_iphone ($vehicle_iphone_reason)" +echo " webos: $vehicle_webos ($vehicle_webos_reason)" + +if test "x${gtk2_pkgconfig}" != "xyes" -a "x${gui_win32}" != "xyes" -a "x${gui_internal}" != "xyes" -a "x${gui_qml}" != "xyes" +then + echo "" + echo "" + echo "*** WARNING! you have no gui that can be built! ***" + echo "Please install the dependency for at least gtk or sdl gui" + echo "For more details, see the wiki at http://wiki.navit-project.org/" + echo "" +fi + diff --git a/depcomp b/depcomp new file mode 100755 index 0000000..df8eea7 --- /dev/null +++ b/depcomp @@ -0,0 +1,630 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free +# Software Foundation, Inc. + +# 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; either version 2, or (at your option) +# any later version. + +# 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u="sed s,\\\\\\\\,/,g" + depmode=msvisualcpp +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> "$depfile" + echo >> "$depfile" + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add `dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/install-sh b/install-sh new file mode 100755 index 0000000..6781b98 --- /dev/null +++ b/install-sh @@ -0,0 +1,520 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2009-04-28.21; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + trap '(exit $?); exit' 1 2 13 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dst_arg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + -*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/intl/ChangeLog b/intl/ChangeLog new file mode 100644 index 0000000..7512919 --- /dev/null +++ b/intl/ChangeLog @@ -0,0 +1,4 @@ +2004-01-29 GNU + + * Version 0.14.1 released. + diff --git a/intl/Makefile.in b/intl/Makefile.in new file mode 100644 index 0000000..05f1532 --- /dev/null +++ b/intl/Makefile.in @@ -0,0 +1,493 @@ +# Makefile for directory with message catalog handling library of GNU gettext +# Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = /bin/sh + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +top_builddir = .. +VPATH = $(srcdir) + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +transform = @program_transform_name@ +libdir = @libdir@ +includedir = @includedir@ +datadir = @datadir@ +localedir = $(datadir)/locale +gettextsrcdir = $(datadir)/gettext/intl +aliaspath = $(localedir) +subdir = intl + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +mkinstalldirs = $(SHELL) $(MKINSTALLDIRS) + +l = @INTL_LIBTOOL_SUFFIX_PREFIX@ + +AR = ar +CC = @CC@ +LIBTOOL = @LIBTOOL@ +RANLIB = @RANLIB@ +YACC = @INTLBISON@ -y -d +YFLAGS = --name-prefix=__gettext + +DEFS = -DLOCALEDIR=\"$(localedir)\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \ +-DLIBDIR=\"$(libdir)\" -DIN_LIBINTL \ +-DENABLE_RELOCATABLE=1 -DIN_LIBRARY -DINSTALLDIR=\"$(libdir)\" -DNO_XMALLOC \ +-Dset_relocation_prefix=libintl_set_relocation_prefix \ +-Drelocate=libintl_relocate \ +-DDEPENDS_ON_LIBICONV=1 @DEFS@ +CPPFLAGS = @CPPFLAGS@ +CFLAGS = @CFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ + +COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) + +HEADERS = \ + gmo.h \ + gettextP.h \ + hash-string.h \ + loadinfo.h \ + plural-exp.h \ + eval-plural.h \ + localcharset.h \ + relocatable.h \ + xsize.h \ + printf-args.h printf-args.c \ + printf-parse.h wprintf-parse.h printf-parse.c \ + vasnprintf.h vasnwprintf.h vasnprintf.c \ + os2compat.h \ + libgnuintl.h.in +SOURCES = \ + bindtextdom.c \ + dcgettext.c \ + dgettext.c \ + gettext.c \ + finddomain.c \ + loadmsgcat.c \ + localealias.c \ + textdomain.c \ + l10nflist.c \ + explodename.c \ + dcigettext.c \ + dcngettext.c \ + dngettext.c \ + ngettext.c \ + plural.y \ + plural-exp.c \ + localcharset.c \ + relocatable.c \ + localename.c \ + log.c \ + printf.c \ + osdep.c \ + os2compat.c \ + intl-compat.c +OBJECTS = \ + bindtextdom.$lo \ + dcgettext.$lo \ + dgettext.$lo \ + gettext.$lo \ + finddomain.$lo \ + loadmsgcat.$lo \ + localealias.$lo \ + textdomain.$lo \ + l10nflist.$lo \ + explodename.$lo \ + dcigettext.$lo \ + dcngettext.$lo \ + dngettext.$lo \ + ngettext.$lo \ + plural.$lo \ + plural-exp.$lo \ + localcharset.$lo \ + relocatable.$lo \ + localename.$lo \ + log.$lo \ + printf.$lo \ + osdep.$lo \ + intl-compat.$lo +DISTFILES.common = Makefile.in \ +config.charset locale.alias ref-add.sin ref-del.sin $(HEADERS) $(SOURCES) +DISTFILES.generated = plural.c +DISTFILES.normal = VERSION +DISTFILES.gettext = COPYING.LIB-2.0 COPYING.LIB-2.1 libintl.glibc \ +libgnuintl.h_vms Makefile.vms \ +libgnuintl.h.msvc-static libgnuintl.h.msvc-shared README.woe32 Makefile.msvc +DISTFILES.obsolete = xopen-msg.sed linux-msg.sed po2tbl.sed.in cat-compat.c \ +COPYING.LIB-2 gettext.h libgettext.h plural-eval.c libgnuintl.h + +all: all-@USE_INCLUDED_LIBINTL@ +all-yes: libintl.$la libintl.h charset.alias ref-add.sed ref-del.sed +all-no: all-no-@BUILD_INCLUDED_LIBINTL@ +all-no-yes: libgnuintl.$la +all-no-no: + +libintl.a libgnuintl.a: $(OBJECTS) + rm -f $@ + $(AR) cru $@ $(OBJECTS) + $(RANLIB) $@ + +libintl.la libgnuintl.la: $(OBJECTS) + $(LIBTOOL) --mode=link \ + $(CC) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ \ + $(OBJECTS) @LTLIBICONV@ $(LIBS) -lc \ + -version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \ + -rpath $(libdir) \ + -no-undefined + +# Libtool's library version information for libintl. +# Before making a gettext release, the gettext maintainer must change this +# according to the libtool documentation, section "Library interface versions". +# Maintainers of other packages that include the intl directory must *not* +# change these values. +LTV_CURRENT=7 +LTV_REVISION=0 +LTV_AGE=4 + +.SUFFIXES: +.SUFFIXES: .c .y .o .lo .sin .sed + +.c.o: + $(COMPILE) $< + +.y.c: + $(YACC) $(YFLAGS) --output $@ $< + rm -f $*.h + +bindtextdom.lo: $(srcdir)/bindtextdom.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/bindtextdom.c +dcgettext.lo: $(srcdir)/dcgettext.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcgettext.c +dgettext.lo: $(srcdir)/dgettext.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dgettext.c +gettext.lo: $(srcdir)/gettext.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/gettext.c +finddomain.lo: $(srcdir)/finddomain.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/finddomain.c +loadmsgcat.lo: $(srcdir)/loadmsgcat.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/loadmsgcat.c +localealias.lo: $(srcdir)/localealias.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localealias.c +textdomain.lo: $(srcdir)/textdomain.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/textdomain.c +l10nflist.lo: $(srcdir)/l10nflist.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/l10nflist.c +explodename.lo: $(srcdir)/explodename.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/explodename.c +dcigettext.lo: $(srcdir)/dcigettext.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcigettext.c +dcngettext.lo: $(srcdir)/dcngettext.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcngettext.c +dngettext.lo: $(srcdir)/dngettext.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dngettext.c +ngettext.lo: $(srcdir)/ngettext.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/ngettext.c +plural.lo: $(srcdir)/plural.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural.c +plural-exp.lo: $(srcdir)/plural-exp.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural-exp.c +localcharset.lo: $(srcdir)/localcharset.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localcharset.c +relocatable.lo: $(srcdir)/relocatable.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/relocatable.c +localename.lo: $(srcdir)/localename.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localename.c +log.lo: $(srcdir)/log.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/log.c +printf.lo: $(srcdir)/printf.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/printf.c +osdep.lo: $(srcdir)/osdep.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/osdep.c +intl-compat.lo: $(srcdir)/intl-compat.c + $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/intl-compat.c + +ref-add.sed: $(srcdir)/ref-add.sin + sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-add.sin > t-ref-add.sed + mv t-ref-add.sed ref-add.sed +ref-del.sed: $(srcdir)/ref-del.sin + sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-del.sin > t-ref-del.sed + mv t-ref-del.sed ref-del.sed + +INCLUDES = -I. -I$(srcdir) -I.. + +libgnuintl.h: $(srcdir)/libgnuintl.h.in + sed -e 's,@''HAVE_POSIX_PRINTF''@,@HAVE_POSIX_PRINTF@,g' \ + -e 's,@''HAVE_ASPRINTF''@,@HAVE_ASPRINTF@,g' \ + -e 's,@''HAVE_SNPRINTF''@,@HAVE_SNPRINTF@,g' \ + -e 's,@''HAVE_WPRINTF''@,@HAVE_WPRINTF@,g' \ + < $(srcdir)/libgnuintl.h.in > libgnuintl.h + +libintl.h: libgnuintl.h + cp libgnuintl.h libintl.h + +charset.alias: $(srcdir)/config.charset + $(SHELL) $(srcdir)/config.charset '@host@' > t-$@ + mv t-$@ $@ + +check: all + +# We must not install the libintl.h/libintl.a files if we are on a +# system which has the GNU gettext() function in its C library or in a +# separate library. +# If you want to use the one which comes with this version of the +# package, you have to use `configure --with-included-gettext'. +install: install-exec install-data +install-exec: all + if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \ + && test '@USE_INCLUDED_LIBINTL@' = yes; then \ + $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \ + $(INSTALL_DATA) libintl.h $(DESTDIR)$(includedir)/libintl.h; \ + $(LIBTOOL) --mode=install \ + $(INSTALL_DATA) libintl.$la $(DESTDIR)$(libdir)/libintl.$la; \ + if test "@RELOCATABLE@" = yes; then \ + dependencies=`sed -n -e 's,^dependency_libs=\(.*\),\1,p' < $(DESTDIR)$(libdir)/libintl.la | sed -e "s,^',," -e "s,'\$$,,"`; \ + if test -n "$$dependencies"; then \ + rm -f $(DESTDIR)$(libdir)/libintl.la; \ + fi; \ + fi; \ + else \ + : ; \ + fi + if test "$(PACKAGE)" = "gettext-tools" \ + && test '@USE_INCLUDED_LIBINTL@' = no; then \ + $(mkinstalldirs) $(DESTDIR)$(libdir); \ + $(LIBTOOL) --mode=install \ + $(INSTALL_DATA) libgnuintl.$la $(DESTDIR)$(libdir)/libgnuintl.$la; \ + rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \ + $(INSTALL_DATA) $(DESTDIR)$(libdir)/libgnuintl.so $(DESTDIR)$(libdir)/preloadable_libintl.so; \ + $(LIBTOOL) --mode=uninstall \ + rm -f $(DESTDIR)$(libdir)/libgnuintl.$la; \ + else \ + : ; \ + fi + if test '@USE_INCLUDED_LIBINTL@' = yes; then \ + test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \ + temp=$(DESTDIR)$(libdir)/t-charset.alias; \ + dest=$(DESTDIR)$(libdir)/charset.alias; \ + if test -f $(DESTDIR)$(libdir)/charset.alias; then \ + orig=$(DESTDIR)$(libdir)/charset.alias; \ + sed -f ref-add.sed $$orig > $$temp; \ + $(INSTALL_DATA) $$temp $$dest; \ + rm -f $$temp; \ + else \ + if test @GLIBC21@ = no; then \ + orig=charset.alias; \ + sed -f ref-add.sed $$orig > $$temp; \ + $(INSTALL_DATA) $$temp $$dest; \ + rm -f $$temp; \ + fi; \ + fi; \ + $(mkinstalldirs) $(DESTDIR)$(localedir); \ + test -f $(DESTDIR)$(localedir)/locale.alias \ + && orig=$(DESTDIR)$(localedir)/locale.alias \ + || orig=$(srcdir)/locale.alias; \ + temp=$(DESTDIR)$(localedir)/t-locale.alias; \ + dest=$(DESTDIR)$(localedir)/locale.alias; \ + sed -f ref-add.sed $$orig > $$temp; \ + $(INSTALL_DATA) $$temp $$dest; \ + rm -f $$temp; \ + else \ + : ; \ + fi +install-data: all + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + $(INSTALL_DATA) VERSION $(DESTDIR)$(gettextsrcdir)/VERSION; \ + $(INSTALL_DATA) ChangeLog.inst $(DESTDIR)$(gettextsrcdir)/ChangeLog; \ + dists="COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common)"; \ + for file in $$dists; do \ + $(INSTALL_DATA) $(srcdir)/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + chmod a+x $(DESTDIR)$(gettextsrcdir)/config.charset; \ + dists="$(DISTFILES.generated)"; \ + for file in $$dists; do \ + if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ + $(INSTALL_DATA) $$dir/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + dists="$(DISTFILES.obsolete)"; \ + for file in $$dists; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi + +install-strip: install + +installdirs: + if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \ + && test '@USE_INCLUDED_LIBINTL@' = yes; then \ + $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \ + else \ + : ; \ + fi + if test "$(PACKAGE)" = "gettext-tools" \ + && test '@USE_INCLUDED_LIBINTL@' = no; then \ + $(mkinstalldirs) $(DESTDIR)$(libdir); \ + else \ + : ; \ + fi + if test '@USE_INCLUDED_LIBINTL@' = yes; then \ + test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \ + $(mkinstalldirs) $(DESTDIR)$(localedir); \ + else \ + : ; \ + fi + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + else \ + : ; \ + fi + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: + if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \ + && test '@USE_INCLUDED_LIBINTL@' = yes; then \ + rm -f $(DESTDIR)$(includedir)/libintl.h; \ + $(LIBTOOL) --mode=uninstall \ + rm -f $(DESTDIR)$(libdir)/libintl.$la; \ + else \ + : ; \ + fi + if test "$(PACKAGE)" = "gettext-tools" \ + && test '@USE_INCLUDED_LIBINTL@' = no; then \ + rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \ + else \ + : ; \ + fi + if test '@USE_INCLUDED_LIBINTL@' = yes; then \ + if test -f $(DESTDIR)$(libdir)/charset.alias; then \ + temp=$(DESTDIR)$(libdir)/t-charset.alias; \ + dest=$(DESTDIR)$(libdir)/charset.alias; \ + sed -f ref-del.sed $$dest > $$temp; \ + if grep '^# Packages using this file: $$' $$temp > /dev/null; then \ + rm -f $$dest; \ + else \ + $(INSTALL_DATA) $$temp $$dest; \ + fi; \ + rm -f $$temp; \ + fi; \ + if test -f $(DESTDIR)$(localedir)/locale.alias; then \ + temp=$(DESTDIR)$(localedir)/t-locale.alias; \ + dest=$(DESTDIR)$(localedir)/locale.alias; \ + sed -f ref-del.sed $$dest > $$temp; \ + if grep '^# Packages using this file: $$' $$temp > /dev/null; then \ + rm -f $$dest; \ + else \ + $(INSTALL_DATA) $$temp $$dest; \ + fi; \ + rm -f $$temp; \ + fi; \ + else \ + : ; \ + fi + if test "$(PACKAGE)" = "gettext-tools"; then \ + for file in VERSION ChangeLog COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common) $(DISTFILES.generated); do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi + +info dvi ps pdf html: + +$(OBJECTS): ../config.h libgnuintl.h +bindtextdom.$lo dcgettext.$lo dcigettext.$lo dcngettext.$lo dgettext.$lo dngettext.$lo finddomain.$lo gettext.$lo intl-compat.$lo loadmsgcat.$lo localealias.$lo ngettext.$lo textdomain.$lo: $(srcdir)/gettextP.h $(srcdir)/gmo.h $(srcdir)/loadinfo.h +dcigettext.$lo loadmsgcat.$lo: $(srcdir)/hash-string.h +explodename.$lo l10nflist.$lo: $(srcdir)/loadinfo.h +dcigettext.$lo loadmsgcat.$lo plural.$lo plural-exp.$lo: $(srcdir)/plural-exp.h +dcigettext.$lo: $(srcdir)/eval-plural.h +localcharset.$lo: $(srcdir)/localcharset.h +localealias.$lo localcharset.$lo relocatable.$lo: $(srcdir)/relocatable.h +printf.$lo: $(srcdir)/printf-args.h $(srcdir)/printf-args.c $(srcdir)/printf-parse.h $(srcdir)/wprintf-parse.h $(srcdir)/xsize.h $(srcdir)/printf-parse.c $(srcdir)/vasnprintf.h $(srcdir)/vasnwprintf.h $(srcdir)/vasnprintf.c + +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) + here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES) + +ctags: CTAGS + +CTAGS: $(HEADERS) $(SOURCES) + here=`pwd`; cd $(srcdir) && ctags -o $$here/CTAGS $(HEADERS) $(SOURCES) + +id: ID + +ID: $(HEADERS) $(SOURCES) + here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES) + + +mostlyclean: + rm -f *.a *.la *.o *.obj *.lo core core.* + rm -f libgnuintl.h libintl.h charset.alias ref-add.sed ref-del.sed + rm -f -r .libs _libs + +clean: mostlyclean + +distclean: clean + rm -f Makefile ID TAGS + if test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; then \ + rm -f ChangeLog.inst $(DISTFILES.normal); \ + else \ + : ; \ + fi + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + + +# GNU gettext needs not contain the file `VERSION' but contains some +# other files which should not be distributed in other packages. +distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: Makefile + if test "$(PACKAGE)" = "gettext-tools"; then \ + : ; \ + else \ + if test "$(PACKAGE)" = "gettext-runtime"; then \ + additional="$(DISTFILES.gettext)"; \ + else \ + additional="$(DISTFILES.normal)"; \ + fi; \ + $(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \ + for file in ChangeLog $(DISTFILES.common) $(DISTFILES.generated) $$additional; do \ + if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ + cp -p $$dir/$$file $(distdir); \ + done; \ + fi + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status +# This would be more efficient, but doesn't work any more with autoconf-2.57, +# when AC_CONFIG_FILES([intl/Makefile:somedir/Makefile.in]) is used. +# cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/intl/VERSION b/intl/VERSION new file mode 100644 index 0000000..b4b846c --- /dev/null +++ b/intl/VERSION @@ -0,0 +1 @@ +GNU gettext library from gettext-0.14.1 diff --git a/intl/bindtextdom.c b/intl/bindtextdom.c new file mode 100644 index 0000000..dcdc400 --- /dev/null +++ b/intl/bindtextdom.c @@ -0,0 +1,363 @@ +/* Implementation of the bindtextdomain(3) function + Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif +#include "gettextP.h" + +#ifdef _LIBC +/* We have to handle multi-threaded applications. */ +# include +#else +/* Provide dummy implementation if this is outside glibc. */ +# define __libc_rwlock_define(CLASS, NAME) +# define __libc_rwlock_wrlock(NAME) +# define __libc_rwlock_unlock(NAME) +#endif + +/* The internal variables in the standalone libintl.a must have different + names than the internal variables in GNU libc, otherwise programs + using libintl.a cannot be linked statically. */ +#if !defined _LIBC +# define _nl_default_dirname libintl_nl_default_dirname +# define _nl_domain_bindings libintl_nl_domain_bindings +#endif + +/* Some compilers, like SunOS4 cc, don't have offsetof in . */ +#ifndef offsetof +# define offsetof(type,ident) ((size_t)&(((type*)0)->ident)) +#endif + +/* @@ end of prolog @@ */ + +/* Contains the default location of the message catalogs. */ +extern const char _nl_default_dirname[]; +#ifdef _LIBC +extern const char _nl_default_dirname_internal[] attribute_hidden; +#else +# define INTUSE(name) name +#endif + +/* List with bindings of specific domains. */ +extern struct binding *_nl_domain_bindings; + +/* Lock variable to protect the global data in the gettext implementation. */ +__libc_rwlock_define (extern, _nl_state_lock attribute_hidden) + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define BINDTEXTDOMAIN __bindtextdomain +# define BIND_TEXTDOMAIN_CODESET __bind_textdomain_codeset +# ifndef strdup +# define strdup(str) __strdup (str) +# endif +#else +# define BINDTEXTDOMAIN libintl_bindtextdomain +# define BIND_TEXTDOMAIN_CODESET libintl_bind_textdomain_codeset +#endif + +/* Specifies the directory name *DIRNAMEP and the output codeset *CODESETP + to be used for the DOMAINNAME message catalog. + If *DIRNAMEP or *CODESETP is NULL, the corresponding attribute is not + modified, only the current value is returned. + If DIRNAMEP or CODESETP is NULL, the corresponding attribute is neither + modified nor returned. */ +static void +set_binding_values (const char *domainname, + const char **dirnamep, const char **codesetp) +{ + struct binding *binding; + int modified; + + /* Some sanity checks. */ + if (domainname == NULL || domainname[0] == '\0') + { + if (dirnamep) + *dirnamep = NULL; + if (codesetp) + *codesetp = NULL; + return; + } + + __libc_rwlock_wrlock (_nl_state_lock); + + modified = 0; + + for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) + { + int compare = strcmp (domainname, binding->domainname); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It is not in the list. */ + binding = NULL; + break; + } + } + + if (binding != NULL) + { + if (dirnamep) + { + const char *dirname = *dirnamep; + + if (dirname == NULL) + /* The current binding has be to returned. */ + *dirnamep = binding->dirname; + else + { + /* The domain is already bound. If the new value and the old + one are equal we simply do nothing. Otherwise replace the + old binding. */ + char *result = binding->dirname; + if (strcmp (dirname, result) != 0) + { + if (strcmp (dirname, INTUSE(_nl_default_dirname)) == 0) + result = (char *) INTUSE(_nl_default_dirname); + else + { +#if defined _LIBC || defined HAVE_STRDUP + result = strdup (dirname); +#else + size_t len = strlen (dirname) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result != NULL, 1)) + memcpy (result, dirname, len); +#endif + } + + if (__builtin_expect (result != NULL, 1)) + { + if (binding->dirname != INTUSE(_nl_default_dirname)) + free (binding->dirname); + + binding->dirname = result; + modified = 1; + } + } + *dirnamep = result; + } + } + + if (codesetp) + { + const char *codeset = *codesetp; + + if (codeset == NULL) + /* The current binding has be to returned. */ + *codesetp = binding->codeset; + else + { + /* The domain is already bound. If the new value and the old + one are equal we simply do nothing. Otherwise replace the + old binding. */ + char *result = binding->codeset; + if (result == NULL || strcmp (codeset, result) != 0) + { +#if defined _LIBC || defined HAVE_STRDUP + result = strdup (codeset); +#else + size_t len = strlen (codeset) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result != NULL, 1)) + memcpy (result, codeset, len); +#endif + + if (__builtin_expect (result != NULL, 1)) + { + if (binding->codeset != NULL) + free (binding->codeset); + + binding->codeset = result; + binding->codeset_cntr++; + modified = 1; + } + } + *codesetp = result; + } + } + } + else if ((dirnamep == NULL || *dirnamep == NULL) + && (codesetp == NULL || *codesetp == NULL)) + { + /* Simply return the default values. */ + if (dirnamep) + *dirnamep = INTUSE(_nl_default_dirname); + if (codesetp) + *codesetp = NULL; + } + else + { + /* We have to create a new binding. */ + size_t len = strlen (domainname) + 1; + struct binding *new_binding = + (struct binding *) malloc (offsetof (struct binding, domainname) + len); + + if (__builtin_expect (new_binding == NULL, 0)) + goto failed; + + memcpy (new_binding->domainname, domainname, len); + + if (dirnamep) + { + const char *dirname = *dirnamep; + + if (dirname == NULL) + /* The default value. */ + dirname = INTUSE(_nl_default_dirname); + else + { + if (strcmp (dirname, INTUSE(_nl_default_dirname)) == 0) + dirname = INTUSE(_nl_default_dirname); + else + { + char *result; +#if defined _LIBC || defined HAVE_STRDUP + result = strdup (dirname); + if (__builtin_expect (result == NULL, 0)) + goto failed_dirname; +#else + size_t len = strlen (dirname) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result == NULL, 0)) + goto failed_dirname; + memcpy (result, dirname, len); +#endif + dirname = result; + } + } + *dirnamep = dirname; + new_binding->dirname = (char *) dirname; + } + else + /* The default value. */ + new_binding->dirname = (char *) INTUSE(_nl_default_dirname); + + new_binding->codeset_cntr = 0; + + if (codesetp) + { + const char *codeset = *codesetp; + + if (codeset != NULL) + { + char *result; + +#if defined _LIBC || defined HAVE_STRDUP + result = strdup (codeset); + if (__builtin_expect (result == NULL, 0)) + goto failed_codeset; +#else + size_t len = strlen (codeset) + 1; + result = (char *) malloc (len); + if (__builtin_expect (result == NULL, 0)) + goto failed_codeset; + memcpy (result, codeset, len); +#endif + codeset = result; + new_binding->codeset_cntr++; + } + *codesetp = codeset; + new_binding->codeset = (char *) codeset; + } + else + new_binding->codeset = NULL; + + /* Now enqueue it. */ + if (_nl_domain_bindings == NULL + || strcmp (domainname, _nl_domain_bindings->domainname) < 0) + { + new_binding->next = _nl_domain_bindings; + _nl_domain_bindings = new_binding; + } + else + { + binding = _nl_domain_bindings; + while (binding->next != NULL + && strcmp (domainname, binding->next->domainname) > 0) + binding = binding->next; + + new_binding->next = binding->next; + binding->next = new_binding; + } + + modified = 1; + + /* Here we deal with memory allocation failures. */ + if (0) + { + failed_codeset: + if (new_binding->dirname != INTUSE(_nl_default_dirname)) + free (new_binding->dirname); + failed_dirname: + free (new_binding); + failed: + if (dirnamep) + *dirnamep = NULL; + if (codesetp) + *codesetp = NULL; + } + } + + /* If we modified any binding, we flush the caches. */ + if (modified) + ++_nl_msg_cat_cntr; + + __libc_rwlock_unlock (_nl_state_lock); +} + +/* Specify that the DOMAINNAME message catalog will be found + in DIRNAME rather than in the system locale data base. */ +char * +BINDTEXTDOMAIN (const char *domainname, const char *dirname) +{ + set_binding_values (domainname, &dirname, NULL); + return (char *) dirname; +} + +/* Specify the character encoding in which the messages from the + DOMAINNAME message catalog will be returned. */ +char * +BIND_TEXTDOMAIN_CODESET (const char *domainname, const char *codeset) +{ + set_binding_values (domainname, NULL, &codeset); + return (char *) codeset; +} + +#ifdef _LIBC +/* Aliases for function names in GNU C Library. */ +weak_alias (__bindtextdomain, bindtextdomain); +weak_alias (__bind_textdomain_codeset, bind_textdomain_codeset); +#endif diff --git a/intl/config.charset b/intl/config.charset new file mode 100755 index 0000000..43d45fb --- /dev/null +++ b/intl/config.charset @@ -0,0 +1,608 @@ +#! /bin/sh +# Output a system dependent table of character encoding aliases. +# +# Copyright (C) 2000-2004 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# +# The table consists of lines of the form +# ALIAS CANONICAL +# +# ALIAS is the (system dependent) result of "nl_langinfo (CODESET)". +# ALIAS is compared in a case sensitive way. +# +# CANONICAL is the GNU canonical name for this character encoding. +# It must be an encoding supported by libiconv. Support by GNU libc is +# also desirable. CANONICAL is case insensitive. Usually an upper case +# MIME charset name is preferred. +# The current list of GNU canonical charset names is as follows. +# +# name MIME? used by which systems +# ASCII, ANSI_X3.4-1968 glibc solaris freebsd darwin +# ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd darwin +# ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd darwin +# ISO-8859-3 Y glibc solaris +# ISO-8859-4 Y osf solaris freebsd darwin +# ISO-8859-5 Y glibc aix hpux irix osf solaris freebsd darwin +# ISO-8859-6 Y glibc aix hpux solaris +# ISO-8859-7 Y glibc aix hpux irix osf solaris +# ISO-8859-8 Y glibc aix hpux osf solaris +# ISO-8859-9 Y glibc aix hpux irix osf solaris +# ISO-8859-13 glibc +# ISO-8859-14 glibc +# ISO-8859-15 glibc aix osf solaris freebsd +# KOI8-R Y glibc solaris freebsd darwin +# KOI8-U Y glibc freebsd darwin +# KOI8-T glibc +# CP437 dos +# CP775 dos +# CP850 aix osf dos +# CP852 dos +# CP855 dos +# CP856 aix +# CP857 dos +# CP861 dos +# CP862 dos +# CP864 dos +# CP865 dos +# CP866 freebsd darwin dos +# CP869 dos +# CP874 woe32 dos +# CP922 aix +# CP932 aix woe32 dos +# CP943 aix +# CP949 osf woe32 dos +# CP950 woe32 dos +# CP1046 aix +# CP1124 aix +# CP1125 dos +# CP1129 aix +# CP1250 woe32 +# CP1251 glibc solaris darwin woe32 +# CP1252 aix woe32 +# CP1253 woe32 +# CP1254 woe32 +# CP1255 glibc woe32 +# CP1256 woe32 +# CP1257 woe32 +# GB2312 Y glibc aix hpux irix solaris freebsd darwin +# EUC-JP Y glibc aix hpux irix osf solaris freebsd darwin +# EUC-KR Y glibc aix hpux irix osf solaris freebsd darwin +# EUC-TW glibc aix hpux irix osf solaris +# BIG5 Y glibc aix hpux osf solaris freebsd darwin +# BIG5-HKSCS glibc solaris +# GBK glibc aix osf solaris woe32 dos +# GB18030 glibc solaris +# SHIFT_JIS Y hpux osf solaris freebsd darwin +# JOHAB glibc solaris woe32 +# TIS-620 glibc aix hpux osf solaris +# VISCII Y glibc +# TCVN5712-1 glibc +# GEORGIAN-PS glibc +# HP-ROMAN8 hpux +# HP-ARABIC8 hpux +# HP-GREEK8 hpux +# HP-HEBREW8 hpux +# HP-TURKISH8 hpux +# HP-KANA8 hpux +# DEC-KANJI osf +# DEC-HANYU osf +# UTF-8 Y glibc aix hpux osf solaris +# +# Note: Names which are not marked as being a MIME name should not be used in +# Internet protocols for information interchange (mail, news, etc.). +# +# Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications +# must understand both names and treat them as equivalent. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM + +host="$1" +os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'` +echo "# This file contains a table of character encoding aliases," +echo "# suitable for operating system '${os}'." +echo "# It was automatically generated from config.charset." +# List of references, updated during installation: +echo "# Packages using this file: " +case "$os" in + linux-gnulibc1*) + # Linux libc5 doesn't have nl_langinfo(CODESET); therefore + # localcharset.c falls back to using the full locale name + # from the environment variables. + echo "C ASCII" + echo "POSIX ASCII" + for l in af af_ZA ca ca_ES da da_DK de de_AT de_BE de_CH de_DE de_LU \ + en en_AU en_BW en_CA en_DK en_GB en_IE en_NZ en_US en_ZA \ + en_ZW es es_AR es_BO es_CL es_CO es_DO es_EC es_ES es_GT \ + es_HN es_MX es_PA es_PE es_PY es_SV es_US es_UY es_VE et \ + et_EE eu eu_ES fi fi_FI fo fo_FO fr fr_BE fr_CA fr_CH fr_FR \ + fr_LU ga ga_IE gl gl_ES id id_ID in in_ID is is_IS it it_CH \ + it_IT kl kl_GL nl nl_BE nl_NL no no_NO pt pt_BR pt_PT sv \ + sv_FI sv_SE; do + echo "$l ISO-8859-1" + echo "$l.iso-8859-1 ISO-8859-1" + echo "$l.iso-8859-15 ISO-8859-15" + echo "$l.iso-8859-15@euro ISO-8859-15" + echo "$l@euro ISO-8859-15" + echo "$l.cp-437 CP437" + echo "$l.cp-850 CP850" + echo "$l.cp-1252 CP1252" + echo "$l.cp-1252@euro CP1252" + #echo "$l.atari-st ATARI-ST" # not a commonly used encoding + echo "$l.utf-8 UTF-8" + echo "$l.utf-8@euro UTF-8" + done + for l in cs cs_CZ hr hr_HR hu hu_HU pl pl_PL ro ro_RO sk sk_SK sl \ + sl_SI sr sr_CS sr_YU; do + echo "$l ISO-8859-2" + echo "$l.iso-8859-2 ISO-8859-2" + echo "$l.cp-852 CP852" + echo "$l.cp-1250 CP1250" + echo "$l.utf-8 UTF-8" + done + for l in mk mk_MK ru ru_RU; do + echo "$l ISO-8859-5" + echo "$l.iso-8859-5 ISO-8859-5" + echo "$l.koi8-r KOI8-R" + echo "$l.cp-866 CP866" + echo "$l.cp-1251 CP1251" + echo "$l.utf-8 UTF-8" + done + for l in ar ar_SA; do + echo "$l ISO-8859-6" + echo "$l.iso-8859-6 ISO-8859-6" + echo "$l.cp-864 CP864" + #echo "$l.cp-868 CP868" # not a commonly used encoding + echo "$l.cp-1256 CP1256" + echo "$l.utf-8 UTF-8" + done + for l in el el_GR gr gr_GR; do + echo "$l ISO-8859-7" + echo "$l.iso-8859-7 ISO-8859-7" + echo "$l.cp-869 CP869" + echo "$l.cp-1253 CP1253" + echo "$l.cp-1253@euro CP1253" + echo "$l.utf-8 UTF-8" + echo "$l.utf-8@euro UTF-8" + done + for l in he he_IL iw iw_IL; do + echo "$l ISO-8859-8" + echo "$l.iso-8859-8 ISO-8859-8" + echo "$l.cp-862 CP862" + echo "$l.cp-1255 CP1255" + echo "$l.utf-8 UTF-8" + done + for l in tr tr_TR; do + echo "$l ISO-8859-9" + echo "$l.iso-8859-9 ISO-8859-9" + echo "$l.cp-857 CP857" + echo "$l.cp-1254 CP1254" + echo "$l.utf-8 UTF-8" + done + for l in lt lt_LT lv lv_LV; do + #echo "$l BALTIC" # not a commonly used encoding, wrong encoding name + echo "$l ISO-8859-13" + done + for l in ru_UA uk uk_UA; do + echo "$l KOI8-U" + done + for l in zh zh_CN; do + #echo "$l GB_2312-80" # not a commonly used encoding, wrong encoding name + echo "$l GB2312" + done + for l in ja ja_JP ja_JP.EUC; do + echo "$l EUC-JP" + done + for l in ko ko_KR; do + echo "$l EUC-KR" + done + for l in th th_TH; do + echo "$l TIS-620" + done + for l in fa fa_IR; do + #echo "$l ISIRI-3342" # a broken encoding + echo "$l.utf-8 UTF-8" + done + ;; + linux* | *-gnu*) + # With glibc-2.1 or newer, we don't need any canonicalization, + # because glibc has iconv and both glibc and libiconv support all + # GNU canonical names directly. Therefore, the Makefile does not + # need to install the alias file at all. + # The following applies only to glibc-2.0.x and older libcs. + echo "ISO_646.IRV:1983 ASCII" + ;; + aix*) + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-6 ISO-8859-6" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-8 ISO-8859-8" + echo "ISO8859-9 ISO-8859-9" + echo "ISO8859-15 ISO-8859-15" + echo "IBM-850 CP850" + echo "IBM-856 CP856" + echo "IBM-921 ISO-8859-13" + echo "IBM-922 CP922" + echo "IBM-932 CP932" + echo "IBM-943 CP943" + echo "IBM-1046 CP1046" + echo "IBM-1124 CP1124" + echo "IBM-1129 CP1129" + echo "IBM-1252 CP1252" + echo "IBM-eucCN GB2312" + echo "IBM-eucJP EUC-JP" + echo "IBM-eucKR EUC-KR" + echo "IBM-eucTW EUC-TW" + echo "big5 BIG5" + echo "GBK GBK" + echo "TIS-620 TIS-620" + echo "UTF-8 UTF-8" + ;; + hpux*) + echo "iso88591 ISO-8859-1" + echo "iso88592 ISO-8859-2" + echo "iso88595 ISO-8859-5" + echo "iso88596 ISO-8859-6" + echo "iso88597 ISO-8859-7" + echo "iso88598 ISO-8859-8" + echo "iso88599 ISO-8859-9" + echo "iso885915 ISO-8859-15" + echo "roman8 HP-ROMAN8" + echo "arabic8 HP-ARABIC8" + echo "greek8 HP-GREEK8" + echo "hebrew8 HP-HEBREW8" + echo "turkish8 HP-TURKISH8" + echo "kana8 HP-KANA8" + echo "tis620 TIS-620" + echo "big5 BIG5" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + echo "hp15CN GB2312" + #echo "ccdc ?" # what is this? + echo "SJIS SHIFT_JIS" + echo "utf8 UTF-8" + ;; + irix*) + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-9 ISO-8859-9" + echo "eucCN GB2312" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + ;; + osf*) + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-4 ISO-8859-4" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-8 ISO-8859-8" + echo "ISO8859-9 ISO-8859-9" + echo "ISO8859-15 ISO-8859-15" + echo "cp850 CP850" + echo "big5 BIG5" + echo "dechanyu DEC-HANYU" + echo "dechanzi GB2312" + echo "deckanji DEC-KANJI" + echo "deckorean EUC-KR" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + echo "GBK GBK" + echo "KSC5601 CP949" + echo "sdeckanji EUC-JP" + echo "SJIS SHIFT_JIS" + echo "TACTIS TIS-620" + echo "UTF-8 UTF-8" + ;; + solaris*) + echo "646 ASCII" + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-3 ISO-8859-3" + echo "ISO8859-4 ISO-8859-4" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-6 ISO-8859-6" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-8 ISO-8859-8" + echo "ISO8859-9 ISO-8859-9" + echo "ISO8859-15 ISO-8859-15" + echo "koi8-r KOI8-R" + echo "ansi-1251 CP1251" + echo "BIG5 BIG5" + echo "Big5-HKSCS BIG5-HKSCS" + echo "gb2312 GB2312" + echo "GBK GBK" + echo "GB18030 GB18030" + echo "cns11643 EUC-TW" + echo "5601 EUC-KR" + echo "ko_KR.johap92 JOHAB" + echo "eucJP EUC-JP" + echo "PCK SHIFT_JIS" + echo "TIS620.2533 TIS-620" + #echo "sun_eu_greek ?" # what is this? + echo "UTF-8 UTF-8" + ;; + freebsd* | os2*) + # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore + # localcharset.c falls back to using the full locale name + # from the environment variables. + # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just + # reuse FreeBSD's locale data for OS/2. + echo "C ASCII" + echo "US-ASCII ASCII" + for l in la_LN lt_LN; do + echo "$l.ASCII ASCII" + done + for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ + fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \ + lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do + echo "$l.ISO_8859-1 ISO-8859-1" + echo "$l.DIS_8859-15 ISO-8859-15" + done + for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do + echo "$l.ISO_8859-2 ISO-8859-2" + done + for l in la_LN lt_LT; do + echo "$l.ISO_8859-4 ISO-8859-4" + done + for l in ru_RU ru_SU; do + echo "$l.KOI8-R KOI8-R" + echo "$l.ISO_8859-5 ISO-8859-5" + echo "$l.CP866 CP866" + done + echo "uk_UA.KOI8-U KOI8-U" + echo "zh_TW.BIG5 BIG5" + echo "zh_TW.Big5 BIG5" + echo "zh_CN.EUC GB2312" + echo "ja_JP.EUC EUC-JP" + echo "ja_JP.SJIS SHIFT_JIS" + echo "ja_JP.Shift_JIS SHIFT_JIS" + echo "ko_KR.EUC EUC-KR" + ;; + netbsd*) + echo "646 ASCII" + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-4 ISO-8859-4" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-15 ISO-8859-15" + echo "eucCN GB2312" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + echo "BIG5 BIG5" + echo "SJIS SHIFT_JIS" + ;; + darwin*) + # Darwin 6.8 doesn't have nl_langinfo(CODESET); therefore + # localcharset.c falls back to using the full locale name + # from the environment variables. + echo "C ASCII" + for l in en_AU en_CA en_GB en_US la_LN; do + echo "$l.US-ASCII ASCII" + done + for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ + fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT nl_BE \ + nl_NL no_NO pt_PT sv_SE; do + echo "$l ISO-8859-1" + echo "$l.ISO8859-1 ISO-8859-1" + echo "$l.ISO8859-15 ISO-8859-15" + done + for l in la_LN; do + echo "$l.ISO8859-1 ISO-8859-1" + echo "$l.ISO8859-15 ISO-8859-15" + done + for l in cs_CZ hr_HR hu_HU la_LN pl_PL sl_SI; do + echo "$l.ISO8859-2 ISO-8859-2" + done + for l in la_LN lt_LT; do + echo "$l.ISO8859-4 ISO-8859-4" + done + for l in ru_RU; do + echo "$l.KOI8-R KOI8-R" + echo "$l.ISO8859-5 ISO-8859-5" + echo "$l.CP866 CP866" + done + for l in bg_BG; do + echo "$l.CP1251 CP1251" + done + echo "uk_UA.KOI8-U KOI8-U" + echo "zh_TW.BIG5 BIG5" + echo "zh_TW.Big5 BIG5" + echo "zh_CN.EUC GB2312" + echo "ja_JP.EUC EUC-JP" + echo "ja_JP.SJIS SHIFT_JIS" + echo "ko_KR.EUC EUC-KR" + ;; + beos*) + # BeOS has a single locale, and it has UTF-8 encoding. + echo "* UTF-8" + ;; + msdosdjgpp*) + # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore + # localcharset.c falls back to using the full locale name + # from the environment variables. + echo "#" + echo "# The encodings given here may not all be correct." + echo "# If you find that the encoding given for your language and" + echo "# country is not the one your DOS machine actually uses, just" + echo "# correct it in this file, and send a mail to" + echo "# Juan Manuel Guerrero " + echo "# and Bruno Haible ." + echo "#" + echo "C ASCII" + # ISO-8859-1 languages + echo "ca CP850" + echo "ca_ES CP850" + echo "da CP865" # not CP850 ?? + echo "da_DK CP865" # not CP850 ?? + echo "de CP850" + echo "de_AT CP850" + echo "de_CH CP850" + echo "de_DE CP850" + echo "en CP850" + echo "en_AU CP850" # not CP437 ?? + echo "en_CA CP850" + echo "en_GB CP850" + echo "en_NZ CP437" + echo "en_US CP437" + echo "en_ZA CP850" # not CP437 ?? + echo "es CP850" + echo "es_AR CP850" + echo "es_BO CP850" + echo "es_CL CP850" + echo "es_CO CP850" + echo "es_CR CP850" + echo "es_CU CP850" + echo "es_DO CP850" + echo "es_EC CP850" + echo "es_ES CP850" + echo "es_GT CP850" + echo "es_HN CP850" + echo "es_MX CP850" + echo "es_NI CP850" + echo "es_PA CP850" + echo "es_PY CP850" + echo "es_PE CP850" + echo "es_SV CP850" + echo "es_UY CP850" + echo "es_VE CP850" + echo "et CP850" + echo "et_EE CP850" + echo "eu CP850" + echo "eu_ES CP850" + echo "fi CP850" + echo "fi_FI CP850" + echo "fr CP850" + echo "fr_BE CP850" + echo "fr_CA CP850" + echo "fr_CH CP850" + echo "fr_FR CP850" + echo "ga CP850" + echo "ga_IE CP850" + echo "gd CP850" + echo "gd_GB CP850" + echo "gl CP850" + echo "gl_ES CP850" + echo "id CP850" # not CP437 ?? + echo "id_ID CP850" # not CP437 ?? + echo "is CP861" # not CP850 ?? + echo "is_IS CP861" # not CP850 ?? + echo "it CP850" + echo "it_CH CP850" + echo "it_IT CP850" + echo "lt CP775" + echo "lt_LT CP775" + echo "lv CP775" + echo "lv_LV CP775" + echo "nb CP865" # not CP850 ?? + echo "nb_NO CP865" # not CP850 ?? + echo "nl CP850" + echo "nl_BE CP850" + echo "nl_NL CP850" + echo "nn CP865" # not CP850 ?? + echo "nn_NO CP865" # not CP850 ?? + echo "no CP865" # not CP850 ?? + echo "no_NO CP865" # not CP850 ?? + echo "pt CP850" + echo "pt_BR CP850" + echo "pt_PT CP850" + echo "sv CP850" + echo "sv_SE CP850" + # ISO-8859-2 languages + echo "cs CP852" + echo "cs_CZ CP852" + echo "hr CP852" + echo "hr_HR CP852" + echo "hu CP852" + echo "hu_HU CP852" + echo "pl CP852" + echo "pl_PL CP852" + echo "ro CP852" + echo "ro_RO CP852" + echo "sk CP852" + echo "sk_SK CP852" + echo "sl CP852" + echo "sl_SI CP852" + echo "sq CP852" + echo "sq_AL CP852" + echo "sr CP852" # CP852 or CP866 or CP855 ?? + echo "sr_CS CP852" # CP852 or CP866 or CP855 ?? + echo "sr_YU CP852" # CP852 or CP866 or CP855 ?? + # ISO-8859-3 languages + echo "mt CP850" + echo "mt_MT CP850" + # ISO-8859-5 languages + echo "be CP866" + echo "be_BE CP866" + echo "bg CP866" # not CP855 ?? + echo "bg_BG CP866" # not CP855 ?? + echo "mk CP866" # not CP855 ?? + echo "mk_MK CP866" # not CP855 ?? + echo "ru CP866" + echo "ru_RU CP866" + echo "uk CP1125" + echo "uk_UA CP1125" + # ISO-8859-6 languages + echo "ar CP864" + echo "ar_AE CP864" + echo "ar_DZ CP864" + echo "ar_EG CP864" + echo "ar_IQ CP864" + echo "ar_IR CP864" + echo "ar_JO CP864" + echo "ar_KW CP864" + echo "ar_MA CP864" + echo "ar_OM CP864" + echo "ar_QA CP864" + echo "ar_SA CP864" + echo "ar_SY CP864" + # ISO-8859-7 languages + echo "el CP869" + echo "el_GR CP869" + # ISO-8859-8 languages + echo "he CP862" + echo "he_IL CP862" + # ISO-8859-9 languages + echo "tr CP857" + echo "tr_TR CP857" + # Japanese + echo "ja CP932" + echo "ja_JP CP932" + # Chinese + echo "zh_CN GBK" + echo "zh_TW CP950" # not CP938 ?? + # Korean + echo "kr CP949" # not CP934 ?? + echo "kr_KR CP949" # not CP934 ?? + # Thai + echo "th CP874" + echo "th_TH CP874" + # Other + echo "eo CP850" + echo "eo_EO CP850" + ;; +esac diff --git a/intl/dcgettext.c b/intl/dcgettext.c new file mode 100644 index 0000000..850acde --- /dev/null +++ b/intl/dcgettext.c @@ -0,0 +1,56 @@ +/* Implementation of the dcgettext(3) function. + Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DCGETTEXT __dcgettext +# define DCIGETTEXT __dcigettext +#else +# define DCGETTEXT libintl_dcgettext +# define DCIGETTEXT libintl_dcigettext +#endif + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +char * +DCGETTEXT (const char *domainname, const char *msgid, int category) +{ + return DCIGETTEXT (domainname, msgid, NULL, 0, 0, category); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +INTDEF(__dcgettext) +weak_alias (__dcgettext, dcgettext); +#endif diff --git a/intl/dcigettext.c b/intl/dcigettext.c new file mode 100644 index 0000000..35238e2 --- /dev/null +++ b/intl/dcigettext.c @@ -0,0 +1,1219 @@ +/* Implementation of the internal dcigettext function. + Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Tell glibc's to provide a prototype for mempcpy(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# ifdef _MSC_VER +# include +# define alloca _alloca +# else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +#include +#ifndef errno +extern int errno; +#endif +#ifndef __set_errno +# define __set_errno(val) errno = (val) +#endif + +#include +#include +#include + +#if defined HAVE_UNISTD_H || defined _LIBC +# include +#endif + +#include + +#ifdef _LIBC + /* Guess whether integer division by zero raises signal SIGFPE. + Set to 1 only if you know for sure. In case of doubt, set to 0. */ +# if defined __alpha__ || defined __arm__ || defined __i386__ \ + || defined __m68k__ || defined __s390__ +# define INTDIV0_RAISES_SIGFPE 1 +# else +# define INTDIV0_RAISES_SIGFPE 0 +# endif +#endif +#if !INTDIV0_RAISES_SIGFPE +# include +#endif + +#if defined HAVE_SYS_PARAM_H || defined _LIBC +# include +#endif + +#include "gettextP.h" +#include "plural-exp.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif +#include "hash-string.h" + +/* Thread safetyness. */ +#ifdef _LIBC +# include +#else +/* Provide dummy implementation if this is outside glibc. */ +# define __libc_lock_define_initialized(CLASS, NAME) +# define __libc_lock_lock(NAME) +# define __libc_lock_unlock(NAME) +# define __libc_rwlock_define_initialized(CLASS, NAME) +# define __libc_rwlock_rdlock(NAME) +# define __libc_rwlock_unlock(NAME) +#endif + +/* Alignment of types. */ +#if defined __GNUC__ && __GNUC__ >= 2 +# define alignof(TYPE) __alignof__ (TYPE) +#else +# define alignof(TYPE) \ + ((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2) +#endif + +/* The internal variables in the standalone libintl.a must have different + names than the internal variables in GNU libc, otherwise programs + using libintl.a cannot be linked statically. */ +#if !defined _LIBC +# define _nl_default_default_domain libintl_nl_default_default_domain +# define _nl_current_default_domain libintl_nl_current_default_domain +# define _nl_default_dirname libintl_nl_default_dirname +# define _nl_domain_bindings libintl_nl_domain_bindings +#endif + +/* Some compilers, like SunOS4 cc, don't have offsetof in . */ +#ifndef offsetof +# define offsetof(type,ident) ((size_t)&(((type*)0)->ident)) +#endif + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# define getcwd __getcwd +# ifndef stpcpy +# define stpcpy __stpcpy +# endif +# define tfind __tfind +#else +# if !defined HAVE_GETCWD +char *getwd (); +# define getcwd(buf, max) getwd (buf) +# else +# if VMS +# define getcwd(buf, max) (getcwd) (buf, max, 0) +# else +char *getcwd (); +# endif +# endif +# ifndef HAVE_STPCPY +static char *stpcpy (char *dest, const char *src); +# endif +# ifndef HAVE_MEMPCPY +static void *mempcpy (void *dest, const void *src, size_t n); +# endif +#endif + +/* Amount to increase buffer size by in each try. */ +#define PATH_INCR 32 + +/* The following is from pathmax.h. */ +/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define + PATH_MAX but might cause redefinition warnings when sys/param.h is + later included (as on MORE/BSD 4.3). */ +#if defined _POSIX_VERSION || (defined HAVE_LIMITS_H && !defined __GNUC__) +# include +#endif + +#ifndef _POSIX_PATH_MAX +# define _POSIX_PATH_MAX 255 +#endif + +#if !defined PATH_MAX && defined _PC_PATH_MAX +# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX)) +#endif + +/* Don't include sys/param.h if it already has been. */ +#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN +# include +#endif + +#if !defined PATH_MAX && defined MAXPATHLEN +# define PATH_MAX MAXPATHLEN +#endif + +#ifndef PATH_MAX +# define PATH_MAX _POSIX_PATH_MAX +#endif + +/* Pathname support. + ISSLASH(C) tests whether C is a directory separator character. + IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not, + it may be concatenated to a directory pathname. + IS_PATH_WITH_DIR(P) tests whether P contains a directory specification. + */ +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +# define HAS_DEVICE(P) \ + ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ + && (P)[1] == ':') +# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P)) +# define IS_PATH_WITH_DIR(P) \ + (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P)) +#else + /* Unix */ +# define ISSLASH(C) ((C) == '/') +# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0]) +# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL) +#endif + +/* This is the type used for the search tree where known translations + are stored. */ +struct known_translation_t +{ + /* Domain in which to search. */ + char *domainname; + + /* The category. */ + int category; + + /* State of the catalog counter at the point the string was found. */ + int counter; + + /* Catalog where the string was found. */ + struct loaded_l10nfile *domain; + + /* And finally the translation. */ + const char *translation; + size_t translation_length; + + /* Pointer to the string in question. */ + char msgid[ZERO]; +}; + +/* Root of the search tree with known translations. We can use this + only if the system provides the `tsearch' function family. */ +#if defined HAVE_TSEARCH || defined _LIBC +# include + +static void *root; + +# ifdef _LIBC +# define tsearch __tsearch +# endif + +/* Function to compare two entries in the table of known translations. */ +static int +transcmp (const void *p1, const void *p2) +{ + const struct known_translation_t *s1; + const struct known_translation_t *s2; + int result; + + s1 = (const struct known_translation_t *) p1; + s2 = (const struct known_translation_t *) p2; + + result = strcmp (s1->msgid, s2->msgid); + if (result == 0) + { + result = strcmp (s1->domainname, s2->domainname); + if (result == 0) + /* We compare the category last (though this is the cheapest + operation) since it is hopefully always the same (namely + LC_MESSAGES). */ + result = s1->category - s2->category; + } + + return result; +} +#endif + +#ifndef INTVARDEF +# define INTVARDEF(name) +#endif +#ifndef INTUSE +# define INTUSE(name) name +#endif + +/* Name of the default domain used for gettext(3) prior any call to + textdomain(3). The default value for this is "messages". */ +const char _nl_default_default_domain[] attribute_hidden = "messages"; + +/* Value used as the default domain for gettext(3). */ +const char *_nl_current_default_domain attribute_hidden + = _nl_default_default_domain; + +/* Contains the default location of the message catalogs. */ +#if defined __EMX__ +extern const char _nl_default_dirname[]; +#else +const char _nl_default_dirname[] = LOCALEDIR; +INTVARDEF (_nl_default_dirname) +#endif + +/* List with bindings of specific domains created by bindtextdomain() + calls. */ +struct binding *_nl_domain_bindings; + +/* Prototypes for local functions. */ +static char *plural_lookup (struct loaded_l10nfile *domain, + unsigned long int n, + const char *translation, size_t translation_len) + internal_function; +static const char *guess_category_value (int category, + const char *categoryname) + internal_function; +#ifdef _LIBC +# include "../locale/localeinfo.h" +# define category_to_name(category) _nl_category_names[category] +#else +static const char *category_to_name (int category) internal_function; +#endif + + +/* For those loosing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +/* Nothing has to be done. */ +# define freea(p) /* nothing */ +# define ADD_BLOCK(list, address) /* nothing */ +# define FREE_BLOCKS(list) /* nothing */ +#else +struct block_list +{ + void *address; + struct block_list *next; +}; +# define ADD_BLOCK(list, addr) \ + do { \ + struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \ + /* If we cannot get a free block we cannot add the new element to \ + the list. */ \ + if (newp != NULL) { \ + newp->address = (addr); \ + newp->next = (list); \ + (list) = newp; \ + } \ + } while (0) +# define FREE_BLOCKS(list) \ + do { \ + while (list != NULL) { \ + struct block_list *old = list; \ + list = list->next; \ + free (old->address); \ + free (old); \ + } \ + } while (0) +# undef alloca +# define alloca(size) (malloc (size)) +# define freea(p) free (p) +#endif /* have alloca */ + + +#ifdef _LIBC +/* List of blocks allocated for translations. */ +typedef struct transmem_list +{ + struct transmem_list *next; + char data[ZERO]; +} transmem_block_t; +static struct transmem_list *transmem_list; +#else +typedef unsigned char transmem_block_t; +#endif + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DCIGETTEXT __dcigettext +#else +# define DCIGETTEXT libintl_dcigettext +#endif + +/* Lock variable to protect the global data in the gettext implementation. */ +#ifdef _LIBC +__libc_rwlock_define_initialized (, _nl_state_lock attribute_hidden) +#endif + +/* Checking whether the binaries runs SUID must be done and glibc provides + easier methods therefore we make a difference here. */ +#ifdef _LIBC +# define ENABLE_SECURE __libc_enable_secure +# define DETERMINE_SECURE +#else +# ifndef HAVE_GETUID +# define getuid() 0 +# endif +# ifndef HAVE_GETGID +# define getgid() 0 +# endif +# ifndef HAVE_GETEUID +# define geteuid() getuid() +# endif +# ifndef HAVE_GETEGID +# define getegid() getgid() +# endif +static int enable_secure; +# define ENABLE_SECURE (enable_secure == 1) +# define DETERMINE_SECURE \ + if (enable_secure == 0) \ + { \ + if (getuid () != geteuid () || getgid () != getegid ()) \ + enable_secure = 1; \ + else \ + enable_secure = -1; \ + } +#endif + +/* Get the function to evaluate the plural expression. */ +#include "eval-plural.h" + +/* Look up MSGID in the DOMAINNAME message catalog for the current + CATEGORY locale and, if PLURAL is nonzero, search over string + depending on the plural form determined by N. */ +char * +DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2, + int plural, unsigned long int n, int category) +{ +#ifndef HAVE_ALLOCA + struct block_list *block_list = NULL; +#endif + struct loaded_l10nfile *domain; + struct binding *binding; + const char *categoryname; + const char *categoryvalue; + char *dirname, *xdomainname; + char *single_locale; + char *retval; + size_t retlen; + int saved_errno; +#if defined HAVE_TSEARCH || defined _LIBC + struct known_translation_t *search; + struct known_translation_t **foundp = NULL; + size_t msgid_len; +#endif + size_t domainname_len; + + /* If no real MSGID is given return NULL. */ + if (msgid1 == NULL) + return NULL; + +#ifdef _LIBC + if (category < 0 || category >= __LC_LAST || category == LC_ALL) + /* Bogus. */ + return (plural == 0 + ? (char *) msgid1 + /* Use the Germanic plural rule. */ + : n == 1 ? (char *) msgid1 : (char *) msgid2); +#endif + + __libc_rwlock_rdlock (_nl_state_lock); + + /* If DOMAINNAME is NULL, we are interested in the default domain. If + CATEGORY is not LC_MESSAGES this might not make much sense but the + definition left this undefined. */ + if (domainname == NULL) + domainname = _nl_current_default_domain; + + /* OS/2 specific: backward compatibility with older libintl versions */ +#ifdef LC_MESSAGES_COMPAT + if (category == LC_MESSAGES_COMPAT) + category = LC_MESSAGES; +#endif + +#if defined HAVE_TSEARCH || defined _LIBC + msgid_len = strlen (msgid1) + 1; + + /* Try to find the translation among those which we found at + some time. */ + search = (struct known_translation_t *) + alloca (offsetof (struct known_translation_t, msgid) + msgid_len); + memcpy (search->msgid, msgid1, msgid_len); + search->domainname = (char *) domainname; + search->category = category; + + foundp = (struct known_translation_t **) tfind (search, &root, transcmp); + freea (search); + if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr) + { + /* Now deal with plural. */ + if (plural) + retval = plural_lookup ((*foundp)->domain, n, (*foundp)->translation, + (*foundp)->translation_length); + else + retval = (char *) (*foundp)->translation; + + __libc_rwlock_unlock (_nl_state_lock); + return retval; + } +#endif + + /* Preserve the `errno' value. */ + saved_errno = errno; + + /* See whether this is a SUID binary or not. */ + DETERMINE_SECURE; + + /* First find matching binding. */ + for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) + { + int compare = strcmp (domainname, binding->domainname); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It is not in the list. */ + binding = NULL; + break; + } + } + + if (binding == NULL) + dirname = (char *) INTUSE(_nl_default_dirname); + else if (IS_ABSOLUTE_PATH (binding->dirname)) + dirname = binding->dirname; + else + { + /* We have a relative path. Make it absolute now. */ + size_t dirname_len = strlen (binding->dirname) + 1; + size_t path_max; + char *ret; + + path_max = (unsigned int) PATH_MAX; + path_max += 2; /* The getcwd docs say to do this. */ + + for (;;) + { + dirname = (char *) alloca (path_max + dirname_len); + ADD_BLOCK (block_list, dirname); + + __set_errno (0); + ret = getcwd (dirname, path_max); + if (ret != NULL || errno != ERANGE) + break; + + path_max += path_max / 2; + path_max += PATH_INCR; + } + + if (ret == NULL) + /* We cannot get the current working directory. Don't signal an + error but simply return the default string. */ + goto return_untranslated; + + stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname); + } + + /* Now determine the symbolic name of CATEGORY and its value. */ + categoryname = category_to_name (category); + categoryvalue = guess_category_value (category, categoryname); + + domainname_len = strlen (domainname); + xdomainname = (char *) alloca (strlen (categoryname) + + domainname_len + 5); + ADD_BLOCK (block_list, xdomainname); + + stpcpy (mempcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"), + domainname, domainname_len), + ".mo"); + + /* Creating working area. */ + single_locale = (char *) alloca (strlen (categoryvalue) + 1); + ADD_BLOCK (block_list, single_locale); + + + /* Search for the given string. This is a loop because we perhaps + got an ordered list of languages to consider for the translation. */ + while (1) + { + /* Make CATEGORYVALUE point to the next element of the list. */ + while (categoryvalue[0] != '\0' && categoryvalue[0] == ':') + ++categoryvalue; + if (categoryvalue[0] == '\0') + { + /* The whole contents of CATEGORYVALUE has been searched but + no valid entry has been found. We solve this situation + by implicitly appending a "C" entry, i.e. no translation + will take place. */ + single_locale[0] = 'C'; + single_locale[1] = '\0'; + } + else + { + char *cp = single_locale; + while (categoryvalue[0] != '\0' && categoryvalue[0] != ':') + *cp++ = *categoryvalue++; + *cp = '\0'; + + /* When this is a SUID binary we must not allow accessing files + outside the dedicated directories. */ + if (ENABLE_SECURE && IS_PATH_WITH_DIR (single_locale)) + /* Ingore this entry. */ + continue; + } + + /* If the current locale value is C (or POSIX) we don't load a + domain. Return the MSGID. */ + if (strcmp (single_locale, "C") == 0 + || strcmp (single_locale, "POSIX") == 0) + break; + + /* Find structure describing the message catalog matching the + DOMAINNAME and CATEGORY. */ + domain = _nl_find_domain (dirname, single_locale, xdomainname, binding); + + if (domain != NULL) + { + retval = _nl_find_msg (domain, binding, msgid1, &retlen); + + if (retval == NULL) + { + int cnt; + + for (cnt = 0; domain->successor[cnt] != NULL; ++cnt) + { + retval = _nl_find_msg (domain->successor[cnt], binding, + msgid1, &retlen); + + if (retval != NULL) + { + domain = domain->successor[cnt]; + break; + } + } + } + + if (retval != NULL) + { + /* Found the translation of MSGID1 in domain DOMAIN: + starting at RETVAL, RETLEN bytes. */ + FREE_BLOCKS (block_list); +#if defined HAVE_TSEARCH || defined _LIBC + if (foundp == NULL) + { + /* Create a new entry and add it to the search tree. */ + struct known_translation_t *newp; + + newp = (struct known_translation_t *) + malloc (offsetof (struct known_translation_t, msgid) + + msgid_len + domainname_len + 1); + if (newp != NULL) + { + newp->domainname = + mempcpy (newp->msgid, msgid1, msgid_len); + memcpy (newp->domainname, domainname, domainname_len + 1); + newp->category = category; + newp->counter = _nl_msg_cat_cntr; + newp->domain = domain; + newp->translation = retval; + newp->translation_length = retlen; + + /* Insert the entry in the search tree. */ + foundp = (struct known_translation_t **) + tsearch (newp, &root, transcmp); + if (foundp == NULL + || __builtin_expect (*foundp != newp, 0)) + /* The insert failed. */ + free (newp); + } + } + else + { + /* We can update the existing entry. */ + (*foundp)->counter = _nl_msg_cat_cntr; + (*foundp)->domain = domain; + (*foundp)->translation = retval; + (*foundp)->translation_length = retlen; + } +#endif + __set_errno (saved_errno); + + /* Now deal with plural. */ + if (plural) + retval = plural_lookup (domain, n, retval, retlen); + + __libc_rwlock_unlock (_nl_state_lock); + return retval; + } + } + } + + return_untranslated: + /* Return the untranslated MSGID. */ + FREE_BLOCKS (block_list); + __libc_rwlock_unlock (_nl_state_lock); +#ifndef _LIBC + if (!ENABLE_SECURE) + { + extern void _nl_log_untranslated (const char *logfilename, + const char *domainname, + const char *msgid1, const char *msgid2, + int plural); + const char *logfilename = getenv ("GETTEXT_LOG_UNTRANSLATED"); + + if (logfilename != NULL && logfilename[0] != '\0') + _nl_log_untranslated (logfilename, domainname, msgid1, msgid2, plural); + } +#endif + __set_errno (saved_errno); + return (plural == 0 + ? (char *) msgid1 + /* Use the Germanic plural rule. */ + : n == 1 ? (char *) msgid1 : (char *) msgid2); +} + + +char * +internal_function +_nl_find_msg (struct loaded_l10nfile *domain_file, + struct binding *domainbinding, const char *msgid, + size_t *lengthp) +{ + struct loaded_domain *domain; + nls_uint32 nstrings; + size_t act; + char *result; + size_t resultlen; + + if (domain_file->decided == 0) + _nl_load_domain (domain_file, domainbinding); + + if (domain_file->data == NULL) + return NULL; + + domain = (struct loaded_domain *) domain_file->data; + + nstrings = domain->nstrings; + + /* Locate the MSGID and its translation. */ + if (domain->hash_tab != NULL) + { + /* Use the hashing table. */ + nls_uint32 len = strlen (msgid); + nls_uint32 hash_val = hash_string (msgid); + nls_uint32 idx = hash_val % domain->hash_size; + nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2)); + + while (1) + { + nls_uint32 nstr = + W (domain->must_swap_hash_tab, domain->hash_tab[idx]); + + if (nstr == 0) + /* Hash table entry is empty. */ + return NULL; + + nstr--; + + /* Compare msgid with the original string at index nstr. + We compare the lengths with >=, not ==, because plural entries + are represented by strings with an embedded NUL. */ + if (nstr < nstrings + ? W (domain->must_swap, domain->orig_tab[nstr].length) >= len + && (strcmp (msgid, + domain->data + W (domain->must_swap, + domain->orig_tab[nstr].offset)) + == 0) + : domain->orig_sysdep_tab[nstr - nstrings].length > len + && (strcmp (msgid, + domain->orig_sysdep_tab[nstr - nstrings].pointer) + == 0)) + { + act = nstr; + goto found; + } + + if (idx >= domain->hash_size - incr) + idx -= domain->hash_size - incr; + else + idx += incr; + } + /* NOTREACHED */ + } + else + { + /* Try the default method: binary search in the sorted array of + messages. */ + size_t top, bottom; + + bottom = 0; + top = nstrings; + while (bottom < top) + { + int cmp_val; + + act = (bottom + top) / 2; + cmp_val = strcmp (msgid, (domain->data + + W (domain->must_swap, + domain->orig_tab[act].offset))); + if (cmp_val < 0) + top = act; + else if (cmp_val > 0) + bottom = act + 1; + else + goto found; + } + /* No translation was found. */ + return NULL; + } + + found: + /* The translation was found at index ACT. If we have to convert the + string to use a different character set, this is the time. */ + if (act < nstrings) + { + result = (char *) + (domain->data + W (domain->must_swap, domain->trans_tab[act].offset)); + resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1; + } + else + { + result = (char *) domain->trans_sysdep_tab[act - nstrings].pointer; + resultlen = domain->trans_sysdep_tab[act - nstrings].length; + } + +#if defined _LIBC || HAVE_ICONV + if (domain->codeset_cntr + != (domainbinding != NULL ? domainbinding->codeset_cntr : 0)) + { + /* The domain's codeset has changed through bind_textdomain_codeset() + since the message catalog was initialized or last accessed. We + have to reinitialize the converter. */ + _nl_free_domain_conv (domain); + _nl_init_domain_conv (domain_file, domain, domainbinding); + } + + if ( +# ifdef _LIBC + domain->conv != (__gconv_t) -1 +# else +# if HAVE_ICONV + domain->conv != (iconv_t) -1 +# endif +# endif + ) + { + /* We are supposed to do a conversion. First allocate an + appropriate table with the same structure as the table + of translations in the file, where we can put the pointers + to the converted strings in. + There is a slight complication with plural entries. They + are represented by consecutive NUL terminated strings. We + handle this case by converting RESULTLEN bytes, including + NULs. */ + + if (domain->conv_tab == NULL + && ((domain->conv_tab = + (char **) calloc (nstrings + domain->n_sysdep_strings, + sizeof (char *))) + == NULL)) + /* Mark that we didn't succeed allocating a table. */ + domain->conv_tab = (char **) -1; + + if (__builtin_expect (domain->conv_tab == (char **) -1, 0)) + /* Nothing we can do, no more memory. */ + goto converted; + + if (domain->conv_tab[act] == NULL) + { + /* We haven't used this string so far, so it is not + translated yet. Do this now. */ + /* We use a bit more efficient memory handling. + We allocate always larger blocks which get used over + time. This is faster than many small allocations. */ + __libc_lock_define_initialized (static, lock) +# define INITIAL_BLOCK_SIZE 4080 + static unsigned char *freemem; + static size_t freemem_size; + + const unsigned char *inbuf; + unsigned char *outbuf; + int malloc_count; +# ifndef _LIBC + transmem_block_t *transmem_list = NULL; +# endif + + __libc_lock_lock (lock); + + inbuf = (const unsigned char *) result; + outbuf = freemem + sizeof (size_t); + + malloc_count = 0; + while (1) + { + transmem_block_t *newmem; +# ifdef _LIBC + size_t non_reversible; + int res; + + if (freemem_size < sizeof (size_t)) + goto resize_freemem; + + res = __gconv (domain->conv, + &inbuf, inbuf + resultlen, + &outbuf, + outbuf + freemem_size - sizeof (size_t), + &non_reversible); + + if (res == __GCONV_OK || res == __GCONV_EMPTY_INPUT) + break; + + if (res != __GCONV_FULL_OUTPUT) + { + __libc_lock_unlock (lock); + goto converted; + } + + inbuf = result; +# else +# if HAVE_ICONV + const char *inptr = (const char *) inbuf; + size_t inleft = resultlen; + char *outptr = (char *) outbuf; + size_t outleft; + + if (freemem_size < sizeof (size_t)) + goto resize_freemem; + + outleft = freemem_size - sizeof (size_t); + if (iconv (domain->conv, + (ICONV_CONST char **) &inptr, &inleft, + &outptr, &outleft) + != (size_t) (-1)) + { + outbuf = (unsigned char *) outptr; + break; + } + if (errno != E2BIG) + { + __libc_lock_unlock (lock); + goto converted; + } +# endif +# endif + + resize_freemem: + /* We must allocate a new buffer or resize the old one. */ + if (malloc_count > 0) + { + ++malloc_count; + freemem_size = malloc_count * INITIAL_BLOCK_SIZE; + newmem = (transmem_block_t *) realloc (transmem_list, + freemem_size); +# ifdef _LIBC + if (newmem != NULL) + transmem_list = transmem_list->next; + else + { + struct transmem_list *old = transmem_list; + + transmem_list = transmem_list->next; + free (old); + } +# endif + } + else + { + malloc_count = 1; + freemem_size = INITIAL_BLOCK_SIZE; + newmem = (transmem_block_t *) malloc (freemem_size); + } + if (__builtin_expect (newmem == NULL, 0)) + { + freemem = NULL; + freemem_size = 0; + __libc_lock_unlock (lock); + goto converted; + } + +# ifdef _LIBC + /* Add the block to the list of blocks we have to free + at some point. */ + newmem->next = transmem_list; + transmem_list = newmem; + + freemem = newmem->data; + freemem_size -= offsetof (struct transmem_list, data); +# else + transmem_list = newmem; + freemem = newmem; +# endif + + outbuf = freemem + sizeof (size_t); + } + + /* We have now in our buffer a converted string. Put this + into the table of conversions. */ + *(size_t *) freemem = outbuf - freemem - sizeof (size_t); + domain->conv_tab[act] = (char *) freemem; + /* Shrink freemem, but keep it aligned. */ + freemem_size -= outbuf - freemem; + freemem = outbuf; + freemem += freemem_size & (alignof (size_t) - 1); + freemem_size = freemem_size & ~ (alignof (size_t) - 1); + + __libc_lock_unlock (lock); + } + + /* Now domain->conv_tab[act] contains the translation of all + the plural variants. */ + result = domain->conv_tab[act] + sizeof (size_t); + resultlen = *(size_t *) domain->conv_tab[act]; + } + + converted: + /* The result string is converted. */ + +#endif /* _LIBC || HAVE_ICONV */ + + *lengthp = resultlen; + return result; +} + + +/* Look up a plural variant. */ +static char * +internal_function +plural_lookup (struct loaded_l10nfile *domain, unsigned long int n, + const char *translation, size_t translation_len) +{ + struct loaded_domain *domaindata = (struct loaded_domain *) domain->data; + unsigned long int index; + const char *p; + + index = plural_eval (domaindata->plural, n); + if (index >= domaindata->nplurals) + /* This should never happen. It means the plural expression and the + given maximum value do not match. */ + index = 0; + + /* Skip INDEX strings at TRANSLATION. */ + p = translation; + while (index-- > 0) + { +#ifdef _LIBC + p = __rawmemchr (p, '\0'); +#else + p = strchr (p, '\0'); +#endif + /* And skip over the NUL byte. */ + p++; + + if (p >= translation + translation_len) + /* This should never happen. It means the plural expression + evaluated to a value larger than the number of variants + available for MSGID1. */ + return (char *) translation; + } + return (char *) p; +} + +#ifndef _LIBC +/* Return string representation of locale CATEGORY. */ +static const char * +internal_function +category_to_name (int category) +{ + const char *retval; + + switch (category) + { +#ifdef LC_COLLATE + case LC_COLLATE: + retval = "LC_COLLATE"; + break; +#endif +#ifdef LC_CTYPE + case LC_CTYPE: + retval = "LC_CTYPE"; + break; +#endif +#ifdef LC_MONETARY + case LC_MONETARY: + retval = "LC_MONETARY"; + break; +#endif +#ifdef LC_NUMERIC + case LC_NUMERIC: + retval = "LC_NUMERIC"; + break; +#endif +#ifdef LC_TIME + case LC_TIME: + retval = "LC_TIME"; + break; +#endif +#ifdef LC_MESSAGES + case LC_MESSAGES: + retval = "LC_MESSAGES"; + break; +#endif +#ifdef LC_RESPONSE + case LC_RESPONSE: + retval = "LC_RESPONSE"; + break; +#endif +#ifdef LC_ALL + case LC_ALL: + /* This might not make sense but is perhaps better than any other + value. */ + retval = "LC_ALL"; + break; +#endif + default: + /* If you have a better idea for a default value let me know. */ + retval = "LC_XXX"; + } + + return retval; +} +#endif + +/* Guess value of current locale from value of the environment variables. */ +static const char * +internal_function +guess_category_value (int category, const char *categoryname) +{ + const char *language; + const char *retval; + + /* The highest priority value is the `LANGUAGE' environment + variable. But we don't use the value if the currently selected + locale is the C locale. This is a GNU extension. */ + language = getenv ("LANGUAGE"); + if (language != NULL && language[0] == '\0') + language = NULL; + + /* We have to proceed with the POSIX methods of looking to `LC_ALL', + `LC_xxx', and `LANG'. On some systems this can be done by the + `setlocale' function itself. */ +#ifdef _LIBC + retval = __current_locale_name (category); +#else + retval = _nl_locale_name (category, categoryname); +#endif + + /* Ignore LANGUAGE if the locale is set to "C" because + 1. "C" locale usually uses the ASCII encoding, and most international + messages use non-ASCII characters. These characters get displayed + as question marks (if using glibc's iconv()) or as invalid 8-bit + characters (because other iconv()s refuse to convert most non-ASCII + characters to ASCII). In any case, the output is ugly. + 2. The precise output of some programs in the "C" locale is specified + by POSIX and should not depend on environment variables like + "LANGUAGE". We allow such programs to use gettext(). */ + return language != NULL && strcmp (retval, "C") != 0 ? language : retval; +} + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (char *dest, const char *src) +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif + +#if !_LIBC && !HAVE_MEMPCPY +static void * +mempcpy (void *dest, const void *src, size_t n) +{ + return (void *) ((char *) memcpy (dest, src, n) + n); +} +#endif + + +#ifdef _LIBC +/* If we want to free all resources we have to do some work at + program's end. */ +libc_freeres_fn (free_mem) +{ + void *old; + + while (_nl_domain_bindings != NULL) + { + struct binding *oldp = _nl_domain_bindings; + _nl_domain_bindings = _nl_domain_bindings->next; + if (oldp->dirname != INTUSE(_nl_default_dirname)) + /* Yes, this is a pointer comparison. */ + free (oldp->dirname); + free (oldp->codeset); + free (oldp); + } + + if (_nl_current_default_domain != _nl_default_default_domain) + /* Yes, again a pointer comparison. */ + free ((char *) _nl_current_default_domain); + + /* Remove the search tree with the known translations. */ + __tdestroy (root, free); + root = NULL; + + while (transmem_list != NULL) + { + old = transmem_list; + transmem_list = transmem_list->next; + free (old); + } +} +#endif diff --git a/intl/dcngettext.c b/intl/dcngettext.c new file mode 100644 index 0000000..48a3e09 --- /dev/null +++ b/intl/dcngettext.c @@ -0,0 +1,57 @@ +/* Implementation of the dcngettext(3) function. + Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DCNGETTEXT __dcngettext +# define DCIGETTEXT __dcigettext +#else +# define DCNGETTEXT libintl_dcngettext +# define DCIGETTEXT libintl_dcigettext +#endif + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +char * +DCNGETTEXT (const char *domainname, + const char *msgid1, const char *msgid2, unsigned long int n, + int category) +{ + return DCIGETTEXT (domainname, msgid1, msgid2, 1, n, category); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__dcngettext, dcngettext); +#endif diff --git a/intl/dgettext.c b/intl/dgettext.c new file mode 100644 index 0000000..b64b0f5 --- /dev/null +++ b/intl/dgettext.c @@ -0,0 +1,58 @@ +/* Implementation of the dgettext(3) function. + Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "gettextP.h" + +#include + +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DGETTEXT __dgettext +# define DCGETTEXT INTUSE(__dcgettext) +#else +# define DGETTEXT libintl_dgettext +# define DCGETTEXT libintl_dcgettext +#endif + +/* Look up MSGID in the DOMAINNAME message catalog of the current + LC_MESSAGES locale. */ +char * +DGETTEXT (const char *domainname, const char *msgid) +{ + return DCGETTEXT (domainname, msgid, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__dgettext, dgettext); +#endif diff --git a/intl/dngettext.c b/intl/dngettext.c new file mode 100644 index 0000000..7815637 --- /dev/null +++ b/intl/dngettext.c @@ -0,0 +1,59 @@ +/* Implementation of the dngettext(3) function. + Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "gettextP.h" + +#include + +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define DNGETTEXT __dngettext +# define DCNGETTEXT __dcngettext +#else +# define DNGETTEXT libintl_dngettext +# define DCNGETTEXT libintl_dcngettext +#endif + +/* Look up MSGID in the DOMAINNAME message catalog of the current + LC_MESSAGES locale and skip message according to the plural form. */ +char * +DNGETTEXT (const char *domainname, + const char *msgid1, const char *msgid2, unsigned long int n) +{ + return DCNGETTEXT (domainname, msgid1, msgid2, n, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__dngettext, dngettext); +#endif diff --git a/intl/eval-plural.h b/intl/eval-plural.h new file mode 100644 index 0000000..01bd5af --- /dev/null +++ b/intl/eval-plural.h @@ -0,0 +1,108 @@ +/* Plural expression evaluation. + Copyright (C) 2000-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef STATIC +#define STATIC static +#endif + +/* Evaluate the plural expression and return an index value. */ +STATIC +unsigned long int +internal_function +plural_eval (struct expression *pexp, unsigned long int n) +{ + switch (pexp->nargs) + { + case 0: + switch (pexp->operation) + { + case var: + return n; + case num: + return pexp->val.num; + default: + break; + } + /* NOTREACHED */ + break; + case 1: + { + /* pexp->operation must be lnot. */ + unsigned long int arg = plural_eval (pexp->val.args[0], n); + return ! arg; + } + case 2: + { + unsigned long int leftarg = plural_eval (pexp->val.args[0], n); + if (pexp->operation == lor) + return leftarg || plural_eval (pexp->val.args[1], n); + else if (pexp->operation == land) + return leftarg && plural_eval (pexp->val.args[1], n); + else + { + unsigned long int rightarg = plural_eval (pexp->val.args[1], n); + + switch (pexp->operation) + { + case mult: + return leftarg * rightarg; + case divide: +#if !INTDIV0_RAISES_SIGFPE + if (rightarg == 0) + raise (SIGFPE); +#endif + return leftarg / rightarg; + case module: +#if !INTDIV0_RAISES_SIGFPE + if (rightarg == 0) + raise (SIGFPE); +#endif + return leftarg % rightarg; + case plus: + return leftarg + rightarg; + case minus: + return leftarg - rightarg; + case less_than: + return leftarg < rightarg; + case greater_than: + return leftarg > rightarg; + case less_or_equal: + return leftarg <= rightarg; + case greater_or_equal: + return leftarg >= rightarg; + case equal: + return leftarg == rightarg; + case not_equal: + return leftarg != rightarg; + default: + break; + } + } + /* NOTREACHED */ + break; + } + case 3: + { + /* pexp->operation must be qmop. */ + unsigned long int boolarg = plural_eval (pexp->val.args[0], n); + return plural_eval (pexp->val.args[boolarg ? 1 : 2], n); + } + } + /* NOTREACHED */ + return 0; +} diff --git a/intl/explodename.c b/intl/explodename.c new file mode 100644 index 0000000..52c25e7 --- /dev/null +++ b/intl/explodename.c @@ -0,0 +1,185 @@ +/* Copyright (C) 1995-1998, 2000-2001, 2003 Free Software Foundation, Inc. + Contributed by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#include "loadinfo.h" + +/* On some strange systems still no definition of NULL is found. Sigh! */ +#ifndef NULL +# if defined __STDC__ && __STDC__ +# define NULL ((void *) 0) +# else +# define NULL 0 +# endif +#endif + +/* @@ end of prolog @@ */ + +char * +_nl_find_language (const char *name) +{ + while (name[0] != '\0' && name[0] != '_' && name[0] != '@' + && name[0] != '+' && name[0] != ',') + ++name; + + return (char *) name; +} + + +int +_nl_explode_name (char *name, + const char **language, const char **modifier, + const char **territory, const char **codeset, + const char **normalized_codeset, const char **special, + const char **sponsor, const char **revision) +{ + enum { undecided, xpg, cen } syntax; + char *cp; + int mask; + + *modifier = NULL; + *territory = NULL; + *codeset = NULL; + *normalized_codeset = NULL; + *special = NULL; + *sponsor = NULL; + *revision = NULL; + + /* Now we determine the single parts of the locale name. First + look for the language. Termination symbols are `_' and `@' if + we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ + mask = 0; + syntax = undecided; + *language = cp = name; + cp = _nl_find_language (*language); + + if (*language == cp) + /* This does not make sense: language has to be specified. Use + this entry as it is without exploding. Perhaps it is an alias. */ + cp = strchr (*language, '\0'); + else if (cp[0] == '_') + { + /* Next is the territory. */ + cp[0] = '\0'; + *territory = ++cp; + + while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@' + && cp[0] != '+' && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= TERRITORY; + + if (cp[0] == '.') + { + /* Next is the codeset. */ + syntax = xpg; + cp[0] = '\0'; + *codeset = ++cp; + + while (cp[0] != '\0' && cp[0] != '@') + ++cp; + + mask |= XPG_CODESET; + + if (*codeset != cp && (*codeset)[0] != '\0') + { + *normalized_codeset = _nl_normalize_codeset (*codeset, + cp - *codeset); + if (strcmp (*codeset, *normalized_codeset) == 0) + free ((char *) *normalized_codeset); + else + mask |= XPG_NORM_CODESET; + } + } + } + + if (cp[0] == '@' || (syntax != xpg && cp[0] == '+')) + { + /* Next is the modifier. */ + syntax = cp[0] == '@' ? xpg : cen; + cp[0] = '\0'; + *modifier = ++cp; + + while (syntax == cen && cp[0] != '\0' && cp[0] != '+' + && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= XPG_MODIFIER | CEN_AUDIENCE; + } + + if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_')) + { + syntax = cen; + + if (cp[0] == '+') + { + /* Next is special application (CEN syntax). */ + cp[0] = '\0'; + *special = ++cp; + + while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_') + ++cp; + + mask |= CEN_SPECIAL; + } + + if (cp[0] == ',') + { + /* Next is sponsor (CEN syntax). */ + cp[0] = '\0'; + *sponsor = ++cp; + + while (cp[0] != '\0' && cp[0] != '_') + ++cp; + + mask |= CEN_SPONSOR; + } + + if (cp[0] == '_') + { + /* Next is revision (CEN syntax). */ + cp[0] = '\0'; + *revision = ++cp; + + mask |= CEN_REVISION; + } + } + + /* For CEN syntax values it might be important to have the + separator character in the file name, not for XPG syntax. */ + if (syntax == xpg) + { + if (*territory != NULL && (*territory)[0] == '\0') + mask &= ~TERRITORY; + + if (*codeset != NULL && (*codeset)[0] == '\0') + mask &= ~XPG_CODESET; + + if (*modifier != NULL && (*modifier)[0] == '\0') + mask &= ~XPG_MODIFIER; + } + + return mask; +} diff --git a/intl/finddomain.c b/intl/finddomain.c new file mode 100644 index 0000000..4992a8c --- /dev/null +++ b/intl/finddomain.c @@ -0,0 +1,192 @@ +/* Handle list of needed message catalogs + Copyright (C) 1995-1999, 2000-2001, 2003 Free Software Foundation, Inc. + Written by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#if defined HAVE_UNISTD_H || defined _LIBC +# include +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ +/* List of already loaded domains. */ +static struct loaded_l10nfile *_nl_loaded_domains; + + +/* Return a data structure describing the message catalog described by + the DOMAINNAME and CATEGORY parameters with respect to the currently + established bindings. */ +struct loaded_l10nfile * +internal_function +_nl_find_domain (const char *dirname, char *locale, + const char *domainname, struct binding *domainbinding) +{ + struct loaded_l10nfile *retval; + const char *language; + const char *modifier; + const char *territory; + const char *codeset; + const char *normalized_codeset; + const char *special; + const char *sponsor; + const char *revision; + const char *alias_value; + int mask; + + /* LOCALE can consist of up to four recognized parts for the XPG syntax: + + language[_territory[.codeset]][@modifier] + + and six parts for the CEN syntax: + + language[_territory][+audience][+special][,[sponsor][_revision]] + + Beside the first part all of them are allowed to be missing. If + the full specified locale is not found, the less specific one are + looked for. The various parts will be stripped off according to + the following order: + (1) revision + (2) sponsor + (3) special + (4) codeset + (5) normalized codeset + (6) territory + (7) audience/modifier + */ + + /* If we have already tested for this locale entry there has to + be one data set in the list of loaded domains. */ + retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, + strlen (dirname) + 1, 0, locale, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, domainname, 0); + if (retval != NULL) + { + /* We know something about this locale. */ + int cnt; + + if (retval->decided == 0) + _nl_load_domain (retval, domainbinding); + + if (retval->data != NULL) + return retval; + + for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) + { + if (retval->successor[cnt]->decided == 0) + _nl_load_domain (retval->successor[cnt], domainbinding); + + if (retval->successor[cnt]->data != NULL) + break; + } + return cnt >= 0 ? retval : NULL; + /* NOTREACHED */ + } + + /* See whether the locale value is an alias. If yes its value + *overwrites* the alias name. No test for the original value is + done. */ + alias_value = _nl_expand_alias (locale); + if (alias_value != NULL) + { +#if defined _LIBC || defined HAVE_STRDUP + locale = strdup (alias_value); + if (locale == NULL) + return NULL; +#else + size_t len = strlen (alias_value) + 1; + locale = (char *) malloc (len); + if (locale == NULL) + return NULL; + + memcpy (locale, alias_value, len); +#endif + } + + /* Now we determine the single parts of the locale name. First + look for the language. Termination symbols are `_' and `@' if + we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ + mask = _nl_explode_name (locale, &language, &modifier, &territory, + &codeset, &normalized_codeset, &special, + &sponsor, &revision); + + /* Create all possible locale entries which might be interested in + generalization. */ + retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, + strlen (dirname) + 1, mask, language, territory, + codeset, normalized_codeset, modifier, special, + sponsor, revision, domainname, 1); + if (retval == NULL) + /* This means we are out of core. */ + return NULL; + + if (retval->decided == 0) + _nl_load_domain (retval, domainbinding); + if (retval->data == NULL) + { + int cnt; + for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) + { + if (retval->successor[cnt]->decided == 0) + _nl_load_domain (retval->successor[cnt], domainbinding); + if (retval->successor[cnt]->data != NULL) + break; + } + } + + /* The room for an alias was dynamically allocated. Free it now. */ + if (alias_value != NULL) + free (locale); + + /* The space for normalized_codeset is dynamically allocated. Free it. */ + if (mask & XPG_NORM_CODESET) + free ((void *) normalized_codeset); + + return retval; +} + + +#ifdef _LIBC +libc_freeres_fn (free_mem) +{ + struct loaded_l10nfile *runp = _nl_loaded_domains; + + while (runp != NULL) + { + struct loaded_l10nfile *here = runp; + if (runp->data != NULL) + _nl_unload_domain ((struct loaded_domain *) runp->data); + runp = runp->next; + free ((char *) here->filename); + free (here); + } +} +#endif diff --git a/intl/gettext.c b/intl/gettext.c new file mode 100644 index 0000000..92c42fa --- /dev/null +++ b/intl/gettext.c @@ -0,0 +1,63 @@ +/* Implementation of gettext(3) function. + Copyright (C) 1995, 1997, 2000-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifdef _LIBC +# define __need_NULL +# include +#else +# include /* Just for NULL. */ +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define GETTEXT __gettext +# define DCGETTEXT INTUSE(__dcgettext) +#else +# define GETTEXT libintl_gettext +# define DCGETTEXT libintl_dcgettext +#endif + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +char * +GETTEXT (const char *msgid) +{ + return DCGETTEXT (NULL, msgid, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__gettext, gettext); +#endif diff --git a/intl/gettextP.h b/intl/gettextP.h new file mode 100644 index 0000000..4d66c3d --- /dev/null +++ b/intl/gettextP.h @@ -0,0 +1,215 @@ +/* Header describing internals of libintl library. + Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc. + Written by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _GETTEXTP_H +#define _GETTEXTP_H + +#include /* Get size_t. */ + +#ifdef _LIBC +# include "../iconv/gconv_int.h" +#else +# if HAVE_ICONV +# include +# endif +#endif + +#include "loadinfo.h" + +#include "gmo.h" /* Get nls_uint32. */ + +/* @@ end of prolog @@ */ + +#ifndef internal_function +# define internal_function +#endif + +#ifndef attribute_hidden +# define attribute_hidden +#endif + +/* Tell the compiler when a conditional or integer expression is + almost always true or almost always false. */ +#ifndef HAVE_BUILTIN_EXPECT +# define __builtin_expect(expr, val) (expr) +#endif + +#ifndef W +# define W(flag, data) ((flag) ? SWAP (data) : (data)) +#endif + + +#ifdef _LIBC +# include +# define SWAP(i) bswap_32 (i) +#else +static inline nls_uint32 +SWAP (i) + nls_uint32 i; +{ + return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24); +} +#endif + + +/* In-memory representation of system dependent string. */ +struct sysdep_string_desc +{ + /* Length of addressed string, including the trailing NUL. */ + size_t length; + /* Pointer to addressed string. */ + const char *pointer; +}; + +/* The representation of an opened message catalog. */ +struct loaded_domain +{ + /* Pointer to memory containing the .mo file. */ + const char *data; + /* 1 if the memory is mmap()ed, 0 if the memory is malloc()ed. */ + int use_mmap; + /* Size of mmap()ed memory. */ + size_t mmap_size; + /* 1 if the .mo file uses a different endianness than this machine. */ + int must_swap; + /* Pointer to additional malloc()ed memory. */ + void *malloced; + + /* Number of static strings pairs. */ + nls_uint32 nstrings; + /* Pointer to descriptors of original strings in the file. */ + const struct string_desc *orig_tab; + /* Pointer to descriptors of translated strings in the file. */ + const struct string_desc *trans_tab; + + /* Number of system dependent strings pairs. */ + nls_uint32 n_sysdep_strings; + /* Pointer to descriptors of original sysdep strings. */ + const struct sysdep_string_desc *orig_sysdep_tab; + /* Pointer to descriptors of translated sysdep strings. */ + const struct sysdep_string_desc *trans_sysdep_tab; + + /* Size of hash table. */ + nls_uint32 hash_size; + /* Pointer to hash table. */ + const nls_uint32 *hash_tab; + /* 1 if the hash table uses a different endianness than this machine. */ + int must_swap_hash_tab; + + int codeset_cntr; +#ifdef _LIBC + __gconv_t conv; +#else +# if HAVE_ICONV + iconv_t conv; +# endif +#endif + char **conv_tab; + + struct expression *plural; + unsigned long int nplurals; +}; + +/* We want to allocate a string at the end of the struct. But ISO C + doesn't allow zero sized arrays. */ +#ifdef __GNUC__ +# define ZERO 0 +#else +# define ZERO 1 +#endif + +/* A set of settings bound to a message domain. Used to store settings + from bindtextdomain() and bind_textdomain_codeset(). */ +struct binding +{ + struct binding *next; + char *dirname; + int codeset_cntr; /* Incremented each time codeset changes. */ + char *codeset; + char domainname[ZERO]; +}; + +/* A counter which is incremented each time some previous translations + become invalid. + This variable is part of the external ABI of the GNU libintl. */ +extern int _nl_msg_cat_cntr; + +#ifndef _LIBC +const char *_nl_locale_name (int category, const char *categoryname); +#endif + +struct loaded_l10nfile *_nl_find_domain (const char *__dirname, char *__locale, + const char *__domainname, + struct binding *__domainbinding) + internal_function; +void _nl_load_domain (struct loaded_l10nfile *__domain, + struct binding *__domainbinding) + internal_function; +void _nl_unload_domain (struct loaded_domain *__domain) + internal_function; +const char *_nl_init_domain_conv (struct loaded_l10nfile *__domain_file, + struct loaded_domain *__domain, + struct binding *__domainbinding) + internal_function; +void _nl_free_domain_conv (struct loaded_domain *__domain) + internal_function; + +char *_nl_find_msg (struct loaded_l10nfile *domain_file, + struct binding *domainbinding, const char *msgid, + size_t *lengthp) + internal_function; + +#ifdef _LIBC +extern char *__gettext (const char *__msgid); +extern char *__dgettext (const char *__domainname, const char *__msgid); +extern char *__dcgettext (const char *__domainname, const char *__msgid, + int __category); +extern char *__ngettext (const char *__msgid1, const char *__msgid2, + unsigned long int __n); +extern char *__dngettext (const char *__domainname, + const char *__msgid1, const char *__msgid2, + unsigned long int n); +extern char *__dcngettext (const char *__domainname, + const char *__msgid1, const char *__msgid2, + unsigned long int __n, int __category); +extern char *__dcigettext (const char *__domainname, + const char *__msgid1, const char *__msgid2, + int __plural, unsigned long int __n, + int __category); +extern char *__textdomain (const char *__domainname); +extern char *__bindtextdomain (const char *__domainname, + const char *__dirname); +extern char *__bind_textdomain_codeset (const char *__domainname, + const char *__codeset); +#else +/* Declare the exported libintl_* functions, in a way that allows us to + call them under their real name. */ +# undef _INTL_REDIRECT_INLINE +# undef _INTL_REDIRECT_MACROS +# define _INTL_REDIRECT_MACROS +# include "libgnuintl.h" +extern char *libintl_dcigettext (const char *__domainname, + const char *__msgid1, const char *__msgid2, + int __plural, unsigned long int __n, + int __category); +#endif + +/* @@ begin of epilog @@ */ + +#endif /* gettextP.h */ diff --git a/intl/gmo.h b/intl/gmo.h new file mode 100644 index 0000000..e7c9cc1 --- /dev/null +++ b/intl/gmo.h @@ -0,0 +1,149 @@ +/* Description of GNU message catalog format: general file layout. + Copyright (C) 1995, 1997, 2000-2002, 2004 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _GETTEXT_H +#define _GETTEXT_H 1 + +#include + +/* @@ end of prolog @@ */ + +/* The magic number of the GNU message catalog format. */ +#define _MAGIC 0x950412de +#define _MAGIC_SWAPPED 0xde120495 + +/* Revision number of the currently used .mo (binary) file format. */ +#define MO_REVISION_NUMBER 0 +#define MO_REVISION_NUMBER_WITH_SYSDEP_I 1 + +/* The following contortions are an attempt to use the C preprocessor + to determine an unsigned integral type that is 32 bits wide. An + alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but + as of version autoconf-2.13, the AC_CHECK_SIZEOF macro doesn't work + when cross-compiling. */ + +#if __STDC__ +# define UINT_MAX_32_BITS 4294967295U +#else +# define UINT_MAX_32_BITS 0xFFFFFFFF +#endif + +/* If UINT_MAX isn't defined, assume it's a 32-bit type. + This should be valid for all systems GNU cares about because + that doesn't include 16-bit systems, and only modern systems + (that certainly have ) have 64+-bit integral types. */ + +#ifndef UINT_MAX +# define UINT_MAX UINT_MAX_32_BITS +#endif + +#if UINT_MAX == UINT_MAX_32_BITS +typedef unsigned nls_uint32; +#else +# if USHRT_MAX == UINT_MAX_32_BITS +typedef unsigned short nls_uint32; +# else +# if ULONG_MAX == UINT_MAX_32_BITS +typedef unsigned long nls_uint32; +# else + /* The following line is intended to throw an error. Using #error is + not portable enough. */ + "Cannot determine unsigned 32-bit data type." +# endif +# endif +#endif + + +/* Header for binary .mo file format. */ +struct mo_file_header +{ + /* The magic number. */ + nls_uint32 magic; + /* The revision number of the file format. */ + nls_uint32 revision; + + /* The following are only used in .mo files with major revision 0 or 1. */ + + /* The number of strings pairs. */ + nls_uint32 nstrings; + /* Offset of table with start offsets of original strings. */ + nls_uint32 orig_tab_offset; + /* Offset of table with start offsets of translated strings. */ + nls_uint32 trans_tab_offset; + /* Size of hash table. */ + nls_uint32 hash_tab_size; + /* Offset of first hash table entry. */ + nls_uint32 hash_tab_offset; + + /* The following are only used in .mo files with minor revision >= 1. */ + + /* The number of system dependent segments. */ + nls_uint32 n_sysdep_segments; + /* Offset of table describing system dependent segments. */ + nls_uint32 sysdep_segments_offset; + /* The number of system dependent strings pairs. */ + nls_uint32 n_sysdep_strings; + /* Offset of table with start offsets of original sysdep strings. */ + nls_uint32 orig_sysdep_tab_offset; + /* Offset of table with start offsets of translated sysdep strings. */ + nls_uint32 trans_sysdep_tab_offset; +}; + +/* Descriptor for static string contained in the binary .mo file. */ +struct string_desc +{ + /* Length of addressed string, not including the trailing NUL. */ + nls_uint32 length; + /* Offset of string in file. */ + nls_uint32 offset; +}; + +/* The following are only used in .mo files with minor revision >= 1. */ + +/* Descriptor for system dependent string segment. */ +struct sysdep_segment +{ + /* Length of addressed string, including the trailing NUL. */ + nls_uint32 length; + /* Offset of string in file. */ + nls_uint32 offset; +}; + +/* Descriptor for system dependent string. */ +struct sysdep_string +{ + /* Offset of static string segments in file. */ + nls_uint32 offset; + /* Alternating sequence of static and system dependent segments. + The last segment is a static segment, including the trailing NUL. */ + struct segment_pair + { + /* Size of static segment. */ + nls_uint32 segsize; + /* Reference to system dependent string segment, or ~0 at the end. */ + nls_uint32 sysdepref; + } segments[1]; +}; + +/* Marker for the end of the segments[] array. This has the value 0xFFFFFFFF, + regardless whether 'int' is 16 bit, 32 bit, or 64 bit. */ +#define SEGMENTS_END ((nls_uint32) ~0) + +/* @@ begin of epilog @@ */ + +#endif /* gettext.h */ diff --git a/intl/hash-string.h b/intl/hash-string.h new file mode 100644 index 0000000..093e3b1 --- /dev/null +++ b/intl/hash-string.h @@ -0,0 +1,48 @@ +/* Description of GNU message catalog format: string hashing function. + Copyright (C) 1995, 1997-1998, 2000-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* @@ end of prolog @@ */ + +/* We assume to have `unsigned long int' value with at least 32 bits. */ +#define HASHWORDBITS 32 + + +/* Defines the so called `hashpjw' function by P.J. Weinberger + [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools, + 1986, 1987 Bell Telephone Laboratories, Inc.] */ +static inline unsigned long int +hash_string (const char *str_param) +{ + unsigned long int hval, g; + const char *str = str_param; + + /* Compute the hash value for the given string. */ + hval = 0; + while (*str != '\0') + { + hval <<= 4; + hval += (unsigned char) *str++; + g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4)); + if (g != 0) + { + hval ^= g >> (HASHWORDBITS - 8); + hval ^= g; + } + } + return hval; +} diff --git a/intl/intl-compat.c b/intl/intl-compat.c new file mode 100644 index 0000000..96f9d95 --- /dev/null +++ b/intl/intl-compat.c @@ -0,0 +1,131 @@ +/* intl-compat.c - Stub functions to call gettext functions from GNU gettext + Library. + Copyright (C) 1995, 2000-2003 Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "gettextP.h" + +/* @@ end of prolog @@ */ + +/* This file redirects the gettext functions (without prefix) to those + defined in the included GNU libintl library (with "libintl_" prefix). + It is compiled into libintl in order to make the AM_GNU_GETTEXT test + of gettext <= 0.11.2 work with the libintl library >= 0.11.3 which + has the redirections primarily in the include file. + It is also compiled into libgnuintl so that libgnuintl.so can be used + as LD_PRELOADable library on glibc systems, to provide the extra + features that the functions in the libc don't have (namely, logging). */ + + +#undef gettext +#undef dgettext +#undef dcgettext +#undef ngettext +#undef dngettext +#undef dcngettext +#undef textdomain +#undef bindtextdomain +#undef bind_textdomain_codeset + + +/* When building a DLL, we must export some functions. Note that because + the functions are only defined for binary backward compatibility, we + don't need to use __declspec(dllimport) in any case. */ +#if defined _MSC_VER && BUILDING_DLL +# define DLL_EXPORTED __declspec(dllexport) +#else +# define DLL_EXPORTED +#endif + + +DLL_EXPORTED +char * +gettext (const char *msgid) +{ + return libintl_gettext (msgid); +} + + +DLL_EXPORTED +char * +dgettext (const char *domainname, const char *msgid) +{ + return libintl_dgettext (domainname, msgid); +} + + +DLL_EXPORTED +char * +dcgettext (const char *domainname, const char *msgid, int category) +{ + return libintl_dcgettext (domainname, msgid, category); +} + + +DLL_EXPORTED +char * +ngettext (const char *msgid1, const char *msgid2, unsigned long int n) +{ + return libintl_ngettext (msgid1, msgid2, n); +} + + +DLL_EXPORTED +char * +dngettext (const char *domainname, + const char *msgid1, const char *msgid2, unsigned long int n) +{ + return libintl_dngettext (domainname, msgid1, msgid2, n); +} + + +DLL_EXPORTED +char * +dcngettext (const char *domainname, + const char *msgid1, const char *msgid2, unsigned long int n, + int category) +{ + return libintl_dcngettext (domainname, msgid1, msgid2, n, category); +} + + +DLL_EXPORTED +char * +textdomain (const char *domainname) +{ + return libintl_textdomain (domainname); +} + + +DLL_EXPORTED +char * +bindtextdomain (const char *domainname, const char *dirname) +{ + return libintl_bindtextdomain (domainname, dirname); +} + + +DLL_EXPORTED +char * +bind_textdomain_codeset (const char *domainname, const char *codeset) +{ + return libintl_bind_textdomain_codeset (domainname, codeset); +} diff --git a/intl/l10nflist.c b/intl/l10nflist.c new file mode 100644 index 0000000..eb995aa --- /dev/null +++ b/intl/l10nflist.c @@ -0,0 +1,421 @@ +/* Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc. + Contributed by Ulrich Drepper , 1995. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Tell glibc's to provide a prototype for stpcpy(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#if defined _LIBC || defined HAVE_ARGZ_H +# include +#endif +#include +#include +#include + +#include "loadinfo.h" + +/* On some strange systems still no definition of NULL is found. Sigh! */ +#ifndef NULL +# if defined __STDC__ && __STDC__ +# define NULL ((void *) 0) +# else +# define NULL 0 +# endif +#endif + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# ifndef stpcpy +# define stpcpy(dest, src) __stpcpy(dest, src) +# endif +#else +# ifndef HAVE_STPCPY +static char *stpcpy (char *dest, const char *src); +# endif +#endif + +/* Pathname support. + ISSLASH(C) tests whether C is a directory separator character. + IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not, + it may be concatenated to a directory pathname. + */ +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +# define HAS_DEVICE(P) \ + ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ + && (P)[1] == ':') +# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P)) +#else + /* Unix */ +# define ISSLASH(C) ((C) == '/') +# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0]) +#endif + +/* Define function which are usually not available. */ + +#if !defined _LIBC && !defined HAVE___ARGZ_COUNT +/* Returns the number of strings in ARGZ. */ +static size_t +argz_count__ (const char *argz, size_t len) +{ + size_t count = 0; + while (len > 0) + { + size_t part_len = strlen (argz); + argz += part_len + 1; + len -= part_len + 1; + count++; + } + return count; +} +# undef __argz_count +# define __argz_count(argz, len) argz_count__ (argz, len) +#else +# ifdef _LIBC +# define __argz_count(argz, len) INTUSE(__argz_count) (argz, len) +# endif +#endif /* !_LIBC && !HAVE___ARGZ_COUNT */ + +#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY +/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's + except the last into the character SEP. */ +static void +argz_stringify__ (char *argz, size_t len, int sep) +{ + while (len > 0) + { + size_t part_len = strlen (argz); + argz += part_len; + len -= part_len + 1; + if (len > 0) + *argz++ = sep; + } +} +# undef __argz_stringify +# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep) +#else +# ifdef _LIBC +# define __argz_stringify(argz, len, sep) \ + INTUSE(__argz_stringify) (argz, len, sep) +# endif +#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */ + +#if !defined _LIBC && !defined HAVE___ARGZ_NEXT +static char * +argz_next__ (char *argz, size_t argz_len, const char *entry) +{ + if (entry) + { + if (entry < argz + argz_len) + entry = strchr (entry, '\0') + 1; + + return entry >= argz + argz_len ? NULL : (char *) entry; + } + else + if (argz_len > 0) + return argz; + else + return 0; +} +# undef __argz_next +# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry) +#endif /* !_LIBC && !HAVE___ARGZ_NEXT */ + + +/* Return number of bits set in X. */ +static inline int +pop (int x) +{ + /* We assume that no more than 16 bits are used. */ + x = ((x & ~0x5555) >> 1) + (x & 0x5555); + x = ((x & ~0x3333) >> 2) + (x & 0x3333); + x = ((x >> 4) + x) & 0x0f0f; + x = ((x >> 8) + x) & 0xff; + + return x; +} + + +struct loaded_l10nfile * +_nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list, + const char *dirlist, size_t dirlist_len, + int mask, const char *language, const char *territory, + const char *codeset, const char *normalized_codeset, + const char *modifier, const char *special, + const char *sponsor, const char *revision, + const char *filename, int do_allocate) +{ + char *abs_filename; + struct loaded_l10nfile **lastp; + struct loaded_l10nfile *retval; + char *cp; + size_t dirlist_count; + size_t entries; + int cnt; + + /* If LANGUAGE contains an absolute directory specification, we ignore + DIRLIST. */ + if (IS_ABSOLUTE_PATH (language)) + dirlist_len = 0; + + /* Allocate room for the full file name. */ + abs_filename = (char *) malloc (dirlist_len + + strlen (language) + + ((mask & TERRITORY) != 0 + ? strlen (territory) + 1 : 0) + + ((mask & XPG_CODESET) != 0 + ? strlen (codeset) + 1 : 0) + + ((mask & XPG_NORM_CODESET) != 0 + ? strlen (normalized_codeset) + 1 : 0) + + (((mask & XPG_MODIFIER) != 0 + || (mask & CEN_AUDIENCE) != 0) + ? strlen (modifier) + 1 : 0) + + ((mask & CEN_SPECIAL) != 0 + ? strlen (special) + 1 : 0) + + (((mask & CEN_SPONSOR) != 0 + || (mask & CEN_REVISION) != 0) + ? (1 + ((mask & CEN_SPONSOR) != 0 + ? strlen (sponsor) : 0) + + ((mask & CEN_REVISION) != 0 + ? strlen (revision) + 1 : 0)) : 0) + + 1 + strlen (filename) + 1); + + if (abs_filename == NULL) + return NULL; + + /* Construct file name. */ + cp = abs_filename; + if (dirlist_len > 0) + { + memcpy (cp, dirlist, dirlist_len); + __argz_stringify (cp, dirlist_len, PATH_SEPARATOR); + cp += dirlist_len; + cp[-1] = '/'; + } + + cp = stpcpy (cp, language); + + if ((mask & TERRITORY) != 0) + { + *cp++ = '_'; + cp = stpcpy (cp, territory); + } + if ((mask & XPG_CODESET) != 0) + { + *cp++ = '.'; + cp = stpcpy (cp, codeset); + } + if ((mask & XPG_NORM_CODESET) != 0) + { + *cp++ = '.'; + cp = stpcpy (cp, normalized_codeset); + } + if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0) + { + /* This component can be part of both syntaces but has different + leading characters. For CEN we use `+', else `@'. */ + *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@'; + cp = stpcpy (cp, modifier); + } + if ((mask & CEN_SPECIAL) != 0) + { + *cp++ = '+'; + cp = stpcpy (cp, special); + } + if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0) + { + *cp++ = ','; + if ((mask & CEN_SPONSOR) != 0) + cp = stpcpy (cp, sponsor); + if ((mask & CEN_REVISION) != 0) + { + *cp++ = '_'; + cp = stpcpy (cp, revision); + } + } + + *cp++ = '/'; + stpcpy (cp, filename); + + /* Look in list of already loaded domains whether it is already + available. */ + lastp = l10nfile_list; + for (retval = *l10nfile_list; retval != NULL; retval = retval->next) + if (retval->filename != NULL) + { + int compare = strcmp (retval->filename, abs_filename); + if (compare == 0) + /* We found it! */ + break; + if (compare < 0) + { + /* It's not in the list. */ + retval = NULL; + break; + } + + lastp = &retval->next; + } + + if (retval != NULL || do_allocate == 0) + { + free (abs_filename); + return retval; + } + + dirlist_count = (dirlist_len > 0 ? __argz_count (dirlist, dirlist_len) : 1); + + /* Allocate a new loaded_l10nfile. */ + retval = + (struct loaded_l10nfile *) + malloc (sizeof (*retval) + + (((dirlist_count << pop (mask)) + (dirlist_count > 1 ? 1 : 0)) + * sizeof (struct loaded_l10nfile *))); + if (retval == NULL) + return NULL; + + retval->filename = abs_filename; + + /* We set retval->data to NULL here; it is filled in later. + Setting retval->decided to 1 here means that retval does not + correspond to a real file (dirlist_count > 1) or is not worth + looking up (if an unnormalized codeset was specified). */ + retval->decided = (dirlist_count > 1 + || ((mask & XPG_CODESET) != 0 + && (mask & XPG_NORM_CODESET) != 0)); + retval->data = NULL; + + retval->next = *lastp; + *lastp = retval; + + entries = 0; + /* Recurse to fill the inheritance list of RETVAL. + If the DIRLIST is a real list (i.e. DIRLIST_COUNT > 1), the RETVAL + entry does not correspond to a real file; retval->filename contains + colons. In this case we loop across all elements of DIRLIST and + across all bit patterns dominated by MASK. + If the DIRLIST is a single directory or entirely redundant (i.e. + DIRLIST_COUNT == 1), we loop across all bit patterns dominated by + MASK, excluding MASK itself. + In either case, we loop down from MASK to 0. This has the effect + that the extra bits in the locale name are dropped in this order: + first the modifier, then the territory, then the codeset, then the + normalized_codeset. */ + for (cnt = dirlist_count > 1 ? mask : mask - 1; cnt >= 0; --cnt) + if ((cnt & ~mask) == 0 + && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0) + && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0)) + { + if (dirlist_count > 1) + { + /* Iterate over all elements of the DIRLIST. */ + char *dir = NULL; + + while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir)) + != NULL) + retval->successor[entries++] + = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, + cnt, language, territory, codeset, + normalized_codeset, modifier, special, + sponsor, revision, filename, 1); + } + else + retval->successor[entries++] + = _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, + cnt, language, territory, codeset, + normalized_codeset, modifier, special, + sponsor, revision, filename, 1); + } + retval->successor[entries] = NULL; + + return retval; +} + +/* Normalize codeset name. There is no standard for the codeset + names. Normalization allows the user to use any of the common + names. The return value is dynamically allocated and has to be + freed by the caller. */ +const char * +_nl_normalize_codeset (const char *codeset, size_t name_len) +{ + int len = 0; + int only_digit = 1; + char *retval; + char *wp; + size_t cnt; + + for (cnt = 0; cnt < name_len; ++cnt) + if (isalnum ((unsigned char) codeset[cnt])) + { + ++len; + + if (isalpha ((unsigned char) codeset[cnt])) + only_digit = 0; + } + + retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1); + + if (retval != NULL) + { + if (only_digit) + wp = stpcpy (retval, "iso"); + else + wp = retval; + + for (cnt = 0; cnt < name_len; ++cnt) + if (isalpha ((unsigned char) codeset[cnt])) + *wp++ = tolower ((unsigned char) codeset[cnt]); + else if (isdigit ((unsigned char) codeset[cnt])) + *wp++ = codeset[cnt]; + + *wp = '\0'; + } + + return (const char *) retval; +} + + +/* @@ begin of epilog @@ */ + +/* We don't want libintl.a to depend on any other library. So we + avoid the non-standard function stpcpy. In GNU C Library this + function is available, though. Also allow the symbol HAVE_STPCPY + to be defined. */ +#if !_LIBC && !HAVE_STPCPY +static char * +stpcpy (char *dest, const char *src) +{ + while ((*dest++ = *src++) != '\0') + /* Do nothing. */ ; + return dest - 1; +} +#endif diff --git a/intl/libgnuintl.h.in b/intl/libgnuintl.h.in new file mode 100644 index 0000000..3be7eb9 --- /dev/null +++ b/intl/libgnuintl.h.in @@ -0,0 +1,383 @@ +/* Message catalogs for internationalization. + Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _LIBINTL_H +#define _LIBINTL_H 1 + +#include + +/* The LC_MESSAGES locale category is the category used by the functions + gettext() and dgettext(). It is specified in POSIX, but not in ANSI C. + On systems that don't define it, use an arbitrary value instead. + On Solaris, defines __LOCALE_H (or _LOCALE_H in Solaris 2.5) + then includes (i.e. this file!) and then only defines + LC_MESSAGES. To avoid a redefinition warning, don't define LC_MESSAGES + in this case. */ +#if !defined LC_MESSAGES && !(defined __LOCALE_H || (defined _LOCALE_H && defined __sun)) +# define LC_MESSAGES 1729 +#endif + +/* We define an additional symbol to signal that we use the GNU + implementation of gettext. */ +#define __USE_GNU_GETTEXT 1 + +/* Provide information about the supported file formats. Returns the + maximum minor revision number supported for a given major revision. */ +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) \ + ((major) == 0 ? 1 : -1) + +/* Resolve a platform specific conflict on DJGPP. GNU gettext takes + precedence over _conio_gettext. */ +#ifdef __DJGPP__ +# undef gettext +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + +/* We redirect the functions to those prefixed with "libintl_". This is + necessary, because some systems define gettext/textdomain/... in the C + library (namely, Solaris 2.4 and newer, and GNU libc 2.0 and newer). + If we used the unprefixed names, there would be cases where the + definition in the C library would override the one in the libintl.so + shared library. Recall that on ELF systems, the symbols are looked + up in the following order: + 1. in the executable, + 2. in the shared libraries specified on the link command line, in order, + 3. in the dependencies of the shared libraries specified on the link + command line, + 4. in the dlopen()ed shared libraries, in the order in which they were + dlopen()ed. + The definition in the C library would override the one in libintl.so if + either + * -lc is given on the link command line and -lintl isn't, or + * -lc is given on the link command line before -lintl, or + * libintl.so is a dependency of a dlopen()ed shared library but not + linked to the executable at link time. + Since Solaris gettext() behaves differently than GNU gettext(), this + would be unacceptable. + + The redirection happens by default through macros in C, so that &gettext + is independent of the compilation unit, but through inline functions in + C++, in order not to interfere with the name mangling of class fields or + class methods called 'gettext'. */ + +/* The user can define _INTL_REDIRECT_INLINE or _INTL_REDIRECT_MACROS. + If he doesn't, we choose the method. A third possible method is + _INTL_REDIRECT_ASM, supported only by GCC. */ +#if !(defined _INTL_REDIRECT_INLINE || defined _INTL_REDIRECT_MACROS) +# if __GNUC__ >= 2 && !defined __APPLE_CC__ && !defined __MINGW32__ && !(__GNUC__ == 2 && defined _AIX) && (defined __STDC__ || defined __cplusplus) +# define _INTL_REDIRECT_ASM +# else +# ifdef __cplusplus +# define _INTL_REDIRECT_INLINE +# else +# define _INTL_REDIRECT_MACROS +# endif +# endif +#endif +/* Auxiliary macros. */ +#ifdef _INTL_REDIRECT_ASM +# define _INTL_ASM(cname) __asm__ (_INTL_ASMNAME (__USER_LABEL_PREFIX__, #cname)) +# define _INTL_ASMNAME(prefix,cnamestring) _INTL_STRINGIFY (prefix) cnamestring +# define _INTL_STRINGIFY(prefix) #prefix +#else +# define _INTL_ASM(cname) +#endif + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_gettext (const char *__msgid); +static inline char *gettext (const char *__msgid) +{ + return libintl_gettext (__msgid); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define gettext libintl_gettext +#endif +extern char *gettext (const char *__msgid) + _INTL_ASM (libintl_gettext); +#endif + +/* Look up MSGID in the DOMAINNAME message catalog for the current + LC_MESSAGES locale. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_dgettext (const char *__domainname, const char *__msgid); +static inline char *dgettext (const char *__domainname, const char *__msgid) +{ + return libintl_dgettext (__domainname, __msgid); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define dgettext libintl_dgettext +#endif +extern char *dgettext (const char *__domainname, const char *__msgid) + _INTL_ASM (libintl_dgettext); +#endif + +/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY + locale. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_dcgettext (const char *__domainname, const char *__msgid, + int __category); +static inline char *dcgettext (const char *__domainname, const char *__msgid, + int __category) +{ + return libintl_dcgettext (__domainname, __msgid, __category); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define dcgettext libintl_dcgettext +#endif +extern char *dcgettext (const char *__domainname, const char *__msgid, + int __category) + _INTL_ASM (libintl_dcgettext); +#endif + + +/* Similar to `gettext' but select the plural form corresponding to the + number N. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_ngettext (const char *__msgid1, const char *__msgid2, + unsigned long int __n); +static inline char *ngettext (const char *__msgid1, const char *__msgid2, + unsigned long int __n) +{ + return libintl_ngettext (__msgid1, __msgid2, __n); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define ngettext libintl_ngettext +#endif +extern char *ngettext (const char *__msgid1, const char *__msgid2, + unsigned long int __n) + _INTL_ASM (libintl_ngettext); +#endif + +/* Similar to `dgettext' but select the plural form corresponding to the + number N. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_dngettext (const char *__domainname, const char *__msgid1, + const char *__msgid2, unsigned long int __n); +static inline char *dngettext (const char *__domainname, const char *__msgid1, + const char *__msgid2, unsigned long int __n) +{ + return libintl_dngettext (__domainname, __msgid1, __msgid2, __n); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define dngettext libintl_dngettext +#endif +extern char *dngettext (const char *__domainname, + const char *__msgid1, const char *__msgid2, + unsigned long int __n) + _INTL_ASM (libintl_dngettext); +#endif + +/* Similar to `dcgettext' but select the plural form corresponding to the + number N. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_dcngettext (const char *__domainname, + const char *__msgid1, const char *__msgid2, + unsigned long int __n, int __category); +static inline char *dcngettext (const char *__domainname, + const char *__msgid1, const char *__msgid2, + unsigned long int __n, int __category) +{ + return libintl_dcngettext (__domainname, __msgid1, __msgid2, __n, __category); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define dcngettext libintl_dcngettext +#endif +extern char *dcngettext (const char *__domainname, + const char *__msgid1, const char *__msgid2, + unsigned long int __n, int __category) + _INTL_ASM (libintl_dcngettext); +#endif + + +/* Set the current default message catalog to DOMAINNAME. + If DOMAINNAME is null, return the current default. + If DOMAINNAME is "", reset to the default of "messages". */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_textdomain (const char *__domainname); +static inline char *textdomain (const char *__domainname) +{ + return libintl_textdomain (__domainname); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define textdomain libintl_textdomain +#endif +extern char *textdomain (const char *__domainname) + _INTL_ASM (libintl_textdomain); +#endif + +/* Specify that the DOMAINNAME message catalog will be found + in DIRNAME rather than in the system locale data base. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_bindtextdomain (const char *__domainname, + const char *__dirname); +static inline char *bindtextdomain (const char *__domainname, + const char *__dirname) +{ + return libintl_bindtextdomain (__domainname, __dirname); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define bindtextdomain libintl_bindtextdomain +#endif +extern char *bindtextdomain (const char *__domainname, const char *__dirname) + _INTL_ASM (libintl_bindtextdomain); +#endif + +/* Specify the character encoding in which the messages from the + DOMAINNAME message catalog will be returned. */ +#ifdef _INTL_REDIRECT_INLINE +extern char *libintl_bind_textdomain_codeset (const char *__domainname, + const char *__codeset); +static inline char *bind_textdomain_codeset (const char *__domainname, + const char *__codeset) +{ + return libintl_bind_textdomain_codeset (__domainname, __codeset); +} +#else +#ifdef _INTL_REDIRECT_MACROS +# define bind_textdomain_codeset libintl_bind_textdomain_codeset +#endif +extern char *bind_textdomain_codeset (const char *__domainname, + const char *__codeset) + _INTL_ASM (libintl_bind_textdomain_codeset); +#endif + + +/* Support for format strings with positions in *printf(), following the + POSIX/XSI specification. + Note: These replacements for the *printf() functions are visible only + in source files that #include or #include "gettext.h". + Packages that use *printf() in source files that don't refer to _() + or gettext() but for which the format string could be the return value + of _() or gettext() need to add this #include. Oh well. */ + +#if !@HAVE_POSIX_PRINTF@ + +#include +#include + +/* Get va_list. */ +#if __STDC__ || defined __cplusplus || defined _MSC_VER +# include +#else +# include +#endif + +#undef fprintf +#define fprintf libintl_fprintf +extern int fprintf (FILE *, const char *, ...); +#undef vfprintf +#define vfprintf libintl_vfprintf +extern int vfprintf (FILE *, const char *, va_list); + +#undef printf +#define printf libintl_printf +extern int printf (const char *, ...); +#undef vprintf +#define vprintf libintl_vprintf +extern int vprintf (const char *, va_list); + +#undef sprintf +#define sprintf libintl_sprintf +extern int sprintf (char *, const char *, ...); +#undef vsprintf +#define vsprintf libintl_vsprintf +extern int vsprintf (char *, const char *, va_list); + +#if @HAVE_SNPRINTF@ + +#undef snprintf +#define snprintf libintl_snprintf +extern int snprintf (char *, size_t, const char *, ...); +#undef vsnprintf +#define vsnprintf libintl_vsnprintf +extern int vsnprintf (char *, size_t, const char *, va_list); + +#endif + +#if @HAVE_ASPRINTF@ + +#undef asprintf +#define asprintf libintl_asprintf +extern int asprintf (char **, const char *, ...); +#undef vasprintf +#define vasprintf libintl_vasprintf +extern int vasprintf (char **, const char *, va_list); + +#endif + +#if @HAVE_WPRINTF@ + +#undef fwprintf +#define fwprintf libintl_fwprintf +extern int fwprintf (FILE *, const wchar_t *, ...); +#undef vfwprintf +#define vfwprintf libintl_vfwprintf +extern int vfwprintf (FILE *, const wchar_t *, va_list); + +#undef wprintf +#define wprintf libintl_wprintf +extern int wprintf (const wchar_t *, ...); +#undef vwprintf +#define vwprintf libintl_vwprintf +extern int vwprintf (const wchar_t *, va_list); + +#undef swprintf +#define swprintf libintl_swprintf +extern int swprintf (wchar_t *, size_t, const wchar_t *, ...); +#undef vswprintf +#define vswprintf libintl_vswprintf +extern int vswprintf (wchar_t *, size_t, const wchar_t *, va_list); + +#endif + +#endif + + +/* Support for relocatable packages. */ + +/* Sets the original and the current installation prefix of the package. + Relocation simply replaces a pathname starting with the original prefix + by the corresponding pathname with the current prefix instead. Both + prefixes should be directory names without trailing slash (i.e. use "" + instead of "/"). */ +#define libintl_set_relocation_prefix libintl_set_relocation_prefix +extern void + libintl_set_relocation_prefix (const char *orig_prefix, + const char *curr_prefix); + + +#ifdef __cplusplus +} +#endif + +#endif /* libintl.h */ diff --git a/intl/loadinfo.h b/intl/loadinfo.h new file mode 100644 index 0000000..65e5ebd --- /dev/null +++ b/intl/loadinfo.h @@ -0,0 +1,145 @@ +/* Copyright (C) 1996-1999, 2000-2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1996. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _LOADINFO_H +#define _LOADINFO_H 1 + +/* Declarations of locale dependent catalog lookup functions. + Implemented in + + localealias.c Possibly replace a locale name by another. + explodename.c Split a locale name into its various fields. + l10nflist.c Generate a list of filenames of possible message catalogs. + finddomain.c Find and open the relevant message catalogs. + + The main function _nl_find_domain() in finddomain.c is declared + in gettextP.h. + */ + +#ifndef internal_function +# define internal_function +#endif + +/* Tell the compiler when a conditional or integer expression is + almost always true or almost always false. */ +#ifndef HAVE_BUILTIN_EXPECT +# define __builtin_expect(expr, val) (expr) +#endif + +/* Separator in PATH like lists of pathnames. */ +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define PATH_SEPARATOR ';' +#else + /* Unix */ +# define PATH_SEPARATOR ':' +#endif + +/* Encoding of locale name parts. */ +#define CEN_REVISION 1 +#define CEN_SPONSOR 2 +#define CEN_SPECIAL 4 +#define XPG_NORM_CODESET 8 +#define XPG_CODESET 16 +#define TERRITORY 32 +#define CEN_AUDIENCE 64 +#define XPG_MODIFIER 128 + +#define CEN_SPECIFIC (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE) +#define XPG_SPECIFIC (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER) + + +struct loaded_l10nfile +{ + const char *filename; + int decided; + + const void *data; + + struct loaded_l10nfile *next; + struct loaded_l10nfile *successor[1]; +}; + + +/* Normalize codeset name. There is no standard for the codeset + names. Normalization allows the user to use any of the common + names. The return value is dynamically allocated and has to be + freed by the caller. */ +extern const char *_nl_normalize_codeset (const char *codeset, + size_t name_len); + +/* Lookup a locale dependent file. + *L10NFILE_LIST denotes a pool of lookup results of locale dependent + files of the same kind, sorted in decreasing order of ->filename. + DIRLIST and DIRLIST_LEN are an argz list of directories in which to + look, containing at least one directory (i.e. DIRLIST_LEN > 0). + MASK, LANGUAGE, TERRITORY, CODESET, NORMALIZED_CODESET, MODIFIER, + SPECIAL, SPONSOR, REVISION are the pieces of the locale name, as + produced by _nl_explode_name(). FILENAME is the filename suffix. + The return value is the lookup result, either found in *L10NFILE_LIST, + or - if DO_ALLOCATE is nonzero - freshly allocated, or possibly NULL. + If the return value is non-NULL, it is added to *L10NFILE_LIST, and + its ->next field denotes the chaining inside *L10NFILE_LIST, and + furthermore its ->successor[] field contains a list of other lookup + results from which this lookup result inherits. */ +extern struct loaded_l10nfile * +_nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list, + const char *dirlist, size_t dirlist_len, int mask, + const char *language, const char *territory, + const char *codeset, const char *normalized_codeset, + const char *modifier, const char *special, + const char *sponsor, const char *revision, + const char *filename, int do_allocate); + +/* Lookup the real locale name for a locale alias NAME, or NULL if + NAME is not a locale alias (but possibly a real locale name). + The return value is statically allocated and must not be freed. */ +extern const char *_nl_expand_alias (const char *name); + +/* Split a locale name NAME into its pieces: language, modifier, + territory, codeset, special, sponsor, revision. + NAME gets destructively modified: NUL bytes are inserted here and + there. *LANGUAGE gets assigned NAME. Each of *MODIFIER, *TERRITORY, + *CODESET, *SPECIAL, *SPONSOR, *REVISION gets assigned either a + pointer into the old NAME string, or NULL. *NORMALIZED_CODESET + gets assigned the expanded *CODESET, if it is different from *CODESET; + this one is dynamically allocated and has to be freed by the caller. + The return value is a bitmask, where each bit corresponds to one + filled-in value: + XPG_MODIFIER, CEN_AUDIENCE for *MODIFIER, + TERRITORY for *TERRITORY, + XPG_CODESET for *CODESET, + XPG_NORM_CODESET for *NORMALIZED_CODESET, + CEN_SPECIAL for *SPECIAL, + CEN_SPONSOR for *SPONSOR, + CEN_REVISION for *REVISION. + */ +extern int _nl_explode_name (char *name, const char **language, + const char **modifier, const char **territory, + const char **codeset, + const char **normalized_codeset, + const char **special, const char **sponsor, + const char **revision); + +/* Split a locale name NAME into a leading language part and all the + rest. Return a pointer to the first character after the language, + i.e. to the first byte of the rest. */ +extern char *_nl_find_language (const char *name); + +#endif /* loadinfo.h */ diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c new file mode 100644 index 0000000..99c51b4 --- /dev/null +++ b/intl/loadmsgcat.c @@ -0,0 +1,1420 @@ +/* Load needed message catalogs. + Copyright (C) 1995-1999, 2000-2004 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Tell glibc's to provide a prototype for mempcpy(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include + +#ifdef __GNUC__ +# undef alloca +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# ifdef _MSC_VER +# include +# define alloca _alloca +# else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +#include +#include + +#if defined HAVE_UNISTD_H || defined _LIBC +# include +#endif + +#ifdef _LIBC +# include +# include +#endif + +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || (defined _LIBC && defined _POSIX_MAPPED_FILES) +# include +# undef HAVE_MMAP +# define HAVE_MMAP 1 +#else +# undef HAVE_MMAP +#endif + +#if defined HAVE_STDINT_H_WITH_UINTMAX || defined _LIBC +# include +#endif +#if defined HAVE_INTTYPES_H || defined _LIBC +# include +#endif + +#include "gmo.h" +#include "gettextP.h" +#include "hash-string.h" +#include "plural-exp.h" + +#ifdef _LIBC +# include "../locale/localeinfo.h" +#endif + +/* Provide fallback values for macros that ought to be defined in . + Note that our fallback values need not be literal strings, because we don't + use them with preprocessor string concatenation. */ +#if !defined PRId8 || PRI_MACROS_BROKEN +# undef PRId8 +# define PRId8 "d" +#endif +#if !defined PRIi8 || PRI_MACROS_BROKEN +# undef PRIi8 +# define PRIi8 "i" +#endif +#if !defined PRIo8 || PRI_MACROS_BROKEN +# undef PRIo8 +# define PRIo8 "o" +#endif +#if !defined PRIu8 || PRI_MACROS_BROKEN +# undef PRIu8 +# define PRIu8 "u" +#endif +#if !defined PRIx8 || PRI_MACROS_BROKEN +# undef PRIx8 +# define PRIx8 "x" +#endif +#if !defined PRIX8 || PRI_MACROS_BROKEN +# undef PRIX8 +# define PRIX8 "X" +#endif +#if !defined PRId16 || PRI_MACROS_BROKEN +# undef PRId16 +# define PRId16 "d" +#endif +#if !defined PRIi16 || PRI_MACROS_BROKEN +# undef PRIi16 +# define PRIi16 "i" +#endif +#if !defined PRIo16 || PRI_MACROS_BROKEN +# undef PRIo16 +# define PRIo16 "o" +#endif +#if !defined PRIu16 || PRI_MACROS_BROKEN +# undef PRIu16 +# define PRIu16 "u" +#endif +#if !defined PRIx16 || PRI_MACROS_BROKEN +# undef PRIx16 +# define PRIx16 "x" +#endif +#if !defined PRIX16 || PRI_MACROS_BROKEN +# undef PRIX16 +# define PRIX16 "X" +#endif +#if !defined PRId32 || PRI_MACROS_BROKEN +# undef PRId32 +# define PRId32 "d" +#endif +#if !defined PRIi32 || PRI_MACROS_BROKEN +# undef PRIi32 +# define PRIi32 "i" +#endif +#if !defined PRIo32 || PRI_MACROS_BROKEN +# undef PRIo32 +# define PRIo32 "o" +#endif +#if !defined PRIu32 || PRI_MACROS_BROKEN +# undef PRIu32 +# define PRIu32 "u" +#endif +#if !defined PRIx32 || PRI_MACROS_BROKEN +# undef PRIx32 +# define PRIx32 "x" +#endif +#if !defined PRIX32 || PRI_MACROS_BROKEN +# undef PRIX32 +# define PRIX32 "X" +#endif +#if !defined PRId64 || PRI_MACROS_BROKEN +# undef PRId64 +# define PRId64 (sizeof (long) == 8 ? "ld" : "lld") +#endif +#if !defined PRIi64 || PRI_MACROS_BROKEN +# undef PRIi64 +# define PRIi64 (sizeof (long) == 8 ? "li" : "lli") +#endif +#if !defined PRIo64 || PRI_MACROS_BROKEN +# undef PRIo64 +# define PRIo64 (sizeof (long) == 8 ? "lo" : "llo") +#endif +#if !defined PRIu64 || PRI_MACROS_BROKEN +# undef PRIu64 +# define PRIu64 (sizeof (long) == 8 ? "lu" : "llu") +#endif +#if !defined PRIx64 || PRI_MACROS_BROKEN +# undef PRIx64 +# define PRIx64 (sizeof (long) == 8 ? "lx" : "llx") +#endif +#if !defined PRIX64 || PRI_MACROS_BROKEN +# undef PRIX64 +# define PRIX64 (sizeof (long) == 8 ? "lX" : "llX") +#endif +#if !defined PRIdLEAST8 || PRI_MACROS_BROKEN +# undef PRIdLEAST8 +# define PRIdLEAST8 "d" +#endif +#if !defined PRIiLEAST8 || PRI_MACROS_BROKEN +# undef PRIiLEAST8 +# define PRIiLEAST8 "i" +#endif +#if !defined PRIoLEAST8 || PRI_MACROS_BROKEN +# undef PRIoLEAST8 +# define PRIoLEAST8 "o" +#endif +#if !defined PRIuLEAST8 || PRI_MACROS_BROKEN +# undef PRIuLEAST8 +# define PRIuLEAST8 "u" +#endif +#if !defined PRIxLEAST8 || PRI_MACROS_BROKEN +# undef PRIxLEAST8 +# define PRIxLEAST8 "x" +#endif +#if !defined PRIXLEAST8 || PRI_MACROS_BROKEN +# undef PRIXLEAST8 +# define PRIXLEAST8 "X" +#endif +#if !defined PRIdLEAST16 || PRI_MACROS_BROKEN +# undef PRIdLEAST16 +# define PRIdLEAST16 "d" +#endif +#if !defined PRIiLEAST16 || PRI_MACROS_BROKEN +# undef PRIiLEAST16 +# define PRIiLEAST16 "i" +#endif +#if !defined PRIoLEAST16 || PRI_MACROS_BROKEN +# undef PRIoLEAST16 +# define PRIoLEAST16 "o" +#endif +#if !defined PRIuLEAST16 || PRI_MACROS_BROKEN +# undef PRIuLEAST16 +# define PRIuLEAST16 "u" +#endif +#if !defined PRIxLEAST16 || PRI_MACROS_BROKEN +# undef PRIxLEAST16 +# define PRIxLEAST16 "x" +#endif +#if !defined PRIXLEAST16 || PRI_MACROS_BROKEN +# undef PRIXLEAST16 +# define PRIXLEAST16 "X" +#endif +#if !defined PRIdLEAST32 || PRI_MACROS_BROKEN +# undef PRIdLEAST32 +# define PRIdLEAST32 "d" +#endif +#if !defined PRIiLEAST32 || PRI_MACROS_BROKEN +# undef PRIiLEAST32 +# define PRIiLEAST32 "i" +#endif +#if !defined PRIoLEAST32 || PRI_MACROS_BROKEN +# undef PRIoLEAST32 +# define PRIoLEAST32 "o" +#endif +#if !defined PRIuLEAST32 || PRI_MACROS_BROKEN +# undef PRIuLEAST32 +# define PRIuLEAST32 "u" +#endif +#if !defined PRIxLEAST32 || PRI_MACROS_BROKEN +# undef PRIxLEAST32 +# define PRIxLEAST32 "x" +#endif +#if !defined PRIXLEAST32 || PRI_MACROS_BROKEN +# undef PRIXLEAST32 +# define PRIXLEAST32 "X" +#endif +#if !defined PRIdLEAST64 || PRI_MACROS_BROKEN +# undef PRIdLEAST64 +# define PRIdLEAST64 PRId64 +#endif +#if !defined PRIiLEAST64 || PRI_MACROS_BROKEN +# undef PRIiLEAST64 +# define PRIiLEAST64 PRIi64 +#endif +#if !defined PRIoLEAST64 || PRI_MACROS_BROKEN +# undef PRIoLEAST64 +# define PRIoLEAST64 PRIo64 +#endif +#if !defined PRIuLEAST64 || PRI_MACROS_BROKEN +# undef PRIuLEAST64 +# define PRIuLEAST64 PRIu64 +#endif +#if !defined PRIxLEAST64 || PRI_MACROS_BROKEN +# undef PRIxLEAST64 +# define PRIxLEAST64 PRIx64 +#endif +#if !defined PRIXLEAST64 || PRI_MACROS_BROKEN +# undef PRIXLEAST64 +# define PRIXLEAST64 PRIX64 +#endif +#if !defined PRIdFAST8 || PRI_MACROS_BROKEN +# undef PRIdFAST8 +# define PRIdFAST8 "d" +#endif +#if !defined PRIiFAST8 || PRI_MACROS_BROKEN +# undef PRIiFAST8 +# define PRIiFAST8 "i" +#endif +#if !defined PRIoFAST8 || PRI_MACROS_BROKEN +# undef PRIoFAST8 +# define PRIoFAST8 "o" +#endif +#if !defined PRIuFAST8 || PRI_MACROS_BROKEN +# undef PRIuFAST8 +# define PRIuFAST8 "u" +#endif +#if !defined PRIxFAST8 || PRI_MACROS_BROKEN +# undef PRIxFAST8 +# define PRIxFAST8 "x" +#endif +#if !defined PRIXFAST8 || PRI_MACROS_BROKEN +# undef PRIXFAST8 +# define PRIXFAST8 "X" +#endif +#if !defined PRIdFAST16 || PRI_MACROS_BROKEN +# undef PRIdFAST16 +# define PRIdFAST16 "d" +#endif +#if !defined PRIiFAST16 || PRI_MACROS_BROKEN +# undef PRIiFAST16 +# define PRIiFAST16 "i" +#endif +#if !defined PRIoFAST16 || PRI_MACROS_BROKEN +# undef PRIoFAST16 +# define PRIoFAST16 "o" +#endif +#if !defined PRIuFAST16 || PRI_MACROS_BROKEN +# undef PRIuFAST16 +# define PRIuFAST16 "u" +#endif +#if !defined PRIxFAST16 || PRI_MACROS_BROKEN +# undef PRIxFAST16 +# define PRIxFAST16 "x" +#endif +#if !defined PRIXFAST16 || PRI_MACROS_BROKEN +# undef PRIXFAST16 +# define PRIXFAST16 "X" +#endif +#if !defined PRIdFAST32 || PRI_MACROS_BROKEN +# undef PRIdFAST32 +# define PRIdFAST32 "d" +#endif +#if !defined PRIiFAST32 || PRI_MACROS_BROKEN +# undef PRIiFAST32 +# define PRIiFAST32 "i" +#endif +#if !defined PRIoFAST32 || PRI_MACROS_BROKEN +# undef PRIoFAST32 +# define PRIoFAST32 "o" +#endif +#if !defined PRIuFAST32 || PRI_MACROS_BROKEN +# undef PRIuFAST32 +# define PRIuFAST32 "u" +#endif +#if !defined PRIxFAST32 || PRI_MACROS_BROKEN +# undef PRIxFAST32 +# define PRIxFAST32 "x" +#endif +#if !defined PRIXFAST32 || PRI_MACROS_BROKEN +# undef PRIXFAST32 +# define PRIXFAST32 "X" +#endif +#if !defined PRIdFAST64 || PRI_MACROS_BROKEN +# undef PRIdFAST64 +# define PRIdFAST64 PRId64 +#endif +#if !defined PRIiFAST64 || PRI_MACROS_BROKEN +# undef PRIiFAST64 +# define PRIiFAST64 PRIi64 +#endif +#if !defined PRIoFAST64 || PRI_MACROS_BROKEN +# undef PRIoFAST64 +# define PRIoFAST64 PRIo64 +#endif +#if !defined PRIuFAST64 || PRI_MACROS_BROKEN +# undef PRIuFAST64 +# define PRIuFAST64 PRIu64 +#endif +#if !defined PRIxFAST64 || PRI_MACROS_BROKEN +# undef PRIxFAST64 +# define PRIxFAST64 PRIx64 +#endif +#if !defined PRIXFAST64 || PRI_MACROS_BROKEN +# undef PRIXFAST64 +# define PRIXFAST64 PRIX64 +#endif +#if !defined PRIdMAX || PRI_MACROS_BROKEN +# undef PRIdMAX +# define PRIdMAX (sizeof (uintmax_t) == sizeof (long) ? "ld" : "lld") +#endif +#if !defined PRIiMAX || PRI_MACROS_BROKEN +# undef PRIiMAX +# define PRIiMAX (sizeof (uintmax_t) == sizeof (long) ? "li" : "lli") +#endif +#if !defined PRIoMAX || PRI_MACROS_BROKEN +# undef PRIoMAX +# define PRIoMAX (sizeof (uintmax_t) == sizeof (long) ? "lo" : "llo") +#endif +#if !defined PRIuMAX || PRI_MACROS_BROKEN +# undef PRIuMAX +# define PRIuMAX (sizeof (uintmax_t) == sizeof (long) ? "lu" : "llu") +#endif +#if !defined PRIxMAX || PRI_MACROS_BROKEN +# undef PRIxMAX +# define PRIxMAX (sizeof (uintmax_t) == sizeof (long) ? "lx" : "llx") +#endif +#if !defined PRIXMAX || PRI_MACROS_BROKEN +# undef PRIXMAX +# define PRIXMAX (sizeof (uintmax_t) == sizeof (long) ? "lX" : "llX") +#endif +#if !defined PRIdPTR || PRI_MACROS_BROKEN +# undef PRIdPTR +# define PRIdPTR \ + (sizeof (void *) == sizeof (long) ? "ld" : \ + sizeof (void *) == sizeof (int) ? "d" : \ + "lld") +#endif +#if !defined PRIiPTR || PRI_MACROS_BROKEN +# undef PRIiPTR +# define PRIiPTR \ + (sizeof (void *) == sizeof (long) ? "li" : \ + sizeof (void *) == sizeof (int) ? "i" : \ + "lli") +#endif +#if !defined PRIoPTR || PRI_MACROS_BROKEN +# undef PRIoPTR +# define PRIoPTR \ + (sizeof (void *) == sizeof (long) ? "lo" : \ + sizeof (void *) == sizeof (int) ? "o" : \ + "llo") +#endif +#if !defined PRIuPTR || PRI_MACROS_BROKEN +# undef PRIuPTR +# define PRIuPTR \ + (sizeof (void *) == sizeof (long) ? "lu" : \ + sizeof (void *) == sizeof (int) ? "u" : \ + "llu") +#endif +#if !defined PRIxPTR || PRI_MACROS_BROKEN +# undef PRIxPTR +# define PRIxPTR \ + (sizeof (void *) == sizeof (long) ? "lx" : \ + sizeof (void *) == sizeof (int) ? "x" : \ + "llx") +#endif +#if !defined PRIXPTR || PRI_MACROS_BROKEN +# undef PRIXPTR +# define PRIXPTR \ + (sizeof (void *) == sizeof (long) ? "lX" : \ + sizeof (void *) == sizeof (int) ? "X" : \ + "llX") +#endif + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ISO C functions. This is required by the standard + because some ISO C functions will require linking with this object + file and the name space must not be polluted. */ +# define open __open +# define close __close +# define read __read +# define mmap __mmap +# define munmap __munmap +#endif + +/* For those losing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +# define freea(p) /* nothing */ +#else +# define alloca(n) malloc (n) +# define freea(p) free (p) +#endif + +/* For systems that distinguish between text and binary I/O. + O_BINARY is usually declared in . */ +#if !defined O_BINARY && defined _O_BINARY + /* For MSC-compatible compilers. */ +# define O_BINARY _O_BINARY +# define O_TEXT _O_TEXT +#endif +#ifdef __BEOS__ + /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect. */ +# undef O_BINARY +# undef O_TEXT +#endif +/* On reasonable systems, binary I/O is the default. */ +#ifndef O_BINARY +# define O_BINARY 0 +#endif + + +/* We need a sign, whether a new catalog was loaded, which can be associated + with all translations. This is important if the translations are + cached by one of GCC's features. */ +int _nl_msg_cat_cntr; + + +/* Expand a system dependent string segment. Return NULL if unsupported. */ +static const char * +get_sysdep_segment_value (const char *name) +{ + /* Test for an ISO C 99 section 7.8.1 format string directive. + Syntax: + P R I { d | i | o | u | x | X } + { { | LEAST | FAST } { 8 | 16 | 32 | 64 } | MAX | PTR } */ + /* We don't use a table of 14 times 6 'const char *' strings here, because + data relocations cost startup time. */ + if (name[0] == 'P' && name[1] == 'R' && name[2] == 'I') + { + if (name[3] == 'd' || name[3] == 'i' || name[3] == 'o' || name[3] == 'u' + || name[3] == 'x' || name[3] == 'X') + { + if (name[4] == '8' && name[5] == '\0') + { + if (name[3] == 'd') + return PRId8; + if (name[3] == 'i') + return PRIi8; + if (name[3] == 'o') + return PRIo8; + if (name[3] == 'u') + return PRIu8; + if (name[3] == 'x') + return PRIx8; + if (name[3] == 'X') + return PRIX8; + abort (); + } + if (name[4] == '1' && name[5] == '6' && name[6] == '\0') + { + if (name[3] == 'd') + return PRId16; + if (name[3] == 'i') + return PRIi16; + if (name[3] == 'o') + return PRIo16; + if (name[3] == 'u') + return PRIu16; + if (name[3] == 'x') + return PRIx16; + if (name[3] == 'X') + return PRIX16; + abort (); + } + if (name[4] == '3' && name[5] == '2' && name[6] == '\0') + { + if (name[3] == 'd') + return PRId32; + if (name[3] == 'i') + return PRIi32; + if (name[3] == 'o') + return PRIo32; + if (name[3] == 'u') + return PRIu32; + if (name[3] == 'x') + return PRIx32; + if (name[3] == 'X') + return PRIX32; + abort (); + } + if (name[4] == '6' && name[5] == '4' && name[6] == '\0') + { + if (name[3] == 'd') + return PRId64; + if (name[3] == 'i') + return PRIi64; + if (name[3] == 'o') + return PRIo64; + if (name[3] == 'u') + return PRIu64; + if (name[3] == 'x') + return PRIx64; + if (name[3] == 'X') + return PRIX64; + abort (); + } + if (name[4] == 'L' && name[5] == 'E' && name[6] == 'A' + && name[7] == 'S' && name[8] == 'T') + { + if (name[9] == '8' && name[10] == '\0') + { + if (name[3] == 'd') + return PRIdLEAST8; + if (name[3] == 'i') + return PRIiLEAST8; + if (name[3] == 'o') + return PRIoLEAST8; + if (name[3] == 'u') + return PRIuLEAST8; + if (name[3] == 'x') + return PRIxLEAST8; + if (name[3] == 'X') + return PRIXLEAST8; + abort (); + } + if (name[9] == '1' && name[10] == '6' && name[11] == '\0') + { + if (name[3] == 'd') + return PRIdLEAST16; + if (name[3] == 'i') + return PRIiLEAST16; + if (name[3] == 'o') + return PRIoLEAST16; + if (name[3] == 'u') + return PRIuLEAST16; + if (name[3] == 'x') + return PRIxLEAST16; + if (name[3] == 'X') + return PRIXLEAST16; + abort (); + } + if (name[9] == '3' && name[10] == '2' && name[11] == '\0') + { + if (name[3] == 'd') + return PRIdLEAST32; + if (name[3] == 'i') + return PRIiLEAST32; + if (name[3] == 'o') + return PRIoLEAST32; + if (name[3] == 'u') + return PRIuLEAST32; + if (name[3] == 'x') + return PRIxLEAST32; + if (name[3] == 'X') + return PRIXLEAST32; + abort (); + } + if (name[9] == '6' && name[10] == '4' && name[11] == '\0') + { + if (name[3] == 'd') + return PRIdLEAST64; + if (name[3] == 'i') + return PRIiLEAST64; + if (name[3] == 'o') + return PRIoLEAST64; + if (name[3] == 'u') + return PRIuLEAST64; + if (name[3] == 'x') + return PRIxLEAST64; + if (name[3] == 'X') + return PRIXLEAST64; + abort (); + } + } + if (name[4] == 'F' && name[5] == 'A' && name[6] == 'S' + && name[7] == 'T') + { + if (name[8] == '8' && name[9] == '\0') + { + if (name[3] == 'd') + return PRIdFAST8; + if (name[3] == 'i') + return PRIiFAST8; + if (name[3] == 'o') + return PRIoFAST8; + if (name[3] == 'u') + return PRIuFAST8; + if (name[3] == 'x') + return PRIxFAST8; + if (name[3] == 'X') + return PRIXFAST8; + abort (); + } + if (name[8] == '1' && name[9] == '6' && name[10] == '\0') + { + if (name[3] == 'd') + return PRIdFAST16; + if (name[3] == 'i') + return PRIiFAST16; + if (name[3] == 'o') + return PRIoFAST16; + if (name[3] == 'u') + return PRIuFAST16; + if (name[3] == 'x') + return PRIxFAST16; + if (name[3] == 'X') + return PRIXFAST16; + abort (); + } + if (name[8] == '3' && name[9] == '2' && name[10] == '\0') + { + if (name[3] == 'd') + return PRIdFAST32; + if (name[3] == 'i') + return PRIiFAST32; + if (name[3] == 'o') + return PRIoFAST32; + if (name[3] == 'u') + return PRIuFAST32; + if (name[3] == 'x') + return PRIxFAST32; + if (name[3] == 'X') + return PRIXFAST32; + abort (); + } + if (name[8] == '6' && name[9] == '4' && name[10] == '\0') + { + if (name[3] == 'd') + return PRIdFAST64; + if (name[3] == 'i') + return PRIiFAST64; + if (name[3] == 'o') + return PRIoFAST64; + if (name[3] == 'u') + return PRIuFAST64; + if (name[3] == 'x') + return PRIxFAST64; + if (name[3] == 'X') + return PRIXFAST64; + abort (); + } + } + if (name[4] == 'M' && name[5] == 'A' && name[6] == 'X' + && name[7] == '\0') + { + if (name[3] == 'd') + return PRIdMAX; + if (name[3] == 'i') + return PRIiMAX; + if (name[3] == 'o') + return PRIoMAX; + if (name[3] == 'u') + return PRIuMAX; + if (name[3] == 'x') + return PRIxMAX; + if (name[3] == 'X') + return PRIXMAX; + abort (); + } + if (name[4] == 'P' && name[5] == 'T' && name[6] == 'R' + && name[7] == '\0') + { + if (name[3] == 'd') + return PRIdPTR; + if (name[3] == 'i') + return PRIiPTR; + if (name[3] == 'o') + return PRIoPTR; + if (name[3] == 'u') + return PRIuPTR; + if (name[3] == 'x') + return PRIxPTR; + if (name[3] == 'X') + return PRIXPTR; + abort (); + } + } + } + /* Test for a glibc specific printf() format directive flag. */ + if (name[0] == 'I' && name[1] == '\0') + { +#if defined _LIBC || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) + /* The 'I' flag, in numeric format directives, replaces ASCII digits + with the 'outdigits' defined in the LC_CTYPE locale facet. This is + used for Farsi (Persian) and maybe Arabic. */ + return "I"; +#else + return ""; +#endif + } + /* Other system dependent strings are not valid. */ + return NULL; +} + +/* Initialize the codeset dependent parts of an opened message catalog. + Return the header entry. */ +const char * +internal_function +_nl_init_domain_conv (struct loaded_l10nfile *domain_file, + struct loaded_domain *domain, + struct binding *domainbinding) +{ + /* Find out about the character set the file is encoded with. + This can be found (in textual form) in the entry "". If this + entry does not exist or if this does not contain the `charset=' + information, we will assume the charset matches the one the + current locale and we don't have to perform any conversion. */ + char *nullentry; + size_t nullentrylen; + + /* Preinitialize fields, to avoid recursion during _nl_find_msg. */ + domain->codeset_cntr = + (domainbinding != NULL ? domainbinding->codeset_cntr : 0); +#ifdef _LIBC + domain->conv = (__gconv_t) -1; +#else +# if HAVE_ICONV + domain->conv = (iconv_t) -1; +# endif +#endif + domain->conv_tab = NULL; + + /* Get the header entry. */ + nullentry = _nl_find_msg (domain_file, domainbinding, "", &nullentrylen); + + if (nullentry != NULL) + { +#if defined _LIBC || HAVE_ICONV + const char *charsetstr; + + charsetstr = strstr (nullentry, "charset="); + if (charsetstr != NULL) + { + size_t len; + char *charset; + const char *outcharset; + + charsetstr += strlen ("charset="); + len = strcspn (charsetstr, " \t\n"); + + charset = (char *) alloca (len + 1); +# if defined _LIBC || HAVE_MEMPCPY + *((char *) mempcpy (charset, charsetstr, len)) = '\0'; +# else + memcpy (charset, charsetstr, len); + charset[len] = '\0'; +# endif + + /* The output charset should normally be determined by the + locale. But sometimes the locale is not used or not correctly + set up, so we provide a possibility for the user to override + this. Moreover, the value specified through + bind_textdomain_codeset overrides both. */ + if (domainbinding != NULL && domainbinding->codeset != NULL) + outcharset = domainbinding->codeset; + else + { + outcharset = getenv ("OUTPUT_CHARSET"); + if (outcharset == NULL || outcharset[0] == '\0') + { +# ifdef _LIBC + outcharset = _NL_CURRENT (LC_CTYPE, CODESET); +# else +# if HAVE_ICONV + extern const char *locale_charset (void); + outcharset = locale_charset (); +# endif +# endif + } + } + +# ifdef _LIBC + /* We always want to use transliteration. */ + outcharset = norm_add_slashes (outcharset, "TRANSLIT"); + charset = norm_add_slashes (charset, NULL); + if (__gconv_open (outcharset, charset, &domain->conv, + GCONV_AVOID_NOCONV) + != __GCONV_OK) + domain->conv = (__gconv_t) -1; +# else +# if HAVE_ICONV + /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5, + we want to use transliteration. */ +# if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 \ + || _LIBICONV_VERSION >= 0x0105 + if (strchr (outcharset, '/') == NULL) + { + char *tmp; + + len = strlen (outcharset); + tmp = (char *) alloca (len + 10 + 1); + memcpy (tmp, outcharset, len); + memcpy (tmp + len, "//TRANSLIT", 10 + 1); + outcharset = tmp; + + domain->conv = iconv_open (outcharset, charset); + + freea (outcharset); + } + else +# endif + domain->conv = iconv_open (outcharset, charset); +# endif +# endif + + freea (charset); + } +#endif /* _LIBC || HAVE_ICONV */ + } + + return nullentry; +} + +/* Frees the codeset dependent parts of an opened message catalog. */ +void +internal_function +_nl_free_domain_conv (struct loaded_domain *domain) +{ + if (domain->conv_tab != NULL && domain->conv_tab != (char **) -1) + free (domain->conv_tab); + +#ifdef _LIBC + if (domain->conv != (__gconv_t) -1) + __gconv_close (domain->conv); +#else +# if HAVE_ICONV + if (domain->conv != (iconv_t) -1) + iconv_close (domain->conv); +# endif +#endif +} + +/* Load the message catalogs specified by FILENAME. If it is no valid + message catalog do nothing. */ +void +internal_function +_nl_load_domain (struct loaded_l10nfile *domain_file, + struct binding *domainbinding) +{ + int fd; + size_t size; +#ifdef _LIBC + struct stat64 st; +#else + struct stat st; +#endif + struct mo_file_header *data = (struct mo_file_header *) -1; + int use_mmap = 0; + struct loaded_domain *domain; + int revision; + const char *nullentry; + + domain_file->decided = 1; + domain_file->data = NULL; + + /* Note that it would be useless to store domainbinding in domain_file + because domainbinding might be == NULL now but != NULL later (after + a call to bind_textdomain_codeset). */ + + /* If the record does not represent a valid locale the FILENAME + might be NULL. This can happen when according to the given + specification the locale file name is different for XPG and CEN + syntax. */ + if (domain_file->filename == NULL) + return; + + /* Try to open the addressed file. */ + fd = open (domain_file->filename, O_RDONLY | O_BINARY); + if (fd == -1) + return; + + /* We must know about the size of the file. */ + if ( +#ifdef _LIBC + __builtin_expect (fstat64 (fd, &st) != 0, 0) +#else + __builtin_expect (fstat (fd, &st) != 0, 0) +#endif + || __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0) + || __builtin_expect (size < sizeof (struct mo_file_header), 0)) + { + /* Something went wrong. */ + close (fd); + return; + } + +#ifdef HAVE_MMAP + /* Now we are ready to load the file. If mmap() is available we try + this first. If not available or it failed we try to load it. */ + data = (struct mo_file_header *) mmap (NULL, size, PROT_READ, + MAP_PRIVATE, fd, 0); + + if (__builtin_expect (data != (struct mo_file_header *) -1, 1)) + { + /* mmap() call was successful. */ + close (fd); + use_mmap = 1; + } +#endif + + /* If the data is not yet available (i.e. mmap'ed) we try to load + it manually. */ + if (data == (struct mo_file_header *) -1) + { + size_t to_read; + char *read_ptr; + + data = (struct mo_file_header *) malloc (size); + if (data == NULL) + return; + + to_read = size; + read_ptr = (char *) data; + do + { + long int nb = (long int) read (fd, read_ptr, to_read); + if (nb <= 0) + { +#ifdef EINTR + if (nb == -1 && errno == EINTR) + continue; +#endif + close (fd); + return; + } + read_ptr += nb; + to_read -= nb; + } + while (to_read > 0); + + close (fd); + } + + /* Using the magic number we can test whether it really is a message + catalog file. */ + if (__builtin_expect (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED, + 0)) + { + /* The magic number is wrong: not a message catalog file. */ +#ifdef HAVE_MMAP + if (use_mmap) + munmap ((caddr_t) data, size); + else +#endif + free (data); + return; + } + + domain = (struct loaded_domain *) malloc (sizeof (struct loaded_domain)); + if (domain == NULL) + return; + domain_file->data = domain; + + domain->data = (char *) data; + domain->use_mmap = use_mmap; + domain->mmap_size = size; + domain->must_swap = data->magic != _MAGIC; + domain->malloced = NULL; + + /* Fill in the information about the available tables. */ + revision = W (domain->must_swap, data->revision); + /* We support only the major revisions 0 and 1. */ + switch (revision >> 16) + { + case 0: + case 1: + domain->nstrings = W (domain->must_swap, data->nstrings); + domain->orig_tab = (const struct string_desc *) + ((char *) data + W (domain->must_swap, data->orig_tab_offset)); + domain->trans_tab = (const struct string_desc *) + ((char *) data + W (domain->must_swap, data->trans_tab_offset)); + domain->hash_size = W (domain->must_swap, data->hash_tab_size); + domain->hash_tab = + (domain->hash_size > 2 + ? (const nls_uint32 *) + ((char *) data + W (domain->must_swap, data->hash_tab_offset)) + : NULL); + domain->must_swap_hash_tab = domain->must_swap; + + /* Now dispatch on the minor revision. */ + switch (revision & 0xffff) + { + case 0: + domain->n_sysdep_strings = 0; + domain->orig_sysdep_tab = NULL; + domain->trans_sysdep_tab = NULL; + break; + case 1: + default: + { + nls_uint32 n_sysdep_strings; + + if (domain->hash_tab == NULL) + /* This is invalid. These minor revisions need a hash table. */ + goto invalid; + + n_sysdep_strings = + W (domain->must_swap, data->n_sysdep_strings); + if (n_sysdep_strings > 0) + { + nls_uint32 n_sysdep_segments; + const struct sysdep_segment *sysdep_segments; + const char **sysdep_segment_values; + const nls_uint32 *orig_sysdep_tab; + const nls_uint32 *trans_sysdep_tab; + nls_uint32 n_inmem_sysdep_strings; + size_t memneed; + char *mem; + struct sysdep_string_desc *inmem_orig_sysdep_tab; + struct sysdep_string_desc *inmem_trans_sysdep_tab; + nls_uint32 *inmem_hash_tab; + unsigned int i, j; + + /* Get the values of the system dependent segments. */ + n_sysdep_segments = + W (domain->must_swap, data->n_sysdep_segments); + sysdep_segments = (const struct sysdep_segment *) + ((char *) data + + W (domain->must_swap, data->sysdep_segments_offset)); + sysdep_segment_values = + alloca (n_sysdep_segments * sizeof (const char *)); + for (i = 0; i < n_sysdep_segments; i++) + { + const char *name = + (char *) data + + W (domain->must_swap, sysdep_segments[i].offset); + nls_uint32 namelen = + W (domain->must_swap, sysdep_segments[i].length); + + if (!(namelen > 0 && name[namelen - 1] == '\0')) + { + freea (sysdep_segment_values); + goto invalid; + } + + sysdep_segment_values[i] = get_sysdep_segment_value (name); + } + + orig_sysdep_tab = (const nls_uint32 *) + ((char *) data + + W (domain->must_swap, data->orig_sysdep_tab_offset)); + trans_sysdep_tab = (const nls_uint32 *) + ((char *) data + + W (domain->must_swap, data->trans_sysdep_tab_offset)); + + /* Compute the amount of additional memory needed for the + system dependent strings and the augmented hash table. + At the same time, also drop string pairs which refer to + an undefined system dependent segment. */ + n_inmem_sysdep_strings = 0; + memneed = domain->hash_size * sizeof (nls_uint32); + for (i = 0; i < n_sysdep_strings; i++) + { + int valid = 1; + size_t needs[2]; + + for (j = 0; j < 2; j++) + { + const struct sysdep_string *sysdep_string = + (const struct sysdep_string *) + ((char *) data + + W (domain->must_swap, + j == 0 + ? orig_sysdep_tab[i] + : trans_sysdep_tab[i])); + size_t need = 0; + const struct segment_pair *p = sysdep_string->segments; + + if (W (domain->must_swap, p->sysdepref) != SEGMENTS_END) + for (p = sysdep_string->segments;; p++) + { + nls_uint32 sysdepref; + + need += W (domain->must_swap, p->segsize); + + sysdepref = W (domain->must_swap, p->sysdepref); + if (sysdepref == SEGMENTS_END) + break; + + if (sysdepref >= n_sysdep_segments) + { + /* Invalid. */ + freea (sysdep_segment_values); + goto invalid; + } + + if (sysdep_segment_values[sysdepref] == NULL) + { + /* This particular string pair is invalid. */ + valid = 0; + break; + } + + need += strlen (sysdep_segment_values[sysdepref]); + } + + needs[j] = need; + if (!valid) + break; + } + + if (valid) + { + n_inmem_sysdep_strings++; + memneed += needs[0] + needs[1]; + } + } + memneed += 2 * n_inmem_sysdep_strings + * sizeof (struct sysdep_string_desc); + + if (n_inmem_sysdep_strings > 0) + { + unsigned int k; + + /* Allocate additional memory. */ + mem = (char *) malloc (memneed); + if (mem == NULL) + goto invalid; + + domain->malloced = mem; + inmem_orig_sysdep_tab = (struct sysdep_string_desc *) mem; + mem += n_inmem_sysdep_strings + * sizeof (struct sysdep_string_desc); + inmem_trans_sysdep_tab = (struct sysdep_string_desc *) mem; + mem += n_inmem_sysdep_strings + * sizeof (struct sysdep_string_desc); + inmem_hash_tab = (nls_uint32 *) mem; + mem += domain->hash_size * sizeof (nls_uint32); + + /* Compute the system dependent strings. */ + k = 0; + for (i = 0; i < n_sysdep_strings; i++) + { + int valid = 1; + + for (j = 0; j < 2; j++) + { + const struct sysdep_string *sysdep_string = + (const struct sysdep_string *) + ((char *) data + + W (domain->must_swap, + j == 0 + ? orig_sysdep_tab[i] + : trans_sysdep_tab[i])); + const struct segment_pair *p = + sysdep_string->segments; + + if (W (domain->must_swap, p->sysdepref) + != SEGMENTS_END) + for (p = sysdep_string->segments;; p++) + { + nls_uint32 sysdepref; + + sysdepref = + W (domain->must_swap, p->sysdepref); + if (sysdepref == SEGMENTS_END) + break; + + if (sysdep_segment_values[sysdepref] == NULL) + { + /* This particular string pair is + invalid. */ + valid = 0; + break; + } + } + + if (!valid) + break; + } + + if (valid) + { + for (j = 0; j < 2; j++) + { + const struct sysdep_string *sysdep_string = + (const struct sysdep_string *) + ((char *) data + + W (domain->must_swap, + j == 0 + ? orig_sysdep_tab[i] + : trans_sysdep_tab[i])); + const char *static_segments = + (char *) data + + W (domain->must_swap, sysdep_string->offset); + const struct segment_pair *p = + sysdep_string->segments; + + /* Concatenate the segments, and fill + inmem_orig_sysdep_tab[k] (for j == 0) and + inmem_trans_sysdep_tab[k] (for j == 1). */ + + struct sysdep_string_desc *inmem_tab_entry = + (j == 0 + ? inmem_orig_sysdep_tab + : inmem_trans_sysdep_tab) + + k; + + if (W (domain->must_swap, p->sysdepref) + == SEGMENTS_END) + { + /* Only one static segment. */ + inmem_tab_entry->length = + W (domain->must_swap, p->segsize); + inmem_tab_entry->pointer = static_segments; + } + else + { + inmem_tab_entry->pointer = mem; + + for (p = sysdep_string->segments;; p++) + { + nls_uint32 segsize = + W (domain->must_swap, p->segsize); + nls_uint32 sysdepref = + W (domain->must_swap, p->sysdepref); + size_t n; + + if (segsize > 0) + { + memcpy (mem, static_segments, segsize); + mem += segsize; + static_segments += segsize; + } + + if (sysdepref == SEGMENTS_END) + break; + + n = strlen (sysdep_segment_values[sysdepref]); + memcpy (mem, sysdep_segment_values[sysdepref], n); + mem += n; + } + + inmem_tab_entry->length = + mem - inmem_tab_entry->pointer; + } + } + + k++; + } + } + if (k != n_inmem_sysdep_strings) + abort (); + + /* Compute the augmented hash table. */ + for (i = 0; i < domain->hash_size; i++) + inmem_hash_tab[i] = + W (domain->must_swap_hash_tab, domain->hash_tab[i]); + for (i = 0; i < n_inmem_sysdep_strings; i++) + { + const char *msgid = inmem_orig_sysdep_tab[i].pointer; + nls_uint32 hash_val = hash_string (msgid); + nls_uint32 idx = hash_val % domain->hash_size; + nls_uint32 incr = + 1 + (hash_val % (domain->hash_size - 2)); + + for (;;) + { + if (inmem_hash_tab[idx] == 0) + { + /* Hash table entry is empty. Use it. */ + inmem_hash_tab[idx] = 1 + domain->nstrings + i; + break; + } + + if (idx >= domain->hash_size - incr) + idx -= domain->hash_size - incr; + else + idx += incr; + } + } + + domain->n_sysdep_strings = n_inmem_sysdep_strings; + domain->orig_sysdep_tab = inmem_orig_sysdep_tab; + domain->trans_sysdep_tab = inmem_trans_sysdep_tab; + + domain->hash_tab = inmem_hash_tab; + domain->must_swap_hash_tab = 0; + } + else + { + domain->n_sysdep_strings = 0; + domain->orig_sysdep_tab = NULL; + domain->trans_sysdep_tab = NULL; + } + + freea (sysdep_segment_values); + } + else + { + domain->n_sysdep_strings = 0; + domain->orig_sysdep_tab = NULL; + domain->trans_sysdep_tab = NULL; + } + } + break; + } + break; + default: + /* This is an invalid revision. */ + invalid: + /* This is an invalid .mo file. */ + if (domain->malloced) + free (domain->malloced); +#ifdef HAVE_MMAP + if (use_mmap) + munmap ((caddr_t) data, size); + else +#endif + free (data); + free (domain); + domain_file->data = NULL; + return; + } + + /* Now initialize the character set converter from the character set + the file is encoded with (found in the header entry) to the domain's + specified character set or the locale's character set. */ + nullentry = _nl_init_domain_conv (domain_file, domain, domainbinding); + + /* Also look for a plural specification. */ + EXTRACT_PLURAL_EXPRESSION (nullentry, &domain->plural, &domain->nplurals); +} + + +#ifdef _LIBC +void +internal_function +_nl_unload_domain (struct loaded_domain *domain) +{ + if (domain->plural != &__gettext_germanic_plural) + __gettext_free_exp (domain->plural); + + _nl_free_domain_conv (domain); + + if (domain->malloced) + free (domain->malloced); + +# ifdef _POSIX_MAPPED_FILES + if (domain->use_mmap) + munmap ((caddr_t) domain->data, domain->mmap_size); + else +# endif /* _POSIX_MAPPED_FILES */ + free ((void *) domain->data); + + free (domain); +} +#endif diff --git a/intl/localcharset.c b/intl/localcharset.c new file mode 100644 index 0000000..4865f10 --- /dev/null +++ b/intl/localcharset.c @@ -0,0 +1,398 @@ +/* Determine a canonical name for the current locale's character encoding. + + Copyright (C) 2000-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Written by Bruno Haible . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include "localcharset.h" + +#if HAVE_STDDEF_H +# include +#endif + +#include +#if HAVE_STRING_H +# include +#else +# include +#endif +#if HAVE_STDLIB_H +# include +#endif + +#if defined _WIN32 || defined __WIN32__ +# undef WIN32 /* avoid warning on mingw32 */ +# define WIN32 +#endif + +#if defined __EMX__ +/* Assume EMX program runs on OS/2, even if compiled under DOS. */ +# define OS2 +#endif + +#if !defined WIN32 +# if HAVE_LANGINFO_CODESET +# include +# else +# if HAVE_SETLOCALE +# include +# endif +# endif +#elif defined WIN32 +# define WIN32_LEAN_AND_MEAN +# include +#endif +#if defined OS2 +# define INCL_DOS +# include +#endif + +#if ENABLE_RELOCATABLE +# include "relocatable.h" +#else +# define relocate(pathname) (pathname) +#endif + +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +#endif + +#ifndef DIRECTORY_SEPARATOR +# define DIRECTORY_SEPARATOR '/' +#endif + +#ifndef ISSLASH +# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) +#endif + +#if HAVE_DECL_GETC_UNLOCKED +# undef getc +# define getc getc_unlocked +#endif + +/* The following static variable is declared 'volatile' to avoid a + possible multithread problem in the function get_charset_aliases. If we + are running in a threaded environment, and if two threads initialize + 'charset_aliases' simultaneously, both will produce the same value, + and everything will be ok if the two assignments to 'charset_aliases' + are atomic. But I don't know what will happen if the two assignments mix. */ +#if __STDC__ != 1 +# define volatile /* empty */ +#endif +/* Pointer to the contents of the charset.alias file, if it has already been + read, else NULL. Its format is: + ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */ +static const char * volatile charset_aliases; + +/* Return a pointer to the contents of the charset.alias file. */ +static const char * +get_charset_aliases () +{ + const char *cp; + + cp = charset_aliases; + if (cp == NULL) + { +#if !(defined VMS || defined WIN32) + FILE *fp; + const char *dir = relocate (LIBDIR); + const char *base = "charset.alias"; + char *file_name; + + /* Concatenate dir and base into freshly allocated file_name. */ + { + size_t dir_len = strlen (dir); + size_t base_len = strlen (base); + int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); + file_name = (char *) malloc (dir_len + add_slash + base_len + 1); + if (file_name != NULL) + { + memcpy (file_name, dir, dir_len); + if (add_slash) + file_name[dir_len] = DIRECTORY_SEPARATOR; + memcpy (file_name + dir_len + add_slash, base, base_len + 1); + } + } + + if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL) + /* Out of memory or file not found, treat it as empty. */ + cp = ""; + else + { + /* Parse the file's contents. */ + int c; + char buf1[50+1]; + char buf2[50+1]; + char *res_ptr = NULL; + size_t res_size = 0; + size_t l1, l2; + + for (;;) + { + c = getc (fp); + if (c == EOF) + break; + if (c == '\n' || c == ' ' || c == '\t') + continue; + if (c == '#') + { + /* Skip comment, to end of line. */ + do + c = getc (fp); + while (!(c == EOF || c == '\n')); + if (c == EOF) + break; + continue; + } + ungetc (c, fp); + if (fscanf (fp, "%50s %50s", buf1, buf2) < 2) + break; + l1 = strlen (buf1); + l2 = strlen (buf2); + if (res_size == 0) + { + res_size = l1 + 1 + l2 + 1; + res_ptr = (char *) malloc (res_size + 1); + } + else + { + res_size += l1 + 1 + l2 + 1; + res_ptr = (char *) realloc (res_ptr, res_size + 1); + } + if (res_ptr == NULL) + { + /* Out of memory. */ + res_size = 0; + break; + } + strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); + strcpy (res_ptr + res_size - (l2 + 1), buf2); + } + fclose (fp); + if (res_size == 0) + cp = ""; + else + { + *(res_ptr + res_size) = '\0'; + cp = res_ptr; + } + } + + if (file_name != NULL) + free (file_name); + +#else + +# if defined VMS + /* To avoid the troubles of an extra file charset.alias_vms in the + sources of many GNU packages, simply inline the aliases here. */ + /* The list of encodings is taken from the OpenVMS 7.3-1 documentation + "Compaq C Run-Time Library Reference Manual for OpenVMS systems" + section 10.7 "Handling Different Character Sets". */ + cp = "ISO8859-1" "\0" "ISO-8859-1" "\0" + "ISO8859-2" "\0" "ISO-8859-2" "\0" + "ISO8859-5" "\0" "ISO-8859-5" "\0" + "ISO8859-7" "\0" "ISO-8859-7" "\0" + "ISO8859-8" "\0" "ISO-8859-8" "\0" + "ISO8859-9" "\0" "ISO-8859-9" "\0" + /* Japanese */ + "eucJP" "\0" "EUC-JP" "\0" + "SJIS" "\0" "SHIFT_JIS" "\0" + "DECKANJI" "\0" "DEC-KANJI" "\0" + "SDECKANJI" "\0" "EUC-JP" "\0" + /* Chinese */ + "eucTW" "\0" "EUC-TW" "\0" + "DECHANYU" "\0" "DEC-HANYU" "\0" + "DECHANZI" "\0" "GB2312" "\0" + /* Korean */ + "DECKOREAN" "\0" "EUC-KR" "\0"; +# endif + +# if defined WIN32 + /* To avoid the troubles of installing a separate file in the same + directory as the DLL and of retrieving the DLL's directory at + runtime, simply inline the aliases here. */ + + cp = "CP936" "\0" "GBK" "\0" + "CP1361" "\0" "JOHAB" "\0" + "CP20127" "\0" "ASCII" "\0" + "CP20866" "\0" "KOI8-R" "\0" + "CP21866" "\0" "KOI8-RU" "\0" + "CP28591" "\0" "ISO-8859-1" "\0" + "CP28592" "\0" "ISO-8859-2" "\0" + "CP28593" "\0" "ISO-8859-3" "\0" + "CP28594" "\0" "ISO-8859-4" "\0" + "CP28595" "\0" "ISO-8859-5" "\0" + "CP28596" "\0" "ISO-8859-6" "\0" + "CP28597" "\0" "ISO-8859-7" "\0" + "CP28598" "\0" "ISO-8859-8" "\0" + "CP28599" "\0" "ISO-8859-9" "\0" + "CP28605" "\0" "ISO-8859-15" "\0"; +# endif +#endif + + charset_aliases = cp; + } + + return cp; +} + +/* Determine the current locale's character encoding, and canonicalize it + into one of the canonical names listed in config.charset. + The result must not be freed; it is statically allocated. + If the canonical name cannot be determined, the result is a non-canonical + name. */ + +#ifdef STATIC +STATIC +#endif +const char * +locale_charset () +{ + const char *codeset; + const char *aliases; + +#if !(defined WIN32 || defined OS2) + +# if HAVE_LANGINFO_CODESET + + /* Most systems support nl_langinfo (CODESET) nowadays. */ + codeset = nl_langinfo (CODESET); + +# else + + /* On old systems which lack it, use setlocale or getenv. */ + const char *locale = NULL; + + /* But most old systems don't have a complete set of locales. Some + (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't + use setlocale here; it would return "C" when it doesn't support the + locale name the user has set. */ +# if HAVE_SETLOCALE && 0 + locale = setlocale (LC_CTYPE, NULL); +# endif + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + } + + /* On some old systems, one used to set locale = "iso8859_1". On others, + you set it to "language_COUNTRY.charset". In any case, we resolve it + through the charset.alias file. */ + codeset = locale; + +# endif + +#elif defined WIN32 + + static char buf[2 + 10 + 1]; + + /* Woe32 has a function returning the locale's codepage as a number. */ + sprintf (buf, "CP%u", GetACP ()); + codeset = buf; + +#elif defined OS2 + + const char *locale; + static char buf[2 + 10 + 1]; + ULONG cp[3]; + ULONG cplen; + + /* Allow user to override the codeset, as set in the operating system, + with standard language environment variables. */ + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + if (locale != NULL && locale[0] != '\0') + { + /* If the locale name contains an encoding after the dot, return it. */ + const char *dot = strchr (locale, '.'); + + if (dot != NULL) + { + const char *modifier; + + dot++; + /* Look for the possible @... trailer and remove it, if any. */ + modifier = strchr (dot, '@'); + if (modifier == NULL) + return dot; + if (modifier - dot < sizeof (buf)) + { + memcpy (buf, dot, modifier - dot); + buf [modifier - dot] = '\0'; + return buf; + } + } + + /* Resolve through the charset.alias file. */ + codeset = locale; + } + else + { + /* OS/2 has a function returning the locale's codepage as a number. */ + if (DosQueryCp (sizeof (cp), cp, &cplen)) + codeset = ""; + else + { + sprintf (buf, "CP%u", cp[0]); + codeset = buf; + } + } + +#endif + + if (codeset == NULL) + /* The canonical name cannot be determined. */ + codeset = ""; + + /* Resolve alias. */ + for (aliases = get_charset_aliases (); + *aliases != '\0'; + aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) + if (strcmp (codeset, aliases) == 0 + || (aliases[0] == '*' && aliases[1] == '\0')) + { + codeset = aliases + strlen (aliases) + 1; + break; + } + + /* Don't return an empty string. GNU libc and GNU libiconv interpret + the empty string as denoting "the locale's character encoding", + thus GNU libiconv would call this function a second time. */ + if (codeset[0] == '\0') + codeset = "ASCII"; + + return codeset; +} diff --git a/intl/localcharset.h b/intl/localcharset.h new file mode 100644 index 0000000..3b137e7 --- /dev/null +++ b/intl/localcharset.h @@ -0,0 +1,42 @@ +/* Determine a canonical name for the current locale's character encoding. + Copyright (C) 2000-2003 Free Software Foundation, Inc. + This file is part of the GNU CHARSET Library. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _LOCALCHARSET_H +#define _LOCALCHARSET_H + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Determine the current locale's character encoding, and canonicalize it + into one of the canonical names listed in config.charset. + The result must not be freed; it is statically allocated. + If the canonical name cannot be determined, the result is a non-canonical + name. */ +extern const char * locale_charset (void); + + +#ifdef __cplusplus +} +#endif + + +#endif /* _LOCALCHARSET_H */ diff --git a/intl/locale.alias b/intl/locale.alias new file mode 100644 index 0000000..bd6bb25 --- /dev/null +++ b/intl/locale.alias @@ -0,0 +1,78 @@ +# Locale name alias data base. +# Copyright (C) 1996-2001,2003 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. + +# The format of this file is the same as for the corresponding file of +# the X Window System, which normally can be found in +# /usr/lib/X11/locale/locale.alias +# A single line contains two fields: an alias and a substitution value. +# All entries are case independent. + +# Note: This file is far from being complete. If you have a value for +# your own site which you think might be useful for others too, share +# it with the rest of us. Send it using the `glibcbug' script to +# bugs@gnu.org. + +# Packages using this file: + +bokmal nb_NO.ISO-8859-1 +bokmål nb_NO.ISO-8859-1 +catalan ca_ES.ISO-8859-1 +croatian hr_HR.ISO-8859-2 +czech cs_CZ.ISO-8859-2 +danish da_DK.ISO-8859-1 +dansk da_DK.ISO-8859-1 +deutsch de_DE.ISO-8859-1 +dutch nl_NL.ISO-8859-1 +eesti et_EE.ISO-8859-1 +estonian et_EE.ISO-8859-1 +finnish fi_FI.ISO-8859-1 +français fr_FR.ISO-8859-1 +french fr_FR.ISO-8859-1 +galego gl_ES.ISO-8859-1 +galician gl_ES.ISO-8859-1 +german de_DE.ISO-8859-1 +greek el_GR.ISO-8859-7 +hebrew he_IL.ISO-8859-8 +hrvatski hr_HR.ISO-8859-2 +hungarian hu_HU.ISO-8859-2 +icelandic is_IS.ISO-8859-1 +italian it_IT.ISO-8859-1 +japanese ja_JP.eucJP +japanese.euc ja_JP.eucJP +ja_JP ja_JP.eucJP +ja_JP.ujis ja_JP.eucJP +japanese.sjis ja_JP.SJIS +korean ko_KR.eucKR +korean.euc ko_KR.eucKR +ko_KR ko_KR.eucKR +lithuanian lt_LT.ISO-8859-13 +no_NO nb_NO.ISO-8859-1 +no_NO.ISO-8859-1 nb_NO.ISO-8859-1 +norwegian nb_NO.ISO-8859-1 +nynorsk nn_NO.ISO-8859-1 +polish pl_PL.ISO-8859-2 +portuguese pt_PT.ISO-8859-1 +romanian ro_RO.ISO-8859-2 +russian ru_RU.ISO-8859-5 +slovak sk_SK.ISO-8859-2 +slovene sl_SI.ISO-8859-2 +slovenian sl_SI.ISO-8859-2 +spanish es_ES.ISO-8859-1 +swedish sv_SE.ISO-8859-1 +thai th_TH.TIS-620 +turkish tr_TR.ISO-8859-9 diff --git a/intl/localealias.c b/intl/localealias.c new file mode 100644 index 0000000..2eaf881 --- /dev/null +++ b/intl/localealias.c @@ -0,0 +1,414 @@ +/* Handle aliases for locale names. + Copyright (C) 1995-1999, 2000-2001, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Tell glibc's to provide a prototype for mempcpy(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#if defined _LIBC || defined HAVE___FSETLOCKING +# include +#endif +#include + +#ifdef __GNUC__ +# undef alloca +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# ifdef _MSC_VER +# include +# define alloca _alloca +# else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +#include +#include + +#include "gettextP.h" + +#if ENABLE_RELOCATABLE +# include "relocatable.h" +#else +# define relocate(pathname) (pathname) +#endif + +/* @@ end of prolog @@ */ + +#ifdef _LIBC +/* Rename the non ANSI C functions. This is required by the standard + because some ANSI C functions will require linking with this object + file and the name space must not be polluted. */ +# define strcasecmp __strcasecmp + +# ifndef mempcpy +# define mempcpy __mempcpy +# endif +# define HAVE_MEMPCPY 1 +# define HAVE___FSETLOCKING 1 + +/* We need locking here since we can be called from different places. */ +# include + +__libc_lock_define_initialized (static, lock); +#endif + +#ifndef internal_function +# define internal_function +#endif + +/* Some optimizations for glibc. */ +#ifdef _LIBC +# define FEOF(fp) feof_unlocked (fp) +# define FGETS(buf, n, fp) fgets_unlocked (buf, n, fp) +#else +# define FEOF(fp) feof (fp) +# define FGETS(buf, n, fp) fgets (buf, n, fp) +#endif + +/* For those losing systems which don't have `alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +# define freea(p) /* nothing */ +#else +# define alloca(n) malloc (n) +# define freea(p) free (p) +#endif + +#if defined _LIBC_REENTRANT || HAVE_DECL_FGETS_UNLOCKED +# undef fgets +# define fgets(buf, len, s) fgets_unlocked (buf, len, s) +#endif +#if defined _LIBC_REENTRANT || HAVE_DECL_FEOF_UNLOCKED +# undef feof +# define feof(s) feof_unlocked (s) +#endif + + +struct alias_map +{ + const char *alias; + const char *value; +}; + + +#ifndef _LIBC +# define libc_freeres_ptr(decl) decl +#endif + +libc_freeres_ptr (static char *string_space); +static size_t string_space_act; +static size_t string_space_max; +libc_freeres_ptr (static struct alias_map *map); +static size_t nmap; +static size_t maxmap; + + +/* Prototypes for local functions. */ +static size_t read_alias_file (const char *fname, int fname_len) + internal_function; +static int extend_alias_table (void); +static int alias_compare (const struct alias_map *map1, + const struct alias_map *map2); + + +const char * +_nl_expand_alias (const char *name) +{ + static const char *locale_alias_path; + struct alias_map *retval; + const char *result = NULL; + size_t added; + +#ifdef _LIBC + __libc_lock_lock (lock); +#endif + + if (locale_alias_path == NULL) + locale_alias_path = LOCALE_ALIAS_PATH; + + do + { + struct alias_map item; + + item.alias = name; + + if (nmap > 0) + retval = (struct alias_map *) bsearch (&item, map, nmap, + sizeof (struct alias_map), + (int (*) (const void *, + const void *) + ) alias_compare); + else + retval = NULL; + + /* We really found an alias. Return the value. */ + if (retval != NULL) + { + result = retval->value; + break; + } + + /* Perhaps we can find another alias file. */ + added = 0; + while (added == 0 && locale_alias_path[0] != '\0') + { + const char *start; + + while (locale_alias_path[0] == PATH_SEPARATOR) + ++locale_alias_path; + start = locale_alias_path; + + while (locale_alias_path[0] != '\0' + && locale_alias_path[0] != PATH_SEPARATOR) + ++locale_alias_path; + + if (start < locale_alias_path) + added = read_alias_file (start, locale_alias_path - start); + } + } + while (added != 0); + +#ifdef _LIBC + __libc_lock_unlock (lock); +#endif + + return result; +} + + +static size_t +internal_function +read_alias_file (const char *fname, int fname_len) +{ + FILE *fp; + char *full_fname; + size_t added; + static const char aliasfile[] = "/locale.alias"; + + full_fname = (char *) alloca (fname_len + sizeof aliasfile); +#ifdef HAVE_MEMPCPY + mempcpy (mempcpy (full_fname, fname, fname_len), + aliasfile, sizeof aliasfile); +#else + memcpy (full_fname, fname, fname_len); + memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile); +#endif + + fp = fopen (relocate (full_fname), "r"); + freea (full_fname); + if (fp == NULL) + return 0; + +#ifdef HAVE___FSETLOCKING + /* No threads present. */ + __fsetlocking (fp, FSETLOCKING_BYCALLER); +#endif + + added = 0; + while (!FEOF (fp)) + { + /* It is a reasonable approach to use a fix buffer here because + a) we are only interested in the first two fields + b) these fields must be usable as file names and so must not + be that long + We avoid a multi-kilobyte buffer here since this would use up + stack space which we might not have if the program ran out of + memory. */ + char buf[400]; + char *alias; + char *value; + char *cp; + + if (FGETS (buf, sizeof buf, fp) == NULL) + /* EOF reached. */ + break; + + cp = buf; + /* Ignore leading white space. */ + while (isspace ((unsigned char) cp[0])) + ++cp; + + /* A leading '#' signals a comment line. */ + if (cp[0] != '\0' && cp[0] != '#') + { + alias = cp++; + while (cp[0] != '\0' && !isspace ((unsigned char) cp[0])) + ++cp; + /* Terminate alias name. */ + if (cp[0] != '\0') + *cp++ = '\0'; + + /* Now look for the beginning of the value. */ + while (isspace ((unsigned char) cp[0])) + ++cp; + + if (cp[0] != '\0') + { + size_t alias_len; + size_t value_len; + + value = cp++; + while (cp[0] != '\0' && !isspace ((unsigned char) cp[0])) + ++cp; + /* Terminate value. */ + if (cp[0] == '\n') + { + /* This has to be done to make the following test + for the end of line possible. We are looking for + the terminating '\n' which do not overwrite here. */ + *cp++ = '\0'; + *cp = '\n'; + } + else if (cp[0] != '\0') + *cp++ = '\0'; + + if (nmap >= maxmap) + if (__builtin_expect (extend_alias_table (), 0)) + return added; + + alias_len = strlen (alias) + 1; + value_len = strlen (value) + 1; + + if (string_space_act + alias_len + value_len > string_space_max) + { + /* Increase size of memory pool. */ + size_t new_size = (string_space_max + + (alias_len + value_len > 1024 + ? alias_len + value_len : 1024)); + char *new_pool = (char *) realloc (string_space, new_size); + if (new_pool == NULL) + return added; + + if (__builtin_expect (string_space != new_pool, 0)) + { + size_t i; + + for (i = 0; i < nmap; i++) + { + map[i].alias += new_pool - string_space; + map[i].value += new_pool - string_space; + } + } + + string_space = new_pool; + string_space_max = new_size; + } + + map[nmap].alias = memcpy (&string_space[string_space_act], + alias, alias_len); + string_space_act += alias_len; + + map[nmap].value = memcpy (&string_space[string_space_act], + value, value_len); + string_space_act += value_len; + + ++nmap; + ++added; + } + } + + /* Possibly not the whole line fits into the buffer. Ignore + the rest of the line. */ + while (strchr (buf, '\n') == NULL) + if (FGETS (buf, sizeof buf, fp) == NULL) + /* Make sure the inner loop will be left. The outer loop + will exit at the `feof' test. */ + break; + } + + /* Should we test for ferror()? I think we have to silently ignore + errors. --drepper */ + fclose (fp); + + if (added > 0) + qsort (map, nmap, sizeof (struct alias_map), + (int (*) (const void *, const void *)) alias_compare); + + return added; +} + + +static int +extend_alias_table () +{ + size_t new_size; + struct alias_map *new_map; + + new_size = maxmap == 0 ? 100 : 2 * maxmap; + new_map = (struct alias_map *) realloc (map, (new_size + * sizeof (struct alias_map))); + if (new_map == NULL) + /* Simply don't extend: we don't have any more core. */ + return -1; + + map = new_map; + maxmap = new_size; + return 0; +} + + +static int +alias_compare (const struct alias_map *map1, const struct alias_map *map2) +{ +#if defined _LIBC || defined HAVE_STRCASECMP + return strcasecmp (map1->alias, map2->alias); +#else + const unsigned char *p1 = (const unsigned char *) map1->alias; + const unsigned char *p2 = (const unsigned char *) map2->alias; + unsigned char c1, c2; + + if (p1 == p2) + return 0; + + do + { + /* I know this seems to be odd but the tolower() function in + some systems libc cannot handle nonalpha characters. */ + c1 = isupper (*p1) ? tolower (*p1) : *p1; + c2 = isupper (*p2) ? tolower (*p2) : *p2; + if (c1 == '\0') + break; + ++p1; + ++p2; + } + while (c1 == c2); + + return c1 - c2; +#endif +} diff --git a/intl/localename.c b/intl/localename.c new file mode 100644 index 0000000..5662e54 --- /dev/null +++ b/intl/localename.c @@ -0,0 +1,1142 @@ +/* Determine the current selected locale. + Copyright (C) 1995-1999, 2000-2004 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Written by Ulrich Drepper , 1995. */ +/* Win32 code written by Tor Lillqvist . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#if defined _WIN32 || defined __WIN32__ +# undef WIN32 /* avoid warning on mingw32 */ +# define WIN32 +#endif + +#ifdef WIN32 +# define WIN32_LEAN_AND_MEAN +# include +/* List of language codes, sorted by value: + 0x01 LANG_ARABIC + 0x02 LANG_BULGARIAN + 0x03 LANG_CATALAN + 0x04 LANG_CHINESE + 0x05 LANG_CZECH + 0x06 LANG_DANISH + 0x07 LANG_GERMAN + 0x08 LANG_GREEK + 0x09 LANG_ENGLISH + 0x0a LANG_SPANISH + 0x0b LANG_FINNISH + 0x0c LANG_FRENCH + 0x0d LANG_HEBREW + 0x0e LANG_HUNGARIAN + 0x0f LANG_ICELANDIC + 0x10 LANG_ITALIAN + 0x11 LANG_JAPANESE + 0x12 LANG_KOREAN + 0x13 LANG_DUTCH + 0x14 LANG_NORWEGIAN + 0x15 LANG_POLISH + 0x16 LANG_PORTUGUESE + 0x17 LANG_RHAETO_ROMANCE + 0x18 LANG_ROMANIAN + 0x19 LANG_RUSSIAN + 0x1a LANG_CROATIAN == LANG_SERBIAN + 0x1b LANG_SLOVAK + 0x1c LANG_ALBANIAN + 0x1d LANG_SWEDISH + 0x1e LANG_THAI + 0x1f LANG_TURKISH + 0x20 LANG_URDU + 0x21 LANG_INDONESIAN + 0x22 LANG_UKRAINIAN + 0x23 LANG_BELARUSIAN + 0x24 LANG_SLOVENIAN + 0x25 LANG_ESTONIAN + 0x26 LANG_LATVIAN + 0x27 LANG_LITHUANIAN + 0x28 LANG_TAJIK + 0x29 LANG_FARSI + 0x2a LANG_VIETNAMESE + 0x2b LANG_ARMENIAN + 0x2c LANG_AZERI + 0x2d LANG_BASQUE + 0x2e LANG_SORBIAN + 0x2f LANG_MACEDONIAN + 0x30 LANG_SUTU + 0x31 LANG_TSONGA + 0x32 LANG_TSWANA + 0x33 LANG_VENDA + 0x34 LANG_XHOSA + 0x35 LANG_ZULU + 0x36 LANG_AFRIKAANS + 0x37 LANG_GEORGIAN + 0x38 LANG_FAEROESE + 0x39 LANG_HINDI + 0x3a LANG_MALTESE + 0x3b LANG_SAAMI + 0x3c LANG_GAELIC + 0x3d LANG_YIDDISH + 0x3e LANG_MALAY + 0x3f LANG_KAZAK + 0x40 LANG_KYRGYZ + 0x41 LANG_SWAHILI + 0x42 LANG_TURKMEN + 0x43 LANG_UZBEK + 0x44 LANG_TATAR + 0x45 LANG_BENGALI + 0x46 LANG_PUNJABI + 0x47 LANG_GUJARATI + 0x48 LANG_ORIYA + 0x49 LANG_TAMIL + 0x4a LANG_TELUGU + 0x4b LANG_KANNADA + 0x4c LANG_MALAYALAM + 0x4d LANG_ASSAMESE + 0x4e LANG_MARATHI + 0x4f LANG_SANSKRIT + 0x50 LANG_MONGOLIAN + 0x51 LANG_TIBETAN + 0x52 LANG_WELSH + 0x53 LANG_CAMBODIAN + 0x54 LANG_LAO + 0x55 LANG_BURMESE + 0x56 LANG_GALICIAN + 0x57 LANG_KONKANI + 0x58 LANG_MANIPURI + 0x59 LANG_SINDHI + 0x5a LANG_SYRIAC + 0x5b LANG_SINHALESE + 0x5c LANG_CHEROKEE + 0x5d LANG_INUKTITUT + 0x5e LANG_AMHARIC + 0x5f LANG_TAMAZIGHT + 0x60 LANG_KASHMIRI + 0x61 LANG_NEPALI + 0x62 LANG_FRISIAN + 0x63 LANG_PASHTO + 0x64 LANG_TAGALOG + 0x65 LANG_DIVEHI + 0x66 LANG_EDO + 0x67 LANG_FULFULDE + 0x68 LANG_HAUSA + 0x69 LANG_IBIBIO + 0x6a LANG_YORUBA + 0x70 LANG_IGBO + 0x71 LANG_KANURI + 0x72 LANG_OROMO + 0x73 LANG_TIGRINYA + 0x74 LANG_GUARANI + 0x75 LANG_HAWAIIAN + 0x76 LANG_LATIN + 0x77 LANG_SOMALI + 0x78 LANG_YI + 0x79 LANG_PAPIAMENTU +*/ +/* Mingw headers don't have latest language and sublanguage codes. */ +# ifndef LANG_AFRIKAANS +# define LANG_AFRIKAANS 0x36 +# endif +# ifndef LANG_ALBANIAN +# define LANG_ALBANIAN 0x1c +# endif +# ifndef LANG_AMHARIC +# define LANG_AMHARIC 0x5e +# endif +# ifndef LANG_ARABIC +# define LANG_ARABIC 0x01 +# endif +# ifndef LANG_ARMENIAN +# define LANG_ARMENIAN 0x2b +# endif +# ifndef LANG_ASSAMESE +# define LANG_ASSAMESE 0x4d +# endif +# ifndef LANG_AZERI +# define LANG_AZERI 0x2c +# endif +# ifndef LANG_BASQUE +# define LANG_BASQUE 0x2d +# endif +# ifndef LANG_BELARUSIAN +# define LANG_BELARUSIAN 0x23 +# endif +# ifndef LANG_BENGALI +# define LANG_BENGALI 0x45 +# endif +# ifndef LANG_BURMESE +# define LANG_BURMESE 0x55 +# endif +# ifndef LANG_CAMBODIAN +# define LANG_CAMBODIAN 0x53 +# endif +# ifndef LANG_CATALAN +# define LANG_CATALAN 0x03 +# endif +# ifndef LANG_CHEROKEE +# define LANG_CHEROKEE 0x5c +# endif +# ifndef LANG_DIVEHI +# define LANG_DIVEHI 0x65 +# endif +# ifndef LANG_EDO +# define LANG_EDO 0x66 +# endif +# ifndef LANG_ESTONIAN +# define LANG_ESTONIAN 0x25 +# endif +# ifndef LANG_FAEROESE +# define LANG_FAEROESE 0x38 +# endif +# ifndef LANG_FARSI +# define LANG_FARSI 0x29 +# endif +# ifndef LANG_FRISIAN +# define LANG_FRISIAN 0x62 +# endif +# ifndef LANG_FULFULDE +# define LANG_FULFULDE 0x67 +# endif +# ifndef LANG_GAELIC +# define LANG_GAELIC 0x3c +# endif +# ifndef LANG_GALICIAN +# define LANG_GALICIAN 0x56 +# endif +# ifndef LANG_GEORGIAN +# define LANG_GEORGIAN 0x37 +# endif +# ifndef LANG_GUARANI +# define LANG_GUARANI 0x74 +# endif +# ifndef LANG_GUJARATI +# define LANG_GUJARATI 0x47 +# endif +# ifndef LANG_HAUSA +# define LANG_HAUSA 0x68 +# endif +# ifndef LANG_HAWAIIAN +# define LANG_HAWAIIAN 0x75 +# endif +# ifndef LANG_HEBREW +# define LANG_HEBREW 0x0d +# endif +# ifndef LANG_HINDI +# define LANG_HINDI 0x39 +# endif +# ifndef LANG_IBIBIO +# define LANG_IBIBIO 0x69 +# endif +# ifndef LANG_IGBO +# define LANG_IGBO 0x70 +# endif +# ifndef LANG_INDONESIAN +# define LANG_INDONESIAN 0x21 +# endif +# ifndef LANG_INUKTITUT +# define LANG_INUKTITUT 0x5d +# endif +# ifndef LANG_KANNADA +# define LANG_KANNADA 0x4b +# endif +# ifndef LANG_KANURI +# define LANG_KANURI 0x71 +# endif +# ifndef LANG_KASHMIRI +# define LANG_KASHMIRI 0x60 +# endif +# ifndef LANG_KAZAK +# define LANG_KAZAK 0x3f +# endif +# ifndef LANG_KONKANI +# define LANG_KONKANI 0x57 +# endif +# ifndef LANG_KYRGYZ +# define LANG_KYRGYZ 0x40 +# endif +# ifndef LANG_LAO +# define LANG_LAO 0x54 +# endif +# ifndef LANG_LATIN +# define LANG_LATIN 0x76 +# endif +# ifndef LANG_LATVIAN +# define LANG_LATVIAN 0x26 +# endif +# ifndef LANG_LITHUANIAN +# define LANG_LITHUANIAN 0x27 +# endif +# ifndef LANG_MACEDONIAN +# define LANG_MACEDONIAN 0x2f +# endif +# ifndef LANG_MALAY +# define LANG_MALAY 0x3e +# endif +# ifndef LANG_MALAYALAM +# define LANG_MALAYALAM 0x4c +# endif +# ifndef LANG_MALTESE +# define LANG_MALTESE 0x3a +# endif +# ifndef LANG_MANIPURI +# define LANG_MANIPURI 0x58 +# endif +# ifndef LANG_MARATHI +# define LANG_MARATHI 0x4e +# endif +# ifndef LANG_MONGOLIAN +# define LANG_MONGOLIAN 0x50 +# endif +# ifndef LANG_NEPALI +# define LANG_NEPALI 0x61 +# endif +# ifndef LANG_ORIYA +# define LANG_ORIYA 0x48 +# endif +# ifndef LANG_OROMO +# define LANG_OROMO 0x72 +# endif +# ifndef LANG_PAPIAMENTU +# define LANG_PAPIAMENTU 0x79 +# endif +# ifndef LANG_PASHTO +# define LANG_PASHTO 0x63 +# endif +# ifndef LANG_PUNJABI +# define LANG_PUNJABI 0x46 +# endif +# ifndef LANG_RHAETO_ROMANCE +# define LANG_RHAETO_ROMANCE 0x17 +# endif +# ifndef LANG_SAAMI +# define LANG_SAAMI 0x3b +# endif +# ifndef LANG_SANSKRIT +# define LANG_SANSKRIT 0x4f +# endif +# ifndef LANG_SERBIAN +# define LANG_SERBIAN 0x1a +# endif +# ifndef LANG_SINDHI +# define LANG_SINDHI 0x59 +# endif +# ifndef LANG_SINHALESE +# define LANG_SINHALESE 0x5b +# endif +# ifndef LANG_SLOVAK +# define LANG_SLOVAK 0x1b +# endif +# ifndef LANG_SOMALI +# define LANG_SOMALI 0x77 +# endif +# ifndef LANG_SORBIAN +# define LANG_SORBIAN 0x2e +# endif +# ifndef LANG_SUTU +# define LANG_SUTU 0x30 +# endif +# ifndef LANG_SWAHILI +# define LANG_SWAHILI 0x41 +# endif +# ifndef LANG_SYRIAC +# define LANG_SYRIAC 0x5a +# endif +# ifndef LANG_TAGALOG +# define LANG_TAGALOG 0x64 +# endif +# ifndef LANG_TAJIK +# define LANG_TAJIK 0x28 +# endif +# ifndef LANG_TAMAZIGHT +# define LANG_TAMAZIGHT 0x5f +# endif +# ifndef LANG_TAMIL +# define LANG_TAMIL 0x49 +# endif +# ifndef LANG_TATAR +# define LANG_TATAR 0x44 +# endif +# ifndef LANG_TELUGU +# define LANG_TELUGU 0x4a +# endif +# ifndef LANG_THAI +# define LANG_THAI 0x1e +# endif +# ifndef LANG_TIBETAN +# define LANG_TIBETAN 0x51 +# endif +# ifndef LANG_TIGRINYA +# define LANG_TIGRINYA 0x73 +# endif +# ifndef LANG_TSONGA +# define LANG_TSONGA 0x31 +# endif +# ifndef LANG_TSWANA +# define LANG_TSWANA 0x32 +# endif +# ifndef LANG_TURKMEN +# define LANG_TURKMEN 0x42 +# endif +# ifndef LANG_UKRAINIAN +# define LANG_UKRAINIAN 0x22 +# endif +# ifndef LANG_URDU +# define LANG_URDU 0x20 +# endif +# ifndef LANG_UZBEK +# define LANG_UZBEK 0x43 +# endif +# ifndef LANG_VENDA +# define LANG_VENDA 0x33 +# endif +# ifndef LANG_VIETNAMESE +# define LANG_VIETNAMESE 0x2a +# endif +# ifndef LANG_WELSH +# define LANG_WELSH 0x52 +# endif +# ifndef LANG_XHOSA +# define LANG_XHOSA 0x34 +# endif +# ifndef LANG_YI +# define LANG_YI 0x78 +# endif +# ifndef LANG_YIDDISH +# define LANG_YIDDISH 0x3d +# endif +# ifndef LANG_YORUBA +# define LANG_YORUBA 0x6a +# endif +# ifndef LANG_ZULU +# define LANG_ZULU 0x35 +# endif +# ifndef SUBLANG_ARABIC_SAUDI_ARABIA +# define SUBLANG_ARABIC_SAUDI_ARABIA 0x01 +# endif +# ifndef SUBLANG_ARABIC_IRAQ +# define SUBLANG_ARABIC_IRAQ 0x02 +# endif +# ifndef SUBLANG_ARABIC_EGYPT +# define SUBLANG_ARABIC_EGYPT 0x03 +# endif +# ifndef SUBLANG_ARABIC_LIBYA +# define SUBLANG_ARABIC_LIBYA 0x04 +# endif +# ifndef SUBLANG_ARABIC_ALGERIA +# define SUBLANG_ARABIC_ALGERIA 0x05 +# endif +# ifndef SUBLANG_ARABIC_MOROCCO +# define SUBLANG_ARABIC_MOROCCO 0x06 +# endif +# ifndef SUBLANG_ARABIC_TUNISIA +# define SUBLANG_ARABIC_TUNISIA 0x07 +# endif +# ifndef SUBLANG_ARABIC_OMAN +# define SUBLANG_ARABIC_OMAN 0x08 +# endif +# ifndef SUBLANG_ARABIC_YEMEN +# define SUBLANG_ARABIC_YEMEN 0x09 +# endif +# ifndef SUBLANG_ARABIC_SYRIA +# define SUBLANG_ARABIC_SYRIA 0x0a +# endif +# ifndef SUBLANG_ARABIC_JORDAN +# define SUBLANG_ARABIC_JORDAN 0x0b +# endif +# ifndef SUBLANG_ARABIC_LEBANON +# define SUBLANG_ARABIC_LEBANON 0x0c +# endif +# ifndef SUBLANG_ARABIC_KUWAIT +# define SUBLANG_ARABIC_KUWAIT 0x0d +# endif +# ifndef SUBLANG_ARABIC_UAE +# define SUBLANG_ARABIC_UAE 0x0e +# endif +# ifndef SUBLANG_ARABIC_BAHRAIN +# define SUBLANG_ARABIC_BAHRAIN 0x0f +# endif +# ifndef SUBLANG_ARABIC_QATAR +# define SUBLANG_ARABIC_QATAR 0x10 +# endif +# ifndef SUBLANG_AZERI_LATIN +# define SUBLANG_AZERI_LATIN 0x01 +# endif +# ifndef SUBLANG_AZERI_CYRILLIC +# define SUBLANG_AZERI_CYRILLIC 0x02 +# endif +# ifndef SUBLANG_BENGALI_INDIA +# define SUBLANG_BENGALI_INDIA 0x00 +# endif +# ifndef SUBLANG_BENGALI_BANGLADESH +# define SUBLANG_BENGALI_BANGLADESH 0x01 +# endif +# ifndef SUBLANG_CHINESE_MACAU +# define SUBLANG_CHINESE_MACAU 0x05 +# endif +# ifndef SUBLANG_ENGLISH_SOUTH_AFRICA +# define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 +# endif +# ifndef SUBLANG_ENGLISH_JAMAICA +# define SUBLANG_ENGLISH_JAMAICA 0x08 +# endif +# ifndef SUBLANG_ENGLISH_CARIBBEAN +# define SUBLANG_ENGLISH_CARIBBEAN 0x09 +# endif +# ifndef SUBLANG_ENGLISH_BELIZE +# define SUBLANG_ENGLISH_BELIZE 0x0a +# endif +# ifndef SUBLANG_ENGLISH_TRINIDAD +# define SUBLANG_ENGLISH_TRINIDAD 0x0b +# endif +# ifndef SUBLANG_ENGLISH_ZIMBABWE +# define SUBLANG_ENGLISH_ZIMBABWE 0x0c +# endif +# ifndef SUBLANG_ENGLISH_PHILIPPINES +# define SUBLANG_ENGLISH_PHILIPPINES 0x0d +# endif +# ifndef SUBLANG_ENGLISH_INDONESIA +# define SUBLANG_ENGLISH_INDONESIA 0x0e +# endif +# ifndef SUBLANG_ENGLISH_HONGKONG +# define SUBLANG_ENGLISH_HONGKONG 0x0f +# endif +# ifndef SUBLANG_ENGLISH_INDIA +# define SUBLANG_ENGLISH_INDIA 0x10 +# endif +# ifndef SUBLANG_ENGLISH_MALAYSIA +# define SUBLANG_ENGLISH_MALAYSIA 0x11 +# endif +# ifndef SUBLANG_ENGLISH_SINGAPORE +# define SUBLANG_ENGLISH_SINGAPORE 0x12 +# endif +# ifndef SUBLANG_FRENCH_LUXEMBOURG +# define SUBLANG_FRENCH_LUXEMBOURG 0x05 +# endif +# ifndef SUBLANG_FRENCH_MONACO +# define SUBLANG_FRENCH_MONACO 0x06 +# endif +# ifndef SUBLANG_FRENCH_WESTINDIES +# define SUBLANG_FRENCH_WESTINDIES 0x07 +# endif +# ifndef SUBLANG_FRENCH_REUNION +# define SUBLANG_FRENCH_REUNION 0x08 +# endif +# ifndef SUBLANG_FRENCH_CONGO +# define SUBLANG_FRENCH_CONGO 0x09 +# endif +# ifndef SUBLANG_FRENCH_SENEGAL +# define SUBLANG_FRENCH_SENEGAL 0x0a +# endif +# ifndef SUBLANG_FRENCH_CAMEROON +# define SUBLANG_FRENCH_CAMEROON 0x0b +# endif +# ifndef SUBLANG_FRENCH_COTEDIVOIRE +# define SUBLANG_FRENCH_COTEDIVOIRE 0x0c +# endif +# ifndef SUBLANG_FRENCH_MALI +# define SUBLANG_FRENCH_MALI 0x0d +# endif +# ifndef SUBLANG_FRENCH_MOROCCO +# define SUBLANG_FRENCH_MOROCCO 0x0e +# endif +# ifndef SUBLANG_FRENCH_HAITI +# define SUBLANG_FRENCH_HAITI 0x0f +# endif +# ifndef SUBLANG_GERMAN_LUXEMBOURG +# define SUBLANG_GERMAN_LUXEMBOURG 0x04 +# endif +# ifndef SUBLANG_GERMAN_LIECHTENSTEIN +# define SUBLANG_GERMAN_LIECHTENSTEIN 0x05 +# endif +# ifndef SUBLANG_KASHMIRI_INDIA +# define SUBLANG_KASHMIRI_INDIA 0x02 +# endif +# ifndef SUBLANG_MALAY_MALAYSIA +# define SUBLANG_MALAY_MALAYSIA 0x01 +# endif +# ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM +# define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 +# endif +# ifndef SUBLANG_NEPALI_INDIA +# define SUBLANG_NEPALI_INDIA 0x02 +# endif +# ifndef SUBLANG_PUNJABI_INDIA +# define SUBLANG_PUNJABI_INDIA 0x00 +# endif +# ifndef SUBLANG_PUNJABI_PAKISTAN +# define SUBLANG_PUNJABI_PAKISTAN 0x01 +# endif +# ifndef SUBLANG_ROMANIAN_ROMANIA +# define SUBLANG_ROMANIAN_ROMANIA 0x00 +# endif +# ifndef SUBLANG_ROMANIAN_MOLDOVA +# define SUBLANG_ROMANIAN_MOLDOVA 0x01 +# endif +# ifndef SUBLANG_SERBIAN_LATIN +# define SUBLANG_SERBIAN_LATIN 0x02 +# endif +# ifndef SUBLANG_SERBIAN_CYRILLIC +# define SUBLANG_SERBIAN_CYRILLIC 0x03 +# endif +# ifndef SUBLANG_SINDHI_INDIA +# define SUBLANG_SINDHI_INDIA 0x00 +# endif +# ifndef SUBLANG_SINDHI_PAKISTAN +# define SUBLANG_SINDHI_PAKISTAN 0x01 +# endif +# ifndef SUBLANG_SPANISH_GUATEMALA +# define SUBLANG_SPANISH_GUATEMALA 0x04 +# endif +# ifndef SUBLANG_SPANISH_COSTA_RICA +# define SUBLANG_SPANISH_COSTA_RICA 0x05 +# endif +# ifndef SUBLANG_SPANISH_PANAMA +# define SUBLANG_SPANISH_PANAMA 0x06 +# endif +# ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC +# define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 +# endif +# ifndef SUBLANG_SPANISH_VENEZUELA +# define SUBLANG_SPANISH_VENEZUELA 0x08 +# endif +# ifndef SUBLANG_SPANISH_COLOMBIA +# define SUBLANG_SPANISH_COLOMBIA 0x09 +# endif +# ifndef SUBLANG_SPANISH_PERU +# define SUBLANG_SPANISH_PERU 0x0a +# endif +# ifndef SUBLANG_SPANISH_ARGENTINA +# define SUBLANG_SPANISH_ARGENTINA 0x0b +# endif +# ifndef SUBLANG_SPANISH_ECUADOR +# define SUBLANG_SPANISH_ECUADOR 0x0c +# endif +# ifndef SUBLANG_SPANISH_CHILE +# define SUBLANG_SPANISH_CHILE 0x0d +# endif +# ifndef SUBLANG_SPANISH_URUGUAY +# define SUBLANG_SPANISH_URUGUAY 0x0e +# endif +# ifndef SUBLANG_SPANISH_PARAGUAY +# define SUBLANG_SPANISH_PARAGUAY 0x0f +# endif +# ifndef SUBLANG_SPANISH_BOLIVIA +# define SUBLANG_SPANISH_BOLIVIA 0x10 +# endif +# ifndef SUBLANG_SPANISH_EL_SALVADOR +# define SUBLANG_SPANISH_EL_SALVADOR 0x11 +# endif +# ifndef SUBLANG_SPANISH_HONDURAS +# define SUBLANG_SPANISH_HONDURAS 0x12 +# endif +# ifndef SUBLANG_SPANISH_NICARAGUA +# define SUBLANG_SPANISH_NICARAGUA 0x13 +# endif +# ifndef SUBLANG_SPANISH_PUERTO_RICO +# define SUBLANG_SPANISH_PUERTO_RICO 0x14 +# endif +# ifndef SUBLANG_SWEDISH_FINLAND +# define SUBLANG_SWEDISH_FINLAND 0x02 +# endif +# ifndef SUBLANG_TAMAZIGHT_ARABIC +# define SUBLANG_TAMAZIGHT_ARABIC 0x01 +# endif +# ifndef SUBLANG_TAMAZIGHT_LATIN +# define SUBLANG_TAMAZIGHT_LATIN 0x02 +# endif +# ifndef SUBLANG_TIGRINYA_ETHIOPIA +# define SUBLANG_TIGRINYA_ETHIOPIA 0x00 +# endif +# ifndef SUBLANG_TIGRINYA_ERITREA +# define SUBLANG_TIGRINYA_ERITREA 0x01 +# endif +# ifndef SUBLANG_URDU_PAKISTAN +# define SUBLANG_URDU_PAKISTAN 0x01 +# endif +# ifndef SUBLANG_URDU_INDIA +# define SUBLANG_URDU_INDIA 0x02 +# endif +# ifndef SUBLANG_UZBEK_LATIN +# define SUBLANG_UZBEK_LATIN 0x01 +# endif +# ifndef SUBLANG_UZBEK_CYRILLIC +# define SUBLANG_UZBEK_CYRILLIC 0x02 +# endif +#endif + +/* XPG3 defines the result of 'setlocale (category, NULL)' as: + "Directs 'setlocale()' to query 'category' and return the current + setting of 'local'." + However it does not specify the exact format. Neither do SUSV2 and + ISO C 99. So we can use this feature only on selected systems (e.g. + those using GNU C Library). */ +#if defined _LIBC || (defined __GNU_LIBRARY__ && __GNU_LIBRARY__ >= 2) +# define HAVE_LOCALE_NULL +#endif + +/* Determine the current locale's name, and canonicalize it into XPG syntax + language[_territory[.codeset]][@modifier] + The codeset part in the result is not reliable; the locale_charset() + should be used for codeset information instead. + The result must not be freed; it is statically allocated. */ + +const char * +_nl_locale_name (int category, const char *categoryname) +{ + const char *retval; + +#ifndef WIN32 + + /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'. + On some systems this can be done by the 'setlocale' function itself. */ +# if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL + retval = setlocale (category, NULL); +# else + /* Setting of LC_ALL overwrites all other. */ + retval = getenv ("LC_ALL"); + if (retval == NULL || retval[0] == '\0') + { + /* Next comes the name of the desired category. */ + retval = getenv (categoryname); + if (retval == NULL || retval[0] == '\0') + { + /* Last possibility is the LANG environment variable. */ + retval = getenv ("LANG"); + if (retval == NULL || retval[0] == '\0') + /* We use C as the default domain. POSIX says this is + implementation defined. */ + retval = "C"; + } + } +# endif + + return retval; + +#else /* WIN32 */ + + /* Return an XPG style locale name language[_territory][@modifier]. + Don't even bother determining the codeset; it's not useful in this + context, because message catalogs are not specific to a single + codeset. */ + + LCID lcid; + LANGID langid; + int primary, sub; + + /* Let the user override the system settings through environment + variables, as on POSIX systems. */ + retval = getenv ("LC_ALL"); + if (retval != NULL && retval[0] != '\0') + return retval; + retval = getenv (categoryname); + if (retval != NULL && retval[0] != '\0') + return retval; + retval = getenv ("LANG"); + if (retval != NULL && retval[0] != '\0') + return retval; + + /* Use native Win32 API locale ID. */ + lcid = GetThreadLocale (); + + /* Strip off the sorting rules, keep only the language part. */ + langid = LANGIDFROMLCID (lcid); + + /* Split into language and territory part. */ + primary = PRIMARYLANGID (langid); + sub = SUBLANGID (langid); + + /* Dispatch on language. + See also http://www.unicode.org/unicode/onlinedat/languages.html . + For details about languages, see http://www.ethnologue.com/ . */ + switch (primary) + { + case LANG_AFRIKAANS: return "af_ZA"; + case LANG_ALBANIAN: return "sq_AL"; + case LANG_AMHARIC: return "am_ET"; + case LANG_ARABIC: + switch (sub) + { + case SUBLANG_ARABIC_SAUDI_ARABIA: return "ar_SA"; + case SUBLANG_ARABIC_IRAQ: return "ar_IQ"; + case SUBLANG_ARABIC_EGYPT: return "ar_EG"; + case SUBLANG_ARABIC_LIBYA: return "ar_LY"; + case SUBLANG_ARABIC_ALGERIA: return "ar_DZ"; + case SUBLANG_ARABIC_MOROCCO: return "ar_MA"; + case SUBLANG_ARABIC_TUNISIA: return "ar_TN"; + case SUBLANG_ARABIC_OMAN: return "ar_OM"; + case SUBLANG_ARABIC_YEMEN: return "ar_YE"; + case SUBLANG_ARABIC_SYRIA: return "ar_SY"; + case SUBLANG_ARABIC_JORDAN: return "ar_JO"; + case SUBLANG_ARABIC_LEBANON: return "ar_LB"; + case SUBLANG_ARABIC_KUWAIT: return "ar_KW"; + case SUBLANG_ARABIC_UAE: return "ar_AE"; + case SUBLANG_ARABIC_BAHRAIN: return "ar_BH"; + case SUBLANG_ARABIC_QATAR: return "ar_QA"; + } + return "ar"; + case LANG_ARMENIAN: return "hy_AM"; + case LANG_ASSAMESE: return "as_IN"; + case LANG_AZERI: + switch (sub) + { + /* FIXME: Adjust this when Azerbaijani locales appear on Unix. */ + case SUBLANG_AZERI_LATIN: return "az_AZ@latin"; + case SUBLANG_AZERI_CYRILLIC: return "az_AZ@cyrillic"; + } + return "az"; + case LANG_BASQUE: + return "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR". */ + case LANG_BELARUSIAN: return "be_BY"; + case LANG_BENGALI: + switch (sub) + { + case SUBLANG_BENGALI_INDIA: return "bn_IN"; + case SUBLANG_BENGALI_BANGLADESH: return "bn_BD"; + } + return "bn"; + case LANG_BULGARIAN: return "bg_BG"; + case LANG_BURMESE: return "my_MM"; + case LANG_CAMBODIAN: return "km_KH"; + case LANG_CATALAN: return "ca_ES"; + case LANG_CHEROKEE: return "chr_US"; + case LANG_CHINESE: + switch (sub) + { + case SUBLANG_CHINESE_TRADITIONAL: return "zh_TW"; + case SUBLANG_CHINESE_SIMPLIFIED: return "zh_CN"; + case SUBLANG_CHINESE_HONGKONG: return "zh_HK"; + case SUBLANG_CHINESE_SINGAPORE: return "zh_SG"; + case SUBLANG_CHINESE_MACAU: return "zh_MO"; + } + return "zh"; + case LANG_CROATIAN: /* LANG_CROATIAN == LANG_SERBIAN + * What used to be called Serbo-Croatian + * should really now be two separate + * languages because of political reasons. + * (Says tml, who knows nothing about Serbian + * or Croatian.) + * (I can feel those flames coming already.) + */ + switch (sub) + { + case SUBLANG_DEFAULT: return "hr_HR"; + case SUBLANG_SERBIAN_LATIN: return "sr_CS"; + case SUBLANG_SERBIAN_CYRILLIC: return "sr_CS@cyrillic"; + } + return "hr"; + case LANG_CZECH: return "cs_CZ"; + case LANG_DANISH: return "da_DK"; + case LANG_DIVEHI: return "dv_MV"; + case LANG_DUTCH: + switch (sub) + { + case SUBLANG_DUTCH: return "nl_NL"; + case SUBLANG_DUTCH_BELGIAN: /* FLEMISH, VLAAMS */ return "nl_BE"; + } + return "nl"; + case LANG_EDO: return "bin_NG"; + case LANG_ENGLISH: + switch (sub) + { + /* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought + * English was the language spoken in England. + * Oh well. + */ + case SUBLANG_ENGLISH_US: return "en_US"; + case SUBLANG_ENGLISH_UK: return "en_GB"; + case SUBLANG_ENGLISH_AUS: return "en_AU"; + case SUBLANG_ENGLISH_CAN: return "en_CA"; + case SUBLANG_ENGLISH_NZ: return "en_NZ"; + case SUBLANG_ENGLISH_EIRE: return "en_IE"; + case SUBLANG_ENGLISH_SOUTH_AFRICA: return "en_ZA"; + case SUBLANG_ENGLISH_JAMAICA: return "en_JM"; + case SUBLANG_ENGLISH_CARIBBEAN: return "en_GD"; /* Grenada? */ + case SUBLANG_ENGLISH_BELIZE: return "en_BZ"; + case SUBLANG_ENGLISH_TRINIDAD: return "en_TT"; + case SUBLANG_ENGLISH_ZIMBABWE: return "en_ZW"; + case SUBLANG_ENGLISH_PHILIPPINES: return "en_PH"; + case SUBLANG_ENGLISH_INDONESIA: return "en_ID"; + case SUBLANG_ENGLISH_HONGKONG: return "en_HK"; + case SUBLANG_ENGLISH_INDIA: return "en_IN"; + case SUBLANG_ENGLISH_MALAYSIA: return "en_MY"; + case SUBLANG_ENGLISH_SINGAPORE: return "en_SG"; + } + return "en"; + case LANG_ESTONIAN: return "et_EE"; + case LANG_FAEROESE: return "fo_FO"; + case LANG_FARSI: return "fa_IR"; + case LANG_FINNISH: return "fi_FI"; + case LANG_FRENCH: + switch (sub) + { + case SUBLANG_FRENCH: return "fr_FR"; + case SUBLANG_FRENCH_BELGIAN: /* WALLOON */ return "fr_BE"; + case SUBLANG_FRENCH_CANADIAN: return "fr_CA"; + case SUBLANG_FRENCH_SWISS: return "fr_CH"; + case SUBLANG_FRENCH_LUXEMBOURG: return "fr_LU"; + case SUBLANG_FRENCH_MONACO: return "fr_MC"; + case SUBLANG_FRENCH_WESTINDIES: return "fr"; /* Caribbean? */ + case SUBLANG_FRENCH_REUNION: return "fr_RE"; + case SUBLANG_FRENCH_CONGO: return "fr_CG"; + case SUBLANG_FRENCH_SENEGAL: return "fr_SN"; + case SUBLANG_FRENCH_CAMEROON: return "fr_CM"; + case SUBLANG_FRENCH_COTEDIVOIRE: return "fr_CI"; + case SUBLANG_FRENCH_MALI: return "fr_ML"; + case SUBLANG_FRENCH_MOROCCO: return "fr_MA"; + case SUBLANG_FRENCH_HAITI: return "fr_HT"; + } + return "fr"; + case LANG_FRISIAN: return "fy_NL"; + case LANG_FULFULDE: + /* Spoken in Nigeria, Guinea, Senegal, Mali, Niger, Cameroon, Benin. */ + return "ff_NG"; + case LANG_GAELIC: + switch (sub) + { + case 0x01: /* SCOTTISH */ return "gd_GB"; + case 0x02: /* IRISH */ return "ga_IE"; + } + return "C"; + case LANG_GALICIAN: return "gl_ES"; + case LANG_GEORGIAN: return "ka_GE"; + case LANG_GERMAN: + switch (sub) + { + case SUBLANG_GERMAN: return "de_DE"; + case SUBLANG_GERMAN_SWISS: return "de_CH"; + case SUBLANG_GERMAN_AUSTRIAN: return "de_AT"; + case SUBLANG_GERMAN_LUXEMBOURG: return "de_LU"; + case SUBLANG_GERMAN_LIECHTENSTEIN: return "de_LI"; + } + return "de"; + case LANG_GREEK: return "el_GR"; + case LANG_GUARANI: return "gn_PY"; + case LANG_GUJARATI: return "gu_IN"; + case LANG_HAUSA: return "ha_NG"; + case LANG_HAWAIIAN: + /* FIXME: Do they mean Hawaiian ("haw_US", 1000 speakers) + or Hawaii Creole English ("cpe_US", 600000 speakers)? */ + return "cpe_US"; + case LANG_HEBREW: return "he_IL"; + case LANG_HINDI: return "hi_IN"; + case LANG_HUNGARIAN: return "hu_HU"; + case LANG_IBIBIO: return "nic_NG"; + case LANG_ICELANDIC: return "is_IS"; + case LANG_IGBO: return "ig_NG"; + case LANG_INDONESIAN: return "id_ID"; + case LANG_INUKTITUT: return "iu_CA"; + case LANG_ITALIAN: + switch (sub) + { + case SUBLANG_ITALIAN: return "it_IT"; + case SUBLANG_ITALIAN_SWISS: return "it_CH"; + } + return "it"; + case LANG_JAPANESE: return "ja_JP"; + case LANG_KANNADA: return "kn_IN"; + case LANG_KANURI: return "kr_NG"; + case LANG_KASHMIRI: + switch (sub) + { + case SUBLANG_DEFAULT: return "ks_PK"; + case SUBLANG_KASHMIRI_INDIA: return "ks_IN"; + } + return "ks"; + case LANG_KAZAK: return "kk_KZ"; + case LANG_KONKANI: + /* FIXME: Adjust this when such locales appear on Unix. */ + return "kok_IN"; + case LANG_KOREAN: return "ko_KR"; + case LANG_KYRGYZ: return "ky_KG"; + case LANG_LAO: return "lo_LA"; + case LANG_LATIN: return "la_VA"; + case LANG_LATVIAN: return "lv_LV"; + case LANG_LITHUANIAN: return "lt_LT"; + case LANG_MACEDONIAN: return "mk_MK"; + case LANG_MALAY: + switch (sub) + { + case SUBLANG_MALAY_MALAYSIA: return "ms_MY"; + case SUBLANG_MALAY_BRUNEI_DARUSSALAM: return "ms_BN"; + } + return "ms"; + case LANG_MALAYALAM: return "ml_IN"; + case LANG_MALTESE: return "mt_MT"; + case LANG_MANIPURI: + /* FIXME: Adjust this when such locales appear on Unix. */ + return "mni_IN"; + case LANG_MARATHI: return "mr_IN"; + case LANG_MONGOLIAN: + return "mn"; /* Ambiguous: could be "mn_CN" or "mn_MN". */ + case LANG_NEPALI: + switch (sub) + { + case SUBLANG_DEFAULT: return "ne_NP"; + case SUBLANG_NEPALI_INDIA: return "ne_IN"; + } + return "ne"; + case LANG_NORWEGIAN: + switch (sub) + { + case SUBLANG_NORWEGIAN_BOKMAL: return "no_NO"; + case SUBLANG_NORWEGIAN_NYNORSK: return "nn_NO"; + } + return "no"; + case LANG_ORIYA: return "or_IN"; + case LANG_OROMO: return "om_ET"; + case LANG_PAPIAMENTU: return "pap_AN"; + case LANG_PASHTO: + return "ps"; /* Ambiguous: could be "ps_PK" or "ps_AF". */ + case LANG_POLISH: return "pl_PL"; + case LANG_PORTUGUESE: + switch (sub) + { + case SUBLANG_PORTUGUESE: return "pt_PT"; + /* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT. + Same phenomenon as SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. */ + case SUBLANG_PORTUGUESE_BRAZILIAN: return "pt_BR"; + } + return "pt"; + case LANG_PUNJABI: + switch (sub) + { + case SUBLANG_PUNJABI_INDIA: return "pa_IN"; /* Gurmukhi script */ + case SUBLANG_PUNJABI_PAKISTAN: return "pa_PK"; /* Arabic script */ + } + return "pa"; + case LANG_RHAETO_ROMANCE: return "rm_CH"; + case LANG_ROMANIAN: + switch (sub) + { + case SUBLANG_ROMANIAN_ROMANIA: return "ro_RO"; + case SUBLANG_ROMANIAN_MOLDOVA: return "ro_MD"; + } + return "ro"; + case LANG_RUSSIAN: + return "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA" or "ru_MD". */ + case LANG_SAAMI: /* actually Northern Sami */ return "se_NO"; + case LANG_SANSKRIT: return "sa_IN"; + case LANG_SINDHI: + switch (sub) + { + case SUBLANG_SINDHI_INDIA: return "sd_IN"; + case SUBLANG_SINDHI_PAKISTAN: return "sd_PK"; + } + return "sd"; + case LANG_SINHALESE: return "si_LK"; + case LANG_SLOVAK: return "sk_SK"; + case LANG_SLOVENIAN: return "sl_SI"; + case LANG_SOMALI: return "so_SO"; + case LANG_SORBIAN: + /* FIXME: Adjust this when such locales appear on Unix. */ + return "wen_DE"; + case LANG_SPANISH: + switch (sub) + { + case SUBLANG_SPANISH: return "es_ES"; + case SUBLANG_SPANISH_MEXICAN: return "es_MX"; + case SUBLANG_SPANISH_MODERN: + return "es_ES@modern"; /* not seen on Unix */ + case SUBLANG_SPANISH_GUATEMALA: return "es_GT"; + case SUBLANG_SPANISH_COSTA_RICA: return "es_CR"; + case SUBLANG_SPANISH_PANAMA: return "es_PA"; + case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: return "es_DO"; + case SUBLANG_SPANISH_VENEZUELA: return "es_VE"; + case SUBLANG_SPANISH_COLOMBIA: return "es_CO"; + case SUBLANG_SPANISH_PERU: return "es_PE"; + case SUBLANG_SPANISH_ARGENTINA: return "es_AR"; + case SUBLANG_SPANISH_ECUADOR: return "es_EC"; + case SUBLANG_SPANISH_CHILE: return "es_CL"; + case SUBLANG_SPANISH_URUGUAY: return "es_UY"; + case SUBLANG_SPANISH_PARAGUAY: return "es_PY"; + case SUBLANG_SPANISH_BOLIVIA: return "es_BO"; + case SUBLANG_SPANISH_EL_SALVADOR: return "es_SV"; + case SUBLANG_SPANISH_HONDURAS: return "es_HN"; + case SUBLANG_SPANISH_NICARAGUA: return "es_NI"; + case SUBLANG_SPANISH_PUERTO_RICO: return "es_PR"; + } + return "es"; + case LANG_SUTU: return "bnt_TZ"; /* or "st_LS" or "nso_ZA"? */ + case LANG_SWAHILI: return "sw_KE"; + case LANG_SWEDISH: + switch (sub) + { + case SUBLANG_DEFAULT: return "sv_SE"; + case SUBLANG_SWEDISH_FINLAND: return "sv_FI"; + } + return "sv"; + case LANG_SYRIAC: return "syr_TR"; /* An extinct language. */ + case LANG_TAGALOG: return "tl_PH"; + case LANG_TAJIK: return "tg_TJ"; + case LANG_TAMAZIGHT: + switch (sub) + { + /* FIXME: Adjust this when Tamazight locales appear on Unix. */ + case SUBLANG_TAMAZIGHT_ARABIC: return "ber_MA@arabic"; + case SUBLANG_TAMAZIGHT_LATIN: return "ber_MA@latin"; + } + return "ber_MA"; + case LANG_TAMIL: + return "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG". */ + case LANG_TATAR: return "tt_RU"; + case LANG_TELUGU: return "te_IN"; + case LANG_THAI: return "th_TH"; + case LANG_TIBETAN: return "bo_CN"; + case LANG_TIGRINYA: + switch (sub) + { + case SUBLANG_TIGRINYA_ETHIOPIA: return "ti_ET"; + case SUBLANG_TIGRINYA_ERITREA: return "ti_ER"; + } + return "ti"; + case LANG_TSONGA: return "ts_ZA"; + case LANG_TSWANA: return "tn_BW"; + case LANG_TURKISH: return "tr_TR"; + case LANG_TURKMEN: return "tk_TM"; + case LANG_UKRAINIAN: return "uk_UA"; + case LANG_URDU: + switch (sub) + { + case SUBLANG_URDU_PAKISTAN: return "ur_PK"; + case SUBLANG_URDU_INDIA: return "ur_IN"; + } + return "ur"; + case LANG_UZBEK: + switch (sub) + { + case SUBLANG_UZBEK_LATIN: return "uz_UZ"; + case SUBLANG_UZBEK_CYRILLIC: return "uz_UZ@cyrillic"; + } + return "uz"; + case LANG_VENDA: return "ve_ZA"; + case LANG_VIETNAMESE: return "vi_VN"; + case LANG_WELSH: return "cy_GB"; + case LANG_XHOSA: return "xh_ZA"; + case LANG_YI: return "sit_CN"; + case LANG_YIDDISH: return "yi_IL"; + case LANG_YORUBA: return "yo_NG"; + case LANG_ZULU: return "zu_ZA"; + default: return "C"; + } + +#endif +} diff --git a/intl/log.c b/intl/log.c new file mode 100644 index 0000000..cb6076e --- /dev/null +++ b/intl/log.c @@ -0,0 +1,98 @@ +/* Log file output. + Copyright (C) 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Written by Bruno Haible . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +/* Print an ASCII string with quotes and escape sequences where needed. */ +static void +print_escaped (FILE *stream, const char *str) +{ + putc ('"', stream); + for (; *str != '\0'; str++) + if (*str == '\n') + { + fputs ("\\n\"", stream); + if (str[1] == '\0') + return; + fputs ("\n\"", stream); + } + else + { + if (*str == '"' || *str == '\\') + putc ('\\', stream); + putc (*str, stream); + } + putc ('"', stream); +} + +/* Add to the log file an entry denoting a failed translation. */ +void +_nl_log_untranslated (const char *logfilename, const char *domainname, + const char *msgid1, const char *msgid2, int plural) +{ + static char *last_logfilename = NULL; + static FILE *last_logfile = NULL; + FILE *logfile; + + /* Can we reuse the last opened logfile? */ + if (last_logfilename == NULL || strcmp (logfilename, last_logfilename) != 0) + { + /* Close the last used logfile. */ + if (last_logfilename != NULL) + { + if (last_logfile != NULL) + { + fclose (last_logfile); + last_logfile = NULL; + } + free (last_logfilename); + last_logfilename = NULL; + } + /* Open the logfile. */ + last_logfilename = (char *) malloc (strlen (logfilename) + 1); + if (last_logfilename == NULL) + return; + strcpy (last_logfilename, logfilename); + last_logfile = fopen (logfilename, "a"); + if (last_logfile == NULL) + return; + } + logfile = last_logfile; + + fprintf (logfile, "domain "); + print_escaped (logfile, domainname); + fprintf (logfile, "\nmsgid "); + print_escaped (logfile, msgid1); + if (plural) + { + fprintf (logfile, "\nmsgid_plural "); + print_escaped (logfile, msgid2); + fprintf (logfile, "\nmsgstr[0] \"\"\n"); + } + else + fprintf (logfile, "\nmsgstr \"\"\n"); + putc ('\n', logfile); +} diff --git a/intl/ngettext.c b/intl/ngettext.c new file mode 100644 index 0000000..e73e00c --- /dev/null +++ b/intl/ngettext.c @@ -0,0 +1,65 @@ +/* Implementation of ngettext(3) function. + Copyright (C) 1995, 1997, 2000-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifdef _LIBC +# define __need_NULL +# include +#else +# include /* Just for NULL. */ +#endif + +#include "gettextP.h" +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif + +#include + +/* @@ end of prolog @@ */ + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define NGETTEXT __ngettext +# define DCNGETTEXT __dcngettext +#else +# define NGETTEXT libintl_ngettext +# define DCNGETTEXT libintl_dcngettext +#endif + +/* Look up MSGID in the current default message catalog for the current + LC_MESSAGES locale. If not found, returns MSGID itself (the default + text). */ +char * +NGETTEXT (const char *msgid1, const char *msgid2, unsigned long int n) +{ + return DCNGETTEXT (NULL, msgid1, msgid2, n, LC_MESSAGES); +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__ngettext, ngettext); +#endif diff --git a/intl/os2compat.c b/intl/os2compat.c new file mode 100644 index 0000000..c8dc33e --- /dev/null +++ b/intl/os2compat.c @@ -0,0 +1,98 @@ +/* OS/2 compatibility functions. + Copyright (C) 2001-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#define OS2_AWARE +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +/* A version of getenv() that works from DLLs */ +extern unsigned long DosScanEnv (const unsigned char *pszName, unsigned char **ppszValue); + +char * +_nl_getenv (const char *name) +{ + unsigned char *value; + if (DosScanEnv (name, &value)) + return NULL; + else + return value; +} + +/* A fixed size buffer. */ +char libintl_nl_default_dirname[MAXPATHLEN+1]; + +char *_nlos2_libdir = NULL; +char *_nlos2_localealiaspath = NULL; +char *_nlos2_localedir = NULL; + +static __attribute__((constructor)) void +nlos2_initialize () +{ + char *root = getenv ("UNIXROOT"); + char *gnulocaledir = getenv ("GNULOCALEDIR"); + + _nlos2_libdir = gnulocaledir; + if (!_nlos2_libdir) + { + if (root) + { + size_t sl = strlen (root); + _nlos2_libdir = (char *) malloc (sl + strlen (LIBDIR) + 1); + memcpy (_nlos2_libdir, root, sl); + memcpy (_nlos2_libdir + sl, LIBDIR, strlen (LIBDIR) + 1); + } + else + _nlos2_libdir = LIBDIR; + } + + _nlos2_localealiaspath = gnulocaledir; + if (!_nlos2_localealiaspath) + { + if (root) + { + size_t sl = strlen (root); + _nlos2_localealiaspath = (char *) malloc (sl + strlen (LOCALE_ALIAS_PATH) + 1); + memcpy (_nlos2_localealiaspath, root, sl); + memcpy (_nlos2_localealiaspath + sl, LOCALE_ALIAS_PATH, strlen (LOCALE_ALIAS_PATH) + 1); + } + else + _nlos2_localealiaspath = LOCALE_ALIAS_PATH; + } + + _nlos2_localedir = gnulocaledir; + if (!_nlos2_localedir) + { + if (root) + { + size_t sl = strlen (root); + _nlos2_localedir = (char *) malloc (sl + strlen (LOCALEDIR) + 1); + memcpy (_nlos2_localedir, root, sl); + memcpy (_nlos2_localedir + sl, LOCALEDIR, strlen (LOCALEDIR) + 1); + } + else + _nlos2_localedir = LOCALEDIR; + } + + if (strlen (_nlos2_localedir) <= MAXPATHLEN) + strcpy (libintl_nl_default_dirname, _nlos2_localedir); +} diff --git a/intl/os2compat.h b/intl/os2compat.h new file mode 100644 index 0000000..4f74e8c --- /dev/null +++ b/intl/os2compat.h @@ -0,0 +1,46 @@ +/* OS/2 compatibility defines. + This file is intended to be included from config.h + Copyright (C) 2001-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* When included from os2compat.h we need all the original definitions */ +#ifndef OS2_AWARE + +#undef LIBDIR +#define LIBDIR _nlos2_libdir +extern char *_nlos2_libdir; + +#undef LOCALEDIR +#define LOCALEDIR _nlos2_localedir +extern char *_nlos2_localedir; + +#undef LOCALE_ALIAS_PATH +#define LOCALE_ALIAS_PATH _nlos2_localealiaspath +extern char *_nlos2_localealiaspath; + +#endif + +#undef HAVE_STRCASECMP +#define HAVE_STRCASECMP 1 +#define strcasecmp stricmp +#define strncasecmp strnicmp + +/* We have our own getenv() which works even if library is compiled as DLL */ +#define getenv _nl_getenv + +/* Older versions of gettext used -1 as the value of LC_MESSAGES */ +#define LC_MESSAGES_COMPAT (-1) diff --git a/intl/osdep.c b/intl/osdep.c new file mode 100644 index 0000000..b372598 --- /dev/null +++ b/intl/osdep.c @@ -0,0 +1,24 @@ +/* OS dependent parts of libintl. + Copyright (C) 2001-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#if defined __EMX__ +# include "os2compat.c" +#else +/* Avoid AIX compiler warning. */ +typedef int dummy; +#endif diff --git a/intl/plural-exp.c b/intl/plural-exp.c new file mode 100644 index 0000000..8c04e64 --- /dev/null +++ b/intl/plural-exp.c @@ -0,0 +1,154 @@ +/* Expression parsing for plural form selection. + Copyright (C) 2000-2001, 2003 Free Software Foundation, Inc. + Written by Ulrich Drepper , 2000. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#include "plural-exp.h" + +#if (defined __GNUC__ && !defined __APPLE_CC__) \ + || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) + +/* These structs are the constant expression for the germanic plural + form determination. It represents the expression "n != 1". */ +static const struct expression plvar = +{ + .nargs = 0, + .operation = var, +}; +static const struct expression plone = +{ + .nargs = 0, + .operation = num, + .val = + { + .num = 1 + } +}; +struct expression GERMANIC_PLURAL = +{ + .nargs = 2, + .operation = not_equal, + .val = + { + .args = + { + [0] = (struct expression *) &plvar, + [1] = (struct expression *) &plone + } + } +}; + +# define INIT_GERMANIC_PLURAL() + +#else + +/* For compilers without support for ISO C 99 struct/union initializers: + Initialization at run-time. */ + +static struct expression plvar; +static struct expression plone; +struct expression GERMANIC_PLURAL; + +static void +init_germanic_plural () +{ + if (plone.val.num == 0) + { + plvar.nargs = 0; + plvar.operation = var; + + plone.nargs = 0; + plone.operation = num; + plone.val.num = 1; + + GERMANIC_PLURAL.nargs = 2; + GERMANIC_PLURAL.operation = not_equal; + GERMANIC_PLURAL.val.args[0] = &plvar; + GERMANIC_PLURAL.val.args[1] = &plone; + } +} + +# define INIT_GERMANIC_PLURAL() init_germanic_plural () + +#endif + +void +internal_function +EXTRACT_PLURAL_EXPRESSION (const char *nullentry, struct expression **pluralp, + unsigned long int *npluralsp) +{ + if (nullentry != NULL) + { + const char *plural; + const char *nplurals; + + plural = strstr (nullentry, "plural="); + nplurals = strstr (nullentry, "nplurals="); + if (plural == NULL || nplurals == NULL) + goto no_plural; + else + { + char *endp; + unsigned long int n; + struct parse_args args; + + /* First get the number. */ + nplurals += 9; + while (*nplurals != '\0' && isspace ((unsigned char) *nplurals)) + ++nplurals; + if (!(*nplurals >= '0' && *nplurals <= '9')) + goto no_plural; +#if defined HAVE_STRTOUL || defined _LIBC + n = strtoul (nplurals, &endp, 10); +#else + for (endp = nplurals, n = 0; *endp >= '0' && *endp <= '9'; endp++) + n = n * 10 + (*endp - '0'); +#endif + if (nplurals == endp) + goto no_plural; + *npluralsp = n; + + /* Due to the restrictions bison imposes onto the interface of the + scanner function we have to put the input string and the result + passed up from the parser into the same structure which address + is passed down to the parser. */ + plural += 7; + args.cp = plural; + if (PLURAL_PARSE (&args) != 0) + goto no_plural; + *pluralp = args.res; + } + } + else + { + /* By default we are using the Germanic form: singular form only + for `one', the plural form otherwise. Yes, this is also what + English is using since English is a Germanic language. */ + no_plural: + INIT_GERMANIC_PLURAL (); + *pluralp = &GERMANIC_PLURAL; + *npluralsp = 2; + } +} diff --git a/intl/plural-exp.h b/intl/plural-exp.h new file mode 100644 index 0000000..49e2c5b --- /dev/null +++ b/intl/plural-exp.h @@ -0,0 +1,118 @@ +/* Expression parsing and evaluation for plural form selection. + Copyright (C) 2000-2003 Free Software Foundation, Inc. + Written by Ulrich Drepper , 2000. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _PLURAL_EXP_H +#define _PLURAL_EXP_H + +#ifndef internal_function +# define internal_function +#endif + +#ifndef attribute_hidden +# define attribute_hidden +#endif + + +/* This is the representation of the expressions to determine the + plural form. */ +struct expression +{ + int nargs; /* Number of arguments. */ + enum operator + { + /* Without arguments: */ + var, /* The variable "n". */ + num, /* Decimal number. */ + /* Unary operators: */ + lnot, /* Logical NOT. */ + /* Binary operators: */ + mult, /* Multiplication. */ + divide, /* Division. */ + module, /* Modulo operation. */ + plus, /* Addition. */ + minus, /* Subtraction. */ + less_than, /* Comparison. */ + greater_than, /* Comparison. */ + less_or_equal, /* Comparison. */ + greater_or_equal, /* Comparison. */ + equal, /* Comparison for equality. */ + not_equal, /* Comparison for inequality. */ + land, /* Logical AND. */ + lor, /* Logical OR. */ + /* Ternary operators: */ + qmop /* Question mark operator. */ + } operation; + union + { + unsigned long int num; /* Number value for `num'. */ + struct expression *args[3]; /* Up to three arguments. */ + } val; +}; + +/* This is the data structure to pass information to the parser and get + the result in a thread-safe way. */ +struct parse_args +{ + const char *cp; + struct expression *res; +}; + + +/* Names for the libintl functions are a problem. This source code is used + 1. in the GNU C Library library, + 2. in the GNU libintl library, + 3. in the GNU gettext tools. + The function names in each situation must be different, to allow for + binary incompatible changes in 'struct expression'. Furthermore, + 1. in the GNU C Library library, the names have a __ prefix, + 2.+3. in the GNU libintl library and in the GNU gettext tools, the names + must follow ANSI C and not start with __. + So we have to distinguish the three cases. */ +#ifdef _LIBC +# define FREE_EXPRESSION __gettext_free_exp +# define PLURAL_PARSE __gettextparse +# define GERMANIC_PLURAL __gettext_germanic_plural +# define EXTRACT_PLURAL_EXPRESSION __gettext_extract_plural +#elif defined (IN_LIBINTL) +# define FREE_EXPRESSION libintl_gettext_free_exp +# define PLURAL_PARSE libintl_gettextparse +# define GERMANIC_PLURAL libintl_gettext_germanic_plural +# define EXTRACT_PLURAL_EXPRESSION libintl_gettext_extract_plural +#else +# define FREE_EXPRESSION free_plural_expression +# define PLURAL_PARSE parse_plural_expression +# define GERMANIC_PLURAL germanic_plural +# define EXTRACT_PLURAL_EXPRESSION extract_plural_expression +#endif + +extern void FREE_EXPRESSION (struct expression *exp) + internal_function; +extern int PLURAL_PARSE (void *arg); +extern struct expression GERMANIC_PLURAL attribute_hidden; +extern void EXTRACT_PLURAL_EXPRESSION (const char *nullentry, + struct expression **pluralp, + unsigned long int *npluralsp) + internal_function; + +#if !defined (_LIBC) && !defined (IN_LIBINTL) +extern unsigned long int plural_eval (struct expression *pexp, + unsigned long int n); +#endif + +#endif /* _PLURAL_EXP_H */ diff --git a/intl/plural.c b/intl/plural.c new file mode 100644 index 0000000..6900df4 --- /dev/null +++ b/intl/plural.c @@ -0,0 +1,1977 @@ + +/* A Bison parser, made by GNU Bison 2.4.1. */ + +/* Skeleton implementation for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + 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, either version 3 of the License, or + (at your option) any later version. + + 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, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "2.4.1" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 1 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + +/* Substitute the variable and function names. */ +#define yyparse __gettextparse +#define yylex __gettextlex +#define yyerror __gettexterror +#define yylval __gettextlval +#define yychar __gettextchar +#define yydebug __gettextdebug +#define yynerrs __gettextnerrs + + +/* Copy the first part of user declarations. */ + +/* Line 189 of yacc.c */ +#line 1 "/work/compile/navit/src/intl/plural.y" + +/* Expression parsing for plural form selection. + Copyright (C) 2000-2001, 2003 Free Software Foundation, Inc. + Written by Ulrich Drepper , 2000. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* The bison generated parser uses alloca. AIX 3 forces us to put this + declaration at the beginning of the file. The declaration in bison's + skeleton file comes too late. This must come before + because may include arbitrary system headers. */ +#if defined _AIX && !defined __GNUC__ + #pragma alloca +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include "plural-exp.h" + +/* The main function generated by the parser is called __gettextparse, + but we want it to be called PLURAL_PARSE. */ +#ifndef _LIBC +# define __gettextparse PLURAL_PARSE +#endif + +#define YYLEX_PARAM &((struct parse_args *) arg)->cp +#define YYPARSE_PARAM arg + + +/* Line 189 of yacc.c */ +#line 128 "/work/compile/navit/src/intl/plural.c" + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + EQUOP2 = 258, + CMPOP2 = 259, + ADDOP2 = 260, + MULOP2 = 261, + NUMBER = 262 + }; +#endif +/* Tokens. */ +#define EQUOP2 258 +#define CMPOP2 259 +#define ADDOP2 260 +#define MULOP2 261 +#define NUMBER 262 + + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +{ + +/* Line 214 of yacc.c */ +#line 49 "/work/compile/navit/src/intl/plural.y" + + unsigned long int num; + enum operator op; + struct expression *exp; + + + +/* Line 214 of yacc.c */ +#line 186 "/work/compile/navit/src/intl/plural.c" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + + +/* Copy the second part of user declarations. */ + +/* Line 264 of yacc.c */ +#line 55 "/work/compile/navit/src/intl/plural.y" + +/* Prototypes for local functions. */ +static int yylex (YYSTYPE *lval, const char **pexp); +static void yyerror (const char *str); + +/* Allocation of expressions. */ + +static struct expression * +new_exp (int nargs, enum operator op, struct expression * const *args) +{ + int i; + struct expression *newp; + + /* If any of the argument could not be malloc'ed, just return NULL. */ + for (i = nargs - 1; i >= 0; i--) + if (args[i] == NULL) + goto fail; + + /* Allocate a new expression. */ + newp = (struct expression *) malloc (sizeof (*newp)); + if (newp != NULL) + { + newp->nargs = nargs; + newp->operation = op; + for (i = nargs - 1; i >= 0; i--) + newp->val.args[i] = args[i]; + return newp; + } + + fail: + for (i = nargs - 1; i >= 0; i--) + FREE_EXPRESSION (args[i]); + + return NULL; +} + +static inline struct expression * +new_exp_0 (enum operator op) +{ + return new_exp (0, op, NULL); +} + +static inline struct expression * +new_exp_1 (enum operator op, struct expression *right) +{ + struct expression *args[1]; + + args[0] = right; + return new_exp (1, op, args); +} + +static struct expression * +new_exp_2 (enum operator op, struct expression *left, struct expression *right) +{ + struct expression *args[2]; + + args[0] = left; + args[1] = right; + return new_exp (2, op, args); +} + +static inline struct expression * +new_exp_3 (enum operator op, struct expression *bexp, + struct expression *tbranch, struct expression *fbranch) +{ + struct expression *args[3]; + + args[0] = bexp; + args[1] = tbranch; + args[2] = fbranch; + return new_exp (3, op, args); +} + + + +/* Line 264 of yacc.c */ +#line 274 "/work/compile/navit/src/intl/plural.c" + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#elif (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +typedef signed char yytype_int8; +#else +typedef short int yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(e) ((void) (e)) +#else +# define YYUSE(e) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(n) (n) +#else +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static int +YYID (int yyi) +#else +static int +YYID (yyi) + int yyi; +#endif +{ + return yyi; +} +#endif + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined _STDLIB_H \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss_alloc; + YYSTYPE yyvs_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 9 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 54 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 16 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 3 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 13 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 27 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 262 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 10, 2, 2, 2, 2, 5, 2, + 14, 15, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 12, 2, + 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 6, 7, + 8, 9, 11 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint8 yyprhs[] = +{ + 0, 0, 3, 5, 11, 15, 19, 23, 27, 31, + 35, 38, 40, 42 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int8 yyrhs[] = +{ + 17, 0, -1, 18, -1, 18, 3, 18, 12, 18, + -1, 18, 4, 18, -1, 18, 5, 18, -1, 18, + 6, 18, -1, 18, 7, 18, -1, 18, 8, 18, + -1, 18, 9, 18, -1, 10, 18, -1, 13, -1, + 11, -1, 14, 18, 15, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint8 yyrline[] = +{ + 0, 150, 150, 158, 162, 166, 170, 174, 178, 182, + 186, 190, 194, 199 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "'?'", "'|'", "'&'", "EQUOP2", "CMPOP2", + "ADDOP2", "MULOP2", "'!'", "NUMBER", "':'", "'n'", "'('", "')'", + "$accept", "start", "exp", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const yytype_uint16 yytoknum[] = +{ + 0, 256, 257, 63, 124, 38, 258, 259, 260, 261, + 33, 262, 58, 110, 40, 41 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint8 yyr1[] = +{ + 0, 16, 17, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 1, 5, 3, 3, 3, 3, 3, 3, + 2, 1, 1, 3 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const yytype_uint8 yydefact[] = +{ + 0, 0, 12, 11, 0, 0, 2, 10, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, + 5, 6, 7, 8, 9, 0, 3 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int8 yydefgoto[] = +{ + -1, 5, 6 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -10 +static const yytype_int8 yypact[] = +{ + -9, -9, -10, -10, -9, 8, 36, -10, 13, -10, + -9, -9, -9, -9, -9, -9, -9, -10, 26, 41, + 45, 18, -2, 14, -10, -9, 36 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int8 yypgoto[] = +{ + -10, -10, -1 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -1 +static const yytype_uint8 yytable[] = +{ + 7, 1, 2, 8, 3, 4, 15, 16, 9, 18, + 19, 20, 21, 22, 23, 24, 10, 11, 12, 13, + 14, 15, 16, 16, 26, 14, 15, 16, 17, 10, + 11, 12, 13, 14, 15, 16, 0, 0, 25, 10, + 11, 12, 13, 14, 15, 16, 12, 13, 14, 15, + 16, 13, 14, 15, 16 +}; + +static const yytype_int8 yycheck[] = +{ + 1, 10, 11, 4, 13, 14, 8, 9, 0, 10, + 11, 12, 13, 14, 15, 16, 3, 4, 5, 6, + 7, 8, 9, 9, 25, 7, 8, 9, 15, 3, + 4, 5, 6, 7, 8, 9, -1, -1, 12, 3, + 4, 5, 6, 7, 8, 9, 5, 6, 7, 8, + 9, 6, 7, 8, 9 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint8 yystos[] = +{ + 0, 10, 11, 13, 14, 17, 18, 18, 18, 0, + 3, 4, 5, 6, 7, 8, 9, 15, 18, 18, + 18, 18, 18, 18, 18, 12, 18 +}; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK (1); \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (&yylval, YYLEX_PARAM) +#else +# define YYLEX yylex (&yylval) +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (YYID (0)) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (!yyvaluep) + return; +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); +# endif + switch (yytype) + { + default: + break; + } +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) +#else +static void +yy_stack_print (yybottom, yytop) + yytype_int16 *yybottom; + yytype_int16 *yytop; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_reduce_print (YYSTYPE *yyvsp, int yyrule) +#else +static void +yy_reduce_print (yyvsp, yyrule) + YYSTYPE *yyvsp; + int yyrule; +#endif +{ + int yynrhs = yyr2[yyrule]; + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + ); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, Rule); \ +} while (YYID (0)) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static YYSIZE_T +yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) + const char *yystr; +#endif +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static char * +yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +#endif +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into YYRESULT an error message about the unexpected token + YYCHAR while in state YYSTATE. Return the number of bytes copied, + including the terminating null byte. If YYRESULT is null, do not + copy anything; just return the number of bytes that would be + copied. As a special case, return 0 if an ordinary "syntax error" + message will do. Return YYSIZE_MAXIMUM if overflow occurs during + size calculation. */ +static YYSIZE_T +yysyntax_error (char *yyresult, int yystate, int yychar) +{ + int yyn = yypact[yystate]; + + if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) + return 0; + else + { + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; + +# if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +# endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + + if (yysize_overflow) + return YYSIZE_MAXIMUM; + + if (yyresult) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yyresult; + int yyi = 0; + while ((*yyp = *yyf) != '\0') + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + } + return yysize; + } +} +#endif /* YYERROR_VERBOSE */ + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + YYUSE (yyvaluep); + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} + +/* Prevent warnings from -Wmissing-prototypes. */ +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int yyparse (void *YYPARSE_PARAM); +#else +int yyparse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + + + +/*-------------------------. +| yyparse or yypush_parse. | +`-------------------------*/ + +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + + /* Number of syntax errors so far. */ + int yynerrs; + + int yystate; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + + /* The stacks and their tools: + `yyss': related to states. + `yyvs': related to semantic values. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs; + YYSTYPE *yyvsp; + + YYSIZE_T yystacksize; + + int yyn; + int yyresult; + /* Lookahead token as an internal (translated) token number. */ + int yytoken; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + yytoken = 0; + yyss = yyssa; + yyvs = yyvsa; + yystacksize = YYINITDEPTH; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token. */ + yychar = YYEMPTY; + + yystate = yyn; + *++yyvsp = yylval; + + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: + +/* Line 1455 of yacc.c */ +#line 151 "/work/compile/navit/src/intl/plural.y" + { + if ((yyvsp[(1) - (1)].exp) == NULL) + YYABORT; + ((struct parse_args *) arg)->res = (yyvsp[(1) - (1)].exp); + } + break; + + case 3: + +/* Line 1455 of yacc.c */ +#line 159 "/work/compile/navit/src/intl/plural.y" + { + (yyval.exp) = new_exp_3 (qmop, (yyvsp[(1) - (5)].exp), (yyvsp[(3) - (5)].exp), (yyvsp[(5) - (5)].exp)); + } + break; + + case 4: + +/* Line 1455 of yacc.c */ +#line 163 "/work/compile/navit/src/intl/plural.y" + { + (yyval.exp) = new_exp_2 (lor, (yyvsp[(1) - (3)].exp), (yyvsp[(3) - (3)].exp)); + } + break; + + case 5: + +/* Line 1455 of yacc.c */ +#line 167 "/work/compile/navit/src/intl/plural.y" + { + (yyval.exp) = new_exp_2 (land, (yyvsp[(1) - (3)].exp), (yyvsp[(3) - (3)].exp)); + } + break; + + case 6: + +/* Line 1455 of yacc.c */ +#line 171 "/work/compile/navit/src/intl/plural.y" + { + (yyval.exp) = new_exp_2 ((yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].exp), (yyvsp[(3) - (3)].exp)); + } + break; + + case 7: + +/* Line 1455 of yacc.c */ +#line 175 "/work/compile/navit/src/intl/plural.y" + { + (yyval.exp) = new_exp_2 ((yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].exp), (yyvsp[(3) - (3)].exp)); + } + break; + + case 8: + +/* Line 1455 of yacc.c */ +#line 179 "/work/compile/navit/src/intl/plural.y" + { + (yyval.exp) = new_exp_2 ((yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].exp), (yyvsp[(3) - (3)].exp)); + } + break; + + case 9: + +/* Line 1455 of yacc.c */ +#line 183 "/work/compile/navit/src/intl/plural.y" + { + (yyval.exp) = new_exp_2 ((yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].exp), (yyvsp[(3) - (3)].exp)); + } + break; + + case 10: + +/* Line 1455 of yacc.c */ +#line 187 "/work/compile/navit/src/intl/plural.y" + { + (yyval.exp) = new_exp_1 (lnot, (yyvsp[(2) - (2)].exp)); + } + break; + + case 11: + +/* Line 1455 of yacc.c */ +#line 191 "/work/compile/navit/src/intl/plural.y" + { + (yyval.exp) = new_exp_0 (var); + } + break; + + case 12: + +/* Line 1455 of yacc.c */ +#line 195 "/work/compile/navit/src/intl/plural.y" + { + if (((yyval.exp) = new_exp_0 (num)) != NULL) + (yyval.exp)->val.num = (yyvsp[(1) - (1)].num); + } + break; + + case 13: + +/* Line 1455 of yacc.c */ +#line 200 "/work/compile/navit/src/intl/plural.y" + { + (yyval.exp) = (yyvsp[(2) - (3)].exp); + } + break; + + + +/* Line 1455 of yacc.c */ +#line 1588 "/work/compile/navit/src/intl/plural.c" + default: break; + } + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (YY_("syntax error")); +#else + { + YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); + if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) + { + YYSIZE_T yyalloc = 2 * yysize; + if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) + yyalloc = YYSTACK_ALLOC_MAXIMUM; + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yyalloc); + if (yymsg) + yymsg_alloc = yyalloc; + else + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + } + } + + if (0 < yysize && yysize <= yymsg_alloc) + { + (void) yysyntax_error (yymsg, yystate, yychar); + yyerror (yymsg); + } + else + { + yyerror (YY_("syntax error")); + if (yysize != 0) + goto yyexhaustedlab; + } + } +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + yystos[yystate], yyvsp); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + *++yyvsp = yylval; + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#if !defined(yyoverflow) || YYERROR_VERBOSE +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + /* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + /* Make sure YYID is used. */ + return YYID (yyresult); +} + + + +/* Line 1675 of yacc.c */ +#line 205 "/work/compile/navit/src/intl/plural.y" + + +void +internal_function +FREE_EXPRESSION (struct expression *exp) +{ + if (exp == NULL) + return; + + /* Handle the recursive case. */ + switch (exp->nargs) + { + case 3: + FREE_EXPRESSION (exp->val.args[2]); + /* FALLTHROUGH */ + case 2: + FREE_EXPRESSION (exp->val.args[1]); + /* FALLTHROUGH */ + case 1: + FREE_EXPRESSION (exp->val.args[0]); + /* FALLTHROUGH */ + default: + break; + } + + free (exp); +} + + +static int +yylex (YYSTYPE *lval, const char **pexp) +{ + const char *exp = *pexp; + int result; + + while (1) + { + if (exp[0] == '\0') + { + *pexp = exp; + return YYEOF; + } + + if (exp[0] != ' ' && exp[0] != '\t') + break; + + ++exp; + } + + result = *exp++; + switch (result) + { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + { + unsigned long int n = result - '0'; + while (exp[0] >= '0' && exp[0] <= '9') + { + n *= 10; + n += exp[0] - '0'; + ++exp; + } + lval->num = n; + result = NUMBER; + } + break; + + case '=': + if (exp[0] == '=') + { + ++exp; + lval->op = equal; + result = EQUOP2; + } + else + result = YYERRCODE; + break; + + case '!': + if (exp[0] == '=') + { + ++exp; + lval->op = not_equal; + result = EQUOP2; + } + break; + + case '&': + case '|': + if (exp[0] == result) + ++exp; + else + result = YYERRCODE; + break; + + case '<': + if (exp[0] == '=') + { + ++exp; + lval->op = less_or_equal; + } + else + lval->op = less_than; + result = CMPOP2; + break; + + case '>': + if (exp[0] == '=') + { + ++exp; + lval->op = greater_or_equal; + } + else + lval->op = greater_than; + result = CMPOP2; + break; + + case '*': + lval->op = mult; + result = MULOP2; + break; + + case '/': + lval->op = divide; + result = MULOP2; + break; + + case '%': + lval->op = module; + result = MULOP2; + break; + + case '+': + lval->op = plus; + result = ADDOP2; + break; + + case '-': + lval->op = minus; + result = ADDOP2; + break; + + case 'n': + case '?': + case ':': + case '(': + case ')': + /* Nothing, just return the character. */ + break; + + case ';': + case '\n': + case '\0': + /* Be safe and let the user call this function again. */ + --exp; + result = YYEOF; + break; + + default: + result = YYERRCODE; +#if YYDEBUG != 0 + --exp; +#endif + break; + } + + *pexp = exp; + + return result; +} + + +static void +yyerror (const char *str) +{ + /* Do nothing. We don't print error messages here. */ +} + diff --git a/intl/plural.y b/intl/plural.y new file mode 100644 index 0000000..4d33bd7 --- /dev/null +++ b/intl/plural.y @@ -0,0 +1,381 @@ +%{ +/* Expression parsing for plural form selection. + Copyright (C) 2000-2001, 2003 Free Software Foundation, Inc. + Written by Ulrich Drepper , 2000. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* The bison generated parser uses alloca. AIX 3 forces us to put this + declaration at the beginning of the file. The declaration in bison's + skeleton file comes too late. This must come before + because may include arbitrary system headers. */ +#if defined _AIX && !defined __GNUC__ + #pragma alloca +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include "plural-exp.h" + +/* The main function generated by the parser is called __gettextparse, + but we want it to be called PLURAL_PARSE. */ +#ifndef _LIBC +# define __gettextparse PLURAL_PARSE +#endif + +#define YYLEX_PARAM &((struct parse_args *) arg)->cp +#define YYPARSE_PARAM arg +%} +%pure_parser +%expect 7 + +%union { + unsigned long int num; + enum operator op; + struct expression *exp; +} + +%{ +/* Prototypes for local functions. */ +static int yylex (YYSTYPE *lval, const char **pexp); +static void yyerror (const char *str); + +/* Allocation of expressions. */ + +static struct expression * +new_exp (int nargs, enum operator op, struct expression * const *args) +{ + int i; + struct expression *newp; + + /* If any of the argument could not be malloc'ed, just return NULL. */ + for (i = nargs - 1; i >= 0; i--) + if (args[i] == NULL) + goto fail; + + /* Allocate a new expression. */ + newp = (struct expression *) malloc (sizeof (*newp)); + if (newp != NULL) + { + newp->nargs = nargs; + newp->operation = op; + for (i = nargs - 1; i >= 0; i--) + newp->val.args[i] = args[i]; + return newp; + } + + fail: + for (i = nargs - 1; i >= 0; i--) + FREE_EXPRESSION (args[i]); + + return NULL; +} + +static inline struct expression * +new_exp_0 (enum operator op) +{ + return new_exp (0, op, NULL); +} + +static inline struct expression * +new_exp_1 (enum operator op, struct expression *right) +{ + struct expression *args[1]; + + args[0] = right; + return new_exp (1, op, args); +} + +static struct expression * +new_exp_2 (enum operator op, struct expression *left, struct expression *right) +{ + struct expression *args[2]; + + args[0] = left; + args[1] = right; + return new_exp (2, op, args); +} + +static inline struct expression * +new_exp_3 (enum operator op, struct expression *bexp, + struct expression *tbranch, struct expression *fbranch) +{ + struct expression *args[3]; + + args[0] = bexp; + args[1] = tbranch; + args[2] = fbranch; + return new_exp (3, op, args); +} + +%} + +/* This declares that all operators have the same associativity and the + precedence order as in C. See [Harbison, Steele: C, A Reference Manual]. + There is no unary minus and no bitwise operators. + Operators with the same syntactic behaviour have been merged into a single + token, to save space in the array generated by bison. */ +%right '?' /* ? */ +%left '|' /* || */ +%left '&' /* && */ +%left EQUOP2 /* == != */ +%left CMPOP2 /* < > <= >= */ +%left ADDOP2 /* + - */ +%left MULOP2 /* * / % */ +%right '!' /* ! */ + +%token EQUOP2 CMPOP2 ADDOP2 MULOP2 +%token NUMBER +%type exp + +%% + +start: exp + { + if ($1 == NULL) + YYABORT; + ((struct parse_args *) arg)->res = $1; + } + ; + +exp: exp '?' exp ':' exp + { + $$ = new_exp_3 (qmop, $1, $3, $5); + } + | exp '|' exp + { + $$ = new_exp_2 (lor, $1, $3); + } + | exp '&' exp + { + $$ = new_exp_2 (land, $1, $3); + } + | exp EQUOP2 exp + { + $$ = new_exp_2 ($2, $1, $3); + } + | exp CMPOP2 exp + { + $$ = new_exp_2 ($2, $1, $3); + } + | exp ADDOP2 exp + { + $$ = new_exp_2 ($2, $1, $3); + } + | exp MULOP2 exp + { + $$ = new_exp_2 ($2, $1, $3); + } + | '!' exp + { + $$ = new_exp_1 (lnot, $2); + } + | 'n' + { + $$ = new_exp_0 (var); + } + | NUMBER + { + if (($$ = new_exp_0 (num)) != NULL) + $$->val.num = $1; + } + | '(' exp ')' + { + $$ = $2; + } + ; + +%% + +void +internal_function +FREE_EXPRESSION (struct expression *exp) +{ + if (exp == NULL) + return; + + /* Handle the recursive case. */ + switch (exp->nargs) + { + case 3: + FREE_EXPRESSION (exp->val.args[2]); + /* FALLTHROUGH */ + case 2: + FREE_EXPRESSION (exp->val.args[1]); + /* FALLTHROUGH */ + case 1: + FREE_EXPRESSION (exp->val.args[0]); + /* FALLTHROUGH */ + default: + break; + } + + free (exp); +} + + +static int +yylex (YYSTYPE *lval, const char **pexp) +{ + const char *exp = *pexp; + int result; + + while (1) + { + if (exp[0] == '\0') + { + *pexp = exp; + return YYEOF; + } + + if (exp[0] != ' ' && exp[0] != '\t') + break; + + ++exp; + } + + result = *exp++; + switch (result) + { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + { + unsigned long int n = result - '0'; + while (exp[0] >= '0' && exp[0] <= '9') + { + n *= 10; + n += exp[0] - '0'; + ++exp; + } + lval->num = n; + result = NUMBER; + } + break; + + case '=': + if (exp[0] == '=') + { + ++exp; + lval->op = equal; + result = EQUOP2; + } + else + result = YYERRCODE; + break; + + case '!': + if (exp[0] == '=') + { + ++exp; + lval->op = not_equal; + result = EQUOP2; + } + break; + + case '&': + case '|': + if (exp[0] == result) + ++exp; + else + result = YYERRCODE; + break; + + case '<': + if (exp[0] == '=') + { + ++exp; + lval->op = less_or_equal; + } + else + lval->op = less_than; + result = CMPOP2; + break; + + case '>': + if (exp[0] == '=') + { + ++exp; + lval->op = greater_or_equal; + } + else + lval->op = greater_than; + result = CMPOP2; + break; + + case '*': + lval->op = mult; + result = MULOP2; + break; + + case '/': + lval->op = divide; + result = MULOP2; + break; + + case '%': + lval->op = module; + result = MULOP2; + break; + + case '+': + lval->op = plus; + result = ADDOP2; + break; + + case '-': + lval->op = minus; + result = ADDOP2; + break; + + case 'n': + case '?': + case ':': + case '(': + case ')': + /* Nothing, just return the character. */ + break; + + case ';': + case '\n': + case '\0': + /* Be safe and let the user call this function again. */ + --exp; + result = YYEOF; + break; + + default: + result = YYERRCODE; +#if YYDEBUG != 0 + --exp; +#endif + break; + } + + *pexp = exp; + + return result; +} + + +static void +yyerror (const char *str) +{ + /* Do nothing. We don't print error messages here. */ +} diff --git a/intl/printf-args.c b/intl/printf-args.c new file mode 100644 index 0000000..f6f3219 --- /dev/null +++ b/intl/printf-args.c @@ -0,0 +1,119 @@ +/* Decomposed printf argument list. + Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include "printf-args.h" + +#ifdef STATIC +STATIC +#endif +int +printf_fetchargs (va_list args, arguments *a) +{ + size_t i; + argument *ap; + + for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++) + switch (ap->type) + { + case TYPE_SCHAR: + ap->a.a_schar = va_arg (args, /*signed char*/ int); + break; + case TYPE_UCHAR: + ap->a.a_uchar = va_arg (args, /*unsigned char*/ int); + break; + case TYPE_SHORT: + ap->a.a_short = va_arg (args, /*short*/ int); + break; + case TYPE_USHORT: + ap->a.a_ushort = va_arg (args, /*unsigned short*/ int); + break; + case TYPE_INT: + ap->a.a_int = va_arg (args, int); + break; + case TYPE_UINT: + ap->a.a_uint = va_arg (args, unsigned int); + break; + case TYPE_LONGINT: + ap->a.a_longint = va_arg (args, long int); + break; + case TYPE_ULONGINT: + ap->a.a_ulongint = va_arg (args, unsigned long int); + break; +#ifdef HAVE_LONG_LONG + case TYPE_LONGLONGINT: + ap->a.a_longlongint = va_arg (args, long long int); + break; + case TYPE_ULONGLONGINT: + ap->a.a_ulonglongint = va_arg (args, unsigned long long int); + break; +#endif + case TYPE_DOUBLE: + ap->a.a_double = va_arg (args, double); + break; +#ifdef HAVE_LONG_DOUBLE + case TYPE_LONGDOUBLE: + ap->a.a_longdouble = va_arg (args, long double); + break; +#endif + case TYPE_CHAR: + ap->a.a_char = va_arg (args, int); + break; +#ifdef HAVE_WINT_T + case TYPE_WIDE_CHAR: + ap->a.a_wide_char = va_arg (args, wint_t); + break; +#endif + case TYPE_STRING: + ap->a.a_string = va_arg (args, const char *); + break; +#ifdef HAVE_WCHAR_T + case TYPE_WIDE_STRING: + ap->a.a_wide_string = va_arg (args, const wchar_t *); + break; +#endif + case TYPE_POINTER: + ap->a.a_pointer = va_arg (args, void *); + break; + case TYPE_COUNT_SCHAR_POINTER: + ap->a.a_count_schar_pointer = va_arg (args, signed char *); + break; + case TYPE_COUNT_SHORT_POINTER: + ap->a.a_count_short_pointer = va_arg (args, short *); + break; + case TYPE_COUNT_INT_POINTER: + ap->a.a_count_int_pointer = va_arg (args, int *); + break; + case TYPE_COUNT_LONGINT_POINTER: + ap->a.a_count_longint_pointer = va_arg (args, long int *); + break; +#ifdef HAVE_LONG_LONG + case TYPE_COUNT_LONGLONGINT_POINTER: + ap->a.a_count_longlongint_pointer = va_arg (args, long long int *); + break; +#endif + default: + /* Unknown type. */ + return -1; + } + return 0; +} diff --git a/intl/printf-args.h b/intl/printf-args.h new file mode 100644 index 0000000..f11e64c --- /dev/null +++ b/intl/printf-args.h @@ -0,0 +1,137 @@ +/* Decomposed printf argument list. + Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _PRINTF_ARGS_H +#define _PRINTF_ARGS_H + +/* Get size_t. */ +#include + +/* Get wchar_t. */ +#ifdef HAVE_WCHAR_T +# include +#endif + +/* Get wint_t. */ +#ifdef HAVE_WINT_T +# include +#endif + +/* Get va_list. */ +#include + + +/* Argument types */ +typedef enum +{ + TYPE_NONE, + TYPE_SCHAR, + TYPE_UCHAR, + TYPE_SHORT, + TYPE_USHORT, + TYPE_INT, + TYPE_UINT, + TYPE_LONGINT, + TYPE_ULONGINT, +#ifdef HAVE_LONG_LONG + TYPE_LONGLONGINT, + TYPE_ULONGLONGINT, +#endif + TYPE_DOUBLE, +#ifdef HAVE_LONG_DOUBLE + TYPE_LONGDOUBLE, +#endif + TYPE_CHAR, +#ifdef HAVE_WINT_T + TYPE_WIDE_CHAR, +#endif + TYPE_STRING, +#ifdef HAVE_WCHAR_T + TYPE_WIDE_STRING, +#endif + TYPE_POINTER, + TYPE_COUNT_SCHAR_POINTER, + TYPE_COUNT_SHORT_POINTER, + TYPE_COUNT_INT_POINTER, + TYPE_COUNT_LONGINT_POINTER +#ifdef HAVE_LONG_LONG +, TYPE_COUNT_LONGLONGINT_POINTER +#endif +} arg_type; + +/* Polymorphic argument */ +typedef struct +{ + arg_type type; + union + { + signed char a_schar; + unsigned char a_uchar; + short a_short; + unsigned short a_ushort; + int a_int; + unsigned int a_uint; + long int a_longint; + unsigned long int a_ulongint; +#ifdef HAVE_LONG_LONG + long long int a_longlongint; + unsigned long long int a_ulonglongint; +#endif + float a_float; + double a_double; +#ifdef HAVE_LONG_DOUBLE + long double a_longdouble; +#endif + int a_char; +#ifdef HAVE_WINT_T + wint_t a_wide_char; +#endif + const char* a_string; +#ifdef HAVE_WCHAR_T + const wchar_t* a_wide_string; +#endif + void* a_pointer; + signed char * a_count_schar_pointer; + short * a_count_short_pointer; + int * a_count_int_pointer; + long int * a_count_longint_pointer; +#ifdef HAVE_LONG_LONG + long long int * a_count_longlongint_pointer; +#endif + } + a; +} +argument; + +typedef struct +{ + size_t count; + argument *arg; +} +arguments; + + +/* Fetch the arguments, putting them into a. */ +#ifdef STATIC +STATIC +#else +extern +#endif +int printf_fetchargs (va_list args, arguments *a); + +#endif /* _PRINTF_ARGS_H */ diff --git a/intl/printf-parse.c b/intl/printf-parse.c new file mode 100644 index 0000000..d19f903 --- /dev/null +++ b/intl/printf-parse.c @@ -0,0 +1,537 @@ +/* Formatted output to strings. + Copyright (C) 1999-2000, 2002-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#if WIDE_CHAR_VERSION +# include "wprintf-parse.h" +#else +# include "printf-parse.h" +#endif + +/* Get size_t, NULL. */ +#include + +/* Get intmax_t. */ +#if HAVE_STDINT_H_WITH_UINTMAX +# include +#endif +#if HAVE_INTTYPES_H_WITH_UINTMAX +# include +#endif + +/* malloc(), realloc(), free(). */ +#include + +/* Checked size_t computations. */ +#include "xsize.h" + +#if WIDE_CHAR_VERSION +# define PRINTF_PARSE wprintf_parse +# define CHAR_T wchar_t +# define DIRECTIVE wchar_t_directive +# define DIRECTIVES wchar_t_directives +#else +# define PRINTF_PARSE printf_parse +# define CHAR_T char +# define DIRECTIVE char_directive +# define DIRECTIVES char_directives +#endif + +#ifdef STATIC +STATIC +#endif +int +PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a) +{ + const CHAR_T *cp = format; /* pointer into format */ + size_t arg_posn = 0; /* number of regular arguments consumed */ + size_t d_allocated; /* allocated elements of d->dir */ + size_t a_allocated; /* allocated elements of a->arg */ + size_t max_width_length = 0; + size_t max_precision_length = 0; + + d->count = 0; + d_allocated = 1; + d->dir = malloc (d_allocated * sizeof (DIRECTIVE)); + if (d->dir == NULL) + /* Out of memory. */ + return -1; + + a->count = 0; + a_allocated = 0; + a->arg = NULL; + +#define REGISTER_ARG(_index_,_type_) \ + { \ + size_t n = (_index_); \ + if (n >= a_allocated) \ + { \ + size_t memory_size; \ + argument *memory; \ + \ + a_allocated = xtimes (a_allocated, 2); \ + if (a_allocated <= n) \ + a_allocated = xsum (n, 1); \ + memory_size = xtimes (a_allocated, sizeof (argument)); \ + if (size_overflow_p (memory_size)) \ + /* Overflow, would lead to out of memory. */ \ + goto error; \ + memory = (a->arg \ + ? realloc (a->arg, memory_size) \ + : malloc (memory_size)); \ + if (memory == NULL) \ + /* Out of memory. */ \ + goto error; \ + a->arg = memory; \ + } \ + while (a->count <= n) \ + a->arg[a->count++].type = TYPE_NONE; \ + if (a->arg[n].type == TYPE_NONE) \ + a->arg[n].type = (_type_); \ + else if (a->arg[n].type != (_type_)) \ + /* Ambiguous type for positional argument. */ \ + goto error; \ + } + + while (*cp != '\0') + { + CHAR_T c = *cp++; + if (c == '%') + { + size_t arg_index = ARG_NONE; + DIRECTIVE *dp = &d->dir[d->count];/* pointer to next directive */ + + /* Initialize the next directive. */ + dp->dir_start = cp - 1; + dp->flags = 0; + dp->width_start = NULL; + dp->width_end = NULL; + dp->width_arg_index = ARG_NONE; + dp->precision_start = NULL; + dp->precision_end = NULL; + dp->precision_arg_index = ARG_NONE; + dp->arg_index = ARG_NONE; + + /* Test for positional argument. */ + if (*cp >= '0' && *cp <= '9') + { + const CHAR_T *np; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + ; + if (*np == '$') + { + size_t n = 0; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + n = xsum (xtimes (n, 10), *np - '0'); + if (n == 0) + /* Positional argument 0. */ + goto error; + if (size_overflow_p (n)) + /* n too large, would lead to out of memory later. */ + goto error; + arg_index = n - 1; + cp = np + 1; + } + } + + /* Read the flags. */ + for (;;) + { + if (*cp == '\'') + { + dp->flags |= FLAG_GROUP; + cp++; + } + else if (*cp == '-') + { + dp->flags |= FLAG_LEFT; + cp++; + } + else if (*cp == '+') + { + dp->flags |= FLAG_SHOWSIGN; + cp++; + } + else if (*cp == ' ') + { + dp->flags |= FLAG_SPACE; + cp++; + } + else if (*cp == '#') + { + dp->flags |= FLAG_ALT; + cp++; + } + else if (*cp == '0') + { + dp->flags |= FLAG_ZERO; + cp++; + } + else + break; + } + + /* Parse the field width. */ + if (*cp == '*') + { + dp->width_start = cp; + cp++; + dp->width_end = cp; + if (max_width_length < 1) + max_width_length = 1; + + /* Test for positional argument. */ + if (*cp >= '0' && *cp <= '9') + { + const CHAR_T *np; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + ; + if (*np == '$') + { + size_t n = 0; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + n = xsum (xtimes (n, 10), *np - '0'); + if (n == 0) + /* Positional argument 0. */ + goto error; + if (size_overflow_p (n)) + /* n too large, would lead to out of memory later. */ + goto error; + dp->width_arg_index = n - 1; + cp = np + 1; + } + } + if (dp->width_arg_index == ARG_NONE) + { + dp->width_arg_index = arg_posn++; + if (dp->width_arg_index == ARG_NONE) + /* arg_posn wrapped around. */ + goto error; + } + REGISTER_ARG (dp->width_arg_index, TYPE_INT); + } + else if (*cp >= '0' && *cp <= '9') + { + size_t width_length; + + dp->width_start = cp; + for (; *cp >= '0' && *cp <= '9'; cp++) + ; + dp->width_end = cp; + width_length = dp->width_end - dp->width_start; + if (max_width_length < width_length) + max_width_length = width_length; + } + + /* Parse the precision. */ + if (*cp == '.') + { + cp++; + if (*cp == '*') + { + dp->precision_start = cp - 1; + cp++; + dp->precision_end = cp; + if (max_precision_length < 2) + max_precision_length = 2; + + /* Test for positional argument. */ + if (*cp >= '0' && *cp <= '9') + { + const CHAR_T *np; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + ; + if (*np == '$') + { + size_t n = 0; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + n = xsum (xtimes (n, 10), *np - '0'); + if (n == 0) + /* Positional argument 0. */ + goto error; + if (size_overflow_p (n)) + /* n too large, would lead to out of memory + later. */ + goto error; + dp->precision_arg_index = n - 1; + cp = np + 1; + } + } + if (dp->precision_arg_index == ARG_NONE) + { + dp->precision_arg_index = arg_posn++; + if (dp->precision_arg_index == ARG_NONE) + /* arg_posn wrapped around. */ + goto error; + } + REGISTER_ARG (dp->precision_arg_index, TYPE_INT); + } + else + { + size_t precision_length; + + dp->precision_start = cp - 1; + for (; *cp >= '0' && *cp <= '9'; cp++) + ; + dp->precision_end = cp; + precision_length = dp->precision_end - dp->precision_start; + if (max_precision_length < precision_length) + max_precision_length = precision_length; + } + } + + { + arg_type type; + + /* Parse argument type/size specifiers. */ + { + int flags = 0; + + for (;;) + { + if (*cp == 'h') + { + flags |= (1 << (flags & 1)); + cp++; + } + else if (*cp == 'L') + { + flags |= 4; + cp++; + } + else if (*cp == 'l') + { + flags += 8; + cp++; + } +#ifdef HAVE_INTMAX_T + else if (*cp == 'j') + { + if (sizeof (intmax_t) > sizeof (long)) + { + /* intmax_t = long long */ + flags += 16; + } + else if (sizeof (intmax_t) > sizeof (int)) + { + /* intmax_t = long */ + flags += 8; + } + cp++; + } +#endif + else if (*cp == 'z' || *cp == 'Z') + { + /* 'z' is standardized in ISO C 99, but glibc uses 'Z' + because the warning facility in gcc-2.95.2 understands + only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */ + if (sizeof (size_t) > sizeof (long)) + { + /* size_t = long long */ + flags += 16; + } + else if (sizeof (size_t) > sizeof (int)) + { + /* size_t = long */ + flags += 8; + } + cp++; + } + else if (*cp == 't') + { + if (sizeof (ptrdiff_t) > sizeof (long)) + { + /* ptrdiff_t = long long */ + flags += 16; + } + else if (sizeof (ptrdiff_t) > sizeof (int)) + { + /* ptrdiff_t = long */ + flags += 8; + } + cp++; + } + else + break; + } + + /* Read the conversion character. */ + c = *cp++; + switch (c) + { + case 'd': case 'i': +#ifdef HAVE_LONG_LONG + if (flags >= 16 || (flags & 4)) + type = TYPE_LONGLONGINT; + else +#endif + if (flags >= 8) + type = TYPE_LONGINT; + else if (flags & 2) + type = TYPE_SCHAR; + else if (flags & 1) + type = TYPE_SHORT; + else + type = TYPE_INT; + break; + case 'o': case 'u': case 'x': case 'X': +#ifdef HAVE_LONG_LONG + if (flags >= 16 || (flags & 4)) + type = TYPE_ULONGLONGINT; + else +#endif + if (flags >= 8) + type = TYPE_ULONGINT; + else if (flags & 2) + type = TYPE_UCHAR; + else if (flags & 1) + type = TYPE_USHORT; + else + type = TYPE_UINT; + break; + case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': + case 'a': case 'A': +#ifdef HAVE_LONG_DOUBLE + if (flags >= 16 || (flags & 4)) + type = TYPE_LONGDOUBLE; + else +#endif + type = TYPE_DOUBLE; + break; + case 'c': + if (flags >= 8) +#ifdef HAVE_WINT_T + type = TYPE_WIDE_CHAR; +#else + goto error; +#endif + else + type = TYPE_CHAR; + break; +#ifdef HAVE_WINT_T + case 'C': + type = TYPE_WIDE_CHAR; + c = 'c'; + break; +#endif + case 's': + if (flags >= 8) +#ifdef HAVE_WCHAR_T + type = TYPE_WIDE_STRING; +#else + goto error; +#endif + else + type = TYPE_STRING; + break; +#ifdef HAVE_WCHAR_T + case 'S': + type = TYPE_WIDE_STRING; + c = 's'; + break; +#endif + case 'p': + type = TYPE_POINTER; + break; + case 'n': +#ifdef HAVE_LONG_LONG + if (flags >= 16 || (flags & 4)) + type = TYPE_COUNT_LONGLONGINT_POINTER; + else +#endif + if (flags >= 8) + type = TYPE_COUNT_LONGINT_POINTER; + else if (flags & 2) + type = TYPE_COUNT_SCHAR_POINTER; + else if (flags & 1) + type = TYPE_COUNT_SHORT_POINTER; + else + type = TYPE_COUNT_INT_POINTER; + break; + case '%': + type = TYPE_NONE; + break; + default: + /* Unknown conversion character. */ + goto error; + } + } + + if (type != TYPE_NONE) + { + dp->arg_index = arg_index; + if (dp->arg_index == ARG_NONE) + { + dp->arg_index = arg_posn++; + if (dp->arg_index == ARG_NONE) + /* arg_posn wrapped around. */ + goto error; + } + REGISTER_ARG (dp->arg_index, type); + } + dp->conversion = c; + dp->dir_end = cp; + } + + d->count++; + if (d->count >= d_allocated) + { + size_t memory_size; + DIRECTIVE *memory; + + d_allocated = xtimes (d_allocated, 2); + memory_size = xtimes (d_allocated, sizeof (DIRECTIVE)); + if (size_overflow_p (memory_size)) + /* Overflow, would lead to out of memory. */ + goto error; + memory = realloc (d->dir, memory_size); + if (memory == NULL) + /* Out of memory. */ + goto error; + d->dir = memory; + } + } + } + d->dir[d->count].dir_start = cp; + + d->max_width_length = max_width_length; + d->max_precision_length = max_precision_length; + return 0; + +error: + if (a->arg) + free (a->arg); + if (d->dir) + free (d->dir); + return -1; +} + +#undef DIRECTIVES +#undef DIRECTIVE +#undef CHAR_T +#undef PRINTF_PARSE diff --git a/intl/printf-parse.h b/intl/printf-parse.h new file mode 100644 index 0000000..8aec50e --- /dev/null +++ b/intl/printf-parse.h @@ -0,0 +1,75 @@ +/* Parse printf format string. + Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _PRINTF_PARSE_H +#define _PRINTF_PARSE_H + +#include "printf-args.h" + + +/* Flags */ +#define FLAG_GROUP 1 /* ' flag */ +#define FLAG_LEFT 2 /* - flag */ +#define FLAG_SHOWSIGN 4 /* + flag */ +#define FLAG_SPACE 8 /* space flag */ +#define FLAG_ALT 16 /* # flag */ +#define FLAG_ZERO 32 + +/* arg_index value indicating that no argument is consumed. */ +#define ARG_NONE (~(size_t)0) + +/* A parsed directive. */ +typedef struct +{ + const char* dir_start; + const char* dir_end; + int flags; + const char* width_start; + const char* width_end; + size_t width_arg_index; + const char* precision_start; + const char* precision_end; + size_t precision_arg_index; + char conversion; /* d i o u x X f e E g G c s p n U % but not C S */ + size_t arg_index; +} +char_directive; + +/* A parsed format string. */ +typedef struct +{ + size_t count; + char_directive *dir; + size_t max_width_length; + size_t max_precision_length; +} +char_directives; + + +/* Parses the format string. Fills in the number N of directives, and fills + in directives[0], ..., directives[N-1], and sets directives[N].dir_start + to the end of the format string. Also fills in the arg_type fields of the + arguments and the needed count of arguments. */ +#ifdef STATIC +STATIC +#else +extern +#endif +int printf_parse (const char *format, char_directives *d, arguments *a); + +#endif /* _PRINTF_PARSE_H */ diff --git a/intl/printf.c b/intl/printf.c new file mode 100644 index 0000000..878646c --- /dev/null +++ b/intl/printf.c @@ -0,0 +1,371 @@ +/* Formatted output to strings, using POSIX/XSI format strings with positions. + Copyright (C) 2003 Free Software Foundation, Inc. + Written by Bruno Haible , 2003. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifdef __GNUC__ +# define alloca __builtin_alloca +# define HAVE_ALLOCA 1 +#else +# ifdef _MSC_VER +# include +# define alloca _alloca +# else +# if defined HAVE_ALLOCA_H || defined _LIBC +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +#include + +#if !HAVE_POSIX_PRINTF + +#include +#include + +/* When building a DLL, we must export some functions. Note that because + the functions are only defined for binary backward compatibility, we + don't need to use __declspec(dllimport) in any case. */ +#if defined _MSC_VER && BUILDING_DLL +# define DLL_EXPORTED __declspec(dllexport) +#else +# define DLL_EXPORTED +#endif + +#define STATIC static + +/* Define auxiliary functions declared in "printf-args.h". */ +#include "printf-args.c" + +/* Define auxiliary functions declared in "printf-parse.h". */ +#include "printf-parse.c" + +/* Define functions declared in "vasnprintf.h". */ +#define vasnprintf libintl_vasnprintf +#include "vasnprintf.c" +#if 0 /* not needed */ +#define asnprintf libintl_asnprintf +#include "asnprintf.c" +#endif + +DLL_EXPORTED +int +libintl_vfprintf (FILE *stream, const char *format, va_list args) +{ + if (strchr (format, '$') == NULL) + return vfprintf (stream, format, args); + else + { + size_t length; + char *result = libintl_vasnprintf (NULL, &length, format, args); + int retval = -1; + if (result != NULL) + { + if (fwrite (result, 1, length, stream) == length) + retval = length; + free (result); + } + return retval; + } +} + +DLL_EXPORTED +int +libintl_fprintf (FILE *stream, const char *format, ...) +{ + va_list args; + int retval; + + va_start (args, format); + retval = libintl_vfprintf (stream, format, args); + va_end (args); + return retval; +} + +DLL_EXPORTED +int +libintl_vprintf (const char *format, va_list args) +{ + return libintl_vfprintf (stdout, format, args); +} + +DLL_EXPORTED +int +libintl_printf (const char *format, ...) +{ + va_list args; + int retval; + + va_start (args, format); + retval = libintl_vprintf (format, args); + va_end (args); + return retval; +} + +DLL_EXPORTED +int +libintl_vsprintf (char *resultbuf, const char *format, va_list args) +{ + if (strchr (format, '$') == NULL) + return vsprintf (resultbuf, format, args); + else + { + size_t length = (size_t) ~0 / (4 * sizeof (char)); + char *result = libintl_vasnprintf (resultbuf, &length, format, args); + if (result != resultbuf) + { + free (result); + return -1; + } + else + return length; + } +} + +DLL_EXPORTED +int +libintl_sprintf (char *resultbuf, const char *format, ...) +{ + va_list args; + int retval; + + va_start (args, format); + retval = libintl_vsprintf (resultbuf, format, args); + va_end (args); + return retval; +} + +#if HAVE_SNPRINTF + +# if HAVE_DECL__SNPRINTF + /* Windows. */ +# define system_vsnprintf _vsnprintf +# else + /* Unix. */ +# define system_vsnprintf vsnprintf +# endif + +DLL_EXPORTED +int +libintl_vsnprintf (char *resultbuf, size_t length, const char *format, va_list args) +{ + if (strchr (format, '$') == NULL) + return system_vsnprintf (resultbuf, length, format, args); + else + { + size_t maxlength = length; + char *result = libintl_vasnprintf (resultbuf, &length, format, args); + if (result != resultbuf) + { + if (maxlength > 0) + { + if (length < maxlength) + abort (); + memcpy (resultbuf, result, maxlength - 1); + resultbuf[maxlength - 1] = '\0'; + } + free (result); + return -1; + } + else + return length; + } +} + +DLL_EXPORTED +int +libintl_snprintf (char *resultbuf, size_t length, const char *format, ...) +{ + va_list args; + int retval; + + va_start (args, format); + retval = libintl_vsnprintf (resultbuf, length, format, args); + va_end (args); + return retval; +} + +#endif + +#if HAVE_ASPRINTF + +DLL_EXPORTED +int +libintl_vasprintf (char **resultp, const char *format, va_list args) +{ + size_t length; + char *result = libintl_vasnprintf (NULL, &length, format, args); + if (result == NULL) + return -1; + *resultp = result; + return length; +} + +DLL_EXPORTED +int +libintl_asprintf (char **resultp, const char *format, ...) +{ + va_list args; + int retval; + + va_start (args, format); + retval = libintl_vasprintf (resultp, format, args); + va_end (args); + return retval; +} + +#endif + +#if HAVE_FWPRINTF + +#include + +#define WIDE_CHAR_VERSION 1 + +/* Define auxiliary functions declared in "wprintf-parse.h". */ +#include "printf-parse.c" + +/* Define functions declared in "vasnprintf.h". */ +#define vasnwprintf libintl_vasnwprintf +#include "vasnprintf.c" +#if 0 /* not needed */ +#define asnwprintf libintl_asnwprintf +#include "asnprintf.c" +#endif + +# if HAVE_DECL__SNWPRINTF + /* Windows. */ +# define system_vswprintf _vsnwprintf +# else + /* Unix. */ +# define system_vswprintf vswprintf +# endif + +DLL_EXPORTED +int +libintl_vfwprintf (FILE *stream, const wchar_t *format, va_list args) +{ + if (wcschr (format, '$') == NULL) + return vfwprintf (stream, format, args); + else + { + size_t length; + wchar_t *result = libintl_vasnwprintf (NULL, &length, format, args); + int retval = -1; + if (result != NULL) + { + size_t i; + for (i = 0; i < length; i++) + if (fputwc (result[i], stream) == WEOF) + break; + if (i == length) + retval = length; + free (result); + } + return retval; + } +} + +DLL_EXPORTED +int +libintl_fwprintf (FILE *stream, const wchar_t *format, ...) +{ + va_list args; + int retval; + + va_start (args, format); + retval = libintl_vfwprintf (stream, format, args); + va_end (args); + return retval; +} + +DLL_EXPORTED +int +libintl_vwprintf (const wchar_t *format, va_list args) +{ + return libintl_vfwprintf (stdout, format, args); +} + +DLL_EXPORTED +int +libintl_wprintf (const wchar_t *format, ...) +{ + va_list args; + int retval; + + va_start (args, format); + retval = libintl_vwprintf (format, args); + va_end (args); + return retval; +} + +DLL_EXPORTED +int +libintl_vswprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, va_list args) +{ + if (wcschr (format, '$') == NULL) + return system_vswprintf (resultbuf, length, format, args); + else + { + size_t maxlength = length; + wchar_t *result = libintl_vasnwprintf (resultbuf, &length, format, args); + if (result != resultbuf) + { + if (maxlength > 0) + { + if (length < maxlength) + abort (); + memcpy (resultbuf, result, (maxlength - 1) * sizeof (wchar_t)); + resultbuf[maxlength - 1] = 0; + } + free (result); + return -1; + } + else + return length; + } +} + +DLL_EXPORTED +int +libintl_swprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, ...) +{ + va_list args; + int retval; + + va_start (args, format); + retval = libintl_vswprintf (resultbuf, length, format, args); + va_end (args); + return retval; +} + +#endif + +#endif diff --git a/intl/ref-add.sin b/intl/ref-add.sin new file mode 100644 index 0000000..167374e --- /dev/null +++ b/intl/ref-add.sin @@ -0,0 +1,31 @@ +# Add this package to a list of references stored in a text file. +# +# Copyright (C) 2000 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# +# Written by Bruno Haible . +# +/^# Packages using this file: / { + s/# Packages using this file:// + ta + :a + s/ @PACKAGE@ / @PACKAGE@ / + tb + s/ $/ @PACKAGE@ / + :b + s/^/# Packages using this file:/ +} diff --git a/intl/ref-del.sin b/intl/ref-del.sin new file mode 100644 index 0000000..613cf37 --- /dev/null +++ b/intl/ref-del.sin @@ -0,0 +1,26 @@ +# Remove this package from a list of references stored in a text file. +# +# Copyright (C) 2000 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +# USA. +# +# Written by Bruno Haible . +# +/^# Packages using this file: / { + s/# Packages using this file:// + s/ @PACKAGE@ / / + s/^/# Packages using this file:/ +} diff --git a/intl/relocatable.c b/intl/relocatable.c new file mode 100644 index 0000000..bf7c708 --- /dev/null +++ b/intl/relocatable.c @@ -0,0 +1,449 @@ +/* Provide relocatable packages. + Copyright (C) 2003 Free Software Foundation, Inc. + Written by Bruno Haible , 2003. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + + +/* Tell glibc's to provide a prototype for getline(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +/* Specification. */ +#include "relocatable.h" + +#if ENABLE_RELOCATABLE + +#include +#include +#include +#include + +#ifdef NO_XMALLOC +# define xmalloc malloc +#else +# include "xalloc.h" +#endif + +#if defined _WIN32 || defined __WIN32__ +# define WIN32_LEAN_AND_MEAN +# include +#endif + +#if DEPENDS_ON_LIBCHARSET +# include +#endif +#if DEPENDS_ON_LIBICONV && HAVE_ICONV +# include +#endif +#if DEPENDS_ON_LIBINTL && ENABLE_NLS +# include +#endif + +/* Faked cheap 'bool'. */ +#undef bool +#undef false +#undef true +#define bool int +#define false 0 +#define true 1 + +/* Pathname support. + ISSLASH(C) tests whether C is a directory separator character. + IS_PATH_WITH_DIR(P) tests whether P contains a directory specification. + */ +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +# define HAS_DEVICE(P) \ + ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ + && (P)[1] == ':') +# define IS_PATH_WITH_DIR(P) \ + (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P)) +# define FILESYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0) +#else + /* Unix */ +# define ISSLASH(C) ((C) == '/') +# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL) +# define FILESYSTEM_PREFIX_LEN(P) 0 +#endif + +/* Original installation prefix. */ +static char *orig_prefix; +static size_t orig_prefix_len; +/* Current installation prefix. */ +static char *curr_prefix; +static size_t curr_prefix_len; +/* These prefixes do not end in a slash. Anything that will be concatenated + to them must start with a slash. */ + +/* Sets the original and the current installation prefix of this module. + Relocation simply replaces a pathname starting with the original prefix + by the corresponding pathname with the current prefix instead. Both + prefixes should be directory names without trailing slash (i.e. use "" + instead of "/"). */ +static void +set_this_relocation_prefix (const char *orig_prefix_arg, + const char *curr_prefix_arg) +{ + if (orig_prefix_arg != NULL && curr_prefix_arg != NULL + /* Optimization: if orig_prefix and curr_prefix are equal, the + relocation is a nop. */ + && strcmp (orig_prefix_arg, curr_prefix_arg) != 0) + { + /* Duplicate the argument strings. */ + char *memory; + + orig_prefix_len = strlen (orig_prefix_arg); + curr_prefix_len = strlen (curr_prefix_arg); + memory = (char *) xmalloc (orig_prefix_len + 1 + curr_prefix_len + 1); +#ifdef NO_XMALLOC + if (memory != NULL) +#endif + { + memcpy (memory, orig_prefix_arg, orig_prefix_len + 1); + orig_prefix = memory; + memory += orig_prefix_len + 1; + memcpy (memory, curr_prefix_arg, curr_prefix_len + 1); + curr_prefix = memory; + return; + } + } + orig_prefix = NULL; + curr_prefix = NULL; + /* Don't worry about wasted memory here - this function is usually only + called once. */ +} + +/* Sets the original and the current installation prefix of the package. + Relocation simply replaces a pathname starting with the original prefix + by the corresponding pathname with the current prefix instead. Both + prefixes should be directory names without trailing slash (i.e. use "" + instead of "/"). */ +void +set_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg) +{ + set_this_relocation_prefix (orig_prefix_arg, curr_prefix_arg); + + /* Now notify all dependent libraries. */ +#if DEPENDS_ON_LIBCHARSET + libcharset_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); +#endif +#if DEPENDS_ON_LIBICONV && HAVE_ICONV && _LIBICONV_VERSION >= 0x0109 + libiconv_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); +#endif +#if DEPENDS_ON_LIBINTL && ENABLE_NLS && defined libintl_set_relocation_prefix + libintl_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); +#endif +} + +#if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR) + +/* Convenience function: + Computes the current installation prefix, based on the original + installation prefix, the original installation directory of a particular + file, and the current pathname of this file. Returns NULL upon failure. */ +#ifdef IN_LIBRARY +#define compute_curr_prefix local_compute_curr_prefix +static +#endif +const char * +compute_curr_prefix (const char *orig_installprefix, + const char *orig_installdir, + const char *curr_pathname) +{ + const char *curr_installdir; + const char *rel_installdir; + + if (curr_pathname == NULL) + return NULL; + + /* Determine the relative installation directory, relative to the prefix. + This is simply the difference between orig_installprefix and + orig_installdir. */ + if (strncmp (orig_installprefix, orig_installdir, strlen (orig_installprefix)) + != 0) + /* Shouldn't happen - nothing should be installed outside $(prefix). */ + return NULL; + rel_installdir = orig_installdir + strlen (orig_installprefix); + + /* Determine the current installation directory. */ + { + const char *p_base = curr_pathname + FILESYSTEM_PREFIX_LEN (curr_pathname); + const char *p = curr_pathname + strlen (curr_pathname); + char *q; + + while (p > p_base) + { + p--; + if (ISSLASH (*p)) + break; + } + + q = (char *) xmalloc (p - curr_pathname + 1); +#ifdef NO_XMALLOC + if (q == NULL) + return NULL; +#endif + memcpy (q, curr_pathname, p - curr_pathname); + q[p - curr_pathname] = '\0'; + curr_installdir = q; + } + + /* Compute the current installation prefix by removing the trailing + rel_installdir from it. */ + { + const char *rp = rel_installdir + strlen (rel_installdir); + const char *cp = curr_installdir + strlen (curr_installdir); + const char *cp_base = + curr_installdir + FILESYSTEM_PREFIX_LEN (curr_installdir); + + while (rp > rel_installdir && cp > cp_base) + { + bool same = false; + const char *rpi = rp; + const char *cpi = cp; + + while (rpi > rel_installdir && cpi > cp_base) + { + rpi--; + cpi--; + if (ISSLASH (*rpi) || ISSLASH (*cpi)) + { + if (ISSLASH (*rpi) && ISSLASH (*cpi)) + same = true; + break; + } +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS - case insignificant filesystem */ + if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi) + != (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi)) + break; +#else + if (*rpi != *cpi) + break; +#endif + } + if (!same) + break; + /* The last pathname component was the same. opi and cpi now point + to the slash before it. */ + rp = rpi; + cp = cpi; + } + + if (rp > rel_installdir) + /* Unexpected: The curr_installdir does not end with rel_installdir. */ + return NULL; + + { + size_t curr_prefix_len = cp - curr_installdir; + char *curr_prefix; + + curr_prefix = (char *) xmalloc (curr_prefix_len + 1); +#ifdef NO_XMALLOC + if (curr_prefix == NULL) + return NULL; +#endif + memcpy (curr_prefix, curr_installdir, curr_prefix_len); + curr_prefix[curr_prefix_len] = '\0'; + + return curr_prefix; + } + } +} + +#endif /* !IN_LIBRARY || PIC */ + +#if defined PIC && defined INSTALLDIR + +/* Full pathname of shared library, or NULL. */ +static char *shared_library_fullname; + +#if defined _WIN32 || defined __WIN32__ + +/* Determine the full pathname of the shared library when it is loaded. */ + +BOOL WINAPI +DllMain (HINSTANCE module_handle, DWORD event, LPVOID reserved) +{ + (void) reserved; + + if (event == DLL_PROCESS_ATTACH) + { + /* The DLL is being loaded into an application's address range. */ + static char location[MAX_PATH]; + + if (!GetModuleFileName (module_handle, location, sizeof (location))) + /* Shouldn't happen. */ + return FALSE; + + if (!IS_PATH_WITH_DIR (location)) + /* Shouldn't happen. */ + return FALSE; + + shared_library_fullname = strdup (location); + } + + return TRUE; +} + +#else /* Unix */ + +static void +find_shared_library_fullname () +{ +#if defined __linux__ && __GLIBC__ >= 2 + /* Linux has /proc/self/maps. glibc 2 has the getline() function. */ + FILE *fp; + + /* Open the current process' maps file. It describes one VMA per line. */ + fp = fopen ("/proc/self/maps", "r"); + if (fp) + { + unsigned long address = (unsigned long) &find_shared_library_fullname; + for (;;) + { + unsigned long start, end; + int c; + + if (fscanf (fp, "%lx-%lx", &start, &end) != 2) + break; + if (address >= start && address <= end - 1) + { + /* Found it. Now see if this line contains a filename. */ + while (c = getc (fp), c != EOF && c != '\n' && c != '/') + continue; + if (c == '/') + { + size_t size; + int len; + + ungetc (c, fp); + shared_library_fullname = NULL; size = 0; + len = getline (&shared_library_fullname, &size, fp); + if (len >= 0) + { + /* Success: filled shared_library_fullname. */ + if (len > 0 && shared_library_fullname[len - 1] == '\n') + shared_library_fullname[len - 1] = '\0'; + } + } + break; + } + while (c = getc (fp), c != EOF && c != '\n') + continue; + } + fclose (fp); + } +#endif +} + +#endif /* WIN32 / Unix */ + +/* Return the full pathname of the current shared library. + Return NULL if unknown. + Guaranteed to work only on Linux and Woe32. */ +static char * +get_shared_library_fullname () +{ +#if !(defined _WIN32 || defined __WIN32__) + static bool tried_find_shared_library_fullname; + if (!tried_find_shared_library_fullname) + { + find_shared_library_fullname (); + tried_find_shared_library_fullname = true; + } +#endif + return shared_library_fullname; +} + +#endif /* PIC */ + +/* Returns the pathname, relocated according to the current installation + directory. */ +const char * +relocate (const char *pathname) +{ +#if defined PIC && defined INSTALLDIR + static int initialized; + + /* Initialization code for a shared library. */ + if (!initialized) + { + /* At this point, orig_prefix and curr_prefix likely have already been + set through the main program's set_program_name_and_installdir + function. This is sufficient in the case that the library has + initially been installed in the same orig_prefix. But we can do + better, to also cover the cases that 1. it has been installed + in a different prefix before being moved to orig_prefix and (later) + to curr_prefix, 2. unlike the program, it has not moved away from + orig_prefix. */ + const char *orig_installprefix = INSTALLPREFIX; + const char *orig_installdir = INSTALLDIR; + const char *curr_prefix_better; + + curr_prefix_better = + compute_curr_prefix (orig_installprefix, orig_installdir, + get_shared_library_fullname ()); + if (curr_prefix_better == NULL) + curr_prefix_better = curr_prefix; + + set_relocation_prefix (orig_installprefix, curr_prefix_better); + + initialized = 1; + } +#endif + + /* Note: It is not necessary to perform case insensitive comparison here, + even for DOS-like filesystems, because the pathname argument was + typically created from the same Makefile variable as orig_prefix came + from. */ + if (orig_prefix != NULL && curr_prefix != NULL + && strncmp (pathname, orig_prefix, orig_prefix_len) == 0) + { + if (pathname[orig_prefix_len] == '\0') + /* pathname equals orig_prefix. */ + return curr_prefix; + if (ISSLASH (pathname[orig_prefix_len])) + { + /* pathname starts with orig_prefix. */ + const char *pathname_tail = &pathname[orig_prefix_len]; + char *result = + (char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1); + +#ifdef NO_XMALLOC + if (result != NULL) +#endif + { + memcpy (result, curr_prefix, curr_prefix_len); + strcpy (result + curr_prefix_len, pathname_tail); + return result; + } + } + } + /* Nothing to relocate. */ + return pathname; +} + +#endif diff --git a/intl/relocatable.h b/intl/relocatable.h new file mode 100644 index 0000000..48c5b71 --- /dev/null +++ b/intl/relocatable.h @@ -0,0 +1,77 @@ +/* Provide relocatable packages. + Copyright (C) 2003 Free Software Foundation, Inc. + Written by Bruno Haible , 2003. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _RELOCATABLE_H +#define _RELOCATABLE_H + +#ifdef __cplusplus +extern "C" { +#endif + + +/* This can be enabled through the configure --enable-relocatable option. */ +#if ENABLE_RELOCATABLE + +/* When building a DLL, we must export some functions. Note that because + this is a private .h file, we don't need to use __declspec(dllimport) + in any case. */ +#if defined _MSC_VER && BUILDING_DLL +# define RELOCATABLE_DLL_EXPORTED __declspec(dllexport) +#else +# define RELOCATABLE_DLL_EXPORTED +#endif + +/* Sets the original and the current installation prefix of the package. + Relocation simply replaces a pathname starting with the original prefix + by the corresponding pathname with the current prefix instead. Both + prefixes should be directory names without trailing slash (i.e. use "" + instead of "/"). */ +extern RELOCATABLE_DLL_EXPORTED void + set_relocation_prefix (const char *orig_prefix, + const char *curr_prefix); + +/* Returns the pathname, relocated according to the current installation + directory. */ +extern const char * relocate (const char *pathname); + +/* Memory management: relocate() leaks memory, because it has to construct + a fresh pathname. If this is a problem because your program calls + relocate() frequently, think about caching the result. */ + +/* Convenience function: + Computes the current installation prefix, based on the original + installation prefix, the original installation directory of a particular + file, and the current pathname of this file. Returns NULL upon failure. */ +extern const char * compute_curr_prefix (const char *orig_installprefix, + const char *orig_installdir, + const char *curr_pathname); + +#else + +/* By default, we use the hardwired pathnames. */ +#define relocate(pathname) (pathname) + +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* _RELOCATABLE_H */ diff --git a/intl/textdomain.c b/intl/textdomain.c new file mode 100644 index 0000000..8745a84 --- /dev/null +++ b/intl/textdomain.c @@ -0,0 +1,141 @@ +/* Implementation of the textdomain(3) function. + Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#ifdef _LIBC +# include +#else +# include "libgnuintl.h" +#endif +#include "gettextP.h" + +#ifdef _LIBC +/* We have to handle multi-threaded applications. */ +# include +#else +/* Provide dummy implementation if this is outside glibc. */ +# define __libc_rwlock_define(CLASS, NAME) +# define __libc_rwlock_wrlock(NAME) +# define __libc_rwlock_unlock(NAME) +#endif + +/* The internal variables in the standalone libintl.a must have different + names than the internal variables in GNU libc, otherwise programs + using libintl.a cannot be linked statically. */ +#if !defined _LIBC +# define _nl_default_default_domain libintl_nl_default_default_domain +# define _nl_current_default_domain libintl_nl_current_default_domain +#endif + +/* @@ end of prolog @@ */ + +/* Name of the default text domain. */ +extern const char _nl_default_default_domain[] attribute_hidden; + +/* Default text domain in which entries for gettext(3) are to be found. */ +extern const char *_nl_current_default_domain attribute_hidden; + + +/* Names for the libintl functions are a problem. They must not clash + with existing names and they should follow ANSI C. But this source + code is also used in GNU C Library where the names have a __ + prefix. So we have to make a difference here. */ +#ifdef _LIBC +# define TEXTDOMAIN __textdomain +# ifndef strdup +# define strdup(str) __strdup (str) +# endif +#else +# define TEXTDOMAIN libintl_textdomain +#endif + +/* Lock variable to protect the global data in the gettext implementation. */ +__libc_rwlock_define (extern, _nl_state_lock attribute_hidden) + +/* Set the current default message catalog to DOMAINNAME. + If DOMAINNAME is null, return the current default. + If DOMAINNAME is "", reset to the default of "messages". */ +char * +TEXTDOMAIN (const char *domainname) +{ + char *new_domain; + char *old_domain; + + /* A NULL pointer requests the current setting. */ + if (domainname == NULL) + return (char *) _nl_current_default_domain; + + __libc_rwlock_wrlock (_nl_state_lock); + + old_domain = (char *) _nl_current_default_domain; + + /* If domain name is the null string set to default domain "messages". */ + if (domainname[0] == '\0' + || strcmp (domainname, _nl_default_default_domain) == 0) + { + _nl_current_default_domain = _nl_default_default_domain; + new_domain = (char *) _nl_current_default_domain; + } + else if (strcmp (domainname, old_domain) == 0) + /* This can happen and people will use it to signal that some + environment variable changed. */ + new_domain = old_domain; + else + { + /* If the following malloc fails `_nl_current_default_domain' + will be NULL. This value will be returned and so signals we + are out of core. */ +#if defined _LIBC || defined HAVE_STRDUP + new_domain = strdup (domainname); +#else + size_t len = strlen (domainname) + 1; + new_domain = (char *) malloc (len); + if (new_domain != NULL) + memcpy (new_domain, domainname, len); +#endif + + if (new_domain != NULL) + _nl_current_default_domain = new_domain; + } + + /* We use this possibility to signal a change of the loaded catalogs + since this is most likely the case and there is no other easy we + to do it. Do it only when the call was successful. */ + if (new_domain != NULL) + { + ++_nl_msg_cat_cntr; + + if (old_domain != new_domain && old_domain != _nl_default_default_domain) + free (old_domain); + } + + __libc_rwlock_unlock (_nl_state_lock); + + return new_domain; +} + +#ifdef _LIBC +/* Alias for function name in GNU C Library. */ +weak_alias (__textdomain, textdomain); +#endif diff --git a/intl/vasnprintf.c b/intl/vasnprintf.c new file mode 100644 index 0000000..8a62282 --- /dev/null +++ b/intl/vasnprintf.c @@ -0,0 +1,887 @@ +/* vsprintf with automatic memory allocation. + Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Tell glibc's to provide a prototype for snprintf(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif +#ifndef IN_LIBINTL +# include +#endif + +/* Specification. */ +#if WIDE_CHAR_VERSION +# include "vasnwprintf.h" +#else +# include "vasnprintf.h" +#endif + +#include /* snprintf(), sprintf() */ +#include /* abort(), malloc(), realloc(), free() */ +#include /* memcpy(), strlen() */ +#include /* errno */ +#include /* CHAR_BIT */ +#include /* DBL_MAX_EXP, LDBL_MAX_EXP */ +#if WIDE_CHAR_VERSION +# include "wprintf-parse.h" +#else +# include "printf-parse.h" +#endif + +/* Checked size_t computations. */ +#include "xsize.h" + +#ifdef HAVE_WCHAR_T +# ifdef HAVE_WCSLEN +# define local_wcslen wcslen +# else + /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid + a dependency towards this library, here is a local substitute. + Define this substitute only once, even if this file is included + twice in the same compilation unit. */ +# ifndef local_wcslen_defined +# define local_wcslen_defined 1 +static size_t +local_wcslen (const wchar_t *s) +{ + const wchar_t *ptr; + + for (ptr = s; *ptr != (wchar_t) 0; ptr++) + ; + return ptr - s; +} +# endif +# endif +#endif + +#if WIDE_CHAR_VERSION +# define VASNPRINTF vasnwprintf +# define CHAR_T wchar_t +# define DIRECTIVE wchar_t_directive +# define DIRECTIVES wchar_t_directives +# define PRINTF_PARSE wprintf_parse +# define USE_SNPRINTF 1 +# if HAVE_DECL__SNWPRINTF + /* On Windows, the function swprintf() has a different signature than + on Unix; we use the _snwprintf() function instead. */ +# define SNPRINTF _snwprintf +# else + /* Unix. */ +# define SNPRINTF swprintf +# endif +#else +# define VASNPRINTF vasnprintf +# define CHAR_T char +# define DIRECTIVE char_directive +# define DIRECTIVES char_directives +# define PRINTF_PARSE printf_parse +# define USE_SNPRINTF (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF) +# if HAVE_DECL__SNPRINTF + /* Windows. */ +# define SNPRINTF _snprintf +# else + /* Unix. */ +# define SNPRINTF snprintf +# endif +#endif + +CHAR_T * +VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list args) +{ + DIRECTIVES d; + arguments a; + + if (PRINTF_PARSE (format, &d, &a) < 0) + { + errno = EINVAL; + return NULL; + } + +#define CLEANUP() \ + free (d.dir); \ + if (a.arg) \ + free (a.arg); + + if (printf_fetchargs (args, &a) < 0) + { + CLEANUP (); + errno = EINVAL; + return NULL; + } + + { + size_t buf_neededlength; + CHAR_T *buf; + CHAR_T *buf_malloced; + const CHAR_T *cp; + size_t i; + DIRECTIVE *dp; + /* Output string accumulator. */ + CHAR_T *result; + size_t allocated; + size_t length; + + /* Allocate a small buffer that will hold a directive passed to + sprintf or snprintf. */ + buf_neededlength = + xsum4 (7, d.max_width_length, d.max_precision_length, 6); +#if HAVE_ALLOCA + if (buf_neededlength < 4000 / sizeof (CHAR_T)) + { + buf = (CHAR_T *) alloca (buf_neededlength * sizeof (CHAR_T)); + buf_malloced = NULL; + } + else +#endif + { + size_t buf_memsize = xtimes (buf_neededlength, sizeof (CHAR_T)); + if (size_overflow_p (buf_memsize)) + goto out_of_memory_1; + buf = (CHAR_T *) malloc (buf_memsize); + if (buf == NULL) + goto out_of_memory_1; + buf_malloced = buf; + } + + if (resultbuf != NULL) + { + result = resultbuf; + allocated = *lengthp; + } + else + { + result = NULL; + allocated = 0; + } + length = 0; + /* Invariants: + result is either == resultbuf or == NULL or malloc-allocated. + If length > 0, then result != NULL. */ + + /* Ensures that allocated >= needed. Aborts through a jump to + out_of_memory if needed is SIZE_MAX or otherwise too big. */ +#define ENSURE_ALLOCATION(needed) \ + if ((needed) > allocated) \ + { \ + size_t memory_size; \ + CHAR_T *memory; \ + \ + allocated = (allocated > 0 ? xtimes (allocated, 2) : 12); \ + if ((needed) > allocated) \ + allocated = (needed); \ + memory_size = xtimes (allocated, sizeof (CHAR_T)); \ + if (size_overflow_p (memory_size)) \ + goto out_of_memory; \ + if (result == resultbuf || result == NULL) \ + memory = (CHAR_T *) malloc (memory_size); \ + else \ + memory = (CHAR_T *) realloc (result, memory_size); \ + if (memory == NULL) \ + goto out_of_memory; \ + if (result == resultbuf && length > 0) \ + memcpy (memory, result, length * sizeof (CHAR_T)); \ + result = memory; \ + } + + for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++) + { + if (cp != dp->dir_start) + { + size_t n = dp->dir_start - cp; + size_t augmented_length = xsum (length, n); + + ENSURE_ALLOCATION (augmented_length); + memcpy (result + length, cp, n * sizeof (CHAR_T)); + length = augmented_length; + } + if (i == d.count) + break; + + /* Execute a single directive. */ + if (dp->conversion == '%') + { + size_t augmented_length; + + if (!(dp->arg_index == ARG_NONE)) + abort (); + augmented_length = xsum (length, 1); + ENSURE_ALLOCATION (augmented_length); + result[length] = '%'; + length = augmented_length; + } + else + { + if (!(dp->arg_index != ARG_NONE)) + abort (); + + if (dp->conversion == 'n') + { + switch (a.arg[dp->arg_index].type) + { + case TYPE_COUNT_SCHAR_POINTER: + *a.arg[dp->arg_index].a.a_count_schar_pointer = length; + break; + case TYPE_COUNT_SHORT_POINTER: + *a.arg[dp->arg_index].a.a_count_short_pointer = length; + break; + case TYPE_COUNT_INT_POINTER: + *a.arg[dp->arg_index].a.a_count_int_pointer = length; + break; + case TYPE_COUNT_LONGINT_POINTER: + *a.arg[dp->arg_index].a.a_count_longint_pointer = length; + break; +#ifdef HAVE_LONG_LONG + case TYPE_COUNT_LONGLONGINT_POINTER: + *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length; + break; +#endif + default: + abort (); + } + } + else + { + arg_type type = a.arg[dp->arg_index].type; + CHAR_T *p; + unsigned int prefix_count; + int prefixes[2]; +#if !USE_SNPRINTF + size_t tmp_length; + CHAR_T tmpbuf[700]; + CHAR_T *tmp; + + /* Allocate a temporary buffer of sufficient size for calling + sprintf. */ + { + size_t width; + size_t precision; + + width = 0; + if (dp->width_start != dp->width_end) + { + if (dp->width_arg_index != ARG_NONE) + { + int arg; + + if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) + abort (); + arg = a.arg[dp->width_arg_index].a.a_int; + width = (arg < 0 ? (unsigned int) (-arg) : arg); + } + else + { + const CHAR_T *digitp = dp->width_start; + + do + width = xsum (xtimes (width, 10), *digitp++ - '0'); + while (digitp != dp->width_end); + } + } + + precision = 6; + if (dp->precision_start != dp->precision_end) + { + if (dp->precision_arg_index != ARG_NONE) + { + int arg; + + if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) + abort (); + arg = a.arg[dp->precision_arg_index].a.a_int; + precision = (arg < 0 ? 0 : arg); + } + else + { + const CHAR_T *digitp = dp->precision_start + 1; + + precision = 0; + do + precision = xsum (xtimes (precision, 10), *digitp++ - '0'); + while (digitp != dp->precision_end); + } + } + + switch (dp->conversion) + { + + case 'd': case 'i': case 'u': +# ifdef HAVE_LONG_LONG + if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long long) * CHAR_BIT + * 0.30103 /* binary -> decimal */ + * 2 /* estimate for FLAG_GROUP */ + ) + + 1 /* turn floor into ceil */ + + 1; /* account for leading sign */ + else +# endif + if (type == TYPE_LONGINT || type == TYPE_ULONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long) * CHAR_BIT + * 0.30103 /* binary -> decimal */ + * 2 /* estimate for FLAG_GROUP */ + ) + + 1 /* turn floor into ceil */ + + 1; /* account for leading sign */ + else + tmp_length = + (unsigned int) (sizeof (unsigned int) * CHAR_BIT + * 0.30103 /* binary -> decimal */ + * 2 /* estimate for FLAG_GROUP */ + ) + + 1 /* turn floor into ceil */ + + 1; /* account for leading sign */ + break; + + case 'o': +# ifdef HAVE_LONG_LONG + if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long long) * CHAR_BIT + * 0.333334 /* binary -> octal */ + ) + + 1 /* turn floor into ceil */ + + 1; /* account for leading sign */ + else +# endif + if (type == TYPE_LONGINT || type == TYPE_ULONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long) * CHAR_BIT + * 0.333334 /* binary -> octal */ + ) + + 1 /* turn floor into ceil */ + + 1; /* account for leading sign */ + else + tmp_length = + (unsigned int) (sizeof (unsigned int) * CHAR_BIT + * 0.333334 /* binary -> octal */ + ) + + 1 /* turn floor into ceil */ + + 1; /* account for leading sign */ + break; + + case 'x': case 'X': +# ifdef HAVE_LONG_LONG + if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long long) * CHAR_BIT + * 0.25 /* binary -> hexadecimal */ + ) + + 1 /* turn floor into ceil */ + + 2; /* account for leading sign or alternate form */ + else +# endif + if (type == TYPE_LONGINT || type == TYPE_ULONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long) * CHAR_BIT + * 0.25 /* binary -> hexadecimal */ + ) + + 1 /* turn floor into ceil */ + + 2; /* account for leading sign or alternate form */ + else + tmp_length = + (unsigned int) (sizeof (unsigned int) * CHAR_BIT + * 0.25 /* binary -> hexadecimal */ + ) + + 1 /* turn floor into ceil */ + + 2; /* account for leading sign or alternate form */ + break; + + case 'f': case 'F': +# ifdef HAVE_LONG_DOUBLE + if (type == TYPE_LONGDOUBLE) + tmp_length = + (unsigned int) (LDBL_MAX_EXP + * 0.30103 /* binary -> decimal */ + * 2 /* estimate for FLAG_GROUP */ + ) + + 1 /* turn floor into ceil */ + + 10; /* sign, decimal point etc. */ + else +# endif + tmp_length = + (unsigned int) (DBL_MAX_EXP + * 0.30103 /* binary -> decimal */ + * 2 /* estimate for FLAG_GROUP */ + ) + + 1 /* turn floor into ceil */ + + 10; /* sign, decimal point etc. */ + tmp_length = xsum (tmp_length, precision); + break; + + case 'e': case 'E': case 'g': case 'G': + case 'a': case 'A': + tmp_length = + 12; /* sign, decimal point, exponent etc. */ + tmp_length = xsum (tmp_length, precision); + break; + + case 'c': +# if defined HAVE_WINT_T && !WIDE_CHAR_VERSION + if (type == TYPE_WIDE_CHAR) + tmp_length = MB_CUR_MAX; + else +# endif + tmp_length = 1; + break; + + case 's': +# ifdef HAVE_WCHAR_T + if (type == TYPE_WIDE_STRING) + { + tmp_length = + local_wcslen (a.arg[dp->arg_index].a.a_wide_string); + +# if !WIDE_CHAR_VERSION + tmp_length = xtimes (tmp_length, MB_CUR_MAX); +# endif + } + else +# endif + tmp_length = strlen (a.arg[dp->arg_index].a.a_string); + break; + + case 'p': + tmp_length = + (unsigned int) (sizeof (void *) * CHAR_BIT + * 0.25 /* binary -> hexadecimal */ + ) + + 1 /* turn floor into ceil */ + + 2; /* account for leading 0x */ + break; + + default: + abort (); + } + + if (tmp_length < width) + tmp_length = width; + + tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ + } + + if (tmp_length <= sizeof (tmpbuf) / sizeof (CHAR_T)) + tmp = tmpbuf; + else + { + size_t tmp_memsize = xtimes (tmp_length, sizeof (CHAR_T)); + + if (size_overflow_p (tmp_memsize)) + /* Overflow, would lead to out of memory. */ + goto out_of_memory; + tmp = (CHAR_T *) malloc (tmp_memsize); + if (tmp == NULL) + /* Out of memory. */ + goto out_of_memory; + } +#endif + + /* Construct the format string for calling snprintf or + sprintf. */ + p = buf; + *p++ = '%'; + if (dp->flags & FLAG_GROUP) + *p++ = '\''; + if (dp->flags & FLAG_LEFT) + *p++ = '-'; + if (dp->flags & FLAG_SHOWSIGN) + *p++ = '+'; + if (dp->flags & FLAG_SPACE) + *p++ = ' '; + if (dp->flags & FLAG_ALT) + *p++ = '#'; + if (dp->flags & FLAG_ZERO) + *p++ = '0'; + if (dp->width_start != dp->width_end) + { + size_t n = dp->width_end - dp->width_start; + memcpy (p, dp->width_start, n * sizeof (CHAR_T)); + p += n; + } + if (dp->precision_start != dp->precision_end) + { + size_t n = dp->precision_end - dp->precision_start; + memcpy (p, dp->precision_start, n * sizeof (CHAR_T)); + p += n; + } + + switch (type) + { +#ifdef HAVE_LONG_LONG + case TYPE_LONGLONGINT: + case TYPE_ULONGLONGINT: + *p++ = 'l'; + /*FALLTHROUGH*/ +#endif + case TYPE_LONGINT: + case TYPE_ULONGINT: +#ifdef HAVE_WINT_T + case TYPE_WIDE_CHAR: +#endif +#ifdef HAVE_WCHAR_T + case TYPE_WIDE_STRING: +#endif + *p++ = 'l'; + break; +#ifdef HAVE_LONG_DOUBLE + case TYPE_LONGDOUBLE: + *p++ = 'L'; + break; +#endif + default: + break; + } + *p = dp->conversion; +#if USE_SNPRINTF + p[1] = '%'; + p[2] = 'n'; + p[3] = '\0'; +#else + p[1] = '\0'; +#endif + + /* Construct the arguments for calling snprintf or sprintf. */ + prefix_count = 0; + if (dp->width_arg_index != ARG_NONE) + { + if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) + abort (); + prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int; + } + if (dp->precision_arg_index != ARG_NONE) + { + if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) + abort (); + prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int; + } + +#if USE_SNPRINTF + /* Prepare checking whether snprintf returns the count + via %n. */ + ENSURE_ALLOCATION (xsum (length, 1)); + result[length] = '\0'; +#endif + + for (;;) + { + size_t maxlen; + int count; + int retcount; + + maxlen = allocated - length; + count = -1; + retcount = 0; + +#if USE_SNPRINTF +# define SNPRINTF_BUF(arg) \ + switch (prefix_count) \ + { \ + case 0: \ + retcount = SNPRINTF (result + length, maxlen, buf, \ + arg, &count); \ + break; \ + case 1: \ + retcount = SNPRINTF (result + length, maxlen, buf, \ + prefixes[0], arg, &count); \ + break; \ + case 2: \ + retcount = SNPRINTF (result + length, maxlen, buf, \ + prefixes[0], prefixes[1], arg, \ + &count); \ + break; \ + default: \ + abort (); \ + } +#else +# define SNPRINTF_BUF(arg) \ + switch (prefix_count) \ + { \ + case 0: \ + count = sprintf (tmp, buf, arg); \ + break; \ + case 1: \ + count = sprintf (tmp, buf, prefixes[0], arg); \ + break; \ + case 2: \ + count = sprintf (tmp, buf, prefixes[0], prefixes[1],\ + arg); \ + break; \ + default: \ + abort (); \ + } +#endif + + switch (type) + { + case TYPE_SCHAR: + { + int arg = a.arg[dp->arg_index].a.a_schar; + SNPRINTF_BUF (arg); + } + break; + case TYPE_UCHAR: + { + unsigned int arg = a.arg[dp->arg_index].a.a_uchar; + SNPRINTF_BUF (arg); + } + break; + case TYPE_SHORT: + { + int arg = a.arg[dp->arg_index].a.a_short; + SNPRINTF_BUF (arg); + } + break; + case TYPE_USHORT: + { + unsigned int arg = a.arg[dp->arg_index].a.a_ushort; + SNPRINTF_BUF (arg); + } + break; + case TYPE_INT: + { + int arg = a.arg[dp->arg_index].a.a_int; + SNPRINTF_BUF (arg); + } + break; + case TYPE_UINT: + { + unsigned int arg = a.arg[dp->arg_index].a.a_uint; + SNPRINTF_BUF (arg); + } + break; + case TYPE_LONGINT: + { + long int arg = a.arg[dp->arg_index].a.a_longint; + SNPRINTF_BUF (arg); + } + break; + case TYPE_ULONGINT: + { + unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint; + SNPRINTF_BUF (arg); + } + break; +#ifdef HAVE_LONG_LONG + case TYPE_LONGLONGINT: + { + long long int arg = a.arg[dp->arg_index].a.a_longlongint; + SNPRINTF_BUF (arg); + } + break; + case TYPE_ULONGLONGINT: + { + unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint; + SNPRINTF_BUF (arg); + } + break; +#endif + case TYPE_DOUBLE: + { + double arg = a.arg[dp->arg_index].a.a_double; + SNPRINTF_BUF (arg); + } + break; +#ifdef HAVE_LONG_DOUBLE + case TYPE_LONGDOUBLE: + { + long double arg = a.arg[dp->arg_index].a.a_longdouble; + SNPRINTF_BUF (arg); + } + break; +#endif + case TYPE_CHAR: + { + int arg = a.arg[dp->arg_index].a.a_char; + SNPRINTF_BUF (arg); + } + break; +#ifdef HAVE_WINT_T + case TYPE_WIDE_CHAR: + { + wint_t arg = a.arg[dp->arg_index].a.a_wide_char; + SNPRINTF_BUF (arg); + } + break; +#endif + case TYPE_STRING: + { + const char *arg = a.arg[dp->arg_index].a.a_string; + SNPRINTF_BUF (arg); + } + break; +#ifdef HAVE_WCHAR_T + case TYPE_WIDE_STRING: + { + const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string; + SNPRINTF_BUF (arg); + } + break; +#endif + case TYPE_POINTER: + { + void *arg = a.arg[dp->arg_index].a.a_pointer; + SNPRINTF_BUF (arg); + } + break; + default: + abort (); + } + +#if USE_SNPRINTF + /* Portability: Not all implementations of snprintf() + are ISO C 99 compliant. Determine the number of + bytes that snprintf() has produced or would have + produced. */ + if (count >= 0) + { + /* Verify that snprintf() has NUL-terminated its + result. */ + if (count < maxlen && result[length + count] != '\0') + abort (); + /* Portability hack. */ + if (retcount > count) + count = retcount; + } + else + { + /* snprintf() doesn't understand the '%n' + directive. */ + if (p[1] != '\0') + { + /* Don't use the '%n' directive; instead, look + at the snprintf() return value. */ + p[1] = '\0'; + continue; + } + else + { + /* Look at the snprintf() return value. */ + if (retcount < 0) + { + /* HP-UX 10.20 snprintf() is doubly deficient: + It doesn't understand the '%n' directive, + *and* it returns -1 (rather than the length + that would have been required) when the + buffer is too small. */ + size_t bigger_need = + xsum (xtimes (allocated, 2), 12); + ENSURE_ALLOCATION (bigger_need); + continue; + } + else + count = retcount; + } + } +#endif + + /* Attempt to handle failure. */ + if (count < 0) + { + if (!(result == resultbuf || result == NULL)) + free (result); + if (buf_malloced != NULL) + free (buf_malloced); + CLEANUP (); + errno = EINVAL; + return NULL; + } + +#if !USE_SNPRINTF + if (count >= tmp_length) + /* tmp_length was incorrectly calculated - fix the + code above! */ + abort (); +#endif + + /* Make room for the result. */ + if (count >= maxlen) + { + /* Need at least count bytes. But allocate + proportionally, to avoid looping eternally if + snprintf() reports a too small count. */ + size_t n = + xmax (xsum (length, count), xtimes (allocated, 2)); + + ENSURE_ALLOCATION (n); +#if USE_SNPRINTF + continue; +#endif + } + +#if USE_SNPRINTF + /* The snprintf() result did fit. */ +#else + /* Append the sprintf() result. */ + memcpy (result + length, tmp, count * sizeof (CHAR_T)); + if (tmp != tmpbuf) + free (tmp); +#endif + + length += count; + break; + } + } + } + } + + /* Add the final NUL. */ + ENSURE_ALLOCATION (xsum (length, 1)); + result[length] = '\0'; + + if (result != resultbuf && length + 1 < allocated) + { + /* Shrink the allocated memory if possible. */ + CHAR_T *memory; + + memory = (CHAR_T *) realloc (result, (length + 1) * sizeof (CHAR_T)); + if (memory != NULL) + result = memory; + } + + if (buf_malloced != NULL) + free (buf_malloced); + CLEANUP (); + *lengthp = length; + return result; + + out_of_memory: + if (!(result == resultbuf || result == NULL)) + free (result); + if (buf_malloced != NULL) + free (buf_malloced); + out_of_memory_1: + CLEANUP (); + errno = ENOMEM; + return NULL; + } +} + +#undef SNPRINTF +#undef USE_SNPRINTF +#undef PRINTF_PARSE +#undef DIRECTIVES +#undef DIRECTIVE +#undef CHAR_T +#undef VASNPRINTF diff --git a/intl/vasnprintf.h b/intl/vasnprintf.h new file mode 100644 index 0000000..65f1bc1 --- /dev/null +++ b/intl/vasnprintf.h @@ -0,0 +1,61 @@ +/* vsprintf with automatic memory allocation. + Copyright (C) 2002-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _VASNPRINTF_H +#define _VASNPRINTF_H + +/* Get va_list. */ +#include + +/* Get size_t. */ +#include + +#ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ +# define __attribute__(Spec) /* empty */ +# endif +/* The __-protected variants of `format' and `printf' attributes + are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) +# define __format__ format +# define __printf__ printf +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Write formatted output to a string dynamically allocated with malloc(). + You can pass a preallocated buffer for the result in RESULTBUF and its + size in *LENGTHP; otherwise you pass RESULTBUF = NULL. + If successful, return the address of the string (this may be = RESULTBUF + if no dynamic memory allocation was necessary) and set *LENGTHP to the + number of resulting bytes, excluding the trailing NUL. Upon error, set + errno and return NULL. */ +extern char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...) + __attribute__ ((__format__ (__printf__, 3, 4))); +extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args) + __attribute__ ((__format__ (__printf__, 3, 0))); + +#ifdef __cplusplus +} +#endif + +#endif /* _VASNPRINTF_H */ diff --git a/intl/vasnwprintf.h b/intl/vasnwprintf.h new file mode 100644 index 0000000..d3cef4c --- /dev/null +++ b/intl/vasnwprintf.h @@ -0,0 +1,46 @@ +/* vswprintf with automatic memory allocation. + Copyright (C) 2002-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _VASNWPRINTF_H +#define _VASNWPRINTF_H + +/* Get va_list. */ +#include + +/* Get wchar_t, size_t. */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Write formatted output to a string dynamically allocated with malloc(). + You can pass a preallocated buffer for the result in RESULTBUF and its + size in *LENGTHP; otherwise you pass RESULTBUF = NULL. + If successful, return the address of the string (this may be = RESULTBUF + if no dynamic memory allocation was necessary) and set *LENGTHP to the + number of resulting bytes, excluding the trailing NUL. Upon error, set + errno and return NULL. */ +extern wchar_t * asnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, ...); +extern wchar_t * vasnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, va_list args); + +#ifdef __cplusplus +} +#endif + +#endif /* _VASNWPRINTF_H */ diff --git a/intl/wprintf-parse.h b/intl/wprintf-parse.h new file mode 100644 index 0000000..24a2cfc --- /dev/null +++ b/intl/wprintf-parse.h @@ -0,0 +1,75 @@ +/* Parse printf format string. + Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _WPRINTF_PARSE_H +#define _WPRINTF_PARSE_H + +#include "printf-args.h" + + +/* Flags */ +#define FLAG_GROUP 1 /* ' flag */ +#define FLAG_LEFT 2 /* - flag */ +#define FLAG_SHOWSIGN 4 /* + flag */ +#define FLAG_SPACE 8 /* space flag */ +#define FLAG_ALT 16 /* # flag */ +#define FLAG_ZERO 32 + +/* arg_index value indicating that no argument is consumed. */ +#define ARG_NONE (~(size_t)0) + +/* A parsed directive. */ +typedef struct +{ + const wchar_t* dir_start; + const wchar_t* dir_end; + int flags; + const wchar_t* width_start; + const wchar_t* width_end; + size_t width_arg_index; + const wchar_t* precision_start; + const wchar_t* precision_end; + size_t precision_arg_index; + wchar_t conversion; /* d i o u x X f e E g G c s p n U % but not C S */ + size_t arg_index; +} +wchar_t_directive; + +/* A parsed format string. */ +typedef struct +{ + size_t count; + wchar_t_directive *dir; + size_t max_width_length; + size_t max_precision_length; +} +wchar_t_directives; + + +/* Parses the format string. Fills in the number N of directives, and fills + in directives[0], ..., directives[N-1], and sets directives[N].dir_start + to the end of the format string. Also fills in the arg_type fields of the + arguments and the needed count of arguments. */ +#ifdef STATIC +STATIC +#else +extern +#endif +int wprintf_parse (const wchar_t *format, wchar_t_directives *d, arguments *a); + +#endif /* _WPRINTF_PARSE_H */ diff --git a/intl/xsize.h b/intl/xsize.h new file mode 100644 index 0000000..362e24b --- /dev/null +++ b/intl/xsize.h @@ -0,0 +1,109 @@ +/* xsize.h -- Checked size_t computations. + + Copyright (C) 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _XSIZE_H +#define _XSIZE_H + +/* Get size_t. */ +#include + +/* Get SIZE_MAX. */ +#include +#if HAVE_STDINT_H +# include +#endif + +/* The size of memory objects is often computed through expressions of + type size_t. Example: + void* p = malloc (header_size + n * element_size). + These computations can lead to overflow. When this happens, malloc() + returns a piece of memory that is way too small, and the program then + crashes while attempting to fill the memory. + To avoid this, the functions and macros in this file check for overflow. + The convention is that SIZE_MAX represents overflow. + malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc + implementation that uses mmap --, it's recommended to use size_overflow_p() + or size_in_bounds_p() before invoking malloc(). + The example thus becomes: + size_t size = xsum (header_size, xtimes (n, element_size)); + void *p = (size_in_bounds_p (size) ? malloc (size) : NULL); +*/ + +/* Convert an arbitrary value >= 0 to type size_t. */ +#define xcast_size_t(N) \ + ((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX) + +/* Sum of two sizes, with overflow check. */ +static inline size_t +#if __GNUC__ >= 3 +__attribute__ ((__pure__)) +#endif +xsum (size_t size1, size_t size2) +{ + size_t sum = size1 + size2; + return (sum >= size1 ? sum : SIZE_MAX); +} + +/* Sum of three sizes, with overflow check. */ +static inline size_t +#if __GNUC__ >= 3 +__attribute__ ((__pure__)) +#endif +xsum3 (size_t size1, size_t size2, size_t size3) +{ + return xsum (xsum (size1, size2), size3); +} + +/* Sum of four sizes, with overflow check. */ +static inline size_t +#if __GNUC__ >= 3 +__attribute__ ((__pure__)) +#endif +xsum4 (size_t size1, size_t size2, size_t size3, size_t size4) +{ + return xsum (xsum (xsum (size1, size2), size3), size4); +} + +/* Maximum of two sizes, with overflow check. */ +static inline size_t +#if __GNUC__ >= 3 +__attribute__ ((__pure__)) +#endif +xmax (size_t size1, size_t size2) +{ + /* No explicit check is needed here, because for any n: + max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX. */ + return (size1 >= size2 ? size1 : size2); +} + +/* Multiplication of a count with an element size, with overflow check. + The count must be >= 0 and the element size must be > 0. + This is a macro, not an inline function, so that it works correctly even + when N is of a wider tupe and N > SIZE_MAX. */ +#define xtimes(N, ELSIZE) \ + ((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX) + +/* Check for overflow. */ +#define size_overflow_p(SIZE) \ + ((SIZE) == SIZE_MAX) +/* Check against overflow. */ +#define size_in_bounds_p(SIZE) \ + ((SIZE) != SIZE_MAX) + +#endif /* _XSIZE_H */ diff --git a/ltmain.sh b/ltmain.sh new file mode 100755 index 0000000..950feee --- /dev/null +++ b/ltmain.sh @@ -0,0 +1,8406 @@ +# Generated from ltmain.m4sh. + +# ltmain.sh (GNU libtool) 2.2.6b +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool 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; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [OPTION]... [MODE-ARG]... +# +# Provide generalized library-building support services. +# +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print informational messages (default) +# --version print version information +# -h, --help print short or long help message +# +# MODE must be one of the following: +# +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory +# +# MODE-ARGS vary depending on the MODE. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.2.6b +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=2.2.6b +TIMESTAMP="" +package_revision=1.3018 + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# NLS nuisances: We save the old values to restore during execute mode. +# Only set LANG and LC_ALL to C if already set. +# These must not be set unconditionally because not all systems understand +# e.g. LANG=C (notably SCO). +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done + +$lt_unset CDPATH + + + + + +: ${CP="cp -f"} +: ${ECHO="echo"} +: ${EGREP="/usr/bin/grep -E"} +: ${FGREP="/usr/bin/grep -F"} +: ${GREP="/usr/bin/grep"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SED="/usr/bin/sed"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + +# Generated shell functions inserted here. + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# The name of this program: +# In the unlikely event $progname began with a '-', it would play havoc with +# func_echo (imagine progname=-n), so we prepend ./ in that case: +func_dirname_and_basename "$progpath" +progname=$func_basename_result +case $progname in + -*) progname=./$progname ;; +esac + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=: + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed="${SED}"' -e 1s/^X//' +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname${mode+: }$mode: $*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"` + done + my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "X$my_tmpdir" | $Xsed +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "X$1" | $Xsed \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + + + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $SED -n '/^# Usage:/,/# -h/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + $ECHO + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help +# Echo long help message to standard output and exit. +func_help () +{ + $SED -n '/^# Usage:/,/# Report bugs to/ { + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ + p + }' < "$progpath" + exit $? +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + func_error "missing argument for $1" + exit_cmd=exit +} + +exit_cmd=: + + + + + +# Check that we have a working $ECHO. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell, and then maybe $ECHO will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# Parse options once, thoroughly. This comes as soon as possible in +# the script to make things like `libtool --version' happen quickly. +{ + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Parse non-mode specific arguments: + while test "$#" -gt 0; do + opt="$1" + shift + + case $opt in + --config) func_config ;; + + --debug) preserve_args="$preserve_args $opt" + func_echo "enabling shell trace mode" + opt_debug='set -x' + $opt_debug + ;; + + -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break + execute_dlfiles="$execute_dlfiles $1" + shift + ;; + + --dry-run | -n) opt_dry_run=: ;; + --features) func_features ;; + --finish) mode="finish" ;; + + --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break + case $1 in + # Valid mode arguments: + clean) ;; + compile) ;; + execute) ;; + finish) ;; + install) ;; + link) ;; + relink) ;; + uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; + esac + + mode="$1" + shift + ;; + + --preserve-dup-deps) + opt_duplicate_deps=: ;; + + --quiet|--silent) preserve_args="$preserve_args $opt" + opt_silent=: + ;; + + --verbose| -v) preserve_args="$preserve_args $opt" + opt_silent=false + ;; + + --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break + preserve_args="$preserve_args $opt $1" + func_enable_tag "$1" # tagname is set here + shift + ;; + + # Separate optargs to long options: + -dlopen=*|--mode=*|--tag=*) + func_opt_split "$opt" + set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"} + shift + ;; + + -\?|-h) func_usage ;; + --help) opt_help=: ;; + --version) func_version ;; + + -*) func_fatal_help "unrecognized option \`$opt'" ;; + + *) nonopt="$opt" + break + ;; + esac + done + + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_duplicate_deps + ;; + esac + + # Having warned about all mis-specified options, bail out if + # anything was wrong. + $exit_cmd $EXIT_FAILURE +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +## ----------- ## +## Main. ## +## ----------- ## + +$opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + test -z "$mode" && func_fatal_error "error: you must specify a MODE." + + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$mode' for more information." +} + + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_ltwrapper_scriptname_result="" + if func_ltwrapper_executable_p "$1"; then + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" + fi +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" + done + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" + done + case "$@ " in + " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T <?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + removelist="$removelist $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + removelist="$removelist $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + command="$command -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + command="$command -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command="$command$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { +test "$mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode \`$mode'" + ;; + esac + + $ECHO + $ECHO "Try \`$progname --help' for more information about other modes." + + exit $? +} + + # Now that we've collected a possible --mode arg, show help if necessary + $opt_help && func_mode_help + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_quote_for_eval "$file" + args="$args $func_quote_for_eval_result" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + $ECHO "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi +} + +test "$mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + $ECHO "X----------------------------------------------------------------------" | $Xsed + $ECHO "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + $ECHO + $ECHO "If you ever happen to want to link against installed libraries" + $ECHO "in a given directory, LIBDIR, you must either use libtool, and" + $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'" + $ECHO "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + $ECHO " - add LIBDIR to the \`$shlibpath_var' environment variable" + $ECHO " during execution" + fi + if test -n "$runpath_var"; then + $ECHO " - add LIBDIR to the \`$runpath_var' environment variable" + $ECHO " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + $ECHO " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + $ECHO + + $ECHO "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual" + $ECHO "pages." + ;; + *) + $ECHO "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + $ECHO "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS +} + +test "$mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $ECHO "X$nonopt" | $GREP shtool >/dev/null; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + install_prog="$install_prog$func_quote_for_eval_result" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + install_prog="$install_prog $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_verbose "extracting global C symbols from \`$progfile'" + $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + $ECHO >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +" + case $host in + *cygwin* | *mingw* | *cegcc* ) + $ECHO >> "$output_objdir/$my_dlsyms" "\ +/* DATA imports from DLLs on WIN32 con't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs. */" + lt_dlsym_const= ;; + *osf5*) + echo >> "$output_objdir/$my_dlsyms" "\ +/* This system does not cope well with relocations in const data */" + lt_dlsym_const= ;; + *) + lt_dlsym_const=const ;; + esac + + $ECHO >> "$output_objdir/$my_dlsyms" "\ +extern $lt_dlsym_const lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +$lt_dlsym_const lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + $ECHO >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) symtab_cflags="$symtab_cflags $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?' + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + + +# func_emit_wrapper_part1 [arg=no] +# +# Emit the first part of a libtool wrapper script on stdout. +# For more information, see the description associated with +# func_emit_wrapper(), below. +func_emit_wrapper_part1 () +{ + func_emit_wrapper_part1_arg1=no + if test -n "$1" ; then + func_emit_wrapper_part1_arg1=$1 + fi + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + ECHO=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$ECHO works! + : + else + # Restart under the correct shell, and then maybe \$ECHO will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $ECHO "\ + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done +" +} +# end: func_emit_wrapper_part1 + +# func_emit_wrapper_part2 [arg=no] +# +# Emit the second part of a libtool wrapper script on stdout. +# For more information, see the description associated with +# func_emit_wrapper(), below. +func_emit_wrapper_part2 () +{ + func_emit_wrapper_part2_arg1=no + if test -n "$1" ; then + func_emit_wrapper_part2_arg1=$1 + fi + + $ECHO "\ + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} +# end: func_emit_wrapper_part2 + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=no + if test -n "$1" ; then + func_emit_wrapper_arg1=$1 + fi + + # split this up so that func_emit_cwrapperexe_src + # can call each part independently. + func_emit_wrapper_part1 "${func_emit_wrapper_arg1}" + func_emit_wrapper_part2 "${func_emit_wrapper_arg1}" +} + + +# func_to_host_path arg +# +# Convert paths to host format when used with build tools. +# Intended for use with "native" mingw (where libtool itself +# is running under the msys shell), or in the following cross- +# build environments: +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# where wine is equipped with the `winepath' executable. +# In the native mingw case, the (msys) shell automatically +# converts paths for any non-msys applications it launches, +# but that facility isn't available from inside the cwrapper. +# Similar accommodations are necessary for $host mingw and +# $build cygwin. Calling this function does no harm for other +# $host/$build combinations not listed above. +# +# ARG is the path (on $build) that should be converted to +# the proper representation for $host. The result is stored +# in $func_to_host_path_result. +func_to_host_path () +{ + func_to_host_path_result="$1" + if test -n "$1" ; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + case $build in + *mingw* ) # actually, msys + # awkward: cmd appends spaces to result + lt_sed_strip_trailing_spaces="s/[ ]*\$//" + func_to_host_path_tmp1=`( cmd //c echo "$1" |\ + $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_path_tmp1=`cygpath -w "$1"` + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # Unfortunately, winepath does not exit with a non-zero + # error code, so we are forced to check the contents of + # stdout. On the other hand, if the command is not + # found, the shell will set an exit code of 127 and print + # *an error message* to stdout. So we must check for both + # error code of zero AND non-empty stdout, which explains + # the odd construction: + func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null` + if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + else + # Allow warning below. + func_to_host_path_result="" + fi + ;; + esac + if test -z "$func_to_host_path_result" ; then + func_error "Could not determine host path corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_path_result="$1" + fi + ;; + esac + fi +} +# end: func_to_host_path + +# func_to_host_pathlist arg +# +# Convert pathlists to host format when used with build tools. +# See func_to_host_path(), above. This function supports the +# following $build/$host combinations (but does no harm for +# combinations not listed here): +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# +# Path separators are also converted from $build format to +# $host format. If ARG begins or ends with a path separator +# character, it is preserved (but converted to $host format) +# on output. +# +# ARG is a pathlist (on $build) that should be converted to +# the proper representation on $host. The result is stored +# in $func_to_host_pathlist_result. +func_to_host_pathlist () +{ + func_to_host_pathlist_result="$1" + if test -n "$1" ; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_to_host_pathlist_tmp2="$1" + # Once set for this call, this variable should not be + # reassigned. It is used in tha fallback case. + func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e 's|^:*||' -e 's|:*$||'` + case $build in + *mingw* ) # Actually, msys. + # Awkward: cmd appends spaces to result. + lt_sed_strip_trailing_spaces="s/[ ]*\$//" + func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\ + $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"` + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # unfortunately, winepath doesn't convert pathlists + func_to_host_pathlist_result="" + func_to_host_pathlist_oldIFS=$IFS + IFS=: + for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do + IFS=$func_to_host_pathlist_oldIFS + if test -n "$func_to_host_pathlist_f" ; then + func_to_host_path "$func_to_host_pathlist_f" + if test -n "$func_to_host_path_result" ; then + if test -z "$func_to_host_pathlist_result" ; then + func_to_host_pathlist_result="$func_to_host_path_result" + else + func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result" + fi + fi + fi + IFS=: + done + IFS=$func_to_host_pathlist_oldIFS + ;; + esac + if test -z "$func_to_host_pathlist_result" ; then + func_error "Could not determine the host path(s) corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This may break if $1 contains DOS-style drive + # specifications. The fix is not to complicate the expression + # below, but for the user to provide a working wine installation + # with winepath so that path translation in the cross-to-mingw + # case works properly. + lt_replace_pathsep_nix_to_dos="s|:|;|g" + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\ + $SED -e "$lt_replace_pathsep_nix_to_dos"` + fi + # Now, add the leading and trailing path separators back + case "$1" in + :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result" + ;; + esac + case "$1" in + *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;" + ;; + esac + ;; + esac + fi +} +# end: func_to_host_pathlist + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +# define setmode _setmode +#else +# include +# include +# ifdef __CYGWIN__ +# include +# define HAVE_SETENV +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +#ifdef _MSC_VER +# define S_IXUSR _S_IEXEC +# define stat _stat +# ifndef _INTPTR_T_DEFINED +# define intptr_t int +# endif +#endif + +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifdef __CYGWIN__ +# define FOPEN_WB "wb" +#endif + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#undef LTWRAPPER_DEBUGPRINTF +#if defined DEBUGWRAPPER +# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args +static void +ltwrapper_debugprintf (const char *fmt, ...) +{ + va_list args; + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); +} +#else +# define LTWRAPPER_DEBUGPRINTF(args) +#endif + +const char *program_name = NULL; + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_fatal (const char *message, ...); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_opt_process_env_set (const char *arg); +void lt_opt_process_env_prepend (const char *arg); +void lt_opt_process_env_append (const char *arg); +int lt_split_name_value (const char *arg, char** name, char** value); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); + +static const char *script_text_part1 = +EOF + + func_emit_wrapper_part1 yes | + $SED -e 's/\([\\"]\)/\\\1/g' \ + -e 's/^/ "/' -e 's/$/\\n"/' + echo ";" + cat <"))); + for (i = 0; i < newargc; i++) + { + LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : ""))); + } + +EOF + + case $host_os in + mingw*) + cat <<"EOF" + /* execv doesn't actually work on mingw as expected on unix */ + rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); + if (rval == -1) + { + /* failed to start process */ + LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno)); + return 127; + } + return rval; +EOF + ;; + *) + cat <<"EOF" + execv (lt_argv_zero, newargz); + return rval; /* =127, but avoids unused variable warning */ +EOF + ;; + esac + + cat <<"EOF" +} + +void * +xmalloc (size_t num) +{ + void *p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), + string) : NULL; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char) name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable (const char *path) +{ + struct stat st; + + LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n", + path ? (*path ? path : "EMPTY!") : "NULL!")); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n", + path ? (*path ? path : "EMPTY!") : "NULL!")); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n", + wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!")); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n", + tmp_pathspec)); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + char *errstr = strerror (errno); + lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal ("Could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} + +void +lt_setenv (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n", + (name ? name : ""), + (value ? value : ""))); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +int +lt_split_name_value (const char *arg, char** name, char** value) +{ + const char *p; + int len; + if (!arg || !*arg) + return 1; + + p = strchr (arg, (int)'='); + + if (!p) + return 1; + + *value = xstrdup (++p); + + len = strlen (arg) - strlen (*value); + *name = XMALLOC (char, len); + strncpy (*name, arg, len-1); + (*name)[len - 1] = '\0'; + + return 0; +} + +void +lt_opt_process_env_set (const char *arg) +{ + char *name = NULL; + char *value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg); + } + + lt_setenv (name, value); + XFREE (name); + XFREE (value); +} + +void +lt_opt_process_env_prepend (const char *arg) +{ + char *name = NULL; + char *value = NULL; + char *new_value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg); + } + + new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + XFREE (name); + XFREE (value); +} + +void +lt_opt_process_env_append (const char *arg) +{ + char *name = NULL; + char *value = NULL; + char *new_value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg); + } + + new_value = lt_extend_str (getenv (name), value, 1); + lt_setenv (name, new_value); + XFREE (new_value); + XFREE (name); + XFREE (value); +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + (name ? name : ""), + (value ? value : ""))); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + (name ? name : ""), + (value ? value : ""))); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + + +EOF +} +# end: func_emit_cwrapperexe_src + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) deplibs="$deplibs $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + weak_libs="$weak_libs $arg" + prev= + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname '-L' '' "$arg" + dir=$func_stripname_result + if test -z "$dir"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot) + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + arg="$arg $wl$func_quote_for_eval_result" + compiler_flags="$compiler_flags $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + arg="$arg $wl$func_quote_for_eval_result" + compiler_flags="$compiler_flags $wl$func_quote_for_eval_result" + linker_flags="$linker_flags $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -F/path gives path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_duplicate_deps ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + case $lib in + *.la) func_source "$lib" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"` + case " $weak_libs " in + *" $deplib_base "*) ;; + *) deplibs="$deplibs $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + dir=$func_stripname_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $ECHO + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because the file extensions .$libext of this argument makes me believe" + $ECHO "*** that it is just a static archive that I should not use here." + else + $ECHO + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) temp_rpath="$temp_rpath$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + notinst_deplibs="$notinst_deplibs $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + $ECHO + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $ECHO + $ECHO "*** And there doesn't seem to be a static archive available" + $ECHO "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $ECHO + $ECHO "*** Warning: This system can not link to static lib archive $lib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $ECHO "*** But as you try to build a module library, libtool will still create " + $ECHO "*** a static module, that should work as long as the dlopening application" + $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $ECHO + $ECHO "*** However, this would only work if libtool was able to extract symbol" + $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" + $ECHO "*** not find such a program. So, this module is probably useless." + $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_dirname "$deplib" "" "." + dir="$func_dirname_result" + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + $ECHO + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + libobjs="$libobjs $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"` + # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"` + # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs="$deplibs -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $ECHO + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $ECHO + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \ + -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"` + done + fi + if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' | + $GREP . >/dev/null; then + $ECHO + if test "X$deplibs_check_method" = "Xnone"; then + $ECHO "*** Warning: inter-library dependencies are not supported in this platform." + else + $ECHO "*** Warning: inter-library dependencies are not known to be supported." + fi + $ECHO "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $ECHO + $ECHO "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + $ECHO "*** a static module, that should work as long as the dlopening" + $ECHO "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $ECHO + $ECHO "*** However, this would only work if libtool was able to extract symbol" + $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" + $ECHO "*** not find such a program. So, this module is probably useless." + $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $ECHO "*** The inter-library dependencies that have been dropped here will be" + $ECHO "*** automatically added whenever a program is linked with this library" + $ECHO "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + $ECHO + $ECHO "*** Since this library must not contain undefined symbols," + $ECHO "*** because either the platform does not support them or" + $ECHO "*** it was explicitly requested with -no-undefined," + $ECHO "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + delfiles="$delfiles $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + func_len " $cmd" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$libobjs $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + output_la=`$ECHO "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + $ECHO 'INPUT (' > $output + for obj in $save_libobjs + do + $ECHO "$obj" >> $output + done + $ECHO ')' >> $output + delfiles="$delfiles $output" + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + $ECHO "$obj" >> $output + done + delfiles="$delfiles $output" + output=$firstobj\"$file_list_spec$output\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + delfiles="$delfiles $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $dlprefiles + libobjs="$libobjs $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *cegcc) + # Disable wrappers for cegcc, we are cross compiling anyway. + wrappers_required=no + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $ECHO for shipping. + if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + oldobjs="$oldobjs $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $dlprefiles + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $ECHO "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + newdlfiles="$newdlfiles $libdir/$name" + ;; + *) newdlfiles="$newdlfiles $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + newdlprefiles="$newdlprefiles $libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$mode" = link || test "$mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + RM="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) RM="$RM $arg"; rmforce=yes ;; + -*) RM="$RM $arg" ;; + *) files="$files $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + rmfiles="$rmfiles $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$mode" = uninstall || test "$mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 + diff --git a/m4/codeset.m4 b/m4/codeset.m4 new file mode 100644 index 0000000..59535eb --- /dev/null +++ b/m4/codeset.m4 @@ -0,0 +1,23 @@ +# codeset.m4 serial AM1 (gettext-0.10.40) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([AM_LANGINFO_CODESET], +[ + AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, + [AC_TRY_LINK([#include ], + [char* cs = nl_langinfo(CODESET);], + am_cv_langinfo_codeset=yes, + am_cv_langinfo_codeset=no) + ]) + if test $am_cv_langinfo_codeset = yes; then + AC_DEFINE(HAVE_LANGINFO_CODESET, 1, + [Define if you have and nl_langinfo(CODESET).]) + fi +]) diff --git a/m4/gettext.m4 b/m4/gettext.m4 new file mode 100644 index 0000000..a374f03 --- /dev/null +++ b/m4/gettext.m4 @@ -0,0 +1,487 @@ +# gettext.m4 serial 28 (gettext-0.13) +dnl Copyright (C) 1995-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2003. + +dnl Macro to add for using GNU gettext. + +dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). +dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The +dnl default (if it is not specified or empty) is 'no-libtool'. +dnl INTLSYMBOL should be 'external' for packages with no intl directory, +dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. +dnl If INTLSYMBOL is 'use-libtool', then a libtool library +dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, +dnl depending on --{enable,disable}-{shared,static} and on the presence of +dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library +dnl $(top_builddir)/intl/libintl.a will be created. +dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext +dnl implementations (in libc or libintl) without the ngettext() function +dnl will be ignored. If NEEDSYMBOL is specified and is +dnl 'need-formatstring-macros', then GNU gettext implementations that don't +dnl support the ISO C 99 formatstring macros will be ignored. +dnl INTLDIR is used to find the intl libraries. If empty, +dnl the value `$(top_builddir)/intl/' is used. +dnl +dnl The result of the configuration is one of three cases: +dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled +dnl and used. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 2) GNU gettext has been found in the system's C library. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 3) No internationalization, always use English msgid. +dnl Catalog format: none +dnl Catalog extension: none +dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. +dnl The use of .gmo is historical (it was needed to avoid overwriting the +dnl GNU format catalogs when building on a platform with an X/Open gettext), +dnl but we keep it in order not to force irrelevant filename changes on the +dnl maintainers. +dnl +AC_DEFUN([AM_GNU_GETTEXT], +[ + dnl Argument checking. + ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , + [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT +])])])])]) + ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , + [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT +])])])]) + define(gt_included_intl, ifelse([$1], [external], [no], [yes])) + define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], [])) + + AC_REQUIRE([AM_PO_SUBDIRS])dnl + ifelse(gt_included_intl, yes, [ + AC_REQUIRE([AM_INTL_SUBDIR])dnl + ]) + + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Sometimes libintl requires libiconv, so first search for libiconv. + dnl Ideally we would do this search only after the + dnl if test "$USE_NLS" = "yes"; then + dnl if test "$gt_cv_func_gnugettext_libc" != "yes"; then + dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT + dnl the configure script would need to contain the same shell code + dnl again, outside any 'if'. There are two solutions: + dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. + dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. + dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not + dnl documented, we avoid it. + ifelse(gt_included_intl, yes, , [ + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + ]) + + dnl Set USE_NLS. + AM_NLS + + ifelse(gt_included_intl, yes, [ + BUILD_INCLUDED_LIBINTL=no + USE_INCLUDED_LIBINTL=no + ]) + LIBINTL= + LTLIBINTL= + POSUB= + + dnl If we use NLS figure out what method + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + ifelse(gt_included_intl, yes, [ + AC_MSG_CHECKING([whether included gettext is requested]) + AC_ARG_WITH(included-gettext, + [ --with-included-gettext use the GNU gettext library included here], + nls_cv_force_use_gnu_gettext=$withval, + nls_cv_force_use_gnu_gettext=no) + AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + ]) + dnl User does not insist on using GNU NLS library. Figure out what + dnl to use. If GNU gettext is available we use this. Else we have + dnl to fall back to GNU NLS library. + + dnl Add a version number to the cache macros. + define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1))) + define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc]) + define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl]) + + AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc, + [AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings;], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings], + gt_cv_func_gnugettext_libc=yes, + gt_cv_func_gnugettext_libc=no)]) + + if test "$gt_cv_func_gnugettext_libc" != "yes"; then + dnl Sometimes libintl requires libiconv, so first search for libiconv. + ifelse(gt_included_intl, yes, , [ + AM_ICONV_LINK + ]) + dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL + dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) + dnl because that would add "-liconv" to LIBINTL and LTLIBINTL + dnl even if libiconv doesn't exist. + AC_LIB_LINKFLAGS_BODY([intl]) + AC_CACHE_CHECK([for GNU gettext in libintl], + gt_cv_func_gnugettext_libintl, + [gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + dnl Now see whether libintl exists and does not depend on libiconv. + AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias ();], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], + gt_cv_func_gnugettext_libintl=yes, + gt_cv_func_gnugettext_libintl=no) + dnl Now see whether libintl exists and depends on libiconv. + if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias ();], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], + [LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + gt_cv_func_gnugettext_libintl=yes + ]) + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS"]) + fi + + dnl If an already present or preinstalled GNU gettext() is found, + dnl use it. But if this macro is used in GNU gettext, and GNU + dnl gettext is already preinstalled in libintl, we update this + dnl libintl. (Cf. the install rule in intl/Makefile.in.) + if test "$gt_cv_func_gnugettext_libc" = "yes" \ + || { test "$gt_cv_func_gnugettext_libintl" = "yes" \ + && test "$PACKAGE" != gettext-runtime \ + && test "$PACKAGE" != gettext-tools; }; then + gt_use_preinstalled_gnugettext=yes + else + dnl Reset the values set by searching for libintl. + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + ifelse(gt_included_intl, yes, [ + if test "$gt_use_preinstalled_gnugettext" != "yes"; then + dnl GNU gettext is not found in the C library. + dnl Fall back on included GNU gettext library. + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions used to generate GNU NLS library. + BUILD_INCLUDED_LIBINTL=yes + USE_INCLUDED_LIBINTL=yes + LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV" + LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV" + LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` + fi + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions to use GNU gettext tools. + CATOBJEXT=.gmo + fi + ]) + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + AC_DEFINE(ENABLE_NLS, 1, + [Define to 1 if translation of program messages to the user's native language + is requested.]) + else + USE_NLS=no + fi + fi + + AC_MSG_CHECKING([whether to use NLS]) + AC_MSG_RESULT([$USE_NLS]) + if test "$USE_NLS" = "yes"; then + AC_MSG_CHECKING([where the gettext function comes from]) + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext_libintl" = "yes"; then + gt_source="external libintl" + else + gt_source="libc" + fi + else + gt_source="included intl directory" + fi + AC_MSG_RESULT([$gt_source]) + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext_libintl" = "yes"; then + AC_MSG_CHECKING([how to link with libintl]) + AC_MSG_RESULT([$LIBINTL]) + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) + fi + + dnl For backward compatibility. Some packages may be using this. + AC_DEFINE(HAVE_GETTEXT, 1, + [Define if the GNU gettext() function is already present or preinstalled.]) + AC_DEFINE(HAVE_DCGETTEXT, 1, + [Define if the GNU dcgettext() function is already present or preinstalled.]) + fi + + dnl We need to process the po/ directory. + POSUB=po + fi + + ifelse(gt_included_intl, yes, [ + dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL + dnl to 'yes' because some of the testsuite requires it. + if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then + BUILD_INCLUDED_LIBINTL=yes + fi + + dnl Make all variables we use known to autoconf. + AC_SUBST(BUILD_INCLUDED_LIBINTL) + AC_SUBST(USE_INCLUDED_LIBINTL) + AC_SUBST(CATOBJEXT) + + dnl For backward compatibility. Some configure.ins may be using this. + nls_cv_header_intl= + nls_cv_header_libgt= + + dnl For backward compatibility. Some Makefiles may be using this. + DATADIRNAME=share + AC_SUBST(DATADIRNAME) + + dnl For backward compatibility. Some Makefiles may be using this. + INSTOBJEXT=.mo + AC_SUBST(INSTOBJEXT) + + dnl For backward compatibility. Some Makefiles may be using this. + GENCAT=gencat + AC_SUBST(GENCAT) + + dnl For backward compatibility. Some Makefiles may be using this. + if test "$USE_INCLUDED_LIBINTL" = yes; then + INTLOBJS="\$(GETTOBJS)" + fi + AC_SUBST(INTLOBJS) + + dnl Enable libtool support if the surrounding package wishes it. + INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix + AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) + ]) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLLIBS="$LIBINTL" + AC_SUBST(INTLLIBS) + + dnl Make all documented variables known to autoconf. + AC_SUBST(LIBINTL) + AC_SUBST(LTLIBINTL) + AC_SUBST(POSUB) +]) + + +dnl Checks for all prerequisites of the intl subdirectory, +dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, +dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. +AC_DEFUN([AM_INTL_SUBDIR], +[ + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_MKINSTALLDIRS])dnl + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([AC_ISC_POSIX])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_C_CONST])dnl + AC_REQUIRE([bh_C_SIGNED])dnl + AC_REQUIRE([AC_C_INLINE])dnl + AC_REQUIRE([AC_TYPE_OFF_T])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([jm_AC_TYPE_LONG_LONG])dnl + AC_REQUIRE([gt_TYPE_LONGDOUBLE])dnl + AC_REQUIRE([gt_TYPE_WCHAR_T])dnl + AC_REQUIRE([gt_TYPE_WINT_T])dnl + AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([jm_AC_HEADER_STDINT_H]) + AC_REQUIRE([gt_TYPE_INTMAX_T]) + AC_REQUIRE([gt_PRINTF_POSIX]) + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + AC_REQUIRE([jm_GLIBC21])dnl + AC_REQUIRE([gt_INTDIV0])dnl + AC_REQUIRE([jm_AC_TYPE_UINTMAX_T])dnl + AC_REQUIRE([gt_HEADER_INTTYPES_H])dnl + AC_REQUIRE([gt_INTTYPES_PRI])dnl + AC_REQUIRE([gl_XSIZE])dnl + + AC_CHECK_TYPE([ptrdiff_t], , + [AC_DEFINE([ptrdiff_t], [long], + [Define as the type of the result of subtracting two pointers, if the system doesn't define it.]) + ]) + AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ +stdlib.h string.h unistd.h sys/param.h]) + AC_CHECK_FUNCS([asprintf fwprintf getcwd getegid geteuid getgid getuid \ +mempcpy munmap putenv setenv setlocale snprintf stpcpy strcasecmp strdup \ +strtoul tsearch wcslen __argz_count __argz_stringify __argz_next \ +__fsetlocking]) + + dnl Use the _snprintf function only if it is declared (because on NetBSD it + dnl is defined as a weak alias of snprintf; we prefer to use the latter). + gt_CHECK_DECL(_snprintf, [#include ]) + gt_CHECK_DECL(_snwprintf, [#include ]) + + dnl Use the *_unlocked functions only if they are declared. + dnl (because some of them were defined without being declared in Solaris + dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built + dnl on Solaris 2.5.1 to run on Solaris 2.6). + dnl Don't use AC_CHECK_DECLS because it isn't supported in autoconf-2.13. + gt_CHECK_DECL(feof_unlocked, [#include ]) + gt_CHECK_DECL(fgets_unlocked, [#include ]) + gt_CHECK_DECL(getc_unlocked, [#include ]) + + case $gt_cv_func_printf_posix in + *yes) HAVE_POSIX_PRINTF=1 ;; + *) HAVE_POSIX_PRINTF=0 ;; + esac + AC_SUBST([HAVE_POSIX_PRINTF]) + if test "$ac_cv_func_asprintf" = yes; then + HAVE_ASPRINTF=1 + else + HAVE_ASPRINTF=0 + fi + AC_SUBST([HAVE_ASPRINTF]) + if test "$ac_cv_func_snprintf" = yes; then + HAVE_SNPRINTF=1 + else + HAVE_SNPRINTF=0 + fi + AC_SUBST([HAVE_SNPRINTF]) + if test "$ac_cv_func_wprintf" = yes; then + HAVE_WPRINTF=1 + else + HAVE_WPRINTF=0 + fi + AC_SUBST([HAVE_WPRINTF]) + + AM_ICONV + AM_LANGINFO_CODESET + if test $ac_cv_header_locale_h = yes; then + AM_LC_MESSAGES + fi + + dnl intl/plural.c is generated from intl/plural.y. It requires bison, + dnl because plural.y uses bison specific features. It requires at least + dnl bison-1.26 because earlier versions generate a plural.c that doesn't + dnl compile. + dnl bison is only needed for the maintainer (who touches plural.y). But in + dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put + dnl the rule in general Makefile. Now, some people carelessly touch the + dnl files or have a broken "make" program, hence the plural.c rule will + dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not + dnl present or too old. + AC_CHECK_PROGS([INTLBISON], [bison]) + if test -z "$INTLBISON"; then + ac_verc_fail=yes + else + dnl Found it, now check the version. + AC_MSG_CHECKING([version of bison]) +changequote(<<,>>)dnl + ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; + 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) +changequote([,])dnl + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; + esac + AC_MSG_RESULT([$ac_prog_version]) + fi + if test $ac_verc_fail = yes; then + INTLBISON=: + fi +]) + + +dnl gt_CHECK_DECL(FUNC, INCLUDES) +dnl Check whether a function is declared. +AC_DEFUN([gt_CHECK_DECL], +[ + AC_CACHE_CHECK([whether $1 is declared], ac_cv_have_decl_$1, + [AC_TRY_COMPILE([$2], [ +#ifndef $1 + char *p = (char *) $1; +#endif +], ac_cv_have_decl_$1=yes, ac_cv_have_decl_$1=no)]) + if test $ac_cv_have_decl_$1 = yes; then + gt_value=1 + else + gt_value=0 + fi + AC_DEFINE_UNQUOTED([HAVE_DECL_]translit($1, [a-z], [A-Z]), [$gt_value], + [Define to 1 if you have the declaration of `$1', and to 0 if you don't.]) +]) + + +dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) +AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) diff --git a/m4/glibc21.m4 b/m4/glibc21.m4 new file mode 100644 index 0000000..9c9f3db --- /dev/null +++ b/m4/glibc21.m4 @@ -0,0 +1,32 @@ +# glibc21.m4 serial 2 (fileutils-4.1.3, gettext-0.10.40) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +# Test for the GNU C Library, version 2.1 or newer. +# From Bruno Haible. + +AC_DEFUN([jm_GLIBC21], + [ + AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, + ac_cv_gnu_library_2_1, + [AC_EGREP_CPP([Lucky GNU user], + [ +#include +#ifdef __GNU_LIBRARY__ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) + Lucky GNU user + #endif +#endif + ], + ac_cv_gnu_library_2_1=yes, + ac_cv_gnu_library_2_1=no) + ] + ) + AC_SUBST(GLIBC21) + GLIBC21="$ac_cv_gnu_library_2_1" + ] +) diff --git a/m4/iconv.m4 b/m4/iconv.m4 new file mode 100644 index 0000000..c5f3579 --- /dev/null +++ b/m4/iconv.m4 @@ -0,0 +1,103 @@ +# iconv.m4 serial AM4 (gettext-0.11.3) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], +[ + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([iconv]) +]) + +AC_DEFUN([AM_ICONV_LINK], +[ + dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and + dnl those with the standalone portable GNU libiconv installed). + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + + dnl Add $INCICONV to CPPFLAGS before performing the following checks, + dnl because if the user has installed libiconv and not disabled its use + dnl via --without-libiconv-prefix, he wants to use it. The first + dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. + am_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) + + AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_func_iconv=yes) + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_lib_iconv=yes + am_cv_func_iconv=yes) + LIBS="$am_save_LIBS" + fi + ]) + if test "$am_cv_func_iconv" = yes; then + AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) + fi + if test "$am_cv_lib_iconv" = yes; then + AC_MSG_CHECKING([how to link with libiconv]) + AC_MSG_RESULT([$LIBICONV]) + else + dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV + dnl either. + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + AC_SUBST(LIBICONV) + AC_SUBST(LTLIBICONV) +]) + +AC_DEFUN([AM_ICONV], +[ + AM_ICONV_LINK + if test "$am_cv_func_iconv" = yes; then + AC_MSG_CHECKING([for iconv declaration]) + AC_CACHE_VAL(am_cv_proto_iconv, [ + AC_TRY_COMPILE([ +#include +#include +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif +], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) + am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + AC_MSG_RESULT([$]{ac_t:- + }[$]am_cv_proto_iconv) + AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, + [Define as const if the declaration of iconv() needs const.]) + fi +]) diff --git a/m4/intdiv0.m4 b/m4/intdiv0.m4 new file mode 100644 index 0000000..55dddcf --- /dev/null +++ b/m4/intdiv0.m4 @@ -0,0 +1,72 @@ +# intdiv0.m4 serial 1 (gettext-0.11.3) +dnl Copyright (C) 2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([gt_INTDIV0], +[ + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + + AC_CACHE_CHECK([whether integer division by zero raises SIGFPE], + gt_cv_int_divbyzero_sigfpe, + [ + AC_TRY_RUN([ +#include +#include + +static void +#ifdef __cplusplus +sigfpe_handler (int sig) +#else +sigfpe_handler (sig) int sig; +#endif +{ + /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ + exit (sig != SIGFPE); +} + +int x = 1; +int y = 0; +int z; +int nan; + +int main () +{ + signal (SIGFPE, sigfpe_handler); +/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */ +#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP) + signal (SIGTRAP, sigfpe_handler); +#endif +/* Linux/SPARC yields signal SIGILL. */ +#if defined (__sparc__) && defined (__linux__) + signal (SIGILL, sigfpe_handler); +#endif + + z = x / y; + nan = y / y; + exit (1); +} +], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no, + [ + # Guess based on the CPU. + case "$host_cpu" in + alpha* | i[34567]86 | m68k | s390*) + gt_cv_int_divbyzero_sigfpe="guessing yes";; + *) + gt_cv_int_divbyzero_sigfpe="guessing no";; + esac + ]) + ]) + case "$gt_cv_int_divbyzero_sigfpe" in + *yes) value=1;; + *) value=0;; + esac + AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value, + [Define if integer division by zero raises signal SIGFPE.]) +]) diff --git a/m4/intmax.m4 b/m4/intmax.m4 new file mode 100644 index 0000000..dfb08cc --- /dev/null +++ b/m4/intmax.m4 @@ -0,0 +1,32 @@ +# intmax.m4 serial 1 (gettext-0.12) +dnl Copyright (C) 2002-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. +dnl Test whether the system has the 'intmax_t' type, but don't attempt to +dnl find a replacement if it is lacking. + +AC_DEFUN([gt_TYPE_INTMAX_T], +[ + AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([jm_AC_HEADER_STDINT_H]) + AC_CACHE_CHECK(for intmax_t, gt_cv_c_intmax_t, + [AC_TRY_COMPILE([ +#include +#include +#if HAVE_STDINT_H_WITH_UINTMAX +#include +#endif +#if HAVE_INTTYPES_H_WITH_UINTMAX +#include +#endif +], [intmax_t x = -1;], gt_cv_c_intmax_t=yes, gt_cv_c_intmax_t=no)]) + if test $gt_cv_c_intmax_t = yes; then + AC_DEFINE(HAVE_INTMAX_T, 1, + [Define if you have the 'intmax_t' type in or .]) + fi +]) diff --git a/m4/inttypes-pri.m4 b/m4/inttypes-pri.m4 new file mode 100644 index 0000000..fd007c3 --- /dev/null +++ b/m4/inttypes-pri.m4 @@ -0,0 +1,32 @@ +# inttypes-pri.m4 serial 1 (gettext-0.11.4) +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +# Define PRI_MACROS_BROKEN if exists and defines the PRI* +# macros to non-string values. This is the case on AIX 4.3.3. + +AC_DEFUN([gt_INTTYPES_PRI], +[ + AC_REQUIRE([gt_HEADER_INTTYPES_H]) + if test $gt_cv_header_inttypes_h = yes; then + AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken], + gt_cv_inttypes_pri_broken, + [ + AC_TRY_COMPILE([#include +#ifdef PRId32 +char *p = PRId32; +#endif +], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes) + ]) + fi + if test "$gt_cv_inttypes_pri_broken" = yes; then + AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1, + [Define if exists and defines unusable PRI* macros.]) + fi +]) diff --git a/m4/inttypes.m4 b/m4/inttypes.m4 new file mode 100644 index 0000000..ab370ff --- /dev/null +++ b/m4/inttypes.m4 @@ -0,0 +1,27 @@ +# inttypes.m4 serial 1 (gettext-0.11.4) +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_INTTYPES_H if exists and doesn't clash with +# . + +AC_DEFUN([gt_HEADER_INTTYPES_H], +[ + AC_CACHE_CHECK([for inttypes.h], gt_cv_header_inttypes_h, + [ + AC_TRY_COMPILE( + [#include +#include ], + [], gt_cv_header_inttypes_h=yes, gt_cv_header_inttypes_h=no) + ]) + if test $gt_cv_header_inttypes_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H, 1, + [Define if exists and doesn't clash with .]) + fi +]) diff --git a/m4/inttypes_h.m4 b/m4/inttypes_h.m4 new file mode 100644 index 0000000..f342eba --- /dev/null +++ b/m4/inttypes_h.m4 @@ -0,0 +1,28 @@ +# inttypes_h.m4 serial 5 (gettext-0.12) +dnl Copyright (C) 1997-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_INTTYPES_H_WITH_UINTMAX if exists, +# doesn't clash with , and declares uintmax_t. + +AC_DEFUN([jm_AC_HEADER_INTTYPES_H], +[ + AC_CACHE_CHECK([for inttypes.h], jm_ac_cv_header_inttypes_h, + [AC_TRY_COMPILE( + [#include +#include ], + [uintmax_t i = (uintmax_t) -1;], + jm_ac_cv_header_inttypes_h=yes, + jm_ac_cv_header_inttypes_h=no)]) + if test $jm_ac_cv_header_inttypes_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1, + [Define if exists, doesn't clash with , + and declares uintmax_t. ]) + fi +]) diff --git a/m4/isc-posix.m4 b/m4/isc-posix.m4 new file mode 100644 index 0000000..1319dd1 --- /dev/null +++ b/m4/isc-posix.m4 @@ -0,0 +1,26 @@ +# isc-posix.m4 serial 2 (gettext-0.11.2) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +# This file is not needed with autoconf-2.53 and newer. Remove it in 2005. + +# This test replaces the one in autoconf. +# Currently this macro should have the same name as the autoconf macro +# because gettext's gettext.m4 (distributed in the automake package) +# still uses it. Otherwise, the use in gettext.m4 makes autoheader +# give these diagnostics: +# configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX +# configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX + +undefine([AC_ISC_POSIX]) + +AC_DEFUN([AC_ISC_POSIX], + [ + dnl This test replaces the obsolescent AC_ISC_POSIX kludge. + AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"]) + ] +) diff --git a/m4/lcmessage.m4 b/m4/lcmessage.m4 new file mode 100644 index 0000000..ffd4008 --- /dev/null +++ b/m4/lcmessage.m4 @@ -0,0 +1,32 @@ +# lcmessage.m4 serial 3 (gettext-0.11.3) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995. + +# Check whether LC_MESSAGES is available in . + +AC_DEFUN([AM_LC_MESSAGES], +[ + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, + [Define if your file defines LC_MESSAGES.]) + fi +]) diff --git a/m4/lib-ld.m4 b/m4/lib-ld.m4 new file mode 100644 index 0000000..38aeaec --- /dev/null +++ b/m4/lib-ld.m4 @@ -0,0 +1,112 @@ +# lib-ld.m4 serial 3 (gettext-0.13) +dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl Subroutines of libtool.m4, +dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision +dnl with libtool.m4. + +dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. +AC_DEFUN([AC_LIB_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]* | [A-Za-z]:[\\/]*)] + [re_direlt='/[^/][^/]*/\.\./'] + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(acl_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$acl_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_LIB_PROG_LD_GNU +]) diff --git a/m4/lib-link.m4 b/m4/lib-link.m4 new file mode 100644 index 0000000..eeb200d --- /dev/null +++ b/m4/lib-link.m4 @@ -0,0 +1,551 @@ +# lib-link.m4 serial 4 (gettext-0.12) +dnl Copyright (C) 2001-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and +dnl augments the CPPFLAGS variable. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + undefine([Name]) + undefine([NAME]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. If found, it +dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and +dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + LIBS="$LIBS $LIB[]NAME" + AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + undefine([Name]) + undefine([NAME]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, +dnl hardcode_direct, hardcode_minus_L. +AC_DEFUN([AC_LIB_RPATH], +[ + AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS + AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host + AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir + AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + ]) + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + dnl Determine whether the user wants rpath handling at all. + AC_ARG_ENABLE(rpath, + [ --disable-rpath do not hardcode runtime library paths], + :, enable_rpath=yes) +]) + +dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib$1-prefix], +[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib + --without-lib$1-prefix don't search for lib$1 in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi +]) + dnl Search the library and its dependencies in $additional_libdir and + dnl $LDFLAGS. Using breadth-first-seach. + LIB[]NAME= + LTLIB[]NAME= + INC[]NAME= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='$1 $2' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + dnl See if it was already located by an earlier AC_LIB_LINKFLAGS + dnl or AC_LIB_HAVE_LINKFLAGS call. + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" + else + dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined + dnl that this library doesn't exist. So just drop it. + : + fi + else + dnl Search the library lib$name in $additional_libdir and $LDFLAGS + dnl and the already constructed $LIBNAME/$LTLIBNAME. + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + dnl Found the library. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + dnl Linking with a shared library. We attempt to hardcode its + dnl directory into the executable's runpath, unless it's the + dnl standard /usr/lib. + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + dnl No hardcoding is needed. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + dnl The hardcoding into $LIBNAME is system dependent. + if test "$hardcode_direct" = yes; then + dnl Using DIR/libNAME.so during linking hardcodes DIR into the + dnl resulting binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + dnl Rely on "-L$found_dir". + dnl But don't add it if it's already contained in the LDFLAGS + dnl or the already constructed $LIBNAME + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH + dnl here, because this doesn't fit in flags passed to the + dnl compiler. So give up. No hardcoding. This affects only + dnl very old systems. + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + dnl Linking with a static library. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" + else + dnl We shouldn't come here, but anyway it's good to have a + dnl fallback. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" + fi + fi + dnl Assume the include files are nearby. + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + dnl Potentially add $additional_includedir to $INCNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's /usr/local/include and we are using GCC on Linux, + dnl 3. if it's already present in $CPPFLAGS or the already + dnl constructed $INCNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INC[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $INCNAME. + INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + dnl Look for dependencies. + if test -n "$found_la"; then + dnl Read the .la file. It defines the variables + dnl dlname, library_names, old_library, dependency_libs, current, + dnl age, revision, installed, dlopen, dlpreopen, libdir. + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + dnl We use only dependency_libs. + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's /usr/local/lib and we are using GCC on Linux, + dnl 3. if it's already present in $LDFLAGS or the already + dnl constructed $LIBNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LIBNAME. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LTLIBNAME. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + dnl Handle this in the next round. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + dnl Handle this in the next round. Throw away the .la's + dnl directory; it is already contained in a preceding -L + dnl option. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + dnl Most likely an immediate library name. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" + ;; + esac + done + fi + else + dnl Didn't find the library; assume it is in the system directories + dnl known to the linker and runtime loader. (All the system + dnl directories known to the linker should also be known to the + dnl runtime loader, otherwise the system is severely misconfigured.) + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user must + dnl pass all path elements in one option. We can arrange that for a + dnl single library, but not when more than one $LIBNAMEs are used. + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + else + dnl The -rpath options are cumulative. + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) diff --git a/m4/lib-prefix.m4 b/m4/lib-prefix.m4 new file mode 100644 index 0000000..8aff5a9 --- /dev/null +++ b/m4/lib-prefix.m4 @@ -0,0 +1,155 @@ +# lib-prefix.m4 serial 3 (gettext-0.13) +dnl Copyright (C) 2001-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and +dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't +dnl require excessive bracketing. +ifdef([AC_HELP_STRING], +[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], +[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) + +dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed +dnl to access previously installed libraries. The basic assumption is that +dnl a user will want packages to use other packages he previously installed +dnl with the same --prefix option. +dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate +dnl libraries, but is otherwise very convenient. +AC_DEFUN([AC_LIB_PREFIX], +[ + AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib-prefix], +[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib + --without-lib-prefix don't search for libraries in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi +]) + if test $use_additional = yes; then + dnl Potentially add $additional_includedir to $CPPFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's already present in $CPPFLAGS, + dnl 3. if it's /usr/local/include and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + for x in $CPPFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $CPPFLAGS. + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" + fi + fi + fi + fi + dnl Potentially add $additional_libdir to $LDFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's already present in $LDFLAGS, + dnl 3. if it's /usr/local/lib and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + for x in $LDFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LDFLAGS. + LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" + fi + fi + fi + fi + fi +]) + +dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, +dnl acl_final_exec_prefix, containing the values to which $prefix and +dnl $exec_prefix will expand at the end of the configure script. +AC_DEFUN([AC_LIB_PREPARE_PREFIX], +[ + dnl Unfortunately, prefix and exec_prefix get only finally determined + dnl at the end of configure. + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the +dnl variables prefix and exec_prefix bound to the values they will have +dnl at the end of the configure script. +AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], +[ + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + $1 + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" +]) diff --git a/m4/libtool.m4 b/m4/libtool.m4 new file mode 100644 index 0000000..4ff44c8 --- /dev/null +++ b/m4/libtool.m4 @@ -0,0 +1,7365 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool 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; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +]) + +# serial 56 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +m4_defun([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl +_LT_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from `configure', and `config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# `config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain="$ac_aux_dir/ltmain.sh" +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the `libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to `config.status' so that its +# declaration there will have the same value as in `configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "X$" | $Xsed -e "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags="_LT_TAGS"dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into `config.status', and then the shell code to quote escape them in +# for loops in `config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Fix-up fallback echo if it was mangled by the above quoting rules. +case \$lt_ECHO in +*'\\\[$]0 --fallback-echo"')dnl " + lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\` + ;; +esac + +_LT_OUTPUT_LIBTOOL_INIT +]) + + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +cat >"$CONFIG_LT" <<_LTEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate a libtool stub with the current configuration. + +lt_cl_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AS_SHELL_SANITIZE +_AS_PREPARE + +exec AS_MESSAGE_FD>&1 +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2008 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +if test "$no_create" != yes; then + lt_cl_success=: + test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" + exec AS_MESSAGE_LOG_FD>/dev/null + $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false + exec AS_MESSAGE_LOG_FD>>config.log + $lt_cl_success || AS_EXIT(1) +fi +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +_LT_COPYING +_LT_LIBTOOL_TAGS + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_XSI_SHELLFNS + + sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES +# -------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=echo + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX +# ----------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +AC_LINK_IFELSE([AC_LANG_PROGRAM],[ +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_SHELL_INIT + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[_LT_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$lt_ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +ECHO=${lt_ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<_LT_EOF +[$]* +_LT_EOF + exit 0 +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test -z "$lt_ECHO"; then + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if { echo_test_string=`eval $cmd`; } 2>/dev/null && + { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null + then + break + fi + done + fi + + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : + else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$ECHO" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + ECHO='print -r' + elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + ECHO='printf %s\n' + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + ECHO="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + ECHO=echo + fi + fi + fi + fi + fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +lt_ECHO=$ECHO +if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(lt_ECHO) +]) +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], + [An echo program that does not interpret backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" +])# _LT_ENABLE_LOCK + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[AC_CHECK_TOOL(AR, ar, false) +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1]) + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ + = "XX$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line __oline__ "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links="nottested" +if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[[3-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # Some binutils ld are patched to set DT_RUNPATH + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], + [Run-time system search path for libraries]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program which can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program which can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method == "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :) + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC*) + # IBM XL 8.0 on PPC + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl*) + # IBM XL C 8.0/Fortran 10.1 on PPC + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac +AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag= + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], [ + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + ]) + LDFLAGS="$save_LDFLAGS" + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], + [[If ld is used when linking, flag to hardcode $libdir into a binary + during linking. This must work even if $libdir does not exist]]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting ${shlibpath_var} if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [fix_srcfile_path], [1], + [Fix the shell variable $srcfile for the compiler]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report which library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC="$lt_save_CC" +])# _LT_LANG_C_CONFIG + + +# _LT_PROG_CXX +# ------------ +# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++ +# compiler, we have our own version here. +m4_defun([_LT_PROG_CXX], +[ +pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes]) +AC_PROG_CXX +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_CXX + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_CXX], []) + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[AC_REQUIRE([_LT_PROG_CXX])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + gnu*) + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 will use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + xl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=echo + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_TAGVAR(GCC, $1)="$GXX" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +]) +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)="$p" + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)="$p" + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_PROG_F77 +# ------------ +# Since AC_PROG_F77 is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_F77], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes]) +AC_PROG_F77 +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_F77 + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_F77], []) + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_REQUIRE([_LT_PROG_F77])dnl +AC_LANG_PUSH(Fortran 77) + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + CC=${F77-"f77"} + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$G77" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_PROG_FC +# ----------- +# Since AC_PROG_FC is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_FC], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes]) +AC_PROG_FC +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_FC + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_FC], []) + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_REQUIRE([_LT_PROG_FC])dnl +AC_LANG_PUSH(Fortran) + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + CC=${FC-"f95"} + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" +fi # test "$_lt_disable_FC" != yes + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC="$lt_save_CC" +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC="$lt_save_CC" +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +AC_MSG_RESULT([$xsi_shell]) +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PROG_XSI_SHELLFNS +# --------------------- +# Bourne and XSI compatible variants of some useful shell functions. +m4_defun([_LT_PROG_XSI_SHELLFNS], +[case $xsi_shell in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +func_stripname () +{ + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"} +} + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=${1%%=*} + func_opt_split_arg=${1#*=} +} + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=${1%.*}.lo +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=$(( $[*] )) +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=${#1} +} + +_LT_EOF + ;; + *) # Bourne compatible functions. + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + +dnl func_dirname_and_basename +dnl A portable version of this function is already defined in general.m4sh +dnl so there is no need for it here. + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; + esac +} + +# sed scripts: +my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q' +my_sed_long_arg='1s/^-[[^=]]*=//' + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` + func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +} + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'` +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "$[@]"` +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len` +} + +_LT_EOF +esac + +case $lt_shell_append in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]+=\$[2]" +} +_LT_EOF + ;; + *) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]=\$$[1]\$[2]" +} + +_LT_EOF + ;; + esac +]) diff --git a/m4/longdouble.m4 b/m4/longdouble.m4 new file mode 100644 index 0000000..1333d2f --- /dev/null +++ b/m4/longdouble.m4 @@ -0,0 +1,30 @@ +# longdouble.m4 serial 1 (gettext-0.12) +dnl Copyright (C) 2002-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. +dnl Test whether the compiler supports the 'long double' type. +dnl Prerequisite: AC_PROG_CC + +AC_DEFUN([gt_TYPE_LONGDOUBLE], +[ + AC_CACHE_CHECK([for long double], gt_cv_c_long_double, + [if test "$GCC" = yes; then + gt_cv_c_long_double=yes + else + AC_TRY_COMPILE([ + /* The Stardent Vistra knows sizeof(long double), but does not support it. */ + long double foo = 0.0; + /* On Ultrix 4.3 cc, long double is 4 and double is 8. */ + int array [2*(sizeof(long double) >= sizeof(double)) - 1]; + ], , + gt_cv_c_long_double=yes, gt_cv_c_long_double=no) + fi]) + if test $gt_cv_c_long_double = yes; then + AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the 'long double' type.]) + fi +]) diff --git a/m4/longlong.m4 b/m4/longlong.m4 new file mode 100644 index 0000000..d7d7350 --- /dev/null +++ b/m4/longlong.m4 @@ -0,0 +1,25 @@ +# longlong.m4 serial 4 +dnl Copyright (C) 1999-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_LONG_LONG if 'long long' works. + +AC_DEFUN([jm_AC_TYPE_LONG_LONG], +[ + AC_CACHE_CHECK([for long long], ac_cv_type_long_long, + [AC_TRY_LINK([long long ll = 1LL; int i = 63;], + [long long llmax = (long long) -1; + return ll << i | ll >> i | llmax / ll | llmax % ll;], + ac_cv_type_long_long=yes, + ac_cv_type_long_long=no)]) + if test $ac_cv_type_long_long = yes; then + AC_DEFINE(HAVE_LONG_LONG, 1, + [Define if you have the 'long long' type.]) + fi +]) diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4 new file mode 100644 index 0000000..34151a3 --- /dev/null +++ b/m4/ltoptions.m4 @@ -0,0 +1,368 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option `$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [0], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the `shared' and +# `disable-shared' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the `static' and +# `disable-static' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the `fast-install' +# and `disable-fast-install' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# LT_INIT options. +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) + +test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4 new file mode 100644 index 0000000..9000a05 --- /dev/null +++ b/m4/ltsugar.m4 @@ -0,0 +1,123 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59 which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/m4/ltversion.m4 b/m4/ltversion.m4 new file mode 100644 index 0000000..1da0e8c --- /dev/null +++ b/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# Generated from ltversion.in. + +# serial 3018 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.2.6b]) +m4_define([LT_PACKAGE_REVISION], [1.3018]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.2.6b' +macro_revision='1.3018' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4 new file mode 100644 index 0000000..637bb20 --- /dev/null +++ b/m4/lt~obsolete.m4 @@ -0,0 +1,92 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 4 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) diff --git a/m4/nls.m4 b/m4/nls.m4 new file mode 100644 index 0000000..36bc493 --- /dev/null +++ b/m4/nls.m4 @@ -0,0 +1,49 @@ +# nls.m4 serial 1 (gettext-0.12) +dnl Copyright (C) 1995-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2003. + +AC_DEFUN([AM_NLS], +[ + AC_MSG_CHECKING([whether NLS is requested]) + dnl Default is enabled NLS + AC_ARG_ENABLE(nls, + [ --disable-nls do not use Native Language Support], + USE_NLS=$enableval, USE_NLS=yes) + AC_MSG_RESULT($USE_NLS) + AC_SUBST(USE_NLS) +]) + +AC_DEFUN([AM_MKINSTALLDIRS], +[ + dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly + dnl find the mkinstalldirs script in another subdir but $(top_srcdir). + dnl Try to locate it. + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + case "$ac_aux_dir" in + /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;; + *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;; + esac + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + AC_SUBST(MKINSTALLDIRS) +]) diff --git a/m4/po.m4 b/m4/po.m4 new file mode 100644 index 0000000..e161998 --- /dev/null +++ b/m4/po.m4 @@ -0,0 +1,426 @@ +# po.m4 serial 3 (gettext-0.14) +dnl Copyright (C) 1995-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2003. + +dnl Checks for all prerequisites of the po subdirectory. +AC_DEFUN([AM_PO_SUBDIRS], +[ + AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_MKINSTALLDIRS])dnl + AC_REQUIRE([AM_NLS])dnl + + dnl Perform the following tests also if --disable-nls has been given, + dnl because they are needed for "make dist" to work. + + dnl Search for GNU msgfmt in the PATH. + dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. + dnl The second test excludes FreeBSD msgfmt. + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + dnl Search for GNU xgettext 0.12 or newer in the PATH. + dnl The first test excludes Solaris xgettext and early GNU xgettext versions. + dnl The second test excludes FreeBSD xgettext. + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + + dnl Search for GNU msgmerge 0.11 or newer in the PATH. + AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, + [$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :) + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU msgfmt. + if test "$GMSGFMT" != ":"; then + dnl If it is no GNU msgfmt we define it as : so that the + dnl Makefiles still can work. + if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && + (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` + AC_MSG_RESULT( + [found $GMSGFMT program is not GNU msgfmt; ignore it]) + GMSGFMT=":" + fi + fi + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && + (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + AC_MSG_RESULT( + [found xgettext program is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + fi + + AC_OUTPUT_COMMANDS([ + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + POMAKEFILEDEPS="POTFILES.in" + # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$OBSOLETE_ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" + else + # The set of available languages was given in configure.in. + eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' + fi + # Compute POFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) + # Compute UPDATEPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) + # Compute DUMMYPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) + # Compute GMOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + UPDATEPOFILES= + DUMMYPOFILES= + GMOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done], + [# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it + # from automake. + eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + ]) +]) + +dnl Postprocesses a Makefile in a directory containing PO files. +AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], +[ + # When this code is run, in config.status, two variables have already been + # set: + # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, + # - LINGUAS is the value of the environment variable LINGUAS at configure + # time. + +changequote(,)dnl + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + # Find a way to echo strings without interpreting backslash. + if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then + gt_echo='echo' + else + if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then + gt_echo='printf %s\n' + else + echo_func () { + cat < "$ac_file.tmp" + if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then + # Add dependencies that cannot be formulated as a simple suffix rule. + for lang in $ALL_LINGUAS; do + frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` + cat >> "$ac_file.tmp" < /dev/null; then + # Add dependencies that cannot be formulated as a simple suffix rule. + for lang in $ALL_LINGUAS; do + frobbedlang=`echo $lang | sed -e 's/_/-/g'` + cat >> "$ac_file.tmp" <> "$ac_file.tmp" < +#include +/* The string "%2$d %1$d", with dollar characters protected from the shell's + dollar expansion (possibly an autoconf bug). */ +static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; +static char buf[100]; +int main () +{ + sprintf (buf, format, 33, 55); + return (strcmp (buf, "55 33") != 0); +}], gt_cv_func_printf_posix=yes, gt_cv_func_printf_posix=no, + [ + AC_EGREP_CPP(notposix, [ +#if defined __NetBSD__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__ + notposix +#endif + ], gt_cv_func_printf_posix="guessing no", + gt_cv_func_printf_posix="guessing yes") + ]) + ]) + case $gt_cv_func_printf_posix in + *yes) + AC_DEFINE(HAVE_POSIX_PRINTF, 1, + [Define if your printf() function supports format strings with positions.]) + ;; + esac +]) diff --git a/m4/progtest.m4 b/m4/progtest.m4 new file mode 100644 index 0000000..8fe527c --- /dev/null +++ b/m4/progtest.m4 @@ -0,0 +1,91 @@ +# progtest.m4 serial 3 (gettext-0.12) +dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1996. + +# Search path for a program which passes the given test. + +dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN([AM_PATH_PROG_WITH_TEST], +[ +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + [[\\/]]* | ?:[[\\/]]*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in ifelse([$5], , $PATH, [$5]); do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) diff --git a/m4/signed.m4 b/m4/signed.m4 new file mode 100644 index 0000000..dc1f54f --- /dev/null +++ b/m4/signed.m4 @@ -0,0 +1,19 @@ +# signed.m4 serial 1 (gettext-0.10.40) +dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([bh_C_SIGNED], +[ + AC_CACHE_CHECK([for signed], bh_cv_c_signed, + [AC_TRY_COMPILE(, [signed char x;], bh_cv_c_signed=yes, bh_cv_c_signed=no)]) + if test $bh_cv_c_signed = no; then + AC_DEFINE(signed, , + [Define to empty if the C compiler doesn't support this keyword.]) + fi +]) diff --git a/m4/size_max.m4 b/m4/size_max.m4 new file mode 100644 index 0000000..5762fc3 --- /dev/null +++ b/m4/size_max.m4 @@ -0,0 +1,61 @@ +# size_max.m4 serial 2 +dnl Copyright (C) 2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([gl_SIZE_MAX], +[ + AC_CHECK_HEADERS(stdint.h) + dnl First test whether the system already has SIZE_MAX. + AC_MSG_CHECKING([for SIZE_MAX]) + result= + AC_EGREP_CPP([Found it], [ +#include +#if HAVE_STDINT_H +#include +#endif +#ifdef SIZE_MAX +Found it +#endif +], result=yes) + if test -z "$result"; then + dnl Define it ourselves. Here we assume that the type 'size_t' is not wider + dnl than the type 'unsigned long'. + dnl The _AC_COMPUTE_INT macro works up to LONG_MAX, since it uses 'expr', + dnl which is guaranteed to work from LONG_MIN to LONG_MAX. + _AC_COMPUTE_INT([~(size_t)0 / 10], res_hi, + [#include ], result=?) + _AC_COMPUTE_INT([~(size_t)0 % 10], res_lo, + [#include ], result=?) + _AC_COMPUTE_INT([sizeof (size_t) <= sizeof (unsigned int)], fits_in_uint, + [#include ], result=?) + if test "$fits_in_uint" = 1; then + dnl Even though SIZE_MAX fits in an unsigned int, it must be of type + dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'. + AC_TRY_COMPILE([#include + extern size_t foo; + extern unsigned long foo; + ], [], fits_in_uint=0) + fi + if test -z "$result"; then + if test "$fits_in_uint" = 1; then + result="$res_hi$res_lo"U + else + result="$res_hi$res_lo"UL + fi + else + dnl Shouldn't happen, but who knows... + result='~(size_t)0' + fi + fi + AC_MSG_RESULT([$result]) + if test "$result" != yes; then + AC_DEFINE_UNQUOTED([SIZE_MAX], [$result], + [Define as the maximum value of type 'size_t', if the system doesn't define it.]) + fi +]) diff --git a/m4/stdint_h.m4 b/m4/stdint_h.m4 new file mode 100644 index 0000000..32ba7ae --- /dev/null +++ b/m4/stdint_h.m4 @@ -0,0 +1,28 @@ +# stdint_h.m4 serial 3 (gettext-0.12) +dnl Copyright (C) 1997-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_STDINT_H_WITH_UINTMAX if exists, +# doesn't clash with , and declares uintmax_t. + +AC_DEFUN([jm_AC_HEADER_STDINT_H], +[ + AC_CACHE_CHECK([for stdint.h], jm_ac_cv_header_stdint_h, + [AC_TRY_COMPILE( + [#include +#include ], + [uintmax_t i = (uintmax_t) -1;], + jm_ac_cv_header_stdint_h=yes, + jm_ac_cv_header_stdint_h=no)]) + if test $jm_ac_cv_header_stdint_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1, + [Define if exists, doesn't clash with , + and declares uintmax_t. ]) + fi +]) diff --git a/m4/uintmax_t.m4 b/m4/uintmax_t.m4 new file mode 100644 index 0000000..b5f28d4 --- /dev/null +++ b/m4/uintmax_t.m4 @@ -0,0 +1,32 @@ +# uintmax_t.m4 serial 7 (gettext-0.12) +dnl Copyright (C) 1997-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +AC_PREREQ(2.13) + +# Define uintmax_t to 'unsigned long' or 'unsigned long long' +# if it is not already defined in or . + +AC_DEFUN([jm_AC_TYPE_UINTMAX_T], +[ + AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([jm_AC_HEADER_STDINT_H]) + if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then + AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG]) + test $ac_cv_type_unsigned_long_long = yes \ + && ac_type='unsigned long long' \ + || ac_type='unsigned long' + AC_DEFINE_UNQUOTED(uintmax_t, $ac_type, + [Define to unsigned long or unsigned long long + if and don't define.]) + else + AC_DEFINE(HAVE_UINTMAX_T, 1, + [Define if you have the 'uintmax_t' type in or .]) + fi +]) diff --git a/m4/ulonglong.m4 b/m4/ulonglong.m4 new file mode 100644 index 0000000..1da8b80 --- /dev/null +++ b/m4/ulonglong.m4 @@ -0,0 +1,25 @@ +# ulonglong.m4 serial 3 +dnl Copyright (C) 1999-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_UNSIGNED_LONG_LONG if 'unsigned long long' works. + +AC_DEFUN([jm_AC_TYPE_UNSIGNED_LONG_LONG], +[ + AC_CACHE_CHECK([for unsigned long long], ac_cv_type_unsigned_long_long, + [AC_TRY_LINK([unsigned long long ull = 1ULL; int i = 63;], + [unsigned long long ullmax = (unsigned long long) -1; + return ull << i | ull >> i | ullmax / ull | ullmax % ull;], + ac_cv_type_unsigned_long_long=yes, + ac_cv_type_unsigned_long_long=no)]) + if test $ac_cv_type_unsigned_long_long = yes; then + AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1, + [Define if you have the 'unsigned long long' type.]) + fi +]) diff --git a/m4/wchar_t.m4 b/m4/wchar_t.m4 new file mode 100644 index 0000000..d8fd1ec --- /dev/null +++ b/m4/wchar_t.m4 @@ -0,0 +1,22 @@ +# wchar_t.m4 serial 1 (gettext-0.12) +dnl Copyright (C) 2002-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. +dnl Test whether has the 'wchar_t' type. +dnl Prerequisite: AC_PROG_CC + +AC_DEFUN([gt_TYPE_WCHAR_T], +[ + AC_CACHE_CHECK([for wchar_t], gt_cv_c_wchar_t, + [AC_TRY_COMPILE([#include + wchar_t foo = (wchar_t)'\0';], , + gt_cv_c_wchar_t=yes, gt_cv_c_wchar_t=no)]) + if test $gt_cv_c_wchar_t = yes; then + AC_DEFINE(HAVE_WCHAR_T, 1, [Define if you have the 'wchar_t' type.]) + fi +]) diff --git a/m4/wint_t.m4 b/m4/wint_t.m4 new file mode 100644 index 0000000..3d8d215 --- /dev/null +++ b/m4/wint_t.m4 @@ -0,0 +1,22 @@ +# wint_t.m4 serial 1 (gettext-0.12) +dnl Copyright (C) 2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. +dnl Test whether has the 'wint_t' type. +dnl Prerequisite: AC_PROG_CC + +AC_DEFUN([gt_TYPE_WINT_T], +[ + AC_CACHE_CHECK([for wint_t], gt_cv_c_wint_t, + [AC_TRY_COMPILE([#include + wint_t foo = (wchar_t)'\0';], , + gt_cv_c_wint_t=yes, gt_cv_c_wint_t=no)]) + if test $gt_cv_c_wint_t = yes; then + AC_DEFINE(HAVE_WINT_T, 1, [Define if you have the 'wint_t' type.]) + fi +]) diff --git a/m4/xsize.m4 b/m4/xsize.m4 new file mode 100644 index 0000000..9b7cf9b --- /dev/null +++ b/m4/xsize.m4 @@ -0,0 +1,14 @@ +# xsize.m4 serial 2 +dnl Copyright (C) 2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +AC_DEFUN([gl_XSIZE], +[ + dnl Prerequisites of lib/xsize.h. + AC_REQUIRE([gl_SIZE_MAX]) + AC_CHECK_HEADERS(stdint.h) +]) diff --git a/man/Makefile.am b/man/Makefile.am new file mode 100644 index 0000000..44d6c2d --- /dev/null +++ b/man/Makefile.am @@ -0,0 +1 @@ +dist_man_MANS=maptool.1 navit.1 diff --git a/man/Makefile.in b/man/Makefile.in new file mode 100644 index 0000000..8341c9a --- /dev/null +++ b/man/Makefile.in @@ -0,0 +1,589 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = man +DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man1dir = $(mandir)/man1 +am__installdirs = "$(DESTDIR)$(man1dir)" +NROFF = nroff +MANS = $(dist_man_MANS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +dist_man_MANS = maptool.1 navit.1 +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu man/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu man/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man1: $(dist_man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(MANS) +installdirs: + for dir in "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man1 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am uninstall-man uninstall-man1 + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/man/maptool.1 b/man/maptool.1 new file mode 100644 index 0000000..a812a75 --- /dev/null +++ b/man/maptool.1 @@ -0,0 +1,86 @@ +.TH maptool 1 "$Date$" "$Revision$" "USER COMMANDS" +.SH NAME +maptool \- parse osm textfile and convert to Navit binfile format +.SH SYNOPSIS +.B For OSM XML data: +.B bzcat planet.osm.bz2 | maptool mymap.bin +[\-h] [\-2] [\-5 ] [\-6] [\-a ] [\-c] -[\-d ] [\-i ] [\-k] [\-M] [\-N] [\-o] [\-r ] [\-s ] +[\-S ] [\-w] [\-W] [\-U] [\-z ] +.B For OSM Protobuf/PBF data: +.B maptool \-\-protobuf \-i planet.osm.pbf planet.bin +[\-h] [\-2] [\-5 ] [\-6] [\-a ] [\-c] [\-e ] +[\-i ] [\-k] [\-M] [\-N] [\-o] [\-P] [\-r ] [\-s ] +[\-S ] [\-w] [\-W] [\-U] [\-z ] +.SH DESCRIPTION +maptool parses osm textfile and converts it to Navit binfile format +.SH OPTIONS +.TP +\-h (\-\-help) +display a short help message +.TP +\-2 (\-\-dowai2poi) +convert ways and polygons to POIs when applicable +.TP +\-4 (\-\-md5) +set file where to write md5 sum +.TP +\-6 (\-\-64bit) +set zip 64 bit compression +.TP +\-a (\-\-attr-debug-level) +control which data is included in the debug attribute +.TP +\-c (\-\-dump-coordinates) +dump coordinates after phase 1 +.TP +\-d (\-\-db) +get osm data out of a postgresql database with osm simple scheme and given connect string +.TP +\-e (\-\-end) +end at specified phase +.TP +\-i (\-\-input-file) +specify the input file name (OSM), overrules default stdin +.TP +\-k (\-\-keep-tmpfiles) +do not delete tmp files after processing. useful to reuse them +.TP +\-N (\-\-nodes-only) +process only nodes +.TP +\-o (\-\-coverage) +converts every street to street_converage, resulting in a big fat black line. +You can overlay this map with another vector map or image map, and every street +you will still see is missing in the \-o map +.TP +\-P (\-\-protobuf) +input file is protobuf +.TP +\-r (\-\-rule-file) +read mapping rules from specified file +.TP +\-s (\-\-start) +start at specified phase +.TP +\-S (\-\-slice-size) +defines the amount of memory to use, in bytes. Default is 1GB +.TP +\-w (\-\-dedupe-ways) +ensure no duplicate ways or nodes. useful when using several input files +.TP +\-W (\-\-ways-only) +process only ways +.TP +\-U (\-\-unknown-country) +add objects with unknown country to index +.TP +\-z (\-\-compression-level) +set the compression level +.SH BUGS +Should you find one, please report it : + http://trac.navit-project.org +.SH AUTHOR +The navit Team - http://www.navit-project.org +.SH SEE ALSO +navit(1) diff --git a/man/navit.1 b/man/navit.1 new file mode 100644 index 0000000..80608bf --- /dev/null +++ b/man/navit.1 @@ -0,0 +1,49 @@ +.TH navit 1 "$Date$" "$Revision$" "USER COMMANDS" +.SH NAME +navit \- The modular touchscreen-friendly vector based navigation software. +.SH SYNOPSIS +.B navit +[\-h] [\-v] [\-c config file] +.SH DESCRIPTION +Navit is a open source (GPL) car navigation system with routing engine. + +It's modular design is capable of using vector maps of various formats +for routing and rendering of the displayed map. It's even possible to +use multiple maps at a time. + +The GTK+ or SDL user interfaces are designed to work well with touch +screen displays. Points of Interest of various formats are displayed +on the map. + +The current vehicle position is either read from gpsd or directly from +NMEA GPS sensors. + +The routing engine not only calculates an optimal route to your +destination, but also generates directions and even speaks to you. + +Navit is translated in more than 40 languages currently, please see https://translations.launchpad.net/navit/trunk + +For more informations, please refer to our wiki : + http://wiki.navit-project.org + +You can also try our mailing lists : + http://sourceforge.net/mailarchive/forum.php?forum_name=navit-users + +Or visit us on IRC : #navit on the freenode network +.SH OPTIONS +.TP +\-h +display a short help text and exit +.TP +\-v +display the version number and exit +.TP +\-c +specify the config file (navit.xml) to use +.SH BUGS +Should you find one, please report it : + http://trac.navit-project.org +.SH AUTHOR +The navit Team - http://www.navit-project.org +.SH SEE ALSO +maptool(1) diff --git a/missing b/missing new file mode 100755 index 0000000..28055d2 --- /dev/null +++ b/missing @@ -0,0 +1,376 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, +# 2008, 2009 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# 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; either version 2, or (at your option) +# any later version. + +# 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and +\`g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# normalize program name to check for. +program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). This is about non-GNU programs, so use $1 not +# $program. +case $1 in + lex*|yacc*) + # Not GNU programs, they don't have --version. + ;; + + tar*) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $program in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te*) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison*|yacc*) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex*|flex*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit $? + fi + ;; + + makeinfo*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + tar*) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case $firstarg in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case $firstarg in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/mkinstalldirs b/mkinstalldirs new file mode 100755 index 0000000..d2d5f21 --- /dev/null +++ b/mkinstalldirs @@ -0,0 +1,111 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +errstatus=0 +dirmode="" + +usage="\ +Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" 1>&2 + exit 0 + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +case $dirmode in + '') + if mkdir -p -- . 2>/dev/null; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + fi + ;; + *) + if mkdir -m "$dirmode" -p -- . 2>/dev/null; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + fi + ;; +esac + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr="" + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# End: +# mkinstalldirs ends here diff --git a/navit/Makefile.am b/navit/Makefile.am new file mode 100644 index 0000000..8c60b0a --- /dev/null +++ b/navit/Makefile.am @@ -0,0 +1,244 @@ +include $(top_srcdir)/Makefile.inc +comma=, +SUBDIRS=fib-1.1 support +if PLUGINS + SUBDIRS += . +endif +DIST_SUBDIRS=autoload binding map maptool fib-1.1 font fonts gui graphics osd plugin speech support vehicle xpm maps +SUBDIRS+=autoload binding map font gui graphics osd plugin speech vehicle xpm + +MODULES = $(wildcard $(top_builddir)/navit/binding/*/*.la $(top_builddir)/navit/font/*/*.la $(top_builddir)/navit/graphics/*/*.la $(top_builddir)/navit/gui/*/*.la $(top_builddir)/navit/map/*/*.la $(top_builddir)/navit/osd/*/*.la $(top_builddir)/navit/speech/*/*.la $(top_builddir)/navit/vehicle/*/*.la) + +if FONTS + SUBDIRS += fonts +endif +if !PLUGINS + SUBDIRS += . +endif + +if MAPTOOL + SUBDIRS += maptool +endif + +if BUILD_SAMPLEMAP + SUBDIRS += maps +endif + + +AM_CPPFLAGS = -I$(top_srcdir)/navit/fib-1.1 @NAVIT_CFLAGS@ @ZLIB_CFLAGS@ -DPREFIX=\"@prefix@\" -DLIBDIR=\"@libdir@\" -DMODULE=navit +BUILT_SOURCES = version.h navit_config.h + +if BIN_NAVIT + bin_PROGRAMS = navit +endif + +if SHARED_LIBNAVIT + lib_LTLIBRARIES = lib@LIBNAVIT@.la + lib@LIBNAVIT@_la_LDFLAGS = -avoid-version @MODULE_LDFLAGS@ @NAVIT_SOCKET_LDFLAGS@ -no-undefined -Wl,--no-undefined +else + noinst_LTLIBRARIES = lib@LIBNAVIT@.la +endif +lib@LIBNAVIT@_la_LIBADD = @NAVIT_LIBS@ @WORDEXP_LIBS@ @ZLIB_LIBS@ @INTLLIBS@ -Lfib-1.1 -lfib @MODULE_LIBADD@ @CRYPTO_LIBS@ + +if SUPPORT_WIN32CE + lib@LIBNAVIT@_la_LIBADD += -Lsupport/libc -lsupport_libc +endif + +pkgdata_DATA = navit.xml + +EXTRA_DIST = navit_shipped.xml navit.dtd + +lib@LIBNAVIT@_la_SOURCES = announcement.c atom.c attr.c cache.c callback.c obj_filter.c command.c compass.c config_.c coord.c country.c data_window.c debug.c \ + event.c event_glib.h file.c graphics.c gui.c item.c layout.c log.c main.c map.c \ + linguistics.c mapset.c maptype.c menu.c messages.c bookmarks.c bookmarks.h navit.c navigation.c osd.c param.c phrase.c plugin.c popup.c \ + profile.c projection.c roadprofile.c route.c routech.c search.c speech.c start_real.c transform.c track.c \ + util.c vehicle.c vehicleprofile.c xmlconfig.c announcement.h atom.h attr.h attr_def.h cache.h callback.h color.h obj_filter.h command.h compass.h config_.h coord.h country.h \ + android.h data.h data_window.h data_window_int.h debug.h destination.h draw_info.h endianess.h event.h \ + file.h graphics.h gtkext.h gui.h item.h item_def.h keys.h log.h layer.h layout.h linguistics.h main.h map-share.h map.h\ + map_data.h mapset.h maptype.h menu.h messages.h navigation.h navit.h osd.h \ + param.h phrase.h plugin.h point.h plugin_def.h projection.h popup.h route.h profile.h roadprofile.h search.h speech.h start_real.h \ + transform.h track.h types.h util.h vehicle.h vehicleprofile.h window.h xmlconfig.h zipfile.h \ + navit_nls.h sunriset.c sunriset.h glib_slice.h + +XSLTS=@XSLTS@ +navit.xml: navit_shipped.xml $(foreach xslt, $(subst $(comma), ,$(XSLTS)), $(addsuffix .xslt,$(addprefix xslt/,$(xslt)))) navit_android_xml + cp $< navit.xml.new + if [ ! -f navit.dtd ]; then cp -f $(top_srcdir)/navit/navit.dtd .; fi + for i in $^; do if [ "$${i%.xslt}" != "$$i" ]; then echo "Applying $$i" ; @SAXON@ -snone navit.xml.new $$i >navit.xml.tmp || exit ; mv -f navit.xml.tmp navit.xml.new || exit ; fi ; done + mv -f navit.xml.new navit.xml + rm -f navit.xml.tmp + +navit_android_xml: navit_shipped.xml +if SUPPORT_ANDROID +# new android xml files for (mdpi,ldpi,hdpi) + cp $(srcdir)/navit_shipped.xml navit_android.xml.new + if [ ! -f navit.dtd ]; then cp -f $(top_srcdir)/navit/navit.dtd .; fi + +# # now apply any other xslt files (this would allow for pedestrian plugin) +# for i in $(foreach xslt, $(subst $(comma), ,$(XSLTS)), $(addsuffix .xslt,$(addprefix xslt/,$(xslt)))); do if [ "$${i%.xslt}" != "$$i" ]; then j=`basename $$i` ; if [ "$$j" != "android.xslt" ] ; then echo "Android: Applying $$i" ; @SAXON@ -snone navit_android.xml.new $(srcdir)/"$$i" >navit_android.xml.new.tmp || exit ; mv navit_android.xml.new.tmp navit_android.xml.new || exit ; fi ; fi ; done +# # for now disable pedestrian plugin (zoff99) + + @SAXON@ -snone navit_android.xml.new $(srcdir)/xslt/android_mdpi.xslt >navit_android_mdpi.xml.tmp + @SAXON@ -snone navit_android.xml.new $(srcdir)/xslt/android_ldpi.xslt >navit_android_ldpi.xml.tmp + @SAXON@ -snone navit_android.xml.new $(srcdir)/xslt/android_hdpi.xslt >navit_android_hdpi.xml.tmp + rm -f navit_android.xml.new + rm -f navit_android.xml.new.tmp + mv -f navit_android_mdpi.xml.tmp navit_android_mdpi.xml + mv -f navit_android_ldpi.xml.tmp navit_android_ldpi.xml + mv -f navit_android_hdpi.xml.tmp navit_android_hdpi.xml + rm -f navit_android_mdpi.xml.tmp + rm -f navit_android_ldpi.xml.tmp + rm -f navit_android_hdpi.xml.tmp +else + echo "no Android support" +endif + +if SUPPORT_ANDROID + lib@LIBNAVIT@_la_SOURCES += android.c + navit_SOURCES = + navit_LDADD = + +v_int = $$(cat $(srcdir)/android/Android_Market_Version_int.txt|grep v_int|cut -d ":" -f 2) +v_name = "0.5.0-"$$(LANG=C svnversion $(top_srcdir) 2> /dev/null|tr -d ":A-Z" 2> /dev/null) + +android/AndroidManifest.xml: android/AndroidManifest.xml.in + mkdir -p $(builddir)/android + sed '0,/$@ + for i in $(subst $(comma), ,@ANDROID_PERMISSIONS@); do echo " " >>$@; done + sed '0,/>$@ + sed -e "s/@ANDROID_VERSION_INT@/$(v_int)/" <$@ >android/AndroidManifest.xml.tmp + mv -f android/AndroidManifest.xml.tmp $@ + sed -e "s/@ANDROID_VERSION_NAME@/$(v_name)/" <$@ >android/AndroidManifest.xml.tmp + mv -f android/AndroidManifest.xml.tmp $@ + +android/build.xml: android/AndroidManifest.xml android/dummy.txt +# this is needed, otherwise somehow the files cant be deleted + mkdir -p $(builddir)/android/src/ + if [ "$(builddir)" != "$(srcdir)" ]; then chmod -R u+w $(builddir)/android/src/; fi + if [ "$(builddir)" != "$(srcdir)" ]; then rm -Rf $(builddir)/android/src/; fi + if [ "$(builddir)" != "$(srcdir)" ]; then cp -rpf $(srcdir)/android/* $(builddir)/android; fi + touch $(srcdir)/android/dummy.txt + touch $(builddir)/android/dummy.txt + android update project -t @ANDROID_PROJECT@ -p android + +apkg-all: all android/build.xml navit.xml + mkdir -p android/libs/armeabi + cp .libs/*.so android/libs/armeabi/libnavit.so + for i in */*/.libs/*.so ; do sed 's&lib_data_data_org\.navitproject\.navit_lib_&/data/data/org.navitproject.navit/lib/lib&' <$$i >android/libs/armeabi/$$(basename $$i); done + + mkdir -p android/res/drawable-ldpi + mkdir -p android/res/drawable-mdpi + mkdir -p android/res/drawable-hdpi + for i in $(shell cd $(srcdir)/xpm && echo *.xpm); do convert $(srcdir)/xpm/$$i android/res/drawable-mdpi/$${i%.xpm}.png; done + for i in $(shell cd $(srcdir)/xpm && echo *.xpm); do convert -resize 75% $(srcdir)/xpm/$$i android/res/drawable-ldpi/$${i%.xpm}.png; done + for i in $(shell cd $(srcdir)/xpm && echo *.xpm); do convert -resize 150% $(srcdir)/xpm/$$i android/res/drawable-hdpi/$${i%.xpm}.png; done + +# for i in $(shell cd $(srcdir)/xpm && echo *.png); do cp $(srcdir)/xpm/$$i android/res/drawable-mdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done +# for i in $(shell cd $(srcdir)/xpm && echo *.png); do cp $(srcdir)/xpm/$$i android/res/drawable-ldpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done +# for i in $(shell cd $(srcdir)/xpm && echo *.png); do cp $(srcdir)/xpm/$$i android/res/drawable-hdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done + + for i in $(shell cd $(srcdir)/xpm && echo *.png); do convert $(srcdir)/xpm/$$i android/res/drawable-mdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done + for i in $(shell cd $(srcdir)/xpm && echo *.png); do convert -resize 75% $(srcdir)/xpm/$$i android/res/drawable-ldpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done + for i in $(shell cd $(srcdir)/xpm && echo *.png); do convert -resize 150% $(srcdir)/xpm/$$i android/res/drawable-hdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done + +# if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do cp $(builddir)/xpm/$$i android/res/drawable-mdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi +# if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do cp $(builddir)/xpm/$$i android/res/drawable-ldpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi +# if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do cp $(builddir)/xpm/$$i android/res/drawable-hdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi + + if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do convert $(builddir)/xpm/$$i android/res/drawable-mdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi + if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do convert -resize 75% $(builddir)/xpm/$$i android/res/drawable-ldpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi + if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do convert -resize 150% $(builddir)/xpm/$$i android/res/drawable-hdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi + + mkdir -p android/res/raw + for i in $(shell cd ../po && echo *.mo); do cp ../po/$$i android/res/raw/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done +# cp navit.xml android/res/raw + cp navit_android_mdpi.xml android/res/raw/navitmdpi.xml + cp navit_android_ldpi.xml android/res/raw/navitldpi.xml + cp navit_android_hdpi.xml android/res/raw/navithdpi.xml + +apkg: apkg-all + touch $(srcdir)/android/dummy.txt + touch $(builddir)/android/dummy.txt + cd android && ant debug + +apkg-release: apkg-all + touch $(srcdir)/android/dummy.txt + touch $(builddir)/android/dummy.txt + cd android && ant release + jarsigner $$(cat ~/.keystore_args) android/bin/Navit-unsigned.apk mykey +# zipalign -f 4 android/bin/Navit-unsigned.apk android/bin/Navit-unsigned-aligned.apk +else +navit_SOURCES = start.c +navit_LDADD = lib@LIBNAVIT@.la + +endif + +if EVENT_GLIB + lib@LIBNAVIT@_la_SOURCES += event_glib.c +endif + +navit_LDFLAGS = -export-dynamic + +if !PLUGINS + lib@LIBNAVIT@_la_SOURCES += builtin.c + lib@LIBNAVIT@_la_LIBADD += $(MODULES) +endif + + +navit_LDADD += @NAVIT_LIBS@ @WORDEXP_LIBS@ @ZLIB_LIBS@ @CRYPTO_LIBS@ @INTLLIBS@ + + +if SUPPORT_WIN32 + navit_LDADD += resource.rsc +if SUPPORT_WIN32CE + navit_LDADD += -lcommctrl -Lsupport/libc +else + navit_LDADD += -lgdi32 -lcomctl32 -lwinmm +endif + + +resource.rsc: $(top_srcdir)/navit/gui/win32/resources/resource.rc + $(WINDRES) -I $(top_srcdir)/navit/gui/win32/resources $(top_srcdir)/navit/gui/win32/resources/resource.rc resource.rsc +endif + +.PHONY: version.h.tmp + +version.h.tmp: + echo "#include \"config.h\"" >version.h.tmp +if SOURCE_MODE_SVN + echo "#define SVN_VERSION \"$$(LANG=C svnversion $(top_srcdir) 2>/dev/null)\"" >>version.h.tmp +else + echo "#define SVN_VERSION \"@SOURCE_MODE@\"" >>version.h.tmp +endif + echo "#define NAVIT_VARIANT \"@NAVIT_VARIANT@\"" >>version.h.tmp + if ! diff version.h.tmp version.h >/dev/null 2>/dev/null; \ + then \ + mv -f version.h.tmp version.h; \ + fi + +version.h: version.h.tmp + +navit_config.h: ../config.h + cp ../config.h navit_config.h.tmp + if ! diff navit_config.h.tmp navit_config.h >/dev/null 2>/dev/null; \ + then \ + mv -f navit_config.h.tmp navit_config.h; \ + fi + + +distclean-local: + rm -f version.h version.h.tmp navit_config.h navit_config.h.tmp builtin.c support-builtin.c navit.xml resurce.rsc + if [ "$(top_builddir)" != "$(top_srcdir)" ]; then rm -f navit.dtd; fi + +builtin.c: $(top_builddir)/config.h + ls $(top_builddir)/navit/*/*/*.la | sed -e "s/\.la/_init(void);/" -e "s/.*lib/extern void module_/" >builtin.c + echo "extern void builtin_init(void);" >>builtin.c + echo "void builtin_init(void) {" >>builtin.c + ls $(top_builddir)/navit/*/*/*.la | grep -v shapefile | sed -e "s/\.la/_init();/" -e "s/.*\\/lib/ module_/" >>builtin.c + echo "}" >>builtin.c +support-builtin.c: $(top_builddir)/config.h + ls $(top_builddir)/navit/support/*/*.la | sed -e "s/\.la/_init(void);/" -e "s/.*lib/extern void module_/" >support-builtin.c + echo "extern void builtin_init(void);" >>support-builtin.c + echo "void builtin_init(void) {" >>support-builtin.c + ls $(top_builddir)/navit/support/*/*.la | sed -e "s/\.la/_init();/" -e "s/.*\\/lib/ module_/" >>support-builtin.c + echo "}" >>support-builtin.c diff --git a/navit/Makefile.in b/navit/Makefile.in new file mode 100644 index 0000000..732e4a9 --- /dev/null +++ b/navit/Makefile.in @@ -0,0 +1,1235 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +@PLUGINS_TRUE@am__append_1 = . +@FONTS_TRUE@am__append_2 = fonts +@PLUGINS_FALSE@am__append_3 = . +@MAPTOOL_TRUE@am__append_4 = maptool +@BUILD_SAMPLEMAP_TRUE@am__append_5 = maps +@BIN_NAVIT_TRUE@bin_PROGRAMS = navit$(EXEEXT) +@SUPPORT_WIN32CE_TRUE@am__append_6 = -Lsupport/libc -lsupport_libc +@SUPPORT_ANDROID_TRUE@am__append_7 = android.c +@EVENT_GLIB_TRUE@am__append_8 = event_glib.c +@PLUGINS_FALSE@am__append_9 = builtin.c +@PLUGINS_FALSE@am__append_10 = $(MODULES) +@SUPPORT_WIN32_TRUE@am__append_11 = resource.rsc +@SUPPORT_WIN32CE_TRUE@@SUPPORT_WIN32_TRUE@am__append_12 = -lcommctrl -Lsupport/libc +@SUPPORT_WIN32CE_FALSE@@SUPPORT_WIN32_TRUE@am__append_13 = -lgdi32 -lcomctl32 -lwinmm +subdir = navit +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(pkgdatadir)" +LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) +am__DEPENDENCIES_1 = +lib@LIBNAVIT@_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__append_10) +am__lib@LIBNAVIT@_la_SOURCES_DIST = announcement.c atom.c attr.c \ + cache.c callback.c obj_filter.c command.c compass.c config_.c \ + coord.c country.c data_window.c debug.c event.c event_glib.h \ + file.c graphics.c gui.c item.c layout.c log.c main.c map.c \ + linguistics.c mapset.c maptype.c menu.c messages.c bookmarks.c \ + bookmarks.h navit.c navigation.c osd.c param.c phrase.c \ + plugin.c popup.c profile.c projection.c roadprofile.c route.c \ + routech.c search.c speech.c start_real.c transform.c track.c \ + util.c vehicle.c vehicleprofile.c xmlconfig.c announcement.h \ + atom.h attr.h attr_def.h cache.h callback.h color.h \ + obj_filter.h command.h compass.h config_.h coord.h country.h \ + android.h data.h data_window.h data_window_int.h debug.h \ + destination.h draw_info.h endianess.h event.h file.h \ + graphics.h gtkext.h gui.h item.h item_def.h keys.h log.h \ + layer.h layout.h linguistics.h main.h map-share.h map.h \ + map_data.h mapset.h maptype.h menu.h messages.h navigation.h \ + navit.h osd.h param.h phrase.h plugin.h point.h plugin_def.h \ + projection.h popup.h route.h profile.h roadprofile.h search.h \ + speech.h start_real.h transform.h track.h types.h util.h \ + vehicle.h vehicleprofile.h window.h xmlconfig.h zipfile.h \ + navit_nls.h sunriset.c sunriset.h glib_slice.h android.c \ + event_glib.c builtin.c +@SUPPORT_ANDROID_TRUE@am__objects_1 = android.lo +@EVENT_GLIB_TRUE@am__objects_2 = event_glib.lo +@PLUGINS_FALSE@am__objects_3 = builtin.lo +am_lib@LIBNAVIT@_la_OBJECTS = announcement.lo atom.lo attr.lo cache.lo \ + callback.lo obj_filter.lo command.lo compass.lo config_.lo \ + coord.lo country.lo data_window.lo debug.lo event.lo file.lo \ + graphics.lo gui.lo item.lo layout.lo log.lo main.lo map.lo \ + linguistics.lo mapset.lo maptype.lo menu.lo messages.lo \ + bookmarks.lo navit.lo navigation.lo osd.lo param.lo phrase.lo \ + plugin.lo popup.lo profile.lo projection.lo roadprofile.lo \ + route.lo routech.lo search.lo speech.lo start_real.lo \ + transform.lo track.lo util.lo vehicle.lo vehicleprofile.lo \ + xmlconfig.lo sunriset.lo $(am__objects_1) $(am__objects_2) \ + $(am__objects_3) +lib@LIBNAVIT@_la_OBJECTS = $(am_lib@LIBNAVIT@_la_OBJECTS) +lib@LIBNAVIT@_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(lib@LIBNAVIT@_la_LDFLAGS) $(LDFLAGS) -o $@ +@SHARED_LIBNAVIT_FALSE@am_lib@LIBNAVIT@_la_rpath = +@SHARED_LIBNAVIT_TRUE@am_lib@LIBNAVIT@_la_rpath = -rpath $(libdir) +PROGRAMS = $(bin_PROGRAMS) +am__navit_SOURCES_DIST = start.c +@SUPPORT_ANDROID_FALSE@am_navit_OBJECTS = start.$(OBJEXT) +navit_OBJECTS = $(am_navit_OBJECTS) +@SUPPORT_ANDROID_FALSE@navit_DEPENDENCIES = lib@LIBNAVIT@.la \ +@SUPPORT_ANDROID_FALSE@ $(am__append_11) $(am__DEPENDENCIES_1) \ +@SUPPORT_ANDROID_FALSE@ $(am__DEPENDENCIES_1) +@SUPPORT_ANDROID_TRUE@navit_DEPENDENCIES = $(am__append_11) \ +@SUPPORT_ANDROID_TRUE@ $(am__DEPENDENCIES_1) \ +@SUPPORT_ANDROID_TRUE@ $(am__DEPENDENCIES_1) +navit_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(navit_LDFLAGS) \ + $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(lib@LIBNAVIT@_la_SOURCES) $(navit_SOURCES) +DIST_SOURCES = $(am__lib@LIBNAVIT@_la_SOURCES_DIST) \ + $(am__navit_SOURCES_DIST) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +DATA = $(pkgdata_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +comma = , +SUBDIRS = fib-1.1 support $(am__append_1) autoload binding map font \ + gui graphics osd plugin speech vehicle xpm $(am__append_2) \ + $(am__append_3) $(am__append_4) $(am__append_5) +DIST_SUBDIRS = autoload binding map maptool fib-1.1 font fonts gui graphics osd plugin speech support vehicle xpm maps +MODULES = $(wildcard $(top_builddir)/navit/binding/*/*.la $(top_builddir)/navit/font/*/*.la $(top_builddir)/navit/graphics/*/*.la $(top_builddir)/navit/gui/*/*.la $(top_builddir)/navit/map/*/*.la $(top_builddir)/navit/osd/*/*.la $(top_builddir)/navit/speech/*/*.la $(top_builddir)/navit/vehicle/*/*.la) +AM_CPPFLAGS = -I$(top_srcdir)/navit/fib-1.1 @NAVIT_CFLAGS@ @ZLIB_CFLAGS@ -DPREFIX=\"@prefix@\" -DLIBDIR=\"@libdir@\" -DMODULE=navit +BUILT_SOURCES = version.h navit_config.h +@SHARED_LIBNAVIT_TRUE@lib_LTLIBRARIES = lib@LIBNAVIT@.la +@SHARED_LIBNAVIT_TRUE@lib@LIBNAVIT@_la_LDFLAGS = -avoid-version @MODULE_LDFLAGS@ @NAVIT_SOCKET_LDFLAGS@ -no-undefined -Wl,--no-undefined +@SHARED_LIBNAVIT_FALSE@noinst_LTLIBRARIES = lib@LIBNAVIT@.la +lib@LIBNAVIT@_la_LIBADD = @NAVIT_LIBS@ @WORDEXP_LIBS@ @ZLIB_LIBS@ \ + @INTLLIBS@ -Lfib-1.1 -lfib @MODULE_LIBADD@ @CRYPTO_LIBS@ \ + $(am__append_6) $(am__append_10) +pkgdata_DATA = navit.xml +EXTRA_DIST = navit_shipped.xml navit.dtd +lib@LIBNAVIT@_la_SOURCES = announcement.c atom.c attr.c cache.c \ + callback.c obj_filter.c command.c compass.c config_.c coord.c \ + country.c data_window.c debug.c event.c event_glib.h file.c \ + graphics.c gui.c item.c layout.c log.c main.c map.c \ + linguistics.c mapset.c maptype.c menu.c messages.c bookmarks.c \ + bookmarks.h navit.c navigation.c osd.c param.c phrase.c \ + plugin.c popup.c profile.c projection.c roadprofile.c route.c \ + routech.c search.c speech.c start_real.c transform.c track.c \ + util.c vehicle.c vehicleprofile.c xmlconfig.c announcement.h \ + atom.h attr.h attr_def.h cache.h callback.h color.h \ + obj_filter.h command.h compass.h config_.h coord.h country.h \ + android.h data.h data_window.h data_window_int.h debug.h \ + destination.h draw_info.h endianess.h event.h file.h \ + graphics.h gtkext.h gui.h item.h item_def.h keys.h log.h \ + layer.h layout.h linguistics.h main.h map-share.h map.h \ + map_data.h mapset.h maptype.h menu.h messages.h navigation.h \ + navit.h osd.h param.h phrase.h plugin.h point.h plugin_def.h \ + projection.h popup.h route.h profile.h roadprofile.h search.h \ + speech.h start_real.h transform.h track.h types.h util.h \ + vehicle.h vehicleprofile.h window.h xmlconfig.h zipfile.h \ + navit_nls.h sunriset.c sunriset.h glib_slice.h $(am__append_7) \ + $(am__append_8) $(am__append_9) +# zipalign -f 4 android/bin/Navit-unsigned.apk android/bin/Navit-unsigned-aligned.apk +@SUPPORT_ANDROID_FALSE@navit_SOURCES = start.c +@SUPPORT_ANDROID_TRUE@navit_SOURCES = +@SUPPORT_ANDROID_FALSE@navit_LDADD = lib@LIBNAVIT@.la @NAVIT_LIBS@ \ +@SUPPORT_ANDROID_FALSE@ @WORDEXP_LIBS@ @ZLIB_LIBS@ \ +@SUPPORT_ANDROID_FALSE@ @CRYPTO_LIBS@ @INTLLIBS@ \ +@SUPPORT_ANDROID_FALSE@ $(am__append_11) $(am__append_12) \ +@SUPPORT_ANDROID_FALSE@ $(am__append_13) +@SUPPORT_ANDROID_TRUE@navit_LDADD = @NAVIT_LIBS@ @WORDEXP_LIBS@ \ +@SUPPORT_ANDROID_TRUE@ @ZLIB_LIBS@ @CRYPTO_LIBS@ @INTLLIBS@ \ +@SUPPORT_ANDROID_TRUE@ $(am__append_11) $(am__append_12) \ +@SUPPORT_ANDROID_TRUE@ $(am__append_13) +@SUPPORT_ANDROID_TRUE@v_int = $$(cat $(srcdir)/android/Android_Market_Version_int.txt|grep v_int|cut -d ":" -f 2) +@SUPPORT_ANDROID_TRUE@v_name = "0.5.0-"$$(LANG=C svnversion $(top_srcdir) 2> /dev/null|tr -d ":A-Z" 2> /dev/null) +navit_LDFLAGS = -export-dynamic +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +lib@LIBNAVIT@.la: $(lib@LIBNAVIT@_la_OBJECTS) $(lib@LIBNAVIT@_la_DEPENDENCIES) + $(lib@LIBNAVIT@_la_LINK) $(am_lib@LIBNAVIT@_la_rpath) $(lib@LIBNAVIT@_la_OBJECTS) $(lib@LIBNAVIT@_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +navit$(EXEEXT): $(navit_OBJECTS) $(navit_DEPENDENCIES) + @rm -f navit$(EXEEXT) + $(navit_LINK) $(navit_OBJECTS) $(navit_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/android.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/announcement.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atom.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/attr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bookmarks.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/builtin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callback.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/command.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compass.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/config_.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coord.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/country.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data_window.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/event.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/event_glib.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphics.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/item.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/layout.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linguistics.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/map.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mapset.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maptype.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/menu.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/messages.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/navigation.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/navit.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/obj_filter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osd.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/param.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/phrase.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/popup.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/profile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/projection.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/roadprofile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/route.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/routech.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/search.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/speech.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/start.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/start_real.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sunriset.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/track.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transform.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vehicle.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vehicleprofile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlconfig.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-pkgdataDATA: $(pkgdata_DATA) + @$(NORMAL_INSTALL) + test -z "$(pkgdatadir)" || $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" + @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ + done + +uninstall-pkgdataDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(pkgdatadir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(pkgdatadir)" && rm -f $$files + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) +install-binPROGRAMS: install-libLTLIBRARIES + +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-local distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-pkgdataDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-libLTLIBRARIES + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES \ + uninstall-pkgdataDATA + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \ + ctags-recursive install install-am install-strip \ + tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstLTLIBRARIES ctags ctags-recursive distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-local distclean-tags distdir dvi dvi-am html html-am \ + info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-libLTLIBRARIES \ + install-man install-pdf install-pdf-am install-pkgdataDATA \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-libLTLIBRARIES \ + uninstall-pkgdataDATA + +navit.xml: navit_shipped.xml $(foreach xslt, $(subst $(comma), ,$(XSLTS)), $(addsuffix .xslt,$(addprefix xslt/,$(xslt)))) navit_android_xml + cp $< navit.xml.new + if [ ! -f navit.dtd ]; then cp -f $(top_srcdir)/navit/navit.dtd .; fi + for i in $^; do if [ "$${i%.xslt}" != "$$i" ]; then echo "Applying $$i" ; @SAXON@ -snone navit.xml.new $$i >navit.xml.tmp || exit ; mv -f navit.xml.tmp navit.xml.new || exit ; fi ; done + mv -f navit.xml.new navit.xml + rm -f navit.xml.tmp + +navit_android_xml: navit_shipped.xml +# new android xml files for (mdpi,ldpi,hdpi) +@SUPPORT_ANDROID_TRUE@ cp $(srcdir)/navit_shipped.xml navit_android.xml.new +@SUPPORT_ANDROID_TRUE@ if [ ! -f navit.dtd ]; then cp -f $(top_srcdir)/navit/navit.dtd .; fi + +# # now apply any other xslt files (this would allow for pedestrian plugin) +# for i in $(foreach xslt, $(subst $(comma), ,$(XSLTS)), $(addsuffix .xslt,$(addprefix xslt/,$(xslt)))); do if [ "$${i%.xslt}" != "$$i" ]; then j=`basename $$i` ; if [ "$$j" != "android.xslt" ] ; then echo "Android: Applying $$i" ; @SAXON@ -snone navit_android.xml.new $(srcdir)/"$$i" >navit_android.xml.new.tmp || exit ; mv navit_android.xml.new.tmp navit_android.xml.new || exit ; fi ; fi ; done +# # for now disable pedestrian plugin (zoff99) + +@SUPPORT_ANDROID_TRUE@ @SAXON@ -snone navit_android.xml.new $(srcdir)/xslt/android_mdpi.xslt >navit_android_mdpi.xml.tmp +@SUPPORT_ANDROID_TRUE@ @SAXON@ -snone navit_android.xml.new $(srcdir)/xslt/android_ldpi.xslt >navit_android_ldpi.xml.tmp +@SUPPORT_ANDROID_TRUE@ @SAXON@ -snone navit_android.xml.new $(srcdir)/xslt/android_hdpi.xslt >navit_android_hdpi.xml.tmp +@SUPPORT_ANDROID_TRUE@ rm -f navit_android.xml.new +@SUPPORT_ANDROID_TRUE@ rm -f navit_android.xml.new.tmp +@SUPPORT_ANDROID_TRUE@ mv -f navit_android_mdpi.xml.tmp navit_android_mdpi.xml +@SUPPORT_ANDROID_TRUE@ mv -f navit_android_ldpi.xml.tmp navit_android_ldpi.xml +@SUPPORT_ANDROID_TRUE@ mv -f navit_android_hdpi.xml.tmp navit_android_hdpi.xml +@SUPPORT_ANDROID_TRUE@ rm -f navit_android_mdpi.xml.tmp +@SUPPORT_ANDROID_TRUE@ rm -f navit_android_ldpi.xml.tmp +@SUPPORT_ANDROID_TRUE@ rm -f navit_android_hdpi.xml.tmp +@SUPPORT_ANDROID_FALSE@ echo "no Android support" + +@SUPPORT_ANDROID_TRUE@android/AndroidManifest.xml: android/AndroidManifest.xml.in +@SUPPORT_ANDROID_TRUE@ mkdir -p $(builddir)/android +@SUPPORT_ANDROID_TRUE@ sed '0,/$@ +@SUPPORT_ANDROID_TRUE@ for i in $(subst $(comma), ,@ANDROID_PERMISSIONS@); do echo " " >>$@; done +@SUPPORT_ANDROID_TRUE@ sed '0,/>$@ +@SUPPORT_ANDROID_TRUE@ sed -e "s/@ANDROID_VERSION_INT@/$(v_int)/" <$@ >android/AndroidManifest.xml.tmp +@SUPPORT_ANDROID_TRUE@ mv -f android/AndroidManifest.xml.tmp $@ +@SUPPORT_ANDROID_TRUE@ sed -e "s/@ANDROID_VERSION_NAME@/$(v_name)/" <$@ >android/AndroidManifest.xml.tmp +@SUPPORT_ANDROID_TRUE@ mv -f android/AndroidManifest.xml.tmp $@ + +@SUPPORT_ANDROID_TRUE@android/build.xml: android/AndroidManifest.xml android/dummy.txt +# this is needed, otherwise somehow the files cant be deleted +@SUPPORT_ANDROID_TRUE@ mkdir -p $(builddir)/android/src/ +@SUPPORT_ANDROID_TRUE@ if [ "$(builddir)" != "$(srcdir)" ]; then chmod -R u+w $(builddir)/android/src/; fi +@SUPPORT_ANDROID_TRUE@ if [ "$(builddir)" != "$(srcdir)" ]; then rm -Rf $(builddir)/android/src/; fi +@SUPPORT_ANDROID_TRUE@ if [ "$(builddir)" != "$(srcdir)" ]; then cp -rpf $(srcdir)/android/* $(builddir)/android; fi +@SUPPORT_ANDROID_TRUE@ touch $(srcdir)/android/dummy.txt +@SUPPORT_ANDROID_TRUE@ touch $(builddir)/android/dummy.txt +@SUPPORT_ANDROID_TRUE@ android update project -t @ANDROID_PROJECT@ -p android + +@SUPPORT_ANDROID_TRUE@apkg-all: all android/build.xml navit.xml +@SUPPORT_ANDROID_TRUE@ mkdir -p android/libs/armeabi +@SUPPORT_ANDROID_TRUE@ cp .libs/*.so android/libs/armeabi/libnavit.so +@SUPPORT_ANDROID_TRUE@ for i in */*/.libs/*.so ; do sed 's&lib_data_data_org\.navitproject\.navit_lib_&/data/data/org.navitproject.navit/lib/lib&' <$$i >android/libs/armeabi/$$(basename $$i); done + +@SUPPORT_ANDROID_TRUE@ mkdir -p android/res/drawable-ldpi +@SUPPORT_ANDROID_TRUE@ mkdir -p android/res/drawable-mdpi +@SUPPORT_ANDROID_TRUE@ mkdir -p android/res/drawable-hdpi +@SUPPORT_ANDROID_TRUE@ for i in $(shell cd $(srcdir)/xpm && echo *.xpm); do convert $(srcdir)/xpm/$$i android/res/drawable-mdpi/$${i%.xpm}.png; done +@SUPPORT_ANDROID_TRUE@ for i in $(shell cd $(srcdir)/xpm && echo *.xpm); do convert -resize 75% $(srcdir)/xpm/$$i android/res/drawable-ldpi/$${i%.xpm}.png; done +@SUPPORT_ANDROID_TRUE@ for i in $(shell cd $(srcdir)/xpm && echo *.xpm); do convert -resize 150% $(srcdir)/xpm/$$i android/res/drawable-hdpi/$${i%.xpm}.png; done + +# for i in $(shell cd $(srcdir)/xpm && echo *.png); do cp $(srcdir)/xpm/$$i android/res/drawable-mdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done +# for i in $(shell cd $(srcdir)/xpm && echo *.png); do cp $(srcdir)/xpm/$$i android/res/drawable-ldpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done +# for i in $(shell cd $(srcdir)/xpm && echo *.png); do cp $(srcdir)/xpm/$$i android/res/drawable-hdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done + +@SUPPORT_ANDROID_TRUE@ for i in $(shell cd $(srcdir)/xpm && echo *.png); do convert $(srcdir)/xpm/$$i android/res/drawable-mdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done +@SUPPORT_ANDROID_TRUE@ for i in $(shell cd $(srcdir)/xpm && echo *.png); do convert -resize 75% $(srcdir)/xpm/$$i android/res/drawable-ldpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done +@SUPPORT_ANDROID_TRUE@ for i in $(shell cd $(srcdir)/xpm && echo *.png); do convert -resize 150% $(srcdir)/xpm/$$i android/res/drawable-hdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done + +# if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do cp $(builddir)/xpm/$$i android/res/drawable-mdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi +# if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do cp $(builddir)/xpm/$$i android/res/drawable-ldpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi +# if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do cp $(builddir)/xpm/$$i android/res/drawable-hdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi + +@SUPPORT_ANDROID_TRUE@ if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do convert $(builddir)/xpm/$$i android/res/drawable-mdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi +@SUPPORT_ANDROID_TRUE@ if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do convert -resize 75% $(builddir)/xpm/$$i android/res/drawable-ldpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi +@SUPPORT_ANDROID_TRUE@ if [ "$(builddir)" != "$(srcdir)" ]; then for i in $(shell cd $(builddir)/xpm && echo *.png); do convert -resize 150% $(builddir)/xpm/$$i android/res/drawable-hdpi/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done ; fi + +@SUPPORT_ANDROID_TRUE@ mkdir -p android/res/raw +@SUPPORT_ANDROID_TRUE@ for i in $(shell cd ../po && echo *.mo); do cp ../po/$$i android/res/raw/$$( echo $$i | tr "[A-Z]" "[a-z]") ; done +# cp navit.xml android/res/raw +@SUPPORT_ANDROID_TRUE@ cp navit_android_mdpi.xml android/res/raw/navitmdpi.xml +@SUPPORT_ANDROID_TRUE@ cp navit_android_ldpi.xml android/res/raw/navitldpi.xml +@SUPPORT_ANDROID_TRUE@ cp navit_android_hdpi.xml android/res/raw/navithdpi.xml + +@SUPPORT_ANDROID_TRUE@apkg: apkg-all +@SUPPORT_ANDROID_TRUE@ touch $(srcdir)/android/dummy.txt +@SUPPORT_ANDROID_TRUE@ touch $(builddir)/android/dummy.txt +@SUPPORT_ANDROID_TRUE@ cd android && ant debug + +@SUPPORT_ANDROID_TRUE@apkg-release: apkg-all +@SUPPORT_ANDROID_TRUE@ touch $(srcdir)/android/dummy.txt +@SUPPORT_ANDROID_TRUE@ touch $(builddir)/android/dummy.txt +@SUPPORT_ANDROID_TRUE@ cd android && ant release +@SUPPORT_ANDROID_TRUE@ jarsigner $$(cat ~/.keystore_args) android/bin/Navit-unsigned.apk mykey + +@SUPPORT_WIN32_TRUE@resource.rsc: $(top_srcdir)/navit/gui/win32/resources/resource.rc +@SUPPORT_WIN32_TRUE@ $(WINDRES) -I $(top_srcdir)/navit/gui/win32/resources $(top_srcdir)/navit/gui/win32/resources/resource.rc resource.rsc + +.PHONY: version.h.tmp + +version.h.tmp: + echo "#include \"config.h\"" >version.h.tmp +@SOURCE_MODE_SVN_TRUE@ echo "#define SVN_VERSION \"$$(LANG=C svnversion $(top_srcdir) 2>/dev/null)\"" >>version.h.tmp +@SOURCE_MODE_SVN_FALSE@ echo "#define SVN_VERSION \"@SOURCE_MODE@\"" >>version.h.tmp + echo "#define NAVIT_VARIANT \"@NAVIT_VARIANT@\"" >>version.h.tmp + if ! diff version.h.tmp version.h >/dev/null 2>/dev/null; \ + then \ + mv -f version.h.tmp version.h; \ + fi + +version.h: version.h.tmp + +navit_config.h: ../config.h + cp ../config.h navit_config.h.tmp + if ! diff navit_config.h.tmp navit_config.h >/dev/null 2>/dev/null; \ + then \ + mv -f navit_config.h.tmp navit_config.h; \ + fi + +distclean-local: + rm -f version.h version.h.tmp navit_config.h navit_config.h.tmp builtin.c support-builtin.c navit.xml resurce.rsc + if [ "$(top_builddir)" != "$(top_srcdir)" ]; then rm -f navit.dtd; fi + +builtin.c: $(top_builddir)/config.h + ls $(top_builddir)/navit/*/*/*.la | sed -e "s/\.la/_init(void);/" -e "s/.*lib/extern void module_/" >builtin.c + echo "extern void builtin_init(void);" >>builtin.c + echo "void builtin_init(void) {" >>builtin.c + ls $(top_builddir)/navit/*/*/*.la | grep -v shapefile | sed -e "s/\.la/_init();/" -e "s/.*\\/lib/ module_/" >>builtin.c + echo "}" >>builtin.c +support-builtin.c: $(top_builddir)/config.h + ls $(top_builddir)/navit/support/*/*.la | sed -e "s/\.la/_init(void);/" -e "s/.*lib/extern void module_/" >support-builtin.c + echo "extern void builtin_init(void);" >>support-builtin.c + echo "void builtin_init(void) {" >>support-builtin.c + ls $(top_builddir)/navit/support/*/*.la | sed -e "s/\.la/_init();/" -e "s/.*\\/lib/ module_/" >>support-builtin.c + echo "}" >>support-builtin.c + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/android.c b/navit/android.c new file mode 100644 index 0000000..1107f60 --- /dev/null +++ b/navit/android.c @@ -0,0 +1,450 @@ +#include +#include +#include +#include "android.h" +#include +#include "navit.h" +#include "config_.h" +#include "command.h" +#include "debug.h" +#include "event.h" +#include "callback.h" +#include "country.h" +#include "projection.h" +#include "map.h" +#include "mapset.h" +#include "navit_nls.h" +#include "transform.h" +#include "color.h" +#include "types.h" +#include "search.h" +#include "start_real.h" +#include "track.h" + + +JNIEnv *jnienv; +jobject *android_activity; +int android_version; + +int +android_find_class_global(char *name, jclass *ret) +{ + *ret=(*jnienv)->FindClass(jnienv, name); + if (! *ret) { + dbg(0,"Failed to get Class %s\n",name); + return 0; + } + (*jnienv)->NewGlobalRef(jnienv, *ret); + return 1; +} + +int +android_find_method(jclass class, char *name, char *args, jmethodID *ret) +{ + *ret = (*jnienv)->GetMethodID(jnienv, class, name, args); + if (*ret == NULL) { + dbg(0,"Failed to get Method %s with signature %s\n",name,args); + return 0; + } + return 1; +} + +JNIEXPORT void JNICALL +Java_org_navitproject_navit_Navit_NavitMain( JNIEnv* env, jobject thiz, jobject activity, jobject lang, int version, jobject display_density_string, jobject path) +{ + char *strings[]={NULL,NULL}; + const char *langstr; + const char *displaydensitystr; + android_version=version; + __android_log_print(ANDROID_LOG_ERROR,"test","called"); + jnienv=env; + android_activity=activity; + (*jnienv)->NewGlobalRef(jnienv, activity); + langstr=(*env)->GetStringUTFChars(env, lang, NULL); + dbg(0,"enter env=%p thiz=%p activity=%p lang=%s version=%d\n",env,thiz,activity,langstr,version); + setenv("LANG",langstr,1); + (*env)->ReleaseStringUTFChars(env, lang, langstr); + + displaydensitystr=(*env)->GetStringUTFChars(env, display_density_string, NULL); + dbg(0,"*****displaydensity=%s\n",displaydensitystr); + setenv("ANDROID_DENSITY",displaydensitystr,1); + (*env)->ReleaseStringUTFChars(env, display_density_string, displaydensitystr); + strings[0]=(*env)->GetStringUTFChars(env, path, NULL); + main_real(1, strings); + (*env)->ReleaseStringUTFChars(env, path, strings[0]); + +} + +JNIEXPORT void JNICALL +Java_org_navitproject_navit_Navit_NavitDestroy( JNIEnv* env) +{ + dbg(0, "shutdown navit\n"); + exit(0); +} + +JNIEXPORT void JNICALL +Java_org_navitproject_navit_NavitGraphics_SizeChangedCallback( JNIEnv* env, jobject thiz, int id, int w, int h) +{ + dbg(0,"enter %p %d %d\n",(struct callback *)id,w,h); + if (id) + callback_call_2((struct callback *)id,w,h); +} + +JNIEXPORT void JNICALL +Java_org_navitproject_navit_NavitGraphics_ButtonCallback( JNIEnv* env, jobject thiz, int id, int pressed, int button, int x, int y) +{ + dbg(1,"enter %p %d %d\n",(struct callback *)id,pressed,button); + if (id) + callback_call_4((struct callback *)id,pressed,button,x,y); +} + +JNIEXPORT void JNICALL +Java_org_navitproject_navit_NavitGraphics_MotionCallback( JNIEnv* env, jobject thiz, int id, int x, int y) +{ + dbg(1,"enter %p %d %d\n",(struct callback *)id,x,y); + if (id) + callback_call_2((struct callback *)id,x,y); +} + +JNIEXPORT void JNICALL +Java_org_navitproject_navit_NavitGraphics_KeypressCallback( JNIEnv* env, jobject thiz, int id, jobject str) +{ + const char *s; + dbg(0,"enter %p %p\n",(struct callback *)id,str); + s=(*env)->GetStringUTFChars(env, str, NULL); + dbg(0,"key=%d",s); + if (id) + callback_call_1((struct callback *)id,s); + (*env)->ReleaseStringUTFChars(env, str, s); +} + +JNIEXPORT void JNICALL +Java_org_navitproject_navit_NavitTimeout_TimeoutCallback( JNIEnv* env, jobject thiz, int delete, int id) +{ + dbg(1,"enter %p %d %p\n",thiz, delete, (void *)id); + callback_call_0((struct callback *)id); + if (delete) + (*jnienv)->DeleteGlobalRef(jnienv, thiz); +} + +JNIEXPORT void JNICALL +Java_org_navitproject_navit_NavitVehicle_VehicleCallback( JNIEnv * env, jobject thiz, int id, jobject location) +{ + callback_call_1((struct callback *)id, (void *)location); +} + +JNIEXPORT void JNICALL +Java_org_navitproject_navit_NavitIdle_IdleCallback( JNIEnv* env, jobject thiz, int id) +{ + dbg(1,"enter %p %p\n",thiz, (void *)id); + callback_call_0((struct callback *)id); +} + +JNIEXPORT void JNICALL +Java_org_navitproject_navit_NavitWatch_poll( JNIEnv* env, jobject thiz, int func, int fd, int cond) +{ + void (*pollfunc)(JNIEnv *env, int fd, int cond)=(void *)func; + + pollfunc(env, fd, cond); +} + +JNIEXPORT void JNICALL +Java_org_navitproject_navit_NavitWatch_WatchCallback( JNIEnv* env, jobject thiz, int id) +{ + dbg(1,"enter %p %p\n",thiz, (void *)id); + callback_call_0((struct callback *)id); +} + + +JNIEXPORT void JNICALL +Java_org_navitproject_navit_NavitSensors_SensorCallback( JNIEnv* env, jobject thiz, int id, int sensor, float x, float y, float z) +{ + dbg(1,"enter %p %p %f %f %f\n",thiz, (void *)id,x,y,z); + callback_call_4((struct callback *)id, sensor, &x, &y, &z); +} + +void +android_return_search_result(struct jni_object *jni_o, char *str) +{ + jstring js2 = NULL; + JNIEnv* env2; + env2=jni_o->env; + js2 = (*env2)->NewStringUTF(jni_o->env,str); + (*env2)->CallVoidMethod(jni_o->env, jni_o->jo, jni_o->jm, js2); + (*env2)->DeleteLocalRef(jni_o->env, js2); +} + +JNIEXPORT void JNICALL +Java_org_navitproject_navit_NavitGraphics_CallbackSearchResultList( JNIEnv* env, jobject thiz, int partial, jobject country, jobject str) +{ + struct attr attr; + const char *search_string =(*env)->GetStringUTFChars(env, str, NULL); + dbg(0,"search '%s'\n", search_string); + + config_get_attr(config_get(), attr_navit, &attr, NULL); + + jclass cls = (*env)->GetObjectClass(env,thiz); + jmethodID aMethodID = (*env)->GetMethodID(env, cls, "fillStringArray", "(Ljava/lang/String;)V"); + if(aMethodID != 0) + { + struct jni_object my_jni_object; + GList *ret = NULL; + struct mapset *ms4=navit_get_mapset(attr.u.navit); + struct search_list *sl = search_list_new(ms4); + struct attr country_attr; + const char *str_country=(*env)->GetStringUTFChars(env, country, NULL); + + country_attr.type=attr_country_iso2; + country_attr.u.str=str_country; + + search_list_search(sl, &country_attr, 0); + (*env)->ReleaseStringUTFChars(env, country, str_country); + + my_jni_object.env=env; + my_jni_object.jo=thiz; + my_jni_object.jm=aMethodID; + + /* TODO (rikky#1#): does return nothing yet, also should use a generic callback instead of jni_object */ ret=search_by_address(sl,search_string,partial,&my_jni_object); + search_list_destroy(sl); + + dbg(0,"ret=%p\n",ret); + + g_list_free(ret); + } + else + dbg(0,"**** Unable to get methodID: fillStringArray"); + + (*env)->ReleaseStringUTFChars(env, str, search_string); +} + + +JNIEXPORT jstring JNICALL +Java_org_navitproject_navit_NavitGraphics_CallbackLocalizedString( JNIEnv* env, jobject thiz, jobject str) +{ + const char *s; + const char *localized_str; + + s=(*env)->GetStringUTFChars(env, str, NULL); + //dbg(0,"*****string=%s\n",s); + + localized_str=gettext(s); + //dbg(0,"localized string=%s",localized_str); + + // jstring dataStringValue = (jstring) localized_str; + jstring js = (*env)->NewStringUTF(env,localized_str); + + (*env)->ReleaseStringUTFChars(env, str, s); + + return js; +} + +JNIEXPORT void JNICALL +Java_org_navitproject_navit_NavitGraphics_CallbackMessageChannel( JNIEnv* env, jobject thiz, int channel, jobject str) +{ + struct attr attr; + const char *s; + dbg(0,"enter %d %p\n",channel,str); + + config_get_attr(config_get(), attr_navit, &attr, NULL); + + switch(channel) + { + case 1: + // zoom in + navit_zoom_in_cursor(attr.u.navit, 2); + navit_draw(attr.u.navit); + break; + case 2: + // zoom out + navit_zoom_out_cursor(attr.u.navit, 2); + navit_draw(attr.u.navit); + break; + case 6: + break; + case 5: + // call a command (like in gui) + s=(*env)->GetStringUTFChars(env, str, NULL); + dbg(0,"*****string=%s\n",s); + command_evaluate(&attr,s); + (*env)->ReleaseStringUTFChars(env, str, s); + break; + case 4: + { + // navigate to display position + char *pstr; + struct point p; + struct coord c; + struct pcoord pc; + + struct transformation *transform=navit_get_trans(attr.u.navit); + + s=(*env)->GetStringUTFChars(env, str, NULL); + char parse_str[strlen(s) + 1]; + strcpy(parse_str, s); + (*env)->ReleaseStringUTFChars(env, str, s); + dbg(0,"*****string=%s\n",parse_str); + + // set destination to (pixel-x#pixel-y) + // pixel-x + pstr = strtok (parse_str,"#"); + p.x = atoi(pstr); + // pixel-y + pstr = strtok (NULL, "#"); + p.y = atoi(pstr); + + dbg(0,"11x=%d\n",p.x); + dbg(0,"11y=%d\n",p.y); + + transform_reverse(transform, &p, &c); + + + pc.x = c.x; + pc.y = c.y; + pc.pro = transform_get_projection(transform); + + dbg(0,"22x=%d\n",pc.x); + dbg(0,"22y=%d\n",pc.y); + + // start navigation asynchronous + navit_set_destination(attr.u.navit, &pc, parse_str, 1); + } + break; + case 3: + { + // navigate to geo position + char *name; + s=(*env)->GetStringUTFChars(env, str, NULL); + char parse_str[strlen(s) + 1]; + strcpy(parse_str, s); + (*env)->ReleaseStringUTFChars(env, str, s); + dbg(0,"*****string=%s\n",s); + + // set destination to (lat#lon#title) + struct coord_geo g; + char *p; + char *stopstring; + + // lat + p = strtok (parse_str,"#"); + g.lat = strtof(p, &stopstring); + // lon + p = strtok (NULL, "#"); + g.lng = strtof(p, &stopstring); + // description + name = strtok (NULL, "#"); + + dbg(0,"lat=%f\n",g.lat); + dbg(0,"lng=%f\n",g.lng); + dbg(0,"str1=%s\n",name); + + struct coord c; + transform_from_geo(projection_mg, &g, &c); + + struct pcoord pc; + pc.x=c.x; + pc.y=c.y; + pc.pro=projection_mg; + + // start navigation asynchronous + navit_set_destination(attr.u.navit, &pc, name, 1); + + } + break; + default: + dbg(0, "Unknown command"); + } +} + +JNIEXPORT jstring JNICALL +Java_org_navitproject_navit_NavitGraphics_GetDefaultCountry( JNIEnv* env, jobject thiz, int channel, jobject str) +{ + struct attr search_attr, country_name, country_iso2, *country_attr; + struct tracking *tracking; + struct search_list_result *res; + jstring return_string = NULL; + + struct attr attr; + dbg(0,"enter %d %p\n",channel,str); + + config_get_attr(config_get(), attr_navit, &attr, NULL); + + country_attr=country_default(); + tracking=navit_get_tracking(attr.u.navit); + if (tracking && tracking_get_attr(tracking, attr_country_id, &search_attr, NULL)) + country_attr=&search_attr; + if (country_attr) { + struct country_search *cs=country_search_new(country_attr, 0); + struct item *item=country_search_get_item(cs); + if (item && item_attr_get(item, attr_country_name, &country_name)) { + struct mapset *ms=navit_get_mapset(attr.u.navit); + struct search_list *search_list = search_list_new(ms); + search_attr.type=attr_country_all; + dbg(0,"country %s\n", country_name.u.str); + search_attr.u.str=country_name.u.str; + search_list_search(search_list, &search_attr, 0); + while((res=search_list_get_result(search_list))) + { + dbg(0,"Get result: %s\n", res->country->iso2); + } + if (item_attr_get(item, attr_country_iso2, &country_iso2)) + return_string = (*env)->NewStringUTF(env,country_iso2.u.str); + } + country_search_destroy(cs); + } + + return return_string; +} + +JNIEXPORT jobjectArray JNICALL +Java_org_navitproject_navit_NavitGraphics_GetAllCountries( JNIEnv* env, jobject thiz) +{ + struct attr search_attr; + struct search_list_result *res; + GList* countries = NULL; + int country_count = 0; + jobjectArray all_countries; + + struct attr attr; + dbg(0,"enter\n"); + + config_get_attr(config_get(), attr_navit, &attr, NULL); + + struct mapset *ms=navit_get_mapset(attr.u.navit); + struct search_list *search_list = search_list_new(ms); + jobjectArray current_country = NULL; + search_attr.type=attr_country_all; + //dbg(0,"country %s\n", country_name.u.str); + search_attr.u.str=g_strdup("");//country_name.u.str; + search_list_search(search_list, &search_attr, 1); + while((res=search_list_get_result(search_list))) + { + dbg(0,"Get result: %s\n", res->country->iso2); + + if (strlen(res->country->iso2)==2) + { + jstring j_iso2 = (*env)->NewStringUTF(env, res->country->iso2); + jstring j_name = (*env)->NewStringUTF(env, gettext(res->country->name)); + + current_country = (jobjectArray)(*env)->NewObjectArray(env, 2, (*env)->FindClass(env, "java/lang/String"), NULL); + + (*env)->SetObjectArrayElement(env, current_country, 0, j_iso2); + (*env)->SetObjectArrayElement(env, current_country, 1, j_name); + + (*env)->DeleteLocalRef(env, j_iso2); + (*env)->DeleteLocalRef(env, j_name); + + countries = g_list_prepend(countries, current_country); + country_count++; + } + } + + search_list_destroy(search_list); + all_countries = (jobjectArray)(*env)->NewObjectArray(env, country_count, (*env)->GetObjectClass(env, current_country), NULL); + + while(countries) + { + (*env)->SetObjectArrayElement(env, all_countries, --country_count, countries->data); + countries = g_list_delete_link( countries, countries); + } + return all_countries; +} diff --git a/navit/android.h b/navit/android.h new file mode 100644 index 0000000..84643e7 --- /dev/null +++ b/navit/android.h @@ -0,0 +1,23 @@ +#ifdef HAVE_API_ANDROID + +#include +extern JNIEnv *jnienv; +extern jobject *android_activity; +extern int android_version; +int android_find_class_global(char *name, jclass *ret); +int android_find_method(jclass class, char *name, char *args, jmethodID *ret); +int android_find_static_method(jclass class, char *name, char *args, jmethodID *ret); + +struct jni_object { + JNIEnv* env; + jobject jo; + jmethodID jm; +}; + +#else + +struct jni_object { + int dummy; +}; + +#endif diff --git a/navit/announcement.c b/navit/announcement.c new file mode 100644 index 0000000..9ea367a --- /dev/null +++ b/navit/announcement.c @@ -0,0 +1,68 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include "debug.h" +#include "item.h" +#include "announcement.h" + +struct announcement { + struct attr **attrs; +}; + +struct announcement * +announcement_new(struct attr *parent, struct attr **attrs) +{ + struct announcement *this_; + struct attr *type_attr; + if (! (type_attr=attr_search(attrs, NULL, attr_name))) { + return NULL; + } + this_=g_new0(struct announcement, 1); + this_->attrs=attr_list_dup(attrs); + return this_; +} + +int +announcement_get_attr(struct announcement *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); +} + +int +announcement_set_attr(struct announcement *this_, struct attr *attr) +{ + this_->attrs=attr_generic_set_attr(this_->attrs, attr); + return 1; +} + +int +announcement_add_attr(struct announcement *this_, struct attr *attr) +{ + this_->attrs=attr_generic_add_attr(this_->attrs, attr); + return 1; +} + +int +announcement_remove_attr(struct announcement *this_, struct attr *attr) +{ + this_->attrs=attr_generic_remove_attr(this_->attrs, attr); + return 1; +} + diff --git a/navit/announcement.h b/navit/announcement.h new file mode 100644 index 0000000..695df4b --- /dev/null +++ b/navit/announcement.h @@ -0,0 +1,24 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +struct announcement * announcement_new(struct attr *parent, struct attr **attrs); +int announcement_get_attr(struct announcement *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); +int announcement_set_attr(struct announcement *this_, struct attr *attr); +int announcement_add_attr(struct announcement *this_, struct attr *attr); +int announcement_remove_attr(struct announcement *this_, struct attr *attr); diff --git a/navit/atom.c b/navit/atom.c new file mode 100644 index 0000000..de11ce8 --- /dev/null +++ b/navit/atom.c @@ -0,0 +1,31 @@ +#include +#include "atom.h" + +static GHashTable *atom_hash; + +char * +atom_lookup(char *name) +{ + if (!atom_hash) + return NULL; + return g_hash_table_lookup(atom_hash,name); +} + +char * +atom(char *name) +{ + char *id=atom_lookup(name); + if (id) + return id; + if (!atom_hash) + return NULL; + id=g_strdup(name); + g_hash_table_insert(atom_hash, id, id); + return id; +} + +void +atom_init(void) +{ + atom_hash=g_hash_table_new(g_str_hash, g_str_equal); +} diff --git a/navit/atom.h b/navit/atom.h new file mode 100644 index 0000000..cf77057 --- /dev/null +++ b/navit/atom.h @@ -0,0 +1,9 @@ +#ifdef __cplusplus +extern "C" { +#endif +char * atom_lookup(char *name); +char * atom(char *name); +void atom_init(void); +#ifdef __cplusplus +} +#endif diff --git a/navit/attr.c b/navit/attr.c new file mode 100644 index 0000000..894f01b --- /dev/null +++ b/navit/attr.c @@ -0,0 +1,731 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include "debug.h" +#include "item.h" +#include "coord.h" +#include "transform.h" +#include "color.h" +#include "attr.h" +#include "map.h" +#include "config.h" +#include "endianess.h" +#include "util.h" +#include "types.h" +#include "xmlconfig.h" + +struct attr_name { + enum attr_type attr; + char *name; +}; + + +static struct attr_name attr_names[]={ +#define ATTR2(x,y) ATTR(y) +#define ATTR(x) { attr_##x, #x }, +#include "attr_def.h" +#undef ATTR2 +#undef ATTR +}; + +enum attr_type +attr_from_name(const char *name) +{ + int i; + + for (i=0 ; i < sizeof(attr_names)/sizeof(struct attr_name) ; i++) { + if (! strcmp(attr_names[i].name, name)) + return attr_names[i].attr; + } + return attr_none; +} + + +static int attr_match(enum attr_type search, enum attr_type found); + + + +char * +attr_to_name(enum attr_type attr) +{ + int i; + + for (i=0 ; i < sizeof(attr_names)/sizeof(struct attr_name) ; i++) { + if (attr_names[i].attr == attr) + return attr_names[i].name; + } + return NULL; +} + +struct attr * +attr_new_from_text(const char *name, const char *value) +{ + enum attr_type attr; + struct attr *ret; + struct coord_geo *g; + struct coord c; + char *pos,*type_str,*str,*tok; + int min,max,count; + + ret=g_new0(struct attr, 1); + dbg(1,"enter name='%s' value='%s'\n", name, value); + attr=attr_from_name(name); + ret->type=attr; + switch (attr) { + case attr_item_type: + ret->u.item_type=item_from_name(value); + break; + case attr_item_types: + count=0; + type_str=g_strdup(value); + str=type_str; + while ((tok=strtok(str, ","))) { + ret->u.item_types=g_realloc(ret->u.item_types, (count+2)*sizeof(enum item_type)); + ret->u.item_types[count++]=item_from_name(tok); + ret->u.item_types[count]=type_none; + str=NULL; + } + g_free(type_str); + break; + case attr_attr_types: + count=0; + type_str=g_strdup(value); + str=type_str; + while ((tok=strtok(str, ","))) { + ret->u.attr_types=g_realloc(ret->u.attr_types, (count+2)*sizeof(enum attr_type)); + ret->u.attr_types[count++]=attr_from_name(tok); + ret->u.attr_types[count]=attr_none; + str=NULL; + } + g_free(type_str); + break; + case attr_dash: + count=0; + type_str=g_strdup(value); + str=type_str; + while ((tok=strtok(str, ","))) { + ret->u.dash=g_realloc(ret->u.dash, (count+2)*sizeof(int)); + ret->u.dash[count++]=g_ascii_strtoull(tok,NULL,0); + ret->u.dash[count]=0; + str=NULL; + } + g_free(type_str); + break; + case attr_order: + case attr_sequence_range: + case attr_angle_range: + case attr_speed_range: + pos=strchr(value, '-'); + min=0; + max=32767; + if (! pos) { + sscanf(value,"%d",&min); + max=min; + } else if (pos == value) + sscanf(value,"-%d",&max); + else + sscanf(value,"%d-%d",&min, &max); + ret->u.range.min=min; + ret->u.range.max=max; + break; + default: + if (attr >= attr_type_string_begin && attr <= attr_type_string_end) { + ret->u.str=g_strdup(value); + break; + } + if (attr >= attr_type_int_begin && attr <= attr_type_int_end) { + if (value[0] == '0' && value[1] == 'x') + ret->u.num=strtoul(value, NULL, 0); + else + ret->u.num=strtol(value, NULL, 0); + + if ((attr >= attr_type_rel_abs_begin) && (attr < attr_type_boolean_begin)) { + /* Absolute values are from -0x40000000 - 0x40000000, with 0x0 being 0 (who would have thought that?) + Relative values are from 0x40000001 - 0x80000000, with 0x60000000 being 0 */ + if (strchr(value, '%')) { + if ((ret->u.num > 0x20000000) || (ret->u.num < -0x1FFFFFFF)) { + dbg(0, "Relative possibly-relative attribute with invalid value %i\n", ret->u.num); + } + + ret->u.num += 0x60000000; + } else { + if ((ret->u.num > 0x40000000) || (ret->u.num < -0x40000000)) { + dbg(0, "Non-relative possibly-relative attribute with invalid value %i\n", ret->u.num); + } + } + } else if (attr >= attr_type_boolean_begin) { // also check for yes and no + if (g_ascii_strcasecmp(value,"no") && g_ascii_strcasecmp(value,"0") && g_ascii_strcasecmp(value,"false")) + ret->u.num=1; + else + ret->u.num=0; + } + break; + } + if (attr >= attr_type_color_begin && attr <= attr_type_color_end) { + struct color *color=g_new0(struct color, 1); + int r,g,b,a; + ret->u.color=color; + if(strlen(value)==7){ + sscanf(value,"#%02x%02x%02x", &r, &g, &b); + color->r = (r << 8) | r; + color->g = (g << 8) | g; + color->b = (b << 8) | b; + color->a = (65535); + } else if(strlen(value)==9){ + sscanf(value,"#%02x%02x%02x%02x", &r, &g, &b, &a); + color->r = (r << 8) | r; + color->g = (g << 8) | g; + color->b = (b << 8) | b; + color->a = (a << 8) | a; + } else { + dbg(0,"color %s has unknown format\n",value); + } + break; + } + if (attr >= attr_type_coord_geo_begin && attr <= attr_type_coord_geo_end) { + g=g_new(struct coord_geo, 1); + ret->u.coord_geo=g; + coord_parse(value, projection_mg, &c); + transform_to_geo(projection_mg, &c, g); + break; + } + dbg(1,"default\n"); + g_free(ret); + ret=NULL; + } + return ret; +} + +static char * +flags_to_text(int flags) +{ + char *ret=g_strdup_printf("0x%x:",flags); + if (flags & AF_ONEWAY) ret=g_strconcat_printf(ret,"%sAF_ONEWAY",ret?"|":""); + if (flags & AF_ONEWAYREV) ret=g_strconcat_printf(ret,"%sAF_ONEWAYREV",ret?"|":""); + if (flags & AF_SEGMENTED) ret=g_strconcat_printf(ret,"%sAF_SEGMENTED",ret?"|":""); + if (flags & AF_ROUNDABOUT) ret=g_strconcat_printf(ret,"%sAF_ROUNDABOUT",ret?"|":""); + if (flags & AF_ROUNDABOUT_VALID) ret=g_strconcat_printf(ret,"%sAF_ROUNDABOUT_VALID",ret?"|":""); + if (flags & AF_ONEWAY_EXCEPTION) ret=g_strconcat_printf(ret,"%sAF_ONEWAY_EXCEPTION",ret?"|":""); + if (flags & AF_SPEED_LIMIT) ret=g_strconcat_printf(ret,"%sAF_SPEED_LIMIT",ret?"|":""); + if (flags & AF_RESERVED1) ret=g_strconcat_printf(ret,"%sAF_RESERVED1",ret?"|":""); + if (flags & AF_SIZE_OR_WEIGHT_LIMIT) ret=g_strconcat_printf(ret,"%sAF_SIZE_OR_WEIGHT_LIMIT",ret?"|":""); + if (flags & AF_THROUGH_TRAFFIC_LIMIT) ret=g_strconcat_printf(ret,"%sAF_THROUGH_TRAFFIC_LIMIT",ret?"|":""); + if (flags & AF_TOLL) ret=g_strconcat_printf(ret,"%sAF_TOLL",ret?"|":""); + if (flags & AF_SEASONAL) ret=g_strconcat_printf(ret,"%sAF_SEASONAL",ret?"|":""); + if (flags & AF_UNPAVED) ret=g_strconcat_printf(ret,"%sAF_UNPAVED",ret?"|":""); + if (flags & AF_FORD) ret=g_strconcat_printf(ret,"%sAF_FORD",ret?"|":""); + if (flags & AF_UNDERGROUND) ret=g_strconcat_printf(ret,"%sAF_UNDERGROUND",ret?"|":""); + if (flags & AF_DANGEROUS_GOODS) ret=g_strconcat_printf(ret,"%sAF_DANGEROUS_GOODS",ret?"|":""); + if ((flags & AF_ALL) == AF_ALL) + return g_strconcat_printf(ret,"%sAF_ALL",ret?"|":""); + if ((flags & AF_ALL) == AF_MOTORIZED_FAST) + return g_strconcat_printf(ret,"%sAF_MOTORIZED_FAST",ret?"|":""); + if (flags & AF_EMERGENCY_VEHICLES) ret=g_strconcat_printf(ret,"%sAF_EMERGENCY_VEHICLES",ret?"|":""); + if (flags & AF_TRANSPORT_TRUCK) ret=g_strconcat_printf(ret,"%sAF_TRANSPORT_TRUCK",ret?"|":""); + if (flags & AF_DELIVERY_TRUCK) ret=g_strconcat_printf(ret,"%sAF_DELIVERY_TRUCK",ret?"|":""); + if (flags & AF_PUBLIC_BUS) ret=g_strconcat_printf(ret,"%sAF_PUBLIC_BUS",ret?"|":""); + if (flags & AF_TAXI) ret=g_strconcat_printf(ret,"%sAF_TAXI",ret?"|":""); + if (flags & AF_HIGH_OCCUPANCY_CAR) ret=g_strconcat_printf(ret,"%sAF_HIGH_OCCUPANCY_CAR",ret?"|":""); + if (flags & AF_CAR) ret=g_strconcat_printf(ret,"%sAF_CAR",ret?"|":""); + if (flags & AF_MOTORCYCLE) ret=g_strconcat_printf(ret,"%sAF_MOTORCYCLE",ret?"|":""); + if (flags & AF_MOPED) ret=g_strconcat_printf(ret,"%sAF_MOPED",ret?"|":""); + if (flags & AF_HORSE) ret=g_strconcat_printf(ret,"%sAF_HORSE",ret?"|":""); + if (flags & AF_BIKE) ret=g_strconcat_printf(ret,"%sAF_BIKE",ret?"|":""); + if (flags & AF_PEDESTRIAN) ret=g_strconcat_printf(ret,"%sAF_PEDESTRIAN",ret?"|":""); + return ret; +} + +char * +attr_to_text(struct attr *attr, struct map *map, int pretty) +{ + char *ret; + enum attr_type type=attr->type; + + if (type >= attr_type_item_begin && type <= attr_type_item_end) { + struct item *item=attr->u.item; + struct attr type, data; + if (! item) + return g_strdup("(nil)"); + if (! item->map || !map_get_attr(item->map, attr_type, &type, NULL)) + type.u.str=""; + if (! item->map || !map_get_attr(item->map, attr_data, &data, NULL)) + data.u.str=""; + return g_strdup_printf("type=0x%x id=0x%x,0x%x map=%p (%s:%s)", item->type, item->id_hi, item->id_lo, item->map, type.u.str, data.u.str); + } + if (type >= attr_type_string_begin && type <= attr_type_string_end) { + if (map) { + char *mstr; + if (attr->u.str) { + mstr=map_convert_string(map, attr->u.str); + ret=g_strdup(mstr); + map_convert_free(mstr); + } else + ret=g_strdup("(null)"); + + } else + ret=g_strdup(attr->u.str); + return ret; + } + if (type == attr_flags || type == attr_through_traffic_flags) + return flags_to_text(attr->u.num); + if (type >= attr_type_int_begin && type <= attr_type_int_end) + return g_strdup_printf("%ld", attr->u.num); + if (type >= attr_type_int64_begin && type <= attr_type_int64_end) + return g_strdup_printf(LONGLONG_FMT, *attr->u.num64); + if (type >= attr_type_double_begin && type <= attr_type_double_end) + return g_strdup_printf("%f", *attr->u.numd); + if (type >= attr_type_object_begin && type <= attr_type_object_end) + return g_strdup_printf("(object[%s])", attr_to_name(type)); + if (type >= attr_type_color_begin && type <= attr_type_color_end) { + if (attr->u.color->a != 65535) + return g_strdup_printf("#%02x%02x%02x%02x", attr->u.color->r>>8,attr->u.color->g>>8,attr->u.color->b>>8, attr->u.color->a>>8); + else + return g_strdup_printf("#%02x%02x%02x", attr->u.color->r>>8,attr->u.color->g>>8,attr->u.color->b>>8); + } + if (type >= attr_type_coord_geo_begin && type <= attr_type_coord_geo_end) + return g_strdup_printf("%f %f",attr->u.coord_geo->lng,attr->u.coord_geo->lat); + if (type == attr_zipfile_ref_block) { + int *data=attr->u.data; + return g_strdup_printf("0x%x,0x%x,0x%x",data[0],data[1],data[2]); + } + if (type == attr_item_id) { + int *data=attr->u.data; + return g_strdup_printf("0x%x,0x%x",data[0],data[1]); + } + if (type >= attr_type_group_begin && type <= attr_type_group_end) { + int i=0; + char *ret=g_strdup(""); + char *sep=""; + while (attr->u.attrs[i].type) { + char *val=attr_to_text(&attr->u.attrs[i], map, pretty); + ret=g_strconcat_printf(ret,"%s%s=%s",sep,attr_to_name(attr->u.attrs[i].type),val); + g_free(val); + sep=" "; + i++; + } + return ret; + } + if (type >= attr_type_item_type_begin && type <= attr_type_item_type_end) { + return g_strdup_printf("0x%ld[%s]",attr->u.num,item_to_name(attr->u.num)); + } + return g_strdup_printf("(no text[%s])", attr_to_name(type)); +} + +struct attr * +attr_search(struct attr **attrs, struct attr *last, enum attr_type attr) +{ + dbg(1, "enter attrs=%p\n", attrs); + while (*attrs) { + dbg(1,"*attrs=%p\n", *attrs); + if ((*attrs)->type == attr) { + return *attrs; + } + attrs++; + } + return NULL; +} + +static int +attr_match(enum attr_type search, enum attr_type found) +{ + switch (search) { + case attr_any: + return 1; + case attr_any_xml: + switch (found) { + case attr_callback: + return 0; + default: + return 1; + } + default: + return search == found; + } +} + +int +attr_generic_get_attr(struct attr **attrs, struct attr **def_attrs, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + while (attrs && *attrs) { + if (attr_match(type,(*attrs)->type)) { + *attr=**attrs; + if (!iter) + return 1; + if (*((void **)iter) < (void *)attrs) { + *((void **)iter)=(void *)attrs; + return 1; + } + } + attrs++; + } + if (type == attr_any || type == attr_any_xml) + return 0; + while (def_attrs && *def_attrs) { + if ((*def_attrs)->type == type) { + *attr=**def_attrs; + return 1; + } + def_attrs++; + } + return 0; +} + +struct attr ** +attr_generic_set_attr(struct attr **attrs, struct attr *attr) +{ + struct attr **curr=attrs; + int i,count=0; + while (curr && *curr) { + if ((*curr)->type == attr->type) { + attr_free(*curr); + *curr=attr_dup(attr); + return attrs; + } + curr++; + count++; + } + curr=g_new0(struct attr *, count+2); + for (i = 0 ; i < count ; i++) + curr[i]=attrs[i]; + curr[count]=attr_dup(attr); + curr[count+1]=NULL; + g_free(attrs); + return curr; +} + +struct attr ** +attr_generic_add_attr(struct attr **attrs, struct attr *attr) +{ + struct attr **curr=attrs; + int i,count=0; + while (curr && *curr) { + curr++; + count++; + } + curr=g_new0(struct attr *, count+2); + for (i = 0 ; i < count ; i++) + curr[i]=attrs[i]; + curr[count]=attr_dup(attr); + curr[count+1]=NULL; + g_free(attrs); + return curr; +} + +struct attr ** +attr_generic_remove_attr(struct attr **attrs, struct attr *attr) +{ + struct attr **curr=attrs; + int i,j,count=0,found=0; + while (curr && *curr) { + if ((*curr)->type == attr->type && (*curr)->u.data == attr->u.data) + found=1; + curr++; + count++; + } + if (!found) + return attrs; + curr=g_new0(struct attr *, count); + j=0; + for (i = 0 ; i < count ; i++) { + if (attrs[i]->type != attr->type || attrs[i]->u.data != attr->u.data) + curr[j++]=attrs[i]; + else + attr_free(attrs[i]); + } + curr[j]=NULL; + g_free(attrs); + return curr; +} + +enum attr_type +attr_type_begin(enum attr_type type) +{ + if (type < attr_type_item_begin) + return attr_none; + if (type < attr_type_int_begin) + return attr_type_item_begin; + if (type < attr_type_string_begin) + return attr_type_int_begin; + if (type < attr_type_special_begin) + return attr_type_string_begin; + if (type < attr_type_double_begin) + return attr_type_special_begin; + if (type < attr_type_coord_geo_begin) + return attr_type_double_begin; + if (type < attr_type_color_begin) + return attr_type_coord_geo_begin; + if (type < attr_type_object_begin) + return attr_type_color_begin; + if (type < attr_type_coord_begin) + return attr_type_object_begin; + if (type < attr_type_pcoord_begin) + return attr_type_coord_begin; + if (type < attr_type_callback_begin) + return attr_type_pcoord_begin; + if (type < attr_type_int64_begin) + return attr_type_callback_begin; + if (type <= attr_type_int64_end) + return attr_type_int64_begin; + return attr_none; +} + +int +attr_data_size(struct attr *attr) +{ + if (attr->type >= attr_type_string_begin && attr->type <= attr_type_string_end) + return strlen(attr->u.str)+1; + if (attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) + return sizeof(attr->u.num); + if (attr->type >= attr_type_coord_geo_begin && attr->type <= attr_type_coord_geo_end) + return sizeof(*attr->u.coord_geo); + if (attr->type >= attr_type_color_begin && attr->type <= attr_type_color_end) + return sizeof(*attr->u.color); + if (attr->type >= attr_type_object_begin && attr->type <= attr_type_object_end) + return sizeof(void *); + if (attr->type >= attr_type_item_begin && attr->type <= attr_type_item_end) + return sizeof(struct item); + if (attr->type >= attr_type_int64_begin && attr->type <= attr_type_int64_end) + return sizeof(*attr->u.num64); + if (attr->type == attr_order) + return sizeof(attr->u.range); + if (attr->type >= attr_type_double_begin && attr->type <= attr_type_double_end) + return sizeof(*attr->u.numd); + if (attr->type == attr_item_types) { + int i=0; + while (attr->u.item_types[i++] != type_none); + return i*sizeof(enum item_type); + } + if (attr->type >= attr_type_item_type_begin && attr->type <= attr_type_item_type_end) + return sizeof(enum item_type); + if (attr->type == attr_attr_types) { + int i=0; + while (attr->u.attr_types[i++] != attr_none); + return i*sizeof(enum attr_type); + } + dbg(0,"size for %s unknown\n", attr_to_name(attr->type)); + return 0; +} + +void * +attr_data_get(struct attr *attr) +{ + if ((attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) || + (attr->type >= attr_type_item_type_begin && attr->type <= attr_type_item_type_end)) + return &attr->u.num; + if (attr->type == attr_order) + return &attr->u.range; + return attr->u.data; +} + +void +attr_data_set(struct attr *attr, void *data) +{ + if ((attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) || + (attr->type >= attr_type_item_type_begin && attr->type <= attr_type_item_type_end)) + attr->u.num=*((int *)data); + else + attr->u.data=data; +} + +void +attr_data_set_le(struct attr * attr, void * data) +{ + if ((attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) || + (attr->type >= attr_type_item_type_begin && attr->type <= attr_type_item_type_end)) + attr->u.num=le32_to_cpu(*((int *)data)); + else if (attr->type == attr_order) { + attr->u.num=le32_to_cpu(*((int *)data)); + attr->u.range.min=le16_to_cpu(attr->u.range.min); + attr->u.range.max=le16_to_cpu(attr->u.range.max); + } + else +/* Fixme: Handle long long */ + attr->u.data=data; + +} + +void +attr_free(struct attr *attr) +{ + if (!attr) + return; + if (attr->type == attr_navit || attr->type == attr_vehicle) { + struct navit_object *obj=attr->u.data; + if (obj && obj->func && obj->func->unref) + obj->func->unref(obj); + } + if (!(attr->type >= attr_type_int_begin && attr->type <= attr_type_int_end) && + !(attr->type >= attr_type_object_begin && attr->type <= attr_type_object_end)) + g_free(attr->u.data); + g_free(attr); +} + +void +attr_dup_content(struct attr *src, struct attr *dst) +{ + int size; + dst->type=src->type; + if (src->type >= attr_type_int_begin && src->type <= attr_type_int_end) + dst->u.num=src->u.num; + else if (src->type >= attr_type_object_begin && src->type <= attr_type_object_end) { + if (src->type == attr_navit || src->type == attr_vehicle) { + struct navit_object *obj=src->u.data; + if (obj && obj->func && obj->func->ref) { + dst->u.data=obj->func->ref(obj); + } else + dst->u.data=obj; + } else + dst->u.data=src->u.data; + } else { + size=attr_data_size(src); + if (size) { + dst->u.data=g_malloc(size); + memcpy(dst->u.data, src->u.data, size); + } + } +} + +struct attr * +attr_dup(struct attr *attr) +{ + struct attr *ret=g_new0(struct attr, 1); + attr_dup_content(attr, ret); + return ret; +} + +void +attr_list_free(struct attr **attrs) +{ + int count=0; + while (attrs && attrs[count]) { + attr_free(attrs[count++]); + } + g_free(attrs); +} + +struct attr ** +attr_list_dup(struct attr **attrs) +{ + struct attr **ret=attrs; + int i,count=0; + + while (attrs[count]) + count++; + ret=g_new0(struct attr *, count+1); + for (i = 0 ; i < count ; i++) + ret[i]=attr_dup(attrs[i]); + return ret; +} + + +int +attr_from_line(char *line, char *name, int *pos, char *val_ret, char *name_ret) +{ + int len=0,quoted; + char *p,*e,*n; + + dbg(1,"get_tag %s from %s\n", name, line); + if (name) + len=strlen(name); + if (pos) + p=line+*pos; + else + p=line; + for(;;) { + while (*p == ' ') { + p++; + } + if (! *p) + return 0; + n=p; + e=strchr(p,'='); + if (! e) + return 0; + p=e+1; + quoted=0; + while (*p) { + if (*p == ' ' && !quoted) + break; + if (*p == '"') + quoted=1-quoted; + p++; + } + if (name == NULL || (e-n == len && !strncmp(n, name, len))) { + if (name_ret) { + len=e-n; + strncpy(name_ret, n, len); + name_ret[len]='\0'; + } + e++; + len=p-e; + if (e[0] == '"') { + e++; + len-=2; + } + strncpy(val_ret, e, len); + val_ret[len]='\0'; + if (pos) + *pos=p-line; + return 1; + } + } + return 0; +} + +/** + * Check if an enumeration of attribute types contains a specific attribute. + * + * @param types Pointer to the attr_type enumeration to be searched + * @param type The attr_type to be searched for + * + * @return 1 if the attribute type was found, 0 if it was not found or if a null pointer was passed as types + */ +int +attr_types_contains(enum attr_type *types, enum attr_type type) +{ + while (types && *types != attr_none) { + if (*types == type) + return 1; + types++; + } + return 0; +} + +/** + * Check if an enumeration of attribute types contains a specific attribute. + * It is different from attr_types_contains in that it returns a caller-defined value if the pointer to the enumeration is NULL. + * + * @param types Pointer to the attr_type enumeration to be searched + * @param type The attr_type to be searched for + * @param deflt The default value to return if types is NULL. + * + * @return 1 if the attribute type was found, 0 if it was not found, the value of the deflt argument if types is NULL. + */ +int +attr_types_contains_default(enum attr_type *types, enum attr_type type, int deflt) +{ + if (!types) { + return deflt; + } + return attr_types_contains(types, type); +} diff --git a/navit/attr.h b/navit/attr.h new file mode 100644 index 0000000..0f58f21 --- /dev/null +++ b/navit/attr.h @@ -0,0 +1,197 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_ATTR_H +#define NAVIT_ATTR_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "projection.h" + +enum item_type; + +enum attr_type { +#define ATTR2(x,y) attr_##y=x, +#define ATTR(x) attr_##x, +#include "attr_def.h" +#undef ATTR2 +#undef ATTR +}; + +#define AF_ONEWAY (1<<0) +#define AF_ONEWAYREV (1<<1) +#define AF_NOPASS (AF_ONEWAY|AF_ONEWAYREV) +#define AF_ONEWAYMASK (AF_ONEWAY|AF_ONEWAYREV) +#define AF_SEGMENTED (1<<2) +#define AF_ROUNDABOUT (1<<3) +#define AF_ROUNDABOUT_VALID (1<<4) +#define AF_ONEWAY_EXCEPTION (1<<5) +#define AF_SPEED_LIMIT (1<<6) +#define AF_RESERVED1 (1<<7) +#define AF_SIZE_OR_WEIGHT_LIMIT (1<<8) +#define AF_THROUGH_TRAFFIC_LIMIT (1<<9) +#define AF_TOLL (1<<10) +#define AF_SEASONAL (1<<11) +#define AF_UNPAVED (1<<12) +#define AF_FORD (1<<13) +#define AF_UNDERGROUND (1<<14) +#define AF_DANGEROUS_GOODS (1<<19) +#define AF_EMERGENCY_VEHICLES (1<<20) +#define AF_TRANSPORT_TRUCK (1<<21) +#define AF_DELIVERY_TRUCK (1<<22) +#define AF_PUBLIC_BUS (1<<23) +#define AF_TAXI (1<<24) +#define AF_HIGH_OCCUPANCY_CAR (1<<25) +#define AF_CAR (1<<26) +#define AF_MOTORCYCLE (1<<27) +#define AF_MOPED (1<<28) +#define AF_HORSE (1<<29) +#define AF_BIKE (1<<30) +#define AF_PEDESTRIAN (1<<31) + +#define AF_PBH (AF_PEDESTRIAN|AF_BIKE|AF_HORSE) +#define AF_MOTORIZED_FAST (AF_MOTORCYCLE|AF_CAR|AF_HIGH_OCCUPANCY_CAR|AF_TAXI|AF_PUBLIC_BUS|AF_DELIVERY_TRUCK|AF_TRANSPORT_TRUCK|AF_EMERGENCY_VEHICLES) +#define AF_ALL (AF_PBH|AF_MOPED|AF_MOTORIZED_FAST) + + +#define AF_DG_ANY (1<<0) +#define AF_DG_WATER_HARMFUL (1<<1) +#define AF_DG_EXPLOSIVE (1<<2) +#define AF_DG_FLAMMABLE (1<<3) + +/* Values for attributes that could carry relative values */ +#define ATTR_REL_MAXABS 0x40000000 +#define ATTR_REL_RELSHIFT 0x60000000 + +enum attr_position_valid { + attr_position_valid_invalid, + attr_position_valid_static, + attr_position_valid_extrapolated_time, + attr_position_valid_extrapolated_spatial, + attr_position_valid_valid, +}; + +#define ATTR_IS_INT(x) ((x) >= attr_type_int_begin && (x) <= attr_type_int_end) +#define ATTR_IS_DOUBLE(x) ((x) >= attr_type_double_begin && (x) <= attr_type_double_end) +#define ATTR_IS_STRING(x) ((x) >= attr_type_string_begin && (x) <= attr_type_string_end) +#define ATTR_IS_OBJECT(x) ((x) >= attr_type_object_begin && (x) <= attr_type_object_end) +#define ATTR_IS_ITEM(x) ((x) >= attr_type_item_begin && (x) <= attr_type_item_end) +#define ATTR_IS_COORD_GEO(x) ((x) >= attr_type_coord_geo_begin && (x) <= attr_type_coord_geo_end) +#define ATTR_IS_NUMERIC(x) (ATTR_IS_INT(x) || ATTR_IS_DOUBLE(x)) +#define ATTR_IS_COLOR(x) ((x) >= attr_type_color_begin && (x) <= attr_type_color_end) +#define ATTR_IS_PCOORD(x) ((x) >= attr_type_pcoord_begin && (x) <= attr_type_pcoord_end) +#define ATTR_IS_COORD(x) ((x) >= attr_type_coord_begin && (x) <= attr_type_coord_end) +#define ATTR_IS_GROUP(x) ((x) >= attr_type_group_begin && (x) <= attr_type_group_end) + +#define ATTR_DEF_STR(x,y) (&(struct attr){attr_##x,{y}}) +#define ATTR_DEF_INT(x,y) (&(struct attr){attr_##x,{(char *)(y)}}) +#define ATTR_DEF_ITEMS(x,...) (&(struct attr){attr_##x,{(char *)((enum item_type[]){__VA_ARGS__ , type_none})}}) +#define ATTR_LIST(...) (struct attr *[]) { __VA_ARGS__, NULL} + +struct attr { + enum attr_type type; + union { + char *str; + void *data; + long num; + struct item *item; + enum item_type item_type; + enum projection projection; + double * numd; + struct color *color; + struct coord_geo *coord_geo; + struct navit *navit; + struct callback *callback; + struct callback_list *callback_list; + struct vehicle *vehicle; + struct layout *layout; + struct layer *layer; + struct map *map; + struct mapset *mapset; + struct log *log; + struct route *route; + struct navigation *navigation; + struct coord *coord; + struct pcoord *pcoord; + struct gui *gui; + struct graphics *graphics; + struct tracking *tracking; + struct itemgra *itemgra; + struct plugin *plugin; + struct plugins *plugins; + struct polygon *polygon; + struct polyline *polyline; + struct circle *circle; + struct text *text; + struct icon *icon; + struct image *image; + struct arrows *arrows; + struct element *element; + struct speech *speech; + struct cursor *cursor; + struct displaylist *displaylist; + struct transformation *transformation; + struct vehicleprofile *vehicleprofile; + struct roadprofile *roadprofile; + struct bookmarks *bookmarks; + struct config *config; + struct osd *osd; + struct range { + short min, max; + } range; + int *dash; + enum item_type *item_types; + enum attr_type *attr_types; + long long *num64; + struct attr *attrs; + } u; +}; + +struct attr_iter; +/* prototypes */ +enum attr_type attr_from_name(const char *name); +char *attr_to_name(enum attr_type attr); +struct attr *attr_new_from_text(const char *name, const char *value); +char *attr_to_text(struct attr *attr, struct map *map, int pretty); +struct attr *attr_search(struct attr **attrs, struct attr *last, enum attr_type attr); +int attr_generic_get_attr(struct attr **attrs, struct attr **def_attrs, enum attr_type type, struct attr *attr, struct attr_iter *iter); +struct attr **attr_generic_set_attr(struct attr **attrs, struct attr *attr); +struct attr **attr_generic_add_attr(struct attr **attrs, struct attr *attr); +struct attr **attr_generic_remove_attr(struct attr **attrs, struct attr *attr); +enum attr_type attr_type_begin(enum attr_type type); +int attr_data_size(struct attr *attr); +void *attr_data_get(struct attr *attr); +void attr_data_set(struct attr *attr, void *data); +void attr_data_set_le(struct attr *attr, void *data); +void attr_free(struct attr *attr); +void attr_dup_content(struct attr *src, struct attr *dst); +struct attr *attr_dup(struct attr *attr); +void attr_list_free(struct attr **attrs); +struct attr **attr_list_dup(struct attr **attrs); +int attr_from_line(char *line, char *name, int *pos, char *val_ret, char *name_ret); +int attr_types_contains(enum attr_type *types, enum attr_type type); +int attr_types_contains_default(enum attr_type *types, enum attr_type type, int deflt); +/* end of prototypes */ +#ifdef __cplusplus +} +#endif + +#endif diff --git a/navit/attr_def.h b/navit/attr_def.h new file mode 100644 index 0000000..a01b30a --- /dev/null +++ b/navit/attr_def.h @@ -0,0 +1,460 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2009 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +/* prototypes */ + +/* common */ +ATTR2(0x00000000,none) +ATTR(any) +ATTR(any_xml) + +ATTR2(0x00010000,type_item_begin) +ATTR(town_streets_item) +ATTR(street_name_item) +ATTR(street_name_numbers_item) +ATTR(street_item) +ATTR(street_number_item) +ATTR(position_sat_item) +ATTR(current_item) +ATTR2(0x0001ffff,type_item_end) + +ATTR2(0x00020000,type_int_begin) +ATTR(h_remove) +ATTR(id) +ATTR(flags) +ATTR(w_remove) +ATTR(x_remove) +ATTR(y_remove) +ATTR(flush_size) +ATTR(flush_time) +ATTR(zipfile_ref) +ATTR(country_id) +ATTR(position_sats) +ATTR(position_sats_used) +ATTR(update) +ATTR(follow) +ATTR(length) +ATTR(time) +ATTR(destination_length) +ATTR(destination_time) +ATTR(speed) +ATTR(interval) +ATTR(position_qual) +ATTR(zoom) +ATTR(retry_interval) +ATTR(projection) +ATTR(offroad) +ATTR(vocabulary_name) +ATTR(vocabulary_name_systematic) +ATTR(vocabulary_distances) +ATTR(announce_name_systematic_first) +ATTR(antialias) +ATTR(order_delta) +ATTR(baudrate) +ATTR(font_size_remove) +ATTR(icon_xs) +ATTR(icon_l) +ATTR(icon_s) +ATTR(spacing) +ATTR(recent_dest) +ATTR(destination_distance) +ATTR(check_version) +ATTR(details) +ATTR(width) +ATTR(offset) +ATTR(directed) +ATTR(radius) +ATTR(text_size) +ATTR(level) +ATTR(icon_w) +ATTR(icon_h) +ATTR(rotation) +ATTR(checksum_ignore) +ATTR(position_fix_type) +ATTR(timeout) +ATTR(orientation) +ATTR(keyboard) +ATTR(position_sats_signal) +ATTR(cps) +ATTR(fast) +ATTR(osd_configuration) +ATTR(columns) +ATTR(align) +ATTR(sat_prn) +ATTR(sat_elevation) +ATTR(sat_azimuth) +ATTR(sat_snr) +ATTR(autozoom) +ATTR(version) +ATTR(autozoom_min) +ATTR(maxspeed) +ATTR(cdf_histsize) +ATTR(message_maxage) +ATTR(message_maxnum) +ATTR(pitch) +ATTR(roll) +ATTR(yaw) +ATTR(route_status) +ATTR(route_weight) +ATTR(distance_metric) +ATTR(route_mode) +ATTR(maxspeed_handling) +ATTR(flags_forward_mask) +ATTR(flags_reverse_mask) +ATTR(house_number_interpolation) +ATTR(house_number_left_interpolation) +ATTR(house_number_right_interpolation) +ATTR(delay) +ATTR(lag) +ATTR(bpp) +ATTR(fullscreen) +ATTR(windowid) +ATTR(hog) +ATTR(flags_town) +ATTR(flags_street) +ATTR(flags_house_number) +ATTR(use_camera) +ATTR(flags_graphics) +ATTR(zoom_min) +ATTR(zoom_max) +ATTR(gamma) +ATTR(brightness) +ATTR(contrast) +ATTR(height) +ATTR(minspeed) +ATTR(recspeed) +ATTR(speed_cond) +ATTR(shmkey) +ATTR(vehicle_width) +ATTR(vehicle_length) +ATTR(vehicle_height) +ATTR(vehicle_weight) +ATTR(vehicle_axle_weight) +ATTR(vehicle_dangerous_goods) +ATTR(shmsize) +ATTR(shmoffset) +ATTR(speed_category) +ATTR(static_speed) +ATTR(static_distance) +ATTR(through_traffic_penalty) +ATTR(through_traffic_flags) +ATTR(speed_exceed_limit_offset) +ATTR(speed_exceed_limit_percent) +ATTR(map_border) +ATTR(angle_pref) +ATTR(connected_pref) +ATTR(nostop_pref) +ATTR(offroad_limit_pref) +ATTR(route_pref) +ATTR(overspeed_pref) +ATTR(overspeed_percent_pref) +ATTR(autosave_period) +ATTR(tec_type) +ATTR(tec_dirtype) +ATTR(tec_direction) +ATTR(imperial) +ATTR(update_period) +ATTR(tunnel_extrapolation) +ATTR(street_count) +ATTR(min_dist) +ATTR(max_dist) +ATTR2(0x00027500,type_rel_abs_begin) +/* These attributes are int that can either hold relative * + * or absolute values. A relative value is indicated by * + * adding 0x60000000. * + * * + * The range of valid absolute values is -0x40000000 to * + * 0x40000000, the range of relative values is from * + * -0x20000000 to 0x20000000. */ +ATTR(h) +ATTR(w) +ATTR(x) +ATTR(y) +ATTR(font_size) + +ATTR2(0x00028000,type_boolean_begin) +/* boolean */ +ATTR(overwrite) +ATTR(active) +ATTR(follow_cursor) +ATTR(orientation_removeme) +ATTR(tracking) +ATTR(menubar) +ATTR(statusbar) +ATTR(toolbar) +ATTR(animate) +ATTR(lazy) +ATTR(mkdir) +ATTR(predraw) +ATTR(postdraw) +ATTR(button) +ATTR(ondemand) +ATTR(menu_on_map_click) +ATTR(direction) +ATTR(route_follow_straight_REMOVE) // This is to be removed with the next version +ATTR(gui_speech) +ATTR(town_id) /* fixme? */ +ATTR(street_id) /* fixme? */ +ATTR(district_id) /* fixme? */ +ATTR(drag_bitmap) +ATTR(use_mousewheel) +ATTR(fullscreen_old) +ATTR(position_magnetic_direction) +ATTR(use_overlay) +ATTR(night_mode) +ATTR(autozoom_active) +ATTR(position_valid) +ATTR(frame) +ATTR(tell_street_name) +ATTR(bluetooth) +ATTR(signal_on_map_click) +ATTR(route_active) +ATTR(search_active) +ATTR(unsuspend) +ATTR(announce_on) +ATTR(disable_reset) +ATTR(autostart) +ATTR(readwrite) +ATTR(cache) +ATTR(create) +ATTR(persistent) +ATTR2(0x0002ffff,type_int_end) +ATTR2(0x00030000,type_string_begin) +ATTR(type) +ATTR(label) +ATTR(data) +ATTR(charset) +ATTR(country_all) +ATTR(country_iso3) +ATTR(country_iso2) +ATTR(country_car) +ATTR(country_name) +ATTR(town_name) +ATTR(town_postal) +ATTR(district_name) +ATTR(street_name) +ATTR(street_name_systematic) +ATTR(street_number) +ATTR(debug) +ATTR(address) +ATTR(phone) +ATTR(entry_fee) +ATTR(open_hours) +ATTR(skin) +ATTR(fullscreen_removeme) +ATTR(view_mode) +ATTR(tilt) +ATTR(media_window_title) +ATTR(media_cmd) +ATTR(image_codec) +/* poi */ +ATTR(icono) +ATTR(info_html) +ATTR(price_html) +/* navigation */ +ATTR(navigation_short) +ATTR(navigation_long) +ATTR(navigation_long_exact) +ATTR(navigation_speech) +ATTR(name) +ATTR(cursorname) +ATTR(source) +ATTR(description) +ATTR(gc_type) +ATTR(layout) +ATTR(position_nmea) +ATTR(gpsd_query) +ATTR(on_eof) +ATTR(command) +ATTR(src) +ATTR(path) +ATTR(font) +ATTR(url_local) +ATTR(gc_size) +ATTR(gc_difficulty) +ATTR(gc_terrain) +ATTR(icon_src) +ATTR(position_time_iso8601) +ATTR(house_number) +ATTR(osm_member) +ATTR(osm_tag) +ATTR(municipality_name) +ATTR(county_name) +ATTR(state_name) +ATTR(message) +ATTR(callbacks) +ATTR(enable_expression) +ATTR(fax) +ATTR(email) +ATTR(url) +ATTR(profilename) +ATTR(projectionname) +ATTR(town_or_district_name) +ATTR(postal) +ATTR(postal_mask) +ATTR(house_number_first) +ATTR(house_number_last) +ATTR(house_number_left_first) +ATTR(house_number_left_last) +ATTR(house_number_right_first) +ATTR(house_number_right_last) +ATTR(town_name_match) +ATTR(district_name_match) +ATTR(street_name_match) +ATTR(language) +ATTR(subtype) +ATTR(filter) +ATTR(daylayout) +ATTR(nightlayout) +ATTR(xml_text) +ATTR(layout_name) +ATTR(user_name) +ATTR(user_pass) +ATTR(status_text) +ATTR(log_gpx_desc) +ATTR(map_pass) +ATTR(validity_period) +ATTR(socket) +ATTR(house_number_left) +ATTR(house_number_left_odd) +ATTR(house_number_left_even) +ATTR(house_number_right) +ATTR(house_number_right_odd) +ATTR(house_number_right_even) +ATTR(map_release) +ATTR(accesskey) +ATTR(http_method) +ATTR(http_header) +ATTR(progress) +ATTR(sample_dir) +ATTR(sample_suffix) +ATTR(dbus_destination) +ATTR(dbus_path) +ATTR(dbus_interface) +ATTR(dbus_method) +ATTR(osm_is_in) +ATTR(event_loop_system) +ATTR(map_name) +ATTR(item_name) +ATTR(state_file) +ATTR2(0x0003ffff,type_string_end) +ATTR2(0x00040000,type_special_begin) +ATTR(order) +ATTR(item_type) +ATTR(item_types) +ATTR(dash) +ATTR(sequence_range) +ATTR(angle_range) +ATTR(speed_range) +ATTR(attr_types) +ATTR(ch_edge) +ATTR(zipfile_ref_block) +ATTR(item_id) +ATTR(pdl_gps_update) +ATTR2(0x0004ffff,type_special_end) +ATTR2(0x00050000,type_double_begin) +ATTR(position_height) +ATTR(position_speed) +ATTR(position_direction) +ATTR(position_hdop) +ATTR(position_radius) +ATTR(position_longitude) +ATTR(position_latitude) +ATTR(position_direction_matched) +ATTR2(0x0005ffff,type_double_end) +ATTR2(0x00060000,type_coord_geo_begin) +ATTR(position_coord_geo) +ATTR(center) +ATTR(click_coord_geo) +ATTR2(0x0006ffff,type_coord_geo_end) +ATTR2(0x00070000,type_color_begin) +ATTR(color) +ATTR(color2) +ATTR(background_color) +ATTR(text_color) +ATTR(idle_color) +ATTR(background_color2) +ATTR2(0x0007ffff,type_color_end) +ATTR2(0x00080000,type_object_begin) +ATTR(navit) +ATTR(log) +ATTR(callback) +ATTR(route) +ATTR(navigation) +ATTR(vehicle) +ATTR(map) +ATTR(bookmark_map) +ATTR(bookmarks) +ATTR(former_destination_map) +ATTR(graphics) +ATTR(gui) +ATTR(trackingo) /* fixme */ +ATTR(plugins) +ATTR(layer) +ATTR(itemgra) +ATTR(polygon) +ATTR(polyline) +ATTR(circle) +ATTR(text) +ATTR(icon) +ATTR(image) +ATTR(arrows) +ATTR(mapset) +ATTR(osd) +ATTR(plugin) +ATTR(speech) +ATTR(coord) +ATTR(private_data) +ATTR(callback_list) +ATTR(displaylist) +ATTR(transformation) +ATTR(vehicleprofile) +ATTR(roadprofile) +ATTR(announcement) +ATTR(cursor) +ATTR(config) +ATTR2(0x0008ffff,type_object_end) +ATTR2(0x00090000,type_coord_begin) +ATTR2(0x0009ffff,type_coord_end) +ATTR2(0x000a0000,type_pcoord_begin) +ATTR(destination) +ATTR(position) +ATTR2(0x000affff,type_pcoord_end) +ATTR2(0x000b0000,type_callback_begin) +ATTR(resize) +ATTR(motion) +ATTR(keypress) +ATTR(window_closed) +ATTR(log_gpx) +ATTR(log_textfile) +ATTR(graphics_ready) +ATTR(destroy) +ATTR(wm_copydata) +ATTR2(0x000bffff,type_callback_end) +ATTR2(0x000c0000,type_int64_begin) +ATTR(osm_nodeid) +ATTR(osm_wayid) +ATTR(osm_relationid) +ATTR2(0x000cffff,type_int64_end) +ATTR2(0x000d0000,type_group_begin) +ATTR(speed_dep) +ATTR2(0x000dffff,type_group_end) +ATTR2(0x000e0000,type_item_type_begin) +ATTR(alt_item_type) +ATTR2(0x000effff,type_item_type_end) diff --git a/navit/autoload/Makefile.am b/navit/autoload/Makefile.am new file mode 100644 index 0000000..4ca10b6 --- /dev/null +++ b/navit/autoload/Makefile.am @@ -0,0 +1,6 @@ +SUBDIRS= +if USE_OSSO + SUBDIRS += osso +endif + +DIST_SUBDIRS= osso diff --git a/navit/autoload/Makefile.in b/navit/autoload/Makefile.in new file mode 100644 index 0000000..2c96290 --- /dev/null +++ b/navit/autoload/Makefile.in @@ -0,0 +1,709 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@USE_OSSO_TRUE@am__append_1 = osso +subdir = navit/autoload +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = $(am__append_1) +DIST_SUBDIRS = osso +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/autoload/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/autoload/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/autoload/osso/Makefile.am b/navit/autoload/osso/Makefile.am new file mode 100644 index 0000000..bb965be --- /dev/null +++ b/navit/autoload/osso/Makefile.am @@ -0,0 +1,6 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ @LIBOSSO_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=plugin_osso +moduleautoload_LTLIBRARIES = libplugin_osso.la +libplugin_osso_la_LDFLAGS=-module -avoid-version @NAVIT_MODULE_LDFLAGS@ @LIBOSSO_LIBS@ #-Wl,--no-undefined + +libplugin_osso_la_SOURCES = osso.c diff --git a/navit/autoload/osso/Makefile.in b/navit/autoload/osso/Makefile.in new file mode 100644 index 0000000..d0462ee --- /dev/null +++ b/navit/autoload/osso/Makefile.in @@ -0,0 +1,691 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/autoload/osso +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(moduleautoloaddir)" +LTLIBRARIES = $(moduleautoload_LTLIBRARIES) +libplugin_osso_la_LIBADD = +am_libplugin_osso_la_OBJECTS = osso.lo +libplugin_osso_la_OBJECTS = $(am_libplugin_osso_la_OBJECTS) +libplugin_osso_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libplugin_osso_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libplugin_osso_la_SOURCES) +DIST_SOURCES = $(libplugin_osso_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ @LIBOSSO_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=plugin_osso +moduleautoload_LTLIBRARIES = libplugin_osso.la +libplugin_osso_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ @LIBOSSO_LIBS@ #-Wl,--no-undefined +libplugin_osso_la_SOURCES = osso.c +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/autoload/osso/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/autoload/osso/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-moduleautoloadLTLIBRARIES: $(moduleautoload_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(moduleautoloaddir)" || $(MKDIR_P) "$(DESTDIR)$(moduleautoloaddir)" + @list='$(moduleautoload_LTLIBRARIES)'; test -n "$(moduleautoloaddir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(moduleautoloaddir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(moduleautoloaddir)"; \ + } + +uninstall-moduleautoloadLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(moduleautoload_LTLIBRARIES)'; test -n "$(moduleautoloaddir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(moduleautoloaddir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(moduleautoloaddir)/$$f"; \ + done + +clean-moduleautoloadLTLIBRARIES: + -test -z "$(moduleautoload_LTLIBRARIES)" || rm -f $(moduleautoload_LTLIBRARIES) + @list='$(moduleautoload_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libplugin_osso.la: $(libplugin_osso_la_OBJECTS) $(libplugin_osso_la_DEPENDENCIES) + $(libplugin_osso_la_LINK) -rpath $(moduleautoloaddir) $(libplugin_osso_la_OBJECTS) $(libplugin_osso_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osso.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(moduleautoloaddir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-moduleautoloadLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-moduleautoloadLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-moduleautoloadLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-moduleautoloadLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-moduleautoloadLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am \ + uninstall-moduleautoloadLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/autoload/osso/osso.c b/navit/autoload/osso/osso.c new file mode 100644 index 0000000..b49bb0a --- /dev/null +++ b/navit/autoload/osso/osso.c @@ -0,0 +1,100 @@ +#include +#include +#include "config.h" +#include "debug.h" +#include "item.h" +#include "attr.h" +#include "navit.h" +#include "plugin.h" +#include "callback.h" +#include "config_.h" + +static osso_context_t *osso_context; +static struct attr callback = { attr_callback }; + +extern char *version; + +struct cb_hw_state_trail { + struct navit* nav; + osso_hw_state_t *state; +}; + +static void +osso_display_on(struct navit *this_) +{ + osso_return_t err; + err = osso_display_blanking_pause(osso_context); + dbg(1, "Unblank result: ", + err == OSSO_OK ? "Ok" : (err == + OSSO_ERROR ? "Error" : + "Invalid context")); +} + +static gboolean +osso_cb_hw_state_idle(struct cb_hw_state_trail * params) +{ + dbg(0, "(inact=%d, save=%d, shut=%d, memlow=%d, state=%d)\n", + params->state->system_inactivity_ind, + params->state->save_unsaved_data_ind, params->state->shutdown_ind, + params->state->memory_low_ind, params->state->sig_device_mode_ind); + + if (params->state->shutdown_ind) { + /* we are going down, down, down */ + navit_destroy(params->nav); + } + + g_free(params->state); + g_free(params); + + return FALSE; +} + +/** + * * Handle osso events + * * @param state Osso hardware state + * * @param data ptr to private data + * * @returns nothing + **/ +static void +osso_cb_hw_state(osso_hw_state_t * state, gpointer data) +{ + struct navit *nav = (struct navit*)data; + struct cb_hw_state_trail *params = g_new(struct cb_hw_state_trail,1); + params->nav=nav; + params->state = g_new(osso_hw_state_t, 1); + memcpy(params->state, state, sizeof(osso_hw_state_t)); + g_idle_add((GSourceFunc) osso_cb_hw_state_idle, params); +} + +static void +osso_navit(struct navit *nav, int add) +{ + dbg(1, "Installing osso context for org.navit_project.navit\n"); + osso_context = osso_initialize("org.navit_project.navit", version, TRUE, NULL); + if (osso_context == NULL) { + dbg(0, "error initiating osso context\n"); + } + osso_hw_set_event_cb(osso_context, NULL, osso_cb_hw_state, nav); + + if (add > 0) { + /* add callback to unblank screen */ + navit_add_callback(nav, callback_new_attr_0(callback_cast (osso_display_on), attr_unsuspend)); + } +} + +void +plugin_init(void) +{ + //struct callback *cb; + + dbg(2, "enter\n"); + + callback.u.callback = callback_new_attr_0(callback_cast(osso_navit), attr_navit); + config_add_attr(config, &callback); +} + +void +plugin_deinit(void) +{ + osso_deinitialize(osso_context); +} diff --git a/navit/binding/Makefile.am b/navit/binding/Makefile.am new file mode 100644 index 0000000..6b782b4 --- /dev/null +++ b/navit/binding/Makefile.am @@ -0,0 +1,15 @@ +SUBDIRS= +if BINDING_PYTHON + SUBDIRS+=python +endif +if BINDING_DBUS + SUBDIRS+=dbus +endif + +if BINDING_WIN32 + SUBDIRS+=win32 +endif + + +DIST_SUBDIRS=python dbus win32 + diff --git a/navit/binding/Makefile.in b/navit/binding/Makefile.in new file mode 100644 index 0000000..419c2f9 --- /dev/null +++ b/navit/binding/Makefile.in @@ -0,0 +1,711 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@BINDING_PYTHON_TRUE@am__append_1 = python +@BINDING_DBUS_TRUE@am__append_2 = dbus +@BINDING_WIN32_TRUE@am__append_3 = win32 +subdir = navit/binding +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = $(am__append_1) $(am__append_2) $(am__append_3) +DIST_SUBDIRS = python dbus win32 +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/binding/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/binding/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/binding/dbus/Makefile.am b/navit/binding/dbus/Makefile.am new file mode 100644 index 0000000..1e63342 --- /dev/null +++ b/navit/binding/dbus/Makefile.am @@ -0,0 +1,18 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ @DBUS_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=binding_dbus +modulebinding_LTLIBRARIES = libbinding_dbus.la +libbinding_dbus_la_SOURCES = binding_dbus.c +libbinding_dbus_la_LIBADD = @DBUS_LIBS@ +libbinding_dbus_la_LDFLAGS = -module -avoid-version + +servicedir = @DBUS_SERVICE_DIR@ +service_in_files = org.navit_project.navit.service.in +service_DATA = $(service_in_files:.service.in=.service) + +$(service_DATA): $(service_in_files) Makefile + sed -e "s|\@bindir\@|$(bindir)|" $< > $@ + +EXTRA_DIST = $(service_in_files) + +distclean-local: + rm -f $(service_DATA) diff --git a/navit/binding/dbus/Makefile.in b/navit/binding/dbus/Makefile.in new file mode 100644 index 0000000..22594cf --- /dev/null +++ b/navit/binding/dbus/Makefile.in @@ -0,0 +1,725 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/binding/dbus +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulebindingdir)" \ + "$(DESTDIR)$(servicedir)" +LTLIBRARIES = $(modulebinding_LTLIBRARIES) +libbinding_dbus_la_DEPENDENCIES = +am_libbinding_dbus_la_OBJECTS = binding_dbus.lo +libbinding_dbus_la_OBJECTS = $(am_libbinding_dbus_la_OBJECTS) +libbinding_dbus_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libbinding_dbus_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libbinding_dbus_la_SOURCES) +DIST_SOURCES = $(libbinding_dbus_la_SOURCES) +DATA = $(service_DATA) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ @DBUS_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=binding_dbus +modulebinding_LTLIBRARIES = libbinding_dbus.la +libbinding_dbus_la_SOURCES = binding_dbus.c +libbinding_dbus_la_LIBADD = @DBUS_LIBS@ +libbinding_dbus_la_LDFLAGS = -module -avoid-version +servicedir = @DBUS_SERVICE_DIR@ +service_in_files = org.navit_project.navit.service.in +service_DATA = $(service_in_files:.service.in=.service) +EXTRA_DIST = $(service_in_files) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/binding/dbus/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/binding/dbus/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulebindingLTLIBRARIES: $(modulebinding_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulebindingdir)" || $(MKDIR_P) "$(DESTDIR)$(modulebindingdir)" + @list='$(modulebinding_LTLIBRARIES)'; test -n "$(modulebindingdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulebindingdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulebindingdir)"; \ + } + +uninstall-modulebindingLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulebinding_LTLIBRARIES)'; test -n "$(modulebindingdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulebindingdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulebindingdir)/$$f"; \ + done + +clean-modulebindingLTLIBRARIES: + -test -z "$(modulebinding_LTLIBRARIES)" || rm -f $(modulebinding_LTLIBRARIES) + @list='$(modulebinding_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libbinding_dbus.la: $(libbinding_dbus_la_OBJECTS) $(libbinding_dbus_la_DEPENDENCIES) + $(libbinding_dbus_la_LINK) -rpath $(modulebindingdir) $(libbinding_dbus_la_OBJECTS) $(libbinding_dbus_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binding_dbus.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-serviceDATA: $(service_DATA) + @$(NORMAL_INSTALL) + test -z "$(servicedir)" || $(MKDIR_P) "$(DESTDIR)$(servicedir)" + @list='$(service_DATA)'; test -n "$(servicedir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(servicedir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(servicedir)" || exit $$?; \ + done + +uninstall-serviceDATA: + @$(NORMAL_UNINSTALL) + @list='$(service_DATA)'; test -n "$(servicedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(servicedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(servicedir)" && rm -f $$files + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(DATA) +installdirs: + for dir in "$(DESTDIR)$(modulebindingdir)" "$(DESTDIR)$(servicedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulebindingLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-local distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulebindingLTLIBRARIES install-serviceDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulebindingLTLIBRARIES uninstall-serviceDATA + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulebindingLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-local distclean-tags distdir dvi dvi-am html html-am \ + info info-am install install-am install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-modulebindingLTLIBRARIES install-pdf \ + install-pdf-am install-ps install-ps-am install-serviceDATA \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-modulebindingLTLIBRARIES uninstall-serviceDATA + + +$(service_DATA): $(service_in_files) Makefile + sed -e "s|\@bindir\@|$(bindir)|" $< > $@ + +distclean-local: + rm -f $(service_DATA) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/binding/dbus/binding_dbus.c b/navit/binding/dbus/binding_dbus.c new file mode 100644 index 0000000..a1a92dd --- /dev/null +++ b/navit/binding/dbus/binding_dbus.c @@ -0,0 +1,1823 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#define DBUS_API_SUBJECT_TO_CHANGE +#include +#include +#include +#include "config.h" +#include "config_.h" +#include "navit.h" +#include "coord.h" +#include "point.h" +#include "plugin.h" +#include "debug.h" +#include "item.h" +#include "attr.h" +#include "layout.h" +#include "navigation.h" +#include "command.h" +#include "callback.h" +#include "graphics.h" +#include "track.h" +#include "vehicle.h" +#include "vehicleprofile.h" +#include "map.h" +#include "mapset.h" +#include "osd.h" +#include "route.h" +#include "search.h" +#include "callback.h" +#include "gui.h" +#include "util.h" + + +static DBusConnection *connection; +static dbus_uint32_t dbus_serial; + +static char *service_name = "org.navit_project.navit"; +static char *object_path = "/org/navit_project/navit"; +char *navitintrospectxml_head1 = "\n" + "\n" + " \n" + " \n" + " \n" + " \n" + " \n"; + + + +GHashTable *object_hash; +GHashTable *object_hash_rev; +GHashTable *object_count; + +struct dbus_callback { + struct callback *callback; + char *signal; +}; + +static char * +object_new(char *type, void *object) +{ + int id; + char *ret; + dbg(1,"enter %s\n", type); + if ((ret=g_hash_table_lookup(object_hash_rev, object))) + return ret; + id=GPOINTER_TO_INT(g_hash_table_lookup(object_count, type)); + g_hash_table_insert(object_count, type, GINT_TO_POINTER((id+1))); + ret=g_strdup_printf("%s/%s/%d", object_path, type, id); + g_hash_table_insert(object_hash, ret, object); + g_hash_table_insert(object_hash_rev, object, ret); + dbg(1,"return %s\n", ret); + return (ret); +} + +static void * +object_get(const char *path) +{ + return g_hash_table_lookup(object_hash, path); +} + +static void +object_destroy(const char *path, void *object) +{ + if (!path && !object) + return; + if (!object) + object=g_hash_table_lookup(object_hash, path); + if (!path) + path=g_hash_table_lookup(object_hash_rev, object); + g_hash_table_remove(object_hash, path); + g_hash_table_remove(object_hash_rev, object); +} + +static void * +resolve_object(const char *opath, char *type) +{ + char *prefix; + const char *oprefix; + void *ret=NULL; + char *def_navit="/default_navit"; + char *def_gui="/default_gui"; + char *def_graphics="/default_graphics"; + char *def_vehicle="/default_vehicle"; + char *def_vehicleprofile="/default_vehicleprofile"; + char *def_mapset="/default_mapset"; + char *def_map="/default_map"; + char *def_navigation="/default_navigation"; + char *def_route="/default_route"; + char *def_tracking="/default_tracking"; + struct attr attr; + + if (strncmp(opath, object_path, strlen(object_path))) { + dbg(0,"wrong object path %s\n",opath); + return NULL; + } + prefix=g_strdup_printf("%s/%s/", object_path, type); + if (!strncmp(prefix, opath, strlen(prefix))) { + ret=object_get(opath); + g_free(prefix); + return ret; + } + g_free(prefix); + oprefix=opath+strlen(object_path); + if (!strncmp(oprefix,def_navit,strlen(def_navit))) { + oprefix+=strlen(def_navit); + struct attr navit; + if (!config_get_attr(config, attr_navit, &navit, NULL)) + return NULL; + if (!oprefix[0]) { + dbg(0,"default_navit\n"); + return navit.u.navit; + } + if (!strncmp(oprefix,def_graphics,strlen(def_graphics))) { + if (navit_get_attr(navit.u.navit, attr_graphics, &attr, NULL)) { + return attr.u.graphics; + } + return NULL; + } + if (!strncmp(oprefix,def_gui,strlen(def_gui))) { + if (navit_get_attr(navit.u.navit, attr_gui, &attr, NULL)) { + return attr.u.gui; + } + return NULL; + } + if (!strncmp(oprefix,def_vehicleprofile,strlen(def_vehicleprofile))) { + if (navit_get_attr(navit.u.navit, attr_vehicleprofile, &attr, NULL)) { + return attr.u.vehicleprofile; + } + return NULL; + } + if (!strncmp(oprefix,def_vehicle,strlen(def_vehicle))) { + if (navit_get_attr(navit.u.navit, attr_vehicle, &attr, NULL)) { + return attr.u.vehicle; + } + return NULL; + } + if (!strncmp(oprefix,def_mapset,strlen(def_mapset))) { + oprefix+=strlen(def_mapset); + if (navit_get_attr(navit.u.navit, attr_mapset, &attr, NULL)) { + if (!oprefix[0]) { + return attr.u.mapset; + } + if (!strncmp(oprefix,def_map,strlen(def_map))) { + if (mapset_get_attr(attr.u.mapset, attr_map, &attr, NULL)) { + return attr.u.map; + } + return NULL; + } + } + return NULL; + } + if (!strncmp(oprefix,def_navigation,strlen(def_navigation))) { + if (navit_get_attr(navit.u.navit, attr_navigation, &attr, NULL)) { + return attr.u.navigation; + } + return NULL; + } + if (!strncmp(oprefix,def_route,strlen(def_route))) { + oprefix+=strlen(def_route); + if (navit_get_attr(navit.u.navit, attr_route, &attr, NULL)) { + return attr.u.route; + } + return NULL; + } + if (!strncmp(oprefix,def_tracking,strlen(def_tracking))) { + if (navit_get_attr(navit.u.navit, attr_trackingo, &attr, NULL)) { + return attr.u.tracking; + } + return NULL; + } + } + return NULL; +} + +static void * +object_get_from_message_arg(DBusMessageIter *iter, char *type) +{ + char *opath; + + if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_OBJECT_PATH) + return NULL; + dbus_message_iter_get_basic(iter, &opath); + dbus_message_iter_next(iter); + return resolve_object(opath, type); +} + +static void * +object_get_from_message(DBusMessage *message, char *type) +{ + return resolve_object(dbus_message_get_path(message), type); +} + +static enum attr_type +attr_type_get_from_message(DBusMessageIter *iter) +{ + char *attr_type; + + if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_STRING) + return attr_none; + dbus_message_iter_get_basic(iter, &attr_type); + dbus_message_iter_next(iter); + return attr_from_name(attr_type); +} + +static void +encode_variant_string(DBusMessageIter *iter, char *str) +{ + DBusMessageIter variant; + dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, DBUS_TYPE_STRING_AS_STRING, &variant); + dbus_message_iter_append_basic(&variant, DBUS_TYPE_STRING, &str); + dbus_message_iter_close_container(iter, &variant); +} + +static void +encode_dict_string_variant_string(DBusMessageIter *iter, char *key, char *value) +{ + DBusMessageIter dict; + dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict); + dbus_message_iter_append_basic(&dict, DBUS_TYPE_STRING, &key); + encode_variant_string(&dict, value); + dbus_message_iter_close_container(iter, &dict); +} + +static int +encode_attr(DBusMessageIter *iter1, struct attr *attr) +{ + char *name=attr_to_name(attr->type); + DBusMessageIter iter2,iter3; + dbus_message_iter_append_basic(iter1, DBUS_TYPE_STRING, &name); + if (attr->type >= attr_type_int_begin && attr->type < attr_type_boolean_begin) { + dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, DBUS_TYPE_INT32_AS_STRING, &iter2); + dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &attr->u.num); + dbus_message_iter_close_container(iter1, &iter2); + } + if (attr->type >= attr_type_boolean_begin && attr->type <= attr_type_int_end) { + dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, DBUS_TYPE_BOOLEAN_AS_STRING, &iter2); + dbus_message_iter_append_basic(&iter2, DBUS_TYPE_BOOLEAN, &attr->u.num); + dbus_message_iter_close_container(iter1, &iter2); + } + if (attr->type >= attr_type_string_begin && attr->type <= attr_type_string_end) { + encode_variant_string(iter1, attr->u.str); + } + if ((attr->type >= attr_type_item_type_begin && attr->type <= attr_type_item_type_end) || attr->type == attr_item_type) { + encode_variant_string(iter1, item_to_name(attr->u.item_type)); + } + if (attr->type >= attr_type_pcoord_begin && attr->type <= attr_type_pcoord_end) { + dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, "ai", &iter2); + dbus_message_iter_open_container(&iter2, DBUS_TYPE_ARRAY, "i", &iter3); + if (attr->u.pcoord) { + dbus_message_iter_append_basic(&iter3, DBUS_TYPE_INT32, &attr->u.pcoord->pro); + dbus_message_iter_append_basic(&iter3, DBUS_TYPE_INT32, &attr->u.pcoord->x); + dbus_message_iter_append_basic(&iter3, DBUS_TYPE_INT32, &attr->u.pcoord->y); + } + dbus_message_iter_close_container(&iter2, &iter3); + dbus_message_iter_close_container(iter1, &iter2); + } + if (attr->type >= attr_type_object_begin && attr->type <= attr_type_object_end) { + char *object=object_new(attr_to_name(attr->type), attr->u.data); + dbus_message_iter_open_container(iter1, DBUS_TYPE_VARIANT, DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter2); + dbus_message_iter_append_basic(&iter2, DBUS_TYPE_OBJECT_PATH, &object); + dbus_message_iter_close_container(iter1, &iter2); + } + return 1; +} + + +static DBusHandlerResult +empty_reply(DBusConnection *connection, DBusMessage *message) +{ + DBusMessage *reply; + + reply = dbus_message_new_method_return(message); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + + return DBUS_HANDLER_RESULT_HANDLED; +} + + +static DBusHandlerResult +dbus_error(DBusConnection *connection, DBusMessage *message, char *error, char *msg) +{ + DBusMessage *reply; + + reply = dbus_message_new_error(message, error, msg); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + return DBUS_HANDLER_RESULT_HANDLED; +} + +static DBusHandlerResult +dbus_error_invalid_attr_type(DBusConnection *connection, DBusMessage *message) +{ + return dbus_error(connection, message, DBUS_ERROR_INVALID_ARGS, "attribute type invalid"); +} + +static DBusHandlerResult +dbus_error_invalid_parameter(DBusConnection *connection, DBusMessage *message) +{ + return dbus_error(connection, message, DBUS_ERROR_INVALID_ARGS, "parameter invalid"); +} + +static DBusHandlerResult +dbus_error_invalid_object_path(DBusConnection *connection, DBusMessage *message) +{ + return dbus_error(connection, message, DBUS_ERROR_BAD_ADDRESS, "object path invalid"); +} + +static DBusHandlerResult +dbus_error_invalid_object_path_parameter(DBusConnection *connection, DBusMessage *message) +{ + return dbus_error(connection, message, DBUS_ERROR_BAD_ADDRESS, "object path parameter invalid"); +} + +#if 0 +static void +dbus_dump_iter(char *prefix, DBusMessageIter *iter) +{ + char *prefixr,*vals; + int arg,vali; + DBusMessageIter iterr; + while ((arg=dbus_message_iter_get_arg_type(iter)) != DBUS_TYPE_INVALID) { + switch (arg) { + case DBUS_TYPE_INT32: + dbus_message_iter_get_basic(iter, &vali); + dbg(0,"%sDBUS_TYPE_INT32: %d\n",prefix,vali); + break; + case DBUS_TYPE_STRING: + dbus_message_iter_get_basic(iter, &vals); + dbg(0,"%sDBUS_TYPE_STRING: %s\n",prefix,vals); + break; + case DBUS_TYPE_STRUCT: + dbg(0,"%sDBUS_TYPE_STRUCT:\n",prefix); + prefixr=g_strdup_printf("%s ",prefix); + dbus_message_iter_recurse(iter, &iterr); + dbus_dump_iter(prefixr, &iterr); + g_free(prefixr); + break; + case DBUS_TYPE_VARIANT: + dbg(0,"%sDBUS_TYPE_VARIANT:\n",prefix); + prefixr=g_strdup_printf("%s ",prefix); + dbus_message_iter_recurse(iter, &iterr); + dbus_dump_iter(prefixr, &iterr); + g_free(prefixr); + break; + case DBUS_TYPE_DICT_ENTRY: + dbg(0,"%sDBUS_TYPE_DICT_ENTRY:\n",prefix); + prefixr=g_strdup_printf("%s ",prefix); + dbus_message_iter_recurse(iter, &iterr); + dbus_dump_iter(prefixr, &iterr); + g_free(prefixr); + break; + case DBUS_TYPE_ARRAY: + dbg(0,"%sDBUS_TYPE_ARRAY:\n",prefix); + prefixr=g_strdup_printf("%s ",prefix); + dbus_message_iter_recurse(iter, &iterr); + dbus_dump_iter(prefixr, &iterr); + g_free(prefixr); + break; + default: + dbg(0,"%c\n",arg); + } + dbus_message_iter_next(iter); + } +} + +static void +dbus_dump(DBusMessage *message) +{ + DBusMessageIter iter; + + dbus_message_iter_init(message, &iter); + dbus_dump_iter("",&iter); + +} +#endif + +/** + * Extracts a struct pcoord from a DBus message + * + * @param message The DBus message + * @param iter Sort of pointer that points on that (iii)-object in the message + * @param pc Pointer where the data should get stored + * @returns Returns 1 when everything went right, otherwise 0 + */ +static int +pcoord_get_from_message(DBusMessage *message, DBusMessageIter *iter, struct pcoord *pc) +{ + + if(!strcmp(dbus_message_iter_get_signature(iter), "s")) { + char *coordstring; + + dbus_message_iter_get_basic(iter, &coordstring); + if(!pcoord_parse(coordstring, projection_mg, pc)) + return 0; + + return 1; + } else { + + DBusMessageIter iter2; + dbus_message_iter_recurse(iter, &iter2); + if(!strcmp(dbus_message_iter_get_signature(iter), "(is)")) { + char *coordstring; + int projection; + + dbus_message_iter_get_basic(&iter2, &projection); + + dbus_message_iter_next(&iter2); + dbus_message_iter_get_basic(&iter2, &coordstring); + + if(!pcoord_parse(coordstring, projection, pc)) + return 0; + + return 1; + } else if(!strcmp(dbus_message_iter_get_signature(iter), "(iii)")) { + + dbus_message_iter_get_basic(&iter2, &pc->pro); + + dbus_message_iter_next(&iter2); + dbus_message_iter_get_basic(&iter2, &pc->x); + + dbus_message_iter_next(&iter2); + dbus_message_iter_get_basic(&iter2, &pc->y); + + return 1; + } + } + return 0; + +} + +static void +pcoord_encode(DBusMessageIter *iter, struct pcoord *pc) +{ + DBusMessageIter iter2; + dbus_message_iter_open_container(iter,DBUS_TYPE_STRUCT,NULL,&iter2); + if (pc) { + dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &pc->pro); + dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &pc->x); + dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &pc->y); + } else { + int n=0; + dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &n); + dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &n); + dbus_message_iter_append_basic(&iter2, DBUS_TYPE_INT32, &n); + } + dbus_message_iter_close_container(iter, &iter2); +} + +static enum attr_type +decode_attr_type_from_iter(DBusMessageIter *iter) +{ + char *attr_type; + enum attr_type ret; + + if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_STRING) + return attr_none; + dbus_message_iter_get_basic(iter, &attr_type); + dbus_message_iter_next(iter); + ret=attr_from_name(attr_type); + dbg(1, "attr value: 0x%x string: %s\n", ret, attr_type); + return ret; +} + +static int +decode_attr_from_iter(DBusMessageIter *iter, struct attr *attr) +{ + DBusMessageIter iterattr, iterstruct; + int ret=1; + double d; + + attr->type=decode_attr_type_from_iter(iter); + if (attr->type == attr_none) + return 0; + + dbus_message_iter_recurse(iter, &iterattr); + dbus_message_iter_next(iter); + dbg(1, "seems valid. signature: %s\n", dbus_message_iter_get_signature(&iterattr)); + + if (attr->type >= attr_type_item_begin && attr->type <= attr_type_item_end) + return 0; + + if (attr->type >= attr_type_int_begin && attr->type <= attr_type_boolean_begin) { + if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_INT32) { + dbus_message_iter_get_basic(&iterattr, &attr->u.num); + return 1; + } + return 0; + } + if(attr->type >= attr_type_boolean_begin && attr->type <= attr_type_int_end) { + if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_BOOLEAN) { + dbus_message_iter_get_basic(&iterattr, &attr->u.num); + return 1; + } + return 0; + } + if(attr->type >= attr_type_string_begin && attr->type <= attr_type_string_end) { + if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_STRING) { + dbus_message_iter_get_basic(&iterattr, &attr->u.str); + return 1; + } + return 0; + } + if(attr->type >= attr_type_double_begin && attr->type <= attr_type_double_end) { + if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_DOUBLE) { + attr->u.numd=g_new(typeof(*attr->u.numd),1); + dbus_message_iter_get_basic(&iterattr, attr->u.numd); + return 1; + } + } + if(attr->type >= attr_type_coord_geo_begin && attr->type <= attr_type_coord_geo_end) { + if (dbus_message_iter_get_arg_type(&iterattr) == DBUS_TYPE_STRUCT) { + attr->u.coord_geo=g_new(typeof(*attr->u.coord_geo),1); + dbus_message_iter_recurse(&iterattr, &iterstruct); + if (dbus_message_iter_get_arg_type(&iterstruct) == DBUS_TYPE_DOUBLE) { + dbus_message_iter_get_basic(&iterstruct, &d); + dbus_message_iter_next(&iterstruct); + attr->u.coord_geo->lng=d; + } else + ret=0; + if (dbus_message_iter_get_arg_type(&iterstruct) == DBUS_TYPE_DOUBLE) { + dbus_message_iter_get_basic(&iterstruct, &d); + attr->u.coord_geo->lat=d; + } else + ret=0; + if (!ret) { + g_free(attr->u.coord_geo); + attr->u.coord_geo=NULL; + } + return ret; + } + } + if (attr->type == attr_callback) { + struct dbus_callback *callback=object_get_from_message_arg(&iterattr, "callback"); + if (callback) { + attr->u.callback=callback->callback; + return 1; + } + } + return 0; +} + +static int +decode_attr(DBusMessage *message, struct attr *attr) +{ + DBusMessageIter iter; + + dbus_message_iter_init(message, &iter); + return decode_attr_from_iter(&iter, attr); +} + +static void +destroy_attr(struct attr *attr) +{ + if(attr->type > attr_type_double_begin && attr->type < attr_type_double_end) { + g_free(attr->u.numd); + } +} + +static char * +get_iter_name(char *type) +{ + return g_strdup_printf("%s_attr_iter",type); +} + +static DBusHandlerResult +request_attr_iter(DBusConnection *connection, DBusMessage *message, char *type, struct attr_iter *(*func)(void)) +{ + DBusMessage *reply; + char *iter_name; + char *opath; + struct attr_iter *attr_iter; + + attr_iter=(*func)(); + iter_name=get_iter_name(type); + opath=object_new(iter_name,attr_iter); + g_free(iter_name); + reply = dbus_message_new_method_return(message); + dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + + return DBUS_HANDLER_RESULT_HANDLED; +} + +static DBusHandlerResult +request_attr_iter_destroy(DBusConnection *connection, DBusMessage *message, char *type, void (*func)(struct attr_iter *)) +{ + struct attr_iter *attr_iter; + DBusMessageIter iter; + char *iter_name; + + dbus_message_iter_init(message, &iter); + iter_name=get_iter_name(type); + attr_iter=object_get_from_message_arg(&iter, iter_name); + g_free(iter_name); + if (! attr_iter) + return dbus_error_invalid_object_path_parameter(connection, message); + object_destroy(NULL, attr_iter); + func(attr_iter); + + return empty_reply(connection, message); +} + +static DBusHandlerResult +request_destroy(DBusConnection *connection, DBusMessage *message, char *type, void *data, void (*func)(void *)) +{ + if (!data) + data=object_get_from_message(message, type); + if (!data) + return dbus_error_invalid_object_path(connection, message); + object_destroy(NULL, data); + func(data); + + return empty_reply(connection, message); +} + + +static DBusHandlerResult +request_get_attr(DBusConnection *connection, DBusMessage *message, char *type, void *data, int (*func)(void *data, enum attr_type type, struct attr *attr, struct attr_iter *iter)) +{ + DBusMessage *reply; + DBusMessageIter iter; + struct attr attr; + enum attr_type attr_type; + struct attr_iter *attr_iter; + char *iter_name; + + if (! data) + data = object_get_from_message(message, type); + if (! data) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + attr_type=attr_type_get_from_message(&iter); + if (attr_type == attr_none) + return dbus_error_invalid_attr_type(connection, message); + iter_name=get_iter_name(type); + attr_iter=object_get_from_message_arg(&iter, iter_name); + g_free(iter_name); + if (func(data, attr_type, &attr, attr_iter)) { + DBusMessageIter iter1; + reply = dbus_message_new_method_return(message); + dbus_message_iter_init_append(reply, &iter1); + encode_attr(&iter1, &attr); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + return DBUS_HANDLER_RESULT_HANDLED; + } + return empty_reply(connection, message); + +} + +static DBusHandlerResult +request_command(DBusConnection *connection, DBusMessage *message, char *type, void *data, int (*func)(void *data, enum attr_type type, struct attr *attr, struct attr_iter *iter)) +{ + DBusMessageIter iter; + struct attr attr; + char *command; + + if (! data) + data = object_get_from_message(message, type); + if (! data) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) + return dbus_error_invalid_parameter(connection, message); + dbus_message_iter_get_basic(&iter, &command); + dbus_message_iter_next(&iter); + if (func(data, attr_callback_list, &attr, NULL)) { + int valid=0; + callback_list_call_attr_4(attr.u.callback_list, attr_command, command, NULL, NULL, &valid); + } + return empty_reply(connection, message); + +} + +static DBusHandlerResult +request_set_add_remove_attr(DBusConnection *connection, DBusMessage *message, char *type, void *data, int (*func)(void *data, struct attr *attr)) +{ + struct attr attr; + int ret; + + if (! data) + data = object_get_from_message(message, type); + if (! data) + return dbus_error_invalid_object_path(connection, message); + + if (decode_attr(message, &attr)) { + ret=(*func)(data, &attr); + destroy_attr(&attr); + if (ret) + return empty_reply(connection, message); + } + return dbus_error_invalid_parameter(connection, message); +} + +/* callback */ + + +static void +dbus_callback_emit_signal(struct dbus_callback *dbus_callback) +{ + DBusMessage* msg; + msg = dbus_message_new_signal(object_path, service_name, dbus_callback->signal); + if (msg) { + dbus_connection_send(connection, msg, &dbus_serial); + dbus_connection_flush(connection); + dbus_message_unref(msg); + } +} + +static void +request_callback_destroy_do(struct dbus_callback *data) +{ + callback_destroy(data->callback); + g_free(data->signal); + g_free(data); +} + +static DBusHandlerResult +request_callback_destroy(DBusConnection *connection, DBusMessage *message) +{ + return request_destroy(connection, message, "callback", NULL, (void (*)(void *)) request_callback_destroy_do); +} + +static DBusHandlerResult +request_callback_new(DBusConnection *connection, DBusMessage *message) +{ + DBusMessageIter iter; + DBusMessage *reply; + struct dbus_callback *callback; + char *signal,*opath; + enum attr_type type; + + dbus_message_iter_init(message, &iter); + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) + return dbus_error_invalid_parameter(connection, message); + dbus_message_iter_get_basic(&iter, &signal); + dbus_message_iter_next(&iter); + callback=g_new0(struct dbus_callback, 1); + callback->signal=g_strdup(signal); + + if (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_STRING) { + type=attr_type_get_from_message(&iter); + callback->callback=callback_new_attr_1(callback_cast(dbus_callback_emit_signal), type, callback); + } else + callback->callback=callback_new_1(callback_cast(dbus_callback_emit_signal), callback); + opath=object_new("callback", callback); + reply = dbus_message_new_method_return(message); + dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + return DBUS_HANDLER_RESULT_HANDLED; +} + +/* config */ +static DBusHandlerResult +request_config_get_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_get_attr(connection, message, "config", config, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))config_get_attr); +} + +static DBusHandlerResult +request_config_attr_iter(DBusConnection *connection, DBusMessage *message) +{ + return request_attr_iter(connection, message, "config", (struct attr_iter * (*)(void))config_attr_iter_new); +} + +static DBusHandlerResult +request_config_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) +{ + return request_attr_iter_destroy(connection, message, "config", (void (*)(struct attr_iter *))config_attr_iter_destroy); +} + + + +/* graphics */ + +static DBusHandlerResult +request_graphics_get_data(DBusConnection *connection, DBusMessage *message) +{ + struct graphics *graphics; + char *data; + struct graphics_data_image *image; + DBusMessage *reply; + + graphics = object_get_from_message(message, "graphics"); + if (! graphics) + return dbus_error_invalid_object_path(connection, message); + + if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &data, DBUS_TYPE_INVALID)) + return dbus_error_invalid_parameter(connection, message); + image=graphics_get_data(graphics, data); + if (image) { + DBusMessageIter iter1,iter2; + reply = dbus_message_new_method_return(message); +#if 0 + dbus_message_append_args(reply, DBUS_TYPE_STRING, &result, DBUS_TYPE_INVALID); +#endif + dbus_message_iter_init_append(reply, &iter1); + dbus_message_iter_open_container(&iter1, DBUS_TYPE_ARRAY, "y", &iter2); + if (image->data && image->size) + dbus_message_iter_append_fixed_array(&iter2, DBUS_TYPE_BYTE, &image->data, image->size); + dbus_message_iter_close_container(&iter1, &iter2); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + return DBUS_HANDLER_RESULT_HANDLED; + } + return empty_reply(connection, message); +} + +/* gui */ + +static DBusHandlerResult +request_gui_get_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_get_attr(connection, message, "gui", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))gui_get_attr); +} + +static DBusHandlerResult +request_gui_command(DBusConnection *connection, DBusMessage *message) +{ + return request_command(connection, message, "gui", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))gui_get_attr); +} + + + +static DBusHandlerResult +request_graphics_set_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_set_add_remove_attr(connection, message, "graphics", NULL, (int (*)(void *, struct attr *))graphics_set_attr); +} + +/* map */ + +static DBusHandlerResult +request_map_get_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_get_attr(connection, message, "map", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))map_get_attr); +} + + +static DBusHandlerResult +request_map_set_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_set_add_remove_attr(connection, message, "map", NULL, (int (*)(void *, struct attr *))map_set_attr); +} + +/* mapset */ + +static DBusHandlerResult +request_mapset_attr_iter(DBusConnection *connection, DBusMessage *message) +{ + return request_attr_iter(connection, message, "mapset", (struct attr_iter * (*)(void))mapset_attr_iter_new); +} + +static DBusHandlerResult +request_mapset_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) +{ + return request_attr_iter_destroy(connection, message, "mapset", (void (*)(struct attr_iter *))mapset_attr_iter_destroy); +} + +static DBusHandlerResult +request_mapset_get_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_get_attr(connection, message, "mapset", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))mapset_get_attr); +} + +/* navigation */ + +static DBusHandlerResult +request_navigation_get_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_get_attr(connection, message, "navigation", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))navigation_get_attr); +} + +/* osd */ + +static DBusHandlerResult +request_osd_get_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_get_attr(connection, message, "osd", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))osd_get_attr); +} + + +static DBusHandlerResult +request_osd_set_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_set_add_remove_attr(connection, message, "osd", NULL, (int (*)(void *, struct attr *))osd_set_attr); +} + + +/* route */ + +static DBusHandlerResult +request_route_get_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_get_attr(connection, message, "route", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))route_get_attr); +} + + +static DBusHandlerResult +request_route_set_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_set_add_remove_attr(connection, message, "route", NULL, (int (*)(void *, struct attr *))route_set_attr); +} + +static DBusHandlerResult +request_route_add_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_set_add_remove_attr(connection, message, "route", NULL, (int (*)(void *, struct attr *))route_add_attr); +} + +static DBusHandlerResult +request_route_remove_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_set_add_remove_attr(connection, message, "route", NULL, (int (*)(void *, struct attr *))route_remove_attr); +} + + +/* navit */ + +static DBusHandlerResult +request_navit_draw(DBusConnection *connection, DBusMessage *message) +{ + struct navit *navit; + + navit=object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + + navit_draw(navit); + + return empty_reply(connection, message); +} + + +/** + * Extracts a struct point from a DBus message + * + * @param message The DBus message + * @param iter Sort of pointer that points on that (ii)-object in the message + * @param p Pointer where the data should get stored + * @returns Returns 1 when everything went right, otherwise 0 + */ +static int +point_get_from_message(DBusMessage *message, DBusMessageIter *iter, struct point *p) +{ + DBusMessageIter iter2; + + dbg(0,"%s\n", dbus_message_iter_get_signature(iter)); + + dbus_message_iter_recurse(iter, &iter2); + + if (dbus_message_iter_get_arg_type(&iter2) != DBUS_TYPE_INT32) + return 0; + dbus_message_iter_get_basic(&iter2, &p->x); + + dbus_message_iter_next(&iter2); + + if (dbus_message_iter_get_arg_type(&iter2) != DBUS_TYPE_INT32) + return 0; + dbus_message_iter_get_basic(&iter2, &p->y); + + dbg(0, " x -> %x y -> %x\n", p->x, p->y); + + dbus_message_iter_next(&iter2); + + if (dbus_message_iter_get_arg_type(&iter2) != DBUS_TYPE_INVALID) + return 0; + + return 1; +} + +/** + * @brief Shows up a message + * @param connection The DBusConnection object through which \a message arrived + * @param message The DBusMessage containing the coordinates + * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED + */ + +static DBusHandlerResult +request_navit_add_message(DBusConnection *connection, DBusMessage *message) +{ + struct navit *navit; + char *usermessage; + + DBusMessageIter iter; + + navit=object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + dbus_message_iter_get_basic(&iter, &usermessage); + + navit_add_message(navit, usermessage); + + return empty_reply(connection, message); +} + + +/** + * @brief Centers the screen on a specified position \a pc on the world + * @param connection The DBusConnection object through which \a message arrived + * @param message The DBusMessage containing the coordinates + * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED + */ + +static DBusHandlerResult +request_navit_set_center(DBusConnection *connection, DBusMessage *message) +{ + struct pcoord pc; + struct navit *navit; + DBusMessageIter iter; + + navit=object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + + if (!pcoord_get_from_message(message, &iter, &pc)) + return dbus_error_invalid_parameter(connection, message); + + navit_set_center(navit, &pc, 0); + return empty_reply(connection, message); +} + +/** + * @brief Centers the screen on a specified position \a p shown on the screen + * @param connection The DBusConnection object through which \a message arrived + * @param message The DBusMessage containing the x and y value + * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED + */ +static DBusHandlerResult +request_navit_set_center_screen(DBusConnection *connection, DBusMessage *message) +{ + struct point p; + struct navit *navit; + DBusMessageIter iter; + + navit=object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + + if (!point_get_from_message(message, &iter, &p)) + return dbus_error_invalid_parameter(connection, message); + navit_set_center_screen(navit, &p, 0); + return empty_reply(connection, message); +} + +/** + * @brief Sets the layout to \a new_layout_name extracted from \a message + * @param connection The DBusConnection object through which \a message arrived + * @param message The DBusMessage containing the name of the layout + * @returns An empty reply if everything went right, otherwise DBUS_HANDLER_RESULT_NOT_YET_HANDLED + */ +static DBusHandlerResult +request_navit_set_layout(DBusConnection *connection, DBusMessage *message) +{ + char *new_layout_name; + struct navit *navit; + struct attr attr; + struct attr_iter *iter; + + navit=object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + + if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &new_layout_name, DBUS_TYPE_INVALID)) + return dbus_error_invalid_parameter(connection, message); + + iter=navit_attr_iter_new(); + while(navit_get_attr(navit, attr_layout, &attr, iter)) { + if (strcmp(attr.u.layout->name, new_layout_name) == 0) { + navit_set_attr(navit, &attr); + } + } + return empty_reply(connection, message); +} + +static DBusHandlerResult +request_navit_zoom(DBusConnection *connection, DBusMessage *message) +{ + int factor; + struct point p, *pp=NULL; + struct navit *navit; + DBusMessageIter iter; + + navit = object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + dbg(0,"%s\n", dbus_message_iter_get_signature(&iter)); + + dbus_message_iter_get_basic(&iter, &factor); + + if (dbus_message_iter_has_next(&iter)) + { + dbus_message_iter_next(&iter); + if (!point_get_from_message(message, &iter, &p)) + return dbus_error_invalid_parameter(connection, message); + pp=&p; + } + + if (factor > 1) + navit_zoom_in(navit, factor, pp); + else if (factor < -1) + navit_zoom_out(navit, 0-factor, pp); + + return empty_reply(connection, message); + +} + +static DBusHandlerResult +request_navit_block(DBusConnection *connection, DBusMessage *message) +{ + int mode; + struct navit *navit; + DBusMessageIter iter; + + navit = object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + + dbus_message_iter_get_basic(&iter, &mode); + + navit_block(navit, mode); + return empty_reply(connection, message); + +} + +static DBusHandlerResult +request_navit_resize(DBusConnection *connection, DBusMessage *message) +{ + struct navit *navit; + int w, h; + DBusMessageIter iter; + + navit = object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + dbg(0,"%s\n", dbus_message_iter_get_signature(&iter)); + + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) + return dbus_error_invalid_parameter(connection, message); + dbus_message_iter_get_basic(&iter, &w); + + dbus_message_iter_next(&iter); + + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) + return dbus_error_invalid_parameter(connection, message); + dbus_message_iter_get_basic(&iter, &h); + + dbg(0, " w -> %i h -> %i\n", w, h); + + navit_handle_resize(navit, w, h); + + return empty_reply(connection, message); + +} + +static DBusHandlerResult +request_navit_get_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_get_attr(connection, message, "navit", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))navit_get_attr); +} + +static DBusHandlerResult +request_navit_attr_iter(DBusConnection *connection, DBusMessage *message) +{ + DBusMessage *reply; + struct attr_iter *attr_iter=navit_attr_iter_new(); + char *opath=object_new("navit_attr_iter",attr_iter); + reply = dbus_message_new_method_return(message); + dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + + return DBUS_HANDLER_RESULT_HANDLED; +} + +static DBusHandlerResult +request_navit_attr_iter_destroy(DBusConnection *connection, DBusMessage *message) +{ + struct attr_iter *attr_iter; + DBusMessageIter iter; + + dbus_message_iter_init(message, &iter); + attr_iter=object_get_from_message_arg(&iter, "navit_attr_iter"); + if (! attr_iter) + return dbus_error_invalid_object_path_parameter(connection, message); + navit_attr_iter_destroy(attr_iter); + + return empty_reply(connection, message); +} + + +static DBusHandlerResult +request_navit_set_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_set_add_remove_attr(connection, message, "navit", NULL, (int (*)(void *, struct attr *))navit_set_attr); +} + +static DBusHandlerResult +request_navit_add_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_set_add_remove_attr(connection, message, "navit", NULL, (int (*)(void *, struct attr *))navit_add_attr); +} + +static DBusHandlerResult +request_navit_remove_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_set_add_remove_attr(connection, message, "navit", NULL, (int (*)(void *, struct attr *))navit_remove_attr); +} + +static DBusHandlerResult +request_navit_set_position(DBusConnection *connection, DBusMessage *message) +{ + struct pcoord pc; + struct navit *navit; + DBusMessageIter iter; + + navit = object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + if (!pcoord_get_from_message(message, &iter, &pc)) + return dbus_error_invalid_parameter(connection, message); + + navit_set_position(navit, &pc); + return empty_reply(connection, message); +} + +static DBusHandlerResult +request_navit_set_destination(DBusConnection *connection, DBusMessage *message) +{ + struct pcoord pc; + struct navit *navit; + DBusMessageIter iter; + char *description; + + navit = object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + if (!pcoord_get_from_message(message, &iter, &pc)) + return dbus_error_invalid_parameter(connection, message); + + dbus_message_iter_next(&iter); + dbus_message_iter_get_basic(&iter, &description); + dbg(0, " destination -> %s\n", description); + + navit_set_destination(navit, &pc, description, 1); + return empty_reply(connection, message); +} + +static DBusHandlerResult +request_navit_clear_destination(DBusConnection *connection, DBusMessage *message) +{ + struct navit *navit; + + navit = object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + navit_set_destination(navit, NULL, NULL, 0); + return empty_reply(connection, message); +} + +static DBusHandlerResult +request_navit_evaluate(DBusConnection *connection, DBusMessage *message) +{ + struct navit *navit; + char *command; + char *result; + struct attr attr; + DBusMessage *reply; + int error; + + navit = object_get_from_message(message, "navit"); + if (! navit) + return dbus_error_invalid_object_path(connection, message); + + attr.type=attr_navit; + attr.u.navit=navit; + if (!dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &command, DBUS_TYPE_INVALID)) + return dbus_error_invalid_parameter(connection, message); + result=command_evaluate_to_string(&attr, command, &error); + reply = dbus_message_new_method_return(message); + if (error) + dbus_message_append_args(reply, DBUS_TYPE_INT32, &error, DBUS_TYPE_INVALID); + else if (result) + dbus_message_append_args(reply, DBUS_TYPE_STRING, &result, DBUS_TYPE_INVALID); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + return DBUS_HANDLER_RESULT_HANDLED; +} + +/* search_list */ + +static DBusHandlerResult +request_search_list_destroy(DBusConnection *connection, DBusMessage *message) +{ + return request_destroy(connection, message, "search_list", NULL, (void (*)(void *)) search_list_destroy); +} + +static DBusHandlerResult +request_search_list_get_result(DBusConnection *connection, DBusMessage *message) +{ + struct search_list *search_list; + struct search_list_result *result; + DBusMessage *reply; + DBusMessageIter iter,iter2,iter3,iter4; + char *country="country"; + char *town="town"; + char *street="street"; + + search_list = object_get_from_message(message, "search_list"); + if (! search_list) + return dbus_error_invalid_object_path(connection, message); + result=search_list_get_result(search_list); + if (!result) + return empty_reply(connection, message); + reply = dbus_message_new_method_return(message); + dbus_message_iter_init_append(reply, &iter); + dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &result->id); + pcoord_encode(&iter, result->c); + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sa{sv}}", &iter2); + if (result->country && (result->country->car || result->country->iso2 || result->country->iso3 || result->country->name)) { + dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); + dbus_message_iter_append_basic(&iter3, DBUS_TYPE_STRING, &country); + dbus_message_iter_open_container(&iter3, DBUS_TYPE_ARRAY, "{sv}", &iter4); + if (result->country->car) + encode_dict_string_variant_string(&iter4, "car", result->country->car); + if (result->country->iso2) + encode_dict_string_variant_string(&iter4, "iso2", result->country->iso2); + if (result->country->iso3) + encode_dict_string_variant_string(&iter4, "iso3", result->country->iso3); + if (result->country->name) + encode_dict_string_variant_string(&iter4, "name", result->country->name); + dbus_message_iter_close_container(&iter3, &iter4); + dbus_message_iter_close_container(&iter2, &iter3); + } + if (result->town && (result->town->common.district_name || result->town->common.town_name)) { + dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); + dbus_message_iter_append_basic(&iter3, DBUS_TYPE_STRING, &town); + dbus_message_iter_open_container(&iter3, DBUS_TYPE_ARRAY, "{sv}", &iter4); + if (result->town->common.district_name) + encode_dict_string_variant_string(&iter4, "district", result->town->common.district_name); + if (result->town->common.town_name) + encode_dict_string_variant_string(&iter4, "name", result->town->common.town_name); + dbus_message_iter_close_container(&iter3, &iter4); + dbus_message_iter_close_container(&iter2, &iter3); + } + if (result->street && result->street->name) { + dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); + dbus_message_iter_append_basic(&iter3, DBUS_TYPE_STRING, &street); + dbus_message_iter_open_container(&iter3, DBUS_TYPE_ARRAY, "{sv}", &iter4); + if (result->street->name) + encode_dict_string_variant_string(&iter4, "name", result->street->name); + dbus_message_iter_close_container(&iter3, &iter4); + dbus_message_iter_close_container(&iter2, &iter3); + } + dbus_message_iter_close_container(&iter, &iter2); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + return DBUS_HANDLER_RESULT_HANDLED; +} + +static DBusHandlerResult +request_search_list_new(DBusConnection *connection, DBusMessage *message) +{ + DBusMessageIter iter; + DBusMessage *reply; + struct mapset *mapset; + struct search_list *search_list; + char *opath; + + dbus_message_iter_init(message, &iter); + mapset=object_get_from_message_arg(&iter, "mapset"); + if (! mapset) + return dbus_error_invalid_object_path_parameter(connection, message); + search_list=search_list_new(mapset); + opath=object_new("search_list", search_list); + reply = dbus_message_new_method_return(message); + dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &opath, DBUS_TYPE_INVALID); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + return DBUS_HANDLER_RESULT_HANDLED; +} + +static DBusHandlerResult +request_search_list_search(DBusConnection *connection, DBusMessage *message) +{ + DBusMessageIter iter; + struct search_list *search_list; + struct attr attr; + int partial; + + search_list = object_get_from_message(message, "search_list"); + if (! search_list) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + if (!decode_attr_from_iter(&iter, &attr)) + return dbus_error_invalid_parameter(connection, message); + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) + return dbus_error_invalid_parameter(connection, message); + dbus_message_iter_get_basic(&iter, &partial); + search_list_search(search_list, &attr, partial); + return empty_reply(connection, message); +} + +static DBusHandlerResult +request_search_list_select(DBusConnection *connection, DBusMessage *message) +{ + DBusMessageIter iter; + struct search_list *search_list; + int id, mode; + enum attr_type attr_type; + + search_list = object_get_from_message(message, "search_list"); + if (! search_list) + return dbus_error_invalid_object_path(connection, message); + + dbus_message_iter_init(message, &iter); + attr_type=decode_attr_type_from_iter(&iter); + if (attr_type == attr_none) + return dbus_error_invalid_parameter(connection, message); + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) + return dbus_error_invalid_parameter(connection, message); + dbus_message_iter_get_basic(&iter, &id); + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INT32) + return dbus_error_invalid_parameter(connection, message); + dbus_message_iter_get_basic(&iter, &mode); + search_list_select(search_list, attr_type, id, mode); + return empty_reply(connection, message); +} + +/* tracking */ + +static DBusHandlerResult +request_tracking_get_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_get_attr(connection, message, "tracking", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))tracking_get_attr); +} + + + +/* vehicle */ + +static DBusHandlerResult +request_vehicle_set_attr(DBusConnection *connection, DBusMessage *message) +{ + struct vehicle *vehicle; + struct attr attr; + int ret; + + vehicle = object_get_from_message(message, "vehicle"); + if (! vehicle) + return dbus_error_invalid_object_path(connection, message); + if (decode_attr(message, &attr)) { + ret=vehicle_set_attr(vehicle, &attr); + destroy_attr(&attr); + if (ret) + return empty_reply(connection, message); + } + return dbus_error_invalid_parameter(connection, message); +} + +/* vehicleprofile */ + +static DBusHandlerResult +request_vehicleprofile_get_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_get_attr(connection, message, "vehicleprofile", NULL, (int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))vehicleprofile_get_attr); +} + + +static DBusHandlerResult +request_vehicleprofile_set_attr(DBusConnection *connection, DBusMessage *message) +{ + return request_set_add_remove_attr(connection, message, "vehicleprofile", NULL, (int (*)(void *, struct attr *))vehicleprofile_set_attr); +} + +struct dbus_method { + char *path; + char *method; + char *signature; + char *signature_name; + char *response; + char *response_name; + DBusHandlerResult(*func)(DBusConnection *connection, DBusMessage *message); +} dbus_methods[] = { + {"", "attr_iter", "", "", "o", "attr_iter", request_config_attr_iter}, + {"", "attr_iter_destroy", "o", "attr_iter", "", "", request_config_attr_iter_destroy}, + {"", "get_attr", "s", "attrname", "sv", "attrname,value",request_config_get_attr}, + {"", "get_attr_wi", "so", "attrname,attr_iter", "sv", "attrname,value",request_config_get_attr}, + {"", "callback_new", "s", "signalname", "o", "callback",request_callback_new}, + {"", "callback_attr_new", "ss", "signalname,attribute", "o", "callback",request_callback_new}, + {"", "search_list_new", "o", "mapset", "o", "search",request_search_list_new}, + {".callback","destroy", "", "", "", "", request_callback_destroy}, + {".graphics","get_data", "s", "type", "ay", "data", request_graphics_get_data}, + {".graphics","set_attr", "sv", "attribute,value", "", "", request_graphics_set_attr}, + {".gui", "get_attr", "s", "attribute", "sv", "attrname,value", request_gui_get_attr}, + {".gui", "command_parameter", "sa{sa{sv}}","command,parameter", "a{sa{sv}}", "return", request_gui_command}, + {".gui", "command", "s", "command", "a{sa{sv}}", "return", request_gui_command}, + {".navit", "draw", "", "", "", "", request_navit_draw}, + {".navit", "add_message", "s", "message", "", "", request_navit_add_message}, + {".navit", "set_center_by_string","s", "(coordinates)", "", "", request_navit_set_center}, + {".navit", "set_center", "(is)", "(projection,coordinates)", "", "", request_navit_set_center}, + {".navit", "set_center", "(iii)", "(projection,longitude,latitude)", "", "", request_navit_set_center}, + {".navit", "set_center_screen", "(ii)", "(pixel_x,pixel_y)", "", "", request_navit_set_center_screen}, + {".navit", "set_layout", "s", "layoutname", "", "", request_navit_set_layout}, + {".navit", "zoom", "i(ii)", "factor(pixel_x,pixel_y)", "", "", request_navit_zoom}, + {".navit", "zoom", "i", "factor", "", "", request_navit_zoom}, + {".navit", "block", "i", "mode", "", "", request_navit_block}, + {".navit", "resize", "ii", "upperleft,lowerright", "", "", request_navit_resize}, + {".navit", "attr_iter", "", "", "o", "attr_iter", request_navit_attr_iter}, + {".navit", "attr_iter_destroy", "o", "attr_iter", "", "", request_navit_attr_iter_destroy}, + {".navit", "get_attr", "s", "attribute", "sv", "attrname,value", request_navit_get_attr}, + {".navit", "get_attr_wi", "so", "attribute,attr_iter", "sv", "attrname,value", request_navit_get_attr}, + {".navit", "set_attr", "sv", "attribute,value", "", "", request_navit_set_attr}, + {".navit", "add_attr", "sv", "attribute,value", "", "", request_navit_add_attr}, + {".navit", "remove_attr", "sv", "attribute,value", "", "", request_navit_remove_attr}, + {".navit", "set_position", "s", "(coordinates)", "", "", request_navit_set_position}, + {".navit", "set_position", "(is)", "(projection,coordinated)", "", "", request_navit_set_position}, + {".navit", "set_position", "(iii)", "(projection,longitude,latitude)", "", "", request_navit_set_position}, + {".navit", "set_destination", "ss", "coordinates,comment", "", "", request_navit_set_destination}, + {".navit", "set_destination", "(is)s", "(projection,coordinates)comment", "", "", request_navit_set_destination}, + {".navit", "set_destination", "(iii)s", "(projection,longitude,latitude)comment", "", "", request_navit_set_destination}, + {".navit", "clear_destination", "", "", "", "", request_navit_clear_destination}, + {".navit", "evaluate", "s", "command", "s", "", request_navit_evaluate}, + {".map", "get_attr", "s", "attribute", "sv", "attrname,value", request_map_get_attr}, + {".map", "set_attr", "sv", "attribute,value", "", "", request_map_set_attr}, + {".mapset", "attr_iter", "", "", "o", "attr_iter", request_mapset_attr_iter}, + {".mapset", "attr_iter_destroy", "o", "attr_iter", "", "", request_mapset_attr_iter_destroy}, + {".mapset", "get_attr", "s", "attribute", "sv", "attrname,value", request_mapset_get_attr}, + {".mapset", "get_attr_wi", "so", "attribute,attr_iter", "sv", "attrname,value", request_mapset_get_attr}, + {".navigation","get_attr", "s", "attribute", "", "", request_navigation_get_attr}, + {".osd", "get_attr", "s", "attribute", "sv", "attrname,value", request_osd_get_attr}, + {".osd", "set_attr", "sv", "attribute,value", "", "", request_osd_set_attr}, + {".route", "get_attr", "s", "attribute", "sv", "attrname,value", request_route_get_attr}, + {".route", "set_attr", "sv", "attribute,value", "", "", request_route_set_attr}, + {".route", "add_attr", "sv", "attribute,value", "", "", request_route_add_attr}, + {".route", "remove_attr", "sv", "attribute,value", "", "", request_route_remove_attr}, + {".search_list","destroy", "", "", "", "", request_search_list_destroy}, + {".search_list","get_result", "", "", "i(iii)a{sa{sv}}", "id,coord,dict", request_search_list_get_result}, + {".search_list","search", "svi", "attribute,value,partial", "", "", request_search_list_search}, + {".search_list","select", "sii", "attribute_type,id,mode", "", "", request_search_list_select}, + {".tracking","get_attr", "s", "attribute", "", "", request_tracking_get_attr}, + {".vehicle","set_attr", "sv", "attribute,value", "", "", request_vehicle_set_attr}, + {".vehicleprofile","get_attr", "s", "attribute", "", "", request_vehicleprofile_get_attr}, + {".vehicleprofile","set_attr", "sv", "attribute,value", "", "", request_vehicleprofile_set_attr}, +}; + +static char * +introspect_path(const char *object) +{ + char *ret; + int i; + char *def=".default_"; + int def_len=strlen(def); + if (strncmp(object, object_path, strlen(object_path))) + return NULL; + ret=g_strdup(object+strlen(object_path)); + dbg(1,"path=%s\n",ret); + for (i = strlen(ret)-1 ; i >= 0 ; i--) { + if (ret[i] == '/' || (ret[i] >= '0' && ret[i] <= '9')) + ret[i]='\0'; + else + break; + } + for (i = 0 ; i < strlen(ret); i++) + if (ret[i] == '/') + ret[i]='.'; + + for (i = strlen(ret)-1 ; i >= 0 ; i--) { + if (!strncmp(ret+i, def, def_len)) { + memmove(ret+1,ret+i+def_len,strlen(ret+i+def_len)+1); + break; + } + } + return ret; +} + +static char * +generate_navitintrospectxml(const char *object) +{ + int i,methods_size,n=0; + char *navitintrospectxml; + char *path=introspect_path(object); + if (!path) + return NULL; + dbg(1,"path=%s\n",path); + + // write header and make navit introspectable + navitintrospectxml = g_strdup_printf("%s%s%s\n", navitintrospectxml_head1, object, navitintrospectxml_head2); + + methods_size=sizeof(dbus_methods)/sizeof(struct dbus_method); + for (i = 0 ; i < methods_size ; i++) { + // start new interface if it's the first method or it changed + if (strcmp(dbus_methods[i].path, path)) + continue; + if ((n == 0) || strcmp(dbus_methods[i-1].path, dbus_methods[i].path)) + navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n", service_name, dbus_methods[i].path); + n++; + + // start the new method + navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n", dbus_methods[i].method); + + // set input signature if existent + if (strcmp(dbus_methods[i].signature, "")) + navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n", dbus_methods[i].signature_name, dbus_methods[i].signature); + + // set response signature if existent + if (strcmp(dbus_methods[i].response, "")) + navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n", dbus_methods[i].response_name, dbus_methods[i].response); + + // close the method + navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n"); + + // close the interface if we reached the last method or the interface changes + if ((methods_size == i+1) || ((methods_size > i+1) && strcmp(dbus_methods[i+1].path, dbus_methods[i].path))) + navitintrospectxml = g_strconcat_printf(navitintrospectxml, " \n\n"); + } + // close the "mother tag" + navitintrospectxml = g_strconcat_printf(navitintrospectxml, "\n"); + + return navitintrospectxml; +} + +static DBusHandlerResult +navit_handler_func(DBusConnection *connection, DBusMessage *message, void *user_data) +{ + int i; + char *path; + dbg(1,"type=%s interface=%s path=%s member=%s signature=%s\n", dbus_message_type_to_string(dbus_message_get_type(message)), dbus_message_get_interface(message), dbus_message_get_path(message), dbus_message_get_member(message), dbus_message_get_signature(message)); + if (dbus_message_is_method_call (message, "org.freedesktop.DBus.Introspectable", "Introspect")) { + DBusMessage *reply; + char *navitintrospectxml = generate_navitintrospectxml(dbus_message_get_path(message)); + dbg(1,"Introspect %s:Result:%s\n",dbus_message_get_path(message), navitintrospectxml); + if (navitintrospectxml) { + reply = dbus_message_new_method_return(message); + dbus_message_append_args(reply, DBUS_TYPE_STRING, &navitintrospectxml, DBUS_TYPE_INVALID); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + g_free(navitintrospectxml); + return DBUS_HANDLER_RESULT_HANDLED; + } + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + + for (i = 0 ; i < sizeof(dbus_methods)/sizeof(struct dbus_method) ; i++) { + path=g_strdup_printf("%s%s", service_name, dbus_methods[i].path); + if (dbus_message_is_method_call(message, path, dbus_methods[i].method) && + dbus_message_has_signature(message, dbus_methods[i].signature)) { + g_free(path); + return dbus_methods[i].func(connection, message); + } + g_free(path); + } + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +static DBusObjectPathVTable dbus_navit_vtable = { + NULL, + navit_handler_func, + NULL +}; + +#if 0 +DBusHandlerResult +filter(DBusConnection *connection, DBusMessage *message, void *user_data) +{ + dbg(0,"type=%s interface=%s path=%s member=%s signature=%s\n", dbus_message_type_to_string(dbus_message_get_type(message)), dbus_message_get_interface(message), dbus_message_get_path(message), dbus_message_get_member(message), dbus_message_get_signature(message)); + if (dbus_message_is_signal(message, DBUS_INTERFACE_DBUS, "NameOwnerChanged")) { + } + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} +#endif + +static int +dbus_cmd_send_signal(struct navit *navit, char *command, struct attr **in, struct attr ***out) +{ + DBusMessage* msg; + char *opath=object_new("navit",navit); + char *interface=g_strdup_printf("%s%s", service_name, ".navit"); + dbg(0,"enter %s %s %s\n",opath,command,interface); + msg = dbus_message_new_signal(opath, interface, "signal"); + if (msg) { + DBusMessageIter iter1,iter2,iter3; + dbus_message_iter_init_append(msg, &iter1); + dbus_message_iter_open_container(&iter1, DBUS_TYPE_ARRAY, "{sv}", &iter2); + if (in) { + while (*in) { + dbus_message_iter_open_container(&iter2, DBUS_TYPE_DICT_ENTRY, NULL, &iter3); + encode_attr(&iter3, *in); + dbus_message_iter_close_container(&iter2, &iter3); + in++; + } + } + dbus_message_iter_close_container(&iter1, &iter2); + dbus_connection_send(connection, msg, &dbus_serial); + dbus_connection_flush(connection); + dbus_message_unref(msg); + } + g_free(interface); + return 0; +} + + +static struct command_table commands[] = { + {"dbus_send_signal",command_cast(dbus_cmd_send_signal)}, +}; + + +static void +dbus_main_navit(struct navit *navit, int added) +{ + struct attr attr; + if (added==1) { + DBusMessage* msg; + char *opath=object_new("navit",navit); + char *interface=g_strdup_printf("%s%s", service_name, ".navit"); + command_add_table_attr(commands, sizeof(commands)/sizeof(struct command_table), navit, &attr); + navit_add_attr(navit, &attr); + msg = dbus_message_new_signal(opath, interface, "startup"); + dbus_connection_send(connection, msg, &dbus_serial); + dbus_connection_flush(connection); + dbus_message_unref(msg); + g_free(interface); + } +} + +void plugin_init(void) +{ + DBusError error; + + struct attr callback; + object_hash=g_hash_table_new(g_str_hash, g_str_equal); + object_hash_rev=g_hash_table_new(NULL, NULL); + object_count=g_hash_table_new(g_str_hash, g_str_equal); + dbg(1,"enter\n"); + dbus_error_init(&error); +#ifdef DBUS_USE_SYSTEM_BUS + connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error); +#else + connection = dbus_bus_get(DBUS_BUS_SESSION, &error); +#endif + if (!connection) { + dbg(0,"Failed to open connection to session message bus: %s\n", error.message); + dbus_error_free(&error); + return; + } + dbus_connection_setup_with_g_main(connection, NULL); +#if 0 + dbus_connection_add_filter(connection, filter, NULL, NULL); + dbus_bus_add_match(connection, "type='signal',""interface='" DBUS_INTERFACE_DBUS "'", &error); +#endif + dbus_connection_register_fallback(connection, object_path, &dbus_navit_vtable, NULL); + dbus_bus_request_name(connection, service_name, 0, &error); + if (dbus_error_is_set(&error)) { + dbg(0,"Failed to request name: %s", error.message); + dbus_error_free (&error); + } + callback.type=attr_callback; + callback.u.callback=callback_new_attr_0(callback_cast(dbus_main_navit),attr_navit); + config_add_attr(config, &callback); +} diff --git a/navit/binding/dbus/org.navit_project.navit.service.in b/navit/binding/dbus/org.navit_project.navit.service.in new file mode 100644 index 0000000..fc3e4f7 --- /dev/null +++ b/navit/binding/dbus/org.navit_project.navit.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.navit_project.navit +Exec=@bindir@/navit diff --git a/navit/binding/python/Makefile.am b/navit/binding/python/Makefile.am new file mode 100644 index 0000000..a716323 --- /dev/null +++ b/navit/binding/python/Makefile.am @@ -0,0 +1,6 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ @PYTHON_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=binding_python +modulebinding_LTLIBRARIES = libbinding_python.la +libbinding_python_la_SOURCES = binding_python.c config.c navit.c pcoord.c route.c navigation.c attr.c common.h +libbinding_python_la_LIBADD = @PYTHON_LIBS@ +libbinding_python_la_LDFLAGS = -module -avoid-version diff --git a/navit/binding/python/Makefile.in b/navit/binding/python/Makefile.in new file mode 100644 index 0000000..0a9e9ca --- /dev/null +++ b/navit/binding/python/Makefile.in @@ -0,0 +1,698 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/binding/python +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulebindingdir)" +LTLIBRARIES = $(modulebinding_LTLIBRARIES) +libbinding_python_la_DEPENDENCIES = +am_libbinding_python_la_OBJECTS = binding_python.lo config.lo navit.lo \ + pcoord.lo route.lo navigation.lo attr.lo +libbinding_python_la_OBJECTS = $(am_libbinding_python_la_OBJECTS) +libbinding_python_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libbinding_python_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libbinding_python_la_SOURCES) +DIST_SOURCES = $(libbinding_python_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ @PYTHON_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=binding_python +modulebinding_LTLIBRARIES = libbinding_python.la +libbinding_python_la_SOURCES = binding_python.c config.c navit.c pcoord.c route.c navigation.c attr.c common.h +libbinding_python_la_LIBADD = @PYTHON_LIBS@ +libbinding_python_la_LDFLAGS = -module -avoid-version +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/binding/python/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/binding/python/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulebindingLTLIBRARIES: $(modulebinding_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulebindingdir)" || $(MKDIR_P) "$(DESTDIR)$(modulebindingdir)" + @list='$(modulebinding_LTLIBRARIES)'; test -n "$(modulebindingdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulebindingdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulebindingdir)"; \ + } + +uninstall-modulebindingLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulebinding_LTLIBRARIES)'; test -n "$(modulebindingdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulebindingdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulebindingdir)/$$f"; \ + done + +clean-modulebindingLTLIBRARIES: + -test -z "$(modulebinding_LTLIBRARIES)" || rm -f $(modulebinding_LTLIBRARIES) + @list='$(modulebinding_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libbinding_python.la: $(libbinding_python_la_OBJECTS) $(libbinding_python_la_DEPENDENCIES) + $(libbinding_python_la_LINK) -rpath $(modulebindingdir) $(libbinding_python_la_OBJECTS) $(libbinding_python_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/attr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binding_python.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/config.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/navigation.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/navit.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcoord.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/route.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulebindingdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulebindingLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulebindingLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulebindingLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulebindingLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-modulebindingLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulebindingLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/binding/python/attr.c b/navit/binding/python/attr.c new file mode 100644 index 0000000..2d5ed92 --- /dev/null +++ b/navit/binding/python/attr.c @@ -0,0 +1,99 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include "common.h" +#include "item.h" +#include "attr.h" + +typedef struct { + PyObject_HEAD + int ref; + struct attr *attr; +} attrObject; + +static PyObject * +attr_func(attrObject *self, PyObject *args) +{ + const char *file; + int ret; + if (!PyArg_ParseTuple(args, "s", &file)) + return NULL; + ret=0; + return Py_BuildValue("i",ret); +} + + + +static PyMethodDef attr_methods[] = { + {"func", (PyCFunction) attr_func, METH_VARARGS }, + {NULL, NULL }, +}; + + +static PyObject * +attr_getattr_py(PyObject *self, char *name) +{ + return Py_FindMethod(attr_methods, self, name); +} + +static void +attr_destroy_py(attrObject *self) +{ + if (! self->ref) + attr_free(self->attr); +} + +PyTypeObject attr_Type = { + Obj_HEAD + .tp_name="attr", + .tp_basicsize=sizeof(attrObject), + .tp_dealloc=(destructor)attr_destroy_py, + .tp_getattr=attr_getattr_py, +}; + +struct attr * +attr_py_get(PyObject *self) +{ + return ((attrObject *)self)->attr; +} + +PyObject * +attr_new_py(PyObject *self, PyObject *args) +{ + attrObject *ret; + const char *name,*value; + if (!PyArg_ParseTuple(args, "ss", &name, &value)) + return NULL; + ret=PyObject_NEW(attrObject, &attr_Type); + ret->attr=attr_new_from_text(name, value); + ret->ref=0; + return (PyObject *)ret; +} + +PyObject * +attr_new_py_ref(struct attr *attr) +{ + attrObject *ret; + + ret=PyObject_NEW(attrObject, &attr_Type); + ret->ref=1; + ret->attr=attr; + return (PyObject *)ret; +} + diff --git a/navit/binding/python/binding_python.c b/navit/binding/python/binding_python.c new file mode 100644 index 0000000..318ef0f --- /dev/null +++ b/navit/binding/python/binding_python.c @@ -0,0 +1,370 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include "config.h" +#include +#include "common.h" +#include +#include "coord.h" +#include "projection.h" +#include "debug.h" +#include "item.h" +#include "map.h" +#include "mapset.h" +#include "plugin.h" +#include "debug.h" +#include "item.h" +#include "attr.h" +#include "xmlconfig.h" + +#if defined(MS_WINDOWS) || defined(__CYGWIN__) +#define Obj_HEAD PyObject_HEAD_INIT(NULL); +#else +#define Obj_HEAD PyObject_HEAD_INIT(&PyType_Type) +#endif + +/* *** coord *** */ + +typedef struct { + PyObject_HEAD + struct coord *c; +} coordObject; + +static void coord_destroy_py(coordObject *self); + +PyTypeObject coord_Type = { + Obj_HEAD + .tp_name="coord", + .tp_basicsize=sizeof(coordObject), + .tp_dealloc=(destructor)coord_destroy_py, +}; + + +/* *** map *** */ + +typedef struct { + PyObject_HEAD + int ref; + struct map *m; +} mapObject; + +static void map_destroy_py(mapObject *self); +static PyObject *map_getattr_py(PyObject *self, char *name); + +PyTypeObject map_Type = { + Obj_HEAD + .tp_name="map", + .tp_basicsize=sizeof(mapObject), + .tp_dealloc=(destructor)map_destroy_py, + .tp_getattr=map_getattr_py, +}; + +/* *** IMPLEMENTATIONS *** */ + +/* *** coord *** */ + +static PyObject * +coord_new_py(PyObject *self, PyObject *args) +{ + coordObject *ret; + int x,y; + if (!PyArg_ParseTuple(args, "ii:navit.coord",&x,&y)) + return NULL; + ret=PyObject_NEW(coordObject, &coord_Type); + ret->c=coord_new(x,y); + return (PyObject *)ret; +} + +static void +coord_destroy_py(coordObject *self) +{ + coord_destroy(self->c); +} + +/* *** coord_rect *** */ + +typedef struct { + PyObject_HEAD + struct coord_rect *r; +} coord_rectObject; + + +static void coord_rect_destroy_py(coord_rectObject *self); + +PyTypeObject coord_rect_Type = { +#if defined(MS_WINDOWS) || defined(__CYGWIN__) + PyObject_HEAD_INIT(NULL); +#else + PyObject_HEAD_INIT(&PyType_Type) +#endif + .tp_name="coord_rect", + .tp_basicsize=sizeof(coord_rectObject), + .tp_dealloc=(destructor)coord_rect_destroy_py, +}; + +static PyObject * +coord_rect_new_py(PyObject *self, PyObject *args) +{ + coord_rectObject *ret; + coordObject *lu,*rd; + if (!PyArg_ParseTuple(args, "O!O!:navit.coord_rect_rect",&coord_Type,&lu,&coord_Type,&rd)) + return NULL; + ret=PyObject_NEW(coord_rectObject, &coord_rect_Type); + ret->r=coord_rect_new(lu->c,rd->c); + return (PyObject *)ret; +} + +static void +coord_rect_destroy_py(coord_rectObject *self) +{ + coord_rect_destroy(self->r); +} + +/* *** map_rect *** */ + +typedef struct { + PyObject_HEAD + struct map_rect *mr; +} map_rectObject; + + +static void map_rect_destroy_py(map_rectObject *self); + +PyTypeObject map_rect_Type = { +#if defined(MS_WINDOWS) || defined(__CYGWIN__) + PyObject_HEAD_INIT(NULL); +#else + PyObject_HEAD_INIT(&PyType_Type) +#endif + .tp_name="map_rect", + .tp_basicsize=sizeof(map_rectObject), + .tp_dealloc=(destructor)map_rect_destroy_py, +}; + +static PyObject * +map_rect_new_py(mapObject *self, PyObject *args) +{ + map_rectObject *ret; + coord_rectObject *r; + if (!PyArg_ParseTuple(args, "O!:navit.map_rect_rect",&coord_rect_Type,&r)) + return NULL; + ret=PyObject_NEW(map_rectObject, &map_rect_Type); + ret->mr=map_rect_new(self->m, NULL); + return (PyObject *)ret; +} + +static void +map_rect_destroy_py(map_rectObject *self) +{ + map_rect_destroy(self->mr); +} + + +/* *** map *** */ + +static PyObject * +map_dump_file_py(mapObject *self, PyObject *args) +{ + const char *s; + if (!PyArg_ParseTuple(args, "s",&s)) + return NULL; + map_dump_file(self->m, s); + Py_RETURN_NONE; +} + + +static PyObject * +map_set_attr_py(mapObject *self, PyObject *args) +{ + PyObject *attr; + if (!PyArg_ParseTuple(args, "O!", &attr_Type, &attr)) + return NULL; + map_set_attr(self->m, attr_py_get(attr)); + Py_RETURN_NONE; +} + + + +static PyMethodDef map_methods[] = { + {"dump_file", (PyCFunction) map_dump_file_py, METH_VARARGS }, + {"map_rect_new", (PyCFunction) map_rect_new_py, METH_VARARGS }, + {"set_attr", (PyCFunction) map_set_attr_py, METH_VARARGS }, + {NULL, NULL }, +}; + +static PyObject * +map_getattr_py(PyObject *self, char *name) +{ + return Py_FindMethod(map_methods, self, name); +} + + +static PyObject * +map_new_py(PyObject *self, PyObject *args) +{ + mapObject *ret; + char *type, *filename; + + if (!PyArg_ParseTuple(args, "ss:navit.map", &type, &filename)) + return NULL; + ret=PyObject_NEW(mapObject, &map_Type); + ret->m=map_new(NULL,NULL); + ret->ref=0; + return (PyObject *)ret; +} + +PyObject * +map_py_ref(struct map *map) +{ + mapObject *ret; + ret=PyObject_NEW(mapObject, &map_Type); + ret->m=map; + ret->ref=1; + return (PyObject *)ret; +} + +static void +map_destroy_py(mapObject *self) +{ + if (!self->ref) + map_destroy(self->m); +} + +/* *** mapset *** */ + + +typedef struct { + PyObject_HEAD + struct mapset *ms; +} mapsetObject; + + +static void mapset_destroy_py(mapsetObject *self); +static PyObject *mapset_getattr_py(PyObject *self, char *name); + +PyTypeObject mapset_Type = { +#if defined(MS_WINDOWS) || defined(__CYGWIN__) + PyObject_HEAD_INIT(NULL); +#else + PyObject_HEAD_INIT(&PyType_Type) +#endif + .tp_name="mapset", + .tp_basicsize=sizeof(mapsetObject), + .tp_dealloc=(destructor)mapset_destroy_py, + .tp_getattr=mapset_getattr_py, +}; + +static PyObject * +mapset_add_py(mapsetObject *self, PyObject *args) +{ + mapObject *map; + if (!PyArg_ParseTuple(args, "O:navit.mapset", &map)) + return NULL; + Py_INCREF(map); + mapset_add_attr(self->ms, &(struct attr){attr_map,.u.map=map->m}); + return Py_BuildValue(""); +} + +static PyMethodDef mapset_methods[] = { + {"add", (PyCFunction) mapset_add_py, METH_VARARGS }, + {NULL, NULL }, +}; + +static PyObject * +mapset_getattr_py(PyObject *self, char *name) +{ + return Py_FindMethod(mapset_methods, self, name); +} + +static PyObject * +mapset_new_py(PyObject *self, PyObject *args) +{ + mapsetObject *ret; + if (!PyArg_ParseTuple(args, ":navit.mapset")) + return NULL; + ret=PyObject_NEW(mapsetObject, &mapset_Type); + ret->ms=mapset_new(NULL,NULL); + return (PyObject *)ret; +} + +static void +mapset_destroy_py(mapsetObject *self) +{ + mapset_destroy(self->ms); +} + +static PyObject * +config_load_py(PyObject *self, PyObject *args) +{ + const char *file; + int ret; + xmlerror *error; + if (!PyArg_ParseTuple(args, "s", &file)) + return NULL; + ret=config_load(file, &error); + return Py_BuildValue("i",ret); +} + +static PyMethodDef navitMethods[]={ + {"attr", attr_new_py, METH_VARARGS}, + {"coord", coord_new_py, METH_VARARGS, "Create a new coordinate point."}, + {"coord_rect", coord_rect_new_py, METH_VARARGS, "Create a new coordinate rectangle."}, + {"map", map_new_py, METH_VARARGS, "Create a new map."}, + {"mapset", mapset_new_py, METH_VARARGS, "Create a new mapset."}, + {"config_load", config_load_py, METH_VARARGS, "Load a config"}, + {"config", config_py, METH_VARARGS, "Get Config Object"}, + {"pcoord", pcoord_py, METH_VARARGS}, + {NULL, NULL, 0, NULL} +}; + + +PyObject * +python_object_from_attr(struct attr *attr) +{ + switch (attr->type) { + case attr_navigation: + return navigation_py_ref(attr->u.navigation); + case attr_route: + return route_py_ref(attr->u.route); + default: + return NULL; + } + return NULL; +} + + +void +plugin_init(void) +{ + int fd,size; + char buffer[65536]; + + Py_Initialize(); + Py_InitModule("navit", navitMethods); + fd=open("startup.py",O_RDONLY); + if (fd >= 0) { + size=read(fd, buffer, 65535); + if (size > 0) { + buffer[size]='\0'; + PyRun_SimpleString(buffer); + } + } + + Py_Finalize(); +} diff --git a/navit/binding/python/common.h b/navit/binding/python/common.h new file mode 100644 index 0000000..c9af7a8 --- /dev/null +++ b/navit/binding/python/common.h @@ -0,0 +1,55 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include "debug.h" + +#if defined(MS_WINDOWS) || defined(__CYGWIN__) +#define Obj_HEAD PyObject_HEAD_INIT(NULL); +#else +#define Obj_HEAD PyObject_HEAD_INIT(&PyType_Type) +#endif + +struct navit; +struct map; + +PyObject * python_object_from_attr(struct attr *attr); + +PyObject * config_py(PyObject *self, PyObject *args); + +PyObject * map_py_ref(struct map *map); + +struct navigation; +PyObject * navigation_py(PyObject *self, PyObject *args); +PyObject * navigation_py_ref(struct navigation *navigation); + +PyObject * navit_py(PyObject *self, PyObject *args); +PyObject * navit_py_ref(struct navit *navit); +extern PyTypeObject pcoord_Type; +PyObject * pcoord_py(PyObject *self, PyObject *args); +struct pcoord *pcoord_py_get(PyObject *self); + +struct route; +PyObject * route_py(PyObject *self, PyObject *args); +PyObject * route_py_ref(struct route *route); + +extern PyTypeObject attr_Type; +PyObject * attr_new_py(PyObject *self, PyObject *args); +PyObject * attr_new_py_ref(struct attr *attr); +struct attr * attr_py_get(PyObject *self); diff --git a/navit/binding/python/config.c b/navit/binding/python/config.c new file mode 100644 index 0000000..ffcaed2 --- /dev/null +++ b/navit/binding/python/config.c @@ -0,0 +1,73 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include "common.h" +#include "item.h" +#include "config_.h" + +typedef struct { + PyObject_HEAD +} configObject; + +static PyObject * +config_navit(PyObject *self, PyObject *args) +{ + struct attr navit; + if (config_get_attr(config, attr_navit, &navit, NULL)) + return navit_py_ref(navit.u.navit); + return NULL; +} + + + +static PyMethodDef config_methods[] = { + {"navit", (PyCFunction) config_navit, METH_VARARGS }, + {NULL, NULL }, +}; + + +static PyObject * +config_getattr_py(PyObject *self, char *name) +{ + return Py_FindMethod(config_methods, self, name); +} + +static void +config_destroy_py(configObject *self) +{ +} + +PyTypeObject config_Type = { + Obj_HEAD + .tp_name="config", + .tp_basicsize=sizeof(configObject), + .tp_dealloc=(destructor)config_destroy_py, + .tp_getattr=config_getattr_py, +}; + +PyObject * +config_py(PyObject *self, PyObject *args) +{ + configObject *ret; + + dbg(0,"enter\n"); + ret=PyObject_NEW(configObject, &config_Type); + return (PyObject *)ret; +} + diff --git a/navit/binding/python/navigation.c b/navit/binding/python/navigation.c new file mode 100644 index 0000000..75a421d --- /dev/null +++ b/navit/binding/python/navigation.c @@ -0,0 +1,82 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include "common.h" +#include "navigation.h" + +typedef struct { + PyObject_HEAD + struct navigation *navigation; +} navigationObject; + +static PyObject * +navigation_get_map_py(navigationObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) + return NULL; + return map_py_ref(navigation_get_map(self->navigation)); +} + + + +static PyMethodDef navigation_methods[] = { + {"get_map", (PyCFunction) navigation_get_map_py, METH_VARARGS }, + {NULL, NULL }, +}; + + +static PyObject * +navigation_getattr_py(PyObject *self, char *name) +{ + return Py_FindMethod(navigation_methods, self, name); +} + +static void +navigation_destroy_py(navigationObject *self) +{ +} + +PyTypeObject navigation_Type = { + Obj_HEAD + .tp_name="navigation", + .tp_basicsize=sizeof(navigationObject), + .tp_dealloc=(destructor)navigation_destroy_py, + .tp_getattr=navigation_getattr_py, +}; + +PyObject * +navigation_py(PyObject *self, PyObject *args) +{ + navigationObject *ret; + + ret=PyObject_NEW(navigationObject, &navigation_Type); + return (PyObject *)ret; +} + +PyObject * +navigation_py_ref(struct navigation *navigation) +{ + navigationObject *ret; + + ret=PyObject_NEW(navigationObject, &navigation_Type); + ret->navigation=navigation; + return (PyObject *)ret; +} + + diff --git a/navit/binding/python/navit.c b/navit/binding/python/navit.c new file mode 100644 index 0000000..ada8cd7 --- /dev/null +++ b/navit/binding/python/navit.c @@ -0,0 +1,135 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include "common.h" +#include "item.h" +#include "navit.h" + +typedef struct { + PyObject_HEAD + struct navit *navit; +} navitObject; + +static PyObject * +navit_get_attr_py(navitObject *self, PyObject *args) +{ + char *name; + struct attr attr; + if (!PyArg_ParseTuple(args, "s", &name)) + return NULL; + if (!navit_get_attr(self->navit, attr_from_name(name), &attr, NULL)) { + dbg(0,"get_attr not ok\n"); + Py_RETURN_NONE; + } + dbg(0,"get_attr ok\n"); + return python_object_from_attr(&attr); +} + +static PyObject * +navit_set_center_py(navitObject *self, PyObject *args) +{ + PyObject *pcoord; + if (!PyArg_ParseTuple(args, "O!", &pcoord_Type, &pcoord)) + return NULL; + navit_set_center(self->navit, pcoord_py_get(pcoord), 0); + Py_RETURN_NONE; +} + +static PyObject * +navit_set_destination_py(navitObject *self, PyObject *args) +{ + PyObject *pcoord; + const char *description; + int async; + if (!PyArg_ParseTuple(args, "O!si", &pcoord_Type, &pcoord, &description, &async)) + return NULL; + navit_set_destination(self->navit, pcoord_py_get(pcoord), description, async); + Py_RETURN_NONE; +} + +static PyObject * +navit_set_position_py(navitObject *self, PyObject *args) +{ + PyObject *pcoord; + if (!PyArg_ParseTuple(args, "O!", &pcoord_Type, &pcoord)) + return NULL; + navit_set_position(self->navit, pcoord_py_get(pcoord)); + Py_RETURN_NONE; +} + + +static PyObject * +navit_zoom_to_route_py(navitObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) + return NULL; + navit_zoom_to_route(self->navit,0); + Py_RETURN_NONE; +} + + + + +static PyMethodDef navit_methods[] = { + {"get_attr", (PyCFunction) navit_get_attr_py, METH_VARARGS }, + {"set_center", (PyCFunction) navit_set_center_py, METH_VARARGS }, + {"set_destination", (PyCFunction) navit_set_destination_py, METH_VARARGS }, + {"set_position", (PyCFunction) navit_set_position_py, METH_VARARGS }, + {"zoom_to_route", (PyCFunction) navit_zoom_to_route_py, METH_VARARGS }, + {NULL, NULL }, +}; + + +static PyObject * +navit_getattr_py(PyObject *self, char *name) +{ + return Py_FindMethod(navit_methods, self, name); +} + +static void +navit_destroy_py(navitObject *self) +{ +} + +PyTypeObject navit_Type = { + Obj_HEAD + .tp_name="navit", + .tp_basicsize=sizeof(navitObject), + .tp_dealloc=(destructor)navit_destroy_py, + .tp_getattr=navit_getattr_py, +}; + +PyObject * +navit_py(PyObject *self, PyObject *args) +{ + navitObject *ret; + + dbg(0,"enter\n"); + ret=PyObject_NEW(navitObject, &navit_Type); + return (PyObject *)ret; +} + +PyObject * +navit_py_ref(struct navit *navit) +{ + dbg(0,"navit=%p\n", navit); + navitObject *ret=PyObject_NEW(navitObject, &navit_Type); + ret->navit=navit; + return (PyObject *)ret; +} diff --git a/navit/binding/python/pcoord.c b/navit/binding/python/pcoord.c new file mode 100644 index 0000000..a4cb264 --- /dev/null +++ b/navit/binding/python/pcoord.c @@ -0,0 +1,88 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include "common.h" +#include "coord.h" + +typedef struct { + PyObject_HEAD + struct pcoord pc; +} pcoordObject; + +static PyObject * +pcoord_func(pcoordObject *self, PyObject *args) +{ + const char *file; + int ret=0; + if (!PyArg_ParseTuple(args, "s", &file)) + return NULL; + return Py_BuildValue("i",ret); +} + + + +static PyMethodDef pcoord_methods[] = { + {"func", (PyCFunction) pcoord_func, METH_VARARGS }, + {NULL, NULL }, +}; + + +static PyObject * +pcoord_getattr_py(PyObject *self, char *name) +{ + return Py_FindMethod(pcoord_methods, self, name); +} + +static void +pcoord_destroy_py(pcoordObject *self) +{ +} + +PyTypeObject pcoord_Type = { + Obj_HEAD + .tp_name="pcoord", + .tp_basicsize=sizeof(pcoordObject), + .tp_dealloc=(destructor)pcoord_destroy_py, + .tp_getattr=pcoord_getattr_py, +}; + +PyObject * +pcoord_py(PyObject *self, PyObject *args) +{ + pcoordObject *ret; + const char *str; + enum projection pro; + struct coord c; + if (!PyArg_ParseTuple(args, "si", &str, &pro)) + return NULL; + ret=PyObject_NEW(pcoordObject, &pcoord_Type); + coord_parse(str, pro, &c); + ret->pc.pro=pro; + ret->pc.x=c.x; + ret->pc.y=c.y; + dbg(0,"0x%x,0x%x\n", c.x, c.y); + return (PyObject *)ret; +} + +struct pcoord * +pcoord_py_get(PyObject *self) +{ + return &((pcoordObject *)self)->pc; +} + diff --git a/navit/binding/python/route.c b/navit/binding/python/route.c new file mode 100644 index 0000000..dfbd08c --- /dev/null +++ b/navit/binding/python/route.c @@ -0,0 +1,84 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include "common.h" +#include "item.h" +#include "coord.h" +#include "route.h" + +typedef struct { + PyObject_HEAD + struct route *route; +} routeObject; + +static PyObject * +route_get_map_py(routeObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, "")) + return NULL; + return map_py_ref(route_get_map(self->route)); +} + + + +static PyMethodDef route_methods[] = { + {"get_map", (PyCFunction) route_get_map_py, METH_VARARGS }, + {NULL, NULL }, +}; + + +static PyObject * +route_getattr_py(PyObject *self, char *name) +{ + return Py_FindMethod(route_methods, self, name); +} + +static void +route_destroy_py(routeObject *self) +{ +} + +PyTypeObject route_Type = { + Obj_HEAD + .tp_name="route", + .tp_basicsize=sizeof(routeObject), + .tp_dealloc=(destructor)route_destroy_py, + .tp_getattr=route_getattr_py, +}; + +PyObject * +route_py(PyObject *self, PyObject *args) +{ + routeObject *ret; + + ret=PyObject_NEW(routeObject, &route_Type); + return (PyObject *)ret; +} + +PyObject * +route_py_ref(struct route *route) +{ + routeObject *ret; + + ret=PyObject_NEW(routeObject, &route_Type); + ret->route=route; + return (PyObject *)ret; +} + + diff --git a/navit/binding/win32/Makefile.am b/navit/binding/win32/Makefile.am new file mode 100644 index 0000000..f25c28d --- /dev/null +++ b/navit/binding/win32/Makefile.am @@ -0,0 +1,15 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = -I$(top_srcdir)/navit -I$(top_srcdir)/navit/binding/win32 @NAVIT_CFLAGS@ -DMODULE=binding_win32 +if PLUGINS +modulebinding_LTLIBRARIES = libbinding_win32.la +else +noinst_LTLIBRARIES = libbinding_win32.la +endif +libbinding_win32_la_SOURCES = binding_win32.c binding_win32.h +libbinding_win32_la_LIBADD = +libbinding_win32_la_LDFLAGS = -module -avoid-version +bin_PROGRAMS=tell_navit +tell_navit_LDADD = @NAVIT_LIBS@ +if SUPPORT_WIN32CE + tell_navit_LDADD += -L$(top_builddir)/navit/support/libc -lsupport_libc +endif diff --git a/navit/binding/win32/Makefile.in b/navit/binding/win32/Makefile.in new file mode 100644 index 0000000..5c5b934 --- /dev/null +++ b/navit/binding/win32/Makefile.in @@ -0,0 +1,764 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +bin_PROGRAMS = tell_navit$(EXEEXT) +@SUPPORT_WIN32CE_TRUE@am__append_1 = -L$(top_builddir)/navit/support/libc -lsupport_libc +subdir = navit/binding/win32 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulebindingdir)" \ + "$(DESTDIR)$(bindir)" +LTLIBRARIES = $(modulebinding_LTLIBRARIES) $(noinst_LTLIBRARIES) +libbinding_win32_la_DEPENDENCIES = +am_libbinding_win32_la_OBJECTS = binding_win32.lo +libbinding_win32_la_OBJECTS = $(am_libbinding_win32_la_OBJECTS) +libbinding_win32_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libbinding_win32_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libbinding_win32_la_rpath = +@PLUGINS_TRUE@am_libbinding_win32_la_rpath = -rpath \ +@PLUGINS_TRUE@ $(modulebindingdir) +PROGRAMS = $(bin_PROGRAMS) +tell_navit_SOURCES = tell_navit.c +tell_navit_OBJECTS = tell_navit.$(OBJEXT) +am__DEPENDENCIES_1 = +tell_navit_DEPENDENCIES = $(am__DEPENDENCIES_1) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libbinding_win32_la_SOURCES) tell_navit.c +DIST_SOURCES = $(libbinding_win32_la_SOURCES) tell_navit.c +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = -I$(top_srcdir)/navit -I$(top_srcdir)/navit/binding/win32 @NAVIT_CFLAGS@ -DMODULE=binding_win32 +@PLUGINS_TRUE@modulebinding_LTLIBRARIES = libbinding_win32.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libbinding_win32.la +libbinding_win32_la_SOURCES = binding_win32.c binding_win32.h +libbinding_win32_la_LIBADD = +libbinding_win32_la_LDFLAGS = -module -avoid-version +tell_navit_LDADD = @NAVIT_LIBS@ $(am__append_1) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/binding/win32/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/binding/win32/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulebindingLTLIBRARIES: $(modulebinding_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulebindingdir)" || $(MKDIR_P) "$(DESTDIR)$(modulebindingdir)" + @list='$(modulebinding_LTLIBRARIES)'; test -n "$(modulebindingdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulebindingdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulebindingdir)"; \ + } + +uninstall-modulebindingLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulebinding_LTLIBRARIES)'; test -n "$(modulebindingdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulebindingdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulebindingdir)/$$f"; \ + done + +clean-modulebindingLTLIBRARIES: + -test -z "$(modulebinding_LTLIBRARIES)" || rm -f $(modulebinding_LTLIBRARIES) + @list='$(modulebinding_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libbinding_win32.la: $(libbinding_win32_la_OBJECTS) $(libbinding_win32_la_DEPENDENCIES) + $(libbinding_win32_la_LINK) $(am_libbinding_win32_la_rpath) $(libbinding_win32_la_OBJECTS) $(libbinding_win32_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +tell_navit$(EXEEXT): $(tell_navit_OBJECTS) $(tell_navit_DEPENDENCIES) + @rm -f tell_navit$(EXEEXT) + $(LINK) $(tell_navit_OBJECTS) $(tell_navit_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binding_win32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tell_navit.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) +installdirs: + for dir in "$(DESTDIR)$(modulebindingdir)" "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool \ + clean-modulebindingLTLIBRARIES clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulebindingLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-modulebindingLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool clean-modulebindingLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-modulebindingLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-modulebindingLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/binding/win32/binding_win32.c b/navit/binding/win32/binding_win32.c new file mode 100644 index 0000000..ed6c19d --- /dev/null +++ b/navit/binding/win32/binding_win32.c @@ -0,0 +1,143 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include "config.h" +#include "config_.h" +#include "navit.h" +#include "coord.h" +#include "point.h" +#include "plugin.h" +#include "debug.h" +#include "item.h" +#include "attr.h" +#include "layout.h" +#include "navigation.h" +#include "command.h" +#include "callback.h" +#include "graphics.h" +#include "track.h" +#include "vehicle.h" +#include "vehicleprofile.h" +#include "map.h" +#include "mapset.h" +#include "osd.h" +#include "route.h" +#include "search.h" +#include "callback.h" +#include "gui.h" +#include "util.h" +#include "binding_win32.h" + +struct win32_binding_private { + struct navit* navit; +}; + + + +/* TODO: do something meaningful here + * + */ +static int +win32_cmd_send_signal(struct navit *navit, char *command, struct attr **in, struct attr ***out) +{ + dbg(0,"this function is a stub\n"); + if (in) { + while (*in) { + dbg(0,"another attribute to be sent\n"); + in++; + } + } + return 0; +} + + +static struct command_table commands[] = { + {"win32_send",command_cast(win32_cmd_send_signal)}, +}; + + +static void +win32_wm_copydata(struct win32_binding_private *this, int *hwndSender, COPYDATASTRUCT *cpd) +{ + struct attr navit; + struct navit_binding_w32_msg *msg; + navit.type=attr_navit; + navit.u.navit=this->navit; + if(cpd->dwData!=NAVIT_BINDING_W32_DWDATA) { + dbg(0,"COPYDATA message came with wrong DWDATA value, expected %d, got %d.\n",NAVIT_BINDING_W32_DWDATA,cpd->dwData); + return; + } + if(cpd->cbData=%d, got %d.\n",sizeof(*msg),cpd->cbData); + return; + } + msg=cpd->lpData; + if(cpd->dwData!=NAVIT_BINDING_W32_VERSION) { + dbg(0,"Got request with wrong version number, expected %d, got %d.\n",NAVIT_BINDING_W32_VERSION,msg->version); + return; + } + if(strcmp(NAVIT_BINDING_W32_MAGIC,msg->magic)) { + dbg(0,"Got request with wrong MAGIC, expected %s, got %*s.\n",NAVIT_BINDING_W32_MAGIC, msg->magic,sizeof(msg->magic)); + return; + } + dbg(0,"Running command %s\n", msg->text); + command_evaluate(&navit, msg->text); +} + +static void +win32_cb_graphics_ready(struct win32_binding_private *this, struct navit *navit) +{ + struct graphics *gra; + struct callback *gcb; + + gcb=callback_new_attr_1(callback_cast(win32_wm_copydata),attr_wm_copydata, this); + gra=navit_get_graphics(navit); + dbg_assert(gra); + graphics_add_callback(gra, gcb); +} + +static void +win32_main_navit(struct win32_binding_private *this, struct navit *navit, int added) +{ + struct attr attr; + dbg(0,"enter"); + if (added==1) { + dbg(0,"enter2"); + this->navit=navit; + command_add_table_attr(commands, sizeof(commands)/sizeof(struct command_table), navit, &attr); + navit_add_attr(navit, &attr); + navit_add_callback(navit,callback_new_attr_1(callback_cast(win32_cb_graphics_ready),attr_graphics_ready, this)); + } + +} + + + +void plugin_init(void) +{ + struct attr callback; + struct win32_binding_private *this=g_new0(struct win32_binding_private,1); + callback.type=attr_callback; + callback.u.callback=callback_new_attr_1(callback_cast(win32_main_navit),attr_navit,this); + config_add_attr(config, &callback); +} + diff --git a/navit/binding/win32/binding_win32.h b/navit/binding/win32/binding_win32.h new file mode 100644 index 0000000..79fe1eb --- /dev/null +++ b/navit/binding/win32/binding_win32.h @@ -0,0 +1,37 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#ifndef BINDING_WIN32_H +#define BINDING_WIN32_H + +#define NAVIT_BINDING_W32_DWDATA 1 +#define NAVIT_BINDING_W32_MAGIC "NavIt" +#define NAVIT_BINDING_W32_VERSION 1 + +struct navit_binding_w32_msg { + /* Structure version number, should be equal to NAVIT_BINDING_W32_VERSION */ + int version; + /* Magic code to filter out packets directed to other applications and [mistakely] sent to us or broadcasted. + * should be equal to NAVIT_BINDING_W32_MAGIC */ + char magic[6]; + /* Command to be executed by Navit */ + char text[1]; +}; + +#endif diff --git a/navit/binding/win32/tell_navit.c b/navit/binding/win32/tell_navit.c new file mode 100644 index 0000000..86f407e --- /dev/null +++ b/navit/binding/win32/tell_navit.c @@ -0,0 +1,176 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include "config.h" +#include +#include +#include +#ifdef HAVE_GETOPT_H +#include +#else +#include +#endif +#include +#include "binding_win32.h" + +static LRESULT CALLBACK message_handler( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + switch(uMsg) { + case WM_CREATE: + return 0; + } + return TRUE; +} + +int errormode=1; + +void err(char *fmt, ...) +{ + va_list ap; + char buf[1024]; + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + switch(errormode) { + case 0: /* be silent */ + break; + case 1: + MessageBox(NULL, buf, "tell_navit", MB_ICONERROR|MB_OK); + break; + case 2: + fprintf(stderr,"%s",buf); + break; + } +} + +void print_usage(void) +{ + err( + "tell_navit usage:\n" + "tell_navit [options] navit_command\n" + "\t-h this help\n" + "\t-e : set way to report error messages:\n" + "\t\t0 - suppress messages\n" + "\t\t1 - use messagebox (default)\n" + "\t\t2 - print to stderr\n" + ); +} + +int main(int argc, char **argv) +{ + HWND navitWindow; + COPYDATASTRUCT cd; + char opt; + + TCHAR *g_szClassName = TEXT("TellNavitWND"); + WNDCLASS wc; + HWND hwnd; + HWND hWndParent=NULL; + + + if(argc>0) { + while((opt = getopt(argc, argv, ":hvc:d:e:s:")) != -1) { + switch(opt){ + case 'h': + print_usage(); + exit(0); + break; + case 'e': + errormode=atoi(optarg); + break; + default: + err("Unknown option %c\n", opt); + exit(1); + break; + } + } + } else { + print_usage(); + exit(1); + } + if(optind==argc) { + err("Navit command to execute is needed."); + exit(1); + } + + + memset(&wc, 0 , sizeof(WNDCLASS)); + wc.lpfnWndProc = message_handler; + wc.hInstance = GetModuleHandle(NULL); + wc.lpszClassName = g_szClassName; + + if (!RegisterClass(&wc)) + { + err(TEXT("Window class registration failed\n")); + return 1; + } else { + hwnd = CreateWindow( + g_szClassName, + TEXT("Tell Navit"), + 0, + 0, + 0, + 0, + 0, + hWndParent, + NULL, + GetModuleHandle(NULL), + NULL); + if(!hwnd) { + err(TEXT("Can't create hidden window\n")); + UnregisterClass(g_szClassName,NULL); + return 1; + } + } + + navitWindow=FindWindow( TEXT("NAVGRA"), NULL ); + if(!navitWindow) { + err(TEXT("Navit window not found\n")); + DestroyWindow(hwnd); + UnregisterClass(g_szClassName,NULL); + return 1; + } else { + int rv; + char *command=g_strjoinv(" ",argv+optind); + struct navit_binding_w32_msg *msg; + int sz=sizeof(*msg)+strlen(command); + + cd.dwData=NAVIT_BINDING_W32_DWDATA; + msg=g_malloc0(sz); + msg->version=NAVIT_BINDING_W32_VERSION; + g_strlcpy(msg->magic,NAVIT_BINDING_W32_MAGIC,sizeof(msg->magic)); + g_strlcpy(msg->text,command,sz-sizeof(*msg)+1); + cd.cbData=sz; + cd.lpData=msg; + rv=SendMessage( navitWindow, WM_COPYDATA, (WPARAM)hwnd, (LPARAM) (LPVOID) &cd ); + g_free(command); + g_free(msg); + if(rv!=0) { + err(TEXT("Error %d sending message, SendMessage return value is %d\n"), GetLastError(), rv); + DestroyWindow(hwnd); + UnregisterClass(g_szClassName,NULL); + return 1; + } + } + DestroyWindow(hwnd); + UnregisterClass(g_szClassName,NULL); + return 0; +} + + diff --git a/navit/bookmarks.c b/navit/bookmarks.c new file mode 100644 index 0000000..96c6c67 --- /dev/null +++ b/navit/bookmarks.c @@ -0,0 +1,753 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2010 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include "config.h" +#ifdef HAVE_UNISTD_H +#include +#endif +#include "file.h" +#include "debug.h" +#include "projection.h" +#include "coord.h" +#include "transform.h" +#include "callback.h" +#include "map.h" +#include "command.h" +#include "bookmarks.h" +#include "navit.h" +#include "navit_nls.h" +#include "util.h" + +/* FIXME: Move this to support directory */ +#ifdef _MSC_VER +#include +static int ftruncate(int fd, __int64 length) +{ + HANDLE fh = (HANDLE)_get_osfhandle(fd); + if (!fh || _lseeki64(fd, length, SEEK_SET)) { + return -1; + } + return SetEndOfFile(fh) ? 0 : -1; +} +#endif /* _MSC_VER */ + +struct bookmarks { + //data storage + struct map *bookmark; + struct map_rect *mr; + GHashTable *bookmarks_hash; + GList *bookmarks_list; + char* bookmark_file; + char *working_file; + struct bookmark_item_priv* clipboard; + struct bookmark_item_priv* root; + struct bookmark_item_priv* current; + + //Refs to other objects + struct transformation *trans; + struct attr **attrs; + struct callback_list *attr_cbl; + struct attr *parent; +}; + +struct bookmark_item_priv { + char *label; + enum item_type type; + struct pcoord c; + GList *children; + GList *iter; + struct bookmark_item_priv *parent; + struct item item; +}; + +void bookmarks_move_root(struct bookmarks *this_) { + this_->current=this_->root; + this_->current->iter=g_list_first(this_->current->children); + dbg(2,"Root list have %u entries\n",g_list_length(this_->current->children)); + return; +} +void bookmarks_move_up(struct bookmarks *this_) { + if (this_->current->parent) { + this_->current=this_->current->parent; + this_->current->iter=this_->current->children; + } + return; +} +int bookmarks_move_down(struct bookmarks *this_,const char* name) { + bookmarks_item_rewind(this_); + if (this_->current->children==NULL) { + return 0; + } + while (this_->current->iter!=NULL) { + struct bookmark_item_priv* data=(struct bookmark_item_priv*)this_->current->iter->data; + if (!strcmp(data->label,name)) { + this_->current=(struct bookmark_item_priv*)this_->current->iter->data; + this_->current->iter=g_list_first(this_->current->children); + dbg(2,"%s list have %u entries\n",this_->current->label,g_list_length(this_->current->children)); + return 1; + } + this_->current->iter=g_list_next(this_->current->iter); + } + return 0; +} + +void bookmarks_item_rewind(struct bookmarks* this_) { + this_->current->children=g_list_first(this_->current->children); + this_->current->iter=this_->current->children; + this_->current->iter=this_->current->children; +} +struct item* bookmarks_get_item(struct bookmarks* this_) { + struct item item,*ret; + if (this_->current->iter==NULL) { + return NULL; + } + + item=((struct bookmark_item_priv*)this_->current->iter->data)->item; + this_->current->iter=g_list_next(this_->current->iter); + + ret = map_rect_get_item_byid(this_->mr, item.id_hi, item.id_lo); + + return ret; +} + +const char* bookmarks_item_cwd(struct bookmarks* this_) { + return this_->current->label; +} + +static void bookmarks_clear_item(struct bookmark_item_priv *b_item) { + b_item->children=g_list_first(b_item->children); + while(b_item->children) { + bookmarks_clear_item((struct bookmark_item_priv*)b_item->children->data); + b_item->children=g_list_next(b_item->children); + } + g_free(b_item->label); + g_free(b_item); +} + +static void +bookmarks_clear_hash(struct bookmarks *this_) { + if (this_->mr) { + map_rect_destroy(this_->mr); + } + bookmarks_clear_item(this_->root); + g_hash_table_destroy(this_->bookmarks_hash); + g_list_free(this_->bookmarks_list); +} + +static void +bookmarks_load_hash(struct bookmarks *this_) { + struct bookmark_item_priv *b_item; + struct item *item; + struct attr attr; + struct coord c; + char *pos,*finder; + char *copy_helper; + + if (this_->mr) { + map_rect_destroy(this_->mr); + } + this_->mr=map_rect_new(this_->bookmark, NULL); + + this_->bookmarks_hash=g_hash_table_new(g_str_hash, g_str_equal); + this_->root=g_new0(struct bookmark_item_priv,1); + this_->root->type=type_none; + this_->root->parent=NULL; + this_->root->children=NULL; + bookmarks_move_root(this_); + + while ((item=map_rect_get_item(this_->mr))) { + if (item->type != type_bookmark && item->type != type_bookmark_folder ) continue; + if (!item_attr_get(item, attr_path, &attr)) { + item_attr_get(item, attr_label, &attr); + } + item_coord_get(item, &c, 1); + + b_item=g_new0(struct bookmark_item_priv,1); + b_item->c.x=c.x; + b_item->c.y=c.y; + b_item->label=g_strdup(attr.u.str); + b_item->type=item->type; + b_item->item=*item; + + //Prepare position + bookmarks_move_root(this_); + finder=b_item->label; + while ((pos=strchr(finder,'/'))) { + *pos=0x00; + dbg(1,"Found path entry: %s\n",finder); + if (!bookmarks_move_down(this_,finder)) { + struct bookmark_item_priv *path_item=g_new0(struct bookmark_item_priv,1); + path_item->type=type_bookmark_folder; + path_item->parent=this_->current; + path_item->children=NULL; + path_item->label=g_strdup(finder); + + this_->current->children=g_list_append(this_->current->children,path_item); + this_->current=path_item; + g_hash_table_insert(this_->bookmarks_hash,b_item->label,path_item); + this_->bookmarks_list=g_list_append(this_->bookmarks_list,path_item); + } + finder+=strlen(finder)+1; + } + copy_helper=g_strdup(finder); + free(b_item->label); + b_item->label=copy_helper; + b_item->parent=this_->current; + + g_hash_table_insert(this_->bookmarks_hash,b_item->label,b_item); + this_->bookmarks_list=g_list_append(this_->bookmarks_list,b_item); + this_->current->children=g_list_append(this_->current->children,b_item); + this_->current->children=g_list_first(this_->current->children); + dbg(1,"Added %s to %s and current list now %u long\n",b_item->label,this_->current->label,g_list_length(this_->current->children)); + } + bookmarks_move_root(this_); +} + +struct bookmarks * +bookmarks_new(struct attr *parent, struct attr **attrs, struct transformation *trans) { + struct bookmarks *this_; + + if (parent->type!=attr_navit) { + return NULL; + } + + this_ = g_new0(struct bookmarks,1); + this_->attr_cbl=callback_list_new(); + this_->parent=parent; + //this_->attrs=attr_list_dup(attrs); + this_->trans=trans; + + this_->bookmark_file=g_strjoin(NULL, navit_get_user_data_directory(TRUE), "/bookmark.txt", NULL); + this_->working_file=g_strjoin(NULL, navit_get_user_data_directory(TRUE), "/bookmark.txt.tmp", NULL); + + this_->clipboard=g_new0(struct bookmark_item_priv,1); + + { + //Load map now + struct attr type={attr_type, {"textfile"}}, data={attr_data, {this_->bookmark_file}}; + struct attr *attrs[]={&type, &data, NULL}; + this_->bookmark=map_new(this_->parent, attrs); + if (!this_->bookmark) + return NULL; + bookmarks_load_hash(this_); + } + + return this_; +} + +void +bookmarks_destroy(struct bookmarks *this_) { + + bookmarks_clear_hash(this_); + + map_destroy(this_->bookmark); + callback_list_destroy(this_->attr_cbl); + + g_free(this_->bookmark_file); + g_free(this_->working_file); + + g_free(this_->clipboard); + g_free(this_); +} + +struct map* +bookmarks_get_map(struct bookmarks *this_) { + return this_->bookmark; +} + +enum projection bookmarks_get_projection(struct bookmarks *this_){ + return map_projection(this_->bookmark); +} +void +bookmarks_add_callback(struct bookmarks *this_, struct callback *cb) +{ + callback_list_add(this_->attr_cbl, cb); +} + +static int +bookmarks_store_bookmarks_to_file(struct bookmarks *this_, int limit,int replace) { + FILE *f; + struct bookmark_item_priv *item,*parent_item; + char *fullname; + const char *prostr; + int result; + GHashTable *dedup=g_hash_table_new_full(g_str_hash,g_str_equal,g_free,NULL); + + f=fopen(this_->working_file, replace ? "w+" : "a+"); + if (f==NULL) { + navit_add_message(this_->parent->u.navit,_("Failed to write bookmarks file")); + return FALSE; + } + + this_->bookmarks_list=g_list_first(this_->bookmarks_list); + while (this_->bookmarks_list) { + item=(struct bookmark_item_priv*)this_->bookmarks_list->data; + + parent_item=item; + fullname=g_strdup(item->label); + while ((parent_item=parent_item->parent)) { + char *pathHelper; + if (parent_item->label) { + pathHelper=g_strconcat(parent_item->label,"/",fullname,NULL); + g_free(fullname); + fullname=g_strdup(pathHelper); + g_free(pathHelper); + dbg(1,"full name: %s\n",fullname); + } + } + + if (!g_hash_table_lookup(dedup,fullname)) { + g_hash_table_insert(dedup,fullname,fullname); + if (item->type == type_bookmark) { + prostr = projection_to_name(projection_mg); + if (fprintf(f,"%s%s%s0x%x %s0x%x type=%s label=\"%s\" path=\"%s\"\n", + prostr, *prostr ? ":" : "", + item->c.x >= 0 ? "":"-", item->c.x >= 0 ? item->c.x : -item->c.x, + item->c.y >= 0 ? "":"-", item->c.y >= 0 ? item->c.y : -item->c.y, + "bookmark", item->label,fullname)<1) { + g_free(fullname); + break; + } + } + if (item->type == type_bookmark_folder) { + prostr = projection_to_name(projection_mg); + if (fprintf(f,"%s%s%s0x%x %s0x%x type=%s label=\"%s\" path=\"%s\"\n", + prostr, *prostr ? ":" : "", + "", 0, + "", 0, + "bookmark_folder", item->label,fullname)<1) { + g_free(fullname); + break; + } + } + } + + /* Limit could be zero, so we start decrementing it from zero and never reach 1 + or it was bigger and we decreased it earlier. So when this counter becomes 1, we know + that we have enough entries in bookmarks file */ + if (limit==1) { + break; + } + limit--; + + this_->bookmarks_list=g_list_next(this_->bookmarks_list); + } + + fclose(f); + + g_hash_table_destroy(dedup); + + if (this_->mr) { + map_rect_destroy(this_->mr); + this_->mr = 0; + } + + unlink(this_->bookmark_file); + result=(rename(this_->working_file,this_->bookmark_file)==0); + if (!result) + { + navit_add_message(this_->parent->u.navit,_("Failed to write bookmarks file")); + } + return result; +} + +/** + * @param create: create the directory where the file is stored + * if it does not exist + * @return The name of the file used to store destinations with its + * full path. Should be freed using g_free. + * + */ +char* +bookmarks_get_destination_file(gboolean create) +{ + return g_strjoin(NULL, navit_get_user_data_directory(create), "/destination.txt", NULL); +} + +/* + * bookmarks_get_center_file + * + * returns the name of the file used to store the center file with its + * full path + * + * arg: gboolean create: create the directory where the file is stored + * if it does not exist + */ +char* +bookmarks_get_center_file(gboolean create) +{ + return g_strjoin(NULL, navit_get_user_data_directory(create), "/center.txt", NULL); +} + +void +bookmarks_set_center_from_file(struct bookmarks *this_, char *file) +{ + FILE *f; + char *line = NULL; + + size_t line_size = 0; + enum projection pro; + struct coord *center; + + f = fopen(file, "r"); + if (! f) + return; + getline(&line, &line_size, f); + fclose(f); + if (line) { + center = transform_center(this_->trans); + pro = transform_get_projection(this_->trans); + coord_parse(g_strchomp(line), pro, center); + free(line); + } + return; +} + +void +bookmarks_write_center_to_file(struct bookmarks *this_, char *file) +{ + FILE *f; + enum projection pro; + struct coord *center; + + f = fopen(file, "w+"); + if (f) { + center = transform_center(this_->trans); + pro = transform_get_projection(this_->trans); + coord_print(pro, center, f); + fclose(f); + } else { + perror(file); + } + return; +} + +static void +bookmarks_emit_dbus_signal(struct bookmarks *this_, struct pcoord *c, const char *description,int create) +{ + struct attr attr1,attr2,attr3,attr4,cb,*attr_list[5]; + int valid=0; + attr1.type=attr_type; + attr1.u.str="bookmark"; + attr2.type=attr_data; + attr2.u.str=create ? "create" : "delete"; + attr3.type=attr_data; + attr3.u.str=(char *)description; + attr4.type=attr_coord; + attr4.u.pcoord=c; + attr_list[0]=&attr1; + attr_list[1]=&attr2; + attr_list[2]=&attr3; + attr_list[3]=&attr4; + attr_list[4]=NULL; + if (navit_get_attr(this_->parent->u.navit, attr_callback_list, &cb, NULL)) + callback_list_call_attr_4(cb.u.callback_list, attr_command, "dbus_send_signal", attr_list, NULL, &valid); +} + +/** + * Record the given set of coordinates as a bookmark + * + * @param navit The navit instance + * @param c The coordinate to store + * @param description A label which allows the user to later identify this bookmark + * @returns nothing + */ +int +bookmarks_add_bookmark(struct bookmarks *this_, struct pcoord *pc, const char *description) +{ + struct bookmark_item_priv *b_item=g_new0(struct bookmark_item_priv,1); + int result; + + if (pc) { + b_item->c.x=pc->x; + b_item->c.y=pc->y; + b_item->type=type_bookmark; + } else { + b_item->type=type_bookmark_folder; + } + b_item->label=g_strdup(description); + b_item->parent=this_->current; + b_item->children=NULL; + + this_->current->children=g_list_first(this_->current->children); + this_->current->children=g_list_append(this_->current->children,b_item); + this_->bookmarks_list=g_list_first(this_->bookmarks_list); + this_->bookmarks_list=g_list_append(this_->bookmarks_list,b_item); + + result=bookmarks_store_bookmarks_to_file(this_,0,0); + + callback_list_call_attr_0(this_->attr_cbl, attr_bookmark_map); + bookmarks_clear_hash(this_); + bookmarks_load_hash(this_); + + bookmarks_emit_dbus_signal(this_,&(b_item->c),description,TRUE); + + return result; +} + +int +bookmarks_cut_bookmark(struct bookmarks *this_, const char *label) { + if (bookmarks_copy_bookmark(this_,label)) { + return bookmarks_delete_bookmark(this_,label); + } + + return FALSE; +} +int +bookmarks_copy_bookmark(struct bookmarks *this_, const char *label) { + bookmarks_item_rewind(this_); + if (this_->current->children==NULL) { + return 0; + } + while (this_->current->iter!=NULL) { + struct bookmark_item_priv* data=(struct bookmark_item_priv*)this_->current->iter->data; + if (!strcmp(data->label,label)) { + this_->clipboard->c=data->c; + this_->clipboard->type=data->type; + this_->clipboard->item=data->item; + this_->clipboard->children=data->children; + if (!this_->clipboard->label) { + g_free(this_->clipboard->label); + } + this_->clipboard->label=g_strdup(data->label); + return TRUE; + } + this_->current->iter=g_list_next(this_->current->iter); + } + return FALSE; +} +int +bookmarks_paste_bookmark(struct bookmarks *this_) { + int result; + struct bookmark_item_priv* b_item; + + if (!this_->clipboard->label) { + return FALSE; + } + + b_item=g_new0(struct bookmark_item_priv,1); + b_item->c.x=this_->clipboard->c.x; + b_item->c.y=this_->clipboard->c.y; + b_item->label=g_strdup(this_->clipboard->label); + b_item->type=this_->clipboard->type; + b_item->item=this_->clipboard->item; + b_item->parent=this_->current; + b_item->children=this_->clipboard->children; + + g_hash_table_insert(this_->bookmarks_hash,b_item->label,b_item); + this_->bookmarks_list=g_list_append(this_->bookmarks_list,b_item); + this_->current->children=g_list_append(this_->current->children,b_item); + this_->current->children=g_list_first(this_->current->children); + + result=bookmarks_store_bookmarks_to_file(this_,0,0); + + callback_list_call_attr_0(this_->attr_cbl, attr_bookmark_map); + bookmarks_clear_hash(this_); + bookmarks_load_hash(this_); + + return result; +} + + +int +bookmarks_delete_bookmark(struct bookmarks *this_, const char *label) { + int result; + + bookmarks_item_rewind(this_); + if (this_->current->children==NULL) { + return 0; + } + while (this_->current->iter!=NULL) { + struct bookmark_item_priv* data=(struct bookmark_item_priv*)this_->current->iter->data; + if (!strcmp(data->label,label)) { + this_->bookmarks_list=g_list_first(this_->bookmarks_list); + this_->bookmarks_list=g_list_remove(this_->bookmarks_list,data); + + result=bookmarks_store_bookmarks_to_file(this_,0,0); + + callback_list_call_attr_0(this_->attr_cbl, attr_bookmark_map); + bookmarks_clear_hash(this_); + bookmarks_load_hash(this_); + + bookmarks_emit_dbus_signal(this_,&(data->c),label,FALSE); + + return result; + } + this_->current->iter=g_list_next(this_->current->iter); + } + + return FALSE; +} + +int +bookmarks_rename_bookmark(struct bookmarks *this_, const char *oldName, const char* newName) { + int result; + + bookmarks_item_rewind(this_); + if (this_->current->children==NULL) { + return 0; + } + while (this_->current->iter!=NULL) { + struct bookmark_item_priv* data=(struct bookmark_item_priv*)this_->current->iter->data; + if (!strcmp(data->label,oldName)) { + g_free(data->label); + data->label=g_strdup(newName); + + result=bookmarks_store_bookmarks_to_file(this_,0,0); + + callback_list_call_attr_0(this_->attr_cbl, attr_bookmark_map); + bookmarks_clear_hash(this_); + bookmarks_load_hash(this_); + + return result; + } + this_->current->iter=g_list_next(this_->current->iter); + } + + return FALSE; +} + +struct former_destination{ + enum item_type type; + char* description; + struct coord c; +}; + +static void free_former_destination(struct former_destination* former_destination){ + g_free(former_destination->description); + g_free(former_destination); +} + + +static GList* read_former_destination_map_as_list(struct map *map){ + struct map_rect *mr; + struct item *item; + struct attr attr; + struct former_destination *dest; + GList* list = NULL; + if (map && (mr=map_rect_new(map, NULL))) { + while ((item=map_rect_get_item(mr))) { + if (item->type != type_former_destination) continue; + dest = g_new(struct former_destination, 1); + dest->type=item->type; + item_attr_get(item, attr_label, &attr); + dest->description = g_strdup(attr.u.str); + item_coord_get(item, &(dest->c), 1); + list = g_list_prepend(list, dest); + } + map_rect_destroy(mr); + } + return g_list_reverse(list); +} + +static int +destination_equal(struct former_destination* dest1, struct former_destination* dest2) +{ + if ((dest1->type == dest2->type) && + (!strcmp(dest1->description, dest2->description)) && + (coord_equal(&(dest1->c), &(dest2->c)))){ + return TRUE; + } + return FALSE; +} + +static GList* +remove_destination_from_list(struct former_destination* dest_to_remove, GList* former_destinations) +{ + GList* curr_el = former_destinations; + GList* prev_el = NULL; + struct former_destination* curr_dest; + + while(curr_el){ + curr_dest = curr_el->data; + if (destination_equal(dest_to_remove, curr_dest)){ + free_former_destination(curr_dest); + curr_el = g_list_remove(curr_el, curr_dest); + }else{ + prev_el = curr_el; + curr_el = g_list_next(curr_el); + } + } + return g_list_first(prev_el); +} + +static void +write_former_destinations(GList* former_destinations, char *former_destination_file, enum projection proj) +{ + FILE *f; + GList* currdest = NULL; + struct former_destination *dest; + const char* prostr = projection_to_name(proj); + f=fopen(former_destination_file, "w"); + if (f) { + for(currdest = former_destinations; currdest; currdest = g_list_next(currdest)){ + dest = currdest->data; + if (dest->description) + fprintf(f,"type=%s label=\"%s\"\n", item_to_name(dest->type), dest->description); + else + fprintf(f,"type=%s\n", item_to_name(dest->type)); + fprintf(f,"%s%s%s0x%x %s0x%x\n", + prostr, *prostr ? ":" : "", + dest->c.x >= 0 ? "":"-", dest->c.x >= 0 ? dest->c.x : -dest->c.x, + dest->c.y >= 0 ? "":"-", dest->c.y >= 0 ? dest->c.y : -dest->c.y); + + } + fclose(f); + } else { + dbg(0, "Error updating destinations file %s: %s\n", former_destination_file, strerror(errno)); + } +} + +/** + * @param limit Limits the number of entries in the "backlog". Set to 0 for "infinite" + */ +void +bookmarks_append_coord(struct map *former_destination_map, char *former_destination_file, + struct pcoord *c, enum item_type type, const char *description, int limit) +{ + struct former_destination *new_dest; + GList* former_destinations = NULL; + GList* former_destinations_shortened = NULL; + int no_of_former_destinations; + + former_destinations = read_former_destination_map_as_list(former_destination_map); + + new_dest = g_new(struct former_destination, 1); + new_dest->type = type; + new_dest->description = g_strdup(description?description:_("Map Point")); + new_dest->c.x = c->x; + new_dest->c.y = c->y; + former_destinations = remove_destination_from_list(new_dest, former_destinations); + former_destinations = g_list_append(former_destinations, new_dest); + + no_of_former_destinations = g_list_length(former_destinations); + if (limit > 0 && no_of_former_destinations > limit) + former_destinations_shortened = g_list_nth(former_destinations, no_of_former_destinations - limit); + else + former_destinations_shortened = former_destinations; + + write_former_destinations(former_destinations_shortened, former_destination_file, map_projection(former_destination_map)); + g_list_foreach(former_destinations, (GFunc) free_former_destination, NULL); + g_list_free(former_destinations); +} + diff --git a/navit/bookmarks.h b/navit/bookmarks.h new file mode 100644 index 0000000..5630e51 --- /dev/null +++ b/navit/bookmarks.h @@ -0,0 +1,63 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2010 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + + #ifndef NAVIT_BOOKMARKS_H + #define NAVIT_BOOKMARKS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* prototypes */ +struct bookmarks; +struct bookmarks *bookmarks_new(struct attr *parent, struct attr **attrs, struct transformation *trans); +void bookmarks_destroy(struct bookmarks *this_); +void bookmarks_add_callback(struct bookmarks *this_, struct callback *cb); + +int bookmarks_add_bookmark(struct bookmarks *this_, struct pcoord *c, const char *description); +int bookmarks_cut_bookmark(struct bookmarks *this_, const char *label); +int bookmarks_copy_bookmark(struct bookmarks *this_, const char *label); +int bookmarks_paste_bookmark(struct bookmarks *this_); +int bookmarks_rename_bookmark(struct bookmarks *this_, const char *oldName, const char* newName); +int bookmarks_delete_bookmark(struct bookmarks *this_, const char *label); + +struct map* bookmarks_get_map(struct bookmarks *this_); +enum projection bookmarks_get_projection(struct bookmarks *this_); + +void bookmarks_move_root(struct bookmarks *this_); +void bookmarks_move_up(struct bookmarks *this_); +int bookmarks_move_down(struct bookmarks *this_,const char* name); + +struct item* bookmarks_get_item(struct bookmarks* this_); +void bookmarks_item_rewind(struct bookmarks* this_); +const char* bookmarks_item_cwd(struct bookmarks* this_); + +char* bookmarks_get_user_data_directory(gboolean create); +char* bookmarks_get_destination_file(gboolean create); +void bookmarks_set_center_from_file(struct bookmarks *this_, char *file); +char* bookmarks_get_center_file(gboolean create); +void bookmarks_write_center_to_file(struct bookmarks *this_, char *file); +void bookmarks_append_coord(struct map *former_destination_map, char *file, struct pcoord *c, enum item_type type, const char *description, int limit); +/* end of prototypes */ + +#ifdef __cplusplus +} +#endif + + #endif /* NAVIT_BOOKMARKS_H */ diff --git a/navit/builtin.c b/navit/builtin.c new file mode 100644 index 0000000..2287a67 --- /dev/null +++ b/navit/builtin.c @@ -0,0 +1,3 @@ +extern void builtin_init(void); +void builtin_init(void) { +} diff --git a/navit/cache.c b/navit/cache.c new file mode 100644 index 0000000..fcf5137 --- /dev/null +++ b/navit/cache.c @@ -0,0 +1,397 @@ +#include "glib_slice.h" +#ifdef DEBUG_CACHE +#include +#endif +#include +#include "debug.h" +#include "cache.h" + +struct cache_entry { + int usage; + int size; + struct cache_entry_list *where; + struct cache_entry *next; + struct cache_entry *prev; + int id[0]; +}; + +struct cache_entry_list { + struct cache_entry *first, *last; + int size; +}; + +struct cache { + struct cache_entry_list t1,b1,t2,b2,*insert; + int size,id_size,entry_size; + int t1_target; + int misses; + int hits; + GHashTable *hash; +}; + +static void +cache_entry_dump(struct cache *cache, struct cache_entry *entry) +{ + int i,size; + dbg(0,"Usage: %d size %d\n",entry->usage, entry->size); + if (cache) + size=cache->id_size; + else + size=5; + for (i = 0 ; i < size ; i++) { + dbg(0,"0x%x\n", entry->id[i]); + } +} + +static void +cache_list_dump(char *str, struct cache *cache, struct cache_entry_list *list) +{ + struct cache_entry *first=list->first; + dbg(0,"dump %s %d\n",str, list->size); + while (first) { + cache_entry_dump(cache, first); + first=first->next; + } +} + +static guint +cache_hash4(gconstpointer key) +{ + int *id=(int *)key; + return id[0]; +} + +static guint +cache_hash20(gconstpointer key) +{ + int *id=(int *)key; + return id[0]^id[1]^id[2]^id[3]^id[4]; +} + +static gboolean +cache_equal4(gconstpointer a, gconstpointer b) +{ + int *ida=(int *)a; + int *idb=(int *)b; + + return ida[0] == idb[0]; +} + +static gboolean +cache_equal20(gconstpointer a, gconstpointer b) +{ + int *ida=(int *)a; + int *idb=(int *)b; + + return(ida[0] == idb[0] && + ida[1] == idb[1] && + ida[2] == idb[2] && + ida[3] == idb[3] && + ida[4] == idb[4]); +} + +struct cache * +cache_new(int id_size, int size) +{ + struct cache *cache=g_new0(struct cache, 1); + + cache->id_size=id_size/4; + cache->entry_size=cache->id_size*sizeof(int)+sizeof(struct cache_entry); + cache->size=size; + switch (id_size) { + case 4: + cache->hash=g_hash_table_new(cache_hash4, cache_equal4); + break; + case 20: + cache->hash=g_hash_table_new(cache_hash20, cache_equal20); + break; + default: + dbg(0,"cache with id_size of %d not supported\n", id_size); + g_free(cache); + cache=NULL; + } + return cache; +} + +static void +cache_insert_mru(struct cache *cache, struct cache_entry_list *list, struct cache_entry *entry) +{ + entry->prev=NULL; + entry->next=list->first; + entry->where=list; + if (entry->next) + entry->next->prev=entry; + list->first=entry; + if (! list->last) + list->last=entry; + list->size+=entry->size; + if (cache) + g_hash_table_insert(cache->hash, (gpointer)entry->id, entry); +} + +static void +cache_remove_from_list(struct cache_entry_list *list, struct cache_entry *entry) +{ + if (entry->prev) + entry->prev->next=entry->next; + else + list->first=entry->next; + if (entry->next) + entry->next->prev=entry->prev; + else + list->last=entry->prev; + list->size-=entry->size; +} + +static void +cache_remove(struct cache *cache, struct cache_entry *entry) +{ + dbg(1,"remove 0x%x 0x%x 0x%x 0x%x 0x%x\n", entry->id[0], entry->id[1], entry->id[2], entry->id[3], entry->id[4]); + g_hash_table_remove(cache->hash, (gpointer)(entry->id)); + g_slice_free1(entry->size, entry); +} + +static struct cache_entry * +cache_remove_lru_helper(struct cache_entry_list *list) +{ + struct cache_entry *last=list->last; + if (! last) + return NULL; + list->last=last->prev; + if (last->prev) + last->prev->next=NULL; + else + list->first=NULL; + list->size-=last->size; + return last; +} + +static struct cache_entry * +cache_remove_lru(struct cache *cache, struct cache_entry_list *list) +{ + struct cache_entry *last; + int seen=0; + while (list->last && list->last->usage && seen < list->size) { + last=cache_remove_lru_helper(list); + cache_insert_mru(NULL, list, last); + seen+=last->size; + } + last=list->last; + if (! last || last->usage || seen >= list->size) + return NULL; + dbg(1,"removing %d\n", last->id[0]); + cache_remove_lru_helper(list); + if (cache) { + cache_remove(cache, last); + return NULL; + } + return last; +} + +void * +cache_entry_new(struct cache *cache, void *id, int size) +{ + struct cache_entry *ret; + size+=cache->entry_size; + cache->misses+=size; + ret=(struct cache_entry *)g_slice_alloc0(size); + ret->size=size; + ret->usage=1; + memcpy(ret->id, id, cache->id_size*sizeof(int)); + return &ret->id[cache->id_size]; +} + +void +cache_entry_destroy(struct cache *cache, void *data) +{ + struct cache_entry *entry=(struct cache_entry *)((char *)data-cache->entry_size); + dbg(1,"destroy 0x%x 0x%x 0x%x 0x%x 0x%x\n", entry->id[0], entry->id[1], entry->id[2], entry->id[3], entry->id[4]); + entry->usage--; +} + +static struct cache_entry * +cache_trim(struct cache *cache, struct cache_entry *entry) +{ + struct cache_entry *new_entry; + dbg(1,"trim 0x%x 0x%x 0x%x 0x%x 0x%x\n", entry->id[0], entry->id[1], entry->id[2], entry->id[3], entry->id[4]); + dbg(1,"Trim %x from %d -> %d\n", entry->id[0], entry->size, cache->size); + if ( cache->entry_size < entry->size ) + { + g_hash_table_remove(cache->hash, (gpointer)(entry->id)); + + new_entry = g_slice_alloc0(cache->entry_size); + memcpy(new_entry, entry, cache->entry_size); + g_slice_free1( entry->size, entry); + new_entry->size = cache->entry_size; + + g_hash_table_insert(cache->hash, (gpointer)new_entry->id, new_entry); + } + else + { + new_entry = entry; + } + + return new_entry; +} + +static struct cache_entry * +cache_move(struct cache *cache, struct cache_entry_list *old, struct cache_entry_list *new) +{ + struct cache_entry *entry; + entry=cache_remove_lru(NULL, old); + if (! entry) + return NULL; + entry=cache_trim(cache, entry); + cache_insert_mru(NULL, new, entry); + return entry; +} + +static int +cache_replace(struct cache *cache) +{ + if (cache->t1.size >= MAX(1,cache->t1_target)) { + dbg(1,"replace 12\n"); + if (!cache_move(cache, &cache->t1, &cache->b1)) + cache_move(cache, &cache->t2, &cache->b2); + } else { + dbg(1,"replace t2\n"); + if (!cache_move(cache, &cache->t2, &cache->b2)) + cache_move(cache, &cache->t1, &cache->b1); + } +#if 0 + if (! entry) { + cache_dump(cache); + exit(0); + } +#endif + return 1; +} + +void +cache_flush(struct cache *cache, void *id) +{ + struct cache_entry *entry=g_hash_table_lookup(cache->hash, id); + if (entry) { + cache_remove_from_list(entry->where, entry); + cache_remove(cache, entry); + } +} + +void +cache_flush_data(struct cache *cache, void *data) +{ + struct cache_entry *entry=(struct cache_entry *)((char *)data-cache->entry_size); + if (entry) { + cache_remove_from_list(entry->where, entry); + cache_remove(cache, entry); + } +} + + +void * +cache_lookup(struct cache *cache, void *id) { + struct cache_entry *entry; + + dbg(1,"get %d\n", ((int *)id)[0]); + entry=g_hash_table_lookup(cache->hash, id); + if (entry == NULL) { + cache->insert=&cache->t1; +#ifdef DEBUG_CACHE + fprintf(stderr,"-"); +#endif + dbg(1,"not in cache\n"); + return NULL; + } + dbg(1,"found 0x%x 0x%x 0x%x 0x%x 0x%x\n", entry->id[0], entry->id[1], entry->id[2], entry->id[3], entry->id[4]); + if (entry->where == &cache->t1 || entry->where == &cache->t2) { + cache->hits+=entry->size; +#ifdef DEBUG_CACHE + if (entry->where == &cache->t1) + fprintf(stderr,"h"); + else + fprintf(stderr,"H"); +#endif + dbg(1,"in cache %s\n", entry->where == &cache->t1 ? "T1" : "T2"); + cache_remove_from_list(entry->where, entry); + cache_insert_mru(NULL, &cache->t2, entry); + entry->usage++; + return &entry->id[cache->id_size]; + } else { + if (entry->where == &cache->b1) { +#ifdef DEBUG_CACHE + fprintf(stderr,"m"); +#endif + dbg(1,"in phantom cache B1\n"); + cache->t1_target=MIN(cache->t1_target+MAX(cache->b2.size/cache->b1.size, 1),cache->size); + cache_remove_from_list(&cache->b1, entry); + } else if (entry->where == &cache->b2) { +#ifdef DEBUG_CACHE + fprintf(stderr,"M"); +#endif + dbg(1,"in phantom cache B2\n"); + cache->t1_target=MAX(cache->t1_target-MAX(cache->b1.size/cache->b2.size, 1),0); + cache_remove_from_list(&cache->b2, entry); + } else { + dbg(0,"**ERROR** invalid where\n"); + } + cache_replace(cache); + cache_remove(cache, entry); + cache->insert=&cache->t2; + return NULL; + } +} + +void +cache_insert(struct cache *cache, void *data) +{ + struct cache_entry *entry=(struct cache_entry *)((char *)data-cache->entry_size); + dbg(1,"insert 0x%x 0x%x 0x%x 0x%x 0x%x\n", entry->id[0], entry->id[1], entry->id[2], entry->id[3], entry->id[4]); + if (cache->insert == &cache->t1) { + if (cache->t1.size + cache->b1.size >= cache->size) { + if (cache->t1.size < cache->size) { + cache_remove_lru(cache, &cache->b1); + cache_replace(cache); + } else { + cache_remove_lru(cache, &cache->t1); + } + } else { + if (cache->t1.size + cache->t2.size + cache->b1.size + cache->b2.size >= cache->size) { + if (cache->t1.size + cache->t2.size + cache->b1.size + cache->b2.size >= 2*cache->size) + cache_remove_lru(cache, &cache->b2); + cache_replace(cache); + } + } + } + cache_insert_mru(cache, cache->insert, entry); +} + +void * +cache_insert_new(struct cache *cache, void *id, int size) +{ + void *data=cache_entry_new(cache, id, size); + cache_insert(cache, data); + return data; +} + +static void +cache_stats(struct cache *cache) +{ + dbg(0,"hits %d misses %d hitratio %d size %d entry_size %d id_size %d T1 target %d\n", cache->hits, cache->misses, cache->hits*100/(cache->hits+cache->misses), cache->size, cache->entry_size, cache->id_size, cache->t1_target); + dbg(0,"T1:%d B1:%d T2:%d B2:%d\n", cache->t1.size, cache->b1.size, cache->t2.size, cache->b2.size); + cache->hits=0; + cache->misses=0; +} + +void +cache_dump(struct cache *cache) +{ + struct cache_entry *first; + first=cache->t1.first; + cache_stats(cache); + cache_list_dump("T1", cache, &cache->t1); + cache_list_dump("B1", cache, &cache->b1); + cache_list_dump("T2", cache, &cache->t2); + cache_list_dump("B2", cache, &cache->b2); + dbg(0,"dump end\n"); +} + diff --git a/navit/cache.h b/navit/cache.h new file mode 100644 index 0000000..cdeea02 --- /dev/null +++ b/navit/cache.h @@ -0,0 +1,13 @@ +struct cache_entry; +struct cache; +/* prototypes */ +struct cache *cache_new(int id_size, int size); +void *cache_entry_new(struct cache *cache, void *id, int size); +void cache_entry_destroy(struct cache *cache, void *data); +void *cache_lookup(struct cache *cache, void *id); +void cache_insert(struct cache *cache, void *data); +void *cache_insert_new(struct cache *cache, void *id, int size); +void cache_flush(struct cache *cache, void *id); +void cache_dump(struct cache *cache); +void cache_flush_data(struct cache *cache, void *data); +/* end of prototypes */ diff --git a/navit/callback.c b/navit/callback.c new file mode 100644 index 0000000..aa38f59 --- /dev/null +++ b/navit/callback.c @@ -0,0 +1,268 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "item.h" +#include "debug.h" +#include "callback.h" + +struct callback { + void (*func)(); + int pcount; + enum attr_type type; + void *p[0]; + +}; + +struct callback_list { + GList *list; +}; + +struct callback_list * +callback_list_new(void) +{ + struct callback_list *ret=g_new0(struct callback_list, 1); + + return ret; +} + +struct callback * +callback_new_attr(void (*func)(void), enum attr_type type, int pcount, void **p) +{ + struct callback *ret; + int i; + + ret=g_malloc0(sizeof(struct callback)+pcount*sizeof(void *)); + ret->func=func; + ret->pcount=pcount; + ret->type=type; + for (i = 0 ; i < pcount ; i++) { + ret->p[i]=p[i]; + } + return ret; +} + +struct callback * +callback_new_attr_args(void (*func)(void), enum attr_type type, int count, ...) +{ + int i; + void **p=g_alloca(sizeof(void*)*count); + va_list ap; + va_start(ap, count); + for (i = 0 ; i < count ; i++) + p[i]=va_arg(ap, void *); + va_end(ap); + return callback_new_attr(func, type, count, p); +} + +struct callback * +callback_new(void (*func)(void), int pcount, void **p) +{ + return callback_new_attr(func, attr_none, pcount, p); +} + +struct callback * +callback_new_args(void (*func)(void), int count, ...) +{ + int i; + void **p=g_alloca(sizeof(void*)*count); + va_list ap; + va_start(ap, count); + for (i = 0 ; i < count ; i++) + p[i]=va_arg(ap, void *); + va_end(ap); + return callback_new(func, count, p); +} + +void +callback_destroy(struct callback *cb) +{ + g_free(cb); +} + +void +callback_set_arg(struct callback *cb, int arg, void *p) +{ + if (arg < 0 || arg > cb->pcount) + return; + cb->p[arg]=p; +} + +void +callback_list_add(struct callback_list *l, struct callback *cb) +{ + l->list=g_list_prepend(l->list, cb); +} + + +struct callback * +callback_list_add_new(struct callback_list *l, void (*func)(void), int pcount, void **p) +{ + struct callback *ret; + + ret=callback_new(func, pcount, p); + callback_list_add(l, ret); + return ret; +} + +void +callback_list_remove(struct callback_list *l, struct callback *cb) +{ + l->list=g_list_remove(l->list, cb); +} + +void +callback_list_remove_destroy(struct callback_list *l, struct callback *cb) +{ + callback_list_remove(l, cb); + g_free(cb); +} + +void +callback_call(struct callback *cb, int pcount, void **p) +{ + int i; + void *pf[8]; + if (! cb) + return; + if (cb->pcount + pcount <= 8) { + dbg(1,"cb->pcount=%d\n", cb->pcount); + if (cb->pcount && cb->p) + dbg(1,"cb->p[0]=%p\n", cb->p[0]); + dbg(1,"pcount=%d\n", pcount); + if (pcount) { + dbg_assert(p!=NULL); + dbg(1,"p[0]=%p\n", p[0]); + } + for (i = 0 ; i < cb->pcount ; i++) + pf[i]=cb->p[i]; + for (i = 0 ; i < pcount ; i++) + pf[i+cb->pcount]=p[i]; + switch (cb->pcount+pcount) { + case 8: + cb->func(pf[0],pf[1],pf[2],pf[3],pf[4],pf[5],pf[6],pf[7]); + break; + case 7: + cb->func(pf[0],pf[1],pf[2],pf[3],pf[4],pf[5],pf[6]); + break; + case 6: + cb->func(pf[0],pf[1],pf[2],pf[3],pf[4],pf[5]); + break; + case 5: + cb->func(pf[0],pf[1],pf[2],pf[3],pf[4]); + break; + case 4: + cb->func(pf[0],pf[1],pf[2],pf[3]); + break; + case 3: + cb->func(pf[0],pf[1],pf[2]); + break; + case 2: + cb->func(pf[0],pf[1]); + break; + case 1: + cb->func(pf[0]); + break; + case 0: + cb->func(); + break; + } + } else { + dbg(0,"too many parameters for callback (%d+%d)\n", cb->pcount, pcount); + } +} + +void +callback_call_args(struct callback *cb, int count, ...) +{ + int i; + void **p=g_alloca(sizeof(void*)*count); + va_list ap; + va_start(ap, count); + for (i = 0 ; i < count ; i++) + p[i]=va_arg(ap, void *); + va_end(ap); + callback_call(cb, count, p); +} + +void +callback_list_call_attr(struct callback_list *l, enum attr_type type, int pcount, void **p) +{ + GList *cbi; + struct callback *cb; + + if (!l) { + return; + } + + cbi=l->list; + while (cbi) { + cb=cbi->data; + if (type == attr_any || cb->type == attr_any || cb->type == type) + callback_call(cb, pcount, p); + cbi=g_list_next(cbi); + } + +} + +void +callback_list_call_attr_args(struct callback_list *cbl, enum attr_type type, int count, ...) +{ + int i; + void **p=g_alloca(sizeof(void*)*count); + va_list ap; + va_start(ap, count); + for (i = 0 ; i < count ; i++) + p[i]=va_arg(ap, void *); + va_end(ap); + callback_list_call_attr(cbl, type, count, p); +} + +void +callback_list_call(struct callback_list *l, int pcount, void **p) +{ + callback_list_call_attr(l, attr_any, pcount, p); +} + +void +callback_list_call_args(struct callback_list *cbl, int count, ...) +{ + int i; + void **p=g_alloca(sizeof(void*)*count); + va_list ap; + va_start(ap, count); + for (i = 0 ; i < count ; i++) + p[i]=va_arg(ap, void *); + va_end(ap); + callback_list_call(cbl, count, p); +} + +void +callback_list_destroy(struct callback_list *l) +{ + GList *cbi; + cbi=l->list; + while (cbi) { + g_free(cbi->data); + cbi=g_list_next(cbi); + } + g_list_free(l->list); + g_free(l); +} diff --git a/navit/callback.h b/navit/callback.h new file mode 100644 index 0000000..b0f4b9f --- /dev/null +++ b/navit/callback.h @@ -0,0 +1,89 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_CALLBACK_H +#define NAVIT_CALLBACK_H + +#include "item.h" +#include "attr.h" + +#ifdef __cplusplus +extern "C" { +#endif +/* prototypes */ +enum attr_type; +struct callback; +struct callback_list; +struct callback_list *callback_list_new(void); +struct callback *callback_new_attr(void (*func)(void), enum attr_type type, int pcount, void **p); +struct callback *callback_new_attr_args(void (*func)(void), enum attr_type type, int count, ...); +struct callback *callback_new(void (*func)(void), int pcount, void **p); +struct callback *callback_new_args(void (*func)(void), int count, ...); +void callback_destroy(struct callback *cb); +void callback_set_arg(struct callback *cb, int arg, void *p); +void callback_list_add(struct callback_list *l, struct callback *cb); +struct callback *callback_list_add_new(struct callback_list *l, void (*func)(void), int pcount, void **p); +void callback_list_remove(struct callback_list *l, struct callback *cb); +void callback_list_remove_destroy(struct callback_list *l, struct callback *cb); +void callback_call(struct callback *cb, int pcount, void **p); +void callback_call_args(struct callback *cb, int count, ...); +void callback_list_call_attr(struct callback_list *l, enum attr_type type, int pcount, void **p); +void callback_list_call_attr_args(struct callback_list *cbl, enum attr_type type, int count, ...); +void callback_list_call(struct callback_list *l, int pcount, void **p); +void callback_list_call_args(struct callback_list *cbl, int count, ...); +void callback_list_destroy(struct callback_list *l); +/* end of prototypes */ + +#define callback_new_0(func) callback_new_args(func, 0) +#define callback_new_1(func,p1) callback_new_args(func, 1, p1) +#define callback_new_2(func,p1,p2) callback_new_args(func, 2, p1, p2) +#define callback_new_3(func,p1,p2,p3) callback_new_args(func, 3, p1, p2, p3) +#define callback_new_4(func,p1,p2,p3,p4) callback_new_args(func, 4, p1, p2, p3, p4) + +#define callback_new_attr_0(func,type) callback_new_attr_args(func, type, 0) +#define callback_new_attr_1(func,type,p1) callback_new_attr_args(func, type, 1, p1) +#define callback_new_attr_2(func,type,p1,p2) callback_new_attr_args(func, type, 2, p1, p2) +#define callback_new_attr_3(func,type,p1,p2,p3) callback_new_attr_args(func, type, 3, p1, p2, p3) +#define callback_new_attr_4(func,type,p1,p2,p3,p4) callback_new_attr_args(func, type, 4, p1, p2, p3, p4) + +#define callback_call_0(cb) callback_call_args(cb, 0) +#define callback_call_1(cb,p1) callback_call_args(cb, 1, p1) +#define callback_call_2(cb,p1,p2) callback_call_args(cb, 2, p1, p2) +#define callback_call_3(cb,p1,p2,p3) callback_call_args(cb, 3, p1, p2, p3) +#define callback_call_4(cb,p1,p2,p3,p4) callback_call_args(cb, 4, p1, p2, p3, p4) + +#define callback_list_call_0(cbl) callback_list_call_args(cbl, 0) +#define callback_list_call_1(cbl,p1) callback_list_call_args(cbl, 1, p1) +#define callback_list_call_2(cbl,p1,p2) callback_list_call_args(cbl, 2, p1, p2) +#define callback_list_call_3(cbl,p1,p2,p3) callback_list_call_args(cbl, 3, p1, p2, p3) +#define callback_list_call_4(cbl,p1,p2,p3,p4) callback_list_call_args(cbl, 4, p1, p2, p3, p4) + +#define callback_list_call_attr_0(cbl,type) callback_list_call_attr_args(cbl,type, 0) +#define callback_list_call_attr_1(cbl,type,p1) callback_list_call_attr_args(cbl, type, 1, p1) +#define callback_list_call_attr_2(cbl,type,p1,p2) callback_list_call_attr_args(cbl, type, 2, p1, p2) +#define callback_list_call_attr_3(cbl,type,p1,p2,p3) callback_list_call_attr_args(cbl, type, 3, p1, p2, p3) +#define callback_list_call_attr_4(cbl,type,p1,p2,p3,p4) callback_list_call_attr_args(cbl, type, 4, p1, p2, p3, p4) + +#define callback_cast(x) (void (*)(void))(x) +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/navit/color.h b/navit/color.h new file mode 100644 index 0000000..f086eab --- /dev/null +++ b/navit/color.h @@ -0,0 +1,41 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_COLOR_H +#define NAVIT_COLOR_H + +struct color { + int r,g,b,a; +}; + +#define COLOR_WHITE_ 0xffff,0xffff,0xffff,0xffff +#define COLOR_BLACK_ 0x0000,0x0000,0x0000,0xffff +#define COLOR_BACKGROUND_ 0xffff, 0xefef, 0xb7b7, 0xffff +#define COLOR_TRANSPARENT__ 0x0000,0x0000,0x0000,0xffff +#define COLOR_WHITE ((struct color) {COLOR_WHITE_}) +#define COLOR_BLACK ((struct color) {COLOR_BLACK_}) +#define COLOR_TRANSPARENT ((struct color) {COLOR_TRANSPARENT_}) +#define COLOR_FMT "0x%x,0x%x,0x%x,0x%x" +#define COLOR_ARGS(c) (c).r,(c).g,(c).b,(c).a + +#define COLOR_IS_SAME(c1,c2) ((c1).r==(c2).r && (c1).g==(c2).g && (c1).b==(c2).b && (c1).a==(c2).a) +#define COLOR_IS_WHITE(c) COLOR_IS_SAME(c, COLOR_WHITE) +#define COLOR_IS_BLACK(c) COLOR_IS_SAME(c, COLOR_BLACK) + +#endif diff --git a/navit/command.c b/navit/command.c new file mode 100644 index 0000000..1523b6f --- /dev/null +++ b/navit/command.c @@ -0,0 +1,1156 @@ +#include +#include +#include +#include +#include +#include "item.h" +#include "xmlconfig.h" +#include "main.h" +#include "navit.h" +#include "vehicle.h" +#include "speech.h" +#include "gui.h" +#include "debug.h" +#include "callback.h" +#include "command.h" +#include "event.h" +#include "navit_nls.h" +#include "obj_filter.h" + +/* +gui.fullscreen=!gui.fullscreen +gui.menu() +gui.get_data() +zoom_in() +zoom_out() +speech.active=!speech.active +osd_configuration=1 +Not yet: +osd[type=="xxx"].active=0;osd[type=="yyy"].active=0 +*/ + + +struct result { + struct attr attr; + double val; + const char *var; + int varlen; + const char *attrn; + int attrnlen; + int allocated; +}; + +struct context { + struct attr *attr; + int error; + const char *expr; + struct result res; +}; + +struct command_saved_cb { + struct callback *cb; + struct attr attr; +}; + +struct command_saved { + struct context ctx; + struct result res; + char *command; // The command string itself + struct event_idle *idle_ev; // Event to update this command + struct callback *idle_cb; + struct callback *register_cb; // Callback to register all the callbacks + struct event_idle *register_ev; // Idle event to register all the callbacks + struct attr navit; + int num_cbs; + struct command_saved_cb *cbs; // List of callbacks for this saved command + struct callback *cb; // Callback that should be called when we re-evaluate + int error; +}; + +enum error { + no_error=0,missing_closing_brace, missing_colon, wrong_type, illegal_number_format, illegal_character, missing_closing_bracket, invalid_type, not_ready +}; + +static void eval_comma(struct context *ctx, struct result *res); +static struct attr ** eval_list(struct context *ctx); + +static void +result_free(struct result *res) +{ +} + +static int command_register_callbacks(struct command_saved *cs); + +static const char * +get_op(struct context *ctx, int test, ...) +{ + char *op; + const char *ret=NULL; + va_list ap; + + while (g_ascii_isspace(*ctx->expr)) { + ctx->expr++; + } + + va_start(ap, test); + while ((op = va_arg(ap, char *))) { + if (!strncmp(ctx->expr, op, strlen(op))) { + ret=ctx->expr; + if (! test) + ctx->expr+=strlen(op); + break; + } + } + va_end(ap); + return ret; +} + +/*static int +is_int(struct result *res) +{ + return 1; +}*/ + +static int +is_double(struct result *res) +{ + return 0; +} + +static void +dump(struct result *res) +{ +#if 0 + char object[res->varlen+1]; + char attribute[res->attrnlen+1]; + if (res->var) + strncpy(object, res->var, res->varlen); + object[res->varlen]='\0'; + if (res->attrn) + strncpy(attribute, res->attrn, res->attrnlen); + attribute[res->attrnlen]='\0'; + dbg(0,"type:%s\n", attr_to_name(res->attr.type)); + dbg(0,"attribute '%s' from '%s'\n", attribute, object); +#endif +} + +static enum attr_type +command_attr_type(struct result *res) +{ + char *attrn=g_alloca(sizeof(char)*(res->attrnlen+1)); + + strncpy(attrn, res->attrn, res->attrnlen); + attrn[res->attrnlen]='\0'; + return attr_from_name(attrn); +} + +static int +command_object_get_attr(struct context *ctx, struct attr *object, enum attr_type attr_type, struct attr *ret) +{ + struct object_func *func=object_func_lookup(object->type); + if (!func || !func->get_attr) + return 0; + return func->get_attr(object->u.data, attr_type, ret, NULL); +} + +static int +command_object_add_attr(struct context *ctx, struct attr *object, struct attr *attr) +{ + struct object_func *func=object_func_lookup(object->type); + if (!func || !func->add_attr) + return 0; + return func->add_attr(object->u.data, attr); +} + +static int +command_object_remove_attr(struct context *ctx, struct attr *object, struct attr *attr) +{ + struct object_func *func=object_func_lookup(object->type); + if (!func || !func->remove_attr) + return 0; + return func->remove_attr(object->u.data, attr); +} + + +static void +command_get_attr(struct context *ctx, struct result *res) +{ + int result; + enum attr_type attr_type=command_attr_type(res); + result=command_object_get_attr(ctx, &res->attr, attr_type, &res->attr); + if (result) { + res->var=res->attrn; + res->varlen=res->attrnlen; + } else { + res->attr.type=attr_none; + res->var=NULL; + res->varlen=0; + } + res->attrn=NULL; + res->attrnlen=0; + dump(res); +} + +static void +command_set_attr(struct context *ctx, struct result *res, struct result *newres) +{ + int result=0; + enum attr_type attr_type=command_attr_type(res); + struct object_func *func=object_func_lookup(res->attr.type); + if (!func || !func->set_attr) + return; + if (attr_type == attr_attr_types) { + char *attrn=g_alloca(sizeof(char)*(res->attrnlen+1)); + struct attr *tmp; + strncpy(attrn, res->attrn, res->attrnlen); + attrn[res->attrnlen]='\0'; + tmp=attr_new_from_text(attrn, newres->attr.u.str); + newres->attr.u.data=tmp->u.data; + g_free(tmp); + } + newres->attr.type=attr_type; + result=func->set_attr(res->attr.u.data, &newres->attr); + *res=*newres; +} + +static void +resolve_object(struct context *ctx, struct result *res) +{ + if (res->attr.type == attr_none && res->varlen) { + res->attr=*ctx->attr; + res->attrn=res->var; + res->attrnlen=res->varlen; + res->var=NULL; + res->varlen=0; + } +} + +static void +resolve(struct context *ctx, struct result *res, struct attr *parent) //FIXME What is that parent for? +{ + resolve_object(ctx, res); + if (res->attrn) + command_get_attr(ctx, res); +} + +static double +get_double(struct context *ctx, struct result *res) +{ + resolve(ctx, res, NULL); + return res->val; +} + + + +static int +get_int(struct context *ctx, struct result *res) +{ + resolve(ctx, res, NULL); + if (res->attr.type == attr_none) + return 0; + if (res->attr.type >= attr_type_int_begin && res->attr.type <= attr_type_int_end) { + return res->attr.u.num; + } + if (res->attr.type >= attr_type_double_begin && res->attr.type <= attr_type_double_end) { + return (int) (*res->attr.u.numd); + } + ctx->error=wrong_type; + return 0; +} + + +static char * +get_string(struct context *ctx, struct result *res) +{ + resolve(ctx, res, NULL); + return attr_to_text(&res->attr, NULL, 0); +} + +static void +set_double(struct context *ctx, struct result *res, double val) +{ + result_free(res); + res->val=val; +} + +static void +set_int(struct context *ctx, struct result *res, int val) +{ + result_free(res); + res->attr.type=attr_type_int_begin; + res->attr.u.num=val; +} + + +static void +eval_value(struct context *ctx, struct result *res) { + const char *op; + int len,dots=0; + struct obj_filter_t out; + int parsed_chars; + + op=ctx->expr; + res->varlen=0; + res->var=NULL; + res->attrnlen=0; + res->attrn=NULL; + + while (g_ascii_isspace(*op)) { + op++; + } + + parsed_chars = parse_obj_filter(op, &out); + if (parsed_chars) { + struct attr* res_attr = filter_object(ctx->attr, out.iterator_type, out.filter_expr, out.idx); + if (res_attr) { + res->attr = *res_attr; + g_free(res_attr); + ctx->expr = op+parsed_chars; + return; + } + } + + if ((op[0] >= 'a' && op[0] <= 'z') || op[0] == '_') { + res->attr.type=attr_none; + res->var=op; + for (;;) { + while ((op[0] >= 'a' && op[0] <= 'z') || (op[0] >= '0' && op[0] <= '9') || op[0] == '_') { + res->varlen++; + op++; + } + if (res->varlen == 3 && !strncmp(res->var,"new",3) && op[0] == ' ') { + res->varlen++; + op++; + } else + break; + } + ctx->expr=op; + return; + } + if ((op[0] >= '0' && op[0] <= '9') || + (op[0] == '.' && op[1] >= '0' && op[1] <= '9') || + (op[0] == '-' && op[1] >= '0' && op[1] <= '9') || + (op[0] == '-' && op[1] == '.' && op[2] >= '0' && op[2] <= '9')) { + while ((op[0] >= '0' && op[0] <= '9') || op[0] == '.' || (res->varlen == 0 && op[0] == '-')) { + if (op[0] == '.') + dots++; + if (dots > 1) { + ctx->error=illegal_number_format; + return; + } + res->varlen++; + op++; + } + if (dots) { + res->val = strtod(ctx->expr, NULL); + res->attr.type=attr_type_double_begin; + res->attr.u.numd=&res->val; + } else { + res->attr.type=attr_type_int_begin; + res->attr.u.num=atoi(ctx->expr); + } + ctx->expr=op; + return; + } + if (op[0] == '"') { + do { + op++; + } while (op[0] != '"'); + res->attr.type=attr_type_string_begin; + len=op-ctx->expr-1; + res->attr.u.str=g_malloc(len+1); + strncpy(res->attr.u.str, ctx->expr+1, len); + res->attr.u.str[len]='\0'; + op++; + ctx->expr=op; + return; + } + ctx->error=illegal_character; +} + +static int +get_next_object(struct context *ctx, struct result *res) { + + while (*ctx->expr) { + res->varlen = 0; + ctx->error = 0; + + eval_value(ctx,res); + + if ((res->attr.type == attr_none) && (res->varlen > 0)) { + if (ctx->expr[0] != '.') { + return 1; // 1 means "this is the final object name" + } else { + return 2; // 2 means "there are more object names following" (e.g. we just hit 'vehicle' in 'vehicle.position_speed' + } + } + + if (ctx->error) { + // Probably hit an operator + ctx->expr++; + } + } + + return 0; +} + +static void +eval_brace(struct context *ctx, struct result *res) +{ + if (get_op(ctx,0,"(",NULL)) { + eval_comma(ctx, res); + if (ctx->error) return; + if (!get_op(ctx,0,")",NULL)) + ctx->error=missing_closing_brace; + return; + } + eval_value(ctx, res); +} + +static void +command_call_function(struct context *ctx, struct result *res) +{ + struct attr cbl,**list=NULL; + char *function=g_alloca(sizeof(char)*(res->attrnlen+1)); + if (res->attrn) + strncpy(function, res->attrn, res->attrnlen); + function[res->attrnlen]='\0'; + dbg(1,"function=%s\n", function); + if (ctx->expr[0] != ')') { + list=eval_list(ctx); + if (ctx->error) return; + } + if (!get_op(ctx,0,")",NULL)) { + ctx->error=missing_closing_brace; + return; + } + if (!strcmp(function,"_") && list && list[0] && list[0]->type >= attr_type_string_begin && list[0]->type <= attr_type_string_end) { + res->attr.type=list[0]->type; + res->attr.u.str=g_strdup(gettext(list[0]->u.str)); + + } else if (!strncmp(function,"new ",4)) { + enum attr_type attr_type=attr_from_name(function+4); + if (attr_type != attr_none) { + struct object_func *func=object_func_lookup(attr_type); + if (func && func->create) { + res->attr.type=attr_type; + res->attr.u.data=func->create(list[0], list+1); + } + } + } else if (!strcmp(function,"add_attr")) { + command_object_add_attr(ctx, &res->attr, list[0]); + } else if (!strcmp(function,"remove_attr")) { + command_object_remove_attr(ctx, &res->attr, list[0]); + } else { + if (command_object_get_attr(ctx, &res->attr, attr_callback_list, &cbl)) { + int valid =0; + struct attr **out=NULL; + dbg(1,"function call %s from %s\n",function, attr_to_name(res->attr.type)); + callback_list_call_attr_4(cbl.u.callback_list, attr_command, function, list, &out, &valid); + if (valid!=1){ + dbg(0, "invalid command ignored: \"%s\"; see http://wiki.navit-project.org/index.php/" + "The_Navit_Command_Interface for valid commands.\n", function); + } + if (out && out[0]) { + attr_dup_content(out[0], &res->attr); + attr_list_free(out); + } else + res->attr.type=attr_none; + } else + res->attr.type=attr_none; + } + res->var=NULL; + res->varlen=0; + res->attrn=NULL; + res->attrnlen=0; +} + +static void +eval_postfix(struct context *ctx, struct result *res) +{ + struct result tmp; + const char *op; + + eval_brace(ctx, res); + if (ctx->error) return; + for (;;) { + if (!(op=get_op(ctx,0,"[","(",".",NULL))) + return; + if (op[0] == '.') { + eval_brace(ctx, &tmp); + if (ctx->error) return; + resolve(ctx, res,NULL); + if (ctx->error) return; + res->attrn=tmp.var; + res->attrnlen=tmp.varlen; + dump(res); + } else if (op[0] == '[') { + if (!get_op(ctx,0,"]",NULL)) { + ctx->error=missing_closing_bracket; + return; + } + } else if (op[0] == '(') { + dbg(1,"function call\n"); + resolve_object(ctx, res); + command_call_function(ctx, res); + } + } +} + +static void +eval_unary(struct context *ctx, struct result *res) +{ + const char *op; + op=get_op(ctx,0,"~","!",NULL); + if (op) { + eval_unary(ctx, res); + if (ctx->error) return; + if (op[0] == '~') + set_int(ctx, res, ~get_int(ctx, res)); + else + set_int(ctx, res, !get_int(ctx, res)); + } else + eval_postfix(ctx, res); +} + +static void +eval_multiplicative(struct context *ctx, struct result *res) +{ + struct result tmp; + const char *op; + + eval_unary(ctx, res); + if (ctx->error) return; + for (;;) { + if (!(op=get_op(ctx,0,"*","/","%",NULL))) return; + eval_unary(ctx, &tmp); + if (ctx->error) return; + if (is_double(res) || is_double(&tmp)) { + if (op[0] == '*') + set_double(ctx, res, get_double(ctx, res) * get_double(ctx, &tmp)); + else if (op[0] == '/') + set_double(ctx, res, get_double(ctx, res) / get_double(ctx, &tmp)); + else { + ctx->error=invalid_type; + return; + } + } else { + if (op[0] == '*') + set_int(ctx, res, get_int(ctx, res) * get_int(ctx, &tmp)); + else if (op[0] == '/') + set_int(ctx, res, get_int(ctx, res) / get_int(ctx, &tmp)); + else + set_int(ctx, res, get_int(ctx, res) % get_int(ctx, &tmp)); + } + if (ctx->error) return; + } +} + +static void +eval_additive(struct context *ctx, struct result *res) +{ + struct result tmp; + const char *op; + + eval_multiplicative(ctx, res); + if (ctx->error) return; + for (;;) { + if (!(op=get_op(ctx,0,"-","+",NULL))) return; + eval_multiplicative(ctx, &tmp); + if (ctx->error) return; + if (is_double(res) || is_double(&tmp)) { + if (op[0] == '+') + set_double(ctx, res, get_double(ctx, res) + get_double(ctx, &tmp)); + else + set_double(ctx, res, get_double(ctx, res) - get_double(ctx, &tmp)); + } else { + if (op[0] == '+') + set_int(ctx, res, get_int(ctx, res) + get_int(ctx, &tmp)); + else + set_int(ctx, res, get_int(ctx, res) - get_int(ctx, &tmp)); + } + if (ctx->error) return; + } +} + +static void +eval_equality(struct context *ctx, struct result *res) +{ + struct result tmp; + const char *op; + + eval_additive(ctx, res); + if (ctx->error) return; + for (;;) { + if (!(op=get_op(ctx,0,"==","!=","<=",">=","<",">",NULL))) return; + eval_additive(ctx, &tmp); + if (ctx->error) return; + + switch (op[0]) { + case '=': + set_int(ctx, res, (get_int(ctx, res) == get_int(ctx, &tmp))); + break; + case '!': + set_int(ctx, res, (get_int(ctx, res) != get_int(ctx, &tmp))); + break; + case '<': + if (op[1] == '=') { + set_int(ctx, res, (get_int(ctx, res) <= get_int(ctx, &tmp))); + } else { + set_int(ctx, res, (get_int(ctx, res) < get_int(ctx, &tmp))); + } + break; + case '>': + if (op[1] == '=') { + set_int(ctx, res, (get_int(ctx, res) >= get_int(ctx, &tmp))); + } else { + set_int(ctx, res, (get_int(ctx, res) > get_int(ctx, &tmp))); + } + break; + default: + break; + } + result_free(&tmp); + } +} + + +static void +eval_bitwise_and(struct context *ctx, struct result *res) +{ + struct result tmp; + + eval_equality(ctx, res); + if (ctx->error) return; + for (;;) { + if (get_op(ctx,1,"&&",NULL)) return; + if (!get_op(ctx,0,"&",NULL)) return; + eval_equality(ctx, &tmp); + if (ctx->error) return; + set_int(ctx, res, get_int(ctx, res) & get_int(ctx, &tmp)); + if (ctx->error) return; + } +} + +static void +eval_bitwise_xor(struct context *ctx, struct result *res) +{ + struct result tmp; + + eval_bitwise_and(ctx, res); + if (ctx->error) return; + for (;;) { + if (!get_op(ctx,0,"^",NULL)) return; + eval_bitwise_and(ctx, &tmp); + if (ctx->error) return; + set_int(ctx, res, get_int(ctx, res) ^ get_int(ctx, &tmp)); + if (ctx->error) return; + } +} + +static void +eval_bitwise_or(struct context *ctx, struct result *res) +{ + struct result tmp; + + eval_bitwise_xor(ctx, res); + if (ctx->error) return; + for (;;) { + if (get_op(ctx,1,"||",NULL)) return; + if (!get_op(ctx,0,"|",NULL)) return; + eval_bitwise_xor(ctx, &tmp); + if (ctx->error) return; + set_int(ctx, res, get_int(ctx, res) | get_int(ctx, &tmp)); + if (ctx->error) return; + } +} + +static void +eval_logical_and(struct context *ctx, struct result *res) +{ + struct result tmp; + + eval_bitwise_or(ctx, res); + if (ctx->error) return; + for (;;) { + if (!get_op(ctx,0,"&&",NULL)) return; + eval_bitwise_or(ctx, &tmp); + if (ctx->error) return; + set_int(ctx, res, get_int(ctx, res) && get_int(ctx, &tmp)); + if (ctx->error) return; + } +} + +static void +eval_logical_or(struct context *ctx, struct result *res) +{ + struct result tmp; + + eval_logical_and(ctx, res); + if (ctx->error) return; + for (;;) { + if (!get_op(ctx,0,"||",NULL)) return; + eval_logical_and(ctx, &tmp); + if (ctx->error) return; + set_int(ctx, res, get_int(ctx, res) || get_int(ctx, &tmp)); + if (ctx->error) return; + } +} + +static void +eval_conditional(struct context *ctx, struct result *res) +{ + struct result tmp; + int cond; + + eval_logical_or(ctx, res); + if (ctx->error) return; + if (!get_op(ctx,0,"?",NULL)) return; + cond=!!get_int(ctx, res); + if (ctx->error) return; + eval_logical_or(ctx, &tmp); + if (ctx->error) return; + if (cond) + *res=tmp; + if (!get_op(ctx,0,":",NULL)) { + ctx->error=missing_colon; + return; + } + eval_logical_or(ctx, &tmp); + if (ctx->error) return; + if (!cond) + *res=tmp; +} + +/* = *= /= %= += -= >>= <<= &= ^= |= */ + +static void +eval_assignment(struct context *ctx, struct result *res) +{ + struct result tmp; + eval_conditional(ctx, res); + if (ctx->error) return; + if (!get_op(ctx,0,"=",NULL)) return; + eval_conditional(ctx, &tmp); + if (ctx->error) return; + resolve(ctx, &tmp, NULL); + if (ctx->error) return; + resolve_object(ctx, res); + command_set_attr(ctx, res, &tmp); +} + +/* , */ +static void +eval_comma(struct context *ctx, struct result *res) +{ + struct result tmp; + + eval_assignment(ctx, res); + if (ctx->error) return; + for (;;) { + if (!get_op(ctx,0,",",NULL)) return; + eval_assignment(ctx, &tmp); + if (ctx->error) return; + *res=tmp; + } +} + +static struct attr ** +eval_list(struct context *ctx) +{ + struct result tmp; + + struct attr **ret=NULL; + for (;;) { + eval_assignment(ctx, &tmp); + if (ctx->error) { + attr_list_free(ret); + return NULL; + } + resolve(ctx, &tmp, NULL); + ret=attr_generic_add_attr(ret, &tmp.attr); + if (!get_op(ctx,0,",",NULL)) return ret; + } +} + +#if 0 + +void command(struct attr *attr, char *expr) +{ + struct result res; + struct context ctx; + memset(&res, 0, sizeof(res)); + memset(&ctx, 0, sizeof(ctx)); + ctx.attr=attr; + ctx.error=0; + ctx.expr=expr; + printf("command='%s'\n", expr); + eval_comma(&ctx,&res); + printf("err=%d %s\n", ctx.error, ctx.expr); + dump(&res); + printf("***\n"); + resolve(&ctx, &res, NULL); + dump(&res); + printf("%s\n", get_string(&ctx, &res)); +} +#endif + +static void +command_evaluate_to(struct attr *attr, const char *expr, struct context *ctx, struct result *res) +{ + memset(res, 0, sizeof(*res)); + memset(ctx, 0, sizeof(*ctx)); + ctx->attr=attr; + ctx->expr=expr; + eval_comma(ctx,res); +} + +enum attr_type +command_evaluate_to_attr(struct attr *attr, char *expr, int *error, struct attr *ret) +{ + struct result res; + struct context ctx; + command_evaluate_to(attr, expr, &ctx, &res); + if (ctx.error) + return attr_none; + resolve_object(&ctx, &res); + *ret=res.attr; + dbg(0,"type %s\n",attr_to_name(command_attr_type(&res))); + return command_attr_type(&res); +} + +void +command_evaluate_to_void(struct attr *attr, char *expr, int *error) +{ + struct result res; + struct context ctx; + command_evaluate_to(attr, expr, &ctx, &res); + if (!ctx.error) + resolve(&ctx, &res, NULL); + if (error) + *error=ctx.error; + +} + +char * +command_evaluate_to_string(struct attr *attr, char *expr, int *error) +{ + struct result res; + struct context ctx; + char *ret=NULL; + + command_evaluate_to(attr, expr, &ctx, &res); + if (!ctx.error) + resolve(&ctx, &res, NULL); + if (!ctx.error) + ret=get_string(&ctx, &res); + if (error) + *error=ctx.error; + if (ctx.error) + return NULL; + else + return ret; +} + +int +command_evaluate_to_int(struct attr *attr, char *expr, int *error) +{ + struct result res; + struct context ctx; + int ret=0; + + command_evaluate_to(attr, expr, &ctx, &res); + if (!ctx.error) + resolve(&ctx, &res, NULL); + if (!ctx.error) + ret=get_int(&ctx, &res); + if (error) + *error=ctx.error; + if (ctx.error) + return 0; + else + return ret; +} + +int +command_evaluate_to_boolean(struct attr *attr, const char *expr, int *error) +{ + struct result res; + struct context ctx; + int ret=0; + + command_evaluate_to(attr, expr, &ctx, &res); + if (!ctx.error) + resolve(&ctx, &res, NULL); + if (!ctx.error) { + if (res.attr.type == attr_none) + ret=0; + else if ((res.attr.type >= attr_type_int_begin && res.attr.type <= attr_type_int_end) || + (res.attr.type >= attr_type_double_begin && res.attr.type <= attr_type_double_end)) + ret=get_int(&ctx, &res); + else + ret=res.attr.u.data != NULL; + } + if (error) + *error=ctx.error; + if (ctx.error) + return 0; + else + return ret; +} + +void +command_evaluate(struct attr *attr, const char *expr) +{ + /* Once the eval has started we can't rely anymore on the content of + * expr which may be freed when the calling widget is destroyed by a + * subsequent command call. Hence the g_strdup. */ + + char *expr_dup; + struct result res; + struct context ctx; + memset(&res, 0, sizeof(res)); + memset(&ctx, 0, sizeof(ctx)); + ctx.attr=attr; + ctx.error=0; + ctx.expr=expr_dup=g_strdup(expr); + for (;;) { + eval_comma(&ctx,&res); + if (ctx.error) + break; + resolve(&ctx, &res, NULL); + if (ctx.error) + break; + if (!get_op(&ctx,0,";",NULL)) + break; + } + g_free(expr_dup); +} + +#if 0 +void +command_interpreter(struct attr *attr) +{ + char buffer[4096]; + int size; + for (;;) { + size=read(0, buffer, 4095); + buffer[size]='\0'; + if (size) { + buffer[size-1]='\0'; + } + command(attr, buffer); + } +} +#endif + +static void +command_table_call(struct command_table *table, int count, void *data, char *command, struct attr **in, struct attr ***out, int *valid) +{ + int i; + for (i = 0 ; i < count ; i++) { + if (!strcmp(command,table->command)) { + if (valid) + *valid=1; + table->func(data, command, in, out); + } + table++; + } +} + +void +command_add_table_attr(struct command_table *table, int count, void *data, struct attr *attr) +{ + attr->type=attr_callback; + attr->u.callback=callback_new_attr_3(callback_cast(command_table_call),attr_command, table, count, data); +} + +void +command_add_table(struct callback_list *cbl, struct command_table *table, int count, void *data) +{ + struct attr attr; + command_add_table_attr(table, count, data, &attr); + callback_list_add(cbl, attr.u.callback); +} + +void +command_saved_set_cb (struct command_saved *cs, struct callback *cb) +{ + cs->cb = cb; +} + +int +command_saved_get_int (struct command_saved *cs) +{ + return get_int(&cs->ctx, &cs->res); +} + +int +command_saved_error (struct command_saved *cs) +{ + return cs->error; +} + +static void +command_saved_evaluate_idle (struct command_saved *cs) +{ + // Only run once at a time + if (cs->idle_ev) { + event_remove_idle(cs->idle_ev); + cs->idle_ev = NULL; + } + + command_evaluate_to(&cs->navit, cs->command, &cs->ctx, &cs->res); + + if (!cs->ctx.error) { + cs->error = 0; + + if (cs->cb) { + callback_call_1(cs->cb, cs); + } + } else { + cs->error = cs->ctx.error; + } +} + +static void +command_saved_evaluate(struct command_saved *cs) +{ + if (cs->idle_ev) { + // We're already scheduled for reevaluation + return; + } + + if (!cs->idle_cb) { + cs->idle_cb = callback_new_1(callback_cast(command_saved_evaluate_idle), cs); + } + + cs->idle_ev = event_add_idle(100, cs->idle_cb); +} + +static void +command_saved_callbacks_changed(struct command_saved *cs) +{ + // For now, we delete each and every callback and then re-create them + int i; + struct object_func *func; + struct attr attr; + + if (cs->register_ev) { + event_remove_idle(cs->register_ev); + cs->register_ev = NULL; + } + + attr.type = attr_callback; + + for (i = 0; i < cs->num_cbs; i++) { + func = object_func_lookup(cs->cbs[i].attr.type); + + if (!func->remove_attr) { + dbg(0, "Could not remove command-evaluation callback because remove_attr is missing for type %i!\n", cs->cbs[i].attr.type); + continue; + } + + attr.u.callback = cs->cbs[i].cb; + + func->remove_attr(cs->cbs[i].attr.u.data, &attr); + callback_destroy(cs->cbs[i].cb); + } + + g_free(cs->cbs); + cs->cbs = NULL; + cs->num_cbs = 0; + + // Now, re-create all the callbacks + command_register_callbacks(cs); +} + +static int +command_register_callbacks(struct command_saved *cs) +{ + struct attr prev,cb_attr,attr; + int status; + struct object_func *func; + struct callback *cb; + + attr = cs->navit; + cs->ctx.expr = cs->command; + cs->ctx.attr = &attr; + prev = cs->navit; + + while ((status = get_next_object(&cs->ctx, &cs->res)) != 0) { + resolve(&cs->ctx, &cs->res, NULL); + + if (cs->ctx.error || (cs->res.attr.type == attr_none)) { + // We could not resolve an object, perhaps because it has not been created + return 0; + } + + if (prev.type != attr_none) { + func = object_func_lookup(prev.type); + + if (func->add_attr) { + if (status == 2) { // This is not the final attribute name + cb = callback_new_attr_1(callback_cast(command_saved_callbacks_changed), cs->res.attr.type, (void*)cs); + attr = cs->res.attr; + } else if (status == 1) { // This is the final attribute name + cb = callback_new_attr_1(callback_cast(command_saved_evaluate), cs->res.attr.type, (void*)cs); + cs->ctx.attr = &cs->navit; + } else { + dbg(0, "Error: Strange status returned from get_next_object()\n"); + } + + cs->num_cbs++; + cs->cbs = g_realloc(cs->cbs, (sizeof(struct command_saved_cb) * cs->num_cbs)); + cs->cbs[cs->num_cbs-1].cb = cb; + cs->cbs[cs->num_cbs-1].attr = prev; + + cb_attr.u.callback = cb; + cb_attr.type = attr_callback; + + func->add_attr(prev.u.data, &cb_attr); + + } else { + dbg(0, "Could not add callback because add_attr is missing for type %i}n", prev.type); + } + } + + if (status == 2) { + prev = cs->res.attr; + } else { + prev = cs->navit; + } + } + + command_saved_evaluate_idle(cs); + + return 1; +} + +struct command_saved +*command_saved_new(char *command, struct navit *navit, struct callback *cb) +{ + struct command_saved *ret; + + ret = g_new0(struct command_saved, 1); + ret->command = g_strdup(command); + ret->navit.u.navit = navit; + ret->navit.type = attr_navit; + ret->cb = cb; + ret->error = not_ready; + + if (!command_register_callbacks(ret)) { + // We try this as an idle call again + ret->register_cb = callback_new_1(callback_cast(command_saved_callbacks_changed), ret); + ret->register_ev = event_add_idle(300, ret->register_cb); + } + + return ret; +} + +void +command_saved_destroy(struct command_saved *cs) +{ + g_free(cs->command); + g_free(cs); +} diff --git a/navit/command.h b/navit/command.h new file mode 100644 index 0000000..916071e --- /dev/null +++ b/navit/command.h @@ -0,0 +1,60 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2010 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#ifndef NAVIT_COMMAND_H +#define NAVIT_COMMAND_H + +#ifdef __cplusplus +extern "C" { +#endif + +struct command_table { + const char *command; + int (*func)(void *data, char *cmd, struct attr **in, struct attr ***out); +}; + +#define command_cast(x) (int (*)(void *, char *, struct attr **, struct attr ***))(x) + +/* prototypes */ +enum attr_type; +struct attr; +struct callback; +struct callback_list; +struct command_saved; +struct command_table; +struct navit; +enum attr_type command_evaluate_to_attr(struct attr *attr, char *expr, int *error, struct attr *ret); +void command_evaluate_to_void(struct attr *attr, char *expr, int *error); +char *command_evaluate_to_string(struct attr *attr, char *expr, int *error); +int command_evaluate_to_int(struct attr *attr, char *expr, int *error); +int command_evaluate_to_boolean(struct attr *attr, const char *expr, int *error); +void command_evaluate(struct attr *attr, const char *expr); +void command_add_table_attr(struct command_table *table, int count, void *data, struct attr *attr); +void command_add_table(struct callback_list *cbl, struct command_table *table, int count, void *data); +void command_saved_set_cb(struct command_saved *cs, struct callback *cb); +int command_saved_get_int(struct command_saved *cs); +int command_saved_error(struct command_saved *cs); +struct command_saved *command_saved_new(char *command, struct navit *navit, struct callback *cb); +void command_saved_destroy(struct command_saved *cs); +/* end of prototypes */ +#ifdef __cplusplus +} +#endif + + #endif /* NAVIT_COMMAND_H */ diff --git a/navit/compass.c b/navit/compass.c new file mode 100644 index 0000000..727e051 --- /dev/null +++ b/navit/compass.c @@ -0,0 +1,156 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include "point.h" +#include "coord.h" +#include "graphics.h" +#include "transform.h" +#include "item.h" +#include "route.h" +#include "vehicle.h" +#include "navit.h" +#include "compass.h" + +#if 0 +struct compass { + struct graphics *gr; + struct graphics_gc *bg; + struct graphics_gc *white; + struct graphics_gc *green; + struct graphics_font *font; +}; + +static void +transform_rotate(struct point *center, int angle, struct point *p, int count) +{ + int i,x,y; + double dx,dy; + for (i = 0 ; i < count ; i++) + { + dx=sin(M_PI*angle/180.0); + dy=cos(M_PI*angle/180.0); + x=dy*p->x-dx*p->y; + y=dx*p->x+dy*p->y; + + p->x=center->x+x; + p->y=center->y+y; + p++; + } +} + +static void +handle(struct graphics *gr, struct graphics_gc *gc, struct point *p, int r, int dir) +{ + struct point ph[3]; + int l=r*0.4; + + ph[0].x=0; + ph[0].y=r; + ph[1].x=0; + ph[1].y=-r; + transform_rotate(p, dir, ph, 2); + gr->draw_lines(gr, gc, ph, 2); + ph[0].x=-l; + ph[0].y=-r+l; + ph[1].x=0; + ph[1].y=-r; + ph[2].x=l; + ph[2].y=-r+l; + transform_rotate(p, dir, ph, 3); + gr->draw_lines(gr, gc, ph, 3); +} + +void +compass_draw(struct compass *comp, struct container *co) +{ + struct point p; + struct coord *pos, *dest; + double *vehicle_dir,dir,distance; + int dx,dy; + char buffer[16]; + + if (! co->vehicle) + return; + + vehicle_dir=vehicle_dir_get(co->vehicle); + comp->gr->draw_mode(comp->gr, draw_mode_begin); + p.x=0; + p.y=0; + comp->gr->draw_rectangle(comp->gr, comp->bg, &p, 60, 80); + p.x=30; + p.y=30; + comp->gr->draw_circle(comp->gr, comp->white, &p, 50); + if (co->flags->orient_north) + handle(comp->gr,comp->white, &p, 20,0); + else + handle(comp->gr, comp->white, &p, 20, -*vehicle_dir); +#if 0 /* FIXME */ + dest=route_get_destination(co->route); + if (dest) { + pos=vehicle_pos_get(co->vehicle); + dx=dest->x-pos->x; + dy=dest->y-pos->y; + dir=atan2(dx,dy)*180.0/M_PI; +#if 0 + printf("dx %d dy %d dir=%f vehicle_dir=%f\n", dx, dy, dir, *vehicle_dir); +#endif + if (! co->flags->orient_north) + dir-=*vehicle_dir; + handle(comp->gr, comp->green, &p, 20, dir); + p.x=8; + p.y=72; + distance=transform_distance(projection_mg, pos, dest)/1000.0; + if (distance >= 100) + sprintf(buffer,"%.0f km", distance); + else if (distance >= 10) + sprintf(buffer,"%.1f km", distance); + else + sprintf(buffer,"%.2f km", distance); + + comp->gr->draw_text(comp->gr, comp->green, NULL, comp->font, buffer, &p, 0x10000, 0); + } +#endif + comp->gr->draw_mode(comp->gr, draw_mode_end); +} + +struct compass * +compass_new(struct container *co) +{ + struct compass *this=g_new0(struct compass, 1); + struct point p; + p.x=10; + p.y=10; + this->gr=co->gra->overlay_new(co->gra, &p, 60, 80); + this->bg=this->gr->gc_new(this->gr); + this->gr->gc_set_foreground(this->bg, 0, 0, 0); + this->white=this->gr->gc_new(this->gr); + this->gr->gc_set_foreground(this->white, 0xffff, 0xffff, 0xffff); + this->gr->gc_set_linewidth(this->white, 2); + this->green=this->gr->gc_new(this->gr); + this->gr->gc_set_foreground(this->green, 0x0, 0xffff, 0x0); + this->gr->gc_set_linewidth(this->green, 2); + + this->font=this->gr->font_new(this->gr, 200); + compass_draw(this, co); + return this; +} +#endif diff --git a/navit/compass.h b/navit/compass.h new file mode 100644 index 0000000..3d6fb40 --- /dev/null +++ b/navit/compass.h @@ -0,0 +1,26 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_COMPASS_H +#define NAVIT_COMPASS_H + +struct compass * compass_new(struct container *co); +void compass_draw(struct compass *comp, struct container *co); + +#endif diff --git a/navit/config_.c b/navit/config_.c new file mode 100644 index 0000000..224f476 --- /dev/null +++ b/navit/config_.c @@ -0,0 +1,174 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include "debug.h" +#include "item.h" +#include "callback.h" +#include "navit.h" +#include "config_.h" +#ifdef HAVE_API_WIN32_CE +#include "libc.h" +#endif + +struct config { + struct attr **attrs; + struct callback_list *cbl; +} *config; + +struct config * +config_get(void) +{ + return config; +} + +int config_empty_ok; + +static int configured; + +struct attr_iter { + void *iter; +}; + +void +config_destroy(struct config *this_) +{ + attr_list_free(this_->attrs); + callback_list_destroy(this_->cbl); + g_free(config); + exit(0); +} + +static void +config_terminate(int sig) +{ + dbg(0,"terminating\n"); + config_destroy(config); +} + +static void +config_new_int(void) +{ + config=g_new0(struct config, 1); + config->cbl=callback_list_new(); +#ifndef HAVE_API_WIN32_CE + signal(SIGTERM, config_terminate); +#ifndef HAVE_API_WIN32 +#ifndef __MINGW32__ + signal(SIGPIPE, SIG_IGN); +#endif /* __MINGW32__ */ +#endif +#endif +} + +int +config_get_attr(struct config *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); +} + +static int +config_set_attr_int(struct config *this_, struct attr *attr) +{ + switch (attr->type) { + case attr_language: + setenv("LANG",attr->u.str,1); + return 1; + default: + return 0; + } +} + +int +config_set_attr(struct config *this_, struct attr *attr) +{ + return config_set_attr_int(this_, attr); +} + +int +config_add_attr(struct config *this_, struct attr *attr) +{ + if (!config) { + config_new_int(); + this_=config; + } + switch (attr->type) { + case attr_callback: + callback_list_add(this_->cbl, attr->u.callback); + default: + this_->attrs=attr_generic_add_attr(this_->attrs, attr); + } + callback_list_call_attr_2(this_->cbl, attr->type, attr->u.data, 1); + return 1; +} + +int +config_remove_attr(struct config *this_, struct attr *attr) +{ + switch (attr->type) { + case attr_callback: + callback_list_remove(this_->cbl, attr->u.callback); + default: + this_->attrs=attr_generic_remove_attr(this_->attrs, attr); + } + callback_list_call_attr_2(this_->cbl, attr->type, attr->u.data, -1); + return 1; +} + +struct attr_iter * +config_attr_iter_new() +{ + return g_new0(struct attr_iter, 1); +} + +void +config_attr_iter_destroy(struct attr_iter *iter) +{ + g_free(iter); +} + + +struct config * +config_new(struct attr *parent, struct attr **attrs) +{ + if (configured) { + dbg(0,"only one config allowed\n"); + return config; + } + if (parent) { + dbg(0,"no parent in config allowed\n"); + return NULL; + } + if (!config) + config_new_int(); + config->attrs=attr_list_dup(attrs); + while (*attrs) { + if (!config_set_attr_int(config,*attrs)) { + dbg(0,"failed to set attribute '%s'\n",attr_to_name((*attrs)->type)); + config_destroy(config); + config=NULL; + break; + } + attrs++; + } + configured=1; + return config; +} diff --git a/navit/config_.h b/navit/config_.h new file mode 100644 index 0000000..fe379cc --- /dev/null +++ b/navit/config_.h @@ -0,0 +1,25 @@ +#ifdef __cplusplus +extern "C" { +#endif +extern int main_argc; +extern char **main_argv; +extern struct config *config; +extern int config_empty_ok; +/* prototypes */ +enum attr_type; +struct attr; +struct attr_iter; +struct config; +struct config * config_get(void); +void config_destroy(struct config *this_); +int config_get_attr(struct config *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); +int config_set_attr(struct config *this_, struct attr *attr); +int config_add_attr(struct config *this_, struct attr *attr); +int config_remove_attr(struct config *this_, struct attr *attr); +struct attr_iter *config_attr_iter_new(void); +void config_attr_iter_destroy(struct attr_iter *iter); +struct config *config_new(struct attr *parent, struct attr **attrs); +/* end of prototypes */ +#ifdef __cplusplus +} +#endif diff --git a/navit/coord.c b/navit/coord.c new file mode 100644 index 0000000..58fa4b1 --- /dev/null +++ b/navit/coord.c @@ -0,0 +1,398 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include "debug.h" +#include "item.h" +#include "coord.h" +#include "transform.h" +#include "projection.h" +/** + * @defgroup coord Coordinate handling functions + * @{ + */ + +/** + * Get a coordinate + * + * @param p Pointer to the coordinate + * @returns the coordinate + */ + +struct coord * +coord_get(unsigned char **p) +{ + struct coord *ret=(struct coord *)(*p); + *p += sizeof(*ret); + return ret; +} + +struct coord * +coord_new(int x, int y) +{ + struct coord *c=g_new(struct coord, 1); + + c->x=x; + c->y=y; + + return c; +} + +struct coord * +coord_new_from_attrs(struct attr *parent, struct attr **attrs) +{ + struct attr *x,*y; + x=attr_search(attrs, NULL, attr_x); + y=attr_search(attrs, NULL, attr_y); + if (!x || !y) + return NULL; + return coord_new(x->u.num, y->u.num); +} + + +void +coord_destroy(struct coord *c) +{ + g_free(c); +} + +struct coord_rect * +coord_rect_new(struct coord *lu, struct coord *rl) +{ + struct coord_rect *r=g_new(struct coord_rect, 1); + + dbg_assert(lu->x <= rl->x); + dbg_assert(lu->y >= rl->y); + + r->lu=*lu; + r->rl=*rl; + + return r; + +} + +void +coord_rect_destroy(struct coord_rect *r) +{ + g_free(r); +} + +int +coord_rect_overlap(struct coord_rect *r1, struct coord_rect *r2) +{ + dbg_assert(r1->lu.x <= r1->rl.x); + dbg_assert(r1->lu.y >= r1->rl.y); + dbg_assert(r2->lu.x <= r2->rl.x); + dbg_assert(r2->lu.y >= r2->rl.y); + dbg(1,"0x%x,0x%x - 0x%x,0x%x vs 0x%x,0x%x - 0x%x,0x%x\n", r1->lu.x, r1->lu.y, r1->rl.x, r1->rl.y, r2->lu.x, r2->lu.y, r2->rl.x, r2->rl.y); + if (r1->lu.x > r2->rl.x) + return 0; + if (r1->rl.x < r2->lu.x) + return 0; + if (r1->lu.y < r2->rl.y) + return 0; + if (r1->rl.y > r2->lu.y) + return 0; + return 1; +} + +int +coord_rect_contains(struct coord_rect *r, struct coord *c) +{ + dbg_assert(r->lu.x <= r->rl.x); + dbg_assert(r->lu.y >= r->rl.y); + if (c->x < r->lu.x) + return 0; + if (c->x > r->rl.x) + return 0; + if (c->y < r->rl.y) + return 0; + if (c->y > r->lu.y) + return 0; + return 1; +} + +void +coord_rect_extend(struct coord_rect *r, struct coord *c) +{ + if (c->x < r->lu.x) + r->lu.x=c->x; + if (c->x > r->rl.x) + r->rl.x=c->x; + if (c->y < r->rl.y) + r->rl.y=c->y; + if (c->y > r->lu.y) + r->lu.y=c->y; +} + +/** + * Parses \c char \a *c_str and writes back the coordinates to \c coord \a *c_ret. Uses \c projection \a pro if no projection is given in \c char \a *c_str. + * The format for \a *c_str can be: + * \li [Proj:]-0xX [-]0xX + * - where Proj can be mg/garmin, defaults to mg + * \li [Proj:][D][D]Dmm.ss[S][S] N/S [D][D]DMM.ss[S][S]... E/W + * \li [Proj:][-][D]D.d[d]... [-][D][D]D.d[d] + * - where Proj can be geo + * + * @param *c_str String to be parsed + * @param pro Projection of the string + * @param *pc_ret Where the \a pcoord should get stored + * @returns The lenght of the parsed string + */ + +int +coord_parse(const char *c_str, enum projection pro, struct coord *c_ret) +{ + int debug=0; + char *proj=NULL,*s,*co; + const char *str=c_str; + int args,ret = 0; + struct coord_geo g; + struct coord c; + enum projection str_pro=projection_none; + + dbg(1,"enter('%s',%d,%p)\n", c_str, pro, c_ret); + s=strchr(str,' '); + co=strchr(str,':'); + if (co && co < s) { + proj=malloc(co-str+1); + strncpy(proj, str, co-str); + proj[co-str]='\0'; + dbg(1,"projection=%s\n", proj); + str=co+1; + s=strchr(str,' '); + if (!strcmp(proj, "mg")) + str_pro = projection_mg; + else if (!strcmp(proj, "garmin")) + str_pro = projection_garmin; + else if (!strcmp(proj, "geo")) + str_pro = projection_none; + else { + dbg(0, "Unknown projection: %s\n", proj); + goto out; + } + } + if (! s) { + ret=0; + goto out; + } + while (*s == ' ') { + s++; + } + if (!strncmp(s, "0x", 2) || !strncmp(s, "-0x", 3)) { + args=sscanf(str, "%i %i%n",&c.x, &c.y, &ret); + if (args < 2) + goto out; + dbg(1,"str='%s' x=0x%x y=0x%x c=%d\n", str, c.x, c.y, ret); + dbg(1,"rest='%s'\n", str+ret); + + if (str_pro == projection_none) + str_pro=projection_mg; + if (str_pro != pro) { + transform_to_geo(str_pro, &c, &g); + transform_from_geo(pro, &g, &c); + } + *c_ret=c; + } else if (*s == 'N' || *s == 'n' || *s == 'S' || *s == 's') { + double lng, lat; + char ns, ew; + dbg(1,"str='%s'\n", str); + args=sscanf(str, "%lf %c %lf %c%n", &lat, &ns, &lng, &ew, &ret); + dbg(1,"args=%d\n", args); + dbg(1,"lat=%f %c lon=%f %c\n", lat, ns, lng, ew); + if (args < 4) + goto out; + dbg(1,"projection=%d str_pro=%d projection_none=%d\n", pro, str_pro, projection_none); + if (str_pro == projection_none) { + g.lat=floor(lat/100); + lat-=g.lat*100; + g.lat+=lat/60; + g.lng=floor(lng/100); + lng-=g.lng*100; + g.lng+=lng/60; + if (ns == 's' || ns == 'S') + g.lat=-g.lat; + if (ew == 'w' || ew == 'W') + g.lng=-g.lng; + dbg(1,"transform_from_geo(%f,%f)",g.lat,g.lng); + transform_from_geo(pro, &g, c_ret); + dbg(1,"result 0x%x,0x%x\n", c_ret->x,c_ret->y); + } + dbg(3,"str='%s' x=%f ns=%c y=%f ew=%c c=%d\n", str, lng, ns, lat, ew, ret); + dbg(3,"rest='%s'\n", str+ret); + } else { + double lng, lat; + args=sscanf(str, "%lf %lf%n", &lng, &lat, &ret); + if (args < 2) + goto out; + dbg(1,"str='%s' x=%f y=%f c=%d\n", str, lng, lat, ret); + dbg(1,"rest='%s'\n", str+ret); + g.lng=lng; + g.lat=lat; + transform_from_geo(pro, &g, c_ret); + } + if (debug) + printf("rest='%s'\n", str+ret); + ret+=str-c_str; + if (debug) { + printf("args=%d\n", args); + printf("ret=%d delta=%d ret_str='%s'\n", ret, GPOINTER_TO_INT(str-c_str), c_str+ret); + } +out: + free(proj); + return ret; +} + +/** + * A wrapper for pcoord_parse that also return the projection + * @param *c_str String to be parsed + * @param pro Projection of the string + * @param *pc_ret Where the \a pcoord should get stored + * @returns The lenght of the parsed string + */ + +int +pcoord_parse(const char *c_str, enum projection pro, struct pcoord *pc_ret) +{ + struct coord c; + int ret; + ret = coord_parse(c_str, pro, &c); + pc_ret->x = c.x; + pc_ret->y = c.y; + pc_ret->pro = pro; + return ret; +} + +void +coord_print(enum projection pro, struct coord *c, FILE *out) { + unsigned int x; + unsigned int y; + char *sign_x = ""; + char *sign_y = ""; + + if ( c->x < 0 ) { + x = -c->x; + sign_x = "-"; + } else { + x = c->x; + } + if ( c->y < 0 ) { + y = -c->y; + sign_y = "-"; + } else { + y = c->y; + } + fprintf( out, "%s: %s0x%x %s0x%x\n", + projection_to_name( pro ), + sign_x, x, + sign_y, y ); + return; +} + +/** + * @brief Converts a lat/lon into a text formatted text string. + * @param lat The latitude (if lat is 360 or greater, the latitude will be omitted) + * @param lng The longitude (if lng is 360 or greater, the longitude will be omitted) + * @param fmt The format to use. + * @li DEGREES_DECIMAL=>Degrees with decimal places, i.e. 20.5000°N 110.5000°E + * @li DEGREES_MINUTES=>Degrees and minutes, i.e. 20°30.00'N 110°30.00'E + * @li DEGREES_MINUTES_SECONDS=>Degrees, minutes and seconds, i.e. 20°30'30.00"N 110°30'30"E + * + * + * @param buffer A buffer large enough to hold the output + a terminating NULL (up to 31 bytes) + * @param size The size of the buffer + * + */ +void coord_format(float lat,float lng, enum coord_format fmt, char * buffer, int size) +{ + + char lat_c='N'; + char lng_c='E'; + float lat_deg,lat_min,lat_sec; + float lng_deg,lng_min,lng_sec; + int size_used=0; + + if (lng < 0) { + lng=-lng; + lng_c='W'; + } + if (lat < 0) { + lat=-lat; + lat_c='S'; + } + lat_deg=lat; + lat_min=(lat-floor(lat_deg))*60; + lat_sec=fmod(lat*3600,60); + lng_deg=lng; + lng_min=(lng-floor(lng_deg))*60; + lng_sec=fmod(lng*3600,60); + switch(fmt) + { + + case DEGREES_DECIMAL: + if (lat<360) + size_used+=g_snprintf(buffer+size_used,size-size_used,"%02.6f°%c",lat,lat_c); + if ((lat<360)&&(lng<360)) + size_used+=g_snprintf(buffer+size_used,size-size_used," "); + if (lng<360) + size_used+=g_snprintf(buffer+size_used,size-size_used,"%03.7f°%c",lng,lng_c); + break; + case DEGREES_MINUTES: + if (lat<360) + size_used+=g_snprintf(buffer+size_used,size-size_used,"%02.0f°%07.4f' %c",floor(lat_deg),lat_min,lat_c); + if ((lat<360)&&(lng<360)) + size_used+=g_snprintf(buffer+size_used,size-size_used," "); + if (lng<360) + size_used+=g_snprintf(buffer+size_used,size-size_used,"%03.0f°%07.4f' %c",floor(lng_deg),lng_min,lng_c); + break; + case DEGREES_MINUTES_SECONDS: + if (lat<360) + size_used+=g_snprintf(buffer+size_used,size-size_used,"%02.0f°%02.0f'%05.2f\" %c",floor(lat_deg),floor(lat_min),lat_sec,lat_c); + if ((lat<360)&&(lng<360)) + size_used+=g_snprintf(buffer+size_used,size-size_used," "); + if (lng<360) + size_used+=g_snprintf(buffer+size_used,size-size_used,"%03.0f°%02.0f'%05.2f\" %c",floor(lng_deg),floor(lng_min),lng_sec,lng_c); + break; + + + } + +} + +unsigned int +coord_hash(const void *key) +{ + const struct coord *c=key; + return c->x^c->y; +} + +int +coord_equal(const void *a, const void *b) +{ + const struct coord *c_a=a; + const struct coord *c_b=b; + if (c_a->x == c_b->x && c_a->y == c_b->y) + return TRUE; + return FALSE; +} +/** @} */ diff --git a/navit/coord.h b/navit/coord.h new file mode 100644 index 0000000..8d08c03 --- /dev/null +++ b/navit/coord.h @@ -0,0 +1,164 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_COORD_H +#define NAVIT_COORD_H + + +#ifdef __cplusplus +extern "C" { +#endif +#include +#include "config.h" +#include "projection.h" + +#define coord_is_equal(a,b) ((a).x==(b).x && (a).y==(b).y) + +/*! A integer mercator coordinate */ +struct coord { + int x; /*!< X-Value */ + int y; /*!< Y-Value */ +}; + +/*! A integer mercator coordinate carrying its projection */ +struct pcoord { + enum projection pro; + int x; /*!< X-Value */ + int y; /*!< Y-Value */ +}; + +struct coord_rect { + struct coord lu; + struct coord rl; +}; + + +#ifdef AVOID_FLOAT +/** + * On platforms where we are trying to avoid floats, sometimes we can't. + * It is better on these platforms to use single precision floating points + * over double percision ones since performance is much better. + */ +typedef float navit_float; +#define navit_sin(x) sinf(x) +#define navit_cos(x) cosf(x) +#define navit_tan(x) tanf(x) +#define navit_atan(x) atanf(x) +#define navit_acos(x) acosf(x) +#define navit_asin(x) asinf(x) +#define navit_sqrt(x) sqrtf(x) +#else +typedef double navit_float; +#define navit_sin(x) sin(x) +#define navit_cos(x) cos(x) +#define navit_tan(x) tan(x) +#define navit_atan(x) atan(x) +#define navit_acos(x) acos(x) +#define navit_asin(x) asin(x) +#define navit_sqrt(x) sqrt(x) +#endif + + +//! A double mercator coordinate +struct coord_d { + double x; /*!< X-Value */ + double y; /*!< Y-Value */ +}; + +//! A WGS84 coordinate +struct coord_geo { + navit_float lng; /*!< Longitude */ + navit_float lat; /*!< Latitude */ +}; + +//! A cartesian coordinate +struct coord_geo_cart { + navit_float x; /*!< X-Value */ + navit_float y; /*!< Y-Value */ + navit_float z; /*!< Z-Value */ +}; + +/** + * An enumeration of formats for printing geographic coordinates in. + * + */ +enum coord_format +{ + /** + * Degrees with decimal places. + * Ie 20.5000 N 110.5000 E + */ + DEGREES_DECIMAL, + + /** + * Degrees and minutes. + * ie 20 30.00 N 110 30.00 E + */ + DEGREES_MINUTES, + /** + * Degrees, minutes and seconds. + * ie 20 30 30.00 N 110 30 30 E + */ + DEGREES_MINUTES_SECONDS +}; + +enum projection; +struct attr; + +struct coord * coord_get(unsigned char **p); +struct coord * coord_new(int x, int y); +struct coord * coord_new_from_attrs(struct attr *parent, struct attr **attrs); +void coord_destroy(struct coord *c); +int coord_parse(const char *c_str, enum projection pro, struct coord *c_ret); +int pcoord_parse(const char *c_str, enum projection pro, struct pcoord *c_ret); +void coord_print(enum projection pro, struct coord *c, FILE *out); +struct coord_rect * coord_rect_new(struct coord *lu, struct coord *rl); +void coord_rect_destroy(struct coord_rect *r); +int coord_rect_overlap(struct coord_rect *r1, struct coord_rect *r2); +int coord_rect_contains(struct coord_rect *r, struct coord *c); +void coord_rect_extend(struct coord_rect *r, struct coord *c); +void coord_format(float lat,float lng, enum coord_format, char * buffer, int size); + +/* prototypes */ +enum coord_format; +enum projection; +struct attr; +struct coord; +struct coord_rect; +struct pcoord; +struct coord *coord_get(unsigned char **p); +struct coord *coord_new(int x, int y); +struct coord *coord_new_from_attrs(struct attr *parent, struct attr **attrs); +void coord_destroy(struct coord *c); +struct coord_rect *coord_rect_new(struct coord *lu, struct coord *rl); +void coord_rect_destroy(struct coord_rect *r); +int coord_rect_overlap(struct coord_rect *r1, struct coord_rect *r2); +int coord_rect_contains(struct coord_rect *r, struct coord *c); +void coord_rect_extend(struct coord_rect *r, struct coord *c); +int coord_parse(const char *c_str, enum projection pro, struct coord *c_ret); +int pcoord_parse(const char *c_str, enum projection pro, struct pcoord *pc_ret); +void coord_print(enum projection pro, struct coord *c, FILE *out); +void coord_format(float lat, float lng, enum coord_format fmt, char *buffer, int size); +unsigned int coord_hash(const void *key); +int coord_equal(const void *a, const void *b); +/* end of prototypes */ +#ifdef __cplusplus +} +#endif +#endif diff --git a/navit/country.c b/navit/country.c new file mode 100644 index 0000000..8a99904 --- /dev/null +++ b/navit/country.c @@ -0,0 +1,429 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include "debug.h" +#include "item.h" +#include "country.h" +#include "search.h" +#include "navit_nls.h" + +struct country { + int id; + char *car; + char *iso2; + char *iso3; + char *name; +}; + +static struct country country[]= { + { 20, "AND", "AD", "AND", /* 020 */ _n("Andorra")}, + {784, "UAE", "AE", "ARE", /* 784 */ _n("United Arab Emirates")}, + { 4, "AFG", "AF", "AFG", /* 004 */ _n("Afghanistan")}, + { 28, "AG", "AG", "ATG", /* 028 */ _n("Antigua and Barbuda")}, + {660, NULL, "AI", "AIA", /* 660 */ _n("Anguilla")}, + { 8, "AL", "AL", "ALB", /* 008 */ _n("Albania")}, + { 51, "ARM", "AM", "ARM", /* 051 */ _n("Armenia")}, + {530, "NA", "AN", "ANT", /* 530 */ _n("Netherlands Antilles")}, + { 24, "ANG", "AO", "AGO", /* 024 */ _n("Angola")}, + { 10, NULL, "AQ", "ATA", /* 010 */ _n("Antarctica")}, + { 32, "RA", "AR", "ARG", /* 032 */ _n("Argentina")}, + { 16, NULL, "AS", "ASM", /* 016 */ _n("American Samoa")}, + { 40, "A", "AT", "AUT", /* 040 */ _n("Austria")}, + { 36, "AUS", "AU", "AUS", /* 036 */ _n("Australia")}, + {533, "ARU", "AW", "ABW", /* 533 */ _n("Aruba")}, + {248, "AX", "AX", "ALA", /* 248 */ _n("Aland Islands")}, + { 31, "AZ", "AZ", "AZE", /* 031 */ _n("Azerbaijan")}, + { 70, "BiH", "BA", "BIH", /* 070 */ _n("Bosnia and Herzegovina")}, + { 52, "BDS", "BB", "BRB", /* 052 */ _n("Barbados")}, + { 50, "BD", "BD", "BGD", /* 050 */ _n("Bangladesh")}, + { 56, "B", "BE", "BEL", /* 056 */ _n("Belgium")}, + {854, "BF", "BF", "BFA", /* 854 */ _n("Burkina Faso")}, + {100, "BG", "BG", "BGR", /* 100 */ _n("Bulgaria")}, + { 48, "BRN", "BH", "BHR", /* 048 */ _n("Bahrain")}, + {108, "RU", "BI", "BDI", /* 108 */ _n("Burundi")}, + {204, "BJ", "BJ", "BEN", /* 204 */ _n("Benin")}, + {652, NULL, "BL", "BLM", /* 652 */ _n("Saint Barthelemy")}, + { 60, NULL, "BM", "BMU", /* 060 */ _n("Bermuda")}, + { 96, "BRU", "BN", "BRN", /* 096 */ _n("Brunei Darussalam")}, + { 68, "BOL", "BO", "BOL", /* 068 */ _n("Bolivia")}, + { 76, "BR", "BR", "BRA", /* 076 */ _n("Brazil")}, + { 44, "BS", "BS", "BHS", /* 044 */ _n("Bahamas")}, + { 64, "BHT", "BT", "BTN", /* 064 */ _n("Bhutan")}, + { 74, NULL, "BV", "BVT", /* 074 */ _n("Bouvet Island")}, + { 72, "RB", "BW", "BWA", /* 072 */ _n("Botswana")}, + {112, "BY", "BY", "BLR", /* 112 */ _n("Belarus")}, + { 84, "BZ", "BZ", "BLZ", /* 084 */ _n("Belize")}, + {124, "CDN", "CA", "CAN", /* 124 */ _n("Canada")}, + {166, NULL, "CC", "CCK", /* 166 */ _n("Cocos (Keeling) Islands")}, + {180, "CGO", "CD", "COD", /* 180 */ _n("Congo, Democratic Republic of the")}, + {140, "RCA", "CF", "CAF", /* 140 */ _n("Central African Republic")}, + {178, NULL, "CG", "COG", /* 178 */ _n("Congo")}, + {756, "CH", "CH", "CHE", /* 756 */ _n("Switzerland")}, + {384, "CI", "CI", "CIV", /* 384 */ _n("Cote d'Ivoire")}, + {184, NULL, "CK", "COK", /* 184 */ _n("Cook Islands")}, + {152, "RCH", "CL", "CHL", /* 152 */ _n("Chile")}, + {120, "CAM", "CM", "CMR", /* 120 */ _n("Cameroon")}, + {156, "RC", "CN", "CHN", /* 156 */ _n("China")}, + {170, "CO", "CO", "COL", /* 170 */ _n("Colombia")}, + {188, "CR", "CR", "CRI", /* 188 */ _n("Costa Rica")}, + {192, "C", "CU", "CUB", /* 192 */ _n("Cuba")}, + {132, "CV", "CV", "CPV", /* 132 */ _n("Cape Verde")}, + {162, NULL, "CX", "CXR", /* 162 */ _n("Christmas Island")}, + {196, "CY", "CY", "CYP", /* 196 */ _n("Cyprus")}, + {203, "CZ", "CZ", "CZE", /* 203 */ _n("Czech Republic")}, + {276, "D", "DE", "DEU", /* 276 */ _n("Germany")}, + {262, "DJI", "DJ", "DJI", /* 262 */ _n("Djibouti")}, + {208, "DK", "DK", "DNK", /* 208 */ _n("Denmark")}, + {212, "WD", "DM", "DMA", /* 212 */ _n("Dominica")}, + {214, "DOM", "DO", "DOM", /* 214 */ _n("Dominican Republic")}, + { 12, "DZ", "DZ", "DZA", /* 012 */ _n("Algeria")}, + {218, "EC", "EC", "ECU", /* 218 */ _n("Ecuador")}, + {233, "EST", "EE", "EST", /* 233 */ _n("Estonia")}, + {818, "ET", "EG", "EGY", /* 818 */ _n("Egypt")}, + {732, "WSA", "EH", "ESH", /* 732 */ _n("Western Sahara")}, + {232, "ER", "ER", "ERI", /* 232 */ _n("Eritrea")}, + {724, "E", "ES", "ESP", /* 724 */ _n("Spain")}, + {231, "ETH", "ET", "ETH", /* 231 */ _n("Ethiopia")}, + {246, "FIN", "FI", "FIN", /* 246 */ _n("Finland")}, + {242, "FJI", "FJ", "FJI", /* 242 */ _n("Fiji")}, + {238, NULL, "FK", "FLK", /* 238 */ _n("Falkland Islands (Malvinas)")}, + {583, "FSM", "FM", "FSM", /* 583 */ _n("Micronesia, Federated States of")}, + {234, "FO", "FO", "FRO", /* 234 */ _n("Faroe Islands")}, + {250, "F", "FR", "FRA", /* 250 */ _n("France")}, + {266, "G", "GA", "GAB", /* 266 */ _n("Gabon")}, + {826, "GB", "GB", "GBR", /* 826 */ _n("United Kingdom")}, + {308, "WG", "GD", "GRD", /* 308 */ _n("Grenada")}, + {268, "GE", "GE", "GEO", /* 268 */ _n("Georgia")}, + {254, NULL, "GF", "GUF", /* 254 */ _n("French Guiana")}, + {831, NULL, "GG", "GGY", /* 831 */ _n("Guernsey")}, + {288, "GH", "GH", "GHA", /* 288 */ _n("Ghana")}, + {292, "GBZ", "GI", "GIB", /* 292 */ _n("Gibraltar")}, + {304, "KN", "GL", "GRL", /* 304 */ _n("Greenland")}, + {270, "WAG", "GM", "GMB", /* 270 */ _n("Gambia")}, + {324, "RG", "GN", "GIN", /* 324 */ _n("Guinea")}, + {312, NULL, "GP", "GLP", /* 312 */ _n("Guadeloupe")}, + {226, "GQ", "GQ", "GNQ", /* 226 */ _n("Equatorial Guinea")}, + {300, "GR", "GR", "GRC", /* 300 */ _n("Greece")}, + {239, NULL, "GS", "SGS", /* 239 */ _n("South Georgia and the South Sandwich Islands")}, + {320, "GCA", "GT", "GTM", /* 320 */ _n("Guatemala")}, + {316, NULL, "GU", "GUM", /* 316 */ _n("Guam")}, + {624, "GUB", "GW", "GNB", /* 624 */ _n("Guinea-Bissau")}, + {328, "GUY", "GY", "GUY", /* 328 */ _n("Guyana")}, + {344, "HK", "HK", "HKG", /* 344 */ _n("Hong Kong")}, + {334, NULL, "HM", "HMD", /* 334 */ _n("Heard Island and McDonald Islands")}, + {340, "HN", "HN", "HND", /* 340 */ _n("Honduras")}, + {191, "HR", "HR", "HRV", /* 191 */ _n("Croatia")}, + {332, "RH", "HT", "HTI", /* 332 */ _n("Haiti")}, + {348, "H", "HU", "HUN", /* 348 */ _n("Hungary")}, + {360, "RI", "ID", "IDN", /* 360 */ _n("Indonesia")}, + {372, "IRL", "IE", "IRL", /* 372 */ _n("Ireland")}, + {376, "IL", "IL", "ISR", /* 376 */ _n("Israel")}, + {833, NULL, "IM", "IMN", /* 833 */ _n("Isle of Man")}, + {356, "IND", "IN", "IND", /* 356 */ _n("India")}, + { 86, NULL, "IO", "IOT", /* 086 */ _n("British Indian Ocean Territory")}, + {368, "IRQ", "IQ", "IRQ", /* 368 */ _n("Iraq")}, + {364, "IR", "IR", "IRN", /* 364 */ _n("Iran, Islamic Republic of")}, + {352, "IS", "IS", "ISL", /* 352 */ _n("Iceland")}, + {380, "I", "IT", "ITA", /* 380 */ _n("Italy")}, + {832, NULL, "JE", "JEY", /* 832 */ _n("Jersey")}, + {388, "JA", "JM", "JAM", /* 388 */ _n("Jamaica")}, + {400, "JOR", "JO", "JOR", /* 400 */ _n("Jordan")}, + {392, "J", "JP", "JPN", /* 392 */ _n("Japan")}, + {404, "EAK", "KE", "KEN", /* 404 */ _n("Kenya")}, + {417, "KS", "KG", "KGZ", /* 417 */ _n("Kyrgyzstan")}, + {116, "K", "KH", "KHM", /* 116 */ _n("Cambodia")}, + {296, "KIR", "KI", "KIR", /* 296 */ _n("Kiribati")}, + {174, "COM", "KM", "COM", /* 174 */ _n("Comoros")}, + {659, "KAN", "KN", "KNA", /* 659 */ _n("Saint Kitts and Nevis")}, + {408, "KP", "KP", "PRK", /* 408 */ _n("Korea, Democratic People's Republic of")}, + {410, "ROK", "KR", "KOR", /* 410 */ _n("Korea, Republic of")}, + {414, "KWT", "KW", "KWT", /* 414 */ _n("Kuwait")}, + {136, NULL, "KY", "CYM", /* 136 */ _n("Cayman Islands")}, + {398, "KZ", "KZ", "KAZ", /* 398 */ _n("Kazakhstan")}, + {418, "LAO", "LA", "LAO", /* 418 */ _n("Lao People's Democratic Republic")}, + {422, "RL", "LB", "LBN", /* 422 */ _n("Lebanon")}, + {662, "WL", "LC", "LCA", /* 662 */ _n("Saint Lucia")}, + {438, "FL", "LI", "LIE", /* 438 */ _n("Liechtenstein")}, + {144, "CL", "LK", "LKA", /* 144 */ _n("Sri Lanka")}, + {430, "LB", "LR", "LBR", /* 430 */ _n("Liberia")}, + {426, "LS", "LS", "LSO", /* 426 */ _n("Lesotho")}, + {440, "LT", "LT", "LTU", /* 440 */ _n("Lithuania")}, + {442, "L", "LU", "LUX", /* 442 */ _n("Luxembourg")}, + {428, "LV", "LV", "LVA", /* 428 */ _n("Latvia")}, + {434, "LAR", "LY", "LBY", /* 434 */ _n("Libyan Arab Jamahiriya")}, + {504, "MA", "MA", "MAR", /* 504 */ _n("Morocco")}, + {492, "MC", "MC", "MCO", /* 492 */ _n("Monaco")}, + {498, "MD", "MD", "MDA", /* 498 */ _n("Moldova, Republic of")}, + {499, "MNE", "ME", "MNE", /* 499 */ _n("Montenegro")}, + {663, NULL, "MF", "MAF", /* 663 */ _n("Saint Martin (French part)")}, + {450, "RM", "MG", "MDG", /* 450 */ _n("Madagascar")}, + {584, "MH", "MH", "MHL", /* 584 */ _n("Marshall Islands")}, + {807, "MK", "MK", "MKD", /* 807 */ _n("Macedonia, the former Yugoslav Republic of")}, + {466, "RMM", "ML", "MLI", /* 466 */ _n("Mali")}, + {104, "MYA", "MM", "MMR", /* 104 */ _n("Myanmar")}, + {496, "MGL", "MN", "MNG", /* 496 */ _n("Mongolia")}, + {446, NULL, "MO", "MAC", /* 446 */ _n("Macao")}, + {580, NULL, "MP", "MNP", /* 580 */ _n("Northern Mariana Islands")}, + {474, NULL, "MQ", "MTQ", /* 474 */ _n("Martinique")}, + {478, "RIM", "MR", "MRT", /* 478 */ _n("Mauritania")}, + {500, NULL, "MS", "MSR", /* 500 */ _n("Montserrat")}, + {470, "M", "MT", "MLT", /* 470 */ _n("Malta")}, + {480, "MS", "MU", "MUS", /* 480 */ _n("Mauritius")}, + {462, "MV", "MV", "MDV", /* 462 */ _n("Maldives")}, + {454, "MW", "MW", "MWI", /* 454 */ _n("Malawi")}, + {484, "MEX", "MX", "MEX", /* 484 */ _n("Mexico")}, + {458, "MAL", "MY", "MYS", /* 458 */ _n("Malaysia")}, + {508, "MOC", "MZ", "MOZ", /* 508 */ _n("Mozambique")}, + {516, "NAM", "NA", "NAM", /* 516 */ _n("Namibia")}, + {540, "NCL", "NC", "NCL", /* 540 */ _n("New Caledonia")}, + {562, "RN", "NE", "NER", /* 562 */ _n("Niger")}, + {574, NULL, "NF", "NFK", /* 574 */ _n("Norfolk Island")}, + {566, "NGR", "NG", "NGA", /* 566 */ _n("Nigeria")}, + {558, "NIC", "NI", "NIC", /* 558 */ _n("Nicaragua")}, + {528, "NL", "NL", "NLD", /* 528 */ _n("Netherlands")}, + {578, "N", "NO", "NOR", /* 578 */ _n("Norway")}, + {524, "NEP", "NP", "NPL", /* 524 */ _n("Nepal")}, + {520, "NAU", "NR", "NRU", /* 520 */ _n("Nauru")}, + {570, NULL, "NU", "NIU", /* 570 */ _n("Niue")}, + {554, "NZ", "NZ", "NZL", /* 554 */ _n("New Zealand")}, + {512, "OM", "OM", "OMN", /* 512 */ _n("Oman")}, + {591, "PA", "PA", "PAN", /* 591 */ _n("Panama")}, + {604, "PE", "PE", "PER", /* 604 */ _n("Peru")}, + {258, NULL, "PF", "PYF", /* 258 */ _n("French Polynesia")}, + {598, "PNG", "PG", "PNG", /* 598 */ _n("Papua New Guinea")}, + {608, "RP", "PH", "PHL", /* 608 */ _n("Philippines")}, + {586, "PK", "PK", "PAK", /* 586 */ _n("Pakistan")}, + {616, "PL", "PL", "POL", /* 616 */ _n("Poland")}, + {666, NULL, "PM", "SPM", /* 666 */ _n("Saint Pierre and Miquelon")}, + {612, NULL, "PN", "PCN", /* 612 */ _n("Pitcairn")}, + {630, "PRI", "PR", "PRI", /* 630 */ _n("Puerto Rico")}, + {275, "AUT", "PS", "PSE", /* 275 */ _n("Palestinian Territory, Occupied")}, + {620, "P", "PT", "PRT", /* 620 */ _n("Portugal")}, + {585, "PAL", "PW", "PLW", /* 585 */ _n("Palau")}, + {600, "PY", "PY", "PRY", /* 600 */ _n("Paraguay")}, + {634, "Q", "QA", "QAT", /* 634 */ _n("Qatar")}, + {638, NULL, "RE", "REU", /* 638 */ _n("Reunion")}, + {642, "RO", "RO", "ROU", /* 642 */ _n("Romania")}, + {688, "SRB", "RS", "SRB", /* 688 */ _n("Serbia")}, + {643, "RUS", "RU", "RUS", /* 643 */ _n("Russian Federation")}, + {646, "RWA", "RW", "RWA", /* 646 */ _n("Rwanda")}, + {682, "KSA", "SA", "SAU", /* 682 */ _n("Saudi Arabia")}, + { 90, "SOL", "SB", "SLB", /* 090 */ _n("Solomon Islands")}, + {690, "SY", "SC", "SYC", /* 690 */ _n("Seychelles")}, + {736, "SUD", "SD", "SDN", /* 736 */ _n("Sudan")}, + {752, "S", "SE", "SWE", /* 752 */ _n("Sweden")}, + {702, "SGP", "SG", "SGP", /* 702 */ _n("Singapore")}, + {654, NULL, "SH", "SHN", /* 654 */ _n("Saint Helena")}, + {705, "SLO", "SI", "SVN", /* 705 */ _n("Slovenia")}, + {744, NULL, "SJ", "SJM", /* 744 */ _n("Svalbard and Jan Mayen")}, + {703, "SK", "SK", "SVK", /* 703 */ _n("Slovakia")}, + {694, "WAL", "SL", "SLE", /* 694 */ _n("Sierra Leone")}, + {674, "RSM", "SM", "SMR", /* 674 */ _n("San Marino")}, + {686, "SN", "SN", "SEN", /* 686 */ _n("Senegal")}, + {706, "SO", "SO", "SOM", /* 706 */ _n("Somalia")}, + {740, "SME", "SR", "SUR", /* 740 */ _n("Suriname")}, + {678, "STP", "ST", "STP", /* 678 */ _n("Sao Tome and Principe")}, + {222, "ES", "SV", "SLV", /* 222 */ _n("El Salvador")}, + {760, "SYR", "SY", "SYR", /* 760 */ _n("Syrian Arab Republic")}, + {748, "SD", "SZ", "SWZ", /* 748 */ _n("Swaziland")}, + {796, NULL, "TC", "TCA", /* 796 */ _n("Turks and Caicos Islands")}, + {148, "TD", "TD", "TCD", /* 148 */ _n("Chad")}, + {260, "ARK", "TF", "ATF", /* 260 */ _n("French Southern Territories")}, + {768, "RT", "TG", "TGO", /* 768 */ _n("Togo")}, + {764, "T", "TH", "THA", /* 764 */ _n("Thailand")}, + {762, "TJ", "TJ", "TJK", /* 762 */ _n("Tajikistan")}, + {772, NULL, "TK", "TKL", /* 772 */ _n("Tokelau")}, + {626, "TL", "TL", "TLS", /* 626 */ _n("Timor-Leste")}, + {795, "TM", "TM", "TKM", /* 795 */ _n("Turkmenistan")}, + {788, "TN", "TN", "TUN", /* 788 */ _n("Tunisia")}, + {776, "TON", "TO", "TON", /* 776 */ _n("Tonga")}, + {792, "TR", "TR", "TUR", /* 792 */ _n("Turkey")}, + {780, "TT", "TT", "TTO", /* 780 */ _n("Trinidad and Tobago")}, + {798, "TUV", "TV", "TUV", /* 798 */ _n("Tuvalu")}, + {158, NULL, "TW", "TWN", /* 158 */ _n("Taiwan, Province of China")}, + {834, "EAT", "TZ", "TZA", /* 834 */ _n("Tanzania, United Republic of")}, + {804, "UA", "UA", "UKR", /* 804 */ _n("Ukraine")}, + {800, "EAU", "UG", "UGA", /* 800 */ _n("Uganda")}, + {581, NULL, "UM", "UMI", /* 581 */ _n("United States Minor Outlying Islands")}, + {840, "USA", "US", "USA", /* 840 */ _n("United States")}, + {858, "ROU", "UY", "URY", /* 858 */ _n("Uruguay")}, + {860, "UZ", "UZ", "UZB", /* 860 */ _n("Uzbekistan")}, + {336, "SCV", "VA", "VAT", /* 336 */ _n("Holy See (Vatican City State)")}, + {670, "WV", "VC", "VCT", /* 670 */ _n("Saint Vincent and the Grenadines")}, + {862, "YV", "VE", "VEN", /* 862 */ _n("Venezuela")}, + { 92, NULL, "VG", "VGB", /* 092 */ _n("Virgin Islands, British")}, + {850, NULL, "VI", "VIR", /* 850 */ _n("Virgin Islands, U.S.")}, + {704, "VN", "VN", "VNM", /* 704 */ _n("Viet Nam")}, + {548, "VAN", "VU", "VUT", /* 548 */ _n("Vanuatu")}, + {876, NULL, "WF", "WLF", /* 876 */ _n("Wallis and Futuna")}, + {882, "WS", "WS", "WSM", /* 882 */ _n("Samoa")}, + {887, "YAR", "YE", "YEM", /* 887 */ _n("Yemen")}, + {175, NULL, "YT", "MYT", /* 175 */ _n("Mayotte")}, + {710, "ZA", "ZA", "ZAF", /* 710 */ _n("South Africa") }, + {894, "Z", "ZM", "ZMB", /* 894 */ _n("Zambia")}, + {716, "ZW", "ZW", "ZWE", /* 716 */ _n("Zimbabwe")}, + {999, "*", "*", "*", _n("* Unknown, add is_in tags to those cities")}, +}; + + +struct country_search { + struct attr search; + int len; + int partial; + struct item item; + int count; + struct country *country; + enum attr_type attr_next; +}; + +static int +country_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + struct country_search *this_=priv_data; + struct country *country=this_->country; + + attr->type=attr_type; + switch (attr_type) { + case attr_any: + while (this_->attr_next != attr_none) { + if (country_attr_get(this_, this_->attr_next, attr)) + return 1; + } + return 0; + case attr_label: + attr->u.str=gettext(country->name); + this_->attr_next=attr_country_id; + return 1; + case attr_country_id: + attr->u.num=country->id; + this_->attr_next=country->car ? attr_country_car : attr_country_iso2; + return 1; + case attr_country_car: + attr->u.str=country->car; + this_->attr_next=attr_country_iso2; + return attr->u.str ? 1 : 0; + case attr_country_iso2: + attr->u.str=country->iso2; + this_->attr_next=attr_country_iso3; + return 1; + case attr_country_iso3: + attr->u.str=country->iso3; + this_->attr_next=attr_country_name; + return 1; + case attr_country_name: + attr->u.str=gettext(country->name); + this_->attr_next=attr_none; + return 1; + default: + return 0; + } +} + + + +struct item_methods country_meth = { + NULL, /* coord_rewind */ + NULL, /* coord_get */ + NULL, /* attr_rewind */ + country_attr_get, /* attr_get */ +}; + +struct country_search * +country_search_new(struct attr *search, int partial) +{ + struct country_search *ret=g_new(struct country_search, 1); + ret->search=*search; + if (search->type != attr_country_id) + ret->len=strlen(search->u.str); + else + ret->len=0; + ret->partial=partial; + ret->count=0; + + ret->item.type=type_country_label; + ret->item.id_hi=0; + ret->item.map=NULL; + ret->item.meth=&country_meth; + ret->item.priv_data=ret; + + return ret; +} + +static int +match(struct country_search *this_, enum attr_type type, const char *name) +{ + int ret; + if (!name) + return 0; + if (this_->search.type != type && this_->search.type != attr_country_all) + return 0; + if (this_->partial) + ret=(g_strncasecmp(this_->search.u.str, name, this_->len) == 0); + else + ret=(g_strcasecmp(this_->search.u.str, name) == 0); + return ret; + +} + + +struct item * +country_search_get_item(struct country_search *this_) +{ + for (;;) { + if (this_->count >= sizeof(country)/sizeof(struct country)) + return NULL; + this_->country=&country[this_->count++]; + if ((this_->search.type == attr_country_id && this_->search.u.num == this_->country->id) || + match(this_, attr_country_iso3, this_->country->iso3) || + match(this_, attr_country_iso2, this_->country->iso2) || + match(this_, attr_country_car, this_->country->car) || + match(this_, attr_country_name, gettext(this_->country->name))) { + this_->item.id_lo=this_->country->id; + return &this_->item; + } + } +} + +static struct attr country_default_attr; +static char iso2[3]; + +struct attr * +country_default(void) +{ + char *lang; + if (country_default_attr.u.str) + return &country_default_attr; + lang=getenv("LANG"); + if (!lang || strlen(lang) < 5) + return NULL; + strncpy(iso2, lang+3, 2); + country_default_attr.type=attr_country_iso2; + country_default_attr.u.str=iso2; + return &country_default_attr; +} + +void +country_search_destroy(struct country_search *this_) +{ + g_free(this_); +} diff --git a/navit/country.h b/navit/country.h new file mode 100644 index 0000000..6f0d404 --- /dev/null +++ b/navit/country.h @@ -0,0 +1,41 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_COUNTRY_H +#define NAVIT_COUNTRY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* prototypes */ +struct attr; +struct country_search; +struct item; +struct country_search *country_search_new(struct attr *search, int partial); +struct item *country_search_get_item(struct country_search *this_); +struct attr *country_default(void); +void country_search_destroy(struct country_search *this_); +/* end of prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/navit/data.h b/navit/data.h new file mode 100644 index 0000000..19928a3 --- /dev/null +++ b/navit/data.h @@ -0,0 +1,108 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_DATA_H +#define NAVIT_DATA_H + +#include "config.h" + +#ifdef WORDS_BIGENDIAN +#include +#endif + +static inline unsigned char +get_u8(unsigned char **p) +{ + return *((*p)++); +} + +static inline unsigned short +get_u16(unsigned char **p) { + unsigned short ret; + ret=*((unsigned short *)*p); + *p+=sizeof(unsigned short); +#ifdef WORDS_BIGENDIAN + return __bswap_16(ret); +#else + return ret; +#endif +} + +static inline unsigned short +get_u16_unal(unsigned char **p) { + unsigned short ret; + ret=*(*p)++; + ret|=(*(*p)++) << 8; + return ret; +} + + +static inline unsigned int +get_u24(unsigned char **p) { + unsigned long ret; + ret=get_u16(p); + ret|=*((*p)++) << 16; + return ret; +} + + +static inline unsigned int +get_u24_unal(unsigned char **p) { + unsigned long ret; + ret=get_u16_unal(p); + ret|=*((*p)++) << 16; + return ret; +} + + +static inline unsigned int +get_u32(unsigned char **p) { + unsigned long ret; + ret=*((unsigned int *)*p); + *p+=sizeof(unsigned int); +#ifdef WORDS_BIGENDIAN + return __bswap_32(ret); +#else + return ret; +#endif +} + +static inline unsigned int +get_u32_unal(unsigned char **p) { + unsigned long ret; + ret=*(*p)++; + ret|=(*(*p)++) << 8; + ret|=(*(*p)++) << 16; + ret|=(*(*p)++) << 24; + return ret; +} + +static inline char * +get_string(unsigned char **p) +{ + char *ret=(char *)(*p); + while (**p) (*p)++; + (*p)++; + return ret; +} + +#define L(x) ({ unsigned char *t=(unsigned char *)&(x); t[0] | (t[1] << 8) | (t[2] << 16) | (t[3] << 24); }) + +#endif + diff --git a/navit/data_window.c b/navit/data_window.c new file mode 100644 index 0000000..8db7d5d --- /dev/null +++ b/navit/data_window.c @@ -0,0 +1,41 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include "data_window.h" + +void +datawindow_mode(struct datawindow *win, int start) +{ + win->meth.mode(win->priv, start); +} + +void +datawindow_add(struct datawindow *win, struct param_list *param, int count) +{ + win->meth.add(win->priv, param, count); +} + +void +datawindow_destroy(struct datawindow *win) +{ + win->meth.destroy(win->priv); + g_free(win); +} + diff --git a/navit/data_window.h b/navit/data_window.h new file mode 100644 index 0000000..340a7f3 --- /dev/null +++ b/navit/data_window.h @@ -0,0 +1,44 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_DATA_WINDOW_H +#define NAVIT_DATA_WINDOW_H + +struct datawindow; +struct param_list; +struct datawindow_priv; + +struct datawindow_methods { + void (*destroy)(struct datawindow_priv *win); + void (*add)(struct datawindow_priv *win, struct param_list *param, int count); + void (*mode)(struct datawindow_priv *win, int start); +}; + +struct datawindow { + struct datawindow_priv *priv; + struct datawindow_methods meth; +}; + + +void datawindow_destroy(struct datawindow *win); +void datawindow_add(struct datawindow *win, struct param_list *param, int count); +void datawindow_mode(struct datawindow *win, int start); + +#endif + diff --git a/navit/data_window_int.h b/navit/data_window_int.h new file mode 100644 index 0000000..6d3ead9 --- /dev/null +++ b/navit/data_window_int.h @@ -0,0 +1,31 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_DATA_WINDOW_INT_H +#define NAVIT_DATA_WINDOW_INT_H + +struct data_window { + GtkWidget *window; + GtkWidget *scrolled_window; + GtkWidget *treeview; + void(*callback)(struct data_window *, char **cols); +}; + +#endif + diff --git a/navit/debug.c b/navit/debug.c new file mode 100644 index 0000000..4fd4d1c --- /dev/null +++ b/navit/debug.c @@ -0,0 +1,437 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#ifndef _MSC_VER +#include +#endif /* _MSC_VER */ +#include "config.h" +#include "file.h" +#include "item.h" +#include "debug.h" + +#ifdef HAVE_API_ANDROID +#include +#endif + +#if defined HAVE_API_WIN32_CE || defined _MSC_VER +#include +#include +#endif + +#ifdef HAVE_SOCKET +#include +#include +#include +#include + +static int debug_socket=-1; +static struct sockaddr_in debug_sin; +#endif + + +int debug_level=0; +int global_debug_level=0; +int segv_level=0; +int timestamp_prefix=0; + +static int dummy; +static GHashTable *debug_hash; +static gchar *gdb_program; + +static FILE *debug_fp; + +#if defined(_WIN32) || defined(__CEGCC__) + +static void sigsegv(int sig) +{ +} + +#else +#include +static void sigsegv(int sig) +{ + char buffer[256]; + if (segv_level > 1) + sprintf(buffer, "gdb -ex bt %s %d", gdb_program, getpid()); + else + sprintf(buffer, "gdb -ex bt -ex detach -ex quit %s %d", gdb_program, getpid()); + system(buffer); + exit(1); +} +#endif + +void +debug_init(const char *program_name) +{ + gdb_program=g_strdup(program_name); + signal(SIGSEGV, sigsegv); + debug_hash=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); +#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED + debug_fp = stdout; +#else + debug_fp = stderr; +#endif +} + + +static void +debug_update_level(gpointer key, gpointer value, gpointer user_data) +{ + if (debug_level < GPOINTER_TO_INT(value)) + debug_level = GPOINTER_TO_INT(value); +} + +void +debug_level_set(const char *name, int level) +{ + if (!strcmp(name, "segv")) { + segv_level=level; + if (segv_level) + signal(SIGSEGV, sigsegv); + else + signal(SIGSEGV, NULL); + } else if (!strcmp(name, "timestamps")) { + timestamp_prefix=level; + } else if (!strcmp(name, DEBUG_MODULE_GLOBAL)) { + global_debug_level=level; + if (debug_level < global_debug_level){ + debug_level = global_debug_level; + } + } else { + g_hash_table_insert(debug_hash, g_strdup(name), GINT_TO_POINTER(level)); + g_hash_table_foreach(debug_hash, debug_update_level, NULL); + } +} + +struct debug * +debug_new(struct attr *parent, struct attr **attrs) +{ + struct attr *name,*level; + name=attr_search(attrs, NULL, attr_name); + level=attr_search(attrs, NULL, attr_level); +#ifdef HAVE_SOCKET + if (!name && !level) { + struct attr *socket_attr=attr_search(attrs, NULL, attr_socket); + char *p,*s; + if (!socket_attr) + return NULL; + s=g_strdup(socket_attr->u.str); + p=strchr(s,':'); + if (!p) { + g_free(s); + return NULL; + } + *p++='\0'; + debug_sin.sin_family=AF_INET; + if (!inet_aton(s, &debug_sin.sin_addr)) { + g_free(s); + return NULL; + } + debug_sin.sin_port=ntohs(atoi(p)); + if (debug_socket == -1) + debug_socket=socket(PF_INET, SOCK_DGRAM, 0); + g_free(s); + return (struct debug *)&dummy; + } +#endif + if (!name || !level) + return NULL; + debug_level_set(name->u.str, level->u.num); + return (struct debug *)&dummy; +} + + +int +debug_level_get(const char *name) +{ + if (!debug_hash) + return 0; + return GPOINTER_TO_INT(g_hash_table_lookup(debug_hash, name)); +} + +static void debug_timestamp(char *buffer) +{ +#if defined HAVE_API_WIN32_CE || defined _MSC_VER + LARGE_INTEGER counter, frequency; + double val; + QueryPerformanceCounter(&counter); + QueryPerformanceFrequency(&frequency); + val=counter.HighPart * 4294967296.0 + counter.LowPart; + val/=frequency.HighPart * 4294967296.0 + frequency.LowPart; + sprintf(buffer,"%.6f|",val); + +#else + struct timeval tv; + + if (gettimeofday(&tv, NULL) == -1) + return; + /* Timestamps are UTC */ + sprintf(buffer, + "%02d:%02d:%02d.%03d|", + (int)(tv.tv_sec/3600)%24, + (int)(tv.tv_sec/60)%60, + (int)tv.tv_sec % 60, + (int)tv.tv_usec/1000); +#endif +} + +void +debug_vprintf(int level, const char *module, const int mlen, const char *function, const int flen, int prefix, const char *fmt, va_list ap) +{ +#if defined HAVE_API_WIN32_CE || defined _MSC_VER + char buffer[4096]; +#else + char buffer[mlen+flen+3]; +#endif + FILE *fp=debug_fp; + + sprintf(buffer, "%s:%s", module, function); + if (global_debug_level >= level || debug_level_get(module) >= level || debug_level_get(buffer) >= level) { +#if defined(DEBUG_WIN32_CE_MESSAGEBOX) + wchar_t muni[4096]; +#endif + char xbuffer[4096]; + xbuffer[0]='\0'; + if (prefix) { + if (timestamp_prefix) + debug_timestamp(xbuffer); + strcpy(xbuffer+strlen(xbuffer),buffer); + strcpy(xbuffer+strlen(xbuffer),":"); + } + vsprintf(xbuffer+strlen(xbuffer),fmt,ap); +#ifdef DEBUG_WIN32_CE_MESSAGEBOX + mbstowcs(muni, xbuffer, strlen(xbuffer)+1); + MessageBoxW(NULL, muni, TEXT("Navit - Error"), MB_APPLMODAL|MB_OK|MB_ICONERROR); +#else +#ifdef HAVE_API_ANDROID + __android_log_print(ANDROID_LOG_ERROR,"navit", "%s", xbuffer); +#else +#ifdef HAVE_SOCKET + if (debug_socket != -1) { + sendto(debug_socket, xbuffer, strlen(xbuffer), 0, (struct sockaddr *)&debug_sin, sizeof(debug_sin)); + return; + } +#endif + if (! fp) + fp = stderr; + fprintf(fp,"%s",xbuffer); + fflush(fp); +#endif +#endif + } +} + +void +debug_printf(int level, const char *module, const int mlen,const char *function, const int flen, int prefix, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + debug_vprintf(level, module, mlen, function, flen, prefix, fmt, ap); + va_end(ap); +} + +void +debug_assert_fail(const char *module, const int mlen,const char *function, const int flen, const char *file, int line, const char *expr) +{ + debug_printf(0,module,mlen,function,flen,1,"%s:%d assertion failed:%s\n", file, line, expr); + abort(); +} + +void +debug_destroy(void) +{ + if (!debug_fp) + return; + if (debug_fp == stderr || debug_fp == stdout) + return; + fclose(debug_fp); + debug_fp = NULL; +} + +void debug_set_logfile(const char *path) +{ + FILE *fp; + fp = fopen(path, "a"); + if (fp) { + debug_destroy(); + debug_fp = fp; + fprintf(debug_fp, "Navit log started\n"); + fflush(debug_fp); + } +} + +struct malloc_head { + int magic; + int size; + char *where; + void *return_address[8]; + struct malloc_head *prev; + struct malloc_head *next; +} *malloc_heads; + +struct malloc_tail { + int magic; +}; + +int mallocs,debug_malloc_size,debug_malloc_size_m; + +void +debug_dump_mallocs(void) +{ + struct malloc_head *head=malloc_heads; + int i; + dbg(0,"mallocs %d\n",mallocs); + while (head) { + fprintf(stderr,"unfreed malloc from %s of size %d\n",head->where,head->size); + for (i = 0 ; i < 8 ; i++) + fprintf(stderr,"\tlist *%p\n",head->return_address[i]); +#if 0 + fprintf(stderr,"%s\n",head+1); +#endif + head=head->next; + } +} + +void * +debug_malloc(const char *where, int line, const char *func, int size) +{ + struct malloc_head *head; + struct malloc_tail *tail; + if (!size) + return NULL; + mallocs++; + debug_malloc_size+=size; + if (debug_malloc_size/(1024*1024) != debug_malloc_size_m) { + debug_malloc_size_m=debug_malloc_size/(1024*1024); + dbg(0,"malloced %d kb\n",debug_malloc_size/1024); + } + head=malloc(size+sizeof(*head)+sizeof(*tail)); + head->magic=0xdeadbeef; + head->size=size; + head->prev=NULL; + head->next=malloc_heads; + malloc_heads=head; + if (head->next) + head->next->prev=head; + head->where=g_strdup_printf("%s:%d %s",where,line,func); +#if !defined (__GNUC__) +#define __builtin_return_address(x) NULL +#endif + head->return_address[0]=__builtin_return_address(0); + head->return_address[1]=__builtin_return_address(1); + head->return_address[2]=__builtin_return_address(2); + head->return_address[3]=__builtin_return_address(3); + head->return_address[4]=__builtin_return_address(4); + head->return_address[5]=__builtin_return_address(5); + head->return_address[6]=__builtin_return_address(6); + head->return_address[7]=__builtin_return_address(7); + head++; + tail=(struct malloc_tail *)((unsigned char *)head+size); + tail->magic=0xdeadbef0; + return head; +} + + +void * +debug_malloc0(const char *where, int line, const char *func, int size) +{ + void *ret=debug_malloc(where, line, func, size); + if (ret) + memset(ret, 0, size); + return ret; +} + +void * +debug_realloc(const char *where, int line, const char *func, void *ptr, int size) +{ + void *ret=debug_malloc(where, line, func, size); + if (ret && ptr) + memcpy(ret, ptr, size); + debug_free(where, line, func, ptr); + return ret; +} + +char * +debug_strdup(const char *where, int line, const char *func, const char *ptr) +{ + int size; + char *ret; + + if (!ptr) + return NULL; + size=strlen(ptr)+1; + ret=debug_malloc(where, line, func, size); + memcpy(ret, ptr, size); + return ret; +} + +char * +debug_guard(const char *where, int line, const char *func, char *str) +{ + char *ret=debug_strdup(where, line, func, str); + g_free(str); + return ret; +} + +void +debug_free(const char *where, int line, const char *func, void *ptr) +{ + struct malloc_head *head; + struct malloc_tail *tail; + if (!ptr) + return; + mallocs--; + head=(struct malloc_head *)((unsigned char *)ptr-sizeof(*head)); + tail=(struct malloc_tail *)((unsigned char *)ptr+head->size); + debug_malloc_size-=head->size; + if (head->magic != 0xdeadbeef || tail->magic != 0xdeadbef0) { + fprintf(stderr,"Invalid free from %s:%d %s\n",where,line,func); + } + head->magic=0; + tail->magic=0; + if (head->prev) + head->prev->next=head->next; + else + malloc_heads=head->next; + if (head->next) + head->next->prev=head->prev; + free(head->where); + free(head); +} + +void +debug_free_func(void *ptr) +{ + debug_free("unknown",0,"unknown",ptr); +} + +void debug_finished(void) { + debug_dump_mallocs(); + g_free(gdb_program); + g_hash_table_destroy(debug_hash); + debug_destroy(); +} + diff --git a/navit/debug.h b/navit/debug.h new file mode 100644 index 0000000..dda8c8d --- /dev/null +++ b/navit/debug.h @@ -0,0 +1,90 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_DEBUG_H +#define NAVIT_DEBUG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#ifdef _MSC_VER +#define __PRETTY_FUNCTION__ __FUNCTION__ +#endif + +extern int debug_level; +#define dbg_str2(x) #x +#define dbg_str1(x) dbg_str2(x) +#define dbg_module dbg_str1(MODULE) +#define dbg(level,...) { if (debug_level >= level) debug_printf(level,dbg_module,strlen(dbg_module),__PRETTY_FUNCTION__, strlen(__PRETTY_FUNCTION__),1,__VA_ARGS__); } +#define dbg_assert(expr) ((expr) ? (void) 0 : debug_assert_fail(dbg_module,strlen(dbg_module),__PRETTY_FUNCTION__, strlen(__PRETTY_FUNCTION__),__FILE__,__LINE__,dbg_str1(expr))) + +#define DEBUG_MODULE_GLOBAL "global" + +#ifdef DEBUG_MALLOC +#undef g_new +#undef g_new0 +#define g_new(type, size) (type *)debug_malloc(__FILE__,__LINE__,__PRETTY_FUNCTION__,sizeof(type)*(size)) +#define g_new0(type, size) (type *)debug_malloc0(__FILE__,__LINE__,__PRETTY_FUNCTION__,sizeof(type)*(size)) +#define g_malloc(size) debug_malloc(__FILE__,__LINE__,__PRETTY_FUNCTION__,(size)) +#define g_malloc0(size) debug_malloc0(__FILE__,__LINE__,__PRETTY_FUNCTION__,(size)) +#define g_realloc(ptr,size) debug_realloc(__FILE__,__LINE__,__PRETTY_FUNCTION__,ptr,(size)) +#define g_free(ptr) debug_free(__FILE__,__LINE__,__PRETTY_FUNCTION__,ptr) +#define g_strdup(ptr) debug_strdup(__FILE__,__LINE__,__PRETTY_FUNCTION__,ptr) +#define g_strdup_printf(fmt...) debug_guard(__FILE__,__LINE__,__PRETTY_FUNCTION__,g_strdup_printf(fmt)) +#define graphics_icon_path(x) debug_guard(__FILE__,__LINE__,__PRETTY_FUNCTION__,graphics_icon_path(x)) +#define dbg_guard(x) debug_guard(__FILE__,__LINE__,__PRETTY_FUNCTION__,x) +#define g_free_func debug_free_func +#else +#define g_free_func g_free +#define dbg_guard(x) x +#endif + +/* prototypes */ +struct attr; +struct debug; +void debug_init(const char *program_name); +void debug_level_set(const char *name, int level); +struct debug *debug_new(struct attr *parent, struct attr **attrs); +int debug_level_get(const char *name); +void debug_vprintf(int level, const char *module, const int mlen, const char *function, const int flen, int prefix, const char *fmt, va_list ap); +void debug_printf(int level, const char *module, const int mlen, const char *function, const int flen, int prefix, const char *fmt, ...); +void debug_assert_fail(const char *module, const int mlen, const char *function, const int flen, const char *file, int line, const char *expr); +void debug_destroy(void); +void debug_set_logfile(const char *path); +void debug_dump_mallocs(void); +void *debug_malloc(const char *where, int line, const char *func, int size); +void *debug_malloc0(const char *where, int line, const char *func, int size); +char *debug_strdup(const char *where, int line, const char *func, const char *ptr); +char *debug_guard(const char *where, int line, const char *func, char *str); +void debug_free(const char *where, int line, const char *func, void *ptr); +void debug_free_func(void *ptr); +void debug_finished(void); +void *debug_realloc(const char *where, int line, const char *func, void *ptr, int size); +/* end of prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/navit/destination.h b/navit/destination.h new file mode 100644 index 0000000..4141183 --- /dev/null +++ b/navit/destination.h @@ -0,0 +1,29 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_DESTINATION_H +#define NAVIT_DESTINATION_H + +/* prototypes */ +struct navit; +int destination_address(struct navit *nav); +/* end of prototypes */ + +#endif + diff --git a/navit/draw_info.h b/navit/draw_info.h new file mode 100644 index 0000000..0a0467f --- /dev/null +++ b/navit/draw_info.h @@ -0,0 +1,30 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_DRAW_INFO_H +#define NAVIT_DRAW_INFO_H + +struct draw_info { + struct container *co; + int display; + int limit; +}; + +#endif + diff --git a/navit/endianess.h b/navit/endianess.h new file mode 100644 index 0000000..2b40470 --- /dev/null +++ b/navit/endianess.h @@ -0,0 +1,113 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ +#ifndef __ENDIANESS_HANDLER__ + + /* The following is based on xorg/xserver/GL/glx/glxbyteorder.h + * which is (c) IBM Corp. 2006,2007 and originally licensed under the following + * BSD-license. All modifications in navit are licensed under the GNU GPL as + * described in file "COPYRIGHT". + * + * Portions also from GNU C Library include/bits/byteswap.h Also licsend + * under the GPL. + * + * -------------------------- + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, THE AUTHORS, AND/OR THEIR SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#if HAVE_BYTESWAP_H + /* machine dependent versions of byte swapping functions. GNU extension.*/ + #include +#if HAVE_ENDIAN_H + #include +#endif +#elif defined(USE_SYS_ENDIAN_H) + #include +#if defined(_BYTE_ORDER) && !defined(__BYTE_ORDER) +#define __BYTE_ORDER _BYTE_ORDER +#define __LITTLE_ENDIAN _LITTLE_ENDIAN +#define __BIG_ENDIAN _BIG_ENDIAN +#endif +#elif defined(__APPLE__) + #include + #define __bswap_16 OSSwapInt16 + #define __bswap_32 OSSwapInt32 + #define __bswap_64 OSSwapInt64 + +#ifndef __BYTE_ORDER + #define __LITTLE_ENDIAN 1234 + #define __BIG_ENDIAN 4321 + + #if defined(__LITTLE_ENDIAN__) + #define __BYTE_ORDER __LITTLE_ENDIAN + #elif defined(__BIG_ENDIAN__) + #define __BYTE_ORDER __BIG_ENDIAN + #else + #error "No endianness defined for Mac OS!" + #endif +#endif + +#elif defined(_WIN32) || defined(__CEGCC__) + #define __BIG_ENDIAN 4321 + #define __LITTLE_ENDIAN 1234 + #define __BYTE_ORDER __LITTLE_ENDIAN +#else + #define __bswap_16(__bsx) ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8)) + #define __bswap_32(__bsx) ((((__bsx) & 0xff000000) >> 24) | \ + (((__bsx) & 0x00ff0000) >> 8) |\ + (((__bsx) & 0x0000ff00) << 8) | \ + (((__bsx) & 0x000000ff) << 24)) + + +#endif + +#if __BYTE_ORDER == __BIG_ENDIAN + #define le16_to_cpu(x) __bswap_16 (x) + #define le32_to_cpu(x) __bswap_32 (x) + #define le64_to_cpu(x) __bswap_64 (x) + #define cpu_to_le16(x) __bswap_16 (x) + #define cpu_to_le32(x) __bswap_32 (x) + #define cpu_to_le64(x) __bswap_64 (x) +#elif __BYTE_ORDER == __LITTLE_ENDIAN + #define le16_to_cpu(x) (x) + #define le32_to_cpu(x) (x) + #define cpu_to_le16(x) (x) + #define cpu_to_le32(x) (x) +#else + #error "Unknown endianess" +#endif + +#define __ENDIANESS_HANDLER__ +#endif + diff --git a/navit/event.c b/navit/event.c new file mode 100644 index 0000000..9ba5d17 --- /dev/null +++ b/navit/event.c @@ -0,0 +1,125 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "event.h" +#include "plugin.h" +#include "debug.h" + +static struct event_methods event_methods; +static const char *e_requestor; +static const char *e_system; + +static int has_quit; + +void event_main_loop_run(void) +{ + if (! event_methods.main_loop_run) { + dbg(0,"no event system set\n"); + return; + } + event_methods.main_loop_run(); +} + +void event_main_loop_quit(void) +{ + if (event_methods.main_loop_quit) + event_methods.main_loop_quit(); + has_quit=1; +} + +int +event_main_loop_has_quit(void) +{ + return has_quit; +} + +struct event_watch * +event_add_watch(void *fd, enum event_watch_cond cond, struct callback *cb) +{ + return event_methods.add_watch(fd, cond, cb); +} + +void +event_remove_watch(struct event_watch *ev) +{ + event_methods.remove_watch(ev); +} + +struct event_timeout * +event_add_timeout(int timeout, int multi, struct callback *cb) +{ + return event_methods.add_timeout(timeout, multi, cb); +} + +void +event_remove_timeout(struct event_timeout *ev) +{ + event_methods.remove_timeout(ev); +} + +struct event_idle * +event_add_idle(int priority, struct callback *cb) +{ + return event_methods.add_idle(priority,cb); +} + +void +event_remove_idle(struct event_idle *ev) +{ + event_methods.remove_idle(ev); +} + +void +event_call_callback(struct callback_list *cb) +{ + event_methods.call_callback(cb); +} + +char const * +event_system(void) +{ + return e_system; +} + +int +event_request_system(const char *system, const char *requestor) +{ + void (*event_type_new)(struct event_methods *meth); + if (e_system) { + if (strcmp(e_system, system)) { + dbg(0,"system '%s' already requested by '%s', can't set to '%s' as requested from '%s'\n", e_system, e_requestor, system, requestor); + return 0; + } + return 1; + } + event_type_new=plugin_get_event_type(system); + if (! event_type_new) { + dbg(0,"unsupported event system '%s' requested from '%s'\n", system, requestor); + return 0; + } + event_type_new(&event_methods); + e_system=system; + e_requestor=requestor; + + return 1; +} + + diff --git a/navit/event.h b/navit/event.h new file mode 100644 index 0000000..b67bcbd --- /dev/null +++ b/navit/event.h @@ -0,0 +1,72 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +struct event_idle; +struct event_timeout; +struct event_watch; +struct callback; +struct callback_list; +struct file; + +enum event_watch_cond { + event_watch_cond_read=1, + event_watch_cond_write, + event_watch_cond_except, +}; + +struct event_methods { + void (*main_loop_run)(void); + void (*main_loop_quit)(void); + struct event_watch *(*add_watch)(void *fd, enum event_watch_cond cond, struct callback *cb); + void (*remove_watch)(struct event_watch *ev); + struct event_timeout *(*add_timeout)(int timeout, int multi, struct callback *cb); + void (*remove_timeout)(struct event_timeout *ev); + struct event_idle *(*add_idle)(int priority, struct callback *cb); + void (*remove_idle)(struct event_idle *ev); + void (*call_callback)(struct callback_list *cb); +}; + + +/* prototypes */ +enum event_watch_cond; +struct callback; +struct callback_list; +struct event_idle; +struct event_timeout; +struct event_watch; +void event_main_loop_run(void); +void event_main_loop_quit(void); +int event_main_loop_has_quit(void); +struct event_watch *event_add_watch(void *fd, enum event_watch_cond cond, struct callback *cb); +void event_remove_watch(struct event_watch *ev); +struct event_timeout *event_add_timeout(int timeout, int multi, struct callback *cb); +void event_remove_timeout(struct event_timeout *ev); +struct event_idle *event_add_idle(int priority, struct callback *cb); +void event_remove_idle(struct event_idle *ev); +void event_call_callback(struct callback_list *cb); +char const *event_system(void); +int event_request_system(const char *system, const char *requestor); +/* end of prototypes */ +#ifdef __cplusplus +} +#endif diff --git a/navit/event_glib.c b/navit/event_glib.c new file mode 100644 index 0000000..136f54d --- /dev/null +++ b/navit/event_glib.c @@ -0,0 +1,199 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include "event.h" +#include "event_glib.h" +#include "debug.h" +#include "callback.h" +#include "plugin.h" + +static GMainLoop *loop; + +static void event_glib_main_loop_run(void) +{ + loop = g_main_loop_new (NULL, TRUE); + if (g_main_loop_is_running (loop)) + { + g_main_loop_run (loop); + } +} + +static void event_glib_main_loop_quit(void) +{ + if (loop) { + g_main_loop_quit(loop); + g_main_loop_unref(loop); + } + +} + +struct event_watch { + GIOChannel *iochan; + guint source; +}; + +static gboolean +event_glib_call_watch(GIOChannel * iochan, GIOCondition condition, gpointer t) +{ + struct callback *cb=t; + callback_call_0(cb); + return TRUE; +} + +static struct event_watch * +event_glib_add_watch(void *fd, enum event_watch_cond cond, struct callback *cb) +{ + struct event_watch *ret=g_new0(struct event_watch, 1); + int flags=0; + ret->iochan = g_io_channel_unix_new(GPOINTER_TO_INT(fd)); + switch (cond) { + case event_watch_cond_read: + flags=G_IO_IN; + break; + case event_watch_cond_write: + flags=G_IO_OUT; + break; + case event_watch_cond_except: + flags=G_IO_ERR|G_IO_HUP; + break; + } + ret->source = g_io_add_watch(ret->iochan, flags, event_glib_call_watch, (gpointer)cb); + return ret; +} + +static void +event_glib_remove_watch(struct event_watch *ev) +{ + if (! ev) + return; + g_source_remove(ev->source); + g_io_channel_unref(ev->iochan); + g_free(ev); +} + +struct event_timeout { + guint source; + struct callback *cb; +}; + +static gboolean +event_glib_call_timeout_single(struct event_timeout *ev) +{ + callback_call_0(ev->cb); + g_free(ev); + return FALSE; +} + +static gboolean +event_glib_call_timeout_multi(struct event_timeout *ev) +{ + callback_call_0(ev->cb); + return TRUE; +} + + +static struct event_timeout * +event_glib_add_timeout(int timeout, int multi, struct callback *cb) +{ + struct event_timeout *ret=g_new0(struct event_timeout, 1); + ret->cb=cb; + ret->source = g_timeout_add(timeout, multi ? (GSourceFunc)event_glib_call_timeout_multi : (GSourceFunc)event_glib_call_timeout_single, (gpointer)ret); + + return ret; +} + +static void +event_glib_remove_timeout(struct event_timeout *ev) +{ + if (! ev) + return; + g_source_remove(ev->source); + g_free(ev); +} + +struct event_idle { + guint source; + struct callback *cb; +}; + +static gboolean +event_glib_call_idle(struct event_idle *ev) +{ + callback_call_0(ev->cb); + return TRUE; +} + +static struct event_idle * +event_glib_add_idle(int priority, struct callback *cb) +{ + struct event_idle *ret=g_new0(struct event_idle, 1); + ret->cb=cb; + ret->source = g_idle_add_full(priority+100, (GSourceFunc)event_glib_call_idle, (gpointer)ret, NULL); + return ret; +} + +static void +event_glib_remove_idle(struct event_idle *ev) +{ + if (! ev) + return; + g_source_remove(ev->source); + g_free(ev); +} + +static void +event_glib_call_callback(struct callback_list *cb) +{ +/* + Idea for implementation: + Create a pipe then use add_watch + add callback to a queue + from here write to the pipe to wakeup the pool + then from the gui thread process the callback queue +*/ +} + +static struct event_methods event_glib_methods = { + event_glib_main_loop_run, + event_glib_main_loop_quit, + event_glib_add_watch, + event_glib_remove_watch, + event_glib_add_timeout, + event_glib_remove_timeout, + event_glib_add_idle, + event_glib_remove_idle, + event_glib_call_callback, +}; + +struct event_priv { +}; + +static struct event_priv* +event_glib_new(struct event_methods *meth) +{ + *meth=event_glib_methods; + return (struct event_priv *)event_glib_new; +} + +void +event_glib_init(void) +{ + plugin_register_event_type("glib", event_glib_new); +} diff --git a/navit/event_glib.h b/navit/event_glib.h new file mode 100644 index 0000000..9f9b2f5 --- /dev/null +++ b/navit/event_glib.h @@ -0,0 +1,3 @@ +/* prototypes */ +void event_glib_init(void); +/* end of prototypes */ diff --git a/navit/fib-1.1/Makefile.am b/navit/fib-1.1/Makefile.am new file mode 100644 index 0000000..7c7b2a1 --- /dev/null +++ b/navit/fib-1.1/Makefile.am @@ -0,0 +1,3 @@ +noinst_LTLIBRARIES = libfib.la +libfib_la_SOURCES = fib.c fib.h fibpriv.h +EXTRA_DIST=README configure.in fh_extractmin.3 fh_makeheap.3 fh_makekeyheap.3 fibtest.c fibtest2.c tt.c use.c diff --git a/navit/fib-1.1/Makefile.in b/navit/fib-1.1/Makefile.in new file mode 100644 index 0000000..409f45a --- /dev/null +++ b/navit/fib-1.1/Makefile.in @@ -0,0 +1,622 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = navit/fib-1.1 +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libfib_la_LIBADD = +am_libfib_la_OBJECTS = fib.lo +libfib_la_OBJECTS = $(am_libfib_la_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libfib_la_SOURCES) +DIST_SOURCES = $(libfib_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +noinst_LTLIBRARIES = libfib.la +libfib_la_SOURCES = fib.c fib.h fibpriv.h +EXTRA_DIST = README configure.in fh_extractmin.3 fh_makeheap.3 fh_makekeyheap.3 fibtest.c fibtest2.c tt.c use.c +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/fib-1.1/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/fib-1.1/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libfib.la: $(libfib_la_OBJECTS) $(libfib_la_DEPENDENCIES) + $(LINK) $(libfib_la_OBJECTS) $(libfib_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fib.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/fib-1.1/README b/navit/fib-1.1/README new file mode 100644 index 0000000..eabcd5f --- /dev/null +++ b/navit/fib-1.1/README @@ -0,0 +1,26 @@ +Version 1.1 now supports increasing the key using the fh_replace* +functions. Previously it would simply return NULL when you tried to +increase the key. It also improves performance slightly by only calling +checkcons when we are about to use it, at extract, instead of calling it +on every insert. + +I have now fixed fh_union and it properly updates the minimum. + +Thanks to Ryan Earl for pointing out that in fh_consolidate, it is VERY +time consuming to constantly malloc/free an array of pointers. The array +is small enough that simply reallocating when more pointers are needed +is ok. + +Thanks to Thomas Eschbach and Wolfgang Guenther who have pointed out bugs +with my code. Wolfgang Guenther provided a fix which put in on the correct +track for where the bug was. They have also provided a few test programs +that exhibited other bugs which I have now integrated into my source so +that you can easily regress test the library. + +I have reciently completed a review of the code. I have made a number +of improvements with a few minor interface changes. There is another +improvement to the rh_replace* family of functions to help eliminate +redundant code. + +I'm still planning on writing a type safe memory allocator for use with +the code instead of using malloc to hopefully improve performance slightly. diff --git a/navit/fib-1.1/configure.in b/navit/fib-1.1/configure.in new file mode 100644 index 0000000..8270152 --- /dev/null +++ b/navit/fib-1.1/configure.in @@ -0,0 +1,17 @@ +dnl Process this file with autoconf to produce a configure script. +AC_INIT(fib.c) + +dnl Checks for programs. + +dnl Checks for libraries. + +dnl Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADERS(limits.h) + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_INLINE + +dnl Checks for library functions. + +AC_OUTPUT(Makefile) diff --git a/navit/fib-1.1/fh_extractmin.3 b/navit/fib-1.1/fh_extractmin.3 new file mode 100644 index 0000000..e1492b4 --- /dev/null +++ b/navit/fib-1.1/fh_extractmin.3 @@ -0,0 +1,97 @@ +.TH FH_EXTRACTMIN 3 "29 Mar 2000" "libfib" +.SH NAME +fh_extractmin \- extract minimum element from a Fibonacci Heap +.SH SYNOPSIS +#include +.PP +void * +.PD 0 +.HP 8 +.BR fh_extractmin "(struct fibheap *heap)" +.PD +.PP +void * +.PD 0 +.HP 8 +.BR fh_min "(struct fibheap *heap)" +.PD +.PP +void * +.PD 0 +.HP 8 +.BR fh_replacedata "(struct fibheap *heap, struct fibheap_el *elem, void *data)" +.PD +.PP +void * +.PD 0 +.HP 8 +.BR fh_delete "(struct fibheap *heap, struct fibheap_el *elem)" +.PD +.PP +void +.PD 0 +.HP 8 +.BR fh_deleteheap "(struct fibheap *heap)" +.PD +.PP +struct fibheap * +.PD 0 +.HP 8 +.BR fh_union "(struct fibheap *heapa, struct fibheap *heapb)" +.PD +.SH DESCRIPTION +These functions are shared between both key heaps and normal heaps. +.PP +Once a +.B elem +pointer has been passed to +.BR fh_delete (3) +that +.B elem +pointer may be reused to store another datum. +You should make sure that you destroy any copies of the pointer. +.SH RETURN VALUES +The +.B fh_extractmin +function returns the value of +.B data +that is the minimum element and removes it from the heap. +.PP +The +.B fh_min +function returns the current minimum element but does +.I not +remove it from the heap. +.PP +The +.B fh_replacedata +replaces the data in +.B elem +and returns the old data. +.PP +The +.B fh_delete +function removes +.B elem +from the heap, and returns the +.B data +that was stored in the element. +.PP +The +.B fh_deleteheap +complete destroys the heap. It does not free any user supplied +.B data +elements stored in the heap. +.PP +The +.B fh_union +function returns the union of the two heaps +.B heapa +and +.BR heapb . +.SH SEE ALSO +.BR fh_makeheap (3), +.BR fh_makekeyheap (3) +.SH AUTHORS +This library and man page was writen by John-Mark Gurney . +.SH BUGS diff --git a/navit/fib-1.1/fh_makeheap.3 b/navit/fib-1.1/fh_makeheap.3 new file mode 100644 index 0000000..bd867cd --- /dev/null +++ b/navit/fib-1.1/fh_makeheap.3 @@ -0,0 +1,17 @@ +.TH FH_MAKEHEAP 3 "29 Mar 2000" "libfib" +.SH NAME +fh_makeheap \- make a Fibonacci Heap +.SH SYNOPSIS +.nf +#include +.PP +struct fibheap * +.BR fh_makeheap (void) +.fi +.SH DESCRIPTION +.SH RETURN VALUES +.SH FILES +.SH SEE ALSO +.SH AUTHORS +This library and man page was writen by John-Mark Gurney . +.SH BUGS diff --git a/navit/fib-1.1/fh_makekeyheap.3 b/navit/fib-1.1/fh_makekeyheap.3 new file mode 100644 index 0000000..f55d430 --- /dev/null +++ b/navit/fib-1.1/fh_makekeyheap.3 @@ -0,0 +1,84 @@ +.TH FH_MAKEKEYHEAP 3 "29 Mar 2000" "libfib" +.SH NAME +fh_makekeyheap \- make a Fibonacci key Heap +.SH SYNOPSIS +#include +.PP +struct fibheap * +.PD 0 +.HP 8 +.BR fh_makekeyheap (void) +.PD +.PP +struct fibheap_el * +.PD 0 +.HP 8 +.BR fh_insertkey "(struct fibheap *heap, int key, void *data)" +.PD +.PP +int +.PD 0 +.HP 8 +.BR fh_minkey "(struct fibheap *heap)" +.PD +.PP +void * +.PD 0 +.HP 8 +.BR fh_replacekey "(struct fibheap *heap, struct fibheap_el *elem, int key)" +.PD +.PP +void * +.PD 0 +.HP 8 +.BR fh_replacekeydata "(struct fibheap *heap, struct fibheap_el *elem, int key, void *data)" +.PD +.SH DESCRIPTION +The +.B fh_makekeyheap +function makes a Fibonacci heap which does ordering based on an +integer key that is given in addition to the data. +This menthod is useful so that you can eliminate the need to call +a comparision function to order the data in the heap. +.PP +The pointer to the structure +.B fibheap +returned by +.B fh_makekeyheap +is an opaque structure. The the pointer can only be passed to other +functions in the +.B libfib +library. +.PP +The +.B fh_insertkey +function inserts the +.B data +element into the heap with a value of +.BR key . +The pointer returned can be used in calls to functions like +.BR fh_delete (3) +to delete the key from the heap before it gets extracted via +.BR fh_extractmin (3). +.SH RETURN VALUES +The +.B fh_makekeyheap +function returns a pointer to a heap structure used to insert and extract +data elements. +.PP +The +.B fh_insertkey +functions returns a pointer to a heap element structure which can be used +to manimulate that data element in the heap. +.PP +The +.B fh_minkey +function returns the integer key of the data at the top of the heap. If you would like to view the data, see +.BR fh_min (3). +.SH SEE ALSO +.BR fh_extractmin (3) +.SH AUTHORS +This library and man page was writen by John-Mark Gurney . +.SH BUGS +A key heap does not provide a way for handling key collitions and deffering +decission to a user provided function to resolve colissions. diff --git a/navit/fib-1.1/fib.c b/navit/fib-1.1/fib.c new file mode 100644 index 0000000..cf74514 --- /dev/null +++ b/navit/fib-1.1/fib.c @@ -0,0 +1,699 @@ +/*- + * Copyright 1997-2003 John-Mark Gurney. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: fib.c,v 1.2 2007-07-04 22:44:39 martin-s Exp $ + * + */ + +#include +#include + +#include +#include + +#define swap(type, a, b) \ + do { \ + type c; \ + c = a; \ + a = b; \ + b = c; \ + } while (0) \ + +#define INT_BITS (sizeof(int) * 8) +static int +ceillog2(unsigned int a) +{ + int oa; + int i; + int b; + + oa = a; + b = INT_BITS / 2; + i = 0; + while (b) { + i = (i << 1); + if (a >= (1 << b)) { + a /= (1 << b); + i = i | 1; + } else + a &= (1 << b) - 1; + b /= 2; + } + if ((1 << i) == oa) + return i; + else + return i + 1; +} + +/* + * Private Heap Functions + */ +static void +fh_deleteel(struct fibheap *h, struct fibheap_el *x) +{ + void *data; + int key; + + data = x->fhe_data; + key = x->fhe_key; + + if (!h->fh_keys) + fh_replacedata(h, x, h->fh_neginf); + else + fh_replacekey(h, x, INT_MIN); + if (fh_extractminel(h) != x) { + /* + * XXX - This should never happen as fh_replace should set it + * to min. + */ + abort(); + } + + x->fhe_data = data; + x->fhe_key = key; +} + +static void +fh_initheap(struct fibheap *new) +{ + new->fh_cmp_fnct = NULL; + new->fh_neginf = NULL; + new->fh_n = 0; + new->fh_Dl = -1; + new->fh_cons = NULL; + new->fh_min = NULL; + new->fh_root = NULL; + new->fh_keys = 0; +#ifdef FH_STATS + new->fh_maxn = 0; + new->fh_ninserts = 0; + new->fh_nextracts = 0; +#endif +} + +static void +fh_destroyheap(struct fibheap *h) +{ + h->fh_cmp_fnct = NULL; + h->fh_neginf = NULL; + if (h->fh_cons != NULL) + free(h->fh_cons); + h->fh_cons = NULL; + free(h); +} + +/* + * Public Heap Functions + */ +struct fibheap * +fh_makekeyheap() +{ + struct fibheap *n; + + if ((n = malloc(sizeof *n)) == NULL) + return NULL; + + fh_initheap(n); + n->fh_keys = 1; + + return n; +} + +struct fibheap * +fh_makeheap() +{ + struct fibheap *n; + + if ((n = malloc(sizeof *n)) == NULL) + return NULL; + + fh_initheap(n); + + return n; +} + +voidcmp +fh_setcmp(struct fibheap *h, voidcmp fnct) +{ + voidcmp oldfnct; + + oldfnct = h->fh_cmp_fnct; + h->fh_cmp_fnct = fnct; + + return oldfnct; +} + +void * +fh_setneginf(struct fibheap *h, void *data) +{ + void *old; + + old = h->fh_neginf; + h->fh_neginf = data; + + return old; +} + +struct fibheap * +fh_union(struct fibheap *ha, struct fibheap *hb) +{ + struct fibheap_el *x; + + if (ha->fh_root == NULL || hb->fh_root == NULL) { + /* either one or both are empty */ + if (ha->fh_root == NULL) { + fh_destroyheap(ha); + return hb; + } else { + fh_destroyheap(hb); + return ha; + } + } + ha->fh_root->fhe_left->fhe_right = hb->fh_root; + hb->fh_root->fhe_left->fhe_right = ha->fh_root; + x = ha->fh_root->fhe_left; + ha->fh_root->fhe_left = hb->fh_root->fhe_left; + hb->fh_root->fhe_left = x; + ha->fh_n += hb->fh_n; + /* + * we probably should also keep stats on number of unions + */ + + /* set fh_min if necessary */ + if (fh_compare(ha, hb->fh_min, ha->fh_min) < 0) + ha->fh_min = hb->fh_min; + + fh_destroyheap(hb); + return ha; +} + +void +fh_deleteheap(struct fibheap *h) +{ + /* + * We could do this even faster by walking each binomial tree, but + * this is simpler to code. + */ + while (h->fh_min != NULL) + fhe_destroy(fh_extractminel(h)); + + fh_destroyheap(h); +} + +/* + * Public Key Heap Functions + */ +struct fibheap_el * +fh_insertkey(struct fibheap *h, int key, void *data) +{ + struct fibheap_el *x; + + if ((x = fhe_newelem()) == NULL) + return NULL; + + /* just insert on root list, and make sure it's not the new min */ + x->fhe_data = data; + x->fhe_key = key; + + fh_insertel(h, x); + + return x; +} + +int +fh_minkey(struct fibheap *h) +{ + if (h->fh_min == NULL) + return INT_MIN; + return h->fh_min->fhe_key; +} + +int +fh_replacekey(struct fibheap *h, struct fibheap_el *x, int key) +{ + int ret; + + ret = x->fhe_key; + (void)fh_replacekeydata(h, x, key, x->fhe_data); + + return ret; +} + +#include + +void * +fh_replacekeydata(struct fibheap *h, struct fibheap_el *x, int key, void *data) +{ + void *odata; + int okey; + struct fibheap_el *y; + int r; + + odata = x->fhe_data; + okey = x->fhe_key; + + /* + * we can increase a key by deleting and reinserting, that + * requires O(lgn) time. + */ + if ((r = fh_comparedata(h, key, data, x)) > 0) { + printf("fh_comparedata r=%d key=%d data=%p\n", r, key, data); + /* XXX - bad code! */ + abort(); + fh_deleteel(h, x); + + x->fhe_data = data; + x->fhe_key = key; + + fh_insertel(h, x); + + return odata; + } + + x->fhe_data = data; + x->fhe_key = key; + + /* because they are equal, we don't have to do anything */ + if (r == 0) + return odata; + + y = x->fhe_p; + + if (h->fh_keys && okey == key) + return odata; + + if (y != NULL && fh_compare(h, x, y) <= 0) { + fh_cut(h, x, y); + fh_cascading_cut(h, y); + } + + /* + * the = is so that the call from fh_delete will delete the proper + * element. + */ + if (fh_compare(h, x, h->fh_min) <= 0) + h->fh_min = x; + + return odata; +} + +/* + * Public void * Heap Functions + */ +/* + * this will return these values: + * NULL failed for some reason + * ptr token to use for manipulation of data + */ +struct fibheap_el * +fh_insert(struct fibheap *h, void *data) +{ + struct fibheap_el *x; + + if ((x = fhe_newelem()) == NULL) + return NULL; + + /* just insert on root list, and make sure it's not the new min */ + x->fhe_data = data; + + fh_insertel(h, x); + + return x; +} + +void * +fh_min(struct fibheap *h) +{ + if (h->fh_min == NULL) + return NULL; + return h->fh_min->fhe_data; +} + +void * +fh_extractmin(struct fibheap *h) +{ + struct fibheap_el *z; + void *ret; + + ret = NULL; + + if (h->fh_min != NULL) { + z = fh_extractminel(h); + ret = z->fhe_data; +#ifndef NO_FREE + fhe_destroy(z); +#endif + + } + + return ret; +} + +void * +fh_replacedata(struct fibheap *h, struct fibheap_el *x, void *data) +{ + return fh_replacekeydata(h, x, x->fhe_key, data); +} + +void * +fh_delete(struct fibheap *h, struct fibheap_el *x) +{ + void *k; + + k = x->fhe_data; + if (!h->fh_keys) + fh_replacedata(h, x, h->fh_neginf); + else + fh_replacekey(h, x, INT_MIN); + fh_extractmin(h); + + return k; +} + +/* + * Statistics Functions + */ +#ifdef FH_STATS +int +fh_maxn(struct fibheap *h) +{ + return h->fh_maxn; +} + +int +fh_ninserts(struct fibheap *h) +{ + return h->fh_ninserts; +} + +int +fh_nextracts(struct fibheap *h) +{ + return h->fh_nextracts; +} +#endif + +/* + * begin of private element fuctions + */ +static struct fibheap_el * +fh_extractminel(struct fibheap *h) +{ + struct fibheap_el *ret; + struct fibheap_el *x, *y, *orig; + + ret = h->fh_min; + + orig = NULL; + /* put all the children on the root list */ + /* for true consistancy, we should use fhe_remove */ + for(x = ret->fhe_child; x != orig && x != NULL;) { + if (orig == NULL) + orig = x; + y = x->fhe_right; + x->fhe_p = NULL; + fh_insertrootlist(h, x); + x = y; + } + /* remove minimum from root list */ + fh_removerootlist(h, ret); + h->fh_n--; + + /* if we aren't empty, consolidate the heap */ + if (h->fh_n == 0) + h->fh_min = NULL; + else { + h->fh_min = ret->fhe_right; + fh_consolidate(h); + } + +#ifdef FH_STATS + h->fh_nextracts++; +#endif + + return ret; +} + +static void +fh_insertrootlist(struct fibheap *h, struct fibheap_el *x) +{ + if (h->fh_root == NULL) { + h->fh_root = x; + x->fhe_left = x; + x->fhe_right = x; + return; + } + + fhe_insertafter(h->fh_root, x); +} + +static void +fh_removerootlist(struct fibheap *h, struct fibheap_el *x) +{ + if (x->fhe_left == x) + h->fh_root = NULL; + else + h->fh_root = fhe_remove(x); +} + +static void +fh_consolidate(struct fibheap *h) +{ + struct fibheap_el **a; + struct fibheap_el *w; + struct fibheap_el *y; + struct fibheap_el *x; + int i; + int d; + int D; + + fh_checkcons(h); + + /* assign a the value of h->fh_cons so I don't have to rewrite code */ + D = h->fh_Dl + 1; + a = h->fh_cons; + + for (i = 0; i < D; i++) + a[i] = NULL; + + while ((w = h->fh_root) != NULL) { + x = w; + fh_removerootlist(h, w); + d = x->fhe_degree; + /* XXX - assert that d < D */ + while(a[d] != NULL) { + y = a[d]; + if (fh_compare(h, x, y) > 0) + swap(struct fibheap_el *, x, y); + fh_heaplink(h, y, x); + a[d] = NULL; + d++; + } + a[d] = x; + } + h->fh_min = NULL; + for (i = 0; i < D; i++) + if (a[i] != NULL) { + fh_insertrootlist(h, a[i]); + if (h->fh_min == NULL || fh_compare(h, a[i], + h->fh_min) < 0) + h->fh_min = a[i]; + } +} + +static void +fh_heaplink(struct fibheap *h, struct fibheap_el *y, struct fibheap_el *x) +{ + /* make y a child of x */ + if (x->fhe_child == NULL) + x->fhe_child = y; + else + fhe_insertbefore(x->fhe_child, y); + y->fhe_p = x; + x->fhe_degree++; + y->fhe_mark = 0; +} + +static void +fh_cut(struct fibheap *h, struct fibheap_el *x, struct fibheap_el *y) +{ + fhe_remove(x); + y->fhe_degree--; + fh_insertrootlist(h, x); + x->fhe_p = NULL; + x->fhe_mark = 0; +} + +static void +fh_cascading_cut(struct fibheap *h, struct fibheap_el *y) +{ + struct fibheap_el *z; + + while ((z = y->fhe_p) != NULL) { + if (y->fhe_mark == 0) { + y->fhe_mark = 1; + return; + } else { + fh_cut(h, y, z); + y = z; + } + } +} + +/* + * begining of handling elements of fibheap + */ +static struct fibheap_el * +fhe_newelem() +{ + struct fibheap_el *e; + + if ((e = malloc(sizeof *e)) == NULL) + return NULL; + + fhe_initelem(e); + + return e; +} + +static void +fhe_initelem(struct fibheap_el *e) +{ + e->fhe_degree = 0; + e->fhe_mark = 0; + e->fhe_p = NULL; + e->fhe_child = NULL; + e->fhe_left = e; + e->fhe_right = e; + e->fhe_data = NULL; +} + +static void +fhe_insertafter(struct fibheap_el *a, struct fibheap_el *b) +{ + if (a == a->fhe_right) { + a->fhe_right = b; + a->fhe_left = b; + b->fhe_right = a; + b->fhe_left = a; + } else { + b->fhe_right = a->fhe_right; + a->fhe_right->fhe_left = b; + a->fhe_right = b; + b->fhe_left = a; + } +} + +static void +fhe_insertbefore(struct fibheap_el *a, struct fibheap_el *b) +{ + fhe_insertafter(a->fhe_left, b); +} + +static struct fibheap_el * +fhe_remove(struct fibheap_el *x) +{ + struct fibheap_el *ret; + + if (x == x->fhe_left) + ret = NULL; + else + ret = x->fhe_left; + + /* fix the parent pointer */ + if (x->fhe_p != NULL && x->fhe_p->fhe_child == x) + x->fhe_p->fhe_child = ret; + + x->fhe_right->fhe_left = x->fhe_left; + x->fhe_left->fhe_right = x->fhe_right; + + /* clear out hanging pointers */ + x->fhe_p = NULL; + x->fhe_left = x; + x->fhe_right = x; + + return ret; +} + +static void +fh_checkcons(struct fibheap *h) +{ + int oDl; + + /* make sure we have enough memory allocated to "reorganize" */ + if (h->fh_Dl == -1 || h->fh_n > (1 << h->fh_Dl)) { + oDl = h->fh_Dl; + if ((h->fh_Dl = ceillog2(h->fh_n) + 1) < 8) + h->fh_Dl = 8; + if (oDl != h->fh_Dl) + h->fh_cons = (struct fibheap_el **)realloc(h->fh_cons, + sizeof *h->fh_cons * (h->fh_Dl + 1)); + if (h->fh_cons == NULL) + abort(); + } +} + +static int +fh_compare(struct fibheap *h, struct fibheap_el *a, struct fibheap_el *b) +{ + if (h->fh_keys) { + if (a->fhe_key < b->fhe_key) + return -1; + if (a->fhe_key == b->fhe_key) + return 0; + return 1; + } else + return h->fh_cmp_fnct(a->fhe_data, b->fhe_data); +} + +static int +fh_comparedata(struct fibheap *h, int key, void *data, struct fibheap_el *b) +{ + struct fibheap_el a; + + a.fhe_key = key; + a.fhe_data = data; + + return fh_compare(h, &a, b); +} + +static void +fh_insertel(struct fibheap *h, struct fibheap_el *x) +{ + fh_insertrootlist(h, x); + + if (h->fh_min == NULL || (h->fh_keys ? x->fhe_key < h->fh_min->fhe_key + : h->fh_cmp_fnct(x->fhe_data, h->fh_min->fhe_data) < 0)) + h->fh_min = x; + + h->fh_n++; + +#ifdef FH_STATS + if (h->fh_n > h->fh_maxn) + h->fh_maxn = h->fh_n; + h->fh_ninserts++; +#endif + +} diff --git a/navit/fib-1.1/fib.h b/navit/fib-1.1/fib.h new file mode 100644 index 0000000..d8564d3 --- /dev/null +++ b/navit/fib-1.1/fib.h @@ -0,0 +1,64 @@ +/*- + * Copyright 1997, 1998-2003 John-Mark Gurney. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: fib.h,v 1.1 2005-12-02 10:41:56 martin-s Exp $ + * + */ + +#ifndef _FIB_H_ +#define _FIB_H_ + +struct fibheap; +struct fibheap_el; +typedef int (*voidcmp)(void *, void *); + +/* functions for key heaps */ +struct fibheap *fh_makekeyheap(void); +struct fibheap_el *fh_insertkey(struct fibheap *, int, void *); +int fh_minkey(struct fibheap *); +int fh_replacekey(struct fibheap *, struct fibheap_el *, int); +void *fh_replacekeydata(struct fibheap *, struct fibheap_el *, int, void *); + +/* functions for void * heaps */ +struct fibheap *fh_makeheap(void); +voidcmp fh_setcmp(struct fibheap *, voidcmp); +void *fh_setneginf(struct fibheap *, void *); +struct fibheap_el *fh_insert(struct fibheap *, void *); + +/* shared functions */ +void *fh_extractmin(struct fibheap *); +void *fh_min(struct fibheap *); +void *fh_replacedata(struct fibheap *, struct fibheap_el *, void *); +void *fh_delete(struct fibheap *, struct fibheap_el *); +void fh_deleteheap(struct fibheap *); +struct fibheap *fh_union(struct fibheap *, struct fibheap *); + +#ifdef FH_STATS +int fh_maxn(struct fibheap *); +int fh_ninserts(struct fibheap *); +int fh_nextracts(struct fibheap *); +#endif + +#endif /* _FIB_H_ */ diff --git a/navit/fib-1.1/fibpriv.h b/navit/fib-1.1/fibpriv.h new file mode 100644 index 0000000..a1f1735 --- /dev/null +++ b/navit/fib-1.1/fibpriv.h @@ -0,0 +1,98 @@ +/*- + * Copyright 1997, 1999-2003 John-Mark Gurney. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: fibpriv.h,v 1.1 2005-12-02 10:41:56 martin-s Exp $ + * + */ + +#ifndef _FIBPRIV_H_ +#define _FIBPRIV_H_ + +struct fibheap_el; + +/* + * global heap operations + */ +struct fibheap { + int (*fh_cmp_fnct)(void *, void *); + int fh_n; + int fh_Dl; + struct fibheap_el **fh_cons; + struct fibheap_el *fh_min; + struct fibheap_el *fh_root; + void *fh_neginf; + int fh_keys : 1; +#ifdef FH_STATS + int fh_maxn; + int fh_ninserts; + int fh_nextracts; +#endif +}; + +static void fh_initheap(struct fibheap *); +static void fh_insertrootlist(struct fibheap *, struct fibheap_el *); +static void fh_removerootlist(struct fibheap *, struct fibheap_el *); +static void fh_consolidate(struct fibheap *); +static void fh_heaplink(struct fibheap *h, struct fibheap_el *y, + struct fibheap_el *x); +static void fh_cut(struct fibheap *, struct fibheap_el *, struct fibheap_el *); +static void fh_cascading_cut(struct fibheap *, struct fibheap_el *); +static struct fibheap_el *fh_extractminel(struct fibheap *); +static void fh_checkcons(struct fibheap *h); +static void fh_destroyheap(struct fibheap *h); +static int fh_compare(struct fibheap *h, struct fibheap_el *a, + struct fibheap_el *b); +static int fh_comparedata(struct fibheap *h, int key, void *data, + struct fibheap_el *b); +static void fh_insertel(struct fibheap *h, struct fibheap_el *x); +static void fh_deleteel(struct fibheap *h, struct fibheap_el *x); + +/* + * specific node operations + */ +struct fibheap_el { + int fhe_degree; + int fhe_mark; + struct fibheap_el *fhe_p; + struct fibheap_el *fhe_child; + struct fibheap_el *fhe_left; + struct fibheap_el *fhe_right; + int fhe_key; + void *fhe_data; +}; + +static struct fibheap_el *fhe_newelem(void); +static void fhe_initelem(struct fibheap_el *); +static void fhe_insertafter(struct fibheap_el *a, struct fibheap_el *b); +static void fhe_insertbefore(struct fibheap_el *a, struct fibheap_el *b); +static struct fibheap_el *fhe_remove(struct fibheap_el *a); +#define fhe_destroy(x) free((x)) + +/* + * general functions + */ +static int ceillog2(unsigned int a); + +#endif /* _FIBPRIV_H_ */ diff --git a/navit/fib-1.1/fibtest.c b/navit/fib-1.1/fibtest.c new file mode 100644 index 0000000..3651008 --- /dev/null +++ b/navit/fib-1.1/fibtest.c @@ -0,0 +1,108 @@ +/*- + * Copyright 1997, 1998-2003 John-Mark Gurney. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + +*/ + + +#include +#include +#include "fib.h" + +int main(void) +{ + struct fibheap *a; + void *arr[10]; + int i; + + a = fh_makekeyheap(); + + for (i=1 ; i < 10 ; i++) + { + arr[i]= fh_insertkey(a,0,(void *)i); + printf("adding: 0 %d \n",i); + } + + printf(" \n"); + fh_replacekey(a, arr[1],-1); + fh_replacekey(a, arr[6],-1); + fh_replacekey(a, arr[4],-1); + fh_replacekey(a, arr[2],-1); + fh_replacekey(a, arr[8],-1); + + printf("value(minkey) %d\n",fh_minkey(a)); + printf("id: %d\n\n", (int)fh_extractmin(a)); + + fh_replacekey(a, arr[7],-33); +/* -> node 7 becomes root node, but is still pointed to by node 6 */ + fh_replacekey(a, arr[4],-36); + fh_replacekey(a, arr[3],-1); + fh_replacekey(a, arr[9],-81); + + printf("value(minkey) %d\n",fh_minkey(a)); + printf("id: %d\n\n", (int)fh_extractmin(a)); + + fh_replacekey(a, arr[6],-68); + fh_replacekey(a, arr[2],-69); + + printf("value(minkey) %d\n",fh_minkey(a)); + printf("id: %d\n\n", (int)fh_extractmin(a)); + + fh_replacekey(a, arr[1],-52); + fh_replacekey(a, arr[3],-2); + fh_replacekey(a, arr[4],-120); + fh_replacekey(a, arr[5],-48); + + printf("value(minkey) %d\n",fh_minkey(a)); + printf("id: %d\n\n", (int)fh_extractmin(a)); + + fh_replacekey(a, arr[3],-3); + fh_replacekey(a, arr[5],-63); + + printf("value(minkey) %d\n",fh_minkey(a)); + printf("id: %d\n\n", (int)fh_extractmin(a)); + + fh_replacekey(a, arr[5],-110); + fh_replacekey(a, arr[7],-115); + + printf("value(minkey) %d\n",fh_minkey(a)); + printf("id: %d\n\n", (int)fh_extractmin(a)); + + fh_replacekey(a, arr[5],-188); + + printf("value(minkey) %d\n",fh_minkey(a)); + printf("id: %d\n\n", (int)fh_extractmin(a)); + + fh_replacekey(a, arr[3],-4); + + printf("value(minkey) %d\n",fh_minkey(a)); + printf("id: %d\n\n", (int)fh_extractmin(a)); + + printf("value(minkey) %d\n",fh_minkey(a)); + printf("id: %d\n\n", (int)fh_extractmin(a)); + + fh_deleteheap(a); + + return 0; +} diff --git a/navit/fib-1.1/fibtest2.c b/navit/fib-1.1/fibtest2.c new file mode 100644 index 0000000..2ce1f6a --- /dev/null +++ b/navit/fib-1.1/fibtest2.c @@ -0,0 +1,96 @@ +/*- + * Copyright 1997, 1998-2003 John-Mark Gurney. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + +*/ + +#include +#include +#include "fib.h" + +int +main(void) { + struct fibheap *a; + void *arr[10]; + int i; + a = fh_makekeyheap(); + + for (i=1 ; i < 10 ; i++) + { + arr[i]= fh_insertkey(a,0,(void *)i); + printf("adding: 0 %d \n",i); + } + + printf(" \n"); + fh_replacekey(a, arr[1],-38); + fh_replacekey(a, arr[7],-34); + + printf("wert(minkey) %d\n",fh_minkey(a)); + printf("Knoten: %d\n\n", (int)fh_extractmin(a)); + fh_replacekey(a, arr[2],-55); + fh_replacekey(a, arr[5],-56); + printf("Wert(minkey) %d\n",fh_minkey(a)); + printf("Knoten: %d\n\n", (int)fh_extractmin(a)); + + fh_replacekey(a, arr[4],-1); + fh_replacekey(a, arr[2],-102); + fh_replacekey(a, arr[6],-1); + fh_replacekey(a, arr[9],-1); + fh_replacekey(a, arr[8],-4); + printf("Wert(minkey) %d\n",fh_minkey(a)); + printf("Knoten: %d\n\n", (int)fh_extractmin(a)); + fh_replacekey(a, arr[3],-74); + fh_replacekey(a, arr[8],-55); + fh_replacekey(a, arr[4],-2); + + printf("Wert(minkey) %d\n",fh_minkey(a)); + printf("Knoten: %d\n\n", (int)fh_extractmin(a)); + fh_replacekey(a, arr[4],-3); + fh_replacekey(a, arr[6],-2); + fh_replacekey(a, arr[7],-99); + printf("Wert(minkey) %d\n",fh_minkey(a)); + printf("Knoten: %d\n\n", (int)fh_extractmin(a)); + fh_replacekey(a, arr[6],-3); + fh_replacekey(a, arr[4],-4); + fh_replacekey(a, arr[8],-94); + fh_replacekey(a, arr[9],-2); + printf("Wert(minkey) %d\n",fh_minkey(a)); + printf("Knoten: %d\n\n", (int)fh_extractmin(a)); + fh_replacekey(a, arr[6],-4); + + printf("Wert(minkey) %d\n",fh_minkey(a)); + printf("Knoten: %d\n\n", (int)fh_extractmin(a)); + + printf("Wert(minkey) %d\n",fh_minkey(a)); + printf("Knoten: %d\n\n", (int)fh_extractmin(a)); + /*fh_replacekey(a, arr[9],-3);*/ + printf("Wert(minkey) %d\n",fh_minkey(a)); + printf("Knoten: %d\n\n", (int)fh_extractmin(a)); + + /*fh_replacekey(a, arr[9],-49);*/ + + fh_deleteheap(a); + + return 0; +} diff --git a/navit/fib-1.1/tt.c b/navit/fib-1.1/tt.c new file mode 100644 index 0000000..0bf5803 --- /dev/null +++ b/navit/fib-1.1/tt.c @@ -0,0 +1,91 @@ +/*- + * Copyright 1997, 1998-2003 John-Mark Gurney. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + +*/ + +#include +#include +#include "fib.h" + +int main(void) +{ + + struct fibheap *a; + void *arr[10]; + int i; + + a = fh_makekeyheap(); + + for (i=1 ; i < 8 ; i++) + { + arr[i]= fh_insertkey(a,0,(void *)i); + printf("adding: 0 %d \n",i); + } + + printf(" \n"); + + fh_replacekey(a, arr[1],-2); + fh_replacekey(a, arr[4],-3); + fh_replacekey(a, arr[7],-5); + + printf("Wert(minkey) %d\n",fh_minkey(a)); + printf("Knoten: %d\n\n", (int)fh_extractmin(a)); + + fh_replacekey(a, arr[3],-2); + fh_replacekey(a, arr[6],-1); + + printf("Wert(minkey) %d\n",fh_minkey(a)); + printf("Knoten: %d\n\n", (int)fh_extractmin(a)); + + fh_replacekey(a, arr[1],-9); + fh_replacekey(a, arr[5],-3); + + printf("Wert(minkey) %d\n",fh_minkey(a)); + printf("Knoten: %d\n\n", (int)fh_extractmin(a)); + + fh_replacekey(a, arr[2],-4); + fh_replacekey(a, arr[5],-5); + fh_replacekey(a, arr[6],-3); + + printf("Wert(minkey) %d\n",fh_minkey(a)); + printf("Knoten: %d\n\n", (int)fh_extractmin(a)); + + fh_replacekey(a, arr[2],-6); + fh_replacekey(a, arr[6],-6); + + printf("Wert(minkey) %d\n",fh_minkey(a)); + printf("Knoten: %d\n\n", (int)fh_extractmin(a)); + + printf("Wert(minkey) %d\n",fh_minkey(a)); + printf("Knoten: %d\n\n", (int)fh_extractmin(a)); + + printf("Wert(minkey) %d\n",fh_minkey(a)); + printf("Knoten: %d\n\n", (int)fh_extractmin(a)); + + fh_deleteheap(a); + + return 0; +} + diff --git a/navit/fib-1.1/use.c b/navit/fib-1.1/use.c new file mode 100644 index 0000000..309d85c --- /dev/null +++ b/navit/fib-1.1/use.c @@ -0,0 +1,153 @@ +/*- + * Copyright 1997, 1998-2003 John-Mark Gurney. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + +*/ + +#include +#include +#include + +#include "fib.h" + +#define TESTCASE 1 + +#define COUNT 100000 +#define DIF 1000 +#define MAXEXT 10 +#define VERBOSE 1 + +int cmp(void *, void *); + +int +cmp(void *x, void *y) +{ + int a, b; + a = (int)x; + b = (int)y; + + if (a < b) + return -1; + if (a == b) + return 0; + return 1; +} + +int +main(void) +{ +#if !TESTCASE + struct fibheap_el *w; +#else + int e, j, k; +#endif + struct fibheap *a; + int i, x; + + a = fh_makeheap(); + fh_setcmp(a, cmp); + + srandom(time(NULL)); +#if TESTCASE +#if VERBOSE + printf("inserting: "); +#endif + e = 0; + for (i = 0; i < COUNT; i++) { +#if VERBOSE + if (i) + printf(", "); +#endif + fh_insert(a, (void *)(x = random()/10)); +#if VERBOSE + printf("%d", x); +#endif + if (i - e > DIF) { + k = random() % MAXEXT; + for (j = 0; j < k; j++, e++) + printf("throwing: %d\n", (int)fh_extractmin(a)); + } + } + +#if VERBOSE + printf("\nremaining: %d\n", COUNT - e); + printf("extracting: "); +#endif + for (i = 0; i < COUNT - e; i++) { +#if VERBOSE + if (i) + printf(", "); + printf("%d", (int)fh_extractmin(a)); +#else + fh_extractmin(a); +#endif + } +#if VERBOSE + printf("\n"); +#endif + if ((int)fh_extractmin(a) == 0) + printf("heap empty!\n"); + else { + printf("heap not empty! ERROR!\n"); + exit(1); + } +#else + w = fh_insert(a, (void *)6); + printf("adding: %d\n", 6); + fh_insert(a, (void *)9); + printf("adding: %d\n", 9); + fh_insert(a, (void *)1); + printf("adding: %d\n", 1); + for(i = 0; i < 5; i++) { + x = random()/10000; + printf("adding: %d\n", x); + fh_insert(a, (void *)x); + } + fh_insert(a, (void *)4); + printf("adding: %d\n", 4); + fh_insert(a, (void *)8); + printf("adding: %d\n", 8); + printf("first: %d\n", (int)fh_extractmin(a)); + printf("deleting: %d\n", (int)fh_delete(a, w)); + printf("first: %d\n", (int)fh_extractmin(a)); + printf("first: %d\n", (int)fh_extractmin(a)); + printf("first: %d\n", (int)fh_extractmin(a)); + printf("first: %d\n", (int)fh_extractmin(a)); + printf("first: %d\n", (int)fh_extractmin(a)); + for(i = 0; i < 5; i++) { + x = random()/10000; + printf("adding: %d\n", x); + fh_insert(a, (void *)x); + } + printf("first: %d\n", (int)fh_extractmin(a)); + printf("first: %d\n", (int)fh_extractmin(a)); + printf("first: %d\n", (int)fh_extractmin(a)); + printf("first: %d\n", (int)fh_extractmin(a)); + printf("first: %d\n", (int)fh_extractmin(a)); +#endif + + fh_deleteheap(a); + + return 0; +} diff --git a/navit/file.c b/navit/file.c new file mode 100644 index 0000000..6c530be --- /dev/null +++ b/navit/file.c @@ -0,0 +1,930 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#define _FILE_OFFSET_BITS 64 +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#include "config.h" +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef _MSC_VER +#include +#else +#include +#endif /* _MSC_VER */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "debug.h" +#include "cache.h" +#include "file.h" +#include "atom.h" +#include "item.h" +#include "util.h" +#include "types.h" +#include "zipfile.h" +#ifdef HAVE_SOCKET +#include +#include +#endif + +extern char *version; + +#ifdef HAVE_LIBCRYPTO +#include +#include +#include +#include +#include +#endif + +#ifdef HAVE_API_ANDROID +#define lseek lseek64 +#endif + +#ifndef O_LARGEFILE +#define O_LARGEFILE 0 +#endif + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +#ifdef CACHE_SIZE +static GHashTable *file_name_hash; +#endif + +static struct cache *file_cache; + +#ifdef HAVE_PRAGMA_PACK +#pragma pack(push) +#pragma pack(1) +#endif + +struct file_cache_id { + long long offset; + int size; + int file_name_id; + int method; +} ATTRIBUTE_PACKED; + +#ifdef HAVE_PRAGMA_PACK +#pragma pack(pop) +#endif + +#ifdef HAVE_SOCKET +static int +file_socket_connect(char *host, char *service) +{ + struct addrinfo hints; + struct addrinfo *result, *rp; + int fd=-1,s; + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = 0; + hints.ai_protocol = 0; + s = getaddrinfo(host, service, &hints, &result); + if (s != 0) { + dbg(0,"getaddrinfo error %s\n",gai_strerror(s)); + return -1; + } + for (rp = result; rp != NULL; rp = rp->ai_next) { + fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + if (fd != -1) { + if (connect(fd, rp->ai_addr, rp->ai_addrlen) != -1) + break; + close(fd); + fd=-1; + } + } + freeaddrinfo(result); + return fd; +} + +static void +file_http_request(struct file *file, char *method, char *host, char *path, char *header, int persistent) +{ + char *request=g_strdup_printf("%s %s HTTP/1.0\r\nUser-Agent: navit %s\r\nHost: %s\r\n%s%s%s\r\n",method,path,version,host,persistent?"Connection: Keep-Alive\r\n":"",header?header:"",header?"\r\n":""); + write(file->fd, request, strlen(request)); + dbg(1,"%s\n",request); + file->requests++; +} + +static int +file_request_do(struct file *file, struct attr **options, int connect) +{ + struct attr *attr; + char *name; + + if (!options) + return 0; + attr=attr_search(options, NULL, attr_url); + if (!attr) + return 0; + name=attr->u.str; + if (!name) + return 0; + g_free(file->name); + file->name = g_strdup(name); + if (!strncmp(name,"http://",7)) { + char *host=g_strdup(name+7); + char *port=strchr(host,':'); + char *path=strchr(name+7,'/'); + char *method="GET"; + char *header=NULL; + int persistent=0; + if ((attr=attr_search(options, NULL, attr_http_method)) && attr->u.str) + method=attr->u.str; + if ((attr=attr_search(options, NULL, attr_http_header)) && attr->u.str) + header=attr->u.str; + if ((attr=attr_search(options, NULL, attr_persistent))) + persistent=attr->u.num; + if (path) + host[path-name-7]='\0'; + if (port) + *port++='\0'; + dbg(1,"host=%s path=%s\n",host,path); + if (connect) + file->fd=file_socket_connect(host,port?port:"80"); + file_http_request(file,method,host,path,header,persistent); + file->special=1; + g_free(host); + } + return 1; +} +#endif + +static unsigned char * +file_http_header_end(unsigned char *str, int len) +{ + int i; + for (i=0; i+1headers) + return NULL; + return g_hash_table_lookup(f->headers, header); +} + +struct file * +file_create(char *name, struct attr **options) +{ + struct stat stat; + struct file *file= g_new0(struct file,1); + struct attr *attr; + int open_flags=O_LARGEFILE|O_BINARY; + + if (options && (attr=attr_search(options, NULL, attr_url))) { +#ifdef HAVE_SOCKET + file_request_do(file, options, 1); +#endif + } else { + if (options && (attr=attr_search(options, NULL, attr_readwrite)) && attr->u.num) { + open_flags |= O_RDWR; + if ((attr=attr_search(options, NULL, attr_create)) && attr->u.num) + open_flags |= O_CREAT; + } else + open_flags |= O_RDONLY; + file->name = g_strdup(name); + file->fd=open(name, open_flags, 0666); + if (file->fd == -1) { + g_free(file); + return NULL; + } + dbg(1,"fd=%d\n", file->fd); + file->size=lseek(file->fd, 0, SEEK_END); + dbg(1,"size="LONGLONG_FMT"\n", file->size); + file->name_id = (long)atom(name); + } +#ifdef CACHE_SIZE + if (!options || !(attr=attr_search(options, NULL, attr_cache)) || attr->u.num) + file->cache=1; +#endif + dbg_assert(file != NULL); + return file; +} + +#if 0 +struct file * +file_create_url(char *url) +{ +} +#endif + +#ifndef S_ISDIR +#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +#endif +#ifndef S_ISREG +#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) +#endif + +int file_is_dir(char *name) +{ + struct stat buf; + if (! stat(name, &buf)) { + return S_ISDIR(buf.st_mode); + } + return 0; + +} + +int file_is_reg(char *name) +{ + struct stat buf; + if (! stat(name, &buf)) { + return S_ISREG(buf.st_mode); + } + return 0; +} + +long long +file_size(struct file *file) +{ + return file->size; +} + +int file_mkdir(char *name, int pflag) +{ + char *buffer=g_alloca(sizeof(char)*(strlen(name)+1)); + int ret; + char *next; + dbg(1,"enter %s %d\n",name,pflag); + if (!pflag) { + if (file_is_dir(name)) + return 0; +#if defined HAVE_API_WIN32_BASE || defined _MSC_VER + return mkdir(name); +#else + return mkdir(name, 0777); +#endif + } + strcpy(buffer, name); + next=buffer; + while ((next=strchr(next, '/'))) { + *next='\0'; + if (*buffer) { + ret=file_mkdir(buffer, 0); + if (ret) + return ret; + } + *next++='/'; + } + if (pflag == 2) + return 0; + return file_mkdir(buffer, 0); +} + +int +file_mmap(struct file *file) +{ +#if 0 + int mmap_size=file->size+1024*1024; +#else + int mmap_size=file->size; +#endif +#ifdef HAVE_API_WIN32_BASE + file->begin = (char*)mmap_readonly_win32( file->name, &file->map_handle, &file->map_file ); +#else + file->begin=mmap(NULL, mmap_size, PROT_READ|PROT_WRITE, MAP_PRIVATE, file->fd, 0); + dbg_assert(file->begin != NULL); + if (file->begin == (void *)0xffffffff) { + perror("mmap"); + return 0; + } +#endif + dbg_assert(file->begin != (void *)0xffffffff); + file->mmap_end=file->begin+mmap_size; + file->end=file->begin+file->size; + + return 1; +} + +unsigned char * +file_data_read(struct file *file, long long offset, int size) +{ + void *ret; + if (file->special) + return NULL; + if (file->begin) + return file->begin+offset; + if (file->cache) { + struct file_cache_id id={offset,size,file->name_id,0}; + ret=cache_lookup(file_cache,&id); + if (ret) + return ret; + ret=cache_insert_new(file_cache,&id,size); + } else + ret=g_malloc(size); + lseek(file->fd, offset, SEEK_SET); + if (read(file->fd, ret, size) != size) { + file_data_free(file, ret); + ret=NULL; + } + return ret; + +} + +static void +file_process_headers(struct file *file, unsigned char *headers) +{ + char *tok; + char *cl; + if (file->headers) + g_hash_table_destroy(file->headers); + file->headers=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); + while ((tok=strtok((char*)headers, "\r\n"))) { + char *sep; + tok=g_strdup(tok); + sep=strchr(tok,':'); + if (!sep) + sep=strchr(tok,'/'); + if (!sep) { + g_free(tok); + continue; + } + *sep++='\0'; + if (*sep == ' ') + sep++; + strtolower(tok, tok); + dbg(1,"header '%s'='%s'\n",tok,sep); + g_hash_table_insert(file->headers, tok, sep); + headers=NULL; + } + cl=g_hash_table_lookup(file->headers, "content-length"); + if (cl) +#ifdef HAVE__ATOI64 + file->size=_atoi64(cl); +#else + file->size=atoll(cl); +#endif +} + +static void +file_shift_buffer(struct file *file, int amount) +{ + memmove(file->buffer, file->buffer+amount, file->buffer_len-amount); + file->buffer_len-=amount; +} + +unsigned char * +file_data_read_special(struct file *file, int size, int *size_ret) +{ + unsigned char *ret,*hdr; + int rets=0,rd; + int buffer_size=8192; + int eof=0; + if (!file->special) + return NULL; + if (!file->buffer) + file->buffer=g_malloc(buffer_size); + ret=g_malloc(size); + while ((size > 0 || file->requests) && (!eof || file->buffer_len)) { + int toread=buffer_size-file->buffer_len; + if (toread >= 4096 && !eof) { + if (!file->requests && toread > size) + toread=size; + rd=read(file->fd, file->buffer+file->buffer_len, toread); + if (rd > 0) { + file->buffer_len+=rd; + } else + eof=1; + } + if (file->requests) { + dbg(1,"checking header\n"); + if ((hdr=file_http_header_end(file->buffer, file->buffer_len))) { + hdr[-1]='\0'; + dbg(1,"found %s (%d bytes)\n",file->buffer,sizeof(file->buffer)); + file_process_headers(file, file->buffer); + file_shift_buffer(file, hdr-file->buffer); + file->requests--; + if (file_http_header(file, "location")) + break; + } + } + if (!file->requests) { + rd=file->buffer_len; + if (rd > size) + rd=size; + memcpy(ret+rets, file->buffer, rd); + file_shift_buffer(file, rd); + rets+=rd; + size-=rd; + } + } + *size_ret=rets; + return ret; +} + +unsigned char * +file_data_read_all(struct file *file) +{ + return file_data_read(file, 0, file->size); +} + +void +file_data_flush(struct file *file, long long offset, int size) +{ + if (file->cache) { + struct file_cache_id id={offset,size,file->name_id,0}; + cache_flush(file_cache,&id); + dbg(1,"Flushing "LONGLONG_FMT" %d bytes\n",offset,size); + } +} + +int +file_data_write(struct file *file, long long offset, int size, unsigned char *data) +{ + file_data_flush(file, offset, size); + lseek(file->fd, offset, SEEK_SET); + if (write(file->fd, data, size) != size) + return 0; + if (file->size < offset+size) + file->size=offset+size; + return 1; +} + +int +file_get_contents(char *name, unsigned char **buffer, int *size) +{ + struct file *file; + file=file_create(name, 0); + if (!file) + return 0; + file->cache=0; + *size=file_size(file); + *buffer=file_data_read_all(file); + file_destroy(file); + return 1; +} + + +static int +uncompress_int(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen) +{ + z_stream stream; + int err; + + stream.next_in = (Bytef*)source; + stream.avail_in = (uInt)sourceLen; + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + + err = inflateInit2(&stream, -MAX_WBITS); + if (err != Z_OK) return err; + + err = inflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + inflateEnd(&stream); + if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) + return Z_DATA_ERROR; + return err; + } + *destLen = stream.total_out; + + err = inflateEnd(&stream); + return err; +} + +unsigned char * +file_data_read_compressed(struct file *file, long long offset, int size, int size_uncomp) +{ + void *ret; + char *buffer = 0; + uLongf destLen=size_uncomp; + + if (file->cache) { + struct file_cache_id id={offset,size,file->name_id,1}; + ret=cache_lookup(file_cache,&id); + if (ret) + return ret; + ret=cache_insert_new(file_cache,&id,size_uncomp); + } else + ret=g_malloc(size_uncomp); + lseek(file->fd, offset, SEEK_SET); + + buffer = (char *)g_malloc(size); + if (read(file->fd, buffer, size) != size) { + g_free(ret); + ret=NULL; + } else { + if (uncompress_int(ret, &destLen, (Bytef *)buffer, size) != Z_OK) { + dbg(0,"uncompress failed\n"); + g_free(ret); + ret=NULL; + } + } + g_free(buffer); + + return ret; +} + +unsigned char * +file_data_read_encrypted(struct file *file, long long offset, int size, int size_uncomp, int compressed, char *passwd) +{ +#ifdef HAVE_LIBCRYPTO + void *ret; + unsigned char *buffer = 0; + uLongf destLen=size_uncomp; + + if (file->cache) { + struct file_cache_id id={offset,size,file->name_id,1}; + ret=cache_lookup(file_cache,&id); + if (ret) + return ret; + ret=cache_insert_new(file_cache,&id,size_uncomp); + } else + ret=g_malloc(size_uncomp); + lseek(file->fd, offset, SEEK_SET); + + buffer = (unsigned char *)g_malloc(size); + if (read(file->fd, buffer, size) != size) { + g_free(ret); + ret=NULL; + } else { + unsigned char key[34], salt[8], verify[2], counter[16], xor[16], mac[10], *datap; + int overhead=sizeof(salt)+sizeof(verify)+sizeof(mac); + int esize=size-overhead; + PKCS5_PBKDF2_HMAC_SHA1(passwd, strlen(passwd), (unsigned char *)buffer, 8, 1000, 34, key); + if (key[32] == buffer[8] && key[33] == buffer[9] && esize >= 0) { + AES_KEY aeskey; + AES_set_encrypt_key(key, 128, &aeskey); + datap=buffer+sizeof(salt)+sizeof(verify); + memset(counter, 0, sizeof(counter)); + while (esize > 0) { + int i,curr_size,idx=0; + do { + counter[idx]++; + } while (!counter[idx++]); + AES_encrypt(counter, xor, &aeskey); + curr_size=esize; + if (curr_size > sizeof(xor)) + curr_size=sizeof(xor); + for (i = 0 ; i < curr_size ; i++) + *datap++^=xor[i]; + esize-=curr_size; + } + size-=overhead; + datap=buffer+sizeof(salt)+sizeof(verify); + if (compressed) { + if (uncompress_int(ret, &destLen, (Bytef *)datap, size) != Z_OK) { + dbg(0,"uncompress failed\n"); + g_free(ret); + ret=NULL; + } + } else { + if (size == destLen) + memcpy(ret, buffer, destLen); + else { + dbg(0,"memcpy failed\n"); + g_free(ret); + ret=NULL; + } + } + } else { + g_free(ret); + ret=NULL; + } + } + g_free(buffer); + + return ret; +#else + return NULL; +#endif +} + +void +file_data_free(struct file *file, unsigned char *data) +{ + if (file->begin) { + if (data == file->begin) + return; + if (data >= file->begin && data < file->end) + return; + } + if (file->cache && data) { + cache_entry_destroy(file_cache, data); + } else + g_free(data); +} + +void +file_data_remove(struct file *file, unsigned char *data) +{ + if (file->begin) { + if (data == file->begin) + return; + if (data >= file->begin && data < file->end) + return; + } + if (file->cache && data) { + cache_flush_data(file_cache, data); + } else + g_free(data); +} + +int +file_exists(char const *name) +{ + struct stat buf; + if (! stat(name, &buf)) + return 1; + return 0; +} + +void +file_remap_readonly(struct file *f) +{ +#if defined(_WIN32) || defined(__CEGCC__) +#else + void *begin; + munmap(f->begin, f->size); + begin=mmap(f->begin, f->size, PROT_READ, MAP_PRIVATE, f->fd, 0); + if (f->begin != begin) + printf("remap failed\n"); +#endif +} + +void +file_unmap(struct file *f) +{ +#if defined(_WIN32) || defined(__CEGCC__) + mmap_unmap_win32( f->begin, f->map_handle , f->map_file ); +#else + munmap(f->begin, f->size); +#endif +} + +#ifndef _MSC_VER +void * +file_opendir(char *dir) +{ + return opendir(dir); +} +#else +void * +file_opendir(char *dir) +{ + WIN32_FIND_DATAA FindFileData; + HANDLE hFind = INVALID_HANDLE_VALUE; +#undef UNICODE // we need FindFirstFileA() which takes an 8-bit c-string + char* fname=g_alloca(sizeof(char)*(strlen(dir)+4)); + sprintf(fname,"%s\\*",dir); + hFind = FindFirstFileA(fname, &FindFileData); + return hFind; +} +#endif + +#ifndef _MSC_VER +char * +file_readdir(void *hnd) +{ + struct dirent *ent; + + ent=readdir(hnd); + if (! ent) + return NULL; + return ent->d_name; +} +#else +char * +file_readdir(void *hnd) +{ + WIN32_FIND_DATA FindFileData; + + if (FindNextFile(hnd, &FindFileData) ) { + return FindFileData.cFileName; + } else { + return NULL; + } +} +#endif /* _MSC_VER */ + +#ifndef _MSC_VER +void +file_closedir(void *hnd) +{ + closedir(hnd); +} +#else +void +file_closedir(void *hnd) +{ + FindClose(hnd); +} +#endif /* _MSC_VER */ + +struct file * +file_create_caseinsensitive(char *name, struct attr **options) +{ + char *dirname=g_alloca(sizeof(char)*(strlen(name)+1)); + char *filename; + char *p; + void *d; + struct file *ret; + + ret=file_create(name, options); + if (ret) + return ret; + + strcpy(dirname, name); + p=dirname+strlen(name); + while (p > dirname) { + if (*p == '/') + break; + p--; + } + *p=0; + d=file_opendir(dirname); + if (d) { + *p++='/'; + while ((filename=file_readdir(d))) { + if (!g_strcasecmp(filename, p)) { + strcpy(p, filename); + ret=file_create(dirname, options); + if (ret) + break; + } + } + file_closedir(d); + } + return ret; +} + +void +file_destroy(struct file *f) +{ + if (f->headers) + g_hash_table_destroy(f->headers); + switch (f->special) { + case 0: + case 1: + close(f->fd); + break; + } + + if ( f->begin != NULL ) + { + file_unmap( f ); + } + + g_free(f->buffer); + g_free(f->name); + g_free(f); +} + +struct file_wordexp { + int err; + char *pattern; + wordexp_t we; +}; + +struct file_wordexp * +file_wordexp_new(const char *pattern) +{ + struct file_wordexp *ret=g_new0(struct file_wordexp, 1); + + ret->pattern=g_strdup(pattern); + ret->err=wordexp(pattern, &ret->we, 0); + if (ret->err) + dbg(0,"wordexp('%s') returned %d\n", pattern, ret->err); + return ret; +} + +int +file_wordexp_get_count(struct file_wordexp *wexp) +{ + if (wexp->err) + return 1; + return wexp->we.we_wordc; +} + +char ** +file_wordexp_get_array(struct file_wordexp *wexp) +{ + if (wexp->err) + return &wexp->pattern; + return wexp->we.we_wordv; +} + +void +file_wordexp_destroy(struct file_wordexp *wexp) +{ + if (! wexp->err) + wordfree(&wexp->we); + g_free(wexp->pattern); + g_free(wexp); +} + + +int +file_get_param(struct file *file, struct param_list *param, int count) +{ + int i=count; + param_add_string("Filename", file->name, ¶m, &count); + param_add_hex("Size", file->size, ¶m, &count); + return i-count; +} + +int +file_version(struct file *file, int mode) +{ +#ifndef HAVE_API_WIN32_BASE + struct stat st; + int error; + if (mode == 3) { + long long size=lseek(file->fd, 0, SEEK_END); + if (file->begin && file->begin+size > file->mmap_end) { + file->version++; + } else { + file->size=size; + if (file->begin) + file->end=file->begin+file->size; + } + } else { + if (mode == 2) + error=stat(file->name, &st); + else + error=fstat(file->fd, &st); + if (error || !file->version || file->mtime != st.st_mtime || file->ctime != st.st_ctime) { + file->mtime=st.st_mtime; + file->ctime=st.st_ctime; + file->version++; + dbg(1,"%s now version %d\n", file->name, file->version); + } + } + return file->version; +#else + return 0; +#endif +} + +void * +file_get_os_handle(struct file *file) +{ + return GINT_TO_POINTER(file->fd); +} + +void +file_init(void) +{ +#ifdef CACHE_SIZE + file_name_hash=g_hash_table_new(g_str_hash, g_str_equal); + file_cache=cache_new(sizeof(struct file_cache_id), CACHE_SIZE); +#endif +} + diff --git a/navit/file.h b/navit/file.h new file mode 100644 index 0000000..b6ee01e --- /dev/null +++ b/navit/file.h @@ -0,0 +1,105 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_FILE_H +#define NAVIT_FILE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif +#ifndef __CEGCC__ +#include +#endif +#include "param.h" +#include + +struct file { + struct file *next; + unsigned char *begin; + unsigned char *end; + unsigned char *mmap_end; + long long size; + int name_id; + int fd; +#ifndef __CEGCC__ + time_t mtime; + time_t ctime; + int version; +#endif +#if defined(_WIN32) || defined(__CEGCC__) + long map_handle; + long map_file; +#endif + char *name; + int special; + int cache; + int requests; + unsigned char *buffer; + int buffer_len; + GHashTable *headers; +}; + +struct attr; + +/* prototypes */ +int file_request(struct file *f, struct attr **options); +char *file_http_header(struct file *f, char *header); +struct file *file_create(char *name, struct attr **options); +int file_is_dir(char *name); +long long file_size(struct file *file); +int file_mkdir(char *name, int pflag); +int file_mmap(struct file *file); +unsigned char *file_data_read(struct file *file, long long offset, int size); +unsigned char *file_data_read_special(struct file *file, int size, int *size_ret); +unsigned char *file_data_read_all(struct file *file); +void file_data_flush(struct file *file, long long offset, int size); +int file_data_write(struct file *file, long long offset, int size, unsigned char *data); +int file_get_contents(char *name, unsigned char **buffer, int *size); +unsigned char *file_data_read_compressed(struct file *file, long long offset, int size, int size_uncomp); +unsigned char *file_data_read_encrypted(struct file *file, long long offset, int size, int size_uncomp, int compressed, char *passwd); +void file_data_free(struct file *file, unsigned char *data); +int file_exists(char const *name); +void file_remap_readonly(struct file *f); +void file_unmap(struct file *f); +void *file_opendir(char *dir); +char *file_readdir(void *hnd); +void file_closedir(void *hnd); +struct file *file_create_caseinsensitive(char *name, struct attr **options); +void file_destroy(struct file *f); +struct file_wordexp *file_wordexp_new(const char *pattern); +int file_wordexp_get_count(struct file_wordexp *wexp); +char **file_wordexp_get_array(struct file_wordexp *wexp); +void file_wordexp_destroy(struct file_wordexp *wexp); +int file_get_param(struct file *file, struct param_list *param, int count); +int file_version(struct file *file, int byname); +void *file_get_os_handle(struct file *file); +void file_init(void); +int file_is_reg(char *name); +void file_data_remove(struct file *file, unsigned char *data); +/* end of prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/navit/font/Makefile.am b/navit/font/Makefile.am new file mode 100644 index 0000000..620280e --- /dev/null +++ b/navit/font/Makefile.am @@ -0,0 +1,4 @@ +SUBDIRS= +if FONT_FREETYPE + SUBDIRS+=freetype +endif diff --git a/navit/font/Makefile.in b/navit/font/Makefile.in new file mode 100644 index 0000000..3020203 --- /dev/null +++ b/navit/font/Makefile.in @@ -0,0 +1,709 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@FONT_FREETYPE_TRUE@am__append_1 = freetype +subdir = navit/font +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = freetype +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = $(am__append_1) +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/font/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/font/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/font/freetype/Makefile.am b/navit/font/freetype/Makefile.am new file mode 100644 index 0000000..4c081e3 --- /dev/null +++ b/navit/font/freetype/Makefile.am @@ -0,0 +1,9 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ @FREETYPE2_CFLAGS@ @FONTCONFIG_CFLAGS@ @FRIBIDI2_CFLAGS@ @FRIBIDI_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=font_freetype +if PLUGINS + modulefont_LTLIBRARIES = libfont_freetype.la +else + noinst_LTLIBRARIES = libfont_freetype.la +endif +libfont_freetype_la_SOURCES = font_freetype.c font_freetype.h +libfont_freetype_la_LDFLAGS = @FREETYPE2_LIBS@ @FONTCONFIG_LIBS@ @FRIBIDI2_LIBS@ @FRIBIDI_LIBS@ -module -avoid-version diff --git a/navit/font/freetype/Makefile.in b/navit/font/freetype/Makefile.in new file mode 100644 index 0000000..a702f8d --- /dev/null +++ b/navit/font/freetype/Makefile.in @@ -0,0 +1,703 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/font/freetype +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulefontdir)" +LTLIBRARIES = $(modulefont_LTLIBRARIES) $(noinst_LTLIBRARIES) +libfont_freetype_la_LIBADD = +am_libfont_freetype_la_OBJECTS = font_freetype.lo +libfont_freetype_la_OBJECTS = $(am_libfont_freetype_la_OBJECTS) +libfont_freetype_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libfont_freetype_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libfont_freetype_la_rpath = +@PLUGINS_TRUE@am_libfont_freetype_la_rpath = -rpath $(modulefontdir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libfont_freetype_la_SOURCES) +DIST_SOURCES = $(libfont_freetype_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ @FREETYPE2_CFLAGS@ @FONTCONFIG_CFLAGS@ @FRIBIDI2_CFLAGS@ @FRIBIDI_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=font_freetype +@PLUGINS_TRUE@modulefont_LTLIBRARIES = libfont_freetype.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libfont_freetype.la +libfont_freetype_la_SOURCES = font_freetype.c font_freetype.h +libfont_freetype_la_LDFLAGS = @FREETYPE2_LIBS@ @FONTCONFIG_LIBS@ @FRIBIDI2_LIBS@ @FRIBIDI_LIBS@ -module -avoid-version +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/font/freetype/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/font/freetype/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulefontLTLIBRARIES: $(modulefont_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulefontdir)" || $(MKDIR_P) "$(DESTDIR)$(modulefontdir)" + @list='$(modulefont_LTLIBRARIES)'; test -n "$(modulefontdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulefontdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulefontdir)"; \ + } + +uninstall-modulefontLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulefont_LTLIBRARIES)'; test -n "$(modulefontdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulefontdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulefontdir)/$$f"; \ + done + +clean-modulefontLTLIBRARIES: + -test -z "$(modulefont_LTLIBRARIES)" || rm -f $(modulefont_LTLIBRARIES) + @list='$(modulefont_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libfont_freetype.la: $(libfont_freetype_la_OBJECTS) $(libfont_freetype_la_DEPENDENCIES) + $(libfont_freetype_la_LINK) $(am_libfont_freetype_la_rpath) $(libfont_freetype_la_OBJECTS) $(libfont_freetype_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/font_freetype.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulefontdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulefontLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulefontLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulefontLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulefontLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-modulefontLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulefontLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/font/freetype/font_freetype.c b/navit/font/freetype/font_freetype.c new file mode 100644 index 0000000..4a3317d --- /dev/null +++ b/navit/font/freetype/font_freetype.c @@ -0,0 +1,802 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ +#include "config.h" +#ifdef HAVE_FONTCONFIG +#include +#endif +#include +#include +#include FT_FREETYPE_H +#ifndef USE_CACHING +#define USE_CACHING 1 +#endif +#if USE_CACHING +#include FT_CACHE_H +#endif +#if USE_FRIBIDI +#include +#endif +#include +#include "point.h" +#include "graphics.h" +#include "debug.h" +#include "plugin.h" +#include "color.h" +#include "atom.h" +#include "font_freetype.h" + +#ifndef HAVE_LOOKUP_SCALER +#if FREETYPE_MAJOR * 10000 + FREETYPE_MINOR * 100 + FREETYPE_PATCH > 20304 +#define HAVE_LOOKUP_SCALER 1 +#else +#define HAVE_LOOKUP_SCALER 0 +#endif +#endif + +struct font_freetype_font { + int size; +#if USE_CACHING +#if HAVE_LOOKUP_SCALER + FTC_ScalerRec scaler; +#else + FTC_ImageTypeRec scaler; +#endif + int charmap_index; +#else + FT_Face face; +#endif +}; + +struct font_priv { +}; + +static struct font_priv dummy; +static FT_Library library; +#if USE_CACHING +static FTC_Manager manager; +static FTC_ImageCache image_cache; +static FTC_CMapCache charmap_cache; +static FTC_SBitCache sbit_cache; +#endif +static int library_init; + + +static void +font_freetype_get_text_bbox(struct graphics_priv *gr, + struct font_freetype_font *font, char *text, + int dx, int dy, struct point *ret, + int estimate) +{ + char *p = text; + FT_BBox bbox; + FT_UInt glyph_index; + FT_Glyph glyph; + FT_Matrix matrix; + FT_Vector pen; + pen.x = 0 * 64; + pen.y = 0 * 64; + int i; + struct point pt; +#if 0 + matrix.xx = dx; + matrix.xy = dy; + matrix.yx = -dy; + matrix.yy = dx; +#else + matrix.xx = 0x10000; + matrix.xy = 0; + matrix.yx = 0; + matrix.yy = 0x10000; +#endif + int n, len, x = 0, y = 0; + + len = g_utf8_strlen(text, -1); + if (estimate) { + bbox.xMin = 0; + bbox.yMin = 0; + bbox.yMax = 13*font->size/256; + bbox.xMax = 9*font->size*len/256; + } else { + bbox.xMin = bbox.yMin = 32000; + bbox.xMax = bbox.yMax = -32000; +#if !USE_CACHING + FT_Set_Transform(font->face, &matrix, &pen); +#endif + for (n = 0; n < len; n++) { + FT_BBox glyph_bbox; +#if USE_CACHING + FTC_Node anode = NULL; + glyph_index = FTC_CMapCache_Lookup(charmap_cache, font->scaler.face_id, font->charmap_index, g_utf8_get_char(p)); + FT_Glyph cached_glyph; +#if HAVE_LOOKUP_SCALER + FTC_ImageCache_LookupScaler(image_cache, &font->scaler, FT_LOAD_DEFAULT, glyph_index, &cached_glyph, &anode); +#else + FTC_ImageCache_Lookup(image_cache, &font->scaler, glyph_index, &cached_glyph, &anode); +#endif + FT_Glyph_Copy(cached_glyph, &glyph); + FT_Glyph_Transform(glyph, &matrix, &pen); +#else + glyph_index = FT_Get_Char_Index(font->face, g_utf8_get_char(p)); + FT_Load_Glyph(font->face, glyph_index, FT_LOAD_DEFAULT); + FT_Get_Glyph(font->face->glyph, &glyph); +#endif + FT_Glyph_Get_CBox(glyph, ft_glyph_bbox_pixels, &glyph_bbox); + + glyph_bbox.xMin += x >> 6; + glyph_bbox.xMax += x >> 6; + glyph_bbox.yMin += y >> 6; + glyph_bbox.yMax += y >> 6; + x += glyph->advance.x >> 10; + y -= glyph->advance.y >> 10; + if (glyph_bbox.xMin < bbox.xMin) + bbox.xMin = glyph_bbox.xMin; + if (glyph_bbox.yMin < bbox.yMin) + bbox.yMin = glyph_bbox.yMin; + if (glyph_bbox.xMax > bbox.xMax) + bbox.xMax = glyph_bbox.xMax; + if (glyph_bbox.yMax > bbox.yMax) + bbox.yMax = glyph_bbox.yMax; + p = g_utf8_next_char(p); +#if USE_CACHING + FT_Done_Glyph(glyph); + FTC_Node_Unref(anode, manager); +#else + FT_Done_Glyph(glyph); +#endif + } + if (bbox.xMin > bbox.xMax) { + bbox.xMin = 0; + bbox.yMin = 0; + bbox.xMax = 0; + bbox.yMax = 0; + } + } + ret[0].x = bbox.xMin; + ret[0].y = -bbox.yMin; + ret[1].x = bbox.xMin; + ret[1].y = -bbox.yMax; + ret[2].x = bbox.xMax; + ret[2].y = -bbox.yMax; + ret[3].x = bbox.xMax; + ret[3].y = -bbox.yMin; + if (dy != 0 || dx != 0x10000) { + for (i = 0 ; i < 4 ; i++) { + pt=ret[i]; + ret[i].x=(pt.x*dx-pt.y*dy)/0x10000; + ret[i].y=(pt.y*dx+pt.x*dy)/0x10000; + } + } +} + +static struct font_freetype_text * +font_freetype_text_new(char *text, struct font_freetype_font *font, int dx, + int dy) +{ + FT_Matrix matrix; + FT_Vector pen; + FT_UInt glyph_index; + int y, n, len, w, h, pixmap_len; + struct font_freetype_text *ret; + struct font_freetype_glyph *curr; + char *p = text; + unsigned char *gl, *pm; + FT_BitmapGlyph glyph_bitmap; + FT_Glyph glyph; + + len = g_utf8_strlen(text, -1); + ret = g_malloc(sizeof(*ret) + len * sizeof(struct text_glyph *)); + ret->glyph_count = len; + + matrix.xx = dx; + matrix.xy = dy; + matrix.yx = -dy; + matrix.yy = dx; + + pen.x = 0 * 64; + pen.y = 0 * 64; +#if !USE_CACHING + FT_Set_Transform(font->face, &matrix, &pen); +#endif + +#if USE_FRIBIDI + // Need to use fribidi to handle the string properly + char visual_text[len*4+1]; + { + FriBidiChar unicode_text[len+2]; + FriBidiChar visual_unicode_text[len+2]; + FriBidiStrIndex textlen = strlen(text); +#ifdef FRIBIDIOLD + FriBidiCharType base = FRIBIDI_TYPE_LTR; +#else + FriBidiParType base = FRIBIDI_PAR_LTR; +#endif + + FriBidiStrIndex unicode_len = +#ifdef FRIBIDIOLD + fribidi_utf8_to_unicode(text, textlen, unicode_text); +#else + fribidi_charset_to_unicode(FRIBIDI_CHAR_SET_UTF8, text, textlen, unicode_text); +#endif + fribidi_log2vis(unicode_text, unicode_len, &base, visual_unicode_text, NULL, NULL, NULL); + // TODO: check return value +#ifdef FRIBIDIOLD + fribidi_unicode_to_utf8(visual_unicode_text, unicode_len, visual_text); +#else + fribidi_unicode_to_charset(FRIBIDI_CHAR_SET_UTF8, visual_unicode_text, unicode_len, visual_text); +#endif + p = visual_text; + } +#endif /* USE_FRIBIDI */ + + for (n = 0; n < len; n++) { + +#if USE_CACHING + FTC_Node anode=NULL; + FT_Glyph cached_glyph; + glyph_index = FTC_CMapCache_Lookup(charmap_cache, font->scaler.face_id, font->charmap_index, g_utf8_get_char(p)); +#if HAVE_LOOKUP_SCALER + FTC_ImageCache_LookupScaler(image_cache, &font->scaler, FT_LOAD_DEFAULT, glyph_index, &cached_glyph, &anode); +#else + FTC_ImageCache_Lookup(image_cache, &font->scaler, glyph_index, &cached_glyph, &anode); +#endif + FT_Glyph_Copy(cached_glyph, &glyph); + FT_Glyph_Transform(glyph, &matrix, &pen); + FT_Glyph_To_Bitmap(&glyph, ft_render_mode_normal, NULL, TRUE); +#else + glyph_index = FT_Get_Char_Index(font->face, g_utf8_get_char(p)); + FT_Load_Glyph(font->face, glyph_index, FT_LOAD_DEFAULT); + FT_Get_Glyph(font->face->glyph, &glyph); +#endif + FT_Glyph_To_Bitmap(&glyph, ft_render_mode_normal, NULL, TRUE); + glyph_bitmap = (FT_BitmapGlyph)glyph; + + w = glyph_bitmap->bitmap.width; + h = glyph_bitmap->bitmap.rows; + if (w && h) + pixmap_len = (w + 2) * (h + 2); + else + pixmap_len = 0; + curr = g_malloc0(sizeof(*curr) + pixmap_len); + if (pixmap_len) { + curr->w = w; + curr->h = h; + } + curr->pixmap = (unsigned char *) (curr + 1); + ret->glyph[n] = curr; + + curr->x = glyph_bitmap->left << 6; + curr->y = -glyph_bitmap->top << 6; + for (y = 0; y < h; y++) { + gl = glyph_bitmap->bitmap.buffer + y * glyph_bitmap->bitmap.pitch; + pm = curr->pixmap + y * w; + memcpy(pm, gl, w); + } + + curr->dx = glyph->advance.x >> 10; + curr->dy = -glyph->advance.y >> 10; + FT_Done_Glyph(glyph); +#if USE_CACHING + FTC_Node_Unref(anode, manager); +#endif + p = g_utf8_next_char(p); + } + ret->glyph_count = len; + return ret; +} + +/** + * List of font families to use, in order of preference + */ +static char *fontfamilies[] = { + "Liberation Sans", + "Arial", + "NcrBI4nh", + "luximbi", + "FreeSans", + "DejaVu Sans", + NULL, +}; + +static void +font_destroy(struct graphics_font_priv *font) +{ + g_free(font); + /* TODO: free font->face */ +} + +static struct graphics_font_methods font_methods = { + font_destroy +}; + + +static void +font_freetype_text_destroy(struct font_freetype_text *text) +{ + int i; + struct font_freetype_glyph **gp; + + gp = text->glyph; + i = text->glyph_count; + while (i-- > 0) + g_free(*gp++); + g_free(text); +} + +#if USE_CACHING +static FT_Error face_requester( FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face* aface ) +{ + FT_Error ret; + char *fontfile,*fontindex; + if (! face_id) + return FT_Err_Invalid_Handle; + fontfile=g_strdup((char *)face_id); + dbg(1,"fontfile=%s\n", fontfile); + fontindex=strrchr(fontfile,'/'); + if (! fontindex) { + g_free(fontfile); + return FT_Err_Invalid_Handle; + } + *fontindex++='\0'; + dbg(1,"new face %s %d\n", fontfile, atoi(fontindex)); + ret = FT_New_Face( library, fontfile, atoi(fontindex), aface ); + if(ret) { + dbg(0,"Error while creating freetype face: %d\n", ret); + return ret; + } + if((ret = FT_Select_Charmap(*aface, FT_ENCODING_UNICODE))) { + dbg(0,"Error while creating freetype face: %d\n", ret); + } + return 0; +} +#endif + +/** + * Load a new font using the fontconfig library. + * First search for each of the font families and require and exact match on family + * If no font found, let fontconfig pick the best match + * @param graphics_priv FIXME + * @param graphics_font_methods FIXME + * @param fontfamily the preferred font family + * @param size requested size of fonts + * @param flags extra flags for the font (bold,etc) + * @returns <> +*/ +static struct font_freetype_font * +font_freetype_font_new(struct graphics_priv *gr, + struct graphics_font_methods *meth, + char *fontfamily, int size, int flags) +{ + struct font_freetype_font *font = + g_new(struct font_freetype_font, 1); + + *meth = font_methods; + int exact, found=0; + char **family, **family_sav; +#if USE_CACHING + char *idstr; + FT_Face face; +#endif +#ifndef HAVE_FONTCONFIG + char *name; +#endif + + if (!library_init) { + FT_Init_FreeType(&library); +#if USE_CACHING + FTC_Manager_New( library, 0, 0, 0, &face_requester, NULL, &manager); + FTC_ImageCache_New( manager, &image_cache); + FTC_CMapCache_New( manager, &charmap_cache); + FTC_SBitCache_New( manager, &sbit_cache); +#endif + library_init = 1; + } + font->size=size; +#ifdef HAVE_FONTCONFIG + dbg(2, " about to search for fonts, preferred = %s\n", fontfamily); + family = g_malloc(sizeof(fontfamilies) + sizeof(fontfamily)); + if (fontfamily) { + memcpy(family, &fontfamily, sizeof(fontfamily)); + memcpy(family + 1, fontfamilies, sizeof(fontfamilies)); + } else { + memcpy(family, fontfamilies, sizeof(fontfamilies)); + } + family_sav=family; + for (exact = 1; !found && exact >= 0; exact--) { + family=family_sav; + + + while (*family && !found) { + dbg(2, "Looking for font family %s. exact=%d\n", + *family, exact); + FcPattern *required = + FcPatternBuild(NULL, FC_FAMILY, FcTypeString, + *family, NULL); + if (flags) + FcPatternAddInteger(required, FC_WEIGHT, + FC_WEIGHT_BOLD); + FcConfigSubstitute(FcConfigGetCurrent(), required, + FcMatchFont); + FcDefaultSubstitute(required); + FcResult result; + FcPattern *matched = + FcFontMatch(FcConfigGetCurrent(), required, + &result); + if (matched) { + FcValue v1, v2; + FcChar8 *fontfile; + int fontindex; + FcPatternGet(required, FC_FAMILY, 0, &v1); + FcPatternGet(matched, FC_FAMILY, 0, &v2); + FcResult r1 = + FcPatternGetString(matched, FC_FILE, 0, + &fontfile); + FcResult r2 = + FcPatternGetInteger(matched, FC_INDEX, + 0, &fontindex); + if ((r1 == FcResultMatch) + && (r2 == FcResultMatch) + && (FcValueEqual(v1, v2) || !exact)) { + dbg(2, + "About to load font from file %s index %d\n", + fontfile, fontindex); +#if USE_CACHING + idstr=g_strdup_printf("%s/%d", fontfile, fontindex); + font->scaler.face_id=(FTC_FaceID)atom(idstr); + g_free(idstr); +#if HAVE_LOOKUP_SCALER + font->scaler.width=0; + font->scaler.height=size; + font->scaler.pixel=0; + font->scaler.x_res=300; + font->scaler.y_res=300; +#else + font->scaler.width=size/15; + font->scaler.height=size/15; + font->scaler.flags=FT_LOAD_DEFAULT; +#endif + FTC_Manager_LookupFace(manager, font->scaler.face_id, &face); + font->charmap_index=face->charmap ? FT_Get_Charmap_Index(face->charmap) : 0; +#else /* USE_CACHING */ + FT_New_Face(library, + (char *) fontfile, + fontindex, + &font->face); +#endif /* USE_CACHING */ + found = 1; + } + FcPatternDestroy(matched); + } + FcPatternDestroy(required); + family++; + } + } + g_free(family_sav); +#else /* HAVE_FONTCONFIG */ +#ifdef FREETYPE_FONTS + { + char *fonts[]={FREETYPE_FONTS}; + name=g_strdup(fonts[flags ? 1:0]); + } +#else + name=g_strdup_printf("%s/fonts/%s-%s.ttf",getenv("NAVIT_SHAREDIR"),"LiberationSans",flags ? "Bold":"Regular"); +#endif + +#if USE_CACHING + idstr=g_strdup_printf("%s/%d", name, 0); + font->scaler.face_id=(FTC_FaceID)atom(idstr); + g_free(idstr); + FTC_Manager_LookupFace(manager, font->scaler.face_id, &face); + font->charmap_index=face->charmap ? FT_Get_Charmap_Index(face->charmap) : 0; +#if HAVE_LOOKUP_SCALER + font->scaler.width=0; + font->scaler.height=size; + font->scaler.pixel=0; + font->scaler.x_res=300; + font->scaler.y_res=300; +#else + font->scaler.width=size/15; + font->scaler.height=size/15; + font->scaler.flags=FT_LOAD_DEFAULT; +#endif + found=1; + FTC_Manager_LookupFace(manager, font->scaler.face_id, &face); + font->charmap_index=face->charmap ? FT_Get_Charmap_Index(face->charmap) : 0; +#else /* USE_CACHING */ + if (!FT_New_Face(library, name, 0, &font->face)) + found=1; +#endif /* USE_CACHING */ + g_free(name); +#endif /* HAVE_FONTCONFIG */ + if (!found) { + dbg(0,"Failed to load font, no labelling\n"); + g_free(font); + return NULL; + } +#if !USE_CACHING + FT_Set_Char_Size(font->face, 0, size, 300, 300); + FT_Select_Charmap(font->face, FT_ENCODING_UNICODE); +#endif + return font; +} + +static int +font_freetype_glyph_get_shadow(struct font_freetype_glyph *g, + unsigned char *data, int depth, int stride, struct color *foreground, struct color *background) +{ + int mask0, mask1, mask2, x, y, w = g->w, h = g->h; + unsigned int bg, fg; + unsigned char *pm, *psp,*ps,*psn; + switch (depth) { + case 1: + fg=0xff; + bg=0x00; + break; + case 8: + fg=foreground->a>>8; + bg=background->a>>8; + break; + case 24: + case 32: + fg=((foreground->a>>8)<<24)| + ((foreground->r>>8)<<16)| + ((foreground->g>>8)<<8)| + ((foreground->b>>8)<<0); + bg=((background->a>>8)<<24)| + ((background->r>>8)<<16)| + ((background->g>>8)<<8)| + ((background->b>>8)<<0); + break; + default: + return 0; + } + for (y = 0; y < h+2; y++) { + if (stride) { + ps = data + stride * y; + } else { + unsigned char **dataptr=(unsigned char **)data; + ps = dataptr[y]; + } + switch (depth) { + case 1: + memset(ps, bg, (w+9)/2); + break; + case 8: + memset(ps, bg, w+2); + break; + case 24: + for (x = 0 ; x < w+2 ; x++) { + ps[x*3]=bg>>16; + ps[x*3+1]=bg>>8; + ps[x*3+2]=bg; + } + break; + case 32: + for (x = 0 ; x < w+2 ; x++) + ((unsigned int *)ps)[x]=bg; + break; + } + } + for (y = 0; y < h; y++) { + pm = g->pixmap + y * w; + if (stride) { + psp = data + stride * y; + ps = psp + stride; + psn = ps + stride; + } else { + unsigned char **dataptr=(unsigned char **)data; + psp = dataptr[y]; + ps = dataptr[y+1]; + psn = dataptr[y+2]; + } + switch (depth) { + case 1: + mask0 = 0x4000; + mask1 = 0xe000; + mask2 = 0x4000; + for (x = 0; x < w; x++) { + if (*pm) { + psp[0] |= (mask0 >> 8); + if (mask0 & 0xff) + psp[1] |= mask0; + ps[0] |= (mask1 >> 8); + if (mask1 & 0xff) + ps[1] |= mask1; + psn[0] |= (mask2 >> 8); + if (mask2 & 0xff) + psn[1] |= mask2; + } + mask0 >>= 1; + mask1 >>= 1; + mask2 >>= 1; + if (! + ((mask0 >> 8) | (mask1 >> 8) | + (mask2 >> 8))) { + mask0 <<= 8; + mask1 <<= 8; + mask2 <<= 8; + psp++; + ps++; + psn++; + } + pm++; + } + break; + case 8: + for (x = 0; x < w; x++) { + if (*pm) { + psp[1] = fg; + ps[0] = fg; + ps[1] = fg; + ps[2] = fg; + psn[1] = fg; + } + psp++; + ps++; + psn++; + pm++; + } + break; + case 24: + for (x = 0; x < w; x++) { + if (*pm) { + psp[3]=fg>>16; + psp[4]=fg>>8; + psp[5]=fg; + ps[0]=fg>>16; + ps[1]=fg>>8; + ps[2]=fg; + ps[3]=fg>>16; + ps[4]=fg>>8; + ps[5]=fg; + ps[6]=fg>>16; + ps[7]=fg>>8; + ps[8]=fg; + psn[3]=fg>>16; + psn[4]=fg>>8; + psn[5]=fg; + } + psp+=3; + ps+=3; + psn+=3; + pm++; + } + break; + case 32: + for (x = 0; x < w; x++) { + if (*pm) { + ((unsigned int *)psp)[1]=fg; + ((unsigned int *)ps)[0]=fg; + ((unsigned int *)ps)[1]=fg; + ((unsigned int *)ps)[2]=fg; + ((unsigned int *)psn)[1]=fg; + } + psp+=4; + ps+=4; + psn+=4; + pm++; + } + break; + } + } + return 1; +} + +static int +font_freetype_glyph_get_glyph(struct font_freetype_glyph *g, + unsigned char *data, int depth, int stride, struct color *fg, struct color *bg, struct color *transparent) +{ + int x, y, w = g->w, h = g->h; + unsigned int tr; + unsigned char v,vi,*pm, *ps; + switch (depth) { + case 8: + tr=transparent->a>>8; + break; + case 24: + case 32: + tr=((transparent->a>>8)<<24)| + ((transparent->r>>8)<<16)| + ((transparent->g>>8)<<8)| + ((transparent->b>>8)<<0); + break; + default: + return 0; + } + for (y = 0; y < h; y++) { + pm = g->pixmap + y * w; + if (stride) { + ps = data + stride*y; + } else { + unsigned char **dataptr=(unsigned char **)data; + ps = dataptr[y]; + } + switch (depth) { + case 8: + for (x = 0; x < w; x++) { + v=*pm; + if (v) + *ps=fg->a; + else + *ps=tr; + ps++; + pm++; + } + break; + case 24: + for (x = 0; x < w; x++) { + v=*pm; + if (v) { + vi=255-v; + ps[0]=(((fg->r*v+bg->r*vi)/255)>>8); + ps[1]=(((fg->g*v+bg->g*vi)/255)>>8); + ps[2]=(((fg->b*v+bg->b*vi)/255)>>8); + } else { + ps[0]=tr >> 16; + ps[1]=tr >> 8; + ps[2]=tr; + } + ps+=3; + pm++; + } + break; + case 32: + for (x = 0; x < w; x++) { + v=*pm; + if (v) { + vi=255-v; + ((unsigned int *)ps)[0]= + ((((fg->a*v+bg->a*vi)/255)>>8)<<24)| + ((((fg->r*v+bg->r*vi)/255)>>8)<<16)| + ((((fg->g*v+bg->g*vi)/255)>>8)<<8)| + ((((fg->b*v+bg->b*vi)/255)>>8)<<0); + } else + ((unsigned int *)ps)[0]=tr; + ps+=4; + pm++; + } + break; + } + } + return 1; +} + +static struct font_freetype_methods methods = { + font_freetype_font_new, + font_freetype_get_text_bbox, + font_freetype_text_new, + font_freetype_text_destroy, + font_freetype_glyph_get_shadow, + font_freetype_glyph_get_glyph, +}; + +static struct font_priv * +font_freetype_new(void *meth) +{ + *((struct font_freetype_methods *) meth) = methods; + return &dummy; +} + +void +plugin_init(void) +{ + plugin_register_font_type("freetype", font_freetype_new); +#ifdef HAVE_FONTCONFIG + FcInit(); +#endif +} diff --git a/navit/font/freetype/font_freetype.h b/navit/font/freetype/font_freetype.h new file mode 100644 index 0000000..246c47b --- /dev/null +++ b/navit/font/freetype/font_freetype.h @@ -0,0 +1,55 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ +struct font_freetype_font; +struct font_freetype_glyph; + +struct font_freetype_methods { + struct font_freetype_font *(*font_new) (struct graphics_priv * gr, + struct + graphics_font_methods * + meth, char *font, int size, + int flags); + void (*get_text_bbox) (struct graphics_priv * gr, + struct font_freetype_font * font, + char *text, int dx, int dy, + struct point * ret, int estimate); + struct font_freetype_text *(*text_new) (char *text, + struct font_freetype_font * + font, int dx, int dy); + void (*text_destroy) (struct font_freetype_text * text); + int (*get_shadow) (struct font_freetype_glyph * glyph, + unsigned char *data, int depth, int stride, struct color *fg, struct color *tr); + int (*get_glyph) (struct font_freetype_glyph * glyph, + unsigned char *data, int depth, int stride, + struct color * fg, struct color * bg, struct color *tr); +}; + +struct font_freetype_glyph { + int x, y, w, h, dx, dy; + unsigned char *pixmap; +}; + +struct font_freetype_text { + int x1, y1; + int x2, y2; + int x3, y3; + int x4, y4; + int glyph_count; + struct font_freetype_glyph *glyph[0]; +}; diff --git a/navit/fonts/Makefile.am b/navit/fonts/Makefile.am new file mode 100644 index 0000000..d8ea263 --- /dev/null +++ b/navit/fonts/Makefile.am @@ -0,0 +1,15 @@ +include $(top_srcdir)/Makefile.inc + +fonts_DATA = +fonts_DATA += LiberationMono-Bold.ttf +fonts_DATA += LiberationMono-BoldItalic.ttf +fonts_DATA += LiberationMono-Italic.ttf +fonts_DATA += LiberationMono-Regular.ttf +fonts_DATA += LiberationSans-Bold.ttf +fonts_DATA += LiberationSans-BoldItalic.ttf +fonts_DATA += LiberationSans-Italic.ttf +fonts_DATA += LiberationSans-Regular.ttf +fonts_DATA += LiberationSerif-Bold.ttf +fonts_DATA += LiberationSerif-BoldItalic.ttf +fonts_DATA += LiberationSerif-Italic.ttf +fonts_DATA += LiberationSerif-Regular.ttf diff --git a/navit/fonts/Makefile.in b/navit/fonts/Makefile.in new file mode 100644 index 0000000..c9ba4fb --- /dev/null +++ b/navit/fonts/Makefile.in @@ -0,0 +1,575 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/fonts +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(fontsdir)" +DATA = $(fonts_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +fonts_DATA = LiberationMono-Bold.ttf LiberationMono-BoldItalic.ttf \ + LiberationMono-Italic.ttf LiberationMono-Regular.ttf \ + LiberationSans-Bold.ttf LiberationSans-BoldItalic.ttf \ + LiberationSans-Italic.ttf LiberationSans-Regular.ttf \ + LiberationSerif-Bold.ttf LiberationSerif-BoldItalic.ttf \ + LiberationSerif-Italic.ttf LiberationSerif-Regular.ttf +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/fonts/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/fonts/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-fontsDATA: $(fonts_DATA) + @$(NORMAL_INSTALL) + test -z "$(fontsdir)" || $(MKDIR_P) "$(DESTDIR)$(fontsdir)" + @list='$(fonts_DATA)'; test -n "$(fontsdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(fontsdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(fontsdir)" || exit $$?; \ + done + +uninstall-fontsDATA: + @$(NORMAL_UNINSTALL) + @list='$(fonts_DATA)'; test -n "$(fontsdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(fontsdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(fontsdir)" && rm -f $$files +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(fontsdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-fontsDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-fontsDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-fontsDATA install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am uninstall-fontsDATA + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/fonts/README b/navit/fonts/README new file mode 100644 index 0000000..51a5329 --- /dev/null +++ b/navit/fonts/README @@ -0,0 +1,68 @@ +1. What's this? +=============== + +The Liberation Fonts are intended to be open font replacements for the three +most commonly used fonts on Microsoft systems: Times New Roman, Arial, and +Courier New. + + +2. Requirements +=============== + + * fontforge. + - http://fontforge.sourceforge.net + + +3. Install +========== + +3.1 Decompress tarball + + You can extract the files by following command: + + $ tar zxvf liberation-fonts-[VERSION].tar.gz + +3.2 Build from the source + + Change into directory liberation-fonts-[VERSION]/ and build from sources by + following commands: + + $ cd liberation-fonts-[VERSION] + $ make + + The built font files will be available in 'build' directory. + +3.3 Install to system + + You can manually install the fonts by copying them to ~/.fonts for a + particular user, or to /usr/share/fonts/truetype/liberation for system-wide + availability + + +4. Usage +======== + +The fonts should be installed and detected by the system after installation. + + +5. License +========== + +Read the GPL v2 file 'COPYING' and the Liberation Fonts EULA file 'License.txt' +for more information. + +6. Credits +========== + +Special thanks to all liberation-fonts developers and users! + + * Caius Chance + - Current project maintainer. + + * Mark Webbink + - Coordinator. + + * Steve Matteson + - Ascender Corporation + + * And, all other contributors. diff --git a/navit/glib_slice.h b/navit/glib_slice.h new file mode 100644 index 0000000..bbc30c6 --- /dev/null +++ b/navit/glib_slice.h @@ -0,0 +1,7 @@ +#include +#if GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 10 +#define g_slice_alloc0 g_malloc0 +#define g_slice_new0(x) g_new0(x,1) +#define g_slice_free(x,y) g_free(y) +#define g_slice_free1(x,y) g_free(y) +#endif diff --git a/navit/graphics.c b/navit/graphics.c new file mode 100644 index 0000000..3b6a7fc --- /dev/null +++ b/navit/graphics.c @@ -0,0 +1,2639 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +//############################################################################################################## +//# +//# File: graphics.c +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//# +//############################################################################################################## + +#include +#include +#include +#include +#include "config.h" +#include "debug.h" +#include "string.h" +#include "draw_info.h" +#include "point.h" +#include "graphics.h" +#include "projection.h" +#include "item.h" +#include "map.h" +#include "coord.h" +#include "transform.h" +#include "plugin.h" +#include "profile.h" +#include "mapset.h" +#include "layout.h" +#include "route.h" +#include "util.h" +#include "callback.h" +#include "file.h" +#include "event.h" + + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +struct graphics +{ + struct graphics* parent; + struct graphics_priv *priv; + struct graphics_methods meth; + char *default_font; + int font_len; + struct graphics_font **font; + struct graphics_gc *gc[3]; + struct attr **attrs; + struct callback_list *cbl; + struct point_rect r; + int gamma,brightness,contrast; + int colormgmt; + int font_size; + GList *selection; + int disabled; + /* + * Counter for z_order of displayitems; + */ + int current_z_order; +}; + +struct display_context +{ + struct graphics *gra; + struct element *e; + struct graphics_gc *gc; + struct graphics_gc *gc_background; + struct graphics_image *img; + enum projection pro; + int mindist; + struct transformation *trans; + enum item_type type; + int maxlen; +}; + +#define HASH_SIZE 1024 +struct hash_entry +{ + enum item_type type; + struct displayitem *di; +}; + + +struct displaylist { + int busy; + int workload; + struct callback *cb; + struct layout *layout, *layout_hashed; + struct display_context dc; + int order, order_hashed, max_offset; + struct mapset *ms; + struct mapset_handle *msh; + struct map *m; + int conv; + struct map_selection *sel; + struct map_rect *mr; + struct callback *idle_cb; + struct event_idle *idle_ev; + unsigned int seq; + struct hash_entry hash_entries[HASH_SIZE]; +}; + + +struct displaylist_icon_cache { + unsigned int seq; + +}; + +static void draw_circle(struct point *pnt, int diameter, int scale, int start, int len, struct point *res, int *pos, int dir); +static void graphics_process_selection(struct graphics *gra, struct displaylist *dl); +static void graphics_gc_init(struct graphics *this_); + +static void +clear_hash(struct displaylist *dl) +{ + int i; + for (i = 0 ; i < HASH_SIZE ; i++) + dl->hash_entries[i].type=type_none; +} + +static struct hash_entry * +get_hash_entry(struct displaylist *dl, enum item_type type) +{ + int hashidx=(type*2654435761UL) & (HASH_SIZE-1); + int offset=dl->max_offset; + do { + if (!dl->hash_entries[hashidx].type) + return NULL; + if (dl->hash_entries[hashidx].type == type) + return &dl->hash_entries[hashidx]; + hashidx=(hashidx+1)&(HASH_SIZE-1); + } while (offset-- > 0); + return NULL; +} + +static struct hash_entry * +set_hash_entry(struct displaylist *dl, enum item_type type) +{ + int hashidx=(type*2654435761UL) & (HASH_SIZE-1); + int offset=0; + for (;;) { + if (!dl->hash_entries[hashidx].type) { + dl->hash_entries[hashidx].type=type; + if (dl->max_offset < offset) + dl->max_offset=offset; + return &dl->hash_entries[hashidx]; + } + if (dl->hash_entries[hashidx].type == type) + return &dl->hash_entries[hashidx]; + hashidx=(hashidx+1)&(HASH_SIZE-1); + offset++; + } + return NULL; +} + +static int +graphics_set_attr_do(struct graphics *gra, struct attr *attr) +{ + switch (attr->type) { + case attr_gamma: + gra->gamma=attr->u.num; + break; + case attr_brightness: + gra->brightness=attr->u.num; + break; + case attr_contrast: + gra->contrast=attr->u.num; + break; + case attr_font_size: + gra->font_size=attr->u.num; + return 1; + default: + return 0; + } + gra->colormgmt=(gra->gamma != 65536 || gra->brightness != 0 || gra->contrast != 65536); + graphics_gc_init(gra); + return 1; +} + +int +graphics_set_attr(struct graphics *gra, struct attr *attr) +{ + int ret=1; + dbg(0,"enter\n"); + if (gra->meth.set_attr) + ret=gra->meth.set_attr(gra->priv, attr); + if (!ret) + ret=graphics_set_attr_do(gra, attr); + return ret != 0; +} + +void +graphics_set_rect(struct graphics *gra, struct point_rect *pr) +{ + gra->r=*pr; +} + +/** + * Creates a new graphics object + * attr type required + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +struct graphics * graphics_new(struct attr *parent, struct attr **attrs) +{ + struct graphics *this_; + struct attr *type_attr; + struct graphics_priv * (*graphicstype_new)(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl); + + if (! (type_attr=attr_search(attrs, NULL, attr_type))) { + return NULL; + } + + graphicstype_new=plugin_get_graphics_type(type_attr->u.str); + if (! graphicstype_new) + return NULL; + this_=g_new0(struct graphics, 1); + this_->cbl=callback_list_new(); + this_->priv=(*graphicstype_new)(parent->u.navit, &this_->meth, attrs, this_->cbl); + this_->attrs=attr_list_dup(attrs); + this_->brightness=0; + this_->contrast=65536; + this_->gamma=65536; + this_->font_size=20; + while (*attrs) { + graphics_set_attr_do(this_,*attrs); + attrs++; + } + return this_; +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +int graphics_get_attr(struct graphics *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +struct graphics * graphics_overlay_new(struct graphics *parent, struct point *p, int w, int h, int alpha, int wraparound) +{ + struct graphics *this_; + struct point_rect pr; + if (!parent->meth.overlay_new) + return NULL; + this_=g_new0(struct graphics, 1); + this_->priv=parent->meth.overlay_new(parent->priv, &this_->meth, p, w, h, alpha, wraparound); + this_->parent = parent; + pr.lu.x=0; + pr.lu.y=0; + pr.rl.x=w; + pr.rl.y=h; + this_->font_size=20; + graphics_set_rect(this_, &pr); + if (!this_->priv) { + g_free(this_); + this_=NULL; + } + return this_; +} + +/** + * @brief Alters the size, position, alpha and wraparound for an overlay + * + * @param this_ The overlay's graphics struct + * @param p The new position of the overlay + * @param w The new width of the overlay + * @param h The new height of the overlay + * @param alpha The new alpha of the overlay + * @param wraparound The new wraparound of the overlay + */ +void +graphics_overlay_resize(struct graphics *this_, struct point *p, int w, int h, int alpha, int wraparound) +{ + if (! this_->meth.overlay_resize) { + return; + } + + this_->meth.overlay_resize(this_->priv, p, w, h, alpha, wraparound); +} + +static void +graphics_gc_init(struct graphics *this_) +{ + struct color background={ COLOR_BACKGROUND_ }; + struct color black={ COLOR_BLACK_ }; + struct color white={ COLOR_WHITE_ }; + if (!this_->gc[0] || !this_->gc[1] || !this_->gc[2]) + return; + graphics_gc_set_background(this_->gc[0], &background ); + graphics_gc_set_foreground(this_->gc[0], &background ); + graphics_gc_set_background(this_->gc[1], &black ); + graphics_gc_set_foreground(this_->gc[1], &white ); + graphics_gc_set_background(this_->gc[2], &white ); + graphics_gc_set_foreground(this_->gc[2], &black ); +} + + + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_init(struct graphics *this_) +{ + if (this_->gc[0]) + return; + this_->gc[0]=graphics_gc_new(this_); + this_->gc[1]=graphics_gc_new(this_); + this_->gc[2]=graphics_gc_new(this_); + graphics_gc_init(this_); + graphics_background_gc(this_, this_->gc[0]); +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void * graphics_get_data(struct graphics *this_, const char *type) +{ + return (this_->meth.get_data(this_->priv, type)); +} + +void graphics_add_callback(struct graphics *this_, struct callback *cb) +{ + callback_list_add(this_->cbl, cb); +} + +void graphics_remove_callback(struct graphics *this_, struct callback *cb) +{ + callback_list_remove(this_->cbl, cb); +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +struct graphics_font * graphics_font_new(struct graphics *gra, int size, int flags) +{ + struct graphics_font *this_; + + this_=g_new0(struct graphics_font,1); + this_->priv=gra->meth.font_new(gra->priv, &this_->meth, gra->default_font, size, flags); + return this_; +} + +struct graphics_font * graphics_named_font_new(struct graphics *gra, char *font, int size, int flags) +{ + struct graphics_font *this_; + + this_=g_new0(struct graphics_font,1); + this_->priv=gra->meth.font_new(gra->priv, &this_->meth, font, size, flags); + return this_; +} + + +/** + * Destroy graphics + * Called when navit exits + * @param gra The graphics instance + * @returns nothing + * @author David Tegze (02/2011) + */ +void graphics_free(struct graphics *gra) +{ + if (!gra) + return; + graphics_gc_destroy(gra->gc[0]); + graphics_gc_destroy(gra->gc[1]); + graphics_gc_destroy(gra->gc[2]); + gra->meth.graphics_destroy(gra->priv); + g_free(gra->default_font); + graphics_font_destroy_all(gra); + g_free(gra); +} + +/** + * Free all loaded fonts. + * Used when switching layouts. + * @param gra The graphics instance + * @returns nothing + * @author Sarah Nordstrom (05/2008) + */ +void graphics_font_destroy_all(struct graphics *gra) +{ + int i; + for(i = 0 ; i < gra->font_len; i++) { + if(!gra->font[i]) continue; + gra->font[i]->meth.font_destroy(gra->font[i]->priv); + gra->font[i] = NULL; + } +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +struct graphics_gc * graphics_gc_new(struct graphics *gra) +{ + struct graphics_gc *this_; + + this_=g_new0(struct graphics_gc,1); + this_->priv=gra->meth.gc_new(gra->priv, &this_->meth); + this_->gra=gra; + return this_; +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_gc_destroy(struct graphics_gc *gc) +{ + if (!gc) + return; + gc->meth.gc_destroy(gc->priv); + g_free(gc); +} + +static void +graphics_convert_color(struct graphics *gra, struct color *in, struct color *out) +{ + *out=*in; + if (gra->brightness) { + out->r+=gra->brightness; + out->g+=gra->brightness; + out->b+=gra->brightness; + } + if (gra->contrast != 65536) { + out->r=out->r*gra->contrast/65536; + out->g=out->g*gra->contrast/65536; + out->b=out->b*gra->contrast/65536; + } + if (out->r < 0) + out->r=0; + if (out->r > 65535) + out->r=65535; + if (out->g < 0) + out->g=0; + if (out->g > 65535) + out->g=65535; + if (out->b < 0) + out->b=0; + if (out->b > 65535) + out->b=65535; + if (gra->gamma != 65536) { + out->r=pow(out->r/65535.0,gra->gamma/65536.0)*65535.0; + out->g=pow(out->g/65535.0,gra->gamma/65536.0)*65535.0; + out->b=pow(out->b/65535.0,gra->gamma/65536.0)*65535.0; + } +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_gc_set_foreground(struct graphics_gc *gc, struct color *c) +{ + struct color cn; + if (gc->gra->colormgmt) { + graphics_convert_color(gc->gra, c, &cn); + c=&cn; + } + gc->meth.gc_set_foreground(gc->priv, c); +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_gc_set_background(struct graphics_gc *gc, struct color *c) +{ + struct color cn; + if (gc->gra->colormgmt) { + graphics_convert_color(gc->gra, c, &cn); + c=&cn; + } + gc->meth.gc_set_background(gc->priv, c); +} + + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_gc_set_stipple(struct graphics_gc *gc, struct graphics_image *img) +{ + gc->meth.gc_set_stipple(gc->priv, img ? img->priv : NULL); +} + + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_gc_set_linewidth(struct graphics_gc *gc, int width) +{ + gc->meth.gc_set_linewidth(gc->priv, width); +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_gc_set_dashes(struct graphics_gc *gc, int width, int offset, unsigned char dash_list[], int n) +{ + if (gc->meth.gc_set_dashes) + gc->meth.gc_set_dashes(gc->priv, width, offset, dash_list, n); +} + +/** + * Create a new image from file path scaled to w and h pixels + * @param gra the graphics instance + * @param path path of the image to load + * @param w width to rescale to + * @param h height to rescale to + * @returns <> + * @author Martin Schaller (04/2008) +*/ +struct graphics_image * graphics_image_new_scaled(struct graphics *gra, char *path, int w, int h) +{ + struct graphics_image *this_; + + this_=g_new0(struct graphics_image,1); + this_->height=h; + this_->width=w; + this_->priv=gra->meth.image_new(gra->priv, &this_->meth, path, &this_->width, &this_->height, &this_->hot, 0); + if (! this_->priv) { + g_free(this_); + this_=NULL; + } + return this_; +} + +/** + * Create a new image from file path scaled to w and h pixels and possibly rotated + * @param gra the graphics instance + * @param path path of the image to load + * @param w width to rescale to + * @param h height to rescale to + * @param rotate angle to rotate the image. Warning, graphics might only support 90 degree steps here + * @returns <> + * @author Martin Schaller (04/2008) +*/ +struct graphics_image * graphics_image_new_scaled_rotated(struct graphics *gra, char *path, int w, int h, int rotate) +{ + struct graphics_image *this_; + + this_=g_new0(struct graphics_image,1); + this_->height=h; + this_->width=w; + this_->priv=gra->meth.image_new(gra->priv, &this_->meth, path, &this_->width, &this_->height, &this_->hot, rotate); + if (! this_->priv) { + g_free(this_); + this_=NULL; + } + return this_; +} + +/** + * Create a new image from file path + * @param gra the graphics instance + * @param path path of the image to load + * @returns <> + * @author Martin Schaller (04/2008) +*/ +struct graphics_image * graphics_image_new(struct graphics *gra, char *path) +{ + return graphics_image_new_scaled(gra, path, -1, -1); +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_image_free(struct graphics *gra, struct graphics_image *img) +{ + if (gra->meth.image_free) + gra->meth.image_free(gra->priv, img->priv); + g_free(img); +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_draw_restore(struct graphics *this_, struct point *p, int w, int h) +{ + this_->meth.draw_restore(this_->priv, p, w, h); +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_draw_mode(struct graphics *this_, enum draw_mode_num mode) +{ + this_->meth.draw_mode(this_->priv, mode); +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_draw_lines(struct graphics *this_, struct graphics_gc *gc, struct point *p, int count) +{ + this_->meth.draw_lines(this_->priv, gc->priv, p, count); +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_draw_circle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int r) +{ + struct point *pnt=g_alloca(sizeof(struct point)*(r*4+64)); + int i=0; + + if(this_->meth.draw_circle) + this_->meth.draw_circle(this_->priv, gc->priv, p, r); + else + { + draw_circle(p, r, 0, -1, 1026, pnt, &i, 1); + pnt[i] = pnt[0]; + i++; + this_->meth.draw_lines(this_->priv, gc->priv, pnt, i); + } +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_draw_rectangle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int w, int h) +{ + this_->meth.draw_rectangle(this_->priv, gc->priv, p, w, h); +} + +void graphics_draw_rectangle_rounded(struct graphics *this_, struct graphics_gc *gc, struct point *plu, int w, int h, int r, int fill) +{ + struct point *p=g_alloca(sizeof(struct point)*(r*4+32)); + struct point pi0={plu->x+r,plu->y+r}; + struct point pi1={plu->x+w-r,plu->y+r}; + struct point pi2={plu->x+w-r,plu->y+h-r}; + struct point pi3={plu->x+r,plu->y+h-r}; + int i=0; + + draw_circle(&pi2, r*2, 0, -1, 258, p, &i, 1); + draw_circle(&pi1, r*2, 0, 255, 258, p, &i, 1); + draw_circle(&pi0, r*2, 0, 511, 258, p, &i, 1); + draw_circle(&pi3, r*2, 0, 767, 258, p, &i, 1); + p[i]=p[0]; + i++; + if (fill) + this_->meth.draw_polygon(this_->priv, gc->priv, p, i); + else + this_->meth.draw_lines(this_->priv, gc->priv, p, i); +} + + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_draw_text(struct graphics *this_, struct graphics_gc *gc1, struct graphics_gc *gc2, struct graphics_font *font, char *text, struct point *p, int dx, int dy) +{ + this_->meth.draw_text(this_->priv, gc1->priv, gc2 ? gc2->priv : NULL, font->priv, text, p, dx, dy); +} + + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_get_text_bbox(struct graphics *this_, struct graphics_font *font, char *text, int dx, int dy, struct point *ret, int estimate) +{ + this_->meth.get_text_bbox(this_->priv, font->priv, text, dx, dy, ret, estimate); +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_overlay_disable(struct graphics *this_, int disable) +{ + this_->disabled = disable; + if (this_->meth.overlay_disable) + this_->meth.overlay_disable(this_->priv, disable); +} + +int graphics_is_disabled(struct graphics *this_) +{ + return this_->disabled || (this_->parent && this_->parent->disabled); +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_draw_image(struct graphics *this_, struct graphics_gc *gc, struct point *p, struct graphics_image *img) +{ + this_->meth.draw_image(this_->priv, gc->priv, p, img->priv); +} + + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +int +graphics_draw_drag(struct graphics *this_, struct point *p) +{ + if (!this_->meth.draw_drag) + return 0; + this_->meth.draw_drag(this_->priv, p); + return 1; +} + +void +graphics_background_gc(struct graphics *this_, struct graphics_gc *gc) +{ + this_->meth.background_gc(this_->priv, gc ? gc->priv : NULL); +} + +#include "attr.h" +#include "popup.h" +#include + + +#if 0 +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void popup_view_html(struct popup_item *item, char *file) +{ + char command[1024]; + sprintf(command,"firefox %s", file); + system(command); +} + +struct transformatin *tg; +enum projection pg; + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void graphics_popup(struct display_list *list, struct popup_item **popup) +{ + struct item *item; + struct attr attr; + struct map_rect *mr; + struct coord c; + struct popup_item *curr_item,*last=NULL; + item=list->data; + mr=map_rect_new(item->map, NULL, NULL, 0); + printf("id hi=0x%x lo=0x%x\n", item->id_hi, item->id_lo); + item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); + if (item) { + if (item_attr_get(item, attr_name, &attr)) { + curr_item=popup_item_new_text(popup,attr.u.str,1); + if (item_attr_get(item, attr_info_html, &attr)) { + popup_item_new_func(&last,"HTML Info",1, popup_view_html, g_strdup(attr.u.str)); + } + if (item_attr_get(item, attr_price_html, &attr)) { + popup_item_new_func(&last,"HTML Preis",2, popup_view_html, g_strdup(attr.u.str)); + } + curr_item->submenu=last; + } + } + map_rect_destroy(mr); +} +#endif + + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +struct displayitem { + struct displayitem *next; + struct item item; + char *label; + int z_order; + int count; + struct coord c[0]; +}; + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +static void xdisplay_free(struct displaylist *dl) +{ + int i; + for (i = 0 ; i < HASH_SIZE ; i++) { + struct displayitem *di=dl->hash_entries[i].di; + while (di) { + struct displayitem *next=di->next; + g_free(di); + di=next; + } + dl->hash_entries[i].di=NULL; + } +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +static void display_add(struct hash_entry *entry, struct item *item, int count, struct coord *c, char **label, int label_count) +{ + struct displayitem *di; + int len,i; + char *p; + + len=sizeof(*di)+count*sizeof(*c); + if (label && label_count) { + for (i = 0 ; i < label_count ; i++) { + if (label[i]) + len+=strlen(label[i])+1; + else + len++; + } + } + p=g_malloc(len); + + di=(struct displayitem *)p; + p+=sizeof(*di)+count*sizeof(*c); + di->item=*item; + di->z_order=0; + if (label && label_count) { + di->label=p; + for (i = 0 ; i < label_count ; i++) { + if (label[i]) { + strcpy(p, label[i]); + p+=strlen(label[i])+1; + } else + *p++='\0'; + } + } else + di->label=NULL; + di->count=count; + memcpy(di->c, c, count*sizeof(*c)); + di->next=entry->di; + entry->di=di; +} + + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +static void label_line(struct graphics *gra, struct graphics_gc *fg, struct graphics_gc *bg, struct graphics_font *font, struct point *p, int count, char *label) +{ + int i,x,y,tl,tlm,th,thm,tlsq,l; + float lsq; + double dx,dy; + struct point p_t; + struct point pb[5]; + + if (gra->meth.get_text_bbox) { + gra->meth.get_text_bbox(gra->priv, font->priv, label, 0x10000, 0x0, pb, 1); + tl=(pb[2].x-pb[0].x); + th=(pb[0].y-pb[1].y); + } else { + tl=strlen(label)*4; + th=8; + } + tlm=tl*32; + thm=th*36; + tlsq = tlm*tlm; + for (i = 0 ; i < count-1 ; i++) { + dx=p[i+1].x-p[i].x; + dx*=32; + dy=p[i+1].y-p[i].y; + dy*=32; + lsq = dx*dx+dy*dy; + if (lsq > tlsq) { + l=(int)sqrtf(lsq); + x=p[i].x; + y=p[i].y; + if (dx < 0) { + dx=-dx; + dy=-dy; + x=p[i+1].x; + y=p[i+1].y; + } + x+=(l-tlm)*dx/l/64; + y+=(l-tlm)*dy/l/64; + x-=dy*thm/l/64; + y+=dx*thm/l/64; + p_t.x=x; + p_t.y=y; +#if 0 + dbg(0,"display_text: '%s', %d, %d, %d, %d %d\n", label, x, y, dx*0x10000/l, dy*0x10000/l, l); +#endif + if (x < gra->r.rl.x && x + tl > gra->r.lu.x && y + tl > gra->r.lu.y && y - tl < gra->r.rl.y) + gra->meth.draw_text(gra->priv, fg->priv, bg?bg->priv:NULL, font->priv, label, &p_t, dx*0x10000/l, dy*0x10000/l); + } + } +} + +static void display_draw_arrow(struct point *p, int dx, int dy, int l, struct graphics_gc *gc, struct graphics *gra) +{ + struct point pnt[3]; + pnt[0]=pnt[1]=pnt[2]=*p; + pnt[0].x+=-dx*l/65536+dy*l/65536; + pnt[0].y+=-dy*l/65536-dx*l/65536; + pnt[2].x+=-dx*l/65536-dy*l/65536; + pnt[2].y+=-dy*l/65536+dx*l/65536; + gra->meth.draw_lines(gra->priv, gc->priv, pnt, 3); +} + +static void display_draw_arrows(struct graphics *gra, struct graphics_gc *gc, struct point *pnt, int count) +{ + int i,dx,dy,l; + struct point p; + for (i = 0 ; i < count-1 ; i++) { + dx=pnt[i+1].x-pnt[i].x; + dy=pnt[i+1].y-pnt[i].y; + l=sqrt(dx*dx+dy*dy); + if (l) { + dx=dx*65536/l; + dy=dy*65536/l; + p=pnt[i]; + p.x+=dx*15/65536; + p.y+=dy*15/65536; + display_draw_arrow(&p, dx, dy, 10, gc, gra); + p=pnt[i+1]; + p.x-=dx*15/65536; + p.y-=dy*15/65536; + display_draw_arrow(&p, dx, dy, 10, gc, gra); + } + } +} + +static int +intersection(struct point * a1, int adx, int ady, struct point * b1, int bdx, int bdy, + struct point * res) +{ + int n, a, b; + n = bdy * adx - bdx * ady; + a = bdx * (a1->y - b1->y) - bdy * (a1->x - b1->x); + b = adx * (a1->y - b1->y) - ady * (a1->x - b1->x); + if (n < 0) { + n = -n; + a = -a; + b = -b; + } +#if 0 + if (a < 0 || b < 0) + return 0; + if (a > n || b > n) + return 0; +#endif + if (n == 0) + return 0; + res->x = a1->x + a * adx / n; + res->y = a1->y + a * ady / n; + return 1; +} + +struct circle { + short x,y,fowler; +} circle64[]={ +{0,128,0}, +{13,127,13}, +{25,126,25}, +{37,122,38}, +{49,118,53}, +{60,113,67}, +{71,106,85}, +{81,99,104}, +{91,91,128}, +{99,81,152}, +{106,71,171}, +{113,60,189}, +{118,49,203}, +{122,37,218}, +{126,25,231}, +{127,13,243}, +{128,0,256}, +{127,-13,269}, +{126,-25,281}, +{122,-37,294}, +{118,-49,309}, +{113,-60,323}, +{106,-71,341}, +{99,-81,360}, +{91,-91,384}, +{81,-99,408}, +{71,-106,427}, +{60,-113,445}, +{49,-118,459}, +{37,-122,474}, +{25,-126,487}, +{13,-127,499}, +{0,-128,512}, +{-13,-127,525}, +{-25,-126,537}, +{-37,-122,550}, +{-49,-118,565}, +{-60,-113,579}, +{-71,-106,597}, +{-81,-99,616}, +{-91,-91,640}, +{-99,-81,664}, +{-106,-71,683}, +{-113,-60,701}, +{-118,-49,715}, +{-122,-37,730}, +{-126,-25,743}, +{-127,-13,755}, +{-128,0,768}, +{-127,13,781}, +{-126,25,793}, +{-122,37,806}, +{-118,49,821}, +{-113,60,835}, +{-106,71,853}, +{-99,81,872}, +{-91,91,896}, +{-81,99,920}, +{-71,106,939}, +{-60,113,957}, +{-49,118,971}, +{-37,122,986}, +{-25,126,999}, +{-13,127,1011}, +}; + +static void +draw_circle(struct point *pnt, int diameter, int scale, int start, int len, struct point *res, int *pos, int dir) +{ + struct circle *c; + +#if 0 + dbg(0,"diameter=%d start=%d len=%d pos=%d dir=%d\n", diameter, start, len, *pos, dir); +#endif + int count=64; + int end=start+len; + int i,step; + c=circle64; + if (diameter > 128) + step=1; + else if (diameter > 64) + step=2; + else if (diameter > 24) + step=4; + else if (diameter > 8) + step=8; + else + step=16; + if (len > 0) { + while (start < 0) { + start+=1024; + end+=1024; + } + while (end > 0) { + i=0; + while (i < count && c[i].fowler <= start) + i+=step; + while (i < count && c[i].fowler < end) { + if (1< *pos || 0x+((c[i].x*diameter+128)>>8); + res[*pos].y=pnt->y+((c[i].y*diameter+128)>>8); + (*pos)+=dir; + } + i+=step; + } + end-=1024; + start-=1024; + } + } else { + while (start > 1024) { + start-=1024; + end-=1024; + } + while (end < 1024) { + i=count-1; + while (i >= 0 && c[i].fowler >= start) + i-=step; + while (i >= 0 && c[i].fowler > end) { + if (1< *pos || 0x+((c[i].x*diameter+128)>>8); + res[*pos].y=pnt->y+((c[i].y*diameter+128)>>8); + (*pos)+=dir; + } + i-=step; + } + start+=1024; + end+=1024; + } + } +} + + +static int +fowler(int dy, int dx) +{ + int adx, ady; /* Absolute Values of Dx and Dy */ + int code; /* Angular Region Classification Code */ + + adx = (dx < 0) ? -dx : dx; /* Compute the absolute values. */ + ady = (dy < 0) ? -dy : dy; + + code = (adx < ady) ? 1 : 0; + if (dx < 0) + code += 2; + if (dy < 0) + code += 4; + + switch (code) { + case 0: + return (dx == 0) ? 0 : 128*ady / adx; /* [ 0, 45] */ + case 1: + return (256 - (128*adx / ady)); /* ( 45, 90] */ + case 3: + return (256 + (128*adx / ady)); /* ( 90,135) */ + case 2: + return (512 - (128*ady / adx)); /* [135,180] */ + case 6: + return (512 + (128*ady / adx)); /* (180,225] */ + case 7: + return (768 - (128*adx / ady)); /* (225,270) */ + case 5: + return (768 + (128*adx / ady)); /* [270,315) */ + case 4: + return (1024 - (128*ady / adx));/* [315,360) */ + } + return 0; +} +static int +int_sqrt(unsigned int n) +{ + unsigned int h, p= 0, q= 1, r= n; + + /* avoid q rollover */ + if(n >= (1<<(sizeof(n)*8-2))) { + q = 1<<(sizeof(n)*8-2); + } else { + while ( q <= n ) { + q <<= 2; + } + q >>= 2; + } + + while ( q != 0 ) { + h = p + q; + p >>= 1; + if ( r >= h ) { + p += q; + r -= h; + } + q >>= 2; + } + return p; +} + +struct offset { + int px,py,nx,ny; +}; + +static void +calc_offsets(int wi, int l, int dx, int dy, struct offset *res) +{ + int x,y; + + x = (dx * wi) / l; + y = (dy * wi) / l; + if (x < 0) { + res->nx = -x/2; + res->px = (x-1)/2; + } else { + res->nx = -(x+1)/2; + res->px = x/2; + } + if (y < 0) { + res->ny = -y/2; + res->py = (y-1)/2; + } else { + res->ny = -(y+1)/2; + res->py = y/2; + } +} + +static void +graphics_draw_polyline_as_polygon(struct graphics *gra, struct graphics_gc *gc, struct point *pnt, int count, int *width, int step) +{ + int maxpoints=200; + struct point *res=g_alloca(sizeof(struct point)*maxpoints); + struct point pos, poso, neg, nego; + int i, dx=0, dy=0, l=0, dxo=0, dyo=0; + struct offset o,oo={0,0,0,0}; + int fow=0, fowo=0, delta; + int wi, ppos = maxpoints/2, npos = maxpoints/2; + int state,prec=5; + int max_circle_points=20; + int lscale=16; + i=0; + for (;;) { + wi=*width; + width+=step; + if (i < count - 1) { + int dxs,dys,lscales; + + dx = (pnt[i + 1].x - pnt[i].x); + dy = (pnt[i + 1].y - pnt[i].y); +#if 0 + l = int_sqrt(dx * dx * lscale * lscale + dy * dy * lscale * lscale); +#else + dxs=dx*dx; + dys=dy*dy; + lscales=lscale*lscale; + if (dxs + dys > lscales) + l = int_sqrt(dxs+dys)*lscale; + else + l = int_sqrt((dxs+dys)*lscales); +#endif + fow=fowler(-dy, dx); + } + if (! l) + l=1; + if (wi*lscale > 10000) + lscale=10000/wi; + dbg_assert(wi*lscale <= 10000); + calc_offsets(wi*lscale, l, dx, dy, &o); + pos.x = pnt[i].x + o.ny; + pos.y = pnt[i].y + o.px; + neg.x = pnt[i].x + o.py; + neg.y = pnt[i].y + o.nx; + if (! i) + state=0; + else if (i == count-1) + state=2; + else if (npos < max_circle_points || ppos >= maxpoints-max_circle_points) + state=3; + else + state=1; + switch (state) { + case 1: + if (fowo != fow) { + poso.x = pnt[i].x + oo.ny; + poso.y = pnt[i].y + oo.px; + nego.x = pnt[i].x + oo.py; + nego.y = pnt[i].y + oo.nx; + delta=fowo-fow; + if (delta < 0) + delta+=1024; + if (delta < 512) { + if (intersection(&pos, dx, dy, &poso, dxo, dyo, &res[ppos])) + ppos++; + res[--npos] = nego; + --npos; + draw_circle(&pnt[i], wi, prec, fowo-512, -delta, res, &npos, -1); + res[npos] = neg; + } else { + res[ppos++] = poso; + draw_circle(&pnt[i], wi, prec, fowo, 1024-delta, res, &ppos, 1); + res[ppos++] = pos; + if (intersection(&neg, dx, dy, &nego, dxo, dyo, &res[npos - 1])) + npos--; + } + } + break; + case 2: + case 3: + res[--npos] = neg; + --npos; + draw_circle(&pnt[i], wi, prec, fow-512, -512, res, &npos, -1); + res[npos] = pos; + res[ppos++] = pos; + dbg_assert(npos > 0); + dbg_assert(ppos < maxpoints); + gra->meth.draw_polygon(gra->priv, gc->priv, res+npos, ppos-npos); + if (state == 2) + break; + npos=maxpoints/2; + ppos=maxpoints/2; + case 0: + res[ppos++] = neg; + draw_circle(&pnt[i], wi, prec, fow+512, 512, res, &ppos, 1); + res[ppos++] = pos; + break; + } + i++; + if (i >= count) + break; + if (step) { + wi=*width; + calc_offsets(wi*lscale, l, dx, dy, &oo); + } else + oo=o; + dxo = -dx; + dyo = -dy; + fowo=fow; + } +} + + +struct wpoint { + int x,y,w; +}; + +static int +clipcode(struct wpoint *p, struct point_rect *r) +{ + int code=0; + if (p->x < r->lu.x) + code=1; + if (p->x > r->rl.x) + code=2; + if (p->y < r->lu.y) + code |=4; + if (p->y > r->rl.y) + code |=8; + return code; +} + + +static int +clip_line(struct wpoint *p1, struct wpoint *p2, struct point_rect *r) +{ + int code1,code2,ret=1; + int dx,dy,dw; + code1=clipcode(p1, r); + if (code1) + ret |= 2; + code2=clipcode(p2, r); + if (code2) + ret |= 4; + dx=p2->x-p1->x; + dy=p2->y-p1->y; + dw=p2->w-p1->w; + while (code1 || code2) { + if (code1 & code2) + return 0; + if (code1 & 1) { + p1->y+=(r->lu.x-p1->x)*dy/dx; + p1->w+=(r->lu.x-p1->x)*dw/dx; + p1->x=r->lu.x; + } else if (code1 & 2) { + p1->y+=(r->rl.x-p1->x)*dy/dx; + p1->w+=(r->rl.x-p1->x)*dw/dx; + p1->x=r->rl.x; + } else if (code1 & 4) { + p1->x+=(r->lu.y-p1->y)*dx/dy; + p1->w+=(r->lu.y-p1->y)*dw/dy; + p1->y=r->lu.y; + } else if (code1 & 8) { + p1->x+=(r->rl.y-p1->y)*dx/dy; + p1->w+=(r->rl.y-p1->y)*dw/dy; + p1->y=r->rl.y; + } + code1=clipcode(p1, r); + if (code1 & code2) + return 0; + if (code2 & 1) { + p2->y+=(r->lu.x-p2->x)*dy/dx; + p2->w+=(r->lu.x-p2->x)*dw/dx; + p2->x=r->lu.x; + } else if (code2 & 2) { + p2->y+=(r->rl.x-p2->x)*dy/dx; + p2->w+=(r->rl.x-p2->x)*dw/dx; + p2->x=r->rl.x; + } else if (code2 & 4) { + p2->x+=(r->lu.y-p2->y)*dx/dy; + p2->w+=(r->lu.y-p2->y)*dw/dy; + p2->y=r->lu.y; + } else if (code2 & 8) { + p2->x+=(r->rl.y-p2->y)*dx/dy; + p2->w+=(r->rl.y-p2->y)*dw/dy; + p2->y=r->rl.y; + } + code2=clipcode(p2, r); + } + return ret; +} + +static void +graphics_draw_polyline_clipped(struct graphics *gra, struct graphics_gc *gc, struct point *pa, int count, int *width, int step, int poly) +{ + struct point *p=g_alloca(sizeof(struct point)*(count+1)); + int *w=g_alloca(sizeof(int)*(count*step+1)); + struct wpoint p1,p2; + int i,code,out=0; + int wmax; + struct point_rect r=gra->r; + + wmax=width[0]; + if (step) { + for (i = 1 ; i < count ; i++) { + if (width[i*step] > wmax) + wmax=width[i*step]; + } + } + if (wmax <= 0) + return; + r.lu.x-=wmax; + r.lu.y-=wmax; + r.rl.x+=wmax; + r.rl.y+=wmax; + for (i = 0 ; i < count ; i++) { + if (i) { + p1.x=pa[i-1].x; + p1.y=pa[i-1].y; + p1.w=width[(i-1)*step]; + p2.x=pa[i].x; + p2.y=pa[i].y; + p2.w=width[i*step]; + /* 0 = invisible, 1 = completely visible, 3 = start point clipped, 5 = end point clipped, 7 both points clipped */ + code=clip_line(&p1, &p2, &r); + if (((code == 1 || code == 5) && i == 1) || (code & 2)) { + p[out].x=p1.x; + p[out].y=p1.y; + w[out*step]=p1.w; + out++; + } + if (code) { + p[out].x=p2.x; + p[out].y=p2.y; + w[out*step]=p2.w; + out++; + } + if (i == count-1 || (code & 4)) { + if (out > 1) { + if (poly) { + graphics_draw_polyline_as_polygon(gra, gc, p, out, w, step); + } else + gra->meth.draw_lines(gra->priv, gc->priv, p, out); + out=0; + } + } + } + } +} + +static int +is_inside(struct point *p, struct point_rect *r, int edge) +{ + switch(edge) { + case 0: + return p->x >= r->lu.x; + case 1: + return p->x <= r->rl.x; + case 2: + return p->y >= r->lu.y; + case 3: + return p->y <= r->rl.y; + default: + return 0; + } +} + +static void +poly_intersection(struct point *p1, struct point *p2, struct point_rect *r, int edge, struct point *ret) +{ + int dx=p2->x-p1->x; + int dy=p2->y-p1->y; + switch(edge) { + case 0: + ret->y=p1->y+(r->lu.x-p1->x)*dy/dx; + ret->x=r->lu.x; + break; + case 1: + ret->y=p1->y+(r->rl.x-p1->x)*dy/dx; + ret->x=r->rl.x; + break; + case 2: + ret->x=p1->x+(r->lu.y-p1->y)*dx/dy; + ret->y=r->lu.y; + break; + case 3: + ret->x=p1->x+(r->rl.y-p1->y)*dx/dy; + ret->y=r->rl.y; + break; + } +} + +static void +graphics_draw_polygon_clipped(struct graphics *gra, struct graphics_gc *gc, struct point *pin, int count_in) +{ + struct point_rect r=gra->r; + struct point *pout,*p,*s,pi,*p1,*p2; + int limit=10000; + struct point *pa1=g_alloca(sizeof(struct point) * (count_in < limit ? count_in*8+1:0)); + struct point *pa2=g_alloca(sizeof(struct point) * (count_in < limit ? count_in*8+1:0)); + int count_out,edge=3; + int i; +#if 0 + r.lu.x+=20; + r.lu.y+=20; + r.rl.x-=20; + r.rl.y-=20; +#endif + if (count_in < limit) { + p1=pa1; + p2=pa2; + } else { + p1=g_new(struct point, count_in*8+1); + p2=g_new(struct point, count_in*8+1); + } + + pout=p1; + for (edge = 0 ; edge < 4 ; edge++) { + p=pin; + s=pin+count_in-1; + count_out=0; + for (i = 0 ; i < count_in ; i++) { + if (is_inside(p, &r, edge)) { + if (! is_inside(s, &r, edge)) { + poly_intersection(s,p,&r,edge,&pi); + pout[count_out++]=pi; + } + pout[count_out++]=*p; + } else { + if (is_inside(s, &r, edge)) { + poly_intersection(p,s,&r,edge,&pi); + pout[count_out++]=pi; + } + } + s=p; + p++; + } + count_in=count_out; + if (pin == p1) { + pin=p2; + pout=p1; + } else { + pin=p1; + pout=p2; + } + } + gra->meth.draw_polygon(gra->priv, gc->priv, pin, count_in); + if (count_in >= limit) { + g_free(p1); + g_free(p2); + } +} + + +static void +display_context_free(struct display_context *dc) +{ + if (dc->gc) + graphics_gc_destroy(dc->gc); + if (dc->gc_background) + graphics_gc_destroy(dc->gc_background); + if (dc->img) + graphics_image_free(dc->gra, dc->img); + dc->gc=NULL; + dc->gc_background=NULL; + dc->img=NULL; +} + +static struct graphics_font * +get_font(struct graphics *gra, int size) +{ + if (size > 64) + size=64; + if (size >= gra->font_len) { + gra->font=g_renew(struct graphics_font *, gra->font, size+1); + while (gra->font_len <= size) + gra->font[gra->font_len++]=NULL; + } + if (! gra->font[size]) + gra->font[size]=graphics_font_new(gra, size*gra->font_size, 0); + return gra->font[size]; +} + +void graphics_draw_text_std(struct graphics *this_, int text_size, char *text, struct point *p) +{ + struct graphics_font *font=get_font(this_, text_size); + struct point bbox[4]; + int i; + + graphics_get_text_bbox(this_, font, text, 0x10000, 0, bbox, 0); + for (i = 0 ; i < 4 ; i++) { + bbox[i].x+=p->x; + bbox[i].y+=p->y; + } + graphics_draw_rectangle(this_, this_->gc[2], &bbox[1], bbox[2].x-bbox[0].x, bbox[0].y-bbox[1].y+5); + graphics_draw_text(this_, this_->gc[1], this_->gc[2], font, text, p, 0x10000, 0); +} + +char * +graphics_icon_path(char *icon) +{ + static char *navit_sharedir; + char *ret=NULL; + struct file_wordexp *wordexp=NULL; + dbg(1,"enter %s\n",icon); + if (strchr(icon, '$')) { + wordexp=file_wordexp_new(icon); + if (file_wordexp_get_count(wordexp)) + icon=file_wordexp_get_array(wordexp)[0]; + } + if (strchr(icon,'/')) + ret=g_strdup(icon); + else { +#ifdef HAVE_API_ANDROID + // get resources for the correct screen density + // + // this part not needed, android unpacks only the correct version into res/drawable dir! + // dbg(1,"android icon_path %s\n",icon); + // static char *android_density; + // android_density = getenv("ANDROID_DENSITY"); + // ret=g_strdup_printf("res/drawable-%s/%s",android_density ,icon); + ret=g_strdup_printf("res/drawable/%s" ,icon); +#else + if (! navit_sharedir) + navit_sharedir = getenv("NAVIT_SHAREDIR"); + ret=g_strdup_printf("%s/xpm/%s", navit_sharedir, icon); +#endif + } + if (wordexp) + file_wordexp_destroy(wordexp); + return ret; +} + +static int +limit_count(struct coord *c, int count) +{ + int i; + for (i = 1 ; i < count ; i++) { + if (c[i].x == c[0].x && c[i].y == c[0].y) + return i+1; + } + return count; +} + + +static void +displayitem_draw(struct displayitem *di, void *dummy, struct display_context *dc) +{ + int *width=g_alloca(sizeof(int)*dc->maxlen); + struct point *pa=g_alloca(sizeof(struct point)*dc->maxlen); + struct graphics *gra=dc->gra; + struct graphics_gc *gc=dc->gc; + struct element *e=dc->e; + struct graphics_image *img=dc->img; + struct point p; + char *path; + + while (di) { + int i,count=di->count,mindist=dc->mindist; + + di->z_order=++(gra->current_z_order); + + if (! gc) { + gc=graphics_gc_new(gra); + graphics_gc_set_foreground(gc, &e->color); + dc->gc=gc; + } + if (item_type_is_area(dc->type) && (dc->e->type == element_polyline || dc->e->type == element_text)) + count=limit_count(di->c, count); + if (dc->type == type_poly_water_tiled) + mindist=0; + if (dc->e->type == element_polyline) + count=transform(dc->trans, dc->pro, di->c, pa, count, mindist, e->u.polyline.width, width); + else + count=transform(dc->trans, dc->pro, di->c, pa, count, mindist, 0, NULL); + switch (e->type) { + case element_polygon: + graphics_draw_polygon_clipped(gra, gc, pa, count); + break; + case element_polyline: + { + gc->meth.gc_set_linewidth(gc->priv, 1); + if (e->u.polyline.width > 0 && e->u.polyline.dash_num > 0) + graphics_gc_set_dashes(gc, e->u.polyline.width, + e->u.polyline.offset, + e->u.polyline.dash_table, + e->u.polyline.dash_num); + for (i = 0 ; i < count ; i++) { + if (width[i] < 2) + width[i]=2; + } + graphics_draw_polyline_clipped(gra, gc, pa, count, width, 1, e->u.polyline.width > 1); + } + break; + case element_circle: + if (count) { + if (e->u.circle.width > 1) + gc->meth.gc_set_linewidth(gc->priv, e->u.polyline.width); + graphics_draw_circle(gra, gc, pa, e->u.circle.radius); + if (di->label && e->text_size) { + struct graphics_font *font=get_font(gra, e->text_size); + struct graphics_gc *gc_background=dc->gc_background; + if (! gc_background && e->u.circle.background_color.a) { + gc_background=graphics_gc_new(gra); + graphics_gc_set_foreground(gc_background, &e->u.circle.background_color); + dc->gc_background=gc_background; + } + p.x=pa[0].x+3; + p.y=pa[0].y+10; + if (font) + gra->meth.draw_text(gra->priv, gc->priv, gc_background?gc_background->priv:NULL, font->priv, di->label, &p, 0x10000, 0); + else + dbg(0,"Failed to get font with size %d\n",e->text_size); + } + } + break; + case element_text: + if (count && di->label) { + struct graphics_font *font=get_font(gra, e->text_size); + struct graphics_gc *gc_background=dc->gc_background; + if (! gc_background && e->u.text.background_color.a) { + gc_background=graphics_gc_new(gra); + graphics_gc_set_foreground(gc_background, &e->u.text.background_color); + dc->gc_background=gc_background; + } + if (font) + label_line(gra, gc, gc_background, font, pa, count, di->label); + else + dbg(0,"Failed to get font with size %d\n",e->text_size); + } + break; + case element_icon: + if (count) { + if (!img || item_is_custom_poi(di->item)) { + if (item_is_custom_poi(di->item)) { + char *icon; + char *src; + if (img) + graphics_image_free(dc->gra, img); + src=e->u.icon.src; + if (!src || !src[0]) + src="%s"; + icon=g_strdup_printf(src,di->label+strlen(di->label)+1); + path=graphics_icon_path(icon); + g_free(icon); + } else + path=graphics_icon_path(e->u.icon.src); + img=graphics_image_new_scaled_rotated(gra, path, e->u.icon.width, e->u.icon.height, e->u.icon.rotation); + if (img) + dc->img=img; + else + dbg(0,"failed to load icon '%s'\n", path); + g_free(path); + } + if (img) { + p.x=pa[0].x - img->hot.x; + p.y=pa[0].y - img->hot.y; + gra->meth.draw_image(gra->priv, gra->gc[0]->priv, &p, img->priv); + } + } + break; + case element_image: + dbg(1,"image: '%s'\n", di->label); + if (gra->meth.draw_image_warp) + gra->meth.draw_image_warp(gra->priv, gra->gc[0]->priv, pa, count, di->label); + else + dbg(0,"draw_image_warp not supported by graphics driver drawing '%s'\n", di->label); + break; + case element_arrows: + display_draw_arrows(gra,gc,pa,count); + break; + default: + printf("Unhandled element type %d\n", e->type); + + } + di=di->next; + } +} +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +static void xdisplay_draw_elements(struct graphics *gra, struct displaylist *display_list, struct itemgra *itm) +{ + struct element *e; + GList *es,*types; + struct display_context *dc=&display_list->dc; + struct hash_entry *entry; + + es=itm->elements; + while (es) { + e=es->data; + dc->e=e; + types=itm->type; + while (types) { + dc->type=GPOINTER_TO_INT(types->data); + entry=get_hash_entry(display_list, dc->type); + if (entry && entry->di) { + displayitem_draw(entry->di, NULL, dc); + display_context_free(dc); + } + types=g_list_next(types); + } + es=g_list_next(es); + } +} + +void +graphics_draw_itemgra(struct graphics *gra, struct itemgra *itm, struct transformation *t, char *label) +{ + GList *es; + struct display_context dc; + int max_coord=32; + char *buffer=g_alloca(sizeof(struct displayitem)+max_coord*sizeof(struct coord)); + struct displayitem *di=(struct displayitem *)buffer; + es=itm->elements; + di->item.type=type_none; + di->item.id_hi=0; + di->item.id_lo=0; + di->item.map=NULL; + di->z_order=0; + di->label=label; + dc.gra=gra; + dc.gc=NULL; + dc.gc_background=NULL; + dc.img=NULL; + dc.pro=projection_screen; + dc.mindist=0; + dc.trans=t; + dc.type=type_none; + dc.maxlen=max_coord; + while (es) { + struct element *e=es->data; + if (e->coord_count) { + if (e->coord_count > max_coord) { + dbg(0,"maximum number of coords reached: %d > %d\n",e->coord_count,max_coord); + di->count=max_coord; + } else + di->count=e->coord_count; + memcpy(di->c, e->coord, di->count*sizeof(struct coord)); + } else { + di->c[0].x=0; + di->c[0].y=0; + di->count=1; + } + dc.e=e; + di->next=NULL; + displayitem_draw(di, NULL, &dc); + display_context_free(&dc); + es=g_list_next(es); + } +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +static void xdisplay_draw_layer(struct displaylist *display_list, struct graphics *gra, struct layer *lay, int order) +{ + GList *itms; + struct itemgra *itm; + + itms=lay->itemgras; + while (itms) { + itm=itms->data; + if (order >= itm->order.min && order <= itm->order.max) + xdisplay_draw_elements(gra, display_list, itm); + itms=g_list_next(itms); + } +} + + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +static void xdisplay_draw(struct displaylist *display_list, struct graphics *gra, struct layout *l, int order) +{ + GList *lays; + struct layer *lay; + + gra->current_z_order=0; + lays=l->layers; + while (lays) { + lay=lays->data; + if (lay->active) + xdisplay_draw_layer(display_list, gra, lay, order); + lays=g_list_next(lays); + } +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +extern void *route_selection; + +static void +displaylist_update_layers(struct displaylist *displaylist, GList *layers, int order) +{ + while (layers) { + struct layer *layer=layers->data; + GList *itemgras=layer->itemgras; + while (itemgras) { + struct itemgra *itemgra=itemgras->data; + GList *types=itemgra->type; + if (itemgra->order.min <= order && itemgra->order.max >= order) { + while (types) { + enum item_type type=(enum item_type) types->data; + set_hash_entry(displaylist, type); + types=g_list_next(types); + } + } + itemgras=g_list_next(itemgras); + } + layers=g_list_next(layers); + } +} + +static void +displaylist_update_hash(struct displaylist *displaylist) +{ + displaylist->max_offset=0; + clear_hash(displaylist); + displaylist_update_layers(displaylist, displaylist->layout->layers, displaylist->order); + dbg(1,"max offset %d\n",displaylist->max_offset); +} + + +/** + * @brief Returns selection structure based on displaylist transform, projection and order. + * Use this function to get map selection if you are going to fetch complete item data from the map based on displayitem reference. + * @param displaylist + * @returns Pointer to selection structure + */ +struct map_selection *displaylist_get_selection(struct displaylist *displaylist) +{ + return transform_get_selection(displaylist->dc.trans, displaylist->dc.pro, displaylist->order); +} + +/** + * @brief Compare displayitems based on their zorder values. + * Use with g_list_insert_sorted to sort less shaded items to be before more shaded ones in the result list. + */ +static int displaylist_cmp_zorder(const struct displayitem *a, const struct displayitem *b) +{ + if(a->z_order>b->z_order) + return -1; + if(a->z_orderz_order) + return 1; + return 0; +} + +/** + * @brief Returns list of displayitems clicked at given coordinates. The deeper item is in current layout, the deeper it will be in the list. + * @param displaylist + * @param p clicked point + * @param radius radius of clicked area + * @returns GList of displayitems + */ +GList *displaylist_get_clicked_list(struct displaylist *displaylist, struct point *p, int radius) +{ + GList *l=NULL; + struct displayitem *di; + struct displaylist_handle *dlh=graphics_displaylist_open(displaylist); + + while ((di=graphics_displaylist_next(dlh))) { + if (di->z_order>0 && graphics_displayitem_within_dist(displaylist, di, p,radius)) + l=g_list_insert_sorted(l,(gpointer) di, (GCompareFunc) displaylist_cmp_zorder); + } + + return l; +} + + + +static void +do_draw(struct displaylist *displaylist, int cancel, int flags) +{ + struct item *item; + int count,max=displaylist->dc.maxlen,workload=0; + struct coord *ca=g_alloca(sizeof(struct coord)*max); + struct attr attr,attr2; + enum projection pro; + + if (displaylist->order != displaylist->order_hashed || displaylist->layout != displaylist->layout_hashed) { + displaylist_update_hash(displaylist); + displaylist->order_hashed=displaylist->order; + displaylist->layout_hashed=displaylist->layout; + } + profile(0,NULL); + pro=transform_get_projection(displaylist->dc.trans); + while (!cancel) { + if (!displaylist->msh) + displaylist->msh=mapset_open(displaylist->ms); + if (!displaylist->m) { + displaylist->m=mapset_next(displaylist->msh, 1); + if (!displaylist->m) { + mapset_close(displaylist->msh); + displaylist->msh=NULL; + break; + } + displaylist->dc.pro=map_projection(displaylist->m); + displaylist->conv=map_requires_conversion(displaylist->m); + if (route_selection) + displaylist->sel=route_selection; + else + displaylist->sel=displaylist_get_selection(displaylist); + displaylist->mr=map_rect_new(displaylist->m, displaylist->sel); + } + if (displaylist->mr) { + while ((item=map_rect_get_item(displaylist->mr))) { + int label_count=0; + char *labels[2]; + struct hash_entry *entry; + if (item == &busy_item) { + if (displaylist->workload) + return; + else + continue; + } + entry=get_hash_entry(displaylist, item->type); + if (!entry) + continue; + count=item_coord_get_within_selection(item, ca, item->type < type_line ? 1: max, displaylist->sel); + if (! count) + continue; + if (displaylist->dc.pro != pro) + transform_from_to_count(ca, displaylist->dc.pro, ca, pro, count); + if (count == max) { + dbg(0,"point count overflow %d for %s "ITEM_ID_FMT"\n", count,item_to_name(item->type),ITEM_ID_ARGS(*item)); + displaylist->dc.maxlen=max*2; + } + if (item_is_custom_poi(*item)) { + if (item_attr_get(item, attr_icon_src, &attr2)) + labels[1]=map_convert_string(displaylist->m, attr2.u.str); + else + labels[1]=NULL; + label_count=2; + } else { + labels[1]=NULL; + label_count=0; + } + if (item_attr_get(item, attr_label, &attr)) { + labels[0]=attr.u.str; + if (!label_count) + label_count=2; + } else + labels[0]=NULL; + if (displaylist->conv && label_count) { + labels[0]=map_convert_string(displaylist->m, labels[0]); + display_add(entry, item, count, ca, labels, label_count); + map_convert_free(labels[0]); + } else + display_add(entry, item, count, ca, labels, label_count); + if (labels[1]) + map_convert_free(labels[1]); + workload++; + if (workload == displaylist->workload) + return; + } + map_rect_destroy(displaylist->mr); + } + if (!route_selection) + map_selection_destroy(displaylist->sel); + displaylist->mr=NULL; + displaylist->sel=NULL; + displaylist->m=NULL; + } + profile(1,"process_selection\n"); + if (displaylist->idle_ev) + event_remove_idle(displaylist->idle_ev); + displaylist->idle_ev=NULL; + callback_destroy(displaylist->idle_cb); + displaylist->idle_cb=NULL; + displaylist->busy=0; + graphics_process_selection(displaylist->dc.gra, displaylist); + profile(1,"draw\n"); + if (! cancel) + graphics_displaylist_draw(displaylist->dc.gra, displaylist, displaylist->dc.trans, displaylist->layout, flags); + map_rect_destroy(displaylist->mr); + if (!route_selection) + map_selection_destroy(displaylist->sel); + mapset_close(displaylist->msh); + displaylist->mr=NULL; + displaylist->sel=NULL; + displaylist->m=NULL; + displaylist->msh=NULL; + profile(1,"callback\n"); + callback_call_1(displaylist->cb, cancel); + profile(0,"end\n"); +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, struct layout *l, int flags) +{ + int order=transform_get_order(trans); + if(displaylist->dc.trans && displaylist->dc.trans!=trans) + transform_destroy(displaylist->dc.trans); + if(displaylist->dc.trans!=trans) + displaylist->dc.trans=transform_dup(trans); + displaylist->dc.gra=gra; + displaylist->dc.mindist=transform_get_scale(trans)/2; + // FIXME find a better place to set the background color + if (l) { + graphics_gc_set_background(gra->gc[0], &l->color); + graphics_gc_set_foreground(gra->gc[0], &l->color); + gra->default_font = g_strdup(l->font); + } + graphics_background_gc(gra, gra->gc[0]); + if (flags & 1) + callback_list_call_attr_0(gra->cbl, attr_predraw); + gra->meth.draw_mode(gra->priv, (flags & 8)?draw_mode_begin_clear:draw_mode_begin); + if (!(flags & 2)) + gra->meth.draw_rectangle(gra->priv, gra->gc[0]->priv, &gra->r.lu, gra->r.rl.x-gra->r.lu.x, gra->r.rl.y-gra->r.lu.y); + if (l) + xdisplay_draw(displaylist, gra, l, order+l->order_delta); + if (flags & 1) + callback_list_call_attr_0(gra->cbl, attr_postdraw); + if (!(flags & 4)) + gra->meth.draw_mode(gra->priv, draw_mode_end); +} + +static void graphics_load_mapset(struct graphics *gra, struct displaylist *displaylist, struct mapset *mapset, struct transformation *trans, struct layout *l, int async, struct callback *cb, int flags) +{ + int order=transform_get_order(trans); + + dbg(1,"enter"); + if (displaylist->busy) { + if (async == 1) + return; + do_draw(displaylist, 1, flags); + } + xdisplay_free(displaylist); + dbg(1,"order=%d\n", order); + + displaylist->dc.gra=gra; + displaylist->ms=mapset; + if(displaylist->dc.trans && displaylist->dc.trans!=trans) + transform_destroy(displaylist->dc.trans); + if(displaylist->dc.trans!=trans) + displaylist->dc.trans=transform_dup(trans); + displaylist->workload=async ? 100 : 0; + displaylist->cb=cb; + displaylist->seq++; + if (l) + order+=l->order_delta; + displaylist->order=order; + displaylist->busy=1; + displaylist->layout=l; + if (async) { + if (! displaylist->idle_cb) + displaylist->idle_cb=callback_new_3(callback_cast(do_draw), displaylist, 0, flags); + displaylist->idle_ev=event_add_idle(50, displaylist->idle_cb); + } else + do_draw(displaylist, 0, flags); +} +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_draw(struct graphics *gra, struct displaylist *displaylist, struct mapset *mapset, struct transformation *trans, struct layout *l, int async, struct callback *cb, int flags) +{ + graphics_load_mapset(gra, displaylist, mapset, trans, l, async, cb, flags); +} + +int +graphics_draw_cancel(struct graphics *gra, struct displaylist *displaylist) +{ + if (!displaylist->busy) + return 0; + do_draw(displaylist, 1, 0); + return 1; +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +struct displaylist_handle { + struct displaylist *dl; + struct displayitem *di; + int hashidx; +}; + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +struct displaylist_handle * graphics_displaylist_open(struct displaylist *displaylist) +{ + struct displaylist_handle *ret; + + ret=g_new0(struct displaylist_handle, 1); + ret->dl=displaylist; + + return ret; +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +struct displayitem * graphics_displaylist_next(struct displaylist_handle *dlh) +{ + struct displayitem *ret; + if (!dlh) + return NULL; + for (;;) { + if (dlh->di) { + ret=dlh->di; + dlh->di=ret->next; + break; + } + if (dlh->hashidx == HASH_SIZE) { + ret=NULL; + break; + } + if (dlh->dl->hash_entries[dlh->hashidx].type) + dlh->di=dlh->dl->hash_entries[dlh->hashidx].di; + dlh->hashidx++; + } + return ret; +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +void graphics_displaylist_close(struct displaylist_handle *dlh) +{ + g_free(dlh); +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +struct displaylist * graphics_displaylist_new(void) +{ + struct displaylist *ret=g_new0(struct displaylist, 1); + + ret->dc.maxlen=16384; + + return ret; +} + +void graphics_displaylist_destroy(struct displaylist *displaylist) +{ + if(displaylist->dc.trans) + transform_destroy(displaylist->dc.trans); + g_free(displaylist); + +} + + +/** + * Get the map item which given displayitem is based on. + * NOTE: returned structure doesn't contain any attributes or coordinates. type, map, idhi and idlow seem to be the only useable members. + * @param di pointer to displayitem structure + * @returns Pointer to struct item + * @author Martin Schaller (04/2008) +*/ +struct item * graphics_displayitem_get_item(struct displayitem *di) +{ + return &di->item; +} + +/** + * Get the number of this item as it was last displayed on the screen, dependent of current layout. Items with lower numbers + * are shaded by items with higher ones when they overlap. Zero means item was not displayed at all. If the item is displayed twice, its topmost + * occurence is used. + * @param di pointer to displayitem structure + * @returns z-order of current item. +*/ +int graphics_displayitem_get_z_order(struct displayitem *di) +{ + return di->z_order; +} + + +int +graphics_displayitem_get_coord_count(struct displayitem *di) +{ + return di->count; +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +char * graphics_displayitem_get_label(struct displayitem *di) +{ + return di->label; +} + +int +graphics_displayitem_get_displayed(struct displayitem *di) +{ + return 1; +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +static int within_dist_point(struct point *p0, struct point *p1, int dist) +{ + if (p0->x == 32767 || p0->y == 32767 || p1->x == 32767 || p1->y == 32767) + return 0; + if (p0->x == -32768 || p0->y == -32768 || p1->x == -32768 || p1->y == -32768) + return 0; + if ((p0->x-p1->x)*(p0->x-p1->x) + (p0->y-p1->y)*(p0->y-p1->y) <= dist*dist) { + return 1; + } + return 0; +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +static int within_dist_line(struct point *p, struct point *line_p0, struct point *line_p1, int dist) +{ + int vx,vy,wx,wy; + int c1,c2; + struct point line_p; + + if (line_p0->x < line_p1->x) { + if (p->x < line_p0->x - dist) + return 0; + if (p->x > line_p1->x + dist) + return 0; + } else { + if (p->x < line_p1->x - dist) + return 0; + if (p->x > line_p0->x + dist) + return 0; + } + if (line_p0->y < line_p1->y) { + if (p->y < line_p0->y - dist) + return 0; + if (p->y > line_p1->y + dist) + return 0; + } else { + if (p->y < line_p1->y - dist) + return 0; + if (p->y > line_p0->y + dist) + return 0; + } + + vx=line_p1->x-line_p0->x; + vy=line_p1->y-line_p0->y; + wx=p->x-line_p0->x; + wy=p->y-line_p0->y; + + c1=vx*wx+vy*wy; + if ( c1 <= 0 ) + return within_dist_point(p, line_p0, dist); + c2=vx*vx+vy*vy; + if ( c2 <= c1 ) + return within_dist_point(p, line_p1, dist); + + line_p.x=line_p0->x+vx*c1/c2; + line_p.y=line_p0->y+vy*c1/c2; + return within_dist_point(p, &line_p, dist); +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +static int within_dist_polyline(struct point *p, struct point *line_pnt, int count, int dist, int close) +{ + int i; + for (i = 0 ; i < count-1 ; i++) { + if (within_dist_line(p,line_pnt+i,line_pnt+i+1,dist)) { + return 1; + } + } + if (close) + return (within_dist_line(p,line_pnt,line_pnt+count-1,dist)); + return 0; +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +static int within_dist_polygon(struct point *p, struct point *poly_pnt, int count, int dist) +{ + int i, j, c = 0; + for (i = 0, j = count-1; i < count; j = i++) { + if ((((poly_pnt[i].y <= p->y) && ( p->y < poly_pnt[j].y )) || + ((poly_pnt[j].y <= p->y) && ( p->y < poly_pnt[i].y))) && + (p->x < (poly_pnt[j].x - poly_pnt[i].x) * (p->y - poly_pnt[i].y) / (poly_pnt[j].y - poly_pnt[i].y) + poly_pnt[i].x)) + c = !c; + } + if (! c) + return within_dist_polyline(p, poly_pnt, count, dist, 1); + return c; +} + +/** + * FIXME + * @param <> + * @returns <> + * @author Martin Schaller (04/2008) +*/ +int graphics_displayitem_within_dist(struct displaylist *displaylist, struct displayitem *di, struct point *p, int dist) +{ + struct point *pa=g_alloca(sizeof(struct point)*displaylist->dc.maxlen); + int count; + + count=transform(displaylist->dc.trans, displaylist->dc.pro, di->c, pa, di->count, 1, 0, NULL); + + if (di->item.type < type_line) { + return within_dist_point(p, &pa[0], dist); + } + if (di->item.type < type_area) { + return within_dist_polyline(p, pa, count, dist, 0); + } + return within_dist_polygon(p, pa, count, dist); +} + + +static void +graphics_process_selection_item(struct displaylist *dl, struct item *item) +{ +#if 0 /* FIXME */ + struct displayitem di,*di_res; + GHashTable *h; + int count,max=dl->dc.maxlen; + struct coord ca[max]; + struct attr attr; + struct map_rect *mr; + + di.item=*item; + di.label=NULL; + di.count=0; + h=g_hash_table_lookup(dl->dl, GINT_TO_POINTER(di.item.type)); + if (h) { + di_res=g_hash_table_lookup(h, &di); + if (di_res) { + di.item.type=(enum item_type)item->priv_data; + display_add(dl, &di.item, di_res->count, di_res->c, NULL, 0); + return; + } + } + mr=map_rect_new(item->map, NULL); + item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); + count=item_coord_get(item, ca, item->type < type_line ? 1: max); + if (!item_attr_get(item, attr_label, &attr)) + attr.u.str=NULL; + if (dl->conv && attr.u.str && attr.u.str[0]) { + char *str=map_convert_string(item->map, attr.u.str); + display_add(dl, item, count, ca, &str, 1); + map_convert_free(str); + } else + display_add(dl, item, count, ca, &attr.u.str, 1); + map_rect_destroy(mr); +#endif +} + +void +graphics_add_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl) +{ + struct item *item_dup=g_new(struct item, 1); + *item_dup=*item; + item_dup->priv_data=(void *)type; + gra->selection=g_list_append(gra->selection, item_dup); + if (dl) + graphics_process_selection_item(dl, item_dup); +} + +void +graphics_remove_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl) +{ + GList *curr; + int found; + + for (;;) { + curr=gra->selection; + found=0; + while (curr) { + struct item *sitem=curr->data; + if (item_is_equal(*item,*sitem)) { + if (dl) { + struct displayitem di; + /* Unused Variable + GHashTable *h; */ + di.item=*sitem; + di.label=NULL; + di.count=0; + di.item.type=type; +#if 0 /* FIXME */ + h=g_hash_table_lookup(dl->dl, GINT_TO_POINTER(di.item.type)); + if (h) + g_hash_table_remove(h, &di); +#endif + } + g_free(sitem); + gra->selection=g_list_remove(gra->selection, curr->data); + found=1; + break; + } + } + if (!found) + return; + } +} + +void +graphics_clear_selection(struct graphics *gra, struct displaylist *dl) +{ + while (gra->selection) { + struct item *item=(struct item *)gra->selection->data; + graphics_remove_selection(gra, item, (enum item_type)item->priv_data,dl); + } +} + +static void +graphics_process_selection(struct graphics *gra, struct displaylist *dl) +{ + GList *curr; + + curr=gra->selection; + while (curr) { + struct item *item=curr->data; + graphics_process_selection_item(dl, item); + curr=g_list_next(curr); + } +} diff --git a/navit/graphics.h b/navit/graphics.h new file mode 100644 index 0000000..1b9eb70 --- /dev/null +++ b/navit/graphics.h @@ -0,0 +1,205 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_GRAPHICS_H +#define NAVIT_GRAPHICS_H + +#ifdef __cplusplus +extern "C" { +#endif +struct attr; +struct point; +struct container; +struct color; +struct graphics; +struct graphics_gc; +struct graphics_font; +struct graphics_image; +struct transformation; +struct display_list; +struct mapset; + +enum draw_mode_num { + draw_mode_begin, draw_mode_begin_clear, draw_mode_end, draw_mode_cursor, draw_mode_end_lazy +}; + +struct graphics_priv; +struct graphics_font_priv; +struct graphics_image_priv; +struct graphics_gc_priv; +struct graphics_font_methods; +struct graphics_gc_methods; +struct graphics_image_methods; + +struct graphics_methods { + void (*graphics_destroy)(struct graphics_priv *gr); + void (*draw_mode)(struct graphics_priv *gr, enum draw_mode_num mode); + void (*draw_lines)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count); + void (*draw_polygon)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count); + void (*draw_rectangle)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h); + void (*draw_circle)(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r); + void (*draw_text)(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy); + void (*draw_image)(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img); + void (*draw_image_warp)(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, char *data); + void (*draw_restore)(struct graphics_priv *gr, struct point *p, int w, int h); + void (*draw_drag)(struct graphics_priv *gr, struct point *p); + struct graphics_font_priv *(*font_new)(struct graphics_priv *gr, struct graphics_font_methods *meth, char *font, int size, int flags); + struct graphics_gc_priv *(*gc_new)(struct graphics_priv *gr, struct graphics_gc_methods *meth); + void (*background_gc)(struct graphics_priv *gr, struct graphics_gc_priv *gc); + struct graphics_priv *(*overlay_new)(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound); + struct graphics_image_priv *(*image_new)(struct graphics_priv *gr, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation); + void *(*get_data)(struct graphics_priv *gr, const char *type); + void (*image_free)(struct graphics_priv *gr, struct graphics_image_priv *priv); + void (*get_text_bbox)(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate); + void (*overlay_disable)(struct graphics_priv *gr, int disable); + void (*overlay_resize)(struct graphics_priv *gr, struct point *p, int w, int h, int alpha, int wraparound); + int (*set_attr)(struct graphics_priv *gr, struct attr *attr); +}; + + +struct graphics_font_methods { + void (*font_destroy)(struct graphics_font_priv *font); +}; + +struct graphics_font { + struct graphics_font_priv *priv; + struct graphics_font_methods meth; +}; + +struct graphics_gc_methods { + void (*gc_destroy)(struct graphics_gc_priv *gc); + void (*gc_set_linewidth)(struct graphics_gc_priv *gc, int width); + void (*gc_set_dashes)(struct graphics_gc_priv *gc, int width, int offset, unsigned char dash_list[], int n); + void (*gc_set_foreground)(struct graphics_gc_priv *gc, struct color *c); + void (*gc_set_background)(struct graphics_gc_priv *gc, struct color *c); + void (*gc_set_stipple)(struct graphics_gc_priv *gc, struct graphics_image_priv *img); +}; + +struct graphics_gc { + struct graphics_gc_priv *priv; + struct graphics_gc_methods meth; + struct graphics *gra; +}; + +struct graphics_image_methods { + void (*image_destroy)(struct graphics_image_priv *img); +}; + +struct graphics_image { + struct graphics_image_priv *priv; + struct graphics_image_methods meth; + int width; + int height; + struct point hot; +}; + +struct graphics_data_image { + void *data; + int size; +}; + +/* prototypes */ +enum attr_type; +enum draw_mode_num; +enum item_type; +struct attr; +struct attr_iter; +struct callback; +struct color; +struct displayitem; +struct displaylist; +struct displaylist_handle; +struct graphics; +struct graphics_font; +struct graphics_gc; +struct graphics_image; +struct item; +struct itemgra; +struct layout; +struct mapset; +struct point; +struct point_rect; +struct transformation; +int graphics_set_attr(struct graphics *gra, struct attr *attr); +void graphics_set_rect(struct graphics *gra, struct point_rect *pr); +struct graphics *graphics_new(struct attr *parent, struct attr **attrs); +int graphics_get_attr(struct graphics *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); +struct graphics *graphics_overlay_new(struct graphics *parent, struct point *p, int w, int h, int alpha, int wraparound); +void graphics_overlay_resize(struct graphics *this_, struct point *p, int w, int h, int alpha, int wraparound); +void graphics_init(struct graphics *this_); +void *graphics_get_data(struct graphics *this_, const char *type); +void graphics_add_callback(struct graphics *this_, struct callback *cb); +void graphics_remove_callback(struct graphics *this_, struct callback *cb); +struct graphics_font *graphics_font_new(struct graphics *gra, int size, int flags); +struct graphics_font *graphics_named_font_new(struct graphics *gra, char *font, int size, int flags); +void graphics_free(struct graphics *gra); +void graphics_font_destroy_all(struct graphics *gra); +struct graphics_gc *graphics_gc_new(struct graphics *gra); +void graphics_gc_destroy(struct graphics_gc *gc); +void graphics_gc_set_foreground(struct graphics_gc *gc, struct color *c); +void graphics_gc_set_background(struct graphics_gc *gc, struct color *c); +void graphics_gc_set_stipple(struct graphics_gc *gc, struct graphics_image *img); +void graphics_gc_set_linewidth(struct graphics_gc *gc, int width); +void graphics_gc_set_dashes(struct graphics_gc *gc, int width, int offset, unsigned char dash_list[], int n); +struct graphics_image *graphics_image_new_scaled(struct graphics *gra, char *path, int w, int h); +struct graphics_image *graphics_image_new_scaled_rotated(struct graphics *gra, char *path, int w, int h, int rotate); +struct graphics_image *graphics_image_new(struct graphics *gra, char *path); +void graphics_image_free(struct graphics *gra, struct graphics_image *img); +void graphics_draw_restore(struct graphics *this_, struct point *p, int w, int h); +void graphics_draw_mode(struct graphics *this_, enum draw_mode_num mode); +void graphics_draw_lines(struct graphics *this_, struct graphics_gc *gc, struct point *p, int count); +void graphics_draw_circle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int r); +void graphics_draw_rectangle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int w, int h); +void graphics_draw_rectangle_rounded(struct graphics *this_, struct graphics_gc *gc, struct point *plu, int w, int h, int r, int fill); +void graphics_draw_text(struct graphics *this_, struct graphics_gc *gc1, struct graphics_gc *gc2, struct graphics_font *font, char *text, struct point *p, int dx, int dy); +void graphics_get_text_bbox(struct graphics *this_, struct graphics_font *font, char *text, int dx, int dy, struct point *ret, int estimate); +void graphics_overlay_disable(struct graphics *this_, int disable); +int graphics_is_disabled(struct graphics *this_); +void graphics_draw_image(struct graphics *this_, struct graphics_gc *gc, struct point *p, struct graphics_image *img); +int graphics_draw_drag(struct graphics *this_, struct point *p); +void graphics_background_gc(struct graphics *this_, struct graphics_gc *gc); +void graphics_draw_text_std(struct graphics *this_, int text_size, char *text, struct point *p); +char *graphics_icon_path(char *icon); +void graphics_draw_itemgra(struct graphics *gra, struct itemgra *itm, struct transformation *t, char *label); +void graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, struct layout *l, int flags); +void graphics_draw(struct graphics *gra, struct displaylist *displaylist, struct mapset *mapset, struct transformation *trans, struct layout *l, int async, struct callback *cb, int flags); +int graphics_draw_cancel(struct graphics *gra, struct displaylist *displaylist); +struct displaylist_handle *graphics_displaylist_open(struct displaylist *displaylist); +struct displayitem *graphics_displaylist_next(struct displaylist_handle *dlh); +void graphics_displaylist_close(struct displaylist_handle *dlh); +struct displaylist *graphics_displaylist_new(void); +void graphics_displaylist_destroy(struct displaylist *displaylist); +struct map_selection *displaylist_get_selection(struct displaylist *displaylist); +GList *displaylist_get_clicked_list(struct displaylist *displaylist, struct point *p, int radius); +struct item *graphics_displayitem_get_item(struct displayitem *di); +int graphics_displayitem_get_coord_count(struct displayitem *di); +char *graphics_displayitem_get_label(struct displayitem *di); +int graphics_displayitem_get_displayed(struct displayitem *di); +int graphics_displayitem_get_z_order(struct displayitem *di); +int graphics_displayitem_within_dist(struct displaylist *displaylist, struct displayitem *di, struct point *p, int dist); +void graphics_add_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl); +void graphics_remove_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl); +void graphics_clear_selection(struct graphics *gra, struct displaylist *dl); +/* end of prototypes */ +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/navit/graphics/Makefile.am b/navit/graphics/Makefile.am new file mode 100644 index 0000000..c878b9a --- /dev/null +++ b/navit/graphics/Makefile.am @@ -0,0 +1,25 @@ +SUBDIRS= +if GRAPHICS_ANDROID + SUBDIRS+=android +endif +if GRAPHICS_GTK_DRAWING_AREA + SUBDIRS+=gtk_drawing_area +endif +if GRAPHICS_NULL + SUBDIRS+=null +endif +if GRAPHICS_OPENGL + SUBDIRS+=opengl +endif +if GRAPHICS_QT_QPAINTER + SUBDIRS+=qt_qpainter +endif +if GRAPHICS_SDL + SUBDIRS+=sdl +endif +if GRAPHICS_WIN32 + SUBDIRS+=win32 +endif +if GRAPHICS_GD + SUBDIRS+=gd +endif diff --git a/navit/graphics/Makefile.in b/navit/graphics/Makefile.in new file mode 100644 index 0000000..f148ede --- /dev/null +++ b/navit/graphics/Makefile.in @@ -0,0 +1,719 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@GRAPHICS_ANDROID_TRUE@am__append_1 = android +@GRAPHICS_GTK_DRAWING_AREA_TRUE@am__append_2 = gtk_drawing_area +@GRAPHICS_NULL_TRUE@am__append_3 = null +@GRAPHICS_OPENGL_TRUE@am__append_4 = opengl +@GRAPHICS_QT_QPAINTER_TRUE@am__append_5 = qt_qpainter +@GRAPHICS_SDL_TRUE@am__append_6 = sdl +@GRAPHICS_WIN32_TRUE@am__append_7 = win32 +@GRAPHICS_GD_TRUE@am__append_8 = gd +subdir = navit/graphics +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = android gtk_drawing_area null opengl qt_qpainter sdl \ + win32 gd +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = $(am__append_1) $(am__append_2) $(am__append_3) \ + $(am__append_4) $(am__append_5) $(am__append_6) \ + $(am__append_7) $(am__append_8) +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/graphics/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/graphics/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/graphics/android/Makefile.am b/navit/graphics/android/Makefile.am new file mode 100644 index 0000000..a625edd --- /dev/null +++ b/navit/graphics/android/Makefile.am @@ -0,0 +1,9 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=graphics_android +if PLUGINS +modulegraphics_LTLIBRARIES = libgraphics_android.la +else +noinst_LTLIBRARIES = libgraphics_android.la +endif +libgraphics_android_la_SOURCES = graphics_android.c +libgraphics_android_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ diff --git a/navit/graphics/android/Makefile.in b/navit/graphics/android/Makefile.in new file mode 100644 index 0000000..5887d13 --- /dev/null +++ b/navit/graphics/android/Makefile.in @@ -0,0 +1,705 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/graphics/android +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulegraphicsdir)" +LTLIBRARIES = $(modulegraphics_LTLIBRARIES) $(noinst_LTLIBRARIES) +libgraphics_android_la_LIBADD = +am_libgraphics_android_la_OBJECTS = graphics_android.lo +libgraphics_android_la_OBJECTS = $(am_libgraphics_android_la_OBJECTS) +libgraphics_android_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libgraphics_android_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libgraphics_android_la_rpath = +@PLUGINS_TRUE@am_libgraphics_android_la_rpath = -rpath \ +@PLUGINS_TRUE@ $(modulegraphicsdir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libgraphics_android_la_SOURCES) +DIST_SOURCES = $(libgraphics_android_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=graphics_android +@PLUGINS_TRUE@modulegraphics_LTLIBRARIES = libgraphics_android.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libgraphics_android.la +libgraphics_android_la_SOURCES = graphics_android.c +libgraphics_android_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/graphics/android/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/graphics/android/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulegraphicsLTLIBRARIES: $(modulegraphics_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulegraphicsdir)" || $(MKDIR_P) "$(DESTDIR)$(modulegraphicsdir)" + @list='$(modulegraphics_LTLIBRARIES)'; test -n "$(modulegraphicsdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulegraphicsdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulegraphicsdir)"; \ + } + +uninstall-modulegraphicsLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulegraphics_LTLIBRARIES)'; test -n "$(modulegraphicsdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulegraphicsdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulegraphicsdir)/$$f"; \ + done + +clean-modulegraphicsLTLIBRARIES: + -test -z "$(modulegraphics_LTLIBRARIES)" || rm -f $(modulegraphics_LTLIBRARIES) + @list='$(modulegraphics_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgraphics_android.la: $(libgraphics_android_la_OBJECTS) $(libgraphics_android_la_DEPENDENCIES) + $(libgraphics_android_la_LINK) $(am_libgraphics_android_la_rpath) $(libgraphics_android_la_OBJECTS) $(libgraphics_android_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphics_android.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulegraphicsdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulegraphicsLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulegraphicsLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulegraphicsLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulegraphicsLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-modulegraphicsLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am \ + uninstall-modulegraphicsLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/graphics/android/graphics_android.c b/navit/graphics/android/graphics_android.c new file mode 100644 index 0000000..c15ac03 --- /dev/null +++ b/navit/graphics/android/graphics_android.c @@ -0,0 +1,886 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include "config.h" +#include "window.h" +#include "point.h" +#include "graphics.h" +#include "color.h" +#include "plugin.h" +#include "event.h" +#include "debug.h" +#include "callback.h" +#include "android.h" + +int dummy; + +struct graphics_priv { + jclass NavitGraphicsClass; + jmethodID NavitGraphics_draw_polyline, NavitGraphics_draw_polygon, NavitGraphics_draw_rectangle, NavitGraphics_draw_circle, NavitGraphics_draw_text, NavitGraphics_draw_image, NavitGraphics_draw_mode, NavitGraphics_draw_drag, NavitGraphics_overlay_disable, NavitGraphics_overlay_resize, NavitGraphics_SetCamera; + + jclass PaintClass; + jmethodID Paint_init,Paint_setStrokeWidth,Paint_setARGB; + + jobject NavitGraphics; + jobject Paint; + + jclass BitmapFactoryClass; + jmethodID BitmapFactory_decodeFile, BitmapFactory_decodeResource; + + jclass BitmapClass; + jmethodID Bitmap_getHeight, Bitmap_getWidth; + + jclass ContextClass; + jmethodID Context_getResources; + + jclass ResourcesClass; + jobject Resources; + jmethodID Resources_getIdentifier; + + jobject packageName; + + struct callback_list *cbl; + struct window win; +}; + +struct graphics_font_priv { + int size; +}; + +struct graphics_gc_priv { + struct graphics_priv *gra; + int linewidth; + enum draw_mode_num mode; + int a,r,g,b; +}; + +struct graphics_image_priv { + jobject Bitmap; + int width; + int height; + struct point hot; +}; + +static GHashTable *image_cache_hash = NULL; + +static int +find_class_global(char *name, jclass *ret) +{ + *ret=(*jnienv)->FindClass(jnienv, name); + if (! *ret) { + dbg(0,"Failed to get Class %s\n",name); + return 0; + } + (*jnienv)->NewGlobalRef(jnienv, *ret); + return 1; +} + +static int +find_method(jclass class, char *name, char *args, jmethodID *ret) +{ + *ret = (*jnienv)->GetMethodID(jnienv, class, name, args); + if (*ret == NULL) { + dbg(0,"Failed to get Method %s with signature %s\n",name,args); + return 0; + } + return 1; +} + +static int +find_static_method(jclass class, char *name, char *args, jmethodID *ret) +{ + *ret = (*jnienv)->GetStaticMethodID(jnienv, class, name, args); + if (*ret == NULL) { + dbg(0,"Failed to get static Method %s with signature %s\n",name,args); + return 0; + } + return 1; +} + +static void +graphics_destroy(struct graphics_priv *gr) +{ +} + +static void font_destroy(struct graphics_font_priv *font) +{ + g_free(font); +} + +static struct graphics_font_methods font_methods = { + font_destroy +}; + +static struct graphics_font_priv *font_new(struct graphics_priv *gr, struct graphics_font_methods *meth, char *font, int size, int flags) +{ + struct graphics_font_priv *ret=g_new0(struct graphics_font_priv, 1); + *meth=font_methods; + + ret->size=size; + return ret; +} + +static void +gc_destroy(struct graphics_gc_priv *gc) +{ + g_free(gc); +} + +static void +gc_set_linewidth(struct graphics_gc_priv *gc, int w) +{ + gc->linewidth = w; +} + +static void +gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) +{ +} + +static void +gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) +{ + gc->r = c->r >> 8; + gc->g = c->g >> 8; + gc->b = c->b >> 8; + gc->a = c->a >> 8; +} + +static void +gc_set_background(struct graphics_gc_priv *gc, struct color *c) +{ +} + +static struct graphics_gc_methods gc_methods = { + gc_destroy, + gc_set_linewidth, + gc_set_dashes, + gc_set_foreground, + gc_set_background +}; + +static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) +{ + struct graphics_gc_priv *ret=g_new0(struct graphics_gc_priv, 1); + *meth=gc_methods; + + ret->gra = gr; + ret->a = ret->r = ret->g = ret->b = 255; + ret->linewidth=1; + return ret; +} + +static void image_destroy(struct graphics_image_priv *img) +{ + // unused? +} + +static struct graphics_image_methods image_methods = { + image_destroy +}; + + +static struct graphics_image_priv * +image_new(struct graphics_priv *gra, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation) +{ + struct graphics_image_priv* ret = NULL; + + if ( !g_hash_table_lookup_extended( image_cache_hash, path, NULL, (gpointer)&ret) ) + { + ret=g_new0(struct graphics_image_priv, 1); + jstring string; + int id; + + dbg(1,"enter %s\n",path); + if (!strncmp(path,"res/drawable/",13)) { + jstring a=(*jnienv)->NewStringUTF(jnienv, "drawable"); + char *path_noext=g_strdup(path+13); + char *pos=strrchr(path_noext, '.'); + if (pos) + *pos='\0'; + dbg(1,"path_noext=%s\n",path_noext); + string = (*jnienv)->NewStringUTF(jnienv, path_noext); + g_free(path_noext); + id=(*jnienv)->CallIntMethod(jnienv, gra->Resources, gra->Resources_getIdentifier, string, a, gra->packageName); + dbg(1,"id=%d\n",id); + if (id) + ret->Bitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeResource, gra->Resources, id); + (*jnienv)->DeleteLocalRef(jnienv, a); + } else { + string = (*jnienv)->NewStringUTF(jnienv, path); + ret->Bitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeFile, string); + } + dbg(1,"result=%p\n",ret->Bitmap); + if (ret->Bitmap) { + (*jnienv)->NewGlobalRef(jnienv, ret->Bitmap); + (*jnienv)->DeleteLocalRef(jnienv, ret->Bitmap); + ret->width=(*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getWidth); + ret->height=(*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getHeight); + dbg(1,"w=%d h=%d for %s\n",ret->width,ret->height,path); + ret->hot.x=ret->width/2; + ret->hot.y=ret->height/2; + } else { + g_free(ret); + ret=NULL; + dbg(0,"Failed to open %s\n",path); + } + (*jnienv)->DeleteLocalRef(jnienv, string); + g_hash_table_insert(image_cache_hash, g_strdup( path ), (gpointer)ret ); + } + if (ret) { + *w=ret->width; + *h=ret->height; + if (hot) + *hot=ret->hot; + } + + return ret; +} + +static void initPaint(struct graphics_priv *gra, struct graphics_gc_priv *gc) +{ + float wf = gc->linewidth; + (*jnienv)->CallVoidMethod(jnienv, gc->gra->Paint, gra->Paint_setStrokeWidth, wf); + (*jnienv)->CallVoidMethod(jnienv, gc->gra->Paint, gra->Paint_setARGB, gc->a, gc->r, gc->g, gc->b); +} + +static void +draw_lines(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count) +{ + jint pc[count*2]; + int i; + jintArray points; + if (count <= 0) + return; + points = (*jnienv)->NewIntArray(jnienv,count*2); + for (i = 0 ; i < count ; i++) { + pc[i*2]=p[i].x; + pc[i*2+1]=p[i].y; + } + initPaint(gra, gc); + (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count*2, pc); + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polyline, gc->gra->Paint, points); + (*jnienv)->DeleteLocalRef(jnienv, points); +} + +static void +draw_polygon(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count) +{ + jint pc[count*2]; + int i; + jintArray points; + if (count <= 0) + return; + points = (*jnienv)->NewIntArray(jnienv,count*2); + for (i = 0 ; i < count ; i++) { + pc[i*2]=p[i].x; + pc[i*2+1]=p[i].y; + } + initPaint(gra, gc); + (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count*2, pc); + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polygon, gc->gra->Paint, points); + (*jnienv)->DeleteLocalRef(jnienv, points); +} + +static void +draw_rectangle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int w, int h) +{ + initPaint(gra, gc); + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_rectangle, gc->gra->Paint, p->x, p->y, w, h); +} + +static void +draw_circle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int r) +{ + initPaint(gra, gc); + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_circle, gc->gra->Paint, p->x, p->y, r); +} + + +static void +draw_text(struct graphics_priv *gra, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) +{ + dbg(1,"enter %s\n", text); + initPaint(gra, fg); + jstring string = (*jnienv)->NewStringUTF(jnienv, text); + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_text, fg->gra->Paint, p->x, p->y, string, font->size, dx, dy); + (*jnienv)->DeleteLocalRef(jnienv, string); +} + +static void +draw_image(struct graphics_priv *gra, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) +{ + dbg(1,"enter %p\n",img); + initPaint(gra, fg); + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_image, fg->gra->Paint, p->x, p->y, img->Bitmap); + +} + +static void +draw_image_warp(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, char *data) +{ +} + +static void +draw_restore(struct graphics_priv *gr, struct point *p, int w, int h) +{ +} + +static void draw_drag(struct graphics_priv *gra, struct point *p) +{ + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_drag, p ? p->x : 0, p ? p->y : 0); +} + +static void +background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) +{ +} + +static void +draw_mode(struct graphics_priv *gra, enum draw_mode_num mode) +{ + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_mode, (int)mode); +} + +static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound); + +static void * +get_data(struct graphics_priv *this, const char *type) +{ + if (strcmp(type,"window")) + return NULL; + return &this->win; +} + +static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) +{ +} + +static void get_text_bbox(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate) +{ + int len = g_utf8_strlen(text, -1); + int xMin = 0; + int yMin = 0; + int yMax = 13*font->size/256; + int xMax = 9*font->size*len/256; + + ret[0].x = xMin; + ret[0].y = -yMin; + ret[1].x = xMin; + ret[1].y = -yMax; + ret[2].x = xMax; + ret[2].y = -yMax; + ret[3].x = xMax; + ret[3].y = -yMin; +} + +static void overlay_disable(struct graphics_priv *gra, int disable) +{ + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_overlay_disable, disable); +} + +static void overlay_resize(struct graphics_priv *gra, struct point *pnt, int w, int h, int alpha, int wraparound) +{ + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_overlay_resize, pnt ? pnt->x:0 , pnt ? pnt->y:0, w, h, alpha, wraparound); +} + +static int +set_attr(struct graphics_priv *gra, struct attr *attr) +{ + switch (attr->type) { + case attr_use_camera: + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_SetCamera, attr->u.num); + return 1; + default: + return 0; + } +} + +static struct graphics_methods graphics_methods = { + graphics_destroy, + draw_mode, + draw_lines, + draw_polygon, + draw_rectangle, + draw_circle, + draw_text, + draw_image, + draw_image_warp, + draw_restore, + draw_drag, + font_new, + gc_new, + background_gc, + overlay_new, + image_new, + get_data, + image_free, + get_text_bbox, + overlay_disable, + overlay_resize, + set_attr, +}; + +static void +resize_callback(struct graphics_priv *gra, int w, int h) +{ + dbg(0,"w=%d h=%d ok\n",w,h); + callback_list_call_attr_2(gra->cbl, attr_resize, (void *)w, (void *)h); +} + +static void +motion_callback(struct graphics_priv *gra, int x, int y) +{ + struct point p; + p.x=x; + p.y=y; + callback_list_call_attr_1(gra->cbl, attr_motion, (void *)&p); +} + +static void +keypress_callback(struct graphics_priv *gra, char *s) +{ + dbg(0,"enter %s\n",s); + callback_list_call_attr_1(gra->cbl, attr_keypress, s); +} + +static void +button_callback(struct graphics_priv *gra, int pressed, int button, int x, int y) +{ + struct point p; + p.x=x; + p.y=y; + callback_list_call_attr_3(gra->cbl, attr_button, (void *)pressed, (void *)button, (void *)&p); +} + + +static int +set_activity(jobject graphics) +{ + jclass ActivityClass; + jmethodID cid; + + ActivityClass = (*jnienv)->GetObjectClass(jnienv, android_activity); + dbg(0,"at 5\n"); + if (ActivityClass == NULL) { + dbg(0,"no activity class found\n"); + return 0; + } + dbg(0,"at 6\n"); + cid = (*jnienv)->GetMethodID(jnienv, ActivityClass, "setContentView", "(Landroid/view/View;)V"); + if (cid == NULL) { + dbg(0,"no setContentView method found\n"); + return 0; + } + dbg(0,"at 7\n"); + (*jnienv)->CallVoidMethod(jnienv, android_activity, cid, graphics); + dbg(0,"at 8\n"); + return 1; +} + +static int +graphics_android_init(struct graphics_priv *ret, struct graphics_priv *parent, struct point *pnt, int w, int h, int alpha, int wraparound, int use_camera) +{ + struct callback *cb; + jmethodID cid, Context_getPackageName; + + dbg(0,"at 2 jnienv=%p\n",jnienv); + if (!find_class_global("android/graphics/Paint", &ret->PaintClass)) + return 0; + if (!find_method(ret->PaintClass, "", "(I)V", &ret->Paint_init)) + return 0; + if (!find_method(ret->PaintClass, "setARGB", "(IIII)V", &ret->Paint_setARGB)) + return 0; + if (!find_method(ret->PaintClass, "setStrokeWidth", "(F)V", &ret->Paint_setStrokeWidth)) + return 0; + + if (!find_class_global("android/graphics/BitmapFactory", &ret->BitmapFactoryClass)) + return 0; + if (!find_static_method(ret->BitmapFactoryClass, "decodeFile", "(Ljava/lang/String;)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeFile)) + return 0; + if (!find_static_method(ret->BitmapFactoryClass, "decodeResource", "(Landroid/content/res/Resources;I)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeResource)) + return 0; + + if (!find_class_global("android/graphics/Bitmap", &ret->BitmapClass)) + return 0; + if (!find_method(ret->BitmapClass, "getHeight", "()I", &ret->Bitmap_getHeight)) + return 0; + if (!find_method(ret->BitmapClass, "getWidth", "()I", &ret->Bitmap_getWidth)) + return 0; + + if (!find_class_global("android/content/Context", &ret->ContextClass)) + return 0; + if (!find_method(ret->ContextClass, "getResources", "()Landroid/content/res/Resources;", &ret->Context_getResources)) + return 0; + + + ret->Resources=(*jnienv)->CallObjectMethod(jnienv, android_activity, ret->Context_getResources); + if (ret->Resources) + (*jnienv)->NewGlobalRef(jnienv, ret->Resources); + if (!find_class_global("android/content/res/Resources", &ret->ResourcesClass)) + return 0; + if (!find_method(ret->ResourcesClass, "getIdentifier", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", &ret->Resources_getIdentifier)) + return 0; + + if (!find_method(ret->ContextClass, "getPackageName", "()Ljava/lang/String;", &Context_getPackageName)) + return 0; + ret->packageName=(*jnienv)->CallObjectMethod(jnienv, android_activity, Context_getPackageName); + (*jnienv)->NewGlobalRef(jnienv, ret->packageName); + + if (!find_class_global("org/navitproject/navit/NavitGraphics", &ret->NavitGraphicsClass)) + return 0; + dbg(0,"at 3\n"); + cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "", "(Landroid/app/Activity;Lorg/navitproject/navit/NavitGraphics;IIIIIII)V"); + if (cid == NULL) { + dbg(0,"no method found\n"); + return 0; /* exception thrown */ + } + dbg(0,"at 4 android_activity=%p\n",android_activity); + ret->NavitGraphics=(*jnienv)->NewObject(jnienv, ret->NavitGraphicsClass, cid, android_activity, parent ? parent->NavitGraphics : NULL, pnt ? pnt->x:0 , pnt ? pnt->y:0, w, h, alpha, wraparound, use_camera); + dbg(0,"result=%p\n",ret->NavitGraphics); + if (ret->NavitGraphics) + (*jnienv)->NewGlobalRef(jnienv, ret->NavitGraphics); + + + /* Create a single global Paint, otherwise android will quickly run out + * of global refs.*/ + /* 0x101 = text kerning (default), antialiasing */ + ret->Paint=(*jnienv)->NewObject(jnienv, ret->PaintClass, ret->Paint_init, 0x101); + + dbg(0,"result=%p\n",ret->Paint); + if (ret->Paint) + (*jnienv)->NewGlobalRef(jnienv, ret->Paint); + + cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setSizeChangedCallback", "(I)V"); + if (cid == NULL) { + dbg(0,"no SetResizeCallback method found\n"); + return 0; /* exception thrown */ + } + cb=callback_new_1(callback_cast(resize_callback), ret); + (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); + + cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setButtonCallback", "(I)V"); + if (cid == NULL) { + dbg(0,"no SetButtonCallback method found\n"); + return 0; /* exception thrown */ + } + cb=callback_new_1(callback_cast(button_callback), ret); + (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); + + cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setMotionCallback", "(I)V"); + if (cid == NULL) { + dbg(0,"no SetMotionCallback method found\n"); + return 0; /* exception thrown */ + } + cb=callback_new_1(callback_cast(motion_callback), ret); + (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); + + cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setKeypressCallback", "(I)V"); + if (cid == NULL) { + dbg(0,"no SetKeypressCallback method found\n"); + return 0; /* exception thrown */ + } + cb=callback_new_1(callback_cast(keypress_callback), ret); + (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); + + if (!find_method(ret->NavitGraphicsClass, "draw_polyline", "(Landroid/graphics/Paint;[I)V", &ret->NavitGraphics_draw_polyline)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "draw_polygon", "(Landroid/graphics/Paint;[I)V", &ret->NavitGraphics_draw_polygon)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "draw_rectangle", "(Landroid/graphics/Paint;IIII)V", &ret->NavitGraphics_draw_rectangle)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "draw_circle", "(Landroid/graphics/Paint;III)V", &ret->NavitGraphics_draw_circle)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "draw_text", "(Landroid/graphics/Paint;IILjava/lang/String;III)V", &ret->NavitGraphics_draw_text)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "draw_image", "(Landroid/graphics/Paint;IILandroid/graphics/Bitmap;)V", &ret->NavitGraphics_draw_image)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "draw_mode", "(I)V", &ret->NavitGraphics_draw_mode)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "draw_drag", "(II)V", &ret->NavitGraphics_draw_drag)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "overlay_disable", "(I)V", &ret->NavitGraphics_overlay_disable)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "overlay_resize", "(IIIIII)V", &ret->NavitGraphics_overlay_resize)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "SetCamera", "(I)V", &ret->NavitGraphics_SetCamera)) + return 0; +#if 0 + set_activity(ret->NavitGraphics); +#endif + return 1; +} + +static int +graphics_android_fullscreen(struct window *win, int on) +{ + return 1; +} + +static jclass NavitClass; +static jmethodID Navit_disableSuspend, Navit_exit; + +static void +graphics_android_disable_suspend(struct window *win) +{ + dbg(1,"enter\n"); + (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_disableSuspend); +} + + + +static struct graphics_priv * +graphics_android_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) +{ + struct graphics_priv *ret; + struct attr *attr; + int use_camera=0; + if (!event_request_system("android","graphics_android")) + return NULL; + ret=g_new0(struct graphics_priv, 1); + + ret->cbl=cbl; + *meth=graphics_methods; + ret->win.priv=ret; + ret->win.fullscreen=graphics_android_fullscreen; + ret->win.disable_suspend=graphics_android_disable_suspend; + if ((attr=attr_search(attrs, NULL, attr_use_camera))) { + use_camera=attr->u.num; + } + image_cache_hash = g_hash_table_new(g_str_hash, g_str_equal); + if (graphics_android_init(ret, NULL, NULL, 0, 0, 0, 0, use_camera)) { + dbg(0,"returning %p\n",ret); + return ret; + } else { + g_free(ret); + return NULL; + } +} + +static struct graphics_priv * +overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound) +{ + struct graphics_priv *ret=g_new0(struct graphics_priv, 1); + *meth=graphics_methods; + if (graphics_android_init(ret, gr, p, w, h, alpha, wraparound, 0)) { + dbg(0,"returning %p\n",ret); + return ret; + } else { + g_free(ret); + return NULL; + } +} + + +static void +event_android_main_loop_run(void) +{ + dbg(0,"enter\n"); +} + +static void event_android_main_loop_quit(void) +{ + dbg(0,"enter\n"); + (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_exit); +} + + +static jclass NavitTimeoutClass; +static jmethodID NavitTimeout_init; +static jmethodID NavitTimeout_remove; + +static jclass NavitIdleClass; +static jmethodID NavitIdle_init; +static jmethodID NavitIdle_remove; + +static jclass NavitWatchClass; +static jmethodID NavitWatch_init; +static jmethodID NavitWatch_remove; + + +static void do_poll(JNIEnv *env, int fd, int cond) +{ + struct pollfd pfd; + pfd.fd=fd; + dbg(1,"%p poll called for %d %d\n", fd, cond); + switch ((enum event_watch_cond)cond) { + case event_watch_cond_read: + pfd.events=POLLIN; + break; + case event_watch_cond_write: + pfd.events=POLLOUT; + break; + case event_watch_cond_except: + pfd.events=POLLERR; + break; + default: + pfd.events=0; + } + pfd.revents=0; + poll(&pfd, 1, -1); +} + +static struct event_watch * +event_android_add_watch(void *h, enum event_watch_cond cond, struct callback *cb) +{ + jobject ret; + ret=(*jnienv)->NewObject(jnienv, NavitWatchClass, NavitWatch_init, (int)do_poll, (int) h, (int) cond, (int)cb); + dbg(0,"result for %p,%d,%p=%p\n",h,cond,cb,ret); + if (ret) + (*jnienv)->NewGlobalRef(jnienv, ret); + return (struct event_watch *)ret; +} + +static void +event_android_remove_watch(struct event_watch *ev) +{ + dbg(0,"enter %p\n",ev); + if (ev) { + jobject obj=(jobject )ev; + (*jnienv)->CallVoidMethod(jnienv, obj, NavitWatch_remove); + (*jnienv)->DeleteGlobalRef(jnienv, obj); + } +} + +static struct event_timeout * +event_android_add_timeout(int timeout, int multi, struct callback *cb) +{ + jobject ret; + ret=(*jnienv)->NewObject(jnienv, NavitTimeoutClass, NavitTimeout_init, timeout, multi, (int)cb); + dbg(1,"result for %d,%d,%p=%p\n",timeout,multi,cb,ret); + if (ret) + (*jnienv)->NewGlobalRef(jnienv, ret); + return (struct event_timeout *)ret; +} + +static void +event_android_remove_timeout(struct event_timeout *to) +{ + dbg(1,"enter %p\n",to); + if (to) { + jobject obj=(jobject )to; + (*jnienv)->CallVoidMethod(jnienv, obj, NavitTimeout_remove); + (*jnienv)->DeleteGlobalRef(jnienv, obj); + } +} + + +static struct event_idle * +event_android_add_idle(int priority, struct callback *cb) +{ +#if 0 + jobject ret; + dbg(1,"enter\n"); + ret=(*jnienv)->NewObject(jnienv, NavitIdleClass, NavitIdle_init, (int)cb); + dbg(1,"result for %p=%p\n",cb,ret); + if (ret) + (*jnienv)->NewGlobalRef(jnienv, ret); + return (struct event_idle *)ret; +#endif + return (struct event_idle *)event_android_add_timeout(1, 1, cb); +} + +static void +event_android_remove_idle(struct event_idle *ev) +{ +#if 0 + dbg(1,"enter %p\n",ev); + if (ev) { + jobject obj=(jobject )ev; + (*jnienv)->CallVoidMethod(jnienv, obj, NavitIdle_remove); + (*jnienv)->DeleteGlobalRef(jnienv, obj); + } +#endif + event_android_remove_timeout((struct event_timeout *)ev); +} + +static void +event_android_call_callback(struct callback_list *cb) +{ + dbg(0,"enter\n"); +} + +static struct event_methods event_android_methods = { + event_android_main_loop_run, + event_android_main_loop_quit, + event_android_add_watch, + event_android_remove_watch, + event_android_add_timeout, + event_android_remove_timeout, + event_android_add_idle, + event_android_remove_idle, + event_android_call_callback, +}; + +static struct event_priv * +event_android_new(struct event_methods *meth) +{ + dbg(0,"enter\n"); + if (!find_class_global("org/navitproject/navit/NavitTimeout", &NavitTimeoutClass)) + return NULL; + NavitTimeout_init = (*jnienv)->GetMethodID(jnienv, NavitTimeoutClass, "", "(IZI)V"); + if (NavitTimeout_init == NULL) + return NULL; + NavitTimeout_remove = (*jnienv)->GetMethodID(jnienv, NavitTimeoutClass, "remove", "()V"); + if (NavitTimeout_remove == NULL) + return NULL; +#if 0 + if (!find_class_global("org/navitproject/navit/NavitIdle", &NavitIdleClass)) + return NULL; + NavitIdle_init = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "", "(I)V"); + if (NavitIdle_init == NULL) + return NULL; + NavitIdle_remove = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "remove", "()V"); + if (NavitIdle_remove == NULL) + return NULL; +#endif + + if (!find_class_global("org/navitproject/navit/NavitWatch", &NavitWatchClass)) + return NULL; + NavitWatch_init = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "", "(IIII)V"); + if (NavitWatch_init == NULL) + return NULL; + NavitWatch_remove = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "remove", "()V"); + if (NavitWatch_remove == NULL) + return NULL; + + if (!find_class_global("org/navitproject/navit/Navit", &NavitClass)) + return NULL; + Navit_disableSuspend = (*jnienv)->GetMethodID(jnienv, NavitClass, "disableSuspend", "()V"); + if (Navit_disableSuspend == NULL) + return NULL; + Navit_exit = (*jnienv)->GetMethodID(jnienv, NavitClass, "exit", "()V"); + if (Navit_exit == NULL) + return NULL; + dbg(0,"ok\n"); + *meth=event_android_methods; + return NULL; +} + + +void +plugin_init(void) +{ + dbg(0,"enter\n"); + plugin_register_graphics_type("android", graphics_android_new); + plugin_register_event_type("android", event_android_new); +} diff --git a/navit/graphics/gd/Makefile.am b/navit/graphics/gd/Makefile.am new file mode 100644 index 0000000..67fc270 --- /dev/null +++ b/navit/graphics/gd/Makefile.am @@ -0,0 +1,9 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ @GD_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=graphics_gd +libgraphics_gd_la_LDFLAGS = @GD_LIBS@ -module -avoid-version +if PLUGINS +modulegraphics_LTLIBRARIES = libgraphics_gd.la +else +noinst_LTLIBRARIES = libgraphics_gd.la +endif +libgraphics_gd_la_SOURCES = graphics_gd.c diff --git a/navit/graphics/gd/Makefile.in b/navit/graphics/gd/Makefile.in new file mode 100644 index 0000000..971fe25 --- /dev/null +++ b/navit/graphics/gd/Makefile.in @@ -0,0 +1,704 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/graphics/gd +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulegraphicsdir)" +LTLIBRARIES = $(modulegraphics_LTLIBRARIES) $(noinst_LTLIBRARIES) +libgraphics_gd_la_LIBADD = +am_libgraphics_gd_la_OBJECTS = graphics_gd.lo +libgraphics_gd_la_OBJECTS = $(am_libgraphics_gd_la_OBJECTS) +libgraphics_gd_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libgraphics_gd_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libgraphics_gd_la_rpath = +@PLUGINS_TRUE@am_libgraphics_gd_la_rpath = -rpath $(modulegraphicsdir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libgraphics_gd_la_SOURCES) +DIST_SOURCES = $(libgraphics_gd_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ @GD_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=graphics_gd +libgraphics_gd_la_LDFLAGS = @GD_LIBS@ -module -avoid-version +@PLUGINS_TRUE@modulegraphics_LTLIBRARIES = libgraphics_gd.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libgraphics_gd.la +libgraphics_gd_la_SOURCES = graphics_gd.c +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/graphics/gd/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/graphics/gd/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulegraphicsLTLIBRARIES: $(modulegraphics_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulegraphicsdir)" || $(MKDIR_P) "$(DESTDIR)$(modulegraphicsdir)" + @list='$(modulegraphics_LTLIBRARIES)'; test -n "$(modulegraphicsdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulegraphicsdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulegraphicsdir)"; \ + } + +uninstall-modulegraphicsLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulegraphics_LTLIBRARIES)'; test -n "$(modulegraphicsdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulegraphicsdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulegraphicsdir)/$$f"; \ + done + +clean-modulegraphicsLTLIBRARIES: + -test -z "$(modulegraphics_LTLIBRARIES)" || rm -f $(modulegraphics_LTLIBRARIES) + @list='$(modulegraphics_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgraphics_gd.la: $(libgraphics_gd_la_OBJECTS) $(libgraphics_gd_la_DEPENDENCIES) + $(libgraphics_gd_la_LINK) $(am_libgraphics_gd_la_rpath) $(libgraphics_gd_la_OBJECTS) $(libgraphics_gd_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphics_gd.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulegraphicsdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulegraphicsLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulegraphicsLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulegraphicsLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulegraphicsLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-modulegraphicsLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am \ + uninstall-modulegraphicsLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/graphics/gd/graphics_gd.c b/navit/graphics/gd/graphics_gd.c new file mode 100644 index 0000000..7f74b2d --- /dev/null +++ b/navit/graphics/gd/graphics_gd.c @@ -0,0 +1,894 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include "config.h" +#include "point.h" +#include "graphics.h" +#include "color.h" +#include "plugin.h" +#include "callback.h" +#include "window.h" +#include "navit.h" +#include "debug.h" +#include "navit/font/freetype/font_freetype.h" + + +#ifdef HAVE_SHMEM +#include +#include +#include +#endif + +#ifdef HAVE_SOCKET +#include +#include +#include +#include +#endif + +struct shmem_header { + int flag; + int w,h,bpp; +}; + +#ifdef HAVE_XPM +#define NAVIT_GD_XPM_TRANSPARENCY_HACK +#endif + +static void emit_callback(struct graphics_priv *priv); +static void image_setup(struct graphics_priv *gr); +static struct shmem_header *shm_next(struct graphics_priv *gr); +static void add_overlays(struct graphics_priv *overlay, gdImagePtr im); + +#ifdef NAVIT_GD_XPM_TRANSPARENCY_HACK +#include + + +BGD_DECLARE(gdImagePtr) gdImageCreateFromXpm (char *filename) +{ + XpmInfo info; + XpmImage image; + int i, j, k, number; + char buf[5]; + gdImagePtr im = 0; + int *pointer; + int red = 0, green = 0, blue = 0, alpha = 0; + int *colors; + int ret; + ret = XpmReadFileToXpmImage (filename, &image, &info); + if (ret != XpmSuccess) + return 0; + + if (!(im = gdImageCreate (image.width, image.height))) + return 0; + + number = image.ncolors; + if (overflow2(sizeof (int), number)) { + return 0; + } + colors = (int *) gdMalloc (sizeof (int) * number); + if (colors == NULL) + return (0); + for (i = 0; i < number; i++) + { + alpha = 0; + switch (strlen (image.colorTable[i].c_color)) + { + case 4: + if (!strcasecmp(image.colorTable[i].c_color,"none")) { + red = 0; + green = 0; + blue = 0; + alpha = 127; + } else { + buf[1] = '\0'; + buf[0] = image.colorTable[i].c_color[1]; + red = strtol (buf, NULL, 16); + + buf[0] = image.colorTable[i].c_color[3]; + green = strtol (buf, NULL, 16); + + buf[0] = image.colorTable[i].c_color[5]; + blue = strtol (buf, NULL, 16); + } + break; + case 7: + buf[2] = '\0'; + buf[0] = image.colorTable[i].c_color[1]; + buf[1] = image.colorTable[i].c_color[2]; + red = strtol (buf, NULL, 16); + + buf[0] = image.colorTable[i].c_color[3]; + buf[1] = image.colorTable[i].c_color[4]; + green = strtol (buf, NULL, 16); + + buf[0] = image.colorTable[i].c_color[5]; + buf[1] = image.colorTable[i].c_color[6]; + blue = strtol (buf, NULL, 16); + break; + case 10: + buf[3] = '\0'; + buf[0] = image.colorTable[i].c_color[1]; + buf[1] = image.colorTable[i].c_color[2]; + buf[2] = image.colorTable[i].c_color[3]; + red = strtol (buf, NULL, 16); + red /= 64; + + buf[0] = image.colorTable[i].c_color[4]; + buf[1] = image.colorTable[i].c_color[5]; + buf[2] = image.colorTable[i].c_color[6]; + green = strtol (buf, NULL, 16); + green /= 64; + + buf[0] = image.colorTable[i].c_color[7]; + buf[1] = image.colorTable[i].c_color[8]; + buf[2] = image.colorTable[i].c_color[9]; + blue = strtol (buf, NULL, 16); + blue /= 64; + break; + case 13: + buf[4] = '\0'; + buf[0] = image.colorTable[i].c_color[1]; + buf[1] = image.colorTable[i].c_color[2]; + buf[2] = image.colorTable[i].c_color[3]; + buf[3] = image.colorTable[i].c_color[4]; + red = strtol (buf, NULL, 16); + red /= 256; + + buf[0] = image.colorTable[i].c_color[5]; + buf[1] = image.colorTable[i].c_color[6]; + buf[2] = image.colorTable[i].c_color[7]; + buf[3] = image.colorTable[i].c_color[8]; + green = strtol (buf, NULL, 16); + green /= 256; + + buf[0] = image.colorTable[i].c_color[9]; + buf[1] = image.colorTable[i].c_color[10]; + buf[2] = image.colorTable[i].c_color[11]; + buf[3] = image.colorTable[i].c_color[12]; + blue = strtol (buf, NULL, 16); + blue /= 256; + break; + } + + + colors[i] = gdImageColorResolveAlpha(im, red, green, blue, alpha); + if (colors[i] == -1) + fprintf (stderr, "ARRRGH\n"); + } + + pointer = (int *) image.data; + for (i = 0; i < image.height; i++) + { + for (j = 0; j < image.width; j++) + { + k = *pointer++; + gdImageSetPixel (im, j, i, colors[k]); + } + } + gdFree (colors); + return (im); +} +#endif + + +struct graphics_priv { + gdImagePtr im; + int w,h,flags,alpha,overlay,shmkey,shmsize,shmoffset; + void *shm; + struct shmem_header *shm_header; + struct point p; + struct callback *cb; + struct callback_list *cbl; + struct navit *nav; + struct graphics_gc_priv *background; + struct font_freetype_methods freetype_methods; + struct window window; + struct graphics_data_image image; + struct graphics_priv *next,*overlays; + GList *sockets; +}; + +struct graphics_gc_priv { + struct graphics_priv *gr; + int color; + int bgcolor; + int width; + struct color color2; + unsigned char *dash_list; + int dash_count; + int dash_list_len; +}; + +struct graphics_image_priv { + gdImagePtr im; +}; + + +static void +graphics_destroy(struct graphics_priv *gr) +{ + g_free(gr); +} + +static void +gc_destroy(struct graphics_gc_priv *gc) +{ + if (gc->color != -1) + gdImageColorDeallocate(gc->gr->im, gc->color); + if (gc->bgcolor != -1) + gdImageColorDeallocate(gc->gr->im, gc->bgcolor); + g_free(gc->dash_list); + g_free(gc); +} + +static void +gc_set_linewidth(struct graphics_gc_priv *gc, int w) +{ + gc->width=w; +} + +static void +gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) +{ + int i,count=0; + g_free(gc->dash_list); + gc->dash_list=g_new(unsigned char, n); + for (i = 0 ; i < n ; i++) { + gc->dash_list[i]=dash_list[i]; + count+=dash_list[i]; + } + gc->dash_list_len=n; + gc->dash_count=count; +} + +static void +gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) +{ + gc->color2=*c; + gc->color=gdImageColorAllocate(gc->gr->im, c->r>>8, c->g>>8, c->b>>8); +} + +static void +gc_set_background(struct graphics_gc_priv *gc, struct color *c) +{ + gc->bgcolor=gdImageColorAllocate(gc->gr->im, c->r>>8, c->g>>8, c->b>>8); +} + +static struct graphics_gc_methods gc_methods = { + gc_destroy, + gc_set_linewidth, + gc_set_dashes, + gc_set_foreground, + gc_set_background +}; + +static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) +{ + struct graphics_gc_priv *ret=g_new0(struct graphics_gc_priv, 1); + ret->gr=gr; + ret->width=1; + ret->color=-1; + ret->bgcolor=-1; + *meth=gc_methods; + return ret; +} + + +static struct graphics_image_priv * +image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *name, int *w, int *h, struct point *hot, int rotation) +{ + FILE *file; + struct graphics_image_priv *ret=NULL; + gdImagePtr im=NULL; + int len; + + if (! name) + return NULL; + len=strlen(name); + if (len < 4) + return NULL; + file=fopen(name,"r"); + if (file) { + if (!strcmp(name+len-4,".png")) +#ifdef HAVE_GRAPHICS_GD_PNG + im=gdImageCreateFromPng(file); +#else + im=NULL; +#endif + else if (!strcmp(name+len-4,".xpm")) + im=gdImageCreateFromXpm(name); + else if (!strcmp(name+len-4,".gif")) { + im=gdImageCreateFromGif(file); + } + fclose(file); + } + if (im) { + ret=g_new0(struct graphics_image_priv, 1); + ret->im=im; + *w=im->sx; + *h=im->sy; + hot->x=im->sx/2; + hot->y=im->sy/2; + } + return ret; +} + +static void +draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) +{ + int color[gc->dash_count],cc; + int i,j,k=0; + + if (gc->dash_count) { + cc=gc->color; + for (i = 0 ; i < gc->dash_list_len ; i++) { + for (j = 0 ; j < gc->dash_list[i] ; j++) { + color[k++]=cc; + } + if (cc == gdTransparent) + cc=gc->color; + else + cc=gdTransparent; + } + gdImageSetStyle(gr->im, color, gc->dash_count); + } + gdImageSetThickness(gr->im, gc->width); + cc=gc->color; + if (gr->flags & 8) { + gdImageSetAntiAliased(gr->im, cc); + cc=gdAntiAliased; + } +#ifdef GD_NO_IMAGE_OPEN_POLYGON + for (i = 0 ; i < count-1 ; i++) + gdImageLine(gr->im, p[i].x, p[i].y, p[i+1].x, p[i+1].y, gc->dash_count ? gdStyled : cc); +#else + gdImageOpenPolygon(gr->im, (gdPointPtr) p, count, gc->dash_count ? gdStyled : cc); +#endif +} + +static void +draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) +{ + int cc=gc->color; + if (gr->flags & 8) { + gdImageSetAntiAliased(gr->im, cc); + cc=gdAntiAliased; + } + gdImageFilledPolygon(gr->im, (gdPointPtr) p, count, cc); +} + +static void +draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) +{ + int cc=gc->color; + if (gr->flags & 8) { + gdImageSetAntiAliased(gr->im, cc); + cc=gdAntiAliased; + } + gdImageFilledRectangle(gr->im, p->x, p->y, p->x+w, p->y+h, cc); +} + +static void +draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r) +{ + int cc=gc->color; + if (gr->flags & 8) { + gdImageSetAntiAliased(gr->im, cc); + cc=gdAntiAliased; + } + gdImageSetThickness(gr->im, gc->width); + gdImageArc(gr->im, p->x, p->y, r, r, 0, 360, cc); +} + + +static void +draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) +{ + struct font_freetype_text *t; + struct font_freetype_glyph *g, **gp; + gdImagePtr im; + int i,x,y,w,h; + t=gr->freetype_methods.text_new(text, (struct font_freetype_font *)font, dx, dy); + struct color fgc,bgc,transparent = {0x0, 0x0, 0x0, 0x7f7f}; + fgc=fg->color2; + fgc.a=0; + + if (bg) { + bgc=bg->color2; + bgc.a=0; + x=p->x << 6; + y=p->y << 6; + gp=t->glyph; + i=t->glyph_count; + while (i-- > 0) + { + g=*gp++; + w=g->w; + h=g->h; + if (w && h) { + im=gdImageCreateTrueColor(w+2, h+2); + gr->freetype_methods.get_shadow(g,(unsigned char *)(im->tpixels),32,0,&bgc,&transparent); + gdImageCopy(gr->im, im, ((x+g->x)>>6)-1, ((y+g->y)>>6)-1, 0, 0, w+2, h+2); + gdImageDestroy(im); + } + x+=g->dx; + y+=g->dy; + } + } else + bgc=transparent; + x=p->x << 6; + y=p->y << 6; + gp=t->glyph; + i=t->glyph_count; + while (i-- > 0) + { + g=*gp++; + w=g->w; + h=g->h; + if (w && h) { + im=gdImageCreateTrueColor(w, h); + gr->freetype_methods.get_glyph(g,(unsigned char *)(im->tpixels),32,0,&fgc,&bgc,&transparent); + gdImageCopy(gr->im, im, (x+g->x)>>6, (y+g->y)>>6, 0, 0, w, h); + gdImageDestroy(im); + } + x+=g->dx; + y+=g->dy; + } + gr->freetype_methods.text_destroy(t); +} + +static void +draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) +{ + gdImageCopy(gr->im, img->im, p->x, p->y, 0, 0, img->im->sx, img->im->sy); +} + +static void +draw_image_warp(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, char *data) +{ +} + +static void +draw_restore(struct graphics_priv *gr, struct point *p, int w, int h) +{ +} + +static void +draw_drag(struct graphics_priv *gr, struct point *p) +{ + if (p) + gr->p=*p; + else { + gr->p.x=0; + gr->p.y=0; + } +} + + +static void +background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) +{ + gr->background=gc; +} + +static void +draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) +{ + FILE *pngout; +#if 0 + if (mode == draw_mode_begin && gr->background) { + gdImageFilledRectangle(gr->im, 0, 0, gr->w, gr->h, gr->background->color); + } +#endif + if (mode == draw_mode_end && !gr->overlay) { + add_overlays(gr->overlays, gr->im); + if (!(gr->flags & 1)) { +#ifdef HAVE_GRAPHICS_GD_PNG + rename("test.png","test.png.old"); + pngout=fopen("test.png", "wb"); + gdImagePng(gr->im, pngout); + fclose(pngout); +#else + rename("test.gd","test.gd.old"); + pngout=fopen("test.gd", "wb"); + gdImageGd(gr->im, pngout); + fclose(pngout); +#endif + } + if (gr->flags & 2) { + struct shmem_header *next=shm_next(gr); + gr->shm_header->flag=1; + dbg(1,"next flag is %d\n",next->flag); + if (!next->flag) { + gr->shm_header=next; + image_setup(gr); + } + } +#ifdef HAVE_GRAPHICS_GD_PNG +#ifdef HAVE_SOCKET + if (gr->flags & 4) { + int size, size_written; + void *data=gdImagePngPtr(gr->im, &size); + GList *sockets=gr->sockets; + while (sockets) { + int fd=socket(PF_INET, SOCK_STREAM, 0); + if (fd < 0) { + dbg(0,"socket failed\n"); + } else { + if (connect(fd, (struct sockaddr *)sockets->data, sizeof(struct sockaddr_in)) < 0) { + dbg(0,"connect failed\n"); + } else { + size_written=write(fd, data, size); + dbg(0,"size %d vs %d\n",size, size_written); + if (shutdown(fd, SHUT_RDWR) < 0) + dbg(0,"shutdown failed\n"); + } + close(fd); + } + sockets=g_list_next(sockets); + } + gdFree(data); + } +#endif +#endif + } +} + +static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha); + +static void +add_overlays(struct graphics_priv *overlay, gdImagePtr im) +{ + while (overlay) { + if (overlay->background) { + gdImagePtr res,src; + int y,x; + int bgcol=overlay->background->color; + res=gdImageCreateTrueColor(overlay->w,overlay->h); + src=gdImageCreateTrueColor(overlay->w,overlay->h); + gdImageCopy(src, im, 0, 0, overlay->p.x, overlay->p.y, overlay->w, overlay->h); + for (y = 0 ; y < overlay->h ; y++) { + unsigned int *res_line=res->tpixels[y]; + unsigned int *src_line=src->tpixels[y]; + unsigned int *overlay_line=overlay->im->tpixels[y]; + for (x = 0 ; x < overlay->w ; x++) { + if (overlay_line[x] != bgcol) + res_line[x]=overlay_line[x]; + else + res_line[x]=src_line[x]; + } + } + gdImageCopy(im, res, overlay->p.x, overlay->p.y, 0, 0, overlay->w, overlay->h); + gdImageDestroy(res); + gdImageDestroy(src); + } else + gdImageCopy(im, overlay->im, overlay->p.x, overlay->p.y, 0, 0, overlay->w, overlay->h); + overlay=overlay->next; + } +} + +static void * +get_data(struct graphics_priv *this, char *type) +{ + int b; + struct point p; + gdImagePtr im = this->im; + dbg(1,"type=%s\n",type); + if (!strcmp(type,"window")) + return &this->window; + if (!strcmp(type,"image_png")) { + if (this->overlays) { + struct graphics_priv *overlay=this->overlays; + im=gdImageCreateTrueColor(this->w,this->h); + gdImageCopy(im, this->im, 0, 0, 0, 0, this->w, this->h); + add_overlays(overlay, im); + } + if (this->image.data) + gdFree(this->image.data); +#ifdef HAVE_GRAPHICS_GD_PNG + this->image.data=gdImagePngPtr(im, &this->image.size); +#else + this->image.data=NULL; +#endif + if (this->overlays) + gdImageDestroy(im); + return &this->image; + } + if (sscanf(type,"click_%d_%d_%d",&p.x,&p.y,&b) == 3) { + dbg(1,"click %d %d %d\n",p.x,p.y,b); + callback_list_call_attr_3(this->cbl, attr_button, (void *)b, (void *)1, (void *)&p); + } + if (sscanf(type,"move_%d_%d",&p.x,&p.y) == 2) { + dbg(1,"move %d %d\n",p.x,p.y); + callback_list_call_attr_1(this->cbl, attr_motion, (void *)&p); + } + return NULL; +} + + +static void +image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) +{ + gdImageDestroy(priv->im); + g_free(priv); +} + +static void +overlay_disable(struct graphics_priv *gr, int disable) +{ + dbg(0,"enter\n"); +} + +static void +overlay_resize(struct graphics_priv *gr, struct point *p, int w, int h, int alpha, int wraparound) +{ + dbg(0,"enter\n"); +} + +struct shmem_header * +shm_next(struct graphics_priv *gr) +{ + char *next=(char *)gr->shm_header+gr->shmoffset; + if (next+gr->shmoffset > (char *)gr->shm+gr->shmsize) { + dbg(1,"wraparound\n"); + return gr->shm; + } + dbg(1,"next 0x%x (offset 0x%x)\n",next-(char *)gr->shm,gr->shmoffset); + return (struct shmem_header *)next; + +} +static void +image_setup(struct graphics_priv *gr) +{ + int i,*shm=(int *)(gr->shm_header+1); + if (!gr->shmkey) + return; + for (i = 0 ; i < gr->h ; i++) + gr->im->tpixels[i]=shm+gr->w*i; + gr->shm_header->w=gr->w; + gr->shm_header->h=gr->h; + gr->shm_header->bpp=32; + gr->shm_header->flag=0; +} + +static void +image_create(struct graphics_priv *gr) +{ + dbg(0,"shmkey %d\n",gr->shmkey); +#ifdef HAVE_SHMEM + if (gr->shmkey) { + int size=gr->h*gr->w*sizeof(int); + int shmid=shmget(gr->shmkey, size, 0666); + dbg(0,"shmid for key 0x%x is 0x%x\n",gr->shmkey, shmid); + if (shmid < 0) + dbg(0,"shmget\n"); + gr->shm=shmat(shmid, NULL, 0); + if (!gr->shm) + dbg(0,"shmat\n"); + gr->shm_header=gr->shm; + gr->im=g_new0(gdImage,1); + gr->im->tpixels=g_new(int *,gr->h); + gr->im->sx=gr->w; + gr->im->sy=gr->h; + gr->im->transparent=-1; + gr->im->trueColor=1; + gr->im->alphaBlendingFlag=1; + gr->im->thick=1; + gr->im->cx2=gr->im->sx-1; + gr->im->cy2=gr->im->sy-1; + image_setup(gr); + } else +#endif + gr->im=gdImageCreateTrueColor(gr->w,gr->h); +} + +static void +image_destroy(struct graphics_priv *gr) +{ +#ifdef HAVE_SHMEM + if (gr->shmkey) { + shmdt(gr->shm); + g_free(gr->im->tpixels); + g_free(gr->im); + } else +#endif + gdImageDestroy(gr->im); + gr->im=NULL; +} + +static int +set_attr_do(struct graphics_priv *gr, struct attr *attr, int init) +{ + char *s,*c,*n,*p; + switch (attr->type) { + case attr_w: + if (gr->w != attr->u.num) { + gr->w=attr->u.num; + if (!init) { + if (gr->im) + image_destroy(gr); + image_create(gr); + emit_callback(gr); + } + } + break; + case attr_h: + if (gr->h != attr->u.num) { + gr->h=attr->u.num; + if (!init) { + if (gr->im) + image_destroy(gr); + image_create(gr); + emit_callback(gr); + } + } + break; + case attr_flags: + gr->flags=attr->u.num; + break; + case attr_shmkey: + gr->shmkey=attr->u.num; + break; + case attr_shmsize: + gr->shmsize=attr->u.num; + break; + case attr_shmoffset: + gr->shmoffset=attr->u.num; + break; +#ifdef HAVE_SOCKET + case attr_socket: + g_list_foreach(gr->sockets, (GFunc)g_free, NULL); + g_list_free(gr->sockets); + gr->sockets=NULL; + c=s=g_strdup(attr->u.str); + dbg(0,"s=%s\n",s); + while (c) { + n=strchr(c,','); + if (n) + *n++='\0'; + p=strchr(c,':'); + if (p) { + *p++='\0'; + struct sockaddr_in *sin=g_new(struct sockaddr_in, 1); + sin->sin_family=AF_INET; + sin->sin_port=ntohs(atoi(p)); + if (inet_aton(c, &sin->sin_addr)) { + gr->sockets=g_list_append(gr->sockets, sin); + } else { + dbg(0,"error in %s\n",c); + g_free(sin); + } + dbg(0,"host=%s port=%s\n",c,p); + } else + dbg(0,"error in format: %s\n",p); + c=n; + } + g_free(s); +#endif + default: + return 0; + } + return 1; +} + + +static int +set_attr(struct graphics_priv *gr, struct attr *attr) +{ + return set_attr_do(gr, attr, 0); +} + +static struct graphics_methods graphics_methods = { + graphics_destroy, + draw_mode, + draw_lines, + draw_polygon, + draw_rectangle, + draw_circle, + draw_text, + draw_image, + draw_image_warp, + draw_restore, + draw_drag, + NULL, + gc_new, + background_gc, + overlay_new, + image_new, + get_data, + image_free, + NULL, + overlay_disable, + overlay_resize, + set_attr, +}; + +static struct graphics_priv * +overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha) +{ + struct font_priv * (*font_freetype_new)(void *meth); + struct graphics_priv *ret; + + dbg(1,"enter\n"); + ret=g_new0(struct graphics_priv, 1); + *meth=graphics_methods; + font_freetype_new=plugin_get_font_type("freetype"); + if (!font_freetype_new) + return NULL; + font_freetype_new(&ret->freetype_methods); + ret->p=*p; + ret->w=w; + ret->h=h; + ret->alpha=alpha; + ret->overlay=1; + ret->flags=1; + ret->im=gdImageCreateTrueColor(ret->w,ret->h); + ret->next=gr->overlays; + gr->overlays=ret; + + return ret; +} + +static void +emit_callback(struct graphics_priv *priv) +{ + callback_list_call_attr_2(priv->cbl, attr_resize, (void *)priv->w, (void *)priv->h); +} + + +static struct graphics_priv * +graphics_gd_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) +{ + struct font_priv * (*font_freetype_new)(void *meth); + struct graphics_priv *ret; + event_request_system("glib","graphics_gd_new"); + font_freetype_new=plugin_get_font_type("freetype"); + if (!font_freetype_new) + return NULL; + *meth=graphics_methods; + ret=g_new0(struct graphics_priv, 1); + font_freetype_new(&ret->freetype_methods); + meth->font_new=(struct graphics_font_priv *(*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, int))ret->freetype_methods.font_new; + meth->get_text_bbox=ret->freetype_methods.get_text_bbox; + ret->cb=callback_new_attr_1(callback_cast(emit_callback), attr_navit, ret); + navit_add_callback(nav, ret->cb); + ret->cbl=cbl; + ret->nav=nav; + ret->w=800; + ret->h=600; + while (*attrs) { + set_attr_do(ret, *attrs, 1); + attrs++; + } + if (!ret->im) + image_create(ret); + return ret; +} + +void +plugin_init(void) +{ + plugin_register_graphics_type("gd", graphics_gd_new); +} diff --git a/navit/graphics/gtk_drawing_area/Makefile.am b/navit/graphics/gtk_drawing_area/Makefile.am new file mode 100644 index 0000000..79da228 --- /dev/null +++ b/navit/graphics/gtk_drawing_area/Makefile.am @@ -0,0 +1,5 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @GTK2_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=graphics_gtk_drawing_area +modulegraphics_LTLIBRARIES = libgraphics_gtk_drawing_area.la +libgraphics_gtk_drawing_area_la_SOURCES = graphics_gtk_drawing_area.c +libgraphics_gtk_drawing_area_la_LDFLAGS = @GTK2_LIBS@ @IMLIB2_LIBS@ -module -avoid-version diff --git a/navit/graphics/gtk_drawing_area/Makefile.in b/navit/graphics/gtk_drawing_area/Makefile.in new file mode 100644 index 0000000..46d0f73 --- /dev/null +++ b/navit/graphics/gtk_drawing_area/Makefile.in @@ -0,0 +1,694 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/graphics/gtk_drawing_area +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulegraphicsdir)" +LTLIBRARIES = $(modulegraphics_LTLIBRARIES) +libgraphics_gtk_drawing_area_la_LIBADD = +am_libgraphics_gtk_drawing_area_la_OBJECTS = \ + graphics_gtk_drawing_area.lo +libgraphics_gtk_drawing_area_la_OBJECTS = \ + $(am_libgraphics_gtk_drawing_area_la_OBJECTS) +libgraphics_gtk_drawing_area_la_LINK = $(LIBTOOL) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) \ + $(libgraphics_gtk_drawing_area_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libgraphics_gtk_drawing_area_la_SOURCES) +DIST_SOURCES = $(libgraphics_gtk_drawing_area_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @GTK2_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=graphics_gtk_drawing_area +modulegraphics_LTLIBRARIES = libgraphics_gtk_drawing_area.la +libgraphics_gtk_drawing_area_la_SOURCES = graphics_gtk_drawing_area.c +libgraphics_gtk_drawing_area_la_LDFLAGS = @GTK2_LIBS@ @IMLIB2_LIBS@ -module -avoid-version +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/graphics/gtk_drawing_area/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/graphics/gtk_drawing_area/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulegraphicsLTLIBRARIES: $(modulegraphics_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulegraphicsdir)" || $(MKDIR_P) "$(DESTDIR)$(modulegraphicsdir)" + @list='$(modulegraphics_LTLIBRARIES)'; test -n "$(modulegraphicsdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulegraphicsdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulegraphicsdir)"; \ + } + +uninstall-modulegraphicsLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulegraphics_LTLIBRARIES)'; test -n "$(modulegraphicsdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulegraphicsdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulegraphicsdir)/$$f"; \ + done + +clean-modulegraphicsLTLIBRARIES: + -test -z "$(modulegraphics_LTLIBRARIES)" || rm -f $(modulegraphics_LTLIBRARIES) + @list='$(modulegraphics_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgraphics_gtk_drawing_area.la: $(libgraphics_gtk_drawing_area_la_OBJECTS) $(libgraphics_gtk_drawing_area_la_DEPENDENCIES) + $(libgraphics_gtk_drawing_area_la_LINK) -rpath $(modulegraphicsdir) $(libgraphics_gtk_drawing_area_la_OBJECTS) $(libgraphics_gtk_drawing_area_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphics_gtk_drawing_area.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulegraphicsdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulegraphicsLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulegraphicsLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulegraphicsLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulegraphicsLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-modulegraphicsLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am \ + uninstall-modulegraphicsLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c b/navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c new file mode 100644 index 0000000..677fb66 --- /dev/null +++ b/navit/graphics/gtk_drawing_area/graphics_gtk_drawing_area.c @@ -0,0 +1,1252 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#define GDK_ENABLE_BROKEN +#include "config.h" +#include +#include +#include +#include +#include +#include /* For WIN32 */ +#if !defined(GDK_Book) || !defined(GDK_Calendar) +#include +#endif +#ifdef HAVE_IMLIB2 +#include +#endif + +#ifndef _WIN32 +#include +#endif +#include "event.h" +#include "debug.h" +#include "point.h" +#include "graphics.h" +#include "color.h" +#include "item.h" +#include "window.h" +#include "callback.h" +#include "keys.h" +#include "plugin.h" +#include "navit/font/freetype/font_freetype.h" +#include "navit.h" + +#ifndef GDK_Book +#define GDK_Book XF86XK_Book +#endif +#ifndef GDK_Calendar +#define GDK_Calendar XF86XK_Calendar +#endif + + +struct graphics_priv { + GdkEventButton button_event; + int button_timeout; + GtkWidget *widget; + GtkWidget *win; + struct window window; + GdkDrawable *drawable; + GdkDrawable *background; + int background_ready; + GdkColormap *colormap; + struct point p; + struct point pclean; + int cleanup; + int width; + int height; + int win_w; + int win_h; + int visible; + int overlay_disabled; + int overlay_autodisabled; + int a; + int wraparound; + struct graphics_priv *parent; + struct graphics_priv *overlays; + struct graphics_priv *next; + struct graphics_gc_priv *background_gc; + enum draw_mode_num mode; + struct callback_list *cbl; + struct font_freetype_methods freetype_methods; + struct navit *nav; + int pid; + struct timeval button_press[8]; + struct timeval button_release[8]; + int timeout; + int delay; +}; + + +struct graphics_gc_priv { + GdkGC *gc; + GdkPixmap *pixmap; + struct graphics_priv *gr; + struct color c; +}; + +struct graphics_image_priv { + GdkPixbuf *pixbuf; + int w; + int h; +}; + +static GHashTable *hImageData; /*hastable for uncompressed image data*/ +static struct graphics_image_priv image_error; + +static void +graphics_destroy_image(gpointer data) +{ + struct graphics_image_priv *priv = (struct graphics_image_priv*)data; + + if (priv == &image_error) + return; + + if (priv->pixbuf) + g_object_unref(priv->pixbuf); + g_free(priv); +} + +static void +graphics_destroy(struct graphics_priv *gr) +{ + if (!gr->parent) + g_hash_table_destroy(hImageData); +} + +static void +gc_destroy(struct graphics_gc_priv *gc) +{ + g_object_unref(gc->gc); + g_free(gc); +} + +static void +gc_set_linewidth(struct graphics_gc_priv *gc, int w) +{ + gdk_gc_set_line_attributes(gc->gc, w, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); +} + +static void +gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) +{ + gdk_gc_set_dashes(gc->gc, offset, (gint8 *)dash_list, n); + gdk_gc_set_line_attributes(gc->gc, w, GDK_LINE_ON_OFF_DASH, GDK_CAP_ROUND, GDK_JOIN_ROUND); +} + +static void +gc_set_color(struct graphics_gc_priv *gc, struct color *c, int fg) +{ + GdkColor gdkc; + gdkc.pixel=0; + gdkc.red=c->r; + gdkc.green=c->g; + gdkc.blue=c->b; + gdk_colormap_alloc_color(gc->gr->colormap, &gdkc, FALSE, TRUE); + gdk_colormap_query_color(gc->gr->colormap, gdkc.pixel, &gdkc); + gc->c=*c; + if (fg) { + gdk_gc_set_foreground(gc->gc, &gdkc); + } else + gdk_gc_set_background(gc->gc, &gdkc); +} + +static void +gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) +{ + gc_set_color(gc, c, 1); +} + +static void +gc_set_background(struct graphics_gc_priv *gc, struct color *c) +{ + gc_set_color(gc, c, 0); +} + +static void +gc_set_stipple(struct graphics_gc_priv *gc, struct graphics_image_priv *img) +{ + char data[2]={0x2,0x1}; + gdk_gc_set_fill(gc->gc, GDK_STIPPLED); + gc->pixmap=gdk_bitmap_create_from_data(gc->gr->widget->window, data, 2, 2); + gdk_gc_set_stipple(gc->gc, gc->pixmap); +} + +static struct graphics_gc_methods gc_methods = { + gc_destroy, + gc_set_linewidth, + gc_set_dashes, + gc_set_foreground, + gc_set_background, + gc_set_stipple, +}; + +static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) +{ + struct graphics_gc_priv *gc=g_new(struct graphics_gc_priv, 1); + + *meth=gc_methods; + gc->gc=gdk_gc_new(gr->widget->window); + gc->gr=gr; + return gc; +} + + +static struct graphics_image_priv * +image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *name, int *w, int *h, struct point *hot, int rotation) +{ + GdkPixbuf *pixbuf; + struct graphics_image_priv *ret; + const char *option; + + char* hash_key = g_strdup_printf("%s_%d_%d_%d",name,*w,*h,rotation); + + //check if image already exists in hashmap + struct graphics_image_priv *curr_elem = g_hash_table_lookup(hImageData, hash_key); + if(curr_elem == &image_error) { + //found but couldn't be loaded + g_free(hash_key); + return NULL; + } + else if(curr_elem) { + //found and OK -> use hashtable entry + g_free(hash_key); + *w = curr_elem->w; + *h = curr_elem->h; + hot->x = curr_elem->w / 2 - 1; + hot->y = curr_elem->h / 2 - 1; + ret=g_new0(struct graphics_image_priv, 1); + *ret = *curr_elem; + g_object_ref(ret->pixbuf); + return ret; + } + else { + if (*w == -1 && *h == -1) + pixbuf=gdk_pixbuf_new_from_file(name, NULL); + else + pixbuf=gdk_pixbuf_new_from_file_at_size(name, *w, *h, NULL); + + if (!pixbuf) { + g_hash_table_insert(hImageData, g_strdup(hash_key), &image_error); + g_free(hash_key); + return NULL; + } + + if (rotation) { + GdkPixbuf *tmp; + switch (rotation) { + case 90: + rotation=270; + break; + case 180: + break; + case 270: + rotation=90; + break; + default: + g_hash_table_insert(hImageData, g_strdup(hash_key), &image_error); + g_free(hash_key); + return NULL; + } + + tmp=gdk_pixbuf_rotate_simple(pixbuf, rotation); + + if (!tmp) { + g_hash_table_insert(hImageData, g_strdup(hash_key), &image_error); + g_free(hash_key); + g_object_unref(pixbuf); + return NULL; + } + + g_object_unref(pixbuf); + pixbuf=tmp; + } + + ret=g_new0(struct graphics_image_priv, 1); + ret->pixbuf=pixbuf; + ret->w=gdk_pixbuf_get_width(pixbuf); + ret->h=gdk_pixbuf_get_height(pixbuf); + *w=ret->w; + *h=ret->h; + if (hot) { + option=gdk_pixbuf_get_option(pixbuf, "x_hot"); + if (option) + hot->x=atoi(option); + else + hot->x=ret->w/2-1; + option=gdk_pixbuf_get_option(pixbuf, "y_hot"); + if (option) + hot->y=atoi(option); + else + hot->y=ret->h/2-1; + } + struct graphics_image_priv *cached = g_new0(struct graphics_image_priv, 1); + *cached = *ret; + g_hash_table_insert(hImageData, g_strdup(hash_key), cached); + g_object_ref(pixbuf); + g_free(hash_key); + return ret; + } +} + +static void +image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) +{ + g_object_unref(priv->pixbuf); + g_free(priv); +} + +static void +draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) +{ + if (gr->mode == draw_mode_begin || gr->mode == draw_mode_end) + gdk_draw_lines(gr->drawable, gc->gc, (GdkPoint *)p, count); + if (gr->mode == draw_mode_end || gr->mode == draw_mode_cursor) + gdk_draw_lines(gr->widget->window, gc->gc, (GdkPoint *)p, count); +} + +static void +draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) +{ + if (gr->mode == draw_mode_begin || gr->mode == draw_mode_end) + gdk_draw_polygon(gr->drawable, gc->gc, TRUE, (GdkPoint *)p, count); + if (gr->mode == draw_mode_end || gr->mode == draw_mode_cursor) + gdk_draw_polygon(gr->widget->window, gc->gc, TRUE, (GdkPoint *)p, count); +} + +static void +draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) +{ + gdk_draw_rectangle(gr->drawable, gc->gc, TRUE, p->x, p->y, w, h); +} + +static void +draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r) +{ + if (gr->mode == draw_mode_begin || gr->mode == draw_mode_end) + gdk_draw_arc(gr->drawable, gc->gc, FALSE, p->x-r/2, p->y-r/2, r, r, 0, 64*360); + if (gr->mode == draw_mode_end || gr->mode == draw_mode_cursor) + gdk_draw_arc(gr->widget->window, gc->gc, FALSE, p->x-r/2, p->y-r/2, r, r, 0, 64*360); +} + +static void +display_text_draw(struct font_freetype_text *text, struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, int color, struct point *p) +{ + int i,x,y,stride; + struct font_freetype_glyph *g, **gp; + unsigned char *shadow,*glyph; + struct color transparent={0x0,0x0,0x0,0x0}; + struct color white={0xffff,0xffff,0xffff,0xffff}; + + gp=text->glyph; + i=text->glyph_count; + x=p->x << 6; + y=p->y << 6; + while (i-- > 0) + { + g=*gp++; + if (g->w && g->h && bg ) { +#if 1 + stride=g->w+2; + shadow=g_malloc(stride*(g->h+2)); + if (gr->freetype_methods.get_shadow(g, shadow, 8, stride, &white, &transparent)) + gdk_draw_gray_image(gr->drawable, bg->gc, ((x+g->x)>>6)-1, ((y+g->y)>>6)-1, g->w+2, g->h+2, GDK_RGB_DITHER_NONE, shadow, stride); + g_free(shadow); + if (color) { + stride*=3; + shadow=g_malloc(stride*(g->h+2)); + gr->freetype_methods.get_shadow(g, shadow, 24, stride, &bg->c, &transparent); + gdk_draw_rgb_image(gr->drawable, fg->gc, ((x+g->x)>>6)-1, ((y+g->y)>>6)-1, g->w+2, g->h+2, GDK_RGB_DITHER_NONE, shadow, stride); + g_free(shadow); + } +#else + GdkImage *image; + stride=(g->w+9)/8; + shadow=malloc(stride*(g->h+2)); + + gr->freetype_methods.get_shadow(g, shadow, 1, stride); + image=gdk_image_new_bitmap(gdk_visual_get_system(),shadow,g->w+2, g->h+2); + gdk_draw_image(gr->drawable, bg->gc, image, 0, 0, ((x+g->x)>>6)-1, ((y+g->y)>>6)-1, g->w+2, g->h+2); + g_object_unref(image); +#endif + + } + x+=g->dx; + y+=g->dy; + } + x=p->x << 6; + y=p->y << 6; + gp=text->glyph; + i=text->glyph_count; + while (i-- > 0) + { + g=*gp++; + if (g->w && g->h) { + if (color) { + stride=g->w; + if (bg) { + glyph=g_malloc(stride*g->h); + gr->freetype_methods.get_glyph(g, glyph, 8, stride, &fg->c, &bg->c, &transparent); + gdk_draw_gray_image(gr->drawable, bg->gc, (x+g->x)>>6, (y+g->y)>>6, g->w, g->h, GDK_RGB_DITHER_NONE, glyph, g->w); + g_free(glyph); + } + stride*=3; + glyph=g_malloc(stride*g->h); + gr->freetype_methods.get_glyph(g, glyph, 24, stride, &fg->c, bg?&bg->c:&transparent, &transparent); + gdk_draw_rgb_image(gr->drawable, fg->gc, (x+g->x)>>6, (y+g->y)>>6, g->w, g->h, GDK_RGB_DITHER_NONE, glyph, stride); + g_free(glyph); + } else + gdk_draw_gray_image(gr->drawable, fg->gc, (x+g->x)>>6, (y+g->y)>>6, g->w, g->h, GDK_RGB_DITHER_NONE, g->pixmap, g->w); + } + x+=g->dx; + y+=g->dy; + } +} + +static void +draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) +{ + struct font_freetype_text *t; + int color=0; + + if (! font) + { + dbg(0,"no font, returning\n"); + return; + } +#if 0 /* Temporarily disabled because it destroys text rendering of overlays and in gui internal in some places */ + /* + This needs an improvement, no one checks if the strings are visible + */ + if (p->x > gr->width-50 || p->y > gr->height-50) { + return; + } + if (p->x < -50 || p->y < -50) { + return; + } +#endif + + if (bg) { + if (COLOR_IS_BLACK(fg->c) && COLOR_IS_WHITE(bg->c)) { + gdk_gc_set_function(fg->gc, GDK_AND_INVERT); + gdk_gc_set_function(bg->gc, GDK_OR); + } else if (COLOR_IS_WHITE(fg->c) && COLOR_IS_BLACK(bg->c)) { + gdk_gc_set_function(fg->gc, GDK_OR); + gdk_gc_set_function(bg->gc, GDK_AND_INVERT); + } else { + gdk_gc_set_function(fg->gc, GDK_OR); + gdk_gc_set_function(bg->gc, GDK_AND_INVERT); + color=1; + } + } else { + gdk_gc_set_function(fg->gc, GDK_OR); + color=1; + } + t=gr->freetype_methods.text_new(text, (struct font_freetype_font *)font, dx, dy); + display_text_draw(t, gr, fg, bg, color, p); + gr->freetype_methods.text_destroy(t); + gdk_gc_set_function(fg->gc, GDK_COPY); + if (bg) + gdk_gc_set_function(bg->gc, GDK_COPY); +#if 0 + { + struct point pnt[5]; + int i; + gr->freetype_methods.get_text_bbox(gr, font, text, dx, dy, pnt, 1); + for (i = 0 ; i < 4 ; i++) { + pnt[i].x+=p->x; + pnt[i].y+=p->y; + } + pnt[4]=pnt[0]; + gdk_draw_lines(gr->drawable, fg->gc, (GdkPoint *)pnt, 5); + } +#endif +} + +static void +draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) +{ + gdk_draw_pixbuf(gr->drawable, fg->gc, img->pixbuf, 0, 0, p->x, p->y, + img->w, img->h, GDK_RGB_DITHER_NONE, 0, 0); +} + +#ifdef HAVE_IMLIB2 +static void +draw_image_warp(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, char *data) +{ + void *image; + int w,h; + dbg(1,"draw_image_warp data=%s\n", data); + image = imlib_load_image(data); + imlib_context_set_display(gdk_x11_drawable_get_xdisplay(gr->widget->window)); + imlib_context_set_colormap(gdk_x11_colormap_get_xcolormap(gtk_widget_get_colormap(gr->widget))); + imlib_context_set_visual(gdk_x11_visual_get_xvisual(gtk_widget_get_visual(gr->widget))); + imlib_context_set_drawable(gdk_x11_drawable_get_xid(gr->drawable)); + imlib_context_set_image(image); + w = imlib_image_get_width(); + h = imlib_image_get_height(); + if (count == 3) { + /* 0 1 + 2 */ + imlib_render_image_on_drawable_skewed(0, 0, w, h, p[0].x, p[0].y, p[1].x-p[0].x, p[1].y-p[0].y, p[2].x-p[0].x, p[2].y-p[0].y); + } + if (count == 2) { + /* 0 + 1 */ + imlib_render_image_on_drawable_skewed(0, 0, w, h, p[0].x, p[0].y, p[1].x-p[0].x, 0, 0, p[1].y-p[0].y); + } + if (count == 1) { + /* + 0 + */ + imlib_render_image_on_drawable_skewed(0, 0, w, h, p[0].x-w/2, p[0].y-h/2, w, 0, 0, h); + } + imlib_free_image(); +} +#endif + +static void +overlay_rect(struct graphics_priv *parent, struct graphics_priv *overlay, int clean, GdkRectangle *r) +{ + if (clean) { + r->x=overlay->pclean.x; + r->y=overlay->pclean.y; + } else { + r->x=overlay->p.x; + r->y=overlay->p.y; + } + r->width=overlay->width; + r->height=overlay->height; + if (!overlay->wraparound) + return; + if (r->x < 0) + r->x += parent->width; + if (r->y < 0) + r->y += parent->height; + if (r->width < 0) + r->width += parent->width; + if (r->height < 0) + r->height += parent->height; +} + +static void +overlay_draw(struct graphics_priv *parent, struct graphics_priv *overlay, GdkRectangle *re, GdkPixmap *pixmap, GdkGC *gc) +{ + GdkPixbuf *pixbuf,*pixbuf2; + guchar *pixels1, *pixels2, *p1, *p2, r=0, g=0, b=0, a=0; + int x,y; + int rowstride1,rowstride2; + int n_channels1,n_channels2; + GdkRectangle or,ir; + struct graphics_gc_priv *bg=overlay->background_gc; + if (bg) { + r=bg->c.r>>8; + g=bg->c.g>>8; + b=bg->c.b>>8; + a=bg->c.a>>8; + } + + if (parent->overlay_disabled || overlay->overlay_disabled || overlay->overlay_autodisabled) + return; + dbg(1,"r->x=%d r->y=%d r->width=%d r->height=%d\n", re->x, re->y, re->width, re->height); + overlay_rect(parent, overlay, 0, &or); + dbg(1,"or.x=%d or.y=%d or.width=%d or.height=%d\n", or.x, or.y, or.width, or.height); + if (! gdk_rectangle_intersect(re, &or, &ir)) + return; + or.x-=re->x; + or.y-=re->y; + pixbuf=gdk_pixbuf_get_from_drawable(NULL, overlay->drawable, NULL, 0, 0, 0, 0, or.width, or.height); + pixbuf2=gdk_pixbuf_new(gdk_pixbuf_get_colorspace(pixbuf), TRUE, gdk_pixbuf_get_bits_per_sample(pixbuf), + or.width, or.height); + rowstride1 = gdk_pixbuf_get_rowstride (pixbuf); + rowstride2 = gdk_pixbuf_get_rowstride (pixbuf2); + pixels1=gdk_pixbuf_get_pixels (pixbuf); + pixels2=gdk_pixbuf_get_pixels (pixbuf2); + n_channels1 = gdk_pixbuf_get_n_channels (pixbuf); + n_channels2 = gdk_pixbuf_get_n_channels (pixbuf2); + for (y = 0 ; y < or.height ; y++) { + for (x = 0 ; x < or.width ; x++) { + p1 = pixels1 + y * rowstride1 + x * n_channels1; + p2 = pixels2 + y * rowstride2 + x * n_channels2; + p2[0]=p1[0]; + p2[1]=p1[1]; + p2[2]=p1[2]; + if (bg && p1[0] == r && p1[1] == g && p1[2] == b) + p2[3]=a; + else + p2[3]=overlay->a; + } + } + gdk_draw_pixbuf(pixmap, gc, pixbuf2, 0, 0, or.x, or.y, or.width, or.height, GDK_RGB_DITHER_NONE, 0, 0); + g_object_unref(pixbuf); + g_object_unref(pixbuf2); +} + +static void +draw_restore(struct graphics_priv *gr, struct point *p, int w, int h) +{ + GtkWidget *widget=gr->widget; + gdk_draw_drawable(widget->window, + widget->style->fg_gc[GTK_WIDGET_STATE(widget)], + gr->drawable, + p->x, p->y, p->x, p->y, w, h); + +} + +static void +draw_drag(struct graphics_priv *gr, struct point *p) +{ + if (!gr->cleanup) { + gr->pclean=gr->p; + gr->cleanup=1; + } + if (p) + gr->p=*p; + else { + gr->p.x=0; + gr->p.y=0; + } +} + + +static void +background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) +{ + gr->background_gc=gc; +} + +static void +gtk_drawing_area_draw(struct graphics_priv *gr, GdkRectangle *r) +{ + GdkPixmap *pixmap; + GtkWidget *widget=gr->widget; + GdkGC *gc=widget->style->fg_gc[GTK_WIDGET_STATE(widget)]; + struct graphics_priv *overlay; + + if (! gr->drawable) + return; + pixmap = gdk_pixmap_new(widget->window, r->width, r->height, -1); + if ((gr->p.x || gr->p.y) && gr->background_gc) + gdk_draw_rectangle(pixmap, gr->background_gc->gc, TRUE, 0, 0, r->width, r->height); + gdk_draw_drawable(pixmap, gc, gr->drawable, r->x, r->y, gr->p.x, gr->p.y, r->width, r->height); + overlay=gr->overlays; + while (overlay) { + overlay_draw(gr,overlay,r,pixmap,gc); + overlay=overlay->next; + } + gdk_draw_drawable(widget->window, gc, pixmap, 0, 0, r->x, r->y, r->width, r->height); + g_object_unref(pixmap); +} + +static void +draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) +{ + GdkRectangle r; + struct graphics_priv *overlay; +#if 0 + if (mode == draw_mode_begin) { + if (! gr->parent && gr->background_gc) + gdk_draw_rectangle(gr->drawable, gr->background_gc->gc, TRUE, 0, 0, gr->width, gr->height); + } +#endif + if (mode == draw_mode_end && gr->mode != draw_mode_cursor) { + if (gr->parent) { + if (gr->cleanup) { + overlay_rect(gr->parent, gr, 1, &r); + gtk_drawing_area_draw(gr->parent, &r); + gr->cleanup=0; + } + overlay_rect(gr->parent, gr, 0, &r); + gtk_drawing_area_draw(gr->parent, &r); + } else { + r.x=0; + r.y=0; + r.width=gr->width; + r.height=gr->height; + gtk_drawing_area_draw(gr, &r); + overlay=gr->overlays; + while (overlay) { + overlay->cleanup=0; + overlay=overlay->next; + } + } + } + gr->mode=mode; +} + +/* Events */ + +static gint +configure(GtkWidget * widget, GdkEventConfigure * event, gpointer user_data) +{ + struct graphics_priv *gra=user_data; + if (! gra->visible) + return TRUE; + if (gra->drawable != NULL) { + g_object_unref(gra->drawable); + } + if(gra->background_ready && gra->background != NULL) { + g_object_unref(gra->background); + gra->background_ready = 0; + } +#ifndef _WIN32 + dbg(1,"window=%d\n", GDK_WINDOW_XID(widget->window)); +#endif + gra->width=widget->allocation.width; + gra->height=widget->allocation.height; + gra->drawable = gdk_pixmap_new(widget->window, gra->width, gra->height, -1); + callback_list_call_attr_2(gra->cbl, attr_resize, GINT_TO_POINTER(gra->width), GINT_TO_POINTER(gra->height)); + return TRUE; +} + +static gint +expose(GtkWidget * widget, GdkEventExpose * event, gpointer user_data) +{ + struct graphics_priv *gra=user_data; + + gra->visible=1; + if (! gra->drawable) + configure(widget, NULL, user_data); + gtk_drawing_area_draw(gra, &event->area); +#if 0 + gdk_draw_drawable(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], + gra->drawable, event->area.x, event->area.y, + event->area.x, event->area.y, + event->area.width, event->area.height); +#endif + + return FALSE; +} + +#if 0 +static gint +button_timeout(gpointer user_data) +{ +#if 0 + struct container *co=user_data; + int x=co->gra->gra->button_event.x; + int y=co->gra->gra->button_event.y; + int button=co->gra->gra->button_event.button; + + co->gra->gra->button_timeout=0; + popup(co, x, y, button); + + return FALSE; +#endif +} +#endif + +static int +tv_delta(struct timeval *old, struct timeval *new) +{ + if (new->tv_sec-old->tv_sec >= INT_MAX/1000) + return INT_MAX; + return (new->tv_sec-old->tv_sec)*1000+(new->tv_usec-old->tv_usec)/1000; +} + +static gint +button_press(GtkWidget * widget, GdkEventButton * event, gpointer user_data) +{ + struct graphics_priv *this=user_data; + struct point p; + struct timeval tv; + struct timezone tz; + + gettimeofday(&tv, &tz); + + if (event->button < 8) { + if (tv_delta(&this->button_press[event->button], &tv) < this->timeout) + return FALSE; + this->button_press[event->button]= tv; + this->button_release[event->button].tv_sec=0; + this->button_release[event->button].tv_usec=0; + } + p.x=event->x; + p.y=event->y; + callback_list_call_attr_3(this->cbl, attr_button, GINT_TO_POINTER(1), GINT_TO_POINTER(event->button), (void *)&p); + return FALSE; +} + +static gint +button_release(GtkWidget * widget, GdkEventButton * event, gpointer user_data) +{ + struct graphics_priv *this=user_data; + struct point p; + struct timeval tv; + struct timezone tz; + + gettimeofday(&tv, &tz); + + if (event->button < 8) { + if (tv_delta(&this->button_release[event->button], &tv) < this->timeout) + return FALSE; + this->button_release[event->button]= tv; + this->button_press[event->button].tv_sec=0; + this->button_press[event->button].tv_usec=0; + } + p.x=event->x; + p.y=event->y; + callback_list_call_attr_3(this->cbl, attr_button, GINT_TO_POINTER(0), GINT_TO_POINTER(event->button), (void *)&p); + return FALSE; +} + + + +static gint +scroll(GtkWidget * widget, GdkEventScroll * event, gpointer user_data) +{ + struct graphics_priv *this=user_data; + struct point p; + int button; + + p.x=event->x; + p.y=event->y; + switch (event->direction) { + case GDK_SCROLL_UP: + button=4; + break; + case GDK_SCROLL_DOWN: + button=5; + break; + default: + button=-1; + break; + } + if (button != -1) { + callback_list_call_attr_3(this->cbl, attr_button, GINT_TO_POINTER(1), GINT_TO_POINTER(button), (void *)&p); + callback_list_call_attr_3(this->cbl, attr_button, GINT_TO_POINTER(0), GINT_TO_POINTER(button), (void *)&p); + } + return FALSE; +} + +static gint +motion_notify(GtkWidget * widget, GdkEventMotion * event, gpointer user_data) +{ + struct graphics_priv *this=user_data; + struct point p; + + p.x=event->x; + p.y=event->y; + callback_list_call_attr_1(this->cbl, attr_motion, (void *)&p); + return FALSE; +} + +/* * + * * Exit navit (X pressed) + * * @param widget active widget + * * @param event the event (delete_event) + * * @param user_data Pointer to private data structure + * * @returns TRUE + * */ +static gint +delete(GtkWidget *widget, GdkEventKey *event, gpointer user_data) +{ + struct graphics_priv *this=user_data; + dbg(0,"enter this->win=%p\n",this->win); + if (this->delay & 2) { + if (this->win) + this->win=NULL; + } else { + callback_list_call_attr_0(this->cbl, attr_window_closed); + } + return TRUE; +} + +static gint +keypress(GtkWidget *widget, GdkEventKey *event, gpointer user_data) +{ + struct graphics_priv *this=user_data; + int len,ucode; + char key[8]; + ucode=gdk_keyval_to_unicode(event->keyval); + len=g_unichar_to_utf8(ucode, key); + key[len]='\0'; + + switch (event->keyval) { + case GDK_Up: + key[0]=NAVIT_KEY_UP; + key[1]='\0'; + break; + case GDK_Down: + key[0]=NAVIT_KEY_DOWN; + key[1]='\0'; + break; + case GDK_Left: + key[0]=NAVIT_KEY_LEFT; + key[1]='\0'; + break; + case GDK_Right: + key[0]=NAVIT_KEY_RIGHT; + key[1]='\0'; + break; + case GDK_BackSpace: + key[0]=NAVIT_KEY_BACKSPACE; + key[1]='\0'; + break; + case GDK_Tab: + key[0]='\t'; + key[1]='\0'; + break; + case GDK_Delete: + key[0]=NAVIT_KEY_DELETE; + key[1]='\0'; + break; + case GDK_Escape: + key[0]=NAVIT_KEY_BACK; + key[1]='\0'; + break; + case GDK_Return: + case GDK_KP_Enter: + key[0]=NAVIT_KEY_RETURN; + key[1]='\0'; + break; + case GDK_Book: +#ifdef USE_HILDON + case GDK_F7: +#endif + key[0]=NAVIT_KEY_ZOOM_IN; + key[1]='\0'; + break; + case GDK_Calendar: +#ifdef USE_HILDON + case GDK_F8: +#endif + key[0]=NAVIT_KEY_ZOOM_OUT; + key[1]='\0'; + break; + } + if (key[0]) + callback_list_call_attr_1(this->cbl, attr_keypress, (void *)key); + else + dbg(0,"keyval 0x%x\n", event->keyval); + + return FALSE; +} + +static struct graphics_priv *graphics_gtk_drawing_area_new_helper(struct graphics_methods *meth); + +static void +overlay_disable(struct graphics_priv *gr, int disabled) +{ + gr->overlay_disabled=disabled; +} + +static void +overlay_resize(struct graphics_priv *this, struct point *p, int w, int h, int alpha, int wraparound) +{ + //do not dereference parent for non overlay osds + if(!this->parent) { + return; + } + + int changed = 0; + int w2,h2; + + if (w == 0) { + w2 = 1; + } else { + w2 = w; + } + + if (h == 0) { + h2 = 1; + } else { + h2 = h; + } + + this->p = *p; + if (this->width != w2) { + this->width = w2; + changed = 1; + } + + if (this->height != h2) { + this->height = h2; + changed = 1; + } + + this->a = alpha >> 8; + this->wraparound = wraparound; + + if (changed) { + // Set the drawables to the right sizes + g_object_unref(this->drawable); + g_object_unref(this->background); + + this->drawable=gdk_pixmap_new(this->parent->widget->window, w2, h2, -1); + this->background=gdk_pixmap_new(this->parent->widget->window, w2, h2, -1); + + if ((w == 0) || (h == 0)) { + this->overlay_autodisabled = 1; + } else { + this->overlay_autodisabled = 0; + } + + callback_list_call_attr_2(this->cbl, attr_resize, GINT_TO_POINTER(this->width), GINT_TO_POINTER(this->height)); + } +} + +static void +get_data_window(struct graphics_priv *this, unsigned int xid) +{ + if (!xid) + this->win = gtk_window_new(GTK_WINDOW_TOPLEVEL); + else + this->win = gtk_plug_new(xid); + if (!gtk_widget_get_parent(this->widget)) + gtk_widget_ref(this->widget); + gtk_window_set_default_size(GTK_WINDOW(this->win), this->win_w, this->win_h); + dbg(1,"h= %i, w= %i\n",this->win_h, this->win_w); + gtk_window_set_title(GTK_WINDOW(this->win), "Navit"); + gtk_window_set_wmclass (GTK_WINDOW (this->win), "navit", "Navit"); + gtk_widget_realize(this->win); + if (gtk_widget_get_parent(this->widget)) + gtk_widget_reparent(this->widget, this->win); + else + gtk_container_add(GTK_CONTAINER(this->win), this->widget); + gtk_widget_show_all(this->win); + GTK_WIDGET_SET_FLAGS (this->widget, GTK_CAN_FOCUS); + gtk_widget_set_sensitive(this->widget, TRUE); + gtk_widget_grab_focus(this->widget); + g_signal_connect(G_OBJECT(this->widget), "key-press-event", G_CALLBACK(keypress), this); + g_signal_connect(G_OBJECT(this->win), "delete_event", G_CALLBACK(delete), this); +} + +static int +set_attr(struct graphics_priv *gr, struct attr *attr) +{ + dbg(0,"enter\n"); + switch (attr->type) { + case attr_windowid: + get_data_window(gr, attr->u.num); + return 1; + default: + return 0; + } +} + +static struct graphics_priv * +overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound) +{ + int w2,h2; + struct graphics_priv *this=graphics_gtk_drawing_area_new_helper(meth); + this->colormap=gr->colormap; + this->widget=gr->widget; + this->p=*p; + this->width=w; + this->height=h; + this->parent=gr; + + /* If either height or width is 0, we set it to 1 to avoid warnings, and + * disable the overlay. */ + if (h == 0) { + h2 = 1; + } else { + h2 = h; + } + + if (w == 0) { + w2 = 1; + } else { + w2 = w; + } + + this->background=gdk_pixmap_new(gr->widget->window, w2, h2, -1); + this->drawable=gdk_pixmap_new(gr->widget->window, w2, h2, -1); + + if ((w == 0) || (h == 0)) { + this->overlay_autodisabled = 1; + } else { + this->overlay_autodisabled = 0; + } + + this->next=gr->overlays; + this->a=alpha >> 8; + this->wraparound=wraparound; + gr->overlays=this; + return this; +} + +static int gtk_argc; +static char **gtk_argv={NULL}; + + +static int +graphics_gtk_drawing_area_fullscreen(struct window *w, int on) +{ + struct graphics_priv *gr=w->priv; + if (on) + gtk_window_fullscreen(GTK_WINDOW(gr->win)); + else + gtk_window_unfullscreen(GTK_WINDOW(gr->win)); + return 1; +} + +static void +graphics_gtk_drawing_area_disable_suspend(struct window *w) +{ + struct graphics_priv *gr=w->priv; + +#ifndef _WIN32 + if (gr->pid) + kill(gr->pid, SIGWINCH); +#else + dbg(1, "failed to kill() under Windows\n"); +#endif +} + + +static void * +get_data(struct graphics_priv *this, char const *type) +{ + FILE *f; + if (!strcmp(type,"gtk_widget")) + return this->widget; +#ifndef _WIN32 + if (!strcmp(type,"xwindow_id")) + return (void *)GDK_WINDOW_XID(this->widget->window); +#endif + if (!strcmp(type,"window")) { + char *cp = getenv("NAVIT_XID"); + unsigned xid = 0; + if (cp) + xid = strtol(cp, NULL, 0); + if (!(this->delay & 1)) + get_data_window(this, xid); + this->window.fullscreen=graphics_gtk_drawing_area_fullscreen; + this->window.disable_suspend=graphics_gtk_drawing_area_disable_suspend; + this->window.priv=this; +#if !defined(_WIN32) && !defined(__CEGCC__) + f=popen("pidof /usr/bin/ipaq-sleep","r"); + if (f) { + fscanf(f,"%d",&this->pid); + dbg(1,"ipaq_sleep pid=%d\n", this->pid); + pclose(f); + } +#endif + return &this->window; + } + return NULL; +} + +static struct graphics_methods graphics_methods = { + graphics_destroy, + draw_mode, + draw_lines, + draw_polygon, + draw_rectangle, + draw_circle, + draw_text, + draw_image, +#ifdef HAVE_IMLIB2 + draw_image_warp, +#else + NULL, +#endif + draw_restore, + draw_drag, + NULL, /* font_new */ + gc_new, + background_gc, + overlay_new, + image_new, + get_data, + image_free, + NULL, /* get_text_bbox */ + overlay_disable, + overlay_resize, + set_attr, +}; + +static struct graphics_priv * +graphics_gtk_drawing_area_new_helper(struct graphics_methods *meth) +{ + struct font_priv * (*font_freetype_new)(void *meth); + font_freetype_new=plugin_get_font_type("freetype"); + if (!font_freetype_new) + return NULL; + struct graphics_priv *this=g_new0(struct graphics_priv,1); + font_freetype_new(&this->freetype_methods); + *meth=graphics_methods; + meth->font_new=(struct graphics_font_priv *(*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, int))this->freetype_methods.font_new; + meth->get_text_bbox=this->freetype_methods.get_text_bbox; + + return this; +} + +static struct graphics_priv * +graphics_gtk_drawing_area_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) +{ + int i; + GtkWidget *draw; + struct attr *attr; + + if (! event_request_system("glib","graphics_gtk_drawing_area_new")) + return NULL; + + draw=gtk_drawing_area_new(); + struct graphics_priv *this=graphics_gtk_drawing_area_new_helper(meth); + this->nav = nav; + this->widget=draw; + this->win_w=792; + if ((attr=attr_search(attrs, NULL, attr_w))) + this->win_w=attr->u.num; + this->win_h=547; + if ((attr=attr_search(attrs, NULL, attr_h))) + this->win_h=attr->u.num; + this->timeout=100; + if ((attr=attr_search(attrs, NULL, attr_timeout))) + this->timeout=attr->u.num; + this->delay=0; + if ((attr=attr_search(attrs, NULL, attr_delay))) + this->delay=attr->u.num; + this->cbl=cbl; + this->colormap=gdk_colormap_new(gdk_visual_get_system(),FALSE); + gtk_widget_set_events(draw, GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK|GDK_POINTER_MOTION_MASK|GDK_KEY_PRESS_MASK); + g_signal_connect(G_OBJECT(draw), "expose_event", G_CALLBACK(expose), this); + g_signal_connect(G_OBJECT(draw), "configure_event", G_CALLBACK(configure), this); + g_signal_connect(G_OBJECT(draw), "button_press_event", G_CALLBACK(button_press), this); + g_signal_connect(G_OBJECT(draw), "button_release_event", G_CALLBACK(button_release), this); + g_signal_connect(G_OBJECT(draw), "scroll_event", G_CALLBACK(scroll), this); + g_signal_connect(G_OBJECT(draw), "motion_notify_event", G_CALLBACK(motion_notify), this); + g_signal_connect(G_OBJECT(draw), "delete_event", G_CALLBACK(delete), nav); + + for (i = 0; i < 8; i++) { + this->button_press[i].tv_sec = 0; + this->button_press[i].tv_usec = 0; + this->button_release[i].tv_sec = 0; + this->button_release[i].tv_usec = 0; + } + + //create hash table for uncompressed image data + hImageData = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, graphics_destroy_image); + + return this; +} + +void +plugin_init(void) +{ + gtk_init(>k_argc, >k_argv); + gtk_set_locale(); +#ifdef HAVE_API_WIN32 + setlocale(LC_NUMERIC, "C"); /* WIN32 gtk resets LC_NUMERIC */ +#endif + plugin_register_graphics_type("gtk_drawing_area", graphics_gtk_drawing_area_new); +} diff --git a/navit/graphics/null/Makefile.am b/navit/graphics/null/Makefile.am new file mode 100644 index 0000000..a4631ff --- /dev/null +++ b/navit/graphics/null/Makefile.am @@ -0,0 +1,9 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=graphics_null +if PLUGINS +modulegraphics_LTLIBRARIES = libgraphics_null.la +else +noinst_LTLIBRARIES = libgraphics_null.la +endif +libgraphics_null_la_SOURCES = graphics_null.c +libgraphics_null_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ diff --git a/navit/graphics/null/Makefile.in b/navit/graphics/null/Makefile.in new file mode 100644 index 0000000..9a4ed69 --- /dev/null +++ b/navit/graphics/null/Makefile.in @@ -0,0 +1,705 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/graphics/null +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulegraphicsdir)" +LTLIBRARIES = $(modulegraphics_LTLIBRARIES) $(noinst_LTLIBRARIES) +libgraphics_null_la_LIBADD = +am_libgraphics_null_la_OBJECTS = graphics_null.lo +libgraphics_null_la_OBJECTS = $(am_libgraphics_null_la_OBJECTS) +libgraphics_null_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libgraphics_null_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libgraphics_null_la_rpath = +@PLUGINS_TRUE@am_libgraphics_null_la_rpath = -rpath \ +@PLUGINS_TRUE@ $(modulegraphicsdir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libgraphics_null_la_SOURCES) +DIST_SOURCES = $(libgraphics_null_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=graphics_null +@PLUGINS_TRUE@modulegraphics_LTLIBRARIES = libgraphics_null.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libgraphics_null.la +libgraphics_null_la_SOURCES = graphics_null.c +libgraphics_null_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/graphics/null/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/graphics/null/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulegraphicsLTLIBRARIES: $(modulegraphics_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulegraphicsdir)" || $(MKDIR_P) "$(DESTDIR)$(modulegraphicsdir)" + @list='$(modulegraphics_LTLIBRARIES)'; test -n "$(modulegraphicsdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulegraphicsdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulegraphicsdir)"; \ + } + +uninstall-modulegraphicsLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulegraphics_LTLIBRARIES)'; test -n "$(modulegraphicsdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulegraphicsdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulegraphicsdir)/$$f"; \ + done + +clean-modulegraphicsLTLIBRARIES: + -test -z "$(modulegraphics_LTLIBRARIES)" || rm -f $(modulegraphics_LTLIBRARIES) + @list='$(modulegraphics_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgraphics_null.la: $(libgraphics_null_la_OBJECTS) $(libgraphics_null_la_DEPENDENCIES) + $(libgraphics_null_la_LINK) $(am_libgraphics_null_la_rpath) $(libgraphics_null_la_OBJECTS) $(libgraphics_null_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphics_null.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulegraphicsdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulegraphicsLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulegraphicsLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulegraphicsLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulegraphicsLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-modulegraphicsLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am \ + uninstall-modulegraphicsLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/graphics/null/graphics_null.c b/navit/graphics/null/graphics_null.c new file mode 100644 index 0000000..1c3bbbd --- /dev/null +++ b/navit/graphics/null/graphics_null.c @@ -0,0 +1,369 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include "config.h" +#ifdef HAVE_UNISTD_H +#include +#endif +#include "item.h" +#include "point.h" +#include "graphics.h" +#include "color.h" +#include "plugin.h" +#include "event.h" +#include "debug.h" +#include "window.h" +#include "callback.h" +#if defined(WINDOWS) || defined(WIN32) || defined (HAVE_API_WIN32_CE) +#include +# define sleep(i) Sleep(i * 1000) +#endif + +static struct callback_list* callbacks; + +static int dummy; +static struct graphics_priv { + int dummy; +} graphics_priv; + +static struct graphics_font_priv { + int dummy; +} graphics_font_priv; + +static struct graphics_gc_priv { + int dummy; +} graphics_gc_priv; + +static struct graphics_image_priv { + int dummy; +} graphics_image_priv; + +static void +graphics_destroy(struct graphics_priv *gr) +{ +} + +static void font_destroy(struct graphics_font_priv *font) +{ + +} + +static struct graphics_font_methods font_methods = { + font_destroy +}; + +static struct graphics_font_priv *font_new(struct graphics_priv *gr, struct graphics_font_methods *meth, char *font, int size, int flags) +{ + *meth=font_methods; + return &graphics_font_priv; +} + +static void +gc_destroy(struct graphics_gc_priv *gc) +{ +} + +static void +gc_set_linewidth(struct graphics_gc_priv *gc, int w) +{ +} + +static void +gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) +{ +} + +static void +gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) +{ +} + +static void +gc_set_background(struct graphics_gc_priv *gc, struct color *c) +{ +} + +static struct graphics_gc_methods gc_methods = { + gc_destroy, + gc_set_linewidth, + gc_set_dashes, + gc_set_foreground, + gc_set_background +}; + +static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) +{ + *meth=gc_methods; + return &graphics_gc_priv; +} + +static struct graphics_image_priv * +image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation) +{ + return &graphics_image_priv; +} + +static void +draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) +{ +} + +static void +draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) +{ +} + +static void +draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) +{ +} + +static void +draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r) +{ +} + + +static void +draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) +{ +} + +static void +draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) +{ +} + +static void +draw_image_warp(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, char *data) +{ +} + +static void +draw_restore(struct graphics_priv *gr, struct point *p, int w, int h) +{ +} + +static void draw_drag(struct graphics_priv *gr, struct point *p) +{ +} + +static void +background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) +{ +} + +static void +draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) +{ +} + +static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound); + +static void +resize_callback(int w, int h) +{ + callback_list_call_attr_2(callbacks, attr_resize, + GINT_TO_POINTER(1), GINT_TO_POINTER(1)); +} + +static int +graphics_null_fullscreen(struct window *w, int on) +{ + return 1; +} + +static void +graphics_null_disable_suspend(struct window *w) +{ +} + +static void * +get_data(struct graphics_priv *this, char const *type) +{ + if (strcmp(type, "window") == 0) { + struct window *win; + win = g_new0(struct window, 1); + win->priv = this; + win->fullscreen = graphics_null_fullscreen; + win->disable_suspend = graphics_null_disable_suspend; + resize_callback(1,1); + return win; + } + return NULL; +} + +static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) +{ +} + +static void get_text_bbox(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate) +{ +} + +static void overlay_disable(struct graphics_priv *gr, int disable) +{ +} + +static void overlay_resize(struct graphics_priv *gr, struct point *p, int w, int h, int alpha, int wraparound) +{ +} + +static struct graphics_methods graphics_methods = { + graphics_destroy, + draw_mode, + draw_lines, + draw_polygon, + draw_rectangle, + draw_circle, + draw_text, + draw_image, + draw_image_warp, + draw_restore, + draw_drag, + font_new, + gc_new, + background_gc, + overlay_new, + image_new, + get_data, + image_free, + get_text_bbox, + overlay_disable, + overlay_resize, +}; + +static struct graphics_priv * +overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound) +{ + *meth=graphics_methods; + return &graphics_priv; +} + + +static struct graphics_priv * +graphics_null_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) +{ + struct attr *event_loop_system = NULL; + *meth=graphics_methods; + + event_loop_system = attr_search(attrs, NULL, attr_event_loop_system); + + if (event_loop_system && event_loop_system->u.str) { + dbg(1, "event_system is %s\n", event_loop_system->u.str); + if (!event_request_system(event_loop_system->u.str, "graphics_null")) + return NULL; + } else { + if (!event_request_system("null", "graphics_null")) + return NULL; + } + callbacks = cbl; + resize_callback(1,1); + return &graphics_priv; +} + +static void +event_null_main_loop_run(void) +{ + + dbg(0,"enter\n"); + for (;;) + sleep(1); + +} + +static void event_null_main_loop_quit(void) +{ + dbg(0,"enter\n"); +} + +static struct event_watch * +event_null_add_watch(void *h, enum event_watch_cond cond, struct callback *cb) +{ + dbg(0,"enter\n"); + return NULL; +} + +static void +event_null_remove_watch(struct event_watch *ev) +{ + dbg(0,"enter\n"); +} + + +static struct event_timeout * +event_null_add_timeout(int timeout, int multi, struct callback *cb) +{ + dbg(0,"enter\n"); + return NULL; +} + +static void +event_null_remove_timeout(struct event_timeout *to) +{ + dbg(0,"enter\n"); +} + + +static struct event_idle * +event_null_add_idle(int priority, struct callback *cb) +{ + dbg(0,"enter\n"); + return NULL; +} + +static void +event_null_remove_idle(struct event_idle *ev) +{ + dbg(0,"enter\n"); +} + +static void +event_null_call_callback(struct callback_list *cb) +{ + dbg(0,"enter\n"); +} + +static struct event_methods event_null_methods = { + event_null_main_loop_run, + event_null_main_loop_quit, + event_null_add_watch, + event_null_remove_watch, + event_null_add_timeout, + event_null_remove_timeout, + event_null_add_idle, + event_null_remove_idle, + event_null_call_callback, +}; + +static struct event_priv * +event_null_new(struct event_methods *meth) +{ + *meth=event_null_methods; + return NULL; +} + + +void +plugin_init(void) +{ + plugin_register_graphics_type("null", graphics_null_new); + plugin_register_event_type("null", event_null_new); +} diff --git a/navit/graphics/opengl/Makefile.am b/navit/graphics/opengl/Makefile.am new file mode 100644 index 0000000..02d356d --- /dev/null +++ b/navit/graphics/opengl/Makefile.am @@ -0,0 +1,6 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ @OPENGL_CFLAGS@ @GLC_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=graphics_opengl +modulegraphics_LTLIBRARIES = libgraphics_opengl.la +libgraphics_opengl_la_SOURCES = graphics_opengl.c +libgraphics_opengl_la_LIBADD = @OPENGL_LIBS@ @GLC_LIBS@ +libgraphics_opengl_la_LDFLAGS = -module -avoid-version diff --git a/navit/graphics/opengl/Makefile.in b/navit/graphics/opengl/Makefile.in new file mode 100644 index 0000000..e2ee188 --- /dev/null +++ b/navit/graphics/opengl/Makefile.in @@ -0,0 +1,692 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/graphics/opengl +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulegraphicsdir)" +LTLIBRARIES = $(modulegraphics_LTLIBRARIES) +libgraphics_opengl_la_DEPENDENCIES = +am_libgraphics_opengl_la_OBJECTS = graphics_opengl.lo +libgraphics_opengl_la_OBJECTS = $(am_libgraphics_opengl_la_OBJECTS) +libgraphics_opengl_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libgraphics_opengl_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libgraphics_opengl_la_SOURCES) +DIST_SOURCES = $(libgraphics_opengl_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ @OPENGL_CFLAGS@ @GLC_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=graphics_opengl +modulegraphics_LTLIBRARIES = libgraphics_opengl.la +libgraphics_opengl_la_SOURCES = graphics_opengl.c +libgraphics_opengl_la_LIBADD = @OPENGL_LIBS@ @GLC_LIBS@ +libgraphics_opengl_la_LDFLAGS = -module -avoid-version +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/graphics/opengl/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/graphics/opengl/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulegraphicsLTLIBRARIES: $(modulegraphics_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulegraphicsdir)" || $(MKDIR_P) "$(DESTDIR)$(modulegraphicsdir)" + @list='$(modulegraphics_LTLIBRARIES)'; test -n "$(modulegraphicsdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulegraphicsdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulegraphicsdir)"; \ + } + +uninstall-modulegraphicsLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulegraphics_LTLIBRARIES)'; test -n "$(modulegraphicsdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulegraphicsdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulegraphicsdir)/$$f"; \ + done + +clean-modulegraphicsLTLIBRARIES: + -test -z "$(modulegraphics_LTLIBRARIES)" || rm -f $(modulegraphics_LTLIBRARIES) + @list='$(modulegraphics_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgraphics_opengl.la: $(libgraphics_opengl_la_OBJECTS) $(libgraphics_opengl_la_DEPENDENCIES) + $(libgraphics_opengl_la_LINK) -rpath $(modulegraphicsdir) $(libgraphics_opengl_la_OBJECTS) $(libgraphics_opengl_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphics_opengl.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulegraphicsdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulegraphicsLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulegraphicsLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulegraphicsLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulegraphicsLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-modulegraphicsLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am \ + uninstall-modulegraphicsLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/graphics/opengl/graphics_opengl.c b/navit/graphics/opengl/graphics_opengl.c new file mode 100644 index 0000000..4da9860 --- /dev/null +++ b/navit/graphics/opengl/graphics_opengl.c @@ -0,0 +1,1856 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2010 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#define USE_FREEIMAGE 1 +#define USE_OPENGLES 0 +#define USE_OPENGLES2 0 +#define USE_FLOAT 0 +#define REQUIRES_POWER_OF_2 0 + +#include +#include +#include +#include + +#include + +#include "item.h" +#include "attr.h" +#include "config.h" +#include "point.h" +#include "graphics.h" +#include "color.h" +#include "plugin.h" +#include "event.h" +#include "debug.h" +#include "callback.h" +#include "keys.h" +#include "window.h" +#include "navit/font/freetype/font_freetype.h" + +#if defined(WINDOWS) || defined(WIN32) +#define PIXEL_FORMAT GL_RGBA +#include +# define sleep(i) Sleep(i * 1000) +#else +#define PIXEL_FORMAT GL_BGRA +#endif + +#if USE_FREEIMAGE +#include +#endif + +#if USE_OPENGLES +#if USE_OPENGLES2 +#include +#include +#define glF(x) x +#define GL_F GL_FLOAT +typedef GLfloat GLf; +#else +#include +#include + +#if USE_FLOAT +#define glF(x) x +#define glD(x) x +#define GL_F GL_FLOAT +typedef GLfloat GLf; +#else +#define glF(x) ((GLfixed)((x)*(1<<16))) +#define glD(x) glF(x) +#define GL_F GL_FIXED +typedef GLfixed GLf; + +#define glClearColor glClearColorx +#define glTranslatef glTranslatex +#define glRotatef glRotatex +#define glMaterialfv glMaterialxv +#define glMaterialf glMaterialx +#define glOrthof glOrthox +#define glScalef glScalex +#define glColor4f glColor4x +#endif +#define glTexParameteri glTexParameterx + +#endif +extern EGLSurface eglwindow; +extern EGLDisplay egldisplay; +#else +#ifdef __APPLE__ +#include +#else +#include /* glut.h includes gl.h and glu.h */ +#endif +#endif + +#ifdef HAVE_FREEGLUT || __FREEGLUT_EXT_H__ +#define USE_FREEGLUT 1 +#endif + +#define SCREEN_WIDTH 700 +#define SCREEN_HEIGHT 700 + +//#define MIRRORED_VIEW 1 + +struct graphics_gc_priv { + struct graphics_priv *gr; + float fr, fg, fb, fa; + float br, bg, bb, ba; + int linewidth; + unsigned char *dash_list; + int dash_count; + int dash_mask; +} graphics_gc_priv; + +struct graphics_priv { + int button_timeout; + struct point p; + int width; + int height; + int library_init; + int visible; + int overlay_enabled; + int overlay_autodisabled; + int wraparound; + struct graphics_priv *parent; + struct graphics_priv *overlays; + struct graphics_priv *next; + struct graphics_gc_priv *background_gc; + enum draw_mode_num mode; + void (*resize_callback) (void *data, int w, int h); + void *resize_callback_data; + void (*motion_callback) (void *data, struct point * p); + void *motion_callback_data; + void (*button_callback) (void *data, int press, int button, + struct point * p); + void *button_callback_data; +#if USE_OPENGLES + GLuint program; + GLint mvp_location, position_location, color_location, texture_position_location, use_texture_location, texture_location; +#else + GLuint DLid; +#endif + struct callback_list *cbl; + struct font_freetype_methods freetype_methods; + struct navit *nav; + int timeout; + int delay; + struct window window; + int dirty; //display needs to be redrawn (draw on root graphics or overlay is done) + int force_redraw; //display needs to be redrawn (draw on root graphics or overlay is done) + time_t last_refresh_time; //last display refresh time +}; + +static struct graphics_priv *graphics_priv_root; +struct graphics_image_priv { + int w; + int h; + int hot_x; + int hot_y; + unsigned char *data; + char *path; +} graphics_image_priv; + +struct mouse_event_queue_element { + int button; + int state; + int x; + int y; +}; + +static const int mouse_event_queue_size = 100; +static int mouse_event_queue_begin_idx = 0; +static int mouse_event_queue_end_idx = 0; +static struct mouse_event_queue_element mouse_queue[100]; + +//hastable for uncompressed image data +static GHashTable *hImageData; + +#if USE_OPENGLES +#else +/* prototypes */ +void APIENTRY tessBeginCB(GLenum which); +void APIENTRY tessEndCB(); +void APIENTRY tessErrorCB(GLenum errorCode); +void APIENTRY tessVertexCB(const GLvoid * data); +void APIENTRY tessVertexCB2(const GLvoid * data); +void APIENTRY tessCombineCB(GLdouble c[3], void *d[4], GLfloat w[4], void **out); +const char *getPrimitiveType(GLenum type); +#endif + +static struct graphics_priv *graphics_opengl_new_helper(struct + graphics_methods + *meth); +static void display(void); +static void resize_callback(int w, int h); +static void glut_close(); + +#if USE_OPENGLES2 +const char vertex_src [] = +" \ + attribute vec2 position; \ + attribute vec2 texture_position; \ + uniform mat4 mvp; \ + varying vec2 v_texture_position; \ + \ + void main() \ + { \ + v_texture_position=texture_position; \ + gl_Position = mvp*vec4(position, 0.0, 1.0); \ + } \ +"; + +const char fragment_src [] = +" \ + uniform lowp vec4 avcolor; \ + uniform sampler2D texture; \ + uniform bool use_texture; \ + varying vec2 v_texture_position; \ + void main() \ + { \ + if (use_texture) { \ + gl_FragColor = texture2D(texture, v_texture_position); \ + } else { \ + gl_FragColor = avcolor; \ + } \ + } \ +"; +#endif + +static void +graphics_destroy(struct graphics_priv *gr) +{ + /*FIXME graphics_destroy is never called */ + /*TODO add destroy code for image cache(delete entries in hImageData) */ + g_free(gr); + gr = NULL; +} + +static void +gc_destroy(struct graphics_gc_priv *gc) +{ + g_free(gc); + gc = NULL; +} + +static void +gc_set_linewidth(struct graphics_gc_priv *gc, int w) +{ + gc->linewidth = w; +} + +static void +gc_set_dashes(struct graphics_gc_priv *gc, int width, int offset, + unsigned char *dash_list, int n) +{ + int i; + const int cOpenglMaskBits = 16; + gc->dash_count = n; + if (1 == n) { + gc->dash_mask = 0; + for (i = 0; i < cOpenglMaskBits; ++i) { + gc->dash_mask <<= 1; + gc->dash_mask |= (i / n) % 2; + } + } else if (1 < n) { + unsigned char *curr = dash_list; + int cnt = 0; //dot counter + int dcnt = 0; //dash element counter + int sum_dash = 0; + gc->dash_mask = 0; + + for (i = 0; i < n; ++i) { + sum_dash += dash_list[i]; + } + + //scale dashlist elements to max size + if (sum_dash > cOpenglMaskBits) { + int num_error[2] = { 0, 0 }; //count elements rounded to 0 for odd(drawn) and even(masked) for compensation + double factor = (1.0 * cOpenglMaskBits) / sum_dash; + for (i = 0; i < n; ++i) { //calculate dashlist max and largest common denomiator for scaling + dash_list[i] *= factor; + if (dash_list[i] == 0) { + ++dash_list[i]; + ++num_error[i % 2]; + } else if (0 < num_error[i % 2] + && 2 < dash_list[i]) { + ++dash_list[i]; + --num_error[i % 2]; + } + } + } + //calculate mask + for (i = 0; i < cOpenglMaskBits; ++i) { + gc->dash_mask <<= 1; + gc->dash_mask |= 1 - dcnt % 2; + ++cnt; + if (cnt == *curr) { + cnt = 0; + ++curr; + ++dcnt; + if (dcnt == n) { + curr = dash_list; + } + } + } + } +} + + +static void +gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) +{ + gc->fr = c->r / 65535.0; + gc->fg = c->g / 65535.0; + gc->fb = c->b / 65535.0; + gc->fa = c->a / 65535.0; +} + +static void +gc_set_background(struct graphics_gc_priv *gc, struct color *c) +{ + gc->br = c->r / 65535.0; + gc->bg = c->g / 65535.0; + gc->bb = c->b / 65535.0; + gc->ba = c->a / 65535.0; +} + +static struct graphics_gc_methods gc_methods = { + gc_destroy, + gc_set_linewidth, + gc_set_dashes, + gc_set_foreground, + gc_set_background +}; + +static struct graphics_gc_priv * +gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) +{ + struct graphics_gc_priv *gc = g_new0(struct graphics_gc_priv, 1); + + *meth = gc_methods; + gc->gr = gr; + gc->linewidth = 1; + return gc; +} + +static struct graphics_image_priv image_error; + +static struct graphics_image_priv * +image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, + char *path, int *w, int *h, struct point *hot, int rotation) +{ +#if USE_FREEIMAGE + FIBITMAP *image; + RGBQUAD aPixel; + unsigned char *data; + int width, height, i, j; + struct graphics_image_priv *gi; + //check if image already exists in hashmap + struct graphics_image_priv *curr_elem = + g_hash_table_lookup(hImageData, path); + if (curr_elem == &image_error) { + //found but couldn't be loaded + return NULL; + } else if (curr_elem) { + //found and OK -> use hastable entry + *w = curr_elem->w; + *h = curr_elem->h; + hot->x = curr_elem->w / 2 - 1; + hot->y = curr_elem->h / 2 - 1; + return curr_elem; + } else { + if (strlen(path) < 4) { + g_hash_table_insert(hImageData, g_strdup(path), + &image_error); + return NULL; + } + char *ext_str = path + strlen(path) - 3; + if (strstr(ext_str, "png") || strstr(path, "PNG")) { + if ((image = + FreeImage_Load(FIF_PNG, path, 0)) == NULL) { + g_hash_table_insert(hImageData, + g_strdup(path), + &image_error); + return NULL; + } + } else if (strstr(ext_str, "xpm") || strstr(path, "XPM")) { + if ((image = + FreeImage_Load(FIF_XPM, path, 0)) == NULL) { + g_hash_table_insert(hImageData, + g_strdup(path), + &image_error); + return NULL; + } + } else if (strstr(ext_str, "svg") || strstr(path, "SVG")) { + char path_new[256]; + snprintf(path_new, strlen(path) - 3, "%s", path); + strcat(path_new, "_48_48.png"); + + if ((image = + FreeImage_Load(FIF_PNG, path_new, + 0)) == NULL) { + g_hash_table_insert(hImageData, + g_strdup(path), + &image_error); + return NULL; + } + } else { + g_hash_table_insert(hImageData, g_strdup(path), + &image_error); + return NULL; + } + + if (FreeImage_GetBPP(image) == 64) { + FIBITMAP *image2; + image2 = FreeImage_ConvertTo32Bits(image); + FreeImage_Unload(image); + image = image2; + } +#if FREEIMAGE_MAJOR_VERSION*100+FREEIMAGE_MINOR_VERSION >= 313 + if (rotation) { + FIBITMAP *image2; + image2 = FreeImage_Rotate(image, rotation, NULL); + image = image2; + } +#endif + + gi = g_new0(struct graphics_image_priv, 1); + + width = FreeImage_GetWidth(image); + height = FreeImage_GetHeight(image); + + if ((*w != width || *h != height) && 0 < *w && 0 < *h) { + FIBITMAP *image2; + image2 = FreeImage_Rescale(image, *w, *h, NULL); + FreeImage_Unload(image); + image = image2; + width = *w; + height = *h; + } + + data = (unsigned char *) malloc(width * height * 4); + + RGBQUAD *palette = NULL; + if (FreeImage_GetBPP(image) == 8) { + palette = FreeImage_GetPalette(image); + } + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + unsigned char idx; + if (FreeImage_GetBPP(image) == 8) { + FreeImage_GetPixelIndex(image, j, + height - + i - 1, + &idx); + data[4 * width * i + 4 * j + 0] = + palette[idx].rgbRed; + data[4 * width * i + 4 * j + 1] = + palette[idx].rgbGreen; + data[4 * width * i + 4 * j + 2] = + palette[idx].rgbBlue; + data[4 * width * i + 4 * j + 3] = + 255; + } else if (FreeImage_GetBPP(image) == 16 + || FreeImage_GetBPP(image) == 24 + || FreeImage_GetBPP(image) == + 32) { + FreeImage_GetPixelColor(image, j, + height - + i - 1, + &aPixel); + int transparent = + (aPixel.rgbRed == 0 + && aPixel.rgbBlue == 0 + && aPixel.rgbGreen == 0); + data[4 * width * i + 4 * j + 0] = + transparent ? 0 : (aPixel. + rgbRed); + data[4 * width * i + 4 * j + 1] = + (aPixel.rgbGreen); + data[4 * width * i + 4 * j + 2] = + transparent ? 0 : (aPixel. + rgbBlue); + data[4 * width * i + 4 * j + 3] = + transparent ? 0 : 255; + + } + } + } + + FreeImage_Unload(image); + + *w = width; + *h = height; + gi->w = width; + gi->h = height; + gi->hot_x = width / 2 - 1; + gi->hot_y = height / 2 - 1; + hot->x = width / 2 - 1; + hot->y = height / 2 - 1; + gi->data = data; + gi->path = path; + //add to hashtable + g_hash_table_insert(hImageData, g_strdup(path), gi); + return gi; + } +#else + return NULL; +#endif +} + +#if USE_OPENGLES + +static void +set_color(struct graphics_priv *gr, struct graphics_gc_priv *gc) +{ +#if USE_OPENGLES2 + GLfloat col[4]; + col[0]=gc->fr; + col[1]=gc->fg; + col[2]=gc->fb; + col[3]=1.0; + glUniform4fv(gr->color_location, 1, col); +#else + glColor4f(glF(gc->fr), glF(gc->fg), glF(gc->fb), glF(gc->fa)); +#endif +} + +static void +draw_array(struct graphics_priv *gr, struct point *p, int count, GLenum mode) +{ + GLf x[count*2]; + int i; + + for (i = 0 ; i < count ; i++) { + x[i*2]=glF(p[i].x); + x[i*2+1]=glF(p[i].y); + } +#if USE_OPENGLES2 + glVertexAttribPointer (gr->position_location, 2, GL_FLOAT, 0, 0, x ); +#else + glVertexPointer(2, GL_F, 0, x); +#endif + glDrawArrays(mode, 0, count); +} + +static void +draw_rectangle_es(struct graphics_priv *gr, struct point *p, int w, int h) +{ + struct point pa[4]; + pa[0]=pa[1]=pa[2]=pa[3]=*p; + pa[0].x+=w; + pa[1].x+=w; + pa[1].y+=h; + pa[3].y+=h; + draw_array(gr, pa, 4, GL_TRIANGLE_STRIP); +} + +static int next_power2(int x) +{ + int r=1; + while (r < x) + r*=2; + return r; +} + +static void +draw_image_es(struct graphics_priv *gr, struct point *p, int w, int h, unsigned char *data) +{ + GLf x[8]; + + memset(x, 0, sizeof(x)); +#if REQUIRES_POWER_OF_2 + int w2=next_power2(w); + int h2=next_power2(h); + int y; + if (w2 != w || h2 != h) { + char *newpix=g_malloc0(w2*h2*4); + for (y=0 ; y < h ; y++) + memcpy(newpix+y*w2*4, data+y*w*4, w*4); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w2, h2, 0, GL_RGBA, GL_UNSIGNED_BYTE, newpix); + g_free(newpix); + w=w2; + h=h2; + } else + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); +#else + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); +#endif + x[0]+=glF(1); + x[2]+=glF(1); + x[3]+=glF(1); + x[7]+=glF(1); +#if USE_OPENGLES2 + glUniform1i(gr->use_texture_location, 1); + glEnableVertexAttribArray(gr->texture_position_location); + glVertexAttribPointer (gr->texture_position_location, 2, GL_FLOAT, 0, 0, x ); +#else + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glEnable(GL_TEXTURE_2D); + glTexCoordPointer(2, GL_F, 0, x); +#endif + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + draw_rectangle_es(gr, p, w, h); +#if USE_OPENGLES2 + glUniform1i(gr->use_texture_location, 0); + glDisableVertexAttribArray(gr->texture_position_location); +#else + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisable(GL_TEXTURE_2D); +#endif + glDisable(GL_BLEND); +} + + +#else +const char * +getPrimitiveType(GLenum type) +{ + char *ret = ""; + + switch (type) { + case 0x0000: + ret = "GL_POINTS"; + break; + case 0x0001: + ret = "GL_LINES"; + break; + case 0x0002: + ret = "GL_LINE_LOOP"; + break; + case 0x0003: + ret = "GL_LINE_STRIP"; + break; + case 0x0004: + ret = "GL_TRIANGLES"; + break; + case 0x0005: + ret = "GL_TRIANGLE_STRIP"; + break; + case 0x0006: + ret = "GL_TRIANGLE_FAN"; + break; + case 0x0007: + ret = "GL_QUADS"; + break; + case 0x0008: + ret = "GL_QUAD_STRIP"; + break; + case 0x0009: + ret = "GL_POLYGON"; + break; + } + return ret; +} + +void APIENTRY +tessBeginCB(GLenum which) +{ + glBegin(which); + + dbg(1, "glBegin( %s );\n", getPrimitiveType(which)); +} + + + +void APIENTRY +tessEndCB() +{ + glEnd(); + + dbg(1, "glEnd();\n"); +} + + + +void APIENTRY +tessVertexCB(const GLvoid * data) +{ + // cast back to double type + const GLdouble *ptr = (const GLdouble *) data; + + glVertex3dv(ptr); + + dbg(1, " glVertex3d();\n"); +} +#endif + +static void +get_overlay_pos(struct graphics_priv *gr, struct point *point_out) +{ + if (gr->parent == NULL) { + point_out->x = 0; + point_out->y = 0; + return; + } + point_out->x = gr->p.x; + if (point_out->x < 0) { + point_out->x += gr->parent->width; + } + + point_out->y = gr->p.y; + if (point_out->y < 0) { + point_out->y += gr->parent->height; + } +} + +static void +draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, + struct point *p, int count) +{ + if ((gr->parent && !gr->parent->overlay_enabled) + || (gr->parent && gr->parent->overlay_enabled + && !gr->overlay_enabled)) { + return; + } +#if !USE_OPENGLES || USE_OPENGLES2 + glLineWidth(gc->linewidth); +#endif +#if USE_OPENGLES + set_color(gr, gc); + draw_array(gr, p, count, GL_LINE_STRIP); +#else + + graphics_priv_root->dirty = 1; + + glColor4f(gc->fr, gc->fg, gc->fb, gc->fa); + if (!gr->parent && 0 < gc->dash_count) { + glLineStipple(1, gc->dash_mask); + glEnable(GL_LINE_STIPPLE); + } + glBegin(GL_LINE_STRIP); + int i; + for (i = 0; i < count; i++) { + struct point p_eff; + p_eff.x = p[i].x; + p_eff.y = p[i].y; + glVertex2f(p_eff.x, p_eff.y); + } + glEnd(); + if (!gr->parent && 0 < gc->dash_count) { + glDisable(GL_LINE_STIPPLE); + } +#endif +} + +#if USE_OPENGLES +#else +void APIENTRY +tessCombineCB(GLdouble c[3], void *d[4], GLfloat w[4], void **out) +{ + GLdouble *nv = (GLdouble *) malloc(sizeof(GLdouble) * 3); + nv[0] = c[0]; + nv[1] = c[1]; + nv[2] = c[2]; + *out = nv; +} +#endif + + +static void +draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, + struct point *p, int count) +{ + int i; + + if ((gr->parent && !gr->parent->overlay_enabled) + || (gr->parent && gr->parent->overlay_enabled + && !gr->overlay_enabled)) { + return; + } +#if USE_OPENGLES + set_color(gr, gc); + draw_array(gr, p, count, GL_LINE_STRIP); +#else + graphics_priv_root->dirty = 1; + + GLUtesselator *tess = gluNewTess(); // create a tessellator + if (!tess) + return; // failed to create tessellation object, return 0 + + GLdouble quad1[count][3]; + for (i = 0; i < count; i++) { + quad1[i][0] = (GLdouble) (p[i].x); + quad1[i][1] = (GLdouble) (p[i].y); + quad1[i][2] = 0; + } + + + // register callback functions + gluTessCallback(tess, GLU_TESS_BEGIN, (void (APIENTRY *)(void)) tessBeginCB); + gluTessCallback(tess, GLU_TESS_END, (void (APIENTRY *)(void)) tessEndCB); + // gluTessCallback(tess, GLU_TESS_ERROR, (void (*)(void))tessErrorCB); + gluTessCallback(tess, GLU_TESS_VERTEX, (void (APIENTRY *)(void)) tessVertexCB); + gluTessCallback(tess, GLU_TESS_COMBINE, (void (APIENTRY *)(void)) tessCombineCB); + + // tessellate and compile a concave quad into display list + // gluTessVertex() takes 3 params: tess object, pointer to vertex coords, + // and pointer to vertex data to be passed to vertex callback. + // The second param is used only to perform tessellation, and the third + // param is the actual vertex data to draw. It is usually same as the second + // param, but It can be more than vertex coord, for example, color, normal + // and UV coords which are needed for actual drawing. + // Here, we are looking at only vertex coods, so the 2nd and 3rd params are + // pointing same address. + glColor4f(gc->fr, gc->fg, gc->fb, gc->fa); + gluTessBeginPolygon(tess, 0); // with NULL data + gluTessBeginContour(tess); + for (i = 0; i < count; i++) { + gluTessVertex(tess, quad1[i], quad1[i]); + } + gluTessEndContour(tess); + gluTessEndPolygon(tess); + + gluDeleteTess(tess); // delete after tessellation +#endif +} + +static void +draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, + struct point *p, int w, int h) +{ + if ((gr->parent && !gr->parent->overlay_enabled) + || (gr->parent && gr->parent->overlay_enabled + && !gr->overlay_enabled)) { + return; + } +#if USE_OPENGLES + set_color(gr, gc); + draw_rectangle_es(gr, p, w, h); +#else + + graphics_priv_root->dirty = 1; + + struct point p_eff; + p_eff.x = p->x; + p_eff.y = p->y; + + glColor4f(gc->fr, gc->fg, gc->fb, gc->fa); + glBegin(GL_POLYGON); + glVertex2f(p_eff.x, p_eff.y); + glVertex2f(p_eff.x + w, p_eff.y); + glVertex2f(p_eff.x + w, p_eff.y + h); + glVertex2f(p_eff.x, p_eff.y + h); + glEnd(); +#endif +} + +static void +draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, + struct point *p, int r) +{ +#if USE_OPENGLES +#else + if ((gr->parent && !gr->parent->overlay_enabled) + || (gr->parent && gr->parent->overlay_enabled + && !gr->overlay_enabled)) { + return; + } + + graphics_priv_root->dirty = 1; + + /* FIXME: does not quite match gtk */ + /* hack for osd compass.. why is this needed!? */ + if (gr->parent) { + r = r / 2; + } + + struct point p_eff; + p_eff.x = p->x; + p_eff.y = p->y; + + GLUquadricObj *quadratic; + quadratic = gluNewQuadric(); + glPushMatrix(); + glTranslatef(p_eff.x, p_eff.y, 0); + glColor4f(gc->fr, gc->fg, gc->fb, gc->fa); + gluDisk(quadratic, r - (gc->linewidth / 2) - 2, + r + (gc->linewidth / 2), 10 + r / 5, 10 + r / 5); + glPopMatrix(); + gluDeleteQuadric(quadratic); +#endif +} + +static void +display_text_draw(struct font_freetype_text *text, + struct graphics_priv *gr, struct graphics_gc_priv *fg, + struct graphics_gc_priv *bg, int color, struct point *p) +{ + int i, x, y, stride; + struct font_freetype_glyph *g, **gp; + unsigned char *shadow, *glyph; + struct color transparent = { 0x0000, 0x0000, 0x0000, 0x0000 }; + struct color black = + { fg->fr * 65535, fg->fg * 65535, fg->fb * 65535, + fg->fa * 65535 }; + struct color white = { 0xffff, 0xffff, 0xffff, 0xffff }; + + if (bg) { + if (COLOR_IS_WHITE(black) && COLOR_IS_BLACK(white)) { + black.r = 65535; + black.g = 65535; + black.b = 65535; + black.a = 65535; + + white.r = 0; + white.g = 0; + white.b = 0; + white.a = 65535; + } else if (COLOR_IS_BLACK(black) && COLOR_IS_WHITE(white)) { + white.r = 65535; + white.g = 65535; + white.b = 65535; + white.a = 65535; + + black.r = 0; + black.g = 0; + black.b = 0; + black.a = 65535; + } else { + white.r = bg->fr; + white.g = bg->fg; + white.b = bg->fb; + white.a = bg->fa; + } + } else { + white.r = 0; + white.g = 0; + white.b = 0; + white.a = 0; + } + + gp = text->glyph; + i = text->glyph_count; + x = p->x << 6; + y = p->y << 6; + while (i-- > 0) { + g = *gp++; + if (g->w && g->h && bg) { + stride = (g->w + 2) * 4; + if (color) { + shadow = g_malloc(stride * (g->h + 2)); + gr->freetype_methods.get_shadow(g, shadow, + 32, stride, + &white, + &transparent); +#if USE_OPENGLES + struct point p; + p.x=((x + g->x) >> 6)-1; + p.y=((y + g->y) >> 6)-1; + draw_image_es(gr, &p, g->w+2, g->h+2, shadow); +#else +#ifdef MIRRORED_VIEW + glPixelZoom(-1.0, -1.0); //mirrored mode +#else + glPixelZoom(1.0, -1.0); +#endif + glRasterPos2d((x + g->x) >> 6, + (y + g->y) >> 6); + glDrawPixels(g->w + 2, g->h + 2, PIXEL_FORMAT, + GL_UNSIGNED_BYTE, shadow); +#endif + g_free(shadow); + } + } + x += g->dx; + y += g->dy; + } + + x = p->x << 6; + y = p->y << 6; + gp = text->glyph; + i = text->glyph_count; + while (i-- > 0) { + g = *gp++; + if (g->w && g->h) { + if (color) { + stride = g->w; + if (bg) { + glyph = + g_malloc(stride * g->h * 4); + gr->freetype_methods.get_glyph(g, + glyph, + 32, + stride + * 4, + &black, + &white, + &transparent); +#if USE_OPENGLES + struct point p; + p.x=(x + g->x) >> 6; + p.y=(y + g->y) >> 6; + draw_image_es(gr, &p, g->w, g->h, glyph); +#else +#ifdef MIRRORED_VIEW + glPixelZoom(-1.0, -1.0); //mirrored mode +#else + glPixelZoom(1.0, -1.0); +#endif + glRasterPos2d((x + g->x) >> 6, + (y + g->y) >> 6); + glDrawPixels(g->w, g->h, PIXEL_FORMAT, + GL_UNSIGNED_BYTE, + glyph); +#endif + g_free(glyph); + } + stride *= 4; + glyph = g_malloc(stride * g->h); + gr->freetype_methods.get_glyph(g, glyph, + 32, stride, + &black, + &white, + &transparent); +#if USE_OPENGLES + struct point p; + p.x=(x + g->x) >> 6; + p.y=(y + g->y) >> 6; + draw_image_es(gr, &p, g->w, g->h, glyph); +#else +#ifdef MIRRORED_VIEW + glPixelZoom(-1.0, -1.0); //mirrored mode +#else + glPixelZoom(1.0, -1.0); +#endif + glRasterPos2d((x + g->x) >> 6, + (y + g->y) >> 6); + glDrawPixels(g->w, g->h, PIXEL_FORMAT, + GL_UNSIGNED_BYTE, glyph); +#endif + g_free(glyph); + } + } + x += g->dx; + y += g->dy; + } +} + +static void +draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, + struct graphics_gc_priv *bg, struct graphics_font_priv *font, + char *text, struct point *p, int dx, int dy) +{ + if ((gr->parent && !gr->parent->overlay_enabled) + || (gr->parent && gr->parent->overlay_enabled + && !gr->overlay_enabled)) { + return; + } + + struct font_freetype_text *t; + int color = 1; + + if (!font) { + dbg(0, "no font, returning\n"); + return; + } + + graphics_priv_root->dirty = 1; + + t = gr->freetype_methods.text_new(text, + (struct font_freetype_font *) + font, dx, dy); + + struct point p_eff; + p_eff.x = p->x; + p_eff.y = p->y; + + display_text_draw(t, gr, fg, bg, color, &p_eff); + gr->freetype_methods.text_destroy(t); +} + + +static void +draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, + struct point *p, struct graphics_image_priv *img) +{ +#if USE_OPENGLES + draw_image_es(gr, p, img->w, img->h, img->data); +#else + if ((gr->parent && !gr->parent->overlay_enabled) + || (gr->parent && gr->parent->overlay_enabled + && !gr->overlay_enabled)) { + return; + } + + if (!img || !img->data) { + return; + } + + graphics_priv_root->dirty = 1; + + struct point p_eff; + p_eff.x = p->x + img->hot_x; + p_eff.y = p->y + img->hot_y; + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glRasterPos2d(p_eff.x - img->hot_x, p_eff.y - img->hot_y); + glDrawPixels(img->w, img->h, GL_RGBA, GL_UNSIGNED_BYTE, img->data); +#endif + +} + +static void +draw_image_warp(struct graphics_priv *gr, struct graphics_gc_priv *fg, + struct point *p, int count, char *data) +{ +} + +static void +draw_restore(struct graphics_priv *gr, struct point *p, int w, int h) +{ +} + +static void +draw_drag(struct graphics_priv *gr, struct point *p) +{ + + if (p) { + gr->p.x = p->x; + gr->p.y = p->y; + } +} + +static void +background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) +{ + gr->background_gc = gc; +} + +static void +handle_mouse_queue() +{ +#if USE_OPENGLES +#else + static locked = 0; + if (!locked) { + locked = 1; + } else { + return; + } + + if (mouse_event_queue_begin_idx < mouse_event_queue_end_idx) { + if (mouse_queue[mouse_event_queue_begin_idx].button == + GLUT_LEFT_BUTTON + && mouse_queue[mouse_event_queue_begin_idx].state == + GLUT_UP) { + struct point p; + p.x = + mouse_queue[mouse_event_queue_begin_idx % + mouse_event_queue_size].x; + p.y = + mouse_queue[mouse_event_queue_begin_idx % + mouse_event_queue_size].y; + graphics_priv_root->force_redraw = 1; + callback_list_call_attr_3(graphics_priv_root->cbl, + attr_button, (void *) 0, + 1, (void *) &p); + } else if (mouse_queue[mouse_event_queue_begin_idx]. + button == GLUT_LEFT_BUTTON + && mouse_queue[mouse_event_queue_begin_idx]. + state == GLUT_DOWN) { + struct point p; + p.x = + mouse_queue[mouse_event_queue_begin_idx % + mouse_event_queue_size].x; + p.y = + mouse_queue[mouse_event_queue_begin_idx % + mouse_event_queue_size].y; + graphics_priv_root->force_redraw = 1; + callback_list_call_attr_3(graphics_priv_root->cbl, + attr_button, (void *) 1, + 1, (void *) &p); + } + ++mouse_event_queue_begin_idx; + } + locked = 0; +#endif +} + + +/*draws root graphics and its overlays*/ +static int +redraw_screen(struct graphics_priv *gr) +{ +#if USE_OPENGLES +#else + time_t curr_time = time(0); + graphics_priv_root->dirty = 0; + + glCallList(gr->DLid); + //display overlays display list + struct graphics_priv *overlay; + overlay = gr->overlays; + while (gr->overlay_enabled && overlay) { + if (overlay->overlay_enabled) { + glPushMatrix(); + struct point p_eff; + get_overlay_pos(overlay, &p_eff); + glTranslatef(p_eff.x, p_eff.y, 1); + glCallList(overlay->DLid); + glPopMatrix(); + } + overlay = overlay->next; + } + glutSwapBuffers(); +#endif + + return TRUE; +} + + +/*filters call to redraw in overlay enabled(map) mode*/ +static void +redraw_filter(struct graphics_priv *gr) +{ + if (gr->overlay_enabled && gr->dirty) { + redraw_screen(gr); + } +} + + + +static void +draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) +{ + if (gr->parent) { //overlay +#if USE_OPENGLES +#else + if (mode == draw_mode_begin) { + glNewList(gr->DLid, GL_COMPILE); + } + + if (mode == draw_mode_end || mode == draw_mode_end_lazy) { + glEndList(); + } +#endif + } else { //root graphics + if (mode == draw_mode_begin) { +#if USE_OPENGLES +#else + glNewList(gr->DLid, GL_COMPILE); +#endif + } + + if (mode == draw_mode_end) { +#if USE_OPENGLES + eglSwapBuffers(egldisplay, eglwindow); +#else + glEndList(); + gr->force_redraw = 1; + if (!gr->overlay_enabled || gr->force_redraw) { + redraw_screen(gr); + } +#endif + } + } + gr->mode = mode; +} + +static struct graphics_priv *overlay_new(struct graphics_priv *gr, + struct graphics_methods *meth, + struct point *p, int w, int h, + int alpha, int wraparound); + +static int +graphics_opengl_fullscreen(struct window *w, int on) +{ + return 1; +} + +static void +graphics_opengl_disable_suspend(struct window *w) +{ +} + +#if USE_OPENGLES2 +static GLuint +load_shader(const char *shader_source, GLenum type) +{ + GLuint shader = glCreateShader(type); + + glShaderSource(shader, 1, &shader_source, NULL); + glCompileShader(shader); + + return shader; +} +#endif + +static void * +get_data(struct graphics_priv *this, char *type) +{ + /*TODO initialize gtkglext context when type=="gtk_widget" */ + if (!strcmp(type, "gtk_widget")) { + fprintf(stderr, + "Currently GTK gui is not yet supported with opengl graphics driver\n"); + exit(-1); + } + if (strcmp(type, "window") == 0) { + struct window *win; +#if USE_OPENGLES + GLuint vertexShader; + GLuint fragmentShader; + GLuint textures; + GLfloat matrix[16]; + int i; + + createEGLWindow(this->width,this->height,"Navit"); + resize_callback(this->width,this->height); +#if 0 + glClearColor ( 0.4 , 0.4 , 0.4 , 1); +#endif + glClear ( GL_COLOR_BUFFER_BIT ); +#if USE_OPENGLES2 + this->program=glCreateProgram(); + vertexShader = load_shader(vertex_src, GL_VERTEX_SHADER); + fragmentShader = load_shader(fragment_src, GL_FRAGMENT_SHADER); + glAttachShader(this->program, vertexShader); + glAttachShader(this->program, fragmentShader); + glLinkProgram(this->program); + glUseProgram(this->program); + this->mvp_location=glGetUniformLocation(this->program, "mvp"); + this->position_location=glGetAttribLocation(this->program, "position"); + glEnableVertexAttribArray(this->position_location); + this->texture_position_location=glGetAttribLocation(this->program, "texture_position"); + this->color_location=glGetUniformLocation(this->program, "avcolor"); + this->texture_location=glGetUniformLocation(this->program, "texture"); + this->use_texture_location=glGetUniformLocation(this->program, "use_texture"); + glUniform1i(this->use_texture_location, 0); + glUniform1i(this->texture_location, 0); + + for (i = 0 ; i < 16 ; i++) + matrix[i]=0.0; + matrix[0]=2.0/this->width; + matrix[5]=-2.0/this->height; + matrix[10]=1; + matrix[12]=-1; + matrix[13]=1; + matrix[15]=1; + glUniformMatrix4fv(this->mvp_location, 1, GL_FALSE, matrix); +#else + glEnableClientState(GL_VERTEX_ARRAY); + glOrthox(glF(0),glF(this->width),glF(this->height),glF(0),glF(-1),glF(1)); +#endif + glGenTextures(1, &textures); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, textures); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + +#if !USE_OPENGLES2 + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); +#endif +#endif + win = g_new0(struct window, 1); + win->priv = this; + win->fullscreen = graphics_opengl_fullscreen; + win->disable_suspend = graphics_opengl_disable_suspend; + return win; + } else { +#if USE_OPENGLES + return NULL; +#else + return &this->DLid; +#endif + } + + +} + +static void +image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) +{ +//TODO free image data in hashtable when graphics is destroyed +//currently graphics destroy is not called !!! +/* + g_free(priv->data); + priv->data = NULL; + g_free(priv); + priv = NULL; +*/ +} + +static void +overlay_disable(struct graphics_priv *gr, int disable) +{ + gr->overlay_enabled = !disable; + gr->force_redraw = 1; + draw_mode(gr, draw_mode_end); +} + +static void +overlay_resize(struct graphics_priv *gr, struct point *p, int w, int h, + int alpha, int wraparound) +{ + int changed = 0; + int w2, h2; + + if (w == 0) { + w2 = 1; + } else { + w2 = w; + } + + if (h == 0) { + h2 = 1; + } else { + h2 = h; + } + + gr->p = *p; + if (gr->width != w2) { + gr->width = w2; + changed = 1; + } + + if (gr->height != h2) { + gr->height = h2; + changed = 1; + } + + gr->wraparound = wraparound; + + if (changed) { + if ((w == 0) || (h == 0)) { + gr->overlay_autodisabled = 1; + } else { + gr->overlay_autodisabled = 0; + } + + callback_list_call_attr_2(gr->cbl, attr_resize, + GINT_TO_POINTER(gr->width), + GINT_TO_POINTER(gr->height)); + } +} + +static struct graphics_methods graphics_methods = { + graphics_destroy, + draw_mode, + draw_lines, + draw_polygon, + draw_rectangle, +#ifdef USE_OPENGLES + NULL, +#else + draw_circle, +#endif + draw_text, + draw_image, + draw_image_warp, + draw_restore, + draw_drag, + NULL, + gc_new, + background_gc, + overlay_new, + image_new, + get_data, + image_free, + NULL, + overlay_disable, + overlay_resize, +}; + +static struct graphics_priv * +graphics_opengl_new_helper(struct graphics_methods *meth) +{ + struct font_priv *(*font_freetype_new) (void *meth); + font_freetype_new = plugin_get_font_type("freetype"); + + if (!font_freetype_new) { + return NULL; + } + + struct graphics_priv *this = g_new0(struct graphics_priv, 1); + + font_freetype_new(&this->freetype_methods); + *meth = graphics_methods; + + meth->font_new = + (struct graphics_font_priv * + (*)(struct graphics_priv *, struct graphics_font_methods *, + char *, int, int)) this->freetype_methods.font_new; + meth->get_text_bbox = this->freetype_methods.get_text_bbox; + + return this; +} + +static struct graphics_priv * +overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, + struct point *p, int w, int h, int alpha, int wraparound) +{ + int w2, h2; + struct graphics_priv *this = graphics_opengl_new_helper(meth); + this->p = *p; + this->width = w; + this->height = h; + this->parent = gr; + + /* If either height or width is 0, we set it to 1 to avoid warnings, and + * disable the overlay. */ + if (h == 0) { + h2 = 1; + } else { + h2 = h; + } + + if (w == 0) { + w2 = 1; + } else { + w2 = w; + } + + if ((w == 0) || (h == 0)) { + this->overlay_autodisabled = 1; + } else { + this->overlay_autodisabled = 0; + } + this->overlay_enabled = 1; + this->overlay_autodisabled = 0; + + this->next = gr->overlays; + gr->overlays = this; +#if USE_OPENGLES +#else + this->DLid = glGenLists(1); +#endif + return this; +} + + +static void +click_notify(int button, int state, int x, int y) +{ + mouse_queue[mouse_event_queue_end_idx % + mouse_event_queue_size].button = button; + mouse_queue[mouse_event_queue_end_idx % + mouse_event_queue_size].state = state; +#ifdef MIRRORED_VIEW + mouse_queue[mouse_event_queue_end_idx % mouse_event_queue_size].x = + graphics_priv_root->width - x; +#else + mouse_queue[mouse_event_queue_end_idx % mouse_event_queue_size].x = + x; +#endif + mouse_queue[mouse_event_queue_end_idx % mouse_event_queue_size].y = + y; + ++mouse_event_queue_end_idx; +} + +static void +motion_notify(int x, int y) +{ + struct point p; +#ifdef MIRRORED_VIEW + p.x = graphics_priv_root->width - x; +#else + p.x = x; +#endif + p.y = y; + callback_list_call_attr_1(graphics_priv_root->cbl, attr_motion, + (void *) &p); + return; +} + +static gboolean +graphics_opengl_idle(void *data) +{ +#if USE_OPENGLES +#else + static int opengl_init_ok = 0; + if (!opengl_init_ok) { + callback_list_call_attr_2(graphics_priv_root->cbl, + attr_resize, + GINT_TO_POINTER + (graphics_priv_root->width), + GINT_TO_POINTER + (graphics_priv_root->height)); + opengl_init_ok = 1; + } else { + +#if USE_FREEGLUT + glutMainLoopEvent(); +#endif + handle_mouse_queue(); + } + return TRUE; +#endif +} + +static void +ProcessNormalKeys(unsigned char key_in, int x, int y) +{ + int key = 0; + char keybuf[2]; + + switch (key_in) { + case 13: + key = NAVIT_KEY_RETURN; + break; + default: + key = key_in; + break; + } + keybuf[0] = key; + keybuf[1] = '\0'; + graphics_priv_root->force_redraw = 1; + callback_list_call_attr_1(graphics_priv_root->cbl, attr_keypress, + (void *) keybuf); +} + +static void +ProcessSpecialKeys(int key_in, int x, int y) +{ + int key = 0; + char keybuf[2]; + + switch (key_in) { + case 102: + key = NAVIT_KEY_RIGHT; + break; + case 100: + key = NAVIT_KEY_LEFT; + break; + case 103: + key = NAVIT_KEY_DOWN; + break; + case 101: + key = NAVIT_KEY_UP; + break; + case 104: + key = NAVIT_KEY_ZOOM_OUT; + break; + case 105: + key = NAVIT_KEY_ZOOM_IN; + break; + default: + break; + } //switch + + graphics_priv_root->force_redraw = 1; + keybuf[0] = key; + keybuf[1] = '\0'; + callback_list_call_attr_1(graphics_priv_root->cbl, attr_keypress, + (void *) keybuf); +} + +static void +resize_callback(int w, int h) +{ + glViewport(0, 0, w, h); +#if USE_OPENGLES +#else + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); +#ifdef MIRRORED_VIEW + gluOrtho2D(w, 0, h, 0.0); //mirrored mode +#else + gluOrtho2D(0, w, h, 0.0); +#endif +#endif + + graphics_priv_root->width = w; + graphics_priv_root->height = h; + + callback_list_call_attr_2(graphics_priv_root->cbl, attr_resize, + GINT_TO_POINTER(w), GINT_TO_POINTER(h)); +} + +static void +display(void) +{ + graphics_priv_root->force_redraw = 1; + redraw_screen(graphics_priv_root); + resize_callback(graphics_priv_root->width, + graphics_priv_root->height); +} + +static void +glut_close(void) +{ + callback_list_call_attr_0(graphics_priv_root->cbl, + attr_window_closed); +} + + +static struct graphics_priv * +graphics_opengl_new(struct navit *nav, struct graphics_methods *meth, + struct attr **attrs, struct callback_list *cbl) +{ + struct attr *attr; + + if (!event_request_system("glib", "graphics_opengl_new")) + return NULL; + + struct graphics_priv *this = graphics_opengl_new_helper(meth); + graphics_priv_root = this; + + this->nav = nav; + this->parent = NULL; + this->overlay_enabled = 1; + + this->width = SCREEN_WIDTH; + if ((attr = attr_search(attrs, NULL, attr_w))) + this->width = attr->u.num; + this->height = SCREEN_HEIGHT; + if ((attr = attr_search(attrs, NULL, attr_h))) + this->height = attr->u.num; + this->timeout = 100; + if ((attr = attr_search(attrs, NULL, attr_timeout))) + this->timeout = attr->u.num; + this->delay = 0; + if ((attr = attr_search(attrs, NULL, attr_delay))) + this->delay = attr->u.num; + this->cbl = cbl; + + char *cmdline = ""; + int argc = 0; +#if !USE_OPENGLES + glutInit(&argc, &cmdline); + glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); + + glutInitWindowSize(this->width, this->height); + glutInitWindowPosition(0, 0); + glutCreateWindow("Navit opengl window"); + + glutDisplayFunc(display); + glutReshapeFunc(resize_callback); + resize_callback(this->width, this->height); +#endif + + graphics_priv_root->cbl = cbl; + graphics_priv_root->width = this->width; + graphics_priv_root->height = this->height; + +#if !USE_OPENGLES + glutMotionFunc(motion_notify); + glutPassiveMotionFunc(motion_notify); + glutMouseFunc(click_notify); + glutKeyboardFunc(ProcessNormalKeys); + glutSpecialFunc(ProcessSpecialKeys); +#if USE_FREEGLUT + glutCloseFunc(glut_close); +#endif + this->DLid = glGenLists(1); +#endif + + g_timeout_add(G_PRIORITY_DEFAULT + 10, graphics_opengl_idle, NULL); + + /*this will only refresh screen in map(overlay enabled) mode */ + g_timeout_add(G_PRIORITY_DEFAULT + 1000, redraw_filter, this); + + //create hash table for uncompressed image data + hImageData = g_hash_table_new(g_str_hash, g_str_equal); + return this; +} + + +static void +event_opengl_main_loop_run(void) +{ + dbg(0, "enter\n"); +} + +static void +event_opengl_main_loop_quit(void) +{ + dbg(0, "enter\n"); +} + +static struct event_watch * +event_opengl_add_watch(void *h, enum event_watch_cond cond, + struct callback *cb) +{ + dbg(0, "enter\n"); + return NULL; +} + +static void +event_opengl_remove_watch(struct event_watch *ev) +{ + dbg(0, "enter\n"); +} + + +static struct event_timeout * +event_opengl_add_timeout(int timeout, int multi, struct callback *cb) +{ + dbg(0, "enter\n"); + return NULL; +} + +static void +event_opengl_remove_timeout(struct event_timeout *to) +{ + dbg(0, "enter\n"); +} + + +static struct event_idle * +event_opengl_add_idle(int priority, struct callback *cb) +{ + dbg(0, "enter\n"); + return NULL; +} + +static void +event_opengl_remove_idle(struct event_idle *ev) +{ + dbg(0, "enter\n"); +} + +static void +event_opengl_call_callback(struct callback_list *cb) +{ + dbg(0, "enter\n"); +} + +static struct event_methods event_opengl_methods = { + event_opengl_main_loop_run, + event_opengl_main_loop_quit, + event_opengl_add_watch, + event_opengl_remove_watch, + event_opengl_add_timeout, + event_opengl_remove_timeout, + event_opengl_add_idle, + event_opengl_remove_idle, + event_opengl_call_callback, +}; + +static struct event_priv * +event_opengl_new(struct event_methods *meth) +{ + *meth = event_opengl_methods; + return NULL; +} + +void +plugin_init(void) +{ + plugin_register_graphics_type("opengl", graphics_opengl_new); + plugin_register_event_type("opengl", event_opengl_new); +} diff --git a/navit/graphics/qt_qpainter/Makefile.am b/navit/graphics/qt_qpainter/Makefile.am new file mode 100644 index 0000000..8c55917 --- /dev/null +++ b/navit/graphics/qt_qpainter/Makefile.am @@ -0,0 +1,13 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @QT_GUI_CFLAGS@ @QT_SVG_CFLAGS@ @NAVIT_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -I$(top_srcdir)/navit/graphics/qt_qpainter -DMODULE=graphics_qt_qpainter +modulegraphics_LTLIBRARIES = libgraphics_qt_qpainter.la +libgraphics_qt_qpainter_la_SOURCES = graphics_qt_qpainter.cpp graphics_qt_qpainter.h RenderArea.cpp RenderArea.h RenderArea.moc +libgraphics_qt_qpainter_la_LDFLAGS = @QT_GUI_LIBS@ @QT_SVG_LIBS@ -module -avoid-version +if GRAPHICS_QT_QPAINTER +BUILT_SOURCES = RenderArea.moc +RenderArea.moc: + @MOC@ $(srcdir)/RenderArea.h >RenderArea.moc || touch RenderArea.moc + +distclean-local: + $(RM) RenderArea.moc +endif diff --git a/navit/graphics/qt_qpainter/Makefile.in b/navit/graphics/qt_qpainter/Makefile.in new file mode 100644 index 0000000..ada8f44 --- /dev/null +++ b/navit/graphics/qt_qpainter/Makefile.in @@ -0,0 +1,715 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/graphics/qt_qpainter +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulegraphicsdir)" +LTLIBRARIES = $(modulegraphics_LTLIBRARIES) +libgraphics_qt_qpainter_la_LIBADD = +am_libgraphics_qt_qpainter_la_OBJECTS = graphics_qt_qpainter.lo \ + RenderArea.lo +libgraphics_qt_qpainter_la_OBJECTS = \ + $(am_libgraphics_qt_qpainter_la_OBJECTS) +libgraphics_qt_qpainter_la_LINK = $(LIBTOOL) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(AM_CXXFLAGS) $(CXXFLAGS) \ + $(libgraphics_qt_qpainter_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libgraphics_qt_qpainter_la_SOURCES) +DIST_SOURCES = $(libgraphics_qt_qpainter_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @QT_GUI_CFLAGS@ @QT_SVG_CFLAGS@ @NAVIT_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -I$(top_srcdir)/navit/graphics/qt_qpainter -DMODULE=graphics_qt_qpainter +modulegraphics_LTLIBRARIES = libgraphics_qt_qpainter.la +libgraphics_qt_qpainter_la_SOURCES = graphics_qt_qpainter.cpp graphics_qt_qpainter.h RenderArea.cpp RenderArea.h RenderArea.moc +libgraphics_qt_qpainter_la_LDFLAGS = @QT_GUI_LIBS@ @QT_SVG_LIBS@ -module -avoid-version +@GRAPHICS_QT_QPAINTER_TRUE@BUILT_SOURCES = RenderArea.moc +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/graphics/qt_qpainter/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/graphics/qt_qpainter/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulegraphicsLTLIBRARIES: $(modulegraphics_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulegraphicsdir)" || $(MKDIR_P) "$(DESTDIR)$(modulegraphicsdir)" + @list='$(modulegraphics_LTLIBRARIES)'; test -n "$(modulegraphicsdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulegraphicsdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulegraphicsdir)"; \ + } + +uninstall-modulegraphicsLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulegraphics_LTLIBRARIES)'; test -n "$(modulegraphicsdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulegraphicsdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulegraphicsdir)/$$f"; \ + done + +clean-modulegraphicsLTLIBRARIES: + -test -z "$(modulegraphics_LTLIBRARIES)" || rm -f $(modulegraphics_LTLIBRARIES) + @list='$(modulegraphics_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgraphics_qt_qpainter.la: $(libgraphics_qt_qpainter_la_OBJECTS) $(libgraphics_qt_qpainter_la_DEPENDENCIES) + $(libgraphics_qt_qpainter_la_LINK) -rpath $(modulegraphicsdir) $(libgraphics_qt_qpainter_la_OBJECTS) $(libgraphics_qt_qpainter_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RenderArea.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphics_qt_qpainter.Plo@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulegraphicsdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +@GRAPHICS_QT_QPAINTER_FALSE@distclean-local: +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulegraphicsLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-local distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulegraphicsLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulegraphicsLTLIBRARIES + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulegraphicsLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-local distclean-tags distdir dvi dvi-am html html-am \ + info info-am install install-am install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-modulegraphicsLTLIBRARIES install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am \ + uninstall-modulegraphicsLTLIBRARIES + +@GRAPHICS_QT_QPAINTER_TRUE@RenderArea.moc: +@GRAPHICS_QT_QPAINTER_TRUE@ @MOC@ $(srcdir)/RenderArea.h >RenderArea.moc || touch RenderArea.moc + +@GRAPHICS_QT_QPAINTER_TRUE@distclean-local: +@GRAPHICS_QT_QPAINTER_TRUE@ $(RM) RenderArea.moc + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/graphics/qt_qpainter/RenderArea.cpp b/navit/graphics/qt_qpainter/RenderArea.cpp new file mode 100644 index 0000000..d480b95 --- /dev/null +++ b/navit/graphics/qt_qpainter/RenderArea.cpp @@ -0,0 +1,318 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ +#include "graphics_qt_qpainter.h" +#include "RenderArea.h" + +#include "RenderArea.moc" + +#ifdef QT_QPAINTER_USE_EMBEDDING +EmbeddedWidget::EmbeddedWidget(struct graphics_priv *priv, QWidget* child, QWidget *parent) +: QX11EmbedWidget(parent) { + this->gra=priv; +#if QT_VERSION >= 0x040000 + this->setWindowTitle("Navit"); +#else + this->setCaption("Navit"); +#endif + QStackedLayout* _outerLayout = new QStackedLayout(this); + this->setLayout(_outerLayout); + _outerLayout->addWidget(child); + _outerLayout->setCurrentWidget(child); +} + +void EmbeddedWidget::closeEvent(QCloseEvent* event) +{ + gra->widget->processClose(); +} +#endif /* QT_QPAINTER_USE_EMBEDDING */ + +//############################################################################################################## +//# Description: Constructor +//# Comment: Using a QPixmap for rendering the graphics +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +RenderArea::RenderArea(struct graphics_priv *priv, QT_QPAINTER_RENDERAREA_PARENT *parent, int w, int h, int overlay) + : QT_QPAINTER_RENDERAREA_PARENT(parent) +{ + pixmap = new QPixmap(w, h); +#ifndef QT_QPAINTER_NO_WIDGET + if (!overlay) { +#if QT_VERSION >= 0x040700 + grabGesture(Qt::PinchGesture); + grabGesture(Qt::SwipeGesture); + grabGesture(Qt::PanGesture); +#endif +#if QT_VERSION >= 0x040000 + setWindowTitle("Navit"); +#else + setCaption("Navit"); +#endif + } +#endif + is_overlay=overlay; + gra=priv; +#if QT_QPAINTER_USE_EVENT_QT + timer_type=g_hash_table_new(NULL, NULL); + timer_callback=g_hash_table_new(NULL, NULL); + watches=g_hash_table_new(NULL, NULL); +#ifndef QT_QPAINTER_NO_WIDGET +#if QT_VERSION >= 0x040000 + setAttribute(Qt::WA_OpaquePaintEvent, true); +#else + setBackgroundMode(QWidget::NoBackground); +#endif +#endif +#endif +} + +//############################################################################################################## +//# Description: QWidget:closeEvent +//# Comment: Deletes navit object and stops event loop on graphics shutdown +//############################################################################################################## +void RenderArea::processClose() +{ + callback_list_call_attr_0(this->cbl, attr_window_closed); +} +void RenderArea::closeEvent(QCloseEvent* event) +{ + this->processClose(); +} + +bool RenderArea::event(QEvent *event) +{ +#if QT_VERSION >= 0x040700 + if (event->type() == QEvent::Gesture) { + dbg(0,"gesture\n"); + return true; + } +#endif + return QWidget::event(event); +} +//############################################################################################################## +//# Description: QWidget:sizeHint +//# Comment: This property holds the recommended size for the widget +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +QSize RenderArea::sizeHint() const +{ + return QSize(gra->w, gra->h); +} + +//############################################################################################################## +//# Description: QWidget:paintEvent +//# Comment: A paint event is a request to repaint all or part of the widget. +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +void RenderArea::paintEvent(QPaintEvent * event) +{ + qt_qpainter_draw(gra, &event->rect(), 1); +} + +void RenderArea::do_resize(QSize size) +{ + if (pixmap->paintingActive()) { + pixmap->paintEngine()->painter()->end(); + } + delete pixmap; + pixmap=new QPixmap(size); + pixmap->fill(); + QPainter painter(pixmap); + QBrush brush; + painter.fillRect(0, 0, size.width(), size.height(), brush); + dbg(0,"size %dx%d\n", size.width(), size.height()); + dbg(0,"pixmap %p %dx%d\n", pixmap, pixmap->width(), pixmap->height()); + callback_list_call_attr_2(this->cbl, attr_resize, (void *)size.width(), (void *)size.height()); +} + +//############################################################################################################## +//# Description: QWidget::resizeEvent() +//# Comment: When resizeEvent() is called, the widget already has its new geometry. +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +void RenderArea::resizeEvent(QResizeEvent * event) +{ + if (!this->is_overlay) { + RenderArea::do_resize(event->size()); + } +} + +//############################################################################################################## +//# Description: Method to handle mouse clicks +//# Comment: Delegate of QWidget::mousePressEvent and QWidget::mouseReleaseEvent (see below) +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +void RenderArea::mouseEvent(int pressed, QMouseEvent *event) +{ + struct point p; + p.x=event->x(); + p.y=event->y(); + switch (event->button()) { + case Qt::LeftButton: + callback_list_call_attr_3(this->cbl, attr_button, (void *)pressed, (void *)1, (void *)&p); + break; + case Qt::MidButton: + callback_list_call_attr_3(this->cbl, attr_button, (void *)pressed, (void *)2, (void *)&p); + break; + case Qt::RightButton: + callback_list_call_attr_3(this->cbl, attr_button, (void *)pressed, (void *)3, (void *)&p); + break; + default: + break; + } +} + +void RenderArea::mousePressEvent(QMouseEvent *event) +{ + mouseEvent(1, event); +} + +void RenderArea::mouseReleaseEvent(QMouseEvent *event) +{ + mouseEvent(0, event); +} + +//############################################################################################################## +//# Description: QWidget::mouseMoveEvent +//# Comment: If mouse tracking is switched on, mouse move events occur even if no mouse button is pressed. +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +void RenderArea::mouseMoveEvent(QMouseEvent *event) +{ + struct point p; + p.x=event->x(); + p.y=event->y(); + callback_list_call_attr_1(this->cbl, attr_motion, (void *)&p); +} + + +//############################################################################################################## +//# Description: Qt Event :: Zoom in/out with the mouse's scrollwheel +//# Comment: +//# Authors: Stefan Klumpp (04/2008) +//############################################################################################################## +void RenderArea::wheelEvent(QWheelEvent *event) +{ + struct point p; + int button; + + p.x=event->x(); // xy-coordinates of the mouse pointer + p.y=event->y(); + + if (event->delta() > 0) // wheel movement away from the person + button=4; + else if (event->delta() < 0) // wheel movement towards the person + button=5; + else + button=-1; + + if (button != -1) { + callback_list_call_attr_3(this->cbl, attr_button, (void *)1, (void *)button, (void *)&p); + callback_list_call_attr_3(this->cbl, attr_button, (void *)0, (void *)button, (void *)&p); + } + + event->accept(); +} + +#define CASE(x) case x: + +void RenderArea::keyPressEvent(QKeyEvent *event) +{ + QString str=event->text(); +#if QT_VERSION < 0x040000 + QCString cstr=str.utf8(); + const char *text=cstr; +#else + const char *text=str.toUtf8().constData(); +#endif + dbg(0,"enter text='%s' 0x%x (%d) key=%d\n", text, text[0], strlen(text), event->key()); + if (!text || !text[0] || text[0] == 0x7f) { + dbg(0,"special key\n"); + switch (event->key()) { + case 4099: + { + text=(char []){NAVIT_KEY_BACKSPACE,'\0'}; + } + break; + case 4101: +#ifdef QT_QPAINTER_CUSTOM_RETURN + QT_QPAINTER_CUSTOM_RETURN +#endif + { + text=(char []){NAVIT_KEY_RETURN,'\0'}; + } + break; + case 4114: +#ifdef QT_QPAINTER_CUSTOM_LEFT + QT_QPAINTER_CUSTOM_LEFT +#endif + { + text=(char []){NAVIT_KEY_LEFT,'\0'}; + } + break; + case 4115: +#ifdef QT_QPAINTER_CUSTOM_UP + QT_QPAINTER_CUSTOM_UP +#endif + { + text=(char []){NAVIT_KEY_UP,'\0'}; + } + break; + case 4116: +#ifdef QT_QPAINTER_CUSTOM_RIGHT + QT_QPAINTER_CUSTOM_RIGHT +#endif + { + text=(char []){NAVIT_KEY_RIGHT,'\0'}; + } + break; + case 4117: +#ifdef QT_QPAINTER_CUSTOM_DOWN + QT_QPAINTER_CUSTOM_DOWN +#endif + { + text=(char []){NAVIT_KEY_DOWN,'\0'}; + } + break; + } + } + callback_list_call_attr_1(this->cbl, attr_keypress, (void *)text); + event->accept(); +} + +void RenderArea::watchEvent(int fd) +{ +#if QT_QPAINTER_USE_EVENT_QT + struct event_watch *ev=(struct event_watch *)g_hash_table_lookup(watches, (void *)fd); + dbg(1,"fd=%d ev=%p cb=%p\n", fd, ev, ev->cb); + callback_call_0(ev->cb); +#endif +} + +#ifdef QT_QPAINTER_USE_EVENT_QT +void RenderArea::timerEvent(QTimerEvent *event) +{ + int id=event->timerId(); + struct callback *cb=(struct callback *)g_hash_table_lookup(timer_callback, (void *)id); + if (cb) + callback_call_0(cb); + if (!g_hash_table_lookup(timer_type, (void *)id)) + event_qt_remove_timeout((struct event_timeout *)id); +} +#endif /* QT_QPAINTER_USE_EVENT_QT */ + diff --git a/navit/graphics/qt_qpainter/RenderArea.h b/navit/graphics/qt_qpainter/RenderArea.h new file mode 100644 index 0000000..e1f6209 --- /dev/null +++ b/navit/graphics/qt_qpainter/RenderArea.h @@ -0,0 +1,71 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ +#ifndef __RENDERAREA_H +#define __RENDERAREA_H + +#ifdef QT_QPAINTER_USE_EMBEDDING +class EmbeddedWidget : public QX11EmbedWidget { + Q_OBJECT + + struct graphics_priv *gra; +public: + EmbeddedWidget(struct graphics_priv *priv, QWidget* child, QWidget *parent = NULL); +protected: + void closeEvent(QCloseEvent *event); +}; +#endif + +class RenderArea : public QT_QPAINTER_RENDERAREA_PARENT +{ + Q_OBJECT + public: + RenderArea(struct graphics_priv *priv, QT_QPAINTER_RENDERAREA_PARENT *parent = 0, int w=800, int h=800, int overlay=0); + void do_resize(QSize size); + QPixmap *pixmap; + struct callback_list *cbl; + struct graphics_priv *gra; + +#if QT_QPAINTER_USE_EVENT_QT + GHashTable *timer_type; + GHashTable *timer_callback; + GHashTable *watches; +#endif + + void processClose(); +protected: + int is_overlay; + QSize sizeHint() const; + void paintEvent(QPaintEvent *event); + void resizeEvent(QResizeEvent *event); + void mouseEvent(int pressed, QMouseEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void wheelEvent(QWheelEvent *event); + void keyPressEvent(QKeyEvent *event); + void closeEvent(QCloseEvent *event); + bool event(QEvent *event); +#if QT_QPAINTER_USE_EVENT_QT + void timerEvent(QTimerEvent *event); +#endif + protected slots: + void watchEvent(int fd); + }; + +#endif /* __RENDERAREA_H */ diff --git a/navit/graphics/qt_qpainter/RenderArea.moc b/navit/graphics/qt_qpainter/RenderArea.moc new file mode 100644 index 0000000..21c8ad4 --- /dev/null +++ b/navit/graphics/qt_qpainter/RenderArea.moc @@ -0,0 +1,79 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'RenderArea.h' +** +** Created: +** by: The Qt Meta Object Compiler version 62 (Qt 4.7.1) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "/work/compile/navit/src/navit/graphics/qt_qpainter/RenderArea.h" +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'RenderArea.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 62 +#error "This file was generated using the moc from 4.7.1. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +static const uint qt_meta_data_RenderArea[] = { + + // content: + 5, // revision + 0, // classname + 0, 0, // classinfo + 1, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 0, // signalCount + + // slots: signature, parameters, type, tag, flags + 15, 12, 11, 11, 0x09, + + 0 // eod +}; + +static const char qt_meta_stringdata_RenderArea[] = { + "RenderArea\0\0fd\0watchEvent(int)\0" +}; + +const QMetaObject RenderArea::staticMetaObject = { + { &QT_QPAINTER_RENDERAREA_PARENT::staticMetaObject, qt_meta_stringdata_RenderArea, + qt_meta_data_RenderArea, 0 } +}; + +#ifdef Q_NO_DATA_RELOCATION +const QMetaObject &RenderArea::getStaticMetaObject() { return staticMetaObject; } +#endif //Q_NO_DATA_RELOCATION + +const QMetaObject *RenderArea::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject; +} + +void *RenderArea::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_RenderArea)) + return static_cast(const_cast< RenderArea*>(this)); + return QT_QPAINTER_RENDERAREA_PARENT::qt_metacast(_clname); +} + +int RenderArea::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QT_QPAINTER_RENDERAREA_PARENT::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + switch (_id) { + case 0: watchEvent((*reinterpret_cast< int(*)>(_a[1]))); break; + default: ; + } + _id -= 1; + } + return _id; +} +QT_END_MOC_NAMESPACE diff --git a/navit/graphics/qt_qpainter/graphics_qt_qpainter.cpp b/navit/graphics/qt_qpainter/graphics_qt_qpainter.cpp new file mode 100644 index 0000000..b6201b5 --- /dev/null +++ b/navit/graphics/qt_qpainter/graphics_qt_qpainter.cpp @@ -0,0 +1,1008 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +//############################################################################################################## +//# +//# File: graphics_qt_qpainter.cpp +//# Description: Graphics interface for internal GUI using Qt (Trolltech.com) +//# Comment: +//# Authors: Martin Schaller (04/2008), Stefan Klumpp (04/2008) +//# +//############################################################################################################## + + +#include "graphics_qt_qpainter.h" +#include "RenderArea.h" + +//############################################################################################################## +//# Description: RenderArea (QWidget) class for the main window (map, menu, ...) +//# Comment: +//# Authors: Martin Schaller (04/2008), Stefan Klumpp (04/2008) +//############################################################################################################## +static void +overlay_rect(struct graphics_priv *parent, struct graphics_priv *overlay, int clean, QRect *r) +{ + struct point p; + int w,h; + if (clean) { + p=overlay->pclean; + } else { + p=overlay->p;; + } + w=overlay->widget->pixmap->width(); + h=overlay->widget->pixmap->height(); + if (overlay->wraparound) { + if (p.x < 0) + p.x+=parent->widget->pixmap->width(); + if (p.y < 0) + p.y+=parent->widget->pixmap->height(); + if (w < 0) + w += parent->widget->pixmap->width(); + if (h < 0) + h += parent->widget->pixmap->height(); + } + r->setRect(p.x, p.y, w, h); +} + +void +qt_qpainter_draw(struct graphics_priv *gr, const QRect *r, int paintev) +{ + if (!paintev) { +#ifndef QT_QPAINTER_NO_WIDGET + dbg(1,"update %d,%d %d x %d\n", r->x(), r->y(), r->width(), r->height()); + if (r->x() <= -r->width()) + return; + if (r->y() <= -r->height()) + return; + if (r->x() > gr->widget->pixmap->width()) + return; + if (r->y() > gr->widget->pixmap->height()) + return; + dbg(1,"update valid %d,%d %dx%d\n", r->x(), r->y(), r->width(), r->height()); + gr->widget->update(*r); +#endif + return; + } + QPixmap pixmap(r->width(),r->height()); + QPainter painter(&pixmap); + struct graphics_priv *overlay=NULL; + if (! gr->overlay_disable) + overlay=gr->overlays; + if ((gr->p.x || gr->p.y) && gr->background_gc) { + painter.setPen(*gr->background_gc->pen); + painter.fillRect(0, 0, gr->widget->pixmap->width(), gr->widget->pixmap->height(), *gr->background_gc->brush); + } + painter.drawPixmap(QPoint(gr->p.x,gr->p.y), *gr->widget->pixmap, *r); + while (overlay) { + QRect ovr; + overlay_rect(gr, overlay, 0, &ovr); + if (!overlay->overlay_disable && r->intersects(ovr)) { + unsigned char *data; + int i,size=ovr.width()*ovr.height(); +#if QT_VERSION < 0x040000 + QImage img=overlay->widget->pixmap->convertToImage(); + img.setAlphaBuffer(1); +#else + QImage img=overlay->widget->pixmap->toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied); +#endif + data=img.bits(); + for (i = 0 ; i < size ; i++) { + if (data[0] == overlay->rgba[0] && data[1] == overlay->rgba[1] && data[2] == overlay->rgba[2]) + data[3]=overlay->rgba[3]; + data+=4; + } +#if QT_VERSION < 0x040000 + painter.drawImage(QPoint(ovr.x()-r->x(),ovr.y()-r->y()), img, 0); +#else + painter.drawImage(QPoint(ovr.x()-r->x(),ovr.y()-r->y()), img); +#endif + } + overlay=overlay->next; + } +#ifndef QT_QPAINTER_NO_WIDGET + QPainter painterw(gr->widget); + painterw.drawPixmap(r->x(), r->y(), pixmap); +#endif +} + +//############################################################################################################## +// General comments: +// ----------------- +// gr = graphics = draw area +// gc = graphics context = pen to paint on the draw area +//############################################################################################################## + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +struct graphics_font_priv { + QFont *font; +}; + + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +struct graphics_image_priv { + QPixmap *pixmap; +}; + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void graphics_destroy(struct graphics_priv *gr) +{ +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void font_destroy(struct graphics_font_priv *font) +{ + +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static struct graphics_font_methods font_methods = { + font_destroy +}; + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static struct graphics_font_priv *font_new(struct graphics_priv *gr, struct graphics_font_methods *meth, char *fontfamily, int size, int flags) +{ + struct graphics_font_priv *ret=g_new0(struct graphics_font_priv, 1); + ret->font=new QFont("Arial",size/20); + *meth=font_methods; + return ret; +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void gc_destroy(struct graphics_gc_priv *gc) +{ + delete gc->pen; + delete gc->brush; + g_free(gc); +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) +{ + gc->pen->setWidth(w); +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) +{ +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) +{ +#if QT_VERSION >= 0x040000 + QColor col(c->r >> 8, c->g >> 8, c->b >> 8 /* , c->a >> 8 */); +#else + QColor col(c->r >> 8, c->g >> 8, c->b >> 8); +#endif + gc->pen->setColor(col); + gc->brush->setColor(col); + gc->c=*c; +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void gc_set_background(struct graphics_gc_priv *gc, struct color *c) +{ +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static struct graphics_gc_methods gc_methods = { + gc_destroy, + gc_set_linewidth, + gc_set_dashes, + gc_set_foreground, + gc_set_background +}; + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) +{ + *meth=gc_methods; + struct graphics_gc_priv *ret=g_new0(struct graphics_gc_priv, 1); + ret->pen=new QPen(); + ret->brush=new QBrush(Qt::SolidPattern); + return ret; +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static struct graphics_image_priv * image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation) +{ + struct graphics_image_priv *ret; + QPixmap *cachedPixmap; + QString key(path); + + ret=g_new0(struct graphics_image_priv, 1); + + cachedPixmap=QPixmapCache::find(key); + if (!cachedPixmap) { +#ifdef HAVE_QT_SVG + if(key.endsWith(".svg", Qt::CaseInsensitive)) { + QSvgRenderer renderer(key); + if (!renderer.isValid()) { + g_free(ret); + return NULL; + } + ret->pixmap=new QPixmap(renderer.defaultSize()); + ret->pixmap->fill(Qt::transparent); + QPainter painter(ret->pixmap); + renderer.render(&painter); + + } else { + + ret->pixmap=new QPixmap(path); + + } +#else + ret->pixmap=new QPixmap(path); +#endif /* QT__VERSION */ + if (ret->pixmap->isNull()) { + g_free(ret); + return NULL; + } + + QPixmapCache::insert(key,QPixmap(*ret->pixmap)); + } else { + ret->pixmap=new QPixmap(*cachedPixmap); + } + + *w=ret->pixmap->width(); + *h=ret->pixmap->height(); + if (hot) { + hot->x=*w/2; + hot->y=*h/2; + } + + return ret; +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) +{ + int i; +#if QT_VERSION >= 0x040000 + QPolygon polygon; +#else + QPointArray polygon; +#endif + + for (i = 0 ; i < count ; i++) + polygon.putPoints(i, 1, p[i].x, p[i].y); + gr->painter->setPen(*gc->pen); + gr->painter->drawPolyline(polygon); +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) +{ + int i; +#if QT_VERSION >= 0x040000 + QPolygon polygon; +#else + QPointArray polygon; +#endif + + for (i = 0 ; i < count ; i++) + polygon.putPoints(i, 1, p[i].x, p[i].y); + gr->painter->setPen(*gc->pen); + gr->painter->setBrush(*gc->brush); + gr->painter->drawPolygon(polygon); +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) +{ + dbg(1,"gr=%p gc=%p %d,%d,%d,%d\n", gr, gc, p->x, p->y, w, h); + gr->painter->fillRect(p->x,p->y, w, h, *gc->brush); +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r) +{ + gr->painter->setPen(*gc->pen); + gr->painter->drawArc(p->x-r/2, p->y-r/2, r, r, 0, 360*16); + +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) +{ + QPainter *painter=gr->painter; +#if !QT_QPAINTER_USE_FREETYPE + QString tmp=QString::fromUtf8(text); +#ifndef QT_NO_TRANSFORMATIONS +#if QT_VERSION >= 0x040000 + QMatrix sav=gr->painter->worldMatrix(); + QMatrix m(dx/65535.0,dy/65535.0,-dy/65535.0,dx/65535.0,p->x,p->y); + painter->setWorldMatrix(m,TRUE); +#else + QWMatrix sav=gr->painter->worldMatrix(); + QWMatrix m(dx/65535.0,dy/65535.0,-dy/65535.0,dx/65535.0,p->x,p->y); + painter->setWorldMatrix(m,TRUE); +#endif + painter->setPen(*fg->pen); + painter->setFont(*font->font); + painter->drawText(0, 0, tmp); + painter->setWorldMatrix(sav); +#else + painter->setPen(*fg->pen); + painter->setFont(*font->font); + painter->drawText(p->x, p->y, tmp); +#endif +#else + struct font_freetype_text *t; + struct font_freetype_glyph *g, **gp; + struct color transparent = {0x0000, 0x0000, 0x0000, 0x0000}; + struct color *fgc=&fg->c, *bgc=&bg->c; + + int i,x,y; + + if (! font) + return; + t=gr->freetype_methods.text_new(text, (struct font_freetype_font *)font, dx, dy); + x=p->x << 6; + y=p->y << 6; + gp=t->glyph; + i=t->glyph_count; + if (bg) { + while (i-- > 0) { + g=*gp++; + if (g->w && g->h) { + unsigned char *data; +#if QT_VERSION < 0x040000 + QImage img(g->w+2, g->h+2, 32); + img.setAlphaBuffer(1); + data=img.bits(); + gr->freetype_methods.get_shadow(g,(unsigned char *)(img.jumpTable()),32,0,bgc,&transparent); +#else + QImage img(g->w+2, g->h+2, QImage::Format_ARGB32_Premultiplied); + data=img.bits(); + gr->freetype_methods.get_shadow(g,(unsigned char *)data,32,img.bytesPerLine(),bgc,&transparent); +#endif + + painter->drawImage(((x+g->x)>>6)-1, ((y+g->y)>>6)-1, img); + } + x+=g->dx; + y+=g->dy; + } + } else + bgc=&transparent; + x=p->x << 6; + y=p->y << 6; + gp=t->glyph; + i=t->glyph_count; + while (i-- > 0) { + g=*gp++; + if (g->w && g->h) { + unsigned char *data; +#if QT_VERSION < 0x040000 + QImage img(g->w, g->h, 32); + img.setAlphaBuffer(1); + data=img.bits(); + gr->freetype_methods.get_glyph(g,(unsigned char *)(img.jumpTable()),32,0,fgc,bgc,&transparent); +#else + QImage img(g->w, g->h, QImage::Format_ARGB32_Premultiplied); + data=img.bits(); + gr->freetype_methods.get_glyph(g,(unsigned char *)data,32,img.bytesPerLine(),fgc,bgc,&transparent); +#endif + painter->drawImage((x+g->x)>>6, (y+g->y)>>6, img); + } + x+=g->dx; + y+=g->dy; + } + gr->freetype_methods.text_destroy(t); +#endif +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) +{ + gr->painter->drawPixmap(p->x, p->y, *img->pixmap); +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void draw_image_warp(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, char *data) +{ +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void draw_restore(struct graphics_priv *gr, struct point *p, int w, int h) +{ +} + + +static void +draw_drag(struct graphics_priv *gr, struct point *p) +{ + if (!gr->cleanup) { + gr->pclean=gr->p; + gr->cleanup=1; + } + if (p) + gr->p=*p; + else { + gr->p.x=0; + gr->p.y=0; + } +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) +{ + gr->background_gc=gc; + gr->rgba[2]=gc->c.r >> 8; + gr->rgba[1]=gc->c.g >> 8; + gr->rgba[0]=gc->c.b >> 8; + gr->rgba[3]=gc->c.a >> 8; +} + + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) +{ + dbg(1,"mode for %p %d\n", gr, mode); + QRect r; + if (mode == draw_mode_begin) { +#if QT_VERSION >= 0x040000 + if (gr->widget->pixmap->paintingActive()) { + gr->widget->pixmap->paintEngine()->painter()->end(); + } +#endif + gr->painter->begin(gr->widget->pixmap); +#if 0 + gr->painter->fillRect(QRect(QPoint(0,0), gr->widget->size()), *gr->background_gc->brush); +#endif + } +#if QT_VERSION < 0x040000 + if (mode == draw_mode_cursor) { + gr->painter->begin(gr->widget); + } +#endif + if (mode == draw_mode_end) { +#if 0 + if (gr->mode == draw_mode_begin) { +#endif + gr->painter->end(); + if (gr->parent) { + if (gr->cleanup) { + overlay_rect(gr->parent, gr, 1, &r); + qt_qpainter_draw(gr->parent, &r, 0); + gr->cleanup=0; + } + overlay_rect(gr->parent, gr, 0, &r); + qt_qpainter_draw(gr->parent, &r, 0); + } else { + r.setRect(0, 0, gr->widget->pixmap->width(), gr->widget->pixmap->height()); + qt_qpainter_draw(gr, &r, 0); + } +#if 0 + } else { +#if QT_VERSION < 0x040000 + gr->painter->end(); +#endif + } +#endif +#if QT_VERSION >= 0x040000 + if (!gr->parent) + QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents|QEventLoop::ExcludeSocketNotifiers|QEventLoop::DeferredDeletion|QEventLoop::X11ExcludeTimers); +#endif + } +#if QT_VERSION >= 0x040000 + if (mode == draw_mode_end_lazy) { + gr->painter->end(); + } +#endif + gr->mode=mode; +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h,int alpha, int wraparound); + +static int argc=1; +static char *argv[]={(char *)"navit",NULL,NULL}; + +static int +fullscreen(struct window *win, int on) +{ +#ifndef QT_QPAINTER_NO_WIDGET + struct graphics_priv *this_=(struct graphics_priv *)win->priv; + QWidget* _outerWidget; +#ifdef QT_QPAINTER_USE_EMBEDDING + _outerWidget=(QWidget*)this_->widget->parent(); +#else + _outerWidget=this_->widget; +#endif /* QT_QPAINTER_USE_EMBEDDING */ + if (on) + _outerWidget->showFullScreen(); + else + _outerWidget->showMaximized(); +#endif + return 1; +} + +static void +disable_suspend(struct window *win) +{ +#ifdef HAVE_QPE + struct graphics_priv *this_=(struct graphics_priv *)win->priv; + this_->app->setTempScreenSaverMode(QPEApplication::DisableLightOff); +#endif +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void * get_data(struct graphics_priv *this_, const char *type) +{ + struct window *win; + QString xid; + bool ok; + + if (!strcmp(type, "resize")) { + dbg(0,"resize %d %d\n",this_->w,this_->h); + QSize size(this_->w,this_->h); + this_->widget->do_resize(size); + } + if (!strcmp(type, "qt_widget")) + return this_->widget; + if (!strcmp(type, "qt_pixmap")) + return this_->widget->pixmap; + if (!strcmp(type, "window")) { + win=g_new(struct window, 1); +#ifndef QT_QPAINTER_NO_WIDGET +#ifdef QT_QPAINTER_USE_EMBEDDING + EmbeddedWidget* _outerWidget=new EmbeddedWidget(this_,this_->widget,NULL); + xid=getenv("NAVIT_XID"); + if (xid.length()>0) { + _outerWidget->embedInto(xid.toULong(&ok,0)); + } + _outerWidget->show(); +#endif /* QT_QPAINTER_USE_EMBEDDING */ + if (this_->w && this_->h) + this_->widget->show(); + else + this_->widget->showMaximized(); +#endif /* QT_QPAINTER_NO_WIDGET */ + win->priv=this_; + win->fullscreen=fullscreen; + win->disable_suspend=disable_suspend; + return win; + } + return NULL; +} + +static void +image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) +{ + delete priv->pixmap; + g_free(priv); +} + +static void +get_text_bbox(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate) +{ + QPainter *painter=gr->painter; + QString tmp=QString::fromUtf8(text); + painter->setFont(*font->font); + QRect r=painter->boundingRect(0,0,gr->w,gr->h,0,tmp); + ret[0].x=0; + ret[0].y=-r.height(); + ret[1].x=0; + ret[1].y=0; + ret[2].x=r.width(); + ret[2].y=0; + ret[3].x=r.width(); + ret[3].y=-r.height(); +} + + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void overlay_disable(struct graphics_priv *gr, int disable) +{ + gr->overlay_disable=disable; +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static int set_attr(struct graphics_priv *gr, struct attr *attr) +{ + switch (attr->type) { + case attr_w: + gr->w=attr->u.num; + if (gr->w != 0 && gr->h != 0) { + QSize size(gr->w,gr->h); + gr->widget->do_resize(size); + } + break; + case attr_h: + gr->h=attr->u.num; + if (gr->w != 0 && gr->h != 0) { + QSize size(gr->w,gr->h); + gr->widget->do_resize(size); + } + break; + default: + return 0; + } + return 1; +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static struct graphics_methods graphics_methods = { + graphics_destroy, + draw_mode, + draw_lines, + draw_polygon, + draw_rectangle, + draw_circle, + draw_text, + draw_image, + draw_image_warp, + draw_restore, + draw_drag, + font_new, + gc_new, + background_gc, + overlay_new, + image_new, + get_data, + image_free, + get_text_bbox, + overlay_disable, + NULL, + set_attr, + +}; + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h,int alpha,int wraparound) +{ + *meth=graphics_methods; + struct graphics_priv *ret=g_new0(struct graphics_priv, 1); +#if QT_QPAINTER_USE_FREETYPE + if (gr->font_freetype_new) { + ret->font_freetype_new=gr->font_freetype_new; + gr->font_freetype_new(&ret->freetype_methods); + meth->font_new=(struct graphics_font_priv *(*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, int))ret->freetype_methods.font_new; + meth->get_text_bbox=(void (*)(struct graphics_priv*, struct graphics_font_priv*, char*, int, int, struct point*, int))ret->freetype_methods.get_text_bbox; + } +#endif + ret->widget= new RenderArea(ret,gr->widget,w,h,1); + ret->wraparound=wraparound; + ret->painter=new QPainter; + ret->p=*p; + ret->parent=gr; + ret->next=gr->overlays; + gr->overlays=ret; +#ifndef QT_QPAINTER_NO_WIDGET + ret->widget->hide(); +#endif + return ret; +} + +#if QT_QPAINTER_USE_EVENT_QT + + +static struct graphics_priv *event_gr; + +static void +event_qt_main_loop_run(void) +{ + event_gr->app->exec(); +} + +static void event_qt_main_loop_quit(void) +{ + dbg(0,"enter\n"); + exit(0); +} + +static struct event_watch * +event_qt_add_watch(void *fd, enum event_watch_cond cond, struct callback *cb) +{ + dbg(1,"enter fd=%d\n",(int)(long)fd); + struct event_watch *ret=g_new0(struct event_watch, 1); + ret->fd=fd; + ret->cb=cb; + g_hash_table_insert(event_gr->widget->watches, fd, ret); + ret->sn=new QSocketNotifier((int)(long)fd, QSocketNotifier::Read, event_gr->widget); + QObject::connect(ret->sn, SIGNAL(activated(int)), event_gr->widget, SLOT(watchEvent(int))); + return ret; +} + +static void +event_qt_remove_watch(struct event_watch *ev) +{ + g_hash_table_remove(event_gr->widget->watches, ev->fd); + delete(ev->sn); + g_free(ev); + +} + +static struct event_timeout * +event_qt_add_timeout(int timeout, int multi, struct callback *cb) +{ + int id; + id=event_gr->widget->startTimer(timeout); + g_hash_table_insert(event_gr->widget->timer_callback, (void *)id, cb); + g_hash_table_insert(event_gr->widget->timer_type, (void *)id, (void *)!!multi); + return (struct event_timeout *)id; +} + +void +event_qt_remove_timeout(struct event_timeout *ev) +{ + event_gr->widget->killTimer((int)(long)ev); + g_hash_table_remove(event_gr->widget->timer_callback, ev); + g_hash_table_remove(event_gr->widget->timer_type, ev); +} + +static struct event_idle * +event_qt_add_idle(int priority, struct callback *cb) +{ + dbg(0,"enter\n"); + return (struct event_idle *)event_qt_add_timeout(0, 1, cb); +} + +static void +event_qt_remove_idle(struct event_idle *ev) +{ + dbg(0,"enter\n"); + event_qt_remove_timeout((struct event_timeout *) ev); +} + +static void +event_qt_call_callback(struct callback_list *cb) +{ + dbg(0,"enter\n"); +} + +static struct event_methods event_qt_methods = { + event_qt_main_loop_run, + event_qt_main_loop_quit, + event_qt_add_watch, + event_qt_remove_watch, + event_qt_add_timeout, + event_qt_remove_timeout, + event_qt_add_idle, + event_qt_remove_idle, + event_qt_call_callback, +}; + +struct event_priv { +}; + +struct event_priv * +event_qt_new(struct event_methods *meth) +{ + dbg(0,"enter\n"); + *meth=event_qt_methods; + return NULL; +} +#endif + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static struct graphics_priv * graphics_qt_qpainter_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) +{ + struct graphics_priv *ret; + struct font_priv * (*font_freetype_new)(void *meth); + struct attr *attr; + + dbg(0,"enter\n"); +#if QT_QPAINTER_USE_EVENT_QT + if (event_gr) + return NULL; + if (! event_request_system("qt","graphics_qt_qpainter_new")) + return NULL; +#endif +#if QT_QPAINTER_USE_EVENT_GLIB + if (! event_request_system("glib","graphics_qt_qpainter_new")) + return NULL; +#endif +#if QT_QPAINTER_USE_FREETYPE + font_freetype_new=(struct font_priv *(*)(void *))plugin_get_font_type("freetype"); + if (!font_freetype_new) { + dbg(0,"no freetype\n"); + return NULL; + } +#endif + ret=g_new0(struct graphics_priv, 1); + *meth=graphics_methods; + ret->nav=nav; +#if QT_QPAINTER_USE_FREETYPE + ret->font_freetype_new=font_freetype_new; + font_freetype_new(&ret->freetype_methods); + meth->font_new=(struct graphics_font_priv *(*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, int))ret->freetype_methods.font_new; + meth->get_text_bbox=(void (*)(struct graphics_priv*, struct graphics_font_priv*, char*, int, int, struct point*, int))ret->freetype_methods.get_text_bbox; +#endif + +#if QT_QPAINTER_USE_EMBEDDING && QT_VERSION >= 0x040500 + if ((attr=attr_search(attrs, NULL, attr_gc_type))) + QApplication::setGraphicsSystem(attr->u.str); + else + QApplication::setGraphicsSystem("raster"); +#endif + if ((attr=attr_search(attrs, NULL, attr_flags))) + ret->flags=attr->u.num; + if (ret->flags & 1) { + argv[1]="-qws"; + argc++; + } +#ifndef QT_QPAINTER_NO_APP +#ifdef HAVE_QPE + ret->app = new QPEApplication(argc, argv); +#else + ret->app = new QApplication(argc, argv); +#endif +#endif + ret->widget= new RenderArea(ret); + ret->widget->cbl=cbl; + ret->painter = new QPainter; +#if QT_QPAINTER_USE_EVENT_QT + event_gr=ret; +#endif + ret->w=800; + ret->h=600; + if ((attr=attr_search(attrs, NULL, attr_w))) + ret->w=attr->u.num; + if ((attr=attr_search(attrs, NULL, attr_h))) + ret->h=attr->u.num; + + dbg(0,"return\n"); + return ret; +} + + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +void plugin_init(void) +{ + plugin_register_graphics_type("qt_qpainter", graphics_qt_qpainter_new); +#if QT_QPAINTER_USE_EVENT_QT + plugin_register_event_type("qt", event_qt_new); +#endif +} + + + + +// *** EOF *** diff --git a/navit/graphics/qt_qpainter/graphics_qt_qpainter.h b/navit/graphics/qt_qpainter/graphics_qt_qpainter.h new file mode 100644 index 0000000..7b784bd --- /dev/null +++ b/navit/graphics/qt_qpainter/graphics_qt_qpainter.h @@ -0,0 +1,156 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ +#ifndef __GRAPHICS_QT_QPAINTER_H +#define __GRAPHICS_QT_QPAINTER_H + +#include +#include +#include +#include "config.h" +#include "navit/point.h" +#include "navit/item.h" +#include "navit/graphics.h" +#include "navit/color.h" +#include "navit/debug.h" +#include "navit/plugin.h" +#include "navit/callback.h" +#include "navit/event.h" +#include "navit/window.h" +#include "navit/keys.h" +#include "navit/navit.h" + +#include + +#ifndef QT_QPAINTER_USE_FREETYPE +#define QT_QPAINTER_USE_FREETYPE 1 +#endif + +#if QT_QPAINTER_USE_FREETYPE +#include "navit/font/freetype/font_freetype.h" +#endif + +#if QT_VERSION < 0x040000 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_QPE +#include +#endif +#ifndef QT_QPAINTER_USE_EVENT_QT +#define QT_QPAINTER_USE_EVENT_QT 1 +#endif +#else +#include +#include +#if QT_VERSION >= 0x040200 +#include +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_QT_SVG +#include +#endif + +#ifndef QT_QPAINTER_USE_EVENT_GLIB +#define QT_QPAINTER_USE_EVENT_GLIB 1 +#endif + +#ifdef Q_WS_X11 +#ifndef QT_QPAINTER_USE_EMBEDDING +#define QT_QPAINTER_USE_EMBEDDING 1 +#endif +#endif + +#endif + +#if QT_QPAINTER_USE_EMBEDDING +#include +#endif + +#ifndef QT_QPAINTER_RENDERAREA_PARENT +#define QT_QPAINTER_RENDERAREA_PARENT QWidget +#endif + +class RenderArea; + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +struct graphics_gc_priv { + QPen *pen; + QBrush *brush; + struct color c; +}; + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +struct graphics_priv { +#ifdef HAVE_QPE + QPEApplication *app; +#else + QApplication *app; +#endif + RenderArea *widget; + QPainter *painter; + struct graphics_gc_priv *background_gc; + unsigned char rgba[4]; + enum draw_mode_num mode; + struct graphics_priv *parent,*overlays,*next; + struct point p,pclean; + int cleanup; + int overlay_disable; + int wraparound; +#if QT_QPAINTER_USE_FREETYPE + struct font_priv * (*font_freetype_new)(void *meth); + struct font_freetype_methods freetype_methods; +#endif + int w,h,flags; + struct navit* nav; +}; + +void qt_qpainter_draw(struct graphics_priv *gr, const QRect *r, int paintev); +struct event_watch { + QSocketNotifier *sn; + struct callback *cb; + void *fd; +}; + +void event_qt_remove_timeout(struct event_timeout *ev); + +#endif /* __GRAPHICS_QT_QPAINTER_H */ diff --git a/navit/graphics/sdl/Makefile.am b/navit/graphics/sdl/Makefile.am new file mode 100644 index 0000000..1c9b405 --- /dev/null +++ b/navit/graphics/sdl/Makefile.am @@ -0,0 +1,5 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ @SDL_CFLAGS@ @FREETYPE2_CFLAGS@ @LIBPDL_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=graphics_sdl +modulegraphics_LTLIBRARIES = libgraphics_sdl.la +libgraphics_sdl_la_SOURCES = graphics_sdl.c raster.c raster.h +libgraphics_sdl_la_LDFLAGS = @SDL_LIBS@ @SDL_IMAGE_LIBS@ @FREETYPE2_LIBS@ @LIBPDL_LIBS@ -module -avoid-version diff --git a/navit/graphics/sdl/Makefile.in b/navit/graphics/sdl/Makefile.in new file mode 100644 index 0000000..f1b6b19 --- /dev/null +++ b/navit/graphics/sdl/Makefile.in @@ -0,0 +1,692 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/graphics/sdl +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulegraphicsdir)" +LTLIBRARIES = $(modulegraphics_LTLIBRARIES) +libgraphics_sdl_la_LIBADD = +am_libgraphics_sdl_la_OBJECTS = graphics_sdl.lo raster.lo +libgraphics_sdl_la_OBJECTS = $(am_libgraphics_sdl_la_OBJECTS) +libgraphics_sdl_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libgraphics_sdl_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libgraphics_sdl_la_SOURCES) +DIST_SOURCES = $(libgraphics_sdl_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ @SDL_CFLAGS@ @FREETYPE2_CFLAGS@ @LIBPDL_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=graphics_sdl +modulegraphics_LTLIBRARIES = libgraphics_sdl.la +libgraphics_sdl_la_SOURCES = graphics_sdl.c raster.c raster.h +libgraphics_sdl_la_LDFLAGS = @SDL_LIBS@ @SDL_IMAGE_LIBS@ @FREETYPE2_LIBS@ @LIBPDL_LIBS@ -module -avoid-version +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/graphics/sdl/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/graphics/sdl/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulegraphicsLTLIBRARIES: $(modulegraphics_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulegraphicsdir)" || $(MKDIR_P) "$(DESTDIR)$(modulegraphicsdir)" + @list='$(modulegraphics_LTLIBRARIES)'; test -n "$(modulegraphicsdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulegraphicsdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulegraphicsdir)"; \ + } + +uninstall-modulegraphicsLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulegraphics_LTLIBRARIES)'; test -n "$(modulegraphicsdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulegraphicsdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulegraphicsdir)/$$f"; \ + done + +clean-modulegraphicsLTLIBRARIES: + -test -z "$(modulegraphics_LTLIBRARIES)" || rm -f $(modulegraphics_LTLIBRARIES) + @list='$(modulegraphics_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgraphics_sdl.la: $(libgraphics_sdl_la_OBJECTS) $(libgraphics_sdl_la_DEPENDENCIES) + $(libgraphics_sdl_la_LINK) -rpath $(modulegraphicsdir) $(libgraphics_sdl_la_OBJECTS) $(libgraphics_sdl_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphics_sdl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/raster.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulegraphicsdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulegraphicsLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulegraphicsLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulegraphicsLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulegraphicsLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-modulegraphicsLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am \ + uninstall-modulegraphicsLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/graphics/sdl/graphics_sdl.c b/navit/graphics/sdl/graphics_sdl.c new file mode 100644 index 0000000..e1907e3 --- /dev/null +++ b/navit/graphics/sdl/graphics_sdl.c @@ -0,0 +1,2601 @@ +/* graphics_sdl.c -- barebones sdl graphics layer + + copyright (c) 2008 bryan rittmeyer + license: GPLv2 + + TODO: + - dashed lines + - ifdef DEBUG -> dbg() + - proper image transparency (libsdl-image xpm does not work) + - valgrind + + revision history: + 2008-06-01 initial + 2008-06-15 SDL_DOUBLEBUF+SDL_Flip for linux fb. fix FT leaks. + 2008-06-18 defer initial resize_callback + 2008-06-21 linux touchscreen + 2008-07-04 custom rastering +*/ + +#include +#include +#include +#include +#include "config.h" +#include "debug.h" +#include "point.h" +#include "graphics.h" +#include "color.h" +#include "plugin.h" +#include "window.h" +#include "navit.h" +#include "keys.h" +#include "item.h" +#include "attr.h" +#include "callback.h" +#include "font/freetype/font_freetype.h" + +#include +#include + +#ifdef USE_WEBOS +# include "vehicle.h" +# include +# define USE_WEBOS_ACCELEROMETER +#endif + +#define RASTER +#undef SDL_SGE +#undef SDL_GFX +#undef ALPHA + +#undef SDL_TTF +#define SDL_IMAGE +#undef LINUX_TOUCHSCREEN + +#ifdef USE_WEBOS +#define DISPLAY_W 0 +#define DISPLAY_H 0 +#else +#define DISPLAY_W 800 +#define DISPLAY_H 600 +#endif + + +#undef DEBUG +#undef PROFILE + +#define OVERLAY_MAX 32 + +#ifdef RASTER +#include "raster.h" +#endif + +#ifdef SDL_SGE +#include +#endif + +#ifdef SDL_GFX +#include +#endif + +#ifdef SDL_TTF +#include +#else +#include +#include FT_FREETYPE_H +#include +#endif +#include + +#ifdef SDL_IMAGE +#include +#endif + +#ifdef LINUX_TOUCHSCREEN +/* we use Linux evdev directly for the touchscreen. */ +#include +#include +#include +#include +#endif + +#include + +#ifdef PROFILE +#include +#include +#endif + + +/* TODO: union overlay + non-overlay to reduce size */ +struct graphics_priv; +struct graphics_priv { + SDL_Surface *screen; + int aa; + /* video modes */ + uint32_t video_flags; + int video_bpp; + + /* */ + int overlay_mode; + int overlay_x; + int overlay_y; + struct graphics_priv *overlay_parent; + int overlay_idx; + /* */ + + /*
*/ + struct graphics_priv *overlay_array[OVERLAY_MAX]; + int overlay_enable; + enum draw_mode_num draw_mode; + + int resize_callback_initial; + + struct navit *nav; + struct callback_list *cbl; + +#ifdef USE_WEBOS_ACCELEROMETER + SDL_Joystick *accelerometer; + char orientation; + int real_w, real_h; +#endif + +#ifdef LINUX_TOUCHSCREEN + int ts_fd; + int32_t ts_hit; + uint32_t ts_x; + uint32_t ts_y; +#endif + +#ifndef SDL_TTF + FT_Library library; +#endif + +#ifdef PROFILE + struct timeval draw_begin_tv; + unsigned long draw_time_peak; +#endif + struct font_freetype_methods freetype_methods; + /*
*/ +}; + +static int dummy; + +#ifdef USE_WEBOS +# define WEBOS_KEY_SHIFT 0x130 +# define WEBOS_KEY_SYM 0x131 +# define WEBOS_KEY_ORANGE 0x133 + +# define WEBOS_KEY_MOD_SHIFT 0x1 +# define WEBOS_KEY_MOD_ORANGE 0x2 +# define WEBOS_KEY_MOD_SYM 0x4 + +# define WEBOS_KEY_MOD_SHIFT_STICKY 0x11 +# define WEBOS_KEY_MOD_ORANGE_STICKY 0x22 +# define WEBOS_KEY_MOD_SYM_STICKY 0x44 + +# ifdef USE_WEBOS_ACCELEROMETER +# define WEBOS_ORIENTATION_PORTRAIT 0x1 +# define WEBOS_ORIENTATION_LANDSCAPE 0x2 +# endif + +# define SDL_USEREVENT_CODE_TIMER 0x1 +# define SDL_USEREVENT_CODE_CALL_CALLBACK 0x2 +# define SDL_USEREVENT_CODE_IDLE_EVENT 0x4 +# define SDL_USEREVENT_CODE_WATCH 0x8 +# ifdef USE_WEBOS_ACCELEROMETER +# define SDL_USEREVENT_CODE_ROTATE 0xA +# endif + +struct event_timeout { + SDL_TimerID id; + int multi; + struct callback *cb; +}; + +struct idle_task { + int priority; + struct callback *cb; +}; + +struct event_watch { + struct pollfd *pfd; + struct callback *cb; +}; + +static struct graphics_priv* the_graphics = NULL; +static int quit_event_loop = 0; // quit the main event loop +static int the_graphics_count = 0; // count how many graphics objects are created +static GPtrArray *idle_tasks = NULL; +static pthread_t sdl_watch_thread = 0; +static GPtrArray *sdl_watch_list = NULL; + +static void event_sdl_watch_thread (GPtrArray *); +static void event_sdl_watch_startthread(GPtrArray *watch_list); +static void event_sdl_watch_stopthread(void); +static struct event_watch *event_sdl_add_watch(void *, enum event_watch_cond, struct callback *); +static void event_sdl_remove_watch(struct event_watch *); +static struct event_timeout *event_sdl_add_timeout(int, int, struct callback *); +static void event_sdl_remove_timeout(struct event_timeout *); +static struct event_idle *event_sdl_add_idle(int, struct callback *); +static void event_sdl_remove_idle(struct event_idle *); +static void event_sdl_call_callback(struct callback_list *); +# ifdef USE_WEBOS_ACCELEROMETER +static unsigned int sdl_orientation_count = 2^16; +static char sdl_next_orientation = 0; +# endif +#endif +unsigned char * ft_buffer = NULL; +unsigned int ft_buffer_size = 0; + +struct graphics_font_priv { +#ifdef SDL_TTF + TTF_Font *font; +#else + FT_Face face; +#endif +}; + +struct graphics_gc_priv { + struct graphics_priv *gr; + Uint8 fore_r; + Uint8 fore_g; + Uint8 fore_b; + Uint8 fore_a; + Uint8 back_r; + Uint8 back_g; + Uint8 back_b; + Uint8 back_a; + int linewidth; +}; + +struct graphics_image_priv { + SDL_Surface *img; +}; + + +#ifdef LINUX_TOUCHSCREEN +static int input_ts_exit(struct graphics_priv *gr); +#endif + +static void +graphics_destroy(struct graphics_priv *gr) +{ + dbg(1, "graphics_destroy %p %u\n", gr, gr->overlay_mode); + + if(gr->overlay_mode) + { + SDL_FreeSurface(gr->screen); + gr->overlay_parent->overlay_array[gr->overlay_idx] = NULL; + } + else + { + g_free (ft_buffer); +#ifdef SDL_TTF + TTF_Quit(); +#else + FT_Done_FreeType(gr->library); +#endif +#ifdef LINUX_TOUCHSCREEN + input_ts_exit(gr); +#endif +#ifdef USE_WEBOS_ACCELEROMETER + SDL_JoystickClose(gr->accelerometer); +#endif +#ifdef USE_WEBOS + PDL_Quit(); +#endif + SDL_Quit(); + } + + g_free(gr); +} + +/* graphics_gc */ + +static void +gc_destroy(struct graphics_gc_priv *gc) +{ + g_free(gc); +} + +static void +gc_set_linewidth(struct graphics_gc_priv *gc, int w) +{ +#ifdef DEBUG + printf("gc_set_linewidth %p %d\n", gc, w); +#endif + gc->linewidth = w; +} + +static void +gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) +{ + /* TODO */ +} + +static void +gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) +{ +#ifdef DEBUG + printf("gc_set_foreground: %p %d %d %d %d\n", gc, c->a, c->r, c->g, c->b); +#endif + gc->fore_r = c->r/256; + gc->fore_g = c->g/256; + gc->fore_b = c->b/256; + gc->fore_a = c->a/256; +} + +static void +gc_set_background(struct graphics_gc_priv *gc, struct color *c) +{ +#ifdef DEBUG + printf("gc_set_background: %p %d %d %d %d\n", gc, c->a, c->r, c->g, c->b); +#endif + gc->back_r = c->r/256; + gc->back_g = c->g/256; + gc->back_b = c->b/256; + gc->back_a = c->a/256; +} + +static struct graphics_gc_methods gc_methods = { + gc_destroy, + gc_set_linewidth, + gc_set_dashes, + gc_set_foreground, + gc_set_background +}; + +static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) +{ + struct graphics_gc_priv *gc=g_new0(struct graphics_gc_priv, 1); + *meth=gc_methods; + gc->gr=gr; + gc->linewidth=1; /* upper layer should override anyway? */ + return gc; +} + + +#if 0 /* unused by core? */ +static void image_destroy(struct graphics_image_priv *gi) +{ +#ifdef SDL_IMAGE + SDL_FreeSurface(gi->img); + g_free(gi); +#endif +} + +static struct graphics_image_methods gi_methods = +{ + image_destroy +}; +#endif + +static struct graphics_image_priv * +image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *name, int *w, int *h, + struct point *hot, int rotation) +{ +#ifdef SDL_IMAGE + struct graphics_image_priv *gi; + + /* FIXME: meth is not used yet.. so gi leaks. at least xpm is small */ + + gi = g_new0(struct graphics_image_priv, 1); + gi->img = IMG_Load(name); + if(gi->img) + { + /* TBD: improves blit performance? */ +#if !SDL_VERSION_ATLEAST(1,3,0) + SDL_SetColorKey(gi->img, SDL_RLEACCEL, gi->img->format->colorkey); +#endif + *w=gi->img->w; + *h=gi->img->h; + hot->x=*w/2; + hot->y=*h/2; + } + else + { + /* TODO: debug "colour parse errors" on xpm */ + dbg(0,"image_new on '%s' failed: %s\n", name, IMG_GetError()); + g_free(gi); + gi = NULL; + } + + return gi; +#else + return NULL; +#endif +} + +static void +image_free(struct graphics_priv *gr, struct graphics_image_priv * gi) +{ +#ifdef SDL_IMAGE + SDL_FreeSurface(gi->img); + g_free(gi); +#endif +} + +static void +get_text_bbox(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate) +{ + char *p=text; + FT_BBox bbox; + FT_UInt glyph_index; + FT_GlyphSlot slot = font->face->glyph; // a small shortcut + FT_Glyph glyph; + FT_Matrix matrix; + FT_Vector pen; + pen.x = 0 * 64; + pen.y = 0 * 64; + matrix.xx = dx; + matrix.xy = dy; + matrix.yx = -dy; + matrix.yy = dx; + int n,len,x=0,y=0; + + bbox.xMin = bbox.yMin = 32000; + bbox.xMax = bbox.yMax = -32000; + FT_Set_Transform( font->face, &matrix, &pen ); + len=g_utf8_strlen(text, -1); + for ( n = 0; n < len; n++ ) { + FT_BBox glyph_bbox; + glyph_index = FT_Get_Char_Index(font->face, g_utf8_get_char(p)); + p=g_utf8_next_char(p); + FT_Load_Glyph(font->face, glyph_index, FT_LOAD_DEFAULT ); + FT_Get_Glyph(font->face->glyph, &glyph); + FT_Glyph_Get_CBox(glyph, ft_glyph_bbox_pixels, &glyph_bbox ); + FT_Done_Glyph(glyph); + glyph_bbox.xMin += x >> 6; + glyph_bbox.xMax += x >> 6; + glyph_bbox.yMin += y >> 6; + glyph_bbox.yMax += y >> 6; + x += slot->advance.x; + y -= slot->advance.y; + if ( glyph_bbox.xMin < bbox.xMin ) + bbox.xMin = glyph_bbox.xMin; + if ( glyph_bbox.yMin < bbox.yMin ) + bbox.yMin = glyph_bbox.yMin; + if ( glyph_bbox.xMax > bbox.xMax ) + bbox.xMax = glyph_bbox.xMax; + if ( glyph_bbox.yMax > bbox.yMax ) + bbox.yMax = glyph_bbox.yMax; + } + if ( bbox.xMin > bbox.xMax ) { + bbox.xMin = 0; + bbox.yMin = 0; + bbox.xMax = 0; + bbox.yMax = 0; + } + ret[0].x=bbox.xMin; + ret[0].y=-bbox.yMin; + ret[1].x=bbox.xMin; + ret[1].y=-bbox.yMax; + ret[2].x=bbox.xMax; + ret[2].y=-bbox.yMax; + ret[3].x=bbox.xMax; + ret[3].y=-bbox.yMin; +} + +static void +draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) +{ + if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) + { + return; + } + + Sint16 *vx, *vy; + Sint16 x, y; + int i; + + vx = alloca(count * sizeof(Sint16)); + vy = alloca(count * sizeof(Sint16)); + + for(i = 0; i < count; i++) + { + x = (Sint16)p[i].x; + y = (Sint16)p[i].y; + +#if 0 + if(x < 0) + { + x = 0; + } + if(y < 0) + { + y = 0; + } +#endif + + vx[i] = x; + vy[i] = y; + +#ifdef DEBUG + printf("draw_polygon: %p %i %d,%d\n", gc, i, p[i].x, p[i].y); +#endif + } + +#ifdef RASTER + if(gr->aa) + { + raster_aapolygon(gr->screen, count, vx, vy, + SDL_MapRGBA(gr->screen->format, + gc->fore_r, + gc->fore_g, + gc->fore_b, + gc->fore_a)); + } + else + { + raster_polygon(gr->screen, count, vx, vy, + SDL_MapRGBA(gr->screen->format, + gc->fore_r, + gc->fore_g, + gc->fore_b, + gc->fore_a)); + } +#else +# ifdef SDL_SGE +# ifdef ALPHA + sge_FilledPolygonAlpha(gr->screen, count, vx, vy, + SDL_MapRGB(gr->screen->format, + gc->fore_r, + gc->fore_g, + gc->fore_b), + gc->fore_a); +# else +# ifdef ANTI_ALIAS + sge_AAFilledPolygon(gr->screen, count, vx, vy, + SDL_MapRGB(gr->screen->format, + gc->fore_r, + gc->fore_g, + gc->fore_b)); +# else + sge_FilledPolygon(gr->screen, count, vx, vy, + SDL_MapRGB(gr->screen->format, + gc->fore_r, + gc->fore_g, + gc->fore_b)); +# endif +# endif +# else + filledPolygonRGBA(gr->screen, vx, vy, count, + gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a); +# endif +#endif +} + + + +static void +draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) +{ + if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) + { + return; + } + +#ifdef DEBUG + printf("draw_rectangle: %d %d %d %d r=%d g=%d b=%d a=%d\n", p->x, p->y, w, h, + gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a); +#endif + if(w > gr->screen->w) + { + w = gr->screen->w; + } + if(h > gr->screen->h) + { + h = gr->screen->h; + } + +#ifdef RASTER + raster_rect(gr->screen, p->x, p->y, w, h, + SDL_MapRGBA(gr->screen->format, + gc->fore_r, + gc->fore_g, + gc->fore_b, + gc->fore_a)); +#else +# ifdef SDL_SGE +# ifdef ALPHA + sge_FilledRectAlpha(gr->screen, p->x, p->y, p->x + w, p->y + h, + SDL_MapRGB(gr->screen->format, + gc->fore_r, + gc->fore_g, + gc->fore_b), + gc->fore_a); +# else + /* no AA -- should use poly instead for that */ + sge_FilledRect(gr->screen, p->x, p->y, p->x + w, p->y + h, + SDL_MapRGB(gr->screen->format, + gc->fore_r, + gc->fore_g, + gc->fore_b)); +# endif +# else + boxRGBA(gr->screen, p->x, p->y, p->x + w, p->y + h, + gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a); +# endif +#endif + +} + +static void +draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r) +{ + if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) + { + return; + } + +#if 0 + if(gc->fore_a != 0xff) + { + dbg(0, "%d %d %d %u %u:%u:%u:%u\n", p->x, p->y, r, gc->linewidth, + gc->fore_a, gc->fore_r, gc->fore_g, gc->fore_b); + } +#endif + + /* FIXME: does not quite match gtk */ + + /* hack for osd compass.. why is this needed!? */ + if(gr->overlay_mode) + { + r = r / 2; + } + +#ifdef RASTER + if(gr->aa) + { + raster_aacircle(gr->screen, p->x, p->y, r, + SDL_MapRGBA(gr->screen->format, + gc->fore_r, + gc->fore_g, + gc->fore_b, + gc->fore_a)); + } + else + { + raster_circle(gr->screen, p->x, p->y, r, + SDL_MapRGBA(gr->screen->format, + gc->fore_r, + gc->fore_g, + gc->fore_b, + gc->fore_a)); + } +#else +# ifdef SDL_SGE +# ifdef ALPHA + sge_FilledCircleAlpha(gr->screen, p->x, p->y, r, + SDL_MapRGB(gr->screen->format, + gc->fore_r, gc->fore_g, gc->fore_b), + gc->fore_a); +# else +# ifdef ANTI_ALIAS + sge_AAFilledCircle(gr->screen, p->x, p->y, r, + SDL_MapRGB(gr->screen->format, + gc->fore_r, gc->fore_g, gc->fore_b)); +# else + sge_FilledCircle(gr->screen, p->x, p->y, r, + SDL_MapRGB(gr->screen->format, + gc->fore_r, gc->fore_g, gc->fore_b)); +# endif +# endif +# else +# ifdef ANTI_ALIAS + aacircleRGBA(gr->screen, p->x, p->y, r, + gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a); +# else + filledCircleRGBA(gr->screen, p->x, p->y, r, + gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a); +# endif +# endif +#endif +} + + +static void +draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) +{ + if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) + { + return; + } + + /* you might expect lines to be simpler than the other shapes. + but, that would be wrong. 1 line can generate 1 polygon + 2 circles + and even worse, we have to calculate their parameters! + go dust off your trigonometry hat. + */ +#if 0 + int i, l, x_inc, y_inc, lw; + + lw = gc->linewidth; + + for(i = 0; i < count-1; i++) + { +#ifdef DEBUG + printf("draw_lines: %p %d %d,%d->%d,%d %d\n", gc, i, p[i].x, p[i].y, p[i+1].x, p[i+1].y, gc->linewidth); +#endif + for(l = 0; l < lw; l++) + { + /* FIXME: center? */ +#if 1 + if(p[i].x != p[i+1].x) + { + x_inc = l - (lw/2); + } + else + { + x_inc = 0; + } + + if(p[i].y != p[i+1].y) + { + y_inc = l - (lw/2); + } + else + { + y_inc = 0; + } +#else + x_inc = 0; + y_inc = 0; +#endif + +#ifdef ANTI_ALIAS + aalineRGBA(gr->screen, p[i].x + x_inc, p[i].y + y_inc, p[i+1].x + x_inc, p[i+1].y + y_inc, + gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a); +#else + lineRGBA(gr->screen, p[i].x + x_inc, p[i].y + y_inc, p[i+1].x + x_inc, p[i+1].y + y_inc, + gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a); +#endif + } + } +#else + /* sort of based on graphics_opengl.c::draw_lines */ + /* FIXME: should honor ./configure flag for no fp. + this could be 100% integer code pretty easily, + except that i am lazy + */ + struct point vert[4]; + int lw = gc->linewidth; + //int lw = 1; + int i; + + for(i = 0; i < count-1; i++) + { + float dx=p[i+1].x-p[i].x; + float dy=p[i+1].y-p[i].y; + +#if 0 + float cx=(p[i+1].x+p[i].x)/2; + float cy=(p[i+1].y+p[i].y)/2; +#endif + + float angle; + + int x_lw_adj, y_lw_adj; + + if(lw == 1) + { +#ifdef RASTER + if(gr->aa) + { + raster_aaline(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y, + SDL_MapRGBA(gr->screen->format, + gc->fore_r, + gc->fore_g, + gc->fore_b, + gc->fore_a)); + } + else + { + raster_line(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y, + SDL_MapRGBA(gr->screen->format, + gc->fore_r, + gc->fore_g, + gc->fore_b, + gc->fore_a)); + } +#else +# ifdef SDL_SGE +# ifdef ALPHA + sge_LineAlpha(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y, + SDL_MapRGB(gr->screen->format, + gc->fore_r, gc->fore_g, gc->fore_b), + gc->fore_a); +# else +# ifdef ANTI_ALIAS + sge_AALine(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y, + SDL_MapRGB(gr->screen->format, + gc->fore_r, gc->fore_g, gc->fore_b)); +# else + sge_Line(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y, + SDL_MapRGB(gr->screen->format, + gc->fore_r, gc->fore_g, gc->fore_b)); +# endif +# endif +# else +# ifdef ANTI_ALIAS + aalineRGBA(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y, + gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a); +# else + lineRGBA(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y, + gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a); +# endif +# endif +#endif + } + else + { + /* there is probably a much simpler way but this works ok */ + + /* FIXME: float + double mixture */ + /* FIXME: lrint(round())? */ + if(dy == 0.0) + { + angle = 0.0; + x_lw_adj = 0; + y_lw_adj = round((float)lw/2.0); + } + else if(dx == 0.0) + { + angle = 0.0; + x_lw_adj = round((float)lw/2.0); + y_lw_adj = 0; + } + else + { + angle = (M_PI/2.0) - atan(abs(dx)/abs(dy)); + x_lw_adj = round(sin(angle)*(float)lw/2.0); + y_lw_adj = round(cos(angle)*(float)lw/2.0); + if((x_lw_adj < 0) || (y_lw_adj < 0)) + { + printf("i=%d\n", i); + printf(" %d,%d->%d,%d\n", p[i].x, p[i].y, p[i+1].x, p[i+1].y); + printf(" lw=%d angle=%f\n", lw, 180.0 * angle / M_PI); + printf(" x_lw_adj=%d y_lw_adj=%d\n", x_lw_adj, y_lw_adj); + } + } + + if(p[i+1].x > p[i].x) + { + x_lw_adj = -x_lw_adj; + } + if(p[i+1].y > p[i].y) + { + y_lw_adj = -y_lw_adj; + } + +#if 0 + if(((y_lw_adj*y_lw_adj)+(x_lw_adj*x_lw_adj)) != (lw/2)*(lw/2)) + { + printf("i=%d\n", i); + printf(" %d,%d->%d,%d\n", p[i].x, p[i].y, p[i+1].x, p[i+1].y); + printf(" lw=%d angle=%f\n", lw, 180.0 * angle / M_PI); + printf(" x_lw_adj=%d y_lw_adj=%d\n", x_lw_adj, y_lw_adj); + } +#endif + + /* FIXME: draw a circle/square if p[i]==p[i+1]? */ + /* FIXME: clipping, check for neg values. hoping sdl-gfx does this */ + vert[0].x = p[i].x + x_lw_adj; + vert[0].y = p[i].y - y_lw_adj; + vert[1].x = p[i].x - x_lw_adj; + vert[1].y = p[i].y + y_lw_adj; + vert[2].x = p[i+1].x - x_lw_adj; + vert[2].y = p[i+1].y + y_lw_adj; + vert[3].x = p[i+1].x + x_lw_adj; + vert[3].y = p[i+1].y - y_lw_adj; + + draw_polygon(gr, gc, vert, 4); + + /* draw small circles at the ends. this looks better than nothing, and slightly + * better than the triangle used by graphics_opengl, but is more expensive. + * should have an ifdef/xml attr? + */ + + /* FIXME: should just draw a half circle */ + + /* now some circular endcaps, if the width is over 2 */ + if(lw > 2) + { + if(i == 0) + { + draw_circle(gr, gc, &p[i], lw/2); + } + /* we truncate on the divide on purpose, so we don't go outside the line */ + draw_circle(gr, gc, &p[i+1], lw/2); + } + } + } +#endif +} + + +static void +set_pixel(SDL_Surface *surface, int x, int y, Uint8 r2, Uint8 g2, Uint8 b2, Uint8 a2) +{ + if(x<0 || y<0 || x>=surface->w || y>=surface->h) { + return; + } + + void *target_pixel = ((Uint8*)surface->pixels + y * surface->pitch + x * surface->format->BytesPerPixel); + + Uint8 r1,g1,b1,a1; + + switch(surface->format->BytesPerPixel) { + case 2: + { + SDL_GetRGBA(*(Uint16 *)target_pixel, surface->format, &r1, &g1, &b1, &a1); + *(Uint16 *)target_pixel = SDL_MapRGBA(surface->format, + (r1*(0xff-a2)/0xff) + (r2*a2/0xff), + (g1*(0xff-a2)/0xff) + (g2*a2/0xff), + (b1*(0xff-a2)/0xff) + (b2*a2/0xff), + a2 + a1*(0xff-a2)/0xff ); + break; + } + case 4: + { + SDL_GetRGBA(*(Uint32 *)target_pixel, surface->format, &r1, &g1, &b1, &a1); + *(Uint32 *)target_pixel = SDL_MapRGBA(surface->format, + (r1*(0xff-a2)/0xff) + (r2*a2/0xff), + (g1*(0xff-a2)/0xff) + (g2*a2/0xff), + (b1*(0xff-a2)/0xff) + (b2*a2/0xff), + a2 + a1*(0xff-a2)/0xff ); + break; + } + } +} + + +static void +resize_ft_buffer (unsigned int new_size) +{ + if (new_size > ft_buffer_size) { + g_free (ft_buffer); + ft_buffer = g_malloc (new_size); + dbg(1, "old_size(%i) new_size(%i) ft_buffer(%i)\n", ft_buffer_size, new_size, ft_buffer); + ft_buffer_size = new_size; + } +} + +static void +display_text_draw(struct font_freetype_text *text, + struct graphics_priv *gr, struct graphics_gc_priv *fg, + struct graphics_gc_priv *bg, int color, struct point *p) +{ + int i, x, y, stride; + struct font_freetype_glyph *g, **gp; + struct color transparent = { 0x0000, 0x0000, 0x0000, 0x0000 }; + struct color black = { fg->fore_r * 255, fg->fore_g * 255, + fg->fore_b * 255, fg->fore_a * 255 }; + struct color white = { 0xffff, 0xffff, 0xffff, 0xffff }; + + if (bg) { + if (COLOR_IS_WHITE(black) && COLOR_IS_BLACK(white)) { + black.r = 65535; + black.g = 65535; + black.b = 65535; + black.a = 65535; + + white.r = 0; + white.g = 0; + white.b = 0; + white.a = 65535; + } else if (COLOR_IS_BLACK(black) && COLOR_IS_WHITE(white)) { + white.r = 65535; + white.g = 65535; + white.b = 65535; + white.a = 65535; + + black.r = 0; + black.g = 0; + black.b = 0; + black.a = 65535; + } else { + white.r = bg->fore_r * 255; + white.g = bg->fore_g * 255; + white.b = bg->fore_b * 255; + white.a = bg->fore_a * 255; + } + } else { + white.r = 0; + white.g = 0; + white.b = 0; + white.a = 0; + } + + + gp = text->glyph; + i = text->glyph_count; + x = p->x << 6; + y = p->y << 6; + while (i-- > 0) { + g = *gp++; + if (g->w && g->h && bg) { + stride = (g->w + 2) * 4; + if (color) { + resize_ft_buffer(stride * (g->h + 2)); + gr->freetype_methods.get_shadow(g, ft_buffer, 32, stride, &white, &transparent); + + SDL_Surface *glyph_surface = + SDL_CreateRGBSurfaceFrom(ft_buffer, g->w + 2, g->h + 2, + 32, + stride, + 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000); + if (glyph_surface) { + SDL_Rect r; + r.x = (x + g->x) >> 6; + r.y = (y + g->y) >> 6; + r.w = g->w + 2; + r.h = g->h + 2; + + SDL_BlitSurface(glyph_surface, NULL, gr->screen, &r); + SDL_FreeSurface(glyph_surface); + } + } + } + x += g->dx; + y += g->dy; + } + + gp = text->glyph; + i = text->glyph_count; + x = p->x << 6; + y = p->y << 6; + while (i-- > 0) { + g = *gp++; + if (g->w && g->h) { + if (color) { + stride = g->w; + if (bg) { + resize_ft_buffer(stride * g->h * 4); + gr->freetype_methods.get_glyph(g, ft_buffer, 32, + stride * 4, &black, + &white, &transparent); + SDL_Surface *glyph_surface = + SDL_CreateRGBSurfaceFrom(ft_buffer, g->w, g->h, 32, + stride * 4, + 0x000000ff,0x0000ff00, 0x00ff0000,0xff000000); + if (glyph_surface) { + SDL_Rect r; + r.x = (x + g->x) >> 6; + r.y = (y + g->y) >> 6; + r.w = g->w; + r.h = g->h; + + SDL_BlitSurface(glyph_surface, NULL, gr->screen,&r); + SDL_FreeSurface(glyph_surface); + } + } + stride *= 4; + resize_ft_buffer(stride * g->h); + gr->freetype_methods.get_glyph(g, ft_buffer, 32, stride, + &black, &white, + &transparent); + int ii, jj; + unsigned char* pGlyph = ft_buffer; + for (jj = 0; jj < g->h; ++jj) { + for (ii = 0; ii < g->w; ++ii) { + if(*(pGlyph+3) > 0) { + set_pixel(gr->screen, + ii+((x + g->x) >> 6), + jj+((y + g->y) >> 6), + *(pGlyph+2), // Pixels are in BGRA format + *(pGlyph+1), + *(pGlyph+0), + *(pGlyph+3) + ); + } + pGlyph += 4; + } + } + } + } + x += g->dx; + y += g->dy; + } +} + +static void +draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, + struct graphics_gc_priv *bg, struct graphics_font_priv *font, + char *text, struct point *p, int dx, int dy) +{ + if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) + || (gr->overlay_parent && gr->overlay_parent->overlay_enable + && !gr->overlay_enable)) { + return; + } + + struct font_freetype_text *t; + int color = 1; + + if (!font) { + dbg(0, "no font, returning\n"); + return; + } + t = gr->freetype_methods.text_new(text, + (struct font_freetype_font *) font, + dx, dy); + + struct point p_eff; + p_eff.x = p->x; + p_eff.y = p->y; + + display_text_draw(t, gr, fg, bg, color, &p_eff); + gr->freetype_methods.text_destroy(t); +} + +static void +draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) +{ + if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) + { + return; + } + +#ifdef SDL_IMAGE + SDL_Rect r; + + r.x = p->x; + r.y = p->y; + r.w = img->img->w; + r.h = img->img->h; + + SDL_BlitSurface(img->img, NULL, gr->screen, &r); +#endif +} + +static void +draw_image_warp(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, char *data) +{ + /* TODO */ +} + +static void +draw_restore(struct graphics_priv *gr, struct point *p, int w, int h) +{ +#ifdef DEBUG + printf("draw_restore\n"); +#endif +} + +static void +background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) +{ +#ifdef DEBUG + printf("background_gc\n"); +#endif +} + + +static void +draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) +{ +#ifdef PROFILE + struct timeval now; + unsigned long elapsed; +#endif + struct graphics_priv *ov; + SDL_Rect rect; + int i; + + if(gr->overlay_mode) + { + /* will be drawn below */ + } + else + { +#ifdef DEBUG + printf("draw_mode: %d\n", mode); +#endif + +#ifdef PROFILE + if(mode == draw_mode_begin) + { + gettimeofday(&gr->draw_begin_tv, NULL); + } +#endif + + if(mode == draw_mode_end) + { + if((gr->draw_mode == draw_mode_begin) && gr->overlay_enable) + { + for(i = 0; i < OVERLAY_MAX; i++) + { + ov = gr->overlay_array[i]; + if(ov && ov->overlay_enable) + { + rect.x = ov->overlay_x; + if(rect.x<0) rect.x += gr->screen->w; + rect.y = ov->overlay_y; + if(rect.y<0) rect.y += gr->screen->h; + rect.w = ov->screen->w; + rect.h = ov->screen->h; + SDL_BlitSurface(ov->screen, NULL, + gr->screen, &rect); + } + } + } + + SDL_Flip(gr->screen); + +#ifdef PROFILE + gettimeofday(&now, NULL); + elapsed = 1000000 * (now.tv_sec - gr->draw_begin_tv.tv_sec); + elapsed += (now.tv_usec - gr->draw_begin_tv.tv_usec); + if(elapsed >= gr->draw_time_peak) + { + dbg(0, "draw elapsed %u usec\n", elapsed); + gr->draw_time_peak = elapsed; + } +#endif + } + + gr->draw_mode = mode; + } +} + +static void overlay_disable(struct graphics_priv *gr, int disable) +{ + gr->overlay_enable = !disable; + struct graphics_priv *curr_gr = gr; + if(gr->overlay_parent) { + curr_gr = gr->overlay_parent; + } + draw_mode(curr_gr,draw_mode_end); +} + +static struct graphics_priv * +overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound); + +static int window_fullscreen(struct window *win, int on) +{ + struct graphics_priv *gr=(struct graphics_priv *)win->priv; + + /* Update video flags */ + if(on) { + gr->video_flags |= SDL_FULLSCREEN; + } else { + gr->video_flags &= ~SDL_FULLSCREEN; + } + + /* Update video mode */ + gr->screen = SDL_SetVideoMode(gr->screen->w, gr->screen->h, gr->video_bpp, gr->video_flags); + if(gr->screen == NULL) { + navit_destroy(gr->nav); + } + else { + callback_list_call_attr_2(gr->cbl, attr_resize, (void *)gr->screen->w, (void *)gr->screen->h); + } + return 1; +} + +static void * +get_data(struct graphics_priv *this, char const *type) +{ + if(strcmp(type, "window") == 0) { + struct window *win; + win=g_new(struct window, 1); + win->priv=this; + win->fullscreen=window_fullscreen; + win->disable_suspend=NULL; + return win; + } else { + return &dummy; + } +} + +static void draw_drag(struct graphics_priv *gr, struct point *p) +{ + if(p) { + gr->overlay_x = p->x; + gr->overlay_y = p->y; + } +} + +static struct graphics_methods graphics_methods = { + graphics_destroy, + draw_mode, + draw_lines, + draw_polygon, + draw_rectangle, + NULL /*draw_circle*/, + draw_text, + draw_image, + draw_image_warp, + draw_restore, + draw_drag, + NULL, + gc_new, + background_gc, + overlay_new, + image_new, + get_data, + image_free, + get_text_bbox, + overlay_disable, +}; + +static struct graphics_priv * +overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h,int alpha, int wraparound) +{ + struct graphics_priv *ov; + Uint32 rmask, gmask, bmask, amask; + int i; + + for(i = 0; i < OVERLAY_MAX; i++) + { + if(gr->overlay_array[i] == NULL) + { + break; + } + } + if(i == OVERLAY_MAX) + { + dbg(0, "too many overlays! increase OVERLAY_MAX\n"); + return NULL; + } + + dbg(1, "overlay_new %d %d %d %u %u (%x, %x, %x ,%x, %d)\n", i, + p->x, + p->y, + w, + h, + gr->screen->format->Rmask, + gr->screen->format->Gmask, + gr->screen->format->Bmask, + gr->screen->format->Amask, + gr->screen->format->BitsPerPixel + ); + + ov = g_new0(struct graphics_priv, 1); + + switch(gr->screen->format->BitsPerPixel) { + case 8: + rmask = 0xc0; + gmask = 0x30; + bmask = 0x0c; + amask = 0x03; + break; + case 16: + rmask = 0xf000; + gmask = 0x0f00; + bmask = 0x00f0; + amask = 0x000f; + break; + case 32: + rmask = 0xff000000; + gmask = 0x00ff0000; + bmask = 0x0000ff00; + amask = 0x000000ff; + break; + default: + rmask = gr->screen->format->Rmask; + gmask = gr->screen->format->Gmask; + bmask = gr->screen->format->Bmask; + amask = gr->screen->format->Amask; + } + + ov->screen = SDL_CreateRGBSurface(SDL_SWSURFACE, + w, h, + gr->screen->format->BitsPerPixel, + rmask, gmask, bmask, amask); + + ov->overlay_mode = 1; + ov->overlay_enable = 1; + ov->overlay_x = p->x; + ov->overlay_y = p->y; + ov->overlay_parent = gr; + ov->overlay_idx = i; + gr->overlay_array[i] = ov; + + + struct font_priv *(*font_freetype_new) (void *meth); + font_freetype_new = plugin_get_font_type ("freetype"); + + if (!font_freetype_new) + { + return NULL; + } + + + font_freetype_new (&ov->freetype_methods); + + *meth=graphics_methods; + + meth->font_new = + (struct graphics_font_priv * + (*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, + int)) ov->freetype_methods.font_new; + meth->get_text_bbox = (void *)ov->freetype_methods.get_text_bbox; + + + + + return ov; +} + + +#ifdef LINUX_TOUCHSCREEN + +#define EVFN "/dev/input/eventX" + +static int input_ts_init(struct graphics_priv *gr) +{ + struct input_id ii; + char fn[32]; +#if 0 + char name[64]; +#endif + int n, fd, ret; + + gr->ts_fd = -1; + gr->ts_hit = -1; + gr->ts_x = 0; + gr->ts_y = 0; + + strcpy(fn, EVFN); + n = 0; + while(1) + { + fn[sizeof(EVFN)-2] = '0' + n; + + fd = open(fn, O_RDONLY); + if(fd >= 0) + { +#if 0 + ret = ioctl(fd, EVIOCGNAME(64), (void *)name); + if(ret > 0) + { + printf("input_ts: %s\n", name); + } +#endif + + ret = ioctl(fd, EVIOCGID, (void *)&ii); + if(ret == 0) + { +#if 1 + printf("bustype %04x vendor %04x product %04x version %04x\n", + ii.bustype, + ii.vendor, + ii.product, + ii.version); +#endif + + if((ii.bustype == BUS_USB) && + (ii.vendor == 0x0eef) && + (ii.product == 0x0001)) + { + ret = fcntl(fd, F_SETFL, O_NONBLOCK); + if(ret == 0) + { + gr->ts_fd = fd; + } + else + { + close(fd); + } + + break; + } + } + + close(fd); + } + + n = n + 1; + + /* FIXME: should check all 32 minors */ + if(n == 10) + { + /* not found */ + ret = -1; + break; + } + } + + return ret; +} + + +/* returns 0-based display coordinate for the given ts coord */ +static void input_ts_map(int *disp_x, int *disp_y, + uint32_t ts_x, uint32_t ts_y) +{ + /* Dynamix 7" (eGalax TS) + top left = 1986,103 + top right = 61,114 + bot left = 1986,1897 + bot right = 63,1872 + + calibrate your TS using input_event_dump + and touching all four corners. use the most extreme values. + */ + +#define INPUT_TS_LEFT 1978 +#define INPUT_TS_RIGHT 48 +#define INPUT_TS_TOP 115 +#define INPUT_TS_BOT 1870 + + /* clamp first */ + if(ts_x > INPUT_TS_LEFT) + { + ts_x = INPUT_TS_LEFT; + } + if(ts_x < INPUT_TS_RIGHT) + { + ts_x = INPUT_TS_RIGHT; + } + + ts_x = ts_x - INPUT_TS_RIGHT; + + *disp_x = ((DISPLAY_W-1) * ts_x) / (INPUT_TS_LEFT - INPUT_TS_RIGHT); + *disp_x = (DISPLAY_W-1) - *disp_x; + + + if(ts_y > INPUT_TS_BOT) + { + ts_y = INPUT_TS_BOT; + } + if(ts_y < INPUT_TS_TOP) + { + ts_y = INPUT_TS_TOP; + } + + ts_y = ts_y - INPUT_TS_TOP; + + *disp_y = ((DISPLAY_H-1) * ts_y) / (INPUT_TS_BOT - INPUT_TS_TOP); +/* *disp_y = (DISPLAY_H-1) - *disp_y; */ +} + +#if 0 +static void input_event_dump(struct input_event *ie) +{ + printf("input_event:\n" + "\ttv_sec\t%u\n" + "\ttv_usec\t%lu\n" + "\ttype\t%u\n" + "\tcode\t%u\n" + "\tvalue\t%d\n", + (unsigned int)ie->time.tv_sec, + ie->time.tv_usec, + ie->type, + ie->code, + ie->value); +} +#endif + +static int input_ts_exit(struct graphics_priv *gr) +{ + close(gr->ts_fd); + gr->ts_fd = -1; + + return 0; +} +#endif + +#ifdef USE_WEBOS_ACCELEROMETER +static void +sdl_accelerometer_handler(void* param) +{ + struct graphics_priv *gr = (struct graphics_priv *)param; + int xAxis = SDL_JoystickGetAxis(gr->accelerometer, 0); + int yAxis = SDL_JoystickGetAxis(gr->accelerometer, 1); + int zAxis = SDL_JoystickGetAxis(gr->accelerometer, 2); + unsigned char new_orientation; + + dbg(2,"x(%d) y(%d) z(%d) c(%d)\n",xAxis, yAxis, zAxis, sdl_orientation_count); + + if (zAxis > -30000) { + if (xAxis < -15000 && yAxis > -5000 && yAxis < 5000) + new_orientation = WEBOS_ORIENTATION_LANDSCAPE; + else if (yAxis > 15000 && xAxis > -5000 && xAxis < 5000) + new_orientation = WEBOS_ORIENTATION_PORTRAIT; + else + return; + } + else + return; + + if (new_orientation == sdl_next_orientation) { + if (sdl_orientation_count < 3) sdl_orientation_count++; + } + else { + sdl_orientation_count = 0; + sdl_next_orientation = new_orientation; + return; + } + + + if (sdl_orientation_count == 3 || sdl_next_orientation == 0) + { + sdl_orientation_count++; + + if (new_orientation != gr->orientation) { + dbg(1,"x(%d) y(%d) z(%d) o(%d)\n",xAxis, yAxis, zAxis, new_orientation); + gr->orientation = new_orientation; + + SDL_Event event; + SDL_UserEvent userevent; + + userevent.type = SDL_USEREVENT; + userevent.code = SDL_USEREVENT_CODE_ROTATE; + userevent.data1 = NULL; + userevent.data2 = NULL; + + event.type = SDL_USEREVENT; + event.user = userevent; + + SDL_PushEvent (&event); + } + } +} +#endif + +static gboolean graphics_sdl_idle(void *data) +{ + struct graphics_priv *gr = (struct graphics_priv *)data; + struct point p; + SDL_Event ev; +#ifdef LINUX_TOUCHSCREEN + struct input_event ie; + ssize_t ss; +#endif + int ret; + char key_mod = 0; + char keybuf[8]; + +#ifdef USE_WEBOS + if(data==NULL) { + if(the_graphics!=NULL) { + gr = the_graphics; + } + else { + dbg(0,"graphics_idle: graphics not set!\n"); + return FALSE; + } + } +#endif + + /* generate the initial resize callback, so the gui knows W/H + + its unsafe to do this directly inside register_resize_callback; + graphics_gtk does it during Configure, but SDL does not have + an equivalent event, so we use our own flag + */ + if(gr->resize_callback_initial != 0) + { + callback_list_call_attr_2(gr->cbl, attr_resize, (void *)gr->screen->w, (void *)gr->screen->h); + gr->resize_callback_initial = 0; + } + +#ifdef LINUX_TOUCHSCREEN + if(gr->ts_fd >= 0) + { + ss = read(gr->ts_fd, (void *)&ie, sizeof(ie)); + if(ss == sizeof(ie)) + { + /* we (usually) get three events on a touchscreen hit: + 1: type =EV_KEY + code =330 [BTN_TOUCH] + value=1 + + 2: type =EV_ABS + code =0 [X] + value=X pos + + 3: type =EV_ABS + code =1 [Y] + value=Y pos + + 4: type =EV_SYN + + once hit, if the contact point changes, we'll get more + EV_ABS (for 1 or both axes), followed by an EV_SYN. + + and, on a lift: + + 5: type =EV_KEY + code =330 [BTN_TOUCH] + value=0 + + 6: type =EV_SYN + */ + switch(ie.type) + { + case EV_KEY: + { + if(ie.code == BTN_TOUCH) + { + gr->ts_hit = ie.value; + } + + break; + } + + case EV_ABS: + { + if(ie.code == 0) + { + gr->ts_x = ie.value; + } + else if(ie.code == 1) + { + gr->ts_y = ie.value; + } + + break; + } + + case EV_SYN: + { + input_ts_map(&p.x, &p.y, gr->ts_x, gr->ts_y); + + /* always send MOUSE_MOTION (first) */ + callback_list_call_attr_1(gr->cbl, attr_motion, (void *)&p); + if(gr->ts_hit > 0) + { + callback_list_call_attr_3(gr->cbl, attr_button, (void *)1, (void *)SDL_BUTTON_LEFT, (void *)&p); + } + else if(gr->ts_hit == 0) + { + callback_list_call_attr_3(gr->cbl, attr_button, (void *)0, (void *)SDL_BUTTON_LEFT, (void *)&p); + } + + /* reset ts_hit */ + gr->ts_hit = -1; + + break; + } + + default: + { + break; + } + } + } + } +#endif + +#ifdef USE_WEBOS_ACCELEROMETER + struct callback* accel_cb = NULL; + struct event_timeout* accel_to = NULL; + if (PDL_GetPDKVersion() > 100) { + accel_cb = callback_new_1(callback_cast(sdl_accelerometer_handler), gr); + accel_to = event_add_timeout(200, 1, accel_cb); + } +#endif +#ifdef USE_WEBOS + unsigned int idle_tasks_idx=0; + unsigned int idle_tasks_cur_priority=0; + struct idle_task *task; + + while(!quit_event_loop) +#else + while(1) +#endif + { +#ifdef USE_WEBOS + ret = 0; + if(idle_tasks->len > 0) + { + while (!(ret = SDL_PollEvent(&ev)) && idle_tasks->len > 0) + { + if (idle_tasks_idx >= idle_tasks->len) + idle_tasks_idx = 0; + + dbg(3,"idle_tasks_idx(%d)\n",idle_tasks_idx); + task = (struct idle_task *)g_ptr_array_index(idle_tasks,idle_tasks_idx); + + if (idle_tasks_idx == 0) // only execute tasks with lowest priority value + idle_tasks_cur_priority = task->priority; + if (task->priority > idle_tasks_cur_priority) + idle_tasks_idx = 0; + else + { + callback_call_0(task->cb); + idle_tasks_idx++; + } + } + } + if (!ret) // If we get here there are no idle_tasks and we have no events pending + ret = SDL_WaitEvent(&ev); +#else + ret = SDL_PollEvent(&ev); +#endif + if(ret == 0) + { + break; + } + +#ifdef USE_WEBOS + dbg(2,"SDL_Event %d\n", ev.type); +#endif + switch(ev.type) + { + case SDL_MOUSEMOTION: + { + p.x = ev.motion.x; + p.y = ev.motion.y; + callback_list_call_attr_1(gr->cbl, attr_motion, (void *)&p); + break; + } + + case SDL_KEYDOWN: + { + memset(keybuf, 0, sizeof(keybuf)); + switch(ev.key.keysym.sym) + { + case SDLK_LEFT: + { + keybuf[0] = NAVIT_KEY_LEFT; + break; + } + case SDLK_RIGHT: + { + keybuf[0] = NAVIT_KEY_RIGHT; + break; + } + case SDLK_BACKSPACE: + { + keybuf[0] = NAVIT_KEY_BACKSPACE; + break; + } + case SDLK_RETURN: + { + keybuf[0] = NAVIT_KEY_RETURN; + break; + } + case SDLK_DOWN: + { + keybuf[0] = NAVIT_KEY_DOWN; + break; + } + case SDLK_PAGEUP: + { + keybuf[0] = NAVIT_KEY_ZOOM_OUT; + break; + } + case SDLK_UP: + { + keybuf[0] = NAVIT_KEY_UP; + break; + } + case SDLK_PAGEDOWN: + { + keybuf[0] = NAVIT_KEY_ZOOM_IN; + break; + } +#ifdef USE_WEBOS + case WEBOS_KEY_SHIFT: + { + if ((key_mod & WEBOS_KEY_MOD_SHIFT_STICKY) == WEBOS_KEY_MOD_SHIFT_STICKY) + key_mod &= ~(WEBOS_KEY_MOD_SHIFT_STICKY); + else if ((key_mod & WEBOS_KEY_MOD_SHIFT) == WEBOS_KEY_MOD_SHIFT) + key_mod |= WEBOS_KEY_MOD_SHIFT_STICKY; + else + key_mod |= WEBOS_KEY_MOD_SHIFT; + break; + } + case WEBOS_KEY_ORANGE: + { + if ((key_mod & WEBOS_KEY_MOD_ORANGE_STICKY) == WEBOS_KEY_MOD_ORANGE_STICKY) + key_mod &= ~(WEBOS_KEY_MOD_ORANGE_STICKY); + else if ((key_mod & WEBOS_KEY_MOD_ORANGE) == WEBOS_KEY_MOD_ORANGE) + key_mod |= WEBOS_KEY_MOD_ORANGE_STICKY; + else + key_mod |= WEBOS_KEY_MOD_ORANGE; + break; + } + case WEBOS_KEY_SYM: + { + /* Toggle the on-screen keyboard */ + //callback_list_call_attr_1(gr->cbl, attr_keyboard_toggle); // Not implemented yet + break; + } + case PDLK_GESTURE_BACK: + { + keybuf[0] = NAVIT_KEY_BACK; + break; + } + case PDLK_GESTURE_FORWARD: + case PDLK_GESTURE_AREA: + { + break; + } +#endif + default: + { +#ifdef USE_WEBOS + if (ev.key.keysym.unicode < 0x80 && ev.key.keysym.unicode > 0) { + keybuf[0] = (char)ev.key.keysym.unicode; + if ((key_mod & WEBOS_KEY_MOD_ORANGE) == WEBOS_KEY_MOD_ORANGE) { + switch(keybuf[0]) { + case 'e': keybuf[0] = '1'; break; + case 'r': keybuf[0] = '2'; break; + case 't': keybuf[0] = '3'; break; + case 'd': keybuf[0] = '4'; break; + case 'f': keybuf[0] = '5'; break; + case 'g': keybuf[0] = '6'; break; + case 'x': keybuf[0] = '7'; break; + case 'c': keybuf[0] = '8'; break; + case 'v': keybuf[0] = '9'; break; + case '@': keybuf[0] = '0'; break; + case ',': keybuf[0] = '-'; break; + case 'u': strncpy(keybuf, "ü", sizeof(keybuf)); break; + case 'a': strncpy(keybuf, "ä", sizeof(keybuf)); break; + case 'o': strncpy(keybuf, "ö", sizeof(keybuf)); break; + case 's': strncpy(keybuf, "ß", sizeof(keybuf)); break; + } +} + if ((key_mod & WEBOS_KEY_MOD_SHIFT_STICKY) != WEBOS_KEY_MOD_SHIFT_STICKY) + key_mod &= ~(WEBOS_KEY_MOD_SHIFT_STICKY); + if ((key_mod & WEBOS_KEY_MOD_ORANGE_STICKY) != WEBOS_KEY_MOD_ORANGE_STICKY) + key_mod &= ~(WEBOS_KEY_MOD_ORANGE_STICKY); + } + else { + dbg(0,"Unknown key sym: %x\n", ev.key.keysym.sym); + } +#else + /* return unicode chars when they can be converted to ascii */ + keybuf[0] = ev.key.keysym.unicode<=127 ? ev.key.keysym.unicode : 0; +#endif + break; + } + } + + dbg(2,"key mod: 0x%x\n", key_mod); + + if (keybuf[0]) { + dbg(2,"key: %s 0x%x\n", keybuf, keybuf); + callback_list_call_attr_1(gr->cbl, attr_keypress, (void *)keybuf); + } + break; + } + + case SDL_KEYUP: + { + break; + } + + case SDL_MOUSEBUTTONDOWN: + { +#ifdef DEBUG + printf("SDL_MOUSEBUTTONDOWN %d %d %d %d %d\n", + ev.button.which, + ev.button.button, + ev.button.state, + ev.button.x, + ev.button.y); +#endif + + p.x = ev.button.x; + p.y = ev.button.y; + callback_list_call_attr_3(gr->cbl, attr_button, (void *)1, (void *)(int)ev.button.button, (void *)&p); + break; + } + + case SDL_MOUSEBUTTONUP: + { +#ifdef DEBUG + printf("SDL_MOUSEBUTTONUP %d %d %d %d %d\n", + ev.button.which, + ev.button.button, + ev.button.state, + ev.button.x, + ev.button.y); +#endif + + p.x = ev.button.x; + p.y = ev.button.y; + callback_list_call_attr_3(gr->cbl, attr_button, (void *)0, (void *)(int)ev.button.button, (void *)&p); + break; + } + + case SDL_QUIT: + { +#ifdef USE_WEBOS + quit_event_loop = 1; + navit_destroy(gr->nav); +#endif + break; + } + + case SDL_VIDEORESIZE: + { + + gr->screen = SDL_SetVideoMode(ev.resize.w, ev.resize.h, gr->video_bpp, gr->video_flags); + if(gr->screen == NULL) + { + navit_destroy(gr->nav); + } + else + { + callback_list_call_attr_2(gr->cbl, attr_resize, (void *)gr->screen->w, (void *)gr->screen->h); + } + + break; + } + +#ifdef USE_WEBOS + case SDL_USEREVENT: + { + SDL_UserEvent userevent = ev.user; + dbg(9,"received SDL_USEREVENT type(%x) code(%x)\n",userevent.type,userevent.code); + if (userevent.type != SDL_USEREVENT) + break; + + if (userevent.code == PDL_GPS_UPDATE) + { + struct attr vehicle_attr; + struct vehicle *v; + navit_get_attr(gr->nav, attr_vehicle, &vehicle_attr, NULL); + v = vehicle_attr.u.vehicle; + if (v) { + struct attr attr; + attr.type = attr_pdl_gps_update; + attr.u.data = userevent.data1; + vehicle_set_attr(v, &attr); + } + } + else if(userevent.code == SDL_USEREVENT_CODE_TIMER) + { + struct callback *cb = (struct callback *)userevent.data1; + dbg(1, "SDL_USEREVENT timer received cb(%p)\n", cb); + callback_call_0(cb); + } + else if(userevent.code == SDL_USEREVENT_CODE_WATCH) + { + struct callback *cb = (struct callback *)userevent.data1; + dbg(1, "SDL_USEREVENT watch received cb(%p)\n", cb); + callback_call_0(cb); + } + else if(userevent.code == SDL_USEREVENT_CODE_CALL_CALLBACK) + { + struct callback_list *cbl = (struct callback_list *)userevent.data1; + dbg(1, "SDL_USEREVENT call_callback received cbl(%p)\n", cbl); + callback_list_call_0(cbl); + } + else if(userevent.code == SDL_USEREVENT_CODE_IDLE_EVENT) { + dbg(1, "SDL_USEREVENT idle_event received\n"); + } +#ifdef USE_WEBOS_ACCELEROMETER + else if(userevent.code == SDL_USEREVENT_CODE_ROTATE) + { + dbg(1, "SDL_USEREVENT rotate received\n"); + switch(gr->orientation) + { + case WEBOS_ORIENTATION_PORTRAIT: + gr->screen = SDL_SetVideoMode(gr->real_w, gr->real_h, gr->video_bpp, gr->video_flags); + PDL_SetOrientation(PDL_ORIENTATION_0); + break; + case WEBOS_ORIENTATION_LANDSCAPE: + gr->screen = SDL_SetVideoMode(gr->real_h, gr->real_w, gr->video_bpp, gr->video_flags); + PDL_SetOrientation(PDL_ORIENTATION_270); + break; + } + if(gr->screen == NULL) + { + navit_destroy(gr->nav); + } + else + { + callback_list_call_attr_2(gr->cbl, attr_resize, (void *)gr->screen->w, (void *)gr->screen->h); + } + } +#endif + else + dbg(1, "unknown SDL_USEREVENT\n"); + + break; + } +#endif + default: + { +#ifdef DEBUG + printf("SDL_Event %d\n", ev.type); +#endif + break; + } + } + } + +#ifdef USE_WEBOS + event_sdl_watch_stopthread(); +#endif + +#ifdef USE_WEBOS_ACCELEROMETER + if (PDL_GetPDKVersion() > 100) { + event_remove_timeout(accel_to); + callback_destroy(accel_cb); + } +#endif + + return TRUE; +} + + +static struct graphics_priv * +graphics_sdl_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) +{ + struct graphics_priv *this=g_new0(struct graphics_priv, 1); + struct attr *attr; + int ret; + int w=DISPLAY_W,h=DISPLAY_H; + + struct font_priv *(*font_freetype_new) (void *meth); + font_freetype_new = plugin_get_font_type ("freetype"); + + if (!font_freetype_new) + { + return NULL; + } + + font_freetype_new (&this->freetype_methods); + + this->nav = nav; + this->cbl = cbl; + + dbg(1,"Calling SDL_Init\n"); +#ifdef USE_WEBOS +# ifdef USE_WEBOS_ACCELEROMETER + ret = SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_JOYSTICK); +# else + ret = SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER); +# endif +#else + ret = SDL_Init(SDL_INIT_VIDEO); +#endif + if(ret < 0) + { + dbg(0,"SDL_Init failed %d\n", ret); + g_free(this); + return NULL; + } + +#ifdef USE_WEBOS + dbg(1,"Calling PDL_Init(0)\n"); + ret = PDL_Init(0); + if(ret < 0) + { + dbg(0,"PDL_Init failed %d\n", ret); + g_free(this); + return NULL; + } + + if (! event_request_system("sdl","graphics_sdl_new")) { +#else + if (! event_request_system("glib","graphics_sdl_new")) { +#endif + dbg(0,"event_request_system failed"); + return NULL; + } + +#ifdef USE_WEBOS + this->video_bpp = 0; + this->video_flags = SDL_SWSURFACE | SDL_ANYFORMAT | SDL_RESIZABLE; +#else + this->video_bpp = 16; + this->video_flags = SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_RESIZABLE; +#endif + + if ((attr=attr_search(attrs, NULL, attr_w))) + w=attr->u.num; + if ((attr=attr_search(attrs, NULL, attr_h))) + h=attr->u.num; + if ((attr=attr_search(attrs, NULL, attr_bpp))) + this->video_bpp=attr->u.num; + if ((attr=attr_search(attrs, NULL, attr_flags))) { + if (attr->u.num & 1) + this->video_flags = SDL_SWSURFACE; + } + if ((attr=attr_search(attrs, NULL, attr_frame))) { + if(!attr->u.num) + this->video_flags |= SDL_NOFRAME; + } + + this->screen = SDL_SetVideoMode(w, h, this->video_bpp, this->video_flags); + + if(this->screen == NULL) + { + dbg(0,"SDL_SetVideoMode failed\n"); + g_free(this); +#ifdef USE_WEBOS + PDL_Quit(); +#endif + SDL_Quit(); + return NULL; + } + + /* Use screen size instead of requested */ + w = this->screen->w; + h = this->screen->h; + + dbg(0, "using screen %ix%i@%i\n", + this->screen->w, this->screen->h, + this->screen->format->BytesPerPixel * 8); +#ifdef USE_WEBOS_ACCELEROMETER + if ( w > h ) { + this->orientation = WEBOS_ORIENTATION_LANDSCAPE; + this->real_w = h; + this->real_h = w; + } + else { + this->orientation = WEBOS_ORIENTATION_PORTRAIT; + this->real_w = w; + this->real_h = h; + } + this->accelerometer = SDL_JoystickOpen(0); +#endif + + SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); +#ifdef USE_WEBOS + PDL_SetOrientation(PDL_ORIENTATION_0); +#endif + + SDL_EnableUNICODE(1); + SDL_WM_SetCaption("navit", NULL); + +#ifdef LINUX_TOUCHSCREEN + input_ts_init(this); + if(this->ts_fd >= 0) + { + /* mouse cursor does not always display correctly in Linux FB. + anyway, it is unnecessary w/ a touch screen + */ + SDL_ShowCursor(0); + } +#endif + +#ifdef SDL_SGE + sge_Update_OFF(); + sge_Lock_ON(); +#endif + + *meth=graphics_methods; + + + meth->font_new = + (struct graphics_font_priv * + (*)(struct graphics_priv *, struct graphics_font_methods *, char *, int, + int)) this->freetype_methods.font_new; + meth->get_text_bbox = (void*) this->freetype_methods.get_text_bbox; + + + +#ifdef USE_WEBOS + if(the_graphics!=NULL) { + dbg(0,"graphics_sdl_new: graphics struct already set: %d!\n", the_graphics_count); + } + the_graphics = this; + the_graphics_count++; +#else + g_timeout_add(G_PRIORITY_DEFAULT+10, graphics_sdl_idle, this); +#endif + + this->overlay_enable = 1; + + this->aa = 1; + if((attr=attr_search(attrs, NULL, attr_antialias))) + this->aa = attr->u.num; + + this->resize_callback_initial=1; + return this; +} + +#ifdef USE_WEBOS +/* ---------- SDL Eventhandling ---------- */ + +static Uint32 +sdl_timer_callback(Uint32 interval, void* param) +{ + struct event_timeout *timeout=(struct event_timeout*)param; + + dbg(1,"timer(%p) multi(%d) interval(%d) fired\n", param, timeout->multi, interval); + + SDL_Event event; + SDL_UserEvent userevent; + + userevent.type = SDL_USEREVENT; + userevent.code = SDL_USEREVENT_CODE_TIMER; + userevent.data1 = timeout->cb; + userevent.data2 = NULL; + + event.type = SDL_USEREVENT; + event.user = userevent; + + SDL_PushEvent (&event); + + if (timeout->multi == 0) { + timeout->id = 0; + return 0; // cancel timer + } + return interval; // reactivate timer +} + +/* SDL Mainloop */ + +static void +event_sdl_main_loop_run(void) +{ + PDL_ScreenTimeoutEnable(PDL_FALSE); + graphics_sdl_idle(NULL); + PDL_ScreenTimeoutEnable(PDL_TRUE); +} + +static void +event_sdl_main_loop_quit(void) +{ + quit_event_loop = 1; +} + +/* Watch */ + +static void +event_sdl_watch_thread (GPtrArray *watch_list) +{ + struct pollfd *pfds = g_new0 (struct pollfd, watch_list->len); + struct event_watch *ew; + int ret; + int idx; + + for (idx = 0; idx < watch_list->len; idx++ ) { + ew = g_ptr_array_index (watch_list, idx); + g_memmove (&pfds[idx], ew->pfd, sizeof(struct pollfd)); + } + + while ((ret = ppoll(pfds, watch_list->len, NULL, NULL)) > 0) { + for (idx = 0; idx < watch_list->len; idx++ ) { + if (pfds[idx].revents == pfds[idx].events) { /* The requested event happened, notify mainloop! */ + ew = g_ptr_array_index (watch_list, idx); + dbg(1,"watch(%p) event(%d) encountered\n", ew, pfds[idx].revents); + + SDL_Event event; + SDL_UserEvent userevent; + + userevent.type = SDL_USEREVENT; + userevent.code = SDL_USEREVENT_CODE_WATCH; + userevent.data1 = ew->cb; + userevent.data2 = NULL; + + event.type = SDL_USEREVENT; + event.user = userevent; + + SDL_PushEvent (&event); + } + } + } + + g_free(pfds); + + pthread_exit(0); +} + +static void +event_sdl_watch_startthread(GPtrArray *watch_list) +{ + dbg(1,"enter\n"); + if (sdl_watch_thread) + event_sdl_watch_stopthread(); + + int ret; + ret = pthread_create (&sdl_watch_thread, NULL, (void *)event_sdl_watch_thread, (void *)watch_list); + + dbg_assert (ret == 0); +} + +static void +event_sdl_watch_stopthread() +{ + dbg(1,"enter\n"); + if (sdl_watch_thread) { + /* Notify the watch thread that the list of FDs will change */ + pthread_kill(sdl_watch_thread, SIGUSR1); + pthread_join(sdl_watch_thread, NULL); + sdl_watch_thread = 0; + } +} + +static struct event_watch * +event_sdl_add_watch(void *fd, enum event_watch_cond cond, struct callback *cb) +{ + dbg(1,"fd(%d) cond(%x) cb(%x)\n", fd, cond, cb); + + event_sdl_watch_stopthread(); + + if (!sdl_watch_list) + sdl_watch_list = g_ptr_array_new(); + + struct event_watch *new_ew = g_new0 (struct event_watch, 1); + struct pollfd *pfd = g_new0 (struct pollfd, 1); + + pfd->fd = (int) fd; + + /* Modify watchlist here */ + switch (cond) { + case event_watch_cond_read: + pfd->events = POLLIN; + break; + case event_watch_cond_write: + pfd->events = POLLOUT; + break; + case event_watch_cond_except: + pfd->events = POLLERR|POLLHUP; + break; + } + + new_ew->pfd = (struct pollfd*) pfd; + new_ew->cb = cb; + + g_ptr_array_add (sdl_watch_list, (gpointer)new_ew); + + event_sdl_watch_startthread(sdl_watch_list); + + return new_ew; +} + +static void +event_sdl_remove_watch(struct event_watch *ew) +{ + dbg(1,"enter %p\n",ew); + + event_sdl_watch_stopthread(); + + g_ptr_array_remove (sdl_watch_list, ew); + g_free (ew->pfd); + g_free (ew); + + if (sdl_watch_list->len > 0) + event_sdl_watch_startthread(sdl_watch_list); +} + +/* Timeout */ + +static struct event_timeout * +event_sdl_add_timeout(int timeout, int multi, struct callback *cb) +{ + struct event_timeout * ret = g_new0(struct event_timeout, 1); + if(!ret) { + dbg (0,"g_new0 failed\n"); + return ret; + } + dbg(1,"timer(%p) multi(%d) interval(%d) cb(%p) added\n",ret, multi, timeout, cb); + ret->multi = multi; + ret->cb = cb; + ret->id = SDL_AddTimer(timeout, sdl_timer_callback, ret); + + return ret; +} + +static void +event_sdl_remove_timeout(struct event_timeout *to) +{ + dbg(2,"enter %p\n", to); + if(to) + { + /* do not SDL_RemoveTimer if oneshot timer has already fired */ + int ret = to->id == 0 ? SDL_TRUE : SDL_RemoveTimer(to->id); + + if (ret == SDL_FALSE) + dbg(0,"SDL_RemoveTimer (%p) failed\n", to->id); + + g_free(to); + dbg(1,"timer(%p) removed\n", to); + } +} + +/* Idle */ + +/* sort ptr_array by priority, increasing order */ +static gint +sdl_sort_idle_tasks(gconstpointer parama, gconstpointer paramb) +{ + struct idle_task *a = (struct idle_task *)parama; + struct idle_task *b = (struct idle_task *)paramb; + if (a->priority < b->priority) + return -1; + if (a->priority > b->priority) + return 1; + return 0; +} + +static struct event_idle * +event_sdl_add_idle(int priority, struct callback *cb) +{ + dbg(1,"add idle priority(%d) cb(%p)\n", priority, cb); + + struct idle_task *task = g_new0(struct idle_task, 1); + task->priority = priority; + task->cb = cb; + + g_ptr_array_add(idle_tasks, (gpointer)task); + + if (idle_tasks->len < 2) + { + SDL_Event event; + SDL_UserEvent userevent; + + dbg(1,"poking eventloop because of new idle_events\n"); + + userevent.type = SDL_USEREVENT; + userevent.code = SDL_USEREVENT_CODE_IDLE_EVENT; + userevent.data1 = NULL; + userevent.data2 = NULL; + + event.type = SDL_USEREVENT; + event.user = userevent; + + SDL_PushEvent (&event); + } + else // more than one entry => sort the list + g_ptr_array_sort(idle_tasks, sdl_sort_idle_tasks); + + return (struct event_idle *)task; +} + +static void +event_sdl_remove_idle(struct event_idle *task) +{ + dbg(1,"remove task(%p)\n", task); + g_ptr_array_remove(idle_tasks, (gpointer)task); +} + +/* callback */ + +static void +event_sdl_call_callback(struct callback_list *cbl) +{ + dbg(1,"call_callback cbl(%p)\n",cbl); + SDL_Event event; + SDL_UserEvent userevent; + + userevent.type = SDL_USEREVENT; + userevent.code = SDL_USEREVENT_CODE_CALL_CALLBACK; + userevent.data1 = cbl; + userevent.data2 = NULL; + + event.type = SDL_USEREVENT; + event.user = userevent; + + SDL_PushEvent (&event); +} + +static struct event_methods event_sdl_methods = { + event_sdl_main_loop_run, + event_sdl_main_loop_quit, + event_sdl_add_watch, + event_sdl_remove_watch, + event_sdl_add_timeout, + event_sdl_remove_timeout, + event_sdl_add_idle, + event_sdl_remove_idle, + event_sdl_call_callback, +}; + +static struct event_priv * +event_sdl_new(struct event_methods* methods) +{ + idle_tasks = g_ptr_array_new(); + *methods = event_sdl_methods; + return NULL; +} + +/* ---------- SDL Eventhandling ---------- */ +#endif + +void +plugin_init(void) +{ +#ifdef USE_WEBOS + plugin_register_event_type("sdl", event_sdl_new); +#endif + plugin_register_graphics_type("sdl", graphics_sdl_new); +} + +// vim: sw=4 ts=8 diff --git a/navit/graphics/sdl/raster.c b/navit/graphics/sdl/raster.c new file mode 100644 index 0000000..d0c0432 --- /dev/null +++ b/navit/graphics/sdl/raster.c @@ -0,0 +1,2022 @@ +/* raster.c -- line/rect/circle/poly rasterization + + copyright (c) 2008 bryan rittmeyer + license: LGPLv2 + + based on SDL_gfx (c) A. Schiffler + and SGE (c)1999-2003 Anders Lindström + + + added filled anti-aliased polygons + + fixed some bugs and improved performance + + revision history + 2008-07-05 initial + 2008-07-06 aacircle +*/ + + +#include + +#include "raster.h" + +#undef DEBUG +#undef PARANOID + + +/* raster_rect */ + +static inline void raster_rect_inline(SDL_Surface *dst, int16_t x1, int16_t y1, int16_t w, int16_t h, uint32_t color) +{ + /* sge */ + SDL_Rect rect; + +#if 1 + if((w <= 0) || (h <= 0)) + { + return; + } + +#if 0 + if(x1 < 0) + { + if((x1 + w) < 0) + { + return; + } + else + { + w = w + x1; + x1 = 0; + } + } + if(y1 < 0) + { + if((y1 + h) < 0) + { + return; + } + else + { + h = h + y1; + y1 = 0; + } + } + + if(x1 + w >= dst->w) + { + w = dst->w - x1; + } + if(y1 + h >= dst->h) + { + h = dst->h - y1; + } +#endif + + rect.x = x1; + rect.y = y1; + rect.w = w; + rect.h = h; + + /* will clip internally */ + SDL_FillRect(dst, &rect, color); + +#else + + x2 = x1 + w; + y2 = y1 + h; + + /* + * Order coordinates to ensure that + * x1<=x2 and y1<=y2 + */ + if (x1 > x2) { + tmp = x1; + x1 = x2; + x2 = tmp; + } + if (y1 > y2) { + tmp = y1; + y1 = y2; + y2 = tmp; + } + + /* + * Get clipping boundary and + * check visibility + */ + left = dst->clip_rect.x; + if (x2clip_rect.x + dst->clip_rect.w - 1; + if (x1>right) { + return(0); + } + top = dst->clip_rect.y; + if (y2clip_rect.y + dst->clip_rect.h - 1; + if (y1>bottom) { + return(0); + } + + /* Clip all points */ + if (x1right) { + x1=right; + } + if (x2right) { + x2=right; + } + if (y1bottom) { + y1=bottom; + } + if (y2bottom) { + y2=bottom; + } + +#if 0 + /* + * Test for special cases of straight line or single point + */ + if (x1 == x2) { + if (y1 == y2) { + return (pixelColor(dst, x1, y1, color)); + } else { + return (vlineColor(dst, x1, y1, y2, color)); + } + } + if (y1 == y2) { + return (hlineColor(dst, x1, x2, y1, color)); + } +#endif + + /* + * Calculate width&height + */ + w = x2 - x1; + h = y2 - y1; + + /* + * No alpha-blending required + */ + +#if 0 + /* + * Setup color + */ + colorptr = (Uint8 *) & color; + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]); + } else { + color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]); + } +#endif + + /* + * Lock surface + */ + SDL_LockSurface(dst); + + /* + * More variable setup + */ + dx = w; + dy = h; + pixx = dst->format->BytesPerPixel; + pixy = dst->pitch; + pixel = ((Uint8 *) dst->pixels) + pixx * (int) x1 + pixy * (int) y1; + pixellast = pixel + pixx * dx + pixy * dy; + dx++; + + /* + * Draw + */ + switch (dst->format->BytesPerPixel) { + case 1: + for (; pixel <= pixellast; pixel += pixy) { + memset(pixel, (Uint8) color, dx); + } + break; + case 2: + pixy -= (pixx * dx); + for (; pixel <= pixellast; pixel += pixy) { + for (x = 0; x < dx; x++) { + *(Uint16*) pixel = color; + pixel += pixx; + } + } + break; + case 3: + pixy -= (pixx * dx); + for (; pixel <= pixellast; pixel += pixy) { + for (x = 0; x < dx; x++) { + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + pixel[0] = (color >> 16) & 0xff; + pixel[1] = (color >> 8) & 0xff; + pixel[2] = color & 0xff; + } else { + pixel[0] = color & 0xff; + pixel[1] = (color >> 8) & 0xff; + pixel[2] = (color >> 16) & 0xff; + } + pixel += pixx; + } + } + break; + default: /* case 4 */ + pixy -= (pixx * dx); + for (; pixel <= pixellast; pixel += pixy) { + for (x = 0; x < dx; x++) { + *(Uint32 *) pixel = color; + pixel += pixx; + } + } + break; + } + + /* + * Unlock surface + */ + SDL_UnlockSurface(dst); + +#endif +} + +void raster_rect(SDL_Surface *s, int16_t x, int16_t y, int16_t w, int16_t h, uint32_t col) +{ + raster_rect_inline(s, x, y, w, h, col); +} + +#define raster_rect_inline raster_rect + + +/* raster :: pixel */ + +#define MODIFIED_ALPHA_PIXEL_ROUTINE + + +#define clip_xmin(surface) surface->clip_rect.x +#define clip_xmax(surface) surface->clip_rect.x+surface->clip_rect.w-1 +#define clip_ymin(surface) surface->clip_rect.y +#define clip_ymax(surface) surface->clip_rect.y+surface->clip_rect.h-1 + + +static void raster_PutPixel(SDL_Surface *surface, Sint16 x, Sint16 y, Uint32 color) +{ + if(x>=clip_xmin(surface) && x<=clip_xmax(surface) && y>=clip_ymin(surface) && y<=clip_ymax(surface)){ + switch (surface->format->BytesPerPixel) { + case 1: { /* Assuming 8-bpp */ + *((Uint8 *)surface->pixels + y*surface->pitch + x) = color; + } + break; + + case 2: { /* Probably 15-bpp or 16-bpp */ + *((Uint16 *)surface->pixels + y*surface->pitch/2 + x) = color; + } + break; + + case 3: { /* Slow 24-bpp mode, usually not used */ + Uint8 *pix = (Uint8 *)surface->pixels + y * surface->pitch + x*3; + + /* Gack - slow, but endian correct */ + *(pix+surface->format->Rshift/8) = color>>surface->format->Rshift; + *(pix+surface->format->Gshift/8) = color>>surface->format->Gshift; + *(pix+surface->format->Bshift/8) = color>>surface->format->Bshift; + *(pix+surface->format->Ashift/8) = color>>surface->format->Ashift; + } + break; + + case 4: { /* Probably 32-bpp */ + *((Uint32 *)surface->pixels + y*surface->pitch/4 + x) = color; + } + break; + } + } +} + +/* PutPixel routine with alpha blending, input color in destination format */ + +/* New, faster routine - default blending pixel */ + +static void raster_PutPixelAlpha(SDL_Surface * surface, Sint16 x, Sint16 y, Uint32 color, Uint8 alpha) +{ + /* sdl-gfx */ + Uint32 Rmask = surface->format->Rmask, Gmask = + surface->format->Gmask, Bmask = surface->format->Bmask, Amask = surface->format->Amask; + Uint32 R = 0, G = 0, B = 0, A = 0; + + if (x >= clip_xmin(surface) && x <= clip_xmax(surface) + && y >= clip_ymin(surface) && y <= clip_ymax(surface)) { + + switch (surface->format->BytesPerPixel) { + case 1:{ /* Assuming 8-bpp */ + if (alpha == 255) { + *((Uint8 *) surface->pixels + y * surface->pitch + x) = color; + } else { + Uint8 *pixel = (Uint8 *) surface->pixels + y * surface->pitch + x; + + Uint8 dR = surface->format->palette->colors[*pixel].r; + Uint8 dG = surface->format->palette->colors[*pixel].g; + Uint8 dB = surface->format->palette->colors[*pixel].b; + Uint8 sR = surface->format->palette->colors[color].r; + Uint8 sG = surface->format->palette->colors[color].g; + Uint8 sB = surface->format->palette->colors[color].b; + + dR = dR + ((sR - dR) * alpha >> 8); + dG = dG + ((sG - dG) * alpha >> 8); + dB = dB + ((sB - dB) * alpha >> 8); + + *pixel = SDL_MapRGB(surface->format, dR, dG, dB); + } + } + break; + + case 2:{ /* Probably 15-bpp or 16-bpp */ + if (alpha == 255) { + *((Uint16 *) surface->pixels + y * surface->pitch / 2 + x) = color; + } else { + Uint16 *pixel = (Uint16 *) surface->pixels + y * surface->pitch / 2 + x; + Uint32 dc = *pixel; + + R = ((dc & Rmask) + (((color & Rmask) - (dc & Rmask)) * alpha >> 8)) & Rmask; + G = ((dc & Gmask) + (((color & Gmask) - (dc & Gmask)) * alpha >> 8)) & Gmask; + B = ((dc & Bmask) + (((color & Bmask) - (dc & Bmask)) * alpha >> 8)) & Bmask; + if (Amask) + A = ((dc & Amask) + (((color & Amask) - (dc & Amask)) * alpha >> 8)) & Amask; + + *pixel = R | G | B | A; + } + } + break; + + case 3:{ /* Slow 24-bpp mode, usually not used */ + Uint8 *pix = (Uint8 *) surface->pixels + y * surface->pitch + x * 3; + Uint8 rshift8 = surface->format->Rshift / 8; + Uint8 gshift8 = surface->format->Gshift / 8; + Uint8 bshift8 = surface->format->Bshift / 8; + Uint8 ashift8 = surface->format->Ashift / 8; + + + if (alpha == 255) { + *(pix + rshift8) = color >> surface->format->Rshift; + *(pix + gshift8) = color >> surface->format->Gshift; + *(pix + bshift8) = color >> surface->format->Bshift; + *(pix + ashift8) = color >> surface->format->Ashift; + } else { + Uint8 dR, dG, dB, dA = 0; + Uint8 sR, sG, sB, sA = 0; + + pix = (Uint8 *) surface->pixels + y * surface->pitch + x * 3; + + dR = *((pix) + rshift8); + dG = *((pix) + gshift8); + dB = *((pix) + bshift8); + dA = *((pix) + ashift8); + + sR = (color >> surface->format->Rshift) & 0xff; + sG = (color >> surface->format->Gshift) & 0xff; + sB = (color >> surface->format->Bshift) & 0xff; + sA = (color >> surface->format->Ashift) & 0xff; + + dR = dR + ((sR - dR) * alpha >> 8); + dG = dG + ((sG - dG) * alpha >> 8); + dB = dB + ((sB - dB) * alpha >> 8); + dA = dA + ((sA - dA) * alpha >> 8); + + *((pix) + rshift8) = dR; + *((pix) + gshift8) = dG; + *((pix) + bshift8) = dB; + *((pix) + ashift8) = dA; + } + } + break; + +#ifdef ORIGINAL_ALPHA_PIXEL_ROUTINE + + case 4:{ /* Probably :-) 32-bpp */ + if (alpha == 255) { + *((Uint32 *) surface->pixels + y * surface->pitch / 4 + x) = color; + } else { + Uint32 Rshift, Gshift, Bshift, Ashift; + Uint32 *pixel = (Uint32 *) surface->pixels + y * surface->pitch / 4 + x; + Uint32 dc = *pixel; + + Rshift = surface->format->Rshift; + Gshift = surface->format->Gshift; + Bshift = surface->format->Bshift; + Ashift = surface->format->Ashift; + + R = ((dc & Rmask) + (((((color & Rmask) - (dc & Rmask)) >> Rshift) * alpha >> 8) << Rshift)) & Rmask; + G = ((dc & Gmask) + (((((color & Gmask) - (dc & Gmask)) >> Gshift) * alpha >> 8) << Gshift)) & Gmask; + B = ((dc & Bmask) + (((((color & Bmask) - (dc & Bmask)) >> Bshift) * alpha >> 8) << Bshift)) & Bmask; + if (Amask) + A = ((dc & Amask) + (((((color & Amask) - (dc & Amask)) >> Ashift) * alpha >> 8) << Ashift)) & Amask; + + *pixel = R | G | B | A; + } + } + break; +#endif + +#ifdef MODIFIED_ALPHA_PIXEL_ROUTINE + + case 4:{ /* Probably :-) 32-bpp */ + if (alpha == 255) { + *((Uint32 *) surface->pixels + y * surface->pitch / 4 + x) = color; + } else { + Uint32 Rshift, Gshift, Bshift, Ashift; + Uint32 *pixel = (Uint32 *) surface->pixels + y * surface->pitch / 4 + x; + Uint32 dc = *pixel; + Uint32 dR = (color & Rmask), dG = (color & Gmask), dB = (color & Bmask); + Uint32 surfaceAlpha, preMultR, preMultG, preMultB; + Uint32 aTmp; + + Rshift = surface->format->Rshift; + Gshift = surface->format->Gshift; + Bshift = surface->format->Bshift; + Ashift = surface->format->Ashift; + + preMultR = (alpha * (dR>>Rshift)); + preMultG = (alpha * (dG>>Gshift)); + preMultB = (alpha * (dB>>Bshift)); + + surfaceAlpha = ((dc & Amask) >> Ashift); + aTmp = (255 - alpha); + if ((A = 255 - ((aTmp * (255 - surfaceAlpha)) >> 8 ))) { + aTmp *= surfaceAlpha; + R = (preMultR + ((aTmp * ((dc & Rmask) >> Rshift)) >> 8)) / A << Rshift & Rmask; + G = (preMultG + ((aTmp * ((dc & Gmask) >> Gshift)) >> 8)) / A << Gshift & Gmask; + B = (preMultB + ((aTmp * ((dc & Bmask) >> Bshift)) >> 8)) / A << Bshift & Bmask; + } + *pixel = R | G | B | (A << Ashift & Amask); + + } + } + break; +#endif + } + } +} + + +/* FIXME: eliminate these 2 functions */ + +static int raster_pixelColorNolock(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color) +{ + int result = 0; + +#if 0 + /* + * Setup color + */ + alpha = color & 0x000000ff; + mcolor = + SDL_MapRGBA(dst->format, (color & 0xff000000) >> 24, + (color & 0x00ff0000) >> 16, (color & 0x0000ff00) >> 8, alpha); +#endif + + /* + * Draw + */ + raster_PutPixel(dst, x, y, color); + + return (result); +} + + +/* Pixel - using alpha weight on color for AA-drawing - no locking */ + +static int raster_pixelColorWeightNolock(SDL_Surface * dst, Sint16 x, Sint16 y, Uint32 color, Uint32 weight) +{ +#if 0 + Uint32 a; + + /* + * Get alpha + */ + a = (color & (Uint32) 0x000000ff); + + /* + * Modify Alpha by weight + */ + a = ((a * weight) >> 8); +#endif + + raster_PutPixelAlpha(dst, x, y, color, weight); + + return 0; +} + + +/* raster :: line */ + + + +static inline void raster_hline(SDL_Surface * dst, Sint16 x1, Sint16 x2, Sint16 y, Uint32 color) +{ +#if 1 + SDL_Rect l; + + /* sge */ + if(x1>x2){Sint16 tmp=x1; x1=x2; x2=tmp;} + + l.x=x1; l.y=y; l.w=x2-x1+1; l.h=1; + + SDL_FillRect(dst, &l, color); + +#else + /* sdl_gfx */ + Sint16 left, right, top, bottom; + Uint8 *pixel, *pixellast; + int dx; + int pixx, pixy; + Sint16 w; + Sint16 xtmp; + int result = -1; +#if 0 + int i; + union + { + double d; + uint16_t col[4]; + } doub; + + for(i = 0; i < 4; i++) + { + doub.col[i] = color; + } +#endif + + /* + * Check visibility of clipping rectangle + */ + if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { + return(0); + } + + /* + * Swap x1, x2 if required to ensure x1<=x2 + */ + if (x1 > x2) { + xtmp = x1; + x1 = x2; + x2 = xtmp; + } + + /* + * Get clipping boundary and + * check visibility of hline + */ + left = dst->clip_rect.x; + if (x2clip_rect.x + dst->clip_rect.w - 1; + if (x1>right) { + return(0); + } + top = dst->clip_rect.y; + bottom = dst->clip_rect.y + dst->clip_rect.h - 1; + if ((ybottom)) { + return (0); + } + + /* + * Clip x + */ + if (x1 < left) { + x1 = left; + } + if (x2 > right) { + x2 = right; + } + + /* + * Calculate width + */ + w = x2 - x1; + +#if 0 + printf("raster_hline %d %d %d %d\n", x1, x2, y, w); +#endif + + /* + * Lock surface + */ + if (SDL_MUSTLOCK(dst)) { + SDL_LockSurface(dst); + } + + /* + * More variable setup + */ + dx = w; + pixx = dst->format->BytesPerPixel; + pixy = dst->pitch; + pixel = ((Uint8 *) dst->pixels) + pixx * (int) x1 + pixy * (int) y; + + /* + * Draw + */ + switch (dst->format->BytesPerPixel) { + case 1: + memset(pixel, color, dx); + break; + case 2: + pixellast = pixel + dx + dx; +#if 0 + for (; (pixel+3) <= pixellast; pixel += 4*pixx) + { + *(double *)pixel = doub.d; + } +#endif + for (; pixel <= pixellast; pixel += pixx) { + *(Uint16 *) pixel = color; + } + break; + case 3: + pixellast = pixel + dx + dx + dx; + for (; pixel <= pixellast; pixel += pixx) { + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + pixel[0] = (color >> 16) & 0xff; + pixel[1] = (color >> 8) & 0xff; + pixel[2] = color & 0xff; + } else { + pixel[0] = color & 0xff; + pixel[1] = (color >> 8) & 0xff; + pixel[2] = (color >> 16) & 0xff; + } + } + break; + default: /* case 4 */ + dx = dx + dx; + pixellast = pixel + dx + dx; + for (; pixel <= pixellast; pixel += pixx) { + *(Uint32 *) pixel = color; + } + break; + } + + /* + * Unlock surface + */ + if (SDL_MUSTLOCK(dst)) { + SDL_UnlockSurface(dst); + } + + /* + * Set result code + */ + result = 0; + + return (result); +#endif +} + +static void raster_vline(SDL_Surface *dst, Sint16 x, Sint16 y1, Sint16 y2, Uint32 color) +{ + SDL_Rect l; + + if(y1>y2){Sint16 tmp=y1; y1=y2; y2=tmp;} + + l.x=x; l.y=y1; l.w=1; l.h=y2-y1+1; + + SDL_FillRect(dst, &l, color); +} + + + +/* raster_line */ +#define CLIP_LEFT_EDGE 0x1 +#define CLIP_RIGHT_EDGE 0x2 +#define CLIP_BOTTOM_EDGE 0x4 +#define CLIP_TOP_EDGE 0x8 +#define CLIP_INSIDE(a) (!a) +#define CLIP_REJECT(a,b) (a&b) +#define CLIP_ACCEPT(a,b) (!(a|b)) + +static int clipEncode(Sint16 x, Sint16 y, Sint16 left, Sint16 top, Sint16 right, Sint16 bottom) +{ + int code = 0; + + if (x < left) { + code |= CLIP_LEFT_EDGE; + } else if (x > right) { + code |= CLIP_RIGHT_EDGE; + } + if (y < top) { + code |= CLIP_TOP_EDGE; + } else if (y > bottom) { + code |= CLIP_BOTTOM_EDGE; + } + return code; +} + +static int clipLine(SDL_Surface * dst, Sint16 * x1, Sint16 * y1, Sint16 * x2, Sint16 * y2) +{ + Sint16 left, right, top, bottom; + int code1, code2; + int draw = 0; + Sint16 swaptmp; + float m; + + /* + * Get clipping boundary + */ + left = dst->clip_rect.x; + right = dst->clip_rect.x + dst->clip_rect.w - 1; + top = dst->clip_rect.y; + bottom = dst->clip_rect.y + dst->clip_rect.h - 1; + + while (1) { + code1 = clipEncode(*x1, *y1, left, top, right, bottom); + code2 = clipEncode(*x2, *y2, left, top, right, bottom); + if (CLIP_ACCEPT(code1, code2)) { + draw = 1; + break; + } else if (CLIP_REJECT(code1, code2)) + break; + else { + if (CLIP_INSIDE(code1)) { + swaptmp = *x2; + *x2 = *x1; + *x1 = swaptmp; + swaptmp = *y2; + *y2 = *y1; + *y1 = swaptmp; + swaptmp = code2; + code2 = code1; + code1 = swaptmp; + } + if (*x2 != *x1) { + m = (*y2 - *y1) / (float) (*x2 - *x1); + } else { + m = 1.0f; + } + if (code1 & CLIP_LEFT_EDGE) { + *y1 += (Sint16) ((left - *x1) * m); + *x1 = left; + } else if (code1 & CLIP_RIGHT_EDGE) { + *y1 += (Sint16) ((right - *x1) * m); + *x1 = right; + } else if (code1 & CLIP_BOTTOM_EDGE) { + if (*x2 != *x1) { + *x1 += (Sint16) ((bottom - *y1) / m); + } + *y1 = bottom; + } else if (code1 & CLIP_TOP_EDGE) { + if (*x2 != *x1) { + *x1 += (Sint16) ((top - *y1) / m); + } + *y1 = top; + } + } + } + + return draw; +} + + +void raster_line(SDL_Surface *dst, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint32_t color) +{ + /* sdl-gfx */ + int pixx, pixy; + int x, y; + int dx, dy; + int sx, sy; + int swaptmp; + void *pixel; + + /* + * Clip line and test if we have to draw + */ + if (!(clipLine(dst, &x1, &y1, &x2, &y2))) { + return; + } + + /* + * Test for special cases of straight lines or single point + */ + if (x1 == x2) { + if (y1 < y2) { + raster_vline(dst, x1, y1, y2, color); + return; + } else if (y1 > y2) { + raster_vline(dst, x1, y2, y1, color); + return; + } else { + raster_PutPixel(dst, x1, y1, color); + return; + } + } + if (y1 == y2) { + if (x1 < x2) { + raster_hline(dst, x1, x2, y1, color); + return; + } else if (x1 > x2) { + raster_hline(dst, x2, x1, y1, color); + return; + } + } + + + /* + * Variable setup + */ + dx = x2 - x1; + dy = y2 - y1; + sx = (dx >= 0) ? 1 : -1; + sy = (dy >= 0) ? 1 : -1; + + /* Lock surface */ + if (SDL_MUSTLOCK(dst)) { + if (SDL_LockSurface(dst) < 0) { + return; + } + } + + /* + * No alpha blending - use fast pixel routines + */ + +#if 0 + /* + * Setup color + */ + colorptr = (Uint8 *) & color; + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + color = SDL_MapRGBA(dst->format, colorptr[0], colorptr[1], colorptr[2], colorptr[3]); + } else { + color = SDL_MapRGBA(dst->format, colorptr[3], colorptr[2], colorptr[1], colorptr[0]); + } +#endif + + /* + * More variable setup + */ + dx = sx * dx + 1; + dy = sy * dy + 1; + pixx = dst->format->BytesPerPixel; + pixy = dst->pitch; + pixel = ((Uint8 *) dst->pixels) + pixx * (int) x1 + pixy * (int) y1; + pixx *= sx; + pixy *= sy; + if (dx < dy) { + swaptmp = dx; + dx = dy; + dy = swaptmp; + swaptmp = pixx; + pixx = pixy; + pixy = swaptmp; + } + + /* + * Draw + */ + x = 0; + y = 0; + switch (dst->format->BytesPerPixel) { + case 1: + for (; x < dx; x++, pixel=(Uint8 *)+pixx) { + *(Uint8 *)pixel = color; + y += dy; + if (y >= dx) { + y -= dx; + pixel = (Uint8 *)pixel + pixy; + } + } + break; + case 2: + for (; x < dx; x++, pixel=(Uint8 *)pixel+pixx) { + *(Uint16 *) pixel = color; + y += dy; + if (y >= dx) { + y -= dx; + pixel = (Uint8 *)pixel + pixy; + } + } + break; + case 3: + for (; x < dx; x++, pixel=(Uint8 *)pixel+pixx) { + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + *(Uint8 *)pixel = (color >> 16) & 0xff; + *((Uint8 *)pixel+1) = (color >> 8) & 0xff; + *((Uint8 *)pixel+2) = color & 0xff; + } else { + *(Uint8 *)pixel = color & 0xff; + *((Uint8 *)pixel+1) = (color >> 8) & 0xff; + *((Uint8 *)pixel+2) = (color >> 16) & 0xff; + } + y += dy; + if (y >= dx) { + y -= dx; + pixel = (Uint8 *)pixel + pixy; + } + } + break; + default: /* case 4 */ + for (; x < dx; x++, pixel=(Uint8 *)pixel+pixx) { + *(Uint32 *) pixel = color; + y += dy; + if (y >= dx) { + y -= dx; + pixel = (Uint8 *)pixel + pixy; + } + } + break; + } + + /* Unlock surface */ + if (SDL_MUSTLOCK(dst)) { + SDL_UnlockSurface(dst); + } + + return; +} + + +#define AAlevels 256 +#define AAbits 8 + +static void raster_aalineColorInt(SDL_Surface * dst, Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color, int draw_endpoint) +{ + Sint32 xx0, yy0, xx1, yy1; + int result; + Uint32 intshift, erracc, erradj; + Uint32 erracctmp, wgt, wgtcompmask; + int dx, dy, tmp, xdir, y0p1, x0pxdir; + + /* + * Check visibility of clipping rectangle + */ + if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { + return; + } + + /* + * Clip line and test if we have to draw + */ + if (!(clipLine(dst, &x1, &y1, &x2, &y2))) { + return; + } + + /* + * Keep on working with 32bit numbers + */ + xx0 = x1; + yy0 = y1; + xx1 = x2; + yy1 = y2; + + /* + * Reorder points if required + */ + if (yy0 > yy1) { + tmp = yy0; + yy0 = yy1; + yy1 = tmp; + tmp = xx0; + xx0 = xx1; + xx1 = tmp; + } + + /* + * Calculate distance + */ + dx = xx1 - xx0; + dy = yy1 - yy0; + + /* + * Adjust for negative dx and set xdir + */ + if (dx >= 0) { + xdir = 1; + } else { + xdir = -1; + dx = (-dx); + } + + /* + * Check for special cases + */ + if (dx == 0) { + /* + * Vertical line + */ + raster_vline(dst, x1, y1, y2, color); + return; + } else if (dy == 0) { + /* + * Horizontal line + */ + raster_hline(dst, x1, x2, y1, color); + return; + } else if (dx == dy) { + /* + * Diagonal line + */ + raster_line(dst, x1, y1, x2, y2, color); + return; + } + + /* + * Line is not horizontal, vertical or diagonal + */ + result = 0; + + /* + * Zero accumulator + */ + erracc = 0; + + /* + * # of bits by which to shift erracc to get intensity level + */ + intshift = 32 - AAbits; + /* + * Mask used to flip all bits in an intensity weighting + */ + wgtcompmask = AAlevels - 1; + + /* Lock surface */ + if (SDL_MUSTLOCK(dst)) { + if (SDL_LockSurface(dst) < 0) { + return; + } + } + + /* + * Draw the initial pixel in the foreground color + */ + raster_pixelColorNolock(dst, x1, y1, color); + + /* + * x-major or y-major? + */ + if (dy > dx) { + + /* + * y-major. Calculate 16-bit fixed point fractional part of a pixel that + * X advances every time Y advances 1 pixel, truncating the result so that + * we won't overrun the endpoint along the X axis + */ + /* + * Not-so-portable version: erradj = ((Uint64)dx << 32) / (Uint64)dy; + */ + erradj = ((dx << 16) / dy) << 16; + + /* + * draw all pixels other than the first and last + */ + x0pxdir = xx0 + xdir; + while (--dy) { + erracctmp = erracc; + erracc += erradj; + if (erracc <= erracctmp) { + /* + * rollover in error accumulator, x coord advances + */ + xx0 = x0pxdir; + x0pxdir += xdir; + } + yy0++; /* y-major so always advance Y */ + + /* + * the AAbits most significant bits of erracc give us the intensity + * weighting for this pixel, and the complement of the weighting for + * the paired pixel. + */ + wgt = (erracc >> intshift) & 255; + raster_pixelColorWeightNolock (dst, xx0, yy0, color, 255 - wgt); + raster_pixelColorWeightNolock (dst, x0pxdir, yy0, color, wgt); + } + + } else { + + /* + * x-major line. Calculate 16-bit fixed-point fractional part of a pixel + * that Y advances each time X advances 1 pixel, truncating the result so + * that we won't overrun the endpoint along the X axis. + */ + /* + * Not-so-portable version: erradj = ((Uint64)dy << 32) / (Uint64)dx; + */ + erradj = ((dy << 16) / dx) << 16; + + /* + * draw all pixels other than the first and last + */ + y0p1 = yy0 + 1; + while (--dx) { + + erracctmp = erracc; + erracc += erradj; + if (erracc <= erracctmp) { + /* + * Accumulator turned over, advance y + */ + yy0 = y0p1; + y0p1++; + } + xx0 += xdir; /* x-major so always advance X */ + /* + * the AAbits most significant bits of erracc give us the intensity + * weighting for this pixel, and the complement of the weighting for + * the paired pixel. + */ + wgt = (erracc >> intshift) & 255; + raster_pixelColorWeightNolock (dst, xx0, yy0, color, 255 - wgt); + raster_pixelColorWeightNolock (dst, xx0, y0p1, color, wgt); + } + } + + /* + * Do we have to draw the endpoint + */ + if (draw_endpoint) { + /* + * Draw final pixel, always exactly intersected by the line and doesn't + * need to be weighted. + */ + raster_pixelColorNolock (dst, x2, y2, color); + } + + /* Unlock surface */ + if (SDL_MUSTLOCK(dst)) { + SDL_UnlockSurface(dst); + } +} + +void raster_aaline(SDL_Surface *s, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint32_t col) +{ + raster_aalineColorInt(s, x1, y1, x2, y2, col, 1); +} + + + +/* raster :: circle */ + +void raster_circle(SDL_Surface *dst, int16_t x, int16_t y, int16_t r, uint32_t color) +{ + /* sdl-gfx */ + Sint16 left, right, top, bottom; + int result; + Sint16 x1, y1, x2, y2; + Sint16 cx = 0; + Sint16 cy = r; + Sint16 ocx = (Sint16) 0xffff; + Sint16 ocy = (Sint16) 0xffff; + Sint16 df = 1 - r; + Sint16 d_e = 3; + Sint16 d_se = -2 * r + 5; + Sint16 xpcx, xmcx, xpcy, xmcy; + Sint16 ypcy, ymcy, ypcx, ymcx; + + /* + * Check visibility of clipping rectangle + */ + if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { + return; + } + + /* + * Sanity check radius + */ + if (r < 0) { + return; + } + + /* + * Special case for r=0 - draw a point + */ + if (r == 0) { + return (raster_PutPixel(dst, x, y, color)); + } + + /* + * Get circle and clipping boundary and + * test if bounding box of circle is visible + */ + x2 = x + r; + left = dst->clip_rect.x; + if (x2clip_rect.x + dst->clip_rect.w - 1; + if (x1>right) { + return; + } + y2 = y + r; + top = dst->clip_rect.y; + if (y2clip_rect.y + dst->clip_rect.h - 1; + if (y1>bottom) { + return; + } + + /* + * Draw + */ + result = 0; + do { + xpcx = x + cx; + xmcx = x - cx; + xpcy = x + cy; + xmcy = x - cy; + if (ocy != cy) { + if (cy > 0) { + ypcy = y + cy; + ymcy = y - cy; + raster_hline(dst, xmcx, xpcx, ypcy, color); + raster_hline(dst, xmcx, xpcx, ymcy, color); +// raster_rect_inline(dst, xmcx, ypcy, 2*cx, 1, color); +// raster_rect_inline(dst, xmcx, ymcy, 2*cx, 1, color); + + } else { + raster_hline(dst, xmcx, xpcx, y, color); +// raster_rect_inline(dst, xmcx, y, 2*cx, 1, color); + } + ocy = cy; + } + if (ocx != cx) { + if (cx != cy) { + if (cx > 0) { + ypcx = y + cx; + ymcx = y - cx; + raster_hline(dst, xmcy, xpcy, ymcx, color); + raster_hline(dst, xmcy, xpcy, ypcx, color); + //raster_rect_inline(dst, xmcy, ymcx, 2*cy, 1, color); + //raster_rect_inline(dst, xmcy, ypcx, 2*cy, 1, color); + } else { + raster_hline(dst, xmcy, xpcy, y, color); + //raster_rect_inline(dst, xmcy, y, 2*cy, 1, color); + } + } + ocx = cx; + } + /* + * Update + */ + if (df < 0) { + df += d_e; + d_e += 2; + d_se += 2; + } else { + df += d_se; + d_e += 2; + d_se += 4; + cy--; + } + cx++; + } while (cx <= cy); +} + + +/* FIXME: convert to fixed pt */ +static void raster_AAFilledEllipse(SDL_Surface *surface, Sint16 xc, Sint16 yc, Sint16 rx, Sint16 ry, Uint32 color) +{ + /* sge */ + /* Sanity check */ + if (rx < 1) + rx = 1; + if (ry < 1) + ry = 1; + + int a2 = rx * rx; + int b2 = ry * ry; + + int ds = 2 * a2; + int dt = 2 * b2; + + int dxt = (int)(a2 / sqrt(a2 + b2)); + + int t = 0; + int s = -2 * a2 * ry; + int d = 0; + + Sint16 x = xc; + Sint16 y = yc - ry; + + Sint16 xs, ys, dyt; + float cp, is, ip, imax = 1.0; + + /* Lock surface */ + if ( SDL_MUSTLOCK(surface) ) + if ( SDL_LockSurface(surface) < 0 ) + return; + + /* "End points" */ + raster_PutPixel(surface, x, y, color); + raster_PutPixel(surface, 2*xc-x, y, color); + + raster_PutPixel(surface, x, 2*yc-y, color); + raster_PutPixel(surface, 2*xc-x, 2*yc-y, color); + + /* unlock surface */ + if (SDL_MUSTLOCK(surface) ) + SDL_UnlockSurface(surface); + + raster_vline(surface, x, y+1, 2*yc-y-1, color); + + int i; + + for (i = 1; i <= dxt; i++) + { + x--; + d += t - b2; + + if (d >= 0) + ys = y - 1; + else if ((d - s - a2) > 0) + { + if ((2 * d - s - a2) >= 0) + ys = y + 1; + else + { + ys = y; + y++; + d -= s + a2; + s += ds; + } + } + else + { + y++; + ys = y + 1; + d -= s + a2; + s += ds; + } + + t -= dt; + + /* Calculate alpha */ + cp = (float) abs(d) / abs(s); + is = cp * imax; + ip = imax - is; + + + /* Lock surface */ + if ( SDL_MUSTLOCK(surface) ) + if ( SDL_LockSurface(surface) < 0 ) + return; + + /* Upper half */ + raster_PutPixelAlpha(surface, x, y, color, (Uint8)(ip*255)); + raster_PutPixelAlpha(surface, 2*xc-x, y, color, (Uint8)(ip*255)); + + raster_PutPixelAlpha(surface, x, ys, color, (Uint8)(is*255)); + raster_PutPixelAlpha(surface, 2*xc-x, ys, color, (Uint8)(is*255)); + + + /* Lower half */ + raster_PutPixelAlpha(surface, x, 2*yc-y, color, (Uint8)(ip*255)); + raster_PutPixelAlpha(surface, 2*xc-x, 2*yc-y, color, (Uint8)(ip*255)); + + raster_PutPixelAlpha(surface, x, 2*yc-ys, color, (Uint8)(is*255)); + raster_PutPixelAlpha(surface, 2*xc-x, 2*yc-ys, color, (Uint8)(is*255)); + + /* unlock surface */ + if (SDL_MUSTLOCK(surface) ) + SDL_UnlockSurface(surface); + + + /* Fill */ + raster_vline(surface, x, y+1, 2*yc-y-1, color); + raster_vline(surface, 2*xc-x, y+1, 2*yc-y-1, color); + raster_vline(surface, x, ys+1, 2*yc-ys-1, color); + raster_vline(surface, 2*xc-x, ys+1, 2*yc-ys-1, color); + } + + dyt = abs(y - yc); + + for (i = 1; i <= dyt; i++) + { + y++; + d -= s + a2; + + if (d <= 0) + xs = x + 1; + else if ((d + t - b2) < 0) + { + if ((2 * d + t - b2) <= 0) + xs = x - 1; + else + { + xs = x; + x--; + d += t - b2; + t -= dt; + } + } + else + { + x--; + xs = x - 1; + d += t - b2; + t -= dt; + } + + s += ds; + + /* Calculate alpha */ + cp = (float) abs(d) / abs(t); + is = cp * imax; + ip = imax - is; + + + /* Lock surface */ + if ( SDL_MUSTLOCK(surface) ) + if ( SDL_LockSurface(surface) < 0 ) + return; + + /* Upper half */ + raster_PutPixelAlpha(surface, x, y, color, (Uint8)(ip*255)); + raster_PutPixelAlpha(surface, 2*xc-x, y, color, (Uint8)(ip*255)); + + raster_PutPixelAlpha(surface, xs, y, color, (Uint8)(is*255)); + raster_PutPixelAlpha(surface, 2*xc-xs, y, color, (Uint8)(is*255)); + + + /* Lower half*/ + raster_PutPixelAlpha(surface, x, 2*yc-y, color, (Uint8)(ip*255)); + raster_PutPixelAlpha(surface, 2*xc-x, 2*yc-y, color, (Uint8)(ip*255)); + + raster_PutPixelAlpha(surface, xs, 2*yc-y, color, (Uint8)(is*255)); + raster_PutPixelAlpha(surface, 2*xc-xs, 2*yc-y, color, (Uint8)(is*255)); + + /* unlock surface */ + if (SDL_MUSTLOCK(surface) ) + SDL_UnlockSurface(surface); + + /* Fill */ + raster_hline(surface, x+1, 2*xc-x-1, y, color); + raster_hline(surface, xs+1, 2*xc-xs-1, y, color); + raster_hline(surface, x+1, 2*xc-x-1, 2*yc-y, color); + raster_hline(surface, xs+1, 2*xc-xs-1, 2*yc-y, color); + } +} + +void raster_aacircle(SDL_Surface *s, int16_t x, int16_t y, int16_t r, uint32_t col) +{ + raster_AAFilledEllipse(s, x, y, r, r, col); +} + +#if 0 +void raster_aacircle(SDL_Surface *s, int16_t x, int16_t y, int16_t r, uint32_t col) +{ + /* sdl-gfx */ + Sint16 left, right, top, bottom; + int result; + Sint16 x1, y1, x2, y2; + Sint16 cx = 0; + Sint16 cy = r; + Sint16 ocx = (Sint16) 0xffff; + Sint16 ocy = (Sint16) 0xffff; + Sint16 df = 1 - r; + Sint16 d_e = 3; + Sint16 d_se = -2 * r + 5; + Sint16 xpcx, xmcx, xpcy, xmcy; + Sint16 ypcy, ymcy, ypcx, ymcx; + + /* + * Check visibility of clipping rectangle + */ + if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { + return; + } + + /* + * Sanity check radius + */ + if (r < 0) { + return; + } + +#if 0 + /* + * Special case for r=0 - draw a point + */ + if (r == 0) { + return (pixelColor(dst, x, y, color)); + } +#endif + + /* + * Get circle and clipping boundary and + * test if bounding box of circle is visible + */ + x2 = x + r; + left = dst->clip_rect.x; + if (x2clip_rect.x + dst->clip_rect.w - 1; + if (x1>right) { + return; + } + y2 = y + r; + top = dst->clip_rect.y; + if (y2clip_rect.y + dst->clip_rect.h - 1; + if (y1>bottom) { + return; + } + + /* + * Draw + */ + result = 0; + do { + xpcx = x + cx; + xmcx = x - cx; + xpcy = x + cy; + xmcy = x - cy; + if (ocy != cy) { + if (cy > 0) { + ypcy = y + cy; + ymcy = y - cy; + raster_hlineColor(dst, xmcx, xpcx, ypcy, color); + raster_hlineColor(dst, xmcx, xpcx, ymcy, color); +// raster_rect_inline(dst, xmcx, ypcy, 2*cx, 1, color); +// raster_rect_inline(dst, xmcx, ymcy, 2*cx, 1, color); + + } else { + raster_hlineColor(dst, xmcx, xpcx, y, color); +// raster_rect_inline(dst, xmcx, y, 2*cx, 1, color); + } + ocy = cy; + } + if (ocx != cx) { + if (cx != cy) { + if (cx > 0) { + ypcx = y + cx; + ymcx = y - cx; + raster_hlineColor(dst, xmcy, xpcy, ymcx, color); + raster_hlineColor(dst, xmcy, xpcy, ypcx, color); + //raster_rect_inline(dst, xmcy, ymcx, 2*cy, 1, color); + //raster_rect_inline(dst, xmcy, ypcx, 2*cy, 1, color); + } else { + raster_hlineColor(dst, xmcy, xpcy, y, color); + //raster_rect_inline(dst, xmcy, y, 2*cy, 1, color); + } + } + ocx = cx; + } + /* + * Update + */ + if (df < 0) { + df += d_e; + d_e += 2; + d_se += 2; + } else { + df += d_se; + d_e += 2; + d_se += 4; + cy--; + } + cx++; + } while (cx <= cy); +#if 0 + /* sge */ + Sint16 cx = 0; + Sint16 cy = r; + int draw=1; + Sint16 df = 1 - r; + Sint16 d_e = 3; + Sint16 d_se = -2 * r + 5; + +#ifdef DEBUG + printf("raster_circle %d %d %d\n", x, y, r); +#endif + + if(r < 0) + { + return; + } + + do { + if(draw) + { + raster_rect_inline(s, x-cx, y+cy, 2*cx, 1, col); + raster_rect_inline(s, x-cx, y-cy, 2*cx, 1, col); + draw=0; + } + if(cx!=cy) + { + if(cx) + { + raster_rect_inline(s, x-cy, y-cx, 2*cy, 1, col); + raster_rect_inline(s, x-cy, y+cx, 2*cy, 1, col); + } + else + { + raster_rect_inline(s, x-cy, y, 2*cy, 1, col); + } + } + + if (df < 0) + { + df += d_e; + d_e += 2; + d_se += 2; + } + else + { + df += d_se; + d_e += 2; + d_se += 4; + cy--; + draw=1; + } + cx++; + } while(cx <= cy); +#endif +} +#endif + + + +/* raster :: poly */ + + +/* ---- Filled Polygon */ + +/* Helper qsort callback for polygon drawing */ + +static int gfxPrimitivesCompareInt(const void *a, const void *b) +{ + return (*(const int *) a) - (*(const int *) b); +} + + +/* Global vertex array to use if optional parameters are not given in polygon calls. */ +static int *gfxPrimitivesPolyIntsGlobal = NULL; +static int gfxPrimitivesPolyAllocatedGlobal = 0; + +/* (Note: The last two parameters are optional; but required for multithreaded operation.) */ + +static inline int raster_filledPolygonColorMT(SDL_Surface * dst, const Sint16 * vx, const Sint16 * vy, int n, Uint32 color, int **polyInts, int *polyAllocated) +{ + /* sdl-gfx */ + int result; + int i; + int y, xa, xb; + int miny, maxy; + int x1, y1; + int x2, y2; + int ind1, ind2; + int ints; + int *gfxPrimitivesPolyInts = NULL; + int gfxPrimitivesPolyAllocated = 0; + + /* + * Check visibility of clipping rectangle + */ + if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { + return(0); + } + + /* + * Sanity check number of edges + */ + if (n < 3) { + return -1; + } + + /* + * Map polygon cache + */ + if ((polyInts==NULL) || (polyAllocated==NULL)) { + /* Use global cache */ + gfxPrimitivesPolyInts = gfxPrimitivesPolyIntsGlobal; + gfxPrimitivesPolyAllocated = gfxPrimitivesPolyAllocatedGlobal; + } else { + /* Use local cache */ + gfxPrimitivesPolyInts = *polyInts; + gfxPrimitivesPolyAllocated = *polyAllocated; + } + + /* + * Allocate temp array, only grow array + */ + if (!gfxPrimitivesPolyAllocated) { + gfxPrimitivesPolyInts = (int *) malloc(sizeof(int) * n); + gfxPrimitivesPolyAllocated = n; + } else { + if (gfxPrimitivesPolyAllocated < n) { + gfxPrimitivesPolyInts = (int *) realloc(gfxPrimitivesPolyInts, sizeof(int) * n); + gfxPrimitivesPolyAllocated = n; + } + } + + /* + * Check temp array + */ + if (gfxPrimitivesPolyInts==NULL) { + gfxPrimitivesPolyAllocated = 0; + } + + /* + * Update cache variables + */ + if ((polyInts==NULL) || (polyAllocated==NULL)) { + gfxPrimitivesPolyIntsGlobal = gfxPrimitivesPolyInts; + gfxPrimitivesPolyAllocatedGlobal = gfxPrimitivesPolyAllocated; + } else { + *polyInts = gfxPrimitivesPolyInts; + *polyAllocated = gfxPrimitivesPolyAllocated; + } + + /* + * Check temp array again + */ + if (gfxPrimitivesPolyInts==NULL) { + return(-1); + } + + /* + * Determine Y maxima + */ + miny = vy[0]; + maxy = vy[0]; + for (i = 1; (i < n); i++) { + if (vy[i] < miny) { + miny = vy[i]; + } else if (vy[i] > maxy) { + maxy = vy[i]; + } + } + + /* + * Draw, scanning y + */ + result = 0; + for (y = miny; (y <= maxy); y++) { + ints = 0; + for (i = 0; (i < n); i++) { + if (!i) { + ind1 = n - 1; + ind2 = 0; + } else { + ind1 = i - 1; + ind2 = i; + } + y1 = vy[ind1]; + y2 = vy[ind2]; + if (y1 < y2) { + x1 = vx[ind1]; + x2 = vx[ind2]; + } else if (y1 > y2) { + y2 = vy[ind1]; + y1 = vy[ind2]; + x2 = vx[ind1]; + x1 = vx[ind2]; + } else { + continue; + } + if ( ((y >= y1) && (y < y2)) || ((y == maxy) && (y > y1) && (y <= y2)) ) { + gfxPrimitivesPolyInts[ints++] = ((65536 * (y - y1)) / (y2 - y1)) * (x2 - x1) + (65536 * x1); + } + } + + qsort(gfxPrimitivesPolyInts, ints, sizeof(int), gfxPrimitivesCompareInt); + + for (i = 0; (i < ints); i += 2) { + xa = gfxPrimitivesPolyInts[i] + 1; + xa = (xa >> 16) + ((xa & 32768) >> 15); + xb = gfxPrimitivesPolyInts[i+1] - 1; + xb = (xb >> 16) + ((xb & 32768) >> 15); + raster_hline(dst, xa, xb, y, color); +// raster_rect_inline(dst, xa, y, xb - xa, 1, color); + } + } + + return (result); +} + +void raster_polygon(SDL_Surface *s, int16_t n, int16_t *vx, int16_t *vy, uint32_t col) +{ + raster_filledPolygonColorMT(s, vx, vy, n, col, NULL, NULL); +} + + +void raster_aapolygon(SDL_Surface *dst, int16_t n, int16_t *vx, int16_t *vy, uint32_t color) +{ + /* sdl-gfx + sge w/ rphlx changes: basically, draw aaline border, + then fill. + + the output is not perfect yet but usually looks better than aliasing + */ + int result; + int i; + int y, xa, xb; + int miny, maxy; + int x1, y1; + int x2, y2; + int ind1, ind2; + int ints; + int *gfxPrimitivesPolyInts = NULL; + int gfxPrimitivesPolyAllocated = 0; + const Sint16 *px1, *py1, *px2, *py2; + int **polyInts; + int *polyAllocated; + + polyInts = NULL; + polyAllocated = NULL; + + /* + * Check visibility of clipping rectangle + */ + if ((dst->clip_rect.w==0) || (dst->clip_rect.h==0)) { + return; + } + + /* + * Sanity check number of edges + */ + if (n < 3) { + return; + } + + + /* + * Pointer setup + */ + px1 = px2 = vx; + py1 = py2 = vy; + px2++; + py2++; + + /* + * Draw + */ + result = 0; + for (i = 1; i < n; i++) { + raster_aalineColorInt(dst, *px1, *py1, *px2, *py2, color, 0); + px1 = px2; + py1 = py2; + px2++; + py2++; + } + raster_aalineColorInt(dst, *px1, *py1, *vx, *vy, color, 0); + + /* + * Map polygon cache + */ + if ((polyInts==NULL) || (polyAllocated==NULL)) { + /* Use global cache */ + gfxPrimitivesPolyInts = gfxPrimitivesPolyIntsGlobal; + gfxPrimitivesPolyAllocated = gfxPrimitivesPolyAllocatedGlobal; + } else { + /* Use local cache */ + gfxPrimitivesPolyInts = *polyInts; + gfxPrimitivesPolyAllocated = *polyAllocated; + } + + /* + * Allocate temp array, only grow array + */ + if (!gfxPrimitivesPolyAllocated) { + gfxPrimitivesPolyInts = (int *) malloc(sizeof(int) * n); + gfxPrimitivesPolyAllocated = n; + } else { + if (gfxPrimitivesPolyAllocated < n) { + gfxPrimitivesPolyInts = (int *) realloc(gfxPrimitivesPolyInts, sizeof(int) * n); + gfxPrimitivesPolyAllocated = n; + } + } + + /* + * Check temp array + */ + if (gfxPrimitivesPolyInts==NULL) { + gfxPrimitivesPolyAllocated = 0; + } + + /* + * Update cache variables + */ + if ((polyInts==NULL) || (polyAllocated==NULL)) { + gfxPrimitivesPolyIntsGlobal = gfxPrimitivesPolyInts; + gfxPrimitivesPolyAllocatedGlobal = gfxPrimitivesPolyAllocated; + } else { + *polyInts = gfxPrimitivesPolyInts; + *polyAllocated = gfxPrimitivesPolyAllocated; + } + + /* + * Check temp array again + */ + if (gfxPrimitivesPolyInts==NULL) { + return; + } + + /* + * Determine Y maxima + */ + miny = vy[0]; + maxy = vy[0]; + for (i = 1; (i < n); i++) { + if (vy[i] < miny) { + miny = vy[i]; + } else if (vy[i] > maxy) { + maxy = vy[i]; + } + } + + /* + * Draw, scanning y + */ + result = 0; + for (y = miny; (y <= maxy); y++) { + ints = 0; + for (i = 0; (i < n); i++) { + if (!i) { + ind1 = n - 1; + ind2 = 0; + } else { + ind1 = i - 1; + ind2 = i; + } + y1 = vy[ind1]; + y2 = vy[ind2]; + if (y1 < y2) { + x1 = vx[ind1]; + x2 = vx[ind2]; + } else if (y1 > y2) { + y2 = vy[ind1]; + y1 = vy[ind2]; + x2 = vx[ind1]; + x1 = vx[ind2]; + } else { + continue; + } + if ( ((y >= y1) && (y < y2)) || ((y == maxy) && (y > y1) && (y <= y2)) ) { + gfxPrimitivesPolyInts[ints++] = ((65536 * (y - y1)) / (y2 - y1)) * (x2 - x1) + (65536 * x1); + } + } + + qsort(gfxPrimitivesPolyInts, ints, sizeof(int), gfxPrimitivesCompareInt); + +// o = p = -1; + for (i = 0; (i < ints); i +=2) { +#if 0 + xa = gfxPrimitivesPolyInts[i] + 1; + xa = (xa >> 16) + ((xa & 32768) >> 15); + xb = gfxPrimitivesPolyInts[i+1] - 1; + xb = (xb >> 16) + ((xb & 32768) >> 15); +#else + xa = (gfxPrimitivesPolyInts[i] >> 16); + xb = (gfxPrimitivesPolyInts[i+1] >> 16); +#endif + +#if 0 + if(o < 0) + { + o = xa+1; + } + else if(p < 0) + { + p = xa; + } + + if( (o >= 0) && (p >= 0)) + { + if(p-o < 0) + { + o = p = -1; + continue; + } + + raster_hlineColor(dst, o, p, y, color); + + o = p = -1; + } +#else + + raster_hline(dst, xa+1, xb, y, color); +#endif + +// raster_rect_inline(dst, xa, y, xb - xa, 1, color); + } + } +} + diff --git a/navit/graphics/sdl/raster.h b/navit/graphics/sdl/raster.h new file mode 100644 index 0000000..8f50b27 --- /dev/null +++ b/navit/graphics/sdl/raster.h @@ -0,0 +1,25 @@ +/* raster.h -- line/rect/circle/poly rasterization + + copyright (c) 2008 bryan rittmeyer + + license: LGPLv2 +*/ + +#ifndef __RASTER_H +#define __RASTER_H + +#include +#include + +void raster_rect(SDL_Surface *s, int16_t x, int16_t y, int16_t w, int16_t h, uint32_t col); + +void raster_line(SDL_Surface *s, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint32_t col); +void raster_circle(SDL_Surface *s, int16_t x, int16_t y, int16_t r, uint32_t col); +void raster_polygon(SDL_Surface *s, int16_t n, int16_t *vx, int16_t *vy, uint32_t col); + +void raster_aaline(SDL_Surface *s, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint32_t col); +void raster_aacircle(SDL_Surface *s, int16_t x, int16_t y, int16_t r, uint32_t col); +void raster_aapolygon(SDL_Surface *s, int16_t n, int16_t *vx, int16_t *vy, uint32_t col); + +#endif /* __RASTER_H */ + diff --git a/navit/graphics/win32/Makefile.am b/navit/graphics/win32/Makefile.am new file mode 100644 index 0000000..15ec244 --- /dev/null +++ b/navit/graphics/win32/Makefile.am @@ -0,0 +1,12 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ @ZLIB_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=graphics_win32 +libgraphics_win32_la_SOURCES = graphics_win32.c xpm2bmp.c +libgraphics_win32_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +if !SUPPORT_WIN32CE +libgraphics_win32_la_LDFLAGS += -Wl,-lgdi32 +endif +if PLUGINS +modulegraphics_LTLIBRARIES = libgraphics_win32.la +else +noinst_LTLIBRARIES = libgraphics_win32.la +endif diff --git a/navit/graphics/win32/Makefile.in b/navit/graphics/win32/Makefile.in new file mode 100644 index 0000000..92e82a5 --- /dev/null +++ b/navit/graphics/win32/Makefile.in @@ -0,0 +1,708 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +@SUPPORT_WIN32CE_FALSE@am__append_1 = -Wl,-lgdi32 +subdir = navit/graphics/win32 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulegraphicsdir)" +LTLIBRARIES = $(modulegraphics_LTLIBRARIES) $(noinst_LTLIBRARIES) +libgraphics_win32_la_LIBADD = +am_libgraphics_win32_la_OBJECTS = graphics_win32.lo xpm2bmp.lo +libgraphics_win32_la_OBJECTS = $(am_libgraphics_win32_la_OBJECTS) +libgraphics_win32_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libgraphics_win32_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libgraphics_win32_la_rpath = +@PLUGINS_TRUE@am_libgraphics_win32_la_rpath = -rpath \ +@PLUGINS_TRUE@ $(modulegraphicsdir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libgraphics_win32_la_SOURCES) +DIST_SOURCES = $(libgraphics_win32_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ @ZLIB_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=graphics_win32 +libgraphics_win32_la_SOURCES = graphics_win32.c xpm2bmp.c +libgraphics_win32_la_LDFLAGS = -module -avoid-version \ + @NAVIT_MODULE_LDFLAGS@ $(am__append_1) +@PLUGINS_TRUE@modulegraphics_LTLIBRARIES = libgraphics_win32.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libgraphics_win32.la +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/graphics/win32/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/graphics/win32/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulegraphicsLTLIBRARIES: $(modulegraphics_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulegraphicsdir)" || $(MKDIR_P) "$(DESTDIR)$(modulegraphicsdir)" + @list='$(modulegraphics_LTLIBRARIES)'; test -n "$(modulegraphicsdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulegraphicsdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulegraphicsdir)"; \ + } + +uninstall-modulegraphicsLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulegraphics_LTLIBRARIES)'; test -n "$(modulegraphicsdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulegraphicsdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulegraphicsdir)/$$f"; \ + done + +clean-modulegraphicsLTLIBRARIES: + -test -z "$(modulegraphics_LTLIBRARIES)" || rm -f $(modulegraphics_LTLIBRARIES) + @list='$(modulegraphics_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgraphics_win32.la: $(libgraphics_win32_la_OBJECTS) $(libgraphics_win32_la_DEPENDENCIES) + $(libgraphics_win32_la_LINK) $(am_libgraphics_win32_la_rpath) $(libgraphics_win32_la_OBJECTS) $(libgraphics_win32_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphics_win32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xpm2bmp.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulegraphicsdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulegraphicsLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulegraphicsLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulegraphicsLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulegraphicsLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-modulegraphicsLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am \ + uninstall-modulegraphicsLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/graphics/win32/graphics_win32.c b/navit/graphics/win32/graphics_win32.c new file mode 100644 index 0000000..20f7e42 --- /dev/null +++ b/navit/graphics/win32/graphics_win32.c @@ -0,0 +1,1751 @@ +#include +#include +#include +#include +#include +#include +#include +#include "config.h" +#include "debug.h" +#include "point.h" +#include "graphics.h" +#include "color.h" +#include "callback.h" +#include "plugin.h" +#include "item.h" +#include "window.h" +#include "graphics_win32.h" +#include "xpm2bmp.h" +#include "support/win32/ConvertUTF.h" +#include "profile.h" +#include "keys.h" + +#ifdef HAVE_API_WIN32_CE +#include "libc.h" +#endif + +//#define FAST_TRANSPARENCY 1 + +#if defined(_WIN32_WCE) && _WIN32_WCE < 0x500 && !defined(__MINGW32CE__) + +typedef struct { + int BlendOp; + int BlendFlags; + int SourceConstantAlpha; + int AlphaFormat; +} BLENDFUNCTION; + +#define AC_SRC_OVER 1 +#define AC_SRC_ALPHA 2 +#endif + +typedef BOOL (WINAPI *FP_AlphaBlend) ( HDC hdcDest, + int nXOriginDest, + int nYOriginDest, + int nWidthDest, + int nHeightDest, + HDC hdcSrc, + int nXOriginSrc, + int nYOriginSrc, + int nWidthSrc, + int nHeightSrc, + BLENDFUNCTION blendFunction + ); + +struct graphics_priv +{ + struct navit *nav; + struct window window; + struct point p; + int width; + int height; + int disabled; + HANDLE wnd_parent_handle; + HANDLE wnd_handle; + COLORREF bg_color; + struct callback_list *cbl; + enum draw_mode_num mode; + struct graphics_priv* parent; + struct graphics_priv *overlays; + struct graphics_priv *next; + struct color transparent_color; + DWORD* pPixelData; + HDC hMemDC; + HDC hPrebuildDC; + HBITMAP hBitmap; + HBITMAP hPrebuildBitmap; + HBITMAP hOldBitmap; + HBITMAP hOldPrebuildBitmap; + FP_AlphaBlend AlphaBlend; + HANDLE hCoreDll; + GHashTable *image_cache_hash; + BOOL WINAPI (*ChangeWindowMessageFilter)(UINT message, DWORD dwFlag); + BOOL WINAPI (*ChangeWindowMessageFilterEx)( HWND hWnd, UINT message, DWORD action, void *pChangeFilterStruct); +}; + +struct window_priv +{ + HANDLE hBackLight; +}; + +static HWND g_hwnd = NULL; + +#ifdef HAVE_API_WIN32_CE +static int fullscr = 0; +#endif + + +#ifndef GET_WHEEL_DELTA_WPARAM +#define GET_WHEEL_DELTA_WPARAM(wParam) ((short)HIWORD(wParam)) +#endif + + +HFONT EzCreateFont (HDC hdc, TCHAR * szFaceName, int iDeciPtHeight, + int iDeciPtWidth, int iAttributes, BOOL fLogRes) ; + +#define EZ_ATTR_BOLD 1 +#define EZ_ATTR_ITALIC 2 +#define EZ_ATTR_UNDERLINE 4 +#define EZ_ATTR_STRIKEOUT 8 + +HFONT EzCreateFont (HDC hdc, TCHAR * szFaceName, int iDeciPtHeight, + int iDeciPtWidth, int iAttributes, BOOL fLogRes) +{ + FLOAT cxDpi, cyDpi ; + HFONT hFont ; + LOGFONT lf ; + POINT pt ; + TEXTMETRIC tm ; + + SaveDC (hdc) ; + +#ifndef HAVE_API_WIN32_CE + SetGraphicsMode (hdc, GM_ADVANCED) ; + ModifyWorldTransform (hdc, NULL, MWT_IDENTITY) ; +#endif + SetViewportOrgEx (hdc, 0, 0, NULL) ; +#ifndef HAVE_API_WIN32_CE + SetWindowOrgEx (hdc, 0, 0, NULL) ; +#endif + + if (fLogRes) + { + cxDpi = (FLOAT) GetDeviceCaps (hdc, LOGPIXELSX) ; + cyDpi = (FLOAT) GetDeviceCaps (hdc, LOGPIXELSY) ; + } + else + { + cxDpi = (FLOAT) (25.4 * GetDeviceCaps (hdc, HORZRES) / + GetDeviceCaps (hdc, HORZSIZE)) ; + + cyDpi = (FLOAT) (25.4 * GetDeviceCaps (hdc, VERTRES) / + GetDeviceCaps (hdc, VERTSIZE)) ; + } + + pt.x = (int) (iDeciPtWidth * cxDpi / 72) ; + pt.y = (int) (iDeciPtHeight * cyDpi / 72) ; + +#ifndef HAVE_API_WIN32_CE + DPtoLP (hdc, &pt, 1) ; +#endif + lf.lfHeight = - (int) (fabs (pt.y) / 10.0 + 0.5) ; + lf.lfWidth = 0 ; + lf.lfEscapement = 0 ; + lf.lfOrientation = 0 ; + lf.lfWeight = iAttributes & EZ_ATTR_BOLD ? 700 : 0 ; + lf.lfItalic = iAttributes & EZ_ATTR_ITALIC ? 1 : 0 ; + lf.lfUnderline = iAttributes & EZ_ATTR_UNDERLINE ? 1 : 0 ; + lf.lfStrikeOut = iAttributes & EZ_ATTR_STRIKEOUT ? 1 : 0 ; + lf.lfCharSet = DEFAULT_CHARSET ; + lf.lfOutPrecision = 0 ; + lf.lfClipPrecision = 0 ; + lf.lfQuality = 0 ; + lf.lfPitchAndFamily = 0 ; + + lstrcpy (lf.lfFaceName, szFaceName) ; + + hFont = CreateFontIndirect (&lf) ; + + if (iDeciPtWidth != 0) + { + hFont = (HFONT) SelectObject (hdc, hFont) ; + + GetTextMetrics (hdc, &tm) ; + + DeleteObject (SelectObject (hdc, hFont)) ; + + lf.lfWidth = (int) (tm.tmAveCharWidth * + fabs (pt.x) / fabs (pt.y) + 0.5) ; + + hFont = CreateFontIndirect (&lf) ; + } + + RestoreDC (hdc, -1) ; + return hFont ; +} + +struct graphics_image_priv +{ + PXPM2BMP pxpm; + int width,height,row_bytes,channels; + unsigned char *png_pixels; + HBITMAP hBitmap; + struct point hot; +}; + + +static void ErrorExit(LPTSTR lpszFunction) +{ + // Retrieve the system error message for the last-error code + + LPVOID lpMsgBuf; + LPVOID lpDisplayBuf; + DWORD dw = GetLastError(); + + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + dw, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &lpMsgBuf, + 0, NULL ); + + lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, + (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR)); + _tprintf((LPTSTR)lpDisplayBuf, TEXT("%s failed with error %d: %s"), lpszFunction, dw, lpMsgBuf); + + dbg(0, "%s failed with error %d: %s", lpszFunction, dw, lpMsgBuf); + MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); + + LocalFree(lpMsgBuf); + LocalFree(lpDisplayBuf); + ExitProcess(dw); +} + + + +struct graphics_gc_priv +{ + HWND hwnd; + int line_width; + COLORREF fg_color; + int fg_alpha; + COLORREF bg_color; + HPEN hpen; + HBRUSH hbrush; + struct graphics_priv *gr; +}; + + +static void create_memory_dc(struct graphics_priv *gr) +{ + HDC hdc; + BITMAPINFO bOverlayInfo; + + if (gr->hMemDC) + { + (void)SelectBitmap(gr->hMemDC, gr->hOldBitmap); + DeleteBitmap(gr->hBitmap); + DeleteDC(gr->hMemDC); + + (void)SelectBitmap(gr->hPrebuildDC, gr->hOldPrebuildBitmap); + DeleteBitmap(gr->hPrebuildBitmap); + DeleteDC(gr->hPrebuildDC); + gr->hPrebuildDC = 0; + } + + + hdc = GetDC( gr->wnd_handle ); + // Creates memory DC + gr->hMemDC = CreateCompatibleDC(hdc); + dbg(0, "resize memDC to: %d %d \n", gr->width, gr->height ); + + +#ifndef FAST_TRANSPARENCY + + memset(&bOverlayInfo, 0, sizeof(BITMAPINFO)); + bOverlayInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bOverlayInfo.bmiHeader.biWidth = gr->width; + bOverlayInfo.bmiHeader.biHeight = -gr->height; + bOverlayInfo.bmiHeader.biBitCount = 32; + bOverlayInfo.bmiHeader.biCompression = BI_RGB; + bOverlayInfo.bmiHeader.biPlanes = 1; + gr->hPrebuildDC = CreateCompatibleDC(NULL); + gr->hPrebuildBitmap = CreateDIBSection(gr->hMemDC, &bOverlayInfo, DIB_RGB_COLORS , (void **)&gr->pPixelData, NULL, 0); + gr->hOldPrebuildBitmap = SelectBitmap(gr->hPrebuildDC, gr->hPrebuildBitmap); + +#endif + gr->hBitmap = CreateCompatibleBitmap(hdc, gr->width, gr->height ); + + if ( gr->hBitmap ) + { + gr->hOldBitmap = SelectBitmap( gr->hMemDC, gr->hBitmap); + } + ReleaseDC( gr->wnd_handle, hdc ); +} + +static void HandleButtonClick( struct graphics_priv *gra_priv, int updown, int button, long lParam ) +{ + struct point pt = { LOWORD(lParam), HIWORD(lParam) }; + callback_list_call_attr_3(gra_priv->cbl, attr_button, (void *)updown, (void *)button, (void *)&pt); +} + +static void HandleKeyChar(struct graphics_priv *gra_priv, WPARAM wParam) +{ + TCHAR key = (TCHAR) wParam; + char *s=NULL; + char k[]={0,0}; + dbg(1,"HandleKey %d\n",key); + switch (key) { + default: + k[0]=key; + s=k; + break; + } + if (s) + callback_list_call_attr_1(gra_priv->cbl, attr_keypress, (void *)s); +} + +static void HandleKeyDown(struct graphics_priv *gra_priv, WPARAM wParam) +{ + int key = (int) wParam; + char up[]={NAVIT_KEY_UP,0}; + char down[]={NAVIT_KEY_DOWN,0}; + char left[]={NAVIT_KEY_LEFT,0}; + char right[]={NAVIT_KEY_RIGHT,0}; + char *s=NULL; + dbg(1,"HandleKey %d\n",key); + switch (key) { + case 37: + s=left; + break; + case 38: + s=up; + break; + case 39: + s=right; + break; + case 40: + s=down; + break; + } + if (s) + callback_list_call_attr_1(gra_priv->cbl, attr_keypress, (void *)s); +} + + +static LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + + struct graphics_priv* gra_priv = (struct graphics_priv*)GetWindowLongPtr( hwnd , DWLP_USER ); + + switch (Message) + { + case WM_CREATE: + { + if ( gra_priv ) + { + RECT rc ; + + GetClientRect( hwnd, &rc ); + gra_priv->width = rc.right; + gra_priv->height = rc.bottom; + create_memory_dc(gra_priv); + } + } + break; + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case WM_USER + 1: + break; + } + break; + case WM_CLOSE: + DestroyWindow(hwnd); + break; + case WM_USER+1: + if ( gra_priv ) + { + RECT rc ; + + GetClientRect( hwnd, &rc ); + gra_priv->width = rc.right; + gra_priv->height = rc.bottom; + + create_memory_dc(gra_priv); + callback_list_call_attr_2(gra_priv->cbl, attr_resize, (void *)gra_priv->width, (void *)gra_priv->height); + } + break; + case WM_USER+2: + { + struct callback_list *cbl = (struct callback_list*)wParam; +#ifdef HAVE_API_WIN32_CE + /* FIXME: Reset the idle timer need a better place */ + SystemIdleTimerReset(); +#endif + callback_list_call_0(cbl); + } + break; + + case WM_SIZE: + if ( gra_priv ) + { + gra_priv->width = LOWORD( lParam ); + gra_priv->height = HIWORD( lParam ); + create_memory_dc(gra_priv); + dbg(0, "resize gfx to: %d %d \n", gra_priv->width, gra_priv->height ); + callback_list_call_attr_2(gra_priv->cbl, attr_resize, (void *)gra_priv->width, (void *)gra_priv->height); + } + break; + case WM_DESTROY: +#ifdef HAVE_API_WIN32_CE + if ( gra_priv && gra_priv->window.priv ) + { + struct window_priv *win_priv = gra_priv->window.priv; + if (win_priv->hBackLight) + { + ReleasePowerRequirement(win_priv->hBackLight); + } + } +#endif + PostQuitMessage(0); + break; + case WM_PAINT: + if ( gra_priv && gra_priv->hMemDC) + { + struct graphics_priv* overlay; + PAINTSTRUCT ps = { 0 }; + HDC hdc; + profile(0, NULL); + dbg(1, "WM_PAINT\n"); + overlay = gra_priv->overlays; + +#ifndef FAST_TRANSPARENCY + BitBlt( gra_priv->hPrebuildDC, 0, 0, gra_priv->width , gra_priv->height, gra_priv->hMemDC, 0, 0, SRCCOPY); +#endif + while ( !gra_priv->disabled && overlay) + { + if ( !overlay->disabled && overlay->p.x >= 0 && + overlay->p.y >= 0 && + overlay->p.x < gra_priv->width && + overlay->p.y < gra_priv->height ) + { + int x,y; + int destPixel, srcPixel; + int h,w; +#ifdef FAST_TRANSPARENCY + if ( !overlay->hPrebuildDC ) + { + overlay->hPrebuildBitmap = CreateBitmap(overlay->width,overlay->height,1,1,NULL); + overlay->hPrebuildDC = CreateCompatibleDC(NULL); + overlay->hOldPrebuildBitmap = SelectBitmap( overlay->hPrebuildDC, overlay->hPrebuildBitmap); + SetBkColor(overlay->hMemDC,RGB(overlay->transparent_color.r >> 8,overlay->transparent_color.g >> 8,overlay->transparent_color.b >> 8)); + BitBlt(overlay->hPrebuildDC,0,0,overlay->width,overlay->height,overlay->hMemDC,0,0,SRCCOPY); + BitBlt(overlay->hMemDC,0,0,overlay->width,overlay->height,overlay->hPrebuildDC,0,0,SRCINVERT); + } + +#else + const COLORREF transparent_color = RGB(overlay->transparent_color.r >> 8,overlay->transparent_color.g >> 8,overlay->transparent_color.b >> 8); + + BitBlt( overlay->hPrebuildDC, 0, 0, overlay->width , overlay->height, overlay->hMemDC, 0, 0, SRCCOPY); + + h=overlay->height; + w=overlay->width; + if (w > gra_priv->width-overlay->p.x) + w=gra_priv->width-overlay->p.x; + if (h > gra_priv->height-overlay->p.y) + h=gra_priv->height-overlay->p.y; + for ( y = 0; y < h ;y++ ) + { + for ( x = 0; x < w; x++ ) + { + srcPixel = y*overlay->width+x; + destPixel = ((overlay->p.y + y) * gra_priv->width) + (overlay->p.x + x); + if ( overlay->pPixelData[srcPixel] == transparent_color ) + { + destPixel = ((overlay->p.y + y) * gra_priv->width) + (overlay->p.x + x); + + gra_priv->pPixelData[destPixel] = RGB ( ((65535 - overlay->transparent_color.a) * GetRValue(gra_priv->pPixelData[destPixel]) + overlay->transparent_color.a * GetRValue(overlay->pPixelData[srcPixel])) / 65535, + ((65535 - overlay->transparent_color.a) * GetGValue(gra_priv->pPixelData[destPixel]) + overlay->transparent_color.a * GetGValue(overlay->pPixelData[srcPixel])) / 65535, + ((65535 - overlay->transparent_color.a) * GetBValue(gra_priv->pPixelData[destPixel]) + overlay->transparent_color.a * GetBValue(overlay->pPixelData[srcPixel])) / 65535); + + } + else + { + gra_priv->pPixelData[destPixel] = overlay->pPixelData[srcPixel]; + } + } + + } +#endif + } + overlay = overlay->next; + } + + +#ifndef FAST_TRANSPARENCY + hdc = BeginPaint(hwnd, &ps); + BitBlt( hdc, 0, 0, gra_priv->width , gra_priv->height, gra_priv->hPrebuildDC, 0, 0, SRCCOPY ); +#else + HDC hdc = BeginPaint(hwnd, &ps); + + BitBlt( hdc, 0, 0, gra_priv->width , gra_priv->height, gra_priv->hMemDC, 0, 0, SRCCOPY ); + + overlay = gra_priv->overlays; + while ( !gra_priv->disabled && overlay && !overlay->disabled ) + { + if ( overlay->p.x > 0 && + overlay->p.y > 0 && + overlay->p.x + overlay->width < gra_priv->width && + overlay->p.y + overlay->height < gra_priv->height ) + { + BitBlt(hdc,overlay->p.x,overlay->p.y,overlay->width,overlay->height,overlay->hPrebuildDC,0,0,SRCAND); + BitBlt(hdc,overlay->p.x,overlay->p.y,overlay->width,overlay->height,overlay->hMemDC,0,0,SRCPAINT); + } + overlay = overlay->next; + } +#endif + EndPaint(hwnd, &ps); + profile(0, "WM_PAINT\n"); + } + break; + case WM_MOUSEMOVE: + { + struct point pt = { LOWORD(lParam), HIWORD(lParam) }; + callback_list_call_attr_1(gra_priv->cbl, attr_motion, (void *)&pt); + } + break; + + case WM_LBUTTONDOWN: + { + dbg(1, "LBUTTONDOWN\n"); + HandleButtonClick( gra_priv, 1, 1, lParam); + } + break; + case WM_LBUTTONUP: + { + dbg(1, "LBUTTONUP\n"); + HandleButtonClick( gra_priv, 0, 1, lParam); + } + break; + case WM_RBUTTONDOWN: + HandleButtonClick( gra_priv, 1, 3,lParam ); + break; + case WM_RBUTTONUP: + HandleButtonClick( gra_priv, 0, 3,lParam ); + break; + case WM_LBUTTONDBLCLK: + dbg(1, "LBUTTONDBLCLK\n"); + HandleButtonClick( gra_priv, 1, 6,lParam ); + break; + case WM_CHAR: + HandleKeyChar( gra_priv, wParam); + break; + case WM_KEYDOWN: + HandleKeyDown( gra_priv, wParam); + break; + case WM_COPYDATA: + dbg(0,"got WM_COPYDATA\n"); + callback_list_call_attr_2(gra_priv->cbl, attr_wm_copydata, (void *)wParam, (void*)lParam); + break; +#ifdef HAVE_API_WIN32_CE + case WM_SETFOCUS: + if (fullscr) { + HWND hwndSip = FindWindow(L"MS_SIPBUTTON", NULL); + // deactivate the SIP button + ShowWindow(hwndSip, SW_HIDE); + } + break; + case WM_KILLFOCUS: + if (fullscr != 1) { + HWND hwndSip = FindWindow(L"MS_SIPBUTTON", NULL); + // active the SIP button + ShowWindow(hwndSip, SW_SHOW); + } + break; +#endif + default: + return DefWindowProc(hwnd, Message, wParam, lParam); + } + return 0; +} + +static int fullscreen(struct window *win, int on) +{ + +#ifdef HAVE_API_WIN32_CE + HWND hwndTaskbar = FindWindow(L"HHTaskBar", NULL); + HWND hwndSip = FindWindow(L"MS_SIPBUTTON", NULL); + RECT taskbar_rect; + fullscr = on; + if (on) { + ShowWindow(hwndTaskbar, SW_HIDE); + MoveWindow(g_hwnd, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), FALSE); + + // deactivate the SIP button + ShowWindow(hwndSip, SW_HIDE); + + } else { + ShowWindow(hwndTaskbar, SW_SHOW); + GetWindowRect( hwndTaskbar, &taskbar_rect); + MoveWindow(g_hwnd, 0, taskbar_rect.bottom, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN) - taskbar_rect.bottom, FALSE); + + // activate the SIP button + ShowWindow(hwndSip, SW_SHOW); + } + +#else + if (on) { + ShowWindow(g_hwnd, SW_MAXIMIZE); + } else { + ShowWindow(g_hwnd, SW_RESTORE); + } + +#endif + + return 0; +} + +extern void WINAPI SystemIdleTimerReset(void); +static struct event_timeout * + event_win32_add_timeout(int timeout, int multi, struct callback *cb); + +static void disable_suspend(struct window *win) +{ +#ifdef HAVE_API_WIN32_CE + struct window_priv *win_priv = win->priv; + if ( win_priv && !win_priv->hBackLight ) + { + win_priv->hBackLight = SetPowerRequirement(TEXT("BKL1:"), 0, 0x01, NULL, 0); + event_win32_add_timeout(29000, 1, callback_new(SystemIdleTimerReset, 0, NULL)); + } + + SystemIdleTimerReset(); +#endif +} + +static const TCHAR g_szClassName[] = {'N','A','V','G','R','A','\0'}; + +static HANDLE CreateGraphicsWindows( struct graphics_priv* gr, HMENU hMenu ) +{ + int wStyle = WS_VISIBLE; + HWND hwnd; +#ifdef HAVE_API_WIN32_CE + WNDCLASS wc; +#else + WNDCLASSEX wc; + wc.cbSize = sizeof(WNDCLASSEX); + wc.hIconSm = NULL; +#endif + + wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; + wc.lpfnWndProc = WndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 64; + wc.hInstance = GetModuleHandle(NULL); + wc.hIcon = NULL; + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + wc.lpszMenuName = NULL; + wc.lpszClassName = g_szClassName; + + +#ifdef HAVE_API_WIN32_CE + gr->width = GetSystemMetrics(SM_CXSCREEN); + gr->height = GetSystemMetrics(SM_CYSCREEN); + +#if 0 + HWND hwndTaskbar = FindWindow(L"HHTaskBar", NULL); + RECT taskbar_rect; + GetWindowRect( hwndTaskbar, &taskbar_rect); + + gr->height -= taskbar_rect.bottom; +#endif + + + +#endif + +#ifdef HAVE_API_WIN32_CE + if (!RegisterClass(&wc)) +#else + if (!RegisterClassEx(&wc)) +#endif + { + dbg(0, "Window registration failed\n"); + return NULL; + } + + if ( hMenu ) + { + wStyle = WS_CHILD; + } else { + wStyle = WS_OVERLAPPED|WS_VISIBLE; + } + +#ifdef HAVE_API_WIN32_CE + g_hwnd = hwnd = CreateWindow(g_szClassName, + TEXT("Navit"), + wStyle, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + gr->wnd_parent_handle, + hMenu, + GetModuleHandle(NULL), + NULL); +#else + g_hwnd = hwnd = CreateWindow(g_szClassName, + TEXT("Navit"), + wStyle, + 0, + 0, + gr->width, + gr->height, + gr->wnd_parent_handle, + hMenu, + GetModuleHandle(NULL), + NULL); +#endif + if (hwnd == NULL) + { + dbg(0, "Window creation failed: %d\n", GetLastError()); + return NULL; + } + /* For Vista, we need here ChangeWindowMessageFilter(WM_COPYDATA,MSGFLT_ADD); since Win7 we need above one or ChangeWindowMessageFilterEx (MSDN), both are + not avail for earlier Win and not present in my mingw :(. ChangeWindowMessageFilter may not be present in later Win versions. Welcome late binding! + */ + if(gr->ChangeWindowMessageFilter) + gr->ChangeWindowMessageFilter(WM_COPYDATA,1 /*MSGFLT_ADD*/); + else if(gr->ChangeWindowMessageFilterEx) + gr->ChangeWindowMessageFilterEx(hwnd,WM_COPYDATA,1 /*MSGFLT_ALLOW*/,NULL); + + gr->wnd_handle = hwnd; + + callback_list_call_attr_2(gr->cbl, attr_resize, (void *)gr->width, (void *)gr->height); + create_memory_dc(gr); + + SetWindowLongPtr( hwnd , DWLP_USER, (LONG_PTR)gr ); + + ShowWindow( hwnd, SW_SHOW ); + UpdateWindow( hwnd ); + + PostMessage( gr->wnd_parent_handle, WM_USER + 1, 0, 0 ); + + return hwnd; +} + + + +static void graphics_destroy(struct graphics_priv *gr) +{ + g_free( gr ); +} + + +static void gc_destroy(struct graphics_gc_priv *gc) +{ + DeleteObject( gc->hpen ); + DeleteObject( gc->hbrush ); + g_free( gc ); +} + +static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) +{ + DeleteObject (gc->hpen); + gc->line_width = w; + gc->hpen = CreatePen( PS_SOLID, gc->line_width, gc->fg_color ); +} + +static void gc_set_dashes(struct graphics_gc_priv *gc, int width, int offset, unsigned char dash_list[], int n) +{ +// gdk_gc_set_dashes(gc->gc, 0, (gint8 *)dash_list, n); +// gdk_gc_set_line_attributes(gc->gc, 1, GDK_LINE_ON_OFF_DASH, GDK_CAP_ROUND, GDK_JOIN_ROUND); +} + + +static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) +{ + gc->fg_color = RGB( c->r >> 8, c->g >> 8, c->b >> 8); + gc->fg_alpha = c->a; + + DeleteObject (gc->hpen); + DeleteObject (gc->hbrush); + gc->hpen = CreatePen( PS_SOLID, gc->line_width, gc->fg_color ); + gc->hbrush = CreateSolidBrush( gc->fg_color ); + if ( gc->gr && c->a < 0xFFFF ) + { + gc->gr->transparent_color = *c; + } + +} + +static void gc_set_background(struct graphics_gc_priv *gc, struct color *c) +{ + gc->bg_color = RGB( c->r >> 8, c->g >> 8, c->b >> 8); + if ( gc->gr && gc->gr->hMemDC ) + SetBkColor( gc->gr->hMemDC, gc->bg_color ); + +} + +static struct graphics_gc_methods gc_methods = +{ + gc_destroy, + gc_set_linewidth, + gc_set_dashes, + gc_set_foreground, + gc_set_background, + NULL, //gc_set_stipple +}; + +static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) +{ + struct graphics_gc_priv *gc=g_new(struct graphics_gc_priv, 1); + *meth=gc_methods; + gc->hwnd = gr->wnd_handle; + gc->line_width = 1; + gc->fg_color = RGB( 0,0,0 ); + gc->bg_color = RGB( 255,255,255 ); + gc->hpen = CreatePen( PS_SOLID, gc->line_width, gc->fg_color ); + gc->hbrush = CreateSolidBrush( gc->fg_color ); + gc->gr = gr; + return gc; +} + + +static void draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) +{ + int i; + + HPEN hpenold = SelectObject( gr->hMemDC, gc->hpen ); + + int first = 1; + for ( i = 0; i< count; i++ ) + { + if ( first ) + { + first = 0; + MoveToEx( gr->hMemDC, p[0].x, p[0].y, NULL ); + } + else + { + LineTo( gr->hMemDC, p[i].x, p[i].y ); + } + } + + SelectObject( gr->hMemDC, hpenold); +} + +static void draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) +{ + HPEN holdpen = SelectObject( gr->hMemDC, gc->hpen ); + HBRUSH holdbrush = SelectObject( gr->hMemDC, gc->hbrush ); + if (sizeof(POINT) != sizeof(struct point)) { + int i; + POINT* points=g_alloca(sizeof(POINT)*count); + for ( i=0;i< count; i++ ) + { + points[i].x = p[i].x; + points[i].y = p[i].y; + } + Polygon( gr->hMemDC, points,count ); + } else + Polygon( gr->hMemDC, (POINT *)p, count); + SelectObject( gr->hMemDC, holdbrush); + SelectObject( gr->hMemDC, holdpen); +} + + +static void draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) +{ + HPEN holdpen = SelectObject( gr->hMemDC, gc->hpen ); + HBRUSH holdbrush = SelectObject( gr->hMemDC, gc->hbrush ); + + Rectangle(gr->hMemDC, p->x, p->y, p->x+w, p->y+h); + + SelectObject( gr->hMemDC, holdbrush); + SelectObject( gr->hMemDC, holdpen); +} + +static void draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r) +{ + HPEN holdpen = SelectObject( gr->hMemDC, gc->hpen ); + HBRUSH holdbrush = SelectObject( gr->hMemDC, GetStockObject(NULL_BRUSH)); + + r=r/2; + + Ellipse( gr->hMemDC, p->x - r, p->y -r, p->x + r, p->y + r ); + + SelectObject( gr->hMemDC, holdbrush); + SelectObject( gr->hMemDC, holdpen); +} + + + +static void draw_restore(struct graphics_priv *gr, struct point *p, int w, int h) +{ + InvalidateRect( gr->wnd_handle, NULL, FALSE ); +} + +static void draw_drag(struct graphics_priv *gr, struct point *p) +{ + if ( p ) + { + gr->p.x = p->x; + gr->p.y = p->y; + + if ( p->x < 0 || p->y < 0 || + ( gr->parent && ((p->x + gr->width > gr->parent->width) || (p->y + gr->height > gr->parent->height) ))) + { + gr->disabled = TRUE; + } + else + { + gr->disabled = FALSE; + } + } +} + +static void draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) +{ + dbg( 1, "set draw_mode to %x, %d\n", gr, (int)mode ); + + if ( mode == draw_mode_begin ) + { + if ( gr->wnd_handle == NULL ) + { + CreateGraphicsWindows( gr, (HMENU)ID_CHILD_GFX ); + } + if ( gr->mode != draw_mode_begin ) + { + if ( gr->hMemDC ) + { + dbg(1, "Erase dc: %x, w: %d, h: %d, bg_color: %x\n", gr, gr->width, gr->height, gr->bg_color); +#ifdef FAST_TRANSPARENCY + if ( gr->hPrebuildDC ) + { + (void)SelectBitmap(gr->hPrebuildDC, gr->hOldPrebuildBitmap ); + DeleteBitmap(gr->hPrebuildBitmap); + DeleteDC(gr->hPrebuildDC); + gr->hPrebuildDC = 0; + } +#endif + } + } +#ifdef FAST_TRANSPARENCY + else if ( gr->hPrebuildDC ) + { + (void)SelectBitmap(gr->hPrebuildDC, gr->hOldPrebuildBitmap ); + DeleteBitmap(gr->hPrebuildBitmap); + DeleteDC(gr->hPrebuildDC); + gr->hPrebuildDC = 0; + } +#endif + } + + // force paint + if (mode == draw_mode_end && gr->mode == draw_mode_begin) + { + InvalidateRect( gr->wnd_handle, NULL, FALSE ); + } + + gr->mode=mode; + +} + + +static void * get_data(struct graphics_priv *this_, char *type) +{ + if ( strcmp( "wnd_parent_handle_ptr", type ) == 0 ) + { + return &( this_->wnd_parent_handle ); + } + if ( strcmp( "START_CLIENT", type ) == 0 ) + { + CreateGraphicsWindows( this_, (HMENU)ID_CHILD_GFX ); + return NULL; + } + if (!strcmp(type, "window")) + { + CreateGraphicsWindows( this_ , NULL); + + this_->window.fullscreen = fullscreen; + this_->window.disable_suspend = disable_suspend; + + this_->window.priv=g_new0(struct window_priv, 1); + + return &this_->window; + } + return NULL; +} + + +static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) +{ + RECT rcClient = { 0, 0, gr->width, gr->height }; + HBRUSH bgBrush; + + bgBrush = CreateSolidBrush( gc->bg_color ); + gr->bg_color = gc->bg_color; + + FillRect( gr->hMemDC, &rcClient, bgBrush ); + DeleteObject( bgBrush ); +} + +struct graphics_font_priv +{ + LOGFONT lf; + HFONT hfont; + int size; +}; + +static void draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) +{ + RECT rcClient; + int prevBkMode; + HFONT hOldFont; + double angle; + + GetClientRect( gr->wnd_handle, &rcClient ); + + SetTextColor(gr->hMemDC, fg->fg_color); + prevBkMode = SetBkMode( gr->hMemDC, TRANSPARENT ); + + if ( NULL == font->hfont ) + { +#ifdef WIN_USE_SYSFONT + font->hfont = (HFONT) GetStockObject (SYSTEM_FONT); + GetObject (font->hfont, sizeof (LOGFONT), &font->lf); +#else + font->hfont = EzCreateFont (gr->hMemDC, TEXT ("Arial"), font->size/2, 0, 0, TRUE); + GetObject ( font->hfont, sizeof (LOGFONT), &font->lf) ; +#endif + } + + + angle = -atan2( dy, dx ) * 180 / 3.14159 ; + if (angle < 0) + angle += 360; + + SetTextAlign (gr->hMemDC, TA_BASELINE) ; + SetViewportOrgEx (gr->hMemDC, p->x, p->y, NULL) ; + font->lf.lfEscapement = font->lf.lfOrientation = ( angle * 10 ) ; + DeleteObject (font->hfont) ; + + font->hfont = CreateFontIndirect (&font->lf); + hOldFont = SelectObject(gr->hMemDC, font->hfont ); + + { + wchar_t utf16[1024]; + const UTF8 *utf8 = (UTF8 *)text; + UTF16 *utf16p = (UTF16 *) utf16; + SetBkMode (gr->hMemDC, TRANSPARENT); + if (ConvertUTF8toUTF16(&utf8, utf8+strlen(text), + &utf16p, utf16p+sizeof(utf16), + lenientConversion) == conversionOK) + { + ExtTextOutW(gr->hMemDC, 0, 0, 0, NULL, + utf16, (wchar_t*) utf16p - utf16, NULL); + } + } + + + SelectObject(gr->hMemDC, hOldFont); + DeleteObject (font->hfont) ; + + SetBkMode( gr->hMemDC, prevBkMode ); + + SetViewportOrgEx (gr->hMemDC, 0, 0, NULL) ; +} + +static void font_destroy(struct graphics_font_priv *font) +{ + if ( font->hfont ) + { + DeleteObject(font->hfont); + } + g_free(font); +} + +static struct graphics_font_methods font_methods = +{ + font_destroy +}; + +static struct graphics_font_priv *font_new(struct graphics_priv *gr, struct graphics_font_methods *meth, char *name, int size, int flags) +{ + struct graphics_font_priv *font=g_new(struct graphics_font_priv, 1); + *meth = font_methods; + + font->hfont = NULL; + font->size = size; + + return font; +} + +#include "png.h" + +static int +pngdecode(struct graphics_priv *gr, char *name, struct graphics_image_priv *img) +{ + png_struct *png_ptr = NULL; + png_info *info_ptr = NULL; + png_byte buf[8]; + png_byte **row_pointers = NULL; + + int bit_depth; + int color_type; + int alpha_present; + int ret; + int i; + FILE *png_file; + + dbg(1,"enter %s\n",name); + png_file=fopen(name, "rb"); + if (!png_file) + { + dbg(0,"failed to open %s\n",name); + return FALSE; + } + + + /* read and check signature in PNG file */ + ret = fread (buf, 1, 8, png_file); + if (ret != 8) + { + fclose(png_file); + return FALSE; + } + + ret = png_check_sig (buf, 8); + if (!ret) + { + fclose(png_file); + return FALSE; + } + + /* create png and info structures */ + + png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, + NULL, NULL, NULL); + if (!png_ptr) + { + fclose(png_file); + return FALSE; /* out of memory */ + } + + info_ptr = png_create_info_struct (png_ptr); + if (!info_ptr) + { + fclose(png_file); + png_destroy_read_struct (&png_ptr, NULL, NULL); + return FALSE; /* out of memory */ + } + + if (setjmp (png_jmpbuf(png_ptr))) + { + fclose(png_file); + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); + return FALSE; + } + + /* set up the input control for C streams */ + png_init_io (png_ptr, png_file); + png_set_sig_bytes (png_ptr, 8); /* we already read the 8 signature bytes */ + + /* read the file information */ + png_read_info (png_ptr, info_ptr); + + /* get size and bit-depth of the PNG-image */ + png_get_IHDR (png_ptr, info_ptr, + (png_uint_32*)&img->width, (png_uint_32*)&img->height, &bit_depth, &color_type, + NULL, NULL, NULL); + + /* set-up the transformations */ + + /* transform paletted images into full-color rgb */ + if (color_type == PNG_COLOR_TYPE_PALETTE) + png_set_expand (png_ptr); + /* expand images to bit-depth 8 (only applicable for grayscale images) */ + if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) + png_set_expand (png_ptr); + /* transform transparency maps into full alpha-channel */ + if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS)) + png_set_expand (png_ptr); + + png_set_bgr(png_ptr); + + /* all transformations have been registered; now update info_ptr data, + * get rowbytes and channels, and allocate image memory */ + + png_read_update_info (png_ptr, info_ptr); + + /* get the new color-type and bit-depth (after expansion/stripping) */ + png_get_IHDR (png_ptr, info_ptr, (png_uint_32*)&img->width, (png_uint_32*)&img->height, &bit_depth, &color_type, + NULL, NULL, NULL); + + /* calculate new number of channels and store alpha-presence */ + if (color_type == PNG_COLOR_TYPE_GRAY) + img->channels = 1; + else if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + img->channels = 2; + else if (color_type == PNG_COLOR_TYPE_RGB) + img->channels = 3; + else if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) + img->channels = 4; + else + img->channels = 0; /* should never happen */ + alpha_present = (img->channels - 1) % 2; + + /* row_bytes is the width x number of channels x (bit-depth / 8) */ + img->row_bytes = png_get_rowbytes (png_ptr, info_ptr); + + if ( gr->AlphaBlend && img->channels == 4 ) + { + BITMAPINFO pnginfo; + HDC dc; + memset(&pnginfo, 0, sizeof(pnginfo)); + pnginfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + pnginfo.bmiHeader.biWidth = img->width; + pnginfo.bmiHeader.biHeight = -img->height; + pnginfo.bmiHeader.biBitCount = 32; + pnginfo.bmiHeader.biCompression = BI_RGB; + pnginfo.bmiHeader.biPlanes = 1; + dc = CreateCompatibleDC(NULL); + img->hBitmap = CreateDIBSection(dc, &pnginfo, DIB_RGB_COLORS , (void **)&img->png_pixels, NULL, 0); + DeleteDC(dc); + + } + else + { + if ((img->png_pixels = (png_byte *) g_malloc (img->row_bytes * img->height * sizeof (png_byte))) == NULL) + { + fclose(png_file); + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); + return FALSE; + } + } + + if ((row_pointers = (png_byte **) g_malloc (img->height * sizeof (png_bytep))) == NULL) + { + fclose(png_file); + png_destroy_read_struct (&png_ptr, &info_ptr, NULL); + g_free (img->png_pixels); + img->png_pixels = NULL; + img->hBitmap = NULL; + return FALSE; + } + + /* set the individual row_pointers to point at the correct offsets */ + for (i = 0; i < (img->height); i++) + row_pointers[i] = img->png_pixels + i * img->row_bytes; + + /* now we can go ahead and just read the whole image */ + png_read_image (png_ptr, row_pointers); + + /* read rest of file, and get additional chunks in info_ptr - REQUIRED */ + png_read_end (png_ptr, info_ptr); + + /* clean up after the read, and free any memory allocated - REQUIRED */ + png_destroy_read_struct (&png_ptr, &info_ptr, (png_infopp) NULL); + + if (row_pointers != (unsigned char**) NULL) + g_free (row_pointers); + img->hot.x=img->width/2-1; + img->hot.y=img->height/2-1; + dbg(1,"ok\n"); + fclose(png_file); + return TRUE; + +} /* end of source */ + +static void +pngrender(struct graphics_image_priv *img, struct graphics_priv *gr, int x0, int y0) +{ + if (img->hBitmap) + { + HDC hdc; + HBITMAP oldBitmap; + BLENDFUNCTION blendFunction ; + blendFunction.BlendOp = AC_SRC_OVER; + blendFunction.BlendFlags = 0; + blendFunction.SourceConstantAlpha = 255; + blendFunction.AlphaFormat = AC_SRC_ALPHA; + hdc = CreateCompatibleDC(NULL); + oldBitmap = SelectBitmap(hdc, img->hBitmap); + gr->AlphaBlend(gr->hMemDC, x0, y0, img->width, img->height, hdc, 0, 0, img->width, img->height, blendFunction); + (void)SelectBitmap(hdc, oldBitmap); + DeleteDC(hdc); + } + else + { + int x, y; + HDC hdc=gr->hMemDC; + png_byte *pix_ptr = img->png_pixels; + COLORREF *pixeldata; + HDC dc; + HBITMAP bitmap; + HBITMAP oldBitmap; + + BITMAPINFO pnginfo; + + memset(&pnginfo, 0, sizeof(pnginfo)); + pnginfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + pnginfo.bmiHeader.biWidth = img->width; + pnginfo.bmiHeader.biHeight = -img->height; + pnginfo.bmiHeader.biBitCount = 32; + pnginfo.bmiHeader.biCompression = BI_RGB; + pnginfo.bmiHeader.biPlanes = 1; + dc = CreateCompatibleDC(NULL); + bitmap = CreateDIBSection(hdc, &pnginfo, DIB_RGB_COLORS, (void **)&pixeldata, NULL, 0); + oldBitmap = SelectBitmap(dc, bitmap); + BitBlt(dc, 0, 0, img->width, img->height, hdc, x0, y0, SRCCOPY); + for (y=0 ; y < img->width ; y++) + { + for (x=0 ; x < img->height ; x++) + { + int b = pix_ptr[0]; + int g = pix_ptr[1]; + int r = pix_ptr[2]; + int a = pix_ptr[3]; + if (a != 0xff) + { + int p = *pixeldata; + int ai = 0xff - a; + r = (r * a + ((p >> 16) & 0xff) * ai) / 255; + g = (g * a + ((p >> 8) & 0xff) * ai) / 255; + b = (b * a + ((p >> 0) & 0xff) * ai) / 255; + } + *pixeldata++ = (r << 16) | (g << 8) | b; + pix_ptr+=img->channels; + } + } + + BitBlt(hdc, x0, y0, img->width, img->height, dc, 0, 0, SRCCOPY); + (void)SelectBitmap(dc, oldBitmap); + DeleteBitmap(bitmap); + DeleteDC(dc); + } +} + +static int +xpmdecode(char *name, struct graphics_image_priv *img) +{ + img->pxpm = Xpm2bmp_new(); + if (Xpm2bmp_load( img->pxpm, name ) != 0) + { + g_free(img->pxpm); + return FALSE; + } + img->width=img->pxpm->size_x; + img->height=img->pxpm->size_y; + img->hot.x=img->pxpm->hotspot_x; + img->hot.y=img->pxpm->hotspot_y; + return TRUE; +} + + +static struct graphics_image_priv *image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *name, int *w, int *h, struct point *hot, int rotation) +{ + struct graphics_image_priv* ret; + + if ( !g_hash_table_lookup_extended( gr->image_cache_hash, name, NULL, (gpointer)&ret) ) + { + int len=strlen(name); + int rc=0; + + if (len >= 4) + { + char *ext; + dbg(2, "loading image '%s'\n", name ); + ret = g_new0( struct graphics_image_priv, 1 ); + ext = name+len-4; + if (!strcmp(ext,".xpm")) { + rc=xpmdecode(name, ret); + } else if (!strcmp(ext,".png")) { + rc=pngdecode(gr, name, ret); + } + } + if (!rc) { + dbg(0, "failed loading '%s'\n", name ); + g_free(ret); + ret=NULL; + } + g_hash_table_insert(gr->image_cache_hash, g_strdup( name ), (gpointer)ret ); + } + if (ret) { + *w=ret->width; + *h=ret->height; + if (hot) + *hot=ret->hot; + } + return ret; +} + +static void draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) +{ + if (img->pxpm) + Xpm2bmp_paint( img->pxpm , gr->hMemDC, p->x, p->y ); + if (img->png_pixels) + pngrender(img, gr, p->x, p->y); +} + +static struct graphics_priv * + graphics_win32_new_helper(struct graphics_methods *meth); + +static void overlay_resize(struct graphics_priv *gr, struct point *p, int w, int h, int alpha, int wraparound) +{ + dbg(1, "resize overlay: %x, x: %d, y: %d, w: %d, h: %d, alpha: %x, wraparound: %d\n", gr, p->x, p->y, w, h, alpha, wraparound); + + if ( gr->width != w || gr->height != h ) + { + gr->width = w; + gr->height = h; + create_memory_dc(gr); + } + gr->p.x = p->x; + gr->p.y = p->y; + +} + + +static struct graphics_priv * + overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound) +{ + struct graphics_priv *this=graphics_win32_new_helper(meth); + dbg(1, "overlay: %x, x: %d, y: %d, w: %d, h: %d, alpha: %x, wraparound: %d\n", this, p->x, p->y, w, h, alpha, wraparound); + this->width = w; + this->height = h; + this->parent = gr; + this->p.x = p->x; + this->p.y = p->y; + this->disabled = 0; + this->hPrebuildDC = 0; + this->AlphaBlend = gr->AlphaBlend; + this->image_cache_hash = gr->image_cache_hash; + + this->next = gr->overlays; + gr->overlays = this; + this->wnd_handle = gr->wnd_handle; + + if (wraparound) + { + if ( p->x < 0 ) + { + this->p.x += gr->width; + } + + if ( p->y < 0 ) + { + this->p.y += gr->height; + } + } + + create_memory_dc(this); + return this; +} + +static void overlay_disable(struct graphics_priv *gr, int disable) +{ + dbg(1, "overlay: %x, disable: %d\n", gr, disable); + gr->disabled = disable; +} + +static void get_text_bbox(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate) +{ + int len = g_utf8_strlen(text, -1); + int xMin = 0; + int yMin = 0; + int yMax = 13*font->size/256; + int xMax = 9*font->size*len/256; + + dbg(2, "Get bbox for %s\n", text); + + ret[0].x = xMin; + ret[0].y = -yMin; + ret[1].x = xMin; + ret[1].y = -yMax; + ret[2].x = xMax; + ret[2].y = -yMax; + ret[3].x = xMax; + ret[3].y = -yMin; +} + + +static struct graphics_methods graphics_methods = +{ + graphics_destroy, + draw_mode, + draw_lines, + draw_polygon, + draw_rectangle, + draw_circle, + draw_text, + draw_image, +#ifdef HAVE_IMLIB2 + NULL, // draw_image_warp, +#else + NULL, +#endif + draw_restore, + draw_drag, + font_new, + gc_new, + background_gc, + overlay_new, + image_new, + get_data, + NULL, //image_free + get_text_bbox, + overlay_disable, + overlay_resize, +}; + + +static struct graphics_priv * + graphics_win32_new_helper(struct graphics_methods *meth) +{ + struct graphics_priv *this_=g_new0(struct graphics_priv,1); + *meth=graphics_methods; + this_->mode = -1; + return this_; +} + + +static void set_alphablend(struct graphics_priv* gra_priv) +{ +#if HAVE_API_WIN32_CE + gra_priv->hCoreDll = LoadLibrary(TEXT("coredll.dll")); +#else + gra_priv->hCoreDll = LoadLibrary(TEXT("msimg32.dll")); +#endif + if ( gra_priv->hCoreDll ) + { + gra_priv->AlphaBlend = (FP_AlphaBlend)GetProcAddress(gra_priv->hCoreDll, TEXT("AlphaBlend") ); + if (!gra_priv->AlphaBlend) + { + FreeLibrary(gra_priv->hCoreDll); + gra_priv->hCoreDll = NULL; + dbg(1, "AlphaBlend not supported\n"); + } + } + else + { + dbg(0, "Error loading coredll\n"); + } +} + + + +static struct graphics_priv* + graphics_win32_new( struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) +{ + struct attr *attr; + + struct graphics_priv* this_; + HMODULE user32; + if (!event_request_system("win32","graphics_win32")) + return NULL; + this_=graphics_win32_new_helper(meth); + this_->nav=nav; + this_->width=792; + if ((attr=attr_search(attrs, NULL, attr_w))) + this_->width=attr->u.num; + this_->height=547; + if ((attr=attr_search(attrs, NULL, attr_h))) + this_->height=attr->u.num; + this_->overlays = NULL; + this_->cbl=cbl; + this_->parent = NULL; + this_->window.priv = NULL; + this_->image_cache_hash = g_hash_table_new(g_str_hash, g_str_equal); + set_alphablend(this_); + + user32=GetModuleHandle("user32.dll"); + if(user32) { + this_->ChangeWindowMessageFilterEx=GetProcAddress(user32,"ChangeWindowMessageFilterEx"); + this_->ChangeWindowMessageFilter=GetProcAddress(user32,"ChangeWindowMessageFilter"); + } + return this_; +} + + +static void +event_win32_main_loop_run(void) +{ + MSG msg; + + dbg(0,"enter\n"); + while (GetMessage(&msg, 0, 0, 0)) + { + TranslateMessage(&msg); /* Keyboard input. */ + DispatchMessage(&msg); + } + +} + +static void event_win32_main_loop_quit(void) +{ +#ifdef HAVE_API_WIN32_CE + HWND hwndTaskbar; + HWND hwndSip; +#endif + + dbg(0,"enter\n"); + +#ifdef HAVE_API_WIN32_CE + hwndTaskbar = FindWindow(L"HHTaskBar", NULL); + hwndSip = FindWindow(L"MS_SIPBUTTON", NULL); + // activate the SIP button + ShowWindow(hwndSip, SW_SHOW); + ShowWindow(hwndTaskbar, SW_SHOW); +#endif + + DestroyWindow(g_hwnd); +} + +static struct event_watch * + event_win32_add_watch(void *h, enum event_watch_cond cond, struct callback *cb) +{ + dbg(0,"enter\n"); + return NULL; +} + +static void +event_win32_remove_watch(struct event_watch *ev) +{ + dbg(0,"enter\n"); +} + +static GList *timers; +struct event_timeout +{ + UINT_PTR timer_id; + int multi; + struct callback *cb; + struct event_timeout *next; +}; + +static void run_timer(UINT_PTR idEvent) +{ + GList *l; + struct event_timeout *t; + l = timers; + while (l) + { + t = l->data; + if (t->timer_id == idEvent) + { + struct callback *cb = t->cb; + dbg(2, "Timer %d (multi: %d)\n", t->timer_id, t->multi); + if (!t->multi) + { + KillTimer(NULL, t->timer_id); + timers = g_list_remove(timers, t); + g_free(t); + } + callback_call_0(cb); + return; + } + l = g_list_next(l); + } + dbg(0, "timer %d not found\n", idEvent); +} + +static VOID CALLBACK win32_timer_cb(HWND hwnd, UINT uMsg, + UINT_PTR idEvent, + DWORD dwTime) +{ + run_timer(idEvent); +} + +static struct event_timeout * + event_win32_add_timeout(int timeout, int multi, struct callback *cb) +{ + struct event_timeout *t; + t = g_new0(struct event_timeout, 1); + if (!t) + return t; + t->multi = multi; + timers = g_list_prepend(timers, t); + t->cb = cb; + t->timer_id = SetTimer(NULL, 0, timeout, win32_timer_cb); + dbg(1, "Started timer %d for %d (multi: %d)\n", t->timer_id, timeout, multi); + return t; +} + +static void +event_win32_remove_timeout(struct event_timeout *to) +{ + if (to) + { + GList *l; + struct event_timeout *t=NULL; + dbg(1, "Try stopping timer %d\n", to->timer_id); + l = timers; + while (l) + { + t = l->data; + /* Use the pointer not the ID, IDs are reused */ + if (t == to) + { + KillTimer(NULL, t->timer_id); + timers = g_list_remove(timers, t); + g_free(t); + return; + } + l = g_list_next(l); + } + dbg(0, "Timer %d not found\n", to->timer_id); + g_free(to); + } +} + +static struct event_idle * + event_win32_add_idle(int priority, struct callback *cb) +{ + return (struct event_idle *)event_win32_add_timeout(1, 1, cb); +} + +static void +event_win32_remove_idle(struct event_idle *ev) +{ + event_win32_remove_timeout((struct event_timeout *)ev); +} + +static void +event_win32_call_callback(struct callback_list *cb) +{ + PostMessage(g_hwnd, WM_USER+2, (WPARAM)cb , (LPARAM)0); +} + +static struct event_methods event_win32_methods = +{ + event_win32_main_loop_run, + event_win32_main_loop_quit, + event_win32_add_watch, + event_win32_remove_watch, + event_win32_add_timeout, + event_win32_remove_timeout, + event_win32_add_idle, + event_win32_remove_idle, + event_win32_call_callback, +}; + +static struct event_priv * + event_win32_new(struct event_methods *meth) +{ + *meth=event_win32_methods; + return NULL; +} + +void +plugin_init(void) +{ + plugin_register_graphics_type("win32", graphics_win32_new); + plugin_register_event_type("win32", event_win32_new); +} diff --git a/navit/graphics/win32/xpm2bmp.c b/navit/graphics/win32/xpm2bmp.c new file mode 100644 index 0000000..f208f7e --- /dev/null +++ b/navit/graphics/win32/xpm2bmp.c @@ -0,0 +1,597 @@ +#include +#include +#include +#include +#include +#include "xpm2bmp.h" + +/* #define _DBG */ + +// function prototypes +static int CreateBitmapFromXpm( const char* filename, PXPM2BMP pXpm2bmp ); + +// typedefs +static XPMCOLORENTRY theRGBRecords[] = +{ + {"ALICEBLUE", 240, 248, 255}, + {"ANTIQUEWHITE", 250, 235, 215}, + {"AQUAMARINE", 50, 191, 193}, + {"AZURE", 240, 255, 255}, + {"BEIGE", 245, 245, 220}, + {"BISQUE", 255, 228, 196}, + {"BLACK", 0, 0, 0}, + {"BLANCHEDALMOND", 255, 235, 205}, + {"BLUE", 0, 0, 255}, + {"BLUEVIOLET", 138, 43, 226}, + {"BROWN", 165, 42, 42}, + {"BURLYWOOD", 222, 184, 135}, + {"CADETBLUE", 95, 146, 158}, + {"CHARTREUSE", 127, 255, 0}, + {"CHOCOLATE", 210, 105, 30}, + {"CORAL", 255, 114, 86}, + {"CORNFLOWERBLUE", 34, 34, 152}, + {"CORNSILK", 255, 248, 220}, + {"CYAN", 0, 255, 255}, + {"DARKGOLDENROD", 184, 134, 11}, + {"DARKGREEN", 0, 86, 45}, + {"DARKKHAKI", 189, 183, 107}, + {"DARKOLIVEGREEN", 85, 86, 47}, + {"DARKORANGE", 255, 140, 0}, + {"DARKORCHID", 139, 32, 139}, + {"DARKSALMON", 233, 150, 122}, + {"DARKSEAGREEN", 143, 188, 143}, + {"DARKSLATEBLUE", 56, 75, 102}, + {"DARKSLATEGRAY", 47, 79, 79}, + {"DARKTURQUOISE", 0, 166, 166}, + {"DARKVIOLET", 148, 0, 211}, + {"DEEPPINK", 255, 20, 147}, + {"DEEPSKYBLUE", 0, 191, 255}, + {"DIMGRAY", 84, 84, 84}, + {"DODGERBLUE", 30, 144, 255}, + {"FIREBRICK", 142, 35, 35}, + {"FLORALWHITE", 255, 250, 240}, + {"FORESTGREEN", 80, 159, 105}, + {"GAINSBORO", 220, 220, 220}, + {"GHOSTWHITE", 248, 248, 255}, + {"GOLD", 218, 170, 0}, + {"GOLDENROD", 239, 223, 132}, + {"GRAY", 126, 126, 126}, + {"GRAY0", 0, 0, 0}, + {"GRAY1", 3, 3, 3}, + {"GRAY10", 26, 26, 26}, + {"GRAY100", 255, 255, 255}, + {"GRAY11", 28, 28, 28}, + {"GRAY12", 31, 31, 31}, + {"GRAY13", 33, 33, 33}, + {"GRAY14", 36, 36, 36}, + {"GRAY15", 38, 38, 38}, + {"GRAY16", 41, 41, 41}, + {"GRAY17", 43, 43, 43}, + {"GRAY18", 46, 46, 46}, + {"GRAY19", 48, 48, 48}, + {"GRAY2", 5, 5, 5}, + {"GRAY20", 51, 51, 51}, + {"GRAY21", 54, 54, 54}, + {"GRAY22", 56, 56, 56}, + {"GRAY23", 59, 59, 59}, + {"GRAY24", 61, 61, 61}, + {"GRAY25", 64, 64, 64}, + {"GRAY26", 66, 66, 66}, + {"GRAY27", 69, 69, 69}, + {"GRAY28", 71, 71, 71}, + {"GRAY29", 74, 74, 74}, + {"GRAY3", 8, 8, 8}, + {"GRAY30", 77, 77, 77}, + {"GRAY31", 79, 79, 79}, + {"GRAY32", 82, 82, 82}, + {"GRAY33", 84, 84, 84}, + {"GRAY34", 87, 87, 87}, + {"GRAY35", 89, 89, 89}, + {"GRAY36", 92, 92, 92}, + {"GRAY37", 94, 94, 94}, + {"GRAY38", 97, 97, 97}, + {"GRAY39", 99, 99, 99}, + {"GRAY4", 10, 10, 10}, + {"GRAY40", 102, 102, 102}, + {"GRAY41", 105, 105, 105}, + {"GRAY42", 107, 107, 107}, + {"GRAY43", 110, 110, 110}, + {"GRAY44", 112, 112, 112}, + {"GRAY45", 115, 115, 115}, + {"GRAY46", 117, 117, 117}, + {"GRAY47", 120, 120, 120}, + {"GRAY48", 122, 122, 122}, + {"GRAY49", 125, 125, 125}, + {"GRAY5", 13, 13, 13}, + {"GRAY50", 127, 127, 127}, + {"GRAY51", 130, 130, 130}, + {"GRAY52", 133, 133, 133}, + {"GRAY53", 135, 135, 135}, + {"GRAY54", 138, 138, 138}, + {"GRAY55", 140, 140, 140}, + {"GRAY56", 143, 143, 143}, + {"GRAY57", 145, 145, 145}, + {"GRAY58", 148, 148, 148}, + {"GRAY59", 150, 150, 150}, + {"GRAY6", 15, 15, 15}, + {"GRAY60", 153, 153, 153}, + {"GRAY61", 156, 156, 156}, + {"GRAY62", 158, 158, 158}, + {"GRAY63", 161, 161, 161}, + {"GRAY64", 163, 163, 163}, + {"GRAY65", 166, 166, 166}, + {"GRAY66", 168, 168, 168}, + {"GRAY67", 171, 171, 171}, + {"GRAY68", 173, 173, 173}, + {"GRAY69", 176, 176, 176}, + {"GRAY7", 18, 18, 18}, + {"GRAY70", 179, 179, 179}, + {"GRAY71", 181, 181, 181}, + {"GRAY72", 184, 184, 184}, + {"GRAY73", 186, 186, 186}, + {"GRAY74", 189, 189, 189}, + {"GRAY75", 191, 191, 191}, + {"GRAY76", 194, 194, 194}, + {"GRAY77", 196, 196, 196}, + {"GRAY78", 199, 199, 199}, + {"GRAY79", 201, 201, 201}, + {"GRAY8", 20, 20, 20}, + {"GRAY80", 204, 204, 204}, + {"GRAY81", 207, 207, 207}, + {"GRAY82", 209, 209, 209}, + {"GRAY83", 212, 212, 212}, + {"GRAY84", 214, 214, 214}, + {"GRAY85", 217, 217, 217}, + {"GRAY86", 219, 219, 219}, + {"GRAY87", 222, 222, 222}, + {"GRAY88", 224, 224, 224}, + {"GRAY89", 227, 227, 227}, + {"GRAY9", 23, 23, 23}, + {"GRAY90", 229, 229, 229}, + {"GRAY91", 232, 232, 232}, + {"GRAY92", 235, 235, 235}, + {"GRAY93", 237, 237, 237}, + {"GRAY94", 240, 240, 240}, + {"GRAY95", 242, 242, 242}, + {"GRAY96", 245, 245, 245}, + {"GRAY97", 247, 247, 247}, + {"GRAY98", 250, 250, 250}, + {"GRAY99", 252, 252, 252}, + {"GREEN", 0, 255, 0}, + {"GREENYELLOW", 173, 255, 47}, + {"HONEYDEW", 240, 255, 240}, + {"HOTPINK", 255, 105, 180}, + {"INDIANRED", 107, 57, 57}, + {"IVORY", 255, 255, 240}, + {"KHAKI", 179, 179, 126}, + {"LAVENDER", 230, 230, 250}, + {"LAVENDERBLUSH", 255, 240, 245}, + {"LAWNGREEN", 124, 252, 0}, + {"LEMONCHIFFON", 255, 250, 205}, + {"LIGHTBLUE", 176, 226, 255}, + {"LIGHTCORAL", 240, 128, 128}, + {"LIGHTCYAN", 224, 255, 255}, + {"LIGHTGOLDENROD", 238, 221, 130}, + {"LIGHTGOLDENRODYELLOW", 250, 250, 210}, + {"LIGHTGRAY", 168, 168, 168}, + {"LIGHTPINK", 255, 182, 193}, + {"LIGHTSALMON", 255, 160, 122}, + {"LIGHTSEAGREEN", 32, 178, 170}, + {"LIGHTSKYBLUE", 135, 206, 250}, + {"LIGHTSLATEBLUE", 132, 112, 255}, + {"LIGHTSLATEGRAY", 119, 136, 153}, + {"LIGHTSTEELBLUE", 124, 152, 211}, + {"LIGHTYELLOW", 255, 255, 224}, + {"LIMEGREEN", 0, 175, 20}, + {"LINEN", 250, 240, 230}, + {"MAGENTA", 255, 0, 255}, + {"MAROON", 143, 0, 82}, + {"MEDIUMAQUAMARINE", 0, 147, 143}, + {"MEDIUMBLUE", 50, 50, 204}, + {"MEDIUMFORESTGREEN", 50, 129, 75}, + {"MEDIUMGOLDENROD", 209, 193, 102}, + {"MEDIUMORCHID", 189, 82, 189}, + {"MEDIUMPURPLE", 147, 112, 219}, + {"MEDIUMSEAGREEN", 52, 119, 102}, + {"MEDIUMSLATEBLUE", 106, 106, 141}, + {"MEDIUMSPRINGGREEN", 35, 142, 35}, + {"MEDIUMTURQUOISE", 0, 210, 210}, + {"MEDIUMVIOLETRED", 213, 32, 121}, + {"MIDNIGHTBLUE", 47, 47, 100}, + {"MINTCREAM", 245, 255, 250}, + {"MISTYROSE", 255, 228, 225}, + {"MOCCASIN", 255, 228, 181}, + {"NAVAJOWHITE", 255, 222, 173}, + {"NAVY", 35, 35, 117}, + {"NAVYBLUE", 35, 35, 117}, + {"OLDLACE", 253, 245, 230}, + {"OLIVEDRAB", 107, 142, 35}, + {"ORANGE", 255, 135, 0}, + {"ORANGERED", 255, 69, 0}, + {"ORCHID", 239, 132, 239}, + {"PALEGOLDENROD", 238, 232, 170}, + {"PALEGREEN", 115, 222, 120}, + {"PALETURQUOISE", 175, 238, 238}, + {"PALEVIOLETRED", 219, 112, 147}, + {"PAPAYAWHIP", 255, 239, 213}, + {"PEACHPUFF", 255, 218, 185}, + {"PERU", 205, 133, 63}, + {"PINK", 255, 181, 197}, + {"PLUM", 197, 72, 155}, + {"POWDERBLUE", 176, 224, 230}, + {"PURPLE", 160, 32, 240}, + {"RED", 255, 0, 0}, + {"ROSYBROWN", 188, 143, 143}, + {"ROYALBLUE", 65, 105, 225}, + {"SADDLEBROWN", 139, 69, 19}, + {"SALMON", 233, 150, 122}, + {"SANDYBROWN", 244, 164, 96}, + {"SEAGREEN", 82, 149, 132}, + {"SEASHELL", 255, 245, 238}, + {"SIENNA", 150, 82, 45}, + {"SKYBLUE", 114, 159, 255}, + {"SLATEBLUE", 126, 136, 171}, + {"SLATEGRAY", 112, 128, 144}, + {"SNOW", 255, 250, 250}, + {"SPRINGGREEN", 65, 172, 65}, + {"STEELBLUE", 84, 112, 170}, + {"TAN", 222, 184, 135}, + {"THISTLE", 216, 191, 216}, + {"TOMATO", 255, 99, 71}, + {"TRANSPARENT", 0, 0, 1}, + {"TURQUOISE", 25, 204, 223}, + {"VIOLET", 156, 62, 206}, + {"VIOLETRED", 243, 62, 150}, + {"WHEAT", 245, 222, 179}, + {"WHITE", 255, 255, 255}, + {"WHITESMOKE", 245, 245, 245}, + {"YELLOW", 255, 255, 0}, + {"YELLOWGREEN", 50, 216, 56} +}; + + +PXPM2BMP Xpm2bmp_new(void) +{ + PXPM2BMP preturn = g_malloc0( sizeof(XPM2BMP) ); + return preturn; +} + + +int Xpm2bmp_load( PXPM2BMP pXpm2bmp, const char* filename ) +{ + return CreateBitmapFromXpm( filename, pXpm2bmp ); +} + +int Xpm2bmp_paint( PXPM2BMP pXpm2bmp, HDC hdc, int x1,int y1 ) +{ + StretchDIBits(hdc, + x1, y1, pXpm2bmp->size_x, pXpm2bmp->size_y, + 0, 0, pXpm2bmp->size_x, pXpm2bmp->size_y, + pXpm2bmp->wimage_data_trans, + (BITMAPINFO *)pXpm2bmp->bmih_trans, + DIB_RGB_COLORS, + SRCAND ); + + StretchDIBits(hdc, + x1, y1, pXpm2bmp->size_x, pXpm2bmp->size_y, + 0, 0, pXpm2bmp->size_x, pXpm2bmp->size_y, + pXpm2bmp->wimage_data, + (BITMAPINFO *)pXpm2bmp->bmih, + DIB_RGB_COLORS, + SRCPAINT ); + + return 0; +} + +static int parse_line_values( const char* line, PXPM2BMP pXpm2bmp ) +{ + int return_value = 0; + char* parse_line = (char*)line; + char* tok; + int value_pos = 0; + + parse_line = strchr( parse_line, '"' ); + parse_line++; + + tok = strtok( parse_line, " \t\n" ); + + while ( tok != 0 ) + { + int val = atoi( tok ); + switch ( value_pos ) + { + case 0: pXpm2bmp->size_x = val; break; + case 1: pXpm2bmp->size_y = val; break; + case 2: pXpm2bmp->colors = val; break; + case 3: pXpm2bmp->chars_per_pixel = val; break; + case 4: pXpm2bmp->hotspot_x = val; break; + case 5: pXpm2bmp->hotspot_y = val; break; + } + tok = strtok( NULL, " \t" ); + value_pos ++; + + } + + return return_value; +} + +static int hex2int( char c ) +{ + if ((c >= '0') && (c <='9' )) return c - '0'; + if ((c >= 'A') && (c <= 'F')) return c - 'A' + 10; + if ((c >= 'a') && (c <= 'f')) return c - 'a' + 10; + return -1; +} + +static DWORD string2hex16( const char* str ) +{ + int i1 = hex2int( str[0] ); + int i2 = hex2int( str[1] ); + if ( ( i1 >= 0 ) && ( i2 >= 0 ) ) + return i1*16+i2; + return -1; +} + +static int parse_color_values( const char* line, PXPM2BMP pXpm2bmp ) +{ + int return_value = 0; + char* cq = strchr( line, '"' ); + char* cchar = strchr( cq+pXpm2bmp->chars_per_pixel+1, 'c' ); + char* chash = strchr( cq+pXpm2bmp->chars_per_pixel+1, '#' ); + char* qe = strchr( cq+pXpm2bmp->chars_per_pixel+1, '"' ); + + cq++; + + if ( cq ) + { + memcpy( pXpm2bmp->color_entires[ pXpm2bmp-> color_entires_size].color_str, cq, pXpm2bmp->chars_per_pixel + 1 ); + pXpm2bmp->color_entires[ pXpm2bmp-> color_entires_size].color_str[ pXpm2bmp->chars_per_pixel ] = '\0'; + + + if ( cchar && chash && qe) + { + int len; + chash++; + *qe = 0; + len = strlen( chash ); + + pXpm2bmp->color_entires[ pXpm2bmp->color_entires_size].r = string2hex16( &chash[0] ); + pXpm2bmp->color_entires[ pXpm2bmp->color_entires_size].g = string2hex16( &chash[len / 3] ); + pXpm2bmp->color_entires[ pXpm2bmp->color_entires_size].b = string2hex16( &chash[len * 2 / 3] ); +#ifdef _DBG +printf( "adding color %s => %d RGB %x %x %x to index %d\n", + line, + pXpm2bmp->color_entires_size, + pXpm2bmp->color_entires[ pXpm2bmp->color_entires_size].r, + pXpm2bmp->color_entires[ pXpm2bmp->color_entires_size].g, + pXpm2bmp->color_entires[ pXpm2bmp->color_entires_size].b, + pXpm2bmp->color_entires_size ); +#endif + } + else + { + int q; + char *start = cchar + 1; + char *end = start; + + while ( *start != 0 ) + { + if ( ( *start != '\t' ) && ( *start != ' ' ) ) + { + break; + } + start++; + } + + end = start; + while ( *end != 0 ) + { + if ( ( *end == '\t' ) || ( *end == ' ' ) || ( *end == '"' )) + { + *end = 0; + } + end++; + } + + start = _strupr( start ); + + for ( q=0; q < sizeof( theRGBRecords ) / sizeof( theRGBRecords[0] ); q++ ) + { + + if ( 0 == strcmp( start, theRGBRecords[q].color_str ) ) + { + pXpm2bmp->color_entires[ pXpm2bmp->color_entires_size].r = theRGBRecords[q].r; + pXpm2bmp->color_entires[ pXpm2bmp->color_entires_size].g = theRGBRecords[q].g; + pXpm2bmp->color_entires[ pXpm2bmp->color_entires_size].b = theRGBRecords[q].b; + } + } + if ( 0 == strcmp( start, "NONE" ) ) + { + pXpm2bmp->color_entires[ pXpm2bmp->color_entires_size].r = 255; + pXpm2bmp->color_entires[ pXpm2bmp->color_entires_size].g = 0; + pXpm2bmp->color_entires[ pXpm2bmp->color_entires_size].b = 255; + } + } + } + pXpm2bmp->color_entires_size++; + + return return_value; +} + +static int vv = 0; + +static int parse_pixel_line_values( const char* line, PXPM2BMP pXpm2bmp, unsigned char* pixel_data, unsigned char* pixel_data_trans ) +{ + int return_value = 0; + int i,j; + + + char* cq = strchr( line, '"' ); + int pix_idx = 0; + int size_x = pXpm2bmp->size_x; + int len = strlen( cq ); + + cq++; + + if ( len > pXpm2bmp->chars_per_pixel * size_x ) + { + for ( i=0; i< size_x; i++ ) + { + int found = 0; + char* cmp = &cq[ i * pXpm2bmp->chars_per_pixel]; + + for ( j=0; j< pXpm2bmp-> color_entires_size; j++ ) + { + if ( strncmp( cmp, pXpm2bmp->color_entires[ j ].color_str, pXpm2bmp->chars_per_pixel ) == 0 ) + { + int r = pXpm2bmp->color_entires[ j ].r; + int g = pXpm2bmp->color_entires[ j ].g; + int b = pXpm2bmp->color_entires[ j ].b; + + if ( ( r == 255 ) && ( g == 0 ) && ( r == 255 ) ) + { + r=g=b=0; + pixel_data_trans[ pix_idx ] = 255; + pixel_data_trans[ pix_idx+1 ] = 255; + pixel_data_trans[ pix_idx+2 ] = 255; + } + else + { + pixel_data_trans[ pix_idx ] = 0; + pixel_data_trans[ pix_idx+1 ] = 0; + pixel_data_trans[ pix_idx+2 ] = 0; + } + + // pixel_data[ pix_idx++ ] = pXpm2bmp->color_entires[ j ].r; + // pixel_data[ pix_idx++ ] = pXpm2bmp->color_entires[ j ].g; + // pixel_data[ pix_idx++ ] = pXpm2bmp->color_entires[ j ].b; + pixel_data[ pix_idx++ ] = b; + pixel_data[ pix_idx++ ] = g; + pixel_data[ pix_idx++ ] = r; + found = 1; + vv++; + break; + } + } + if ( !found ) + { + fprintf( stderr, "XPMLIB: error color not found\n" ); + } + + } + } + else + { + return_value = -1; + fprintf( stderr, "XPMLIB: invalid line length\n" ); + } + return return_value; +} + + +static int CreateBitmapFromXpm( const char* filename, PXPM2BMP pXpm2bmp ) +{ + int return_val = 0; + unsigned char i, row; + char line[ 1024 ]; + int nbytes ; + int padding, rowsize; + FILE* file_xpm = fopen( filename, "r" ); + + int phase = 0; + row = 0; + + if ( file_xpm ) + { + while ( fgets(line, sizeof( line ), file_xpm ) ) + { +#ifdef _DBG + printf( "PARSING: %s\n", line ); +#endif + if ( line[ 0 ] != '"' ) + continue; + + switch ( phase ) + { + case 0: + parse_line_values( line, pXpm2bmp ); +#ifdef _DBG + printf( "size_x %d\n", pXpm2bmp->size_x ); + printf( "size_y %d\n", pXpm2bmp->size_y ); +#endif + phase = 1; + + pXpm2bmp->color_entires_size = 0; + nbytes = ( pXpm2bmp->chars_per_pixel + 1 ) * pXpm2bmp->colors; + + pXpm2bmp->color_entires = g_malloc0( sizeof(XPMCOLORENTRY) * (pXpm2bmp->colors + 100) ); + pXpm2bmp->color_entires[0].color_str = g_malloc0( nbytes * pXpm2bmp->colors ); + for ( i = 1; i< pXpm2bmp->colors; i++ ) + { + pXpm2bmp->color_entires[i].color_str = pXpm2bmp->color_entires[0].color_str + ( pXpm2bmp->chars_per_pixel + 1 ) * i; + } + + rowsize=pXpm2bmp->size_x * 3; + padding=4-(rowsize%4); + if(padding<4) + rowsize+=padding; + + + if (!(pXpm2bmp->dib = (unsigned char *)g_malloc(sizeof(BITMAPINFOHEADER) + rowsize * pXpm2bmp->size_y ))) + { + return 4; + } + if (!(pXpm2bmp->dib_trans = (unsigned char *)g_malloc0(sizeof(BITMAPINFOHEADER) + rowsize * pXpm2bmp->size_y ))) + { + return 4; + } + + memset(pXpm2bmp->dib, 0, sizeof(BITMAPINFOHEADER)); + pXpm2bmp->bmih = (BITMAPINFOHEADER *)pXpm2bmp->dib; + pXpm2bmp->bmih->biSize = sizeof(BITMAPINFOHEADER); + pXpm2bmp->bmih->biWidth = pXpm2bmp->size_x; + pXpm2bmp->bmih->biHeight = -((long)pXpm2bmp->size_y); + pXpm2bmp->bmih->biPlanes = 1; + pXpm2bmp->bmih->biBitCount = 24; + pXpm2bmp->bmih->biCompression = 0; + pXpm2bmp->wimage_data = pXpm2bmp->dib + sizeof(BITMAPINFOHEADER); + + + pXpm2bmp->bmih_trans = (BITMAPINFOHEADER *)pXpm2bmp->dib_trans; + pXpm2bmp->bmih_trans->biSize = sizeof(BITMAPINFOHEADER); + pXpm2bmp->bmih_trans->biWidth = pXpm2bmp->size_x; + pXpm2bmp->bmih_trans->biHeight = -((long)pXpm2bmp->size_y); + pXpm2bmp->bmih_trans->biPlanes = 1; + pXpm2bmp->bmih_trans->biBitCount = 24; + pXpm2bmp->bmih_trans->biCompression = 0; + pXpm2bmp->wimage_data_trans = pXpm2bmp->dib_trans + sizeof(BITMAPINFOHEADER); +// memset( pXpm2bmp->wimage_data_trans, 255, 5* 22 * 3 ); + + break; + case 1: + parse_color_values( line, pXpm2bmp ); + if ( pXpm2bmp->color_entires_size >= pXpm2bmp->colors ) + { + phase = 2; + } + + break; + case 2: + parse_pixel_line_values( line, pXpm2bmp, + pXpm2bmp->wimage_data + row * rowsize, + pXpm2bmp->wimage_data_trans + row * rowsize ); + + row++; + if ( row >= pXpm2bmp->size_y ) + { + phase = 3; + } + break; + } + + } + + fclose( file_xpm ); + } + return return_val; +} diff --git a/navit/gtkext.h b/navit/gtkext.h new file mode 100644 index 0000000..c00f78f --- /dev/null +++ b/navit/gtkext.h @@ -0,0 +1,25 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_GTKEXT_H +#define NAVIT_GTKEXT_H + +void gdk_gc_set_fill_rule(GdkGC *gc, GdkFillRule fill_rule); + +#endif diff --git a/navit/gui.c b/navit/gui.c new file mode 100644 index 0000000..b0835a3 --- /dev/null +++ b/navit/gui.c @@ -0,0 +1,187 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "debug.h" +#include "callback.h" +#include "gui.h" +#include "menu.h" +#include "data_window.h" +#include "item.h" +#include "plugin.h" + +struct gui { + struct gui_methods meth; + struct gui_priv *priv; + struct attr **attrs; + struct attr parent; +}; + +struct gui * +gui_new(struct attr *parent, struct attr **attrs) +{ + struct gui *this_; + struct attr *type_attr; + struct gui_priv *(*guitype_new)(struct navit *nav, struct gui_methods *meth, struct attr **attrs, struct gui *gui); + struct attr cbl; + if (! (type_attr=attr_search(attrs, NULL, attr_type))) { + return NULL; + } + + guitype_new=plugin_get_gui_type(type_attr->u.str); + if (! guitype_new) + return NULL; + + this_=g_new0(struct gui, 1); + this_->attrs=attr_list_dup(attrs); + cbl.type=attr_callback_list; + cbl.u.callback_list=callback_list_new(); + this_->attrs=attr_generic_add_attr(this_->attrs, &cbl); + this_->priv=guitype_new(parent->u.navit, &this_->meth, this_->attrs, this_); + this_->parent=*parent; + return this_; +} + +int +gui_get_attr(struct gui *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + int ret; + if (this_->meth.get_attr) { + ret=this_->meth.get_attr(this_->priv, type, attr); + if (ret) + return ret; + } + if (type == this_->parent.type) { + *attr=this_->parent; + return 1; + } + return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); +} + + +int +gui_set_attr(struct gui *this_, struct attr *attr) +{ + int ret=1; + if (this_->meth.set_attr) + ret=this_->meth.set_attr(this_->priv, attr); + if (ret == 1) + this_->attrs=attr_generic_set_attr(this_->attrs, attr); + return ret != 0; +} + +int +gui_add_attr(struct gui *this_, struct attr *attr) +{ + int ret=0; + if (this_->meth.add_attr) + ret=this_->meth.add_attr(this_->priv, attr); + return ret; +} + +struct menu * +gui_menubar_new(struct gui *gui) +{ + struct menu *this_; + if (! gui->meth.menubar_new) + return NULL; + this_=g_new0(struct menu, 1); + this_->priv=gui->meth.menubar_new(gui->priv, &this_->meth); + if (! this_->priv) { + g_free(this_); + return NULL; + } + return this_; +} + +struct menu * +gui_popup_new(struct gui *gui) +{ + struct menu *this_; + if (!gui || ! gui->meth.popup_new) + return NULL; + this_=g_new0(struct menu, 1); + this_->priv=gui->meth.popup_new(gui->priv, &this_->meth); + if (! this_->priv) { + g_free(this_); + return NULL; + } + return this_; +} + +struct datawindow * +gui_datawindow_new(struct gui *gui, char *name, struct callback *click, struct callback *close) +{ + struct datawindow *this_; + if (! gui->meth.datawindow_new) + return NULL; + this_=g_new0(struct datawindow, 1); + this_->priv=gui->meth.datawindow_new(gui->priv, name, click, close, &this_->meth); + if (! this_->priv) { + g_free(this_); + return NULL; + } + return this_; +} + +int +gui_add_bookmark(struct gui *gui, struct pcoord *c, char *description) +{ + int ret; + dbg(2,"enter\n"); + if (! gui->meth.add_bookmark) + return 0; + ret=gui->meth.add_bookmark(gui->priv, c, description); + + dbg(2,"ret=%d\n", ret); + return ret; +} + +int +gui_set_graphics(struct gui *this_, struct graphics *gra) +{ + if (! this_->meth.set_graphics) + return 1; + return this_->meth.set_graphics(this_->priv, gra); +} + +void +gui_disable_suspend(struct gui *this_) +{ + if (this_->meth.disable_suspend) + this_->meth.disable_suspend(this_->priv); +} + +int +gui_has_main_loop(struct gui *this_) +{ + if (! this_->meth.run_main_loop) + return 0; + return 1; +} + +int +gui_run_main_loop(struct gui *this_) +{ + if (! gui_has_main_loop(this_)) + return 1; + return this_->meth.run_main_loop(this_->priv); +} + diff --git a/navit/gui.h b/navit/gui.h new file mode 100644 index 0000000..a5e6356 --- /dev/null +++ b/navit/gui.h @@ -0,0 +1,77 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_GUI_H +#define NAVIT_GUI_H + +#ifdef __cplusplus +extern "C" { +#endif +struct navit; +struct gui_priv; +struct menu_methods; +struct datawindow_methods; +struct callback; +struct graphics; +struct coord; +struct pcoord; + +struct gui_methods { + struct menu_priv *(*menubar_new)(struct gui_priv *priv, struct menu_methods *meth); + struct menu_priv *(*popup_new)(struct gui_priv *priv, struct menu_methods *meth); + int (*set_graphics)(struct gui_priv *priv, struct graphics *gra); + int (*run_main_loop)(struct gui_priv *priv); + struct datawindow_priv *(*datawindow_new)(struct gui_priv *priv, char *name, struct callback *click, struct callback *close, struct datawindow_methods *meth); + int (*add_bookmark)(struct gui_priv *priv, struct pcoord *c, char *description); + void (*disable_suspend)(struct gui_priv *priv); + int (*get_attr)(struct gui_priv *priv, enum attr_type type, struct attr *attr); + int (*add_attr)(struct gui_priv *priv, struct attr *attr); + int (*set_attr)(struct gui_priv *priv, struct attr *attr); +}; + + +/* prototypes */ +enum attr_type; +struct attr; +struct attr_iter; +struct callback; +struct datawindow; +struct graphics; +struct gui; +struct menu; +struct pcoord; +struct gui *gui_new(struct attr *parent, struct attr **attrs); +int gui_get_attr(struct gui *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); +int gui_set_attr(struct gui *this_, struct attr *attr); +int gui_add_attr(struct gui *this_, struct attr *attr); +struct menu *gui_menubar_new(struct gui *gui); +struct menu *gui_popup_new(struct gui *gui); +struct datawindow *gui_datawindow_new(struct gui *gui, char *name, struct callback *click, struct callback *close); +int gui_add_bookmark(struct gui *gui, struct pcoord *c, char *description); +int gui_set_graphics(struct gui *this_, struct graphics *gra); +void gui_disable_suspend(struct gui *this_); +int gui_has_main_loop(struct gui *this_); +int gui_run_main_loop(struct gui *this_); +/* end of prototypes */ +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/navit/gui/Makefile.am b/navit/gui/Makefile.am new file mode 100644 index 0000000..10086b5 --- /dev/null +++ b/navit/gui/Makefile.am @@ -0,0 +1,13 @@ +SUBDIRS= +if GUI_INTERNAL + SUBDIRS += internal +endif +if GUI_GTK + SUBDIRS += gtk +endif +if GUI_WIN32 + SUBDIRS += win32 +endif +if GUI_QML + SUBDIRS += qml +endif \ No newline at end of file diff --git a/navit/gui/Makefile.in b/navit/gui/Makefile.in new file mode 100644 index 0000000..9b73f92 --- /dev/null +++ b/navit/gui/Makefile.in @@ -0,0 +1,713 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@GUI_INTERNAL_TRUE@am__append_1 = internal +@GUI_GTK_TRUE@am__append_2 = gtk +@GUI_WIN32_TRUE@am__append_3 = win32 +@GUI_QML_TRUE@am__append_4 = qml +subdir = navit/gui +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = internal gtk win32 qml +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = $(am__append_1) $(am__append_2) $(am__append_3) \ + $(am__append_4) +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/gui/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/gui/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/gui/gtk/Makefile.am b/navit/gui/gtk/Makefile.am new file mode 100644 index 0000000..1588bfe --- /dev/null +++ b/navit/gui/gtk/Makefile.am @@ -0,0 +1,6 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = -I$(top_srcdir)/navit @NAVIT_CFLAGS@ @HILDON_CFLAGS@ @GTK2_CFLAGS@ -DMODULE=gui_gtk +modulegui_LTLIBRARIES = libgui_gtk.la +libgui_gtk_la_SOURCES = datawindow.c destination.c gui_gtk_statusbar.c gui_gtk_action.c gui_gtk_window.c gui_gtk.h +libgui_gtk_la_LIBADD = @GTK2_LIBS@ +libgui_gtk_la_LDFLAGS = -module -avoid-version diff --git a/navit/gui/gtk/Makefile.in b/navit/gui/gtk/Makefile.in new file mode 100644 index 0000000..b7e4754 --- /dev/null +++ b/navit/gui/gtk/Makefile.in @@ -0,0 +1,696 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/gui/gtk +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(moduleguidir)" +LTLIBRARIES = $(modulegui_LTLIBRARIES) +libgui_gtk_la_DEPENDENCIES = +am_libgui_gtk_la_OBJECTS = datawindow.lo destination.lo \ + gui_gtk_statusbar.lo gui_gtk_action.lo gui_gtk_window.lo +libgui_gtk_la_OBJECTS = $(am_libgui_gtk_la_OBJECTS) +libgui_gtk_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libgui_gtk_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libgui_gtk_la_SOURCES) +DIST_SOURCES = $(libgui_gtk_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = -I$(top_srcdir)/navit @NAVIT_CFLAGS@ @HILDON_CFLAGS@ @GTK2_CFLAGS@ -DMODULE=gui_gtk +modulegui_LTLIBRARIES = libgui_gtk.la +libgui_gtk_la_SOURCES = datawindow.c destination.c gui_gtk_statusbar.c gui_gtk_action.c gui_gtk_window.c gui_gtk.h +libgui_gtk_la_LIBADD = @GTK2_LIBS@ +libgui_gtk_la_LDFLAGS = -module -avoid-version +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/gui/gtk/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/gui/gtk/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-moduleguiLTLIBRARIES: $(modulegui_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(moduleguidir)" || $(MKDIR_P) "$(DESTDIR)$(moduleguidir)" + @list='$(modulegui_LTLIBRARIES)'; test -n "$(moduleguidir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(moduleguidir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(moduleguidir)"; \ + } + +uninstall-moduleguiLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulegui_LTLIBRARIES)'; test -n "$(moduleguidir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(moduleguidir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(moduleguidir)/$$f"; \ + done + +clean-moduleguiLTLIBRARIES: + -test -z "$(modulegui_LTLIBRARIES)" || rm -f $(modulegui_LTLIBRARIES) + @list='$(modulegui_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgui_gtk.la: $(libgui_gtk_la_OBJECTS) $(libgui_gtk_la_DEPENDENCIES) + $(libgui_gtk_la_LINK) -rpath $(moduleguidir) $(libgui_gtk_la_OBJECTS) $(libgui_gtk_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datawindow.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/destination.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_gtk_action.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_gtk_statusbar.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_gtk_window.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(moduleguidir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-moduleguiLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-moduleguiLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-moduleguiLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-moduleguiLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-moduleguiLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-moduleguiLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/gui/gtk/datawindow.c b/navit/gui/gtk/datawindow.c new file mode 100644 index 0000000..75f43a8 --- /dev/null +++ b/navit/gui/gtk/datawindow.c @@ -0,0 +1,214 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include "debug.h" +#include "callback.h" +#include "param.h" +#include "data_window.h" +#include "gui_gtk.h" + +struct datawindow_priv { + GtkWidget *window; + GtkWidget *scrolled_window; + GtkWidget *treeview; + GtkWidget *button; + GtkListStore *liststore; + GtkTreeModel *sortmodel; + struct callback *click, *close; + struct gui_priv *gui; +}; + +static GValue value; +static void +select_row(GtkTreeView *tree, GtkTreePath *path, GtkTreeViewColumn *column, struct datawindow_priv *win) +{ + char *cols[20]; + GtkTreeIter iter; + GtkTreeModel *model; + int i; + + dbg(0,"win=%p\n", win); + + model=gtk_tree_view_get_model(tree); + gtk_tree_model_get_iter(model, &iter, path); + + for (i=0;iclick, cols); +} + +static void +gui_gtk_datawindow_add(struct datawindow_priv *win, struct param_list *param, int count) +{ + int i; + GtkCellRenderer *cell; + GtkTreeIter iter; + GType types[count]; + + if (! win->treeview) { + win->treeview=gtk_tree_view_new(); + gtk_tree_view_set_model (GTK_TREE_VIEW (win->treeview), NULL); + gtk_container_add(GTK_CONTAINER(win->scrolled_window), win->treeview); + gtk_widget_show_all(GTK_WIDGET(win->window)); + gtk_widget_grab_focus(GTK_WIDGET(win->treeview)); + + /* add column names to treeview */ + for(i=0;itreeview),-1,param[i].name, + cell,"text",i, NULL); + } + } +#if 0 + g_signal_connect(G_OBJECT(win->treeview), "click-column", G_CALLBACK(click_column), NULL); +#endif + g_signal_connect(G_OBJECT(win->treeview), "row-activated", G_CALLBACK(select_row), win); + } + + /* find data storage and create a new one if none is there */ + if (gtk_tree_view_get_model(GTK_TREE_VIEW (win->treeview)) == NULL) { + for(i=0;iliststore=gtk_list_store_newv(count,types); + if (! strcmp(param[0].name, "Distance")) { + win->sortmodel=gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(win->liststore)); + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (win->sortmodel), 0, GTK_SORT_ASCENDING); + gtk_tree_view_set_model (GTK_TREE_VIEW (win->treeview), GTK_TREE_MODEL(win->sortmodel)); + } else + gtk_tree_view_set_model (GTK_TREE_VIEW (win->treeview), GTK_TREE_MODEL(win->liststore)); + } + + gtk_list_store_append(win->liststore,&iter); + + /* add data to data storage */ + for(i=0;iliststore,&iter,i,atoi(param[i].value),-1); + } else { + gtk_list_store_set(win->liststore,&iter,i,param[i].value,-1); + } + } +} + +static void +gui_gtk_datawindow_mode(struct datawindow_priv *win, int start) +{ + if (start) { + if (win && win->treeview) { + gtk_tree_view_set_model (GTK_TREE_VIEW (win->treeview), NULL); + } + } +} + +static gboolean +gui_gtk_datawindow_delete(GtkWidget *widget, GdkEvent *event, struct datawindow_priv *win) +{ + callback_call_0(win->close); + + if (win->button) { + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION(win->button), FALSE); + } + + return FALSE; +} + +void +gui_gtk_datawindow_destroy(struct datawindow_priv *win) +{ + if ((!win->gui) || (!win->gui->datawindow)) { + return; + } + + gui_gtk_datawindow_delete(NULL, NULL, win); + gtk_widget_destroy(win->window); + win->gui->datawindow = NULL; + + return; +} + +void +gui_gtk_datawindow_set_button(struct datawindow_priv *this_, GtkWidget *btn) +{ + this_->button = btn; +} + +static gboolean +keypress(GtkWidget *widget, GdkEventKey *event, struct datawindow_priv *win) +{ + if (event->type != GDK_KEY_PRESS) + return FALSE; + if (event->keyval == GDK_Cancel) { + gui_gtk_datawindow_delete(widget, (GdkEvent *)event, win); + gtk_widget_destroy(win->window); + } + return FALSE; +} + + +static struct datawindow_methods gui_gtk_datawindow_meth = { + gui_gtk_datawindow_destroy, + gui_gtk_datawindow_add, + gui_gtk_datawindow_mode, +}; + +struct datawindow_priv * +gui_gtk_datawindow_new(struct gui_priv *gui, char *name, struct callback *click, struct callback *close, struct datawindow_methods *meth) +{ + struct datawindow_priv *win; + + if (!gui) + return NULL; + *meth=gui_gtk_datawindow_meth; + win=g_new0(struct datawindow_priv, 1); + win->window=gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_default_size(GTK_WINDOW(win->window), 320, 200); + gtk_window_set_title(GTK_WINDOW(win->window), name); + gtk_window_set_wmclass (GTK_WINDOW (win->window), "navit", "Navit"); + + win->scrolled_window = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (win->scrolled_window), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER(win->window), win->scrolled_window); + g_signal_connect(G_OBJECT(win->window), "key-press-event", G_CALLBACK(keypress), win); + win->treeview=NULL; + win->click=click; + win->close=close; + gtk_window_set_transient_for(GTK_WINDOW((GtkWidget *)(win->window)), GTK_WINDOW(gui->win)); + g_signal_connect(G_OBJECT(win->window), "delete-event", G_CALLBACK(gui_gtk_datawindow_delete), win); + gtk_widget_show_all(win->window); + + win->gui = gui; + gui->datawindow = win; + return win; +} + diff --git a/navit/gui/gtk/destination.c b/navit/gui/gtk/destination.c new file mode 100644 index 0000000..48efc73 --- /dev/null +++ b/navit/gui/gtk/destination.c @@ -0,0 +1,585 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include "debug.h" +#include "destination.h" +#include "navit.h" +#include "item.h" +#include "coord.h" +#include "track.h" +#include "country.h" +#include "search.h" +#include "projection.h" +#include "navit_nls.h" +#include "bookmarks.h" + +#define COL_COUNT 8 + +static struct search_param { + struct navit *nav; + struct mapset *ms; + struct search_list *sl; + struct attr attr; + int partial; + GtkWidget *entry_country, *entry_postal, *entry_city, *entry_district; + GtkWidget *entry_street, *entry_number; + GtkWidget *listbox; + GtkWidget *treeview; + GtkListStore *liststore; + GtkTreeModel *liststore2; +} search_param; + +static void button_map(GtkWidget *widget, struct search_param *search) +{ + GtkTreePath *path; + GtkTreeViewColumn *focus_column; + struct pcoord *c=NULL; + GtkTreeIter iter; + + gtk_tree_view_get_cursor(GTK_TREE_VIEW(search->treeview), &path, &focus_column); + if(!path) + return; + if(!gtk_tree_model_get_iter(search->liststore2, &iter, path)) + return; + gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), &iter, COL_COUNT, &c, -1); + if (c) { + navit_set_center(search->nav, c, 1); + } +} + +static char *description(struct search_param *search, GtkTreeIter *iter) +{ + char *desc,*car,*postal,*town,*street; + char empty='\0'; + + gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), iter, 0, &car, -1); + gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), iter, 1, &postal, -1); + gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), iter, 2, &town, -1); + gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), iter, 4, &street, -1); + + /* protect against nulls */ + if (car==0) car=∅ + if (postal==0) postal=∅ + if (town==0) town=∅ + if (street==0) street=∅ + + if (search->attr.type == attr_town_name) + desc=g_strdup_printf("%s-%s %s", car, postal, town); + else + desc=g_strdup_printf("%s-%s %s, %s", car, postal, town, street); + return desc; +} + +static void button_destination(GtkWidget *widget, struct search_param *search) +{ + struct pcoord *c=NULL; + GtkTreeIter iter; + char *desc; + + if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (search->liststore2), &iter)) + return; + gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), &iter, COL_COUNT, &c, -1); + if (c) { + desc=description(search, &iter); + navit_set_destination(search->nav, c, desc, 1); + g_free(desc); + } +} + +static void button_bookmark(GtkWidget *widget, struct search_param *search) +{ + struct pcoord *c=NULL; + GtkTreeIter iter; + char *desc; + struct attr attr; + + if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (search->liststore2), &iter)) + return; + gtk_tree_model_get (GTK_TREE_MODEL (search->liststore2), &iter, COL_COUNT, &c, -1); + if (c) { + navit_get_attr(search->nav, attr_bookmarks, &attr, NULL); + desc=description(search, &iter); + bookmarks_add_bookmark(attr.u.bookmarks, c, desc); + g_free(desc); + } +} + + +char **columns_text[] = { + (char *[]){_n("Car"),_n("Iso2"),_n("Iso3"),_n("Country"),NULL}, + (char *[]){_n("Car"),_n("Postal"),_n("Town"),_n("District"),NULL}, + (char *[]){_n("Car"),_n("Postal"),_n("Town"),_n("District"),_n("Street"),NULL}, + (char *[]){_n("Car"),_n("Postal"),_n("Town"),_n("District"),_n("Street"),_n("Number"),NULL}, +}; + +static void set_columns(struct search_param *param, int mode) +{ + GList *columns_list,*columns; + char **column_text=columns_text[mode]; + int i=0; + + columns_list=gtk_tree_view_get_columns(GTK_TREE_VIEW(param->treeview)); + columns=columns_list; + while (columns) { + gtk_tree_view_remove_column(GTK_TREE_VIEW(param->treeview), columns->data); + columns=g_list_next(columns); + } + g_list_free(columns_list); + while (*column_text) { + GtkCellRenderer *cell=gtk_cell_renderer_text_new(); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (param->treeview),-1, gettext(*column_text), cell, "text", i, NULL); + i++; + column_text++; + } + +} + +static void row_activated(GtkWidget *widget, GtkTreePath *p1, GtkTreeViewColumn *c, struct search_param *search) +{ + GtkTreePath *path; + GtkTreeViewColumn *focus_column; + GtkTreeIter iter; + GtkWidget *entry_widget; + char *str; + int column; + + dbg(0,"enter\n"); + gtk_tree_view_get_cursor(GTK_TREE_VIEW(search->treeview), &path, &focus_column); + if(!path) + return; + if(!gtk_tree_model_get_iter(search->liststore2, &iter, path)) + return; + switch(search->attr.type) { + case attr_country_all: + entry_widget=search->entry_country; + column=3; + break; + case attr_town_name: + entry_widget=search->entry_city; + column=2; + break; + case attr_street_name: + entry_widget=search->entry_street; + column=4; + break; + default: + dbg(0,"Unknown mode\n"); + return; + } + gtk_tree_model_get(search->liststore2, &iter, column, &str, -1); + dbg(0,"str=%s\n", str); + search->partial=0; + gtk_entry_set_text(GTK_ENTRY(entry_widget), str); +} + +static void tree_view_button_release(GtkWidget *widget, GdkEventButton *event, struct search_param *search) +{ + GtkTreePath *path; + GtkTreeViewColumn *column; + gtk_tree_view_get_cursor(GTK_TREE_VIEW(search->treeview), &path, &column); + gtk_tree_view_row_activated(GTK_TREE_VIEW(search->treeview), path, column); + +} +static void +next_focus(struct search_param *search, GtkWidget *widget) +{ + if (widget == search->entry_country) + gtk_widget_grab_focus(search->entry_city); + if (widget == search->entry_city) + gtk_widget_grab_focus(search->entry_street); + if (widget == search->entry_street) + gtk_widget_grab_focus(search->entry_number); + +} + +static void changed(GtkWidget *widget, struct search_param *search) +{ + struct search_list_result *res; + GtkTreeIter iter; + + search->attr.u.str=(char *)gtk_entry_get_text(GTK_ENTRY(widget)); + printf("changed %s partial %d\n", search->attr.u.str, search->partial); + if (widget == search->entry_country) { + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (search->liststore2), 3, GTK_SORT_ASCENDING); + dbg(0,"country\n"); + search->attr.type=attr_country_all; + set_columns(search, 0); + } + if (widget == search->entry_postal) { + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (search->liststore2), 1, GTK_SORT_ASCENDING); + dbg(0,"postal\n"); + search->attr.type=attr_town_postal; + if (strlen(search->attr.u.str) < 2) + return; + set_columns(search, 1); + } + if (widget == search->entry_city) { + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (search->liststore2), 2, GTK_SORT_ASCENDING); + dbg(0,"town\n"); + search->attr.type=attr_town_name; + if (strlen(search->attr.u.str) < 3) + return; + set_columns(search, 1); + } + if (widget == search->entry_street) { + dbg(0,"street\n"); + search->attr.type=attr_street_name; + // Searching for a street by just its first letter generates too many hits to be useful, + // plus it causes the GUI to become unresponsive because the search is single-threaded. + // So we only start searching once we have two letters. + if (strlen(search->attr.u.str) < 2) + return; + set_columns(search, 2); + } + + search_list_search(search->sl, &search->attr, search->partial); + gtk_list_store_clear(search->liststore); + while((res=search_list_get_result(search->sl))) { + gtk_list_store_append(search->liststore,&iter); + gtk_list_store_set(search->liststore,&iter,COL_COUNT,res->c,-1); + if (widget == search->entry_country) { + if (res->country) { + gtk_list_store_set(search->liststore,&iter,0,res->country->car,-1); + gtk_list_store_set(search->liststore,&iter,1,res->country->iso3,-1); + gtk_list_store_set(search->liststore,&iter,2,res->country->iso2,-1); + gtk_list_store_set(search->liststore,&iter,3,res->country->name,-1); + } + } else { + if (res->country) + gtk_list_store_set(search->liststore,&iter,0,res->country->car,-1); + else + gtk_list_store_set(search->liststore,&iter,0,"",-1); + if (res->town) { + gtk_list_store_set(search->liststore,&iter,1,res->town->common.postal,-1); + gtk_list_store_set(search->liststore,&iter,2,res->town->common.town_name,-1); + gtk_list_store_set(search->liststore,&iter,3,res->town->common.district_name,-1); + } else { + gtk_list_store_set(search->liststore,&iter,1,"",-1); + gtk_list_store_set(search->liststore,&iter,2,"",-1); + gtk_list_store_set(search->liststore,&iter,3,"",-1); + } + if (res->street) + gtk_list_store_set(search->liststore,&iter,4,res->street->name,-1); + else + gtk_list_store_set(search->liststore,&iter,4,"",-1); + + } + } + + if(! search->partial) + { + if( widget == search->entry_country ) + { + gtk_widget_set_sensitive(GTK_WIDGET(search->entry_city), TRUE); + } + if( widget == search->entry_city ) + { + gtk_widget_set_sensitive(GTK_WIDGET(search->entry_city), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(search->entry_street), TRUE); + } + if( widget == search->entry_street ) + { + gtk_widget_set_sensitive(GTK_WIDGET(search->entry_city), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(search->entry_street), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(search->entry_number), TRUE); + } + } else { + if( widget == search->entry_country ) + { + gtk_widget_set_sensitive(GTK_WIDGET(search->entry_city), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(search->entry_street), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(search->entry_number), FALSE); + } + if( widget == search->entry_city ) + { + gtk_widget_set_sensitive(GTK_WIDGET(search->entry_street), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(search->entry_number), FALSE); + } + if( widget == search->entry_street ) + { + gtk_widget_set_sensitive(GTK_WIDGET(search->entry_number), FALSE); + } + } + if (! search->partial) + next_focus(search, widget); + search->partial=1; +} + +/* borrowed from gpe-login */ + + +#define MAX_ARGS 8 + +static void +parse_xkbd_args (const char *cmd, char **argv) +{ + const char *p = cmd; + char buf[strlen (cmd) + 1], *bufp = buf; + int nargs = 0; + int escape = 0, squote = 0, dquote = 0; + + while (*p) + { + if (escape) + { + *bufp++ = *p; + escape = 0; + } + else + { + switch (*p) + { + case '\\': + escape = 1; + break; + case '"': + if (squote) + *bufp++ = *p; + else + dquote = !dquote; + break; + case '\'': + if (dquote) + *bufp++ = *p; + else + squote = !squote; + break; + case ' ': + if (!squote && !dquote) + { + *bufp = 0; + if (nargs < MAX_ARGS) + argv[nargs++] = strdup (buf); + bufp = buf; + break; + } + default: + *bufp++ = *p; + break; + } + } + p++; + } + + if (bufp != buf) + { + *bufp = 0; + if (nargs < MAX_ARGS) + argv[nargs++] = strdup (buf); + } + argv[nargs] = NULL; +} + +int kbd_pid; + +static int +spawn_xkbd (char *xkbd_path, char *xkbd_str) +{ +#ifdef _WIN32 // AF FIXME for WIN32 + #ifndef F_SETFD + #define F_SETFD 2 + #endif +#else + char *xkbd_args[MAX_ARGS + 1]; + int fd[2]; + char buf[256]; + char c; + int a = 0; + size_t n; + + pipe (fd); + kbd_pid = fork (); + if (kbd_pid == 0) + { + close (fd[0]); + if (dup2 (fd[1], 1) < 0) + perror ("dup2"); + close (fd[1]); + if (fcntl (1, F_SETFD, 0)) + perror ("fcntl"); + xkbd_args[0] = (char *)xkbd_path; + xkbd_args[1] = "-xid"; + if (xkbd_str) + parse_xkbd_args (xkbd_str, xkbd_args + 2); + else + xkbd_args[2] = NULL; + execvp (xkbd_path, xkbd_args); + perror (xkbd_path); + _exit (1); + } + close (fd[1]); + do { + n = read (fd[0], &c, 1); + if (n) + { + buf[a++] = c; + } + } while (n && (c != 10) && (a < (sizeof (buf) - 1))); + + if (a) + { + buf[a] = 0; + return atoi (buf); + } +#endif + return 0; +} + +int destination_address(struct navit *nav) +{ + + GtkWidget *window2, *keyboard, *vbox, *table; + GtkWidget *label_country; + GtkWidget *label_postal, *label_city, *label_district; + GtkWidget *label_street, *label_number; + GtkWidget *hseparator1,*hseparator2; + GtkWidget *button1,*button2,*button3; + int i; + struct search_param *search=&search_param; + struct attr search_attr, country_name, *country_attr; + struct tracking *tracking; + struct country_search *cs; + struct item *item; + + + search->nav=nav; + search->ms=navit_get_mapset(nav); + search->sl=search_list_new(search->ms); + + window2 = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(window2),_("Enter Destination")); + gtk_window_set_wmclass (GTK_WINDOW (window2), "navit", "Navit"); + gtk_window_set_default_size (GTK_WINDOW (window2),0,300); + vbox = gtk_vbox_new(FALSE, 0); + table = gtk_table_new(3, 8, FALSE); + + search->entry_country = gtk_entry_new(); + label_country = gtk_label_new(_("Country")); + search->entry_postal = gtk_entry_new(); + gtk_widget_set_sensitive(GTK_WIDGET(search->entry_postal), FALSE); + label_postal = gtk_label_new(_("Zip Code")); + search->entry_city = gtk_entry_new(); + gtk_widget_set_sensitive(GTK_WIDGET(search->entry_city), FALSE); + label_city = gtk_label_new(_("City")); + search->entry_district = gtk_entry_new(); + gtk_widget_set_sensitive(GTK_WIDGET(search->entry_district), FALSE); + label_district = gtk_label_new(_("District/Township")); + hseparator1 = gtk_vseparator_new(); + search->entry_street = gtk_entry_new(); + gtk_widget_set_sensitive(GTK_WIDGET(search->entry_street), FALSE); + label_street = gtk_label_new(_("Street")); + search->entry_number = gtk_entry_new(); + gtk_widget_set_sensitive(GTK_WIDGET(search->entry_number), FALSE); + label_number = gtk_label_new(_("Number")); + search->treeview=gtk_tree_view_new(); + search->listbox = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (search->listbox), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + + gtk_tree_view_set_model (GTK_TREE_VIEW (search->treeview), NULL); + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(search->listbox),search->treeview); + { + GType types[COL_COUNT+1]; + for(i=0;iliststore=gtk_list_store_newv(COL_COUNT+1,types); + search->liststore2=gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(search->liststore)); + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (search->liststore2), 3, GTK_SORT_ASCENDING); + gtk_tree_view_set_model (GTK_TREE_VIEW (search->treeview), GTK_TREE_MODEL(search->liststore2)); + } + + + + + hseparator2 = gtk_vseparator_new(); + button1 = gtk_button_new_with_label(_("Map")); + button2 = gtk_button_new_with_label(_("Bookmark")); + button3 = gtk_button_new_with_label(_("Destination")); + + gtk_table_attach(GTK_TABLE(table), label_country, 0, 1, 0, 1, 0, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), label_postal, 1, 2, 0, 1, 0, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), label_city, 2, 3, 0, 1, 0, GTK_FILL, 0, 0); + + gtk_table_attach(GTK_TABLE(table), search->entry_country, 0, 1, 1, 2, 0, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), search->entry_postal, 1, 2, 1, 2, 0, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), search->entry_city, 2, 3, 1, 2, 0, GTK_FILL, 0, 0); + + gtk_table_attach(GTK_TABLE(table), label_district, 0, 1, 2, 3, 0, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), label_street, 1, 2, 2, 3, 0, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), label_number, 2, 3, 2, 3, 0, GTK_FILL, 0, 0); + + gtk_table_attach(GTK_TABLE(table), search->entry_district, 0, 1, 3, 4, 0, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), search->entry_street, 1, 2, 3, 4, 0, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), search->entry_number, 2, 3, 3, 4, 0, GTK_FILL, 0, 0); + + gtk_table_attach(GTK_TABLE(table), search->listbox, 0, 3, 4, 5, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); + + gtk_table_attach(GTK_TABLE(table), button1, 0, 1, 5, 6, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), button2, 1, 2, 5, 6, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), button3, 2, 3, 5, 6, GTK_FILL, GTK_FILL, 0, 0); + + g_signal_connect(G_OBJECT(search->entry_country), "changed", G_CALLBACK(changed), search); + g_signal_connect(G_OBJECT(search->entry_postal), "changed", G_CALLBACK(changed), search); + g_signal_connect(G_OBJECT(search->entry_city), "changed", G_CALLBACK(changed), search); + g_signal_connect(G_OBJECT(search->entry_district), "changed", G_CALLBACK(changed), search); + g_signal_connect(G_OBJECT(search->entry_street), "changed", G_CALLBACK(changed), search); + g_signal_connect(G_OBJECT(search->entry_number), "changed", G_CALLBACK(changed), search); + g_signal_connect(G_OBJECT(button1), "clicked", G_CALLBACK(button_map), search); + g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK(button_bookmark), search); + g_signal_connect(G_OBJECT(button3), "clicked", G_CALLBACK(button_destination), search); + g_signal_connect(G_OBJECT(search->treeview), "button-release-event", G_CALLBACK(tree_view_button_release), search); + g_signal_connect(G_OBJECT(search->treeview), "row_activated", G_CALLBACK(row_activated), search); + + gtk_widget_grab_focus(search->entry_city); + + gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0); + keyboard=gtk_socket_new(); + gtk_box_pack_end(GTK_BOX(vbox), keyboard, FALSE, FALSE, 0); + gtk_container_add(GTK_CONTAINER(window2), vbox); +#if 0 + g_signal_connect(G_OBJECT(listbox), "select-row", G_CALLBACK(select_row), NULL); +#endif + gtk_widget_show_all(window2); + +#ifndef _WIN32 + gtk_socket_steal(GTK_SOCKET(keyboard), spawn_xkbd("xkbd","-geometry 200x100")); +#endif + + country_attr=country_default(); + tracking=navit_get_tracking(nav); + if (tracking && tracking_get_attr(tracking, attr_country_id, &search_attr, NULL)) + country_attr=&search_attr; + if (country_attr) { + cs=country_search_new(country_attr, 0); + item=country_search_get_item(cs); + if (item && item_attr_get(item, attr_country_name, &country_name)) + gtk_entry_set_text(GTK_ENTRY(search->entry_country), country_name.u.str); + country_search_destroy(cs); + } else { + dbg(0,"warning: no default country found\n"); + } + search->partial=1; + return 0; +} diff --git a/navit/gui/gtk/gui_gtk.h b/navit/gui/gtk/gui_gtk.h new file mode 100644 index 0000000..6168b9a --- /dev/null +++ b/navit/gui/gtk/gui_gtk.h @@ -0,0 +1,62 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include "coord.h" + +struct menu_methods; +struct datawindow_methods; +struct navit; +struct callback; +struct statusbar_priv; + +struct gui_priv { + struct navit *nav; + GtkWidget *win; + GtkWidget *dialog_win; + GtkWidget *dialog_entry; + struct pcoord dialog_coord; + GtkWidget *vbox; + GtkWidget *menubar; + GtkActionGroup *base_group; + GtkActionGroup *debug_group; + GtkActionGroup *dyn_group; + GtkUIManager *ui_manager; + GSList *layout_group; + GSList *projection_group; + GSList *vehicle_group; + GList *dest_menuitems; + GList *bookmarks_menuitems; + GList *vehicle_menuitems; + GtkUIManager *menu_manager; // old + struct statusbar_priv *statusbar; + int menubar_enable; + int toolbar_enable; + int statusbar_enable; + int dyn_counter; + struct datawindow_priv *datawindow; +}; + +void gui_gtk_ui_init(struct gui_priv *this); +struct menu_priv *gui_gtk_menubar_new(struct gui_priv *gui, struct menu_methods *meth); +struct statusbar_priv *gui_gtk_statusbar_new(struct gui_priv *gui); +struct menu_priv *gui_gtk_popup_new(struct gui_priv *gui, struct menu_methods *meth); +struct datawindow_priv *gui_gtk_datawindow_new(struct gui_priv *gui, char *name, struct callback *click, struct callback *close, struct datawindow_methods *meth); +void gui_gtk_datawindow_destroy(struct datawindow_priv *win); +void gui_gtk_datawindow_set_button(struct datawindow_priv *this_, GtkWidget *btn); + diff --git a/navit/gui/gtk/gui_gtk_action.c b/navit/gui/gtk/gui_gtk_action.c new file mode 100644 index 0000000..4b2652c --- /dev/null +++ b/navit/gui/gtk/gui_gtk_action.c @@ -0,0 +1,633 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "navit.h" +#include "gui_gtk.h" +#ifdef __APPLE__ +#include "navit/menu.h" +#else +#include "menu.h" +#endif +#include "coord.h" +#include "item.h" +#include "attr.h" +#include "callback.h" +#include "debug.h" +#include "destination.h" + +#define gettext_noop(String) String +#define _(STRING) gettext(STRING) +#define _n(STRING) gettext_noop(STRING) + +struct menu_priv { + char *path; + GtkAction *action; + struct gui_priv *gui; + enum menu_type type; + struct callback *cb; + struct menu_priv *child; + struct menu_priv *sibling; + gulong handler_id; + guint merge_id; + GtkWidget *widget; +}; + +/* Create callbacks that implement our Actions */ + +static void +zoom_in_action(GtkWidget *w, struct gui_priv *gui, void *dummy) +{ + navit_zoom_in(gui->nav, 2, NULL); +} + +static void +zoom_out_action(GtkWidget *w, struct gui_priv *gui, void *dummy) +{ + navit_zoom_out(gui->nav, 2, NULL); +} + +static void +refresh_action(GtkWidget *w, struct gui_priv *gui, void *dummy) +{ + navit_draw(gui->nav); +} + +// Forward declarations, these should not be visible outside the GUI, so +// they are not in the header files, but here +void gui_gtk_datawindow_set_button(struct datawindow_priv *this_, GtkWidget *btn); +void gui_gtk_datawindow_destroy(struct datawindow_priv *win); + +static void +roadbook_action(GtkWidget *w, struct gui_priv *gui, void *dummy) +{ + + if (! gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w))) { + gui_gtk_datawindow_destroy(gui->datawindow); + } else { + navit_window_roadbook_new(gui->nav); + if (gui->datawindow) { + gui_gtk_datawindow_set_button(gui->datawindow, w); + } + } +} + +static void +autozoom_action(GtkWidget *w, struct gui_priv *gui, void *dummy) +{ + struct attr autozoom_attr; + + autozoom_attr.type = attr_autozoom_active; + if (! gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w))) { + autozoom_attr.u.num = 0; + } else { + autozoom_attr.u.num = 1; + } + + navit_set_attr(gui->nav, &autozoom_attr); +} + +static void +cursor_action(GtkWidget *w, struct gui_priv *gui, void *dummy) +{ + struct attr attr; + + attr.type=attr_cursor; + attr.u.num=gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w)); + if(!navit_set_attr(gui->nav, &attr)) { + dbg(0, "Failed to set attr_cursor\n"); + } +} + +static void +tracking_action(GtkWidget *w, struct gui_priv *gui, void *dummy) +{ + struct attr attr; + + attr.type=attr_tracking; + attr.u.num=gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w)); + if(!navit_set_attr(gui->nav, &attr)) { + dbg(0, "Failed to set attr_tracking\n"); + } +} + +static void +orient_north_action(GtkWidget *w, struct gui_priv *gui, void *dummy) +{ + struct attr attr; + + attr.type=attr_orientation; + attr.u.num=gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w)) ? 0:-1; + if(!navit_set_attr(gui->nav, &attr)) { + dbg(0, "Failed to set attr_orientation\n"); + } +} + +static void +window_fullscreen_action(GtkWidget *w, struct gui_priv *gui, void *dummy) +{ + if(gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w))) + gtk_window_fullscreen(GTK_WINDOW(gui->win)); + else + gtk_window_unfullscreen(GTK_WINDOW(gui->win)); +} + +#include +#include "point.h" +#include "transform.h" + +static void +info_action(GtkWidget *w, struct gui_priv *gui, void *dummy) +{ + char buffer[512]; + int mw,mh; + struct coord lt, rb; + struct point p; + struct transformation *t; + + t=navit_get_trans(gui->nav); + transform_get_size(t, &mw, &mh); + p.x=0; + p.y=0; + transform_reverse(t, &p, <); + p.x=mw; + p.y=mh; + transform_reverse(t, &p, &rb); + + sprintf(buffer,"./info.sh %d,%d 0x%x,0x%x 0x%x,0x%x", mw, mh, lt.x, lt.y, rb.x, rb.y); + system(buffer); + +} + + +static void +route_clear_action(GtkWidget *w, struct gui_priv *gui, void *dummy) +{ + navit_set_destination(gui->nav, NULL, NULL, 0); +} + +static void +destination_action(GtkWidget *w, struct gui_priv *gui, void *dummy) +{ + destination_address(gui->nav); +} + +static void +quit_action (GtkWidget *w, struct gui_priv *gui, void *dummy) +{ + navit_destroy(gui->nav); + exit(0); +} + +static GtkActionEntry entries[] = +{ + /* TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). */ + { "DisplayMenuAction", NULL, _n("_Display") }, + { "RouteMenuAction", NULL, _n("_Route") }, + { "FormerDestinationMenuAction", NULL, _n("_Former Destinations") }, + { "BookmarkMenuAction", NULL, _n("_Bookmarks") }, + { "MapMenuAction", NULL, _n("_Map") }, + { "LayoutMenuAction", NULL, _n("_Layout") }, + { "ProjectionMenuAction", NULL, _n("_Projection") }, + { "VehicleMenuAction", NULL, _n("_Vehicle") }, + { "ZoomOutAction", GTK_STOCK_ZOOM_OUT, _n("Zoom_Out"), "minus", _n("Decrease zoom level"), G_CALLBACK(zoom_out_action) }, + { "ZoomInAction", GTK_STOCK_ZOOM_IN, _n("Zoom_In"), "plus", _n("Increase zoom level"), G_CALLBACK(zoom_in_action) }, + { "RefreshAction", GTK_STOCK_REFRESH, _n("_Recalculate"), "R", _n("Redraw map"), G_CALLBACK(refresh_action) }, +#ifdef GTK_STOCK_INFO + { "InfoAction", GTK_STOCK_INFO, _n("_Info"), NULL, NULL, G_CALLBACK(info_action) }, +#else + { "InfoAction", NULL, _n("_Info"), NULL, NULL, G_CALLBACK(info_action) }, +#endif /*GTK_STOCK_INFO*/ + { "DestinationAction", "flag_icon", _n("Set _destination"), "D", _n("Opens address search dialog"), G_CALLBACK(destination_action) }, + { "RouteClearAction", NULL, _n("_Stop Navigation"), "S", NULL, G_CALLBACK(route_clear_action) }, + { "Test", NULL, _n("Test"), NULL, NULL, G_CALLBACK(destination_action) }, + { "QuitAction", GTK_STOCK_QUIT, _n("_Quit"), "Q",_n("Quit the application"), G_CALLBACK (quit_action) } +}; + +static guint n_entries = G_N_ELEMENTS (entries); + +static GtkToggleActionEntry toggleentries[] = +{ + { "CursorAction", "cursor_icon",_n("Show position _cursor"), NULL, NULL, G_CALLBACK(cursor_action),TRUE }, + { "TrackingAction", NULL ,_n("_Lock on Road"), NULL, NULL, G_CALLBACK(tracking_action),TRUE }, + { "OrientationAction", "orientation_icon", _n("_Keep orientation to the North"), NULL, _n("Switches map orientation to the north or the vehicle"), G_CALLBACK(orient_north_action),FALSE }, + { "RoadbookAction", GTK_STOCK_JUSTIFY_FILL, _n("_Roadbook"), "B", _n("Show/hide route description"), G_CALLBACK(roadbook_action), FALSE }, + { "AutozoomAction", GTK_STOCK_ZOOM_FIT, _n("_Autozoom"), "A", _n("Enable/disable automatic zoom level changing"), G_CALLBACK(autozoom_action), FALSE }, +#ifdef GTK_STOCK_FULLSCREEN + { "FullscreenAction",GTK_STOCK_FULLSCREEN, _n("_Fullscreen"), "F", NULL, G_CALLBACK(window_fullscreen_action), FALSE } +#else + { "FullscreenAction", NULL, _n("_Fullscreen"), "F", NULL, G_CALLBACK(window_fullscreen_action), FALSE } +#endif /*GTK_STOCK_FULLSCREEN*/ +}; + +static guint n_toggleentries = G_N_ELEMENTS (toggleentries); + +static GtkActionEntry debug_entries[] = +{ + { "DataMenuAction", NULL, _n("Data") }, +}; + +static guint n_debug_entries = G_N_ELEMENTS (debug_entries); + + +static const char * cursor_xpm[] = { +"22 22 2 1", +" c None", +". c #0000FF", +" ", +" ", +" ", +" .. ", +" .. .. ", +" .. .. ", +" . . ", +" . . ", +" . ... . ", +" . ... . . ", +" . ... . . ", +" . .. . . ", +" . . . ", +" . . . ", +" . . . ", +" . . . ", +" .. .. ", +" .. .. ", +" .. ", +" ", +" ", +" "}; + + +static const char * north_xpm[] = { +"22 22 2 1", +" c None", +". c #000000", +" ", +" ", +" . ", +" ... ", +" . . . ", +" . . . ", +" . ", +" .... . .... ", +" .... . .... ", +" .... . .. ", +" .. .. .. ", +" .. .. .. ", +" .. .. .. ", +" .. .. .. ", +" .. . .... ", +" .... . .... ", +" .... . .... ", +" . ", +" . ", +" . ", +" ", +" "}; + + +static const char * flag_xpm[] = { +"22 22 2 1", +" c None", +"+ c #000000", +"+++++++ ", +"+ +++++++++ ", +"+ +++ +++++++++ ", +"+ +++ +++ +++ ", +"++++ +++ +++ ", +"++++ +++ +++ ", +"++++ +++ +++ + ", +"+ ++++++ +++ + ", +"+ +++ ++++++ + ", +"+ +++ +++ +++ ", +"++++ +++ +++ ", +"++++ +++ +++ ", +"++++++++++ +++ + ", +"+ +++++++++ + ", +"+ ++++++ ", +"+ ", +"+ ", +"+ ", +"+ ", +"+ ", +"+ ", +"+ "}; + + + +static struct { + gchar *stockid; + const char **icon_xpm; +} stock_icons[] = { + {"cursor_icon", cursor_xpm }, + {"orientation_icon", north_xpm }, + {"flag_icon", flag_xpm } +}; + + +static gint n_stock_icons = G_N_ELEMENTS (stock_icons); + + +static void +register_my_stock_icons (void) +{ + GtkIconFactory *icon_factory; + GtkIconSet *icon_set; + GdkPixbuf *pixbuf; + gint i; + + icon_factory = gtk_icon_factory_new (); + + for (i = 0; i < n_stock_icons; i++) + { + pixbuf = gdk_pixbuf_new_from_xpm_data(stock_icons[i].icon_xpm); + icon_set = gtk_icon_set_new_from_pixbuf (pixbuf); + g_object_unref(pixbuf); + gtk_icon_factory_add (icon_factory, stock_icons[i].stockid, icon_set); + gtk_icon_set_unref (icon_set); + } + + gtk_icon_factory_add_default(icon_factory); + + g_object_unref(icon_factory); +} + + +static char layout[] = + "\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + "; + + +static void +activate(void *dummy, struct menu_priv *menu) +{ + if (menu->cb) + callback_call_0(menu->cb); +} + +static struct menu_methods menu_methods; + +static struct menu_priv * +add_menu(struct menu_priv *menu, struct menu_methods *meth, char *name, enum menu_type type, struct callback *cb) +{ + struct menu_priv *ret; + char *dynname; + + ret=g_new0(struct menu_priv, 1); + *meth=menu_methods; + if (! strcmp(menu->path, "/ui/MenuBar") && !strcmp(name,"Route")) { + dynname=g_strdup("Route"); + } else if (! strcmp(menu->path, "/ui/MenuBar") && !strcmp(name,"Data")) { + dynname=g_strdup("Data"); + } else { + dynname=g_strdup_printf("%d", menu->gui->dyn_counter++); + if (type == menu_type_toggle) + ret->action=GTK_ACTION(gtk_toggle_action_new(dynname, name, NULL, NULL)); + else + ret->action=gtk_action_new(dynname, name, NULL, NULL); + if (cb) + ret->handler_id=g_signal_connect(ret->action, "activate", G_CALLBACK(activate), ret); + gtk_action_group_add_action(menu->gui->dyn_group, ret->action); + ret->merge_id=gtk_ui_manager_new_merge_id(menu->gui->ui_manager); + gtk_ui_manager_add_ui( menu->gui->ui_manager, ret->merge_id, menu->path, dynname, dynname, type == menu_type_submenu ? GTK_UI_MANAGER_MENU : GTK_UI_MANAGER_MENUITEM, FALSE); + } + ret->gui=menu->gui; + ret->path=g_strdup_printf("%s/%s", menu->path, dynname); + ret->type=type; + ret->cb=cb; + ret->sibling=menu->child; + menu->child=ret; + g_free(dynname); + return ret; + +} + +static void +remove_menu(struct menu_priv *item, int recursive) +{ + + if (recursive) { + struct menu_priv *next,*child=item->child; + while (child) { + next=child->sibling; + remove_menu(child, recursive); + child=next; + } + } + if (item->action) { + gtk_ui_manager_remove_ui(item->gui->ui_manager, item->merge_id); + gtk_action_group_remove_action(item->gui->dyn_group, item->action); +#if 0 + if (item->callback) + g_signal_handler_disconnect(item->action, item->handler_id); +#endif + g_object_unref(item->action); + } + g_free(item->path); + g_free(item); +} + +static void +set_toggle(struct menu_priv *menu, int active) +{ + gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(menu->action), active); +} + +static int +get_toggle(struct menu_priv *menu) +{ + return gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(menu->action)); +} + +static struct menu_methods menu_methods = { +#if 1 + add_menu, + set_toggle, + get_toggle, +#else + NULL, + NULL, + NULL +#endif +}; + + +static void +popup_deactivate(GtkWidget *widget, struct menu_priv *menu) +{ + g_signal_handler_disconnect(widget, menu->handler_id); + remove_menu(menu, 1); +} + +static void +popup_activate(struct menu_priv *menu) +{ +#ifdef _WIN32 + menu->widget=gtk_ui_manager_get_widget(menu->gui->ui_manager, menu->path ); +#endif + gtk_menu_popup(GTK_MENU(menu->widget), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time ()); + menu->handler_id=g_signal_connect(menu->widget, "selection-done", G_CALLBACK(popup_deactivate), menu); +} + +void +gui_gtk_ui_init(struct gui_priv *this) +{ + GError *error = NULL; + struct attr attr; + GtkToggleAction *toggle_action; + + this->base_group = gtk_action_group_new ("BaseActions"); + this->debug_group = gtk_action_group_new ("DebugActions"); + this->dyn_group = gtk_action_group_new ("DynamicActions"); + register_my_stock_icons(); + this->ui_manager = gtk_ui_manager_new (); + gtk_action_group_set_translation_domain(this->base_group,"navit"); + gtk_action_group_set_translation_domain(this->debug_group,"navit"); + gtk_action_group_set_translation_domain(this->dyn_group,"navit"); + gtk_action_group_add_actions (this->base_group, entries, n_entries, this); + gtk_action_group_add_toggle_actions (this->base_group, toggleentries, n_toggleentries, this); + gtk_ui_manager_insert_action_group (this->ui_manager, this->base_group, 0); + gtk_action_group_add_actions (this->debug_group, debug_entries, n_debug_entries, this); + gtk_ui_manager_insert_action_group (this->ui_manager, this->debug_group, 0); + gtk_ui_manager_add_ui_from_string (this->ui_manager, layout, strlen(layout), &error); + gtk_ui_manager_insert_action_group (this->ui_manager, this->dyn_group, 0); + if (error) { + g_message ("building menus failed: %s", error->message); + g_error_free (error); + } + if (navit_get_attr(this->nav, attr_cursor, &attr, NULL)) { + toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "CursorAction")); + gtk_toggle_action_set_active(toggle_action, attr.u.num); + } + if (navit_get_attr(this->nav, attr_orientation, &attr, NULL)) { + toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "OrientationAction")); + gtk_toggle_action_set_active(toggle_action, attr.u.num != -1); + } + if (navit_get_attr(this->nav, attr_tracking, &attr, NULL)) { + toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "TrackingAction")); + gtk_toggle_action_set_active(toggle_action, attr.u.num); + } + toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "RoadbookAction")); + gtk_toggle_action_set_active(toggle_action, 0); + + if (navit_get_attr(this->nav, attr_autozoom_active, &attr, NULL)) { + toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "AutozoomAction")); + gtk_toggle_action_set_active(toggle_action, attr.u.num); + } + +} + +static struct menu_priv * +gui_gtk_ui_new (struct gui_priv *this, struct menu_methods *meth, char *path, int popup, GtkWidget **widget_ret) +{ + struct menu_priv *ret; + GtkWidget *widget; + + *meth=menu_methods; + ret=g_new0(struct menu_priv, 1); + ret->path=g_strdup(path); + ret->gui=this; + + widget=gtk_ui_manager_get_widget(this->ui_manager, path); + GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS); + if (widget_ret) + *widget_ret=widget; + if (! popup) { + gtk_box_pack_start (GTK_BOX(this->vbox), widget, FALSE, FALSE, 0); + gtk_widget_show (widget); + } else { + ret->widget=widget; + meth->popup=popup_activate; + } + return ret; +} + +#if 0 +struct menu_priv * +gui_gtk_menubar_new(struct gui_priv *this, struct menu_methods *meth) +{ + return gui_gtk_ui_new(this, meth, "/ui/MenuBar", 0, &this->menubar); +} +#endif + +struct menu_priv * +gui_gtk_popup_new(struct gui_priv *this, struct menu_methods *meth) +{ + return gui_gtk_ui_new(this, meth, "/ui/PopUp", 1, NULL); +} diff --git a/navit/gui/gtk/gui_gtk_statusbar.c b/navit/gui/gtk/gui_gtk_statusbar.c new file mode 100644 index 0000000..368134a --- /dev/null +++ b/navit/gui/gtk/gui_gtk_statusbar.c @@ -0,0 +1,178 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include "item.h" +#include "coord.h" +#include "debug.h" +#include "vehicle.h" +#include "callback.h" +#include "route.h" +#include "transform.h" +#include "navit.h" +#include "map.h" +#include "navigation.h" +#include "gui_gtk.h" +#include "navit_nls.h" + +struct statusbar_priv { + struct gui_priv *gui; + GtkWidget *hbox; + char gps_text[128]; + GtkWidget *gps; + char route_text[128]; + GtkWidget *route; + struct callback *vehicle_cb; +}; + +#if 0 +static void +statusbar_destroy(struct statusbar_priv *this) +{ + g_free(this); +} + +static void +statusbar_gps_update(struct statusbar_priv *this, int sats, int qual, double lng, double lat, double height, double direction, double speed) +{ + char *dirs[]={_("N"),_("NE"),_("E"),_("SE"),_("S"),_("SW"),_("W"),_("NW"),_("N")}; + char *dir; + int dir_idx; + char pos_text[36]; + + coord_format(lat,lng,DEGREES_MINUTES_SECONDS,pos_text,sizeof(pos_text)); + dir=dirs[dir_idx]; + sprintf(this->gps_text, "GPS %02d/%02d %s %4.0fm %3.0f°%-2s %3.0fkm/h", sats, qual, pos_text, height, direction, dir, speed); + gtk_label_set_text(GTK_LABEL(this->gps), this->gps_text); + +} +#endif + +static char *status_fix2str(int type) +{ + switch(type) { + case 0: return _("No"); + case 1: return _("2D"); + case 3: return _("3D"); + default: + return _("OT"); + } +} + +static void +statusbar_route_update(struct statusbar_priv *this, struct navit *navit, struct vehicle *v) +{ + struct navigation *nav=NULL; + struct map *map=NULL; + struct map_rect *mr=NULL; + struct item *item=NULL; + struct attr attr; + double route_len=0; + time_t eta; + struct tm *eta_tm=NULL; + char buffer[128]; + double lng, lat, direction=0, height=0, speed=0, hdop=0; + int sats=0, qual=0; + int status=0; + char *dirs[]={_("N"),_("NE"),_("E"),_("SE"),_("S"),_("SW"),_("W"),_("NW"),_("N")}; + char *dir; + int dir_idx; + + if (navit) + nav=navit_get_navigation(navit); + if (nav) + map=navigation_get_map(nav); + if (map) + mr=map_rect_new(map, NULL); + if (mr) + item=map_rect_get_item(mr); + if (item) { + if (item_attr_get(item, attr_destination_length, &attr)) + route_len=attr.u.num; + if (item_attr_get(item, attr_destination_time, &attr)) { + eta=time(NULL)+attr.u.num/10; + eta_tm=localtime(&eta); + } + } + if (mr) + map_rect_destroy(mr); + sprintf(buffer,_("Route %4.0fkm %02d:%02d ETA" ),route_len/1000, eta_tm ? eta_tm->tm_hour : 0 , eta_tm ? eta_tm->tm_min : 0); + if (strcmp(buffer, this->route_text)) { + strcpy(this->route_text, buffer); + gtk_label_set_text(GTK_LABEL(this->route), this->route_text); + } + if (!vehicle_get_attr(v, attr_position_coord_geo, &attr, NULL)) + return; + lng=attr.u.coord_geo->lng; + lat=attr.u.coord_geo->lat; + if (vehicle_get_attr(v, attr_position_fix_type, &attr, NULL)) + status=attr.u.num; + if (vehicle_get_attr(v, attr_position_direction, &attr, NULL)) + direction=*(attr.u.numd); + direction=fmod(direction,360); + if (direction < 0) + direction+=360; + dir_idx=(direction+22.5)/45; + dir=dirs[dir_idx]; + if (vehicle_get_attr(v, attr_position_height, &attr, NULL)) + height=*(attr.u.numd); + if (vehicle_get_attr(v, attr_position_hdop, &attr, NULL)) + hdop=*(attr.u.numd); + if (vehicle_get_attr(v, attr_position_speed, &attr, NULL)) + speed=*(attr.u.numd); + if (vehicle_get_attr(v, attr_position_sats_used, &attr, NULL)) + sats=attr.u.num; + if (vehicle_get_attr(v, attr_position_qual, &attr, NULL)) + qual=attr.u.num; + coord_format(lat,lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); + sprintf(this->gps_text,"GPS:%s %02d/%02d HD:%02.2f %s %4.0fm %3.0f°%-2s %3.0fkm/h", + status_fix2str(status), + sats, qual, hdop, buffer, height, + direction, dir, speed); + gtk_label_set_text(GTK_LABEL(this->gps), this->gps_text); +} + +struct statusbar_priv * +gui_gtk_statusbar_new(struct gui_priv *gui) +{ + struct statusbar_priv *this=g_new0(struct statusbar_priv, 1); + + this->gui=gui; + this->hbox=gtk_hbox_new(FALSE, 1); + this->gps=gtk_label_new( "GPS 00/0 0000.0000N 00000.0000E 0000m 000°NO 000km/h" ); + gtk_label_set_justify(GTK_LABEL(this->gps), GTK_JUSTIFY_LEFT); + this->route=gtk_label_new( _( "Route 0000km 0+00:00 ETA" ) ); + gtk_label_set_justify(GTK_LABEL(this->route), GTK_JUSTIFY_LEFT); + gtk_box_pack_start(GTK_BOX(this->hbox), this->gps, TRUE, TRUE, 2); + gtk_box_pack_start(GTK_BOX(this->hbox), gtk_vseparator_new(), TRUE, TRUE, 2); + gtk_box_pack_start(GTK_BOX(this->hbox), this->route, TRUE, TRUE, 2); + GTK_WIDGET_UNSET_FLAGS (this->hbox, GTK_CAN_FOCUS); + + gtk_box_pack_end(GTK_BOX(gui->vbox), this->hbox, FALSE, FALSE, 0); + gtk_widget_show_all(this->hbox); + /* add a callback for position updates */ + this->vehicle_cb=callback_new_attr_1(callback_cast(statusbar_route_update), attr_position_coord_geo, this); + navit_add_callback(gui->nav, this->vehicle_cb); + return this; +} + diff --git a/navit/gui/gtk/gui_gtk_window.c b/navit/gui/gtk/gui_gtk_window.c new file mode 100644 index 0000000..b725cf9 --- /dev/null +++ b/navit/gui/gtk/gui_gtk_window.c @@ -0,0 +1,811 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#if !defined(GDK_Book) || !defined(GDK_Calendar) +#include +#endif +#include +#include "config.h" +#include "item.h" +#include "navit.h" +#include "debug.h" +#include "gui.h" +#include "coord.h" +#include "point.h" +#include "plugin.h" +#include "graphics.h" +#include "gui_gtk.h" +#include "transform.h" +#include "config.h" +#include "callback.h" +#include "layout.h" +#include "vehicle.h" +#include "map.h" +#include "coord.h" +#include "event.h" +#include "bookmarks.h" +#include "route.h" +#include "navit_nls.h" + +#ifdef USE_HILDON +#include "hildon/hildon-defines.h" +#define KEY_ZOOM_IN HILDON_HARDKEY_INCREASE +#define KEY_ZOOM_OUT HILDON_HARDKEY_DECREASE +#define KEY_UP HILDON_HARDKEY_UP +#define KEY_DOWN HILDON_HARDKEY_DOWN +#define KEY_LEFT HILDON_HARDKEY_LEFT +#define KEY_RIGHT HILDON_HARDKEY_RIGHT +#else +#ifndef GDK_Book +#define GDK_Book XF86XK_Book +#endif +#ifndef GDK_Calendar +#define GDK_Calendar XF86XK_Calendar +#endif +#define KEY_ZOOM_IN GDK_Book +#define KEY_ZOOM_OUT GDK_Calendar +#define KEY_UP GDK_Up +#define KEY_DOWN GDK_Down +#define KEY_LEFT GDK_Left +#define KEY_RIGHT GDK_Right +#endif + +static gboolean +keypress(GtkWidget *widget, GdkEventKey *event, struct gui_priv *this) +{ + int w,h; + struct transformation *t; + #ifdef USE_HILDON + GtkToggleAction *action; + gboolean *fullscreen; + #endif /*HILDON*/ + struct point p; + if (event->type != GDK_KEY_PRESS) + return FALSE; + dbg(1,"keypress 0x%x\n", event->keyval); + transform_get_size(navit_get_trans(this->nav), &w, &h); + switch (event->keyval) { + case GDK_KP_Enter: + gtk_menu_shell_select_first(GTK_MENU_SHELL(this->menubar), TRUE); + break; + case KEY_UP: + p.x=w/2; + p.y=0; + navit_set_center_screen(this->nav, &p, 1); + break; + case KEY_DOWN: + p.x=w/2; + p.y=h; + navit_set_center_screen(this->nav, &p, 1); + break; + case KEY_LEFT: + p.x=0; + p.y=h/2; + navit_set_center_screen(this->nav, &p, 1); + break; + case KEY_RIGHT: + p.x=w; + p.y=h/2; + navit_set_center_screen(this->nav, &p, 1); + break; + case KEY_ZOOM_IN: + navit_zoom_in(this->nav, 2, NULL); + break; + case KEY_ZOOM_OUT: + navit_zoom_out(this->nav, 2, NULL); + break; + case 'a': + t=navit_get_trans(this->nav); + transform_set_yaw(t, (transform_get_yaw(t)+15)%360); + navit_draw(this->nav); + break; + case 'd': + t=navit_get_trans(this->nav); + transform_set_yaw(t, (transform_get_yaw(t)-15)%360); + navit_draw(this->nav); + break; + case 'w': + t=navit_get_trans(this->nav); + transform_set_pitch(t, (transform_get_pitch(t)+5)%360); + navit_draw(this->nav); + break; + case 'x': + t=navit_get_trans(this->nav); + transform_set_pitch(t, (transform_get_pitch(t)-5)%360); + navit_draw(this->nav); + break; + case 'r': + t=navit_get_trans(this->nav); + transform_set_distance(t, (transform_get_distance(t)-5)); + navit_draw(this->nav); + break; + case 'f': + t=navit_get_trans(this->nav); + transform_set_distance(t, (transform_get_distance(t)+5)); + navit_draw(this->nav); + break; + case 'z': + t=navit_get_trans(this->nav); + transform_set_hog(t, (transform_get_hog(t)+1)); + navit_draw(this->nav); + break; + case 'h': + t=navit_get_trans(this->nav); + transform_set_hog(t, (transform_get_hog(t)-1)); + navit_draw(this->nav); + break; + case 't': + { + struct coord *p; + struct pcoord pc; + t=navit_get_trans(this->nav); + p=transform_center(t); + pc.pro=projection_mg; + p->y+=50*cos(transform_get_yaw(t)*M_PI/180); + p->x+=50*sin(transform_get_yaw(t)*M_PI/180); + pc.x=p->x; + pc.y=p->y; + navit_set_center(this->nav, &pc, 1); + } + break; + case 'g': + { + struct coord *p; + struct pcoord pc; + t=navit_get_trans(this->nav); + p=transform_center(t); + pc.pro=projection_mg; + p->y-=50*cos(transform_get_yaw(t)*M_PI/180); + p->x-=50*sin(transform_get_yaw(t)*M_PI/180); + pc.x=p->x; + pc.y=p->y; + navit_set_center(this->nav, &pc, 1); + } + break; + #ifdef USE_HILDON + case HILDON_HARDKEY_FULLSCREEN: + action = GTK_TOGGLE_ACTION (gtk_action_group_get_action (this->base_group, "FullscreenAction")); + + if ( gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(action))) + { + fullscreen = 0; + } else { + fullscreen = 1; + } + gtk_toggle_action_set_active (action, fullscreen); + break; + #endif /*HILDON*/ + default: + return FALSE; + } + return TRUE; +} + +static int +gui_gtk_set_graphics(struct gui_priv *this, struct graphics *gra) +{ + GtkWidget *graphics; + + graphics=graphics_get_data(gra, "gtk_widget"); + if (! graphics) + return 1; + GTK_WIDGET_SET_FLAGS (graphics, GTK_CAN_FOCUS); + gtk_widget_set_sensitive(graphics, TRUE); + g_signal_connect(G_OBJECT(graphics), "key-press-event", G_CALLBACK(keypress), this); + gtk_box_pack_end(GTK_BOX(this->vbox), graphics, TRUE, TRUE, 0); + gtk_widget_show_all(graphics); + gtk_widget_grab_focus(graphics); + + return 0; +} + +static void +gui_gtk_route_callback(struct gui_priv *gui) { + struct attr route_attr; + GtkAction *roadbookAction=gtk_ui_manager_get_action (gui->ui_manager,"/ui/ToolBar/ToolItems/Roadbook"); + if (roadbookAction) { + if (navit_get_attr(gui->nav,attr_route,&route_attr,NULL)) { + struct attr route_status_attr; + if (route_get_attr(route_attr.u.route, attr_route_status,&route_status_attr,NULL) ) { + if (route_status_attr.u.num>2) { + gtk_action_set_sensitive(roadbookAction,1); + } else { + gtk_action_set_sensitive(roadbookAction,0); + } + } + } + } +} + +static void +gui_gtk_add_bookmark_do(struct gui_priv *gui) +{ + struct attr attr; + navit_get_attr(gui->nav, attr_bookmarks, &attr, NULL); + bookmarks_add_bookmark(attr.u.bookmarks, &gui->dialog_coord, gtk_entry_get_text(GTK_ENTRY(gui->dialog_entry))); + gtk_widget_destroy(gui->dialog_win); +} + +static int +gui_gtk_add_bookmark(struct gui_priv *gui, struct pcoord *c, char *description) +{ + GtkWidget *button_ok,*button_cancel,*label,*vbox,*hbox; + + gui->dialog_coord=*c; + gui->dialog_win=gtk_window_new(GTK_WINDOW_TOPLEVEL); + vbox=gtk_vbox_new(FALSE, 0); + gtk_container_add (GTK_CONTAINER (gui->dialog_win), vbox); + gtk_window_set_title(GTK_WINDOW(gui->dialog_win),_("Add Bookmark")); + gtk_window_set_wmclass (GTK_WINDOW (gui->dialog_win), "navit", "Navit"); + gtk_window_set_transient_for(GTK_WINDOW(gui->dialog_win), GTK_WINDOW(gui->win)); + gtk_window_set_modal(GTK_WINDOW(gui->dialog_win), TRUE); + label=gtk_label_new(_("Name")); + gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); + gui->dialog_entry=gtk_entry_new(); + gtk_entry_set_text(GTK_ENTRY(gui->dialog_entry), description); + gtk_box_pack_start(GTK_BOX(vbox), gui->dialog_entry, TRUE, TRUE, 0); + hbox=gtk_hbox_new(FALSE, 0); + button_ok = gtk_button_new_from_stock (GTK_STOCK_OK); + gtk_box_pack_start(GTK_BOX(hbox), button_ok, TRUE, TRUE, 10); + button_cancel = gtk_button_new_from_stock (GTK_STOCK_CANCEL); + gtk_box_pack_start(GTK_BOX(hbox), button_cancel, TRUE, TRUE, 10); + gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 10); + gtk_widget_show_all(gui->dialog_win); + GTK_WIDGET_SET_FLAGS (button_ok, GTK_CAN_DEFAULT); + gtk_widget_grab_default(button_ok); + g_signal_connect_swapped (G_OBJECT (button_cancel), "clicked", G_CALLBACK (gtk_widget_destroy), G_OBJECT (gui->dialog_win)); + g_signal_connect_swapped (G_OBJECT (gui->dialog_entry), "activate", G_CALLBACK (gui_gtk_add_bookmark_do), gui); + + g_signal_connect_swapped(G_OBJECT (button_ok), "clicked", G_CALLBACK (gui_gtk_add_bookmark_do), gui); + + return 1; +} + +struct gui_methods gui_gtk_methods = { + NULL, + gui_gtk_popup_new, + gui_gtk_set_graphics, + NULL, + gui_gtk_datawindow_new, + gui_gtk_add_bookmark, +}; + +static gboolean +gui_gtk_delete(GtkWidget *widget, GdkEvent *event, struct navit *nav) +{ + /* FIXME remove attr_navit callback */ + navit_destroy(nav); + exit(0); + + return TRUE; +} + +static void +gui_gtk_toggle_init(struct gui_priv *this) +{ + struct attr attr; + GtkToggleAction *toggle_action; + + if (navit_get_attr(this->nav, attr_cursor, &attr, NULL)) { + toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "CursorAction")); + gtk_toggle_action_set_active(toggle_action, attr.u.num); + } else { + dbg(1, "Unable to locate CursorAction\n"); + } + if (navit_get_attr(this->nav, attr_orientation, &attr, NULL)) { + toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "OrientationAction")); + gtk_toggle_action_set_active(toggle_action, attr.u.num != -1); + } else { + dbg(0, "Unable to locate OrientationAction\n"); + } + if (navit_get_attr(this->nav, attr_tracking, &attr, NULL)) { + toggle_action = GTK_TOGGLE_ACTION(gtk_action_group_get_action(this->base_group, "TrackingAction")); + gtk_toggle_action_set_active(toggle_action, attr.u.num); + } else { + dbg(0, "Unable to locate TrackingAction\n"); + } +} + +struct action_cb_data { + struct gui_priv *gui; + struct attr attr; +}; + +static void +gui_gtk_action_activate(GtkAction *action, struct action_cb_data *data) +{ + if(data->attr.type == attr_destination) { + char * label; + g_object_get(G_OBJECT(action), "label", &label,NULL); + navit_set_destination(data->gui->nav, data->attr.u.pcoord, label, 1); + g_free(label); + } +} + +struct gui_menu_info { + guint merge_id; + GtkAction *action; +}; + +static void +gui_gtk_del_menu(struct gui_priv *this, struct gui_menu_info *meninfo) +{ + gtk_action_group_remove_action(this->dyn_group, meninfo->action); + gtk_ui_manager_remove_ui(this->ui_manager, meninfo->merge_id); +} + +static struct gui_menu_info +gui_gtk_add_menu(struct gui_priv *this, char *name, char *label, char *path, int submenu, struct action_cb_data *data) +{ + struct gui_menu_info meninfo; + GtkAction *action; + guint merge_id; + + action=gtk_action_new(name, label, NULL, NULL); + meninfo.action = action; + if (data) + g_signal_connect(action, "activate", G_CALLBACK(gui_gtk_action_activate), data); + gtk_action_group_add_action(this->dyn_group, action); + merge_id =gtk_ui_manager_new_merge_id(this->ui_manager); + meninfo.merge_id = merge_id; + gtk_ui_manager_add_ui(this->ui_manager, merge_id, path, name, name, submenu ? GTK_UI_MANAGER_MENU : GTK_UI_MANAGER_MENUITEM, FALSE); + + return meninfo; +} + +static void +gui_gtk_action_toggled(GtkToggleAction *action, struct action_cb_data *data) +{ + struct attr active; + active.type=attr_active; + active.u.num=gtk_toggle_action_get_active(action); + map_set_attr(data->attr.u.map, &active); + navit_draw(data->gui->nav); +} + +static void +gui_gtk_add_toggle_menu(struct gui_priv *this, char *name, char *label, char *path, struct action_cb_data *data, gboolean active) +{ + GtkToggleAction *toggle_action; + guint merge_id; + + toggle_action=gtk_toggle_action_new(name, label, NULL, NULL); + gtk_toggle_action_set_active(toggle_action, active); + g_signal_connect(GTK_ACTION(toggle_action), "toggled", G_CALLBACK(gui_gtk_action_toggled), data); + gtk_action_group_add_action(this->dyn_group, GTK_ACTION(toggle_action)); + merge_id=gtk_ui_manager_new_merge_id(this->ui_manager); + gtk_ui_manager_add_ui(this->ui_manager, merge_id, path, name, name, GTK_UI_MANAGER_MENUITEM, FALSE); +} + +static void +gui_gtk_action_changed(GtkRadioAction *action, GtkRadioAction *current, struct action_cb_data *data) +{ + if (action == current) { + navit_set_attr(data->gui->nav, &data->attr); + } +} + +static struct gui_menu_info +gui_gtk_add_radio_menu(struct gui_priv *this, char *name, char *label, char *path, struct action_cb_data *data, GSList **g) +{ + struct gui_menu_info meninfo; + GtkRadioAction *radio_action; + guint merge_id; + + radio_action=gtk_radio_action_new(name, label, NULL, NULL, 0); + meninfo.action = (GtkAction *)radio_action; + gtk_radio_action_set_group(radio_action, *g); + *g=gtk_radio_action_get_group(radio_action); + g_signal_connect(GTK_ACTION(radio_action), "changed", G_CALLBACK(gui_gtk_action_changed), data); + gtk_action_group_add_action(this->dyn_group, GTK_ACTION(radio_action)); + merge_id=gtk_ui_manager_new_merge_id(this->ui_manager); + meninfo.merge_id = merge_id; + gtk_ui_manager_add_ui(this->ui_manager, merge_id, path, name, name, GTK_UI_MANAGER_MENUITEM, FALSE); + + return meninfo; +} + +static void +gui_gtk_layouts_init(struct gui_priv *this) +{ + struct attr_iter *iter; + struct attr attr; + struct action_cb_data *data; + int count=0; + char *name; + + iter=navit_attr_iter_new(); + while(navit_get_attr(this->nav, attr_layout, &attr, iter)) { + name=g_strdup_printf("Layout %d", count++); + data=g_new(struct action_cb_data, 1); + data->gui=this; + data->attr.type=attr_layout; + data->attr.u.layout=attr.u.layout; + gui_gtk_add_radio_menu(this, name, attr.u.layout->name, "/ui/MenuBar/Map/Layout/LayoutMenuAdditions", data, &this->layout_group); + g_free(name); + } + navit_attr_iter_destroy(iter); +} + +static void +gui_gtk_projections_init(struct gui_priv *this) +{ + struct action_cb_data *data; + + data=g_new(struct action_cb_data, 1); + data->gui=this; + data->attr.type=attr_projection; + data->attr.u.projection=projection_mg; + gui_gtk_add_radio_menu(this, "Projection mg", "Map & Guide", "/ui/MenuBar/Map/Projection/ProjectionMenuAdditions", data, &this->projection_group); + + data=g_new(struct action_cb_data, 1); + data->gui=this; + data->attr.type=attr_projection; + data->attr.u.projection=projection_garmin; + gui_gtk_add_radio_menu(this, "Projection garmin", "Garmin", "/ui/MenuBar/Map/Projection/ProjectionMenuAdditions", data, &this->projection_group); +} + +static void +gui_gtk_vehicles_update(struct gui_priv *this) +{ + struct attr_iter *iter; + struct attr attr,vattr; + struct action_cb_data *data; + int count=0; + char *name; + GList *curr; + struct gui_menu_info *meninfo; + dbg(1,"enter\n"); + + curr = g_list_first(this->vehicle_menuitems); + + while (curr) { + gui_gtk_del_menu(this, (struct gui_menu_info *)curr->data); + g_free((struct gui_menu_info *)curr->data); + curr = g_list_next(curr); + }; + + g_list_free(this->vehicle_menuitems); + this->vehicle_menuitems = NULL; + + iter=navit_attr_iter_new(); + while(navit_get_attr(this->nav, attr_vehicle, &attr, iter)) { + vehicle_get_attr(attr.u.vehicle, attr_name, &vattr, NULL); + name=g_strdup_printf("Vehicle %d", count++); + data=g_new(struct action_cb_data, 1); + data->gui=this; + data->attr.type=attr_vehicle; + data->attr.u.vehicle=attr.u.vehicle; + meninfo = g_new(struct gui_menu_info, 1); + *meninfo = gui_gtk_add_radio_menu(this, name, vattr.u.str, "/ui/MenuBar/Map/Vehicle/VehicleMenuAdditions", data, &this->vehicle_group); + this->vehicle_menuitems = g_list_prepend(this->vehicle_menuitems, meninfo); + g_free(name); + } + navit_attr_iter_destroy(iter); +} + +static void +gui_gtk_vehicles_init(struct gui_priv *this) +{ + navit_add_callback(this->nav, callback_new_attr_1(callback_cast(gui_gtk_vehicles_update), attr_vehicle, this)); + gui_gtk_vehicles_update(this); +} + +static void +gui_gtk_maps_init(struct gui_priv *this) +{ + struct attr_iter *iter; + struct attr attr,active,type,data; + struct action_cb_data *cb_data; + int count=0; + char *name, *label; + + iter=navit_attr_iter_new(); + while(navit_get_attr(this->nav, attr_map, &attr, iter)) { + name=g_strdup_printf("Map %d", count++); + if (! map_get_attr(attr.u.map, attr_type, &type, NULL)) + type.u.str=""; + if (! map_get_attr(attr.u.map, attr_data, &data, NULL)) + data.u.str=""; + label=g_strdup_printf("%s:%s", type.u.str, data.u.str); + cb_data=g_new(struct action_cb_data, 1); + cb_data->gui=this; + cb_data->attr.type=attr_map; + cb_data->attr.u.map=attr.u.map; + if (! map_get_attr(attr.u.map, attr_active, &active, NULL)) + active.u.num=1; + gui_gtk_add_toggle_menu(this, name, label, "/ui/MenuBar/Map/MapMenuAdditions", cb_data, active.u.num); + g_free(name); + g_free(label); + } + navit_attr_iter_destroy(iter); + +} + +static void +gui_gtk_destinations_update(struct gui_priv *this) +{ + GList *curr; + struct attr attr; + struct action_cb_data *data; + struct map_rect *mr=NULL; + struct item *item; + struct gui_menu_info *meninfo; + struct coord c; + int count=0; + char *name, *label; + + curr = g_list_first(this->dest_menuitems); + + while (curr) { + gui_gtk_del_menu(this, (struct gui_menu_info *)curr->data); + g_free((struct gui_menu_info *)curr->data); + curr = g_list_next(curr); + }; + + g_list_free(this->dest_menuitems); + this->dest_menuitems = NULL; + + if(navit_get_attr(this->nav, attr_former_destination_map, &attr, NULL) && attr.u.map && (mr=map_rect_new(attr.u.map, NULL))) { + while ((item=map_rect_get_item(mr))) { + if (item->type != type_former_destination) continue; + name=g_strdup_printf("Destination %d", count++); + item_attr_get(item, attr_label, &attr); + label=attr.u.str; + item_coord_get(item, &c, 1); + data=g_new(struct action_cb_data, 1); + data->gui=this; + data->attr.type=attr_destination; + data->attr.u.pcoord=g_new(struct pcoord, 1); + data->attr.u.pcoord->pro=projection_mg; + data->attr.u.pcoord->x=c.x; + data->attr.u.pcoord->y=c.y; + + meninfo = g_new(struct gui_menu_info, 1); + *meninfo = gui_gtk_add_menu(this, name, label, "/ui/MenuBar/Route/FormerDestinations/FormerDestinationMenuAdditions",0,data); + this->dest_menuitems = g_list_prepend(this->dest_menuitems, meninfo); + g_free(name); + } + map_rect_destroy(mr); + } +} + +static void +gui_gtk_destinations_init(struct gui_priv *this) +{ + navit_add_callback(this->nav, callback_new_attr_1(callback_cast(gui_gtk_destinations_update), attr_destination, this)); + gui_gtk_destinations_update(this); +} + +static void +gui_gtk_bookmarks_update(struct gui_priv *this) +{ + GList *curr; + struct attr attr; + struct action_cb_data *data; + struct map_rect *mr=NULL; + struct gui_menu_info *meninfo; + struct item *item; + struct coord c; + int count=0; + char *parent, *name, *label, *label_full, *menu_label, *tmp_parent, *s; + GHashTable *hash; + + curr = g_list_first(this->bookmarks_menuitems); + + while (curr) { + gui_gtk_del_menu(this, (struct gui_menu_info *)curr->data); + g_free((struct gui_menu_info *)curr->data); + curr = g_list_next(curr); + }; + + g_list_free(this->bookmarks_menuitems); + this->bookmarks_menuitems = NULL; + + if(navit_get_attr(this->nav, attr_bookmark_map, &attr, NULL) && attr.u.map && (mr=map_rect_new(attr.u.map, NULL))) { + hash=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + while ((item=map_rect_get_item(mr))) { + if (item->type != type_bookmark) continue; + item_attr_get(item, attr_label, &attr); + label_full=attr.u.str; + item_coord_get(item, &c, 1); + menu_label=g_malloc(strlen(label_full)+1); + label=label_full; + parent=g_strdup("/ui/MenuBar/Route/Bookmarks/BookmarkMenuAdditions"); + while ((s=strchr(label, '/'))) { + strcpy(menu_label, label_full); + menu_label[s-label_full]='\0'; + if ((tmp_parent=g_hash_table_lookup(hash, menu_label))) { + tmp_parent=g_strdup(tmp_parent); + } else { + name=g_strdup_printf("Bookmark %d", count++); + meninfo = g_new(struct gui_menu_info, 1); + *meninfo = gui_gtk_add_menu(this, name, menu_label+(label-label_full),parent,1,NULL); + this->bookmarks_menuitems = g_list_prepend(this->bookmarks_menuitems, meninfo); + tmp_parent=g_strdup_printf("%s/%s", parent, name); + g_hash_table_insert(hash, g_strdup(menu_label), g_strdup(tmp_parent)); + g_free(name); + } + g_free(parent); + parent=tmp_parent; + label=s+1; + } + g_free(menu_label); + data=g_new(struct action_cb_data, 1); + data->gui=this; + data->attr.type=attr_destination; + data->attr.u.pcoord=g_new(struct pcoord, 1); + data->attr.u.pcoord->pro=projection_mg; + data->attr.u.pcoord->x=c.x; + data->attr.u.pcoord->y=c.y; + name=g_strdup_printf("Bookmark %d", count++); + meninfo = g_new(struct gui_menu_info, 1); + *meninfo = gui_gtk_add_menu(this, name, label, parent,0,data); + this->bookmarks_menuitems = g_list_prepend(this->bookmarks_menuitems, meninfo); + g_free(name); + g_free(parent); + } + g_hash_table_destroy(hash); + } +} + +static void +gui_gtk_bookmarks_init(struct gui_priv *this) +{ + struct attr attr; + navit_get_attr(this->nav, attr_bookmarks, &attr, NULL); + bookmarks_add_callback(attr.u.bookmarks, callback_new_attr_1(callback_cast(gui_gtk_bookmarks_update), attr_bookmark_map, this)); + gui_gtk_bookmarks_update(this); +} + +static void +gui_gtk_init(struct gui_priv *this, struct navit *nav) +{ + + struct attr route_attr; + + gui_gtk_toggle_init(this); + gui_gtk_layouts_init(this); + gui_gtk_projections_init(this); + gui_gtk_vehicles_init(this); + gui_gtk_maps_init(this); + gui_gtk_destinations_init(this); + gui_gtk_bookmarks_init(this); + + if (navit_get_attr(nav,attr_route,&route_attr,NULL)) { + struct attr callback; + callback.type=attr_callback; + callback.u.callback=callback_new_attr_1(callback_cast(gui_gtk_route_callback), attr_route_status, this); + route_add_attr(route_attr.u.route, &callback); + } + gui_gtk_route_callback(this); //Set initial state +} + +static struct gui_priv * +gui_gtk_new(struct navit *nav, struct gui_methods *meth, struct attr **attrs, struct gui *gui) +{ + struct gui_priv *this; + int w=792, h=547; + char *cp = getenv("NAVIT_XID"); + unsigned xid = 0; + struct attr *attr; + GtkWidget *widget; + int fullscreen = 0; + + if (! event_request_system("glib","gui_gtk_new")) + return NULL; + + if (cp) { + xid = strtol(cp, NULL, 0); + } + + this=g_new0(struct gui_priv, 1); + this->nav=nav; + + attr = attr_search(attrs, NULL, attr_menubar); + if (attr) { + this->menubar_enable=attr->u.num; + } else { + this->menubar_enable=1; + } + attr=attr_search(attrs, NULL, attr_toolbar); + if (attr) { + this->toolbar_enable=attr->u.num; + } else { + this->toolbar_enable=1; + } + attr=attr_search(attrs, NULL, attr_statusbar); + if (attr) { + this->statusbar_enable=attr->u.num; + } else { + this->statusbar_enable=1; + } + + *meth=gui_gtk_methods; + + if (!xid) + this->win = gtk_window_new(GTK_WINDOW_TOPLEVEL); + else + this->win = gtk_plug_new(xid); + + + g_signal_connect(G_OBJECT(this->win), "delete-event", G_CALLBACK(gui_gtk_delete), nav); + this->vbox = gtk_vbox_new(FALSE, 0); + gtk_window_set_default_size(GTK_WINDOW(this->win), w, h); + gtk_window_set_title(GTK_WINDOW(this->win), "Navit"); + gtk_window_set_wmclass (GTK_WINDOW (this->win), "navit", "Navit"); + gtk_widget_realize(this->win); + gui_gtk_ui_init(this); + if (this->menubar_enable) { + widget=gtk_ui_manager_get_widget(this->ui_manager, "/ui/MenuBar"); + GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS); + gtk_box_pack_start (GTK_BOX(this->vbox), widget, FALSE, FALSE, 0); + gtk_widget_show (widget); + this->menubar=widget; + } + if (this->toolbar_enable) { + widget=gtk_ui_manager_get_widget(this->ui_manager, "/ui/ToolBar"); + GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS); + gtk_box_pack_start (GTK_BOX(this->vbox), widget, FALSE, FALSE, 0); + gtk_widget_show (widget); + } + if (this->statusbar_enable) { + this->statusbar=gui_gtk_statusbar_new(this); + } + gtk_window_add_accel_group (GTK_WINDOW (this->win), + gtk_ui_manager_get_accel_group(this->ui_manager)); + gtk_container_add(GTK_CONTAINER(this->win), this->vbox); + gtk_widget_show_all(this->win); + + + navit_add_callback(nav, callback_new_attr_1(callback_cast(gui_gtk_init), attr_navit, this)); + + if ((attr=attr_search(attrs, NULL, attr_fullscreen))) + fullscreen=attr->u.num; + + if (fullscreen) { + GtkToggleAction *action; + action = GTK_TOGGLE_ACTION (gtk_action_group_get_action (this->base_group, "FullscreenAction")); + gtk_toggle_action_set_active (action, fullscreen); + } + + return this; +} + +static int gtk_argc; +static char **gtk_argv={NULL}; + +void +plugin_init(void) +{ + gtk_init(>k_argc, >k_argv); + gtk_set_locale(); +#ifdef HAVE_API_WIN32 + setlocale(LC_NUMERIC,"C"); +#endif + + + plugin_register_gui_type("gtk", gui_gtk_new); +} diff --git a/navit/gui/internal/Makefile.am b/navit/gui/internal/Makefile.am new file mode 100644 index 0000000..a12b0d5 --- /dev/null +++ b/navit/gui/internal/Makefile.am @@ -0,0 +1,10 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/navit -I$(top_srcdir)/navit/fib-1.1 @NAVIT_CFLAGS@ -DMODULE=gui_internal +if PLUGINS +modulegui_LTLIBRARIES = libgui_internal.la +else +noinst_LTLIBRARIES = libgui_internal.la +endif +libgui_internal_la_SOURCES = gui_internal.c gui_internal.h +libgui_internal_la_LIBADD = +libgui_internal_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ diff --git a/navit/gui/internal/Makefile.in b/navit/gui/internal/Makefile.in new file mode 100644 index 0000000..b29500c --- /dev/null +++ b/navit/gui/internal/Makefile.in @@ -0,0 +1,704 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/gui/internal +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(moduleguidir)" +LTLIBRARIES = $(modulegui_LTLIBRARIES) $(noinst_LTLIBRARIES) +libgui_internal_la_DEPENDENCIES = +am_libgui_internal_la_OBJECTS = gui_internal.lo +libgui_internal_la_OBJECTS = $(am_libgui_internal_la_OBJECTS) +libgui_internal_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libgui_internal_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libgui_internal_la_rpath = +@PLUGINS_TRUE@am_libgui_internal_la_rpath = -rpath $(moduleguidir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libgui_internal_la_SOURCES) +DIST_SOURCES = $(libgui_internal_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/navit -I$(top_srcdir)/navit/fib-1.1 @NAVIT_CFLAGS@ -DMODULE=gui_internal +@PLUGINS_TRUE@modulegui_LTLIBRARIES = libgui_internal.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libgui_internal.la +libgui_internal_la_SOURCES = gui_internal.c gui_internal.h +libgui_internal_la_LIBADD = +libgui_internal_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/gui/internal/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/gui/internal/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-moduleguiLTLIBRARIES: $(modulegui_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(moduleguidir)" || $(MKDIR_P) "$(DESTDIR)$(moduleguidir)" + @list='$(modulegui_LTLIBRARIES)'; test -n "$(moduleguidir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(moduleguidir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(moduleguidir)"; \ + } + +uninstall-moduleguiLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulegui_LTLIBRARIES)'; test -n "$(moduleguidir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(moduleguidir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(moduleguidir)/$$f"; \ + done + +clean-moduleguiLTLIBRARIES: + -test -z "$(modulegui_LTLIBRARIES)" || rm -f $(modulegui_LTLIBRARIES) + @list='$(modulegui_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgui_internal.la: $(libgui_internal_la_OBJECTS) $(libgui_internal_la_DEPENDENCIES) + $(libgui_internal_la_LINK) $(am_libgui_internal_la_rpath) $(libgui_internal_la_OBJECTS) $(libgui_internal_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_internal.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(moduleguidir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-moduleguiLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-moduleguiLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-moduleguiLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-moduleguiLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-moduleguiLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-moduleguiLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/gui/internal/gui_internal.c b/navit/gui/internal/gui_internal.c new file mode 100644 index 0000000..bacddb7 --- /dev/null +++ b/navit/gui/internal/gui_internal.c @@ -0,0 +1,7571 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2010 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +//############################################################################################################## +//# +//# File: gui_internal.c +//# Description: New "internal" GUI for use with any graphics library +//# Comment: Trying to make a touchscreen friendly GUI +//# Authors: Martin Schaller (04/2008), Stefan Klumpp (04/2008) +//# +//############################################################################################################## + + +#include +#include +#include +#include +#include +#include +#include "config.h" +#ifdef HAVE_API_WIN32_BASE +#include +#endif +#include "item.h" +#include "file.h" +#include "navit.h" +#include "navit_nls.h" +#include "gui.h" +#include "coord.h" +#include "point.h" +#include "plugin.h" +#include "graphics.h" +#include "transform.h" +#include "color.h" +#include "map.h" +#include "layout.h" +#include "callback.h" +#include "vehicle.h" +#include "vehicleprofile.h" +#include "window.h" +#include "config_.h" +#include "keys.h" +#include "mapset.h" +#include "route.h" +#include "navit/search.h" +#include "track.h" +#include "country.h" +#include "config.h" +#include "event.h" +#include "navit_nls.h" +#include "navigation.h" +#include "gui_internal.h" +#include "command.h" +#include "xmlconfig.h" +#include "util.h" +#include "bookmarks.h" +#include "debug.h" +#include "fib.h" +#include "types.h" + + +extern char *version; + +struct form { + char *onsubmit; +}; + + +struct menu_data { + struct widget *search_list; + struct widget *keyboard; + struct widget *button_bar; + struct widget *menu; + int keyboard_mode; + void (*redisplay)(struct gui_priv *priv, struct widget *widget, void *data); + struct widget *redisplay_widget; + char *href; + struct attr refresh_callback_obj,refresh_callback; +}; + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +struct widget { + enum widget_type type; + struct graphics_gc *background,*text_background; + struct graphics_gc *foreground_frame; + struct graphics_gc *foreground; + char *text; + struct graphics_image *img; + /** + * A function to be invoked on actions. + * @li widget The widget that is receiving the button press. + * + */ + void (*func)(struct gui_priv *priv, struct widget *widget, void *data); + int reason; + int datai; + void *data; + /** + * @brief A function to deallocate data + */ + void (*data_free)(void *data); + + /** + * @brief a function that will be called as the widget is being destroyed. + * This function can act as a destructor for the widget. It allows for + * on deallocation actions to be specified on a per widget basis. + * This function will call g_free on the widget (if required). + */ + void (*free) (struct gui_priv *this_, struct widget * w); + char *prefix; + char *name; + char *speech; + char *command; + struct pcoord c; + struct item item; + int selection_id; + int state; + struct point p; + int wmin,hmin; + int w,h; + int textw,texth; + int font_idx; + int bl,br,bt,bb,spx,spy; + int border; + int packed; + /** + * The number of widgets to layout horizontally when doing + * a orientation_horizontal_vertical layout + */ + int cols; + enum flags flags; + int flags2; + void *instance; + int (*set_attr)(void *, struct attr *); + int (*get_attr)(void *, enum attr_type, struct attr *, struct attr_iter *); + void (*remove_cb)(void *, struct callback *cb); + struct callback *cb; + struct attr on; + struct attr off; + int deflt; + int is_on; + int redraw; + struct menu_data *menu_data; + struct form *form; + GList *children; +}; + +/** + * @brief A structure to store configuration values. + * + * This structure stores configuration values for how gui elements in the internal GUI + * should be drawn. + */ +struct gui_config_settings { + + /** + * The base size (in fractions of a point) to use for text. + */ + int font_size; + /** + * The size (in pixels) that xs style icons should be scaled to. + * This icon size can be too small to click it on some devices. + */ + int icon_xs; + /** + * The size (in pixels) that s style icons (small) should be scaled to + */ + int icon_s; + /** + * The size (in pixels) that l style icons should be scaled to + */ + int icon_l; + /** + * The default amount of spacing (in pixels) to place between GUI elements. + */ + int spacing; + +}; + +/** + * Indexes into the config_profiles array. + */ +const int LARGE_PROFILE=0; +const int MEDIUM_PROFILE=1; +const int SMALL_PROFILE=2; + +/** + * The default config profiles. + * + * [0] => LARGE_PROFILE (screens 640 in one dimension) + * [1] => MEDIUM PROFILE (screens larger than 320 in one dimension + * [2] => Small profile (default) + */ +static struct gui_config_settings config_profiles[]={ + {545,32,48,96,10} + , {300,32,48,64,3} + ,{200,16,32,48,2} +}; + +struct route_data { + struct widget * route_table; + int route_showing; + +}; + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +struct gui_priv { + struct navit *nav; + struct attr self; + struct window *win; + struct graphics *gra; + struct graphics_gc *background; + struct graphics_gc *background2; + struct graphics_gc *highlight_background; + struct graphics_gc *foreground; + struct graphics_gc *text_foreground; + struct graphics_gc *text_background; + struct color background_color, background2_color, text_foreground_color, text_background_color; + int spacing; + int font_size; + int fullscreen; + struct graphics_font *fonts[3]; + /** + * The size (in pixels) that xs style icons should be scaled to. + * This icon size can be too small to click it on some devices. + */ + int icon_xs; + /** + * The size (in pixels) that s style icons (small) should be scaled to + */ + int icon_s; + /** + * The size (in pixels) that l style icons should be scaled to + */ + int icon_l; + int pressed; + struct widget *widgets; + int widgets_count; + int redraw; + struct widget root; + struct widget *highlighted,*editable; + struct widget *highlighted_menu; + int clickp_valid, vehicle_valid; + struct pcoord clickp, vehiclep; + struct attr *click_coord_geo, *position_coord_geo; + struct search_list *sl; + int ignore_button; + int menu_on_map_click; + int signal_on_map_click; + char *country_iso2; + int speech; + int keyboard; + int keyboard_required; + /** + * The setting information read from the configuration file. + * values of -1 indicate no value was specified in the config file. + */ + struct gui_config_settings config; + struct event_idle *idle; + struct callback *motion_cb,*button_cb,*resize_cb,*keypress_cb,*window_closed_cb,*idle_cb, *motion_timeout_callback; + struct event_timeout *motion_timeout_event; + struct point current; + + struct callback * vehicle_cb; + /** + * Stores information about the route. + */ + struct route_data route_data; + + struct gui_internal_data data; + struct callback_list *cbl; + int flags; + int cols; + struct attr osd_configuration; + int pitch; + int flags_town,flags_street,flags_house_number; + int radius; + int mouse_button_clicked_on_map; +/* html */ + char *html_text; + int html_depth; + struct widget *html_container; + int html_skip; + char *html_anchor; + char *href; + int html_anchor_found; + struct form *form; + struct html { + int skip; + enum html_tag { + html_tag_none, + html_tag_a, + html_tag_h1, + html_tag_html, + html_tag_img, + html_tag_script, + html_tag_form, + html_tag_input, + html_tag_div, + } tag; + char *command; + char *name; + char *href; + char *refresh_cond; + struct widget *w; + struct widget *container; + } html[10]; +}; + +struct html_tag_map { + char *tag_name; + enum html_tag tag; +} html_tag_map[] = { + {"a",html_tag_a}, + {"h1",html_tag_h1}, + {"html",html_tag_html}, + {"img",html_tag_img}, + {"script",html_tag_script}, + {"form",html_tag_form}, + {"input",html_tag_input}, + {"div",html_tag_div}, +}; + + +/** + * @brief A structure to store information about a table. + * + * The table_data widget stores pointers to extra information needed by the + * table widget. + * + * The table_data structure needs to be freed with data_free along with the widget. + * + */ +struct table_data +{ + /** + * A GList pointer into a widget->children list that indicates the row + * currently being rendered at the top of the table. + */ + GList * top_row; + /** + * A Glist pointer into a widget->children list that indicates the row + * currently being rendered at the bottom of the table. + */ + GList * bottom_row; + + /** + * A list of table_row widgets that mark the + * top rows for each page of the table. + * This is needed for the 'previous page' function of the table. + */ + GList * page_headers; + + /** + * A container box that is the child of the table widget that contains+groups + * the next and previous button. + */ + struct widget * button_box; + + /** + * Button box should not be displayed if button_box_hide is not zero. + */ + int button_box_hide; + + /** + * A button widget to handle 'next page' requests + */ + struct widget * next_button; + /** + * A button widget to handle 'previous page' requests. + */ + struct widget * prev_button; + + + /** + * a pointer to the gui context. + * This is needed by the free function to destory the buttons. + */ + struct gui_priv * this; +}; + +/** + * A data structure that holds information about a column that makes up a table. + * + * + */ +struct table_column_desc +{ + + /** + * The computed height of a cell in the table. + */ + int height; + + /** + * The computed width of a cell in the table. + */ + int width; +}; + + +static void gui_internal_widget_render(struct gui_priv *this, struct widget *w); +static void gui_internal_widget_pack(struct gui_priv *this, struct widget *w); +static struct widget * gui_internal_box_new(struct gui_priv *this, enum flags flags); +static void gui_internal_widget_append(struct widget *parent, struct widget *child); +static void gui_internal_widget_prepend(struct widget *parent, struct widget *child); +static void gui_internal_widget_insert_before(struct widget *parent, struct widget *sibling, struct widget *child); +static void gui_internal_widget_insert_sorted(struct widget *parent, struct widget *child, GCompareFunc func); +static void gui_internal_widget_destroy(struct gui_priv *this, struct widget *w); +static void gui_internal_apply_config(struct gui_priv *this); + +static struct widget* gui_internal_widget_table_new(struct gui_priv * this, enum flags flags, int buttons); +static struct widget * gui_internal_widget_table_row_new(struct gui_priv * this, enum flags flags); +static void gui_internal_table_hide_rows(struct table_data * table_data); +static void gui_internal_table_render(struct gui_priv * this, struct widget * w); +static void gui_internal_table_pack(struct gui_priv * this, struct widget * w); +static void gui_internal_table_button_next(struct gui_priv * this, struct widget * wm, void *data); +static void gui_internal_table_button_prev(struct gui_priv * this, struct widget * wm, void *data); +static void gui_internal_widget_table_clear(struct gui_priv * this,struct widget * table); +static int gui_internal_widget_table_is_empty(struct gui_priv *this,struct widget * table); +static struct widget * gui_internal_widget_table_row_new(struct gui_priv * this, enum flags flags); +static void gui_internal_table_data_free(void * d); +static void gui_internal_route_update(struct gui_priv * this, struct navit * navit, + struct vehicle * v); +static void gui_internal_route_screen_free(struct gui_priv * this_,struct widget * w); +static void gui_internal_populate_route_table(struct gui_priv * this, + struct navit * navit); +static void gui_internal_search_idle_end(struct gui_priv *this); +static void gui_internal_search(struct gui_priv *this, char *what, char *type, int flags); +static void gui_internal_search_house_number(struct gui_priv *this, struct widget *widget, void *data); +static void gui_internal_search_house_number_in_street(struct gui_priv *this, struct widget *widget, void *data); +static void gui_internal_search_street(struct gui_priv *this, struct widget *widget, void *data); +static void gui_internal_search_street_in_town(struct gui_priv *this, struct widget *widget, void *data); +static void gui_internal_search_town(struct gui_priv *this, struct widget *wm, void *data); +static void gui_internal_search_town_in_country(struct gui_priv *this, struct widget *wm); +static void gui_internal_search_country(struct gui_priv *this, struct widget *widget, void *data); +static void gui_internal_check_exit(struct gui_priv *this); +static void gui_internal_cmd_view_in_browser(struct gui_priv *this, struct widget *wm, void *data); + +static struct widget *gui_internal_keyboard_do(struct gui_priv *this, struct widget *wkbdb, int mode); +static struct menu_data * gui_internal_menu_data(struct gui_priv *this); + +static int gui_internal_is_active_vehicle(struct gui_priv *this, struct vehicle *vehicle); +static void gui_internal_html_menu(struct gui_priv *this, const char *document, char *anchor); +static void gui_internal_html_load_href(struct gui_priv *this, char *href, int replace); +static void gui_internal_destroy(struct gui_priv *this); + + +/* + * * Display image scaled to specific size + * * searches for scaleable and pre-scaled image + * * @param this Our gui context + * * @param name image name + * * @param w desired width of image + * * @param h desired height of image + * * @returns image_struct Ptr to scaled image struct or NULL if not scaled or found + * */ +static struct graphics_image * +image_new_scaled(struct gui_priv *this, const char *name, int w, int h) +{ + struct graphics_image *ret=NULL; + char *full_name=NULL; + char *full_path=NULL; + int i; + + for (i = 1 ; i < 6 ; i++) { + full_name=NULL; + switch (i) { + case 3: + full_name=g_strdup_printf("%s.svg", name); + break; + case 2: + full_name=g_strdup_printf("%s.svgz", name); + break; + case 1: + if (w != -1 && h != -1) { + full_name=g_strdup_printf("%s_%d_%d.png", name, w, h); + } + break; + case 4: + full_name=g_strdup_printf("%s.png", name); + break; + case 5: + full_name=g_strdup_printf("%s.xpm", name); + break; + } + dbg(1,"trying '%s'\n", full_name); + if (! full_name) + continue; +#if 0 + /* needs to be checked in the driver */ + if (!file_exists(full_name)) { + g_free(full_name); + continue; + } +#endif + full_path=graphics_icon_path(full_name); + ret=graphics_image_new_scaled(this->gra, full_path, w, h); + dbg(1,"ret=%p\n", ret); + g_free(full_path); + g_free(full_name); + if (ret) + return ret; + } + dbg(0,"failed to load %s with %d,%d\n", name, w, h); + return NULL; +} + +#if 0 +static struct graphics_image * +image_new_o(struct gui_priv *this, char *name) +{ + return image_new_scaled(this, name, -1, -1); +} +#endif + +/* + * * Display image scaled to xs (extra small) size + * * This image size can be too small to click it on some devices. + * * @param this Our gui context + * * @param name image name + * * @returns image_struct Ptr to scaled image struct or NULL if not scaled or found + * */ +static struct graphics_image * +image_new_xs(struct gui_priv *this, const char *name) +{ + return image_new_scaled(this, name, this->icon_xs, this->icon_xs); +} + +/* + * * Display image scaled to s (small) size + * * @param this Our gui context + * * @param name image name + * * @returns image_struct Ptr to scaled image struct or NULL if not scaled or found + * */ + +static struct graphics_image * +image_new_s(struct gui_priv *this, const char *name) +{ + return image_new_scaled(this, name, this->icon_s, this->icon_s); +} + +/* + * * Display image scaled to l (large) size + * * @param this Our gui context + * * @param name image name + * * @returns image_struct Ptr to scaled image struct or NULL if not scaled or found + * */ +static struct graphics_image * +image_new_l(struct gui_priv *this, const char *name) +{ + return image_new_scaled(this, name, this->icon_l, this->icon_l); +} + +static char * +coordinates_geo(const struct coord_geo *gc, char sep) +{ + char latc='N',lngc='E'; + int lat_deg,lat_min,lat_sec; + int lng_deg,lng_min,lng_sec; + struct coord_geo g=*gc; + + if (g.lat < 0) { + g.lat=-g.lat; + latc='S'; + } + if (g.lng < 0) { + g.lng=-g.lng; + lngc='W'; + } + lat_deg=g.lat; + lat_min=fmod(g.lat*60,60); + lat_sec=fmod(g.lat*3600,60); + lng_deg=g.lng; + lng_min=fmod(g.lng*60,60); + lng_sec=fmod(g.lng*3600,60); + return g_strdup_printf("%d°%d'%d\" %c%c%d°%d'%d\" %c",lat_deg,lat_min,lat_sec,latc,sep,lng_deg,lng_min,lng_sec,lngc); +} + +static char * +coordinates(struct pcoord *pc, char sep) +{ + struct coord_geo g; + struct coord c; + c.x=pc->x; + c.y=pc->y; + transform_to_geo(pc->pro, &c, &g); + return coordinates_geo(&g, sep); + +} + +static void +gui_internal_background_render(struct gui_priv *this, struct widget *w) +{ + struct point pnt=w->p; + if (w->state & STATE_HIGHLIGHTED) + graphics_draw_rectangle(this->gra, this->highlight_background, &pnt, w->w, w->h); + else { + if (w->background) + graphics_draw_rectangle(this->gra, w->background, &pnt, w->w, w->h); + } +} + +static struct widget * +gui_internal_label_font_new(struct gui_priv *this, char *text, int font) +{ + struct point p[4]; + int w=0; + int h=0; + + struct widget *widget=g_new0(struct widget, 1); + widget->type=widget_label; + widget->font_idx=font; + if (text) { + widget->text=g_strdup(text); + graphics_get_text_bbox(this->gra, this->fonts[font], text, 0x10000, 0x0, p, 0); + w=p[2].x-p[0].x; + h=p[0].y-p[2].y; + } + widget->h=h+this->spacing; + widget->texth=h; + widget->w=w+this->spacing; + widget->textw=w; + widget->flags=gravity_center; + widget->foreground=this->text_foreground; + widget->text_background=this->text_background; + + return widget; +} + +static struct widget * +gui_internal_label_new(struct gui_priv *this, char *text) +{ + return gui_internal_label_font_new(this, text, 0); +} + +static struct widget * +gui_internal_label_new_abbrev(struct gui_priv *this, char *text, int maxwidth) +{ + struct widget *ret=NULL; + char *tmp=g_malloc(strlen(text)+3), *p; + p=text+strlen(text); + while ((p=g_utf8_find_prev_char(text, p)) >= text) { + int i=p-text; + strcpy(tmp, text); + strcpy(tmp+i,".."); + ret=gui_internal_label_new(this, tmp); + if (ret->w < maxwidth) + break; + gui_internal_widget_destroy(this, ret); + ret=NULL; + } + if(!ret) + ret=gui_internal_label_new(this, ""); + g_free(tmp); + return ret; +} + +static struct widget * +gui_internal_image_new(struct gui_priv *this, struct graphics_image *image) +{ + struct widget *widget=g_new0(struct widget, 1); + widget->type=widget_image; + widget->img=image; + if (image) { + widget->w=image->width; + widget->h=image->height; + } + return widget; +} + +static void +gui_internal_image_render(struct gui_priv *this, struct widget *w) +{ + struct point pnt; + + gui_internal_background_render(this, w); + if (w->img) { + pnt=w->p; + pnt.x+=w->w/2-w->img->hot.x; + pnt.y+=w->h/2-w->img->hot.y; + graphics_draw_image(this->gra, this->foreground, &pnt, w->img); + } +} + +static void +gui_internal_label_render(struct gui_priv *this, struct widget *w) +{ + struct point pnt=w->p; + gui_internal_background_render(this, w); + if (w->state & STATE_EDIT) + graphics_draw_rectangle(this->gra, this->highlight_background, &pnt, w->w, w->h); + if (w->text) { + char *text; + char *startext=(char*)g_alloca(strlen(w->text)+1); + text=w->text; + if (w->flags2 & 1) { + int i; + for (i = 0 ; i < strlen(text); i++) + startext[i]='*'; + startext[i]='\0'; + text=startext; + } + if (w->flags & gravity_right) { + pnt.y+=w->h-this->spacing; + pnt.x+=w->w-w->textw-this->spacing; + graphics_draw_text(this->gra, w->foreground, w->text_background, this->fonts[w->font_idx], text, &pnt, 0x10000, 0x0); + } else { + pnt.y+=w->h-this->spacing; + graphics_draw_text(this->gra, w->foreground, w->text_background, this->fonts[w->font_idx], text, &pnt, 0x10000, 0x0); + } + } +} + +/** + * @brief A text box is a widget that renders a text string containing newlines. + * The string will be broken up into label widgets at each newline with a vertical layout. + * + */ +static struct widget * +gui_internal_text_font_new(struct gui_priv *this, char *text, int font, enum flags flags) +{ + char *s=g_strdup(text),*s2,*tok; + struct widget *ret=gui_internal_box_new(this, flags); + s2=s; + while ((tok=strtok(s2,"\n"))) { + gui_internal_widget_append(ret, gui_internal_label_font_new(this, tok, font)); + s2=NULL; + } + gui_internal_widget_pack(this,ret); + g_free(s); + return ret; +} + +static struct widget * +gui_internal_text_new(struct gui_priv *this, char *text, enum flags flags) +{ + return gui_internal_text_font_new(this, text, 0, flags); +} + + +static struct widget * +gui_internal_button_font_new_with_callback(struct gui_priv *this, char *text, int font, struct graphics_image *image, enum flags flags, void(*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data) +{ + struct widget *ret=NULL; + ret=gui_internal_box_new(this, flags); + if (ret) { + if (image) + gui_internal_widget_append(ret, gui_internal_image_new(this, image)); + if (text) + gui_internal_widget_append(ret, gui_internal_text_font_new(this, text, font, gravity_center|orientation_vertical)); + ret->func=func; + ret->data=data; + if (func) { + ret->state |= STATE_SENSITIVE; + ret->speech=g_strdup(text); + } + } + return ret; + +} + +static struct widget * +gui_internal_button_new_with_callback(struct gui_priv *this, char *text, struct graphics_image *image, enum flags flags, void(*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data) +{ + return gui_internal_button_font_new_with_callback(this, text, 0, image, flags, func, data); +} + +static int +gui_internal_button_attr_update(struct gui_priv *this, struct widget *w) +{ + struct widget *wi; + int is_on=0; + struct attr curr; + GList *l; + + if (w->get_attr(w->instance, w->on.type, &curr, NULL)) + is_on=curr.u.data == w->on.u.data; + else + is_on=w->deflt; + if (is_on != w->is_on) { + if (w->redraw) + this->redraw=1; + w->is_on=is_on; + l=g_list_first(w->children); + if (l) { + wi=l->data; + if (wi->img) + graphics_image_free(this->gra, wi->img); + wi->img=image_new_xs(this, is_on ? "gui_active" : "gui_inactive"); + } + if (w->is_on && w->off.type == attr_none) + w->state &= ~STATE_SENSITIVE; + else + w->state |= STATE_SENSITIVE; + return 1; + } + return 0; +} + +static void +gui_internal_button_attr_callback(struct gui_priv *this, struct widget *w) +{ + if (gui_internal_button_attr_update(this, w)) + gui_internal_widget_render(this, w); +} +static void +gui_internal_button_attr_pressed(struct gui_priv *this, struct widget *w, void *data) +{ + if (w->is_on) + w->set_attr(w->instance, &w->off); + else + w->set_attr(w->instance, &w->on); + gui_internal_button_attr_update(this, w); + +} + +static struct widget * +gui_internal_button_navit_attr_new(struct gui_priv *this, char *text, enum flags flags, struct attr *on, struct attr *off) +{ + struct graphics_image *image=NULL; + struct widget *ret; + if (!on && !off) + return NULL; + image=image_new_xs(this, "gui_inactive"); + ret=gui_internal_button_new_with_callback(this, text, image, flags, gui_internal_button_attr_pressed, NULL); + if (on) + ret->on=*on; + if (off) + ret->off=*off; + ret->get_attr=(int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))navit_get_attr; + ret->set_attr=(int (*)(void *, struct attr *))navit_set_attr; + ret->remove_cb=(void (*)(void *, struct callback *))navit_remove_callback; + ret->instance=this->nav; + ret->cb=callback_new_attr_2(callback_cast(gui_internal_button_attr_callback), on?on->type:off->type, this, ret); + navit_add_callback(this->nav, ret->cb); + gui_internal_button_attr_update(this, ret); + return ret; +} + +static struct widget * +gui_internal_button_map_attr_new(struct gui_priv *this, char *text, enum flags flags, struct map *map, struct attr *on, struct attr *off, int deflt) +{ + struct graphics_image *image=NULL; + struct widget *ret; + image=image_new_xs(this, "gui_inactive"); + if (!on && !off) + return NULL; + ret=gui_internal_button_new_with_callback(this, text, image, flags, gui_internal_button_attr_pressed, NULL); + if (on) + ret->on=*on; + if (off) + ret->off=*off; + ret->deflt=deflt; + ret->get_attr=(int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))map_get_attr; + ret->set_attr=(int (*)(void *, struct attr *))map_set_attr; + ret->remove_cb=(void (*)(void *, struct callback *))map_remove_callback; + ret->instance=map; + ret->redraw=1; + ret->cb=callback_new_attr_2(callback_cast(gui_internal_button_attr_callback), on?on->type:off->type, this, ret); + map_add_callback(map, ret->cb); + gui_internal_button_attr_update(this, ret); + return ret; +} + +static struct widget * +gui_internal_button_new(struct gui_priv *this, char *text, struct graphics_image *image, enum flags flags) +{ + return gui_internal_button_new_with_callback(this, text, image, flags, NULL, NULL); +} + +#if 0 +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void gui_internal_clear(struct gui_priv *this) +{ + struct graphics *gra=this->gra; + struct point pnt; + pnt.x=0; + pnt.y=0; + graphics_draw_rectangle(gra, this->background, &pnt, this->root.w, this->root.h); +} +#endif + +static struct widget * +gui_internal_find_widget(struct widget *wi, struct point *p, int flags) +{ + struct widget *ret,*child; + GList *l=wi->children; + + if (p) { + if (wi->p.x > p->x ) + return NULL; + if (wi->p.y > p->y ) + return NULL; + if ( wi->p.x + wi->w < p->x) + return NULL; + if ( wi->p.y + wi->h < p->y) + return NULL; + } + if (wi->state & flags) + return wi; + while (l) { + child=l->data; + ret=gui_internal_find_widget(child, p, flags); + if (ret) { + return ret; + } + l=g_list_next(l); + } + return NULL; + +} + +static void +gui_internal_highlight_do(struct gui_priv *this, struct widget *found) +{ + if (found == this->highlighted) + return; + + graphics_draw_mode(this->gra, draw_mode_begin); + if (this->highlighted) { + this->highlighted->state &= ~STATE_HIGHLIGHTED; + if (this->root.children && this->highlighted_menu == g_list_last(this->root.children)->data) + gui_internal_widget_render(this, this->highlighted); + this->highlighted=NULL; + this->highlighted_menu=NULL; + } + if (found) { + this->highlighted=found; + this->highlighted_menu=g_list_last(this->root.children)->data; + this->highlighted->state |= STATE_HIGHLIGHTED; + gui_internal_widget_render(this, this->highlighted); + dbg(1,"%d,%d %dx%d\n", found->p.x, found->p.y, found->w, found->h); + } + graphics_draw_mode(this->gra, draw_mode_end); +} +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void gui_internal_highlight(struct gui_priv *this) +{ + struct widget *menu,*found=NULL; + if (this->current.x > -1 && this->current.y > -1) { + menu=g_list_last(this->root.children)->data; + found=gui_internal_find_widget(menu, &this->current, STATE_SENSITIVE); + if (!found) { + found=gui_internal_find_widget(menu, &this->current, STATE_EDITABLE); + if (found) { + if (this->editable && this->editable != found) { + this->editable->state &= ~ STATE_EDIT; + gui_internal_widget_render(this, this->editable); + } + found->state |= STATE_EDIT; + gui_internal_widget_render(this, found); + this->editable=found; + found=NULL; + } + } + } + gui_internal_highlight_do(this, found); + this->motion_timeout_event=NULL; +} + +static struct widget * +gui_internal_box_new_with_label(struct gui_priv *this, enum flags flags, const char *label) +{ + struct widget *widget=g_new0(struct widget, 1); + + if (label) + widget->text=g_strdup(label); + widget->type=widget_box; + widget->flags=flags; + return widget; +} + +static struct widget * +gui_internal_box_new(struct gui_priv *this, enum flags flags) +{ + return gui_internal_box_new_with_label(this, flags, NULL); +} + + +static void gui_internal_box_render(struct gui_priv *this, struct widget *w) +{ + struct widget *wc; + GList *l; + + gui_internal_background_render(this, w); +#if 0 + w->border=1; + w->foreground=this->foreground; +#endif +#if 1 + if (w->foreground && w->border) { + struct point pnt[5]; + pnt[0]=w->p; + pnt[1].x=pnt[0].x+w->w; + pnt[1].y=pnt[0].y; + pnt[2].x=pnt[0].x+w->w; + pnt[2].y=pnt[0].y+w->h; + pnt[3].x=pnt[0].x; + pnt[3].y=pnt[0].y+w->h; + pnt[4]=pnt[0]; + graphics_gc_set_linewidth(w->foreground, w->border ? w->border : 1); + graphics_draw_lines(this->gra, w->foreground, pnt, 5); + graphics_gc_set_linewidth(w->foreground, 1); + } +#endif + + l=w->children; + while (l) { + wc=l->data; + gui_internal_widget_render(this, wc); + l=g_list_next(l); + } +} + + +/** + * @brief Compute the size and location for the widget. + * + * + */ +static void gui_internal_box_pack(struct gui_priv *this, struct widget *w) +{ + struct widget *wc; + int x0,x=0,y=0,width=0,height=0,owidth=0,oheight=0,expand=0,expandd=1,count=0,rows=0,cols=w->cols ? w->cols : 0; + GList *l; + int orientation=w->flags & 0xffff0000; + + if (!cols) + cols=this->cols; + if (!cols) { + if ( this->root.w > this->root.h ) + cols=3; + else + cols=2; + width=0; + height=0; + } + + + /** + * count the number of children + */ + l=w->children; + while (l) { + count++; + l=g_list_next(l); + } + if (orientation == orientation_horizontal_vertical && count <= cols) + orientation=orientation_horizontal; + switch (orientation) { + case orientation_horizontal: + /** + * For horizontal orientation: + * pack each child and find the largest height and + * compute the total width. x spacing (spx) is considered + * + * If any children want to be expanded + * we keep track of this + */ + l=w->children; + while (l) { + wc=l->data; + gui_internal_widget_pack(this, wc); + if (height < wc->h) + height=wc->h; + width+=wc->w; + if (wc->flags & flags_expand) + expand+=wc->w ? wc->w : 1; + l=g_list_next(l); + if (l) + width+=w->spx; + } + owidth=width; + if (expand && w->w) { + expandd=w->w-width+expand; + owidth=w->w; + } else + expandd=expand=1; + break; + case orientation_vertical: + /** + * For vertical layouts: + * We pack each child and compute the largest width and + * the total height. y spacing (spy) is considered + * + * If the expand flag is set then teh expansion amount + * is computed. + */ + l=w->children; + while (l) { + wc=l->data; + gui_internal_widget_pack(this, wc); + if (width < wc->w) + width=wc->w; + height+=wc->h; + if (wc->flags & flags_expand) + expand+=wc->h ? wc->h : 1; + l=g_list_next(l); + if (l) + height+=w->spy; + } + oheight=height; + if (expand && w->h) { + expandd=w->h-height+expand; + oheight=w->h; + } else + expandd=expand=1; + break; + case orientation_horizontal_vertical: + /** + * For horizontal_vertical orientation + * pack the children. + * Compute the largest height and largest width. + * Layout the widgets based on having the + * number of columns specified by (cols) + */ + count=0; + l=w->children; + while (l) { + wc=l->data; + gui_internal_widget_pack(this, wc); + if (height < wc->h) + height=wc->h; + if (width < wc->w) + width=wc->w; + l=g_list_next(l); + count++; + } + if (count < cols) + cols=count; + rows=(count+cols-1)/cols; + width*=cols; + height*=rows; + width+=w->spx*(cols-1); + height+=w->spy*(rows-1); + owidth=width; + oheight=height; + expandd=expand=1; + break; + default: + /** + * No orientation was specified. + * width and height are both 0. + * The width & height of this widget + * will be used. + */ + if(!w->w && !w->h) + dbg(0,"Warning width and height of a widget are 0"); + break; + } + if (! w->w && ! w->h) { + w->w=w->bl+w->br+width; + w->h=w->bt+w->bb+height; + w->packed=1; + } +#if 0 + if (expand < 100) + expand=100; +#endif + + /** + * At this stage the width and height of this + * widget has been computed. + * We now make a second pass assigning heights, + * widths and coordinates to each child widget. + */ + + if (w->flags & gravity_left) + x=w->p.x+w->bl; + if (w->flags & gravity_xcenter) + x=w->p.x+w->w/2-owidth/2; + if (w->flags & gravity_right) + x=w->p.x+w->w-w->br-owidth; + if (w->flags & gravity_top) + y=w->p.y+w->bt; + if (w->flags & gravity_ycenter) + y=w->p.y+w->h/2-oheight/2; + if (w->flags & gravity_bottom) + y=w->p.y+w->h-w->bb-oheight; + l=w->children; + switch (orientation) { + case orientation_horizontal: + l=w->children; + while (l) { + wc=l->data; + wc->p.x=x; + if (wc->flags & flags_fill) + wc->h=w->h; + if (wc->flags & flags_expand) { + if (! wc->w) + wc->w=1; + wc->w=wc->w*expandd/expand; + } + if (w->flags & gravity_top) + wc->p.y=y; + if (w->flags & gravity_ycenter) + wc->p.y=y-wc->h/2; + if (w->flags & gravity_bottom) + wc->p.y=y-wc->h; + x+=wc->w+w->spx; + l=g_list_next(l); + } + break; + case orientation_vertical: + l=w->children; + while (l) { + wc=l->data; + wc->p.y=y; + if (wc->flags & flags_fill) + wc->w=w->w; + if (wc->flags & flags_expand) { + if (! wc->h) + wc->h=1; + wc->h=wc->h*expandd/expand; + } + if (w->flags & gravity_left) + wc->p.x=x; + if (w->flags & gravity_xcenter) + wc->p.x=x-wc->w/2; + if (w->flags & gravity_right) + wc->p.x=x-wc->w; + y+=wc->h+w->spy; + l=g_list_next(l); + } + break; + case orientation_horizontal_vertical: + l=w->children; + x0=x; + count=0; + width/=cols; + height/=rows; + while (l) { + wc=l->data; + wc->p.x=x; + wc->p.y=y; + if (wc->flags & flags_fill) { + wc->w=width; + wc->h=height; + } + if (w->flags & gravity_left) + wc->p.x=x; + if (w->flags & gravity_xcenter) + wc->p.x=x+(width-wc->w)/2; + if (w->flags & gravity_right) + wc->p.x=x+width-wc->w; + if (w->flags & gravity_top) + wc->p.y=y; + if (w->flags & gravity_ycenter) + wc->p.y=y+(height-wc->h)/2; + if (w->flags & gravity_bottom) + wc->p.y=y-height-wc->h; + x+=width; + if (++count == cols) { + count=0; + x=x0; + y+=height; + } + l=g_list_next(l); + } + break; + default: + break; + } + /** + * Call pack again on each child, + * the child has now had its size and coordinates + * set so they can repack their children. + */ + l=w->children; + while (l) { + wc=l->data; + gui_internal_widget_pack(this, wc); + l=g_list_next(l); + } +} + +static void +gui_internal_widget_reset_pack(struct gui_priv *this, struct widget *w) +{ + struct widget *wc; + GList *l; + + l=w->children; + while (l) { + wc=l->data; + gui_internal_widget_reset_pack(this, wc); + l=g_list_next(l); + } + if (w->packed) { + w->w=0; + w->h=0; + } +} + +static void +gui_internal_widget_append(struct widget *parent, struct widget *child) +{ + if (! child) + return; + if (! child->background) + child->background=parent->background; + parent->children=g_list_append(parent->children, child); +} + +static void gui_internal_widget_prepend(struct widget *parent, struct widget *child) +{ + if (! child->background) + child->background=parent->background; + parent->children=g_list_prepend(parent->children, child); +} + +static void gui_internal_widget_insert_before(struct widget *parent, struct widget *sibling, struct widget *child) +{ + GList *sib=NULL; + if (! child->background) + child->background=parent->background; + + if(sibling) + sib=g_list_find(parent->children,sibling); + parent->children=g_list_insert_before(parent->children, sib, child); +} + +static void gui_internal_widget_insert_sorted(struct widget *parent, struct widget *child, GCompareFunc func) +{ + if (! child->background) + child->background=parent->background; + + parent->children=g_list_insert_sorted(parent->children, child, func); +} + + +static void gui_internal_widget_children_destroy(struct gui_priv *this, struct widget *w) +{ + GList *l; + struct widget *wc; + + l=w->children; + while (l) { + wc=l->data; + gui_internal_widget_destroy(this, wc); + l=g_list_next(l); + } + g_list_free(w->children); + w->children=NULL; +} + + +static void gui_internal_widget_destroy(struct gui_priv *this, struct widget *w) +{ + gui_internal_widget_children_destroy(this, w); + g_free(w->command); + g_free(w->speech); + g_free(w->text); + if (w->img) + graphics_image_free(this->gra, w->img); + if (w->prefix) + g_free(w->prefix); + if (w->name) + g_free(w->name); + if (w->data_free) + w->data_free(w->data); + if (w->cb && w->remove_cb) + w->remove_cb(w->instance, w->cb); + if (w==this->highlighted) + this->highlighted=NULL; + if(w->free) + w->free(this,w); + else + g_free(w); +} + + +static void +gui_internal_widget_render(struct gui_priv *this, struct widget *w) +{ + if(w->p.x > this->root.w || w->p.y > this->root.h) + return; + + switch (w->type) { + case widget_box: + gui_internal_box_render(this, w); + break; + case widget_label: + gui_internal_label_render(this, w); + break; + case widget_image: + gui_internal_image_render(this, w); + break; + case widget_table: + gui_internal_table_render(this,w); + break; + default: + break; + } +} + +static void +gui_internal_widget_pack(struct gui_priv *this, struct widget *w) +{ + switch (w->type) { + case widget_box: + gui_internal_box_pack(this, w); + break; + case widget_table: + gui_internal_table_pack(this,w); + default: + break; + } +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void gui_internal_call_highlighted(struct gui_priv *this) +{ + if (! this->highlighted || ! this->highlighted->func) + return; + this->highlighted->reason=1; + this->highlighted->func(this, this->highlighted, this->highlighted->data); +} + +static void +gui_internal_say(struct gui_priv *this, struct widget *w, int questionmark) +{ + char *text=w->speech; + if (! this->speech) + return; + if (!text) + text=w->text; + if (!text) + text=w->name; + if (text) { + text=g_strdup_printf("%s%c", text, questionmark ? '?':'\0'); + navit_say(this->nav, text); + g_free(text); + } +} + +static void +gui_internal_menu_destroy(struct gui_priv *this, struct widget *w) +{ + struct menu_data *menu_data=w->menu_data; + if (menu_data) { + if (menu_data->refresh_callback_obj.type) { + struct object_func *func; + func=object_func_lookup(menu_data->refresh_callback_obj.type); + if (func && func->remove_attr) + func->remove_attr(menu_data->refresh_callback_obj.u.data, &menu_data->refresh_callback); + } + if (menu_data->refresh_callback.u.callback) + callback_destroy(menu_data->refresh_callback.u.callback); + + g_free(menu_data->href); + g_free(menu_data); + } + gui_internal_widget_destroy(this, w); + this->root.children=g_list_remove(this->root.children, w); +} + +static void +gui_internal_prune_menu_do(struct gui_priv *this, struct widget *w, int render) +{ + GList *l; + struct widget *wr,*wd; + gui_internal_search_idle_end(this); + while ((l = g_list_last(this->root.children))) { + wd=l->data; + if (wd == w) { + void (*redisplay)(struct gui_priv *priv, struct widget *widget, void *data); + if (!render) + return; + gui_internal_say(this, w, 0); + redisplay=w->menu_data->redisplay; + wr=w->menu_data->redisplay_widget; + if (!w->menu_data->redisplay && !w->menu_data->href) { + gui_internal_widget_render(this, w); + return; + } + if (redisplay) { + gui_internal_menu_destroy(this, w); + redisplay(this, wr, wr->data); + } else { + char *href=g_strdup(w->menu_data->href); + gui_internal_menu_destroy(this, w); + gui_internal_html_load_href(this, href, 0); + g_free(href); + } + return; + } + gui_internal_menu_destroy(this, wd); + } +} + +static void +gui_internal_prune_menu(struct gui_priv *this, struct widget *w) +{ + gui_internal_prune_menu_do(this, w, 1); +} + +static void +gui_internal_prune_menu_count(struct gui_priv *this, int count, int render) +{ + GList *l=g_list_last(this->root.children); + struct widget *w=NULL; + while (l && count-- > 0) + l=g_list_previous(l); + if (l) { + w=l->data; + gui_internal_prune_menu_do(this, w, render); + } +} + +static void +gui_internal_back(struct gui_priv *this, struct widget *w, void *data) +{ + gui_internal_prune_menu_count(this, 1, 1); +} + +static void +gui_internal_cmd_return(struct gui_priv *this, struct widget *wm, void *data) +{ + gui_internal_prune_menu(this, wm->data); +} + +static void +gui_internal_cmd2_back(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + graphics_draw_mode(this->gra, draw_mode_begin); + gui_internal_back(this, NULL, NULL); + graphics_draw_mode(this->gra, draw_mode_end); + gui_internal_check_exit(this); +} + +static void +gui_internal_cmd2_back_to_map(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + gui_internal_prune_menu(this, NULL); +} + +static void +gui_internal_cmd_main_menu(struct gui_priv *this, struct widget *wm, void *data) +{ + gui_internal_prune_menu(this, this->root.children->data); +} + +static struct widget * +gui_internal_top_bar(struct gui_priv *this) +{ + struct widget *w,*wm,*wh,*wc,*wcn; + int dots_len, sep_len; + GList *res=NULL,*l; + int width,width_used=0,use_sep=0,incomplete=0; + struct graphics_gc *foreground=(this->flags & 256 ? this->background : this->text_foreground); +/* flags + 1:Don't expand bar to screen width + 2:Don't show Map Icon + 4:Don't show Home Icon + 8:Show only current menu + 16:Don't use menu titles as button + 32:Show navit version + 64:Show time + 128:Show help + 256:Use background for menu headline + 512:Set osd_configuration and zoom to route when setting position + 1024:Don't show back button + 2048:No highlighting of keyboard +*/ + + w=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|(this->flags & 1 ? 0:flags_fill)); + w->bl=this->spacing; + w->spx=this->spacing; + w->background=this->background2; + if ((this->flags & 6) == 6) { + w->bl=10; + w->br=10; + w->bt=6; + w->bb=6; + } + width=this->root.w-w->bl; + if (! (this->flags & 2)) { + wm=gui_internal_button_new_with_callback(this, NULL, + image_new_s(this, "gui_map"), gravity_center|orientation_vertical, + gui_internal_cmd_return, NULL); + wm->speech=g_strdup(_("Back to map")); + gui_internal_widget_pack(this, wm); + gui_internal_widget_append(w, wm); + width-=wm->w; + } + if (! (this->flags & 4)) { + wh=gui_internal_button_new_with_callback(this, NULL, + image_new_s(this, "gui_home"), gravity_center|orientation_vertical, + gui_internal_cmd_main_menu, NULL); + wh->speech=g_strdup(_("Main Menu")); + gui_internal_widget_pack(this, wh); + gui_internal_widget_append(w, wh); + width-=wh->w; + } + if (!(this->flags & 6)) + width-=w->spx; + l=g_list_last(this->root.children); + wcn=gui_internal_label_new(this,".. »"); + wcn->foreground=foreground; + dots_len=wcn->w; + gui_internal_widget_destroy(this, wcn); + wcn=gui_internal_label_new(this,"»"); + wcn->foreground=foreground; + sep_len=wcn->w; + gui_internal_widget_destroy(this, wcn); + while (l) { + if (g_list_previous(l) || !g_list_next(l)) { + wc=l->data; + wcn=gui_internal_label_new(this, wc->text); + wcn->foreground=foreground; + if (g_list_next(l)) + use_sep=1; + else + use_sep=0; + dbg(1,"%d (%s) + %d + %d + %d > %d\n", wcn->w, wc->text, width_used, w->spx, use_sep ? sep_len : 0, width); + if (wcn->w + width_used + w->spx + (use_sep ? sep_len : 0) + (g_list_previous(l) ? dots_len : 0) > width) { + incomplete=1; + gui_internal_widget_destroy(this, wcn); + break; + } + if (use_sep) { + struct widget *wct=gui_internal_label_new(this, "»"); + wct->foreground=foreground; + res=g_list_prepend(res, wct); + width_used+=sep_len+w->spx; + } + width_used+=wcn->w; + if (!(this->flags & 16)) { + wcn->func=gui_internal_cmd_return; + wcn->data=wc; + wcn->state |= STATE_SENSITIVE; + } + res=g_list_prepend(res, wcn); + if (this->flags & 8) + break; + } + l=g_list_previous(l); + } + if (incomplete) { + if (! res) { + wcn=gui_internal_label_new_abbrev(this, wc->text, width-width_used-w->spx-dots_len); + wcn->foreground=foreground; + wcn->func=gui_internal_cmd_return; + wcn->data=wc; + wcn->state |= STATE_SENSITIVE; + res=g_list_prepend(res, wcn); + l=g_list_previous(l); + wc=l?l->data:NULL; + } + if(wc) { + wcn=gui_internal_label_new(this, ".. »"); + wcn->foreground=foreground; + wcn->func=gui_internal_cmd_return; + wcn->data=wc; + wcn->state |= STATE_SENSITIVE; + res=g_list_prepend(res, wcn); + } + } + l=res; + while (l) { + gui_internal_widget_append(w, l->data); + l=g_list_next(l); + } + if (this->flags & 32) { + char *version_text=g_strdup_printf("Navit %s",version); + wcn=gui_internal_label_new(this, version_text); + g_free(version_text); + wcn->flags=gravity_right_center|flags_expand; + gui_internal_widget_append(w, wcn); + } +#if 0 + if (dots) + gui_internal_widget_destroy(this, dots); +#endif + return w; +} + +static struct widget * +gui_internal_time_help(struct gui_priv *this) +{ + struct widget *w,*wc,*wcn; + char timestr[64]; + struct tm *tm; + time_t timep; + + w=gui_internal_box_new(this, gravity_right_center|orientation_horizontal|flags_fill); + w->bl=this->spacing; + w->spx=this->spacing; + w->spx=10; + w->bl=10; + w->br=10; + w->bt=6; + w->bb=6; + if (this->flags & 64) { + wc=gui_internal_box_new(this, gravity_right_top|orientation_vertical|flags_fill); + wc->bl=10; + wc->br=20; + wc->bt=6; + wc->bb=6; + timep=time(NULL); + tm=localtime(&timep); + strftime(timestr, 64, "%H:%M %d.%m.%Y", tm); + wcn=gui_internal_label_new(this, timestr); + gui_internal_widget_append(wc, wcn); + gui_internal_widget_append(w, wc); + } + if (this->flags & 128) { + wcn=gui_internal_button_new_with_callback(this, _("Help"), image_new_l(this, "gui_help"), gravity_center|orientation_vertical|flags_fill, NULL, NULL); + gui_internal_widget_append(w, wcn); + } + return w; +} + + +/** + * Applys the configuration values to this based on the settings + * specified in the configuration file (this->config) and + * the most approriate default profile based on screen resolution. + * + * This function should be run after this->root is setup and could + * be rerun after the window is resized. + * + * @authors Steve Singer (09/2008) + */ +static void gui_internal_apply_config(struct gui_priv *this) +{ + struct gui_config_settings * current_config=0; + + dbg(1,"w=%d h=%d\n", this->root.w, this->root.h); + /** + * Select default values from profile based on the screen. + */ + if((this->root.w > 320 || this->root.h > 320) && this->root.w > 240 && this->root.h > 240) + { + if((this->root.w > 640 || this->root.h > 640) && this->root.w > 480 && this->root.h > 480 ) + { + current_config = &config_profiles[LARGE_PROFILE]; + } + else + { + current_config = &config_profiles[MEDIUM_PROFILE]; + } + } + else + { + current_config = &config_profiles[SMALL_PROFILE]; + } + + /** + * Apply override values from config file + */ + if(this->config.font_size == -1 ) + { + this->font_size = current_config->font_size; + } + else + { + this->font_size = this->config.font_size; + } + + if(this->config.icon_xs == -1 ) + { + this->icon_xs = current_config->icon_xs; + } + else + { + this->icon_xs = this->config.icon_xs; + } + + if(this->config.icon_s == -1 ) + { + this->icon_s = current_config->icon_s; + } + else + { + this->icon_s = this->config.icon_s; + } + if(this->config.icon_l == -1 ) + { + this->icon_l = current_config->icon_l; + } + else + { + this->icon_l = this->config.icon_l; + } + if(this->config.spacing == -1 ) + { + this->spacing = current_config->spacing; + } + else + { + this->spacing = current_config->spacing; + } + +} + +static struct widget * +gui_internal_button_label(struct gui_priv *this, char *label, int mode) +{ + struct widget *wl,*wlb; + struct widget *wb=gui_internal_menu_data(this)->button_bar; + wlb=gui_internal_box_new(this, gravity_right_center|orientation_vertical); + wl=gui_internal_label_new(this, label); + wlb->border=1; + wlb->foreground=this->text_foreground; + wlb->bl=20; + wlb->br=20; + wlb->bb=6; + wlb->bt=6; + gui_internal_widget_append(wlb, wl); + if (mode == 1) + gui_internal_widget_prepend(wb, wlb); + if (mode == -1) + gui_internal_widget_append(wb, wlb); + + return wlb; +} + + +static struct widget * +gui_internal_menu(struct gui_priv *this, const char *label) +{ + struct widget *menu,*w,*w1,*topbox; + + gui_internal_search_idle_end(this); + topbox=gui_internal_box_new_with_label(this, 0, label); + topbox->w=this->root.w; + topbox->h=this->root.h; + gui_internal_widget_append(&this->root, topbox); + menu=gui_internal_box_new(this, gravity_left_center|orientation_vertical); + menu->w=this->root.w; + menu->h=this->root.h; + menu->background=this->background; + gui_internal_apply_config(this); + if (!this->fonts[0]) { + this->fonts[0]=graphics_font_new(this->gra,this->font_size,1); + this->fonts[1]=graphics_font_new(this->gra,this->font_size*66/100,1); + this->fonts[2]=graphics_font_new(this->gra,this->font_size*50/100,1); + } + topbox->menu_data=g_new0(struct menu_data, 1); + gui_internal_widget_append(topbox, menu); + w=gui_internal_top_bar(this); + gui_internal_widget_append(menu, w); + w=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_expand|flags_fill); + w->spx=4*this->spacing; + w->w=menu->w; + gui_internal_widget_append(menu, w); + if (this->flags & 16 && !(this->flags & 1024)) { + struct widget *wlb,*wb,*wm=w; + wm->flags=gravity_center|orientation_vertical|flags_expand|flags_fill; + w=gui_internal_box_new(this, gravity_center|orientation_horizontal|flags_expand|flags_fill); + dbg(0,"topbox->menu_data=%p\n", topbox->menu_data); + gui_internal_widget_append(wm, w); + wb=gui_internal_box_new(this, gravity_right_center|orientation_horizontal|flags_fill); + wb->bl=6; + wb->br=6; + wb->bb=6; + wb->bt=6; + wb->spx=6; + topbox->menu_data->button_bar=wb; + gui_internal_widget_append(wm, wb); + wlb=gui_internal_button_label(this,_("Back"),1); + wlb->func=gui_internal_back; + wlb->state |= STATE_SENSITIVE; + } + if (this->flags & 192) { + menu=gui_internal_box_new(this, gravity_left_center|orientation_vertical); + menu->w=this->root.w; + menu->h=this->root.h; + w1=gui_internal_time_help(this); + gui_internal_widget_append(menu, w1); + w1=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_expand|flags_fill); + gui_internal_widget_append(menu, w1); + gui_internal_widget_append(topbox, menu); + menu->background=NULL; + } + gui_internal_widget_pack(this, topbox); + gui_internal_widget_reset_pack(this, topbox); + topbox->w=this->root.w; + topbox->h=this->root.h; + menu->w=this->root.w; + menu->h=this->root.h; + return w; +} + +static struct menu_data * +gui_internal_menu_data(struct gui_priv *this) +{ + GList *l; + struct widget *menu; + + l=g_list_last(this->root.children); + menu=l->data; + return menu->menu_data; +} + +static void +gui_internal_menu_reset_pack(struct gui_priv *this) +{ + GList *l; + struct widget *top_box; + + l=g_list_last(this->root.children); + top_box=l->data; + gui_internal_widget_reset_pack(this, top_box); +} + +static void +gui_internal_menu_render(struct gui_priv *this) +{ + GList *l; + struct widget *menu; + + l=g_list_last(this->root.children); + menu=l->data; + gui_internal_say(this, menu, 0); + gui_internal_widget_pack(this, menu); + gui_internal_widget_render(this, menu); +} + +static void +gui_internal_cmd_set_destination(struct gui_priv *this, struct widget *wm, void *data) +{ + char *name=data; + dbg(0,"c=%d:0x%x,0x%x\n", wm->c.pro, wm->c.x, wm->c.y); + navit_set_destination(this->nav, &wm->c, name, 1); + if (this->flags & 512) { + struct attr follow; + follow.type=attr_follow; + follow.u.num=180; + navit_set_attr(this->nav, &this->osd_configuration); + navit_set_attr(this->nav, &follow); + navit_zoom_to_route(this->nav, 0); + } + gui_internal_prune_menu(this, NULL); +} + +static void +gui_internal_cmd_set_position(struct gui_priv *this, struct widget *wm, void *data) +{ + navit_set_position(this->nav, &wm->c); + gui_internal_prune_menu(this, NULL); +} + +static void +gui_internal_cmd_add_bookmark_do(struct gui_priv *this, struct widget *widget) +{ + GList *l; + struct attr attr; + dbg(0,"text='%s'\n", widget->text); + if (widget->text && strlen(widget->text)){ + navit_get_attr(this->nav, attr_bookmarks, &attr, NULL); + bookmarks_add_bookmark(attr.u.bookmarks, &widget->c, widget->text); + } + g_free(widget->text); + widget->text=NULL; + l=g_list_previous(g_list_last(this->root.children)); + gui_internal_prune_menu(this, l->data); +} + +static void +gui_internal_cmd_add_bookmark_folder_do(struct gui_priv *this, struct widget *widget) +{ + GList *l; + struct attr attr; + dbg(0,"text='%s'\n", widget->text); + if (widget->text && strlen(widget->text)){ + navit_get_attr(this->nav, attr_bookmarks, &attr, NULL); + bookmarks_add_bookmark(attr.u.bookmarks, NULL, widget->text); + } + g_free(widget->text); + widget->text=NULL; + l=g_list_previous(g_list_previous(g_list_last(this->root.children))); + gui_internal_prune_menu(this, l->data); +} + +static void +gui_internal_cmd_add_bookmark_clicked(struct gui_priv *this, struct widget *widget, void *data) +{ + gui_internal_cmd_add_bookmark_do(this, widget->data); +} + +static void +gui_internal_cmd_add_bookmark_folder_clicked(struct gui_priv *this, struct widget *widget, void *data) +{ + gui_internal_cmd_add_bookmark_folder_do(this, widget->data); +} + +static void +gui_internal_cmd_rename_bookmark_clicked(struct gui_priv *this, struct widget *widget,void *data) +{ + struct widget *w=(struct widget*)widget->data; + GList *l; + struct attr attr; + dbg(0,"text='%s'\n", w->text); + if (w->text && strlen(w->text)){ + navit_get_attr(this->nav, attr_bookmarks, &attr, NULL); + bookmarks_rename_bookmark(attr.u.bookmarks, w->name, w->text); + } + g_free(w->text); + g_free(w->name); + w->text=NULL; + w->name=NULL; + l=g_list_previous(g_list_previous(g_list_previous(g_list_last(this->root.children)))); + gui_internal_prune_menu(this, l->data); +} + +static void +gui_internal_cmd_add_bookmark_changed(struct gui_priv *this, struct widget *wm, void *data) +{ + int len; + dbg(1,"enter\n"); + if (wm->text) { + len=strlen(wm->text); + dbg(1,"len=%d\n", len); + if (len && (wm->text[len-1] == '\n' || wm->text[len-1] == '\r')) { + wm->text[len-1]='\0'; + gui_internal_cmd_add_bookmark_do(this, wm); + } + } +} + + +static struct widget * gui_internal_keyboard(struct gui_priv *this, int mode); + +static void +gui_internal_cmd_add_bookmark2(struct gui_priv *this, struct widget *wm, void *data) +{ + struct widget *w,*wb,*wk,*wl,*we,*wnext; + char *name=data; + wb=gui_internal_menu(this,_("Add Bookmark")); + w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(wb, w); + we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); + gui_internal_widget_append(w, we); + gui_internal_widget_append(we, wk=gui_internal_label_new(this, name)); + wk->state |= STATE_EDIT|STATE_EDITABLE|STATE_CLEAR; + wk->background=this->background; + wk->flags |= flags_expand|flags_fill; + wk->func = gui_internal_cmd_add_bookmark_changed; + wk->c=wm->c; + gui_internal_widget_append(we, wnext=gui_internal_image_new(this, image_new_xs(this, "gui_active"))); + wnext->state |= STATE_SENSITIVE; + wnext->func = gui_internal_cmd_add_bookmark_clicked; + wnext->data=wk; + wl=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(w, wl); + if (this->keyboard) + gui_internal_widget_append(w, gui_internal_keyboard(this,2)); + gui_internal_menu_render(this); +} + +static void +gui_internal_cmd_add_bookmark_folder2(struct gui_priv *this, struct widget *wm, void *data) +{ + struct widget *w,*wb,*wk,*wl,*we,*wnext; + char *name=data; + wb=gui_internal_menu(this,_("Add Bookmark folder")); + w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(wb, w); + we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); + gui_internal_widget_append(w, we); + gui_internal_widget_append(we, wk=gui_internal_label_new(this, name)); + wk->state |= STATE_EDIT|STATE_EDITABLE|STATE_CLEAR; + wk->background=this->background; + wk->flags |= flags_expand|flags_fill; + wk->func = gui_internal_cmd_add_bookmark_changed; + wk->c=wm->c; + gui_internal_widget_append(we, wnext=gui_internal_image_new(this, image_new_xs(this, "gui_active"))); + wnext->state |= STATE_SENSITIVE; + wnext->func = gui_internal_cmd_add_bookmark_folder_clicked; + wnext->data=wk; + wl=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(w, wl); + if (this->keyboard) + gui_internal_widget_append(w, gui_internal_keyboard(this,2)); + gui_internal_menu_render(this); +} + +static void +gui_internal_cmd_rename_bookmark(struct gui_priv *this, struct widget *wm, void *data) +{ + struct widget *w,*wb,*wk,*wl,*we,*wnext; + char *name=wm->text; + wb=gui_internal_menu(this,_("Rename")); + w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(wb, w); + we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); + gui_internal_widget_append(w, we); + gui_internal_widget_append(we, wk=gui_internal_label_new(this, name)); + wk->state |= STATE_EDIT|STATE_EDITABLE|STATE_CLEAR; + wk->background=this->background; + wk->flags |= flags_expand|flags_fill; + wk->func = gui_internal_cmd_add_bookmark_changed; + wk->c=wm->c; + wk->name=g_strdup(name); + gui_internal_widget_append(we, wnext=gui_internal_image_new(this, image_new_xs(this, "gui_active"))); + wnext->state |= STATE_SENSITIVE; + wnext->func = gui_internal_cmd_rename_bookmark_clicked; + wnext->data=wk; + wl=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(w, wl); + if (this->keyboard) + gui_internal_widget_append(w, gui_internal_keyboard(this,2)); + gui_internal_menu_render(this); +} + +static void +gui_internal_cmd_cut_bookmark(struct gui_priv *this, struct widget *wm, void *data) +{ + struct attr mattr; + GList *l; + navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL); + bookmarks_cut_bookmark(mattr.u.bookmarks,wm->text); + l=g_list_previous(g_list_previous(g_list_last(this->root.children))); + gui_internal_prune_menu(this, l->data); +} + +static void +gui_internal_cmd_copy_bookmark(struct gui_priv *this, struct widget *wm, void *data) +{ + struct attr mattr; + GList *l; + navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL); + bookmarks_copy_bookmark(mattr.u.bookmarks,wm->text); + l=g_list_previous(g_list_previous(g_list_last(this->root.children))); + gui_internal_prune_menu(this, l->data); +} + +static void +gui_internal_cmd_paste_bookmark(struct gui_priv *this, struct widget *wm, void *data) +{ + struct attr mattr; + GList *l; + navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL); + bookmarks_paste_bookmark(mattr.u.bookmarks); + l=g_list_previous(g_list_last(this->root.children)); + gui_internal_prune_menu(this, l->data); +} + +static void +gui_internal_cmd_delete_bookmark(struct gui_priv *this, struct widget *wm, void *data) +{ + struct attr mattr; + GList *l; + navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL); + bookmarks_delete_bookmark(mattr.u.bookmarks,wm->text); + l=g_list_previous(g_list_previous(g_list_last(this->root.children))); + gui_internal_prune_menu(this, l->data); +} + +static void +get_direction(char *buffer, int angle, int mode) +{ + angle=angle%360; + switch (mode) { + case 0: + sprintf(buffer,"%d",angle); + break; + case 1: + if (angle < 69 || angle > 291) + *buffer++='N'; + if (angle > 111 && angle < 249) + *buffer++='S'; + if (angle > 22 && angle < 158) + *buffer++='E'; + if (angle > 202 && angle < 338) + *buffer++='W'; + *buffer++='\0'; + break; + case 2: + angle=(angle+15)/30; + if (! angle) + angle=12; + sprintf(buffer,"%d H", angle); + break; + } +} + +static void gui_internal_cmd_position(struct gui_priv *this, struct widget *wm, void *data); + +#ifndef _MSC_VER +//MSVC doesn't supports this style of initialization and i'm not sure +//how to fix it +struct selector { + char *icon; + char *name; + enum item_type *types; +}; +struct selector selectors[]={ + {"bank","Bank",(enum item_type []){ + type_poi_bank,type_poi_bank, + type_poi_atm,type_poi_atm, + type_none}}, + {"fuel","Fuel",(enum item_type []){type_poi_fuel,type_poi_fuel,type_none}}, + {"hotel","Hotel",(enum item_type []) { + type_poi_hotel,type_poi_camp_rv, + type_poi_camping,type_poi_camping, + type_poi_resort,type_poi_resort, + type_poi_motel,type_poi_hostel, + type_none}}, + {"restaurant","Restaurant",(enum item_type []) { + type_poi_bar,type_poi_picnic, + type_poi_burgerking,type_poi_fastfood, + type_poi_restaurant,type_poi_restaurant, + type_poi_cafe,type_poi_cafe, + type_poi_pub,type_poi_pub, + type_none}}, + {"shopping","Shopping",(enum item_type []) { + type_poi_mall,type_poi_mall, + type_poi_shop_grocery,type_poi_shop_grocery, + type_poi_shopping,type_poi_shopping, + type_poi_shop_butcher,type_poi_shop_baker, + type_poi_shop_fruit,type_poi_shop_fruit, + type_poi_shop_beverages,type_poi_shop_beverages, + type_none}}, + {"hospital","Service",(enum item_type []) { + type_poi_marina,type_poi_marina, + type_poi_hospital,type_poi_hospital, + type_poi_public_utilities,type_poi_public_utilities, + type_poi_police,type_poi_autoservice, + type_poi_information,type_poi_information, + type_poi_pharmacy,type_poi_pharmacy, + type_poi_personal_service,type_poi_repair_service, + type_poi_restroom,type_poi_restroom, + type_none}}, + {"parking","Parking",(enum item_type []){type_poi_car_parking,type_poi_car_parking,type_none}}, + {"peak","Land Features",(enum item_type []){ + type_poi_land_feature,type_poi_rock, + type_poi_dam,type_poi_dam, + type_poi_peak,type_poi_peak, + type_none}}, + {"unknown","Other",(enum item_type []){ + type_point_unspecified,type_poi_land_feature-1, + type_poi_rock+1,type_poi_fuel-1, + type_poi_marina+1,type_poi_shopping-1, + type_poi_shopping+1,type_poi_car_parking-1, + type_poi_car_parking+1,type_poi_bar-1, + type_poi_bank+1,type_poi_dam-1, + type_poi_dam+1,type_poi_information-1, + type_poi_information+1,type_poi_mall-1, + type_poi_mall+1,type_poi_personal_service-1, + type_poi_pharmacy+1,type_poi_repair_service-1, + type_poi_repair_service+1,type_poi_restaurant-1, + type_poi_restaurant+1,type_poi_restroom-1, + type_poi_restroom+1,type_poi_shop_grocery-1, + type_poi_shop_grocery+1,type_poi_peak-1, + type_poi_peak+1, type_poi_motel-1, + type_poi_hostel+1,type_poi_shop_butcher-1, + type_poi_shop_baker+1,type_poi_shop_fruit-1, + type_poi_shop_fruit+1,type_poi_shop_beverages-1, + type_poi_shop_beverages+1,type_poi_pub-1, + type_poi_atm+1,type_line-1, + type_none}}, +/* {"unknown","Unknown",(enum item_type []){ + type_point_unkn,type_point_unkn, + type_none}},*/ +}; + + +/* + * Get a utf-8 string, return the same prepared for case insensetive search. Result shoud be g_free()d after use. + */ + +static char * +removecase(char *s) +{ + char *r; + r=g_utf8_casefold(s,-1); + return r; +} + +/** + * POI search/filtering parameters. + * + */ + +struct poi_param { + + /** + * =1 if selnb is defined, 0 otherwize. + */ + unsigned char sel; + + /** + * Index to struct selector selectors[], shows what type of POIs is defined. + */ + unsigned char selnb; + /** + * Page number to display. + */ + unsigned char pagenb; + /** + * Radius (number of 10-kilometer intervals) to search for POIs. + */ + unsigned char dist; + /** + * Should filter phrase be compared to postal address of the POI. + * =1 - address filter, =0 - name filter + */ + unsigned char isAddressFilter; + /** + * Filter string, casefold()ed and divided into substrings at the spaces, which are replaced by ASCII 0*. + */ + char *filterstr; + /** + * list of pointers to individual substrings of filterstr. + */ + GList *filter; + /** + * Number of POIs in this list + */ + int count; +}; + + +/** + * @brief Free poi_param structure. + * + * @param p reference to the object to be freed. + */ +static void +gui_internal_poi_param_free(void *p) +{ + if(((struct poi_param *)p)->filterstr) + g_free(((struct poi_param *)p)->filterstr); + if(((struct poi_param *)p)->filter) + g_list_free(((struct poi_param *)p)->filter); + g_free(p); +}; + +/** + * @brief Clone poi_param structure. + * + * @param p reference to the object to be cloned. + * @return Cloned object reference. + */ +static struct poi_param * +gui_internal_poi_param_clone(struct poi_param *p) +{ + struct poi_param *r=g_new(struct poi_param,1); + GList *l=p->filter; + memcpy(r,p,sizeof(struct poi_param)); + r->filter=NULL; + r->filterstr=NULL; + if(p->filterstr) { + char *last=g_list_last(l)->data; + int len=(last - p->filterstr) + strlen(last)+1; + r->filterstr=g_memdup(p->filterstr,len); + } + while(l) { + r->filter=g_list_append(r->filter, r->filterstr + ((char*)(l->data) - p->filterstr) ); + l=g_list_next(l); + } + return r; +}; + +/** + * @brief Set POIs filter data in poi_param structure. + * @param param poi_param structure with unset filter data. + * @param text filter text. + */ +static void +gui_internal_poi_param_set_filter(struct poi_param *param, char *text) +{ + char *s1, *s2; + + param->filterstr=removecase(text); + s1=param->filterstr; + do { + s2=g_utf8_strchr(s1,-1,' '); + if(s2) + *s2++=0; + param->filter=g_list_append(param->filter,s1); + if(s2) { + while(*s2==' ') + s2++; + } + s1=s2; + } while(s2 && *s2); +} + + +static void gui_internal_cmd_pois(struct gui_priv *this, struct widget *wm, void *data); +static void gui_internal_cmd_pois_filter(struct gui_priv *this, struct widget *wm, void *data); + + +static struct widget * +gui_internal_cmd_pois_selector(struct gui_priv *this, struct pcoord *c, int pagenb) +{ + struct widget *wl,*wb; + int nitems,nrows; + int i; + //wl=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); + wl=gui_internal_box_new(this, gravity_left_center|orientation_horizontal_vertical|flags_fill); + wl->background=this->background; + wl->w=this->root.w; + wl->cols=this->root.w/this->icon_s; + nitems=sizeof(selectors)/sizeof(struct selector); + nrows=nitems/wl->cols + (nitems%wl->cols>0); + wl->h=this->icon_l*nrows; + for (i = 0 ; i < nitems ; i++) { + struct poi_param *p=g_new0(struct poi_param,1); + p->sel = 1; + p->selnb = i; + p->pagenb = pagenb; + p->dist = 0; + p->filter=NULL; + p->filterstr=NULL; + gui_internal_widget_append(wl, wb=gui_internal_button_new_with_callback(this, NULL, + image_new_s(this, selectors[i].icon), gravity_left_center|orientation_vertical, + gui_internal_cmd_pois, p)); + wb->c=*c; + wb->data_free=gui_internal_poi_param_free; + wb->bt=10; + } + + gui_internal_widget_append(wl, wb=gui_internal_button_new_with_callback(this, NULL, + image_new_s(this, "gui_search"), gravity_left_center|orientation_vertical, + gui_internal_cmd_pois_filter, NULL)); + wb->c=*c; + wb->bt=10; + + gui_internal_widget_pack(this,wl); + return wl; +} + +static struct widget * +gui_internal_cmd_pois_item(struct gui_priv *this, struct coord *center, struct item *item, struct coord *c, int dist, char* name) +{ + char distbuf[32]; + char dirbuf[32]; + char *type; + struct widget *wl,*wt; + char *text; + + wl=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); + + if (dist > 10000) + sprintf(distbuf,"%d", dist/1000); + else + sprintf(distbuf,"%d.%d", dist/1000, (dist%1000)/100); + get_direction(dirbuf, transform_get_angle_delta(center, c, 0), 1); + type=item_to_name(item->type); + if (name[0]) { + wl->name=g_strdup_printf("%s %s",type,name); + } else { + wl->name=g_strdup(type); + } + text=g_strdup_printf("%s %s %s %s", distbuf, dirbuf, type, name); + wt=gui_internal_label_new(this, text); + wt->datai=dist; + gui_internal_widget_append(wl, wt); + g_free(text); + + return wl; +} + +/** + * @brief Get string representation of item address suitable for doing search and for display in POI list. + * + * @param item reference to item. + * @return Pointer to string representation of address. To be g_free()d after use. + */ +char * +gui_internal_compose_item_address_string(struct item *item) +{ + char *s=g_strdup(""); + struct attr attr; + if(item_attr_get(item, attr_house_number, &attr)) + s=g_strjoin(" ",s,attr.u.str,NULL); + if(item_attr_get(item, attr_street_name, &attr)) + s=g_strjoin(" ",s,attr.u.str,NULL); + if(item_attr_get(item, attr_street_name_systematic, &attr)) + s=g_strjoin(" ",s,attr.u.str,NULL); + if(item_attr_get(item, attr_district_name, &attr)) + s=g_strjoin(" ",s,attr.u.str,NULL); + if(item_attr_get(item, attr_town_name, &attr)) + s=g_strjoin(" ",s,attr.u.str,NULL); + if(item_attr_get(item, attr_county_name, &attr)) + s=g_strjoin(" ",s,attr.u.str,NULL); + if(item_attr_get(item, attr_country_name, &attr)) + s=g_strjoin(" ",s,attr.u.str,NULL); + + if(item_attr_get(item, attr_address, &attr)) + s=g_strjoin(" ",s,"|",attr.u.str,NULL); + return s; +} + +static int +gui_internal_cmd_pois_item_selected(struct poi_param *param, struct item *item) +{ + enum item_type *types; + struct selector *sel = param->sel? &selectors[param->selnb]: NULL; + enum item_type type=item->type; + struct attr attr; + int match=0; + if (type >= type_line && param->filter==NULL) + return 0; + if (! sel || !sel->types) { + match=1; + } else { + types=sel->types; + while (*types != type_none) { + if (item->type >= types[0] && item->type <= types[1]) { + return 1; + } + types+=2; + } + } + if (param->filter) { + char *long_name, *s; + GList *f; + if (param->isAddressFilter) { + s=gui_internal_compose_item_address_string(item); + } else if (item_attr_get(item, attr_label, &attr)) { + s=g_strdup_printf("%s %s", item_to_name(item->type), attr.u.str); + } else { + s=g_strdup(item_to_name(item->type)); + } + long_name=removecase(s); + g_free(s); + item_attr_rewind(item); + + for(s=long_name,f=param->filter;f && s;f=g_list_next(f)) { + s=strstr(s,f->data); + if(!s) + break; + s=g_utf8_strchr(s,-1,' '); + } + if(f) + match=0; + g_free(long_name); + } + return match; +} + +struct item_data { + int dist; + char *label; + struct item item; + struct coord c; +}; + +/** + * @brief Event handler for POIs list "more" element. + * + * @param this The graphics context. + * @param wm called widget. + * @param data event data. + */ +static void +gui_internal_cmd_pois_more(struct gui_priv *this, struct widget *wm, void *data) +{ + struct widget *w=g_new0(struct widget,1); + w->data=wm->data; + w->c=wm->c; + w->w=wm->w; + wm->data_free=NULL; + gui_internal_back(this, NULL, NULL); + gui_internal_cmd_pois(this, w, w->data); + free(w); +} + + +/** + * @brief Event to apply POIs text filter. + * + * @param this The graphics context. + * @param wm called widget. + * @param data event data (pointer to editor widget containg filter text). + */ +static void +gui_internal_cmd_pois_filter_do(struct gui_priv *this, struct widget *wm, void *data) +{ + struct widget *w=data; + struct poi_param *param; + + if(!w->text) + return; + + if(w->data) { + param=gui_internal_poi_param_clone(w->data); + param->pagenb=0; + } else { + param=g_new0(struct poi_param,1); + } + param->isAddressFilter=strcmp(wm->name,"AddressFilter")==0; + + gui_internal_poi_param_set_filter(param, w->text); + + gui_internal_cmd_pois(this,w,param); + gui_internal_poi_param_free(param); +} + +/** + * @brief POIs filter dialog. + * Event to handle '\r' '\n' keys pressed. + * + */ + +static void +gui_internal_cmd_pois_filter_changed(struct gui_priv *this, struct widget *wm, void *data) +{ + int len; + if (wm->text) { + len=strlen(wm->text); + dbg(1,"len=%d\n", len); + if (len && (wm->text[len-1] == '\n' || wm->text[len-1] == '\r')) { + wm->text[len-1]='\0'; + //gui_internal_cmd_pois_filter_do(this, wm, wm); // Doesnt clean filter editor from the screen. How to disable its redrawal after POI list is drawn? + } + } +} + + +/** + * @brief POIs filter dialog. + * + * @param this The graphics context. + * @param wm called widget. + * @param data event data. + */ +static void +gui_internal_cmd_pois_filter(struct gui_priv *this, struct widget *wm, void *data) +{ + struct widget *wb, *w, *wr, *wk, *we; + int keyboard_mode=2; + wb=gui_internal_menu(this,"Filter"); + w=gui_internal_box_new(this, gravity_center|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(wb, w); + wr=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(w, wr); + we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); + gui_internal_widget_append(wr, we); + + gui_internal_widget_append(we, wk=gui_internal_label_new(this, NULL)); + wk->state |= STATE_EDIT|STATE_EDITABLE; + wk->func=gui_internal_cmd_pois_filter_changed; + wk->background=this->background; + wk->flags |= flags_expand|flags_fill; + wk->name=g_strdup("POIsFilter"); + wk->c=wm->c; + gui_internal_widget_append(we, wb=gui_internal_image_new(this, image_new_xs(this, "gui_active"))); + wb->state |= STATE_SENSITIVE; + wb->func = gui_internal_cmd_pois_filter_do; + wb->name=g_strdup("NameFilter"); + wb->data=wk; + gui_internal_widget_append(we, wb=gui_internal_image_new(this, image_new_xs(this, "post"))); + wb->state |= STATE_SENSITIVE; + wb->name=g_strdup("AddressFilter"); + wb->func = gui_internal_cmd_pois_filter_do; + wb->data=wk; + + if (this->keyboard) + gui_internal_widget_append(w, gui_internal_keyboard(this,keyboard_mode)); + gui_internal_menu_render(this); + + +} + +/** + * @brief Do POI search specified by poi_param and display POIs found + * + * @param this The graphics context. + * @param wm called widget. + * @param data event data, reference to poi_param or NULL. + */ +static void +gui_internal_cmd_pois(struct gui_priv *this, struct widget *wm, void *data) +{ + struct map_selection *sel,*selm; + struct coord c,center; + struct mapset_handle *h; + struct map *m; + struct map_rect *mr; + struct item *item; + struct widget *wi,*w,*w2,*wb, *wtable, *row; + enum projection pro=wm->c.pro; + struct poi_param *param; + int param_free=0; + int idist,dist; + struct selector *isel; + int pagenb; + int prevdist; + // Starting value and increment of count of items to be extracted + const int pagesize = 50; + int maxitem, it = 0, i; + struct item_data *items; + struct fibheap* fh = fh_makekeyheap(); + int cnt = 0; + struct table_data *td; + int width=wm->w; + + + if(data) { + param = data; + } else { + param = g_new0(struct poi_param,1); + param_free=1; + } + + dist=10000*(param->dist+1); + isel = param->sel? &selectors[param->selnb]: NULL; + pagenb = param->pagenb; + prevdist=param->dist*10000; + maxitem = pagesize*(pagenb+1); + items= g_new0( struct item_data, maxitem); + + + dbg(0, "Params: sel = %i, selnb = %i, pagenb = %i, dist = %i, filterstr = %s, isAddressFilter= %d\n", + param->sel, param->selnb, param->pagenb, param->dist, param->filterstr, param->isAddressFilter); + + wb=gui_internal_menu(this, isel ? isel->name : _("POIs")); + w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(wb, w); + if (!isel && !param->filter) + gui_internal_widget_append(w, gui_internal_cmd_pois_selector(this,&wm->c,pagenb)); + w2=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(w, w2); + + sel=map_selection_rect_new(&wm->c,dist*transform_scale(abs(wm->c.y)+dist*1.5),18); + center.x=wm->c.x; + center.y=wm->c.y; + h=mapset_open(navit_get_mapset(this->nav)); + while ((m=mapset_next(h, 1))) { + selm=map_selection_dup_pro(sel, pro, map_projection(m)); + mr=map_rect_new(m, selm); + dbg(2,"mr=%p\n", mr); + if (mr) { + while ((item=map_rect_get_item(mr))) { + if (gui_internal_cmd_pois_item_selected(param, item) && + item_coord_get_pro(item, &c, 1, pro) && + coord_rect_contains(&sel->u.c_rect, &c) && + (idist=transform_distance(pro, ¢er, &c)) < dist) { + struct item_data *data; + struct attr attr; + char *label; + + if (item->type==type_house_number) { + label=gui_internal_compose_item_address_string(item); + } else if (item_attr_get(item, attr_label, &attr)) { + label=g_strdup(attr.u.str); + // Buildings which label is equal to addr:housenumber value + // are duplicated by item_house_number. Don't include such + // buildings into the list. This is true for OSM maps created with + // maptool patched with #859 latest patch. + // FIXME: For non-OSM maps, we probably would better don't skip these items. + if(item->type==type_poly_building && item_attr_get(item, attr_house_number, &attr) ) { + if(strcmp(label,attr.u.str)==0) { + g_free(label); + continue; + } + } + + } else { + label=g_strdup(""); + } + + if(it>=maxitem) { + data = fh_extractmin(fh); + g_free(data->label); + data->label=NULL; + } else { + data = &items[it++]; + } + data->label=label; + data->item = *item; + data->c = c; + data->dist = idist; + // Key expression is a workaround to fight + // probable heap collisions when two objects + // are at the same distance. But it destroys + // right order of POIs 2048 km away from cener + // and if table grows more than 1024 rows. + fh_insertkey(fh, -((idist<<10) + cnt++), data); + if (it == maxitem) + dist = (-fh_minkey(fh))>>10; + } + } + map_rect_destroy(mr); + } + map_selection_destroy(selm); + } + map_selection_destroy(sel); + mapset_close(h); + + wtable = gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand |orientation_vertical,1); + td=wtable->data; + + gui_internal_widget_append(w2,wtable); + + // Move items from heap to the table + for(i=0;;i++) + { + int key = fh_minkey(fh); + struct item_data *data = fh_extractmin(fh); + if (data == NULL) + { + dbg(2, "Empty heap: maxitem = %i, it = %i, dist = %i\n", maxitem, it, dist); + break; + } + dbg(2, "dist1: %i, dist2: %i\n", data->dist, (-key)>>10); + if(i==(it-pagesize*pagenb) && data->dist>prevdist) + prevdist=data->dist; + wi=gui_internal_cmd_pois_item(this, ¢er, &data->item, &data->c, data->dist, data->label); + wi->func=gui_internal_cmd_position; + wi->data=(void *)2; + wi->item=data->item; + wi->state |= STATE_SENSITIVE; + wi->c.x=data->c.x; + wi->c.y=data->c.y; + wi->c.pro=pro; + wi->w=width; + wi->background=this->background; + row = gui_internal_widget_table_row_new(this, + gravity_left + | flags_fill + | orientation_horizontal); + gui_internal_widget_append(row,wi); + row->datai=data->dist; + gui_internal_widget_prepend(wtable,row); + free(data->label); + } + + fh_deleteheap(fh); + free(items); + + // Add an entry for more POI + struct widget *wl,*wt; + char buffer[32]; + struct poi_param *paramnew; + row = gui_internal_widget_table_row_new(this, + gravity_left + | flags_fill + | orientation_horizontal); + row->datai=100000000; // Really far away for Earth, but won't work for bigger planets. + gui_internal_widget_append(wtable,row); + wl=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); + gui_internal_widget_append(row,wl); + if (it == maxitem) { + paramnew=gui_internal_poi_param_clone(param); + paramnew->pagenb++; + paramnew->count=it; + snprintf(buffer, sizeof(buffer), "Get more (up to %d items)...", (paramnew->pagenb+1)*pagesize); + wt=gui_internal_label_new(this, buffer); + gui_internal_widget_append(wl, wt); + wt->func=gui_internal_cmd_pois_more; + wt->data=paramnew; + wt->data_free=gui_internal_poi_param_free; + wt->state |= STATE_SENSITIVE; + wt->c = wm->c; + } else { + static int dist[]={1,5,10,0}; + wt=gui_internal_label_new(this, "Set distance to"); + gui_internal_widget_append(wl, wt); + for(i=0;dist[i];i++) { + paramnew=gui_internal_poi_param_clone(param); + paramnew->dist+=dist[i]; + paramnew->count=it; + snprintf(buffer, sizeof(buffer), " %i ", 10*(paramnew->dist+1)); + wt=gui_internal_label_new(this, buffer); + gui_internal_widget_append(wl, wt); + wt->func=gui_internal_cmd_pois_more; + wt->data=paramnew; + wt->data_free=gui_internal_poi_param_free; + wt->state |= STATE_SENSITIVE; + wt->c = wm->c; + } + wt=gui_internal_label_new(this, "km."); + gui_internal_widget_append(wl, wt); + + } + // Rendering now is needed to have table_data->bottomrow filled in. + gui_internal_menu_render(this); + td=wtable->data; + if(td->bottom_row!=NULL) + { +#if 0 + while(((struct widget*)td->bottom_row->data)->datai<=prevdist + && (td->next_button->state & STATE_SENSITIVE)) + { + gui_internal_table_button_next(this, td->next_button, NULL); + } +#else + int firstrow=g_list_index(wtable->children, td->top_row->data); + while(firstrow>=0) { + int currow=g_list_index(wtable->children, td->bottom_row->data) - firstrow; + if(currow<0) { + dbg(0,"Can't find bottom row in children list. Stop paging.\n"); + break; + } + if(currow>=param->count) + break; + if(!(td->next_button->state & STATE_SENSITIVE)) { + dbg(0,"Reached last page but item %i not found. Stop paging.\n",param->count); + break; + } + gui_internal_table_button_next(this, td->next_button, NULL); + } +#endif + } + gui_internal_menu_render(this); + if(param_free) + g_free(param); +} +#endif /* _MSC_VER */ + +static void +gui_internal_cmd_view_on_map(struct gui_priv *this, struct widget *wm, void *data) +{ + if (wm->item.type != type_none) { + enum item_type type; + if (wm->item.type < type_line) + type=type_selected_point; + else if (wm->item.type < type_area) + type=type_selected_point; + else + type=type_selected_area; + graphics_clear_selection(this->gra, NULL); + graphics_add_selection(this->gra, &wm->item, type, NULL); + } + navit_set_center(this->nav, &wm->c, 1); + gui_internal_prune_menu(this, NULL); +} + + +static void +gui_internal_cmd_view_attribute_details(struct gui_priv *this, struct widget *wm, void *data) +{ + struct widget *w,*wb; + struct map_rect *mr; + struct item *item; + struct attr attr; + char *text,*url; + int i; + + text=g_strdup_printf("Attribute %s",wm->name); + wb=gui_internal_menu(this, text); + g_free(text); + w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(wb, w); + mr=map_rect_new(wm->item.map, NULL); + item = map_rect_get_item_byid(mr, wm->item.id_hi, wm->item.id_lo); + for (i = 0 ; i < wm->datai ; i++) { + item_attr_get(item, attr_any, &attr); + } + if (item_attr_get(item, attr_any, &attr)) { + url=NULL; + switch (attr.type) { + case attr_osm_nodeid: + url=g_strdup_printf("http://www.openstreetmap.org/browse/node/"LONGLONG_FMT"\n",*attr.u.num64); + break; + case attr_osm_wayid: + url=g_strdup_printf("http://www.openstreetmap.org/browse/way/"LONGLONG_FMT"\n",*attr.u.num64); + break; + case attr_osm_relationid: + url=g_strdup_printf("http://www.openstreetmap.org/browse/relation/"LONGLONG_FMT"\n",*attr.u.num64); + break; + default: + break; + } + if (url) { + gui_internal_widget_append(w, + wb=gui_internal_button_new_with_callback(this, _("View in Browser"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_view_in_browser, NULL)); + wb->name=url; + } + } + map_rect_destroy(mr); + gui_internal_menu_render(this); +} + +static void +gui_internal_cmd_view_attributes(struct gui_priv *this, struct widget *wm, void *data) +{ + struct widget *w,*wb; + struct map_rect *mr; + struct item *item; + struct attr attr; + char *text; + int count=0; + + dbg(0,"item=%p 0x%x 0x%x\n", wm->item.map,wm->item.id_hi, wm->item.id_lo); + wb=gui_internal_menu(this, "Attributes"); + w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(wb, w); + mr=map_rect_new(wm->item.map, NULL); + item = map_rect_get_item_byid(mr, wm->item.id_hi, wm->item.id_lo); + dbg(0,"item=%p\n", item); + if (item) { + text=g_strdup_printf("%s:%s", _("Item type"), item_to_name(item->type)); + gui_internal_widget_append(w, + wb=gui_internal_button_new(this, text, + NULL, gravity_left_center|orientation_horizontal|flags_fill)); + wb->name=g_strdup(text); + wb->item=wm->item; + g_free(text); + while(item_attr_get(item, attr_any, &attr)) { + text=g_strdup_printf("%s:%s", attr_to_name(attr.type), attr_to_text(&attr, wm->item.map, 1)); + gui_internal_widget_append(w, + wb=gui_internal_button_new_with_callback(this, text, + NULL, gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_view_attribute_details, NULL)); + wb->name=g_strdup(text); + wb->item=wm->item; + wb->datai=count++; + g_free(text); + } + } + map_rect_destroy(mr); + gui_internal_menu_render(this); +} + +static void +gui_internal_cmd_view_in_browser(struct gui_priv *this, struct widget *wm, void *data) +{ + struct map_rect *mr; + struct item *item; + struct attr attr; + char *cmd=NULL; + + if (!wm->name) { + dbg(0,"item=%p 0x%x 0x%x\n", wm->item.map,wm->item.id_hi, wm->item.id_lo); + mr=map_rect_new(wm->item.map, NULL); + item = map_rect_get_item_byid(mr, wm->item.id_hi, wm->item.id_lo); + dbg(0,"item=%p\n", item); + if (item) { + while(item_attr_get(item, attr_url_local, &attr)) { + if (! cmd) + cmd=g_strdup_printf("navit-browser.sh '%s' &",attr.u.str); + } + } + map_rect_destroy(mr); + } else { + cmd=g_strdup_printf("navit-browser.sh '%s' &",wm->name); + } + if (cmd) { +#ifdef HAVE_SYSTEM + system(cmd); +#else + dbg(0,"calling external cmd '%s' is not supported\n",cmd); +#endif + g_free(cmd); + } +} + +/* meaning of the bits in "flags": + * 1: "Streets" + * 2: "House numbers" + * 4: "View in Browser", "View Attributes" + * 8: "Set as dest." + * 16: "Set as pos." + * 32: "Add as bookm." + * 64: "POIs" + * 128: "View on Map" + * 256: POIs around this point + * 512: "Cut/Copy... bookmark" + * 1024: "Jump to attributes of top item within this->radius pixels of this point (implies flags|=256)" + * TODO define constants for these values + */ +static void +gui_internal_cmd_position_do(struct gui_priv *this, struct pcoord *pc_in, struct coord_geo *g_in, struct widget *wm, char *name, int flags) +{ + struct widget *wb,*w,*wc,*wbc,*wclosest=NULL; + struct coord_geo g; + struct pcoord pc; + struct coord c; + char *coord; + + if (pc_in) { + pc=*pc_in; + c.x=pc.x; + c.y=pc.y; + dbg(0,"x=0x%x y=0x%x\n", c.x, c.y); + transform_to_geo(pc.pro, &c, &g); + } else if (g_in) { + struct attr attr; + if (!navit_get_attr(this->nav, attr_projection, &attr, NULL)) + return; + g=*g_in; + pc.pro=attr.u.projection; + transform_from_geo(pc.pro, &g, &c); + pc.x=c.x; + pc.y=c.y; + } else + return; + + wb=gui_internal_menu(this, name); + w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(wb, w); + coord=coordinates(&pc, ' '); + gui_internal_widget_append(w, gui_internal_label_new(this, coord)); + g_free(coord); + if ((flags & 1) && wm) { + gui_internal_widget_append(w, + wc=gui_internal_button_new_with_callback(this, _("Streets"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_search_street_in_town, wm)); + wc->item=wm->item; + wc->selection_id=wm->selection_id; + } + if ((flags & 2) && wm) { + gui_internal_widget_append(w, + wc=gui_internal_button_new_with_callback(this, _("House numbers"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_search_house_number_in_street, wm)); + wc->item=wm->item; + wc->selection_id=wm->selection_id; + } + if ((flags & 4) && wm) { + struct map_rect *mr; + struct item *item; + struct attr attr; + mr=map_rect_new(wm->item.map, NULL); + item = map_rect_get_item_byid(mr, wm->item.id_hi, wm->item.id_lo); + if (item) { + if (item_attr_get(item, attr_description, &attr)) + gui_internal_widget_append(w, gui_internal_label_new(this, attr.u.str)); + if (item_attr_get(item, attr_url_local, &attr)) { + gui_internal_widget_append(w, + wb=gui_internal_button_new_with_callback(this, _("View in Browser"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_view_in_browser, NULL)); + wb->item=wm->item; + } + gui_internal_widget_append(w, + wb=gui_internal_button_new_with_callback(this, _("View Attributes"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_view_attributes, NULL)); + wb->item=wm->item; + } + map_rect_destroy(mr); + } + if (flags & 8) { + gui_internal_widget_append(w, + wbc=gui_internal_button_new_with_callback(this, _("Set as destination"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_set_destination, g_strdup(name))); + wbc->data_free=g_free_func; + wbc->c=pc; + } + if (flags & 16) { + gui_internal_widget_append(w, + wbc=gui_internal_button_new_with_callback(this, _("Set as position"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_set_position, wm)); + wbc->c=pc; + } + if (flags & 32) { + gui_internal_widget_append(w, + wbc=gui_internal_button_new_with_callback(this, _("Add as bookmark"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_add_bookmark2, g_strdup(name))); + wbc->data_free=g_free_func; + wbc->c=pc; + } +#ifndef _MSC_VER +//POIs are not operational under MSVC yet + if (flags & 64) { + gui_internal_widget_append(w, + wbc=gui_internal_button_new_with_callback(this, _("POIs"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_pois, NULL)); + wbc->c=pc; + } +#endif /* _MSC_VER */ +#if 0 + gui_internal_widget_append(w, + gui_internal_button_new(this, "Add to tour", + image_new_o(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill)); +#endif + if (flags & 128) { + gui_internal_widget_append(w, + wbc=gui_internal_button_new_with_callback(this, _("View on map"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_view_on_map, NULL)); + wbc->c=pc; + if ((flags & 4) && wm) + wbc->item=wm->item; + else + wbc->item.type=type_none; + } + if ((flags & 256) || (flags & 1024)) { + struct displaylist_handle *dlh; + struct displaylist *display; + struct attr attr; + struct point p; + struct transformation *trans; + + char *text, *label; + struct map_selection *sel; + GList *l, *ll; + + c.x=pc.x; + c.y=pc.y; + + trans=navit_get_trans(this->nav); + transform(trans,pc.pro,&c,&p,1,0,0,0); + display=navit_get_displaylist(this->nav); + dlh=graphics_displaylist_open(display); + sel=displaylist_get_selection(display); + l=displaylist_get_clicked_list(display, &p, this->radius); + for(ll=l;ll;ll=g_list_next(ll)) { + struct displayitem *di; + struct item *item; + struct map_rect *mr; + struct item *itemo; + + di=(struct displayitem*)ll->data; + item=graphics_displayitem_get_item(di); + + mr=map_rect_new(item->map, sel); + itemo=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); + + if (item_attr_get(itemo, attr_label, &attr)) { + label=map_convert_string(itemo->map, attr.u.str); + text=g_strdup_printf("%s %s", item_to_name(item->type), label); + map_convert_free(label); + } else + text=g_strdup_printf("%s", item_to_name(item->type)); + gui_internal_widget_append(w, + wc=gui_internal_button_new_with_callback(this, text, + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_position, (void *)2)); + wc->c=pc; + wc->name=g_strdup(text); + wc->item=*itemo; + g_free(text); + map_rect_destroy(mr); + if(!wclosest) + wclosest=wc; + + } + g_list_free(l); + map_selection_destroy(sel); + graphics_displaylist_close(dlh); + } + if (flags & 512) { + gui_internal_widget_append(w, + wbc=gui_internal_button_new_with_callback(this, _("Cut Bookmark"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_cut_bookmark, NULL)); + wbc->text=g_strdup(wm->text); + gui_internal_widget_append(w, + wbc=gui_internal_button_new_with_callback(this, _("Copy Bookmark"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_copy_bookmark, NULL)); + wbc->text=g_strdup(wm->text); + gui_internal_widget_append(w, + wbc=gui_internal_button_new_with_callback(this, _("Rename Bookmark"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_rename_bookmark, NULL)); + wbc->text=g_strdup(wm->text); + gui_internal_widget_append(w, + wbc=gui_internal_button_new_with_callback(this, _("Paste Bookmark"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_paste_bookmark, NULL)); + gui_internal_widget_append(w, + wbc=gui_internal_button_new_with_callback(this, _("Delete Bookmark"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_delete_bookmark, NULL)); + wbc->text=g_strdup(wm->text); + } + gui_internal_menu_render(this); + + if((flags & 1024) && wclosest) + gui_internal_cmd_view_attributes(this,wclosest,wclosest->data); +} + + +/* wm->data: 0 Nothing special + 1 Map Point + 2 Item + 3 Town + 4 County + 5 Street + 6 House number + 7 Bookmark + 8 Former destination +*/ + +static void +gui_internal_cmd_position(struct gui_priv *this, struct widget *wm, void *data) +{ + int flags; + switch ((long) wm->data) { + case 0: + flags=8|16|32|64|128|256; + break; + case 1: + flags=8|16|32|64|256; + break; + case 2: + flags=4|8|16|32|64|128; + break; + case 3: + flags=1|8|16|32|64|128; + flags &= this->flags_town; + break; + case 4: + gui_internal_search_town_in_country(this, wm); + return; + case 5: + flags=2|8|16|32|64|128; + flags &= this->flags_street; + break; + case 6: + flags=8|16|32|64|128; + flags &= this->flags_house_number; + break; + case 7: + flags=8|16|64|128|512; + break; + case 8: + flags=8|16|32|64|128; + break; + default: + return; + } + switch (flags) { + case 2: + gui_internal_search_house_number_in_street(this, wm, NULL); + return; + case 8: + gui_internal_cmd_set_destination(this, wm, NULL); + return; + } + gui_internal_cmd_position_do(this, &wm->c, NULL, wm, wm->name ? wm->name : wm->text, flags); +} + +static void +gui_internal_cmd2_position(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + char *name=_("Position"); + int flags=-1; + + dbg(1,"enter\n"); + if (!in || !in[0]) + return; + if (!ATTR_IS_COORD_GEO(in[0]->type)) + return; + if (in[1] && ATTR_IS_STRING(in[1]->type)) { + name=in[1]->u.str; + if (in[2] && ATTR_IS_INT(in[2]->type)) + flags=in[2]->u.num; + } + dbg(1,"flags=0x%x\n",flags); + gui_internal_cmd_position_do(this, NULL, in[0]->u.coord_geo, NULL, name, flags); +} + +static void +gui_internal_cmd2_pois(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + struct widget *w; + struct poi_param *param; + struct attr pro; + struct coord c; + + dbg(1,"enter\n"); + if (!in || !in[0]) + return; + if (!ATTR_IS_COORD_GEO(in[0]->type)) + return; + if (!navit_get_attr(this->nav, attr_projection, &pro, NULL)) + return; + w=g_new0(struct widget,1); + param=g_new0(struct poi_param,1); + if (in[1] && ATTR_IS_STRING(in[1]->type)) { + gui_internal_poi_param_set_filter(param, in[1]->u.str); + if (in[2] && ATTR_IS_INT(in[2]->type)) + param->isAddressFilter=in[2]->u.num; + } + + transform_from_geo(pro.u.projection,in[0]->u.coord_geo,&c); + w->c.x=c.x; + w->c.y=c.y; + w->c.pro=pro.u.projection; + gui_internal_cmd_pois(this, w, param); + g_free(w); + gui_internal_poi_param_free(param); +} + + +/** + * The "Bookmarks" section of the OSD + * + */ + +static void +gui_internal_cmd_bookmarks(struct gui_priv *this, struct widget *wm, void *data) +{ + struct attr attr,mattr; + struct item *item; + char *label_full,*prefix=0; + int plen=0,hassub,found=0; + struct widget *wb,*w,*wbm; + struct coord c; + struct widget *tbl, *row; + + if (data) + prefix=g_strdup(data); + else { + if (wm && wm->prefix) + prefix=g_strdup(wm->prefix); + } + if ( prefix ) + plen=strlen(prefix); + + gui_internal_prune_menu_count(this, 1, 0); + wb=gui_internal_menu(this, _("Bookmarks")); + wb->background=this->background; + w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + w->spy=this->spacing*3; + gui_internal_widget_append(wb, w); + + if(navit_get_attr(this->nav, attr_bookmarks, &mattr, NULL) ) { + if (!plen) { + bookmarks_move_root(mattr.u.bookmarks); + } else { + if (!strcmp(prefix,"..")) { + bookmarks_move_up(mattr.u.bookmarks); + g_free(prefix); + prefix=g_strdup(bookmarks_item_cwd(mattr.u.bookmarks)); + if (prefix) { + plen=strlen(prefix); + } else { + plen=0; + } + } else { + bookmarks_move_down(mattr.u.bookmarks,prefix); + } + + // "Back" button, when inside a bookmark folder + + if (plen) { + wbm=gui_internal_button_new_with_callback(this, "..", + image_new_xs(this, "gui_inactive"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_bookmarks, NULL); + wbm->prefix=g_strdup(".."); + gui_internal_widget_append(w, wbm); + } + } + + // Adds the Bookmark folders + wbm=gui_internal_button_new_with_callback(this, _("Add Bookmark folder"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_add_bookmark_folder2, NULL); + gui_internal_widget_append(w, wbm); + + // Pastes the Bookmark + wbm=gui_internal_button_new_with_callback(this, _("Paste bookmark"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_paste_bookmark, NULL); + gui_internal_widget_append(w, wbm); + + bookmarks_item_rewind(mattr.u.bookmarks); + + tbl=gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand |orientation_vertical,1); + gui_internal_widget_append(w,tbl); + + while ((item=bookmarks_get_item(mattr.u.bookmarks))) { + if (!item_attr_get(item, attr_label, &attr)) continue; + label_full=attr.u.str; + dbg(0,"full_labled: %s\n",label_full); + + // hassub == 1 if the item type is a sub-folder + if (item->type == type_bookmark_folder) { + hassub=1; + } else { + hassub=0; + } + + row=gui_internal_widget_table_row_new(this,gravity_left| flags_fill| orientation_horizontal); + gui_internal_widget_append(tbl, row); + wbm=gui_internal_button_new_with_callback(this, label_full, + image_new_xs(this, hassub ? "gui_inactive" : "gui_active" ), gravity_left_center|orientation_horizontal|flags_fill, + hassub ? gui_internal_cmd_bookmarks : gui_internal_cmd_position, NULL); + + gui_internal_widget_append(row,wbm); + if (item_coord_get(item, &c, 1)) { + wbm->c.x=c.x; + wbm->c.y=c.y; + wbm->c.pro=bookmarks_get_projection(mattr.u.bookmarks); + wbm->name=g_strdup_printf(_("Bookmark %s"),label_full); + wbm->text=g_strdup(label_full); + if (!hassub) { + wbm->data=(void*)7;//Mark us as a bookmark + } + wbm->prefix=g_strdup(label_full); + } else { + gui_internal_widget_destroy(this, row); + } + } + } + if (plen) { + g_free(prefix); + } + if (found) + gui_internal_check_exit(this); + else + gui_internal_menu_render(this); +} + +static void +gui_internal_cmd2_bookmarks(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + char *str=NULL; + if (in && in[0] && ATTR_IS_STRING(in[0]->type)) { + str=in[0]->u.str; + } + gui_internal_cmd_bookmarks(this, NULL, str); +} + + +static void +gui_internal_cmd_formerdests(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + struct widget *wb,*w,*wbm,*tbl=NULL; + struct map *formerdests; + struct map_rect *mr_formerdests; + struct item *item; + struct attr attr; + char *label_full; + enum projection projection; + + gui_internal_prune_menu_count(this, 1, 0); + wb=gui_internal_menu(this, _("Former Destinations")); + wb->background=this->background; + + w=gui_internal_box_new(this, + gravity_top_center|orientation_vertical|flags_expand|flags_fill); + w->spy=this->spacing*2; + gui_internal_widget_append(wb, w); + + formerdests=read_former_destinations_from_file(); + mr_formerdests=map_rect_new(formerdests, NULL); + projection = map_projection(formerdests); + while ((item=map_rect_get_item(mr_formerdests))) { + struct coord c; + struct widget *row; + if (!item_attr_get(item, attr_label, &attr)) continue; + if(!tbl) { + tbl=gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand | orientation_vertical,1); + gui_internal_widget_append(w,tbl); + } + row=gui_internal_widget_table_row_new(this,gravity_left| flags_fill| orientation_vertical); + gui_internal_widget_prepend(tbl, row); + label_full=attr.u.str; + wbm=gui_internal_button_new_with_callback(this, label_full, + image_new_xs(this, "gui_active"), + gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_position, NULL); + gui_internal_widget_append(row,wbm); + if (item_coord_get(item, &c, 1)) { + wbm->c.x=c.x; + wbm->c.y=c.y; + wbm->c.pro=projection; + wbm->name=g_strdup(label_full); + wbm->text=g_strdup(label_full); + wbm->data=(void*)8; //Mark us as a former destination + wbm->prefix=g_strdup(label_full); + } + } + if (!tbl){ + wbm=gui_internal_text_new(this, _("- No former destinations available -"), + gravity_left_center|orientation_horizontal|flags_fill); + gui_internal_widget_append(w, wbm); + } + gui_internal_menu_render(this); + map_rect_destroy(mr_formerdests); +} + +static void +gui_internal_keynav_highlight_next(struct gui_priv *this, int dx, int dy); + +static void gui_internal_keypress_do(struct gui_priv *this, char *key) +{ + struct widget *wi,*menu,*search_list; + int len=0; + char *text=NULL; + + menu=g_list_last(this->root.children)->data; + wi=gui_internal_find_widget(menu, NULL, STATE_EDIT); + if (wi) { + /* select first item of the searchlist */ + if (*key == NAVIT_KEY_RETURN && (search_list=gui_internal_menu_data(this)->search_list)) { + GList *l=search_list->children; + if (l && l->data) + gui_internal_highlight_do(this, l->data); + return; + } else if (*key == NAVIT_KEY_BACKSPACE) { + dbg(0,"backspace\n"); + if (wi->text && wi->text[0]) { + len=g_utf8_prev_char(wi->text+strlen(wi->text))-wi->text; + wi->text[len]=' '; + text=g_strdup_printf("%s ", wi->text); + } + } else { + if (wi->state & STATE_CLEAR) { + dbg(0,"wi->state=0x%x\n", wi->state); + g_free(wi->text); + wi->text=NULL; + wi->state &= ~STATE_CLEAR; + dbg(0,"wi->state=0x%x\n", wi->state); + } + text=g_strdup_printf("%s%s", wi->text ? wi->text : "", key); + } + g_free(wi->text); + wi->text=text; + if (*key == NAVIT_KEY_BACKSPACE && wi->text) { + gui_internal_widget_render(this, wi); + wi->text[len]='\0'; + } + if (wi->func) { + wi->reason=2; + wi->func(this, wi, wi->data); + } + gui_internal_widget_render(this, wi); + } +} + + +static void +gui_internal_cmd_keypress(struct gui_priv *this, struct widget *wm, void *data) +{ + struct menu_data *md=gui_internal_menu_data(this); + gui_internal_keypress_do(this, (char *) wm->data); + // Switch to lowercase after the first key is pressed + if (md->keyboard_mode == 2) // Latin + gui_internal_keyboard_do(this, md->keyboard, 10); + if (md->keyboard_mode == 26) // Umlaut + gui_internal_keyboard_do(this, md->keyboard, 34); + if ((md->keyboard_mode & ~7) == 40) // Russian/Ukrainian/Belorussian + gui_internal_keyboard_do(this, md->keyboard, 48); +} + +static void +gui_internal_search_idle_end(struct gui_priv *this) +{ + if (this->idle) { + event_remove_idle(this->idle); + this->idle=NULL; + } + if (this->idle_cb) { + callback_destroy(this->idle_cb); + this->idle_cb=NULL; + } +} + +static char * +postal_str(struct search_list_result *res, int level) +{ + char *ret=NULL; + if (res->town->common.postal) + ret=res->town->common.postal; + if (res->town->common.postal_mask) + ret=res->town->common.postal_mask; + if (level == 1) + return ret; + if (res->street->common.postal) + ret=res->street->common.postal; + if (res->street->common.postal_mask) + ret=res->street->common.postal_mask; + if (level == 2) + return ret; + if (res->house_number->common.postal) + ret=res->house_number->common.postal; + if (res->house_number->common.postal_mask) + ret=res->house_number->common.postal_mask; + return ret; +} + +static char * +district_str(struct search_list_result *res, int level) +{ + char *ret=NULL; + if (res->town->common.district_name) + ret=res->town->common.district_name; + if (level == 1) + return ret; + if (res->street->common.district_name) + ret=res->street->common.district_name; + if (level == 2) + return ret; + if (res->house_number->common.district_name) + ret=res->house_number->common.district_name; + return ret; +} + +static char * +town_str(struct search_list_result *res, int level, int flags) +{ + char *town=res->town->common.town_name; + char *district=district_str(res, level); + char *postal=postal_str(res, level); + char *postal_sep=" "; + char *district_begin=" ("; + char *district_end=")"; + char *county_sep = ", Co. "; + char *county = res->town->common.county_name; + if (!postal) + postal_sep=postal=""; + if (!district || (flags & 1)) + district_begin=district_end=district=""; + if (!county) + county_sep=county=""; + + return g_strdup_printf("%s%s%s%s%s%s%s%s", postal, postal_sep, town, district_begin, district, district_end, county_sep, county); +} + +static int gui_internal_search_cmp(gconstpointer _a, gconstpointer _b) +{ + struct widget *a=(struct widget *)_a, *b=(struct widget *)_b; + char *sa,*sb; + int r; + if(!b) + if((!a || a->type!=widget_table_row || !a->text) && (!b || b->type!=widget_table_row || !b->text)) + return 0; + if(!a || a->type!=widget_table_row || !a->text) + return -1; + if(!b || b->type!=widget_table_row || !b->text) + return 1; + r=a->datai-b->datai; + if(r<0) + return -1; + if(r>0) + return 1; + sa=removecase(a->text); + sb=removecase(b->text); + r=strcmp(sa,sb); + g_free(sa); + g_free(sb); + return r; +} + +static void +gui_internal_search_idle(struct gui_priv *this, char *wm_name, struct widget *search_list, void *param) +{ + char *text=NULL,*text2=NULL,*name=NULL; + struct search_list_result *res; + struct widget *wc; + struct item *item=NULL; + GList *l; + static char possible_keys[256]=""; + struct widget *wi=NULL; + + res=search_list_get_result(this->sl); + if (res) { + gchar* trunk_name = NULL; + + struct widget *menu=g_list_last(this->root.children)->data; + wi=gui_internal_find_widget(menu, NULL, STATE_EDIT); + + if (wi) { + if (! strcmp(wm_name,"Town")) + trunk_name = g_strrstr(res->town->common.town_name, wi->text); + if (! strcmp(wm_name,"Street")) + { + name=res->street->name; + if (name) + trunk_name = g_strrstr(name, wi->text); + else + trunk_name = NULL; + } + + if (trunk_name) { + char next_char = trunk_name[strlen(wi->text)]; + int i; + int len = strlen(possible_keys); + for(i = 0; (itext)]; + possible_keys[len+1]='\0'; + } + dbg(1,"%s %s possible_keys:%s \n", wi->text, res->town->common.town_name, possible_keys); + } + } else { + dbg(0, "Unable to find widget"); + } + } + + if (! res) { + struct menu_data *md; + gui_internal_search_idle_end(this); + + md=gui_internal_menu_data(this); + if (md && md->keyboard && !(this->flags & 2048)) { + GList *lk=md->keyboard->children; + graphics_draw_mode(this->gra, draw_mode_begin); + while (lk) { + struct widget *child=lk->data; + GList *lk2=child->children; + while (lk2) { + struct widget *child_=lk2->data; + lk2=g_list_next(lk2); + if (child_->data && strcmp("\b", child_->data)) { // FIXME don't disable special keys + if (strlen(possible_keys) == 0) + child_->state|= STATE_HIGHLIGHTED|STATE_VISIBLE|STATE_SENSITIVE|STATE_CLEAR ; + else if (g_strrstr(possible_keys, child_->data)!=NULL ) { + child_->state|= STATE_HIGHLIGHTED|STATE_VISIBLE|STATE_SENSITIVE|STATE_CLEAR ; + } else { + child_->state&= ~(STATE_HIGHLIGHTED|STATE_VISIBLE|STATE_SELECTED) ; + } + gui_internal_widget_render(this,child_); + } + } + lk=g_list_next(lk); + } + gui_internal_widget_render(this,md->keyboard); + graphics_draw_mode(this->gra, draw_mode_end); + } + + possible_keys[0]='\0'; + return; + } + + if (! strcmp(wm_name,"Country")) { + name=res->country->name; + item=&res->country->common.item; + text=g_strdup_printf("%s", res->country->name); + } + if (! strcmp(wm_name,"Town")) { + item=&res->town->common.item; + name=res->town->common.town_name; + text=town_str(res, 1, 0); + } + if (! strcmp(wm_name,"Street")) { + name=res->street->name; + item=&res->street->common.item; + text=g_strdup(res->street->name); + text2=town_str(res, 2, 1); + } + if (! strcmp(wm_name,"House number")) { + name=res->house_number->house_number; + text=g_strdup_printf("%s %s", res->street->name, name); + text2=town_str(res, 3, 0); + } + dbg(1,"res->country->flag=%s\n", res->country->flag); + struct widget *wr; + wr=gui_internal_widget_table_row_new(this, gravity_left|orientation_horizontal|flags_fill); + + if (!text2) { + wr->text=g_strdup(text); + gui_internal_widget_insert_sorted(search_list, wr, gui_internal_search_cmp); + gui_internal_widget_append(wr, + wc=gui_internal_button_new_with_callback(this, text, + image_new_xs(this, res->country->flag), + gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_position, param)); + } else { + struct widget *wb; + wr->text=g_strdup_printf("%s %s",text,text2); + + if (! strcmp(wm_name,"House number") && !res->street->name) { + wr->datai=1000; + } else if(name) { + if(!wi) + dbg(0,"search text widget is NULL\n"); + if(wi && strlen(name)==strlen(wi->text)) { + dbg(1,"xact %s %s\n",name, wi->text); + wr->datai=-1000; + } else { + dbg(1,"not xact %s %s\n",name, wi->text); + wr->datai=0; + } + } + gui_internal_widget_insert_sorted(search_list, wr, gui_internal_search_cmp); + + wc=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); + gui_internal_widget_append(wr, wc); + gui_internal_widget_append(wc, gui_internal_image_new(this, image_new_xs(this, res->country->flag))); + wb=gui_internal_box_new(this, gravity_left_center|orientation_vertical|flags_fill); + gui_internal_widget_append(wc, wb); + gui_internal_widget_append(wb, gui_internal_label_new(this, text)); + gui_internal_widget_append(wb, gui_internal_label_font_new(this, text2, 1)); + wc->func=gui_internal_cmd_position; + wc->data=param; + wc->state |= STATE_SENSITIVE; + wc->speech=g_strdup(text); + } + wc->name=g_strdup(name); + if (res->c) + wc->c=*res->c; + wc->selection_id=res->id; + if (item) + wc->item=*item; + gui_internal_widget_pack(this, search_list); + l=g_list_last(this->root.children); + graphics_draw_mode(this->gra, draw_mode_begin); + gui_internal_widget_render(this, l->data); + graphics_draw_mode(this->gra, draw_mode_end); + g_free(text); + g_free(text2); +} + +static void +gui_internal_search_idle_start(struct gui_priv *this, char *wm_name, struct widget *search_list, void *param) +{ + this->idle_cb=callback_new_4(callback_cast(gui_internal_search_idle), this, wm_name, search_list, param); + this->idle=event_add_idle(50,this->idle_cb); + callback_call_0(this->idle_cb); +} + + +/** + * + * @param wm The widget that generated the event for the search changed, + * if this was generated by a key on the virtual keyboard then + * wm is the key button widget. + */ +static void +gui_internal_search_changed(struct gui_priv *this, struct widget *wm, void *data) +{ + GList *l; + struct widget *search_list=gui_internal_menu_data(this)->search_list; + void *param=(void *)3; + int minlen=1; + + gui_internal_widget_table_clear(this, search_list); + + if (! strcmp(wm->name,"Country")) + param=(void *)4; + if (! strcmp(wm->name,"Street")) + param=(void *)5; + if (! strcmp(wm->name,"House number")) + param=(void *)6; + dbg(0,"%s now '%s'\n", wm->name, wm->text); + + gui_internal_search_idle_end(this); + if (wm->text && g_utf8_strlen(wm->text, -1) >= minlen) { + struct attr search_attr; + + dbg(0,"process\n"); + if (! strcmp(wm->name,"Country")) + search_attr.type=attr_country_all; + if (! strcmp(wm->name,"Town")) + search_attr.type=attr_town_or_district_name; + if (! strcmp(wm->name,"Street")) + search_attr.type=attr_street_name; + if (! strcmp(wm->name,"House number")) + search_attr.type=attr_house_number; + search_attr.u.str=wm->text; + search_list_search(this->sl, &search_attr, 1); + gui_internal_search_idle_start(this, wm->name, search_list, param); + } + l=g_list_last(this->root.children); + gui_internal_widget_render(this, l->data); +} + +static struct widget * +gui_internal_keyboard_key_data(struct gui_priv *this, struct widget *wkbd, char *text, int font, void(*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data, void (*data_free)(void *data), int w, int h) +{ + struct widget *wk; + gui_internal_widget_append(wkbd, wk=gui_internal_button_font_new_with_callback(this, text, font, + NULL, gravity_center|orientation_vertical, func, data)); + wk->data_free=data_free; + wk->background=this->background; + wk->bl=0; + wk->br=0; + wk->bt=0; + wk->bb=0; + wk->w=w; + wk->h=h; + return wk; +} + +static struct widget * +gui_internal_keyboard_key(struct gui_priv *this, struct widget *wkbd, char *text, char *key, int w, int h) +{ + return gui_internal_keyboard_key_data(this, wkbd, text, 0, gui_internal_cmd_keypress, g_strdup(key), g_free_func,w,h); +} + +static void gui_internal_keyboard_change(struct gui_priv *this, struct widget *key, void *data); + + +// A list of availiable keyboard modes. +struct gui_internal_keyb_mode { + char title[16]; // Label to be displayed on keys that switch to it + int font; // Font size of label + int case_mode; // Mode to switch to when case CHANGE() key is pressed. + int umlaut_mode; // Mode to switch to when UMLAUT() key is pressed. +} gui_internal_keyb_modes[]= { + /* 0*/ {"ABC", 2, 8, 24}, + /* 8*/ {"abc", 2, 0, 32}, + /*16*/ {"123", 2, 0, 24}, + /*24*/ {"ÄÖÜ", 2, 40, 0}, + /*32*/ {"äöü", 2, 32, 8}, + /*40*/ {"АБВ", 2, 48, 0}, + /*48*/ {"абв", 2, 40, 8} +}; + + +// Some macros that make the keyboard layout easier to visualise in +// the source code. The macros are #undef'd after this function. +#define KEY(x) gui_internal_keyboard_key(this, wkbd, (x), (x), max_w, max_h) +#define SPACER() gui_internal_keyboard_key_data(this, wkbd, "", 0, NULL, NULL, NULL,max_w,max_h) +#define MODE(x) gui_internal_keyboard_key_data(this, wkbd, \ + gui_internal_keyb_modes[(x)/8].title, \ + gui_internal_keyb_modes[(x)/8].font, \ + gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h) \ + -> datai=(mode&7)+((x)&~7) +#define SWCASE() MODE(gui_internal_keyb_modes[mode/8].case_mode) +#define UMLAUT() MODE(gui_internal_keyb_modes[mode/8].umlaut_mode) +static struct widget * +gui_internal_keyboard_do(struct gui_priv *this, struct widget *wkbdb, int mode) +{ + struct widget *wkbd,*wk; + struct menu_data *md=gui_internal_menu_data(this); + int i, max_w=this->root.w, max_h=this->root.h; + int render=0; + char *space="_"; + char *backspace="←"; + char *hide="▼"; + char *unhide="▲"; + + if (wkbdb) { + this->current.x=-1; + this->current.y=-1; + gui_internal_highlight(this); + if (md->keyboard_mode >= 1024) + render=2; + else + render=1; + gui_internal_widget_children_destroy(this, wkbdb); + } else + wkbdb=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_fill); + md->keyboard=wkbdb; + md->keyboard_mode=mode; + wkbd=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_fill); + wkbd->background=this->background; + wkbd->cols=8; + wkbd->spx=0; + wkbd->spy=0; + max_w=max_w/8; + max_h=max_h/8; // Allows 3 results in the list when searching for Towns + wkbd->p.y=max_h*2; + if(mode>=40&&mode<56) { // Russian/Ukrainian/Belarussian layout needs more space... + max_h=max_h*4/5; + max_w=max_w*8/9; + wkbd->cols=9; + } + + if (mode >= 0 && mode < 8) { + for (i = 0 ; i < 26 ; i++) { + char text[]={'A'+i,'\0'}; + KEY(text); + } + gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h); + if (mode == 0) { + KEY("-"); + KEY("'"); + wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); + wk->datai=mode+1024; + } else { + wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); + wk->datai=mode+1024; + SWCASE(); + MODE(16); + + } + UMLAUT(); + gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); + } + if (mode >= 8 && mode < 16) { + for (i = 0 ; i < 26 ; i++) { + char text[]={'a'+i,'\0'}; + KEY(text); + } + gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h); + if (mode == 8) { + KEY("-"); + KEY("'"); + wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); + wk->datai=mode+1024; + } else { + wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); + wk->datai=mode+1024; + SWCASE(); + + MODE(16); + } + UMLAUT(); + gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); + } + if (mode >= 16 && mode < 24) { + for (i = 0 ; i < 10 ; i++) { + char text[]={'0'+i,'\0'}; + KEY(text); + } + KEY("."); KEY("°"); KEY("'"); KEY("\""); KEY("-"); KEY("+"); + KEY("*"); KEY("/"); KEY("("); KEY(")"); KEY("="); KEY("?"); + + + + if (mode == 16) { + for (i = 0 ; i < 5 ; i++) SPACER(); + KEY("-"); + KEY("'"); + wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); + wk->datai=mode+1024; + } else { + for (i = 0 ; i < 3 ; i++) SPACER(); + MODE(40); + MODE(48); + wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); + wk->datai=mode+1024; + MODE(0); + MODE(8); + } + UMLAUT(); + gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); + } + if (mode >= 24 && mode < 32) { + KEY("Ä"); KEY("Ë"); KEY("Ï"); KEY("Ö"); KEY("Ü"); KEY("Æ"); KEY("Ø"); KEY("Å"); + KEY("Á"); KEY("É"); KEY("Í"); KEY("Ó"); KEY("Ú"); KEY("Å "); KEY("Č"); KEY("Ž"); + KEY("À"); KEY("È"); KEY("Ì"); KEY("Ò"); KEY("Ù"); KEY("Ś"); KEY("Ć"); KEY("Ź"); + KEY("Â"); KEY("Ê"); KEY("Î"); KEY("Ô"); KEY("Û"); SPACER(); + + UMLAUT(); + + gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); + } + if (mode >= 32 && mode < 40) { + KEY("ä"); KEY("ë"); KEY("ï"); KEY("ö"); KEY("ü"); KEY("æ"); KEY("ø"); KEY("Ã¥"); + KEY("á"); KEY("é"); KEY("í"); KEY("ó"); KEY("ú"); KEY("Å¡"); KEY("č"); KEY("ž"); + KEY("à"); KEY("è"); KEY("ì"); KEY("ò"); KEY("ù"); KEY("ś"); KEY("ć"); KEY("ź"); + KEY("â"); KEY("ê"); KEY("î"); KEY("ô"); KEY("û"); KEY("ß"); + + UMLAUT(); + + gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); + } + if (mode >= 40 && mode < 48) { + KEY("А"); KEY("Б"); KEY("В"); KEY("Г"); KEY("Д"); KEY("Е"); KEY("Ж"); KEY("З"); KEY("И"); + KEY("Й"); KEY("К"); KEY("Л"); KEY("М"); KEY("Н"); KEY("О"); KEY("П"); KEY("Р"); KEY("С"); + KEY("Т"); KEY("У"); KEY("Ф"); KEY("Ð¥"); KEY("Ц"); KEY("Ч"); KEY("Ш"); KEY("Щ"); KEY("Ъ"); + KEY("Ы"); KEY("Ь"); KEY("Э"); KEY("Ю"); KEY("Я"); KEY("Ё"); KEY("І"); KEY("Ї"); KEY("Ў"); + SPACER(); SPACER(); SPACER(); + gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h); + + wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); + wk->datai=mode+1024; + + SWCASE(); + + MODE(16); + + SPACER(); + + gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); + } + if (mode >= 48 && mode < 56) { + KEY("а"); KEY("б"); KEY("в"); KEY("г"); KEY("д"); KEY("е"); KEY("ж"); KEY("з"); KEY("и"); + KEY("й"); KEY("к"); KEY("л"); KEY("м"); KEY("н"); KEY("о"); KEY("п"); KEY("р"); KEY("с"); + KEY("т"); KEY("у"); KEY("ф"); KEY("х"); KEY("ц"); KEY("ч"); KEY("ш"); KEY("щ"); KEY("ъ"); + KEY("ы"); KEY("ь"); KEY("э"); KEY("ю"); KEY("я"); KEY("ё"); KEY("і"); KEY("ї"); KEY("ў"); + SPACER(); SPACER(); SPACER(); + gui_internal_keyboard_key(this, wkbd, space," ",max_w,max_h); + + wk=gui_internal_keyboard_key_data(this, wkbd, hide, 0, gui_internal_keyboard_change, wkbdb, NULL,max_w,max_h); + wk->datai=mode+1024; + + SWCASE(); + + MODE(16); + + SPACER(); + + gui_internal_keyboard_key(this, wkbd, backspace,"\b",max_w,max_h); + } + + + if(md->search_list && md->search_list->type==widget_table) { + struct table_data *td=(struct table_data*)(md->search_list->data); + td->button_box_hide=mode<1024; + } + + if (mode >= 1024) { + char *text=NULL; + int font=0; + struct widget *wkl; + mode -= 1024; + text=gui_internal_keyb_modes[mode/8].title; + font=gui_internal_keyb_modes[mode/8].font; + wk=gui_internal_box_new(this, gravity_center|orientation_horizontal|flags_fill); + wk->func=gui_internal_keyboard_change; + wk->data=wkbdb; + wk->background=this->background; + wk->bl=0; + wk->br=0; + wk->bt=0; + wk->bb=0; + wk->w=max_w; + wk->h=max_h; + wk->datai=mode; + wk->state |= STATE_SENSITIVE; + gui_internal_widget_append(wk, wkl=gui_internal_label_new(this, unhide)); + wkl->background=NULL; + gui_internal_widget_append(wk, wkl=gui_internal_label_font_new(this, text, font)); + wkl->background=NULL; + gui_internal_widget_append(wkbd, wk); + if (render) + render=2; + } + gui_internal_widget_append(wkbdb, wkbd); + if (render == 1) { + gui_internal_widget_pack(this, wkbdb); + gui_internal_widget_render(this, wkbdb); + } else if (render == 2) { + gui_internal_menu_reset_pack(this); + gui_internal_menu_render(this); + } + return wkbdb; +} +#undef KEY +#undef SPACER +#undef SWCASE +#undef UMLAUT +#undef MODE + +static struct widget * +gui_internal_keyboard(struct gui_priv *this, int mode) +{ + if (! this->keyboard) + return NULL; + return gui_internal_keyboard_do(this, NULL, mode); +} + +static void +gui_internal_keyboard_change(struct gui_priv *this, struct widget *key, void *data) +{ + gui_internal_keyboard_do(this, key->data, key->datai); +} + +static void +gui_internal_search_list_set_default_country(struct gui_priv *this) +{ + struct attr search_attr, country_name, country_iso2, *country_attr; + struct item *item; + struct country_search *cs; + struct tracking *tracking; + struct search_list_result *res; + + country_attr=country_default(); + tracking=navit_get_tracking(this->nav); + if (tracking && tracking_get_attr(tracking, attr_country_id, &search_attr, NULL)) + country_attr=&search_attr; + if (country_attr) { + cs=country_search_new(country_attr, 0); + item=country_search_get_item(cs); + if (item && item_attr_get(item, attr_country_name, &country_name)) { + search_attr.type=attr_country_all; + dbg(0,"country %s\n", country_name.u.str); + search_attr.u.str=country_name.u.str; + search_list_search(this->sl, &search_attr, 0); + while((res=search_list_get_result(this->sl))); + if(this->country_iso2) { + g_free(this->country_iso2); + this->country_iso2=NULL; + } + if (item_attr_get(item, attr_country_iso2, &country_iso2)) + this->country_iso2=g_strdup(country_iso2.u.str); + } + country_search_destroy(cs); + } else { + dbg(0,"warning: no default country found\n"); + if (this->country_iso2) { + dbg(0,"attempting to use country '%s'\n",this->country_iso2); + search_attr.type=attr_country_iso2; + search_attr.u.str=this->country_iso2; + search_list_search(this->sl, &search_attr, 0); + while((res=search_list_get_result(this->sl))); + } + } +} + +static void +gui_internal_search_list_new(struct gui_priv *this) +{ + struct mapset *ms=navit_get_mapset(this->nav); + if (! this->sl) { + this->sl=search_list_new(ms); + gui_internal_search_list_set_default_country(this); + } +} + +static void +gui_internal_search_list_destroy(struct gui_priv *this) +{ + if (this->sl) { + search_list_destroy(this->sl); + this->sl=NULL; + } +} + + +static void +gui_internal_search(struct gui_priv *this, char *what, char *type, int flags) +{ + struct widget *wb,*wk,*w,*wr,*we,*wl,*wnext=NULL; + char *country; + int keyboard_mode=2; + gui_internal_search_list_new(this); + wb=gui_internal_menu(this, what); + w=gui_internal_box_new(this, gravity_center|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(wb, w); + wr=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(w, wr); + we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); + gui_internal_widget_append(wr, we); + if (!strcmp(type,"Country")) { + wnext=gui_internal_image_new(this, image_new_xs(this, "gui_select_town")); + wnext->func=gui_internal_search_town; + } else if (!strcmp(type,"Town")) { + if (this->country_iso2) { +#if HAVE_API_ANDROID + char country_iso2[strlen(this->country_iso2)+1]; + strtolower(country_iso2, this->country_iso2); + country=g_strdup_printf("country_%s", country_iso2); +#else + country=g_strdup_printf("country_%s", this->country_iso2); +#endif + } else + country=g_strdup("gui_select_country"); + gui_internal_widget_append(we, wb=gui_internal_image_new(this, image_new_xs(this, country))); + wb->state |= STATE_SENSITIVE; + if (flags) + wb->func = gui_internal_search_country; + else + wb->func = gui_internal_back; + wnext=gui_internal_image_new(this, image_new_xs(this, "gui_select_street")); + wnext->func=gui_internal_search_street; + g_free(country); + } else if (!strcmp(type,"Street")) { + gui_internal_widget_append(we, wb=gui_internal_image_new(this, image_new_xs(this, "gui_select_town"))); + wb->state |= STATE_SENSITIVE; + wb->func = gui_internal_back; + wnext=gui_internal_image_new(this, image_new_xs(this, "gui_select_house_number")); + wnext->func=gui_internal_search_house_number; + } else if (!strcmp(type,"House number")) { + gui_internal_widget_append(we, wb=gui_internal_image_new(this, image_new_xs(this, "gui_select_street"))); + wb->state |= STATE_SENSITIVE; + wb->func = gui_internal_back; + keyboard_mode=18; + } + gui_internal_widget_append(we, wk=gui_internal_label_new(this, NULL)); + if (wnext) { + gui_internal_widget_append(we, wnext); + wnext->state |= STATE_SENSITIVE; + } + wl=gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand |orientation_vertical,1);//gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(wr, wl); + gui_internal_menu_data(this)->search_list=wl; + wk->state |= STATE_EDIT|STATE_EDITABLE; + wk->background=this->background; + wk->flags |= flags_expand|flags_fill; + wk->func = gui_internal_search_changed; + wk->name=g_strdup(type); + if (this->keyboard) + gui_internal_widget_append(w, gui_internal_keyboard(this,keyboard_mode)); + gui_internal_menu_render(this); +} + +static void +gui_internal_search_house_number(struct gui_priv *this, struct widget *widget, void *data) +{ + search_list_select(this->sl, attr_street_name, 0, 0); + gui_internal_search(this,_("House number"),"House number",0); +} + +static void +gui_internal_search_house_number_in_street(struct gui_priv *this, struct widget *widget, void *data) +{ + dbg(0,"id %d\n", widget->selection_id); + search_list_select(this->sl, attr_street_name, 0, 0); + search_list_select(this->sl, attr_street_name, widget->selection_id, 1); + gui_internal_search(this,_("House number"),"House number",0); +} + +static void +gui_internal_search_street(struct gui_priv *this, struct widget *widget, void *data) +{ + search_list_select(this->sl, attr_town_or_district_name, 0, 0); + gui_internal_search(this,_("Street"),"Street",0); +} + +static void +gui_internal_search_street_in_town(struct gui_priv *this, struct widget *widget, void *data) +{ + dbg(0,"id %d\n", widget->selection_id); + search_list_select(this->sl, attr_town_or_district_name, 0, 0); + search_list_select(this->sl, attr_town_or_district_name, widget->selection_id, 1); + gui_internal_search(this,_("Street"),"Street",0); +} + +static void +gui_internal_search_town(struct gui_priv *this, struct widget *wm, void *data) +{ + if (this->sl) + search_list_select(this->sl, attr_country_all, 0, 0); + g_free(this->country_iso2); + this->country_iso2=NULL; + gui_internal_search(this,_("Town"),"Town",0); +} + +static void +gui_internal_search_town_in_country(struct gui_priv *this, struct widget *widget) +{ + struct search_list_common *slc; + dbg(0,"id %d\n", widget->selection_id); + search_list_select(this->sl, attr_country_all, 0, 0); + slc=search_list_select(this->sl, attr_country_all, widget->selection_id, 1); + if (slc) { + g_free(this->country_iso2); + this->country_iso2=g_strdup(((struct search_list_country *)slc)->iso2); + } + gui_internal_search(this,widget->name,"Town",0); +} + +static void +gui_internal_search_country(struct gui_priv *this, struct widget *widget, void *data) +{ + gui_internal_prune_menu_count(this, 1, 0); + gui_internal_search(this,_("Country"),"Country",0); +} + +static void +gui_internal_cmd2_town(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + if (this->sl) + search_list_select(this->sl, attr_country_all, 0, 0); + gui_internal_search(this,_("Town"),"Town",1); +} + +static void +gui_internal_cmd2_setting_layout(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + struct attr attr; + struct widget *w,*wb,*wl; + struct attr_iter *iter; + + + wb=gui_internal_menu(this, _("Layout")); + w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + w->spy=this->spacing*3; + gui_internal_widget_append(wb, w); + iter=navit_attr_iter_new(); + while(navit_get_attr(this->nav, attr_layout, &attr, iter)) { + wl=gui_internal_button_navit_attr_new(this, attr.u.layout->name, gravity_left_center|orientation_horizontal|flags_fill, + &attr, NULL); + gui_internal_widget_append(w, wl); + } + navit_attr_iter_destroy(iter); + gui_internal_menu_render(this); +} + +static char * +gui_internal_cmd_match_expand(char *pattern, struct attr **in) +{ + char p,*ret=g_strdup(pattern),*r=ret,*a; + int len; + while ((p=*pattern++)) { + switch (p) { + case '*': + *r='\0'; + a=attr_to_text(*in++,NULL,0); + len=strlen(ret)+strlen(a)+strlen(pattern)+1; + r=g_malloc(len); + strcpy(r, ret); + strcat(r, a); + g_free(ret); + g_free(a); + ret=r; + r=ret+strlen(ret); + break; + case '\\': + p=*pattern++; + default: + *r++=p; + } + } + *r++='\0'; + return ret; +} + +static int +gui_internal_match(const char *pattern, const char *string) +{ + char p,s; + while ((p=*pattern++)) { + switch (p) { + case '*': + while ((s=*string)) { + if (gui_internal_match(pattern,string)) + return 1; + string++; + } + break; + case '\\': + p=*pattern++; + default: + if (*string++ != p) + return 0; + } + } + return 1; +} + +static int +gui_internal_set(char *remove, char *add) +{ + char *gui_file=g_strjoin(NULL, navit_get_user_data_directory(TRUE), "/gui_internal.txt", NULL); + char *gui_file_new=g_strjoin(NULL, navit_get_user_data_directory(TRUE), "/gui_internal_new.txt", NULL); + FILE *fo=fopen(gui_file_new,"w"); + FILE *fi=fopen(gui_file,"r"); + char *line=NULL; + int ret; + size_t size=0; + if (fi != NULL){ + while (getline(&line,&size,fi) > 0) { + int len=strlen(line); + if (len > 0 && line[len-1] == '\n') + line[len-1]='\0'; + dbg(1,"line=%s\n",line); + if (!gui_internal_match(remove, line)) + fprintf(fo,"%s\n",line); + } + if (line) + free(line); + fclose(fi); + } + fprintf(fo,"%s;\n",add); + fclose(fo); + ret=(rename(gui_file_new, gui_file)==0); + g_free(gui_file_new); + g_free(gui_file); + + return ret; +} + +static void +gui_internal_cmd2_set(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + char *pattern,*command=NULL; + if (!in || !in[0] || !ATTR_IS_STRING(in[0]->type)) { + dbg(0,"first parameter missing or wrong type\n"); + return; + } + pattern=in[0]->u.str; + dbg(0,"pattern %s\n",pattern); + if (in[1]) { + command=gui_internal_cmd_match_expand(pattern, in+1); + dbg(0,"expand %s\n",command); + gui_internal_set(pattern, command); + command_evaluate(&this->self, command); + g_free(command); + } + +} + +static void +gui_internal_cmd2_quit(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + struct attr navit; + gui_internal_prune_menu(this, NULL); + navit.type=attr_navit; + navit.u.navit=this->nav; + navit_destroy(navit.u.navit); + config_remove_attr(config, &navit); + gui_internal_destroy(this); + event_main_loop_quit(); +} + +static void +gui_internal_window_closed(struct gui_priv *this) +{ + gui_internal_cmd2_quit(this, NULL, NULL, NULL, NULL); +} + +static void +gui_internal_cmd2_abort_navigation(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + navit_set_destination(this->nav, NULL, NULL, 0); +} + +static void +gui_internal_cmd_map_download_do(struct gui_priv *this, struct widget *wm, void *data) +{ + char *text=g_strdup_printf(_("Download %s"),wm->name); + struct widget *w, *wb; + struct map *map=data; + double bllon,bllat,trlon,trlat; + + wb=gui_internal_menu(this, text); + g_free(text); + w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + w->spy=this->spacing*3; + gui_internal_widget_append(wb, w); + if (sscanf(wm->prefix,"%lf,%lf,%lf,%lf",&bllon,&bllat,&trlon,&trlat) == 4) { + struct coord_geo g; + struct map_selection sel; + struct map_rect *mr; + struct item *item; + + sel.next=NULL; + sel.order=255; + g.lng=bllon; + g.lat=trlat; + transform_from_geo(projection_mg, &g, &sel.u.c_rect.lu); + g.lng=trlon; + g.lat=bllat; + transform_from_geo(projection_mg, &g, &sel.u.c_rect.rl); + sel.range.min=type_none; + sel.range.max=type_last; + mr=map_rect_new(map, &sel); + while ((item=map_rect_get_item(mr))) { + dbg(0,"item\n"); + } + map_rect_destroy(mr); + } + + dbg(0,"bbox=%s\n",wm->prefix); + gui_internal_menu_render(this); +} + +static void +gui_internal_cmd_map_download(struct gui_priv *this, struct widget *wm, void *data) +{ + struct attr on, off, download_enabled, download_disabled; + struct widget *w,*wb,*wma; + struct map *map=data; + FILE *f; + char *search,buffer[256]; + int found,sp_match=0; + + dbg(1,"wm=%p prefix=%s\n",wm,wm->prefix); + + search=wm->prefix; + if (search) { + found=0; + while(search[sp_match] == ' ') + sp_match++; + sp_match++; + } else { + found=1; + } + on.type=off.type=attr_active; + on.u.num=1; + off.u.num=0; + wb=gui_internal_menu(this, wm->name?wm->name:_("Map Download")); + w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + w->spy=this->spacing*3; + gui_internal_widget_append(wb, w); + if (!search) { + wma=gui_internal_button_map_attr_new(this, _("Active"), gravity_left_center|orientation_horizontal|flags_fill, map, &on, &off, 1); + gui_internal_widget_append(w, wma); + } + + download_enabled.type=download_disabled.type=attr_update; + download_enabled.u.num=1; + download_disabled.u.num=0; + wma=gui_internal_button_map_attr_new(this + , _("Download Enabled") + , gravity_left_center|orientation_horizontal|flags_fill + , map + , &download_enabled + , &download_disabled + , 0); + gui_internal_widget_append(w, wma); + + + f=fopen("maps/areas.tsv","r"); + while (f && fgets(buffer, sizeof(buffer), f)) { + char *nl,*description,*description_size,*bbox,*size=NULL; + int sp=0; + if ((nl=strchr(buffer,'\n'))) + *nl='\0'; + if ((nl=strchr(buffer,'\r'))) + *nl='\0'; + while(buffer[sp] == ' ') + sp++; + if ((bbox=strchr(buffer,'\t'))) + *bbox++='\0'; + if (bbox && (size=strchr(bbox,'\t'))) + *size++='\0'; + if (search && !strcmp(buffer, search)) { + wma=gui_internal_button_new_with_callback(this, _("Download completely"), NULL, + gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_map_download_do, map); + wma->name=g_strdup(buffer+sp); + wma->prefix=g_strdup(bbox); + gui_internal_widget_append(w, wma); + found=1; + } else if (sp < sp_match) + found=0; + if (sp == sp_match && found && buffer[sp]) { + description=g_strdup(buffer+sp); + if (size) + description_size=g_strdup_printf("%s (%s)",description,size); + else + description_size=g_strdup(description); + wma=gui_internal_button_new_with_callback(this, description_size, NULL, + gravity_left_center|orientation_horizontal|flags_fill, gui_internal_cmd_map_download, map); + g_free(description_size); + wma->prefix=g_strdup(buffer); + wma->name=description; + gui_internal_widget_append(w, wma); + } + } + + gui_internal_menu_render(this); +} + +static void +gui_internal_cmd2_setting_maps(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + struct attr attr, on, off, description, type, data, url, active; + struct widget *w,*wb,*wma; + char *label; + struct attr_iter *iter; + + wb=gui_internal_menu(this, _("Maps")); + w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + w->spy=this->spacing*3; + gui_internal_widget_append(wb, w); + iter=navit_attr_iter_new(); + on.type=off.type=attr_active; + on.u.num=1; + off.u.num=0; + while(navit_get_attr(this->nav, attr_map, &attr, iter)) { + if (map_get_attr(attr.u.map, attr_description, &description, NULL)) { + label=g_strdup(description.u.str); + } else { + if (!map_get_attr(attr.u.map, attr_type, &type, NULL)) + type.u.str=""; + if (!map_get_attr(attr.u.map, attr_data, &data, NULL)) + data.u.str=""; + label=g_strdup_printf("%s:%s", type.u.str, data.u.str); + } + if (map_get_attr(attr.u.map, attr_url, &url, NULL)) { + if (!map_get_attr(attr.u.map, attr_active, &active, NULL)) + active.u.num=1; + wma=gui_internal_button_new_with_callback(this, label, image_new_xs(this, active.u.num ? "gui_active" : "gui_inactive"), + gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_map_download, attr.u.map); + } else { + wma=gui_internal_button_map_attr_new(this, label, gravity_left_center|orientation_horizontal|flags_fill, + attr.u.map, &on, &off, 1); + } + gui_internal_widget_append(w, wma); + g_free(label); + } + navit_attr_iter_destroy(iter); + gui_internal_menu_render(this); + +} +static void +gui_internal_cmd_set_active_vehicle(struct gui_priv *this, struct widget *wm, void *data) +{ + struct attr vehicle = {attr_vehicle,{wm->data}}; + navit_set_attr(this->nav, &vehicle); +} + +static void +gui_internal_cmd_show_satellite_status(struct gui_priv *this, struct widget *wm, void *data) +{ + struct widget *w,*wb,*row; + struct attr attr,sat_attr; + struct vehicle *v=wm->data; + char *str; + int i; + enum attr_type types[]={attr_sat_prn, attr_sat_elevation, attr_sat_azimuth, attr_sat_snr}; + + wb=gui_internal_menu(this, _("Show Satellite Status")); + gui_internal_menu_data(this)->redisplay=gui_internal_cmd_show_satellite_status; + gui_internal_menu_data(this)->redisplay_widget=wm; + w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(wb, w); + w = gui_internal_widget_table_new(this,gravity_center | orientation_vertical | flags_expand | flags_fill, 0); + row = gui_internal_widget_table_row_new(this,gravity_left_top); + gui_internal_widget_append(row, gui_internal_label_new(this, " PRN ")); + gui_internal_widget_append(row, gui_internal_label_new(this, _(" Elevation "))); + gui_internal_widget_append(row, gui_internal_label_new(this, _(" Azimuth "))); + gui_internal_widget_append(row, gui_internal_label_new(this, " SNR ")); + gui_internal_widget_append(w,row); + while (vehicle_get_attr(v, attr_position_sat_item, &attr, NULL)) { + row = gui_internal_widget_table_row_new(this,gravity_left_top); + for (i = 0 ; i < sizeof(types)/sizeof(enum attr_type) ; i++) { + if (item_attr_get(attr.u.item, types[i], &sat_attr)) + str=g_strdup_printf("%ld", sat_attr.u.num); + else + str=g_strdup(""); + gui_internal_widget_append(row, gui_internal_label_new(this, str)); + g_free(str); + } + gui_internal_widget_append(w,row); + } + gui_internal_widget_append(wb, w); + gui_internal_menu_render(this); +} + +static void +gui_internal_cmd_show_nmea_data(struct gui_priv *this, struct widget *wm, void *data) +{ + struct widget *w,*wb; + struct attr attr; + struct vehicle *v=wm->data; + wb=gui_internal_menu(this, _("Show NMEA Data")); + gui_internal_menu_data(this)->redisplay=gui_internal_cmd_show_nmea_data; + gui_internal_menu_data(this)->redisplay_widget=wm; + w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(wb, w); + if (vehicle_get_attr(v, attr_position_nmea, &attr, NULL)) + gui_internal_widget_append(w, gui_internal_text_new(this, attr.u.str, gravity_left_center|orientation_vertical)); + gui_internal_menu_render(this); +} + +/** + * A container to hold the selected vehicle and the desired profile in + * one data item. + */ +struct vehicle_and_profilename { + struct vehicle *vehicle; + char *profilename; +}; + +/** + * Figures out whether the given vehicle is the active vehicle. + * + * @return true if the vehicle is active, false otherwise. + */ +static int +gui_internal_is_active_vehicle(struct gui_priv *this, struct vehicle + *vehicle) +{ + struct attr active_vehicle; + + if (!navit_get_attr(this->nav, attr_vehicle, &active_vehicle, NULL)) + active_vehicle.u.vehicle=NULL; + + return active_vehicle.u.vehicle == vehicle; +} + +static void +save_vehicle_xml(struct vehicle *v) +{ + struct attr attr; + struct attr_iter *iter=vehicle_attr_iter_new(); + int childs=0; + dbg(0,"enter\n"); + printf("\n"); + printf("\n"); + } else + printf(" />\n"); + vehicle_attr_iter_destroy(iter); +} + + +/** + * Reacts to a button press that changes a vehicle's active profile. + * + * @see gui_internal_add_vehicle_profile + */ +static void +gui_internal_cmd_set_active_profile(struct gui_priv *this, struct + widget *wm, void *data) +{ + struct vehicle_and_profilename *vapn = data; + struct vehicle *v = vapn->vehicle; + char *profilename = vapn->profilename; + struct attr vehicle_name_attr; + char *vehicle_name = NULL; + struct attr profilename_attr; + + // Get the vehicle name + vehicle_get_attr(v, attr_name, &vehicle_name_attr, NULL); + vehicle_name = vehicle_name_attr.u.str; + + dbg(0, "Changing vehicle %s to profile %s\n", vehicle_name, + profilename); + + // Change the profile name + profilename_attr.type = attr_profilename; + profilename_attr.u.str = profilename; + if(!vehicle_set_attr(v, &profilename_attr)) { + dbg(0, "Unable to set the vehicle's profile name\n"); + } + + // Notify Navit that the routing should be re-done if this is the + // active vehicle. + if (gui_internal_is_active_vehicle(this, v)) { + struct attr vehicle; + vehicle.type=attr_vehicle; + vehicle.u.vehicle=v; + navit_set_attr(this->nav, &vehicle); + } + save_vehicle_xml(v); +} + +/** + * Adds the vehicle profile to the GUI, allowing the user to pick a + * profile for the currently selected vehicle. + */ +static void +gui_internal_add_vehicle_profile(struct gui_priv *this, struct widget + *parent, struct vehicle *v, struct vehicleprofile *profile) +{ + // Just here to show up in the translation file, nice and close to + // where the translations are actually used. + struct attr profile_attr; + struct attr *attr = NULL; + char *name = NULL; + char *active_profile = NULL; + char *label = NULL; + int active; + struct vehicle_and_profilename *context = NULL; + +#ifdef ONLY_FOR_TRANSLATION + char *translations[] = {_n("car"), _n("bike"), _n("pedestrian")}; +#endif + + // Figure out the profile name + attr = attr_search(profile->attrs, NULL, attr_name); + if (!attr) { + dbg(0, "Adding vehicle profile failed. attr==NULL"); + return; + } + name = attr->u.str; + + // Determine whether the profile is the active one + if (vehicle_get_attr(v, attr_profilename, &profile_attr, NULL)) + active_profile = profile_attr.u.str; + active = active_profile != NULL && !strcmp(name, active_profile); + + dbg(0, "Adding vehicle profile %s, active=%s/%i\n", name, + active_profile, active); + + // Build a translatable label. + if(active) { + label = g_strdup_printf(_("Current profile: %s"), _(name)); + } else { + label = g_strdup_printf(_("Change profile to: %s"), _(name)); + } + + // Create the context object (the vehicle and the desired profile) + context = g_new0(struct vehicle_and_profilename, 1); + context->vehicle = v; + context->profilename = name; + + // Add the button + gui_internal_widget_append(parent, + gui_internal_button_new_with_callback( + this, label, + image_new_xs(this, active ? "gui_active" : "gui_inactive"), + gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_set_active_profile, context)); + + free(label); +} + +static void +gui_internal_cmd_vehicle_settings(struct gui_priv *this, struct widget *wm, void *data) +{ + struct widget *w,*wb; + struct attr attr; + struct vehicle *v=wm->data; + struct vehicleprofile *profile = NULL; + GList *profiles; + + wb=gui_internal_menu(this, wm->text); + w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(wb, w); + + // Add the "Set as active" button if this isn't the active + // vehicle. + if (!gui_internal_is_active_vehicle(this, v)) { + gui_internal_widget_append(w, + gui_internal_button_new_with_callback(this, _("Set as active"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_set_active_vehicle, wm->data)); + } + + if (vehicle_get_attr(v, attr_position_sat_item, &attr, NULL)) { + gui_internal_widget_append(w, + gui_internal_button_new_with_callback(this, _("Show Satellite status"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_show_satellite_status, wm->data)); + } + if (vehicle_get_attr(v, attr_position_nmea, &attr, NULL)) { + gui_internal_widget_append(w, + gui_internal_button_new_with_callback(this, _("Show NMEA data"), + image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_show_nmea_data, wm->data)); + } + + // Add all the possible vehicle profiles to the menu + profiles = navit_get_vehicleprofiles(this->nav); + while(profiles) { + profile = (struct vehicleprofile *)profiles->data; + gui_internal_add_vehicle_profile(this, w, v, profile); + profiles = g_list_next(profiles); + } + + callback_list_call_attr_2(this->cbl, attr_vehicle, w, wm->data); + gui_internal_menu_render(this); +} + +static void +gui_internal_cmd2_setting_vehicle(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + struct attr attr,vattr; + struct widget *w,*wb,*wl; + struct attr_iter *iter; + struct attr active_vehicle; + + + wb=gui_internal_menu(this, _("Vehicle")); + w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + w->spy=this->spacing*3; + gui_internal_widget_append(wb, w); + if (!navit_get_attr(this->nav, attr_vehicle, &active_vehicle, NULL)) + active_vehicle.u.vehicle=NULL; + iter=navit_attr_iter_new(); + while(navit_get_attr(this->nav, attr_vehicle, &attr, iter)) { + vehicle_get_attr(attr.u.vehicle, attr_name, &vattr, NULL); + wl=gui_internal_button_new_with_callback(this, vattr.u.str, + image_new_l(this, attr.u.vehicle == active_vehicle.u.vehicle ? "gui_active" : "gui_inactive"), gravity_left_center|orientation_horizontal|flags_fill, + gui_internal_cmd_vehicle_settings, attr.u.vehicle); + wl->text=g_strdup(vattr.u.str); + gui_internal_widget_append(w, wl); + } + navit_attr_iter_destroy(iter); + gui_internal_menu_render(this); +} + + +static void +gui_internal_cmd2_setting_rules(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + struct widget *wb,*w; + struct attr on,off; + wb=gui_internal_menu(this, _("Rules")); + w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + w->spy=this->spacing*3; + gui_internal_widget_append(wb, w); + on.u.num=1; + off.u.num=0; + on.type=off.type=attr_tracking; + gui_internal_widget_append(w, + gui_internal_button_navit_attr_new(this, _("Lock on road"), gravity_left_center|orientation_horizontal|flags_fill, + &on, &off)); + on.u.num=0; + off.u.num=-1; + on.type=off.type=attr_orientation; + gui_internal_widget_append(w, + gui_internal_button_navit_attr_new(this, _("Northing"), gravity_left_center|orientation_horizontal|flags_fill, + &on, &off)); + on.u.num=1; + off.u.num=0; + on.type=off.type=attr_follow_cursor; + gui_internal_widget_append(w, + gui_internal_button_navit_attr_new(this, _("Map follows Vehicle"), gravity_left_center|orientation_horizontal|flags_fill, + &on, &off)); + gui_internal_menu_render(this); +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void gui_internal_motion(void *data, struct point *p) +{ + + struct gui_priv *this=data; + if (!this->root.children) { + navit_handle_motion(this->nav, p); + return; + } + if (!this->pressed) + return; + this->current=*p; + if(!this->motion_timeout_callback) + this->motion_timeout_callback=callback_new_1(callback_cast(gui_internal_highlight), this); + if(!this->motion_timeout_event) + this->motion_timeout_event=event_add_timeout(100,0, this->motion_timeout_callback); +} + +static const char * +find_attr(const char **names, const char **values, const char *name) +{ + while (*names) { + if (!g_strcasecmp(*names, name)) + return *values; + names+=xml_attr_distance; + values+=xml_attr_distance; + } + return NULL; +} + +static char * +find_attr_dup(const char **names, const char **values, const char *name) +{ + return g_strdup(find_attr(names, values, name)); +} + +static void +gui_internal_evaluate(struct gui_priv *this, const char *command) +{ + if (command) + command_evaluate(&this->self, command); +} + + +static void +gui_internal_html_command(struct gui_priv *this, struct widget *w, void *data) +{ + gui_internal_evaluate(this,w->command); +} + +static void +gui_internal_html_submit_set(struct gui_priv *this, struct widget *w, struct form *form) +{ + GList *l; + if (w->form == form && w->name) { + struct attr *attr=attr_new_from_text(w->name, w->text?w->text:""); + if (attr) + gui_set_attr(this->self.u.gui, attr); + attr_free(attr); + } + l=w->children; + while (l) { + w=l->data; + gui_internal_html_submit_set(this, w, form); + l=g_list_next(l); + } + +} + +static void +gui_internal_html_submit(struct gui_priv *this, struct widget *w, void *data) +{ + struct widget *menu; + GList *l; + + dbg(1,"enter form %p %s\n",w->form,w->form->onsubmit); + l=g_list_last(this->root.children); + menu=l->data; + graphics_draw_mode(this->gra, draw_mode_begin); + gui_internal_highlight_do(this, NULL); + gui_internal_menu_render(this); + graphics_draw_mode(this->gra, draw_mode_end); + gui_internal_html_submit_set(this, menu, w->form); + gui_internal_evaluate(this,w->form->onsubmit); +} + +static void +gui_internal_html_load_href(struct gui_priv *this, char *href, int replace) +{ + if (replace) + gui_internal_prune_menu_count(this, 1, 0); + if (href && href[0] == '#') { + dbg(1,"href=%s\n",href); + g_free(this->href); + this->href=g_strdup(href); + gui_internal_html_menu(this, this->html_text, href+1); + } +} + +static void +gui_internal_html_href(struct gui_priv *this, struct widget *w, void *data) +{ + gui_internal_html_load_href(this, w->command, 0); +} + +struct div_flags_map { + char *attr; + char *val; + enum flags flags; +} div_flags_map[] = { + {"gravity","none",gravity_none}, + {"gravity","left",gravity_left}, + {"gravity","xcenter",gravity_xcenter}, + {"gravity","right",gravity_right}, + {"gravity","top",gravity_top}, + {"gravity","ycenter",gravity_ycenter}, + {"gravity","bottom",gravity_bottom}, + {"gravity","left_top",gravity_left_top}, + {"gravity","top_center",gravity_top_center}, + {"gravity","right_top",gravity_right_top}, + {"gravity","left_center",gravity_left_center}, + {"gravity","center",gravity_center}, + {"gravity","right_center",gravity_right_center}, + {"gravity","left_bottom",gravity_left_bottom}, + {"gravity","bottom_center",gravity_bottom_center}, + {"gravity","right_bottom",gravity_right_bottom}, + {"expand","1",flags_expand}, + {"fill","1",flags_fill}, + {"orientation","horizontal",orientation_horizontal}, + {"orientation","vertical",orientation_vertical}, + {"orientation","horizontal_vertical",orientation_horizontal_vertical}, +}; + +static enum flags +div_flag(const char **names, const char **values, char *name) +{ + int i; + enum flags ret=0; + const char *value=find_attr(names, values, name); + if (!value) + return ret; + for (i = 0 ; i < sizeof(div_flags_map)/sizeof(struct div_flags_map); i++) { + if (!strcmp(div_flags_map[i].attr,name) && !strcmp(div_flags_map[i].val,value)) + ret|=div_flags_map[i].flags; + } + return ret; +} + +static enum flags +div_flags(const char **names, const char **values) +{ + enum flags flags; + flags = div_flag(names, values, "gravity"); + flags |= div_flag(names, values, "orientation"); + flags |= div_flag(names, values, "expand"); + flags |= div_flag(names, values, "fill"); + return flags; +} + +static struct widget * +html_image(struct gui_priv *this, const char **names, const char **values) +{ + const char *src, *size; + struct graphics_image *img=NULL; + + src=find_attr(names, values, "src"); + if (!src) + return NULL; + size=find_attr(names, values, "size"); + if (!size) + size="l"; + if (!strcmp(size,"l")) + img=image_new_l(this, src); + else if (!strcmp(size,"s")) + img=image_new_s(this, src); + else if (!strcmp(size,"xs")) + img=image_new_xs(this, src); + if (!img) + return NULL; + return gui_internal_image_new(this, img); +} + +static void +gui_internal_html_start(void *dummy, const char *tag_name, const char **names, const char **values, void *data, void *error) +{ + struct gui_priv *this=data; + int i; + enum html_tag tag=html_tag_none; + struct html *html=&this->html[this->html_depth]; + const char *cond, *type; + + if (!g_strcasecmp(tag_name,"text")) + return; + html->command=NULL; + html->name=NULL; + html->href=NULL; + html->skip=0; + cond=find_attr(names, values, "cond"); + + if (cond && !this->html_skip) { + if (!command_evaluate_to_boolean(&this->self, cond, NULL)) + html->skip=1; + } + + for (i=0 ; i < sizeof(html_tag_map)/sizeof(struct html_tag_map); i++) { + if (!g_strcasecmp(html_tag_map[i].tag_name, tag_name)) { + tag=html_tag_map[i].tag; + break; + } + } + html->tag=tag; + if (!this->html_skip && !html->skip) { + switch (tag) { + case html_tag_a: + html->name=find_attr_dup(names, values, "name"); + if (html->name) { + html->skip=this->html_anchor ? strcmp(html->name,this->html_anchor) : 0; + if (!html->skip) + this->html_anchor_found=1; + } + html->command=find_attr_dup(names, values, "onclick"); + html->href=find_attr_dup(names, values, "href"); + html->refresh_cond=find_attr_dup(names, values, "refresh_cond"); + break; + case html_tag_img: + html->command=find_attr_dup(names, values, "onclick"); + html->w=html_image(this, names, values); + break; + case html_tag_form: + this->form=g_new0(struct form, 1); + this->form->onsubmit=find_attr_dup(names, values, "onsubmit"); + break; + case html_tag_input: + type=find_attr_dup(names, values, "type"); + if (!type) + break; + if (!strcmp(type,"image")) { + html->w=html_image(this, names, values); + if (html->w) { + html->w->state|=STATE_SENSITIVE; + html->w->func=gui_internal_html_submit; + } + } + if (!strcmp(type,"text") || !strcmp(type,"password")) { + html->w=gui_internal_label_new(this, NULL); + html->w->background=this->background; + html->w->flags |= div_flags(names, values); + html->w->state|=STATE_EDITABLE; + if (!this->editable) { + this->editable=html->w; + html->w->state|=STATE_EDIT; + } + this->keyboard_required=1; + if (!strcmp(type,"password")) + html->w->flags2 |= 1; + } + if (html->w) { + html->w->form=this->form; + html->w->name=find_attr_dup(names, values, "name"); + } + break; + case html_tag_div: + html->w=gui_internal_box_new(this, div_flags(names, values)); + html->container=this->html_container; + this->html_container=html->w; + break; + default: + break; + } + } + this->html_skip+=html->skip; + this->html_depth++; +} + +static void +gui_internal_html_end(void *dummy, const char *tag_name, void *data, void *error) +{ + struct gui_priv *this=data; + struct html *html; + struct html *parent=NULL; + + if (!g_strcasecmp(tag_name,"text")) + return; + this->html_depth--; + html=&this->html[this->html_depth]; + if (this->html_depth > 0) + parent=&this->html[this->html_depth-1]; + + + if (!this->html_skip) { + if (html->command && html->w) { + html->w->state |= STATE_SENSITIVE; + html->w->command=html->command; + html->w->func=gui_internal_html_command; + html->command=NULL; + } + if (parent && (parent->href || parent->command) && html->w) { + html->w->state |= STATE_SENSITIVE; + if (parent->command) { + html->w->command=g_strdup(parent->command); + html->w->func=gui_internal_html_command; + } else { + html->w->command=g_strdup(parent->href); + html->w->func=gui_internal_html_href; + } + } + switch (html->tag) { + case html_tag_div: + this->html_container=html->container; + case html_tag_img: + case html_tag_input: + gui_internal_widget_append(this->html_container, html->w); + break; + case html_tag_form: + this->form=NULL; + break; + default: + break; + } + } + this->html_skip-=html->skip; + g_free(html->command); + g_free(html->name); + g_free(html->href); + g_free(html->refresh_cond); +} + +static void +gui_internal_refresh_callback_called(struct gui_priv *this, struct menu_data *menu_data) +{ + if (gui_internal_menu_data(this) == menu_data) { + char *href=g_strdup(menu_data->href); + gui_internal_html_load_href(this, href, 1); + g_free(href); + } +} + +static void +gui_internal_set_refresh_callback(struct gui_priv *this, char *cond) +{ + dbg(0,"cond=%s\n",cond); + if (cond) { + enum attr_type type; + struct object_func *func; + struct menu_data *menu_data=gui_internal_menu_data(this); + dbg(0,"navit=%p\n",this->nav); + type=command_evaluate_to_attr(&this->self, cond, NULL, &menu_data->refresh_callback_obj); + if (type == attr_none) + return; + func=object_func_lookup(menu_data->refresh_callback_obj.type); + if (!func || !func->add_attr) + return; + menu_data->refresh_callback.type=attr_callback; + menu_data->refresh_callback.u.callback=callback_new_attr_2(callback_cast(gui_internal_refresh_callback_called),type,this,menu_data); + func->add_attr(menu_data->refresh_callback_obj.u.data, &menu_data->refresh_callback); + } +} + +static void +gui_internal_html_text(void *dummy, const char *text, int len, void *data, void *error) +{ + struct gui_priv *this=data; + struct widget *w; + int depth=this->html_depth-1; + struct html *html=&this->html[depth]; + gchar *text_stripped; + + if (this->html_skip) + return; + while (isspace(text[0])) { + text++; + len--; + } + while (len > 0 && isspace(text[len-1])) + len--; + + text_stripped = g_strndup(text, len); + if (html->tag == html_tag_html && depth > 2) { + if (this->html[depth-1].tag == html_tag_script) { + html=&this->html[depth-2]; + } + } + switch (html->tag) { + case html_tag_a: + if (html->name && len) { + this->html_container=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_expand|flags_fill); + gui_internal_widget_append(gui_internal_menu(this, _(text_stripped)), this->html_container); + gui_internal_menu_data(this)->href=g_strdup(this->href); + gui_internal_set_refresh_callback(this, html->refresh_cond); + this->html_container->spx=this->spacing*10; + } + break; + case html_tag_h1: + if (!this->html_container) { + this->html_container=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_expand|flags_fill); + gui_internal_widget_append(gui_internal_menu(this, _(text_stripped)), this->html_container); + this->html_container->spx=this->spacing*10; + } + break; + case html_tag_img: + if (len) { + w=gui_internal_box_new(this, gravity_center|orientation_vertical); + gui_internal_widget_append(w, html->w); + gui_internal_widget_append(w, gui_internal_text_new(this, _(text_stripped), gravity_center|orientation_vertical)); + html->w=w; + } + break; + case html_tag_div: + if (len) { + gui_internal_widget_append(html->w, gui_internal_text_new(this, _(text_stripped), gravity_center|orientation_vertical)); + } + break; + case html_tag_script: + dbg(1,"execute %s\n",text_stripped); + gui_internal_evaluate(this,text_stripped); + break; + default: + break; + } + g_free(text_stripped); +} + +static void +gui_internal_html_menu(struct gui_priv *this, const char *document, char *anchor) +{ + char *doc=g_strdup(document); + graphics_draw_mode(this->gra, draw_mode_begin); + this->html_container=NULL; + this->html_depth=0; + this->html_anchor=anchor; + this->html_anchor_found=0; + this->form=NULL; + this->keyboard_required=0; + this->editable=NULL; + callback_list_call_attr_2(this->cbl,attr_gui,anchor,&doc); + xml_parse_text(doc, this, gui_internal_html_start, gui_internal_html_end, gui_internal_html_text); + g_free(doc); + if (this->keyboard_required && this->keyboard) { + this->html_container->flags=gravity_center|orientation_vertical|flags_expand|flags_fill; + gui_internal_widget_append(this->html_container, gui_internal_keyboard(this,2)); + } + gui_internal_menu_render(this); + graphics_draw_mode(this->gra, draw_mode_end); +} + + +static void +gui_internal_enter(struct gui_priv *this, int ignore) +{ + struct graphics *gra=this->gra; + this->ignore_button=ignore; + this->clickp_valid=this->vehicle_valid=0; + + navit_block(this->nav, 1); + graphics_overlay_disable(gra, 1); + this->root.p.x=0; + this->root.p.y=0; + this->root.background=this->background; +} + +static void +gui_internal_leave(struct gui_priv *this) +{ + graphics_draw_mode(this->gra, draw_mode_end); +} + +static void +gui_internal_enter_setup(struct gui_priv *this, struct point *p) +{ + struct transformation *trans; + struct coord c; + struct coord_geo g; + struct attr attr,attrp; + + trans=navit_get_trans(this->nav); + attr_free(this->click_coord_geo); + this->click_coord_geo=NULL; + attr_free(this->position_coord_geo); + this->position_coord_geo=NULL; + if (p) { + transform_reverse(trans, p, &c); + dbg(1,"x=0x%x y=0x%x\n", c.x, c.y); + this->clickp.pro=transform_get_projection(trans); + this->clickp.x=c.x; + this->clickp.y=c.y; + transform_to_geo(this->clickp.pro, &c, &g); + attr.u.coord_geo=&g; + attr.type=attr_click_coord_geo; + this->click_coord_geo=attr_dup(&attr); + } + if (navit_get_attr(this->nav, attr_vehicle, &attr, NULL) && attr.u.vehicle + && vehicle_get_attr(attr.u.vehicle, attr_position_coord_geo, &attrp, NULL)) { + this->position_coord_geo=attr_dup(&attrp); + this->vehiclep.pro=transform_get_projection(trans); + transform_from_geo(this->vehiclep.pro, attrp.u.coord_geo, &c); + this->vehiclep.x=c.x; + this->vehiclep.y=c.y; + this->vehicle_valid=1; + } +} + +static void +gui_internal_cmd_menu(struct gui_priv *this, struct point *p, int ignore, char *href) +{ + dbg(1,"enter\n"); + gui_internal_enter(this, ignore); + gui_internal_enter_setup(this, p); + // draw menu + gui_internal_html_load_href(this, href?href:"#Main Menu", 0); +} + +static void +gui_internal_cmd_menu2(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + char *href=NULL; + int i=0, ignore=0, replace=0; + + if (in && in[i] && ATTR_IS_INT(in[i]->type)) + ignore=in[i++]->u.num; + + if (in && in[i] && ATTR_IS_STRING(in[i]->type)) { + href=in[i++]->u.str; + if (in[i] && ATTR_IS_INT(in[i]->type)) + replace=in[i++]->u.num; + } + + if (this->root.children) { + if (!href) + return; + gui_internal_html_load_href(this, href, replace); + return; + } + + gui_internal_cmd_menu(this, NULL, ignore, href); +} + + +static void +gui_internal_cmd_log_do(struct gui_priv *this, struct widget *widget) +{ + if (widget->text && strlen(widget->text)) { + if (this->vehicle_valid) + navit_textfile_debug_log_at(this->nav, &this->vehiclep, "type=log_entry label=\"%s\"",widget->text); + else + navit_textfile_debug_log(this->nav, "type=log_entry label=\"%s\"",widget->text); + } + g_free(widget->text); + widget->text=NULL; + gui_internal_prune_menu(this, NULL); + gui_internal_check_exit(this); +} + +static void +gui_internal_cmd_log_clicked(struct gui_priv *this, struct widget *widget, void *data) +{ + gui_internal_cmd_log_do(this, widget->data); +} + +static void +gui_internal_cmd_log_changed(struct gui_priv *this, struct widget *wm, void *data) +{ + int len; + if (wm->text) { + len=strlen(wm->text); + if (len && (wm->text[len-1] == '\n' || wm->text[len-1] == '\r')) { + wm->text[len-1]='\0'; + gui_internal_cmd_log_do(this, wm); + } + } +} + + +static void +gui_internal_cmd_log(struct gui_priv *this) +{ + struct widget *w,*wb,*wk,*wl,*we,*wnext; + gui_internal_enter(this, 1); + gui_internal_enter_setup(this, NULL); + wb=gui_internal_menu(this, "Log Message"); + w=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(wb, w); + we=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill); + gui_internal_widget_append(w, we); + gui_internal_widget_append(we, wk=gui_internal_label_new(this, _("Message"))); + wk->state |= STATE_EDIT|STATE_EDITABLE|STATE_CLEAR; + wk->background=this->background; + wk->flags |= flags_expand|flags_fill; + wk->func = gui_internal_cmd_log_changed; + gui_internal_widget_append(we, wnext=gui_internal_image_new(this, image_new_xs(this, "gui_active"))); + wnext->state |= STATE_SENSITIVE; + wnext->func = gui_internal_cmd_log_clicked; + wnext->data=wk; + wl=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(w, wl); + if (this->keyboard) + gui_internal_widget_append(w, gui_internal_keyboard(this,2)); + gui_internal_menu_render(this); + gui_internal_leave(this); +} + +static void +gui_internal_check_exit(struct gui_priv *this) +{ + struct graphics *gra=this->gra; + if (! this->root.children) { + gui_internal_search_idle_end(this); + gui_internal_search_list_destroy(this); + graphics_overlay_disable(gra, 0); + if (!navit_block(this->nav, 0)) { + if (this->redraw) + navit_draw(this->nav); + else + navit_draw_displaylist(this->nav); + } + } +} + +static int +gui_internal_get_attr(struct gui_priv *this, enum attr_type type, struct attr *attr) +{ + switch (type) { + case attr_active: + attr->u.num=this->root.children != NULL; + break; + case attr_click_coord_geo: + if (!this->click_coord_geo) + return 0; + *attr=*this->click_coord_geo; + break; + case attr_position_coord_geo: + if (!this->position_coord_geo) + return 0; + *attr=*this->position_coord_geo; + break; + case attr_pitch: + attr->u.num=this->pitch; + break; + case attr_button: + attr->u.num=this->mouse_button_clicked_on_map; + break; + default: + return 0; + } + attr->type=type; + return 1; +} + +static int +gui_internal_add_attr(struct gui_priv *this, struct attr *attr) +{ + switch (attr->type) { + case attr_xml_text: + g_free(this->html_text); + this->html_text=g_strdup(attr->u.str); + return 1; + default: + return 0; + } +} + +static int +gui_internal_set_attr(struct gui_priv *this, struct attr *attr) +{ + switch (attr->type) { + case attr_fullscreen: + if ((this->fullscreen > 0) != (attr->u.num > 0)) { + graphics_draw_mode(this->gra, draw_mode_end); + this->win->fullscreen(this->win, attr->u.num > 0); + graphics_draw_mode(this->gra, draw_mode_begin); + } + this->fullscreen=attr->u.num; + return 1; + case attr_menu_on_map_click: + this->menu_on_map_click=attr->u.num; + return 1; + default: + dbg(0,"%s\n",attr_to_name(attr->type)); + return 1; + } +} + +static void gui_internal_dbus_signal(struct gui_priv *this, struct point *p) +{ + struct displaylist_handle *dlh; + struct displaylist *display; + struct displayitem *di; + struct attr cb,**attr_list=NULL; + int valid=0; + + display=navit_get_displaylist(this->nav); + dlh=graphics_displaylist_open(display); + while ((di=graphics_displaylist_next(dlh))) { + struct item *item=graphics_displayitem_get_item(di); + if (item_is_point(*item) && graphics_displayitem_get_displayed(di) && + graphics_displayitem_within_dist(display, di, p, this->radius)) { + struct map_rect *mr=map_rect_new(item->map, NULL); + struct item *itemo=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); + struct attr attr; + if (itemo && item_attr_get(itemo, attr_data, &attr)) + attr_list=attr_generic_add_attr(attr_list, &attr); + map_rect_destroy(mr); + } + } + graphics_displaylist_close(dlh); + if (attr_list && navit_get_attr(this->nav, attr_callback_list, &cb, NULL)) + callback_list_call_attr_4(cb.u.callback_list, attr_command, "dbus_send_signal", attr_list, NULL, &valid); + attr_list_free(attr_list); +} + + + +//############################################################################################################## +//# Description: Function to handle mouse clicks and scroll wheel movement +//# Comment: +//# Authors: Martin Schaller (04/2008), Stefan Klumpp (04/2008) +//############################################################################################################## +static void gui_internal_button(void *data, int pressed, int button, struct point *p) +{ + struct gui_priv *this=data; + struct graphics *gra=this->gra; + + dbg(1,"enter %d %d\n", pressed, button); + // if still on the map (not in the menu, yet): + dbg(1,"children=%p ignore_button=%d\n",this->root.children,this->ignore_button); + if (!this->root.children || this->ignore_button) { + + this->ignore_button=0; + // check whether the position of the mouse changed during press/release OR if it is the scrollwheel + if (!navit_handle_button(this->nav, pressed, button, p, NULL)) { + dbg(1,"navit has handled button\n"); + return; + } + dbg(1,"menu_on_map_click=%d\n",this->menu_on_map_click); + if (button != 1) + return; + if (this->menu_on_map_click) { + this->mouse_button_clicked_on_map=1; + gui_internal_cmd_menu(this, p, 0, NULL); + this->mouse_button_clicked_on_map=0; + return; + } + if (this->signal_on_map_click) { + gui_internal_dbus_signal(this, p); + return; + } + return; + } + + + // if already in the menu: + if (pressed) { + this->pressed=1; + this->current=*p; + gui_internal_highlight(this); + } else { + this->pressed=0; + this->current.x=-1; + this->current.y=-1; + graphics_draw_mode(gra, draw_mode_begin); + gui_internal_call_highlighted(this); + if (!event_main_loop_has_quit()) { + gui_internal_highlight(this); + graphics_draw_mode(gra, draw_mode_end); + gui_internal_check_exit(this); + } + } +} + +static void +gui_internal_setup(struct gui_priv *this) +{ + struct color cbh={0x9fff,0x9fff,0x9fff,0xffff}; + struct color cf={0xbfff,0xbfff,0xbfff,0xffff}; + struct graphics *gra=this->gra; + unsigned char *buffer; + char *gui_file; + int size; + + if (this->background) + return; + this->background=graphics_gc_new(gra); + this->background2=graphics_gc_new(gra); + this->highlight_background=graphics_gc_new(gra); + graphics_gc_set_foreground(this->highlight_background, &cbh); + this->foreground=graphics_gc_new(gra); + graphics_gc_set_foreground(this->foreground, &cf); + this->text_background=graphics_gc_new(gra); + this->text_foreground=graphics_gc_new(gra); + graphics_gc_set_foreground(this->background, &this->background_color); + graphics_gc_set_foreground(this->background2, &this->background2_color); + graphics_gc_set_foreground(this->text_background, &this->text_background_color); + graphics_gc_set_foreground(this->text_foreground, &this->text_foreground_color); + gui_file=g_strjoin(NULL, navit_get_user_data_directory(TRUE), "/gui_internal.txt", NULL); + if (file_get_contents(gui_file,&buffer,&size)) { + char *command=g_malloc(size+1); + strncpy(command,(const char *)buffer,size); + command[size]=0; + command_evaluate(&this->self, command); + g_free(command); + g_free(buffer); + } + g_free(gui_file); +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void gui_internal_resize(void *data, int w, int h) +{ + struct gui_priv *this=data; + int changed=0; + + gui_internal_setup(this); + + if (this->root.w != w || this->root.h != h) { + this->root.w=w; + this->root.h=h; + changed=1; + } + dbg(1,"w=%d h=%d children=%p\n", w, h, this->root.children); + navit_handle_resize(this->nav, w, h); + if (this->root.children) { + if (changed) { + gui_internal_prune_menu(this, NULL); + gui_internal_html_load_href(this, "#Main Menu", 0); + } else { + gui_internal_menu_render(this); + } + } +} + +static void +gui_internal_keynav_point(struct widget *w, int dx, int dy, struct point *p) +{ + p->x=w->p.x+w->w/2; + p->y=w->p.y+w->h/2; + if (dx < 0) + p->x=w->p.x; + if (dx > 0) + p->x=w->p.x+w->w; + if (dy < 0) + p->y=w->p.y; + if (dy > 0) + p->y=w->p.y+w->h; +} + +static void +gui_internal_keynav_find_closest(struct widget *wi, struct point *p, int dx, int dy, int *distance, struct widget **result) +{ + GList *l=wi->children; + // Skip hidden elements + if (wi->p.x==0 && wi->p.y==0 && wi->w==0 && wi->h==0) + return; + if ((wi->state & STATE_SENSITIVE) ) { + int dist1,dist2; + struct point wp; + gui_internal_keynav_point(wi, -dx, -dy, &wp); + if (dx) { + dist1=(wp.x-p->x)*dx; + dist2=wp.y-p->y; + } else if (dy) { + dist1=(wp.y-p->y)*dy; + dist2=wp.x-p->x; + } else { + dist2=wp.x-p->x; + dist1=wp.y-p->y; + if (dist1 < 0) + dist1=-dist1; + } + dbg(1,"checking %d,%d %d %d against %d,%d-%d,%d result %d,%d\n", p->x, p->y, dx, dy, wi->p.x, wi->p.y, wi->p.x+wi->w, wi->p.y+wi->h, dist1, dist2); + if (dist1 >= 0) { + if (dist2 < 0) + dist1-=dist2; + else + dist1+=dist2; + if (dist1 < *distance) { + *result=wi; + *distance=dist1; + } + } + } + while (l) { + struct widget *child=l->data; + gui_internal_keynav_find_closest(child, p, dx, dy, distance, result); + l=g_list_next(l); + } +} + +static void +gui_internal_keynav_highlight_next(struct gui_priv *this, int dx, int dy) +{ + struct widget *result,*menu=g_list_last(this->root.children)->data; + struct point p; + int distance; + if (this->highlighted && this->highlighted_menu == g_list_last(this->root.children)->data) + gui_internal_keynav_point(this->highlighted, dx, dy, &p); + else { + p.x=0; + p.y=0; + distance=INT_MAX; + result=NULL; + gui_internal_keynav_find_closest(menu, &p, 0, 0, &distance, &result); + if (result) { + gui_internal_keynav_point(result, dx, dy, &p); + dbg(1,"result origin=%p p=%d,%d\n", result, p.x, p.y); + } + } + result=NULL; + distance=INT_MAX; + gui_internal_keynav_find_closest(menu, &p, dx, dy, &distance, &result); + dbg(1,"result=%p\n", result); + if (! result) { + if (dx < 0) + p.x=this->root.w; + if (dx > 0) + p.x=0; + if (dy < 0) + p.y=this->root.h; + if (dy > 0) + p.y=0; + result=NULL; + distance=INT_MAX; + gui_internal_keynav_find_closest(menu, &p, dx, dy, &distance, &result); + dbg(1,"wraparound result=%p\n", result); + } + gui_internal_highlight_do(this, result); + if (result) + gui_internal_say(this, result, 1); +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static void gui_internal_keypress(void *data, char *key) +{ + struct gui_priv *this=data; + int w,h; + struct point p; + if (!this->root.children) { + transform_get_size(navit_get_trans(this->nav), &w, &h); + switch (*key) { + case NAVIT_KEY_UP: + p.x=w/2; + p.y=0; + navit_set_center_screen(this->nav, &p, 1); + break; + case NAVIT_KEY_DOWN: + p.x=w/2; + p.y=h; + navit_set_center_screen(this->nav, &p, 1); + break; + case NAVIT_KEY_LEFT: + p.x=0; + p.y=h/2; + navit_set_center_screen(this->nav, &p, 1); + break; + case NAVIT_KEY_RIGHT: + p.x=w; + p.y=h/2; + navit_set_center_screen(this->nav, &p, 1); + break; + case NAVIT_KEY_ZOOM_IN: + navit_zoom_in(this->nav, 2, NULL); + break; + case NAVIT_KEY_ZOOM_OUT: + navit_zoom_out(this->nav, 2, NULL); + break; + case NAVIT_KEY_RETURN: + case NAVIT_KEY_MENU: + gui_internal_cmd_menu(this, NULL, 0, NULL); + break; + } + return; + } + graphics_draw_mode(this->gra, draw_mode_begin); + switch (*key) { + case NAVIT_KEY_LEFT: + gui_internal_keynav_highlight_next(this,-1,0); + break; + case NAVIT_KEY_RIGHT: + gui_internal_keynav_highlight_next(this,1,0); + break; + case NAVIT_KEY_UP: + gui_internal_keynav_highlight_next(this,0,-1); + break; + case NAVIT_KEY_DOWN: + gui_internal_keynav_highlight_next(this,0,1); + break; + case NAVIT_KEY_BACK: + if (g_list_length(this->root.children) > 1) + gui_internal_back(this, NULL, NULL); + else + gui_internal_prune_menu(this, NULL); + break; + case NAVIT_KEY_RETURN: + if (this->highlighted && this->highlighted_menu == g_list_last(this->root.children)->data) + gui_internal_call_highlighted(this); + else + gui_internal_keypress_do(this, key); + break; + default: + gui_internal_keypress_do(this, key); + } + if (!event_main_loop_has_quit()) { + graphics_draw_mode(this->gra, draw_mode_end); + gui_internal_check_exit(this); + } +} + + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static int gui_internal_set_graphics(struct gui_priv *this, struct graphics *gra) +{ + struct window *win; + struct transformation *trans=navit_get_trans(this->nav); + + win=graphics_get_data(gra, "window"); + if (! win) + return 1; + navit_ignore_graphics_events(this->nav, 1); + this->gra=gra; + this->win=win; + navit_ignore_graphics_events(this->nav, 1); + transform_get_size(trans, &this->root.w, &this->root.h); + this->resize_cb=callback_new_attr_1(callback_cast(gui_internal_resize), attr_resize, this); + graphics_add_callback(gra, this->resize_cb); + this->button_cb=callback_new_attr_1(callback_cast(gui_internal_button), attr_button, this); + graphics_add_callback(gra, this->button_cb); + this->motion_cb=callback_new_attr_1(callback_cast(gui_internal_motion), attr_motion, this); + graphics_add_callback(gra, this->motion_cb); + this->keypress_cb=callback_new_attr_1(callback_cast(gui_internal_keypress), attr_keypress, this); + graphics_add_callback(gra, this->keypress_cb); + this->window_closed_cb=callback_new_attr_1(callback_cast(gui_internal_window_closed), attr_window_closed, this); + graphics_add_callback(gra, this->window_closed_cb); + + // set fullscreen if needed + if (this->fullscreen) + this->win->fullscreen(this->win, this->fullscreen != 0); + /* Was resize callback already issued? */ + if (navit_get_ready(this->nav) & 2) + gui_internal_setup(this); + return 0; +} + +static void gui_internal_disable_suspend(struct gui_priv *this) +{ + if (this->win->disable_suspend) + this->win->disable_suspend(this->win); +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +struct gui_methods gui_internal_methods = { + NULL, + NULL, + gui_internal_set_graphics, + NULL, + NULL, + NULL, + gui_internal_disable_suspend, + gui_internal_get_attr, + gui_internal_add_attr, + gui_internal_set_attr, +}; + + static void +gui_internal_get_data(struct gui_priv *priv, char *command, struct attr **in, struct attr ***out) +{ + struct attr private_data = { attr_private_data, {(void *)&priv->data}}; + if (out) + *out=attr_generic_add_attr(*out, &private_data); +} + +static void +gui_internal_add_callback(struct gui_priv *priv, struct callback *cb) +{ + callback_list_add(priv->cbl, cb); +} + +static void +gui_internal_remove_callback(struct gui_priv *priv, struct callback *cb) +{ + callback_list_remove(priv->cbl, cb); +} + + +static struct gui_internal_methods gui_internal_methods_ext = { + gui_internal_add_callback, + gui_internal_remove_callback, + gui_internal_menu_render, + image_new_xs, + image_new_l, +}; + + +static enum flags +gui_internal_get_flags(struct widget *widget) +{ + return widget->flags; +} + +static void +gui_internal_set_flags(struct widget *widget, enum flags flags) +{ + widget->flags=flags; +} + +static int +gui_internal_get_state(struct widget *widget) +{ + return widget->state; +} + +static void +gui_internal_set_state(struct widget *widget, int state) +{ + widget->state=state; +} + +static void +gui_internal_set_func(struct widget *widget, void (*func)(struct gui_priv *priv, struct widget *widget, void *data)) +{ + widget->func=func; +} + +static void +gui_internal_set_data(struct widget *widget, void *data) +{ + widget->data=data; +} + +static void +gui_internal_set_default_background(struct gui_priv *this, struct widget *widget) +{ + widget->background=this->background; +} + +static struct gui_internal_widget_methods gui_internal_widget_methods = { + gui_internal_widget_append, + gui_internal_button_new, + gui_internal_button_new_with_callback, + gui_internal_box_new, + gui_internal_label_new, + gui_internal_image_new, + gui_internal_keyboard, + gui_internal_menu, + gui_internal_get_flags, + gui_internal_set_flags, + gui_internal_get_state, + gui_internal_set_state, + gui_internal_set_func, + gui_internal_set_data, + gui_internal_set_default_background, +}; + +static void +gui_internal_cmd_write(struct gui_priv * this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + char *str=NULL,*str2=NULL; + dbg(1,"enter %s %p %p %p\n",function,in,out,valid); + if (!in || !in[0]) + return; + dbg(1,"%s\n",attr_to_name(in[0]->type)); + if (ATTR_IS_STRING(in[0]->type)) { + str=in[0]->u.str; + } + if (ATTR_IS_COORD_GEO(in[0]->type)) { + str=str2=coordinates_geo(in[0]->u.coord_geo, '\n'); + } + if (str) { + str=g_strdup_printf("%s\n",str); + xml_parse_text(str, this, gui_internal_html_start, gui_internal_html_end, gui_internal_html_text); + } + g_free(str); + g_free(str2); +} + + +/** + * @brief Creates a new table widget. + * + * Creates and returns a new table widget. This function will + * setup next/previous buttons as children. + * + * @param this The graphics context. + * @param flags widget sizing flags. + * @returns The newly created widget + */ +struct widget * gui_internal_widget_table_new(struct gui_priv * this, enum flags flags, int buttons) +{ + struct widget * widget = g_new0(struct widget,1); + struct table_data * data = NULL; + widget->type=widget_table; + widget->flags=flags; + widget->data = g_new0(struct table_data,1); + widget->data_free=gui_internal_table_data_free; + + // We have to set background here explicitly + // because it will be used by inner elements created later in this + // function (navigation buttons). Else that elements won't have + // any background. + widget->background=this->background; + data = (struct table_data*)widget->data; + + if (buttons) { + data->next_button=gui_internal_box_new(this, gravity_center|orientation_horizontal); + gui_internal_widget_append(data->next_button, gui_internal_text_new(this,_("Next"),gravity_center|orientation_horizontal)); + gui_internal_widget_append(data->next_button, gui_internal_image_new(this, image_new_xs(this, "gui_arrow_right"))); + data->next_button->func=gui_internal_table_button_next; + data->next_button->data=widget; + + + data->prev_button = gui_internal_button_new_with_callback + (this, _("Prev"), + image_new_xs(this, "gui_arrow_left"), + gravity_center |orientation_horizontal, + gui_internal_table_button_prev,NULL); + + data->prev_button->data=widget; + + data->this=this; + + data->button_box=gui_internal_box_new(this, + gravity_center|orientation_horizontal); + gui_internal_widget_append(widget, data->button_box); + gui_internal_widget_append(data->button_box, data->prev_button); + gui_internal_widget_append(data->button_box, data->next_button); + + data->button_box->bl=this->spacing; + gui_internal_widget_pack(this,data->button_box); + } + + return widget; + +} + +/** + * @brief Clears all the rows from the table. + * This function removes all rows from a table. + * New rows can later be added to the table. + */ +void gui_internal_widget_table_clear(struct gui_priv * this,struct widget * table) +{ + GList * iter; + struct table_data * table_data = (struct table_data* ) table->data; + + iter = table->children; + while(iter ) { + if(iter->data != table_data->button_box) { + struct widget * child = (struct widget*)iter->data; + gui_internal_widget_destroy(this,child); + if(table->children == iter) { + table->children = g_list_remove(iter,iter->data); + iter=table->children; + } + else + iter = g_list_remove(iter,iter->data); + } + else { + iter = g_list_next(iter); + } + + } + table_data->top_row=NULL; + table_data->bottom_row=NULL; + if(table_data->page_headers) + g_list_free(table_data->page_headers); + table_data->page_headers=NULL; +} + +/** + * @brief Check if table has any data rows filled. + * @param this The graphics context + * @param table table widget + * @returns 1 if the table is empty, 0 if there any data rows present. + */ +static int gui_internal_widget_table_is_empty(struct gui_priv *this, struct widget * table) +{ + GList *l; + struct table_data *td=(struct table_data*) table->data; + + for(l=table->children;l;l=g_list_next(l)) { + if(l->data != td->button_box) + return 0; + } + + return 1; +} + +/** + * Creates a new table_row widget. + * @param this The graphics context + * @param flags Sizing flags for the row + * @returns The new table_row widget. + */ +struct widget * gui_internal_widget_table_row_new(struct gui_priv * this, enum flags flags) +{ + struct widget * widget = g_new0(struct widget,1); + widget->type=widget_table_row; + widget->flags=flags; + return widget; +} + + + +/** + * @brief Computes the column dimensions for the table. + * + * @param w The table widget to compute dimensions for. + * + * This function examines all of the rows and columns for the table w + * and returns a list (GList) of table_column_desc elements that + * describe each column of the table. + * + * The caller is responsible for freeing the returned list. + */ +static GList * gui_internal_compute_table_dimensions(struct gui_priv * this,struct widget * w) +{ + + GList * column_desc = NULL; + GList * current_desc=NULL; + GList * cur_row = w->children; + struct widget * cur_row_widget=NULL; + GList * cur_column=NULL; + struct widget * cell_w=NULL; + struct table_column_desc * current_cell=NULL; + struct table_data * table_data=NULL; + int height=0; + int width=0; + int total_width=0; + int column_count=0; + + /** + * Scroll through the the table and + * 1. Compute the maximum width + height of each column across all rows. + */ + table_data = (struct table_data*) w->data; + for(cur_row=w->children; cur_row ; cur_row = g_list_next(cur_row) ) + { + cur_row_widget = (struct widget*) cur_row->data; + current_desc = column_desc; + if(cur_row_widget == table_data->button_box) + { + continue; + } + column_count=0; + for(cur_column = cur_row_widget->children; cur_column; + cur_column=g_list_next(cur_column)) + { + cell_w = (struct widget*) cur_column->data; + gui_internal_widget_pack(this,cell_w); + if(current_desc == 0) + { + current_cell = g_new0(struct table_column_desc,1); + column_desc = g_list_append(column_desc,current_cell); + current_desc = g_list_last(column_desc); + current_cell->height=cell_w->h; + current_cell->width=cell_w->w; + total_width+=cell_w->w; + + } + else + { + current_cell = current_desc->data; + height = cell_w->h; + width = cell_w->w; + if(current_cell->height < height ) + { + current_cell->height = height; + } + if(current_cell->width < width) + { + total_width += (width-current_cell->width); + current_cell->width = width; + + + + } + current_desc = g_list_next(current_desc); + } + column_count++; + + }/* column loop */ + + } /*row loop */ + + + /** + * If the width of all columns is less than the width off + * the table expand each cell proportionally. + * + */ + if(total_width+(this->spacing*column_count) < w->w ) { + for(current_desc=column_desc; current_desc; current_desc=g_list_next(current_desc)) { + current_cell = (struct table_column_desc*) current_desc->data; + current_cell->width= ( (current_cell->width+this->spacing)/(float)total_width) * w->w ; + } + } + + return column_desc; +} + + +/** + * @brief Computes the height and width for the table. + * + * The height and widht are computed to display all cells in the table + * at the requested height/width. + * + * @param this The graphics context + * @param w The widget to pack. + * + */ +void gui_internal_table_pack(struct gui_priv * this, struct widget * w) +{ + + int height=0; + int width=0; + int count=0; + GList * column_data = gui_internal_compute_table_dimensions(this,w); + GList * current=0; + struct table_column_desc * cell_desc=0; + struct table_data * table_data = (struct table_data*)w->data; + + for(current = column_data; current; current=g_list_next(current)) + { + if(table_data->button_box == current->data ) + { + continue; + } + cell_desc = (struct table_column_desc *) current->data; + width = width + cell_desc->width + this->spacing; + if(height < cell_desc->height) + { + height = cell_desc->height ; + } + } + + + + for(current=w->children; current; current=g_list_next(current)) + { + if(current->data!= table_data->button_box) + { + count++; + } + } + + w->w = width; + if(w->w + w->c.x > this->root.w) + { + w->w = this->root.w - w->c.x; + } + + + if(w->h + w->c.y > this->root.h ) + { + /** + * Do not allow the widget to exceed the screen. + * + */ + w->h = this->root.h- w->c.y - height; + } + + if (table_data->button_box) + { + gui_internal_widget_pack(this,table_data->button_box); + } + + + /** + * Deallocate column descriptions. + */ + current = column_data; + while( (current = g_list_last(current)) ) + { + current = g_list_remove(current,current->data); + } + +} + +/** + * @brief Invalidates coordinates for previosly rendered table widget rows. + * + * @param table_data Data from the table object. + */ +void gui_internal_table_hide_rows(struct table_data * table_data) +{ + GList*cur_row; + for(cur_row=table_data->top_row; cur_row ; cur_row = g_list_next(cur_row)) + { + struct widget * cur_row_widget = (struct widget*)cur_row->data; + if (cur_row_widget->type!=widget_table_row) + continue; + cur_row_widget->p.x=0; + cur_row_widget->p.y=0; + cur_row_widget->w=0; + cur_row_widget->h=0; + if(cur_row==table_data->bottom_row) + break; + } +} + +/** + * @brief Renders a table widget. + * + * @param this The graphics context + * @param w The table widget to render. + */ +void gui_internal_table_render(struct gui_priv * this, struct widget * w) +{ + + int x; + int y; + GList * column_desc=NULL; + GList * cur_row = NULL; + GList * current_desc=NULL; + struct table_data * table_data = (struct table_data*)w->data; + int is_skipped=0; + int is_first_page=1; + struct table_column_desc * dim=NULL; + + dbg_assert(table_data); + column_desc = gui_internal_compute_table_dimensions(this,w); + if(!column_desc) + return; + y=w->p.y; + gui_internal_table_hide_rows(table_data); + /** + * Skip rows that are on previous pages. + */ + cur_row = w->children; + if(table_data->top_row && table_data->top_row != w->children && !table_data->button_box_hide) + { + cur_row = table_data->top_row; + is_first_page=0; + } else { + table_data->top_row=NULL; + } + /** + * Loop through each row. Drawing each cell with the proper sizes, + * at the proper positions. + */ + for(table_data->top_row=cur_row; cur_row; cur_row = g_list_next(cur_row)) + { + int max_height=0, bbox_height=0; + struct widget * cur_row_widget; + GList * cur_column=NULL; + current_desc = column_desc; + cur_row_widget = (struct widget*)cur_row->data; + x =w->p.x+this->spacing; + if(cur_row_widget == table_data->button_box ) + { + continue; + } + dim = (struct table_column_desc*)current_desc->data; + + if (table_data->button_box && !table_data->button_box_hide) + bbox_height=table_data->button_box->h; + + if( y + dim->height + bbox_height + this->spacing >= w->p.y + w->h ) + { + /* + * No more drawing space left. + */ + is_skipped=1; + break; + } + for(cur_column = cur_row_widget->children; cur_column; + cur_column=g_list_next(cur_column)) + { + struct widget * cur_widget = (struct widget*) cur_column->data; + dim = (struct table_column_desc*)current_desc->data; + + cur_widget->p.x=x; + cur_widget->w=dim->width; + cur_widget->p.y=y; + cur_widget->h=dim->height; + x=x+cur_widget->w; + max_height = dim->height; + /* We pack the widget before rendering to ensure that the x and y + * coordinates get pushed down. + */ + gui_internal_widget_pack(this,cur_widget); + gui_internal_widget_render(this,cur_widget); + + if(dim->height > max_height) + { + max_height = dim->height; + } + } + + /* Row object should have its coordinates in actual + * state to be able to pass mouse clicks to Column objects + */ + cur_row_widget->p.x=w->p.x; + cur_row_widget->w=w->w; + cur_row_widget->p.y=y; + cur_row_widget->h=max_height; + y = y + max_height; + table_data->bottom_row=cur_row; + current_desc = g_list_next(current_desc); + } + if(table_data->button_box && (is_skipped || !is_first_page) && !table_data->button_box_hide ) + { + table_data->button_box->p.y =w->p.y+w->h-table_data->button_box->h - + this->spacing; + if(table_data->button_box->p.y < y ) + { + table_data->button_box->p.y=y; + } + table_data->button_box->p.x = w->p.x; + table_data->button_box->w = w->w; + // table_data->button_box->h = w->h - y; + // table_data->next_button->h=table_data->button_box->h; + // table_data->prev_button->h=table_data->button_box->h; + // table_data->next_button->c.y=table_data->button_box->c.y; + // table_data->prev_button->c.y=table_data->button_box->c.y; + gui_internal_widget_pack(this,table_data->button_box); + if(table_data->next_button->p.y > w->p.y + w->h + table_data->next_button->h) + { + table_data->button_box->p.y = w->p.y + w->h - + table_data->button_box->h; + } + if(is_skipped) + { + table_data->next_button->state|= STATE_SENSITIVE; + } + else + { + table_data->next_button->state&= ~STATE_SENSITIVE; + } + + if(table_data->top_row != w->children) + { + table_data->prev_button->state|= STATE_SENSITIVE; + } + else + { + table_data->prev_button->state&= ~STATE_SENSITIVE; + } + gui_internal_widget_render(this,table_data->button_box); + } + + /** + * Deallocate column descriptions. + */ + current_desc = column_desc; + while( (current_desc = g_list_last(current_desc)) ) + { + current_desc = g_list_remove(current_desc,current_desc->data); + } +} + + +/** + * @brief Displays Route information + * + * @li The name of the active vehicle + * @param wm The button that was pressed. + * @param v Unused + */ +static void +gui_internal_cmd2_route_description(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + + + struct widget * menu; + struct widget * row; + struct widget * box; + + + if(! this->vehicle_cb) + { + /** + * Register the callback on vehicle updates. + */ + this->vehicle_cb = callback_new_attr_1(callback_cast(gui_internal_route_update), + attr_position_coord_geo,this); + navit_add_callback(this->nav,this->vehicle_cb); + } + + this->route_data.route_table = gui_internal_widget_table_new(this,gravity_left_top | flags_fill | flags_expand |orientation_vertical,1); + + row = gui_internal_widget_table_row_new(this,gravity_left | orientation_horizontal | flags_fill); + + + menu=gui_internal_menu(this,_("Route Description")); + + menu->free=gui_internal_route_screen_free; + this->route_data.route_showing=1; + this->route_data.route_table->spx = this->spacing; + + + box = gui_internal_box_new(this, gravity_left_top| orientation_vertical | flags_fill | flags_expand); + + // gui_internal_widget_append(box,gui_internal_box_new_with_label(this,"Test")); + gui_internal_widget_append(box,this->route_data.route_table); + box->w=menu->w; + box->spx = this->spacing; + this->route_data.route_table->w=box->w; + gui_internal_widget_append(menu,box); + gui_internal_populate_route_table(this,this->nav); + gui_internal_menu_render(this); + +} + +static int +line_intersection(struct coord* a1, struct coord *a2, struct coord * b1, struct coord *b2, struct coord *res) +{ + int n, a, b; + int adx=a2->x-a1->x; + int ady=a2->y-a1->y; + int bdx=b2->x-b1->x; + int bdy=b2->y-b1->y; + n = bdy * adx - bdx * ady; + a = bdx * (a1->y - b1->y) - bdy * (a1->x - b1->x); + b = adx * (a1->y - b1->y) - ady * (a1->x - b1->x); + if (n < 0) { + n = -n; + a = -a; + b = -b; + } + if (a < 0 || b < 0) + return 0; + if (a > n || b > n) + return 0; + if (n == 0) { + dbg(0,"a=%d b=%d n=%d\n", a, b, n); + dbg(0,"a1=0x%x,0x%x ad %d,%d\n", a1->x, a1->y, adx, ady); + dbg(0,"b1=0x%x,0x%x bd %d,%d\n", b1->x, b1->y, bdx, bdy); + dbg_assert(n != 0); + } + res->x = a1->x + a * adx / n; + res->y = a1->y + a * ady / n; + return 1; +} + +struct heightline { + struct heightline *next; + int height; + struct coord_rect bbox; + int count; + struct coord c[0]; +}; + +struct diagram_point { + struct diagram_point *next; + struct coord c; +}; + +static struct heightline * +item_get_heightline(struct item *item) +{ + struct heightline *ret=NULL; + struct street_data *sd; + struct attr attr; + int i,height; + + if (item_attr_get(item, attr_label, &attr)) { + height=atoi(attr.u.str); + sd=street_get_data(item); + if (sd && sd->count > 1) { + ret=g_malloc(sizeof(struct heightline)+sd->count*sizeof(struct coord)); + ret->bbox.lu=sd->c[0]; + ret->bbox.rl=sd->c[0]; + ret->count=sd->count; + ret->height=height; + for (i = 0 ; i < sd->count ; i++) { + ret->c[i]=sd->c[i]; + coord_rect_extend(&ret->bbox, sd->c+i); + } + } + street_data_free(sd); + } + return ret; +} + + +/** + * @brief Displays Route Height Profile + * + * @li The name of the active vehicle + * @param wm The button that was pressed. + * @param v Unused + */ +static void +gui_internal_cmd2_route_height_profile(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + + + struct widget * menu, *box; + + struct map * map=NULL; + struct map_rect * mr=NULL; + struct route * route; + struct item * item =NULL; + struct mapset *ms; + struct mapset_handle *msh; + int x,i,first=1,dist=0; + struct coord c,last,res; + struct coord_rect rbbox,dbbox; + struct map_selection sel; + struct heightline *heightline,*heightlines=NULL; + struct diagram_point *min,*diagram_point,*diagram_points=NULL; + sel.next=NULL; + sel.order=18; + sel.range.min=type_height_line_1; + sel.range.max=type_height_line_3; + + + menu=gui_internal_menu(this,_("Height Profile")); + box = gui_internal_box_new(this, gravity_left_top| orientation_vertical | flags_fill | flags_expand); + gui_internal_widget_append(menu, box); + route = navit_get_route(this->nav); + if (route) + map = route_get_map(route); + if(map) + mr = map_rect_new(map,NULL); + if(mr) { + while((item = map_rect_get_item(mr))) { + while (item_coord_get(item, &c, 1)) { + if (first) { + first=0; + sel.u.c_rect.lu=c; + sel.u.c_rect.rl=c; + } else + coord_rect_extend(&sel.u.c_rect, &c); + } + } + map_rect_destroy(mr); + ms=navit_get_mapset(this->nav); + if (!first && ms) { + msh=mapset_open(ms); + while ((map=mapset_next(msh, 1))) { + mr=map_rect_new(map, &sel); + if (mr) { + while((item = map_rect_get_item(mr))) { + if (item->type >= sel.range.min && item->type <= sel.range.max) { + heightline=item_get_heightline(item); + if (heightline) { + heightline->next=heightlines; + heightlines=heightline; + } + } + } + map_rect_destroy(mr); + } + } + mapset_close(msh); + } + } + map=NULL; + mr=NULL; + if (route) + map = route_get_map(route); + if(map) + mr = map_rect_new(map,NULL); + if(mr && heightlines) { + while((item = map_rect_get_item(mr))) { + first=1; + while (item_coord_get(item, &c, 1)) { + if (first) + first=0; + else { + heightline=heightlines; + rbbox.lu=last; + rbbox.rl=last; + coord_rect_extend(&rbbox, &c); + while (heightline) { + if (coord_rect_overlap(&rbbox, &heightline->bbox)) { + for (i = 0 ; i < heightline->count - 1; i++) { + if (heightline->c[i].x != heightline->c[i+1].x || heightline->c[i].y != heightline->c[i+1].y) { + if (line_intersection(heightline->c+i, heightline->c+i+1, &last, &c, &res)) { + diagram_point=g_new(struct diagram_point, 1); + diagram_point->c.x=dist+transform_distance(projection_mg, &last, &res); + diagram_point->c.y=heightline->height; + diagram_point->next=diagram_points; + diagram_points=diagram_point; + dbg(0,"%d %d\n", diagram_point->c.x, diagram_point->c.y); + } + } + } + } + heightline=heightline->next; + } + dist+=transform_distance(projection_mg, &last, &c); + } + last=c; + } + + } + map_rect_destroy(mr); + } + + + gui_internal_menu_render(this); + first=1; + diagram_point=diagram_points; + while (diagram_point) { + if (first) { + dbbox.lu=diagram_point->c; + dbbox.rl=diagram_point->c; + first=0; + } else + coord_rect_extend(&dbbox, &diagram_point->c); + diagram_point=diagram_point->next; + } + dbg(0,"%d %d %d %d\n", dbbox.lu.x, dbbox.lu.y, dbbox.rl.x, dbbox.rl.y); + if (dbbox.rl.x > dbbox.lu.x && dbbox.lu.x*100/(dbbox.rl.x-dbbox.lu.x) <= 25) + dbbox.lu.x=0; + if (dbbox.lu.y > dbbox.rl.y && dbbox.rl.y*100/(dbbox.lu.y-dbbox.rl.y) <= 25) + dbbox.rl.y=0; + dbg(0,"%d,%d %dx%d\n", box->p.x, box->p.y, box->w, box->h); + x=dbbox.lu.x; + first=1; + for (;;) { + struct point p[2]; + min=NULL; + diagram_point=diagram_points; + while (diagram_point) { + if (diagram_point->c.x >= x && (!min || min->c.x > diagram_point->c.x)) + min=diagram_point; + diagram_point=diagram_point->next; + } + if (! min) + break; + p[1].x=(min->c.x-dbbox.lu.x)*(box->w-10)/(dbbox.rl.x-dbbox.lu.x)+box->p.x+5; + p[1].y=(min->c.y-dbbox.rl.y)*(box->h-10)/(dbbox.lu.y-dbbox.rl.y)+box->p.y+5; + dbg(0,"%d,%d=%d,%d\n",min->c.x, min->c.y, p[1].x,p[1].y); + graphics_draw_circle(this->gra, this->foreground, &p[1], 2); + if (first) + first=0; + else + graphics_draw_lines(this->gra, this->foreground, p, 2); + p[0]=p[1]; + x=min->c.x+1; + } + + +} + +static void +gui_internal_cmd2_locale(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + struct widget *menu,*wb,*w; + char *text; + + graphics_draw_mode(this->gra, draw_mode_begin); + menu=gui_internal_menu(this, _("Show Locale")); + menu->spx=this->spacing*10; + wb=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(menu, wb); + text=g_strdup_printf("LANG=%1$s (1=%3$s 2=%2$s)",getenv("LANG"),"2","1"); + gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); + w->flags=gravity_left_center|orientation_horizontal|flags_fill; + g_free(text); +#ifdef HAVE_API_WIN32_BASE + { + char country[32],lang[32]; +#ifdef HAVE_API_WIN32_CE + wchar_t wcountry[32],wlang[32]; + + GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, wlang, sizeof(wlang)); + WideCharToMultiByte(CP_ACP,0,wlang,-1,lang,sizeof(lang),NULL,NULL); +#else + GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, lang, sizeof(lang)); +#endif + text=g_strdup_printf("LOCALE_SABBREVLANGNAME=%s",lang); + gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); + w->flags=gravity_left_center|orientation_horizontal|flags_fill; + g_free(text); +#ifdef HAVE_API_WIN32_CE + GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVCTRYNAME, wcountry, sizeof(wcountry)); + WideCharToMultiByte(CP_ACP,0,wcountry,-1,country,sizeof(country),NULL,NULL); +#else + GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVCTRYNAME, country, sizeof(country)); +#endif + text=g_strdup_printf("LOCALE_SABBREVCTRYNAME=%s",country); + gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); + w->flags=gravity_left_center|orientation_horizontal|flags_fill; + g_free(text); + } +#endif + + gui_internal_menu_render(this); + graphics_draw_mode(this->gra, draw_mode_end); +} + +static void +gui_internal_cmd2_about(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + struct widget *menu,*wb,*w; + char *text; + + graphics_draw_mode(this->gra, draw_mode_begin); + menu=gui_internal_menu(this, _("About Navit")); + menu->spx=this->spacing*10; + wb=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand); + gui_internal_widget_append(menu, wb); + + //Icon + gui_internal_widget_append(wb, w=gui_internal_image_new(this, image_new_xs(this, "navit"))); + w->flags=gravity_top_center|orientation_horizontal|flags_fill; + + //app name + text=g_strdup_printf("%s",PACKAGE_NAME); + gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); + w->flags=gravity_top_center|orientation_horizontal|flags_expand; + g_free(text); + + //Version + text=g_strdup_printf("%s",version); + gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); + w->flags=gravity_top_center|orientation_horizontal|flags_expand; + g_free(text); + + //Site + text=g_strdup_printf("http://www.navit-project.org/"); + gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); + w->flags=gravity_top_center|orientation_horizontal|flags_expand; + g_free(text); + + //Authors + text=g_strdup_printf("%s:",_("By")); + gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); + w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; + g_free(text); + text=g_strdup_printf("Martin Schaller"); + gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); + w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; + g_free(text); + text=g_strdup_printf("Michael Farmbauer"); + gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); + w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; + g_free(text); + text=g_strdup_printf("Alexander Atanasov"); + gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); + w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; + g_free(text); + text=g_strdup_printf("Pierre Grandin"); + gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); + w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; + g_free(text); + + //Contributors + text=g_strdup_printf("%s",_("And all the Navit Team")); + gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); + w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; + g_free(text); + text=g_strdup_printf("%s",_("members and contributors.")); + gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); + w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; + g_free(text); + + gui_internal_menu_render(this); + graphics_draw_mode(this->gra, draw_mode_end); +} + +/** + * @brief handles the 'next page' table event. + * A callback function that is invoked when the 'next page' button is pressed + * to advance the contents of a table widget. + * + * @param this The graphics context. + * @param wm The button widget that was pressed. + */ +static void gui_internal_table_button_next(struct gui_priv * this, struct widget * wm, void *data) +{ + struct widget * table_widget = (struct widget * ) wm->data; + struct table_data * table_data = NULL; + int found=0; + GList * iterator; + + if(table_widget) + { + table_data = (struct table_data*) table_widget->data; + + } + if(table_data) + { + /** + * Before advancing to the next page we need to ensure + * that the current top_row is in the list of previous top_rows + * so previous page can work. + * + */ + for(iterator=table_data->page_headers; iterator != NULL; + iterator = g_list_next(iterator) ) + { + if(iterator->data == table_data->top_row) + { + found=1; + break; + } + + } + if( ! found) + { + table_data->page_headers=g_list_append(table_data->page_headers, + table_data->top_row); + } + /** + * Invalidate row coordinates for all rows which were previously rendered + + for(iterator=table_data->top_row; iterator && table_data->rows_on_page; iterator = g_list_next(iterator)) + { + struct widget * cur_row_widget = (struct widget*)iterator->data; + cur_row_widget->p.x=-1; + cur_row_widget->p.y=-1; + cur_row_widget->w=0; + cur_row_widget->h=0; + table_data->rows_on_page--; + } + */ + gui_internal_table_hide_rows(table_data); + table_data->top_row=g_list_next(table_data->bottom_row); + } + wm->state&= ~STATE_HIGHLIGHTED; + gui_internal_menu_render(this); +} + + + +/** + * @brief handles the 'previous page' table event. + * A callback function that is invoked when the 'previous page' button is pressed + * to go back in the contents of a table widget. + * + * @param this The graphics context. + * @param wm The button widget that was pressed. + */ +static void gui_internal_table_button_prev(struct gui_priv * this, struct widget * wm, void *data) +{ + struct widget * table_widget = (struct widget * ) wm->data; + struct table_data * table_data = NULL; + GList * current_page_top=NULL; + + GList * iterator; + if(table_widget) + { + table_data = (struct table_data*) table_widget->data; + if(table_data) + { + gui_internal_table_hide_rows(table_data); + current_page_top = table_data->top_row; + for(iterator = table_data->page_headers; iterator != NULL; + iterator = g_list_next(iterator)) + { + if(current_page_top == iterator->data) + { + break; + } + table_data->top_row = (GList*) iterator->data; + } + } + } + wm->state&= ~STATE_HIGHLIGHTED; + gui_internal_menu_render(this); +} + + +/** + * @brief deallocates a table_data structure. + * + */ +void gui_internal_table_data_free(void * p) +{ + + + /** + * @note button_box and its children (next_button,prev_button) + * have their memory managed by the table itself. + */ + struct table_data * table_data = (struct table_data*) p; + g_list_free(table_data->page_headers); + g_free(p); + + +} + + +/** + * @brief Called when the route is updated. + */ +void gui_internal_route_update(struct gui_priv * this, struct navit * navit, struct vehicle *v) +{ + + if(this->route_data.route_showing) { + gui_internal_populate_route_table(this,navit); + graphics_draw_mode(this->gra, draw_mode_begin); + gui_internal_menu_render(this); + graphics_draw_mode(this->gra, draw_mode_end); + } + + +} + + +/** + * @brief Called when the route screen is closed (deallocated). + * + * The main purpose of this function is to remove the widgets from + * references route_data because those widgets are about to be freed. + */ +void gui_internal_route_screen_free(struct gui_priv * this_,struct widget * w) +{ + if(this_) { + this_->route_data.route_showing=0; + this_->route_data.route_table=NULL; + g_free(w); + } + +} + +/** + * @brief Populates the route table with route information + * + * @param this The gui context + * @param navit The navit object + */ +void gui_internal_populate_route_table(struct gui_priv * this, + struct navit * navit) +{ + struct map * map=NULL; + struct map_rect * mr=NULL; + struct navigation * nav = NULL; + struct item * item =NULL; + struct attr attr; + struct widget * label = NULL; + struct widget * row = NULL; + struct coord c; + nav = navit_get_navigation(navit); + if(!nav) { + return; + } + map = navigation_get_map(nav); + if(map) + mr = map_rect_new(map,NULL); + if(mr) { + gui_internal_widget_table_clear(this,this->route_data.route_table); + while((item = map_rect_get_item(mr))) { + if(item_attr_get(item,attr_navigation_long,&attr)) { + row = gui_internal_widget_table_row_new(this, + gravity_left + | flags_fill + | orientation_horizontal); + gui_internal_widget_append(this->route_data.route_table,row); + + label = gui_internal_label_new(this,attr.u.str); + gui_internal_widget_append(row,label); + + label->item=*item; + item_coord_get(item, &c, 1); + label->c.x=c.x; + label->c.y=c.y; + label->c.pro=map_projection(map); + label->func=gui_internal_cmd_position; + label->state|=STATE_SENSITIVE; + label->data=(void*)2; + } + + } + + } +} + +static struct command_table commands[] = { + {"abort_navigation",command_cast(gui_internal_cmd2_abort_navigation)}, + {"back",command_cast(gui_internal_cmd2_back)}, + {"back_to_map",command_cast(gui_internal_cmd2_back_to_map)}, + {"bookmarks",command_cast(gui_internal_cmd2_bookmarks)}, + {"formerdests",command_cast(gui_internal_cmd_formerdests)}, + {"get_data",command_cast(gui_internal_get_data)}, + {"locale",command_cast(gui_internal_cmd2_locale)}, + {"log",command_cast(gui_internal_cmd_log)}, + {"menu",command_cast(gui_internal_cmd_menu2)}, + {"position",command_cast(gui_internal_cmd2_position)}, + {"pois",command_cast(gui_internal_cmd2_pois)}, + {"route_description",command_cast(gui_internal_cmd2_route_description)}, + {"route_height_profile",command_cast(gui_internal_cmd2_route_height_profile)}, + {"set",command_cast(gui_internal_cmd2_set)}, + {"setting_layout",command_cast(gui_internal_cmd2_setting_layout)}, + {"setting_maps",command_cast(gui_internal_cmd2_setting_maps)}, + {"setting_rules",command_cast(gui_internal_cmd2_setting_rules)}, + {"setting_vehicle",command_cast(gui_internal_cmd2_setting_vehicle)}, + {"town",command_cast(gui_internal_cmd2_town)}, + {"quit",command_cast(gui_internal_cmd2_quit)}, + {"write",command_cast(gui_internal_cmd_write)}, + {"about",command_cast(gui_internal_cmd2_about)}, + +}; + + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +static struct gui_priv * gui_internal_new(struct navit *nav, struct gui_methods *meth, struct attr **attrs, struct gui *gui) +{ + struct color color_white={0xffff,0xffff,0xffff,0xffff}; + struct color color_black={0x0,0x0,0x0,0xffff}; + struct color back2_color={0x4141,0x4141,0x4141,0xffff}; + + struct gui_priv *this; + struct attr *attr; + *meth=gui_internal_methods; + this=g_new0(struct gui_priv, 1); + this->nav=nav; + + this->self.type=attr_gui; + this->self.u.gui=gui; + + if ((attr=attr_search(attrs, NULL, attr_menu_on_map_click))) + this->menu_on_map_click=attr->u.num; + else + this->menu_on_map_click=1; + if ((attr=attr_search(attrs, NULL, attr_signal_on_map_click))) + this->signal_on_map_click=attr->u.num; + + if ((attr=attr_search(attrs, NULL, attr_callback_list))) { + command_add_table(attr->u.callback_list, commands, sizeof(commands)/sizeof(struct command_table), this); + } + + if( (attr=attr_search(attrs,NULL,attr_font_size))) + { + this->config.font_size=attr->u.num; + } + else + { + this->config.font_size=-1; + } + if( (attr=attr_search(attrs,NULL,attr_icon_xs))) + { + this->config.icon_xs=attr->u.num; + } + else + { + this->config.icon_xs=-1; + } + if( (attr=attr_search(attrs,NULL,attr_icon_l))) + { + this->config.icon_l=attr->u.num; + } + else + { + this->config.icon_l=-1; + } + if( (attr=attr_search(attrs,NULL,attr_icon_s))) + { + this->config.icon_s=attr->u.num; + } + else + { + this->config.icon_s=-1; + } + if( (attr=attr_search(attrs,NULL,attr_spacing))) + { + this->config.spacing=attr->u.num; + } + else + { + this->config.spacing=-1; + } + if( (attr=attr_search(attrs,NULL,attr_gui_speech))) + { + this->speech=attr->u.num; + } + if( (attr=attr_search(attrs,NULL,attr_keyboard))) + this->keyboard=attr->u.num; + else + this->keyboard=1; + + if( (attr=attr_search(attrs,NULL,attr_fullscreen))) + this->fullscreen=attr->u.num; + + if( (attr=attr_search(attrs,NULL,attr_flags))) + this->flags=attr->u.num; + if( (attr=attr_search(attrs,NULL,attr_background_color))) + this->background_color=*attr->u.color; + else + this->background_color=color_black; + if( (attr=attr_search(attrs,NULL,attr_background_color2))) + this->background2_color=*attr->u.color; + else + this->background2_color=back2_color; + if( (attr=attr_search(attrs,NULL,attr_text_color))) + this->text_foreground_color=*attr->u.color; + else + this->text_foreground_color=color_white; + this->text_background_color=color_black; + if( (attr=attr_search(attrs,NULL,attr_columns))) + this->cols=attr->u.num; + if( (attr=attr_search(attrs,NULL,attr_osd_configuration))) + this->osd_configuration=*attr; + + if( (attr=attr_search(attrs,NULL,attr_pitch))) + this->pitch=attr->u.num; + else + this->pitch=20; + if( (attr=attr_search(attrs,NULL,attr_flags_town))) + this->flags_town=attr->u.num; + else + this->flags_town=-1; + if( (attr=attr_search(attrs,NULL,attr_flags_street))) + this->flags_street=attr->u.num; + else + this->flags_street=-1; + if( (attr=attr_search(attrs,NULL,attr_flags_house_number))) + this->flags_house_number=attr->u.num; + else + this->flags_house_number=-1; + if( (attr=attr_search(attrs,NULL,attr_radius))) + this->radius=attr->u.num; + else + this->radius=10; + this->data.priv=this; + this->data.gui=&gui_internal_methods_ext; + this->data.widget=&gui_internal_widget_methods; + this->cbl=callback_list_new(); + + return this; +} + +//############################################################################################################## +//# Description: +//# Comment: +//# Authors: Martin Schaller (04/2008) +//############################################################################################################## +void plugin_init(void) +{ + plugin_register_gui_type("internal", gui_internal_new); +} + +static void +gui_internal_destroy(struct gui_priv *this) +{ + g_free(this->country_iso2); + g_free(this->href); + g_free(this->html_text); + g_free(this); +} diff --git a/navit/gui/internal/gui_internal.h b/navit/gui/internal/gui_internal.h new file mode 100644 index 0000000..9363275 --- /dev/null +++ b/navit/gui/internal/gui_internal.h @@ -0,0 +1,77 @@ +struct widget; // defined in gui_internal.c +struct graphics_image; + +#define STATE_VISIBLE 1 +#define STATE_SELECTED 2 +#define STATE_HIGHLIGHTED 4 +#define STATE_SENSITIVE 8 +#define STATE_EDIT 16 +#define STATE_CLEAR 32 +#define STATE_EDITABLE 64 + +enum widget_type { + widget_box=1, + widget_button, + widget_label, + widget_image, + widget_table, + widget_table_row +}; + +enum flags { + gravity_none=0x00, + gravity_left=1, + gravity_xcenter=2, + gravity_right=4, + gravity_top=8, + gravity_ycenter=16, + gravity_bottom=32, + gravity_left_top=gravity_left|gravity_top, + gravity_top_center=gravity_xcenter|gravity_top, + gravity_right_top=gravity_right|gravity_top, + gravity_left_center=gravity_left|gravity_ycenter, + gravity_center=gravity_xcenter|gravity_ycenter, + gravity_right_center=gravity_right|gravity_ycenter, + gravity_left_bottom=gravity_left|gravity_bottom, + gravity_bottom_center=gravity_xcenter|gravity_bottom, + gravity_right_bottom=gravity_right|gravity_bottom, + flags_expand=0x100, + flags_fill=0x200, + orientation_horizontal=0x10000, + orientation_vertical=0x20000, + orientation_horizontal_vertical=0x40000, +}; + + +struct gui_internal_methods { + void (*add_callback)(struct gui_priv *priv, struct callback *cb); + void (*remove_callback)(struct gui_priv *priv, struct callback *cb); + void (*menu_render)(struct gui_priv *this); + struct graphics_image * (*image_new_xs)(struct gui_priv *this, const char *name); + struct graphics_image * (*image_new_l)(struct gui_priv *this, const char *name); +}; + +struct gui_internal_widget_methods { + void (*append)(struct widget *parent, struct widget *child); + struct widget * (*button_new)(struct gui_priv *this, char *text, struct graphics_image *image, enum flags flags); + struct widget * (*button_new_with_callback)(struct gui_priv *this, char *text, struct graphics_image *image, enum flags flags, void(*func)(struct gui_priv *priv, struct widget *widget, void *data), void *data); + struct widget * (*box_new)(struct gui_priv *this, enum flags flags); + struct widget * (*label_new)(struct gui_priv *this, char *text); + struct widget * (*image_new)(struct gui_priv *this, struct graphics_image *image); + struct widget * (*keyboard)(struct gui_priv *this, int mode); + struct widget * (*menu)(struct gui_priv *this, const char *label); + enum flags (*get_flags)(struct widget *widget); + void (*set_flags)(struct widget *widget, enum flags flags); + int (*get_state)(struct widget *widget); + void (*set_state)(struct widget *widget, int state); + void (*set_func)(struct widget *widget, void (*func)(struct gui_priv *priv, struct widget *widget, void *data)); + void (*set_data)(struct widget *widget, void *data); + void (*set_default_background)(struct gui_priv *this, struct widget *widget); + +}; + +struct gui_internal_data { + struct gui_priv *priv; + struct gui_internal_methods *gui; + struct gui_internal_widget_methods *widget; +}; diff --git a/navit/gui/qml/Makefile.am b/navit/gui/qml/Makefile.am new file mode 100644 index 0000000..a52b399 --- /dev/null +++ b/navit/gui/qml/Makefile.am @@ -0,0 +1,14 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @QT_DECLARATIVE_CFLAGS@ @QT_GUI_CFLAGS@ @QT_XML_CFLAGS@ @NAVIT_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=gui_qml +modulegui_LTLIBRARIES = libgui_qml.la +libgui_qml_la_SOURCES = proxy.moc proxy.h ngqpoint.moc ngqpoint.h searchProxy.moc routeProxy.h searchProxy.h bookmarksProxy.moc bookmarksProxy.h vehicleProxy.moc vehicleProxy.h navitProxy.moc navitProxy.h guiProxy.moc guiProxy.h gui_qml.moc gui_qml.cpp +libgui_qml_la_LDFLAGS = @QT_DECLARATIVE_LIBS@ @QT_GUI_LIBS@ @QT_XML_LIBS@ -module -avoid-version +BUILT_SOURCES = gui_qml.moc proxy.moc ngqpoint.moc routeProxy.moc searchProxy.moc bookmarksProxy.moc vehicleProxy.moc navitProxy.moc guiProxy.moc +%.moc: %.h + @MOC@ $(srcdir)/$< > $@ || touch $@ +%.moc: %.cpp + @MOC@ $(srcdir)/$< > $@ || touch $@ +distclean-local: + -$(RM) *.moc + +SUBDIRS=skins diff --git a/navit/gui/qml/Makefile.in b/navit/gui/qml/Makefile.in new file mode 100644 index 0000000..b74cc07 --- /dev/null +++ b/navit/gui/qml/Makefile.in @@ -0,0 +1,865 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/gui/qml +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(moduleguidir)" +LTLIBRARIES = $(modulegui_LTLIBRARIES) +libgui_qml_la_LIBADD = +am_libgui_qml_la_OBJECTS = gui_qml.lo +libgui_qml_la_OBJECTS = $(am_libgui_qml_la_OBJECTS) +libgui_qml_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(libgui_qml_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libgui_qml_la_SOURCES) +DIST_SOURCES = $(libgui_qml_la_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @QT_DECLARATIVE_CFLAGS@ @QT_GUI_CFLAGS@ @QT_XML_CFLAGS@ @NAVIT_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=gui_qml +modulegui_LTLIBRARIES = libgui_qml.la +libgui_qml_la_SOURCES = proxy.moc proxy.h ngqpoint.moc ngqpoint.h searchProxy.moc routeProxy.h searchProxy.h bookmarksProxy.moc bookmarksProxy.h vehicleProxy.moc vehicleProxy.h navitProxy.moc navitProxy.h guiProxy.moc guiProxy.h gui_qml.moc gui_qml.cpp +libgui_qml_la_LDFLAGS = @QT_DECLARATIVE_LIBS@ @QT_GUI_LIBS@ @QT_XML_LIBS@ -module -avoid-version +BUILT_SOURCES = gui_qml.moc proxy.moc ngqpoint.moc routeProxy.moc searchProxy.moc bookmarksProxy.moc vehicleProxy.moc navitProxy.moc guiProxy.moc +SUBDIRS = skins +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/gui/qml/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/gui/qml/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-moduleguiLTLIBRARIES: $(modulegui_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(moduleguidir)" || $(MKDIR_P) "$(DESTDIR)$(moduleguidir)" + @list='$(modulegui_LTLIBRARIES)'; test -n "$(moduleguidir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(moduleguidir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(moduleguidir)"; \ + } + +uninstall-moduleguiLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulegui_LTLIBRARIES)'; test -n "$(moduleguidir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(moduleguidir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(moduleguidir)/$$f"; \ + done + +clean-moduleguiLTLIBRARIES: + -test -z "$(modulegui_LTLIBRARIES)" || rm -f $(modulegui_LTLIBRARIES) + @list='$(modulegui_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgui_qml.la: $(libgui_qml_la_OBJECTS) $(libgui_qml_la_DEPENDENCIES) + $(libgui_qml_la_LINK) -rpath $(moduleguidir) $(libgui_qml_la_OBJECTS) $(libgui_qml_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_qml.Plo@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile $(LTLIBRARIES) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(moduleguidir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-recursive + +clean-am: clean-generic clean-libtool clean-moduleguiLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-local distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-moduleguiLTLIBRARIES + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-moduleguiLTLIBRARIES + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \ + ctags-recursive install install-am install-strip \ + tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + clean-moduleguiLTLIBRARIES ctags ctags-recursive distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-local distclean-tags distdir dvi dvi-am html html-am \ + info info-am install install-am install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-moduleguiLTLIBRARIES install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ + uninstall-moduleguiLTLIBRARIES + +%.moc: %.h + @MOC@ $(srcdir)/$< > $@ || touch $@ +%.moc: %.cpp + @MOC@ $(srcdir)/$< > $@ || touch $@ +distclean-local: + -$(RM) *.moc + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/gui/qml/bookmarksProxy.h b/navit/gui/qml/bookmarksProxy.h new file mode 100644 index 0000000..6fe95bd --- /dev/null +++ b/navit/gui/qml/bookmarksProxy.h @@ -0,0 +1,171 @@ +#ifndef NAVIT_GUI_QML_BOOKMARKSPROXY_H +#define NAVIT_GUI_QML_BOOKMARKSPROXY_H + +class NGQProxyBookmarks : public NGQProxy { + Q_OBJECT; + +public: + NGQProxyBookmarks(struct gui_priv* object, QObject* parent) : NGQProxy(object,parent) { }; + +public slots: + void moveRoot() { + struct attr mattr; + navit_get_attr(this->object->nav, attr_bookmarks, &mattr, NULL); + bookmarks_move_root(mattr.u.bookmarks); + } + void moveUp() { + struct attr mattr; + navit_get_attr(this->object->nav, attr_bookmarks, &mattr, NULL); + bookmarks_move_up(mattr.u.bookmarks); + } + void moveDown(QString path) { + struct attr mattr; + navit_get_attr(this->object->nav, attr_bookmarks, &mattr, NULL); + bookmarks_move_down(mattr.u.bookmarks,path.toLocal8Bit().constData()); + } + + QString getBookmarks() { + struct attr attr,mattr; + struct item* item; + struct coord c; + QDomDocument retDoc("bookmarks"); + QDomElement entries; + + entries=retDoc.createElement("bookmarks"); + retDoc.appendChild(entries); + + navit_get_attr(this->object->nav, attr_bookmarks, &mattr, NULL); + + if (bookmarks_item_cwd(mattr.u.bookmarks)) { + QDomElement entry=retDoc.createElement("bookmark"); + entry.appendChild(this->_fieldValueHelper(retDoc,"label","..")); + entry.appendChild(this->_fieldValueHelper(retDoc,"path","..")); + entry.appendChild(this->_fieldValueHelper(retDoc,"type",QString(item_to_name(type_bookmark_folder)))); + entry.appendChild(this->_fieldValueHelper(retDoc,"distance","")); + entry.appendChild(this->_fieldValueHelper(retDoc,"direction","")); + entry.appendChild(this->_fieldValueHelper(retDoc,"coords",QString("%1 %2").arg(0).arg(0))); + entries.appendChild(entry); + } + + bookmarks_item_rewind(mattr.u.bookmarks); + while ((item=bookmarks_get_item(mattr.u.bookmarks))) { + QString label; + QString path; + + if (item->type != type_bookmark && item->type != type_bookmark_folder) continue; + if (!item_attr_get(item, attr_label, &attr)) continue; + label=QString::fromLocal8Bit(attr.u.str); + if (!item_attr_get(item, attr_path, &attr)) { + path=""; + } + path=QString::fromLocal8Bit(attr.u.str); + item_coord_get(item, &c, 1); + QDomElement entry=retDoc.createElement("bookmark"); + entry.appendChild(this->_fieldValueHelper(retDoc,"label",label)); + entry.appendChild(this->_fieldValueHelper(retDoc,"path",path)); + entry.appendChild(this->_fieldValueHelper(retDoc,"type",QString(item_to_name(item->type)))); + //entry.appendChild(this->_fieldValueHelper(retDoc,"distance",QString::number(idist/1000))); + entry.appendChild(this->_fieldValueHelper(retDoc,"distance","100500")); + //entry.appendChild(this->_fieldValueHelper(retDoc,"direction",dirbuf)); + entry.appendChild(this->_fieldValueHelper(retDoc,"direction","nahut")); + entry.appendChild(this->_fieldValueHelper(retDoc,"coords",QString("%1 %2").arg(c.x).arg(c.y))); + entries.appendChild(entry); + } + + dbg(2,"%s\n",retDoc.toString().toLocal8Bit().constData()); + return retDoc.toString(); + } + QString AddFolder(QString description) { + struct attr attr; + navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL); + if (!bookmarks_add_bookmark(attr.u.bookmarks, NULL, description.toLocal8Bit().constData()) ) { + return "Failed!"; + } else { + return "Success"; + } + } + QString AddBookmark(QString description) { + struct attr attr; + navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL); + if (!bookmarks_add_bookmark(attr.u.bookmarks, this->object->currentPoint->pc(), description.toLocal8Bit().constData()) ) { + return "Failed!"; + } else { + return "Success"; + } + } + QString Cut(QString description) { + struct attr attr; + navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL); + if (!bookmarks_cut_bookmark(attr.u.bookmarks, description.toLocal8Bit().constData()) ) { + return "Failed!"; + } else { + return "Success"; + } + } + QString Copy(QString description) { + struct attr attr; + navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL); + if (!bookmarks_copy_bookmark(attr.u.bookmarks, description.toLocal8Bit().constData()) ) { + return "Failed!"; + } else { + return "Success"; + } + } + QString Paste() { + struct attr attr; + navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL); + if (!bookmarks_paste_bookmark(attr.u.bookmarks) ) { + return "Failed!"; + } else { + return "Success"; + } + } + QString Delete(QString bookmark) { + struct attr attr; + navit_get_attr(this->object->nav, attr_bookmarks, &attr, NULL); + if (!bookmarks_delete_bookmark(attr.u.bookmarks, bookmark.toLocal8Bit().constData()) ) { + return "Failed!"; + } else { + return "Success"; + } + } + void setPoint(QString bookmark) { + struct attr attr, mattr; + struct item* item; + struct coord c; + + navit_get_attr(this->object->nav, attr_bookmarks, &mattr, NULL); + + bookmarks_item_rewind(mattr.u.bookmarks); + while ((item=bookmarks_get_item(mattr.u.bookmarks))) { + QString label; + + if (item->type != type_bookmark) continue; + if (!item_attr_get(item, attr_label, &attr)) continue; + + label=QString::fromLocal8Bit(attr.u.str); + dbg(0,"Bookmark is %s\n",bookmark.toStdString().c_str()); + if (label.compare(bookmark)) continue; + item_coord_get(item, &c, 1); + if (this->object->currentPoint!=NULL) { + delete this->object->currentPoint; + } + this->object->currentPoint=new NGQPoint(this->object,&c,bookmark,Bookmark,NULL); + this->object->guiWidget->rootContext()->setContextProperty("point",this->object->currentPoint); + } + + return; + } + +protected: + int getAttrFunc(enum attr_type type, struct attr* attr, struct attr_iter* iter) { return 0; } + int setAttrFunc(struct attr* attr) {return 0; } + struct attr_iter* getIterFunc() { return NULL; }; + void dropIterFunc(struct attr_iter* iter) { return; }; + +private: +}; + +#include "bookmarksProxy.moc" + +#endif /* NAVIT_GUI_QML_BOOKMARKSPROXY_H */ diff --git a/navit/gui/qml/bookmarksProxy.moc b/navit/gui/qml/bookmarksProxy.moc new file mode 100644 index 0000000..e69de29 diff --git a/navit/gui/qml/guiProxy.h b/navit/gui/qml/guiProxy.h new file mode 100644 index 0000000..7648eb5 --- /dev/null +++ b/navit/gui/qml/guiProxy.h @@ -0,0 +1,152 @@ +#ifndef NAVIT_GUI_QML_GUIPROXY_H +#define NAVIT_GUI_QML_GUIPROXY_H + +class NGQProxyGui : public NGQProxy { + Q_OBJECT; + + Q_PROPERTY(QString iconPath READ iconPath CONSTANT); + + Q_PROPERTY(QString commandFunction READ commandFunction CONSTANT); + + Q_PROPERTY(QString localeName READ localeName CONSTANT); + Q_PROPERTY(QString langName READ langName CONSTANT); + Q_PROPERTY(QString ctryName READ ctryName CONSTANT); + + Q_PROPERTY(int width READ width WRITE setWidth NOTIFY widthSignal STORED false); + Q_PROPERTY(int height READ height WRITE setHeight NOTIFY heightSignal STORED false); + +private: + QStringList returnPath; + +public: + NGQProxyGui(struct gui_priv* this_,QObject *parent) : NGQProxy(this_, parent) { + this->source=QString(""); + } + + void setNewPoint(struct point* p,NGQPointTypes type) { + if (this->object->currentPoint!=NULL) { + delete this->object->currentPoint; + } + this->object->currentPoint = new NGQPoint(this->object,p,type,NULL); + this->object->guiWidget->rootContext()->setContextProperty("point",this->object->currentPoint); + } + void setNewPoint(struct coord* c,NGQPointTypes type) { + if (this->object->currentPoint!=NULL) { + delete this->object->currentPoint; + } + this->object->currentPoint = new NGQPoint(this->object,c,type,NULL); + this->object->guiWidget->rootContext()->setContextProperty("point",this->object->currentPoint); + } + void setNewPoint(struct pcoord* pc,NGQPointTypes type) { + if (this->object->currentPoint!=NULL) { + delete this->object->currentPoint; + } + this->object->currentPoint = new NGQPoint(this->object,pc,type,NULL); + this->object->guiWidget->rootContext()->setContextProperty("point",this->object->currentPoint); + } + void processCommand(QString function) { + //QDeclarativeExpression commandJS(this->object->guiWidget->rootContext(),QString(),qobject_cast(this->object->guiWidget->rootObject())); + //commandJS.setSourceLocation("command.js",0); + //this->function=function; + //commandJS.eval(qobject_cast(this->object->guiWidget->rootObject())); + } +signals: + void widthSignal(int); + void heightSignal(int); +public slots: + void pushPage(QString page) { + returnPath.push_front(page); + } + QString popPage() { + if (!returnPath.empty()) { + if (returnPath.length()>1) { + returnPath.pop_front(); + } + return returnPath.first(); + } + return QString(); + } + int lengthPage() { + return returnPath.length(); + } + void backToMap() { + if (this->object->graphicsWidget) { + this->object->graphicsWidget->setFocus(Qt::ActiveWindowFocusReason); + this->object->switcherWidget->setCurrentWidget(this->object->graphicsWidget); + this->object->graphicsWidget->show(); + } + } + void switchToMenu(struct point* p) { + if (!this->object->lazy) { + this->returnPath.clear(); + this->object->guiWidget->setSource(QUrl::fromLocalFile(QString(this->object->source)+"/"+this->object->skin+"/main.qml")); + } + this->setNewPoint(p,MapPoint); + this->object->guiWidget->setFocus(Qt::ActiveWindowFocusReason); + this->object->switcherWidget->setCurrentWidget(this->object->guiWidget); + + } + //Properties + QString iconPath() { + return QString(this->object->icon_src); + } + int width() { + return this->object->w; + } + void setWidth(int w) { + this->object->w=w; + this->widthSignal(w); + } + int height() { + return this->object->h; + } + void setHeight(int h) { + this->object->h=h; + this->heightSignal(h); + } + QString commandFunction() { + return this->function; + } + + //Locale properties + QString localeName() { + return QString()+"LANG="+getenv("LANG"); + } + QString langName() { +#ifdef HAVE_API_WIN32_BASE + char str[32]; + + GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, str, sizeof(str)); + return QString()+"LOCALE_SABBREVLANGNAME="+str; +#else + return QString(); +#endif + } + QString ctryName() { +#ifdef HAVE_API_WIN32_BASE + char str[32]; + + GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVCTRYNAME, str, sizeof(str)); + return QString()+"LOCALE_SABBREVCTRYNAME="+str; +#else + return QString(); +#endif + } +protected: + int getAttrFunc(enum attr_type type, struct attr* attr, struct attr_iter* iter) { return gui_get_attr(this->object->gui, type, attr, iter); } + int setAttrFunc(struct attr* attr) {return gui_set_attr(this->object->gui,attr); } +private: + QString source; + QString function; +}; + +void __setNewPoint(struct gui_priv* this_,struct coord* c, NGQPointTypes type) { + this_->guiProxy->setNewPoint(c,type); +} +void __setNewPoint(struct gui_priv* this_,struct pcoord* pc, NGQPointTypes type) { + this_->guiProxy->setNewPoint(pc,type); +} + +#include "guiProxy.moc" + +#endif /* NAVIT_GUI_QML_GUIPROXY_H */ diff --git a/navit/gui/qml/guiProxy.moc b/navit/gui/qml/guiProxy.moc new file mode 100644 index 0000000..e69de29 diff --git a/navit/gui/qml/gui_qml.cpp b/navit/gui/qml/gui_qml.cpp new file mode 100644 index 0000000..344f0cc --- /dev/null +++ b/navit/gui/qml/gui_qml.cpp @@ -0,0 +1,473 @@ +#include +#include +#include +#include +#include +#include "config.h" +#ifdef HAVE_API_WIN32_BASE +#include +#endif +#include "plugin.h" +#include "item.h" +#include "attr.h" +#include "color.h" +#include "gui.h" +#include "callback.h" +#include "debug.h" +#include "navit.h" +#include "point.h" +#include "graphics.h" +#include "event.h" +#include "map.h" +#include "coord.h" +#include "vehicle.h" +#include "coord.h" +#include "transform.h" +#include "mapset.h" +#include "route.h" +#include "country.h" +#include "track.h" +#include "search.h" +#include "bookmarks.h" +#include "command.h" +#include "keys.h" + +//WORKAOUND for the c/c++ compatibility issues. +//range is defined inside of struct attr so it is invisible in c++ +struct range { + short min, max; +} range; + +#include "layout.h" + +struct gui_priv { + struct navit *nav; + struct gui *gui; + struct attr self; + struct vehicle* currVehicle; + + //configuration items + int fullscreen; + int menu_on_map_click; + int signal_on_map_click; + int w; + int h; + char *source; + char *skin; + char* icon_src; + int radius; + int pitch; + int lazy; //When TRUE - menu state will not be changed during map/menu switches, FALSE - menu will be always reset to main.qml + + //Interface stuff + struct callback_list *cbl; + QCoreApplication *app; + struct window *win; + struct graphics *gra; + QWidget *mainWindow; + QWidget *graphicsWidget; + QDeclarativeView *guiWidget; + QDeclarativeView *prevGuiWidget; + QStackedLayout *switcherWidget; + struct callback *button_cb; + struct callback *motion_cb; + struct callback *resize_cb; + struct callback *keypress_cb; + struct callback *window_closed_cb; + + //Proxy objects + class NGQProxyGui* guiProxy; + class NGQProxyNavit* navitProxy; + class NGQProxyVehicle* vehicleProxy; + class NGQProxySearch* searchProxy; + class NGQProxyBookmarks* bookmarksProxy; + class NGQProxyRoute* routeProxy; + class NGQPoint* currentPoint; +}; + +#include "proxy.h" +#include "ngqpoint.h" +#include "searchProxy.h" +#include "routeProxy.h" +#include "bookmarksProxy.h" +#include "vehicleProxy.h" +#include "navitProxy.h" +#include "guiProxy.h" + +//Main window class for resizeEvent handling +#ifdef Q_WS_X11 +#include +class NGQMainWindow : public QX11EmbedWidget +{ +#else +class NGQMainWindow : public QWidget +{ +#endif /* Q_WS_X11 */ +public: + +#ifdef Q_WS_X11 + NGQMainWindow(struct gui_priv* this_,QWidget *parent) : QX11EmbedWidget(parent) { +#else + NGQMainWindow(struct gui_priv* this_,QWidget *parent) : QWidget(parent) { +#endif /* Q_WS_X11 */ + this->object=this_; + } +protected: + void resizeEvent(QResizeEvent *) { + this->object->w=this->width(); + this->object->h=this->height(); + //YES, i KNOW about signal/slot thing + this->object->guiProxy->setWidth(this->width()); + this->object->guiProxy->setHeight(this->height()); + } + void closeEvent(QCloseEvent* event) { + this->object->graphicsWidget->close(); + } +private: + struct gui_priv* object; +}; + +//Meta object +#include "gui_qml.moc" + +static void gui_qml_dbus_signal(struct gui_priv *this_, struct point *p) +{ + struct displaylist_handle *dlh; + struct displaylist *display; + struct displayitem *di; + + display=navit_get_displaylist(this_->nav); + dlh=graphics_displaylist_open(display); + while ((di=graphics_displaylist_next(dlh))) { + struct item *item=graphics_displayitem_get_item(di); + if (item_is_point(*item) && graphics_displayitem_get_displayed(di) && + graphics_displayitem_within_dist(display, di, p, 10)) { + struct map_rect *mr=map_rect_new(item->map, NULL); + struct item *itemo=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); + struct attr attr; + if (item_attr_get(itemo, attr_data, &attr)) { + struct attr cb,*attr_list[2]; + int valid=0; + attr.type=attr_data; + attr_list[0]=&attr; + attr_list[1]=NULL; + if (navit_get_attr(this_->nav, attr_callback_list, &cb, NULL)) + callback_list_call_attr_4(cb.u.callback_list, attr_command, "dbus_send_signal", attr_list, NULL, &valid); + } + map_rect_destroy(mr); + } + } + graphics_displaylist_close(dlh); +} + +static void gui_qml_button(void *data, int pressed, int button, struct point *p) +{ + struct gui_priv *this_=(struct gui_priv*)data; + + // check whether the position of the mouse changed during press/release OR if it is the scrollwheel + if (!navit_handle_button(this_->nav, pressed, button, p, NULL)) { + dbg(1,"navit has handled button\n"); + return; + } + + dbg(1,"enter %d %d\n", pressed, button); + if (this_->signal_on_map_click) { + gui_qml_dbus_signal(this_, p); + return; + } + + if ( button == 1 && this_->menu_on_map_click ) { + this_->guiProxy->switchToMenu(p); + } +} + +static void gui_qml_motion(void *data, struct point *p) +{ + struct gui_priv *this_=(struct gui_priv*)data; + navit_handle_motion(this_->nav, p); + return; +} +static void gui_qml_resize(void *data, int w, int h) +{ + struct gui_priv *this_=(struct gui_priv*)data; + navit_handle_resize(this_->nav, w, h); +} + +static void gui_qml_keypress(void *data, char *key) +{ + struct gui_priv *this_=(struct gui_priv*) data; + int w,h; + struct point p; + transform_get_size(navit_get_trans(this_->nav), &w, &h); + switch (*key) { + case NAVIT_KEY_UP: + p.x=w/2; + p.y=0; + navit_set_center_screen(this_->nav, &p, 1); + break; + case NAVIT_KEY_DOWN: + p.x=w/2; + p.y=h; + navit_set_center_screen(this_->nav, &p, 1); + break; + case NAVIT_KEY_LEFT: + p.x=0; + p.y=h/2; + navit_set_center_screen(this_->nav, &p, 1); + break; + case NAVIT_KEY_RIGHT: + p.x=w; + p.y=h/2; + navit_set_center_screen(this_->nav, &p, 1); + break; + case NAVIT_KEY_ZOOM_IN: + navit_zoom_in(this_->nav, 2, NULL); + break; + case NAVIT_KEY_ZOOM_OUT: + navit_zoom_out(this_->nav, 2, NULL); + break; + case NAVIT_KEY_RETURN: + case NAVIT_KEY_MENU: + p.x=w/2; + p.y=h/2; + this_->guiProxy->switchToMenu(&p); + break; + } + return; +} + +static void +gui_qml_window_closed(struct gui_priv *data) +{ + struct gui_priv *this_=(struct gui_priv*) data; + this_->navitProxy->quit(); +} +//GUI interface calls +static int argc=1; +static char *argv[]={(char *)"navit",NULL}; + +static int gui_qml_set_graphics(struct gui_priv *this_, struct graphics *gra) +{ + QString xid; + NGQMainWindow* _mainWindow; + bool ok; + + this_->gra=gra; + + //Check if we are already in Qt environment + if (QApplication::instance()==NULL) { + //Not yet + this_->app=new QApplication(argc,argv); + } else { + this_->app=QApplication::instance(); + } + + //Link graphics events + this_->button_cb=callback_new_attr_1(callback_cast(gui_qml_button), attr_button, this_); + graphics_add_callback(gra, this_->button_cb); + this_->motion_cb=callback_new_attr_1(callback_cast(gui_qml_motion), attr_motion, this_); + graphics_add_callback(gra, this_->motion_cb); + this_->resize_cb=callback_new_attr_1(callback_cast(gui_qml_resize), attr_resize, this_); + graphics_add_callback(gra, this_->resize_cb); + this_->keypress_cb=callback_new_attr_1(callback_cast(gui_qml_keypress), attr_keypress, this_); + graphics_add_callback(gra, this_->keypress_cb); + this_->window_closed_cb=callback_new_attr_1(callback_cast(gui_qml_window_closed), attr_window_closed, this_); + graphics_add_callback(gra, this_->window_closed_cb); + + + //Create main window + this_->switcherWidget = new QStackedLayout(); + _mainWindow = new NGQMainWindow(this_, NULL); +#ifdef Q_WS_X11 + xid=getenv("NAVIT_XID"); + if (xid.length()>0) { + _mainWindow->embedInto(xid.toULong(&ok,0)); + } +#endif /* Q_WS_X11 */ + this_->mainWindow=_mainWindow; + if ( this_->w && this_->h ) { + this_->mainWindow->resize(this_->w,this_->h); + } + if ( this_->fullscreen ) { + this_->mainWindow->showFullScreen(); + } + + this_->mainWindow->setLayout(this_->switcherWidget); + + //Create proxy object and bind them to gui widget + this_->guiProxy = new NGQProxyGui(this_,this_->mainWindow); + this_->navitProxy = new NGQProxyNavit(this_,this_->mainWindow); + this_->vehicleProxy = new NGQProxyVehicle(this_,this_->mainWindow); + this_->searchProxy = new NGQProxySearch(this_,this_->mainWindow); + this_->bookmarksProxy = new NGQProxyBookmarks(this_,this_->mainWindow); + this_->routeProxy = new NGQProxyRoute(this_,this_->mainWindow); + + //Check, if we have compatible graphics + this_->graphicsWidget = (QWidget*)graphics_get_data(gra,"qt_widget"); + if (this_->graphicsWidget == NULL ) { + this_->graphicsWidget = new QLabel(QString("Sorry, current graphics type is incompatible with this gui.")); + } + this_->switcherWidget->addWidget(this_->graphicsWidget); + + //Instantiate qml components + this_->guiWidget = new QDeclarativeView(NULL); + this_->guiWidget->setResizeMode(QDeclarativeView::SizeRootObjectToView); + + this_->guiWidget->rootContext()->setContextProperty("gui",this_->guiProxy); + this_->guiWidget->rootContext()->setContextProperty("navit",this_->navitProxy); + this_->guiWidget->rootContext()->setContextProperty("vehicle",this_->vehicleProxy); + this_->guiWidget->rootContext()->setContextProperty("search",this_->searchProxy); + this_->guiWidget->rootContext()->setContextProperty("bookmarks",this_->bookmarksProxy); + this_->guiWidget->rootContext()->setContextProperty("route",this_->routeProxy); + this_->guiWidget->rootContext()->setContextProperty("point",this_->currentPoint); + + this_->guiWidget->setSource(QUrl::fromLocalFile(QString(this_->source)+"/"+this_->skin+"/main.qml")); + this_->switcherWidget->addWidget(this_->guiWidget); + + //Switch to graphics + navit_draw(this_->nav); + this_->switcherWidget->setCurrentWidget(this_->graphicsWidget); + + this_->mainWindow->show(); + + return 0; +} + +static int +gui_qml_get_attr(struct gui_priv *this_, enum attr_type type, struct attr *attr) +{ + switch (type) { + case attr_fullscreen: + attr->u.num=this_->fullscreen; + break; + case attr_skin: + attr->u.str=this_->skin; + break; + case attr_pitch: + attr->u.num=this_->pitch; + break; + case attr_radius: + attr->u.num=this_->radius; + break; + default: + return 0; + } + attr->type=type; + return 1; +} + +static int +gui_qml_set_attr(struct gui_priv *this_, struct attr *attr) +{ + switch (attr->type) { + case attr_fullscreen: + if (!(this_->fullscreen) && (attr->u.num)) { + this_->mainWindow->showFullScreen(); + } + if ((this_->fullscreen) && !(attr->u.num)) { + this_->mainWindow->showNormal(); + } + this_->fullscreen=attr->u.num; + return 1; + case attr_pitch: + this_->pitch=attr->u.num; + return 1; + case attr_radius: + this_->radius=attr->u.num; + return 1; + default: + dbg(0,"unknown attr: %s\n",attr_to_name(attr->type)); + return 1; + } +} + +struct gui_methods gui_qml_methods = { + NULL, + NULL, + gui_qml_set_graphics, + NULL, + NULL, + NULL, + NULL, + gui_qml_get_attr, + NULL, + gui_qml_set_attr, +}; + +static void +gui_qml_command(struct gui_priv *this_, char *function, struct attr **in, struct attr ***out, int *valid) { + this_->guiProxy->processCommand(function); +} + +static struct command_table commands[] = { + {"*",command_cast(gui_qml_command)}, +}; + +static struct gui_priv * gui_qml_new(struct navit *nav, struct gui_methods *meth, struct attr **attrs, struct gui *gui) +{ + struct gui_priv *this_; + struct attr *attr; + *meth=gui_qml_methods; + this_=g_new0(struct gui_priv, 1); + + this_->nav=nav; + this_->gui=gui; + + this_->self.type=attr_gui; + this_->self.u.gui=gui; + + navit_ignore_graphics_events(this_->nav, 1); + + this_->fullscreen = 0; //NO by default + if( (attr=attr_search(attrs,NULL,attr_fullscreen))) + this_->fullscreen=attr->u.num; + this_->menu_on_map_click = 1; //YES by default; + if( (attr=attr_search(attrs,NULL,attr_menu_on_map_click))) + this_->menu_on_map_click=attr->u.num; + this_->signal_on_map_click = 0; //YES by default; + if( (attr=attr_search(attrs,NULL,attr_signal_on_map_click))) + this_->signal_on_map_click=attr->u.num; + this_->radius = 10; //Default value + if( (attr=attr_search(attrs,NULL,attr_radius))) + this_->radius=attr->u.num; + this_->pitch = 20; //Default value + if( (attr=attr_search(attrs,NULL,attr_pitch))) + this_->pitch=attr->u.num; + this_->lazy = 1; //YES by default + if( (attr=attr_search(attrs,NULL,attr_lazy))) + this_->lazy=attr->u.num; + this_->w=800; //Default value + if( (attr=attr_search(attrs,NULL,attr_width))) + this_->w=attr->u.num; + this_->h=600; //Default value + if( (attr=attr_search(attrs,NULL,attr_height))) + this_->h=attr->u.num; + if( (attr=attr_search(attrs,NULL,attr_source))) + this_->source=attr->u.str; + if( (attr=attr_search(attrs,NULL,attr_skin))) + this_->skin=attr->u.str; + if( (attr=attr_search(attrs,NULL,attr_icon_src))) + this_->icon_src=attr->u.str; + + if ( this_->source==NULL ) { + this_->source=g_strjoin(NULL,getenv("NAVIT_SHAREDIR"),"/gui/qml/skins",NULL); + } + if ( this_->skin==NULL ) { + this_->skin=g_strdup("navit"); + } + if ( this_->icon_src==NULL ) { + this_->icon_src=g_strjoin(NULL,getenv("NAVIT_SHAREDIR"),"/xpm/",NULL); + } + + if ((attr=attr_search(attrs, NULL, attr_callback_list))) { + command_add_table(attr->u.callback_list, commands, sizeof(commands)/sizeof(struct command_table), this_); + } + + this_->cbl=callback_list_new(); + + return this_; +} + +void plugin_init(void) { + plugin_register_gui_type("qml",gui_qml_new); +} diff --git a/navit/gui/qml/gui_qml.moc b/navit/gui/qml/gui_qml.moc new file mode 100644 index 0000000..e69de29 diff --git a/navit/gui/qml/navitProxy.h b/navit/gui/qml/navitProxy.h new file mode 100644 index 0000000..3590092 --- /dev/null +++ b/navit/gui/qml/navitProxy.h @@ -0,0 +1,150 @@ +#ifndef NAVIT_GUI_QML_NAVIT_H +#define NAVIT_GUI_QML_NAVIT_H + +void __setNewPoint(struct gui_priv* this_,struct coord* c, NGQPointTypes type); + +class NGQProxyNavit : public NGQProxy { + Q_OBJECT; + +public: + NGQProxyNavit(struct gui_priv* object, QObject* parent) : NGQProxy(object,parent) { }; + +public slots: + void quit() { + struct attr navit; + navit.type=attr_navit; + navit.u.navit=this->object->nav; + navit_destroy(navit.u.navit); + event_main_loop_quit(); + } + void setObjectByName(const QString& attr_name,const QString& attr_value) { + if (attr_name=="layout") { + navit_set_layout_by_name(this->object->nav,attr_value.toStdString().c_str()); + } + if (attr_name=="vehicle") { + navit_set_vehicle_by_name(this->object->nav,attr_value.toStdString().c_str()); + } + return; + } + QString getAttrList(const QString &attr_name) { + struct attr attr; + struct attr_iter *iter; + int counter=0; + QString currentValue; + QDomDocument retDoc; + QDomElement entries; + + entries=retDoc.createElement("attributes"); + retDoc.appendChild(entries); + + //Find current value + getAttrFunc(attr_from_name(attr_name.toStdString().c_str()), &attr, NULL) ; + if (attr.type==attr_layout) { + currentValue=attr.u.layout->name; + } + + //Fill da list + iter=getIterFunc(); + if (iter == NULL) { + return QString(); + } + + while (getAttrFunc(attr_from_name(attr_name.toStdString().c_str()), &attr, iter) ) { + QStandardItem* curItem=new QStandardItem(); + //Listed attributes are usualy have very complex structure + if (attr.type==attr_layout) { + curItem->setData(QVariant(counter),NGQStandardItemModel::ItemId); + curItem->setData(QVariant(attr.u.layout->name),NGQStandardItemModel::ItemName); + curItem->setData(QVariant(attr.u.layout->name),NGQStandardItemModel::ItemValue); + if (currentValue==attr.u.layout->name) { + this->_itemId=counter; + } + } + if (attr.type==attr_vehicle) { + QStandardItem* curItem=new QStandardItem(); + QDomElement entry=retDoc.createElement("vehicle"); + entries.appendChild(entry); + + this->object->currVehicle=attr.u.vehicle; + curItem->setData(QVariant(this->object->vehicleProxy->getAttr("name")),NGQStandardItemModel::ItemName); + entry.appendChild(this->_fieldValueHelper(retDoc,QString("id"), QString::number(counter))); + entry.appendChild(this->_fieldValueHelper(retDoc,QString("name"), QString(this->object->vehicleProxy->getAttr("name")))); + + //Detecting current vehicle + struct attr vehicle_attr; + navit_get_attr(this->object->nav, attr_vehicle, &vehicle_attr, NULL); + if (vehicle_attr.u.vehicle==attr.u.vehicle) { + this->_itemId=counter; + } + } + counter++; + } + + dropIterFunc(iter); + + dbg(0,QString::number(_itemId).toStdString().c_str()); + + return retDoc.toString(); + } + QString getDestination() { + struct attr attr; + struct coord c; + + if (getAttrFunc(attr_destination, &attr, NULL) ) { + c.x=attr.u.pcoord->x; + c.y=attr.u.pcoord->y; + __setNewPoint(this->object,&c,Destination); + return this->object->currentPoint->pointName(); + } + return QString(); + } + void setDestination() { + navit_set_destination(this->object->nav,this->object->currentPoint->pc(),this->object->currentPoint->coordString().toStdString().c_str(),1); + } + void stopNavigation() { + navit_set_destination(this->object->nav,NULL,NULL,0); + } + QString getPosition() { + struct attr attr; + struct pcoord pc; + struct coord c; + struct transformation *trans; + + trans=navit_get_trans(this->object->nav); + + getAttrFunc(attr_vehicle, &attr, NULL); + this->object->currVehicle=attr.u.vehicle; + + if (vehicle_get_attr(this->object->currVehicle, attr_position_coord_geo, &attr, NULL)) { + pc.pro=transform_get_projection(trans); + transform_from_geo(pc.pro, attr.u.coord_geo, &c); + __setNewPoint(this->object,&c,Position); + return this->object->currentPoint->pointName(); + } + return QString(); + } + void setPosition() { + navit_set_position(this->object->nav,this->object->currentPoint->pc()); + } + void setCenter() { + navit_set_center(this->object->nav,this->object->currentPoint->pc(),1); + } + void command(QString command) { + struct attr navit; + navit.type=attr_navit; + navit.u.navit=this->object->nav; + command_evaluate(&navit,command.toLocal8Bit().constData()); + } +protected: + int getAttrFunc(enum attr_type type, struct attr* attr, struct attr_iter* iter) { return navit_get_attr(this->object->nav, type, attr, iter); } + int setAttrFunc(struct attr* attr) {return navit_set_attr(this->object->nav,attr); } + struct attr_iter* getIterFunc() { return navit_attr_iter_new(); }; + void dropIterFunc(struct attr_iter* iter) { navit_attr_iter_destroy(iter); }; + +private: + +}; + +#include "navitProxy.moc" + +#endif /* NAVIT_GUI_QML_NAVITPROXY_H */ diff --git a/navit/gui/qml/navitProxy.moc b/navit/gui/qml/navitProxy.moc new file mode 100644 index 0000000..e69de29 diff --git a/navit/gui/qml/ngqpoint.h b/navit/gui/qml/ngqpoint.h new file mode 100644 index 0000000..e720200 --- /dev/null +++ b/navit/gui/qml/ngqpoint.h @@ -0,0 +1,382 @@ +#ifndef NAVIT_GUI_QML_POINT_H +#define NAVIT_GUI_QML_POINT_H + +static void +get_direction(char *buffer, int angle, int mode) +{ + angle=angle%360; + switch (mode) { + case 0: + sprintf(buffer,"%d",angle); + break; + case 1: + if (angle < 69 || angle > 291) + *buffer++='N'; + if (angle > 111 && angle < 249) + *buffer++='S'; + if (angle > 22 && angle < 158) + *buffer++='E'; + if (angle > 202 && angle < 338) + *buffer++='W'; + *buffer++='\0'; + break; + case 2: + angle=(angle+15)/30; + if (! angle) + angle=12; + sprintf(buffer,"%d H", angle); + break; + } +} + +enum NGQPointTypes {MapPoint,Bookmark,Position,Destination,PointOfInterest}; + +class NGQPoint : public QObject { + Q_OBJECT; + + Q_PROPERTY(QString coordString READ coordString CONSTANT); + Q_PROPERTY(QString pointName READ pointName CONSTANT); + Q_PROPERTY(QString pointType READ pointType CONSTANT); + Q_PROPERTY(QUrl pointUrl READ pointUrl CONSTANT); +public: + NGQPoint(struct gui_priv* this_,struct point* p,NGQPointTypes type=MapPoint,QObject *parent=NULL) : QObject(parent) { + this->object=this_; + this->item.map=0; + transform_reverse(navit_get_trans(this->object->nav), p, &co); + transform_to_geo(transform_get_projection(navit_get_trans(this->object->nav)), &co, &g); + c.pro = transform_get_projection(navit_get_trans(this->object->nav)); + c.x = co.x; + c.y = co.y; + this->p.x=p->x; + this->p.y=p->y; + this->type=type; + + this->name=this->_coordName(); + this->coord=this->_coordString(); + } + NGQPoint(struct gui_priv* this_,struct coord* c,NGQPointTypes type=Bookmark,QObject *parent=NULL) : QObject(parent) { + this->object=this_; + this->item.map=0; + this->co.x=c->x; + this->co.y=c->y; + transform_to_geo(transform_get_projection(navit_get_trans(this->object->nav)), &co, &g); + this->c.pro = transform_get_projection(navit_get_trans(this->object->nav)); + this->c.x = c->x; + this->c.y = c->y; + this->type=type; + + this->name=this->_coordName(); + this->coord=this->_coordString(); + } + + NGQPoint(struct gui_priv* this_,struct pcoord* pc,NGQPointTypes type=Bookmark,QObject *parent=NULL) : QObject(parent) { + this->object=this_; + this->item.map=0; + this->c.pro = pc->pro; + this->c.x = pc->x; + this->c.y = pc->y; + this->co.x=pc->x; + this->co.y=pc->y; + transform_to_geo(this->c.pro, &co, &g); + this->type=type; + + this->name=this->_coordName(); + this->coord=this->_coordString(); + } + + NGQPoint(struct gui_priv* this_,struct coord* c,QString name,NGQPointTypes type=Bookmark,QObject *parent=NULL) : QObject(parent) { + this->object=this_; + this->item.map=0; + this->co.x=c->x; + this->co.y=c->y; + transform_to_geo(transform_get_projection(navit_get_trans(this->object->nav)), &co, &g); + this->c.pro = transform_get_projection(navit_get_trans(this->object->nav)); + this->c.x = c->x; + this->c.y = c->y; + this->type=type; + + this->name=name; + this->coord=this->_coordString(); + } + + struct pcoord* pc() { return &c; } +public slots: + void setNewPoint(QString coord,NGQPointTypes type=PointOfInterest) { + this->item.map=0; + QStringList coordSplit=coord.split(" ",QString::SkipEmptyParts); + this->co.x=coordSplit[0].toInt(); + this->co.y=coordSplit[1].toInt(); + transform_to_geo(transform_get_projection(navit_get_trans(this->object->nav)), &co, &g); + this->c.pro = transform_get_projection(navit_get_trans(this->object->nav)); + this->c.x = coordSplit[0].toInt(); + this->c.y = coordSplit[1].toInt(); + this->type=type; + + this->name=this->_coordName(); + this->coord=this->_coordString(); + } + QString pointName() { + return this->name; + } + QString coordString() { + return this->coord; + } + QString pointType() { + switch(this->type) { + case MapPoint: + return QString("MapPoint"); + case Bookmark: + return QString("Bookmark"); + case Position: + return QString("Position"); + case Destination: + return QString("Destination"); + case PointOfInterest: + return QString("PointOfInterest"); + } + return QString(""); + } + QUrl pointUrl() { + return this->url; + } + QString getInformation() { + struct map_rect *mr; + struct item* item; + struct attr attr; + + QDomDocument retDoc; + QDomElement entries; + entries=retDoc.createElement("point"); + retDoc.appendChild(entries); + + if (this->type!=Bookmark and this->item.map) { + mr=map_rect_new(this->item.map, NULL); + item = map_rect_get_item_byid(mr, this->item.id_hi, this->item.id_lo); + if (item) { + while(item_attr_get(item, attr_any, &attr)) { + entries.appendChild(this->_fieldValueHelper(retDoc,QString::fromLocal8Bit(attr_to_name(attr.type)), QString::fromLocal8Bit(attr_to_text(&attr,this->item.map, 1)))); + } + } + map_rect_destroy(mr); + } + return retDoc.toString(); + } + QString getPOI(const QString &attr_name) { + struct attr attr; + struct item* item; + struct mapset_handle *h; + struct map_selection *sel,*selm; + struct map_rect *mr; + struct map *m; + int idist,dist; + struct coord center; + QDomDocument retDoc(attr_name); + QDomElement entries; + char dirbuf[32]; + + if (!gui_get_attr(this->object->gui,attr_radius,&attr,NULL)) { + return QString(); + } + + dist=attr.u.num*1000; + + sel=map_selection_rect_new(&this->c, dist, 18); + center.x=this->c.x; + center.y=this->c.y; + h=mapset_open(navit_get_mapset(this->object->nav)); + + entries=retDoc.createElement(attr_name); + retDoc.appendChild(entries); + + while ((m=mapset_next(h, 1))) { + selm=map_selection_dup_pro(sel, this->c.pro, map_projection(m)); + mr=map_rect_new(m, selm); + if (mr) { + while ((item=map_rect_get_item(mr))) { + struct coord c; + if ( item_coord_get_pro(item, &c, 1, this->c.pro) && coord_rect_contains(&sel->u.c_rect, &c) && (idist=transform_distance(this->c.pro, ¢er, &c)) < dist && item->typetype)).startsWith(QString("poi_"))) { + rs=QString::fromLocal8Bit(item_to_name(item->type)); + rs=rs.remove(QString("poi_")); + rs+=QString(" ")+QString::fromLocal8Bit(label); + + } else if (QString(item_to_name(item->type)).startsWith(QString("poly_"))) { + rs=QString::fromLocal8Bit(item_to_name(item->type)); + rs=rs.remove(QString("poly_")); + rs+=QString(" ")+QString::fromLocal8Bit(label); + + } else if (QString(item_to_name(item->type)).startsWith(QString("street_"))) { + rs="Street "; + rs+=QString::fromLocal8Bit(label); + } + map_convert_free(label); + } else + rs=item_to_name(item->type); + get_direction(dirbuf, transform_get_angle_delta(¢er, &c, 0), 1); + if (rs.length()>0) { + QDomElement entry=retDoc.createElement("point"); + QDomElement nameTag=retDoc.createElement("name"); + QDomElement typeTag=retDoc.createElement("type"); + QDomElement distTag=retDoc.createElement("distance"); + QDomElement directTag=retDoc.createElement("direction"); + QDomElement coordsTag=retDoc.createElement("coords"); + QDomText nameT=retDoc.createTextNode(rs); + QDomText typeT=retDoc.createTextNode(QString(item_to_name(item->type))); + QDomText distT=retDoc.createTextNode(QString::number(idist/1000)); + QDomText directT=retDoc.createTextNode(dirbuf); + QDomText coordsT=retDoc.createTextNode(QString("%1 %2").arg(c.x).arg(c.y)); + nameTag.appendChild(nameT); + typeTag.appendChild(typeT); + distTag.appendChild(distT); + directTag.appendChild(directT); + coordsTag.appendChild(coordsT); + entry.appendChild(nameTag); + entry.appendChild(typeTag); + entry.appendChild(distTag); + entry.appendChild(directTag); + entry.appendChild(coordsTag); + entries.appendChild(entry); + } + } + } + } + map_selection_destroy(selm); + } + map_selection_destroy(sel); + mapset_close(h); + dbg(2,"%s\n",retDoc.toString().toLocal8Bit().constData()); + return retDoc.toString(); + } +protected: + QDomElement _fieldValueHelper(QDomDocument doc, QString field,QString value) { + QDomElement fieldTag=doc.createElement(field); + QDomText valueText=doc.createTextNode(value); + fieldTag.appendChild(valueText); + return fieldTag; + } + QString _coordString() { + char latc='N',lngc='E'; + int lat_deg,lat_min,lat_sec; + int lng_deg,lng_min,lng_sec; + struct coord_geo g=this->g; + + if (g.lat < 0) { + g.lat=-g.lat; + latc='S'; + } + if (g.lng < 0) { + g.lng=-g.lng; + lngc='W'; + } + lat_deg=g.lat; + lat_min=fmod(g.lat*60,60); + lat_sec=fmod(g.lat*3600,60); + lng_deg=g.lng; + lng_min=fmod(g.lng*60,60); + lng_sec=fmod(g.lng*3600,60); + return QString(QString::fromLocal8Bit("%1°%2'%3\" %4%5%6°%7'%8\" %9")).arg(lat_deg).arg(lat_min).arg(lat_sec).arg(latc).arg(' ').arg(lng_deg).arg(lng_min).arg(lng_sec).arg(lngc); + } + QString _coordName() { + int dist=10; + struct mapset *ms; + struct mapset_handle *h; + struct map_rect *mr; + struct map *m; + struct item *item; + struct street_data *data; + struct map_selection sel; + struct transformation *trans; + enum projection pro; + struct attr attr; + char *label; + QString ret; + + trans=navit_get_trans(this->object->nav); + pro=transform_get_projection(trans); + transform_from_geo(pro, &g, &co); + ms=navit_get_mapset(this->object->nav); + sel.next=NULL; + sel.u.c_rect.lu.x=c.x-dist; + sel.u.c_rect.lu.y=c.y+dist; + sel.u.c_rect.rl.x=c.x+dist; + sel.u.c_rect.rl.y=c.y-dist; + sel.order=18; + sel.range=item_range_all; + h=mapset_open(ms); + while ((m=mapset_next(h,1))) { + mr=map_rect_new(m, &sel); + if (! mr) + continue; + while ((item=map_rect_get_item(mr))) { + data=street_get_data(item); + if (transform_within_dist_item(&co, item->type, data->c, data->count, dist)) { + if (item_attr_get(item, attr_label, &attr)) { + label=map_convert_string(m, attr.u.str); + this->item=*item; + this->_setUrl(item); + if (QString(item_to_name(item->type)).startsWith(QString("poi_"))) { + ret=QString::fromLocal8Bit(item_to_name(item->type)); + ret=ret.remove(QString("poi_")); + ret+=QString(" ")+QString::fromLocal8Bit(label); + } + if (QString(item_to_name(item->type)).startsWith(QString("poly_"))) { + ret=QString::fromLocal8Bit(item_to_name(item->type)); + ret=ret.remove(QString("poly_")); + ret+=QString(" ")+QString::fromLocal8Bit(label); + } + if (QString(item_to_name(item->type)).startsWith(QString("street_"))) { + ret="Street "; + ret+=QString::fromLocal8Bit(label); + } + map_convert_free(label); + street_data_free(data); + map_rect_destroy(mr); + mapset_close(h); + return ret; + } else + this->item=*item; + this->_setUrl(item); + ret=item_to_name(item->type); + } + street_data_free(data); + } + map_rect_destroy(mr); + } + mapset_close(h); + return ret; + } + void _setUrl(struct item *item) { + struct attr attr; + if (item_attr_get(item,attr_osm_nodeid,&attr)) { + url.setUrl(QString("http://www.openstreetmap.org/browse/node/%1").arg(*attr.u.num64)); + } else if (item_attr_get(item,attr_osm_wayid,&attr)) { + url.setUrl(QString("http://www.openstreetmap.org/browse/way/%1").arg(*attr.u.num64)); + } else if (item_attr_get(item,attr_osm_relationid,&attr)) { + url.setUrl(QString("http://www.openstreetmap.org/browse/relation/%1").arg(*attr.u.num64)); + } else { + url.clear(); + } + } +private: + struct gui_priv* object; + + NGQPointTypes type; + struct coord_geo g; + struct coord co; + struct pcoord c; + struct point p; + + struct item item; + + QString name; + QString coord; + QUrl url; +}; + +#include "ngqpoint.moc" + +#endif /* NAVIT_GUI_QML_POINT_H */ diff --git a/navit/gui/qml/ngqpoint.moc b/navit/gui/qml/ngqpoint.moc new file mode 100644 index 0000000..e69de29 diff --git a/navit/gui/qml/proxy.h b/navit/gui/qml/proxy.h new file mode 100644 index 0000000..ba45cb4 --- /dev/null +++ b/navit/gui/qml/proxy.h @@ -0,0 +1,109 @@ +#ifndef NAVIT_GUI_QML_PROXY_H +#define NAVIT_GUI_QML_PROXY_H + +class NGQStandardItemModel : public QStandardItemModel { +public: + NGQStandardItemModel(QObject* parent) : QStandardItemModel(parent) { + //Populate role list + roleNames.insert(NGQStandardItemModel::ItemId, "itemId"); + roleNames.insert(NGQStandardItemModel::ItemName, "itemName"); + roleNames.insert(NGQStandardItemModel::ItemIcon, "itemIcon"); + roleNames.insert(NGQStandardItemModel::ItemPath, "itemPath"); + roleNames.insert(NGQStandardItemModel::ItemValue, "itemValue"); + this->setRoleNames(roleNames); + } + + enum listRoles {ItemId=Qt::UserRole+1,ItemName=Qt::UserRole+2,ItemIcon=Qt::UserRole+3,ItemPath=Qt::UserRole+4,ItemValue=Qt::UserRole+5}; +private: + QHash roleNames; +}; + +class NGQProxy : public QObject { + Q_OBJECT; + + Q_PROPERTY(int itemId READ itemId NOTIFY itemIdSignal); +public: + NGQProxy(struct gui_priv* this_,QObject *parent) : QObject(parent) { + this->object=this_; + } + +signals: + void itemIdSignal(int itemId); + +public slots: + //Attribute read/write + QString getAttr(const QString &attr_name) { + QString ret; + struct attr attr; + + getAttrFunc(attr_from_name(attr_name.toStdString().c_str()), &attr, NULL); + if (ATTR_IS_INT(attr.type)) { + ret.setNum(attr.u.num); + } + if (ATTR_IS_DOUBLE(attr.type)) { + ret.setNum(*attr.u.numd); + } + if (ATTR_IS_STRING(attr.type)) { + ret=attr.u.str; + } + if (attr.type==attr_layout) { + ret=attr.u.layout->name; + } + return ret; + } + void setAttr(const QString &attr_name, const QString &attr_string) { + struct attr attr_value; + double *helper; + + dbg(1,"Setting %s to %s\n",attr_name.toStdString().c_str(),attr_string.toStdString().c_str()); + getAttrFunc(attr_from_name(attr_name.toStdString().c_str()), &attr_value, NULL); + + if (ATTR_IS_INT(attr_value.type)) { + //Special handling for "true"/"false" + if (attr_string=="true") { + attr_value.u.num=1; + } else if (attr_string=="false") { + attr_value.u.num=0; + } else { + attr_value.u.num=attr_string.toInt(); + } + } + if (ATTR_IS_DOUBLE(attr_value.type)) { + helper = g_new0(double,1); + *helper=attr_string.toDouble(); + attr_value.u.numd=helper; + } + if (ATTR_IS_STRING(attr_value.type)) { + attr_value.u.str=(char*)attr_string.toStdString().c_str(); + } + + setAttrFunc(&attr_value); + + return; + } + + int itemId() { + return _itemId; + } +protected: + struct gui_priv* object; + + int _itemId; + + virtual int setAttrFunc(struct attr *attr)=0; + virtual int getAttrFunc(enum attr_type type, struct attr *attr, struct attr_iter *iter)=0; + virtual struct attr_iter* getIterFunc() { return NULL; }; + virtual void dropIterFunc(struct attr_iter*) { return; }; + + QDomElement _fieldValueHelper(QDomDocument doc, QString field,QString value) { + QDomElement fieldTag=doc.createElement(field); + QDomText valueText=doc.createTextNode(value); + fieldTag.appendChild(valueText); + return fieldTag; + } + +}; + +#include "proxy.moc" + +#endif /* NAVIT_GUI_QML_PROXY_H */ diff --git a/navit/gui/qml/proxy.moc b/navit/gui/qml/proxy.moc new file mode 100644 index 0000000..e69de29 diff --git a/navit/gui/qml/routeProxy.h b/navit/gui/qml/routeProxy.h new file mode 100644 index 0000000..77defd2 --- /dev/null +++ b/navit/gui/qml/routeProxy.h @@ -0,0 +1,72 @@ +#ifndef NAVIT_GUI_QML_ROUTEPROXY_H +#define NAVIT_GUI_QML_ROUTEPROXY_H + + +class NGQProxyRoute : public NGQProxy { + Q_OBJECT; + +public: + NGQProxyRoute(struct gui_priv* this_,QObject* parent) : NGQProxy(this_,parent) { }; + +public slots: + void addDestination() { + int counter=0; + QList destinations=this->_routeDestinations(); + struct pcoord *coords=(struct pcoord*)malloc(sizeof(struct pcoord)*(destinations.size()+1)); //Additional destination included + + for (QList::const_iterator iter=destinations.begin();iter!=destinations.end();iter++) { + coords[counter]=*(iter->u.pcoord); + counter++; + } + + //Add new one + coords[counter]=*(this->object->currentPoint->pc()); + + //Propagate to route engine + route_set_destinations(navit_get_route(this->object->nav),coords,counter+1,1); + } + QString getDestinations() { + + QList destinations=this->_routeDestinations(); + for (QList::const_iterator iter=destinations.begin();iter!=destinations.end();iter++) { + NGQPoint helperPoint(this->object,iter->u.pcoord,MapPoint); + dbg(0,"Added destination %s\n",helperPoint.coordString().toLocal8Bit().constData()); + } + + //dbg(0,QString::number(_itemId).toStdString().c_str()); + + //return retDoc.toString(); + return QString(); + } + +protected: + int getAttrFunc(enum attr_type type, struct attr* attr, struct attr_iter* iter) {return route_get_attr(navit_get_route(this->object->nav), type, attr, iter); } + int setAttrFunc(struct attr* attr) {return route_set_attr(navit_get_route(this->object->nav),attr); } + struct attr_iter* getIterFunc() { return route_attr_iter_new(); }; + void dropIterFunc(struct attr_iter* iter) { route_attr_iter_destroy(iter); }; + + QList _routeDestinations() { + QList ret; + struct attr attr; + struct attr_iter *iter; + + //Fill da list + iter=getIterFunc(); + if (iter == NULL) { + return ret; + } + + while (getAttrFunc(attr_destination, &attr, iter) ) { + struct attr c_attr=attr; + ret.push_front(c_attr); //List is reversed in route engine + } + + dropIterFunc(iter); + + return ret; + } +}; + +#include "routeProxy.moc" + +#endif /* NAVIT_GUI_QML_ROUTEPROXY_H */ diff --git a/navit/gui/qml/searchProxy.h b/navit/gui/qml/searchProxy.h new file mode 100644 index 0000000..19a6c93 --- /dev/null +++ b/navit/gui/qml/searchProxy.h @@ -0,0 +1,229 @@ +#ifndef NAVIT_GUI_QML_SEARCHPROXY_H +#define NAVIT_GUI_QML_SEARCHPROXY_H + +void __setNewPoint(struct gui_priv* this_,struct pcoord* pc, NGQPointTypes type); + +class NGQProxySearch : public NGQProxy { + Q_OBJECT; + + Q_PROPERTY(QString countryName READ countryName WRITE setCountryName NOTIFY countryNameSignal); + Q_PROPERTY(QString countryISO2 READ countryISO2 WRITE setCountryISO2 NOTIFY countryISO2Signal); + Q_PROPERTY(QString townName READ townName WRITE setTownName NOTIFY townNameSignal); + Q_PROPERTY(QString streetName READ streetName WRITE setStreetName NOTIFY streetNameSignal); + + Q_PROPERTY(QString searchContext READ searchContext WRITE setSearchContext); + +public: + NGQProxySearch(struct gui_priv* this_,QObject* parent) : NGQProxy(this_,parent) { + struct attr search_attr, country_name, country_iso2, *country_attr; + struct item *item; + struct country_search *cs; + struct tracking *tracking; + struct search_list_result *res; + + this->sl=search_list_new(navit_get_mapset(this->object->nav)); + this->search_context="country"; + + country_attr=country_default(); + tracking=navit_get_tracking(this->object->nav); + if (tracking && tracking_get_attr(tracking, attr_country_id, &search_attr, NULL)) + country_attr=&search_attr; + if (country_attr) { + cs=country_search_new(country_attr, 0); + item=country_search_get_item(cs); + if (item && item_attr_get(item, attr_country_name, &country_name)) { + search_attr.type=attr_country_all; + dbg(0,"country %s\n", country_name.u.str); + this->country_name=QString::fromLocal8Bit(country_name.u.str); + search_attr.u.str=country_name.u.str; + search_list_search(this->sl, &search_attr, 0); + while((res=search_list_get_result(this->sl))); + if (item_attr_get(item, attr_country_iso2, &country_iso2)) { + this->country_iso2=QString::fromLocal8Bit(country_iso2.u.str); + } + } + country_search_destroy(cs); + } else { + dbg(0,"warning: no default country found\n"); + if (!this->country_iso2.isEmpty()) { + dbg(0,"attempting to use country '%s'\n",this->country_iso2.toStdString().c_str()); + search_attr.type=attr_country_iso2; + search_attr.u.str=(char*)this->country_iso2.toStdString().c_str(); + search_list_search(this->sl, &search_attr, 0); + while((res=search_list_get_result(this->sl))); + } + } + } + ~NGQProxySearch() { + search_list_destroy(this->sl); + } + +signals: + void countryNameSignal(QString); + void countryISO2Signal(QString); + void townNameSignal(QString); + void streetNameSignal(QString); + +public slots: + void setPointToResult() { + struct attr attr; + struct search_list_result *res; + + if (this->street_name.length()>0) { + attr.type=attr_street_name; + attr.u.str=this->street_name.toLocal8Bit().data(); + } else if (this->town_name.length()>0) { + attr.type=attr_town_or_district_name; + attr.u.str=this->town_name.toLocal8Bit().data(); + } else if (this->country_name.length()>0) { + attr.type=attr_country_name; + attr.u.str=this->country_name.toLocal8Bit().data(); + } + search_list_search(this->sl,&attr,0); + if ((res=search_list_get_result(this->sl))) { + __setNewPoint(this->object,res->c,PointOfInterest); + } + return; + } + QString searchXml() { + NGQStandardItemModel* ret=new NGQStandardItemModel(this); + struct attr attr; + struct search_list_result *res; + int counter=0; + QDomDocument retDoc; + QDomElement entries; + + entries=retDoc.createElement("search"); + retDoc.appendChild(entries); + + if (this->search_context=="country") { + attr.type=attr_country_name; + attr.u.str=this->country_name.toLocal8Bit().data(); + } + if (this->search_context=="town") { + if (this->town_name.length()<3) { + return retDoc.toString(); + } + attr.type=attr_town_or_district_name; + attr.u.str=this->town_name.toLocal8Bit().data(); + } + if (this->search_context=="street") { + attr.type=attr_street_name; + attr.u.str=this->street_name.toLocal8Bit().data(); + } + + search_list_search(this->sl,&attr,1); + + while ((res=search_list_get_result(this->sl))) { + QStandardItem* curItem=new QStandardItem(); + QDomElement entry=retDoc.createElement("item"); + entries.appendChild(entry); + //Result processing depends on search type + if (this->search_context=="country") { + entry.appendChild(this->_fieldValueHelper(retDoc,QString("id"), QString::number(counter))); + entry.appendChild(this->_fieldValueHelper(retDoc,QString("name"), QString::fromLocal8Bit(res->country->name))); + entry.appendChild(this->_fieldValueHelper(retDoc,QString("icon"), QString("country_%1%2").arg(res->country->iso2).arg(".svgz"))); + } + if (this->search_context=="town") { + entry.appendChild(this->_fieldValueHelper(retDoc,QString("id"), QString::number(counter))); + if (res->town->common.town_name) { + entry.appendChild(this->_fieldValueHelper(retDoc,QString("name"),QString::fromLocal8Bit(res->town->common.town_name))); + } + if (res->town->common.district_name) { + entry.appendChild(this->_fieldValueHelper(retDoc,QString("name"), QString::fromLocal8Bit(res->town->common.district_name))); + } + } + if (this->search_context=="street") { + entry.appendChild(this->_fieldValueHelper(retDoc,QString("id"), QString::number(counter))); + entry.appendChild(this->_fieldValueHelper(retDoc,QString("name"),QString::fromLocal8Bit(res->street->name))); + } + counter++; + ret->appendRow(curItem); + } + + return retDoc.toString(); + } + QString countryName() { + return this->country_name; + } + void setCountryName(QString countryName) { + this->country_name=countryName; + struct attr attr; + struct search_list_result *res; + + //We need to update ISO2 + attr.type=attr_country_name; + attr.u.str=countryName.toLocal8Bit().data(); + search_list_search(this->sl,&attr,0); + while ((res=search_list_get_result(this->sl))) { + this->setCountryISO2(QString::fromLocal8Bit(res->country->iso2)); + } + //...and current town + this->town_name=""; + this->street_name=""; + + countryNameSignal(countryName); + } + QString countryISO2() { + return this->country_iso2; + } + void setCountryISO2(QString countryISO2) { + this->country_iso2=countryISO2; + countryISO2Signal(countryISO2); + } + QString townName() { + return this->town_name; + } + void setTownName(QString townName) { + struct attr attr; + + this->town_name=townName; + + //Specialize search + attr.type=attr_town_or_district_name; + attr.u.str=townName.toLocal8Bit().data(); + search_list_search(this->sl,&attr,0); + + //...and street + this->street_name=""; + + townNameSignal(townName); + } + QString streetName() { + return this->street_name; + } + void setStreetName(QString streetName) { + struct attr attr; + + this->street_name=streetName; + + //Specialize search + attr.type=attr_street_name; + attr.u.str=streetName.toLocal8Bit().data(); + search_list_search(this->sl,&attr,0); + + streetNameSignal(streetName); + } + QString searchContext() { + return this->search_context; + } + void setSearchContext(QString searchContext) { + this->search_context=searchContext; + } + +protected: + virtual int getAttrFunc(enum attr_type type, struct attr *attr, struct attr_iter *iter) { + return 0; + } + virtual int setAttrFunc(struct attr *attr) { + return 0; + } +private: + struct search_list *sl; + QString search_context; + QString country_iso2,country_name,town_name,street_name; +}; + +#include "searchProxy.moc" + +#endif /* NAVIT_GUI_QML_SEARCHPROXY_H */ diff --git a/navit/gui/qml/searchProxy.moc b/navit/gui/qml/searchProxy.moc new file mode 100644 index 0000000..e69de29 diff --git a/navit/gui/qml/skins/Makefile.am b/navit/gui/qml/skins/Makefile.am new file mode 100644 index 0000000..e0f29a2 --- /dev/null +++ b/navit/gui/qml/skins/Makefile.am @@ -0,0 +1 @@ +SUBDIRS=navit \ No newline at end of file diff --git a/navit/gui/qml/skins/Makefile.in b/navit/gui/qml/skins/Makefile.in new file mode 100644 index 0000000..1085a65 --- /dev/null +++ b/navit/gui/qml/skins/Makefile.in @@ -0,0 +1,708 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = navit/gui/qml/skins +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = navit +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/gui/qml/skins/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/gui/qml/skins/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/gui/qml/skins/navit/Makefile.am b/navit/gui/qml/skins/navit/Makefile.am new file mode 100644 index 0000000..0842a33 --- /dev/null +++ b/navit/gui/qml/skins/navit/Makefile.am @@ -0,0 +1,9 @@ +include $(top_srcdir)/Makefile.inc + +SKIN = navit + +qmldir=$(skinsdir)/$(SKIN) + +qml_DATA = ButtonIcon.qml ToggleSwitch.qml ToggleButton.qml ListSelector.qml Slider.qml CommonHighlight.qml Cellar.qml main.qml PageMain.qml PageNavigate.qml PageAbout.qml PageBookmarksAdd.qml PageBookmarks.qml PageRoute.qml PageSearch.qml PageSearchSelector.qml PageSettingsDisplay.qml PageSettingsLocale.qml PageSettings.qml PageSettingsRules.qml PageSettingsTools.qml PageSettingsVehicle.qml PagePoi.qml PagePointInfo.qml +qml_DATA += background.svg knob.svg +qml_DATA += command.js pagenavigation.js diff --git a/navit/gui/qml/skins/navit/Makefile.in b/navit/gui/qml/skins/navit/Makefile.in new file mode 100644 index 0000000..cdf4136 --- /dev/null +++ b/navit/gui/qml/skins/navit/Makefile.in @@ -0,0 +1,580 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/gui/qml/skins/navit +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(qmldir)" +DATA = $(qml_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +SKIN = navit +qmldir = $(skinsdir)/$(SKIN) +qml_DATA = ButtonIcon.qml ToggleSwitch.qml ToggleButton.qml \ + ListSelector.qml Slider.qml CommonHighlight.qml Cellar.qml \ + main.qml PageMain.qml PageNavigate.qml PageAbout.qml \ + PageBookmarksAdd.qml PageBookmarks.qml PageRoute.qml \ + PageSearch.qml PageSearchSelector.qml PageSettingsDisplay.qml \ + PageSettingsLocale.qml PageSettings.qml PageSettingsRules.qml \ + PageSettingsTools.qml PageSettingsVehicle.qml PagePoi.qml \ + PagePointInfo.qml background.svg knob.svg command.js \ + pagenavigation.js +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/gui/qml/skins/navit/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/gui/qml/skins/navit/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-qmlDATA: $(qml_DATA) + @$(NORMAL_INSTALL) + test -z "$(qmldir)" || $(MKDIR_P) "$(DESTDIR)$(qmldir)" + @list='$(qml_DATA)'; test -n "$(qmldir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(qmldir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(qmldir)" || exit $$?; \ + done + +uninstall-qmlDATA: + @$(NORMAL_UNINSTALL) + @list='$(qml_DATA)'; test -n "$(qmldir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(qmldir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(qmldir)" && rm -f $$files +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(qmldir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-qmlDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-qmlDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-qmlDATA \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am uninstall-qmlDATA + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/gui/qml/vehicleProxy.h b/navit/gui/qml/vehicleProxy.h new file mode 100644 index 0000000..483a183 --- /dev/null +++ b/navit/gui/qml/vehicleProxy.h @@ -0,0 +1,24 @@ +#ifndef NAVIT_GUI_QML_VEHICLEPROXY_H +#define NAVIT_GUI_QML_VEHICLEPROXY_H + +class NGQProxyVehicle : public NGQProxy { + Q_OBJECT; + +public: + NGQProxyVehicle(struct gui_priv* object, QObject* parent) : NGQProxy(object,parent) { }; + +public slots: + +protected: + int getAttrFunc(enum attr_type type, struct attr* attr, struct attr_iter* iter) { return vehicle_get_attr(this->object->currVehicle, type, attr, iter); } + int setAttrFunc(struct attr* attr) {return vehicle_set_attr(this->object->currVehicle,attr); } + struct attr_iter* getIterFunc() { return vehicle_attr_iter_new(); }; + void dropIterFunc(struct attr_iter* iter) { vehicle_attr_iter_destroy(iter); }; + +private: + +}; + +#include "vehicleProxy.moc" + +#endif /* NAVIT_GUI_QML_VEHICLEPROXY_H */ diff --git a/navit/gui/qml/vehicleProxy.moc b/navit/gui/qml/vehicleProxy.moc new file mode 100644 index 0000000..e69de29 diff --git a/navit/gui/win32/Makefile.am b/navit/gui/win32/Makefile.am new file mode 100644 index 0000000..06d91fa --- /dev/null +++ b/navit/gui/win32/Makefile.am @@ -0,0 +1,10 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = -I$(top_srcdir)/navit -I$(top_srcdir)/navit/graphics/win32 @NAVIT_CFLAGS@ -DMODULE=gui_win32 +if PLUGINS +modulegui_LTLIBRARIES = libgui_win32.la +else +noinst_LTLIBRARIES = libgui_win32.la +endif +libgui_win32_la_SOURCES = gui_win32.c win32_gui_destination.c win32_gui_notify.c ceglue.h ceglue.c +libgui_win32_la_LIBADD = +libgui_win32_la_LDFLAGS = -module -avoid-version diff --git a/navit/gui/win32/Makefile.in b/navit/gui/win32/Makefile.in new file mode 100644 index 0000000..e1738d1 --- /dev/null +++ b/navit/gui/win32/Makefile.in @@ -0,0 +1,708 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/gui/win32 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(moduleguidir)" +LTLIBRARIES = $(modulegui_LTLIBRARIES) $(noinst_LTLIBRARIES) +libgui_win32_la_DEPENDENCIES = +am_libgui_win32_la_OBJECTS = gui_win32.lo win32_gui_destination.lo \ + win32_gui_notify.lo ceglue.lo +libgui_win32_la_OBJECTS = $(am_libgui_win32_la_OBJECTS) +libgui_win32_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libgui_win32_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libgui_win32_la_rpath = +@PLUGINS_TRUE@am_libgui_win32_la_rpath = -rpath $(moduleguidir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libgui_win32_la_SOURCES) +DIST_SOURCES = $(libgui_win32_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = -I$(top_srcdir)/navit -I$(top_srcdir)/navit/graphics/win32 @NAVIT_CFLAGS@ -DMODULE=gui_win32 +@PLUGINS_TRUE@modulegui_LTLIBRARIES = libgui_win32.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libgui_win32.la +libgui_win32_la_SOURCES = gui_win32.c win32_gui_destination.c win32_gui_notify.c ceglue.h ceglue.c +libgui_win32_la_LIBADD = +libgui_win32_la_LDFLAGS = -module -avoid-version +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/gui/win32/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/gui/win32/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-moduleguiLTLIBRARIES: $(modulegui_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(moduleguidir)" || $(MKDIR_P) "$(DESTDIR)$(moduleguidir)" + @list='$(modulegui_LTLIBRARIES)'; test -n "$(moduleguidir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(moduleguidir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(moduleguidir)"; \ + } + +uninstall-moduleguiLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulegui_LTLIBRARIES)'; test -n "$(moduleguidir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(moduleguidir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(moduleguidir)/$$f"; \ + done + +clean-moduleguiLTLIBRARIES: + -test -z "$(modulegui_LTLIBRARIES)" || rm -f $(modulegui_LTLIBRARIES) + @list='$(modulegui_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgui_win32.la: $(libgui_win32_la_OBJECTS) $(libgui_win32_la_DEPENDENCIES) + $(libgui_win32_la_LINK) $(am_libgui_win32_la_rpath) $(libgui_win32_la_OBJECTS) $(libgui_win32_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ceglue.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui_win32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/win32_gui_destination.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/win32_gui_notify.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(moduleguidir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-moduleguiLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-moduleguiLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-moduleguiLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-moduleguiLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-moduleguiLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-moduleguiLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/gui/win32/ceglue.c b/navit/gui/win32/ceglue.c new file mode 100644 index 0000000..a0817f9 --- /dev/null +++ b/navit/gui/win32/ceglue.c @@ -0,0 +1,77 @@ +#include +#include "ceglue.h" + +BOOL FAR (*SHFullScreenPtr)(HWND hwnd, DWORD state) = NULL; + +void InitCeGlue (void) +{ + HINSTANCE ayg = LoadLibraryW (TEXT ("aygshell.dll")); + if (ayg != NULL) { + SHFullScreenPtr = (BOOL (*)(HWND, DWORD)) + GetProcAddressW (ayg, TEXT ("SHFullScreen")); + } +} + +// code to turn of screen adopted from +// http://msdn.microsoft.com/en-us/library/ms838354.aspx + +// GDI Escapes for ExtEscape() +#define QUERYESCSUPPORT 8 + +// The following are unique to CE +#define GETVFRAMEPHYSICAL 6144 +#define GETVFRAMELEN 6145 +#define DBGDRIVERSTAT 6146 +#define SETPOWERMANAGEMENT 6147 +#define GETPOWERMANAGEMENT 6148 + + +typedef enum _VIDEO_POWER_STATE { + VideoPowerOn = 1, + VideoPowerStandBy, + VideoPowerSuspend, + VideoPowerOff +} VIDEO_POWER_STATE, *PVIDEO_POWER_STATE; + + +typedef struct _VIDEO_POWER_MANAGEMENT { + ULONG Length; + ULONG DPMSVersion; + ULONG PowerState; +} VIDEO_POWER_MANAGEMENT, *PVIDEO_POWER_MANAGEMENT; + + +int CeEnableBacklight(int enable) +{ + HDC gdc; + int iESC=SETPOWERMANAGEMENT; + + gdc = GetDC(NULL); + if (ExtEscape(gdc, QUERYESCSUPPORT, sizeof(int), (LPCSTR)&iESC, + 0, NULL)==0) + { + MessageBox(NULL, + L"Sorry, your Pocket PC does not support DisplayOff", + L"Pocket PC Display Off Feature", + MB_OK); + ReleaseDC(NULL, gdc); + return FALSE; + } + else + { + VIDEO_POWER_MANAGEMENT vpm; + vpm.Length = sizeof(VIDEO_POWER_MANAGEMENT); + vpm.DPMSVersion = 0x0001; + if (enable) { + vpm.PowerState = VideoPowerOn; + } else { + vpm.PowerState = VideoPowerOff; + } + // Power off the display + ExtEscape(gdc, SETPOWERMANAGEMENT, vpm.Length, (LPCSTR) &vpm, + 0, NULL); + ReleaseDC(NULL, gdc); + return TRUE; + } +} + diff --git a/navit/gui/win32/ceglue.h b/navit/gui/win32/ceglue.h new file mode 100644 index 0000000..b0dc79d --- /dev/null +++ b/navit/gui/win32/ceglue.h @@ -0,0 +1,16 @@ +#ifndef CEGLUE_H +#define CEGLUE_H +#ifdef __cplusplus +extern "C" { +#endif + +extern BOOL (*SHFullScreenPtr)(HWND hwnd, DWORD state); +void InitCeGlue (void); + +int CeEnableBacklight(int enable); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/navit/gui/win32/gui_win32.c b/navit/gui/win32/gui_win32.c new file mode 100644 index 0000000..3596496 --- /dev/null +++ b/navit/gui/win32/gui_win32.c @@ -0,0 +1,643 @@ +#include +#include +#include +#include +#include "config.h" +#include "plugin.h" +#include "gui.h" +#include "graphics_win32.h" +#include "point.h" +#include "menu.h" +#include "item.h" +#include "attr.h" +#include "callback.h" +#include +#include "debug.h" +#include "util.h" +#include "navit.h" +#include "navit_nls.h" +#ifdef __CEGCC__ +#include +#include +#include "ceglue.h" + +static int ce_backlight = 1; +static int ce_fullscreen; +#endif + +#ifdef HAVE_GLIB +//static GHashTable *popup_callback_hash = NULL; +static GArray *popup_menu_array; +#endif + +const TCHAR g_szClassName[] = TEXT("navit_gui_class"); + + +static UINT_PTR menu_id = 0; + +#if 0 +static gboolean message_pump( gpointer data ) +{ + MSG messages; + + Sleep( 1 ); + + if (GetMessage (&messages, NULL, 0, 0)) + { + TranslateMessage(&messages); + DispatchMessage(&messages); + } + else{ + exit( 0 ); + } + return TRUE; +} + +static BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam) +{ + LPRECT rcParent; + int idChild; + + idChild = GetWindowLong(hwndChild, GWL_ID); + + if ( idChild == ID_CHILD_GFX ) + { + rcParent = (LPRECT) lParam; + + MoveWindow( hwndChild, 0, 0, rcParent->right, rcParent->bottom, TRUE ); + PostMessage( hwndChild, WM_USER+1, 0, 0 ); + } + + return TRUE; +} +#endif + +#ifndef GET_WHEEL_DELTA_WPARAM + #define GET_WHEEL_DELTA_WPARAM(wParam) ((short)HIWORD(wParam)) +#endif + +static void CreateToolBar(HWND hwnd) +{ + // Create Toolbar + HWND hTool; + TBBUTTON tbb[8]; + TBADDBITMAP tbab; +#if 0 /* def _WIN32_WCE */ + /* Have to initialize common controls under CE */ + INITCOMMONCONTROLSEX iccex; + iccex.dwSize = sizeof (INITCOMMONCONTROLSEX); + iccex.dwICC = ICC_BAR_CLASSES; + InitCommonControlsEx (&iccex); +#else + InitCommonControls(); +#endif + + hTool = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, + hwnd, (HMENU)ID_CHILD_TOOLBAR, GetModuleHandle(NULL), NULL); + + if(hTool == NULL) + MessageBox(hwnd, TEXT("Could not create tool bar."), TEXT("Error"), MB_OK | MB_ICONERROR); + + SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); + + tbab.hInst = GetModuleHandle(NULL); + tbab.nID = IDB_NAVITTOOLBAR; + int iImageOffset = SendMessage(hTool, TB_ADDBITMAP, 10, (LPARAM) &tbab); + + int iStr; + + ZeroMemory(tbb, sizeof(tbb)); + + tbb[0].iBitmap = iImageOffset; + tbb[0].fsState = TBSTATE_ENABLED; + tbb[0].fsStyle = TBSTYLE_BUTTON; + tbb[0].idCommand = ID_DISPLAY_ZOOMIN; + iStr = SendMessage(hTool, TB_ADDSTRINGW, 0, (LPARAM) L"ZoomIn" ); + tbb[0].iString = iStr; + + tbb[1].iBitmap = iImageOffset+1; + tbb[1].fsState = TBSTATE_ENABLED; + tbb[1].fsStyle = TBSTYLE_BUTTON; + tbb[1].idCommand = ID_DISPLAY_ZOOMOUT; + iStr = SendMessage(hTool, TB_ADDSTRINGW, 0, (LPARAM) L"ZoomOut" ); + tbb[1].iString = iStr; + + tbb[2].iBitmap = iImageOffset+4; + tbb[2].fsState = TBSTATE_ENABLED; + tbb[2].fsStyle = TBSTYLE_BUTTON; + tbb[2].idCommand = ID_DISPLAY_REFRESH; + iStr = SendMessage(hTool, TB_ADDSTRINGW, 0, (LPARAM) L"Refresh" ); + tbb[2].iString = iStr; + + tbb[3].iBitmap = iImageOffset+2; + tbb[3].fsState = TBSTATE_ENABLED; + tbb[3].fsStyle = TBSTYLE_BUTTON; + tbb[3].idCommand = ID_DISPLAY_ZOOMIN; + iStr = SendMessage(hTool, TB_ADDSTRINGW, 0, (LPARAM) L"Cursor" ); + tbb[3].iString = iStr; + + tbb[4].iBitmap = iImageOffset+5; + tbb[4].fsState = TBSTATE_ENABLED; + tbb[4].fsStyle = TBSTYLE_BUTTON; + tbb[4].idCommand = ID_DISPLAY_ORIENT; + iStr = SendMessage(hTool, TB_ADDSTRINGW, 0, (LPARAM) L"Orientation" ); + tbb[4].iString = iStr; + + tbb[5].iBitmap = iImageOffset+8; + tbb[5].fsState = TBSTATE_ENABLED; + tbb[5].fsStyle = TBSTYLE_BUTTON; + tbb[5].idCommand = ID_DISPLAY_ZOOMIN; + iStr= SendMessage(hTool, TB_ADDSTRINGW, 0, (LPARAM) L"Destination" ); + tbb[5].iString = iStr; + + tbb[6].iBitmap = iImageOffset+3; + tbb[6].fsState = TBSTATE_ENABLED; + tbb[6].fsStyle = TBSTYLE_BUTTON; + tbb[6].idCommand = ID_DISPLAY_ZOOMIN; + iStr= SendMessage(hTool, TB_ADDSTRINGW, 0, (LPARAM) L"Roadbook" ); + tbb[6].iString = iStr; + + tbb[7].iBitmap = iImageOffset+9; + tbb[7].fsState = TBSTATE_ENABLED; + tbb[7].fsStyle = TBSTYLE_BUTTON; + tbb[7].idCommand = ID_FILE_EXIT; + iStr= SendMessage(hTool, TB_ADDSTRINGW, 0, (LPARAM) L"_Quit" ); + tbb[7].iString = iStr; + + SendMessage(hTool, TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON), (LPARAM)&tbb); +} + +static void window_layout( HWND hwnd ) +{ +#ifndef HAVE_API_WIN32_CE + RECT rcClient; + RECT rcTool; + int iToolHeight; + + HWND hChild = GetDlgItem(hwnd, ID_CHILD_TOOLBAR); + SendMessage(hChild, TB_AUTOSIZE, 0, 0); + + GetWindowRect(hChild, &rcTool); + iToolHeight = rcTool.bottom - rcTool.top; + + GetClientRect(hwnd, &rcClient); + //printf( "BEFORE resize gui to: %d %d %d %d \n", rcClient.left, rcClient.right, rcClient.top, rcClient.bottom ); + + rcClient.top += iToolHeight; + + dbg(0, "resize gui to: %d %d %d %d \n", rcClient.left, rcClient.right, rcClient.top, rcClient.bottom ); + + + hChild = GetDlgItem(hwnd, ID_CHILD_GFX); + if ( hChild ) + { + MoveWindow( hChild, rcClient.left, rcClient.top, rcClient.right- rcClient.left, rcClient.bottom - rcClient.top, TRUE ); + PostMessage( hChild, WM_USER+1, 0, 0 ); + } +#endif +} +#ifdef __CEGCC__ +static void toggle_fullscreen(HWND mWnd) +{ + if (SHFullScreenPtr) { + if (!ce_fullscreen) { + (*SHFullScreenPtr)(mWnd, SHFS_HIDETASKBAR | + SHFS_HIDESTARTICON | SHFS_HIDESIPBUTTON); + } else { + (*SHFullScreenPtr)(mWnd, SHFS_HIDESIPBUTTON); + } + ce_fullscreen = !ce_fullscreen; + } +} + +static void toggle_backlight(void) +{ + if (ce_backlight) + if (CeEnableBacklight(FALSE)) + ce_backlight = 0; + else + if (CeEnableBacklight(TRUE)) + ce_backlight = 1; +} +#endif + +static LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + RECT rcClient; + +// printf( "PARENT %d %d %d \n", Message, wParam, lParam ); + + switch(Message) + { + case WM_CREATE: + { + HMENU hMenu, hSubMenu; + + CreateToolBar( hwnd ); + + hMenu = CreateMenu(); + // g_this_->hwnd = hwnd; + + hSubMenu = CreatePopupMenu(); + + AppendMenuW(hSubMenu, MF_STRING, ID_DISPLAY_ZOOMIN, L"ZoomIn" ); + AppendMenuW(hSubMenu, MF_STRING, ID_DISPLAY_ZOOMOUT, L"ZoomOut" ); + AppendMenuW(hSubMenu, MF_STRING, ID_DISPLAY_REFRESH, L"Refresh" ); + AppendMenuW(hSubMenu, MF_SEPARATOR, 0, NULL ); + AppendMenuW(hSubMenu, MF_STRING, ID_FILE_EXIT, L"_Quit" ); + + AppendMenuW(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, L"Display" ); + hSubMenu = CreatePopupMenu(); + AppendMenu(hSubMenu, MF_STRING, ID_STUFF_GO, TEXT("&Go")); + AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, TEXT("&Stuff")); + +#ifndef HAVE_API_WIN32_CE + SetMenu(hwnd, hMenu); +#endif + + window_layout( hwnd ); + + } + break; + case WM_COMMAND: + { + printf( "WM_COMMAND %d\n", LOWORD(wParam) ); + struct gui_priv* gui = (struct gui_priv*)GetWindowLongPtr( hwnd , DWLP_USER ); + + + switch(LOWORD(wParam)) + { + case ID_DISPLAY_ZOOMIN: + navit_zoom_in(gui->nav, 2, NULL); + return 0; + break; + case ID_DISPLAY_ZOOMOUT: + navit_zoom_out(gui->nav, 2, NULL); + return 0; + break; + case ID_DISPLAY_REFRESH: + navit_draw(gui->nav); + return 0; + break; + case ID_DISPLAY_CURSOR: + { + struct attr attr; + attr.type=attr_cursor; + // TODO attr.u.num=gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w)); + if(!navit_set_attr(gui->nav, &attr)) { + dbg(0, "Failed to set attr_cursor\n"); + } + return 0; + } + break; + case ID_DISPLAY_ORIENT: + { + struct attr attr; + + attr.type=attr_orientation; + // attr.u.num=gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w)); + attr.u.num = 0; // TODO + if(!navit_set_attr(gui->nav, &attr)) { + dbg(0, "Failed to set attr_orientation\n"); + } + return 0; + } + + case ID_FILE_EXIT: + PostMessage(hwnd, WM_CLOSE, 0, 0); + return 0; + break; + } +#if HAVE_GLIB + if ( popup_menu_array ) + { + struct menu_priv* priv = (struct menu_priv*)g_array_index( popup_menu_array, gint, LOWORD(wParam) - POPUP_MENU_OFFSET ); + + if ( priv ) + { + struct callback* cb = priv->cb; + if ( priv->cb ) + { + callback_call_0( priv->cb ); + return 0; + } + } + } +#endif + } + break; + case WM_USER+ 1: + GetClientRect(hwnd, &rcClient); + printf( "resize gui to: %d %d \n", rcClient.right, rcClient.bottom ); + + window_layout( hwnd ); + //EnumChildWindows(hwnd, EnumChildProc, (LPARAM) &rcClient); + return 0; + break; + case WM_CLOSE: + DestroyWindow(hwnd); + break; + case WM_SIZE: + window_layout( hwnd ); + return 0; + break; + case WM_DESTROY: + PostQuitMessage(0); + break; + + + case WM_MOUSEWHEEL: + { + struct gui_priv* gui = (struct gui_priv*)GetWindowLongPtr( hwnd , DWLP_USER ); + + short delta = GET_WHEEL_DELTA_WPARAM( wParam ); + if ( delta > 0 ) + { + navit_zoom_in(gui->nav, 2, NULL); + } + else{ + navit_zoom_out(gui->nav, 2, NULL); + } + } + break; +#ifdef HAVE_API_WIN32_CE + case WM_KEYDOWN: + { + struct point p; + int w,h; + struct gui_priv* gui = (struct gui_priv*)GetWindowLongPtr( hwnd , DWLP_USER ); + transform_get_size(navit_get_trans(gui->nav), &w, &h); + + if (wParam == VK_LEFT || wParam == '4') { + p.x=0; + p.y=h/2; + navit_set_center_screen(gui->nav, &p, 1); + } else if (wParam == VK_RIGHT || wParam == '6') { + p.x=w; + p.y=h/2; + navit_set_center_screen(gui->nav, &p, 1); + } else if (wParam == VK_UP || wParam == '2') { + p.x=w/2; + p.y=0; + navit_set_center_screen(gui->nav, &p, 1); + } else if (wParam == VK_DOWN || wParam == '8') { + p.x=w/2; + p.y=h; + navit_set_center_screen(gui->nav, &p, 1); + } else if (wParam == '1') { + navit_zoom_in(gui->nav, 2, NULL); + } else if (wParam == '3') { + navit_zoom_out(gui->nav, 2, NULL); + } else if (wParam == '7') { +#if 0 + toggle_backlight(); +#endif + } else if (wParam == '9') { +#if 0 + toggle_fullscreen(hwnd); +#endif + } + } + break; +#endif + default: + return DefWindowProc(hwnd, Message, wParam, lParam); + } + return 0; +} + +static HANDLE CreateWin32Window( void ) +{ +#ifdef HAVE_API_WIN32_CE + WNDCLASS wc; +#else + WNDCLASSEX wc; + wc.cbSize = sizeof(WNDCLASSEX); + wc.hIconSm = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_NAVIT)); +#endif + HWND hwnd; +// MSG Msg; + + wc.style = 0; + wc.lpfnWndProc = WndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 32; + wc.hInstance = NULL; + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + wc.lpszMenuName = NULL; + wc.lpszClassName = g_szClassName; + wc.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_NAVIT)); + +#ifdef HAVE_API_WIN32_CE + if(!RegisterClass(&wc)) +#else + if(!RegisterClassEx(&wc)) +#endif + + { + MessageBox(NULL, TEXT("Window Registration Failed!"), TEXT("Error!"), MB_ICONEXCLAMATION | MB_OK); + return 0; + } + + hwnd = CreateWindowEx( + WS_EX_CLIENTEDGE, + g_szClassName, + TEXT( "Navit" ), +#ifdef HAVE_API_WIN32_CE + WS_SYSMENU | WS_CLIPCHILDREN, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, +#else + + WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, + CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, +#endif + NULL, NULL, NULL, NULL); + + if(hwnd == NULL) + { + MessageBox(NULL, TEXT("Window Creation Failed!"), TEXT("Error!"), MB_ICONEXCLAMATION | MB_OK); + return 0; + } + + ShowWindow(hwnd, TRUE); + UpdateWindow(hwnd); + +#if 0 + g_idle_add (message_pump, NULL); +#endif + + return hwnd; +} + + +static int win32_gui_set_graphics(struct gui_priv *this_, struct graphics *gra) +{ + HANDLE* wndHandle_ptr = graphics_get_data(gra, "wnd_parent_handle_ptr"); + *wndHandle_ptr = this_->hwnd; + graphics_get_data(gra, "START_CLIENT"); + return 0; +} + + +static void win32_gui_add_bookmark_do(struct gui_priv *gui) +{ +// navit_add_bookmark(gui->nav, &gui->dialog_coord, gtk_entry_get_text(GTK_ENTRY(gui->dialog_entry))); +// gtk_widget_destroy(gui->dialog_win); +} + +static int win32_gui_add_bookmark(struct gui_priv *gui, struct pcoord *c, char *description) +{ + return 1; +} + + +static struct menu_methods menu_methods; + + +static struct menu_priv *add_menu( struct menu_priv *menu, + struct menu_methods *meth, + char *name, + enum menu_type type, + struct callback *cb) +{ + struct menu_priv* ret = NULL; + + ret = g_new0(struct menu_priv, 1); + + *ret = *menu; + *meth = menu_methods; + + TCHAR *menuname = newSysString(name); + + if ( type == menu_type_submenu ) + { + HMENU hSubMenu = NULL; + hSubMenu = CreatePopupMenu(); + AppendMenu(menu->hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, menuname ); + ret->hMenu = hSubMenu; + } + else + { + AppendMenu( menu->hMenu, MF_STRING, menu_id, name ); + } + + // g_hash_table_insert( popup_callback_hash, GINT_TO_POINTER( menu_id ), (gpointer)cb ); +#if HAVE_GLIB + g_array_append_val( popup_menu_array, ret ); +#endif + + ret->cb = cb; + + menu_id++; + + return ret; + +} + +static void set_toggle(struct menu_priv *menu, int active) +{ + // gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(menu->action), active); +} + +static int get_toggle(struct menu_priv *menu) +{ + // return gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(menu->action)); + return 0; +} + +static struct menu_methods menu_methods = { + add_menu, + set_toggle, + get_toggle, +}; + +static void popup_activate(struct menu_priv *menu) +{ + POINT pnt; + GetCursorPos( &pnt ); + + if (menu->hMenu) + { + TrackPopupMenu( menu->hMenu, 0, pnt.x, pnt.y, 0, menu->wnd_handle, NULL ); + DestroyMenu( menu->hMenu ); + } +} + + +static void popup_deactivate( struct menu_priv *menu ) +{ + DestroyMenu( menu->hMenu ); +} + +static struct menu_priv* win32_gui_popup_new(struct gui_priv *this_, struct menu_methods *meth) +{ + struct menu_priv* ret = NULL; + + ret = g_new0(struct menu_priv, 1); + *meth = menu_methods; + + menu_id = POPUP_MENU_OFFSET; + +#if HAVE_GLIB + if ( popup_menu_array ) + { + g_array_free (popup_menu_array, TRUE); + popup_menu_array = NULL; + } + + popup_menu_array = g_array_new (FALSE, FALSE, sizeof (gint)); +#endif + + ret->cb = NULL; + ret->hMenu = CreatePopupMenu(); + ret->wnd_handle = this_->hwnd; + meth->popup=popup_activate; + +printf( "create popup menu %d \n", ret->hMenu ); + + return ret; +} + +struct gui_methods win32_gui_methods = { + NULL, // win32_gui_menubar_new, + win32_gui_popup_new, + win32_gui_set_graphics, + NULL, + NULL, // win32_gui_datawindow_new, + win32_gui_add_bookmark, +}; + + + +static struct gui_priv *win32_gui_new( struct navit *nav, struct gui_methods *meth, struct attr **attrs) +{ + struct gui_priv *this_; +#ifdef HAVE_API_WIN32_CE + /* Do not run multiple instances under CE */ + HWND prev; + prev = FindWindow(g_szClassName, NULL); + if (prev) { + ShowWindow(prev, SW_RESTORE); + SetForegroundWindow(prev); + InvalidateRect (prev, NULL, FALSE); + exit(0); + } + InitCeGlue(); +#endif + + *meth=win32_gui_methods; + + this_=g_new0(struct gui_priv, 1); + this_->nav=nav; + + this_->hwnd = CreateWin32Window(); + SetWindowLongPtr( this_->hwnd , DWLP_USER, (LONG_PTR)this_ ); + + return this_; +} + +void plugin_init(void) +{ + plugin_register_gui_type("win32", win32_gui_new); +} diff --git a/navit/gui/win32/win32_gui_destination.c b/navit/gui/win32/win32_gui_destination.c new file mode 100644 index 0000000..a9465c9 --- /dev/null +++ b/navit/gui/win32/win32_gui_destination.c @@ -0,0 +1,412 @@ +#include +#include +#include +#include +#include "item.h" +#include "attr.h" +#include "navit.h" +#include "search.h" +#include "debug.h" +#include "util.h" +#include "win32_gui_notify.h" +#include "resources/resource.h" + +static const TCHAR g_szDestinationClassName[] = TEXT("navit_gui_destinationwindow_class"); + +struct datawindow_priv +{ + HWND hwnd; + HWND hwndLabel; + HWND hwndEdit; + HWND hwndList; + HWND hwndButtonPrev; + HWND hwndButtonNext; + enum attr_type currentSearchState; + struct search_list *sl; + struct navit *nav; + struct notify_priv *notifications; +}; + +static void setlayout(struct datawindow_priv *datawindow) +{ + LVCOLUMN lvc; + lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; + + RECT winrect; + GetWindowRect (datawindow->hwndList, &winrect); + + lvc.iSubItem = 1; + lvc.cx = (winrect.right - winrect.left) - 52 ; + lvc.fmt = LVCFMT_LEFT; // left-aligned column + + switch (datawindow->currentSearchState) + { + case attr_country_name: + { + Edit_SetText(datawindow->hwndLabel, TEXT("Country")); + lvc.pszText = TEXT("Country"); + } + break; + case attr_town_name: + { + Edit_SetText(datawindow->hwndLabel, TEXT("Postal or Town")); + lvc.pszText = TEXT("Town"); + } + break; + case attr_street_name: + { + Edit_SetText(datawindow->hwndLabel, TEXT("Street")); + lvc.pszText = TEXT("Street"); + } + break; + default: + break; + + } + + (void)ListView_SetColumn(datawindow->hwndList, 1, &lvc); + + Edit_SetText(datawindow->hwndEdit, TEXT("")); + SetFocus(datawindow->hwndEdit); +} + +static void notify_apply(struct datawindow_priv *datawindow, int index, int param2) +{ + TCHAR txtBuffer[1024]; + char search_string[1024]; + struct attr search_attr; + struct search_list_result *res; + + + if ( index >= 0 ) + { + ListView_GetItemText(datawindow->hwndList, index, 1, txtBuffer, 1024); + + TCHAR_TO_UTF8(txtBuffer, search_string); + + search_attr.type = datawindow->currentSearchState; + search_attr.u.str = search_string; + + search_list_search(datawindow->sl, &search_attr, 0); + res=search_list_get_result(datawindow->sl); + } + + switch (datawindow->currentSearchState) + { + case attr_country_name: + { + datawindow->currentSearchState = attr_town_name; + } + break; + case attr_town_name: + { + datawindow->currentSearchState = attr_street_name; + } + break; + case attr_street_name: + { + navit_set_destination(datawindow->nav, res->c, "Mein Test", 1); + DestroyWindow(datawindow->hwnd); + } + break; + default: + break; + + } + + setlayout(datawindow); + +} + +static void notify_back(struct datawindow_priv *datawindow, int param1, int param2) +{ + switch (datawindow->currentSearchState) + { + case attr_country_name: + break; + case attr_town_name: + { + datawindow->currentSearchState = attr_country_name; + } + break; + case attr_street_name: + { + datawindow->currentSearchState = attr_town_name; + } + break; + default: + break; + + } + + setlayout(datawindow); +} + +static void notify_textchange(struct datawindow_priv *datawindow, int param1, int param2) +{ + + struct attr search_attr; + struct search_list_result *res; + char search_string[1024]; + TCHAR converted_iso2[32]; + + + int lineLength = Edit_LineLength(datawindow->hwndEdit, 0); + TCHAR line[lineLength + 1]; + (void)Edit_GetLine(datawindow->hwndEdit, 0, line, lineLength + 1); + line[lineLength] = 0; + + + (void)ListView_DeleteAllItems( datawindow->hwndList); + + TCHAR_TO_UTF8(line, search_string); + + search_attr.type = datawindow->currentSearchState; + search_attr.u.str = search_string; + + if (lineLength<1) + return; + + search_list_search(datawindow->sl, &search_attr, 1); + + + TCHAR *tcharBuffer = NULL; + int listIndex = 0; + LVITEM lvI; + + lvI.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE; + lvI.state = 0; + lvI.stateMask = 0; + + while ((res=search_list_get_result(datawindow->sl)) && listIndex < 50) + { + + switch (search_attr.type) + { + case attr_country_name: + tcharBuffer = newSysString(res->country->name); + break; + case attr_town_name: + tcharBuffer = newSysString(res->town->common.town_name); + break; + case attr_street_name: + if (res->street->name) + { + tcharBuffer = newSysString(res->street->name); + } + else + { + continue; + } + break; + default: + dbg(0, "Unhandled search type"); + } + + lvI.iItem = listIndex; + lvI.iImage = listIndex; + lvI.iSubItem = 0; + lvI.lParam = (LPARAM) res->country->iso2; + UTF8_TO_TCHAR(res->country->iso2, converted_iso2); + lvI.pszText = converted_iso2;//LPSTR_TEXTCALLBACK; // sends an LVN_GETDISP message. + (void)ListView_InsertItem(datawindow->hwndList, &lvI); + ListView_SetItemText(datawindow->hwndList, listIndex, 1, tcharBuffer); + g_free(tcharBuffer); + dbg(0,"%s\n", res->country->name); + listIndex++; + } +} + +static void notify_destroy(struct datawindow_priv *datawindow, int param1, int param2) +{ + if ( datawindow ) + { + search_list_destroy(datawindow->sl); + g_free(datawindow); + } +} + +static void notify_size(struct datawindow_priv *datawindow, int width, int height) +{ + if (datawindow) + { + MoveWindow(datawindow->hwndLabel, + 0, 0, // starting x- and y-coordinates + width, // width of client area + 20, // height of client area + TRUE); // repaint window + MoveWindow(datawindow->hwndEdit, + 0, 20, // starting x- and y-coordinates + width, // width of client area + 20, // height of client area + TRUE); // repaint window + MoveWindow(datawindow->hwndList, + 0, 40, // starting x- and y-coordinates + width, // width of client area + height - 60, // height of client area + TRUE); // repaint window + MoveWindow(datawindow->hwndButtonPrev, + 0, height - 20, // starting x- and y-coordinates + width/2, // width of client area + 20, // height of client area + TRUE); // repaint window + MoveWindow(datawindow->hwndButtonNext, + width/2, height - 20, // starting x- and y-coordinates + width/2, // width of client area + 20, // height of client area + TRUE); // repaint window + + setlayout(datawindow); + + } +} + +static BOOL init_lv_columns(HWND hWndListView) +{ + +// struct LVCOLUMN lvc = {LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM, +// LVCFMT_LEFT, 100, szText[iCol], 0, iCol, 0, 0 }; + + TCHAR szText[][8] = {TEXT("Iso"),TEXT("Country")}; // temporary buffer + LVCOLUMN lvc; + int iCol; + + lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; + + for (iCol = 0; iCol < 2; iCol++) + { + lvc.iSubItem = iCol; + lvc.pszText = szText[iCol]; + lvc.cx = 50; // width of column in pixels + + if ( iCol < 2 ) + lvc.fmt = LVCFMT_LEFT; // left-aligned column + else + lvc.fmt = LVCFMT_RIGHT; // right-aligned column + + if (ListView_InsertColumn(hWndListView, iCol, &lvc) == -1) + return FALSE; + } + return TRUE; +} + +BOOL register_destination_window() +{ + WNDCLASS wc; + + wc.style = 0; + wc.lpfnWndProc = message_handler; + wc.cbClsExtra = 0; + wc.cbWndExtra = 32; + wc.hInstance = NULL; + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + wc.lpszMenuName = NULL; + wc.lpszClassName = g_szDestinationClassName; + wc.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_NAVIT)); + + if (!RegisterClass(&wc)) + { + dbg(0, "Window Registration Failed!\n"); + return FALSE; + } + return TRUE; +} + +HANDLE create_destination_window( struct navit *nav ) +{ + + + struct datawindow_priv *this_; + + this_=g_new0(struct datawindow_priv, 1); + this_->nav = nav; + this_->currentSearchState = attr_country_name; + this_->sl=search_list_new(navit_get_mapset(this_->nav)); + + this_->hwnd = CreateWindowEx( + WS_EX_CLIENTEDGE, + g_szDestinationClassName, + TEXT("Destination Input"), +#if defined(__CEGCC__) + WS_SYSMENU | WS_CLIPCHILDREN, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, +#else + WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, + CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, +#endif + NULL, NULL, NULL, NULL); + + if (this_->hwnd == NULL) + { + dbg(0, "Window Creation Failed!\n"); + return 0; + } + + this_->notifications = win32_gui_notify_new(this_); + SetWindowLongPtr( this_->hwnd , DWLP_USER, (LONG_PTR) this_->notifications ); + + this_->hwndLabel = CreateWindow(WC_STATIC, // predefined class + TEXT("Country"), // no window title + WS_CHILD | WS_VISIBLE | ES_LEFT , //| WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL + 0, 0, 0, 0, // set size in WM_SIZE message + this_->hwnd, // parent window + NULL,//(HMENU) ID_EDITCHILD, // edit control ID + (HINSTANCE) GetWindowLong(this_->hwnd, GWL_HINSTANCE), + NULL); // pointer not needed + + this_->hwndEdit = CreateWindow(WC_EDIT, // predefined class + NULL, // no window title + WS_CHILD | WS_VISIBLE | ES_LEFT | WS_BORDER , //| WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL + 0, 0, 0, 0, // set size in WM_SIZE message + this_->hwnd, // parent window + NULL,//(HMENU) ID_EDITCHILD, // edit control ID + (HINSTANCE) GetWindowLong(this_->hwnd, GWL_HINSTANCE), + NULL); // pointer not needed + + this_->hwndList = CreateWindow(WC_LISTVIEW, // predefined class + NULL, // no window title + WS_CHILD | WS_VISIBLE | ES_LEFT | WS_BORDER | LVS_REPORT , //| WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL + 0, 0, 0, 0, // set size in WM_SIZE message + this_->hwnd, // parent window + NULL,//(HMENU) ID_EDITCHILD, // edit control ID + (HINSTANCE) GetWindowLong(this_->hwnd, GWL_HINSTANCE), + NULL); // pointer not needed + + this_->hwndButtonPrev = CreateWindow(WC_BUTTON, // predefined class + TEXT("<<"), // no window title + WS_CHILD | WS_VISIBLE | ES_LEFT | WS_BORDER | LVS_REPORT , //| WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL + 0, 0, 0, 0, // set size in WM_SIZE message + this_->hwnd, // parent window + NULL,//(HMENU) ID_EDITCHILD, // edit control ID + (HINSTANCE) GetWindowLong(this_->hwnd, GWL_HINSTANCE), + NULL); // pointer not needed + this_->hwndButtonNext = CreateWindow(WC_BUTTON, // predefined class + TEXT(">>"), // no window title + WS_CHILD | WS_VISIBLE | ES_LEFT | WS_BORDER | LVS_REPORT , //| WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL + 0, 0, 0, 0, // set size in WM_SIZE message + this_->hwnd, // parent window + NULL,//(HMENU) ID_EDITCHILD, // edit control ID + (HINSTANCE) GetWindowLong(this_->hwnd, GWL_HINSTANCE), + NULL); // pointer not needed +#ifdef LVS_EX_FULLROWSELECT + (void)ListView_SetExtendedListViewStyle(this_->hwndList,LVS_EX_FULLROWSELECT); +#endif + + + win32_gui_notify( this_->notifications, this_->hwndEdit, CHANGE, notify_textchange); + win32_gui_notify( this_->notifications, NULL, WINDOW_SIZE, notify_size); + win32_gui_notify( this_->notifications, this_->hwndList, DBLCLICK, notify_apply); + win32_gui_notify( this_->notifications, this_->hwnd, WINDOW_DESTROY, notify_destroy); + + win32_gui_notify( this_->notifications, this_->hwndButtonNext, BUTTON_CLICK, notify_apply); + win32_gui_notify( this_->notifications, this_->hwndButtonPrev, BUTTON_CLICK, notify_back); + + init_lv_columns(this_->hwndList); + SetFocus(this_->hwndEdit); + ShowWindow(this_->hwnd, TRUE); + UpdateWindow(this_->hwnd); + + return this_->hwnd; +} + diff --git a/navit/gui/win32/win32_gui_notify.c b/navit/gui/win32/win32_gui_notify.c new file mode 100644 index 0000000..c801e9d --- /dev/null +++ b/navit/gui/win32/win32_gui_notify.c @@ -0,0 +1,132 @@ +#include +#include +#include +#include +#include "win32_gui_notify.h" + +struct window_data +{ + HWND hwnd; + UINT message; + void(*func)(struct datawindow_priv *parent, int param1, int param2); +}; + +struct notify_priv +{ + GList *window_list; + struct datawindow_priv *parent; + +}; + + +void win32_gui_notify(struct notify_priv* notify, HWND hwnd, int message_id, void(*func)(struct datawindow_priv *parent, int param1, int param2)) +{ + struct window_data *wnd_data = g_new( struct window_data,1); + + wnd_data->hwnd = hwnd; + wnd_data->message = message_id; + wnd_data->func = func; + + notify->window_list = g_list_append( notify->window_list, (gpointer) wnd_data ); + +} + +struct notify_priv* win32_gui_notify_new(struct datawindow_priv *parent) +{ + struct notify_priv* notify = g_new0(struct notify_priv,1); + notify->parent = parent; + return notify; +} + +LRESULT CALLBACK message_handler(HWND hwnd, UINT win_message, WPARAM wParam, LPARAM lParam) +{ + enum message_id message = INVALID; + int param1 = -1; + int param2 = -1; + HWND hwndDlg = hwnd; + + switch (win_message) + { + case WM_CREATE: + { + message = WINDOW_CREATE; + } + break; + case WM_SIZE: + { + message = WINDOW_SIZE; + param1 = LOWORD(lParam); + param2 = HIWORD(lParam); + } + break; + case WM_DESTROY: + { + message = WINDOW_DESTROY; + } + break; + case WM_NOTIFY: + { + hwndDlg = (((LPNMHDR)lParam)->hwndFrom); + switch (((LPNMHDR)lParam)->code) + { + case NM_DBLCLK: + { + message = DBLCLICK; +#ifdef LPNMITEMACTIVATE + param1 = ((LPNMITEMACTIVATE)lParam)->iItem; +#endif + } + break; + case NM_CLICK: + message = CLICK; + break; + } + } + break; + case WM_COMMAND: + { + hwndDlg = (HWND)lParam; + + switch (HIWORD(wParam)) + { + case EN_CHANGE: + { + message = CHANGE; + } + break; + case BN_CLICKED: + { + message = BUTTON_CLICK; + } + break; + } + } + break; + + default: + return DefWindowProc(hwnd, win_message, wParam, lParam); + } + + struct notify_priv* notify_data = (struct notify_priv*)GetWindowLongPtr( hwnd , DWLP_USER ); + + if ( message != INVALID && notify_data && notify_data->window_list ) + { + + GList* current_element = g_list_first(notify_data->window_list); + + + struct window_data* wnd_data = NULL; + while (current_element != NULL) + { + wnd_data = current_element->data; + + if ( (wnd_data->hwnd == hwndDlg || wnd_data->hwnd == NULL) && message == wnd_data->message) + { + wnd_data->func(notify_data->parent, param1, param2); + } + + current_element = g_list_next(current_element); + } + } + return FALSE; +} diff --git a/navit/item.c b/navit/item.c new file mode 100644 index 0000000..0a57bd8 --- /dev/null +++ b/navit/item.c @@ -0,0 +1,358 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include "coord.h" +#include "debug.h" +#include "item.h" +#include "map.h" +#include "transform.h" + +struct item_name { + enum item_type item; + char *name; +}; + +struct item_range item_range_all = { type_none, type_last }; + +struct default_flags { + enum item_type type; + int flags; +}; + +struct item busy_item; + +struct default_flags default_flags2[]={ + {type_street_nopass, AF_PBH}, + {type_street_0, AF_ALL}, + {type_street_1_city, AF_ALL}, + {type_street_2_city, AF_ALL}, + {type_street_3_city, AF_ALL}, + {type_street_4_city, AF_ALL}, + {type_highway_city, AF_MOTORIZED_FAST}, + {type_street_1_land, AF_ALL}, + {type_street_2_land, AF_ALL}, + {type_street_3_land, AF_ALL}, + {type_street_4_land, AF_ALL}, + {type_street_n_lanes, AF_MOTORIZED_FAST}, + {type_highway_land, AF_MOTORIZED_FAST}, + {type_ramp, AF_MOTORIZED_FAST}, + {type_roundabout, AF_ALL}, + {type_ferry, AF_ALL}, + {type_cycleway, AF_PBH}, + {type_track_paved, AF_ALL}, + {type_track_gravelled, AF_ALL}, + {type_track_unpaved, AF_ALL}, + {type_track_ground, AF_ALL}, + {type_track_grass, AF_ALL}, + {type_footway, AF_PBH}, + {type_living_street, AF_ALL}, + {type_street_service, AF_ALL}, + {type_street_parking_lane, AF_ALL}, + {type_bridleway, AF_PBH}, + {type_path, AF_PBH}, + {type_steps, AF_PBH}, + {type_street_pedestrian, AF_PBH}, +}; + + + +struct item_name item_names[]={ +#define ITEM2(x,y) ITEM(y) +#define ITEM(x) { type_##x, #x }, +#include "item_def.h" +#undef ITEM2 +#undef ITEM +}; + +static GHashTable *default_flags_hash; + +int * +item_get_default_flags(enum item_type type) +{ + if (!default_flags_hash) { + int i; + default_flags_hash=g_hash_table_new(NULL, NULL); + for (i = 0 ; i < sizeof(default_flags2)/sizeof(struct default_flags); i++) { + g_hash_table_insert(default_flags_hash, (void *)(long)default_flags2[i].type, &default_flags2[i].flags); + } + } + return g_hash_table_lookup(default_flags_hash, (void *)(long)type); +} + +void +item_cleanup(void) +{ + if (default_flags_hash) + g_hash_table_destroy(default_flags_hash); +} + +void +item_coord_rewind(struct item *it) +{ + it->meth->item_coord_rewind(it->priv_data); +} + +int +item_coord_get(struct item *it, struct coord *c, int count) +{ + return it->meth->item_coord_get(it->priv_data, c, count); +} + +int +item_coord_set(struct item *it, struct coord *c, int count, enum change_mode mode) +{ + if (!it->meth->item_coord_set) + return 0; + return it->meth->item_coord_set(it->priv_data, c, count, mode); +} + +int +item_coord_get_within_selection(struct item *it, struct coord *c, int count, struct map_selection *sel) +{ + int i,ret=it->meth->item_coord_get(it->priv_data, c, count); + struct coord_rect r; + struct map_selection *curr; + if (ret <= 0 || !sel) + return ret; + r.lu=c[0]; + r.rl=c[0]; + for (i = 1 ; i < ret ; i++) { + if (r.lu.x > c[i].x) + r.lu.x=c[i].x; + if (r.rl.x < c[i].x) + r.rl.x=c[i].x; + if (r.rl.y > c[i].y) + r.rl.y=c[i].y; + if (r.lu.y < c[i].y) + r.lu.y=c[i].y; + } + curr=sel; + while (curr) { + struct coord_rect *sr=&curr->u.c_rect; + if (r.lu.x <= sr->rl.x && r.rl.x >= sr->lu.x && + r.lu.y >= sr->rl.y && r.rl.y <= sr->lu.y) + return ret; + curr=curr->next; + } + return 0; +} + +int +item_coord_get_pro(struct item *it, struct coord *c, int count, enum projection to) +{ + int ret=item_coord_get(it, c, count); + int i; + enum projection from=map_projection(it->map); + if (from != to) + for (i = 0 ; i < count ; i++) + transform_from_to(c+i, from, c+i, to); + return ret; +} + +int +item_coord_is_node(struct item *it) +{ + if (it->meth->item_coord_is_node) + return it->meth->item_coord_is_node(it->priv_data); + return 0; +} + +void +item_attr_rewind(struct item *it) +{ + it->meth->item_attr_rewind(it->priv_data); +} + +int +item_attr_get(struct item *it, enum attr_type attr_type, struct attr *attr) +{ + return it->meth->item_attr_get(it->priv_data, attr_type, attr); +} + +int +item_attr_set(struct item *it, struct attr *attr, enum change_mode mode) +{ + if (!it->meth->item_attr_set) + return 0; + return it->meth->item_attr_set(it->priv_data, attr, mode); +} + +struct item * item_new(char *type, int zoom) +{ + struct item * it; + + it = g_new0(struct item, 1); + + /* FIXME evaluate arguments */ + + return it; +} + +enum item_type +item_from_name(const char *name) +{ + int i; + + for (i=0 ; i < sizeof(item_names)/sizeof(struct item_name) ; i++) { + if (! strcmp(item_names[i].name, name)) + return item_names[i].item; + } + return type_none; +} + +char * +item_to_name(enum item_type item) +{ + int i; + + for (i=0 ; i < sizeof(item_names)/sizeof(struct item_name) ; i++) { + if (item_names[i].item == item) + return item_names[i].name; + } + return NULL; +} + +struct item_hash { + GHashTable *h; +}; + +static guint +item_hash_hash(gconstpointer key) +{ + const struct item *itm=key; + gconstpointer hashkey=(gconstpointer)GINT_TO_POINTER(itm->id_hi^itm->id_lo^(GPOINTER_TO_INT(itm->map))); + return g_direct_hash(hashkey); +} + +static gboolean +item_hash_equal(gconstpointer a, gconstpointer b) +{ + const struct item *itm_a=a; + const struct item *itm_b=b; + if (item_is_equal(*itm_a, *itm_b)) + return TRUE; + return FALSE; +} + +unsigned int +item_id_hash(const void *key) +{ + const struct item_id *id=key; + return id->id_hi^id->id_lo; +} + +int +item_id_equal(const void *a, const void *b) +{ + const struct item_id *id_a=a; + const struct item_id *id_b=b; + return (id_a->id_hi == id_b->id_hi && id_a->id_lo == id_b->id_lo); +} + + + +struct item_hash * +item_hash_new(void) +{ + struct item_hash *ret=g_new(struct item_hash, 1); + + ret->h=g_hash_table_new_full(item_hash_hash, item_hash_equal, g_free, NULL); + return ret; +} + +void +item_hash_insert(struct item_hash *h, struct item *item, void *val) +{ + struct item *hitem=g_new(struct item, 1); + *hitem=*item; + dbg(2,"inserting (0x%x,0x%x) into %p\n", item->id_hi, item->id_lo, h->h); + g_hash_table_insert(h->h, hitem, val); +} + +int +item_hash_remove(struct item_hash *h, struct item *item) +{ + int ret; + + dbg(2,"removing (0x%x,0x%x) from %p\n", item->id_hi, item->id_lo, h->h); + ret=g_hash_table_remove(h->h, item); + dbg(2,"ret=%d\n", ret); + + return ret; +} + +void * +item_hash_lookup(struct item_hash *h, struct item *item) +{ + return g_hash_table_lookup(h->h, item); +} + + +void +item_hash_destroy(struct item_hash *h) +{ + g_hash_table_destroy(h->h); + g_free(h); +} + +int +item_range_intersects_range(struct item_range *range1, struct item_range *range2) +{ + if (range1->max < range2->min) + return 0; + if (range1->min > range2->max) + return 0; + return 1; +} +int +item_range_contains_item(struct item_range *range, enum item_type type) +{ + if (type >= range->min && type <= range->max) + return 1; + return 0; +} + +void +item_dump_attr(struct item *item, struct map *map, FILE *out) +{ + struct attr attr; + fprintf(out,"type=%s", item_to_name(item->type)); + while (item_attr_get(item, attr_any, &attr)) + fprintf(out," %s='%s'", attr_to_name(attr.type), attr_to_text(&attr, map, 1)); +} + +void +item_dump_filedesc(struct item *item, struct map *map, FILE *out) +{ + + int i,count,max=16384; + struct coord *ca=g_alloca(sizeof(struct coord)*max); + + count=item_coord_get(item, ca, item->type < type_line ? 1: max); + if (item->type < type_line) + fprintf(out,"mg:0x%x 0x%x ", ca[0].x, ca[0].y); + item_dump_attr(item, map, out); + fprintf(out,"\n"); + if (item->type >= type_line) + for (i = 0 ; i < count ; i++) + fprintf(out,"mg:0x%x 0x%x\n", ca[i].x, ca[i].y); +} diff --git a/navit/item.h b/navit/item.h new file mode 100644 index 0000000..4640b71 --- /dev/null +++ b/navit/item.h @@ -0,0 +1,154 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_ITEM_H +#define NAVIT_ITEM_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +enum item_type { +#define ITEM2(x,y) type_##y=x, +#define ITEM(x) type_##x, +#include "item_def.h" +#undef ITEM2 +#undef ITEM +}; + +#define route_item_first type_street_0 +#define route_item_last type_path +extern int default_flags[]; + +#include "attr.h" + + +/* NOTE: we treat districts as towns for now, since + a) navit does not implement district search yet + b) OSM "place=suburb" maps to type_district in maptool. with the OSM USA maps, + there are many "suburbs" that users will consider towns (not districts/counties); + we want navit's town search to find them +*/ +#define item_type_is_area(type) ((type) >= type_area) +#define item_is_town(item) ((item).type >= type_town_label && (item).type <= type_district_label_1e7) +#define item_is_district(item) ((item).type >= type_district_label && (item).type <= type_district_label_1e7) +#define item_is_poly_place(item) ((item).type >= type_poly_place1 && (item).type <= type_poly_place6) +#define item_is_point(item) ((item).type < type_line) +#define item_is_custom_poi(item) ((item).type >= type_poi_custom0 && (item).type < type_line) +#define item_is_street(item) (((item).type >= type_street_0 && (item).type < type_street_1_land) \ + || (item).type == type_street_pedestrian \ + || (item).type == type_living_street \ + || (item).type == type_footway) + +#define item_is_equal_id(a,b) ((a).id_hi == (b).id_hi && (a).id_lo == (b).id_lo) +#define item_is_equal(a,b) (item_is_equal_id(a,b) && (a).map == (b).map) + +struct coord; + +enum change_mode { + change_mode_delete, + change_mode_modify, + change_mode_append, + change_mode_prepend, +}; + +struct item_methods { + void (*item_coord_rewind)(void *priv_data); + int (*item_coord_get)(void *priv_data, struct coord *c, int count); + void (*item_attr_rewind)(void *priv_data); + int (*item_attr_get)(void *priv_data, enum attr_type attr_type, struct attr *attr); + int (*item_coord_is_node)(void *priv_data); + int (*item_attr_set)(void *priv_data, struct attr *attr, enum change_mode mode); + int (*item_coord_set)(void *priv_data, struct coord *c, int count, enum change_mode mode); + int (*item_type_set)(void *priv_data, enum item_type type); +}; + +struct item_id { + int id_hi; + int id_lo; +}; + +#define ITEM_ID_FMT "(0x%x,0x%x)" +#define ITEM_ID_ARGS(x) (x).id_hi,(x).id_lo + +struct item { + enum item_type type; + int id_hi; + int id_lo; + struct map *map; + struct item_methods *meth; + void *priv_data; +}; + +extern struct item_range { + enum item_type min,max; +} item_range_all; + +extern struct item busy_item; + +/* prototypes */ +enum attr_type; +enum change_mode; +enum item_type; +enum projection; +struct attr; +struct coord; +struct item; +struct item_hash; +struct item_range; +struct map; +struct map_selection; +int *item_get_default_flags(enum item_type type); +void item_coord_rewind(struct item *it); +int item_coord_get(struct item *it, struct coord *c, int count); +int item_coord_set(struct item *it, struct coord *c, int count, enum change_mode mode); +int item_coord_get_within_selection(struct item *it, struct coord *c, int count, struct map_selection *sel); +int item_coord_get_pro(struct item *it, struct coord *c, int count, enum projection to); +int item_coord_is_node(struct item *it); +void item_attr_rewind(struct item *it); +int item_attr_get(struct item *it, enum attr_type attr_type, struct attr *attr); +int item_attr_set(struct item *it, struct attr *attr, enum change_mode mode); +struct item *item_new(char *type, int zoom); +enum item_type item_from_name(const char *name); +char *item_to_name(enum item_type item); +unsigned int item_id_hash(const void *key); +int item_id_equal(const void *a, const void *b); +struct item_hash *item_hash_new(void); +void item_hash_insert(struct item_hash *h, struct item *item, void *val); +int item_hash_remove(struct item_hash *h, struct item *item); +void *item_hash_lookup(struct item_hash *h, struct item *item); +void item_hash_destroy(struct item_hash *h); +int item_range_intersects_range(struct item_range *range1, struct item_range *range2); +int item_range_contains_item(struct item_range *range, enum item_type type); +void item_dump_attr(struct item *item, struct map *map, FILE *out); +void item_dump_filedesc(struct item *item, struct map *map, FILE *out); +void item_cleanup(void); + +/* end of prototypes */ + + +#ifdef __cplusplus +} +/* __cplusplus */ +#endif + +/* NAVIT_ITEM_H */ +#endif diff --git a/navit/item_def.h b/navit/item_def.h new file mode 100644 index 0000000..775ba26 --- /dev/null +++ b/navit/item_def.h @@ -0,0 +1,584 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +/* This file is generated from http://wiki.navit-project.org/index.php/Item_def.h, do not edit it, edit the wiki page instead */ +ITEM2(0x00000000,none) +ITEM2(0x00000001,point_unspecified) +ITEM(town_streets) +ITEM(street_name) +ITEM(street_name_numbers) +ITEM(street_number) +ITEM(position_sat) +/* Point */ +ITEM2(0x00010000,town_label) +ITEM2(0x00010001,town_label_0e0) +ITEM2(0x00010002,town_label_1e0) +ITEM2(0x00010003,town_label_2e0) +ITEM2(0x00010004,town_label_5e0) +ITEM2(0x00010005,town_label_1e1) +ITEM2(0x00010006,town_label_2e1) +ITEM2(0x00010007,town_label_5e1) +ITEM2(0x00010008,town_label_1e2) +ITEM2(0x00010009,town_label_2e2) +ITEM2(0x0001000a,town_label_5e2) +ITEM2(0x0001000b,town_label_1e3) +ITEM2(0x0001000c,town_label_2e3) +ITEM2(0x0001000d,town_label_5e3) +ITEM2(0x0001000e,town_label_1e4) +ITEM2(0x0001000f,town_label_2e4) +ITEM2(0x00010010,town_label_5e4) +ITEM2(0x00010011,town_label_1e5) +ITEM2(0x00010012,town_label_2e5) +ITEM2(0x00010013,town_label_5e5) +ITEM2(0x00010014,town_label_1e6) +ITEM2(0x00010015,town_label_2e6) +ITEM2(0x00010016,town_label_5e6) +ITEM2(0x00010017,town_label_1e7) +ITEM2(0x00010100,district_label) +ITEM2(0x00010101,district_label_0e0) +ITEM2(0x00010102,district_label_1e0) +ITEM2(0x00010103,district_label_2e0) +ITEM2(0x00010104,district_label_5e0) +ITEM2(0x00010105,district_label_1e1) +ITEM2(0x00010106,district_label_2e1) +ITEM2(0x00010107,district_label_5e1) +ITEM2(0x00010108,district_label_1e2) +ITEM2(0x00010109,district_label_2e2) +ITEM2(0x0001010a,district_label_5e2) +ITEM2(0x0001010b,district_label_1e3) +ITEM2(0x0001010c,district_label_2e3) +ITEM2(0x0001010d,district_label_5e3) +ITEM2(0x0001010e,district_label_1e4) +ITEM2(0x0001010f,district_label_2e4) +ITEM2(0x00010110,district_label_5e4) +ITEM2(0x00010111,district_label_1e5) +ITEM2(0x00010112,district_label_2e5) +ITEM2(0x00010113,district_label_5e5) +ITEM2(0x00010114,district_label_1e6) +ITEM2(0x00010115,district_label_2e6) +ITEM2(0x00010116,district_label_5e6) +ITEM2(0x00010117,district_label_1e7) +ITEM(country_label) +ITEM(town_ghost) +ITEM(highway_exit_label) +ITEM(port_label) +ITEM(label_unkn) +ITEM(highway_exit) +ITEM(poi_lake) +ITEM(poi_island) +ITEM(poi) +ITEM(waypoint) +ITEM(trackpoint) +ITEM(bookmark) +ITEM(former_destination) +ITEM(poi_land_feature) +ITEM(poi_cape) +ITEM(poi_rock) +ITEM(poi_airport) +ITEM(poi_toll_booth) +ITEM(poi_fuel) +ITEM(poi_hotel) +ITEM(poi_camp_rv) +ITEM(poi_marina) +ITEM(poi_attraction) +ITEM(poi_museum_history) +ITEM(poi_shopping) +ITEM(poi_car_dealer_parts) +ITEM(poi_car_parking) +ITEM(poi_wreck) +ITEM(poi_building) +ITEM(poi_bridge) +ITEM(poi_park) +ITEM(poi_water_feature) +ITEM(poi_bar) +ITEM(poi_picnic) +ITEM(poi_hospital) +ITEM(poi_camping) +ITEM(poi_public_utilities) +ITEM(poi_burgerking) +ITEM(poi_kfc) +ITEM(poi_mcdonalds) +ITEM(poi_wienerwald) +ITEM(poi_dining) +ITEM(poi_fastfood) +ITEM(poi_police) +ITEM(poi_auto_club) +ITEM(poi_autoservice) +ITEM(poi_bank) +ITEM(poi_bay) +ITEM(poi_bend) +ITEM(poi_boat_ramp) +ITEM(poi_border_station) +ITEM(poi_bowling) +ITEM(poi_bus_station) +ITEM(poi_bus_stop) +ITEM(poi_business_service) +ITEM(poi_car_rent) +ITEM(poi_car_wash) +ITEM(poi_casino) +ITEM(poi_cemetery) +ITEM(poi_church) +ITEM(poi_cinema) +ITEM(poi_civil_removeme) +ITEM(poi_communication) +ITEM(poi_concert) +ITEM(poi_cove) +ITEM(poi_crossing) +ITEM(poi_dam) +ITEM(poi_danger_area) +ITEM(poi_danger_sea_wreck) +ITEM(poi_daymark) +ITEM(poi_diving) +ITEM(poi_drinking_water) +ITEM(poi_emergency) +ITEM(poi_fair) +ITEM(poi_firebrigade) +ITEM(poi_fish) +ITEM(poi_forbidden_area) +ITEM(poi_shop_gps) +ITEM(poi_golf) +ITEM(poi_government_building) +ITEM(poi_height) +ITEM(poi_heliport) +ITEM(poi_hotspring) +ITEM(poi_icesport) +ITEM(poi_information) +ITEM(poi_justice) +ITEM(poi_landmark) +ITEM(poi_levee) +ITEM(poi_library) +ITEM(poi_locale) +ITEM(poi_loudspeaker) +ITEM(poi_mall) +ITEM(poi_manmade_feature) +ITEM(poi_marine) +ITEM(poi_marine_type) +ITEM(poi_mark) +ITEM(poi_military) +ITEM(poi_mine) +ITEM(poi_nondangerous) +ITEM(poi_oil_field) +ITEM(poi_personal_service) +ITEM(poi_pharmacy) +ITEM(poi_post_removeme) +ITEM(poi_public_office) +ITEM(poi_repair_service) +ITEM(poi_resort) +ITEM(poi_rest_room_removeme) +ITEM(poi_restaurant) +ITEM(poi_restricted_area) +ITEM(poi_restroom) +ITEM(poi_sailing) +ITEM(poi_scenic_area) +ITEM(poi_school) +ITEM(poi_service) +ITEM(poi_shop_apparel) +ITEM(poi_shop_computer) +ITEM(poi_shop_department) +ITEM(poi_shop_furnish_removeme) +ITEM(poi_shop_grocery) +ITEM(poi_shop_handg) +ITEM(poi_shop_merchandise) +ITEM(poi_shop_retail) +ITEM(poi_shower) +ITEM(poi_skiing) +ITEM(poi_social_service) +ITEM(poi_sounding) +ITEM(poi_sport) +ITEM(poi_stadium) +ITEM(poi_subdivision_removeme) +ITEM(poi_swimming) +ITEM(poi_telephone) +ITEM(poi_theater) +ITEM(poi_tide) +ITEM(poi_tower) +ITEM(poi_trail) +ITEM(poi_truck_stop) +ITEM(poi_tunnel) +ITEM(poi_wine) +ITEM(poi_worship) +ITEM(poi_wrecker) +ITEM(poi_zoo) +ITEM(rg_point) +ITEM(point_unkn) +ITEM(traffic_signals) +ITEM(poi_gc_multi) +ITEM(poi_gc_tradi) +ITEM(poi_gc_event) +ITEM(poi_gc_mystery) +ITEM(poi_gc_question) +ITEM(poi_gc_stages) +ITEM(poi_gc_reference) +ITEM(poi_gc_webcam) +ITEM(poi_cafe) +ITEM(nav_straight) +ITEM(nav_turnaround) +ITEM(nav_right_1) +ITEM(nav_right_2) +ITEM(nav_right_3) +ITEM(nav_left_1) +ITEM(nav_left_2) +ITEM(nav_left_3) +ITEM(nav_roundabout_r1) +ITEM(nav_roundabout_r2) +ITEM(nav_roundabout_r3) +ITEM(nav_roundabout_r4) +ITEM(nav_roundabout_r5) +ITEM(nav_roundabout_r6) +ITEM(nav_roundabout_r7) +ITEM(nav_roundabout_r8) +ITEM(nav_roundabout_l1) +ITEM(nav_roundabout_l2) +ITEM(nav_roundabout_l3) +ITEM(nav_roundabout_l4) +ITEM(nav_roundabout_l5) +ITEM(nav_roundabout_l6) +ITEM(nav_roundabout_l7) +ITEM(nav_roundabout_l8) +ITEM(poi_peak) +ITEM(poi_rail_station) +ITEM(poi_image) +ITEM(mini_roundabout) +ITEM(turning_circle) +ITEM(poi_townhall) +ITEM(poi_level_crossing) +ITEM(poi_rail_halt) +ITEM(poi_rail_tram_stop) +ITEM(poi_wifi) +ITEM(poi_bench) +ITEM(poi_biergarten) +ITEM(poi_boundary_stone) +ITEM(poi_castle) +ITEM(poi_hunting_stand) +ITEM(poi_memorial) +ITEM(poi_monument) +ITEM(poi_shelter) +ITEM(poi_fountain) +ITEM(poi_potable_water) +ITEM(poi_toilets) +ITEM(poi_viewpoint) +ITEM(poi_ruins) +ITEM(nav_none) +ITEM(nav_position) +ITEM(nav_destination) +ITEM(tec_common) +ITEM(trackpoint_tracked) +ITEM(announcement) +ITEM(poi_post_box) +ITEM(poi_post_office) +ITEM(poi_school_university) +ITEM(poi_school_college) +ITEM(poi_motel) +ITEM(poi_guesthouse) +ITEM(poi_hostel) +ITEM(poi_taxi) +ITEM(poi_prison) +ITEM(poi_kindergarten) +ITEM(poi_shop_butcher) +ITEM(poi_shop_baker) +ITEM(poi_shop_kiosk) +ITEM(poi_soccer) +ITEM(poi_basketball) +ITEM(poi_baseball) +ITEM(poi_climbing) +ITEM(poi_motor_sport) +ITEM(poi_tennis) +ITEM(house_number) +ITEM(route_start) +ITEM(route_end) +ITEM(selected_point) +ITEM(power_tower) +ITEM(route_start_reverse) +ITEM(log_entry) +ITEM(poi_playground) +ITEM(barrier_cycle) +ITEM(barrier_bollard) +ITEM(poi_vending_machine) +ITEM(poi_recycling) +ITEM(poi_hairdresser) +ITEM(poi_shop_fruit) +ITEM(poi_shop_bicycle) +ITEM(poi_shop_florist) +ITEM(poi_shop_optician) +ITEM(poi_shop_beverages) +ITEM(poi_nightclub) +ITEM(poi_shop_shoes) +ITEM(power_substation) +ITEM(barrier_lift_gate) +ITEM(traffic_sign_stop) +ITEM(traffic_sign_city_limit) +ITEM(poi_tree) +ITEM(poi_shop_furniture) +ITEM(poi_shop_parfum) +ITEM(poi_shop_drugstore) +ITEM(poi_shop_photo) +ITEM(ch_node) +ITEM(place_label) +ITEM(vehicle) +ITEM(vehicle_pedestrian) +ITEM(bookmark_folder) +ITEM(poi_pub) +ITEM(poi_atm) +ITEM2(0x7ffffff0,poi_custom0) +ITEM(poi_custom1) +ITEM(poi_custom2) +ITEM(poi_custom3) +ITEM(poi_custom4) +ITEM(poi_custom5) +ITEM(poi_custom6) +ITEM(poi_custom7) +ITEM(poi_custom8) +ITEM(poi_custom9) +ITEM(poi_customa) +ITEM(poi_customb) +ITEM(poi_customc) +ITEM(poi_customd) +ITEM(poi_custome) +ITEM(poi_customf) +/* Line */ +ITEM2(0x80000000,line) +ITEM2(0x80000001,line_unspecified) +ITEM(border_country) +ITEM(border_state) +ITEM(rail) +ITEM(water_line) +ITEM(street_nopass) +ITEM(street_0) +ITEM(street_1_city) +ITEM(street_2_city) +ITEM(street_3_city) +ITEM(street_4_city) +ITEM(highway_city) +ITEM(street_1_land) +ITEM(street_2_land) +ITEM(street_3_land) +ITEM(street_4_land) +ITEM(street_n_lanes) +ITEM(highway_land) +ITEM(ramp) +ITEM(roundabout) +ITEM(ferry) +ITEM(roadbook) +ITEM(street_unkn) +ITEM(street_route) +ITEM(height_line_1) +ITEM(height_line_2) +ITEM(track) +ITEM(height_line_3) +ITEM(depth_line_1) +ITEM(depth_line_2) +ITEM(depth_line_3) +ITEM(powerline) +ITEM(pipeline) +ITEM(time_zone) +ITEM(marine_boundary) +ITEM(marine_hazard) +ITEM(rg_segment) +ITEM(aeroway_runway) +ITEM(aeroway_taxiway) +ITEM(street_service) +ITEM(coverage) +ITEM(street_pedestrian) +ITEM(bridge) +ITEM(tunnel) +ITEM(bridleway) +ITEM(cycleway) +ITEM(footway) +ITEM(steps) +ITEM(track_paved) +ITEM(track_gravelled) +ITEM(track_unpaved) +ITEM(track_ground) +ITEM(track_grass) +ITEM(rail_narrow_gauge) +ITEM(rail_light) +ITEM(rail_subway) +ITEM(rail_mono) +ITEM(rail_tram) +ITEM(rail_preserved) +ITEM(rail_disused) +ITEM(rail_abandoned) +ITEM(lift_cable_car) +ITEM(lift_chair) +ITEM(lift_drag) +ITEM(living_street) +ITEM(bus_guideway) +ITEM(street_construction) +ITEM(border_civil) +ITEM(border_political) +ITEM(border_national_park) +ITEM(water_river) +ITEM(water_canal) +ITEM(water_stream) +ITEM(water_drain) +ITEM(path) +ITEM(hiking) +ITEM(hiking_mountain) +ITEM(hiking_mountain_demanding) +ITEM(hiking_alpine) +ITEM(hiking_alpine_demanding) +ITEM(hiking_alpine_difficult) +ITEM(street_parking_lane) +ITEM(piste_nordic) +ITEM(piste_downhill_novice) +ITEM(piste_downhill_easy) +ITEM(piste_downhill_intermediate) +ITEM(piste_downhill_advanced) +ITEM(piste_downhill_expert) +ITEM(piste_downhill_freeride) +ITEM(footway_and_piste_nordic) +ITEM(tracking_0) +ITEM(tracking_10) +ITEM(tracking_20) +ITEM(tracking_30) +ITEM(tracking_40) +ITEM(tracking_50) +ITEM(tracking_60) +ITEM(tracking_70) +ITEM(tracking_80) +ITEM(tracking_90) +ITEM(tracking_100) +ITEM(track_tracked) +ITEM(house_number_interpolation_even) +ITEM(house_number_interpolation_odd) +ITEM(house_number_interpolation_all) +ITEM(house_number_interpolation_alphabetic) +ITEM(ditch) +ITEM(hedge) +ITEM(fence) +ITEM(wall) +ITEM(retaining_wall) +ITEM(city_wall) +ITEM(street_turn_restriction_no) +ITEM(street_turn_restriction_only) +ITEM(border_city) +ITEM(border_county) +ITEM(selected_line) +ITEM(traffic_distortion) +ITEM(street_route_occluded) +ITEM(forest_way_1) +ITEM(forest_way_2) +ITEM(forest_way_3) +ITEM(forest_way_4) +ITEM(former_itinerary) +ITEM(former_itinerary_part) +/* Area */ +ITEM2(0xc0000000,area) +ITEM2(0xc0000001,area_unspecified) +ITEM(poly_wood) +ITEM(poly_water) +ITEM(poly_town) +ITEM(poly_cemetery) +ITEM(poly_car_parking) +ITEM(poly_industry) +ITEM(poly_airport) +ITEM(poly_hospital) +ITEM(poly_park) +ITEM(poly_sport) +ITEM(poly_museum) +ITEM(image) +ITEM(image_path) +ITEM(poly_commercial_center) +ITEM(poly_golf_course) +ITEM(poly_university) +ITEM(poly_national_park) +ITEM(poly_nature_park) +ITEM(poly_flats) +ITEM(poly_scrub) +ITEM(poly_military_zone) +ITEM(poly_marine) +ITEM(plantation) +ITEM(tundra) +ITEM(tile) +ITEM(submap) +ITEM(poly_building) +ITEM(poly_place) +ITEM(poly_station) +ITEM(poly_farm) +ITEM(poly_sport_tennis) +ITEM(poly_apron) +ITEM(poly_terminal) +ITEM(countryindex) +ITEM(poly_sports_centre) +ITEM(poly_sports_stadium) +ITEM(poly_sports_track) +ITEM(poly_sports_pitch) +ITEM(poly_water_park) +ITEM(poly_marina) +ITEM(poly_fishing) +ITEM(poly_theme_park) +ITEM(poly_attraction) +ITEM(poly_ruins) +ITEM(poly_archaeological_site) +ITEM(poly_artwork) +ITEM(poly_zoo) +ITEM(poly_camp_site) +ITEM(poly_caravan_site) +ITEM(poly_picnic_site) +ITEM(poly_playground) +ITEM(poly_allotments) +ITEM(poly_village_green) +ITEM(poly_recreation_ground) +ITEM(poly_common) +ITEM(poly_garden) +ITEM(poly_nature_reserve) +ITEM(poly_glacier) +ITEM(poly_scree) +ITEM(poly_fell) +ITEM(poly_heath) +ITEM(poly_marsh) +ITEM(poly_mud) +ITEM(poly_land) +ITEM(poly_beach) +ITEM(poly_quarry) +ITEM(poly_landfill) +ITEM(poly_retail) +ITEM(poly_commercial) +ITEM(poly_brownfield) +ITEM(poly_greenfield) +ITEM(poly_construction) +ITEM(poly_railway) +ITEM(poly_military) +ITEM(poly_airfield) +ITEM(poly_barracks) +ITEM(poly_danger_area) +ITEM(poly_range) +ITEM(poly_naval_base) +ITEM(poly_basin) +ITEM(poly_reservoir) +ITEM(poly_college) +ITEM(poly_battlefield) +ITEM(poly_pedestrian) +ITEM(poly_plaza) +ITEM(poly_service) +ITEM(poly_street_1) +ITEM(poly_street_2) +ITEM(poly_street_3) +ITEM(poly_wetland) +ITEM(poly_aeroway_runway) +ITEM(map_information) +ITEM(selected_area) +ITEM(poly_place1) +ITEM(poly_place2) +ITEM(poly_place3) +ITEM(poly_place4) +ITEM(poly_place5) +ITEM(poly_place6) +ITEM(poly_water_tiled) +ITEM2(0xffffffff,last) diff --git a/navit/keys.h b/navit/keys.h new file mode 100644 index 0000000..2ef79c8 --- /dev/null +++ b/navit/keys.h @@ -0,0 +1,12 @@ +#define NAVIT_KEY_MENU 1 /* ^A */ +#define NAVIT_KEY_LEFT 2 /* ^B */ +#define NAVIT_KEY_RIGHT 6 /* ^R */ +#define NAVIT_KEY_BACKSPACE 8 /* ^H */ +#define NAVIT_KEY_RETURN 13 /* ^M */ +#define NAVIT_KEY_DOWN 14 /* ^N */ +#define NAVIT_KEY_ZOOM_OUT 15 /* ^O */ +#define NAVIT_KEY_UP 16 /* ^P */ +#define NAVIT_KEY_ZOOM_IN 17 /* ^Q */ +#define NAVIT_KEY_SEARCH 19 /* ^S */ +#define NAVIT_KEY_BACK 27 /* Esc */ +#define NAVIT_KEY_DELETE 127 diff --git a/navit/layer.h b/navit/layer.h new file mode 100644 index 0000000..dc995a6 --- /dev/null +++ b/navit/layer.h @@ -0,0 +1,31 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_LAYER_H +#define NAVIT_LAYER_H + +enum layer_type { + layer_town=0, + layer_street, + layer_poly, + layer_end, +}; + +#endif + diff --git a/navit/layout.c b/navit/layout.c new file mode 100644 index 0000000..e470b88 --- /dev/null +++ b/navit/layout.c @@ -0,0 +1,565 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2009 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "item.h" +#include "attr.h" +#include "layout.h" +#include "coord.h" +#include "debug.h" + + +struct layout * layout_new(struct attr *parent, struct attr **attrs) +{ + struct layout *l; + struct color def_color = {COLOR_BACKGROUND_}; + struct attr *name_attr,*color_attr,*order_delta_attr,*font_attr,*day_attr,*night_attr,*active_attr; + + if (! (name_attr=attr_search(attrs, NULL, attr_name))) + return NULL; + l = g_new0(struct layout, 1); + l->name = g_strdup(name_attr->u.str); + if ((font_attr=attr_search(attrs, NULL, attr_font))) { + l->font = g_strdup(font_attr->u.str); + } + if ((day_attr=attr_search(attrs, NULL, attr_daylayout))) { + l->dayname = g_strdup(day_attr->u.str); + } + if ((night_attr=attr_search(attrs, NULL, attr_nightlayout))) { + l->nightname = g_strdup(night_attr->u.str); + } + if ((color_attr=attr_search(attrs, NULL, attr_color))) + l->color = *color_attr->u.color; + else + l->color = def_color; + if ((order_delta_attr=attr_search(attrs, NULL, attr_order_delta))) + l->order_delta=order_delta_attr->u.num; + if ((active_attr=attr_search(attrs, NULL, attr_active))) + l->active = active_attr->u.num; + return l; +} + +struct attr_iter { + GList *last; +}; + + +struct attr_iter * +layout_attr_iter_new(void) +{ + return g_new0(struct attr_iter, 1); +} + +void +layout_attr_iter_destroy(struct attr_iter *iter) +{ + g_free(iter); +} + +int +layout_get_attr(struct layout *layout, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + GList *cursor,*layer; + attr->type=type; + switch (type) { + case attr_cursor: + cursor=layout->cursors; + while (cursor) { + if (!iter || iter->last == g_list_previous(cursor)) { + attr->u.cursor=cursor->data; + if (iter) + iter->last=cursor; + return 1; + } + cursor=g_list_next(cursor); + } + break; + case attr_layer: + layer=layout->layers; + while (layer) { + if (!iter || iter->last == g_list_previous(layer)) { + attr->u.layer=layer->data; + if (iter) + iter->last=layer; + return 1; + } + layer=g_list_next(layer); + } + break; + case attr_active: + attr->u.num=layout->active; + break; + default: + break; + } + return 0; +} + + +int +layout_add_attr(struct layout *layout, struct attr *attr) +{ + switch (attr->type) { + case attr_cursor: + layout->cursors = g_list_append(layout->cursors, attr->u.cursor); + return 1; + case attr_layer: + layout->layers = g_list_append(layout->layers, attr->u.layer); + return 1; + default: + return 0; + } +} + +/** + * Searchs the layout for a cursor with the given name. + * + * @param layout The layout + * @param name The name + * @returns A pointer to cursor with the given name or the name default or NULL. + * @author Ralph Sennhauser (10/2009) +*/ +struct cursor * +layout_get_cursor(struct layout *this_, char *name) +{ + GList *c; + struct cursor *d=NULL; + + c=g_list_first(this_->cursors); + while (c) { + if (! strcmp(((struct cursor *)c->data)->name, name)) + return c->data; + if (! strcmp(((struct cursor *)c->data)->name, "default")) + d=c->data; + c=g_list_next(c); + } + return d; +} + + + +struct cursor * +cursor_new(struct attr *parent, struct attr **attrs) +{ + struct attr *w, *h, *name, *interval, *sequence_range; + struct cursor *this; + + w=attr_search(attrs, NULL, attr_w); + h=attr_search(attrs, NULL, attr_h); + if (! w || ! h) + return NULL; + + this=g_new0(struct cursor,1); + this->w=w->u.num; + this->h=h->u.num; + name=attr_search(attrs, NULL, attr_name); + if (name) + this->name=g_strdup(name->u.str); + else + this->name=g_strdup("default"); + interval=attr_search(attrs, NULL, attr_interval); + if (interval) + this->interval=interval->u.num; + sequence_range=attr_search(attrs, NULL, attr_sequence_range); + if (sequence_range) { + struct range *r=g_new0(struct range,1); + r->min=sequence_range->u.range.min; + r->max=sequence_range->u.range.max; + this->sequence_range=r; + } + else { + this->sequence_range=NULL; + } + dbg(2,"ret=%p\n", this); + return this; +} + +void +cursor_destroy(struct cursor *this_) +{ + if (this_->sequence_range) + g_free(this_->sequence_range); + if (this_->name) { + g_free(this_->name); + } + g_free(this_); +} + +int +cursor_add_attr(struct cursor *this_, struct attr *attr) +{ + switch (attr->type) { + case attr_itemgra: + this_->attrs=attr_generic_add_attr(this_->attrs, attr); + return 1; + default: + break; + } + return 0; +} + +static int +layer_set_attr_do(struct layer *l, struct attr *attr, int init) +{ + switch (attr->type) { + case attr_active: + l->active = attr->u.num; + return 1; + case attr_details: + l->details = attr->u.num; + return 1; + case attr_name: + g_free(l->name); + l->name = g_strdup(attr->u.str); + return 1; + default: + return 0; + } +} + + + +struct layer * layer_new(struct attr *parent, struct attr **attrs) +{ + struct layer *l; + + l = g_new0(struct layer, 1); + l->active=1; + for (;*attrs; attrs++) { + layer_set_attr_do(l, *attrs, 1); + } + return l; +} + +int +layer_get_attr(struct layer *layer, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + attr->type=type; + switch(type) { + case attr_active: + attr->u.num=layer->active; + return 1; + case attr_details: + attr->u.num=layer->details; + return 1; + case attr_name: + if (layer->name) { + attr->u.str=layer->name; + return 1; + } + break; + default: + return 0; + } + return 0; +} + +int +layer_add_attr(struct layer *layer, struct attr *attr) +{ + switch (attr->type) { + case attr_itemgra: + layer->itemgras = g_list_append(layer->itemgras, attr->u.itemgra); + return 1; + default: + return 0; + } +} + +int +layer_set_attr(struct layer *layer, struct attr *attr) +{ + return layer_set_attr_do(layer, attr, 0); +} + +struct itemgra * itemgra_new(struct attr *parent, struct attr **attrs) +{ + struct itemgra *itm; + struct attr *order, *item_types, *speed_range, *angle_range, *sequence_range; + enum item_type *type; + struct range defrange; + + itm = g_new0(struct itemgra, 1); + order=attr_search(attrs, NULL, attr_order); + item_types=attr_search(attrs, NULL, attr_item_types); + speed_range=attr_search(attrs, NULL, attr_speed_range); + angle_range=attr_search(attrs, NULL, attr_angle_range); + sequence_range=attr_search(attrs, NULL, attr_sequence_range); + defrange.min=0; + defrange.max=32767; + if (order) + itm->order=order->u.range; + else + itm->order=defrange; + if (speed_range) + itm->speed_range=speed_range->u.range; + else + itm->speed_range=defrange; + if (angle_range) + itm->angle_range=angle_range->u.range; + else + itm->angle_range=defrange; + if (sequence_range) + itm->sequence_range=sequence_range->u.range; + else + itm->sequence_range=defrange; + if (item_types) { + type=item_types->u.item_types; + while (type && *type != type_none) { + itm->type=g_list_append(itm->type, GINT_TO_POINTER(*type)); + type++; + } + } + return itm; +} +int +itemgra_add_attr(struct itemgra *itemgra, struct attr *attr) +{ + switch (attr->type) { + case attr_polygon: + case attr_polyline: + case attr_circle: + case attr_text: + case attr_icon: + case attr_image: + case attr_arrows: + itemgra->elements = g_list_append(itemgra->elements, attr->u.element); + return 1; + default: + dbg(0,"unknown: %s\n", attr_to_name(attr->type)); + return 0; + } +} + +static void +element_set_color(struct element *e, struct attr **attrs) +{ + struct attr *color; + color=attr_search(attrs, NULL, attr_color); + if (color) + e->color=*color->u.color; +} + + +static void +element_set_background_color(struct color *c, struct attr **attrs) +{ + struct attr *color; + color=attr_search(attrs, NULL, attr_background_color); + if (color) + *c=*color->u.color; +} + + +static void +element_set_text_size(struct element *e, struct attr **attrs) +{ + struct attr *text_size; + text_size=attr_search(attrs, NULL, attr_text_size); + if (text_size) + e->text_size=text_size->u.num; +} + +static void +element_set_polyline_width(struct element *e, struct attr **attrs) +{ + struct attr *width; + width=attr_search(attrs, NULL, attr_width); + if (width) + e->u.polyline.width=width->u.num; +} + +static void +element_set_polyline_directed(struct element *e, struct attr **attrs) +{ + struct attr *directed; + directed=attr_search(attrs, NULL, attr_directed); + if (directed) + e->u.polyline.directed=directed->u.num; +} + +static void +element_set_polyline_dash(struct element *e, struct attr **attrs) +{ + struct attr *dash; + int i; + + dash=attr_search(attrs, NULL, attr_dash); + if (dash) { + for (i=0; i<4; i++) { + if (!dash->u.dash[i]) + break; + e->u.polyline.dash_table[i] = dash->u.dash[i]; + } + e->u.polyline.dash_num=i; + } +} + +static void +element_set_polyline_offset(struct element *e, struct attr **attrs) +{ + struct attr *offset; + offset=attr_search(attrs, NULL, attr_offset); + if (offset) + e->u.polyline.offset=offset->u.num; +} + +static void +element_set_circle_width(struct element *e, struct attr **attrs) +{ + struct attr *width; + width=attr_search(attrs, NULL, attr_width); + if (width) + e->u.circle.width=width->u.num; +} + +static void +element_set_circle_radius(struct element *e, struct attr **attrs) +{ + struct attr *radius; + radius=attr_search(attrs, NULL, attr_radius); + if (radius) + e->u.circle.radius=radius->u.num; +} + +struct polygon * +polygon_new(struct attr *parent, struct attr **attrs) +{ + struct element *e; + e = g_new0(struct element, 1); + e->type=element_polygon; + element_set_color(e, attrs); + + return (struct polygon *)e; +} + +struct polyline * +polyline_new(struct attr *parent, struct attr **attrs) +{ + struct element *e; + + e = g_new0(struct element, 1); + e->type=element_polyline; + element_set_color(e, attrs); + element_set_polyline_width(e, attrs); + element_set_polyline_directed(e, attrs); + element_set_polyline_dash(e, attrs); + element_set_polyline_offset(e, attrs); + return (struct polyline *)e; +} + +struct circle * +circle_new(struct attr *parent, struct attr **attrs) +{ + struct element *e; + struct color color_black = {COLOR_BLACK_}; + struct color color_white = {COLOR_WHITE_}; + + e = g_new0(struct element, 1); + e->type=element_circle; + e->color = color_black; + e->u.circle.background_color = color_white; + element_set_color(e, attrs); + element_set_background_color(&e->u.circle.background_color, attrs); + element_set_text_size(e, attrs); + element_set_circle_width(e, attrs); + element_set_circle_radius(e, attrs); + + return (struct circle *)e; +} + +struct text * +text_new(struct attr *parent, struct attr **attrs) +{ + struct element *e; + struct color color_black = {COLOR_BLACK_}; + struct color color_white = {COLOR_WHITE_}; + + e = g_new0(struct element, 1); + e->type=element_text; + element_set_text_size(e, attrs); + e->color = color_black; + e->u.text.background_color = color_white; + element_set_color(e, attrs); + element_set_background_color(&e->u.text.background_color, attrs); + + return (struct text *)e; +} + +struct icon * +icon_new(struct attr *parent, struct attr **attrs) +{ + struct element *e; + struct attr *src,*w,*h,*rotation; + src=attr_search(attrs, NULL, attr_src); + if (! src) + return NULL; + + e = g_malloc0(sizeof(*e)+strlen(src->u.str)+1); + e->type=element_icon; + e->u.icon.src=(char *)(e+1); + if ((w=attr_search(attrs, NULL, attr_w))) + e->u.icon.width=w->u.num; + else + e->u.icon.width=-1; + if ((h=attr_search(attrs, NULL, attr_h))) + e->u.icon.height=h->u.num; + else + e->u.icon.height=-1; + if ((rotation=attr_search(attrs, NULL, attr_rotation))) + e->u.icon.rotation=rotation->u.num; + strcpy(e->u.icon.src,src->u.str); + + return (struct icon *)e; +} + +struct image * +image_new(struct attr *parent, struct attr **attrs) +{ + struct element *e; + + e = g_malloc0(sizeof(*e)); + e->type=element_image; + + return (struct image *)e; +} + +struct arrows * +arrows_new(struct attr *parent, struct attr **attrs) +{ + struct element *e; + e = g_malloc0(sizeof(*e)); + e->type=element_arrows; + element_set_color(e, attrs); + return (struct arrows *)e; +} + +int +element_add_attr(struct element *e, struct attr *attr) +{ + switch (attr->type) { + case attr_coord: + e->coord=g_realloc(e->coord,(e->coord_count+1)*sizeof(struct coord)); + e->coord[e->coord_count++]=*attr->u.coord; + return 1; + default: + return 0; + } +} diff --git a/navit/layout.h b/navit/layout.h new file mode 100644 index 0000000..41fcbbf --- /dev/null +++ b/navit/layout.h @@ -0,0 +1,127 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2009 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_LAYOUT_H +#define NAVIT_LAYOUT_H + +#include "item.h" +#include "color.h" + +struct element { + enum { element_point, element_polyline, element_polygon, element_circle, element_text, element_icon, element_image, element_arrows } type; + struct color color; + int text_size; + union { + struct element_point { + char stub; + } point; + struct element_polyline { + int width; + int directed; + int dash_num; + int offset; + unsigned char dash_table[4]; + } polyline; + struct element_polygon { + char stub; + } polygon; + struct element_circle { + int width; + int radius; + struct color background_color; + } circle; + struct element_icon { + char *src; + int width; + int height; + int rotation; + } icon; + struct element_text { + struct color background_color; + } text; + } u; + int coord_count; + struct coord *coord; +}; + + +struct itemgra { + struct range order,sequence_range,speed_range,angle_range; + GList *type; + GList *elements; +}; + +struct layer { + char *name; + int details; + GList *itemgras; + int active; +}; + +struct cursor { + struct attr **attrs; + struct range *sequence_range; + char *name; + int w,h; + int interval; +}; + +struct layout { char *name; char* dayname; char* nightname; char *font; struct color color; GList *layers; GList *cursors; int order_delta; int active; }; + +/* prototypes */ +enum attr_type; +struct arrows; +struct attr; +struct attr_iter; +struct circle; +struct cursor; +struct element; +struct icon; +struct image; +struct itemgra; +struct layer; +struct layout; +struct polygon; +struct polyline; +struct text; +struct layout *layout_new(struct attr *parent, struct attr **attrs); +struct attr_iter *layout_attr_iter_new(void); +void layout_attr_iter_destroy(struct attr_iter *iter); +int layout_get_attr(struct layout *layout, enum attr_type type, struct attr *attr, struct attr_iter *iter); +int layout_add_attr(struct layout *layout, struct attr *attr); +struct cursor *layout_get_cursor(struct layout *this_, char *name); +struct cursor *cursor_new(struct attr *parent, struct attr **attrs); +void cursor_destroy(struct cursor *this_); +int cursor_add_attr(struct cursor *this_, struct attr *attr); +struct layer *layer_new(struct attr *parent, struct attr **attrs); +int layer_get_attr(struct layer *layer, enum attr_type type, struct attr *attr, struct attr_iter *iter); +int layer_add_attr(struct layer *layer, struct attr *attr); +int layer_set_attr(struct layer *layer, struct attr *attr); +struct itemgra *itemgra_new(struct attr *parent, struct attr **attrs); +int itemgra_add_attr(struct itemgra *itemgra, struct attr *attr); +struct polygon *polygon_new(struct attr *parent, struct attr **attrs); +struct polyline *polyline_new(struct attr *parent, struct attr **attrs); +struct circle *circle_new(struct attr *parent, struct attr **attrs); +struct text *text_new(struct attr *parent, struct attr **attrs); +struct icon *icon_new(struct attr *parent, struct attr **attrs); +struct image *image_new(struct attr *parent, struct attr **attrs); +struct arrows *arrows_new(struct attr *parent, struct attr **attrs); +int element_add_attr(struct element *e, struct attr *attr); +/* end of prototypes */ +#endif diff --git a/navit/linguistics.c b/navit/linguistics.c new file mode 100644 index 0000000..c79b820 --- /dev/null +++ b/navit/linguistics.c @@ -0,0 +1,315 @@ +#include +#include +#include +#include "debug.h" +#include "linguistics.h" + +static const char *special[][3]={ +/* Capital Diacritics */ +/* ¨ Diaresis */ +{"Ä","A","AE"}, +{"Ë","E"}, +{"Ï","I"}, +{"Ö","O","OE"}, +{"Ü","U","UE"}, +{"Ÿ","Y"}, +/* ˝ Double Acute Accent */ +{"Ő","O","Ö"}, +{"Å°","U","Ü"}, +/* ´ Acute Accent */ +{"Á","A"}, +{"Ć","C"}, +{"É","E"}, +{"Í","I"}, +{"Ĺ","L"}, +{"Ń","N"}, +{"Ó","O"}, +{"Ŕ","R"}, +{"Ś","S"}, +{"Ú","U"}, +{"Ý","Y"}, +{"Ź","Z"}, +/* ˛ Ogonek (nosinė) */ +{"Ą","A"}, +{"Ę","E"}, +{"Ä®","I"}, +{"Ų","U"}, +/* ˙ Dot */ +{"Ċ","C"}, +{"Ė","E"}, +{"Ä ","G"}, +{"Ä°","I"}, +{"Ä¿","L"}, +{"Å»","Z"}, +/* – Stroke */ +{"Đ","D","DJ"}, /* Croatian Dj, not to be confused with the similar-looking Icelandic Eth */ +{"Ħ","H"}, +{"Ł","L"}, +{"Ŧ","T"}, +/* ˚ Ring */ +{"Å","A","AA"}, +{"Å®","U"}, +/* ˇ Caron (haček, paukščiukas) */ +{"Č","C"}, +{"Ď","D"}, +{"Ě","E"}, +{"Ľ","L"}, +{"Ň","N"}, +{"Ř","R"}, +{"Å ","S"}, +{"Ť","T"}, +{"Ž","Z"}, +/* / Slash */ +{"Ø","O","OE"}, +/* ¯ Macron */ +{"Ā","A","AA"}, +{"Ē","E","EE"}, +{"Ī","I","II"}, +{"Ō","O","OO"}, +{"Ū","U","UU"}, +/* ˘ Brevis */ +{"Ă","A"}, +{"Ĕ","E"}, +{"Ğ","G"}, +{"Ĭ","I"}, +{"Ŏ","O"}, +{"Ŭ","U"}, +/* ^ Circumflex */ +{"Â","A"}, +{"Ĉ","C"}, +{"Ê","E"}, +{"Ĝ","G"}, +{"Ĥ","H"}, +{"Î","I"}, +{"Ä´","J"}, +{"Ô","O"}, +{"Ŝ","S"}, +{"Û","U"}, +{"Å´","W"}, +{"Ŷ","Y"}, +/* ¸ Cedilla */ +{"Ç","C"}, +{"Ä¢","G","GJ"}, +{"Ķ","K","KJ"}, +{"Ä»","L","LJ"}, +{"Ņ","N","NJ"}, +{"Ŗ","R"}, +{"Ş","S"}, +{"Å¢","T"}, +/* ~ Tilde */ +{"Ã","A"}, +{"Ĩ","I"}, +{"Ñ","N"}, +{"Õ","O"}, +{"Ũ","U"}, +/* ` Grave */ +{"À","A"}, +{"È","E"}, +{"Ì","I"}, +{"Ò","O"}, +{"Ù","U"}, +/* ligatures */ +{"Æ","A","AE"}, +{"IJ","IJ"}, +{"Œ","O","OE"}, +/* special letters */ +{"Ð","D","DH"}, /* Icelandic Eth, not to be confused with the similar-looking Croatian Dj */ +{"Ŋ","N","NG"}, +{"Þ","T","TH"}, +/* Small Diacritics */ +/* ¨ Diaresis */ +{"ä","a","ae"}, +{"ë","e"}, +{"ï","i"}, +{"ö","o","oe"}, +{"ü","u","ue"}, +{"ÿ","y"}, +/* ˝ Double Acute Accent */ +{"ő","o","ö"}, +{"ű","u","ü"}, +/* ´ Acute Accent */ +{"á","a"}, +{"ć","c"}, +{"é","e"}, +{"í","i"}, +{"ĺ","l"}, +{"ń","n"}, +{"ó","o"}, +{"ŕ","r"}, +{"ś","s"}, +{"ú","u"}, +{"ý","y"}, +{"ź","z"}, +/* ˛ Ogonek (nosinė) */ +{"ą","a"}, +{"ę","e"}, +{"į","i"}, +{"ų","u"}, +/* ˙ Dot (and dotless i) */ +{"ċ","c"}, +{"ė","e"}, +{"Ä¡","g"}, +{"ı","i"}, +{"ŀ","l"}, +{"ż","z"}, +/* – Stroke */ +{"đ","d","dj"}, +{"ħ","h"}, +{"ł","l"}, +{"ŧ","t"}, +/* ˚ Ring */ +{"Ã¥","a", "aa"}, +{"ů","u"}, +/* ˇ Caron (haček, paukščiukas) */ +{"č","c"}, +{"ď","d"}, +{"ě","e"}, +{"ľ","l"}, +{"ň","n"}, +{"ř","r"}, +{"Å¡","s"}, +{"Å¥","t"}, +{"ž","z"}, +/* / Slash */ +{"ø","o", "oe"}, +/* Macron */ +{"ā","a","aa"}, +{"ē","e","ee"}, +{"Ä«","i","ii"}, +{"ō","o","oo"}, +{"Å«","u","uu"}, +/* ˘ Brevis */ +{"ă","a"}, +{"ĕ","e"}, +{"ğ","g"}, +{"Ä­","i"}, +{"ŏ","o"}, +{"Å­","u"}, +/* ^ Circumflex */ +{"â","a"}, +{"ĉ","c"}, +{"ê","e"}, +{"ĝ","g"}, +{"Ä¥","h"}, +{"î","i"}, +{"ĵ","j"}, +{"ô","o"}, +{"ŝ","s"}, +{"û","u"}, +{"ŵ","w"}, +{"Å·","y"}, +/* ¸ Cedilla */ +{"ç","c"}, +{"Ä£","g","gj"}, +{"Ä·","k","kj"}, +{"ļ","l","lj"}, +{"ņ","n","nj"}, +{"ŗ","r"}, +{"ş","s"}, +{"Å£","t"}, +/* ~ Tilde */ +{"ã","a"}, +{"Ä©","i"}, +{"õ","o"}, +{"ñ","n"}, +{"Å©","u"}, +/* ` Grave */ +{"à","a"}, +{"è","e"}, +{"ì","i"}, +{"ò","o"}, +{"ù","u"}, +/* ligatures */ +{"æ","a","ae"}, +{"ij","ij"}, +{"œ","o","oe"}, +{"ß","s","ss"}, +/* special letters */ +{"ð","d","dh"}, +{"ŋ","n","ng"}, +{"þ","t","th"}, +}; + +/** + * @brief Replace special characters in string (e.g. umlauts) with plain letters. + * This is useful e.g. to canonicalize a string for comparison. + * + * @param str string to process + * @param mode Replacement mode. 0=do nothing, 1=replace with single + * ASCII letter, 2=replace with multiple letters if the commonly used + * ASCII replacement has multitple letter (e.g. a-umlaut -> ae) + * @returns copy of string, with characters replaced + */ +char * +linguistics_expand_special(char *str, int mode) +{ + char *in=str; + char *out,*ret; + int found=0; + out=ret=g_strdup(str); + if (!mode) + return ret; + while (*in) { + char *next=g_utf8_find_next_char(in, NULL); + int i,len=next-in; + int match=0; + if (len > 1) { + for (i = 0 ; i < sizeof(special)/sizeof(special[0]); i++) { + const char *search=special[i][0]; + if (!strncmp(in,search,len)) { + const char *replace=special[i][mode]; + if (replace) { + int replace_len=strlen(replace); + dbg_assert(replace_len <= len); + dbg(1,"found %s %s %d %s %d\n",in,search,len,replace,replace_len); + strcpy(out, replace); + out+=replace_len; + match=1; + break; + } + } + } + } + if (match) { + found=1; + in=next; + } else { + while (len-- > 0) + *out++=*in++; + } + } + *out++='\0'; + if (!found) { + g_free(ret); + ret=NULL; + } + return ret; +} + +char * +linguistics_next_word(char *str) +{ + int len=strcspn(str, " -/()"); + if (!str[len] || !str[len+1]) + return NULL; + return str+len+1; +} + +int +linguistics_search(char *str) +{ + if (!g_strcasecmp(str,"str")) + return 0; + if (!g_strcasecmp(str,"str.")) + return 0; + if (!g_strcasecmp(str,"strasse")) + return 0; + if (!g_strcasecmp(str,"weg")) + return 0; + return 1; +} + +void +linguistics_init(void) +{ +} diff --git a/navit/linguistics.h b/navit/linguistics.h new file mode 100644 index 0000000..2287b10 --- /dev/null +++ b/navit/linguistics.h @@ -0,0 +1,13 @@ +#ifdef __cplusplus +extern "C" { +#endif +char *linguistics_expand_special(char *str, int mode); +char *linguistics_next_word(char *str); +void linguistics_init(void); +#ifdef __cplusplus +} +#endif + +/* Prototypes */ +int linguistics_search(char *str); + diff --git a/navit/log.c b/navit/log.c new file mode 100644 index 0000000..574b773 --- /dev/null +++ b/navit/log.c @@ -0,0 +1,356 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include "config.h" +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include "file.h" +#include "item.h" +#include "event.h" +#include "callback.h" +#include "debug.h" +#include "log.h" + +struct log_data { + int len; + int max_len; + char *data; +}; + +struct log { + FILE *f; + int overwrite; + int empty; + int lazy; + int mkdir; + int flush_size; + int flush_time; + struct event_timeout *timer; + struct callback *timer_callback; +#ifdef HAVE_SYS_TIME_H + struct timeval last_flush; +#endif + char *filename; + char *filename_ex1; + char *filename_ex2; + struct log_data header; + struct log_data data; + struct log_data trailer; + struct attr **attrs; +}; + +static void +strftime_localtime(char *buffer, int size, char *fmt) +{ + time_t t; + struct tm *tm; + + t=time(NULL); + tm=localtime(&t); + strftime(buffer, 4096, fmt, tm); +} + +static void +expand_filenames(struct log *this_) +{ + char *pos,buffer[4096]; + int i; + + strftime_localtime(buffer, 4096, this_->filename); + this_->filename_ex1=g_strdup(buffer); + if ((pos=strstr(this_->filename_ex1,"%i"))) { +#ifdef HAVE_API_ANDROID + pos[1]='d'; +#endif + i=0; + do { + g_free(this_->filename_ex2); + this_->filename_ex2=g_strdup_printf(this_->filename_ex1,i++); + } while (file_exists(this_->filename_ex2)); +#ifdef HAVE_API_ANDROID + pos[1]='i'; +#endif + } else + this_->filename_ex2=g_strdup(this_->filename_ex1); +} + +static void +log_set_last_flush(struct log *this_) +{ +#ifdef HAVE_SYS_TIME_H + gettimeofday(&this_->last_flush, NULL); +#endif +} + +static void +log_open(struct log *this_) +{ + char *mode; + if (this_->overwrite) + mode="w"; + else + mode="r+"; + if (this_->mkdir) + file_mkdir(this_->filename_ex2, 2); + this_->f=fopen(this_->filename_ex2, mode); + if (! this_->f) + this_->f=fopen(this_->filename_ex2, "w"); + if (! this_->f) + return; + if (!this_->overwrite) + fseek(this_->f, 0, SEEK_END); + this_->empty = !ftell(this_->f); + log_set_last_flush(this_); +} + +static void +log_close(struct log *this_) +{ + if (! this_->f) + return; + if (this_->trailer.len) + fwrite(this_->trailer.data, 1, this_->trailer.len, this_->f); + fflush(this_->f); + fclose(this_->f); + this_->f=NULL; +} + +static void +log_flush(struct log *this_, enum log_flags flags) +{ + long pos; + if (this_->lazy && !this_->f) { + if (!this_->data.len) + return; + log_open(this_); + } + if (! this_->f) + return; + if (this_->empty) { + if (this_->header.len) + fwrite(this_->header.data, 1, this_->header.len, this_->f); + if (this_->header.len || this_->data.len) + this_->empty=0; + } + fwrite(this_->data.data, 1, this_->data.len, this_->f); +#ifndef HAVE_API_WIN32_BASE + if (flags & log_flag_truncate) { + pos=ftell(this_->f); + ftruncate(fileno(this_->f), pos); + } +#endif + if (this_->trailer.len) { + pos=ftell(this_->f); + if (pos > 0) { + fwrite(this_->trailer.data, 1, this_->trailer.len, this_->f); + fseek(this_->f, pos, SEEK_SET); + } + } + if (flags & log_flag_keep_pointer) + fseek(this_->f, -this_->data.len, SEEK_CUR); + fflush(this_->f); + if (!(flags & log_flag_keep_buffer)) { + g_free(this_->data.data); + this_->data.data=NULL; + this_->data.max_len=this_->data.len=0; + } + log_set_last_flush(this_); +} + +static int +log_flush_required(struct log *this_) +{ + return this_->data.len > this_->flush_size; +} + + +static void +log_change(struct log *this_) +{ + log_flush(this_,0); + log_close(this_); + expand_filenames(this_); + if (! this_->lazy) + log_open(this_); +} + +static int +log_change_required(struct log *this_) +{ + char buffer[4096]; + + strftime_localtime(buffer, 4096, this_->filename); + return (strcmp(this_->filename_ex1, buffer) != 0); +} + +static void +log_timer(struct log *this_) +{ +#ifdef HAVE_SYS_TIME_H + struct timeval tv; + int delta; + gettimeofday(&tv, NULL); + delta=(tv.tv_sec-this_->last_flush.tv_sec)*1000+(tv.tv_usec-this_->last_flush.tv_usec)/1000; + dbg(1,"delta=%d flush_time=%d\n", delta, this_->flush_time); + if (this_->flush_time && delta >= this_->flush_time*1000) + log_flush(this_,0); +#endif +} + +int +log_get_attr(struct log *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); +} + + +struct log * +log_new(struct attr * parent,struct attr **attrs) +{ + struct log *ret=g_new0(struct log, 1); + struct attr *data,*overwrite,*lazy,*mkdir,*flush_size,*flush_time; + struct file_wordexp *wexp; + char *filename, **wexp_data; + + dbg(1,"enter\n"); + data=attr_search(attrs, NULL, attr_data); + if (! data) + return NULL; + filename=data->u.str; + wexp=file_wordexp_new(filename); + if (wexp && file_wordexp_get_count(wexp) > 0) { + wexp_data=file_wordexp_get_array(wexp); + filename=wexp_data[0]; + } + if (filename) + ret->filename=g_strdup(filename); + if (wexp) + file_wordexp_destroy(wexp); + overwrite=attr_search(attrs, NULL, attr_overwrite); + if (overwrite) + ret->overwrite=overwrite->u.num; + lazy=attr_search(attrs, NULL, attr_lazy); + if (lazy) + ret->lazy=lazy->u.num; + mkdir=attr_search(attrs, NULL, attr_mkdir); + if (mkdir) + ret->mkdir=mkdir->u.num; + flush_size=attr_search(attrs, NULL, attr_flush_size); + if (flush_size) + ret->flush_size=flush_size->u.num; + flush_time=attr_search(attrs, NULL, attr_flush_time); + if (flush_time) + ret->flush_time=flush_time->u.num; + if (ret->flush_time) { + dbg(1,"interval %d\n", ret->flush_time*1000); + ret->timer_callback=callback_new_1(callback_cast(log_timer), ret); + ret->timer=event_add_timeout(ret->flush_time*1000, 1, ret->timer_callback); + } + expand_filenames(ret); + if (ret->lazy) + log_set_last_flush(ret); + else + log_open(ret); + ret->attrs=attr_list_dup(attrs); + return ret; +} + +void +log_set_header(struct log *this_, char *data, int len) +{ + this_->header.data=g_malloc(len); + this_->header.max_len=this_->header.len=len; + memcpy(this_->header.data, data, len); +} + +void +log_set_trailer(struct log *this_, char *data, int len) +{ + this_->trailer.data=g_malloc(len); + this_->trailer.max_len=this_->trailer.len=len; + memcpy(this_->trailer.data, data, len); +} + +void +log_write(struct log *this_, char *data, int len, enum log_flags flags) +{ + dbg(1,"enter\n"); + if (log_change_required(this_)) { + dbg(1,"log_change"); + log_change(this_); + } + if (flags & log_flag_replace_buffer) + this_->data.len=0; + if (this_->data.len + len > this_->data.max_len) { + dbg(2,"overflow\n"); + this_->data.max_len+=16384; + this_->data.data=g_realloc(this_->data.data,this_->data.max_len); + } + memcpy(this_->data.data+this_->data.len, data, len); + this_->data.len+=len; + if (log_flush_required(this_) || (flags & log_flag_force_flush)) + log_flush(this_, flags); +} + +void * +log_get_buffer(struct log *this_, int *len) +{ + if (len) + *len=this_->data.len; + return this_->data.data; +} + + +void +log_printf(struct log *this_, char *fmt, ...) +{ + char buffer[LOG_BUFFER_SIZE]; + int size; + va_list ap; + + va_start(ap, fmt); + + // Format the string and write it to the log + size = g_vsnprintf(buffer, LOG_BUFFER_SIZE, fmt, ap); + log_write(this_, buffer, size, 0); + + va_end(ap); +} + +void +log_destroy(struct log *this_) +{ + attr_list_free(this_->attrs); + callback_destroy(this_->timer_callback); + event_remove_timeout(this_->timer); + log_flush(this_,0); + log_close(this_); + g_free(this_); +} diff --git a/navit/log.h b/navit/log.h new file mode 100644 index 0000000..8a9f073 --- /dev/null +++ b/navit/log.h @@ -0,0 +1,51 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_LOG_H +#define NAVIT_LOG_H +#define LOG_BUFFER_SIZE 256 +/** + * printf-style writing to the log file. A buffer of LOG_BUFFER_SIZE + * bytes is preallocated for the complete format message, longer + * messages will be truncated. + */ + +enum log_flags { + log_flag_replace_buffer=1, + log_flag_force_flush=2, + log_flag_keep_pointer=4, + log_flag_keep_buffer=8, + log_flag_truncate=16, +}; +/* prototypes */ +enum attr_type; +enum log_flags; +struct attr; +struct attr_iter; +struct log; +int log_get_attr(struct log *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); +struct log *log_new(struct attr *parent, struct attr **attrs); +void log_set_header(struct log *this_, char *data, int len); +void log_set_trailer(struct log *this_, char *data, int len); +void log_write(struct log *this_, char *data, int len, enum log_flags flags); +void *log_get_buffer(struct log *this_, int *len); +void log_printf(struct log *this_, char *fmt, ...); +void log_destroy(struct log *this_); +/* end of prototypes */ +#endif diff --git a/navit/main.c b/navit/main.c new file mode 100644 index 0000000..94ae4b3 --- /dev/null +++ b/navit/main.c @@ -0,0 +1,430 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "config.h" + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifndef _WIN32 +#include +#include +#endif + +#include "file.h" +#include "debug.h" +#include "main.h" +#include "navit.h" +#include "gui.h" +#include "item.h" +#include "xmlconfig.h" +#include "coord.h" +#include "route.h" +#include "navigation.h" +#include "event.h" +#include "callback.h" +#include "navit_nls.h" +#include "util.h" +#if HAVE_API_WIN32_BASE +#include +#include +#endif + +#ifdef HAVE_API_WIN32_CE +#include "libc.h" +#endif + +struct map_data *map_data_default; + +struct callback_list *cbl; + +#ifdef HAVE_API_WIN32 +void +setenv(char *var, char *val, int overwrite) +{ + char *str=g_strdup_printf("%s=%s",var,val); + if (overwrite || !getenv(var)) + putenv(str); + g_free(str); +} +#endif + +/* + * environment_vars[][0:name,1-3:mode] + * ':' replaced with NAVIT_PREFIX + * '::' replaced with NAVIT_PREFIX and LIBDIR + * '~' replaced with HOME +*/ +static char *environment_vars[][5]={ + {"NAVIT_LIBDIR", ":", "::/navit", ":\\lib", ":/lib"}, + {"NAVIT_SHAREDIR", ":", ":/share/navit", ":", ":/share"}, + {"NAVIT_LOCALEDIR", ":/../locale",":/share/locale",":\\locale", ":/locale"}, + {"NAVIT_USER_DATADIR",":", "~/.navit", ":\\data", ":/home"}, +#if 1 + {"NAVIT_LOGFILE", NULL, NULL, ":\\navit.log",NULL}, +#endif + {"NAVIT_LIBPREFIX", "*/.libs/", NULL, NULL, NULL}, + {NULL, NULL, NULL, NULL, NULL}, +}; + +static void +main_setup_environment(int mode) +{ + int i=0; + char *var,*val,*homedir; + while ((var=environment_vars[i][0])) { + val=environment_vars[i][mode+1]; + if (val) { + switch (val[0]) { + case ':': + if (val[1] == ':') + val=g_strdup_printf("%s/%s%s", getenv("NAVIT_PREFIX"), LIBDIR+sizeof(PREFIX), val+2); + else + val=g_strdup_printf("%s%s", getenv("NAVIT_PREFIX"), val+1); + break; + case '~': + homedir=getenv("HOME"); + if (!homedir) + homedir="./"; + val=g_strdup_printf("%s%s", homedir, val+1); + break; + default: + val=g_strdup(val); + break; + } + setenv(var, val, 0); + g_free(val); + } + i++; + } +} + +#ifdef HAVE_API_WIN32_BASE +char *nls_table[][3]={ + // NLS Table compiled by Nick "Number6" Geoghegan + // Not an exhaustive list, but supports 99% of all languages in Windows + //{"LANGNAME", "CTRYNAME", "Language Code"}, + {"AFK", "ZAF", "af_ZA"}, // Afrikaans (South Africa) + {"SQI", "ALB", "sq_AL"}, // Albanian (Albania) + {"AMH", "ETH", "am_ET"}, // Amharic (Ethiopia) + {"ARG", "DZA", "ar_DZ"}, // Arabic (Algeria) + {"ARH", "BHR", "ar_BH"}, // Arabic (Bahrain) + {"ARE", "EGY", "ar_EG"}, // Arabic (Egypt) + {"ARI", "IRQ", "ar_IQ"}, // Arabic (Iraq) + {"ARJ", "JOR", "ar_JO"}, // Arabic (Jordan) + {"ARK", "KWT", "ar_KW"}, // Arabic (Kuwait) + {"ARB", "LBN", "ar_LB"}, // Arabic (Lebanon) + {"ARL", "LBY", "ar_LY"}, // Arabic (Libya) + {"ARM", "MAR", "ar_MA"}, // Arabic (Morocco) + {"ARO", "OMN", "ar_OM"}, // Arabic (Oman) + {"ARQ", "QAT", "ar_QA"}, // Arabic (Qatar) + {"ARA", "SAU", "ar_SA"}, // Arabic (Saudi Arabia) + {"ARS", "SYR", "ar_SY"}, // Arabic (Syria) + {"ART", "TUN", "ar_TN"}, // Arabic (Tunisia) + {"ARU", "ARE", "ar_AE"}, // Arabic (U.A.E.) + {"ARY", "YEM", "ar_YE"}, // Arabic (Yemen) + {"HYE", "ARM", "hy_AM"}, // Armenian (Armenia) + {"ASM", "IND", "as_IN"}, // Assamese (India) + {"BAS", "RUS", "ba_RU"}, // Bashkir (Russia) + {"EUQ", "ESP", "eu_ES"}, // Basque (Basque) + {"BEL", "BLR", "be_BY"}, // Belarusian (Belarus) + {"BNG", "BDG", "bn_BD"}, // Bengali (Bangladesh) + {"BNG", "IND", "bn_IN"}, // Bengali (India) + {"BRE", "FRA", "br_FR"}, // Breton (France) + {"BGR", "BGR", "bg_BG"}, // Bulgarian (Bulgaria) + {"CAT", "ESP", "ca_ES"}, // Catalan (Catalan) + {"ZHH", "HKG", "zh_HK"}, // Chinese (Hong Kong S.A.R.) + {"ZHM", "MCO", "zh_MO"}, // Chinese (Macao S.A.R.) + {"CHS", "CHN", "zh_CN"}, // Chinese (People's Republic of China) + {"ZHI", "SGP", "zh_SG"}, // Chinese (Singapore) + {"CHT", "TWN", "zh_TW"}, // Chinese (Taiwan) + {"COS", "FRA", "co_FR"}, // Corsican (France) + {"HRV", "HRV", "hr_HR"}, // Croatian (Croatia) + {"HRB", "BIH", "hr_BA"}, // Croatian (Latin, Bosnia and Herzegovina) + {"CSY", "CZE", "cs_CZ"}, // Czech (Czech Republic) + {"DAN", "DNK", "da_DK"}, // Danish (Denmark) + {"NLB", "BEL", "nl_BE"}, // Dutch (Belgium) + {"NLD", "NLD", "nl_NL"}, // Dutch (Netherlands) + {"ENA", "AUS", "en_AU"}, // English (Australia) + {"ENL", "BLZ", "en_BZ"}, // English (Belize) + {"ENC", "CAN", "en_CA"}, // English (Canada) + {"ENB", "CAR", "en_CB"}, // English (Caribbean) + {"ENN", "IND", "en_IN"}, // English (India) + {"ENI", "IRL", "en_IE"}, // English (Ireland) + {"ENJ", "JAM", "en_JM"}, // English (Jamaica) + {"ENM", "MYS", "en_MY"}, // English (Malaysia) + {"ENZ", "NZL", "en_NZ"}, // English (New Zealand) + {"ENP", "PHL", "en_PH"}, // English (Republic of the Philippines) + {"ENE", "SGP", "en_SG"}, // English (Singapore) + {"ENS", "ZAF", "en_ZA"}, // English (South Africa) + {"ENT", "TTO", "en_TT"}, // English (Trinidad and Tobago) + {"ENG", "GBR", "en_GB"}, // English (United Kingdom) + {"ENU", "USA", "en_US"}, // English (United States) + {"ENW", "ZWE", "en_ZW"}, // English (Zimbabwe) + {"ETI", "EST", "et_EE"}, // Estonian (Estonia) + {"FOS", "FRO", "fo_FO"}, // Faroese (Faroe Islands) + {"FIN", "FIN", "fi_FI"}, // Finnish (Finland) + {"FRB", "BEL", "fr_BE"}, // French (Belgium) + {"FRC", "CAN", "fr_CA"}, // French (Canada) + {"FRA", "FRA", "fr_FR"}, // French (France) + {"FRL", "LUX", "fr_LU"}, // French (Luxembourg) + {"FRM", "MCO", "fr_MC"}, // French (Principality of Monaco) + {"FRS", "CHE", "fr_CH"}, // French (Switzerland) + {"FYN", "NLD", "fy_NL"}, // Frisian (Netherlands) + {"GLC", "ESP", "gl_ES"}, // Galician (Galician) + {"KAT", "GEO", "ka_GE"}, // Georgian (Georgia) + {"DEA", "AUT", "de_AT"}, // German (Austria) + {"DEU", "DEU", "de_DE"}, // German (Germany) + {"DEC", "LIE", "de_LI"}, // German (Liechtenstein) + {"DEL", "LUX", "de_LU"}, // German (Luxembourg) + {"DES", "CHE", "de_CH"}, // German (Switzerland) + {"ELL", "GRC", "el_GR"}, // Greek (Greece) + {"KAL", "GRL", "kl_GL"}, // Greenlandic (Greenland) + {"GUJ", "IND", "gu_IN"}, // Gujarati (India) + {"HEB", "ISR", "he_IL"}, // Hebrew (Israel) + {"HIN", "IND", "hi_IN"}, // Hindi (India) + {"HUN", "HUN", "hu_HU"}, // Hungarian (Hungary) + {"ISL", "ISL", "is_IS"}, // Icelandic (Iceland) + {"IBO", "NGA", "ig_NG"}, // Igbo (Nigeria) + {"IND", "IDN", "id_ID"}, // Indonesian (Indonesia) + {"IRE", "IRL", "ga_IE"}, // Irish (Ireland) + {"XHO", "ZAF", "xh_ZA"}, // isiXhosa (South Africa) + {"ZUL", "ZAF", "zu_ZA"}, // isiZulu (South Africa) + {"ITA", "ITA", "it_IT"}, // Italian (Italy) + {"ITS", "CHE", "it_CH"}, // Italian (Switzerland) + {"JPN", "JPN", "ja_JP"}, // Japanese (Japan) + {"KDI", "IND", "kn_IN"}, // Kannada (India) + {"KKZ", "KAZ", "kk_KZ"}, // Kazakh (Kazakhstan) + {"KHM", "KHM", "km_KH"}, // Khmer (Cambodia) + {"KIN", "RWA", "rw_RW"}, // Kinyarwanda (Rwanda) + {"SWK", "KEN", "sw_KE"}, // Kiswahili (Kenya) + {"KOR", "KOR", "ko_KR"}, // Korean (Korea) + {"KYR", "KGZ", "ky_KG"}, // Kyrgyz (Kyrgyzstan) + {"LAO", "LAO", "lo_LA"}, // Lao (Lao P.D.R.) + {"LVI", "LVA", "lv_LV"}, // Latvian (Latvia) + {"LTH", "LTU", "lt_LT"}, // Lithuanian (Lithuania) + {"LBX", "LUX", "lb_LU"}, // Luxembourgish (Luxembourg) + {"MKI", "MKD", "mk_MK"}, // Macedonian (Former Yugoslav Republic of Macedonia) + {"MSB", "BRN", "ms_BN"}, // Malay (Brunei Darussalam) + {"MSL", "MYS", "ms_MY"}, // Malay (Malaysia) + {"MYM", "IND", "ml_IN"}, // Malayalam (India) + {"MLT", "MLT", "mt_MT"}, // Maltese (Malta) + {"MRI", "NZL", "mi_NZ"}, // Maori (New Zealand) + {"MAR", "IND", "mr_IN"}, // Marathi (India) + {"MON", "MNG", "mn_MN"}, // Mongolian (Cyrillic, Mongolia) + {"NEP", "NEP", "ne_NP"}, // Nepali (Nepal) + {"NOR", "NOR", "nb_NO"}, // Norwegian, BokmÃ¥(Norway) + {"NON", "NOR", "nn_NO"}, // Norwegian, Nynorsk (Norway) + {"OCI", "FRA", "oc_FR"}, // Occitan (France) + {"ORI", "IND", "or_IN"}, // Oriya (India) + {"PAS", "AFG", "ps_AF"}, // Pashto (Afghanistan) + {"FAR", "IRN", "fa_IR"}, // Persian + {"PLK", "POL", "pl_PL"}, // Polish (Poland) + {"PTB", "BRA", "pt_BR"}, // Portuguese (Brazil) + {"PTG", "PRT", "pt_PT"}, // Portuguese (Portugal) + {"PAN", "IND", "pa_IN"}, // Punjabi (India) + {"ROM", "ROM", "ro_RO"}, // Romanian (Romania) + {"RMC", "CHE", "rm_CH"}, // Romansh (Switzerland) + {"RUS", "RUS", "ru_RU"}, // Russian (Russia) + {"SMG", "FIN", "se_FI"}, // Sami, Northern (Finland) + {"SME", "NOR", "se_NO"}, // Sami, Northern (Norway) + {"SMF", "SWE", "se_SE"}, // Sami, Northern (Sweden) + {"SAN", "IND", "sa_IN"}, // Sanskrit (India) + {"TSN", "ZAF", "tn_ZA"}, // Setswana (South Africa) + {"SIN", "LKA", "si_LK"}, // Sinhala (Sri Lanka) + {"SKY", "SVK", "sk_SK"}, // Slovak (Slovakia) + {"SLV", "SVN", "sl_SI"}, // Slovenian (Slovenia) + {"ESS", "ARG", "es_AR"}, // Spanish (Argentina) + {"ESB", "BOL", "es_BO"}, // Spanish (Bolivia) + {"ESL", "CHL", "es_CL"}, // Spanish (Chile) + {"ESO", "COL", "es_CO"}, // Spanish (Colombia) + {"ESC", "CRI", "es_CR"}, // Spanish (Costa Rica) + {"ESD", "DOM", "es_DO"}, // Spanish (Dominican Republic) + {"ESF", "ECU", "es_EC"}, // Spanish (Ecuador) + {"ESE", "SLV", "es_SV"}, // Spanish (El Salvador) + {"ESG", "GTM", "es_GT"}, // Spanish (Guatemala) + {"ESH", "HND", "es_HN"}, // Spanish (Honduras) + {"ESM", "MEX", "es_MX"}, // Spanish (Mexico) + {"ESI", "NIC", "es_NI"}, // Spanish (Nicaragua) + {"ESA", "PAN", "es_PA"}, // Spanish (Panama) + {"ESZ", "PRY", "es_PY"}, // Spanish (Paraguay) + {"ESR", "PER", "es_PE"}, // Spanish (Peru) + {"ESU", "PRI", "es_PR"}, // Spanish (Puerto Rico) + {"ESN", "ESP", "es_ES"}, // Spanish (Spain) + {"EST", "USA", "es_US"}, // Spanish (United States) + {"ESY", "URY", "es_UY"}, // Spanish (Uruguay) + {"ESV", "VEN", "es_VE"}, // Spanish (Venezuela) + {"SVF", "FIN", "sv_FI"}, // Swedish (Finland) + {"SVE", "SWE", "sv_SE"}, // Swedish (Sweden) + {"TAM", "IND", "ta_IN"}, // Tamil (India) + {"TTT", "RUS", "tt_RU"}, // Tatar (Russia) + {"TEL", "IND", "te_IN"}, // Telugu (India) + {"THA", "THA", "th_TH"}, // Thai (Thailand) + {"BOB", "CHN", "bo_CN"}, // Tibetan (PRC) + {"TRK", "TUR", "tr_TR"}, // Turkish (Turkey) + {"TUK", "TKM", "tk_TM"}, // Turkmen (Turkmenistan) + {"UIG", "CHN", "ug_CN"}, // Uighur (PRC) + {"UKR", "UKR", "uk_UA"}, // Ukrainian (Ukraine) + {"URD", "PAK", "ur_PK"}, // Urdu (Islamic Republic of Pakistan) + {"VIT", "VNM", "vi_VN"}, // Vietnamese (Vietnam) + {"CYM", "GBR", "cy_GB"}, // Welsh (United Kingdom) + {"WOL", "SEN", "wo_SN"}, // Wolof (Senegal) + {"III", "CHN", "ii_CN"}, // Yi (PRC) + {"YOR", "NGA", "yo_NG"}, // Yoruba (Nigeria) + {NULL,NULL,NULL}, // Default - Can't find the language / Language not listed above +}; + +static void +win_set_nls(void) +{ + char country[32],lang[32]; + int i=0; + +#ifdef HAVE_API_WIN32_CE + wchar_t wcountry[32],wlang[32]; + GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, wlang, sizeof(wlang)); + WideCharToMultiByte(CP_ACP,0,wlang,-1,lang,sizeof(lang),NULL,NULL); + GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVCTRYNAME, wcountry, sizeof(wcountry)); + WideCharToMultiByte(CP_ACP,0,wcountry,-1,country,sizeof(country),NULL,NULL); +#else + GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, lang, sizeof(lang)); + GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SABBREVCTRYNAME, country, sizeof(country)); +#endif + while (nls_table[i][0]) { + if (!strcmp(nls_table[i][0], lang) && !(strcmp(nls_table[i][1], country))) { + dbg(1,"Setting LANG=%s for Lang %s Country %s\n",nls_table[i][2], lang, country); + setenv("LANG",nls_table[i][2],0); + return; + } + i++; + } + dbg(1,"Lang %s Country %s not found\n",lang,country); +} +#endif + +void +main_init(const char *program) +{ + char *s; +#ifdef _UNICODE /* currently for wince */ + wchar_t wfilename[MAX_PATH + 1]; +#endif + + spawn_process_init(); + + cbl=callback_list_new(); +#ifdef HAVE_API_WIN32_BASE + win_set_nls(); +#endif + setenv("LC_NUMERIC","C",1); + setlocale(LC_ALL,""); + setlocale(LC_NUMERIC,"C"); +#if !defined _WIN32 && !defined _WIN32_WCE + if (file_exists("navit.c") || file_exists("navit.o") || file_exists("navit.lo") || file_exists("version.h")) { + char buffer[PATH_MAX]; + printf(_("Running from source directory\n")); + getcwd(buffer, PATH_MAX); /* libc of navit returns "dummy" */ + setenv("NAVIT_PREFIX", buffer, 0); + main_setup_environment(0); + } else { + if (!getenv("NAVIT_PREFIX")) { + int l; + int progpath_len; + char *progpath="/bin/navit"; + l=strlen(program); + progpath_len=strlen(progpath); + if (l > progpath_len && !strcmp(program+l-progpath_len,progpath)) { + s=g_strdup(program); + s[l-progpath_len]='\0'; + if (strcmp(s, PREFIX)) + printf(_("setting '%s' to '%s'\n"), "NAVIT_PREFIX", s); + setenv("NAVIT_PREFIX", s, 0); + g_free(s); + } else + setenv("NAVIT_PREFIX", PREFIX, 0); + } +#ifdef HAVE_API_ANDROID + main_setup_environment(3); +#else + main_setup_environment(1); +#endif + } + +#else /* _WIN32 || _WIN32_WCE */ + if (!getenv("NAVIT_PREFIX")) + { + char filename[MAX_PATH + 1], + *end; + int len; + + *filename = '\0'; +#ifdef _UNICODE /* currently for wince */ + if (GetModuleFileNameW(NULL, wfilename, MAX_PATH)) + { + wcstombs(filename, wfilename, MAX_PATH); +#else + if (GetModuleFileName(NULL, filename, MAX_PATH)) + { +#endif + end = strrchr(filename, L'\\'); /* eliminate the file name which is on the right side */ + if(end) + *end = '\0'; + } + len=strlen(filename); + if (len > 4 && !strcmp(filename+len-4,"\\bin")) { + filename[len-4]='\0'; + } + setenv("NAVIT_PREFIX", filename, 0); + } + if (!getenv("HOME")) + setenv("HOME", getenv("NAVIT_PREFIX"), 0); + main_setup_environment(2); +#endif /* _WIN32 || _WIN32_WCE */ + + if (getenv("LC_ALL")) + dbg(0,"Warning: LC_ALL is set, this might lead to problems (e.g. strange positions from GPS)\n"); + s = getenv("NAVIT_WID"); + if (s) { + setenv("SDL_WINDOWID", s, 0); + } +} + +void +main_init_nls(void) +{ +#ifdef ENABLE_NLS +#ifdef FORCE_LOCALE +#define STRINGIFY2(x) #x +#define STRINGIFY(x) STRINGIFY2(x) + setlocale(LC_MESSAGES,STRINGIFY(FORCE_LOCALE)); +#endif + bindtextdomain(PACKAGE, getenv("NAVIT_LOCALEDIR")); + bind_textdomain_codeset (PACKAGE, "UTF-8"); + textdomain(PACKAGE); +#endif +} diff --git a/navit/main.h b/navit/main.h new file mode 100644 index 0000000..47f275c --- /dev/null +++ b/navit/main.h @@ -0,0 +1,47 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_MAIN_H +#define NAVIT_MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* prototypes */ +struct navit; +struct iter; +struct attr; +struct iter * main_iter_new(void); +void main_iter_destroy(struct iter *iter); +struct navit * main_get_navit(struct iter *iter); +void main_add_navit(struct navit *nav); +void main_remove_navit(struct navit *nav); +int main_add_attr(struct attr *attr); +int main_remove_attr(struct attr *attr); +void main_init(const char *program); +void main_init_nls(void); +int main(int argc, char **argv); +/* end of prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/navit/map-share.h b/navit/map-share.h new file mode 100644 index 0000000..0ba9754 --- /dev/null +++ b/navit/map-share.h @@ -0,0 +1,27 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_MAP_SHARE_H +#define NAVIT_MAP_SHARE_H + +void map_srv_start_poa(CORBA_ORB orb, CORBA_Environment * ev); +CORBA_Object map_srv_start_object(CORBA_Environment * ev, struct container *co); + +#endif + diff --git a/navit/map.c b/navit/map.c new file mode 100644 index 0000000..e13b1fa --- /dev/null +++ b/navit/map.c @@ -0,0 +1,714 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +/** @file + * + * @brief Contains code that makes navit able to load maps + * + * This file contains the code that makes navit able to load maps. Because + * navit is able to open maps in different formats, this code does not handle + * any map format itself. This is done by map plugins which register to this + * code by calling plugin_register_map_type(). + * + * When opening a new map, the map plugin will return a pointer to a map_priv + * struct, which can be defined by the map plugin and contains whatever private + * data the map plugin needs to access the map. This pointer will also be used + * as a "handle" to access the map opened. + * + * A common task is to create a "map rect". A map rect is a rectangular part of + * the map, that one can for example retrieve items from. It is not possible to + * retrieve items directly from the complete map. Creating a map rect returns a + * pointer to a map_rect_priv, which contains private data for the map rect and + * will be used as "handle" for this map rect. + */ + +#include +#include +#include "debug.h" +#include "coord.h" +#include "projection.h" +#include "item.h" +#include "map.h" +#include "maptype.h" +#include "transform.h" +#include "plugin.h" +#include "callback.h" +#include "country.h" + +/** + * @brief Holds information about a map + * + * This structure holds information about a map. + */ +struct map { + struct map_methods meth; /**< Structure with pointers to the map plugin's functions */ + struct map_priv *priv; /**< Private data of the map, only known to the map plugin */ + struct attr **attrs; /**< Attributes of this map */ + struct callback_list *attr_cbl; /**< List of callbacks that are called when attributes change */ + int refcount; +}; + +/** + * @brief Describes a rectangular extract of a map + * + * This structure describes a rectangular extract of a map. + */ +struct map_rect { + struct map *m; /**< The map this extract is from */ + struct map_rect_priv *priv; /**< Private data of this map rect, only known to the map plugin */ +}; + +/** + * @brief Opens a new map + * + * This function opens a new map based on the attributes passed. This function + * takes the attribute "attr_type" to determine which type of map to open and passes + * all attributes to the map plugin's function that was specified in the + * plugin_register_new_map_type()-call. + * + * Note that every plugin should accept an attribute of type "attr_data" to be passed + * with the filename of the map to be opened as value. + * + * @param attrs Attributes specifying which map to open, see description + * @return The opened map or NULL on failure + */ +struct map * +map_new(struct attr *parent, struct attr **attrs) +{ + struct map *m; + struct map_priv *(*maptype_new)(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl); + struct attr *type=attr_search(attrs, NULL, attr_type); + + if (! type) { + dbg(0,"missing type\n"); + return NULL; + } + maptype_new=plugin_get_map_type(type->u.str); + if (! maptype_new) { + dbg(0,"invalid type '%s'\n", type->u.str); + return NULL; + } + + m=g_new0(struct map, 1); + m->attrs=attr_list_dup(attrs); + m->attr_cbl=callback_list_new(); + m->priv=maptype_new(&m->meth, attrs, m->attr_cbl); + if (! m->priv) { + m->refcount = 1; + map_destroy(m); + m=NULL; + } + else { + m->refcount = 0; + } + return m; +} + +void +map_ref(struct map* m) +{ + m->refcount++; +} + + +/** + * @brief Gets an attribute from a map + * + * @param this_ The map the attribute should be read from + * @param type The type of the attribute to be read + * @param attr Pointer to an attrib-structure where the attribute should be written to + * @param iter (NOT IMPLEMENTED) Used to iterate through all attributes of a type. Set this to NULL to get the first attribute, set this to an attr_iter to get the next attribute + * @return True if the attribute type was found, false if not + */ +int +map_get_attr(struct map *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + int ret=0; + if (this_->meth.map_get_attr) + ret=this_->meth.map_get_attr(this_->priv, type, attr); + if (!ret) + ret=attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); + return ret; +} + +/** + * @brief Sets an attribute of a map + * + * This sets an attribute of a map, overwriting an attribute of the same type if it + * already exists. This function also calls all the callbacks that are registred + * to be called when attributes change. + * + * @param this_ The map to set the attribute of + * @param attr The attribute to set + * @return True if the attr could be set, false otherwise + */ +int +map_set_attr(struct map *this_, struct attr *attr) +{ + this_->attrs=attr_generic_set_attr(this_->attrs, attr); + if (this_->meth.map_set_attr) + this_->meth.map_set_attr(this_->priv, attr); + callback_list_call_attr_2(this_->attr_cbl, attr->type, this_, attr); + return 1; +} + +/** + * @brief Registers a new callback for attribute-change + * + * This function registers a new callback function that should be called if the attributes + * of the map change. + * + * @param this_ The map to associate the callback with + * @param cb The callback to add + */ +void +map_add_callback(struct map *this_, struct callback *cb) +{ + callback_list_add(this_->attr_cbl, cb); +} + +/** + * @brief Removes a callback from the list of attribute-change callbacks + * + * This function removes one callback from the list of callbacks functions that should be called + * when attributes of the map change. + * + * @param this_ The map to remove the callback from + * @param cb The callback to remove + */ +void +map_remove_callback(struct map *this_, struct callback *cb) +{ + callback_list_remove(this_->attr_cbl, cb); +} + + +/** + * @brief Checks if strings from a map have to be converted + * + * @param this_ Map to be checked for the need to convert strings + * @return True if strings from the map have to be converted, false otherwise + */ +int +map_requires_conversion(struct map *this_) +{ + return (this_->meth.charset != NULL && strcmp(this_->meth.charset, "utf-8")); +} + +/** + * @brief Converts a string from a map + * + * @param this_ The map the string to be converted is from + * @param str The string to be converted + * @return The converted string. It has to be map_convert_free()d after use. + */ +char * +map_convert_string(struct map *this_, char *str) +{ + return g_convert(str, -1,"utf-8",this_->meth.charset,NULL,NULL,NULL); +} + +/** + * @brief Frees the memory allocated for a converted string + * + * @param str The string to be freed + */ +void +map_convert_free(char *str) +{ + g_free(str); +} + +/** + * @brief Returns the projection of a map + * + * @param this_ The map to return the projection of + * @return The projection of the map + */ +enum projection +map_projection(struct map *this_) +{ + return this_->meth.pro; +} + +/** + * @brief Sets the projection of a map + * + * @param this_ The map to set the projection of + * @param pro The projection to be set + */ +void +map_set_projection(struct map *this_, enum projection pro) +{ + this_->meth.pro=pro; +} + +void +map_destroy_do(struct map *m) +{ + if (m->priv) + m->meth.map_destroy(m->priv); + attr_list_free(m->attrs); + callback_list_destroy(m->attr_cbl); + g_free(m); +} + +/** + * @brief Destroys an opened map + * + * @param m The map to be destroyed + */ +void +map_destroy(struct map *m) +{ + if (!m) + return; + + if(0refcount) { + m->refcount--; + } + if(0 == m->refcount) { + map_destroy_do(m); + } +} + +/** + * @brief Creates a new map rect + * + * This creates a new map rect, which can be used to retrieve items from a map. If + * sel is a linked-list of selections, all of them will be used. If you pass NULL as + * sel, this means "get me the whole map". + * + * @param m The map to build the rect on + * @param sel Map selection to choose the rectangle - may be NULL, see description + * @return A new map rect + */ +struct map_rect * +map_rect_new(struct map *m, struct map_selection *sel) +{ + struct map_rect *mr; + +#if 0 + printf("map_rect_new 0x%x,0x%x-0x%x,0x%x\n", r->lu.x, r->lu.y, r->rl.x, r->rl.y); +#endif + mr=g_new0(struct map_rect, 1); + mr->m=m; + mr->priv=m->meth.map_rect_new(m->priv, sel); + if (! mr->priv) { + g_free(mr); + mr=NULL; + } + + return mr; +} + +/** + * @brief Gets the next item from a map rect + * + * Returns an item from a map rect and advances the "item pointer" one step further, + * so that at the next call the next item is returned. Returns NULL if there are no more items. + * + * @param mr The map rect to return an item from + * @return An item from the map rect + */ +struct item * +map_rect_get_item(struct map_rect *mr) +{ + struct item *ret; + dbg_assert(mr != NULL); + dbg_assert(mr->m != NULL); + dbg_assert(mr->m->meth.map_rect_get_item != NULL); + ret=mr->m->meth.map_rect_get_item(mr->priv); + if (ret) + ret->map=mr->m; + return ret; +} + +/** + * @brief Returns the item specified by the ID + * + * @param mr The map rect to search for the item + * @param id_hi High part of the ID to be found + * @param id_lo Low part of the ID to be found + * @return The item with the specified ID or NULL if not found + */ +struct item * +map_rect_get_item_byid(struct map_rect *mr, int id_hi, int id_lo) +{ + struct item *ret=NULL; + dbg_assert(mr != NULL); + dbg_assert(mr->m != NULL); + if (mr->m->meth.map_rect_get_item_byid) + ret=mr->m->meth.map_rect_get_item_byid(mr->priv, id_hi, id_lo); + if (ret) + ret->map=mr->m; + return ret; +} + +/** + * @brief Destroys a map rect + * + * @param mr The map rect to be destroyed + */ +void +map_rect_destroy(struct map_rect *mr) +{ + if (mr) { + mr->m->meth.map_rect_destroy(mr->priv); + g_free(mr); + } +} + +/** + * @brief Holds information about a search on a map + * + * This structure holds information about a search performed on a map. This can be + * used as "handle" to retrieve items from a search. + */ +struct map_search { + struct map *m; + struct attr search_attr; + void *priv; +}; + +/** + * @brief Starts a search on a map + * + * This function starts a search on a map. What attributes one can search for depends on the + * map plugin. + * + * The OSM/binfile plugin currently supports: attr_town_name, attr_street_name + * The MG plugin currently supports: ttr_town_postal, attr_town_name, attr_street_name + * + * If you enable partial matches bear in mind that the search matches only the begin of the + * strings - a search for a street named "street" would match to "streetfoo", but not to + * "somestreet". Search is case insensitive. + * + * The item passed to this function specifies a "superior item" to "search within" - e.g. a town + * in which we want to search for a street, or a country in which to search for a town. + * + * Please also note that the search for countries is not handled by map plugins but by navit internally - + * have a look into country.c for details. Because of that every map plugin has to accept a country item + * to be passed as "superior item". + * + * Note: If you change something here, please make sure to also update the documentation of mapset_search_new() + * in mapset.c! + * + * @param m The map that should be searched + * @param item Specifies a superior item to "search within" (see description) + * @param search_attr Attribute specifying what to search for. See description. + * @param partial Set this to true to also have partial matches. See description. + * @return A new map search struct for this search + */ +struct map_search * +map_search_new(struct map *m, struct item *item, struct attr *search_attr, int partial) +{ + struct map_search *this_; + dbg(1,"enter(%p,%p,%p,%d)\n", m, item, search_attr, partial); + dbg(1,"0x%x 0x%x 0x%x\n", attr_country_all, search_attr->type, attr_country_name); + this_=g_new0(struct map_search,1); + this_->m=m; + this_->search_attr=*search_attr; + if ((search_attr->type >= attr_country_all && search_attr->type <= attr_country_name) || search_attr->type == attr_country_id) + this_->priv=country_search_new(&this_->search_attr, partial); + else { + if (m->meth.map_search_new) { + if (m->meth.charset) + this_->search_attr.u.str=g_convert(this_->search_attr.u.str, -1,m->meth.charset,"utf-8",NULL,NULL,NULL); + this_->priv=m->meth.map_search_new(m->priv, item, &this_->search_attr, partial); + if (! this_->priv) { + g_free(this_); + this_=NULL; + } + } else { + g_free(this_); + this_=NULL; + } + } + return this_; +} + +/** + * @brief Returns an item from a map search + * + * This returns an item of the result of a search on a map and advances the "item pointer" one step, + * so that at the next call the next item will be returned. If there are no more items in the result + * NULL is returned. + * + * @param this_ Map search struct of the search + * @return One item of the result + */ +struct item * +map_search_get_item(struct map_search *this_) +{ + struct item *ret; + + if (! this_) + return NULL; + if ((this_->search_attr.type >= attr_country_all && this_->search_attr.type <= attr_country_name) || this_->search_attr.type == attr_country_id) + return country_search_get_item(this_->priv); + ret=this_->m->meth.map_search_get_item(this_->priv); + if (ret) + ret->map=this_->m; + return ret; +} + +/** + * @brief Destroys a map search struct + * + * @param this_ The map search struct to be destroyed + */ +void +map_search_destroy(struct map_search *this_) +{ + if (! this_) + return; + if (this_->search_attr.type >= attr_country_all && this_->search_attr.type <= attr_country_name) + country_search_destroy(this_->priv); + else { + if (this_->m->meth.charset) + g_free(this_->search_attr.u.str); + this_->m->meth.map_search_destroy(this_->priv); + } + g_free(this_); +} + +/** + * @brief Creates a new rectangular map selection + * + * @param center Coordinates of the center of the new rectangle + * @param distance Distance of the rectangle's borders from the center + * @param order Desired order of the new selection + * @return The new map selection + */ +struct map_selection * +map_selection_rect_new(struct pcoord *center, int distance, int order) +{ + struct map_selection *ret=g_new0(struct map_selection, 1); + ret->order=order; + ret->range=item_range_all; + ret->u.c_rect.lu.x=center->x-distance; + ret->u.c_rect.lu.y=center->y+distance; + ret->u.c_rect.rl.x=center->x+distance; + ret->u.c_rect.rl.y=center->y-distance; + return ret; +} + +/** + * @brief Duplicates a map selection, transforming coordinates + * + * This duplicates a map selection and at the same time transforms the internal + * coordinates of the selection from one projection to another. + * + * @param sel The map selection to be duplicated + * @param from The projection used for the selection at the moment + * @param to The projection that should be used for the duplicated selection + * @return A duplicated, transformed map selection + */ +struct map_selection * +map_selection_dup_pro(struct map_selection *sel, enum projection from, enum projection to) +{ + struct map_selection *next,**last; + struct map_selection *ret=NULL; + last=&ret; + while (sel) { + next = g_new(struct map_selection, 1); + *next=*sel; + if (from != projection_none || to != projection_none) { + transform_from_to(&sel->u.c_rect.lu, from, &next->u.c_rect.lu, to); + transform_from_to(&sel->u.c_rect.rl, from, &next->u.c_rect.rl, to); + } + *last=next; + last=&next->next; + sel = sel->next; + } + return ret; +} + +/** + * @brief Duplicates a map selection + * + * @param sel The map selection to duplicate + * @return The duplicated map selection + */ +struct map_selection * +map_selection_dup(struct map_selection *sel) +{ + return map_selection_dup_pro(sel, projection_none, projection_none); +} + +/** + * @brief Destroys a map selection + * + * @param sel The map selection to be destroyed + */ +void +map_selection_destroy(struct map_selection *sel) +{ + struct map_selection *next; + while (sel) { + next = sel->next; + g_free(sel); + sel = next; + } +} + +/** + * @brief Checks if a selection contains a rectangle containing an item + * + * This function checks if a selection contains a rectangle which exactly contains + * an item. The rectangle is automatically built around the given item. + * + * @param sel The selection to be checked + * @param item The item that the rectangle should be built around + * @return True if the rectangle is within the selection, false otherwise + */ +int +map_selection_contains_item_rect(struct map_selection *sel, struct item *item) +{ + struct coord c; + struct coord_rect r; + int count=0; + while (item_coord_get(item, &c, 1)) { + if (! count) { + r.lu=c; + r.rl=c; + } else + coord_rect_extend(&r, &c); + count++; + } + if (! count) + return 0; + return map_selection_contains_rect(sel, &r); + +} + + +/** + * @brief Checks if a selection contains a item range + * + * This function checks if a selection contains at least one of the items in range + * + * @param sel The selection to be checked + * @param follow Whether the next pointer of the selection should be followed + * @param ranges The item ranges to be checked + * @count the number of elements in ranges + * @return True if there is a match, false otherwise + */ + +int +map_selection_contains_item_range(struct map_selection *sel, int follow, struct item_range *range, int count) +{ + int i; + if (! sel) + return 1; + while (sel) { + for (i = 0 ; i < count ; i++) { + if (item_range_intersects_range(&sel->range, &range[i])) + return 1; + } + if (! follow) + break; + sel=sel->next; + } + return 0; +} +/** + * @brief Checks if a selection contains a item + * + * This function checks if a selection contains a item type + * + * @param sel The selection to be checked + * @param follow Whether the next pointer of the selection should be followed + * @param item The item type to be checked + * @return True if there is a match, false otherwise + */ + +int +map_selection_contains_item(struct map_selection *sel, int follow, enum item_type type) +{ + if (! sel) + return 1; + while (sel) { + if (item_range_contains_item(&sel->range, type)) + return 1; + if (! follow) + break; + sel=sel->next; + } + return 0; +} + + + +/** + * @brief Checks if a pointer points to the private data of a map + * + * @param map The map whose private data should be checked. + * @param priv The private data that should be checked. + * @return True if priv is the private data of map + */ +int +map_priv_is(struct map *map, struct map_priv *priv) +{ + return (map->priv == priv); +} + +void +map_dump_filedesc(struct map *map, FILE *out) +{ + struct map_rect *mr=map_rect_new(map, NULL); + struct item *item; + + while ((item = map_rect_get_item(mr))) + item_dump_filedesc(item, map, out); + map_rect_destroy(mr); +} + +void +map_dump_file(struct map *map, const char *file) +{ + FILE *f; + f=fopen(file,"w"); + if (f) { + map_dump_filedesc(map, f); + fclose(f); + } else + dbg(0,"failed to open file '%s'\n",file); +} + +void +map_dump(struct map *map) +{ + map_dump_filedesc(map, stdout); +} + +struct item * +map_rect_create_item(struct map_rect *mr, enum item_type type_) +{ + if(mr && mr->priv && mr->m) { + return mr->m->meth.map_rect_create_item(mr->priv, type_) ; + } + else { + return NULL; + } +} + + + diff --git a/navit/map.h b/navit/map.h new file mode 100644 index 0000000..1dea19f --- /dev/null +++ b/navit/map.h @@ -0,0 +1,274 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +/** @file + * + * @brief Contains exported functions / structures for map.c + * + * This file contains code that works together with map.c and that is exported + * to other modules. + */ + +#ifndef NAVIT_MAP_H +#define NAVIT_MAP_H + +#ifdef __cplusplus +extern "C" { +#endif + +struct map_priv; +struct attr; +#include "coord.h" +#include "point.h" +#include "layer.h" +#include "debug.h" + +/** + * @brief Used to select data from a map + * + * This struct is used to select data from a map. This one the one hand builds a + * rectangle on the map and on the other hand selects an order for items of each + * layer. Note that passing NULL instead of a pointer to such a struct often means + * "get me everything". + * + * It's possible to link multiple selections in a linked list, see below. + */ +struct map_selection { + struct map_selection *next; /**< Linked-List pointer */ + union { + struct coord_rect c_rect; /**< For building the rectangle based on coordinates */ + struct point_rect p_rect; /**< For building the rectangle based on points */ + } u; + int order; /**< Holds the order */ + struct item_range range; /**< Range of items which should be delivered */ +}; + +/** + * @brief Holds all functions a map plugin has to implement to be useable + * + * This structure holds pointers to a map plugin's functions navit's core will call + * to communicate with the plugin. For further information look into map.c - there exist + * functions with the same names acting more or less as "wrappers" around the functions here. + * Especially the arguments (and their meaning) of each function will be described there. + */ +struct map_methods { + enum projection pro; /**< The projection used for that type of map */ + char *charset; /**< The charset this map uses - e.g. "iso8859-1" or "utf-8". Please specify this in a form so that g_convert() can handle it. */ + void (*map_destroy)(struct map_priv *priv); /**< Function used to destroy ("close") a map. */ + struct map_rect_priv * (*map_rect_new)(struct map_priv *map, struct map_selection *sel); /**< Function to create a new map rect on the map. */ + void (*map_rect_destroy)(struct map_rect_priv *mr); /**< Function to destroy a map rect */ + struct item * (*map_rect_get_item)(struct map_rect_priv *mr); /**< Function to return the next item from a map rect */ + struct item * (*map_rect_get_item_byid)(struct map_rect_priv *mr, int id_hi, int id_lo); /**< Function to get an item with a specific ID from a map rect */ + struct map_search_priv *(*map_search_new)(struct map_priv *map, struct item *item, struct attr *search, int partial); /**< Function to start a new search on the map */ + void (*map_search_destroy)(struct map_search_priv *ms); /**< Function to destroy a map search struct */ + struct item * (*map_search_get_item)(struct map_search_priv *ms); /**< Function to get the next item of a search on the map */ + struct item * (*map_rect_create_item)(struct map_rect_priv *mr, enum item_type type); /**< Function to create a new item in the map */ + int (*map_get_attr)(struct map_priv *priv, enum attr_type type, struct attr *attr); + int (*map_set_attr)(struct map_priv *priv, struct attr *attr); + +}; + +/** + * @brief Checks if a coordinate is within a map selection + * + * Checks if a coordinate is within a map selection. Note that since a selection of NULL + * means "select everything", with sel = NULL this will always return true. If there are + * more than one selection in a linked-list, it is sufficient if only one of the selections + * contains the coordinate. + * + * @param sel The selection to check if the point is within + * @param c Coordinate to check if it is within the selection + * @return True if the coordinate is within one of the selections, False otherwise + */ +static inline int +map_selection_contains_point(struct map_selection *sel, struct coord *c) +{ + struct map_selection *curr=sel; + while (curr) { + struct coord_rect *r=&curr->u.c_rect; + if (c->x >= r->lu.x && c->x <= r->rl.x && + c->y <= r->lu.y && c->y >= r->rl.y) + return 1; + curr=curr->next; + } + return sel ? 0:1; +} + +/** + * @brief Checks if a polyline is within a map selection + * + * @sa Please refer to map_selection_contains_point() + * + * @param sel The selection to check if the polyline is within + * @param c Coordinates of the polyline to check if it is within the selection + * @param count Number of coordinates in c + * @return True if the polyline is within one of the selections, False otherwise + */ +static inline int +map_selection_contains_polyline(struct map_selection *sel, struct coord *c, int count) +{ + int i,x_mi,x_ma,y_mi,y_ma; + struct map_selection *curr; + + if (! sel) + return 1; + for (i = 0 ; i < count-1 ; i++) { + x_mi=c[i].x; + if (c[i+1].x < x_mi) + x_mi=c[i+1].x; + x_ma=c[i].x; + if (c[i+1].x > x_ma) + x_ma=c[i+1].x; + y_mi=c[i].y; + if (c[i+1].y < y_mi) + y_mi=c[i+1].y; + y_ma=c[i].y; + if (c[i+1].y > y_ma) + y_ma=c[i+1].y; + curr=sel; + while (curr) { + struct coord_rect *sr=&curr->u.c_rect; + if (x_mi <= sr->rl.x && x_ma >= sr->lu.x && + y_ma >= sr->rl.y && y_mi <= sr->lu.y) + return 1; + curr=curr->next; + } + } + return 0; +} + +/** + * @brief Checks if a rectangle is within a map selection + * + * @sa Please refer to map_selection_contains_point() + * + * @param sel The selection to check if the rectangle is within + * @param r Rectangle to be checked for + * @return True if the rectangle is within one of the selections, False otherwise + */ +static inline int +map_selection_contains_rect(struct map_selection *sel, struct coord_rect *r) +{ + struct map_selection *curr; + + dbg_assert(r->lu.x <= r->rl.x); + dbg_assert(r->lu.y >= r->rl.y); + + if (! sel) + return 1; + curr=sel; + while (curr) { + struct coord_rect *sr=&curr->u.c_rect; + dbg_assert(sr->lu.x <= sr->rl.x); + dbg_assert(sr->lu.y >= sr->rl.y); + if (r->lu.x <= sr->rl.x && r->rl.x >= sr->lu.x && + r->lu.y >= sr->rl.y && r->rl.y <= sr->lu.y) + return 1; + curr=curr->next; + } + return 0; +} + + +/** + * @brief Checks if a polygon is within a map selection + * + * @sa Please refer to map_selection_contains_point() + * + * @param sel The selection to check if the polygon is within + * @param c Pointer to coordinates of the polygon + * @param count Number of coordinates in c + * @return True if the polygon is within one of the selections, False otherwise + */ +static inline int +map_selection_contains_polygon(struct map_selection *sel, struct coord *c, int count) +{ + struct coord_rect r; + int i; + + if (! sel) + return 1; + if (! count) + return 0; + r.lu=c[0]; + r.rl=c[0]; + for (i = 1 ; i < count ; i++) { + if (c[i].x < r.lu.x) + r.lu.x=c[i].x; + if (c[i].x > r.rl.x) + r.rl.x=c[i].x; + if (c[i].y < r.rl.y) + r.rl.y=c[i].y; + if (c[i].y > r.lu.y) + r.lu.y=c[i].y; + } + return map_selection_contains_rect(sel, &r); +} + +/* prototypes */ +enum attr_type; +enum projection; +struct attr; +struct attr_iter; +struct callback; +struct item; +struct map; +struct map_priv; +struct map_rect; +struct map_search; +struct map_selection; +struct pcoord; +struct map *map_new(struct attr *parent, struct attr **attrs); +void map_ref(struct map* m); +int map_get_attr(struct map *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); +int map_set_attr(struct map *this_, struct attr *attr); +void map_add_callback(struct map *this_, struct callback *cb); +void map_remove_callback(struct map *this_, struct callback *cb); +int map_requires_conversion(struct map *this_); +char *map_convert_string(struct map *this_, char *str); +void map_convert_free(char *str); +enum projection map_projection(struct map *this_); +void map_set_projection(struct map *this_, enum projection pro); +void map_destroy(struct map *m); +struct map_rect *map_rect_new(struct map *m, struct map_selection *sel); +struct item *map_rect_get_item(struct map_rect *mr); +struct item *map_rect_get_item_byid(struct map_rect *mr, int id_hi, int id_lo); +struct item *map_rect_create_item(struct map_rect *mr, enum item_type type_); +void map_rect_destroy(struct map_rect *mr); +struct map_search *map_search_new(struct map *m, struct item *item, struct attr *search_attr, int partial); +struct item *map_search_get_item(struct map_search *this_); +void map_search_destroy(struct map_search *this_); +struct map_selection *map_selection_rect_new(struct pcoord *center, int distance, int order); +struct map_selection *map_selection_dup_pro(struct map_selection *sel, enum projection from, enum projection to); +struct map_selection *map_selection_dup(struct map_selection *sel); +void map_selection_destroy(struct map_selection *sel); +int map_selection_contains_item_rect(struct map_selection *sel, struct item *item); +int map_selection_contains_item_range(struct map_selection *sel, int follow, struct item_range *range, int count); +int map_selection_contains_item(struct map_selection *sel, int follow, enum item_type type); +int map_priv_is(struct map *map, struct map_priv *priv); +void map_dump_filedesc(struct map *map, FILE *out); +void map_dump_file(struct map *map, const char *file); +void map_dump(struct map *map); +void map_destroy_do(struct map *m); +/* end of prototypes */ + +#ifdef __cplusplus +} +#endif +#endif diff --git a/navit/map/Makefile.am b/navit/map/Makefile.am new file mode 100644 index 0000000..d2b6efd --- /dev/null +++ b/navit/map/Makefile.am @@ -0,0 +1,24 @@ +SUBDIRS= +if MAP_BINFILE + SUBDIRS+=binfile +endif +if MAP_FILTER + SUBDIRS+=filter +endif +if HAVELIBGARMIN + SUBDIRS+=garmin +endif +if MAP_MG + SUBDIRS+=mg +endif +if MAP_SHAPEFILE + SUBDIRS+=shapefile +endif +if MAP_TEXTFILE + SUBDIRS+=textfile +endif +if MAP_CSV + SUBDIRS+=csv +endif + +DIST_SUBDIRS=mg textfile csv binfile garmin shapefile filter diff --git a/navit/map/Makefile.in b/navit/map/Makefile.in new file mode 100644 index 0000000..245a630 --- /dev/null +++ b/navit/map/Makefile.in @@ -0,0 +1,717 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@MAP_BINFILE_TRUE@am__append_1 = binfile +@MAP_FILTER_TRUE@am__append_2 = filter +@HAVELIBGARMIN_TRUE@am__append_3 = garmin +@MAP_MG_TRUE@am__append_4 = mg +@MAP_SHAPEFILE_TRUE@am__append_5 = shapefile +@MAP_TEXTFILE_TRUE@am__append_6 = textfile +@MAP_CSV_TRUE@am__append_7 = csv +subdir = navit/map +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = $(am__append_1) $(am__append_2) $(am__append_3) \ + $(am__append_4) $(am__append_5) $(am__append_6) \ + $(am__append_7) +DIST_SUBDIRS = mg textfile csv binfile garmin shapefile filter +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/map/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/map/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/map/binfile/Makefile.am b/navit/map/binfile/Makefile.am new file mode 100644 index 0000000..6bf6711 --- /dev/null +++ b/navit/map/binfile/Makefile.am @@ -0,0 +1,9 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_binfile +if PLUGINS + modulemap_LTLIBRARIES = libmap_binfile.la +else + noinst_LTLIBRARIES = libmap_binfile.la +endif +libmap_binfile_la_SOURCES = binfile.c +libmap_binfile_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ diff --git a/navit/map/binfile/Makefile.in b/navit/map/binfile/Makefile.in new file mode 100644 index 0000000..d8d3899 --- /dev/null +++ b/navit/map/binfile/Makefile.in @@ -0,0 +1,703 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/map/binfile +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulemapdir)" +LTLIBRARIES = $(modulemap_LTLIBRARIES) $(noinst_LTLIBRARIES) +libmap_binfile_la_LIBADD = +am_libmap_binfile_la_OBJECTS = binfile.lo +libmap_binfile_la_OBJECTS = $(am_libmap_binfile_la_OBJECTS) +libmap_binfile_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libmap_binfile_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libmap_binfile_la_rpath = +@PLUGINS_TRUE@am_libmap_binfile_la_rpath = -rpath $(modulemapdir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libmap_binfile_la_SOURCES) +DIST_SOURCES = $(libmap_binfile_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_binfile +@PLUGINS_TRUE@modulemap_LTLIBRARIES = libmap_binfile.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libmap_binfile.la +libmap_binfile_la_SOURCES = binfile.c +libmap_binfile_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/map/binfile/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/map/binfile/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulemapLTLIBRARIES: $(modulemap_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulemapdir)" || $(MKDIR_P) "$(DESTDIR)$(modulemapdir)" + @list='$(modulemap_LTLIBRARIES)'; test -n "$(modulemapdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulemapdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulemapdir)"; \ + } + +uninstall-modulemapLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulemap_LTLIBRARIES)'; test -n "$(modulemapdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulemapdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulemapdir)/$$f"; \ + done + +clean-modulemapLTLIBRARIES: + -test -z "$(modulemap_LTLIBRARIES)" || rm -f $(modulemap_LTLIBRARIES) + @list='$(modulemap_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libmap_binfile.la: $(libmap_binfile_la_OBJECTS) $(libmap_binfile_la_DEPENDENCIES) + $(libmap_binfile_la_LINK) $(am_libmap_binfile_la_rpath) $(libmap_binfile_la_OBJECTS) $(libmap_binfile_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binfile.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulemapdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulemapLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulemapLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulemapLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulemapLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-modulemapLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulemapLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/map/binfile/binfile.c b/navit/map/binfile/binfile.c new file mode 100644 index 0000000..7bf18d4 --- /dev/null +++ b/navit/map/binfile/binfile.c @@ -0,0 +1,2625 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include "config.h" +#include "debug.h" +#include "plugin.h" +#include "projection.h" +#include "item.h" +#include "map.h" +#include "maptype.h" +#include "attr.h" +#include "coord.h" +#include "transform.h" +#include "file.h" +#include "zipfile.h" +#include "linguistics.h" +#include "endianess.h" +#include "callback.h" +#include "types.h" + +static int map_id; + + +/** + * @brief A map tile, a rectangular region of the world. + * + * Represents a "map tile", a rectangular region of the world. The + * binfile format divides the world into tiles of different sizes for + * easy handling. + * A binfile is a ZIP archive; each member file (with the exception of + * index files) represents one tile. The data from a tile file is read + * into memory and used directly as the tile data of this struct. + *

+ * See the Navit wiki for details on the binfile format: + * + * http://wiki.navit-project.org/index.php/Navit%27s_binary_map_driver + *

+ * Note that this tile struct also maintains pointers to several current positions + * inside the tile. These are not part of the actual tile data, but are + * used for working with the data. + */ +struct tile { + int *start; //!< Memory address of the buffer containing the tile data (the actual map data). + int *end; //!< First memory address not belonging to the tile data. + /**< Thus tile->end - tile->start represents the size of the tile data + * in multiples of 4 Bytes. + */ + int *pos; //!< Pointer to current position (start of current item) inside the tile data. + int *pos_coord_start; //!< Pointer to the first element inside the current item that is a coordinate. + /**< That is the first position after the header of an + * item. The header holds 3 entries each 32bit wide integers: + * header[0] holds the size of the whole item (excluding this size field) + * header[1] holds the type of the item + * header[2] holds the size of the coordinates in the tile + */ + int *pos_coord; //!< Current position in the coordinates region of the current item. + int *pos_attr_start; //!< Pointer to the first attr data structure of the current item. + int *pos_attr; //!< Current position in the attr region of the current item. + int *pos_next; //!< Pointer to the next item (the item which follows the "current item" as indicated by *pos). + struct file *fi; //!< The file from which this tile was loaded. + int zipfile_num; + int mode; +}; + + +struct map_download { + int state; + struct map_priv *m; + struct map_rect_priv *mr; + struct file *http,*file; + int zipfile,toffset,tlength,progress,read,dl_size; + long long offset,start_offset,cd1offset,size; + struct zip64_eoc *zip64_eoc; + struct zip64_eocl *zip64_eocl; + struct zip_eoc *zip_eoc; + struct zip_cd *cd_copy,*cd; +}; + +/** + * @brief Represents the map from a single binfile. + * + */ +struct map_priv { + int id; + char *filename; //!< Filename of the binfile. + char *cachedir; + struct file *fi,*http; + struct file **fis; + struct zip_cd *index_cd; + int index_offset; + int cde_size; + struct zip_eoc *eoc; + struct zip64_eoc *eoc64; + int zip_members; + unsigned char *search_data; + int search_offset; + int search_size; + int version; + int check_version; + int map_version; + GHashTable *changes; + char *passwd; + char *map_release; + int flags; + char *url; + int update_available; + char *progress; + struct callback_list *cbl; + struct map_download *download; + int redirect; + long download_enabled; +}; + +struct map_rect_priv { + int *start; + int *end; + enum attr_type attr_last; + int label; + int *label_attr[5]; + struct map_selection *sel; + struct map_priv *m; + struct item item; + int tile_depth; + struct tile tiles[8]; + struct tile *t; + int country_id; + char *url; + struct attr attrs[8]; + int status; +#ifdef DEBUG_SIZE + int size; +#endif +}; + +/** + * @brief Represents a search on a map. + * This struct represents a search on a map; it is created + * when starting a search, and is used for retrieving results. + */ +struct map_search_priv { + struct map_priv *map; + struct map_rect_priv *mr; + struct map_rect_priv *mr_item; + struct item *item; + struct attr *search; + struct map_selection ms; + int partial; + int mode; + GHashTable *search_results; +}; + + +static void push_tile(struct map_rect_priv *mr, struct tile *t, int offset, int length); +static void setup_pos(struct map_rect_priv *mr); +static void map_binfile_close(struct map_priv *m); +static int map_binfile_open(struct map_priv *m); +static void map_binfile_destroy(struct map_priv *m); + +static void lfh_to_cpu(struct zip_lfh *lfh) { + dbg_assert(lfh != NULL); + if (lfh->ziplocsig != zip_lfh_sig) { + lfh->ziplocsig = le32_to_cpu(lfh->ziplocsig); + lfh->zipver = le16_to_cpu(lfh->zipver); + lfh->zipgenfld = le16_to_cpu(lfh->zipgenfld); + lfh->zipmthd = le16_to_cpu(lfh->zipmthd); + lfh->ziptime = le16_to_cpu(lfh->ziptime); + lfh->zipdate = le16_to_cpu(lfh->zipdate); + lfh->zipcrc = le32_to_cpu(lfh->zipcrc); + lfh->zipsize = le32_to_cpu(lfh->zipsize); + lfh->zipuncmp = le32_to_cpu(lfh->zipuncmp); + lfh->zipfnln = le16_to_cpu(lfh->zipfnln); + lfh->zipxtraln = le16_to_cpu(lfh->zipxtraln); + } +} + +static void cd_to_cpu(struct zip_cd *zcd) { + dbg_assert(zcd != NULL); + if (zcd->zipcensig != zip_cd_sig) { + zcd->zipcensig = le32_to_cpu(zcd->zipcensig); + zcd->zipccrc = le32_to_cpu(zcd->zipccrc); + zcd->zipcsiz = le32_to_cpu(zcd->zipcsiz); + zcd->zipcunc = le32_to_cpu(zcd->zipcunc); + zcd->zipcfnl = le16_to_cpu(zcd->zipcfnl); + zcd->zipcxtl = le16_to_cpu(zcd->zipcxtl); + zcd->zipccml = le16_to_cpu(zcd->zipccml); + zcd->zipdsk = le16_to_cpu(zcd->zipdsk); + zcd->zipint = le16_to_cpu(zcd->zipint); + zcd->zipext = le32_to_cpu(zcd->zipext); + zcd->zipofst = le32_to_cpu(zcd->zipofst); + } +} + +static void eoc_to_cpu(struct zip_eoc *eoc) { + dbg_assert(eoc != NULL); + if (eoc->zipesig != zip_eoc_sig) { + eoc->zipesig = le32_to_cpu(eoc->zipesig); + eoc->zipedsk = le16_to_cpu(eoc->zipedsk); + eoc->zipecen = le16_to_cpu(eoc->zipecen); + eoc->zipenum = le16_to_cpu(eoc->zipenum); + eoc->zipecenn = le16_to_cpu(eoc->zipecenn); + eoc->zipecsz = le32_to_cpu(eoc->zipecsz); + eoc->zipeofst = le32_to_cpu(eoc->zipeofst); + eoc->zipecoml = le16_to_cpu(eoc->zipecoml); + } +} + +static void binfile_check_version(struct map_priv *m); + +static struct zip_eoc * +binfile_read_eoc(struct file *fi) +{ + struct zip_eoc *eoc; + eoc=(struct zip_eoc *)file_data_read(fi,fi->size-sizeof(struct zip_eoc), sizeof(struct zip_eoc)); + if (eoc) { + eoc_to_cpu(eoc); + dbg(1,"sig 0x%x\n", eoc->zipesig); + if (eoc->zipesig != zip_eoc_sig) { + dbg(0,"eoc signature check failed: 0x%x vs 0x%x\n",eoc->zipesig,zip_eoc_sig); + file_data_free(fi,(unsigned char *)eoc); + eoc=NULL; + } + } + return eoc; +} + +static struct zip64_eoc * +binfile_read_eoc64(struct file *fi) +{ + struct zip64_eocl *eocl; + struct zip64_eoc *eoc; + eocl=(struct zip64_eocl *)file_data_read(fi,fi->size-sizeof(struct zip_eoc)-sizeof(struct zip64_eocl), sizeof(struct zip64_eocl)); + if (!eocl) + return NULL; + dbg(1,"sig 0x%x\n", eocl->zip64lsig); + if (eocl->zip64lsig != zip64_eocl_sig) { + file_data_free(fi,(unsigned char *)eocl); + dbg(1,"eocl wrong\n"); + return NULL; + } + eoc=(struct zip64_eoc *)file_data_read(fi,eocl->zip64lofst, sizeof(struct zip64_eoc)); + if (eoc) { + if (eoc->zip64esig != zip64_eoc_sig) { + file_data_free(fi,(unsigned char *)eoc); + dbg(1,"eoc wrong\n"); + eoc=NULL; + } + dbg(1,"eoc64 ok 0x%Lx 0x%Lx\n",eoc->zip64eofst,eoc->zip64ecsz); + } + file_data_free(fi,(unsigned char *)eocl); + return eoc; +} + +static int +binfile_cd_extra(struct zip_cd *cd) +{ + return cd->zipcfnl+cd->zipcxtl; +} + +static struct zip_cd * +binfile_read_cd(struct map_priv *m, int offset, int len) +{ + struct zip_cd *cd; + long long cdoffset=m->eoc64?m->eoc64->zip64eofst:m->eoc->zipeofst; + if (len == -1) { + cd=(struct zip_cd *)file_data_read(m->fi,cdoffset+offset, sizeof(*cd)); + cd_to_cpu(cd); + len=binfile_cd_extra(cd); + file_data_free(m->fi,(unsigned char *)cd); + } + cd=(struct zip_cd *)file_data_read(m->fi,cdoffset+offset, sizeof(*cd)+len); + if (cd) { + dbg(1,"cd at "LONGLONG_FMT" %d bytes\n",cdoffset+offset, sizeof(*cd)+len); + cd_to_cpu(cd); + dbg(1,"sig 0x%x\n", cd->zipcensig); + if (cd->zipcensig != zip_cd_sig) { + file_data_free(m->fi,(unsigned char *)cd); + cd=NULL; + } + } + return cd; +} + +/** + * @brief Get the ZIP64 extra field data corresponding to a zip central + * directory header. + * + * @param cd pointer to zip central directory structure + * @return pointer to ZIP64 extra field, or NULL if not available + */ +static struct zip_cd_ext * +binfile_cd_ext(struct zip_cd *cd) +{ + struct zip_cd_ext *ext; + if (cd->zipofst != zip_size_64bit_placeholder) + return NULL; + if (cd->zipcxtl != sizeof(*ext)) + return NULL; + ext=(struct zip_cd_ext *)((unsigned char *)cd+sizeof(*cd)+cd->zipcfnl); + if (ext->tag != zip_extra_header_id_zip64 || ext->size != 8) + return NULL; + return ext; +} + +/** + * @param cd pointer to zip central directory structure + * @return Offset of local file header in zip file. + * Will use ZIP64 data if present. + */ +static long long +binfile_cd_offset(struct zip_cd *cd) +{ + struct zip_cd_ext *ext=binfile_cd_ext(cd); + if (ext) + return ext->zipofst; + else + return cd->zipofst; +} + +static struct zip_lfh * +binfile_read_lfh(struct file *fi, long long offset) +{ + struct zip_lfh *lfh; + + lfh=(struct zip_lfh *)(file_data_read(fi,offset,sizeof(struct zip_lfh))); + if (lfh) { + lfh_to_cpu(lfh); + if (lfh->ziplocsig != zip_lfh_sig) { + file_data_free(fi,(unsigned char *)lfh); + lfh=NULL; + } + } + return lfh; +} + +static unsigned char * +binfile_read_content(struct map_priv *m, struct file *fi, long long offset, struct zip_lfh *lfh) +{ + struct zip_enc *enc; + unsigned char *ret=NULL; + + offset+=sizeof(struct zip_lfh)+lfh->zipfnln; + switch (lfh->zipmthd) { + case 0: + offset+=lfh->zipxtraln; + ret=file_data_read(fi,offset, lfh->zipuncmp); + break; + case 8: + offset+=lfh->zipxtraln; + ret=file_data_read_compressed(fi,offset, lfh->zipsize, lfh->zipuncmp); + break; + case 99: + if (!m->passwd) + break; + enc=(struct zip_enc *)file_data_read(fi, offset, sizeof(*enc)); + offset+=lfh->zipxtraln; + switch (enc->compress_method) { + case 0: + ret=file_data_read_encrypted(fi, offset, lfh->zipsize, lfh->zipuncmp, 0, m->passwd); + break; + case 8: + ret=file_data_read_encrypted(fi, offset, lfh->zipsize, lfh->zipuncmp, 1, m->passwd); + break; + default: + dbg(0,"Unknown encrypted compression method %d\n",enc->compress_method); + } + file_data_free(fi, (unsigned char *)enc); + break; + default: + dbg(0,"Unknown compression method %d\n", lfh->zipmthd); + } + return ret; +} + +static int +binfile_search_cd(struct map_priv *m, int offset, char *name, int partial, int skip) +{ + int size=4096; + int end=m->eoc64?m->eoc64->zip64ecsz:m->eoc->zipecsz; + int len=strlen(name); + long long cdoffset=m->eoc64?m->eoc64->zip64eofst:m->eoc->zipeofst; + struct zip_cd *cd; +#if 0 + dbg(0,"end=%d\n",end); +#endif + while (offset < end) { + cd=(struct zip_cd *)(m->search_data+offset-m->search_offset); + if (! m->search_data || + m->search_offset > offset || + offset-m->search_offset+sizeof(*cd) > m->search_size || + offset-m->search_offset+sizeof(*cd)+cd->zipcfnl+cd->zipcxtl > m->search_size + ) { +#if 0 + dbg(0,"reload %p %d %d\n", m->search_data, m->search_offset, offset); +#endif + if (m->search_data) + file_data_free(m->fi,m->search_data); + m->search_offset=offset; + m->search_size=end-offset; + if (m->search_size > size) + m->search_size=size; + m->search_data=file_data_read(m->fi,cdoffset+m->search_offset,m->search_size); + cd=(struct zip_cd *)m->search_data; + } +#if 0 + dbg(0,"offset=%d search_offset=%d search_size=%d search_data=%p cd=%p\n", offset, m->search_offset, m->search_size, m->search_data, cd); + dbg(0,"offset=%d fn='%s'\n",offset,cd->zipcfn); +#endif + if (!skip && + (partial || cd->zipcfnl == len) && + !strncmp(cd->zipcfn, name, len)) + return offset; + skip=0; + offset+=sizeof(*cd)+cd->zipcfnl+cd->zipcxtl+cd->zipccml; +; + } + return -1; +} + +static void +map_destroy_binfile(struct map_priv *m) +{ + dbg(1,"map_destroy_binfile\n"); + if (m->fi) + map_binfile_close(m); + map_binfile_destroy(m); +} + +static void +binfile_coord_rewind(void *priv_data) +{ + struct map_rect_priv *mr=priv_data; + struct tile *t=mr->t; + t->pos_coord=t->pos_coord_start; +} + +static int +binfile_coord_get(void *priv_data, struct coord *c, int count) +{ + struct map_rect_priv *mr=priv_data; + struct tile *t=mr->t; + int max,ret=0; + max=(t->pos_attr_start-t->pos_coord)/2; + if (count > max) + count=max; +#if __BYTE_ORDER == __LITTLE_ENDIAN + memcpy(c, t->pos_coord, count*sizeof(struct coord)); +#else + { + int i=0,end=count*sizeof(struct coord)/sizeof(int); + int *src=(int *)t->pos_coord; + int *dst=(int *)c; + while (i++ < end) { + *dst++=le32_to_cpu(*src); + src++; + } + } +#endif + t->pos_coord+=count*2; + ret=count; + return ret; +} + +/** + * @brief + * @param + * @return + */ +static void +binfile_attr_rewind(void *priv_data) +{ + struct map_rect_priv *mr=priv_data; + struct tile *t=mr->t; + t->pos_attr=t->pos_attr_start; + mr->label=0; + memset(mr->label_attr, 0, sizeof(mr->label_attr)); + +} + +static char * +binfile_extract(struct map_priv *m, char *dir, char *filename, int partial) +{ + char *full,*fulld,*sep; + unsigned char *start; + int len,offset=m->index_offset; + struct zip_cd *cd; + struct zip_lfh *lfh; + FILE *f; + + for (;;) { + offset=binfile_search_cd(m, offset, filename, partial, 1); + if (offset == -1) + break; + cd=binfile_read_cd(m, offset, -1); + len=strlen(dir)+1+cd->zipcfnl+1; + full=g_malloc(len); + strcpy(full,dir); + strcpy(full+strlen(full),"/"); + strncpy(full+strlen(full),cd->zipcfn,cd->zipcfnl); + full[len-1]='\0'; + fulld=g_strdup(full); + sep=strrchr(fulld, '/'); + if (sep) { + *sep='\0'; + file_mkdir(fulld, 1); + } + if (full[len-2] != '/') { + lfh=binfile_read_lfh(m->fi, binfile_cd_offset(cd)); + start=binfile_read_content(m, m->fi, binfile_cd_offset(cd), lfh); + dbg(0,"fopen '%s'\n", full); + f=fopen(full,"w"); + fwrite(start, lfh->zipuncmp, 1, f); + fclose(f); + file_data_free(m->fi, start); + file_data_free(m->fi, (unsigned char *)lfh); + } + file_data_free(m->fi, (unsigned char *)cd); + g_free(fulld); + g_free(full); + if (! partial) + break; + } + + return g_strdup_printf("%s/%s",dir,filename); +} + +static int +binfile_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + struct map_rect_priv *mr=priv_data; + struct tile *t=mr->t; + enum attr_type type; + int i,size; + + if (attr_type != mr->attr_last) { + t->pos_attr=t->pos_attr_start; + mr->attr_last=attr_type; + } + while (t->pos_attr < t->pos_next) { + size=le32_to_cpu(*(t->pos_attr++)); + type=le32_to_cpu(t->pos_attr[0]); + if (type == attr_label) + mr->label=1; + if (type == attr_house_number) + mr->label_attr[0]=t->pos_attr; + if (type == attr_street_name) + mr->label_attr[1]=t->pos_attr; + if (type == attr_street_name_systematic) + mr->label_attr[2]=t->pos_attr; + if (type == attr_district_name && mr->item.type < type_line) + mr->label_attr[3]=t->pos_attr; + if (type == attr_town_name && mr->item.type < type_line) + mr->label_attr[4]=t->pos_attr; + if (type == attr_type || attr_type == attr_any) { + if (attr_type == attr_any) { + dbg(1,"pos %p attr %s size %d\n", t->pos_attr-1, attr_to_name(type), size); + } + attr->type=type; + if (ATTR_IS_GROUP(type)) { + int i=0; + int *subpos=t->pos_attr+1; + int size_rem=size-1; + i=0; + while (size_rem > 0 && i < 7) { + int subsize=le32_to_cpu(*subpos++); + int subtype=le32_to_cpu(subpos[0]); + mr->attrs[i].type=subtype; + attr_data_set_le(&mr->attrs[i], subpos+1); + subpos+=subsize; + size_rem-=subsize+1; + i++; + } + mr->attrs[i].type=type_none; + mr->attrs[i].u.data=NULL; + attr->u.attrs=mr->attrs; + } else { + attr_data_set_le(attr, t->pos_attr+1); + if (type == attr_url_local) { + g_free(mr->url); + mr->url=binfile_extract(mr->m, mr->m->cachedir, attr->u.str, 1); + attr->u.str=mr->url; + } + if (type == attr_flags && mr->m->map_version < 1) + attr->u.num |= AF_CAR; + } + t->pos_attr+=size; + return 1; + } else { + t->pos_attr+=size; + } + } + if (!mr->label && (attr_type == attr_any || attr_type == attr_label)) { + for (i = 0 ; i < sizeof(mr->label_attr)/sizeof(int *) ; i++) { + if (mr->label_attr[i]) { + mr->label=1; + attr->type=attr_label; + attr_data_set_le(attr,mr->label_attr[i]+1); + return 1; + } + } + } + return 0; +} + +struct binfile_hash_entry { + struct item_id id; + int flags; + int data[0]; +}; + +static guint +binfile_hash_entry_hash(gconstpointer key) +{ + const struct binfile_hash_entry *entry=key; + return (entry->id.id_hi ^ entry->id.id_lo); +} + +static gboolean +binfile_hash_entry_equal(gconstpointer a, gconstpointer b) +{ + const struct binfile_hash_entry *entry1=a,*entry2=b; + return (entry1->id.id_hi==entry2->id.id_hi && entry1->id.id_lo == entry2->id.id_lo); +} + +static int * +binfile_item_dup(struct map_priv *m, struct item *item, struct tile *t, int extend) +{ + int size=le32_to_cpu(t->pos[0]); + struct binfile_hash_entry *entry=g_malloc(sizeof(struct binfile_hash_entry)+(size+1+extend)*sizeof(int)); + void *ret=entry->data; + entry->id.id_hi=item->id_hi; + entry->id.id_lo=item->id_lo; + entry->flags=1; + dbg(0,"id 0x%x,0x%x\n",entry->id.id_hi,entry->id.id_lo); + + memcpy(ret, t->pos, (size+1)*sizeof(int)); + if (!m->changes) + m->changes=g_hash_table_new_full(binfile_hash_entry_hash, binfile_hash_entry_equal, g_free, NULL); + g_hash_table_replace(m->changes, entry, entry); + dbg(0,"ret %p\n",ret); + return ret; +} + +static int +binfile_coord_set(void *priv_data, struct coord *c, int count, enum change_mode mode) +{ + struct map_rect_priv *mr=priv_data; + struct tile *t=mr->t,*tn,new; + int i,delta,move_len; + int write_offset,move_offset,aoffset,coffset,clen; + int *data; + + { + int *i=t->pos,j=0; + dbg(0,"Before: pos_coord=%d\n",t->pos_coord-i); + while (i < t->pos_next) + dbg(0,"%d:0x%x\n",j++,*i++); + + } + aoffset=t->pos_attr-t->pos_attr_start; + coffset=t->pos_coord-t->pos_coord_start-2; + clen=t->pos_attr_start-t->pos_coord+2; + dbg(0,"coffset=%d clen=%d\n",coffset,clen); + switch (mode) { + case change_mode_delete: + if (count*2 > clen) + count=clen/2; + delta=-count*2; + move_offset=coffset+count*2; + move_len=t->pos_next-t->pos_coord_start-move_offset; + write_offset=0; + break; + case change_mode_modify: + write_offset=coffset; + if (count*2 > clen) { + delta=count*2-clen; + move_offset=t->pos_attr_start-t->pos_coord_start; + move_len=t->pos_next-t->pos_coord_start-move_offset; + } else { + move_len=0; + move_offset=0; + delta=0; + } + break; + case change_mode_prepend: + delta=count*2; + move_offset=coffset-2; + move_len=t->pos_next-t->pos_coord_start-move_offset; + write_offset=coffset-2; + break; + case change_mode_append: + delta=count*2; + move_offset=coffset; + move_len=t->pos_next-t->pos_coord_start-move_offset; + write_offset=coffset; + break; + default: + return 0; + } + dbg(0,"delta %d\n",delta); + data=binfile_item_dup(mr->m, &mr->item, t, delta > 0 ? delta:0); + data[0]=cpu_to_le32(le32_to_cpu(data[0])+delta); + data[2]=cpu_to_le32(le32_to_cpu(data[2])+delta); + new.pos=new.start=data; + new.zipfile_num=t->zipfile_num; + new.mode=2; + push_tile(mr, &new, 0, 0); + setup_pos(mr); + tn=mr->t; + tn->pos_coord=tn->pos_coord_start+coffset; + tn->pos_attr=tn->pos_attr_start+aoffset; + dbg(0,"moving %d ints from offset %d to %d\n",move_len,tn->pos_coord_start+move_offset-data,tn->pos_coord_start+move_offset+delta-data); + memmove(tn->pos_coord_start+move_offset+delta, tn->pos_coord_start+move_offset, move_len*4); + { + int *i=tn->pos,j=0; + dbg(0,"After move: pos_coord=%d\n",tn->pos_coord-i); + while (i < tn->pos_next) + dbg(0,"%d:0x%x\n",j++,*i++); + } + if (mode != change_mode_append) + tn->pos_coord+=move_offset; + if (mode != change_mode_delete) { + dbg(0,"writing %d ints at offset %d\n",count*2,write_offset+tn->pos_coord_start-data); + for (i = 0 ; i < count ; i++) { + tn->pos_coord_start[write_offset++]=c[i].x; + tn->pos_coord_start[write_offset++]=c[i].y; + } + + } + { + int *i=tn->pos,j=0; + dbg(0,"After: pos_coord=%d\n",tn->pos_coord-i); + while (i < tn->pos_next) + dbg(0,"%d:0x%x\n",j++,*i++); + } + return 1; +} + +static int +binfile_attr_set(void *priv_data, struct attr *attr, enum change_mode mode) +{ + struct map_rect_priv *mr=priv_data; + struct tile *t=mr->t,*tn,new; + int offset,delta,move_len; + int write_offset,move_offset,naoffset,coffset,oattr_len; + int nattr_size,nattr_len,pad; + int *data; + + { + int *i=t->pos,j=0; + dbg(0,"Before: pos_attr=%d\n",t->pos_attr-i); + while (i < t->pos_next) + dbg(0,"%d:0x%x\n",j++,*i++); + + } + + write_offset=0; + naoffset=t->pos_attr-t->pos_attr_start; + coffset=t->pos_coord-t->pos_coord_start; + offset=0; + oattr_len=0; + if (!naoffset) { + if (mode == change_mode_delete || mode == change_mode_modify) { + dbg(0,"no attribute selected\n"); + return 0; + } + if (mode == change_mode_append) + naoffset=t->pos_next-t->pos_attr_start; + } + while (offset < naoffset) { + oattr_len=le32_to_cpu(t->pos_attr_start[offset])+1; + dbg(0,"len %d\n",oattr_len); + write_offset=offset; + offset+=oattr_len; + } + move_len=t->pos_next-t->pos_attr_start-offset; + move_offset=offset; + switch (mode) { + case change_mode_delete: + nattr_size=0; + nattr_len=0; + pad=0; + break; + case change_mode_modify: + case change_mode_prepend: + case change_mode_append: + nattr_size=attr_data_size(attr); + pad=(4-(nattr_size%4))%4; + nattr_len=(nattr_size+pad)/4+2; + if (mode == change_mode_prepend) { + move_offset=write_offset; + move_len+=oattr_len; + } + if (mode == change_mode_append) { + write_offset=move_offset; + } + break; + default: + return 0; + } + if (mode == change_mode_delete || mode == change_mode_modify) + delta=nattr_len-oattr_len; + else + delta=nattr_len; + dbg(0,"delta %d oattr_len %d nattr_len %d\n",delta,oattr_len, nattr_len); + data=binfile_item_dup(mr->m, &mr->item, t, delta > 0 ? delta:0); + data[0]=cpu_to_le32(le32_to_cpu(data[0])+delta); + new.pos=new.start=data; + new.zipfile_num=t->zipfile_num; + new.mode=2; + push_tile(mr, &new, 0, 0); + setup_pos(mr); + tn=mr->t; + tn->pos_coord=tn->pos_coord_start+coffset; + tn->pos_attr=tn->pos_attr_start+offset; + dbg(0,"attr start %d offset %d\n",tn->pos_attr_start-data,offset); + dbg(0,"moving %d ints from offset %d to %d\n",move_len,tn->pos_attr_start+move_offset-data,tn->pos_attr_start+move_offset+delta-data); + memmove(tn->pos_attr_start+move_offset+delta, tn->pos_attr_start+move_offset, move_len*4); + if (mode != change_mode_append) + tn->pos_attr+=delta; + { + int *i=tn->pos,j=0; + dbg(0,"After move: pos_attr=%d\n",tn->pos_attr-i); + while (i < tn->pos_next) + dbg(0,"%d:0x%x\n",j++,*i++); + } + if (nattr_len) { + int *nattr=tn->pos_attr_start+write_offset; + dbg(0,"writing %d ints at %d\n",nattr_len,nattr-data); + nattr[0]=cpu_to_le32(nattr_len-1); + nattr[1]=cpu_to_le32(attr->type); + memcpy(nattr+2, attr_data_get(attr), nattr_size); + memset((unsigned char *)(nattr+2)+nattr_size, 0, pad); + } + { + int *i=tn->pos,j=0; + dbg(0,"After: pos_attr=%d\n",tn->pos_attr-i); + while (i < tn->pos_next) + dbg(0,"%d:0x%x\n",j++,*i++); + } + return 1; +} + +static struct item_methods methods_binfile = { + binfile_coord_rewind, + binfile_coord_get, + binfile_attr_rewind, + binfile_attr_get, + NULL, + binfile_attr_set, + binfile_coord_set, +}; + +static void +push_tile(struct map_rect_priv *mr, struct tile *t, int offset, int length) +{ + dbg_assert(mr->tile_depth < 8); + mr->t=&mr->tiles[mr->tile_depth++]; + *(mr->t)=*t; + mr->t->pos=mr->t->pos_next=mr->t->start+offset; + if (length == -1) + length=le32_to_cpu(mr->t->pos[0])+1; + if (length > 0) + mr->t->end=mr->t->pos+length; +} + +static int +pop_tile(struct map_rect_priv *mr) +{ + if (mr->tile_depth <= 1) + return 0; + if (mr->t->mode < 2) + file_data_free(mr->m->fi, (unsigned char *)(mr->t->start)); +#ifdef DEBUG_SIZE +#if DEBUG_SIZE > 0 + dbg(0,"leave %d\n",mr->t->zipfile_num); +#endif +#endif + mr->t=&mr->tiles[--mr->tile_depth-1]; + return 1; +} + + +static int +zipfile_to_tile(struct map_priv *m, struct zip_cd *cd, struct tile *t) +{ + char buffer[1024]; + struct zip_lfh *lfh; + char *zipfn; + struct file *fi; + dbg(1,"enter %p %p %p\n", m, cd, t); + dbg(1,"cd->zipofst=0x%Lx\n", binfile_cd_offset(cd)); + t->start=NULL; + t->mode=1; + if (m->fis) + fi=m->fis[cd->zipdsk]; + else + fi=m->fi; + lfh=binfile_read_lfh(fi, binfile_cd_offset(cd)); + zipfn=(char *)(file_data_read(fi,binfile_cd_offset(cd)+sizeof(struct zip_lfh), lfh->zipfnln)); + strncpy(buffer, zipfn, lfh->zipfnln); + buffer[lfh->zipfnln]='\0'; + t->start=(int *)binfile_read_content(m, fi, binfile_cd_offset(cd), lfh); + t->end=t->start+lfh->zipuncmp/4; + t->fi=fi; + dbg(1,"0x%x '%s' %d %d,%d\n", lfh->ziplocsig, buffer, sizeof(*cd)+cd->zipcfnl, lfh->zipsize, lfh->zipuncmp); + file_data_free(fi, (unsigned char *)zipfn); + file_data_free(fi, (unsigned char *)lfh); + return t->start != NULL; +} + + +static int +map_binfile_handle_redirect(struct map_priv *m) +{ + char *location=file_http_header(m->http, "location"); + if (!location) { + m->redirect=0; + return 0; + } + if (m->redirect) + return 0; + m->redirect=1; + dbg(0,"redirected from %s to %s\n",m->url,location); + g_free(m->url); + m->url=g_strdup(location); + file_destroy(m->http); + m->http=NULL; + + return 1; +} + +static int +map_binfile_http_request(struct map_priv *m, struct attr **attrs) +{ + if (!m->http) { + m->http=file_create(NULL, attrs); + } else { + file_request(m->http, attrs); + } + return 1; +} + + +static long long +map_binfile_download_size(struct map_priv *m) +{ + struct attr url={attr_url}; + struct attr http_method={attr_http_method}; + struct attr persistent={attr_persistent}; + struct attr *attrs[4]; + int size_ret; + long long ret; + void *data; + + do { + attrs[0]=&url; + url.u.str=m->url; + attrs[1]=&http_method; + http_method.u.str="HEAD"; + persistent.u.num=1; + attrs[2]=&persistent; + attrs[3]=NULL; + + map_binfile_http_request(m, attrs); + data=file_data_read_special(m->http, 0, &size_ret); + g_free(data); + if (size_ret < 0) + return 0; + } while (map_binfile_handle_redirect(m)); + + ret=file_size(m->http); + dbg(1,"file size "LONGLONG_FMT"\n",ret); + return ret; +} + + +static int +map_binfile_http_close(struct map_priv *m) +{ + if (m->http) { + file_destroy(m->http); + m->http=NULL; + } + return 1; +} + + +static struct file * +map_binfile_http_range(struct map_priv *m, long long offset, int size) +{ + struct attr *attrs[4]; + struct attr url={attr_url}; + struct attr http_header={attr_http_header}; + struct attr persistent={attr_persistent}; + + persistent.u.num=1; + attrs[0]=&url; + attrs[1]=&http_header; + attrs[2]=&persistent; + attrs[3]=NULL; + + url.u.str=m->url; + http_header.u.str=g_strdup_printf("Range: bytes="LONGLONG_FMT"-"LONGLONG_FMT,offset, offset+size-1); + map_binfile_http_request(m, attrs); + g_free(http_header.u.str); + return m->http; +} + +static unsigned char * +map_binfile_download_range(struct map_priv *m, long long offset, int size) +{ + unsigned char *ret; + int size_ret; + struct file *http=map_binfile_http_range(m, offset, size); + + ret=file_data_read_special(http, size, &size_ret); + if (size_ret != size) { + dbg(0,"size %d vs %d\n",size,size_ret); + g_free(ret); + return NULL; + } + return ret; +} + +static struct zip_cd * +download_cd(struct map_download *download) +{ + struct map_priv *m=download->m; + struct zip64_eoc *zip64_eoc=(struct zip64_eoc *)file_data_read(m->fi, 0, sizeof(*zip64_eoc)); + struct zip_cd *cd=(struct zip_cd *)map_binfile_download_range(m, zip64_eoc->zip64eofst+download->zipfile*m->cde_size,m->cde_size); + file_data_free(m->fi, (unsigned char *)zip64_eoc); + dbg(0,"needed cd, result %p\n",cd); + return cd; +} + +static int +download_request(struct map_download *download) +{ + struct attr url={attr_url}; + struct attr http_header={attr_http_header}; + struct attr persistent={attr_persistent}; + struct attr *attrs[4]; + + if(!download->m->download_enabled) + { + dbg(0,"Tried downloading while it's not allowed\n"); + return 0; + } + attrs[0]=&url; + persistent.u.num=1; + attrs[1]=&persistent; + attrs[2]=NULL; + if (strchr(download->m->url,'?')) { + url.u.str=g_strdup_printf("%smemberid=%d",download->m->url,download->zipfile); + download->dl_size=-1; + } else { + long long offset=binfile_cd_offset(download->cd_copy); + int size=download->cd_copy->zipcsiz+sizeof(struct zip_lfh)+download->cd_copy->zipcfnl; + url.u.str=g_strdup(download->m->url); + http_header.u.str=g_strdup_printf("Range: bytes="LONGLONG_FMT"-"LONGLONG_FMT,offset,offset+size-1); + attrs[2]=&http_header; + attrs[3]=NULL; + download->dl_size=size; + } + dbg(0,"encountered missing tile %d %s(%s), Downloading %d bytes at "LONGLONG_FMT"\n",download->zipfile, url.u.str,(char *)(download->cd_copy+1), download->dl_size, download->offset); + map_binfile_http_request(download->m, attrs); + g_free(url.u.str); + download->http=download->m->http; + return 1; +} + + +static int +download_start(struct map_download *download) +{ + long long offset; + struct zip_eoc *eoc; + + if (!download->cd->zipcensig) { + download->cd_copy=download_cd(download); + } else { + download->cd_copy=g_malloc(download->m->cde_size); + memcpy(download->cd_copy, download->cd, download->m->cde_size); + } + file_data_remove(download->file, (unsigned char *)download->cd); + download->cd=NULL; + offset=file_size(download->file); + offset-=sizeof(struct zip_eoc); + eoc=(struct zip_eoc *)file_data_read(download->file, offset, sizeof(struct zip_eoc)); + download->zip_eoc=g_malloc(sizeof(struct zip_eoc)); + memcpy(download->zip_eoc, eoc, sizeof(struct zip_eoc)); + file_data_remove(download->file, (unsigned char *)eoc); + download->start_offset=download->offset=offset; + return download_request(download); +} + +static int +download_download(struct map_download *download) +{ + int size=64*1024,size_ret; + unsigned char *data; + if (download->dl_size != -1 && size > download->dl_size) + size=download->dl_size; + if (!size) + return 1; + data=file_data_read_special(download->http, size, &size_ret); + if (!download->read && download->m->http && map_binfile_handle_redirect(download->m)) { + g_free(data); + download_request(download); + return 0; + } + + dbg(1,"got %d bytes writing at offset "LONGLONG_FMT"\n",size_ret,download->offset); + if (size_ret <= 0) { + g_free(data); + return 1; + } + file_data_write(download->file, download->offset, size_ret, data); + download->offset+=size_ret; + download->read+=size_ret; + download->dl_size-=size_ret; + if (download->dl_size != -1) + download->progress=download->read*100/(download->read+download->dl_size); + return 0; +} + +static int +download_finish(struct map_download *download) +{ + struct zip_lfh *lfh; + char *lfh_filename; + struct zip_cd_ext *ext; + long long lfh_offset; + file_data_write(download->file, download->offset, sizeof(struct zip_eoc), (void *)download->zip_eoc); + lfh=(struct zip_lfh *)(file_data_read(download->file,download->start_offset, sizeof(struct zip_lfh))); + ext=binfile_cd_ext(download->cd_copy); + if (ext) + ext->zipofst=download->start_offset; + else + download->cd_copy->zipofst=download->start_offset; + download->cd_copy->zipcsiz=lfh->zipsize; + download->cd_copy->zipcunc=lfh->zipuncmp; + download->cd_copy->zipccrc=lfh->zipcrc; + lfh_offset = binfile_cd_offset(download->cd_copy)+sizeof(struct zip_lfh); + lfh_filename=(char *)file_data_read(download->file,lfh_offset,lfh->zipfnln); + memcpy(download->cd_copy+1,lfh_filename,lfh->zipfnln); + file_data_remove(download->file,(void *)lfh_filename); + file_data_remove(download->file,(void *)lfh); + file_data_write(download->file, download->m->eoc->zipeofst + download->zipfile*download->m->cde_size, binfile_cd_extra(download->cd_copy)+sizeof(struct zip_cd), (void *)download->cd_copy); + file_data_flush(download->file, download->m->eoc->zipeofst + download->zipfile*download->m->cde_size, sizeof(struct zip_cd)); + + g_free(download->cd_copy); + download->cd=(struct zip_cd *)(file_data_read(download->file, download->m->eoc->zipeofst + download->zipfile*download->m->cde_size, download->m->cde_size)); + cd_to_cpu(download->cd); + dbg(1,"Offset %d\n",download->cd->zipofst); + return 1; +} + +static int +download_planet_size(struct map_download *download) +{ + download->size=map_binfile_download_size(download->m); + dbg(0,"Planet size "LONGLONG_FMT"\n",download->size); + if (!download->size) + return 0; + return 1; +} + +static int +download_eoc(struct map_download *download) +{ + download->zip64_eoc=(struct zip64_eoc *)map_binfile_download_range(download->m, download->size-98, 98); + if (!download->zip64_eoc) + return 0; + download->zip64_eocl=(struct zip64_eocl *)(download->zip64_eoc+1); + download->zip_eoc=(struct zip_eoc *)(download->zip64_eocl+1); + if (download->zip64_eoc->zip64esig != zip64_eoc_sig || download->zip64_eocl->zip64lsig != zip64_eocl_sig || download->zip_eoc->zipesig != zip_eoc_sig) + { + dbg(0,"wrong signature on zip64_eoc downloaded from "LONGLONG_FMT"\n",download->size-98); + g_free(download->zip64_eoc); + return 0; + } + return 1; +} + +static int +download_directory_start(struct map_download *download) +{ + download->http=map_binfile_http_range(download->m, download->zip64_eoc->zip64eofst, download->zip64_eoc->zip64ecsz); + if (!download->http) + return 0; + return 1; +} + +static int +download_directory_do(struct map_download *download) +{ + int count; + + for (count = 0 ; count < 100 ; count++) { + int cd_xlen, size_ret; + unsigned char *cd_data; + struct zip_cd *cd; + cd=(struct zip_cd *)file_data_read_special(download->http, sizeof(*cd), &size_ret); + cd->zipcunc=0; + dbg(1,"size_ret=%d\n",size_ret); + if (!size_ret) + return 0; + if (size_ret != sizeof(*cd) || cd->zipcensig != zip_cd_sig) { + dbg(0,"error1 size=%d vs %d\n",size_ret, sizeof(*cd)); + return 0; + } + file_data_write(download->file, download->offset, sizeof(*cd), (unsigned char *)cd); + download->offset+=sizeof(*cd); + cd_xlen=cd->zipcfnl+cd->zipcxtl; + cd_data=file_data_read_special(download->http, cd_xlen, &size_ret); + if (size_ret != cd_xlen) { + dbg(0,"error2 size=%d vs %d\n",size_ret,cd_xlen); + return 0; + } + file_data_write(download->file, download->offset, cd_xlen, cd_data); + download->offset+=cd_xlen; + g_free(cd); + g_free(cd_data); + } + return 1; +} + +static int +download_directory_finish(struct map_download *download) +{ + download->http=NULL; + return 1; +} + +static int +download_initial_finish(struct map_download *download) +{ + download->zip64_eoc->zip64eofst=download->cd1offset; + download->zip64_eocl->zip64lofst=download->offset; + download->zip_eoc->zipeofst=download->cd1offset; +#if 0 + file_data_write(download->file, download->offset, sizeof(*download->zip64_eoc), (unsigned char *)download->zip64_eoc); + download->offset+=sizeof(*download->zip64_eoc); + file_data_write(download->file, download->offset, sizeof(*download->zip64_eocl), (unsigned char *)download->zip64_eocl); + download->offset+=sizeof(*download->zip64_eocl); +#endif + file_data_write(download->file, download->offset, sizeof(*download->zip_eoc), (unsigned char *)download->zip_eoc); + download->offset+=sizeof(*download->zip_eoc); + g_free(download->zip64_eoc); + download->zip64_eoc=NULL; + return 1; +} + +static void +push_zipfile_tile_do(struct map_rect_priv *mr, struct zip_cd *cd, int zipfile, int offset, int length) + +{ + struct tile t; + struct map_priv *m=mr->m; + struct file *f=m->fi; + + dbg(1,"enter %p %d\n", mr, zipfile); +#ifdef DEBUG_SIZE +#if DEBUG_SIZE > 0 + { + char filename[cd->zipcfnl+1]; + memcpy(filename, cd+1, cd->zipcfnl); + filename[cd->zipcfnl]='\0'; + dbg(0,"enter %d (%s) %d\n",zipfile, filename, cd->zipcunc); + } +#endif + mr->size+=cd->zipcunc; +#endif + t.zipfile_num=zipfile; + if (zipfile_to_tile(m, cd, &t)) + push_tile(mr, &t, offset, length); + file_data_free(f, (unsigned char *)cd); +} + + +static struct zip_cd * +download(struct map_priv *m, struct map_rect_priv *mr, struct zip_cd *cd, int zipfile, int offset, int length, int async) +{ + struct map_download *download; + + if(!m->download_enabled) + return NULL; + + if (async == 2) { + download=m->download; + } else { + download=g_new0(struct map_download, 1); + if (mr) { + download->m=m; + download->mr=mr; + download->file=m->fi; + download->cd=cd; + download->zipfile=zipfile; + download->toffset=offset; + download->tlength=length; + download->state=1; + } else { + struct attr readwrite={attr_readwrite,{(void *)1}}; + struct attr create={attr_create,{(void *)1}}; + struct attr *attrs[3]; + attrs[0]=&readwrite; + attrs[1]=&create; + attrs[2]=NULL; + download->file=file_create(m->filename,attrs); + download->m=m; + download->state=4; + } + } + if (async == 1) { + m->download=download; + g_free(m->progress); + if (download->mr) + m->progress=g_strdup_printf("Download Tile %d 0%%",download->zipfile); + else + m->progress=g_strdup_printf("Download Map Information 0%%"); + callback_list_call_attr_0(m->cbl, attr_progress); + return NULL; + } + for (;;) { + dbg(0,"state=%d\n",download->state); + switch (download->state) { + case 0: + dbg(0,"error\n"); + break; + case 1: + if (download_start(download)) + download->state=2; + else + download->state=0; + break; + case 2: + if (download_download(download)) + download->state=3; + else { + g_free(m->progress); + m->progress=g_strdup_printf("Download Tile %d %d%%",download->zipfile,download->progress); + callback_list_call_attr_0(m->cbl, attr_progress); + } + break; + case 3: + if (download_finish(download)) { + struct zip_cd *ret; + g_free(m->progress); + m->progress=g_strdup_printf("Download Tile %d 100%%",download->zipfile); + callback_list_call_attr_0(m->cbl, attr_progress); + if (async) { + push_zipfile_tile_do(download->mr, download->cd, download->zipfile, download->toffset, download->tlength); + ret=NULL; + } else + ret=download->cd; + g_free(m->progress); + m->progress=NULL; + g_free(download); + if (async) + m->download=NULL; + return ret; + } else + download->state=0; + break; + case 4: + if (download_planet_size(download)) + download->state=5; + else + download->state=0; + break; + case 5: + g_free(m->progress); + m->progress=g_strdup_printf("Download Map Information 50%%"); + callback_list_call_attr_0(m->cbl, attr_progress); + if (download_eoc(download)) + download->state=6; + else { + dbg(0,"download of eoc failed\n"); + download->state=0; + } + break; + case 6: + g_free(m->progress); + m->progress=g_strdup_printf("Download Map Information 100%%"); + callback_list_call_attr_0(m->cbl, attr_progress); + if (download_directory_start(download)) + download->state=7; + else + download->state=0; + break; + case 7: + g_free(m->progress); + m->progress=g_strdup_printf("Download Map Directory %d%%",(int)(download->offset*100/download->zip64_eoc->zip64ecsz)); + callback_list_call_attr_0(m->cbl, attr_progress); + if (!download_directory_do(download)) + download->state=8; + break; + case 8: + if (download_directory_finish(download)) + download->state=9; + else + download->state=0; + break; + case 9: + download_initial_finish(download); + m->fi=download->file; + g_free(m->progress); + m->progress=NULL; + g_free(download); + if (async) + m->download=NULL; + map_binfile_open(m); + break; + } + if (async) + return NULL; + } +} + +static int +push_zipfile_tile(struct map_rect_priv *mr, int zipfile, int offset, int length, int async) +{ + struct map_priv *m=mr->m; + struct file *f=m->fi; + long long cdoffset=m->eoc64?m->eoc64->zip64eofst:m->eoc->zipeofst; + struct zip_cd *cd=(struct zip_cd *)(file_data_read(f, cdoffset + zipfile*m->cde_size, m->cde_size)); + dbg(1,"read from "LONGLONG_FMT" %d bytes\n",cdoffset + zipfile*m->cde_size, m->cde_size); + cd_to_cpu(cd); + if (!cd->zipcunc && m->url) { + cd=download(m, mr, cd, zipfile, offset, length, async); + if (!cd) + return 1; + } + push_zipfile_tile_do(mr, cd, zipfile, offset, length); + return 0; +} + +static struct map_rect_priv * +map_rect_new_binfile_int(struct map_priv *map, struct map_selection *sel) +{ + struct map_rect_priv *mr; + + binfile_check_version(map); + dbg(1,"map_rect_new_binfile\n"); + if (!map->fi && !map->url) + return NULL; + map_binfile_http_close(map); + mr=g_new0(struct map_rect_priv, 1); + mr->m=map; + mr->sel=sel; + mr->item.id_hi=0; + mr->item.id_lo=0; + mr->item.meth=&methods_binfile; + mr->item.priv_data=mr; + return mr; +} + +static void +tile_bbox(char *tile, int len, struct coord_rect *r) +{ + struct coord c; + int overlap=1; + int xo,yo; + struct coord_rect world_bbox = { + { -20000000, 20000000}, /* lu */ + { 20000000, -20000000}, /* rl */ + }; + *r=world_bbox; + while (len) { + c.x=(r->lu.x+r->rl.x)/2; + c.y=(r->lu.y+r->rl.y)/2; + xo=(r->rl.x-r->lu.x)*overlap/100; + yo=(r->lu.y-r->rl.y)*overlap/100; + switch (*tile) { + case 'a': + r->lu.x=c.x-xo; + r->rl.y=c.y-yo; + break; + case 'b': + r->rl.x=c.x+xo; + r->rl.y=c.y-yo; + break; + case 'c': + r->lu.x=c.x-xo; + r->lu.y=c.y+yo; + break; + case 'd': + r->rl.x=c.x+xo; + r->lu.y=c.y+yo; + break; + default: + return; + } + tile++; + len--; + } +} + +static int +map_download_selection_check(struct zip_cd *cd, struct map_selection *sel) +{ + struct coord_rect cd_rect; + if (cd->zipcunc) + return 0; + tile_bbox((char *)(cd+1), cd->zipcfnl, &cd_rect); + while (sel) { + if (coord_rect_overlap(&cd_rect, &sel->u.c_rect)) + return 1; + sel=sel->next; + } + return 0; +} + +static void +map_download_selection(struct map_priv *m, struct map_rect_priv *mr, struct map_selection *sel) +{ + int i; + struct zip_cd *cd; + for (i = 0 ; i < m->zip_members ; i++) { + cd=binfile_read_cd(m, m->cde_size*i, -1); + if (map_download_selection_check(cd, sel)) + download(m, mr, cd, i, 0, 0, 0); + file_data_free(m->fi, (unsigned char *)cd); + } +} + +static struct map_rect_priv * +map_rect_new_binfile(struct map_priv *map, struct map_selection *sel) +{ + struct map_rect_priv *mr=map_rect_new_binfile_int(map, sel); + struct tile t; + dbg(1,"zip_members=%d\n", map->zip_members); + if (map->url && map->fi && sel && sel->order == 255) { + map_download_selection(map, mr, sel); + } + if (map->eoc) + mr->status=1; + else { + unsigned char *d; + if (map->fi) { + d=file_data_read(map->fi, 0, map->fi->size); + t.start=(int *)d; + t.end=(int *)(d+map->fi->size); + t.fi=map->fi; + t.zipfile_num=0; + t.mode=0; + push_tile(mr, &t, 0, 0); + } else if (map->url && !map->download) { + download(map, NULL, NULL, 0, 0, 0, 1); + mr->status=1; + } + } + return mr; +} + +static void +write_changes_do(gpointer key, gpointer value, gpointer user_data) +{ + struct binfile_hash_entry *entry=key; + FILE *out=user_data; + if (entry->flags) { + entry->flags=0; + fwrite(entry, sizeof(*entry)+(le32_to_cpu(entry->data[0])+1)*4, 1, out); + dbg(0,"yes\n"); + } +} + +static void +write_changes(struct map_priv *m) +{ + FILE *changes; + char *changes_file; + if (!m->changes) + return; + changes_file=g_strdup_printf("%s.log",m->filename); + changes=fopen(changes_file,"ab"); + g_hash_table_foreach(m->changes, write_changes_do, changes); + fclose(changes); + g_free(changes_file); +} + +static void +load_changes(struct map_priv *m) +{ + FILE *changes; + char *changes_file; + struct binfile_hash_entry entry,*e; + int size; + changes_file=g_strdup_printf("%s.log",m->filename); + changes=fopen(changes_file,"rb"); + if (! changes) { + g_free(changes_file); + return; + } + m->changes=g_hash_table_new_full(binfile_hash_entry_hash, binfile_hash_entry_equal, g_free, NULL); + while (fread(&entry, sizeof(entry), 1, changes) == 1) { + if (fread(&size, sizeof(size), 1, changes) != 1) + break; + e=g_malloc(sizeof(struct binfile_hash_entry)+(le32_to_cpu(size)+1)*4); + *e=entry; + e->data[0]=size; + if (fread(e->data+1, le32_to_cpu(size)*4, 1, changes) != 1) + break; + g_hash_table_replace(m->changes, e, e); + } + fclose(changes); + g_free(changes_file); +} + + +static void +map_rect_destroy_binfile(struct map_rect_priv *mr) +{ + write_changes(mr->m); + while (pop_tile(mr)); +#ifdef DEBUG_SIZE + dbg(0,"size=%d kb\n",mr->size/1024); +#endif + if (mr->tiles[0].fi && mr->tiles[0].start) + file_data_free(mr->tiles[0].fi, (unsigned char *)(mr->tiles[0].start)); + g_free(mr->url); + map_binfile_http_close(mr->m); + g_free(mr); +} + +static void +setup_pos(struct map_rect_priv *mr) +{ + int size,coord_size; + struct tile *t=mr->t; + size=le32_to_cpu(t->pos[0]); + if (size > 1024*1024 || size < 0) { + dbg(0,"size=0x%x\n", size); +#if 0 + fprintf(stderr,"offset=%d\n", (unsigned char *)(mr->pos)-mr->m->f->begin); +#endif + dbg(0,"size error\n"); + } + t->pos_next=t->pos+size+1; + mr->item.type=le32_to_cpu(t->pos[1]); + coord_size=le32_to_cpu(t->pos[2]); + t->pos_coord_start=t->pos+3; + t->pos_attr_start=t->pos_coord_start+coord_size; +} + +static int +selection_contains(struct map_selection *sel, struct coord_rect *r, struct range *mima) +{ + int order; + if (! sel) + return 1; + while (sel) { + if (coord_rect_overlap(r, &sel->u.c_rect)) { + order=sel->order; + dbg(1,"min %d max %d order %d\n", mima->min, mima->max, order); + if (!mima->min && !mima->max) + return 1; + if (order >= mima->min && order <= mima->max) + return 1; + } + sel=sel->next; + } + return 0; +} + +static void +map_parse_country_binfile(struct map_rect_priv *mr) +{ + struct attr at; + if (binfile_attr_get(mr->item.priv_data, attr_country_id, &at)) { + if (at.u.num == mr->country_id) + { + if (binfile_attr_get(mr->item.priv_data, attr_zipfile_ref, &at)) + { + push_zipfile_tile(mr, at.u.num, 0, 0, 0); + } + } + } +} + +static int +map_parse_submap(struct map_rect_priv *mr, int async) +{ + struct coord_rect r; + struct coord c[2]; + struct attr at; + struct range mima; + if (binfile_coord_get(mr->item.priv_data, c, 2) != 2) + return 0; + r.lu.x=c[0].x; + r.lu.y=c[1].y; + r.rl.x=c[1].x; + r.rl.y=c[0].y; + if (!binfile_attr_get(mr->item.priv_data, attr_order, &at)) + return 0; +#if __BYTE_ORDER == __BIG_ENDIAN + mima.min=le16_to_cpu(at.u.range.max); + mima.max=le16_to_cpu(at.u.range.min); +#else + mima=at.u.range; +#endif + if (!mr->m->eoc || !selection_contains(mr->sel, &r, &mima)) + return 0; + if (!binfile_attr_get(mr->item.priv_data, attr_zipfile_ref, &at)) + return 0; + dbg(1,"pushing zipfile %d from %d\n", at.u.num, mr->t->zipfile_num); + return push_zipfile_tile(mr, at.u.num, 0, 0, async); +} + +static int +push_modified_item(struct map_rect_priv *mr) +{ + struct item_id id; + struct binfile_hash_entry *entry; + id.id_hi=mr->item.id_hi; + id.id_lo=mr->item.id_lo; + entry=g_hash_table_lookup(mr->m->changes, &id); + if (entry) { + struct tile tn; + tn.pos_next=tn.pos=tn.start=entry->data; + tn.zipfile_num=mr->item.id_hi; + tn.mode=2; + tn.end=tn.start+le32_to_cpu(entry->data[0])+1; + push_tile(mr, &tn, 0, 0); + return 1; + } + return 0; +} + +static struct item * +map_rect_get_item_binfile(struct map_rect_priv *mr) +{ + struct tile *t; + struct map_priv *m=mr->m; + if (m->download) { + download(m, NULL, NULL, 0, 0, 0, 2); + return &busy_item; + } + if (mr->status == 1) { + mr->status=0; + if (push_zipfile_tile(mr, m->zip_members-1, 0, 0, 1)) + return &busy_item; + } + for (;;) { + t=mr->t; + if (! t) + return NULL; + t->pos=t->pos_next; + if (t->pos >= t->end) { + if (pop_tile(mr)) + continue; + return NULL; + } + setup_pos(mr); + binfile_coord_rewind(mr); + binfile_attr_rewind(mr); + if ((mr->item.type == type_submap) && (!mr->country_id)) { + if (map_parse_submap(mr, 1)) + return &busy_item; + continue; + } + if (t->mode != 2) { + mr->item.id_hi=t->zipfile_num; + mr->item.id_lo=t->pos-t->start; + if (mr->m->changes && push_modified_item(mr)) + continue; + } + if (mr->country_id) + { + if (mr->item.type == type_countryindex) { + map_parse_country_binfile(mr); + } + if (item_is_town(mr->item)) + { + return &mr->item; + } else { + continue; + } + } + return &mr->item; + } +} + +static struct item * +map_rect_get_item_byid_binfile(struct map_rect_priv *mr, int id_hi, int id_lo) +{ + struct tile *t; + if (mr->m->eoc) { + while (pop_tile(mr)); + push_zipfile_tile(mr, id_hi, 0, 0, 0); + } + t=mr->t; + t->pos=t->start+id_lo; + mr->item.id_hi=id_hi; + mr->item.id_lo=id_lo; + if (mr->m->changes) + push_modified_item(mr); + setup_pos(mr); + binfile_coord_rewind(mr); + binfile_attr_rewind(mr); + return &mr->item; +} + +static int +binmap_search_by_index(struct map_priv *map, struct item *item, struct map_rect_priv **ret) +{ + struct attr zipfile_ref; + int *data; + + if (!item) { + *ret=NULL; + return 0; + } + if (item_attr_get(item, attr_item_id, &zipfile_ref)) { + data=zipfile_ref.u.data; + *ret=map_rect_new_binfile_int(map, NULL); + push_zipfile_tile(*ret, le32_to_cpu(data[0]), le32_to_cpu(data[1]), -1, 0); + return 3; + } + if (item_attr_get(item, attr_zipfile_ref, &zipfile_ref)) { + *ret=map_rect_new_binfile_int(map, NULL); + push_zipfile_tile(*ret, zipfile_ref.u.num, 0, 0, 0); + return 1; + } + if (item_attr_get(item, attr_zipfile_ref_block, &zipfile_ref)) { + data=zipfile_ref.u.data; + *ret=map_rect_new_binfile_int(map, NULL); + push_zipfile_tile(*ret, le32_to_cpu(data[0]), le32_to_cpu(data[1]), le32_to_cpu(data[2]), 0); + return 2; + } + *ret=NULL; + return 0; +} + +static struct map_rect_priv * +binmap_search_street_by_place(struct map_priv *map, struct item *town, struct coord *c, struct map_selection *sel) +{ + struct attr town_name, poly_town_name; + struct map_rect_priv *map_rec2; + struct item *place; + int found=0; + + if (!item_attr_get(town, attr_label, &town_name)) + return NULL; + sel->range = item_range_all; + sel->order = 18; + sel->next = NULL; + sel->u.c_rect.lu=*c; + sel->u.c_rect.rl=*c; + map_rec2=map_rect_new_binfile(map, sel); + while ((place=map_rect_get_item_binfile(map_rec2))) { + if (item_is_poly_place(*place) && + item_attr_get(place, attr_label, &poly_town_name) && + !strcmp(poly_town_name.u.str,town_name.u.str)) { + struct coord c[128]; + int i,count; + found=1; + while ((count=item_coord_get(place, c, 128))) { + for (i = 0 ; i < count ; i++) + coord_rect_extend(&sel->u.c_rect, &c[i]); + } + } + } + map_rect_destroy_binfile(map_rec2); + if (found) + return map_rect_new_binfile(map, sel); + return NULL; +} + +static struct map_rect_priv * +binmap_search_street_by_estimate(struct map_priv *map, struct item *town, struct coord *c, struct map_selection *sel) +{ + int size = 10000; + switch (town->type) { + case type_town_label_1e7: + case type_town_label_5e6: + case type_town_label_2e6: + case type_town_label_1e6: + case type_town_label_5e5: + case type_town_label_2e5: + case type_district_label_1e7: + case type_district_label_5e6: + case type_district_label_2e6: + case type_district_label_1e6: + case type_district_label_5e5: + case type_district_label_2e5: + size = 10000; + break; + case type_town_label_1e5: + case type_town_label_5e4: + case type_town_label_2e4: + case type_district_label_1e5: + case type_district_label_5e4: + case type_district_label_2e4: + size = 5000; + break; + case type_town_label_1e4: + case type_town_label_5e3: + case type_town_label_2e3: + case type_district_label_1e4: + case type_district_label_5e3: + case type_district_label_2e3: + size = 2500; + break; + case type_town_label_1e3: + case type_town_label_5e2: + case type_town_label_2e2: + case type_town_label_1e2: + case type_town_label_5e1: + case type_town_label_2e1: + case type_town_label_1e1: + case type_town_label_5e0: + case type_town_label_2e0: + case type_town_label_1e0: + case type_town_label_0e0: + case type_district_label_1e3: + case type_district_label_5e2: + case type_district_label_2e2: + case type_district_label_1e2: + case type_district_label_5e1: + case type_district_label_2e1: + case type_district_label_1e1: + case type_district_label_5e0: + case type_district_label_2e0: + case type_district_label_1e0: + case type_district_label_0e0: + size = 1000; + break; + default: + break; + } + sel->u.c_rect.lu.x = c->x-size; + sel->u.c_rect.lu.y = c->y+size; + sel->u.c_rect.rl.x = c->x+size; + sel->u.c_rect.rl.y = c->y-size; + return map_rect_new_binfile(map, sel); +} + +static struct map_rect_priv * +binmap_search_housenumber_by_estimate(struct map_priv *map, struct coord *c, struct map_selection *sel) +{ + int size = 20; + sel->u.c_rect.lu.x = c->x-size; + sel->u.c_rect.lu.y = c->y+size; + sel->u.c_rect.rl.x = c->x+size; + sel->u.c_rect.rl.y = c->y-size; + + sel->range = item_range_all; + sel->order = 18; + //sel->next = NULL; + + return map_rect_new_binfile(map, sel); +} + +static struct map_search_priv * +binmap_search_new(struct map_priv *map, struct item *item, struct attr *search, int partial) +{ + struct map_rect_priv *map_rec; + struct map_search_priv *msp=g_new0(struct map_search_priv, 1); + struct item *town; + + msp->search = search; + msp->partial = partial; + /* + * NOTE: If you implement search for other attributes than attr_town_name and attr_street_name, + * please update this comment and the documentation for map_search_new() in map.c + */ + switch (search->type) { + case attr_country_name: + break; + case attr_town_name: + case attr_town_or_district_name: + map_rec = map_rect_new_binfile(map, NULL); + if (!map_rec) + break; + map_rec->country_id = item->id_lo; + msp->mr = map_rec; + return msp; + break; + case attr_town_postal: + break; + case attr_street_name: + if (! item->map) + break; + if (!map_priv_is(item->map, map)) + break; + map_rec = map_rect_new_binfile(map, NULL); + town = map_rect_get_item_byid_binfile(map_rec, item->id_hi, item->id_lo); + if (town) { + struct coord c; + + if (binmap_search_by_index(map, town, &msp->mr)) + msp->mode = 1; + else { + if (item_coord_get(town, &c, 1)) { + if ((msp->mr=binmap_search_street_by_place(map, town, &c, &msp->ms))) + msp->mode = 2; + else { + msp->mr=binmap_search_street_by_estimate(map, town, &c, &msp->ms); + msp->mode = 3; + } + } + } + map_rect_destroy_binfile(map_rec); + if (!msp->mr) + break; + return msp; + } + map_rect_destroy_binfile(map_rec); + break; + case attr_house_number: + dbg(1,"case house_number"); + if (! item->map) + break; + if (!map_priv_is(item->map, map)) + break; + msp->map=map; + msp->mr_item = map_rect_new_binfile(map, NULL); + msp->item = map_rect_get_item_byid_binfile(msp->mr_item, item->id_hi, item->id_lo); + if (binmap_search_by_index(map, msp->item, &msp->mr) != 3) { + struct coord c; + if (item_coord_get(msp->item, &c, 1)) + { + msp->mr=binmap_search_housenumber_by_estimate(map, &c, &msp->ms); + msp->mode = 2; + } + map_rect_destroy_binfile(msp->mr_item); + msp->mr_item=NULL; + } + if (!msp->mr) + { + break; + } + return msp; + default: + break; + } + g_free(msp); + return NULL; +} + +static int +ascii_cmp(char *name, char *match, int partial) +{ + if (partial) + return g_ascii_strncasecmp(name, match, strlen(match)); + else + return g_ascii_strcasecmp(name, match); +} + +struct duplicate +{ + struct coord c; + char str[0]; +}; + +static guint +duplicate_hash(gconstpointer key) +{ + const struct duplicate *d=key; + return d->c.x^d->c.y^g_str_hash(d->str); +} + +static gboolean +duplicate_equal(gconstpointer a, gconstpointer b) +{ + const struct duplicate *da=a; + const struct duplicate *db=b; + return (da->c.x == db->c.x && da->c.y == da->c.y && g_str_equal(da->str,db->str)); +} + +/** + * @brief + * @param msp pointer to private map search data + * @param item item to check + * @param attr_type + */ +static int +duplicate(struct map_search_priv *msp, struct item *item, enum attr_type attr_type) +{ + struct attr attr; + if (!msp->search_results) + msp->search_results = g_hash_table_new_full(duplicate_hash, duplicate_equal, g_free, NULL); + binfile_attr_rewind(item->priv_data); + if (!item_attr_get(item, attr_type, &attr)) + return 1; + { + int len=sizeof(struct coord)+strlen(attr.u.str)+1; + char *buffer=g_alloca(sizeof(char)*len); + struct duplicate *d=(struct duplicate *)buffer; + if (!item_coord_get(item, &d->c, 1)) { + d->c.x=0; + d->c.y=0; + } + binfile_coord_rewind(item->priv_data); + strcpy(d->str, attr.u.str); + if (!g_hash_table_lookup(msp->search_results, d)) { + struct duplicate *dc=g_malloc(len); + memcpy(dc, d, len); + g_hash_table_insert(msp->search_results, dc, GINT_TO_POINTER(1)); + binfile_attr_rewind(item->priv_data); + return 0; + } + } + return 2; +} + +static struct item * +binmap_search_get_item(struct map_search_priv *map_search) +{ + struct item* it; + struct attr at; + + for (;;) { + while ((it = map_rect_get_item_binfile(map_search->mr))) { + switch (map_search->search->type) { + case attr_town_name: + case attr_district_name: + case attr_town_or_district_name: + if (map_search->mr->tile_depth > 1 && item_is_town(*it) && map_search->search->type != attr_district_name) { + if (binfile_attr_get(it->priv_data, attr_town_name_match, &at) || binfile_attr_get(it->priv_data, attr_town_name, &at)) { + if (!ascii_cmp(at.u.str, map_search->search->u.str, map_search->partial) && !duplicate(map_search, it, attr_town_name)) + return it; + } + } + if (map_search->mr->tile_depth > 1 && item_is_district(*it) && map_search->search->type != attr_town_name) { + if (binfile_attr_get(it->priv_data, attr_district_name_match, &at) || binfile_attr_get(it->priv_data, attr_district_name, &at)) { + if (!ascii_cmp(at.u.str, map_search->search->u.str, map_search->partial) && !duplicate(map_search, it, attr_town_name)) + return it; + } + } + break; + case attr_street_name: + if (map_search->mode == 1) { + if (binfile_attr_get(it->priv_data, attr_street_name_match, &at) || binfile_attr_get(it->priv_data, attr_street_name, &at)) { + if (!ascii_cmp(at.u.str, map_search->search->u.str, map_search->partial) && !duplicate(map_search, it, attr_street_name)) { + return it; + } + } + continue; + } + if (item_is_street(*it)) { + struct attr at; + if (map_selection_contains_item_rect(map_search->mr->sel, it) && binfile_attr_get(it->priv_data, attr_label, &at)) { + int i,match=0; + char *str=g_strdup(at.u.str); + char *word=str; + do { + for (i = 0 ; i < 3 ; i++) { + char *name=linguistics_expand_special(word,i); + if (name && !ascii_cmp(name, map_search->search->u.str, map_search->partial)) + match=1; + g_free(name); + if (match) + break; + } + if (match) + break; + word=linguistics_next_word(word); + } while (word); + g_free(str); + if (match && !duplicate(map_search, it, attr_label)) { + item_coord_rewind(it); + return it; + } + } + } + break; + case attr_house_number: + //if (it->type == type_house_number) + if ((it->type == type_house_number)||(type_house_number_interpolation_even) + ||(type_house_number_interpolation_odd) + ||(type_house_number_interpolation_all) + ) + { + // is it a housenumber? + if (binfile_attr_get(it->priv_data, attr_house_number, &at)) + { + // match housenumber to our string + if (!ascii_cmp(at.u.str, map_search->search->u.str, map_search->partial)) + { + //binfile_attr_get(it->priv_data, attr_street_name, &at); + //dbg(0,"hnnn B1 street_name=%s",at.u.str); + if (!duplicate(map_search, it, attr_house_number)) + { + binfile_attr_rewind(it->priv_data); + return it; + } + } + } else + return it; + } + continue; + default: + return NULL; + } + } + if (!map_search->mr_item) + return NULL; + map_rect_destroy_binfile(map_search->mr); + if (!binmap_search_by_index(map_search->map, map_search->item, &map_search->mr)) + return NULL; + } +} + + +static void +binmap_search_destroy(struct map_search_priv *ms) +{ + if (ms->search_results) + g_hash_table_destroy(ms->search_results); + if (ms->mr_item) + map_rect_destroy_binfile(ms->mr_item); + if (ms->mr) + map_rect_destroy_binfile(ms->mr); + g_free(ms); +} + +static int +binmap_get_attr(struct map_priv *m, enum attr_type type, struct attr *attr) +{ + attr->type=type; + switch (type) { + case attr_map_release: + if (m->map_release) { + attr->u.str=m->map_release; + return 1; + } + break; + case attr_progress: + if (m->progress) { + attr->u.str=m->progress; + return 1; + } + default: + break; + } + return 0; +} + +static int +binmap_set_attr(struct map_priv *map, struct attr *attr) +{ + switch (attr->type) { + case attr_update: + map->download_enabled = attr->u.num; + return 1; + default: + return 0; + } + +} + +static struct map_methods map_methods_binfile = { + projection_mg, + "utf-8", + map_destroy_binfile, + map_rect_new_binfile, + map_rect_destroy_binfile, + map_rect_get_item_binfile, + map_rect_get_item_byid_binfile, + binmap_search_new, + binmap_search_destroy, + binmap_search_get_item, + NULL, + binmap_get_attr, + binmap_set_attr, +}; + +static int +binfile_get_index(struct map_priv *m) +{ + int len; + int cde_index_size; + int offset; + struct zip_cd *cd; + + len = strlen("index"); + cde_index_size = sizeof(struct zip_cd)+len; + if (m->eoc64) + offset = m->eoc64->zip64ecsz-cde_index_size; + else + offset = m->eoc->zipecsz-cde_index_size; + cd = binfile_read_cd(m, offset, len); + + if (!cd) { + cde_index_size+=sizeof(struct zip_cd_ext); + if (m->eoc64) + offset = m->eoc64->zip64ecsz-cde_index_size; + else + offset = m->eoc->zipecsz-cde_index_size; + cd = binfile_read_cd(m, offset, len+sizeof(struct zip_cd_ext)); + } + if (cd) { + if (cd->zipcfnl == len && !strncmp(cd->zipcfn, "index", len)) { + m->index_offset=offset; + m->index_cd=cd; + return 1; + } + } + offset=binfile_search_cd(m, 0, "index", 0, 0); + if (offset == -1) + return 0; + cd=binfile_read_cd(m, offset, -1); + if (!cd) + return 0; + m->index_offset=offset; + m->index_cd=cd; + return 1; +} + +static int +map_binfile_zip_setup(struct map_priv *m, char *filename, int mmap) +{ + struct zip_cd *first_cd; + int i; + if (!(m->eoc=binfile_read_eoc(m->fi))) { + dbg(0,"unable to read eoc\n"); + return 0; + } + dbg_assert(m->eoc->zipedsk == m->eoc->zipecen); + if (m->eoc->zipedsk && strlen(filename) > 3) { + char *tmpfilename=g_strdup(filename),*ext=tmpfilename+strlen(tmpfilename)-3; + m->fis=g_new(struct file *,m->eoc->zipedsk); + for (i = 0 ; i < m->eoc->zipedsk-1 ; i++) { + sprintf(ext,"b%02d",i+1); + m->fis[i]=file_create(tmpfilename, 0); + if (mmap) + file_mmap(m->fis[i]); + } + m->fis[m->eoc->zipedsk-1]=m->fi; + g_free(tmpfilename); + } + dbg(1,"num_disk %d\n",m->eoc->zipedsk); + m->eoc64=binfile_read_eoc64(m->fi); + if (!binfile_get_index(m)) { + dbg(0,"no index found\n"); + return 0; + } + if (!(first_cd=binfile_read_cd(m, 0, 0))) { + dbg(0,"unable to get first cd\n"); + return 0; + } + m->cde_size=sizeof(struct zip_cd)+first_cd->zipcfnl+first_cd->zipcxtl; + m->zip_members=m->index_offset/m->cde_size+1; + dbg(1,"cde_size %d\n", m->cde_size); + dbg(1,"members %d\n",m->zip_members); + file_data_free(m->fi, (unsigned char *)first_cd); + if (mmap) + file_mmap(m->fi); + return 1; +} + + +#if 0 +static int +map_binfile_download_initial(struct map_priv *m) +{ + struct attr readwrite={attr_readwrite,{(void *)1}}; + struct attr create={attr_create,{(void *)1}}; + struct attr *attrs[4]; + struct file *out; + long long woffset=0,planet_size; + int size_ret; + int cd1size,cdisize; + long long cd1offset,cdioffset; + struct zip64_eoc *zip64_eoc; + struct zip64_eocl *zip64_eocl; + struct zip_eoc *zip_eoc; + struct zip_cd *cd1,*cdn,*cdi; + int count,chunk,cdoffset=0; + int mode=1; + struct map_download *download=g_new0(struct map_download, 1); + + attrs[0]=&readwrite; + attrs[1]=&create; + attrs[2]=NULL; + download->file=file_create(m->filename,attrs); + download->m=m; + download_planet_size(download); + download_eoc(download); + download_directory_start(download); + while (download_directory_do(download)); + download_directory_finish(download); + download_initial_finish(download); + m->fi=download->file; + g_free(download); + return 1; + + + cd1size=sizeof(*cd1); + cd1offset=zip64_eoc->zip64eofst; + cd1=(struct zip_cd *)map_binfile_download_range(m, cd1offset, cd1size); + if (!cd1) + return 0; + cd1size=sizeof(*cd1)+binfile_cd_extra(cd1); + g_free(cd1); + cd1=(struct zip_cd *)map_binfile_download_range(m, cd1offset, cd1size); + if (!cd1) + return 0; + cd1->zipcunc=0; + cdisize=sizeof(*cdi)+strlen("index")+cd1->zipcxtl; + cdioffset=zip64_eoc->zip64eofst+zip64_eoc->zip64ecsz-cdisize; + cdi=(struct zip_cd *)map_binfile_download_range(m, cdioffset, cdisize); + if (!cdi) { + g_free(cd1); + return 0; + } + cdi->zipcunc=0; + cdn=g_malloc0(cd1size*256); + + file_data_write(out, woffset, sizeof(*zip64_eoc), (unsigned char *)zip64_eoc); + woffset+=sizeof(*zip64_eoc); + cdoffset=woffset; + + file_data_write(out, woffset, cd1size, (unsigned char *)cd1); + woffset+=cd1size; + count=(cdioffset-cd1offset)/cd1size-1; + while (count > 0) { + if (count > 256) + chunk=256; + else + chunk=count; + file_data_write(out, woffset, cd1size*chunk, (unsigned char *)cdn); + woffset+=cd1size*chunk; + count-=chunk; + } + g_free(cdn); + g_free(cd1); + file_data_write(out, woffset, cdisize, (unsigned char *)cdi); + woffset+=cdisize; + +} +#endif + +static int +map_binfile_open(struct map_priv *m) +{ + int *magic; + struct map_rect_priv *mr; + struct item *item; + struct attr attr; + struct attr readwrite={attr_readwrite, {(void *)1}}; + struct attr *attrs[]={&readwrite, NULL}; + + dbg(1,"file_create %s\n", m->filename); + m->fi=file_create(m->filename, m->url?attrs:NULL); + if (! m->fi && m->url) + return 0; + if (! m->fi) { + dbg(0,"Failed to load '%s'\n", m->filename); + return 0; + } + if (m->check_version) + m->version=file_version(m->fi, m->check_version); + magic=(int *)file_data_read(m->fi, 0, 4); + if (!magic) { + file_destroy(m->fi); + m->fi=NULL; + return 0; + } + *magic = le32_to_cpu(*magic); + if (*magic == zip_lfh_sig || *magic == zip_split_sig || *magic == zip_cd_sig || *magic == zip64_eoc_sig) { + if (!map_binfile_zip_setup(m, m->filename, m->flags & 1)) { + dbg(0,"invalid file format for '%s'\n", m->filename); + file_destroy(m->fi); + m->fi=NULL; + return 0; + } + } else if (*magic == zip_lfh_sig_rev || *magic == zip_split_sig_rev || *magic == zip_cd_sig_rev || *magic == zip64_eoc_sig_rev) { + dbg(0,"endianness mismatch\n"); + file_destroy(m->fi); + m->fi=NULL; + return 0; + } else + file_mmap(m->fi); + file_data_free(m->fi, (unsigned char *)magic); + m->cachedir=g_strdup("/tmp/navit"); + m->map_version=0; + mr=map_rect_new_binfile(m, NULL); + if (mr) { + while ((item=map_rect_get_item_binfile(mr)) == &busy_item); + if (item && item->type == type_map_information) { + if (binfile_attr_get(item->priv_data, attr_version, &attr)) + m->map_version=attr.u.num; + if (binfile_attr_get(item->priv_data, attr_map_release, &attr)) + m->map_release=g_strdup(attr.u.str); + if (m->url && binfile_attr_get(item->priv_data, attr_url, &attr)) { + dbg(0,"url config %s map %s\n",m->url,attr.u.str); + if (strcmp(m->url, attr.u.str)) + m->update_available=1; + g_free(m->url); + m->url=g_strdup(attr.u.str); + } + } + map_rect_destroy_binfile(mr); + if (m->map_version >= 16) { + dbg(0,"Warning: This map is incompatible with your navit version. Please update navit.\n"); + return 0; + } + } + return 1; +} + +static void +map_binfile_close(struct map_priv *m) +{ + int i; + file_data_free(m->fi, (unsigned char *)m->index_cd); + file_data_free(m->fi, (unsigned char *)m->eoc); + file_data_free(m->fi, (unsigned char *)m->eoc64); + g_free(m->cachedir); + g_free(m->map_release); + if (m->fis) { + for (i = 0 ; i < m->eoc->zipedsk ; i++) { + file_destroy(m->fis[i]); + } + } else + file_destroy(m->fi); +} + +static void +map_binfile_destroy(struct map_priv *m) +{ + g_free(m->filename); + g_free(m->url); + g_free(m->progress); + g_free(m); +} + + +static void +binfile_check_version(struct map_priv *m) +{ + int version=-1; + if (!m->check_version) + return; + if (m->fi) + version=file_version(m->fi, m->check_version); + if (version != m->version) { + if (m->fi) + map_binfile_close(m); + map_binfile_open(m); + } +} + + +static struct map_priv * +map_new_binfile(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) +{ + struct map_priv *m; + struct attr *data=attr_search(attrs, NULL, attr_data); + struct attr *check_version,*map_pass,*flags,*url,*download_enabled; + struct file_wordexp *wexp; + char **wexp_data; + if (! data) + return NULL; + + wexp=file_wordexp_new(data->u.str); + wexp_data=file_wordexp_get_array(wexp); + dbg(1,"map_new_binfile %s\n", data->u.str); + *meth=map_methods_binfile; + + m=g_new0(struct map_priv, 1); + m->cbl=cbl; + m->id=++map_id; + m->filename=g_strdup(wexp_data[0]); + file_wordexp_destroy(wexp); + check_version=attr_search(attrs, NULL, attr_check_version); + if (check_version) + m->check_version=check_version->u.num; + map_pass=attr_search(attrs, NULL, attr_map_pass); + if (map_pass) + m->passwd=g_strdup(map_pass->u.str); + flags=attr_search(attrs, NULL, attr_flags); + if (flags) + m->flags=flags->u.num; + url=attr_search(attrs, NULL, attr_url); + if (url) + m->url=g_strdup(url->u.str); + download_enabled = attr_search(attrs, NULL, attr_update); + if (download_enabled) + m->download_enabled=download_enabled->u.num; + + if (!map_binfile_open(m) && !m->check_version && !m->url) { + map_binfile_destroy(m); + m=NULL; + } else { + load_changes(m); + } + return m; +} + +void +plugin_init(void) +{ + dbg(1,"binfile: plugin_init\n"); + if (sizeof(struct zip_cd) != 46) { + dbg(0,"error: sizeof(struct zip_cd)=%d\n",sizeof(struct zip_cd)); + } + plugin_register_map_type("binfile", map_new_binfile); +} + diff --git a/navit/map/csv/Makefile.am b/navit/map/csv/Makefile.am new file mode 100644 index 0000000..d8670ea --- /dev/null +++ b/navit/map/csv/Makefile.am @@ -0,0 +1,9 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_csv +if PLUGINS + modulemap_LTLIBRARIES = libmap_csv.la +else + noinst_LTLIBRARIES = libmap_csv.la +endif +libmap_csv_la_SOURCES = csv.c csv.h quadtree.c quadtree.h +libmap_csv_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ diff --git a/navit/map/csv/Makefile.in b/navit/map/csv/Makefile.in new file mode 100644 index 0000000..7e5898c --- /dev/null +++ b/navit/map/csv/Makefile.in @@ -0,0 +1,704 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/map/csv +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulemapdir)" +LTLIBRARIES = $(modulemap_LTLIBRARIES) $(noinst_LTLIBRARIES) +libmap_csv_la_LIBADD = +am_libmap_csv_la_OBJECTS = csv.lo quadtree.lo +libmap_csv_la_OBJECTS = $(am_libmap_csv_la_OBJECTS) +libmap_csv_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libmap_csv_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libmap_csv_la_rpath = +@PLUGINS_TRUE@am_libmap_csv_la_rpath = -rpath $(modulemapdir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libmap_csv_la_SOURCES) +DIST_SOURCES = $(libmap_csv_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_csv +@PLUGINS_TRUE@modulemap_LTLIBRARIES = libmap_csv.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libmap_csv.la +libmap_csv_la_SOURCES = csv.c csv.h quadtree.c quadtree.h +libmap_csv_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/map/csv/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/map/csv/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulemapLTLIBRARIES: $(modulemap_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulemapdir)" || $(MKDIR_P) "$(DESTDIR)$(modulemapdir)" + @list='$(modulemap_LTLIBRARIES)'; test -n "$(modulemapdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulemapdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulemapdir)"; \ + } + +uninstall-modulemapLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulemap_LTLIBRARIES)'; test -n "$(modulemapdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulemapdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulemapdir)/$$f"; \ + done + +clean-modulemapLTLIBRARIES: + -test -z "$(modulemap_LTLIBRARIES)" || rm -f $(modulemap_LTLIBRARIES) + @list='$(modulemap_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libmap_csv.la: $(libmap_csv_la_OBJECTS) $(libmap_csv_la_DEPENDENCIES) + $(libmap_csv_la_LINK) $(am_libmap_csv_la_rpath) $(libmap_csv_la_OBJECTS) $(libmap_csv_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quadtree.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulemapdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulemapLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulemapLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulemapLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulemapLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-modulemapLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulemapLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/map/csv/csv.c b/navit/map/csv/csv.c new file mode 100644 index 0000000..f57009a --- /dev/null +++ b/navit/map/csv/csv.c @@ -0,0 +1,743 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + + +#include "config.h" + +#include +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include "debug.h" +#include "plugin.h" +#include "projection.h" +#include "item.h" +#include "map.h" +#include "maptype.h" +#include "attr.h" +#include "transform.h" +#include "file.h" +#include "quadtree.h" + +#include "csv.h" + +static int map_id; + +//prototype +static int +csv_coord_set(void *priv_data, struct coord *c, int count, enum change_mode mode); +static struct item * csv_create_item(struct map_rect_priv *mr, enum item_type it_type); + +struct quadtree_data +{ + struct item* item; + GList* attr_list; +}; + +static void +save_map_csv(struct map_priv *m) +{ + if(m->dirty) { + GList *res = NULL, *item_it; + char* filename = g_strdup_printf("%s.tmp",m->filename); + FILE* fp; + int ferr = 0; + char *csv_line = 0; + char *tmpstr = 0; + char *oldstr = 0; + + if( ! (fp=fopen(filename,"w+"))) { + dbg(1, "Error opening csv file to write new entries"); + return; + } + //query the world + quadtree_find_rect_items(m->tree_root, -90, 90, -90, 90, &res); + + item_it = res; + while(item_it) { + int i; + enum attr_type *at = m->attr_types; + csv_line = g_strdup(""); + tmpstr = g_strdup(""); + for(i=0;iattr_cnt;++i) { + if(at != m->attr_types) { + csv_line = g_strdup_printf("%s,",tmpstr); + } + g_free(tmpstr); + tmpstr = NULL; + + if(*at == attr_position_latitude) { + tmpstr = g_strdup_printf("%lf",((struct quadtree_item*)(item_it->data))->latitude); + } + else if(*at == attr_position_longitude) { + tmpstr = g_strdup_printf("%lf",((struct quadtree_item*)(item_it->data))->longitude); + } + else { + GList* attr_list = ((struct quadtree_data*)(((struct quadtree_item*)(item_it->data))->data))->attr_list; + GList* attr_it = attr_list; + struct attr* found_attr = NULL; + //search attributes + while(attr_it) { + if(((struct attr*)(attr_it->data))->type == *at) { + found_attr = attr_it->data; + break; + } + attr_it = g_list_next(attr_it); + } + if(found_attr) { + if(ATTR_IS_INT(*at)) { + tmpstr = g_strdup_printf("%d", (int)found_attr->u.num); + } + else if(ATTR_IS_DOUBLE(*at)) { + tmpstr = g_strdup_printf("%lf", *found_attr->u.numd); + } + else if(ATTR_IS_STRING(*at)) { + tmpstr = g_strdup(found_attr->u.str); + } + } + else { //TODO handle this error + } + } + oldstr = csv_line; + csv_line = g_strdup_printf("%s%s",csv_line,tmpstr); + g_free(tmpstr); + g_free(oldstr); + tmpstr = csv_line; + ++at; + } + if(fprintf(fp,"%s\n", csv_line)<0) { + ferr = 1; + } + item_it = g_list_next(item_it); + tmpstr=g_strdup(""); + } + + if(fclose(fp)) { + ferr = 1; + } + + if(! ferr) { + unlink(m->filename); + rename(filename,m->filename); + } + g_free(filename); + m->dirty = 0; + } +} + +static const int zoom_max = 18; + +static void +map_destroy_csv(struct map_priv *m) +{ + dbg(1,"map_destroy_csv\n"); + //save if changed + save_map_csv(m); + g_hash_table_destroy(m->item_hash); + g_hash_table_destroy(m->qitem_hash); + quadtree_destroy(m->tree_root); + g_free(m->filename); + g_free(m->attr_types); + g_free(m); +} + +static void +csv_coord_rewind(void *priv_data) +{ +} + +static int +csv_coord_get(void *priv_data, struct coord *c, int count) +{ + struct map_rect_priv *mr=priv_data; + if(mr) { + *c = mr->c; + return 1; + } + else { + return 0; + } +} + +static void +csv_attr_rewind(void *priv_data) +{ +// struct map_rect_priv *mr=priv_data; + //TODO implement if needed +} + +static int +csv_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + int i, bAttrFound = 0; + GList* attr_list; + struct map_rect_priv *mr=priv_data; + enum attr_type *at; + if( !mr || !mr->m || !mr->m->attr_types ) { + return 0; + } + + attr_list = ((struct quadtree_data*)(((struct quadtree_item*)(mr->curr_item->data))->data))->attr_list; + + if (attr_type == attr_any) { + if (mr->at_iter==NULL) { //start iteration + mr->at_iter = attr_list; + if (mr->at_iter) { + *attr = *(struct attr*)(mr->at_iter->data); + mr->at_iter = g_list_next(mr->at_iter); + return 1; + } + else { //empty attr list + mr->at_iter = NULL; + return 0; + } + } + else { //continue iteration + mr->at_iter = g_list_next(mr->at_iter); + if(mr->at_iter) { + *attr = *(struct attr*)mr->at_iter->data; + return 1; + } else { + return 0; + } + } + return 0; + } + + at = mr->m->attr_types; + + for(i=0;im->attr_cnt;++i) { + if(*at == attr_type) { + bAttrFound = 1; + break; + } + ++at; + } + + if(!bAttrFound) { + return 0; + } + + while(attr_list) { + if(((struct attr*)attr_list->data)->type == attr_type) { + *attr = *(struct attr*)attr_list->data; + return 1; + } + attr_list = g_list_next(attr_list); + } + return 0; +} + +static int +csv_attr_set(void *priv_data, struct attr *attr, enum change_mode mode) +{ + struct map_rect_priv* mr = (struct map_rect_priv*)priv_data; + struct map_priv* m = mr->m; + int i, bFound = 0; + struct attr *attr_new; + GList *attr_list, *curr_attr_list; + enum attr_type *at = m->attr_types; + + if(!mr || !mr->curr_item || !mr->curr_item->data ) { + return 0; + } + + //if attribute is not supported by this csv map return 0 + for(i=0;iattr_cnt;++i) { + if(*at==attr->type) { + bFound = 1; + break; + } + ++at; + } + if( ! bFound) { + return 0; + } + m->dirty = 1; + attr_new = attr_dup(attr); + attr_list = ((struct quadtree_data*)(((struct quadtree_item*)(mr->curr_item->data))->data))->attr_list; + curr_attr_list = attr_list; + + while(attr_list) { + if(((struct attr*)attr_list->data)->type == attr->type) { + switch(mode) { + case change_mode_delete: + curr_attr_list = g_list_delete_link(curr_attr_list,attr_list->data); + return 1; + case change_mode_modify: + case change_mode_prepend: + case change_mode_append: + //replace existing attribute + if((struct attr*)attr_list->data) { + g_free((struct attr*)attr_list->data); + } + attr_list->data = attr_new; + m->dirty = 1; + save_map_csv(m); + return 1; + default: + g_free(attr_new); + return 0; + } + } + attr_list = g_list_next(attr_list); + } + + if( mode==change_mode_modify || mode==change_mode_prepend || mode==change_mode_append) { + //add new attribute + curr_attr_list = g_list_prepend(curr_attr_list, attr_new); + ((struct quadtree_data*)(((struct quadtree_item*)(mr->curr_item->data))->data))->attr_list = curr_attr_list; + m->dirty = 1; + save_map_csv(m); + return 1; + } + g_free(attr_new); + return 0; +} + +static struct item_methods methods_csv = { + csv_coord_rewind, + csv_coord_get, + csv_attr_rewind, + csv_attr_get, + NULL, + csv_attr_set, + csv_coord_set, +}; + + +/* + * Sets coordinate of an existing item (either on the new list or an item with coord ) + */ +static int +csv_coord_set(void *priv_data, struct coord *c, int count, enum change_mode mode) +{ + struct quadtree_item query_item, insert_item, *query_res; + struct coord_geo cg; + struct map_rect_priv* mr; + struct map_priv* m; + struct quadtree_item* qi; + GList* new_it; + + //for now we only support coord modification only + if( ! change_mode_modify) { + return 0; + } + //csv driver supports one coord per record only + if( count != 1) { + return 0; + } + + //get curr_item of given map_rect + mr = (struct map_rect_priv*)priv_data; + m = mr->m; + + if(!mr->curr_item || !mr->curr_item->data) { + return 0; + } + + qi = mr->curr_item->data; + + transform_to_geo(projection_mg, &c[0], &cg); + + //if it is on the new list remove from new list and add it to the tree with the coord + new_it = m->new_items; + while(new_it) { + if(new_it->data==qi) { + break; + } + new_it = g_list_next(new_it); + } + if(new_it) { + qi->longitude = cg.lng; + qi->latitude = cg.lat; + quadtree_add( m->tree_root, qi); + m->new_items = g_list_remove_link(m->new_items,new_it); + return 0; + } + + //else update quadtree item with the new coord + // remove item from the quadtree (to be implemented) + query_item.longitude = cg.lng; + query_item.latitude = cg.lat; + query_res = quadtree_find_item(m->tree_root, &query_item); + if(!query_res) { + return 0; + } + // add item to the tree with the new coord + insert_item = *query_res; + insert_item.longitude = cg.lng; + insert_item.latitude = cg.lat; + quadtree_delete_item(m->tree_root, query_res); + g_free(query_res); + quadtree_add( m->tree_root, &insert_item); + m->dirty = 1; + save_map_csv(m); + return 1; +} + +static struct map_rect_priv * +map_rect_new_csv(struct map_priv *map, struct map_selection *sel) +{ + struct map_rect_priv *mr; + struct coord_geo lu; + struct coord_geo rl; + GList*res = NULL; + + dbg(1,"map_rect_new_csv\n"); + mr=g_new0(struct map_rect_priv, 1); + mr->m=map; + mr->bStarted = 0; + mr->sel=sel; + if (map->flags & 1) + mr->item.id_hi=1; + else + mr->item.id_hi=0; + mr->item.id_lo=0; + mr->item.meth=&methods_csv; + mr->item.priv_data=mr; + + //convert selection to geo + if(sel) { + transform_to_geo(projection_mg, &sel->u.c_rect.lu, &lu); + transform_to_geo(projection_mg, &sel->u.c_rect.rl, &rl); + quadtree_find_rect_items(map->tree_root, lu.lng, rl.lng, rl.lat, lu.lat, &res); + } + mr->query_result = res; + mr->curr_item = res; + return mr; +} + + +static void +map_rect_destroy_csv(struct map_rect_priv *mr) +{ + g_list_free(mr->query_result); + g_free(mr); +} + +static struct item * +map_rect_get_item_csv(struct map_rect_priv *mr) +{ + if(mr->bStarted) { + if(mr->curr_item) { + mr->curr_item = g_list_next(mr->curr_item); + } + } + else { + mr->bStarted = 1; + } + + if(mr->curr_item) { + struct item* ret; + struct coord_geo cg; + ret = ((struct quadtree_data*)(((struct quadtree_item*)(mr->curr_item->data))->data))->item; + ret->priv_data=mr; + if(mr->curr_item && mr->curr_item->data) { + cg.lng = ((struct quadtree_item*)(mr->curr_item->data))->longitude; + cg.lat = ((struct quadtree_item*)(mr->curr_item->data))->latitude; + transform_from_geo(projection_mg, &cg, &mr->c); + ret = ((struct quadtree_data*)(((struct quadtree_item*)(mr->curr_item->data))->data))->item; + return ret; + } + } + return NULL; +} + +static struct item * +map_rect_get_item_byid_csv(struct map_rect_priv *mr, int id_hi, int id_lo) +{ + //currently id_hi is ignored + struct item *it = g_hash_table_lookup(mr->m->item_hash,&id_lo); + struct quadtree_item *qit = g_hash_table_lookup(mr->m->qitem_hash,&id_lo); + if(it && qit) { + mr->curr_item = g_list_prepend(NULL, qit); + } + else { + mr->curr_item = NULL; + } + it->priv_data=mr; + return it; +} + +static int +csv_get_attr(struct map_priv *m, enum attr_type type, struct attr *attr) +{ + return 0; +} + +static struct item * +csv_create_item(struct map_rect_priv *mr, enum item_type it_type) +{ + struct map_priv* m; + struct quadtree_data* qd; + struct quadtree_item* qi; + struct item* curr_item; + int* pID; + struct map_rect_priv *mr2 = g_new0(struct map_rect_priv, 1); + *mr2 = *mr; + if(mr && mr->m) { + m = mr->m; + } + else { + return NULL; + } + + if( m->item_type != it_type) { + return NULL; + } + + m->dirty = 1; + //add item to the map + curr_item = item_new("",zoom_max); + curr_item->type = m->item_type; + curr_item->priv_data = mr2; + + curr_item->id_lo = m->next_item_idx; + if (m->flags & 1) + curr_item->id_hi=1; + else + curr_item->id_hi=0; + curr_item->meth=&methods_csv; + + qd = g_new0(struct quadtree_data,1); + qi = g_new0(struct quadtree_item,1); + qd->item = curr_item; + qd->attr_list = NULL; + qi->data = qd; + //we don`t have valid coord yet + qi->longitude = 0; + qi->latitude = 0; + //add the coord less item to the new list + //TODO remove unnecessary indirection + m->new_items = g_list_prepend(m->new_items, qi); + mr2->curr_item = m->new_items; + //don't add to the quadtree yet, wait until we have a valid coord + pID = g_new(int,1); + *pID = m->next_item_idx; + g_hash_table_insert(m->item_hash, pID,curr_item); + g_hash_table_insert(m->qitem_hash, pID,qi); + ++m->next_item_idx; + return curr_item; +} + +static struct map_methods map_methods_csv = { + projection_mg, + "iso8859-1", + map_destroy_csv, + map_rect_new_csv, + map_rect_destroy_csv, + map_rect_get_item_csv, + map_rect_get_item_byid_csv, + NULL, + NULL, + NULL, + csv_create_item, + csv_get_attr, +}; + +static struct map_priv * +map_new_csv(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) +{ + struct map_priv *m = NULL; + struct attr *item_type; + struct attr *attr_types; + struct attr *item_type_attr; + struct attr *data; + struct attr *flags; + int bLonFound = 0; + int bLatFound = 0; + int attr_cnt = 0; + enum attr_type* attr_type_list = NULL; + struct quadtree_node* tree_root = quadtree_node_new(NULL,-90,90,-90,90); + m = g_new0(struct map_priv, 1); + m->id = ++map_id; + m->qitem_hash = g_hash_table_new(g_int_hash, g_int_equal); + m->item_hash = g_hash_table_new_full(g_int_hash, g_int_equal,g_free,g_free); + + item_type = attr_search(attrs, NULL, attr_item_type); + attr_types = attr_search(attrs, NULL, attr_attr_types); + if(attr_types) { + enum attr_type* at = attr_types->u.attr_types; + while(*at != attr_none) { + attr_type_list = g_realloc(attr_type_list,sizeof(enum attr_type)*(attr_cnt+1)); + attr_type_list[attr_cnt] = *at; + if(*at==attr_position_latitude) { + bLatFound = 1; + } + else if(*at==attr_position_longitude) { + bLonFound = 1; + } + ++attr_cnt; + ++at; + } + m->attr_cnt = attr_cnt; + m->attr_types = attr_type_list; + } + else { + m->attr_types = NULL; + return NULL; + } + + if(bLonFound==0 || bLatFound==0) { + return NULL; + } + + item_type_attr=attr_search(attrs, NULL, attr_item_type); + + if( !item_type_attr || item_type_attr->u.item_type==type_none) { + return NULL; + } + + m->item_type = item_type_attr->u.item_type; + + data=attr_search(attrs, NULL, attr_data); + + if(data) { + struct file_wordexp *wexp; + char **wexp_data; + FILE *fp; + wexp=file_wordexp_new(data->u.str); + wexp_data=file_wordexp_get_array(wexp); + dbg(1,"map_new_csv %s\n", data->u.str); + m->filename=g_strdup(wexp_data[0]); + file_wordexp_destroy(wexp); + + //load csv file into quadtree structure + //if column number is wrong skip + if((fp=fopen(m->filename,"rt"))) { + const int max_line_len = 256; + char *line=g_alloca(sizeof(char)*max_line_len); + while(!feof(fp)) { + if(fgets(line,max_line_len,fp)) { + char*line2; + char* delim = ","; + int col_cnt=0; + char*tok; + + if(line[strlen(line)-1]=='\n' || line[strlen(line)-1]=='\r') { + line[strlen(line)-1] = '\0'; + } + line2 = g_strdup(line); + while((tok=strtok( (col_cnt==0)?line:NULL , delim))) { + ++col_cnt; + } + + if(col_cnt==attr_cnt) { + int cnt = 0; //idx of current attr + char*tok; + GList* attr_list = NULL; + int bAddSum = 1; + double longitude = 0.0, latitude=0.0; + struct item *curr_item = item_new("",zoom_max);//does not use parameters + curr_item->type = item_type_attr->u.item_type; + curr_item->id_lo = m->next_item_idx; + if (m->flags & 1) + curr_item->id_hi=1; + else + curr_item->id_hi=0; + curr_item->meth=&methods_csv; + + + while((tok=strtok( (cnt==0)?line2:NULL , delim))) { + struct attr*curr_attr = g_new0(struct attr,1); + int bAdd = 1; + curr_attr->type = attr_types->u.attr_types[cnt]; + if(ATTR_IS_STRING(attr_types->u.attr_types[cnt])) { + curr_attr->u.str = g_strdup(tok); + } + else if(ATTR_IS_INT(attr_types->u.attr_types[cnt])) { + curr_attr->u.num = atoi(tok); + } + else if(ATTR_IS_DOUBLE(attr_types->u.attr_types[cnt])) { + double *d = g_new(double,1); + *d = atof(tok); + curr_attr->u.numd = d; + if(attr_types->u.attr_types[cnt] == attr_position_longitude) { + longitude = *d; + } + if(attr_types->u.attr_types[cnt] == attr_position_latitude) { + latitude = *d; + } + } + else { + //unknown attribute + bAddSum = bAdd = 0; + g_free(curr_attr); + } + + if(bAdd) { + attr_list = g_list_prepend(attr_list, curr_attr); + } + ++cnt; + } + if(bAddSum && (longitude!=0.0 || latitude!=0.0)) { + struct quadtree_data* qd = g_new0(struct quadtree_data,1); + struct quadtree_item* qi =g_new(struct quadtree_item,1); + int* pID = g_new(int,1); + qd->item = curr_item; + qd->attr_list = attr_list; + qi->data = qd; + qi->longitude = longitude; + qi->latitude = latitude; + quadtree_add(tree_root, qi); + *pID = m->next_item_idx; + g_hash_table_insert(m->item_hash, pID,curr_item); + g_hash_table_insert(m->qitem_hash, pID,qi); + ++m->next_item_idx; + } + else { + g_free(curr_item); + } + + } + else { + //printf("ERROR: Non-matching attr count and column count: %d %d SKIPPING line: %s\n",col_cnt, attr_cnt,line); + } + g_free(line2); + } + } + fclose(fp); + } + else { + return NULL; + } + } else { + return NULL; + } + + *meth = map_methods_csv; + m->tree_root = tree_root; + flags=attr_search(attrs, NULL, attr_flags); + if (flags) + m->flags=flags->u.num; + return m; +} + +void +plugin_init(void) +{ + dbg(1,"csv: plugin_init\n"); + plugin_register_map_type("csv", map_new_csv); +} + diff --git a/navit/map/csv/csv.h b/navit/map/csv/csv.h new file mode 100644 index 0000000..cad1d45 --- /dev/null +++ b/navit/map/csv/csv.h @@ -0,0 +1,53 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include + +#include "attr.h" +#include "coord.h" +#include "quadtree.h" + + +struct map_priv { + int id; + struct quadtree_node* tree_root; + int flags; + GHashTable*item_hash; + GHashTable*qitem_hash; + char* filename; + int dirty; //need to write map file on exit + int attr_cnt; + enum attr_type *attr_types; + int next_item_idx; + enum item_type item_type; + GList* new_items; //list of quadtree items that have no coord set yet () +}; + +struct map_rect_priv { + struct map_selection *sel; + GList* query_result; + GList* curr_item; + struct coord c; + int bStarted; + struct item item; + struct map_priv *m; + GList* at_iter; +}; + diff --git a/navit/map/csv/quadtree.c b/navit/map/csv/quadtree.c new file mode 100644 index 0000000..58096ed --- /dev/null +++ b/navit/map/csv/quadtree.c @@ -0,0 +1,477 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include + +#include "quadtree.h" + +#define QUADTREE_NODE_CAPACITY 10 + +#define MAX_DOUBLE 9999999 + +static double +dist_sq(double x1,double y1,double x2,double y2) +{ + return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1); +} + +struct quadtree_node* +quadtree_node_new(struct quadtree_node* parent, double xmin, double xmax, double ymin, double ymax ) { + struct quadtree_node*ret = g_new0(struct quadtree_node,1); + ret->xmin = xmin; + ret->xmax = xmax; + ret->ymin = ymin; + ret->ymax = ymax; + ret->is_leaf = 1; + ret->parent = parent; + return ret; +} + +/* + * searches all four subnodes recursively for the list of items within a rectangle + */ +void +quadtree_find_rect_items(struct quadtree_node* this_, double dXMin, double dXMax, double dYMin, double dYMax, GList**out) { + + struct quadtree_node* nodes[4] = { this_->aa, this_->ab, this_->ba, this_->bb }; + if( this_->is_leaf ) { + int i; + //double distance_sq = current_max; + for(i=0;inode_num;++i) { //select only items within input rectangle + if(dXMin<=this_->items[i].longitude && this_->items[i].longitude<=dXMax && + dYMin<=this_->items[i].latitude && this_->items[i].latitude<=dYMax + ) { + *out=g_list_prepend(*out,&this_->items[i]); + } + } + } + else { + int i; + for( i=0;i<4;++i) { + if(nodes[i] ) { + //limit flooding + if(nodes[i]->xmaxxmin || + nodes[i]->ymaxymin + ) { + continue; + } + //recurse into subtiles if there is at least one subtile corner within input rectangle + quadtree_find_rect_items(nodes[i],dXMin,dXMax,dYMin,dYMax,out); + } + } + } +} + +/* + * searches all four subnodes recursively for the closest item + */ +struct quadtree_item* +quadtree_find_nearest_flood(struct quadtree_node* this_, struct quadtree_item* item, double current_max, struct quadtree_node* toSkip) { + struct quadtree_node* nodes[4] = { this_->aa, this_->ab, this_->ba, this_->bb }; + struct quadtree_item*res = NULL; + if( this_->is_leaf ) { + int i; + double distance_sq = current_max; + for(i=0;inode_num;++i) { + double curr_dist_sq = dist_sq(item->longitude,item->latitude,this_->items[i].longitude,this_->items[i].latitude); + if(curr_dist_sqitems[i]; + } + } + } + else { + int i; + for( i=0;i<4;++i) { + if(nodes[i] && nodes[i]!=toSkip) { + //limit flooding + struct quadtree_item*res_tmp = NULL; + if( + dist_sq(nodes[i]->xmin,nodes[i]->ymin,item->longitude,item->latitude)xmax,nodes[i]->ymin,item->longitude,item->latitude)xmax,nodes[i]->ymax,item->longitude,item->latitude)xmin,nodes[i]->ymax,item->longitude,item->latitude)longitude,item->latitude,res->longitude,res->latitude); + if(curr_dist_sqis_leaf ) { + int i; + for(i=0;inode_num;++i) { + //TODO equality check may not be correct on float values! maybe it can be replaced by range check with some tolerance + if(item->longitude==this_->items[i].longitude && item->latitude==this_->items[i].latitude) { + res = &this_->items[i]; + return res; + } + } + return NULL; + } + else { + if( + this_->aa && + this_->aa->xmin<=item->longitude && item->longitudeaa->xmax && + this_->aa->ymin<=item->latitude && item->latitudeaa->ymax + ) { + res = quadtree_find_item(this_->aa,item); + } + else if( + this_->ab && + this_->ab->xmin<=item->longitude && item->longitudeab->xmax && + this_->ab->ymin<=item->latitude && item->latitudeab->ymax + ) { + res = quadtree_find_item(this_->ab,item); + } + else if( + this_->ba && + this_->ba->xmin<=item->longitude && item->longitudeba->xmax && + this_->ba->ymin<=item->latitude && item->latitudeba->ymax + ) { + res = quadtree_find_item(this_->ba,item); + } + else if( + this_->bb && + this_->bb->xmin<=item->longitude && item->longitudebb->xmax && + this_->bb->ymin<=item->latitude && item->latitudebb->ymax + ) { + res = quadtree_find_item(this_->bb,item); + } + else { + return NULL; + } + } + return res; +} + +/* + * returns the containing node for an item + */ +struct quadtree_node* +quadtree_find_containing_node(struct quadtree_node* root, struct quadtree_item* item) +{ + struct quadtree_node*res = NULL; + + if( ! root ) { + return NULL; + } + + if( root->is_leaf ) { + int i; + for(i=0;inode_num;++i) { + if(item == &root->items[i]) { + res = root; + } + } + } + else { + if( + root->aa && + root->aa->xmin<=item->longitude && item->longitudeaa->xmax && + root->aa->ymin<=item->latitude && item->latitudeaa->ymax + ) { + res = quadtree_find_containing_node(root->aa,item); + } + else if( + root->ab && + root->ab->xmin<=item->longitude && item->longitudeab->xmax && + root->ab->ymin<=item->latitude && item->latitudeab->ymax + ) { + res = quadtree_find_containing_node(root->ab,item); + } + else if( + root->ba && + root->ba->xmin<=item->longitude && item->longitudeba->xmax && + root->ba->ymin<=item->latitude && item->latitudeba->ymax + ) { + res = quadtree_find_containing_node(root->ba,item); + } + else if( + root->bb && + root->bb->xmin<=item->longitude && item->longitudebb->xmax && + root->bb->ymin<=item->latitude && item->latitudebb->ymax + ) { + res = quadtree_find_containing_node(root->bb,item); + } + else { + //this should not happen + } + } + return res; +} + + +int quadtree_delete_item(struct quadtree_node* root, struct quadtree_item* item) +{ + struct quadtree_node* qn = quadtree_find_containing_node(root,item); + int i, bFound = 0; + + if(!qn || !qn->node_num) { + return 0; + } + + for(i=0;inode_num;++i) { + if( &qn->items[i] == item) { + bFound = 1; + } + if(bFound && inode_num-1) { + qn->items[i] = qn->items[i+1]; + } + } + if(bFound) { + --qn->node_num; + } + return bFound; +} + + +/* + * tries to find closest item, first it descend into the quadtree as much as possible, then if no point is found go up n levels and flood + */ +struct quadtree_item* +quadtree_find_nearest(struct quadtree_node* this_, struct quadtree_item* item) { + struct quadtree_item*res = NULL; + double distance_sq = MAX_DOUBLE; + if( ! this_ ) { + return NULL; + } + if( this_->is_leaf ) { + int i; + for(i=0;inode_num;++i) { + double curr_dist_sq = dist_sq(item->longitude,item->latitude,this_->items[i].longitude,this_->items[i].latitude); + if(curr_dist_sqitems[i]; + } + } + //go up n levels + if(!res && this_->parent) { + struct quadtree_item*res2 = NULL; + struct quadtree_node* anchestor = this_->parent; + int cnt = 0; + while (anchestor->parent && cnt<4) { + anchestor = anchestor->parent; + ++cnt; + } + res2 = quadtree_find_nearest_flood(anchestor,item,distance_sq,NULL); + if(res2) { + res = res2; + } + } + } + else { + if( + this_->aa && + this_->aa->xmin<=item->longitude && item->longitudeaa->xmax && + this_->aa->ymin<=item->latitude && item->latitudeaa->ymax + ) { + res = quadtree_find_nearest(this_->aa,item); + } + else if( + this_->ab && + this_->ab->xmin<=item->longitude && item->longitudeab->xmax && + this_->ab->ymin<=item->latitude && item->latitudeab->ymax + ) { + res = quadtree_find_nearest(this_->ab,item); + } + else if( + this_->ba && + this_->ba->xmin<=item->longitude && item->longitudeba->xmax && + this_->ba->ymin<=item->latitude && item->latitudeba->ymax + ) { + res = quadtree_find_nearest(this_->ba,item); + } + else if( + this_->bb && + this_->bb->xmin<=item->longitude && item->longitudebb->xmax && + this_->bb->ymin<=item->latitude && item->latitudebb->ymax + ) { + res = quadtree_find_nearest(this_->bb,item); + } + else { + if(this_->parent) { + //go up two levels + struct quadtree_node* anchestor = this_->parent; + int cnt = 0; + while (anchestor->parent && cnt<4) { + anchestor = anchestor->parent; + ++cnt; + } + res = quadtree_find_nearest_flood(anchestor,item,distance_sq,NULL); + } + } + } + return res; + +} + +void +quadtree_add(struct quadtree_node* this_, struct quadtree_item* item) { + if( this_->is_leaf ) { + int bSame = 1; + int i; + double lon = this_->items[0].longitude, lat = this_->items[0].latitude; + + if(QUADTREE_NODE_CAPACITY-1 == this_->node_num) { + //avoid infinite recursion when all elements has the same coordinate + for(i=0;inode_num;++i) { + if (lon != this_->items[i].longitude || lat != this_->items[i].latitude) { + bSame = 0; + break; + } + } + if (bSame) { + return; + } + this_->items[this_->node_num++] = *item; + quadtree_split(this_); + } else { + this_->items[this_->node_num++] = *item; + } + } + else { + if( + this_->xmin<=item->longitude && item->longitudexmin+(this_->xmax-this_->xmin)/2.0 && + this_->ymin<=item->latitude && item->latitudeymin+(this_->ymax-this_->ymin)/2.0 + ) { + if(!this_->aa) { + this_->aa = quadtree_node_new( this_, this_->xmin, this_->xmin+(this_->xmax-this_->xmin)/2.0 , this_->ymin, this_->ymin+(this_->ymax-this_->ymin)/2.0 ); + } + quadtree_add(this_->aa,item); + } + else if( + this_->xmin+(this_->xmax-this_->xmin)/2.0<=item->longitude && item->longitudexmax && + this_->ymin<=item->latitude && item->latitudeymin+(this_->ymax-this_->ymin)/2.0 + ) { + if(!this_->ab) { + this_->ab = quadtree_node_new( this_, this_->xmin+(this_->xmax-this_->xmin)/2.0, this_->xmax , this_->ymin, this_->ymin+(this_->ymax-this_->ymin)/2.0 ); + } + quadtree_add(this_->ab,item); + } + else if( + this_->xmin<=item->longitude && item->longitudexmin+(this_->xmax-this_->xmin)/2.0 && + this_->ymin+(this_->ymax-this_->ymin)/2.0<=item->latitude && item->latitudeymax + ) { + if(!this_->ba) { + this_->ba = quadtree_node_new( this_, this_->xmin, this_->xmin+(this_->xmax-this_->xmin)/2.0 , this_->ymin+(this_->ymax-this_->ymin)/2.0 , this_->ymax); + } + quadtree_add(this_->ba,item); + } + else if( + this_->xmin+(this_->xmax-this_->xmin)/2.0<=item->longitude && item->longitudexmax && + this_->ymin+(this_->ymax-this_->ymin)/2.0<=item->latitude && item->latitudeymax + ) { + if(!this_->bb) { + this_->bb = quadtree_node_new( this_, this_->xmin+(this_->xmax-this_->xmin)/2.0, this_->xmax , this_->ymin+(this_->ymax-this_->ymin)/2.0 , this_->ymax); + } + quadtree_add(this_->bb,item); + } + } +} + +void +quadtree_split(struct quadtree_node* this_) { + int i; + this_->is_leaf = 0; + for(i=0;inode_num;++i) { + if( + this_->xmin<=this_->items[i].longitude && this_->items[i].longitudexmin+(this_->xmax-this_->xmin)/2.0 && + this_->ymin<=this_->items[i].latitude && this_->items[i].latitudeymin+(this_->ymax-this_->ymin)/2.0 + ) { + if(!this_->aa) { + this_->aa = quadtree_node_new( this_, this_->xmin, this_->xmin+(this_->xmax-this_->xmin)/2.0 , this_->ymin, this_->ymin+(this_->ymax-this_->ymin)/2.0 ); + } + quadtree_add(this_->aa,&this_->items[i]); + } + else if( + this_->xmin+(this_->xmax-this_->xmin)/2.0<=this_->items[i].longitude && this_->items[i].longitudexmax && + this_->ymin<=this_->items[i].latitude && this_->items[i].latitudeymin+(this_->ymax-this_->ymin)/2.0 + ) { + if(!this_->ab) { + this_->ab = quadtree_node_new( this_, this_->xmin+(this_->xmax-this_->xmin)/2.0, this_->xmax , this_->ymin, this_->ymin+(this_->ymax-this_->ymin)/2.0 ); + } + quadtree_add(this_->ab,&this_->items[i]); + } + else if( + this_->xmin<=this_->items[i].longitude && this_->items[i].longitudexmin+(this_->xmax-this_->xmin)/2.0 && + this_->ymin+(this_->ymax-this_->ymin)/2.0<=this_->items[i].latitude && this_->items[i].latitudeymax + ) { + if(!this_->ba) { + this_->ba = quadtree_node_new( this_, this_->xmin, this_->xmin+(this_->xmax-this_->xmin)/2.0 , this_->ymin+(this_->ymax-this_->ymin)/2.0 , this_->ymax); + } + quadtree_add(this_->ba,&this_->items[i]); + } + else if( + this_->xmin+(this_->xmax-this_->xmin)/2.0<=this_->items[i].longitude && this_->items[i].longitudexmax && + this_->ymin+(this_->ymax-this_->ymin)/2.0<=this_->items[i].latitude && this_->items[i].latitudeymax + ) { + if(!this_->bb) { + this_->bb = quadtree_node_new( this_, this_->xmin+(this_->xmax-this_->xmin)/2.0, this_->xmax , this_->ymin+(this_->ymax-this_->ymin)/2.0 , this_->ymax); + } + quadtree_add(this_->bb,&this_->items[i]); + } + } + this_->node_num = 0; +} + +void +quadtree_destroy(struct quadtree_node* this_) { + if(this_->aa) { + quadtree_destroy(this_->aa); + this_->aa = NULL; + } + if(this_->ab) { + quadtree_destroy(this_->ab); + this_->ab = NULL; + } + if(this_->ba) { + quadtree_destroy(this_->ba); + this_->ba = NULL; + } + if(this_->bb) { + quadtree_destroy(this_->bb); + this_->bb = NULL; + } + free(this_); +} + + + + diff --git a/navit/map/csv/quadtree.h b/navit/map/csv/quadtree.h new file mode 100644 index 0000000..6cac239 --- /dev/null +++ b/navit/map/csv/quadtree.h @@ -0,0 +1,58 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#ifndef QUADTREE_H +#define QUADTREE_H + +#include + +#define QUADTREE_NODE_CAPACITY 10 + +struct quadtree_item { + double longitude; + double latitude; + void* data; +}; + +struct quadtree_node { + int node_num; + struct quadtree_item items[QUADTREE_NODE_CAPACITY]; + struct quadtree_node *aa; + struct quadtree_node *ab; + struct quadtree_node *ba; + struct quadtree_node *bb; + double xmin, xmax, ymin, ymax; + int is_leaf; + struct quadtree_node*parent; +}; + +struct quadtree_node* quadtree_node_new(struct quadtree_node* parent, double xmin, double xmax, double ymin, double ymax ); +struct quadtree_item* quadtree_find_nearest_flood(struct quadtree_node* this_, struct quadtree_item* item, double current_max, struct quadtree_node* toSkip); +struct quadtree_item* quadtree_find_nearest(struct quadtree_node* this_, struct quadtree_item* item); +struct quadtree_item* quadtree_find_item(struct quadtree_node* this_, struct quadtree_item* item); +struct quadtree_node* quadtree_find_containing_node(struct quadtree_node* root, struct quadtree_item* item); +int quadtree_delete_item(struct quadtree_node* root, struct quadtree_item* item); +void quadtree_find_rect_items(struct quadtree_node* this_, double dXMin, double dXMax, double dYMin, double dYMax, GList**out); +void quadtree_split(struct quadtree_node* this_); +void quadtree_add(struct quadtree_node* this_, struct quadtree_item* item); +void quadtree_destroy(struct quadtree_node* this_); + + + +#endif diff --git a/navit/map/filter/Makefile.am b/navit/map/filter/Makefile.am new file mode 100644 index 0000000..3bd14e8 --- /dev/null +++ b/navit/map/filter/Makefile.am @@ -0,0 +1,9 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_filter +if PLUGINS + modulemap_LTLIBRARIES = libmap_filter.la +else + noinst_LTLIBRARIES = libmap_filter.la +endif +libmap_filter_la_SOURCES = filter.c +libmap_filter_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ diff --git a/navit/map/filter/Makefile.in b/navit/map/filter/Makefile.in new file mode 100644 index 0000000..ed27cc8 --- /dev/null +++ b/navit/map/filter/Makefile.in @@ -0,0 +1,703 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/map/filter +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulemapdir)" +LTLIBRARIES = $(modulemap_LTLIBRARIES) $(noinst_LTLIBRARIES) +libmap_filter_la_LIBADD = +am_libmap_filter_la_OBJECTS = filter.lo +libmap_filter_la_OBJECTS = $(am_libmap_filter_la_OBJECTS) +libmap_filter_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libmap_filter_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libmap_filter_la_rpath = +@PLUGINS_TRUE@am_libmap_filter_la_rpath = -rpath $(modulemapdir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libmap_filter_la_SOURCES) +DIST_SOURCES = $(libmap_filter_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_filter +@PLUGINS_TRUE@modulemap_LTLIBRARIES = libmap_filter.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libmap_filter.la +libmap_filter_la_SOURCES = filter.c +libmap_filter_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/map/filter/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/map/filter/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulemapLTLIBRARIES: $(modulemap_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulemapdir)" || $(MKDIR_P) "$(DESTDIR)$(modulemapdir)" + @list='$(modulemap_LTLIBRARIES)'; test -n "$(modulemapdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulemapdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulemapdir)"; \ + } + +uninstall-modulemapLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulemap_LTLIBRARIES)'; test -n "$(modulemapdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulemapdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulemapdir)/$$f"; \ + done + +clean-modulemapLTLIBRARIES: + -test -z "$(modulemap_LTLIBRARIES)" || rm -f $(modulemap_LTLIBRARIES) + @list='$(modulemap_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libmap_filter.la: $(libmap_filter_la_OBJECTS) $(libmap_filter_la_DEPENDENCIES) + $(libmap_filter_la_LINK) $(am_libmap_filter_la_rpath) $(libmap_filter_la_OBJECTS) $(libmap_filter_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filter.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulemapdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulemapLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulemapLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulemapLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulemapLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-modulemapLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulemapLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/map/filter/filter.c b/navit/map/filter/filter.c new file mode 100644 index 0000000..edc6a84 --- /dev/null +++ b/navit/map/filter/filter.c @@ -0,0 +1,430 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include "config.h" +#include "debug.h" +#include "plugin.h" +#include "projection.h" +#include "item.h" +#include "map.h" +#include "maptype.h" +#include "attr.h" +#include "coord.h" +#include "transform.h" +#include "file.h" +#include "zipfile.h" +#include "linguistics.h" +#include "endianess.h" + +struct filter_entry { + enum item_type first,last; + enum attr_type cond_attr; + char *cond_str; +}; + +struct filter { + GList *old; + GList *new; +}; + +struct map_priv { + struct map *parent; + GList *filters; +}; + +struct map_rect_priv { + struct map_selection *sel; + struct map_priv *m; + struct map_rect *parent; + struct item item,*parent_item; +}; + +struct map_search_priv { + struct map_rect_priv *mr; +}; + +static enum item_type +filter_type(struct map_priv *m, struct item *item) +{ + GList *filters=m->filters; + struct filter_entry *entry; + while (filters) { + struct filter *filter=filters->data; + int pos=0,count=0; + GList *old,*new; + old=filter->old; + while (old) { + entry=old->data; + if (item->type >= entry->first && item->type <= entry->last) + break; + pos+=entry->last-entry->first+1; + old=g_list_next(old); + } + if (old && entry && entry->cond_attr != attr_none) { + struct attr attr; + if (!item_attr_get(item, entry->cond_attr, &attr)) { + old=NULL; + } else { + char *wildcard=strchr(entry->cond_str,'*'); + int len; + if (!wildcard) + len=strlen(entry->cond_str)+1; + else + len=wildcard-entry->cond_str; + if (strncmp(entry->cond_str, attr.u.str, len)) + old=NULL; + } + item_attr_rewind(item); + } + if (old) { + new=filter->new; + if (!new) + return item->type; + while (new) { + struct filter_entry *entry=new->data; + count+=entry->last-entry->first+1; + new=g_list_next(new); + } + pos%=count; + new=filter->new; + while (new) { + struct filter_entry *entry=new->data; + if (pos <= entry->last-entry->first) + return entry->first+pos; + pos-=entry->last-entry->first+1; + new=g_list_next(new); + } + } + filters=g_list_next(filters); + } + return item->type; +} + +static void +free_filter_entry(struct filter_entry *filter) +{ + g_free(filter->cond_str); + g_free(filter); +} + +static void +free_filter(struct filter *filter) +{ + g_list_foreach(filter->old, (GFunc)free_filter_entry, NULL); + g_list_free(filter->old); + filter->old=NULL; + g_list_foreach(filter->new, (GFunc)free_filter_entry, NULL); + g_list_free(filter->new); + filter->new=NULL; +} + +static void +free_filters(struct map_priv *m) +{ + g_list_foreach(m->filters, (GFunc)free_filter, NULL); + g_list_free(m->filters); + m->filters=NULL; +} + +static GList * +parse_filter(char *filter) +{ + GList *ret=NULL; + for (;;) { + char *condition,*range,*next=strchr(filter,','); + struct filter_entry *entry=g_new0(struct filter_entry, 1); + if (next) + *next++='\0'; + condition=strchr(filter,'['); + if (condition) + *condition++='\0'; + range=strchr(filter,'-'); + if (range) + *range++='\0'; + if (!strcmp(filter,"*") && !range) { + entry->first=type_none; + entry->last=type_last; + } else { + entry->first=item_from_name(filter); + if (range) + entry->last=item_from_name(range); + else + entry->last=entry->first; + } + if (condition) { + char *end=strchr(condition,']'); + char *eq=strchr(condition,'='); + if (end && eq && eq < end) { + *end='\0'; + *eq++='\0'; + if (eq[0] == '"' || eq[0] == '\'') { + char *quote=strchr(eq+1,eq[0]); + if (quote) { + eq++; + *quote='\0'; + } + } + entry->cond_attr=attr_from_name(condition); + entry->cond_str=g_strdup(eq); + } + } + ret=g_list_append(ret, entry); + if (!next) + break; + filter=next; + } + return ret; +} + +static void +parse_filters(struct map_priv *m, char *filter) +{ + char *filter_copy=g_strdup(filter); + char *str=filter_copy; + + free_filters(m); + for (;;) { + char *pos,*bracket,*eq,*next=strchr(str,';'); + struct filter *filter=g_new0(struct filter, 1); + if (next) + *next++='\0'; + pos=str; + for (;;) { + eq=strchr(pos,'='); + if (eq) { + bracket=strchr(pos,'['); + if (bracket && bracket < eq) { + bracket=strchr(pos,']'); + if (bracket) + pos=bracket+1; + else { + eq=NULL; + break; + } + } else { + *eq++='\0'; + break; + } + } else + break; + } + filter->old=parse_filter(str); + if (eq) + filter->new=parse_filter(eq); + m->filters=g_list_append(m->filters,filter); + if (!next) + break; + str=next; + } + g_free(filter_copy); +} + +static void +map_filter_coord_rewind(void *priv_data) +{ + struct map_rect_priv *mr=priv_data; + item_coord_rewind(mr->parent_item); +} + +static int +map_filter_coord_get(void *priv_data, struct coord *c, int count) +{ + struct map_rect_priv *mr=priv_data; + return item_coord_get(mr->parent_item, c, count); +} + +static void +map_filter_attr_rewind(void *priv_data) +{ + struct map_rect_priv *mr=priv_data; + item_attr_rewind(mr->parent_item); +} + +static int +map_filter_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + struct map_rect_priv *mr=priv_data; + return item_attr_get(mr->parent_item, attr_type, attr); +} + +static struct item_methods methods_filter = { + map_filter_coord_rewind, + map_filter_coord_get, + map_filter_attr_rewind, + map_filter_attr_get, +}; + +static struct map_rect_priv * +map_filter_rect_new(struct map_priv *map, struct map_selection *sel) +{ + struct map_rect_priv *mr=NULL; + struct map_rect *parent; + parent=map_rect_new(map->parent, sel); + if (parent) { + mr=g_new0(struct map_rect_priv, 1); + mr->m=map; + mr->sel=sel; + mr->parent=parent; + mr->item.meth=&methods_filter; + mr->item.priv_data=mr; + } + return mr; +} + +static void +map_filter_rect_destroy(struct map_rect_priv *mr) +{ + map_rect_destroy(mr->parent); + g_free(mr); +} + +static struct item * +map_filter_rect_get_item(struct map_rect_priv *mr) +{ + mr->parent_item=map_rect_get_item(mr->parent); + if (!mr->parent_item) + return NULL; + mr->item.type=filter_type(mr->m,mr->parent_item); + mr->item.id_lo=mr->parent_item->id_lo; + mr->item.id_hi=mr->parent_item->id_hi; + return &mr->item; +} + +static struct item * +map_filter_rect_get_item_byid(struct map_rect_priv *mr, int id_hi, int id_lo) +{ + dbg(0,"enter\n"); + mr->parent_item=map_rect_get_item_byid(mr->parent, id_hi, id_lo); + if (!mr->parent_item) + return NULL; + mr->item.type=filter_type(mr->m,mr->parent_item); + mr->item.id_lo=mr->parent_item->id_lo; + mr->item.id_hi=mr->parent_item->id_hi; + return &mr->item; +} + +static struct map_search_priv * +map_filter_search_new(struct map_priv *map, struct item *item, struct attr *search, int partial) +{ + dbg(0,"enter\n"); + return NULL; +} + +static struct item * +map_filter_search_get_item(struct map_search_priv *map_search) +{ + dbg(0,"enter\n"); + return NULL; +} + +static void +map_filter_search_destroy(struct map_search_priv *ms) +{ + dbg(0,"enter\n"); +} + +static void +map_filter_destroy(struct map_priv *m) +{ + map_destroy(m->parent); + g_free(m); +} + +static int +map_filter_set_attr(struct map_priv *m, struct attr *attr) +{ + switch (attr->type) { + case attr_filter: + parse_filters(m,attr->u.str); + return 1; + default: + return 0; + } +} + + +static struct map_methods map_methods_filter = { + projection_mg, + "utf-8", + map_filter_destroy, + map_filter_rect_new, + map_filter_rect_destroy, + map_filter_rect_get_item, + map_filter_rect_get_item_byid, + map_filter_search_new, + map_filter_search_destroy, + map_filter_search_get_item, + NULL, + NULL, + map_filter_set_attr, +}; + + + +static struct map_priv * +map_filter_new(struct map_methods *meth, struct attr **attrs) +{ + struct map_priv *m=NULL; + struct attr **parent_attrs,type,*subtype=attr_search(attrs, NULL, attr_subtype),*filter=attr_search(attrs, NULL, attr_filter); + struct map *map; + int i,j; + if (! subtype || !filter) + return NULL; + i=0; + while (attrs[i]) + i++; + parent_attrs=g_new(struct attr *,i+1); + i=0; + j=0; + while (attrs[i]) { + if (attrs[i]->type != attr_filter && attrs[i]->type != attr_type) { + if (attrs[i]->type == attr_subtype) { + type=*attrs[i]; + type.type = attr_type; + parent_attrs[j]=&type; + } else + parent_attrs[j]=attrs[i]; + j++; + } + i++; + } + parent_attrs[j]=NULL; + *meth=map_methods_filter; + map=map_new(NULL, parent_attrs); + if (map) { + m=g_new0(struct map_priv, 1); + m->parent=map; + parse_filters(m,filter->u.str); + } + g_free(parent_attrs); + return m; +} + +void +plugin_init(void) +{ + dbg(1,"filter: plugin_init\n"); + plugin_register_map_type("filter", map_filter_new); +} + diff --git a/navit/map/garmin/Makefile.am b/navit/map/garmin/Makefile.am new file mode 100644 index 0000000..8fa224f --- /dev/null +++ b/navit/map/garmin/Makefile.am @@ -0,0 +1,33 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_garmin +AM_CPPFLAGS+= @LIBGARMIN_CFLAGS@ +INCLUDES=-I$(top_srcdir)/navit/map/garmin/libgarmin +AM_CPPFLAGS+=-I$(top_srcdir)/navit/map/garmin/libgarmin +AM_CPPFLAGS+=-I$(srcdir) + +modulemap_LTLIBRARIES = libmap_garmin.la +libmap_garmin_la_SOURCES = garmin.c garmin.h gar2navit.c gar2navit.h +libmap_garmin_la_LIBADD = @LIBGARMIN_LIBS@ +libmap_garmin_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +nodist_libmap_garmin_la_SOURCES = g2nbuiltin.h +builddir = @builddir@ + +gar2navit.l$(OBJEXT): g2nbuiltin.h + +CLEANFILES = g2nbuiltin.h + +noinst_PROGRAMS=gentypes$(EXEEXT) +gentypes_SOURCES=gentypes.c + +gentypes.$(OBJEXT): gentypes.c + $(CC_FOR_BUILD) -I$(top_srcdir)/navit -I$(top_srcdir) -c -o $@ $< + +gentypes$(EXEEXT): $(gentypes_OBJECTS) $(gentypes_DEPENDENCIES) + @rm -f gentypes$(EXEEXT) + $(CCLD_FOR_BUILD) -o $@ $(gentypes_OBJECTS) + +g2nbuiltin.h: gentypes$(EXEEXT) garmintypes.txt + ./gentypes$(EXEEXT) $(top_srcdir)/navit/map/garmin/garmintypes.txt $@ + +EXTRA_DIST = garmintypes.txt + diff --git a/navit/map/garmin/Makefile.in b/navit/map/garmin/Makefile.in new file mode 100644 index 0000000..06748d1 --- /dev/null +++ b/navit/map/garmin/Makefile.in @@ -0,0 +1,732 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/map/garmin +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulemapdir)" +LTLIBRARIES = $(modulemap_LTLIBRARIES) +libmap_garmin_la_DEPENDENCIES = +am_libmap_garmin_la_OBJECTS = garmin.lo gar2navit.lo +nodist_libmap_garmin_la_OBJECTS = +libmap_garmin_la_OBJECTS = $(am_libmap_garmin_la_OBJECTS) \ + $(nodist_libmap_garmin_la_OBJECTS) +libmap_garmin_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libmap_garmin_la_LDFLAGS) $(LDFLAGS) -o $@ +PROGRAMS = $(noinst_PROGRAMS) +am_gentypes_OBJECTS = gentypes.$(OBJEXT) +gentypes_OBJECTS = $(am_gentypes_OBJECTS) +gentypes_LDADD = $(LDADD) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libmap_garmin_la_SOURCES) \ + $(nodist_libmap_garmin_la_SOURCES) $(gentypes_SOURCES) +DIST_SOURCES = $(libmap_garmin_la_SOURCES) $(gentypes_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_garmin \ + @LIBGARMIN_CFLAGS@ -I$(top_srcdir)/navit/map/garmin/libgarmin \ + -I$(srcdir) +INCLUDES = -I$(top_srcdir)/navit/map/garmin/libgarmin +modulemap_LTLIBRARIES = libmap_garmin.la +libmap_garmin_la_SOURCES = garmin.c garmin.h gar2navit.c gar2navit.h +libmap_garmin_la_LIBADD = @LIBGARMIN_LIBS@ +libmap_garmin_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +nodist_libmap_garmin_la_SOURCES = g2nbuiltin.h +CLEANFILES = g2nbuiltin.h +noinst_PROGRAMS = gentypes$(EXEEXT) +gentypes_SOURCES = gentypes.c +EXTRA_DIST = garmintypes.txt +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/map/garmin/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/map/garmin/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulemapLTLIBRARIES: $(modulemap_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulemapdir)" || $(MKDIR_P) "$(DESTDIR)$(modulemapdir)" + @list='$(modulemap_LTLIBRARIES)'; test -n "$(modulemapdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulemapdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulemapdir)"; \ + } + +uninstall-modulemapLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulemap_LTLIBRARIES)'; test -n "$(modulemapdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulemapdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulemapdir)/$$f"; \ + done + +clean-modulemapLTLIBRARIES: + -test -z "$(modulemap_LTLIBRARIES)" || rm -f $(modulemap_LTLIBRARIES) + @list='$(modulemap_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libmap_garmin.la: $(libmap_garmin_la_OBJECTS) $(libmap_garmin_la_DEPENDENCIES) + $(libmap_garmin_la_LINK) -rpath $(modulemapdir) $(libmap_garmin_la_OBJECTS) $(libmap_garmin_la_LIBADD) $(LIBS) + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gar2navit.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/garmin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gentypes.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) +installdirs: + for dir in "$(DESTDIR)$(modulemapdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulemapLTLIBRARIES \ + clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulemapLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulemapLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulemapLTLIBRARIES clean-noinstPROGRAMS \ + ctags distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-modulemapLTLIBRARIES \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-modulemapLTLIBRARIES + + +gar2navit.l$(OBJEXT): g2nbuiltin.h + +gentypes.$(OBJEXT): gentypes.c + $(CC_FOR_BUILD) -I$(top_srcdir)/navit -I$(top_srcdir) -c -o $@ $< + +gentypes$(EXEEXT): $(gentypes_OBJECTS) $(gentypes_DEPENDENCIES) + @rm -f gentypes$(EXEEXT) + $(CCLD_FOR_BUILD) -o $@ $(gentypes_OBJECTS) + +g2nbuiltin.h: gentypes$(EXEEXT) garmintypes.txt + ./gentypes$(EXEEXT) $(top_srcdir)/navit/map/garmin/garmintypes.txt $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/map/garmin/gar2navit.c b/navit/map/garmin/gar2navit.c new file mode 100644 index 0000000..7c44504 --- /dev/null +++ b/navit/map/garmin/gar2navit.c @@ -0,0 +1,219 @@ +/* + Copyright (C) 2007 Alexander Atanasov + + 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 = ALL, street_1_land, Road +GROUP,0x01 = MCTL, highway_land, Major HWY thick +GROUP,0x02 = MCTL, street_4_land, Principal HWY-thick +GROUP,0x03 = MCTL, 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 - RGN1 +1 - RGN2-4 + */ + +#include +#include +#include +#include "item.h" +#include "attr.h" +#include "garmin.h" +#include "gar2navit.h" + +static int add_def(struct gar2nav_conv *conv, int type, unsigned short minid, + unsigned short maxid, unsigned int group, char *ntype, + char *descr) +{ + enum item_type it; + struct gar2navit *g2n; + dlog(11, "group=%d type=%d routable=%u min=%04X max=%04X ntype=%s descr=%s\n", + group, type, minid, maxid, ntype, descr); + it = item_from_name(ntype); + if (it==type_none) { + dlog(1, "Please define: %s\n", ntype); + } + g2n = calloc(1, sizeof(*g2n)); + if (!g2n) + return -1; + g2n->id = minid; + g2n->maxid = maxid; + g2n->ntype = it; + g2n->descr = strdup(descr); + g2n->group = group; + if (type == 1) { + g2n->next = conv->points; + conv->points = g2n; + } else if (type == 2) { + g2n->next = conv->polylines; + conv->polylines = g2n; + } else if (type == 3) { + g2n->next = conv->polygons; + conv->polygons = g2n; + } + return 0; +} + +static int load_types_file(char *file, struct gar2nav_conv *conv) +{ + char buf[4096]; + char descr[4096]; + char ntype[4096]; + FILE *fp; + unsigned int minid, maxid, group; + int rc; + int type = -1; + + fp = fopen(file, "r"); + if (!fp) + return -1; + 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; + } + // assume only lines are routable + 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; + } + } + add_def(conv, type, minid, maxid, group, ntype, descr); + } + fclose(fp); + return 1; +} + +struct gar2nav_conv *g2n_conv_load(char *file) +{ + struct gar2nav_conv *c; + int rc; + + c = calloc(1, sizeof(*c)); + if (!c) + return c; + rc = load_types_file(file, c); + if (rc < 0) { + dlog(1, "Failed to load: [%s]\n", file); + free(c); + return NULL; + } + return c; +} + +enum item_type g2n_get_type(struct gar2nav_conv *c, unsigned int type, unsigned short id) +{ + struct gar2navit *def = NULL; + int group; + group = (type >> G2N_KIND_SHIFT); + type &= ~G2N_KIND_MASK; + if (type == G2N_POINT) + def = c->points; + else if (type == G2N_POLYLINE) + def = c->polylines; + else if (type == G2N_POLYGONE) + def = c->polygons; + else { + dlog(1, "Unknown conversion type:%d\n", type); + return type_none; + } + + if (!def) { + dlog(5, "No conversion data for %d\n", type); + return type_none; + } + + while (def) { + if (def->group == group && + ((!def->maxid && def->id == id) || + (def->id <= id && id <= def->maxid))) + return def->ntype; + def = def->next; + } + dlog(5, "Type[%d]:ID:[%04X] unknown\n", type, id); + return type == G2N_POINT ? type_point_unkn : type_street_unkn; +} + +char *g2n_get_descr(struct gar2nav_conv *c, int type, unsigned short id) +{ + struct gar2navit *def = NULL; + if (type == G2N_POINT) + def = c->points; + else if (type == G2N_POLYLINE) + def = c->polylines; + else if (type == G2N_POLYGONE) + def = c->polygons; + else { + dlog(1, "Unknown conversion type:%d\n", type); + return NULL; + } + while (def) { + if ((!def->maxid && def->id == id) || + (def->id <= id && id <= def->maxid)) + return def->descr; + def = def->next; + } + dlog(5, "Type[%d]:ID:[%04X] unknown\n", type, id); + return NULL; +} + +#if 0 +int main(int argc, char **argv) +{ + load_types_file(argv[1], NULL); + return 0; +} +#endif + +#include "g2nbuiltin.h" diff --git a/navit/map/garmin/gar2navit.h b/navit/map/garmin/gar2navit.h new file mode 100644 index 0000000..27c5f65 --- /dev/null +++ b/navit/map/garmin/gar2navit.h @@ -0,0 +1,52 @@ +/* + Copyright (C) 2007 Alexander Atanasov + + 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. + +*/ + +#define GROUP_RGN1 0 +#define GROUP_RGN2 1 + +struct gar2navit { + unsigned short id; + unsigned short maxid; + enum item_type ntype; + unsigned group; + char *descr; + struct gar2navit *next; +}; + +#define G2N_POINT 1 +#define G2N_POLYLINE 2 +#define G2N_POLYGONE 3 +#define G2N_KIND_MASK 0xF0000000 +#define G2N_KIND_SHIFT 28 +#define G2N_RGN1 (GROUP_RGN1<<29) +#define G2N_RGN2 (GROUP_RGN2<<29) + +struct gar2nav_conv { + struct gar2navit *points; + struct gar2navit *polylines; + struct gar2navit *polygons; +}; + +struct gar2nav_conv *g2n_conv_load(char *file); +enum item_type g2n_get_type(struct gar2nav_conv *c, unsigned int type, unsigned short id); +char *g2n_get_descr(struct gar2nav_conv *c, int type, unsigned short id); +struct gar2nav_conv *g2n_default_conv(void); diff --git a/navit/map/garmin/garmin.c b/navit/map/garmin/garmin.c new file mode 100644 index 0000000..609bcab --- /dev/null +++ b/navit/map/garmin/garmin.c @@ -0,0 +1,997 @@ +/* + Copyright (C) 2007 Alexander Atanasov + + 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. + +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "config.h" +#include "plugin.h" +#include "data.h" +#include "projection.h" +#include "item.h" +#include "debug.h" +#include "map.h" +#include "maptype.h" +#include "attr.h" +#include "coord.h" +#include "transform.h" +#include +#include "attr.h" +#include "coord.h" +#include +#include "garmin.h" +#include "gar2navit.h" + + +static int map_id; + +struct map_priv { + int id; + char *filename; + struct gar2nav_conv *conv; + struct gar *g; +}; + +struct map_rect_priv { + int id; + struct coord_rect r; + char *label; // FIXME: Register all strings for searches + int limit; + struct map_priv *mpriv; + struct gmap *gmap; + struct gobject *cobj; + struct gobject *objs; + struct item item; + unsigned int last_coord; + void *last_itterated; + struct coord last_c; + void *last_oattr; + unsigned int last_attr; + struct gar_search *search; +}; + +int garmin_debug = 10; + +void +logfn(char *file, int line, int level, char *fmt, ...) +{ + va_list ap; + char fileline[256]; + int sz; + if (level > garmin_debug) + return; + va_start(ap, fmt); + sz = sprintf(fileline, "%s:%d:%d|", file, line, level); + debug_vprintf(0, "", strlen(""), fileline, sz, + 1, fmt, ap); + va_end(ap); +} +// need a base map and a map +struct gscale { + char *label; + float scale; + int bits; +}; + +static struct gscale mapscales[] = { + {"7000 km", 70000.0, 8} + ,{"5000 km", 50000.0, 8} + ,{"3000 km", 30000.0, 9} + ,{"2000 km", 20000.0, 9} + ,{"1500 km", 15000.0, 10} + ,{"1000 km", 10000.0, 10} + ,{"700 km", 7000.0, 11} + ,{"500 km", 5000.0, 11} + ,{"300 km", 3000.0, 13} + ,{"200 km", 2000.0, 13} + ,{"150 km", 1500.0, 13} + ,{"100 km", 1000.0, 14} + ,{"70 km", 700.0, 15} + ,{"50 km", 500.0, 16} + ,{"30 km", 300.0, 16} + ,{"20 km", 200.0, 17} + ,{"15 km", 150.0, 17} + ,{"10 km", 100.0, 18} + ,{"7 km", 70.0, 18} + ,{"5 km", 50.0, 19} + ,{"3 km", 30.0, 19} + ,{"2 km", 20.0, 20} + ,{"1.5 km", 15.0, 22} + ,{"1 km", 10.0, 24} + ,{"700 m", 7.0, 24} + ,{"500 m", 5.0, 24} + ,{"300 m", 3.0, 24} + ,{"200 m", 2.0, 24} + ,{"150 m", 1.5, 24} + ,{"100 m", 1.0, 24} + ,{"70 m", 0.7, 24} + ,{"50 m", 0.5, 24} + ,{"30 m", 0.3, 24} + ,{"20 m", 0.2, 24} + ,{"15 m", 0.1, 24} + ,{"10 m", 0.15, 24} +}; + + +static int +garmin_object_label(struct gobject *o, struct attr *attr) +{ + struct map_rect_priv *mr = o->priv_data; + char *codepage; + char *label; + if (!mr) { + dlog(1, "Error object do not have priv_data!!\n"); + return 0; + } + if (mr->label) { + free(mr->label); + } + label = gar_get_object_lbl(o); + if (label) { + codepage = gar_obj_codepage(o); + if (*codepage != 'a') { + mr->label = g_convert(label, -1,"utf-8",codepage,NULL,NULL,NULL); + free(label); + } else + mr->label = label; + } else { + mr->label = NULL; + return 0; + } + if (mr->label) { + char *cp = mr->label; +#warning FIXME Process label and give only the visible part + if (*mr->label == '@' || *mr->label == '^') + cp++; + /* FIXME: If zoomlevel is high convert ^ in the string to spaces */ + attr->u.str = cp; + return 1; + } + return 0; +} + +static int +garmin_object_debug(struct gobject *o, struct attr *attr) +{ + struct map_rect_priv *mr = o->priv_data; + if (!mr) { + dlog(1, "Error object do not have priv_data!!\n"); + return 0; + } + if (mr->label) + free(mr->label); + mr->label = gar_object_debug_str(o); + if (mr->label) { + attr->u.str = mr->label; + return 1; + } + return 0; +} + + +static struct map_search_priv * +gmap_search_new(struct map_priv *map, struct item *item, struct attr *search, int partial) +{ + struct map_rect_priv *mr=g_new0(struct map_rect_priv, 1); + struct gar_search *gs; + int rc; + + dlog(1, "Called!\n"); + mr->mpriv=map; + gs = g_new0(struct gar_search,1); + if (!gs) { + dlog(1, "Can not init search \n"); + free(mr); + return NULL; + } + mr->search = gs; + switch (search->type) { + case attr_country_name: + gs->type = GS_COUNTRY; + break; + case attr_town_name: + gs->type = GS_CITY; + break; + case attr_town_postal: + gs->type = GS_ZIP; + break; + case attr_street_name: + gs->type = GS_ROAD; + break; +#if someday + case attr_region_name: + case attr_intersection: + case attr_housenumber: +#endif + default: + dlog(1, "Don't know how to search for %d\n", search->type); + goto out_err; + } + gs->match = partial ? GM_START : GM_EXACT; + gs->needle = strdup(search->u.str); + dlog(5, "Needle: %s\n", gs->needle); + + mr->gmap = gar_find_subfiles(mr->mpriv->g, gs, GO_GET_SEARCH); + if (!mr->gmap) { + dlog(1, "Can not init search \n"); + goto out_err; + } + rc = gar_get_objects(mr->gmap, 0, gs, &mr->objs, GO_GET_SEARCH); + if (rc < 0) { + dlog(1, "Error loading objects\n"); + goto out_err; + } + mr->cobj = mr->objs; + dlog(4, "Loaded %d objects\n", rc); + return (struct map_search_priv *)mr; + +out_err: + free(gs); + free(mr); + return NULL; +} + +/* Assumes that only one item will be itterated at time! */ +static void +coord_rewind(void *priv_data) +{ + struct gobject *g = priv_data; + struct map_rect_priv *mr = g->priv_data; + mr->last_coord = 0; +}; + +static void +attr_rewind(void *priv_data) +{ + struct gobject *g = priv_data; + struct map_rect_priv *mr = g->priv_data; + mr->last_attr = 0; +}; + +static int +point_coord_get(void *priv_data, struct coord *c, int count) +{ + struct gobject *g = priv_data; + struct map_rect_priv *mr = g->priv_data; + struct gcoord gc; + if (!count) + return 0; + if (g != mr->last_itterated) { + mr->last_itterated = g; + mr->last_coord = 0; + } + + if (mr->last_coord > 0) + return 0; + + gar_get_object_coord(mr->gmap, g, &gc); + c->x = gc.x; + c->y = gc.y; + mr->last_coord++; +// dlog(1,"point: x=%d y=%d\n", c->x, c->y); + // dlog(1, "point: x=%f y=%f\n", GARDEG(c->x), GARDEG(c->y)); + return 1; +} + +static int +coord_is_node(void *priv_data) +{ + struct gobject *g = priv_data; + struct map_rect_priv *mr = g->priv_data; + + return gar_is_object_dcoord_node(mr->gmap, g, mr->last_coord); +} + +static int +poly_coord_get(void *priv_data, struct coord *c, int count) +{ + struct gobject *g = priv_data; + struct map_rect_priv *mr = g->priv_data; + int ndeltas = 0, total = 0; + struct gcoord dc; + + if (!count) + return 0; + + if (g != mr->last_itterated) { + mr->last_itterated = g; + mr->last_coord = 0; + } + ndeltas = gar_get_object_deltas(g); + if (mr->last_coord > ndeltas + 1) + return 0; + while (count --) { + if (mr->last_coord == 0) { + gar_get_object_coord(mr->gmap, g, &dc); + mr->last_c.x = dc.x; + mr->last_c.y = dc.y; + } else { + if (!gar_get_object_dcoord(mr->gmap, g, mr->last_coord - 1, &dc)) { + mr->last_coord = ndeltas + 2; + return total; + } + mr->last_c.x += dc.x; + mr->last_c.y += dc.y; + } + c->x = mr->last_c.x; + c->y = mr->last_c.y; + ddlog(1, "poly: x=%f y=%f\n", GARDEG(c->x), GARDEG(c->y)); +// dlog(1,"poly: x=%d y=%d\n", c->x, c->y); + c++; + total++; + mr->last_coord ++; + } + return total; +} + +// for _any we must return one by one +static int +point_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + struct gobject *g = priv_data; + struct map_rect_priv *mr = g->priv_data; + int rc; + switch (attr_type) { + case attr_any: + if (g != mr->last_oattr) { + mr->last_oattr = g; + mr->last_attr = 0; + } + switch(mr->last_attr) { + case 0: + mr->last_attr++; + attr->type = attr_label; + rc = garmin_object_label(g, attr); + if (rc) + return rc; + case 1: + mr->last_attr++; + attr->type = attr_debug; + rc = garmin_object_debug(g, attr); + if (rc) + return rc; + case 2: + mr->last_attr++; + if (g->type == GO_POLYLINE) { + attr->type = attr_street_name; + rc = garmin_object_label(g, attr); + if (rc) + return rc; + } + case 3: + mr->last_attr++; + attr->type = attr_flags; + attr->u.num = 0; + rc = gar_object_flags(g); + if (rc & F_ONEWAY) + attr->u.num |= AF_ONEWAY; + if (rc & F_SEGMENTED) + attr->u.num |= AF_SEGMENTED; + return 1; + default: + return 0; + } + break; + case attr_label: + attr->type = attr_label; + return garmin_object_label(g, attr); + case attr_town_name: + attr->type = attr_town_name; + return garmin_object_label(g, attr); + case attr_street_name: + attr->type = attr_type; + return garmin_object_label(g, attr); + case attr_street_name_systematic: + /* TODO: Get secondary labels of roads */ + return 0; + case attr_flags: + attr->type = attr_flags; + attr->u.num = 0; + rc = gar_object_flags(g); + if (rc & F_ONEWAY) + attr->u.num |= AF_ONEWAY; + if (rc & F_SEGMENTED) + attr->u.num |= AF_SEGMENTED; + return 1; + default: + dlog(1, "Don't know about attribute %d[%04X]=%s yet\n", attr_type,attr_type, attr_to_name(attr_type)); + } + + return 0; +} + +static struct item_methods methods_garmin_point = { + coord_rewind, + point_coord_get, + attr_rewind, + point_attr_get, +}; + +static struct item_methods methods_garmin_poly = { + coord_rewind, + poly_coord_get, + attr_rewind, // point_attr_rewind, + point_attr_get, // poly_attr_get, + coord_is_node, +}; + +static int +search_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + struct gobject *g = priv_data; + struct map_rect_priv *mr = g->priv_data; + int rc; + switch (attr_type) { + case attr_any: + if (g != mr->last_oattr) { + mr->last_oattr = g; + mr->last_attr = 0; + } + switch(mr->last_attr) { + case 0: + mr->last_attr++; + attr->type = attr_label; + rc = garmin_object_label(g, attr); + if (rc) + return rc; + case 1: + mr->last_attr++; + attr->type = attr_debug; + rc = garmin_object_debug(g, attr); + if (rc) + return rc; + case 2: + mr->last_attr++; + if (g->type == GO_POLYLINE) { + attr->type = attr_street_name; + rc = garmin_object_label(g, attr); + if (rc) + return rc; + } + case 3: + mr->last_attr++; + attr->type = attr_flags; + attr->u.num = 0; + rc = gar_object_flags(g); + if (rc & F_ONEWAY) + attr->u.num |= AF_ONEWAY; + if (rc & F_SEGMENTED) + attr->u.num |= AF_SEGMENTED; + return 1; + default: + return 0; + } + break; + case attr_label: + attr->type = attr_label; + return garmin_object_label(g, attr); + case attr_town_name: + attr->type = attr_town_name; + if (mr->label) + free(mr->label); + mr->label = gar_srch_get_city(g); + attr->u.str = mr->label; + if (attr->u.str) + return 1; + return 0; + case attr_town_id: + rc = gar_srch_get_cityid(g); + if (rc) { + attr->type = attr_town_id; + attr->u.num = rc; + return 1; + } + return 0; + case attr_town_postal: + attr->type = attr_town_postal; + attr->u.str = gar_srch_get_zip(g); + if (attr->u.str) + return 1; + return 0; + case attr_street_name: + attr->type = attr_street_name; + if (mr->label) + free(mr->label); + mr->label = gar_srch_get_roadname(g); + attr->u.str = mr->label; + if (attr->u.str) + return 1; + return 0; + case attr_street_id: + attr->type = attr_street_id; + attr->u.num = gar_srch_get_roadid(g); + if (attr->u.num) + return 1; + return 0; + case attr_flags: + attr->type = attr_flags; + attr->u.num = 0; + rc = gar_object_flags(g); + if (rc & F_ONEWAY) + attr->u.num |= AF_ONEWAY; + if (rc & F_SEGMENTED) + attr->u.num |= AF_SEGMENTED; + return 1; + case attr_country_id: + rc = gar_srch_get_countryid(g); + if (rc) { + attr->type = attr_country_id; + attr->u.num = rc; + return 1; + } + return 0; + case attr_country_name: + attr->type = attr_country_name; + attr->u.str = gar_srch_get_country(g); + if (attr->u.str) + return 1; + return 0; + case attr_district_id: + rc = gar_srch_get_regionid(g); + if (rc) { + attr->type = attr_district_id; + attr->u.num = rc; + return 1; + } + return 0; + case attr_district_name: + attr->type = attr_district_name; + attr->u.str = gar_srch_get_region(g); + if (attr->u.str) + return 1; + return 0; + case attr_town_streets_item: + return 0; + default: + dlog(1, "Don't know about attribute %d[%04X]=%s yet\n", + attr_type,attr_type, attr_to_name(attr_type)); + } + + return 0; +} + +static int +search_coord_get(void *priv_data, struct coord *c, int count) +{ + struct gobject *g = priv_data; + struct map_rect_priv *mr = g->priv_data; + struct gcoord gc; + if (!count) + return 0; + if (g != mr->last_itterated) { + mr->last_itterated = g; + mr->last_coord = 0; + } + + if (mr->last_coord > 0) + return 0; + + if (gar_get_object_coord(mr->gmap, g, &gc)) { + c->x = gc.x; + c->y = gc.y; + mr->last_coord++; + return 1; + } + return 0; +} + +static struct item_methods methods_garmin_search = { + coord_rewind, + search_coord_get, + attr_rewind, + search_attr_get, +}; + + +static struct item * +garmin_poi2item(struct map_rect_priv *mr, struct gobject *o, unsigned short otype) +{ + if (mr->mpriv->conv) { + int mask = gar_object_group(o) << G2N_KIND_SHIFT; + mr->item.type = g2n_get_type(mr->mpriv->conv, G2N_POINT|mask, otype); + } + mr->item.meth = &methods_garmin_point; + return &mr->item; +} + +static struct item * +garmin_pl2item(struct map_rect_priv *mr, struct gobject *o, unsigned short otype) +{ + if (mr->mpriv->conv) { + int mask = gar_object_group(o) << G2N_KIND_SHIFT; + mr->item.type = g2n_get_type(mr->mpriv->conv, G2N_POLYLINE|mask, otype); + } + mr->item.meth = &methods_garmin_poly; + return &mr->item; +} + +static struct item * +garmin_pg2item(struct map_rect_priv *mr, struct gobject *o, unsigned short otype) +{ + if (mr->mpriv->conv) { + int mask = gar_object_group(o) << G2N_KIND_SHIFT; + mr->item.type = g2n_get_type(mr->mpriv->conv, G2N_POLYGONE|mask, otype); + } + mr->item.meth = &methods_garmin_poly; + return &mr->item; +} + +static struct item * +garmin_srch2item(struct map_rect_priv *mr, struct gobject *o, unsigned short otype) +{ + mr->item.type = type_country_label; + mr->item.meth = &methods_garmin_search; + return &mr->item; +} + +static struct item * +garmin_obj2item(struct map_rect_priv *mr, struct gobject *o) +{ + unsigned short otype; + otype = gar_obj_type(o); + mr->item.type = type_none; + switch (o->type) { + case GO_POINT: + return garmin_poi2item(mr, o, otype); + case GO_POLYLINE: + return garmin_pl2item(mr, o, otype); + case GO_POLYGON: + return garmin_pg2item(mr, o, otype); + case GO_ROAD: + return garmin_pl2item(mr, o, otype); +#if 0 + case GO_SEARCH: + return garmin_srch2item(mr, o, otype); +#endif + default: + dlog(1, "Unknown garmin object type:%d\n", + o->type); + } + return NULL; +} + +static struct item * +gmap_rect_get_item_byid(struct map_rect_priv *mr, int id_hi, int id_lo) +{ + struct gobject *o; + o = mr->objs = gar_get_object_by_id(mr->mpriv->g, id_hi, id_lo); + if (!o) { + dlog(1, "Can not find object\n"); + return NULL; + } + + mr->item.id_hi = id_hi; + mr->item.id_lo = id_lo; + mr->item.priv_data = o; + mr->item.type = type_none; + o->priv_data = mr; + if (!garmin_obj2item(mr, o)) + return NULL; + return &mr->item; +} + +static struct item * +gmap_rect_get_item(struct map_rect_priv *mr) +{ + struct gobject *o; + if (!mr->objs) + return NULL; + if (!mr->cobj) + return NULL; + // mr->cobj = mr->objs; + o = mr->cobj; +// dlog(1, "gi:o=%p\n", o); + mr->cobj = mr->cobj->next; + if (o) { + mr->item.id_hi = gar_object_mapid(o); + mr->item.id_lo = gar_object_index(o); + mr->item.priv_data = o; + mr->item.type = type_none; + o->priv_data = mr; + if (!garmin_obj2item(mr, o)) + return NULL; + return &mr->item; + } + return NULL; +} + +#define max(a,b) ((a) > (b) ? (a) : (b)) +struct nl2gl_t { + int g; + int bits; + char *descr; +}; + +struct nl2gl_t nl2gl_1[] = { + { /* 0 */ .g = 12, .descr = "0-120m", }, + { /* 1 */ .g = 11, .descr = "0-120m", }, + { /* 2 */ .g = 10, .descr = "0-120m", }, + { /* 3 */ .g = 9, .descr = "0-120m", }, + { /* 4 */ .g = 8, .descr = "0-120m", }, + { /* 5 */ .g = 7, .descr = "0-120m", }, + { /* 6 */ .g = 6, .descr = "0-120m", }, + { /* 7 */ .g = 5, .descr = "0-120m", }, + { /* 8 */ .g = 4, .descr = "0-120m", }, + { /* 9 */ .g = 4, .descr = "0-120m", }, + { /* 10 */ .g = 3, .descr = "0-120m", }, + { /* 11 */ .g = 3, .descr = "0-120m", }, + { /* 12 */ .g = 2, .descr = "0-120m", }, + { /* 13 */ .g = 2, .descr = "0-120m", }, + { /* 14 */ .g = 2, .descr = "0-120m", }, + { /* 15 */ .g = 1, .descr = "0-120m", }, + { /* 16 */ .g = 1, .descr = "0-120m", }, + { /* 17 */ .g = 1, .descr = "0-120m", }, + { /* 18 */ .g = 0, .descr = "0-120m", }, +}; + +struct nl2gl_t nl2gl[] = { + { /* 0 */ .g = 9, .descr = "0-120m", }, + { /* 1 */ .g = 9, .descr = "0-120m", }, + { /* 2 */ .g = 8, .descr = "0-120m", }, + { /* 3 */ .g = 8, .descr = "0-120m", }, + { /* 4 */ .g = 7, .descr = "0-120m", }, + { /* 5 */ .g = 7, .descr = "0-120m", }, + { /* 6 */ .g = 6, .descr = "0-120m", }, + { /* 7 */ .g = 6, .descr = "0-120m", }, + { /* 8 */ .g = 5, .descr = "0-120m", }, + { /* 9 */ .g = 5, .descr = "0-120m", }, + { /* 10 */ .g = 4, .descr = "0-120m", }, + { /* 11 */ .g = 4, .descr = "0-120m", }, + { /* 12 */ .g = 3, .descr = "0-120m", }, + { /* 13 */ .g = 3, .descr = "0-120m", }, + { /* 14 */ .g = 2, .descr = "0-120m", }, + { /* 15 */ .g = 2, .descr = "0-120m", }, + { /* 16 */ .g = 1, .descr = "0-120m", }, + { /* 17 */ .g = 1, .descr = "0-120m", }, + { /* 18 */ .g = 0, .descr = "0-120m", }, +}; + +static int +get_level(struct map_selection *sel) +{ + return sel->order; +} + +static int +garmin_get_selection(struct map_rect_priv *map, struct map_selection *sel) +{ + struct gar_rect r; + struct gmap *gm; + struct gobject **glast = NULL; + int rc; + int sl, el; + int level = 0; // 18; /* max level for maps, overview maps can have bigger + /* levels we do not deal w/ them + */ + int flags = 0; + if (sel && sel->range.min == type_street_0 && sel->range.max == type_ferry) { + // Get all roads + flags = GO_GET_ROUTABLE; + } else if (sel) + flags = GO_GET_SORTED; + + if (sel) { + r.lulat = sel->u.c_rect.lu.y; + r.lulong = sel->u.c_rect.lu.x; + r.rllat = sel->u.c_rect.rl.y; + r.rllong = sel->u.c_rect.rl.x; + level = get_level(sel); +// level = nl2gl[level].g; + dlog(2, "Looking level=%d for %f %f %f %f\n", + level, r.lulat, r.lulong, r.rllat, r.rllong); + } + gm = gar_find_subfiles(map->mpriv->g, sel ? &r : NULL, flags); + if (!gm) { + if (sel) { + dlog(1, "Can not find map data for the area: %f %f %f %f\n", + r.lulat, r.lulong, r.rllat, r.rllong); + } else { + dlog(1, "Can not find map data\n"); + } + return -1; + } +#if 0 + sl = (18-(gm->maxlevel - gm->minlevel))/2; + el = sl + (gm->maxlevel - gm->minlevel); + if (level < sl) + level = sl; + if (level > el) + level = el; + level = level - sl; + level = (gm->maxlevel - gm->minlevel) - level; + dlog(3, "sl=%d el=%d level=%d\n", sl, el, level); +#endif + sl = (18-gm->zoomlevels)/2; + el = sl + gm->zoomlevels; + if (level < sl) + level = sl; + if (level > el) + level = el; + level = level - sl; + level = gm->basebits + level; + dlog(3, "sl=%d el=%d level=%d\n", sl, el, level); + map->gmap = gm; + glast = &map->objs; + while (*glast) { + if ((*glast)->next) { + *glast = (*glast)->next; + } else + break; + } + rc = gar_get_objects(gm, level, sel ? &r : NULL, glast, flags); + if (rc < 0) { + dlog(1, "Error loading objects\n"); + return -1; + } + map->cobj = map->objs; + dlog(2, "Loaded %d objects\n", rc); + return rc; +} +// Can not return NULL, navit segfaults +static struct map_rect_priv * +gmap_rect_new(struct map_priv *map, struct map_selection *sel) +{ + struct map_selection *ms = sel; + struct map_rect_priv *mr; + + if (!map) + return NULL; + mr = calloc(1, sizeof(*mr)); + if (!mr) + return mr; + mr->mpriv = map; + if (!sel) { + return mr; + } else { + while (ms) { + dlog(2, "order %d\n", ms->order); + if (garmin_get_selection(mr, ms) < 0) { + // free(mr); + // return NULL; + } + ms = ms->next; + } + } + return mr; +} + +static void +gmap_rect_destroy(struct map_rect_priv *mr) +{ + dlog(11,"destroy maprect\n"); + if (mr->gmap) + gar_free_gmap(mr->gmap); + if (mr->objs) + gar_free_objects(mr->objs); + if (mr->label) + free(mr->label); + free(mr); +} + +static void +gmap_search_destroy(struct map_search_priv *ms) +{ + gmap_rect_destroy((struct map_rect_priv *)ms); +} + +static void +gmap_destroy(struct map_priv *m) +{ + dlog(5, "garmin_map_destroy\n"); + if (m->g) + gar_free(m->g); + if (m->filename) + free(m->filename); + free(m); +} + +static struct map_methods map_methods = { + projection_garmin, + "utf-8", + gmap_destroy, + gmap_rect_new, + gmap_rect_destroy, + gmap_rect_get_item, + gmap_rect_get_item_byid, + gmap_search_new, + gmap_search_destroy, + NULL, +}; + +static struct map_priv * +gmap_new(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) +{ + struct map_priv *m; + struct attr *data; + struct attr *debug; + struct attr *flags; + char buf[PATH_MAX]; + struct stat st; + int dl = 1; + struct gar_config cfg; + int debugmask = 0; + + data=attr_search(attrs, NULL, attr_data); + if (! data) + return NULL; + debug=attr_search(attrs, NULL, attr_debug); + if (debug) { + dl = atoi(debug->u.str); + if (!dl) + dl = 1; + } + flags=attr_search(attrs, NULL, attr_flags); + if (flags) { + debugmask = flags->u.num; + } + m=g_new(struct map_priv, 1); + m->id=++map_id; + m->filename = strdup(data->u.str); + if (!m->filename) { + g_free(m); + return NULL; + } + memset(&cfg, 0, sizeof(struct gar_config)); + cfg.opm = OPM_GPS; + cfg.debuglevel = dl; + cfg.debugmask = debugmask; + garmin_debug = dl; + m->g = gar_init_cfg(NULL, logfn, &cfg); + if (!m->g) { + g_free(m->filename); + g_free(m); + return NULL; + } + // we want the data now, later we can load only what's necessery + if (gar_img_load(m->g, m->filename, 1) < 0) { + gar_free(m->g); + g_free(m->filename); + g_free(m); + return NULL; + } + m->conv = NULL; + snprintf(buf, sizeof(buf), "%s.types", m->filename); + if (!stat(buf, &st)) { + dlog(1, "Loading custom types from %s\n", buf); + m->conv = g2n_conv_load(buf); + } + if (!m->conv) { + dlog(1, "Using builtin types\n"); + m->conv = g2n_default_conv(); + } + if (!m->conv) { + dlog(1, "Failed to load map types\n"); + } + *meth=map_methods; + return m; +} + +void +plugin_init(void) +{ + plugin_register_map_type("garmin", gmap_new); +} diff --git a/navit/map/garmin/garmin.h b/navit/map/garmin/garmin.h new file mode 100644 index 0000000..94e893b --- /dev/null +++ b/navit/map/garmin/garmin.h @@ -0,0 +1,32 @@ +/* + Copyright (C) 2007 Alexander Atanasov + + 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. + +*/ + +#define dlog(x,y ...) logfn(__FILE__,__LINE__,x, ##y) +#ifdef HARDDEBUG +#define ddlog(x,y ...) logfn(__FILE__,__LINE__,x, ##y) +#else +#define ddlog(x,y ...) +#endif + +extern int garmin_debug; +void logfn(char *file, int line, int level, char *fmt, ...); + diff --git a/navit/map/garmin/garmintypes.txt b/navit/map/garmin/garmintypes.txt new file mode 100644 index 0000000..ce8b0d4 --- /dev/null +++ b/navit/map/garmin/garmintypes.txt @@ -0,0 +1,707 @@ +# +# +# +POINT +0, 0x0000 = label_unkn, Unknown label +0, 0x0100 = town_label_1e5, Megapolis (10M +) +0, 0x0200 = town_label_5e4, Megapolis (5-10M) +0, 0x0300 = town_label_2e4, Big City (2-5M) +0, 0x0400 = town_label_1e4, Big City (1-2M) +0, 0x0500 = town_label_5e3, Big City (0.5-1M) +0, 0x0600 = town_label_2e3, City (200-500k) +0, 0x0700 = town_label_1e3, City (100-200k) +0, 0x0800 = town_label_5e2, City (50-100k) +0, 0x0900 = town_label_2e2, City (20-50k) +0, 0x0a00 = town_label_1e2, City (10-20k) +0, 0x0b00 = town_label_5e1, Small City (5-10k) +0, 0x0c00 = town_label_2e1, Small City (2-5k) +0, 0x0d00 = town_label_1e1, Village (1-2k) +0, 0x0e00 = town_label_5e0, Village (500-1000) +0, 0x0f00 = town_label_2e0, Village (200-500) +0, 0x1000 = town_label_1e0, Village (100-200) +0, 0x1100 = town_label_0e0, Village (0-100) + +0, 0x1200 = port_label, Port with services +0, 0x1300 = label_unkn, Unknown label2 +0, 0x1400-0x14FF = country_label, Large Country Name +0, 0x1500-0x15FF = country_label, Country Name +0, 0x1c00 = poi_wreck, Unclassified Obstruction +0, 0x1c01 = poi_wreck, Wreck +0, 0x1c02 = poi_danger_sea_wreck, submerged wreck, dangerous +0, 0x1c03 = poi_nondangerous, submerged wreck, non-dangerous +0, 0x1c04 = poi_wreck, Wreck, cleared by wire drag +0, 0x1c05 = poi_rock, Obstruction, visible at high water +0, 0x1c06 = poi_rock, Obstruction, awash +0, 0x1c07 = poi_rock, Obstruction, submerged +0, 0x1c08 = poi_rock, Obstruction, cleared by wire drag +0, 0x1c09 = poi_rock, Rock, awash +0, 0x1c0a = poi_rock, Rock, submerged at low Water +0, 0x1c0b = poi_sounding, Sounding +0, 0x1d00 = poi_tide, Tide Prediction + +0, 0x1e00-0x1e3f = district_label, District, Province, State Name +0, 0x1f00 = district_label_0e0, Region, District Name + +# Fixme if it has label how to change to highway_exit_with_label ?? +0, 0x2000-0x203F = highway_exit, Exit +0, 0x2100-0x213F = highway_exit, Exit with Services +0, 0x2200-0x223F = highway_exit, Exit with Restroom +0, 0x2300-0x233F = highway_exit, Exit with Convinience Store +0, 0x2400-0x243F = highway_exit, Exit with Weight Station +0, 0x2500-0x253F = highway_exit, Exit with Toolbooth Booth +0, 0x2600-0x263F = highway_exit, Exit with Information +0, 0x2700-0x273F = highway_exit, Exit + +0, 0x2800-0x283F = district_label_1e0, Region Name + +0, 0x2900 = poi_public_utilities, Services + +0, 0x2A00 = poi_dining, Dining(Other) +0, 0x2A01 = poi_dining, Dining(American) +0, 0x2A02 = poi_dining, Dining(Asian) +0, 0x2A03 = poi_dining, Dining(Barbecue) +0, 0x2A04 = poi_dining, Dining(Chinese) +0, 0x2A05 = poi_dining, Dining(Deli/Bakery) +0, 0x2A06 = poi_dining, Dining(International) +0, 0x2A07 = poi_fastfood, Fast Food +0, 0x2A08 = poi_dining, Dining(Italian) +0, 0x2A09 = poi_dining, Dining(Mexican) +0, 0x2A0A = poi_dining, Dining(Pizza) +0, 0x2A0B = poi_dining, Dining(Sea Food) +0, 0x2A0C = poi_dining, Dining(Steak/Grill) +0, 0x2A0D = poi_dining, Dining(Bagel/Donut) +0, 0x2A0E = poi_dining, Dining(Cafe/Diner) +0, 0x2A0F = poi_dining, Dining(French) +0, 0x2A10 = poi_dining, Dining(German) +0, 0x2A11 = poi_dining, Dining(British Isles) +0, 0x2A12 = poi_dining, Dining(Special Foods) + +0, 0x2B00 = poi_hotel, Hotel(Other) +0, 0x2B01 = poi_hotel, Hotel/Motel +0, 0x2B02 = poi_hotel, Bed & Breakfast inn +0, 0x2B03 = poi_camp_rv, Camping/RV-Park +0, 0x2B04 = poi_resort, Resort + +0, 0x2C00 = poi_attraction, Amusement Park +0, 0x2C01 = poi_attraction, Amusement Park +0, 0x2C02 = poi_museum_history, Museum/History +0, 0x2C03 = poi_library, Libraries +0, 0x2C04 = poi_landmark, Land Mark +0, 0x2C05 = poi_school, School +0, 0x2C06 = poi_park, Park +0, 0x2C07 = poi_zoo, Zoo +0, 0x2C08 = poi_stadium, Sportpark, Stadium,(point) +0, 0x2C09 = poi_fair, Fair, Conference(point) +0, 0x2C0A = poi_wine, Wine restaurant(point) +0, 0x2C0B = poi_worship, Place of Worship +0, 0x2C0C = poi_hotspring, Hot Spring + +0, 0x2D00 = poi_theater, Theater +0, 0x2D01 = poi_theater, Theater +0, 0x2D02 = poi_bar, Bar +0, 0x2D03 = poi_cinema, Cinema +0, 0x2D04 = poi_casino, Casino +0, 0x2D05 = poi_golf, Golf +0, 0x2D06 = poi_skiing, Skiing Center +0, 0x2D07 = poi_bowling, Bowling +0, 0x2D08 = poi_icesport, Ice/Sporting +0, 0x2D09 = poi_swimming, Swimming +0, 0x2D0A = poi_sport, Sports(point) +0, 0x2D0B = poi_sailing, Sailing Airport + +0, 0x2E00 = poi_shopping, Shoping general +0, 0x2E01 = poi_shop_department, Department Store +0, 0x2E02 = poi_shop_grocery, Grocery +0, 0x2E03 = poi_shop_merchandise, General Merchandiser +0, 0x2E04 = poi_mall, Shopping Center +0, 0x2E05 = poi_pharmacy, Pharmacy +0, 0x2E06 = poi_shopping, Convenience +0, 0x2E07 = poi_shop_apparel, Apparel +0, 0x2E08 = poi_shop_handg, House and Garden +0, 0x2E09 = poi_shop_furniture, Home Furnishing +0, 0x2E0a = poi_shop_retail, Special Retail +0, 0x2E0b = poi_shop_computer, Computer/Software +0, 0x2E0c = poi_shop_computer, Mobile Communications + +0, 0x2F00 = poi_service, generic service +0, 0x2F01 = poi_fuel, Fuel/Gas +0, 0x2F02 = poi_car_rent, Car Rental +0, 0x2F03 = poi_autoservice, Car Repair +0, 0x2F04 = poi_airport, Airport +0, 0x2F05 = poi_post_office, Post Office +0, 0x2F06 = poi_bank, Bank +0, 0x2F07 = poi_car_dealer_parts, Car Dealer(point) +0, 0x2F08 = poi_bus_station, Bus Station +0, 0x2F09 = poi_marina, Marina +0, 0x2F0A = poi_wrecker, Wrecker Service +0, 0x2F0B = poi_car_parking, Parking +0, 0x2F0C = poi_restroom, Restroom +0, 0x2F0D = poi_auto_club, Automobile Club +0, 0x2F0E = poi_car_wash, Car Wash +0, 0x2F0F = poi_shop_gps, Garmin Dealer +0, 0x2F10 = poi_personal_service, Personal Service +0, 0x2F11 = poi_business_service, Business Service +0, 0x2F12 = poi_communication, Communication +0, 0x2F13 = poi_repair_service, Repair Service +0, 0x2F14 = poi_social_service, Social Service +0, 0x2F15 = poi_public_utilities, Utility +0, 0x2F16 = poi_truck_stop, Truck Stop +0, 0x2F17 = poi_bus_stop, Bus Stop + +0, 0x3000 = poi_emergency, generic emergency/government +0, 0x3001 = poi_police, Police Station +0, 0x3002 = poi_hospital, Hospital +0, 0x3003 = poi_public_office, Public Office +0, 0x3004 = poi_justice, Justice +0, 0x3005 = poi_concert, Concert hall(point) +0, 0x3006 = poi_border_station, Border Station(point) +0, 0x3007 = poi_goverment_building, Goverment Building +0, 0x3008 = poi_firebrigade, FireFighters Station + +0, 0x4000-0x403F = poi_golf, Golf +0, 0x4100-0x413F = poi_fish, Fish +0, 0x4200-0x423F = poi_wreck, Wreck +0, 0x4300-0x433F = poi_marina, Marina +0, 0x4400-0x443F = poi_fuel, Gas +0, 0x4500-0x453F = poi_restaurant, Restaurant +0, 0x4600-0x463F = poi_bar, Bar +0, 0x4700-0x473F = poi_boat_ramp, Boat Ramp +0, 0x4800-0x483F = poi_camping, Camping +0, 0x4900-0x493F = poi_park, Park +0, 0x4A00-0x4A3F = poi_picnic, Picnic Area +0, 0x4B00-0x4B3F = poi_hospital, Hospital +0, 0x4C00-0x4C3F = poi_information, Information +0, 0x4D00-0x4D3F = poi_car_parking, Parking +0, 0x4E00-0x4E3F = poi_restroom, Restroom +0, 0x4F00-0x4F3F = poi_shower, Shower +0, 0x5000-0x503F = poi_drinking_water, Drinking Water +0, 0x5100-0x513F = poi_telephone, Telephone +0, 0x5200-0x523F = poi_scenic_area, Scenic Area +0, 0x5300-0x533F = poi_skiing, Skiing +0, 0x5400-0x543F = poi_swimming, Swimming +0, 0x5500-0x553F = poi_dam, Dam + +0, 0x5600-0x563F = poi_forbidden_area, Forbiden Area +0, 0x5700-0x573F = poi_danger_area, Danger Area +0, 0x5800-0x583F = poi_restricted_area, Restricted Area + +0, 0x5900 = poi_airport, Generic Airport +0, 0x5901 = poi_airport, Large Airport +0, 0x5902 = poi_airport, Medium Airport +0, 0x5903 = poi_airport, Small Airport +0, 0x5904 = poi_heliport, Heliport +0, 0x5905-0x593F = poi_airport, Airport + +0, 0x5a00 = poi_mark, Kilometer Pole +0, 0x5b00 = poi_mark, Kolokol +0, 0x5c00 = poi_diving, Diving Place + +0, 0x5D00-0x5D3F = poi_daymark, Daymark,Green Square +0, 0x5E00-0x5E3F = poi_daymark, Daymark,Red Triangle + +0, 0x6000 = poi_loudspeaker, LoudSpeaker +0, 0x6100 = poi_building, House + +0, 0x6200 = poi_height, Height with point in feet one decimal place +0, 0x6300 = poi_height, Height without point in feet no decimal place +0, 0x6400 = poi_manmade_feature, Manmade Feature +0, 0x6401 = poi_bridge, Bridge +0, 0x6402 = poi_building, Building +0, 0x6403 = poi_cemetery, Cemetery +0, 0x6404 = poi_church, Church +0, 0x6405 = poi_townhall, Civil +0, 0x6406 = poi_crossing, Crossing +0, 0x6407 = poi_dam, Dam +0, 0x6408 = poi_hospital, Hospital +0, 0x6409 = poi_levee, Levee +0, 0x640A = poi_locale, Locale +0, 0x640B = poi_military, Military +0, 0x640C = poi_mine, Mine +0, 0x640D = poi_oil_field, Oil Field +0, 0x640E = poi_park, Park +0, 0x640F = poi_post_office, Post +0, 0x6410 = poi_school, School +0, 0x6411 = poi_tower, Tower +0, 0x6412 = poi_trail, Trail +0, 0x6413 = poi_tunnel, Tunnel +0, 0x6414 = poi_drinking_water, Drink water +0, 0x6415 = town_ghost, Ghost Town +0, 0x6416 = poi_ruins, Subdivision + +0, 0x6500 = poi_water_feature, Water Feature +0, 0x6501 = poi_water_feature, Arroyo +0, 0x6502 = poi_water_feature, Sand Bar +0, 0x6503 = poi_bay, Bay +0, 0x6504 = poi_bend, Bend +0, 0x6505 = poi_water_feature, Canal +0, 0x6506 = poi_water_feature, Channel +0, 0x6507 = poi_cove, Cove +0, 0x6508 = poi_water_feature, Falls +0, 0x6509 = poi_water_feature, Geyser +0, 0x650A = poi_water_feature, Glacier +0, 0x650B = poi_marine, Harbour +0, 0x650C = poi_island, Island +0, 0x650D = poi_water_feature, Lake +0, 0x650E = poi_water_feature, Rapids +0, 0x650F = poi_water_feature, Reservoir +0, 0x6510 = poi_water_feature, Sea +0, 0x6511 = poi_water_feature, Spring +0, 0x6512 = poi_water_feature, Stream +0, 0x6513 = poi_water_feature, Swamp + +0, 0x6600 = poi_land_feature, Land Feature +0, 0x6601 = poi_land_feature, Arch +0, 0x6602 = poi_land_feature, Area +0, 0x6603 = poi_land_feature, Basin +0, 0x6604 = poi_land_feature, Beach +0, 0x6605 = poi_land_feature, Bench +0, 0x6606 = poi_land_feature, Cape +0, 0x6607 = poi_land_feature, Cliff +0, 0x6608 = poi_land_feature, Crater +0, 0x6609 = poi_land_feature, Flat +0, 0x660A = poi_land_feature, Forest +0, 0x660B = poi_land_feature, Gap +0, 0x660C = poi_land_feature, Gut +0, 0x660D = poi_land_feature, Isthmus +0, 0x660E = poi_land_feature, Lava +0, 0x660F = poi_land_feature, Pillar +0, 0x6610 = poi_land_feature, Plain +0, 0x6611 = poi_land_feature, Range +0, 0x6612 = poi_land_feature, Reserve +0, 0x6613 = poi_land_feature, Ridge +0, 0x6614 = poi_land_feature, Rock +0, 0x6615 = poi_land_feature, Slope +0, 0x6616 = poi_land_feature, Summit +0, 0x6617 = poi_land_feature, Valley +0, 0x6618 = poi_land_feature, Woods + +# This are dublicated to 0x1700, 0x1800, 0x1900, 0x1A00, 0x1B00 +# fix them if you need them +0, 0x1600 = poi_marine_type, Beakon +0, 0x1601 = poi_marine_type, Fog Horn +0, 0x1602 = poi_marine_type, Radio Beacon +0, 0x1603 = poi_marine_type, Racon +0, 0x1604 = poi_marine_type, Day Beacon, red triangle +0, 0x1605 = poi_marine_type, Day Beacon, green square +0, 0x1606 = poi_marine_type, Day Beacon, white diamond +0, 0x1607 = poi_marine_type, unlit Navaid, white +0, 0x1608 = poi_marine_type, unlit Navaid, red +0, 0x1609 = poi_marine_type, unlit Navaid, green +0, 0x160a = poi_marine_type, unlit Navaid, black +0, 0x160b = poi_marine_type, unlit Navaid, yellow or amber +0, 0x160c = poi_marine_type, unlit Navaid, orange +0, 0x160d = poi_marine_type, unlit Navaid, multi colored +0, 0x160e = poi_marine_type, Navaid, unknown +0, 0x160f = poi_marine_type, lighted Navaid, white +0, 0x1610 = poi_marine_type, lighted Navaid, red +0, 0x1611 = poi_marine_type, lighted Navaid, green +0, 0x1612 = poi_marine_type, lighted Navaid, yellow or amber +0, 0x1613 = poi_marine_type, lighted Navaid, orange +0, 0x1614 = poi_marine_type, lighted Navaid, violet +0, 0x1615 = poi_marine_type, lighted Navaid, blue +0, 0x1616 = poi_marine_type, lighted Navaid, multi colored +# RGN2-4 types +# Marine types start +1, 0x0100 = point_unkn, Light +1, 0x0102 = point_unkn, Light with north topmark +1, 0x0103 = point_unkn, Light with south topmark +1, 0x0104 = point_unkn, Light with east topmark +1, 0x0105 = point_unkn, Light with west topmark +1, 0x0106 = point_unkn, Isolated danger light +1, 0x0107 = point_unkn, Port hand light +1, 0x0108 = point_unkn, Starboard hand light +1, 0x0109 = point_unkn, Special purpose light +1, 0x010a = point_unkn, Safe water light +1, 0x0200 = point_unkn, Buoy +1, 0x0201 = point_unkn, Buoy +1, 0x0202 = point_unkn, Buoy with north topmark +1, 0x0203 = point_unkn, Buoy with south topmark +1, 0x0204 = point_unkn, Buoy with east topmark +1, 0x0205 = point_unkn, Buoy with west topmark +1, 0x0206 = point_unkn, Beacon +1, 0x0207 = point_unkn, Spar buoy +1, 0x0208 = point_unkn, Isolated danger buoy +1, 0x0209 = point_unkn, Port hand buoy +1, 0x020a = point_unkn, Starboard hand buoy +1, 0x020b = point_unkn, Special purpose buoy +1, 0x020c = point_unkn, Safe water buoy +1, 0x020d = point_unkn, Platform buoy +1, 0x020e = point_unkn, Beacon with north topmark +1, 0x020f = point_unkn, Beacon with south north topmark +1, 0x0210 = point_unkn, Beacon with east topmark +1, 0x0211 = point_unkn, Beacon with west topmark +1, 0x0212 = point_unkn, Isolated danger beacon +1, 0x0213 = point_unkn, Port hand beacon +1, 0x0214 = point_unkn, Starboard hand beacon +1, 0x0215 = point_unkn, Special purpose beacon +1, 0x0216 = point_unkn, Mooring buoy +1, 0x0217 = point_unkn, Fixed point +1, 0x0218 = point_unkn, Pole +1, 0x0300 = point_unkn, Depth point +1, 0x0301 = point_unkn, Depth point invisible +1, 0x0302 = point_unkn, Depth point underscore +1, 0x0303 = point_unkn, Spot height +1, 0x0304 = point_unkn, Building +1, 0x0305 = point_unkn, Chimney +1, 0x0306 = point_unkn, Church +1, 0x0307 = point_unkn, Tanks +1, 0x0308 = point_unkn, Tower +1, 0x0309 = point_unkn, Rock +1, 0x030a = point_unkn, Triangulation point +1, 0x030b = point_unkn, Radio mast +1, 0x0400 = point_unkn, Isolated danger +1, 0x0401 = point_unkn, Obstruction +1, 0x0402 = point_unkn, Wreck +1, 0x0403 = point_unkn, Exposed wreck +1, 0x0404 = point_unkn, Well +1, 0x0405 = point_unkn, Foul +1, 0x0406 = point_unkn, Explosive +1, 0x0407 = point_unkn, Fish haven +1, 0x0408 = point_unkn, Obstruction that covers +1, 0x0409 = point_unkn, Marine farm +1, 0x040a = point_unkn, Dangerous rock +1, 0x040b = point_unkn, No bottom found +1, 0x040c = point_unkn, Exposed rock +1, 0x040d = point_unkn, Dangerous rock +1, 0x040e = point_unkn, Underwater rock (non-dangerous rock) +1, 0x040f = point_unkn, Shoal +1, 0x0500 = point_unkn, Label point +1, 0x0600 = point_unkn, Centered label +1, 0x0700 = point_unkn, Miscellaneous point +1, 0x0701 = point_unkn, Recommended anchorage +1, 0x0702 = point_unkn, Pilot boarding place +1, 0x0703 = point_unkn, Yacht harbour +1, 0x0704 = point_unkn, Pile +1, 0x0705 = point_unkn, Anchoring prohibited +1, 0x0706 = point_unkn, Fishing prohibited +1, 0x0707 = point_unkn, Precautionary area +1, 0x0708 = point_unkn, Radio report point +1, 0x0709 = point_unkn, Anchorage berths +1, 0x070a = point_unkn, Rescue station +1, 0x070b = point_unkn, Fishing harbour +1, 0x070c = point_unkn, Airport +1, 0x0800 = point_unkn, Information +1, 0x0901 = point_unkn, Bottom conditions +1, 0x0902 = point_unkn, Fishing information +1, 0x0903 = point_unkn, Facility +# NT types start +1, 0x0b00 = poi_dining, Dining(Other) +1, 0x0b04 = poi_dining, Dining(Chinese) +1, 0x0b05 = poi_dining, Dining (Deli/Bakery) +1, 0x0b06 = poi_dining, Dining (International) +1, 0x0b07 = poi_fastfood, Fast Food +1, 0x0b09 = poi_dining, Dining(Mexican) +1, 0x0b0a = poi_dining, Dining(Pizza) +1, 0x0b0b = poi_dining, Dining (Sea Food) +1, 0x0b0c = poi_dining, Dining (Steak/Grill) +1, 0x0b0d = poi_dining, Dining(Bagel/Donut) +1, 0x0b0e = poi_dining, Dining(Cafe/Diner) +1, 0x0c01 = poi_hotel, Hotel/Motel +1, 0x0c02 = poi_hotel, Bed & Breakfast inn +1, 0x0c03 = poi_camp_rv, Camping/RV-Park +1, 0x0c04 = poi_resort, Resort +1, 0x0d01 = poi_attraction, Amusement Park +1, 0x0d02 = poi_museum_history, Museum/History +1, 0x0d03 = poi_fair, Fair, Conference(point) +1, 0x0d04 = poi_scenic_area, Scenic Area +1, 0x0d05 = poi_school, School +1, 0x0d06 = poi_park, Park +1, 0x0d07 = poi_zoo, Zoo +1, 0x0d08 = poi_stadium, Sportpark, Stadium +1, 0x0d0a = poi_bar, Wine Bar +1, 0x0d14 = poi_hospital, Hospital +1, 0x0e01 = poi_theater, Theater +1, 0x0e02 = poi_bar, Bar +1, 0x0e03 = poi_cinema, Cinema +1, 0x0e04 = poi_casino, Casino +1, 0x0e05 = poi_golf, Golf +1, 0x0e06 = poi_skiing, Skiing Center/Lift +1, 0x0e07 = poi_bar, Night Bar/Piano +1, 0x0e08 = poi_icesport, Ice/Sporting +1, 0x0e09 = poi_swimming, Swimming +1, 0x0e0a = poi_sport, Sports(point) +1, 0x0f00 = poi_hotel, Hotel(Other) +1, 0x0f01 = poi_shop_department, Department Store +1, 0x0f02 = poi_shop_grocery, Grocery +1, 0x0f03 = poi_hotel, Hotel/Motel +1, 0x0f04 = poi_resort, Resort +1, 0x0f05 = poi_pharmacy, Pharmacy +1, 0x1001 = poi_fuel, Fuel/Gas +1, 0x1002 = poly_car_parking, Parking Lot +1, 0x1003 = poi_autoservice, Car Repair +1, 0x1004 = poi_airport, Airport +1, 0x1005 = poi_post_office, Post Office +1, 0x1006 = poi_bank, Bank +1, 0x1008 = poi_bus_station, Bus station +1, 0x1009 = poi_marina, SeaPort +1, 0x100a = poi_wrecker, Wrecker Service +1, 0x100b = poi_car_parking, Parking +1, 0x100d = poi_car_dealer_parts, Car Dealer(point) +1, 0x100e = poi_car_wash, Car Wash +1, 0x1011 = poi_bussines_service, Business Service +1, 0x1012 = poi_communication, Communication +1, 0x1013 = poi_repair_service, Repair Service +1, 0x1014 = poi_social_service, Social Service +1, 0x1015 = poi_public_utilities, Utility +1, 0x1101 = poi_police, Police Station +1, 0x1102 = poi_hospital, Hospital +1, 0x1104 = poi_justice, Justice +1, 0x1107 = poi_public_office, Public Office +1, 0x1400 = town_label_1e5, Megapolis (10M +) +1, 0x1401 = town_label_5e4, Megapolis (5-10M) +1, 0x1402 = town_label_2e4, Big City (2-5M) +1, 0x1403 = town_label_5e3, Big City (0.5-1M) +1, 0x1404 = town_label_2e3, City (200-500k) +1, 0x1405 = town_label_1e3, City (100-200k) +1, 0x1406 = town_label_5e2, City (50-100k) +1, 0x1405 = town_label_2e2, City (20-50k) +1, 0x1406 = town_label_1e2, City (10-20k) +1, 0x1407 = town_label_5e1, Small City (5-10k) +1, 0x1408 = town_label_2e1, Small City (2-5k) +1, 0x1409 = town_label_1e1, Village (1-2k) +1, 0x140a = town_label_5e0, Village (500-1000) +1, 0x140b = town_label_2e0, Village (200-500) +1, 0x140c = town_label_1e0, Village (100-200) +1, 0x140d = town_label_0e0, Village (0-100) +1, 0x1500 = poi_personal_service, Personal Service +1, 0x1501 = poi_bussines_service, Bussines Service + + +POLYLINE +0, 0x00 = street_1_land, Road +0, 0x01 = highway_land, Major HWY thick +0, 0x02 = street_4_land, Principal HWY-thick +0, 0x03 = street_2_land, Principal HWY-medium +0, 0x04 = street_3_city, Arterial Road-medium +0, 0x05 = street_4_city, Arterial Road-thick +0, 0x06 = street_2_city, Road-thin +0, 0x07 = street_1_city, Alley-thick +0, 0x08 = ramp, Ramp +0, 0x09 = ramp, Ramp highspeed +0, 0x0a = street_0, Unpaved Road-thin +0, 0x0b = ramp, Major HWY Connector-thick +0, 0x0c = roundabout, Roundabout +0, 0x0d = street_unkn, Custom defined street 1 +0, 0x0e = street_unkn, Custom defined street 2 +0, 0x0f = street_unkn, Custom defined street 3 +0, 0x10 = street_unkn, Custom defined street 4 +0, 0x11 = street_unkn, Custom defined street 5 +0, 0x12 = street_unkn, Custom defined street 6 +0, 0x13 = street_unkn, Custom defined street 7 +0, 0x14 = rail, Railroad +0, 0x15 = water_line, Shoreline +0, 0x16 = street_nopass, Trail +0, 0x18 = water_line, Stream-thin +0, 0x19 = time_zone, Time-Zone +0, 0x1a = ferry, Ferry +0, 0x1b = ferry, Ferry +0, 0x1c = border_country, Political Boundary +0, 0x1d = border_country, County Boundary +0, 0x1e = border_country, Intl. Boundary +0, 0x1f = water_line, River +0, 0x20 = height_line_1, Land Contour (thin) Height in feet +0, 0x21 = height_line_2, Land Contour (medium) Height in feet +0, 0x22 = height_line_3, Land Contour (thick) Height in feet +0, 0x23 = depth_line_1, Depth Contour (thin) Depth in feet +0, 0x24 = depth_line_2, Depth Contour (medium) Depth in feet +0, 0x25 = depth_line_3, Depth Contour (thick) Depth in feet +0, 0x26 = water_line, Intermittent River +0, 0x27 = street_nopass, Airport Runway +0, 0x28 = pipeline, Pipeline +0, 0x29 = powerline, Powerline +0, 0x2a = marine_boundary, Marine Boundary (no line) +0, 0x2b = marine_hazard, Marine Hazard (no line) +# RGN2-4 +# Marine +1, 0x0100 = street_unkn, Miscellaneous line +1, 0x0101 = street_unkn, Line +1, 0x0102 = street_unkn, Cartographic line +1, 0x0103 = street_unkn, Road +1, 0x0104 = street_unkn, Clearing line +1, 0x0105 = street_unkn, Contour line +1, 0x0106 = street_unkn, Overhead cable +1, 0x0107 = street_unkn, Bridge +1, 0x0108 = street_unkn, Recommended route +1, 0x0109 = street_unkn, Chart border +1, 0x0300 = street_unkn, Depth contour +1, 0x0301 = street_unkn, Depth contour value +1, 0x0307 = street_unkn, Intertidal zone border +1, 0x0400 = street_unkn, Obstruction line +1, 0x0401 = street_unkn, Submarine cable +1, 0x0402 = street_unkn, Submarine pipeline +1, 0x0403 = street_unkn, Pile barrier +1, 0x0404 = street_unkn, Fishing stakes +1, 0x0405 = street_unkn, Supply pipeline area +1, 0x0406 = street_unkn, Submarine cable area +1, 0x0407 = street_unkn, Dumping ground +1, 0x0408 = street_unkn, Explosive dumping ground +1, 0x0409 = street_unkn, Danger line +1, 0x040a = street_unkn, Overhead cable +1, 0x040b = street_unkn, Submerged construction +1, 0x040c = street_unkn, Pier/jetty +1, 0x0500 = street_unkn, Restriction +1, 0x0501 = street_unkn, Anchoring prohibited +1, 0x0502 = street_unkn, Fishing prohibited +1, 0x0503 = street_unkn, Prohibited area +1, 0x0504 = street_unkn, Military practice area +1, 0x0505 = street_unkn, Anchoring and fishing prohibited +1, 0x0506 = street_unkn, Limit of nature reservation +1, 0x0507 = street_unkn, Restricted area +1, 0x0508 = street_unkn, Minefield +1, 0x0600 = street_unkn, Miscellaneous line +1, 0x0601 = street_unkn, Cartographic line +1, 0x0602 = street_unkn, Traffic separation line +1, 0x0603 = street_unkn, International maritime boundary +1, 0x0604 = street_unkn, Straight territorial sea baseline +1, 0x0605 = street_unkn, Seaward limit of territorial sea +1, 0x0606 = street_unkn, Anchorage area +1, 0x0607 = street_unkn, Quarantine anchorage area +1, 0x0608 = street_unkn, Fishery zone +1, 0x0609 = street_unkn, Swept area +1, 0x060a = street_unkn, Traffic separation zone +1, 0x060b = street_unkn, Limit of exclusive economic zone +1, 0x060c = street_unkn, Established direction of traffic flow +1, 0x060d = street_unkn, Recommended direction of traffic flow +1, 0x060e = street_unkn, Harbour limit +1, 0x060f = street_unkn, Inadequately surveyed area +1, 0x0610 = street_unkn, Inshore traffic zone +1, 0x0611 = street_unkn, Limit of traffic lane +1, 0x0701 = street_unkn, River channel +1, 0x0702 = street_unkn, Submerged object +1, 0x0703 = street_unkn, Submerged object +1, 0x0704 = street_unkn, Submerged object +1, 0x0705 = street_unkn, Submerged object +1, 0x0706 = street_unkn, Chart boundary +# NT types +1, 0x0a00 = water_line, River +1, 0x0a01 = water_line, Small River +1, 0x0a19 = street_unkn, Dry Creek +1, 0x0b04 = border_country, Country Border + + +POLYGONE +0, 0x01 = poly_town, City (>200k) +0, 0x02 = poly_town, City (<200k) +0, 0x03 = poly_town, Village +0, 0x04 = poly_military_zone, Military +0, 0x05 = poly_car_parking, Parking Lot +0, 0x06 = poly_car_parking, Parking Garage +0, 0x07 = poly_airport, Airport +0, 0x08 = poly_commercial_center, Shopping Center +0, 0x09 = poly_marine, Marina +0, 0x0a = poly_university, University/College +0, 0x0b = poly_hospital, Hospital +0, 0x0c = poly_industry, Industrial +0, 0x0d = area, Reservation +0, 0x0e = poly_airport, Airport Runway +0, 0x13 = area_unspecified, Man made area +0, 0x14 = poly_national_park, National park +0, 0x15 = poly_national_park, National park +0, 0x16 = poly_nature_park, National park +0, 0x17 = poly_park, City Park +0, 0x18 = poly_golf_course, Golf +0, 0x19 = poly_sport, Sport +0, 0x1a = poly_cemetery, Cemetery +0, 0x1e = poly_nature_park, State Park +0, 0x1f = poly_park, State Park +0, 0x20 = poly_park, State Park +0, 0x28 = poly_water, Ocean +0, 0x29 = poly_water, Water Reservour +0, 0x32 = poly_water, Sea +0, 0x3b = poly_water, Water Reservour +0, 0x3c = poly_water, Lake (250-600 km2) +0, 0x3d = poly_water, Lake (77-250 km2) +0, 0x3e = poly_water, Lake (25-77 km2) +0, 0x3f = poly_water, Lake (11-25 km2) +0, 0x40 = poly_water, Lake (0.25-11 km2) +0, 0x41 = poly_water, Lake (<0.25 km2) +0, 0x42 = poly_water, Lake (>3.3k km2) +0, 0x43 = poly_water, Lake (1.1-3.3k km2) +0, 0x44 = poly_water, Lake (0.6-1.1k km2) +0, 0x45 = poly_water, Water Reservour +0, 0x46 = poly_water, River (>1km) +0, 0x47 = poly_water, River (200m-1km) +0, 0x48 = poly_water, River (40-200m) +0, 0x49 = poly_water, River (<40m) +0, 0x4a = area, Definition Area +0, 0x4b = area, Background +0, 0x4c = poly_water, Intermittent River/Lake +0, 0x4d = poly_glacier, Glaciers +0, 0x4e = plantation, Orchard or plantation +0, 0x4f = poly_scrub, Scrub +0, 0x50 = poly_wood, Woods +0, 0x51 = poly_wetland, Wetland +0, 0x52 = tundra, Tundra +0, 0x53 = poly_flats, Flats +# RGN2-4 +# Marine +1, 0x0100 = street_unkn, Land - white +1, 0x0101 = street_unkn, Land - non-urban +1, 0x0102 = street_unkn, Land - urban +1, 0x0103 = street_unkn, Chart exclusion area +1, 0x0104 = street_unkn, Chart background +1, 0x0105 = street_unkn, Bridge +1, 0x0300 = street_unkn, Depth area - white 1 +1, 0x0301 = street_unkn, Intertidal zone +1, 0x0302 = street_unkn, Depth area - blue 1 +1, 0x0303 = street_unkn, Depth area - blue 2 +1, 0x0304 = street_unkn, Depth area - blue 3 +1, 0x0305 = street_unkn, Depth area - blue 4 +1, 0x0306 = street_unkn, Depth area - blue 5 +1, 0x0307 = street_unkn, Depth area - white +1, 0x0400 = street_unkn, Obstruction (invisible) +1, 0x0401 = street_unkn, Submarine cable (invisible) +1, 0x0402 = street_unkn, Submarine pipeline (invisible) +1, 0x0403 = street_unkn, Pile barrier (invisible) +1, 0x0404 = street_unkn, Fishing stakes (invisible) +1, 0x0405 = street_unkn, Supply pipeline area/line (invisible) +1, 0x0406 = street_unkn, Submarine cable area/line (invisible) +1, 0x0407 = street_unkn, Dumping ground (invisible) +1, 0x0408 = street_unkn, Explosive dumping ground (invisible) +1, 0x0409 = street_unkn, Danger line (invisible) +1, 0x040a = street_unkn, Overhead cable (invisible) +1, 0x040b = street_unkn, Submerged construction (invisible) +1, 0x040c = street_unkn, Pier/jetty (invisible) +1, 0x0500 = street_unkn, Restriction area/line (invisible) +1, 0x0501 = street_unkn, Anchoring prohibited (invisible) +1, 0x0502 = street_unkn, Fishing prohibited (invisible) +1, 0x0503 = street_unkn, Prohibited area (invisible) +1, 0x0504 = street_unkn, Military practice area (invisible) +1, 0x0505 = street_unkn, Anchoring and fishing prohibited (invisible) +1, 0x0506 = street_unkn, Limit of nature reservation (invisible) +1, 0x0507 = street_unkn, Restricted area (invisible) +1, 0x0508 = street_unkn, Minefield (invisible) +1, 0x0600 = street_unkn, Miscellaneous area +1, 0x0601 = street_unkn, Cartographic area +1, 0x0602 = street_unkn, Traffic separation area +1, 0x0603 = street_unkn, International maritime boundary +1, 0x0604 = street_unkn, Straight territorial sea baseline +1, 0x0605 = street_unkn, Seaward limit of territorial sea +1, 0x0606 = street_unkn, Anchorage area +1, 0x0607 = street_unkn, Quarantine anchorage area +1, 0x0608 = street_unkn, Fishery zone +1, 0x0609 = street_unkn, Swept area +1, 0x060a = street_unkn, Traffic separation zone +1, 0x060b = street_unkn, Limit of exclusive economic zone +1, 0x060c = street_unkn, Established direction of traffic flow +1, 0x0701 = street_unkn, Fishing area +1, 0x0702 = street_unkn, Restricted area +1, 0x0703 = street_unkn, Anchorage area +1, 0x0704 = street_unkn, Fishing Hot Spots chart +# NT types +1, 0x0800 = poly_town, Large City +1, 0x0801 = poly_town, City +1, 0x0900 = poly_plaza, Square/Place +1, 0x0902 = poly_car_parking, Car Park (Parking Lot) +1, 0x0904 = poly_airport, Airport +1, 0x090d = poly_sports_stadium, Stage like circus/sport/stadium +1, 0x090e = poly_cemetery, Graveyard/Cemetery +1, 0x0a01 = poly_national_park, National Park +1, 0x0a04 = poly_park, City Park +1, 0x0a05 = poly_nature_park, Nature Park +1, 0x0a06 = street_unkn, Dam/Man made/ ?? +1, 0x0b02 = poly_water, Sea +1, 0x0b03 = poly_water, Water Reservour +1, 0x0b07 = poly_water, Dam/Lake +1, 0x0b08 = poly_water, Dam/Lake +1, 0x0b0c = poly_water, River diff --git a/navit/map/garmin/gentypes.c b/navit/map/garmin/gentypes.c new file mode 100644 index 0000000..16682a5 --- /dev/null +++ b/navit/map/garmin/gentypes.c @@ -0,0 +1,148 @@ +/* + Copyright (C) 2007 Alexander Atanasov + + 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 +#include +#include +#include +#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; +} diff --git a/navit/map/mg/Makefile.am b/navit/map/mg/Makefile.am new file mode 100644 index 0000000..ee05be8 --- /dev/null +++ b/navit/map/mg/Makefile.am @@ -0,0 +1,9 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_mg +if PLUGINS + modulemap_LTLIBRARIES = libmap_mg.la +else + noinst_LTLIBRARIES = libmap_mg.la +endif +libmap_mg_la_SOURCES = map.c block.c town.c tree.c poly.c street.c mg.h +libmap_mg_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ diff --git a/navit/map/mg/Makefile.in b/navit/map/mg/Makefile.in new file mode 100644 index 0000000..b4b5a7c --- /dev/null +++ b/navit/map/mg/Makefile.in @@ -0,0 +1,709 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/map/mg +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulemapdir)" +LTLIBRARIES = $(modulemap_LTLIBRARIES) $(noinst_LTLIBRARIES) +libmap_mg_la_LIBADD = +am_libmap_mg_la_OBJECTS = map.lo block.lo town.lo tree.lo poly.lo \ + street.lo +libmap_mg_la_OBJECTS = $(am_libmap_mg_la_OBJECTS) +libmap_mg_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libmap_mg_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libmap_mg_la_rpath = +@PLUGINS_TRUE@am_libmap_mg_la_rpath = -rpath $(modulemapdir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libmap_mg_la_SOURCES) +DIST_SOURCES = $(libmap_mg_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_mg +@PLUGINS_TRUE@modulemap_LTLIBRARIES = libmap_mg.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libmap_mg.la +libmap_mg_la_SOURCES = map.c block.c town.c tree.c poly.c street.c mg.h +libmap_mg_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/map/mg/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/map/mg/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulemapLTLIBRARIES: $(modulemap_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulemapdir)" || $(MKDIR_P) "$(DESTDIR)$(modulemapdir)" + @list='$(modulemap_LTLIBRARIES)'; test -n "$(modulemapdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulemapdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulemapdir)"; \ + } + +uninstall-modulemapLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulemap_LTLIBRARIES)'; test -n "$(modulemapdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulemapdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulemapdir)/$$f"; \ + done + +clean-modulemapLTLIBRARIES: + -test -z "$(modulemap_LTLIBRARIES)" || rm -f $(modulemap_LTLIBRARIES) + @list='$(modulemap_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libmap_mg.la: $(libmap_mg_la_OBJECTS) $(libmap_mg_la_DEPENDENCIES) + $(libmap_mg_la_LINK) $(am_libmap_mg_la_rpath) $(libmap_mg_la_OBJECTS) $(libmap_mg_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/map.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poly.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/street.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/town.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tree.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulemapdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulemapLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulemapLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulemapLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulemapLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-modulemapLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulemapLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/map/mg/block.c b/navit/map/mg/block.c new file mode 100644 index 0000000..9888657 --- /dev/null +++ b/navit/map/mg/block.c @@ -0,0 +1,298 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "debug.h" +#include "mg.h" + + +int block_lin_count,block_idx_count,block_active_count,block_mem,block_active_mem; + +struct block_index_item { + /*unsigned int blocknum; + unsigned int blocks;*/ + unsigned char p[8]; +}; +static inline unsigned int block_index_item_get_blocknum(struct block_index_item * blk) { unsigned char *p = blk->p; return get_u32(&p); } +static inline unsigned int block_index_item_get_blocks(struct block_index_item * blk) { unsigned char *p = blk->p+4; return get_u32(&p); } + +struct block_index { +/* unsigned int blocks; + unsigned int size; + unsigned int next; + struct block_index_item list[0];*/ + unsigned char p[12]; +}; +static inline unsigned int block_index_get_blocks(struct block_index * blk) { unsigned char *p = blk->p; return get_u32(&p); } +static inline unsigned int block_index_get_size(struct block_index * blk) { unsigned char *p = blk->p+4; return get_u32(&p); } +static inline unsigned int block_index_get_next(struct block_index * blk) { unsigned char *p = blk->p+8; return get_u32(&p); } +static inline struct block_index_item * block_index_get_list(struct block_index * blk) { return (struct block_index_item *)(blk->p+12); } + +static struct block * +block_get(unsigned char **p) +{ + struct block *ret=(struct block *)(*p); + *p += sizeof(*ret); + return ret; +} + + +static struct block * +block_get_byid(struct file *file, int id, unsigned char **p_ret) +{ + struct block_index *blk_idx; + int blk_num,max; + + + blk_idx=(struct block_index *)(file->begin+0x1000); + max=(block_index_get_size(blk_idx)-sizeof(struct block_index))/sizeof(struct block_index_item); + block_mem+=24; + while (id >= max) { + blk_idx=(struct block_index *)(file->begin+block_index_get_next(blk_idx)*512); + id-=max; + } + blk_num=block_index_item_get_blocknum(&block_index_get_list(blk_idx)[id]); + + *p_ret=file->begin+blk_num*512; + return block_get(p_ret); +} + +int +block_get_byindex(struct file *file, int idx, struct block_priv *blk) +{ + dbg(1,"idx=%d\n", idx); + blk->b=block_get_byid(file, idx, &blk->p); + blk->block_start=(unsigned char *)(blk->b); + blk->p_start=blk->p; + blk->end=blk->block_start+block_get_size(blk->b); + + return 1; +} + +static void +block_setup_tags(struct map_rect_priv *mr) +{ + int len; + unsigned char *p,*t; + char *str; + + mr->b.binarytree=0; + + p=mr->file->begin+0x0c; + while (*p) { + str=get_string(&p); + len=get_u32_unal(&p); + t=p; + /* printf("String '%s' len %d\n", str, len); */ + if (! strcmp(str,"FirstBatBlock")) { + /* printf("%ld\n", get_u32_unal(&t)); */ + } else if (! strcmp(str,"MaxBlockSize")) { + /* printf("%ld\n", get_u32_unal(&t)); */ + } else if (! strcmp(str,"FREE_BLOCK_LIST")) { + /* printf("%ld\n", get_u32_unal(&t)); */ + } else if (! strcmp(str,"TotalRect")) { + mr->b.b_rect.lu.x=get_u32_unal(&t); + mr->b.b_rect.lu.y=get_u32_unal(&t); + mr->b.b_rect.rl.x=get_u32_unal(&t); + mr->b.b_rect.rl.y=get_u32_unal(&t); + /* printf("0x%x,0x%x-0x%x,0x%x\n", mr->b.b_rect.lu.x, mr->b.b_rect.lu.y, mr->b.b_rect.rl.x, mr->b.b_rect.rl.y); */ + } else if (! strcmp(str,"Version")) { + /* printf("0x%lx\n", get_u32_unal(&t)); */ + } else if (! strcmp(str,"Categories")) { + /* printf("0x%x\n", get_u16(&t)); */ + } else if (! strcmp(str,"binaryTree")) { + mr->b.binarytree=get_u32_unal(&t); + /* printf("%d\n", mr->b.binarytree); */ + } else if (! strcmp(str,"CategorySets")) { + /* printf("0x%x\n", get_u16(&t)); */ + } else if (! strcmp(str,"Kommentar")) { + /* printf("%s\n", get_string(&t)); */ + } + p+=len; + } +} + +#if 0 +static void +block_rect_print(struct coord_rect *r) +{ + printf ("0x%x,0x%x-0x%x,0x%x (0x%x,0x%x)", r->lu.x, r->lu.y, r->rl.x, r->rl.y, r->lu.x/2+r->rl.x/2,r->lu.y/2+r->rl.y/2); +} +#endif + +static void +block_rect_same(struct coord_rect *r1, struct coord_rect *r2) +{ + dbg_assert(r1->lu.x==r2->lu.x); + dbg_assert(r1->lu.y==r2->lu.y); + dbg_assert(r1->rl.x==r2->rl.x); + dbg_assert(r1->rl.y==r2->rl.y); +} + +int +block_init(struct map_rect_priv *mr) +{ + mr->b.block_num=-1; + mr->b.bt.b=NULL; + mr->b.bt.next=0; + block_setup_tags(mr); + if (mr->b.binarytree) { + mr->b.bt.next=mr->b.binarytree; + mr->b.bt.p=NULL; + mr->b.bt.block_count=0; + } + if (mr->cur_sel && !coord_rect_overlap(&mr->cur_sel->u.c_rect, &mr->b.b_rect)) + return 0; + return block_next(mr); +} + + +int +block_next_lin(struct map_rect_priv *mr) +{ + struct coord_rect r; + for (;;) { + block_lin_count++; + block_mem+=sizeof(struct block *); + mr->b.block_num++; + if (! mr->b.block_num) + mr->b.p=mr->file->begin+0x2000; + else + mr->b.p=mr->b.block_start+block_get_blocks(mr->b.b)*512; + if (mr->b.p >= mr->file->end) { + dbg(1,"end of blocks %p vs %p\n", mr->b.p, mr->file->end); + return 0; + } + mr->b.block_start=mr->b.p; + mr->b.b=block_get(&mr->b.p); + mr->b.p_start=mr->b.p; + mr->b.end=mr->b.block_start+block_get_size(mr->b.b); + if (block_get_count(mr->b.b) == -1) { + dbg(1,"empty blocks\n"); + return 0; + } + block_get_r(mr->b.b, &r); + if (!mr->cur_sel || coord_rect_overlap(&mr->cur_sel->u.c_rect, &r)) { + block_active_count++; + block_active_mem+=block_get_blocks(mr->b.b)*512-sizeof(struct block *); + dbg(1,"block ok\n"); + return 1; + } + dbg(2,"block not in cur_sel\n"); + } +} + +int +block_next(struct map_rect_priv *mr) +{ + int blk_num,coord,r_h,r_w; + struct block_bt_priv *bt=&mr->b.bt; + struct coord_rect r; + + if (!mr->b.binarytree || ! mr->cur_sel) + return block_next_lin(mr); + for (;;) { + if (! bt->p) { + dbg(1,"block 0x%x\n", bt->next); + if (bt->next == -1) + return 0; + bt->b=block_get_byid(mr->file, bt->next, &bt->p); + bt->end=(unsigned char *)mr->b.bt.b+block_get_size(mr->b.bt.b); + bt->next=block_get_next(bt->b); + bt->order=0; + dbg(1,"size 0x%x next 0x%x\n", block_get_size(bt->b), block_get_next(bt->b)); + if (! mr->b.bt.block_count) { +#if 0 + if (debug) { + printf("idx rect "); + block_rect_print(&mr->b.bt.b->r); + } +#endif + block_get_r(bt->b, &bt->r); + bt->r_curr=bt->r; + coord=get_u32(&mr->b.bt.p); + } else { + bt->p=(unsigned char *)bt->b+0xc; + } + bt->block_count++; + } + while (mr->b.bt.p < mr->b.bt.end) { + block_idx_count++; + blk_num=get_u32(&mr->b.bt.p); + coord=get_u32(&mr->b.bt.p); + block_mem+=8; + dbg(1,"%p vs %p coord 0x%x ", mr->b.bt.end, mr->b.bt.p, coord); + dbg(1,"block 0x%x", blk_num); + + r_w=bt->r_curr.rl.x-bt->r_curr.lu.x; + r_h=bt->r_curr.lu.y-bt->r_curr.rl.y; +#if 0 + if (debug) { + printf(" rect1 "); + block_rect_print(&bt->r_curr); + printf(" %dx%d", r_w, r_h); + } +#endif + mr->b.b=NULL; + if (blk_num != -1) { + block_mem+=8; + if (coord_rect_overlap(&mr->cur_sel->u.c_rect, &bt->r_curr)) { + mr->b.b=block_get_byid(mr->file, blk_num, &mr->b.p); + mr->b.block_num=blk_num; + dbg_assert(mr->b.b != NULL); + mr->b.block_start=(unsigned char *)(mr->b.b); + mr->b.p_start=mr->b.p; + mr->b.end=mr->b.block_start+block_get_size(mr->b.b); + block_get_r(mr->b.b, &r); + block_rect_same(&r, &bt->r_curr); + } + } + if (coord != -1) { + bt->stack[bt->stackp]=bt->r_curr; + if (r_w > r_h) { + bt->r_curr.rl.x=coord; + bt->stack[bt->stackp].lu.x=coord+1; + } else { + bt->r_curr.lu.y=coord; + bt->stack[bt->stackp].rl.y=coord+1; + } + bt->stackp++; + dbg_assert(bt->stackp < BT_STACK_SIZE); + } else { + if (bt->stackp) { + bt->stackp--; + bt->r_curr=bt->stack[bt->stackp]; + } else { + bt->r_curr=bt->r; + bt->order++; + if (bt->order > 100) + return 0; + } + } + if (mr->b.b) { + block_active_count++; + block_active_mem+=block_get_blocks(mr->b.b)*512; + return 1; + } + } + bt->p=NULL; + } + return 0; +} diff --git a/navit/map/mg/map.c b/navit/map/mg/map.c new file mode 100644 index 0000000..682b691 --- /dev/null +++ b/navit/map/mg/map.c @@ -0,0 +1,613 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "config.h" +#include "debug.h" +#include "plugin.h" +#include "maptype.h" +#include "mg.h" + + +GList *maps; + +static struct country_isonum { + int country; + int isonum; + int postal_len; + char *postal_prefix; +} country_isonums[]={ + { 1,203}, + { 2,703}, + { 7,674}, + { 11,233}, + { 12,268}, + { 13,428}, + { 14,440}, + { 15,498}, + { 16,643}, + { 17,804}, + { 18,112}, + { 20,818}, + { 30,300}, + { 31,528}, + { 32, 56}, + { 33,250}, + { 34,724}, + { 36,348}, + { 39,380}, + { 40,642}, + { 41,756}, + { 43, 40}, + { 44,826}, + { 45,208}, + { 46,752}, + { 47,578}, + { 48,616}, + { 49,276,5,"D@@"}, + { 50,292}, + { 51,620}, + { 52,442}, + { 53,372}, + { 54,352}, + { 55, 8}, + { 56,470}, + { 57,196}, + { 58,246}, + { 59,100}, + { 61,422}, + { 62, 20}, + { 63,760}, + { 66,682}, + { 71,434}, + { 72,376}, + { 73,275}, + { 75,438}, + { 76,504}, + { 77, 12}, + { 78,788}, + { 81,688}, + { 83,400}, + { 85,191}, + { 86,705}, + { 87, 70}, + { 89,807}, + { 90,792}, + { 93,492}, + { 94, 31}, + { 95, 51}, + { 98,234}, + { 99,732}, + {336,774}, +}; + +struct map_priv * map_new_mg(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl); + +static int map_id; + +static char *file[]={ + [file_border_ply]="border.ply", + [file_bridge_ply]="bridge.ply", + [file_build_ply]="build.ply", + [file_golf_ply]="golf.ply", + [file_height_ply]="height.ply", + [file_natpark_ply]="natpark.ply", + [file_nature_ply]="nature.ply", + [file_other_ply]="other.ply", + [file_rail_ply]="rail.ply", + [file_sea_ply]="sea.ply", + [file_street_bti]="street.bti", + [file_street_str]="street.str", + [file_strname_stn]="strname.stn", + [file_town_twn]="town.twn", + [file_tunnel_ply]="tunnel.ply", + [file_water_ply]="water.ply", + [file_woodland_ply]="woodland.ply", +}; + +int mg_country_from_isonum(int isonum) +{ + int i; + for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++) + if (country_isonums[i].isonum == isonum) + return country_isonums[i].country; + return 0; +} + +int mg_country_to_isonum(int country) +{ + int i; + for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++) + if (country_isonums[i].country == country) + return country_isonums[i].isonum; + return 0; +} + +int mg_country_postal_len(int country) +{ + int i; + for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++) + if (country_isonums[i].country == country) + return country_isonums[i].postal_len; + return 0; +} + +static char *mg_country_postal_prefix(int isonum) +{ + int i; + for (i = 0 ; i < sizeof(country_isonums)/sizeof(struct country_isonum) ; i++) + if (country_isonums[i].isonum == isonum) + return country_isonums[i].postal_prefix; + return NULL; +} + +struct item_range town_ranges[]={ + {type_town_label,type_port_label}, +}; + +struct item_range street_ranges[]={ + {type_street_nopass,type_street_unkn}, +}; + +struct item_range poly_ranges[]={ + {type_border_country,type_water_line}, + {type_street_unkn,type_street_unkn}, + {type_area,type_last}, +}; + + +static int +file_next(struct map_rect_priv *mr) +{ + int debug=0; + + for (;;) { + mr->current_file++; + if (mr->current_file >= file_end) + return 0; + mr->file=mr->m->file[mr->current_file]; + if (! mr->file) + continue; + switch (mr->current_file) { + case file_strname_stn: + continue; + case file_town_twn: + if (mr->cur_sel && !map_selection_contains_item_range(mr->cur_sel, 0, town_ranges, sizeof(town_ranges)/sizeof(struct item_range))) + continue; + break; + case file_street_str: + if (mr->cur_sel && !map_selection_contains_item_range(mr->cur_sel, 0, street_ranges, sizeof(street_ranges)/sizeof(struct item_range))) + continue; + break; + default: + if (mr->cur_sel && !map_selection_contains_item_range(mr->cur_sel, 0, poly_ranges, sizeof(poly_ranges)/sizeof(struct item_range))) + continue; + break; + } + if (debug) + printf("current file: '%s'\n", file[mr->current_file]); + mr->cur_sel=mr->xsel; + if (block_init(mr)) + return 1; + } +} + +static void +map_destroy_mg(struct map_priv *m) +{ + int i; + + printf("mg_map_destroy\n"); + for (i = 0 ; i < file_end ; i++) { + if (m->file[i]) + file_destroy(m->file[i]); + } +} + +extern int block_lin_count,block_idx_count,block_active_count,block_mem,block_active_mem; + +struct map_rect_priv * +map_rect_new_mg(struct map_priv *map, struct map_selection *sel) +{ + struct map_rect_priv *mr; + int i; + + block_lin_count=0; + block_idx_count=0; + block_active_count=0; + block_mem=0; + block_active_mem=0; + mr=g_new0(struct map_rect_priv, 1); + mr->m=map; + mr->xsel=sel; + mr->current_file=-1; + if (sel && sel->next) + for (i=0 ; i < file_end ; i++) + mr->block_hash[i]=g_hash_table_new(g_int_hash,g_int_equal); + file_next(mr); + return mr; +} + + +static struct item * +map_rect_get_item_mg(struct map_rect_priv *mr) +{ + for (;;) { + switch (mr->current_file) { + case file_town_twn: + if (town_get(mr, &mr->town, &mr->item)) + return &mr->item; + break; + case file_border_ply: + case file_bridge_ply: + case file_build_ply: + case file_golf_ply: + /* case file_height_ply: */ + case file_natpark_ply: + case file_nature_ply: + case file_other_ply: + case file_rail_ply: + case file_sea_ply: + /* case file_tunnel_ply: */ + case file_water_ply: + case file_woodland_ply: + if (poly_get(mr, &mr->poly, &mr->item)) + return &mr->item; + break; + case file_street_str: + if (street_get(mr, &mr->street, &mr->item)) + return &mr->item; + break; + case file_end: + return NULL; + default: + break; + } + if (block_next(mr)) + continue; + if (mr->cur_sel->next) { + mr->cur_sel=mr->cur_sel->next; + if (block_init(mr)) + continue; + } + if (file_next(mr)) + continue; + dbg(1,"lin_count %d idx_count %d active_count %d %d kB (%d kB)\n", block_lin_count, block_idx_count, block_active_count, (block_mem+block_active_mem)/1024, block_active_mem/1024); + return NULL; + } +} + +struct item * +map_rect_get_item_byid_mg(struct map_rect_priv *mr, int id_hi, int id_lo) +{ + mr->current_file = (id_hi >> 16) & 0xff; + switch (mr->current_file) { + case file_town_twn: + if (town_get_byid(mr, &mr->town, id_hi, id_lo, &mr->item)) + return &mr->item; + break; + case file_street_str: + if (street_get_byid(mr, &mr->street, id_hi, id_lo, &mr->item)) + return &mr->item; + break; + case file_strname_stn: + if (street_name_get_byid(mr, &mr->street, id_hi, id_lo, &mr->item)) + return &mr->item; + break; + default: + if (poly_get_byid(mr, &mr->poly, id_hi, id_lo, &mr->item)) + return &mr->item; + break; + } + return NULL; +} + + +void +map_rect_destroy_mg(struct map_rect_priv *mr) +{ + int i; + for (i=0 ; i < file_end ; i++) + if (mr->block_hash[i]) + g_hash_table_destroy(mr->block_hash[i]); + g_free(mr); +} + +static char * +map_search_mg_convert_special(char *str) +{ + char *ret,*c=g_malloc(strlen(str)*2+1); + + ret=c; + for (;;) { + switch ((unsigned char)(*str)) { + case 0xc4: + *c++='A'; + break; + case 0xd6: + *c++='O'; + break; + case 0xdc: + *c++='U'; + break; + case 0xdf: + *c++='s'; + *c++='s'; + break; + case 0xe4: + *c++='a'; + break; + case 0xf6: + *c++='o'; + break; + case 0xfc: + *c++='u'; + break; + default: + dbg(1,"0x%x\n", *str); + *c++=*str; + break; + } + if (! *str) + return ret; + str++; + } +} + +static int +map_search_setup(struct map_rect_priv *mr) +{ + char *prefix; + dbg(1,"%s\n", attr_to_name(mr->search_type)); + switch (mr->search_type) { + case attr_town_postal: + if (mr->search_item.type != type_country_label) { + dbg(0,"wrong parent type %s\n", item_to_name(mr->search_item.type)); + return 0; + } + prefix=mg_country_postal_prefix(mr->search_item.id_lo); + if (! prefix) + return 0; + tree_search_init(mr->m->dirname, "town.b1", &mr->ts, 0); + mr->current_file=file_town_twn; + mr->search_str=g_strdup_printf("%s%s",prefix,mr->search_attr->u.str); + dbg(0,"search_str='%s'\n",mr->search_str); + mr->search_country=mg_country_from_isonum(mr->search_item.id_lo); + break; + case attr_town_name: + if (mr->search_item.type != type_country_label) { + dbg(0,"wrong parent type %s\n", item_to_name(mr->search_item.type)); + return 0; + } + tree_search_init(mr->m->dirname, "town.b2", &mr->ts, 0x1000); + mr->current_file=file_town_twn; + mr->search_str=map_search_mg_convert_special(mr->search_attr->u.str); + mr->search_country=mg_country_from_isonum(mr->search_item.id_lo); + break; + case attr_district_name: + if (mr->search_item.type != type_country_label) { + dbg(0,"wrong parent type %s\n", item_to_name(mr->search_item.type)); + return 0; + } + tree_search_init(mr->m->dirname, "town.b3", &mr->ts, 0x1000); + mr->current_file=file_town_twn; + mr->search_str=map_search_mg_convert_special(mr->search_attr->u.str); + mr->search_country=mg_country_from_isonum(mr->search_item.id_lo); + break; + case attr_street_name: + if (mr->search_item.type != type_town_streets) { + GList *tmp=maps; + struct item *item=NULL; + struct attr attr; + struct map_rect_priv *mr2; + while (tmp) { + mr2=map_rect_new_mg(tmp->data, NULL); + item=map_rect_get_item_byid_mg(mr2, mr->search_item.id_hi, mr->search_item.id_lo); + if (item) + break; + map_rect_destroy_mg(mr2); + tmp=g_list_next(tmp); + } + if (item) { + if (item_attr_get(item, attr_town_streets_item, &attr)) { + mr->search_item=*attr.u.item; + map_rect_destroy_mg(mr2); + } else { + map_rect_destroy_mg(mr2); + return 0; + } + } else { + dbg(0,"wrong parent type %s %p 0x%x 0x%x\n", item_to_name(mr->search_item.type), item, mr->search_item.id_hi, mr->search_item.id_lo); + return 0; + } + } + dbg(1,"street_assoc=0x%x\n", mr->search_item.id_lo); + tree_search_init(mr->m->dirname, "strname.b1", &mr->ts, 0); + mr->current_file=file_strname_stn; + mr->search_str=g_strdup(mr->search_attr->u.str); + break; + case attr_house_number: + if (!map_priv_is(mr->search_item.map, mr->m)) + return 0; + if (!housenumber_search_setup(mr)) { + dbg(0,"failed to search for attr_house_number\n"); + return 0; + } + break; + default: + dbg(0,"unknown search %s\n",attr_to_name(mr->search_type)); + return 0; + } + mr->file=mr->m->file[mr->current_file]; + block_init(mr); + return 1; +} +static void map_search_cleanup(struct map_rect_priv *mr); + +static struct item * map_search_get_item_mg(struct map_search_priv *ms); + +static struct map_search_priv * +map_search_new_mg(struct map_priv *map, struct item *item, struct attr *search, int partial) +{ + struct map_rect_priv *mr=g_new0(struct map_rect_priv, 1); + dbg(1,"searching for %s '%s'\n", attr_to_name(search->type), search->u.str); + dbg(1,"id_lo=0x%x\n", item->id_lo); + dbg(1,"search=%s\n", search->u.str); + mr->m=map; + mr->search_attr=attr_dup(search); + mr->search_type=search->type; + mr->search_item=*item; + mr->search_partial=partial; + if (search->type == attr_town_or_district_name) { + mr->search_type=attr_town_name; + mr->search_type_next=attr_district_name; + } + if (!map_search_setup(mr)) { + dbg(1,"map_search_new_mg failed\n"); + g_free(mr); + return NULL; + } + mr->search_mr_tmp=map_rect_new_mg(map, NULL); + + return (struct map_search_priv *)mr; +} + +static void +map_search_cleanup(struct map_rect_priv *mr) +{ + g_free(mr->search_str); + mr->search_str=NULL; + tree_search_free(&mr->ts); + mr->search_linear=0; + mr->search_p=NULL; + mr->search_blk_count=0; + mr->search_blk_off=NULL; + mr->search_block=0; +} + +static void +map_search_destroy_mg(struct map_search_priv *ms) +{ + struct map_rect_priv *mr=(struct map_rect_priv *)ms; + + dbg(1,"mr=%p\n", mr); + if (! mr) + return; + map_search_cleanup(mr); + if (mr->search_mr_tmp) + map_rect_destroy_mg(mr->search_mr_tmp); + attr_free(mr->search_attr); + g_free(mr); +} + +static struct item * +map_search_get_item_mg(struct map_search_priv *ms) +{ + struct map_rect_priv *mr=(struct map_rect_priv *)ms; + struct item *ret=NULL; + + if (! mr) + return NULL; + switch (mr->search_type) { + case attr_town_postal: + case attr_town_name: + case attr_district_name: + ret=town_search_get_item(mr); + break; + case attr_street_name: + ret=street_search_get_item(mr); + break; + case attr_house_number: + ret=housenumber_search_get_item(mr); + break; + default: + dbg(0,"unknown search %s\n",attr_to_name(mr->search_type)); + break; + } + if (!ret && mr->search_type_next != attr_none) { + mr->search_type=mr->search_type_next; + mr->search_type_next=attr_none; + map_search_cleanup(mr); + map_search_setup(mr); + return map_search_get_item_mg(ms); + } + return ret; +} + +static struct map_methods map_methods_mg = { + projection_mg, + "iso8859-1", + map_destroy_mg, + map_rect_new_mg, + map_rect_destroy_mg, + map_rect_get_item_mg, + map_rect_get_item_byid_mg, + map_search_new_mg, + map_search_destroy_mg, + map_search_get_item_mg, +}; + + +struct map_priv * +map_new_mg(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) +{ + struct map_priv *m; + int i,maybe_missing; + struct attr *data=attr_search(attrs, NULL, attr_data); + char *filename; + struct file_wordexp *wexp; + char **wexp_data; + + if (! data) + return NULL; + + wexp=file_wordexp_new(data->u.str); + wexp_data=file_wordexp_get_array(wexp); + + *meth=map_methods_mg; + data=attr_search(attrs, NULL, attr_data); + + m=g_new(struct map_priv, 1); + m->id=++map_id; + m->dirname=g_strdup(wexp_data[0]); + file_wordexp_destroy(wexp); + for (i = 0 ; i < file_end ; i++) { + if (file[i]) { + filename=g_strdup_printf("%s/%s", m->dirname, file[i]); + m->file[i]=file_create_caseinsensitive(filename, 0); + if (! m->file[i]) { + maybe_missing=(i == file_border_ply || i == file_height_ply || i == file_sea_ply); + if (! maybe_missing) + dbg(0,"Failed to load %s\n", filename); + } else + file_mmap(m->file[i]); + g_free(filename); + } + } + maps=g_list_append(maps, m); + + return m; +} + +void +plugin_init(void) +{ + plugin_register_map_type("mg", map_new_mg); +} diff --git a/navit/map/mg/mg.h b/navit/map/mg/mg.h new file mode 100644 index 0000000..e6febc2 --- /dev/null +++ b/navit/map/mg/mg.h @@ -0,0 +1,372 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include "item.h" +#include "attr.h" +#include "coord.h" +#include "data.h" +#include "projection.h" +#include "map.h" +#include "file.h" + +struct block_data { + struct file *file; +}; + +struct block { +/* int blocks; + int size; + int next; + struct coord_rect r; + int count;*/ + unsigned char p[32]; +}; +static inline int block_get_blocks(struct block * blk) { unsigned char *p = blk->p; return get_u32(&p); } +static inline int block_get_size(struct block * blk) { unsigned char *p = blk->p+4; return get_u32(&p); } +static inline int block_get_next(struct block * blk) { unsigned char *p = blk->p+8; return get_u32(&p); } +static inline int block_get_count(struct block * blk) { unsigned char *p = blk->p+28; return get_u32(&p); } +static inline void block_get_r(struct block * blk, struct coord_rect * r) { unsigned char *p = blk->p+12; r ->lu.x = get_u32(&p); r ->lu.y = get_u32(&p); r ->rl.x = get_u32(&p); r ->rl.y = get_u32(&p); } + +struct item_priv { + int cidx; + int aidx; + unsigned char *cstart,*cp,*cend; + unsigned char *astart,*ap,*aend; + enum attr_type attr_last; + enum attr_type attr_next; + struct item item; +}; + +struct town_priv { + unsigned int id; /*!< Identifier */ + struct coord c; /*!< Coordinates */ + char *name; /*!< Name */ + char *district; /*!< District */ + char *postal_code1; /*!< Postal code */ + unsigned char order; /*!< Order (Importance) */ + unsigned char type; /*!< Type */ + unsigned short country; /*!< Country */ + unsigned int unknown2; /*!< Unknown */ + unsigned char size; /*!< Size of town */ + unsigned int street_assoc; /*!< Association to streets */ + unsigned char unknown3; /*!< Unknown */ + char *postal_code2; /*!< 2nd postal code */ + unsigned int unknown4; /*!< Unknown */ + + int cidx; + int aidx; + enum attr_type attr_next; + char debug[256]; + char postal[32]; + struct item town_attr_item; +}; + +struct poly_priv { + int poly_num; + unsigned char *poly_next; + int subpoly_num; + int subpoly_num_all; + unsigned char *subpoly_next; + unsigned char *subpoly_start; + unsigned char *p; + struct coord c[2]; + char *name; + unsigned char order; + unsigned char type; + unsigned int polys; + unsigned int *count; + unsigned int count_sum; + + int aidx; + enum attr_type attr_next; +}; + +struct street_header { + /*unsigned char order; + int count;*/ + unsigned char p[5]; +} __attribute__((packed)); +static inline unsigned char street_header_get_order(struct street_header * str) { return *str->p; } +static inline int street_header_get_count(struct street_header * str) { unsigned char *p = str->p+1; return get_u32_unal(&p); } + +struct street_type { + /*unsigned char order; + unsigned short country;*/ + unsigned char p[3]; +} __attribute__((packed)); +static inline unsigned char street_type_get_order(struct street_type * str) { return *str->p; } +static inline unsigned short street_type_get_country(struct street_type * str) { unsigned char *p = str->p+1; return get_u16_unal(&p); } + +struct street_header_type { + struct street_header *header; + int type_count; + struct street_type *type; +}; + +struct street_str { + /*int segid; + unsigned char limit;*/ /* 0x03,0x30=One Way,0x33=No Passing */ + /*unsigned char unknown2; + unsigned char unknown3; + unsigned char type; + unsigned int nameid;*/ + unsigned char p[12]; +}; +static inline int street_str_get_segid(struct street_str * str) { unsigned char *p = str->p; return get_u32_unal(&p); } +static inline unsigned char street_str_get_limit(struct street_str * str) { return str->p[4]; } +static inline unsigned char street_str_get_unknown2(struct street_str * str) { return str->p[5]; } +static inline unsigned char street_str_get_unknown3(struct street_str * str) { return str->p[6]; } +static inline unsigned char street_str_get_type(struct street_str * str) { return str->p[7]; } +static inline unsigned int street_str_get_nameid(struct street_str * str) { unsigned char *p = str->p+8; return get_u32_unal(&p); } + +struct street_name_segment { + int segid; + int country; +}; + +struct street_name { + int len; + int country; + int townassoc; + char *name1; + char *name2; + int segment_count; + struct street_name_segment *segments; + int aux_len; + unsigned char *aux_data; + int tmp_len; + unsigned char *tmp_data; +}; + +struct housenumber { + int number; + char *suffix; +}; + +struct street_name_numbers { + int len; + int tag; + int dist; + int country; + struct coord *c; + struct housenumber first; + struct housenumber last; + int segment_count; + struct street_name_segment *segments; + int aux_len; + unsigned char *aux_data; + int tmp_len; + unsigned char *tmp_data; +}; +static inline void street_name_numbers_get_coord(struct street_name_numbers * str, struct coord * c) { + unsigned char *p=(unsigned char *)str->c; + c->x=get_u32_unal(&p); + c->y=get_u32_unal(&p); +} + +struct street_name_number { + int len; + int tag; + struct coord *c; + struct housenumber first; + struct housenumber last; + struct street_name_segment *segment; +}; + + + +struct street_priv { + struct file *name_file; + struct street_header *header; + int type_count; + struct street_type *type; + struct street_str *str; + struct street_str *str_start; + unsigned char *coord_begin; + unsigned char *p; + unsigned char *p_rewind; + unsigned char *end; + unsigned char *next; + int status; + int status_rewind; + struct coord_rect ref; + int bytes; + int more; + int flags; + int housenumber; + int cidx; + struct coord hnc[100]; + struct housenumber hn[100]; + int hn_count; + struct street_name name; + struct street_name_numbers name_numbers; + struct street_name_number name_number; + enum attr_type attr_next; + char debug[256]; + char first_number[32]; + char last_number[32]; + char current_number[32]; + GHashTable *streetname_hash; +}; + +enum file_index { + file_border_ply=0, + file_bridge_ply, + file_build_ply, + file_golf_ply, + file_height_ply, + file_natpark_ply, + file_nature_ply, + file_other_ply, + file_rail_ply, + file_sea_ply, + file_street_bti, + file_street_str, + file_strname_stn, + file_town_twn, + file_tunnel_ply, + file_water_ply, + file_woodland_ply, + file_end, + file_town_twn_alt1, + file_town_twn_alt2, + file_street_str_alt1, + file_street_str_alt2, + file_street_str_alt3, + file_street_str_alt4, +}; + +struct map_priv { + int id; + struct file *file[file_end]; + char *dirname; +}; + +#define BT_STACK_SIZE 32 + +struct block_bt_priv { + struct block *b; + struct coord_rect r, r_curr; + int next; + int block_count; + struct coord_rect stack[BT_STACK_SIZE]; + int stackp; + int order; + unsigned char *p; + unsigned char *end; +}; + +struct block_priv { + int block_num; + struct coord_rect b_rect; + unsigned char *block_start; + struct block *b; + unsigned char *p; + unsigned char *end; + unsigned char *p_start; + int binarytree; + struct block_bt_priv bt; +}; + +struct block_offset { +/* unsigned short offset; + unsigned short block;*/ + unsigned char p[4]; +}; +static inline unsigned short block_offset_get_offset(struct block_offset * blk) { unsigned char *p = blk->p; return get_u16_unal(&p); } +static inline unsigned short block_offset_get_block(struct block_offset * blk) { unsigned char *p = blk->p+2; return get_u16_unal(&p); } + +struct tree_search_node { + struct tree_hdr *hdr; + unsigned char *p; + unsigned char *last; + unsigned char *end; + int low; + int high; + int last_low; + int last_high; + }; + +struct tree_search { + struct file *f; + int last_node; + int curr_node; + struct tree_search_node nodes[5]; +}; + + +struct map_rect_priv { + struct map_selection *xsel; + struct map_selection *cur_sel; + + struct map_priv *m; + enum file_index current_file; + struct file *file; + struct block_priv b; + struct item item; + struct town_priv town; + struct poly_priv poly; + struct street_priv street; + struct tree_search ts; + int search_country; + struct item search_item; + struct attr *search_attr; + char *search_str; + int search_partial; + int search_linear; + unsigned char *search_p; + int search_blk_count; + enum attr_type search_type,search_type_next; + struct map_rect_priv *search_mr_tmp; + struct item *search_item_tmp; + struct block_offset *search_blk_off; + int search_block; + GHashTable *block_hash[file_end]; + struct item_priv item3; +}; + +int mg_country_from_isonum(int isonum); +int mg_country_to_isonum(int country); +int mg_country_postal_len(int country); + +int block_init(struct map_rect_priv *mr); +int block_next(struct map_rect_priv *mr); +int block_get_byindex(struct file *file, int idx, struct block_priv *blk); +int block_next_lin(struct map_rect_priv *mr); + +int tree_search_hv(char *dirname, char *filename, unsigned int search1, unsigned int search2, int *result); +int town_get(struct map_rect_priv *mr, struct town_priv *poly, struct item *item); +int town_get_byid(struct map_rect_priv *mr, struct town_priv *twn, int id_hi, int id_lo, struct item *item); +struct item * town_search_get_item(struct map_rect_priv *mr); +int poly_get(struct map_rect_priv *mr, struct poly_priv *poly, struct item *item); +int poly_get_byid(struct map_rect_priv *mr, struct poly_priv *poly, int id_hi, int id_lo, struct item *item); +int street_get(struct map_rect_priv *mr, struct street_priv *street, struct item *item); +int street_get_byid(struct map_rect_priv *mr, struct street_priv *street, int id_hi, int id_lo, struct item *item); +int street_name_get_byid(struct map_rect_priv *mr, struct street_priv *street, int id_hi, int id_lo, struct item *item); +struct item * street_search_get_item(struct map_rect_priv *mr); +void tree_search_init(char *dirname, char *filename, struct tree_search *ts, int offset); +void tree_search_free(struct tree_search *ts); +int tree_search_next(struct tree_search *ts, unsigned char **p, int dir); +int tree_search_next_lin(struct tree_search *ts, unsigned char **p); +struct item * housenumber_search_get_item(struct map_rect_priv *mr); +struct map_rect_priv * map_rect_new_mg(struct map_priv *map, struct map_selection *sel); +void map_rect_destroy_mg(struct map_rect_priv *mr); +struct item *map_rect_get_item_byid_mg(struct map_rect_priv *mr, int id_hi, int id_lo); +int housenumber_search_setup(struct map_rect_priv *mr); diff --git a/navit/map/mg/poly.c b/navit/map/mg/poly.c new file mode 100644 index 0000000..5bd0830 --- /dev/null +++ b/navit/map/mg/poly.c @@ -0,0 +1,265 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include "debug.h" +#include "mg.h" + +static void +poly_coord_rewind(void *priv_data) +{ + struct poly_priv *poly=priv_data; + + poly->p=poly->subpoly_start; + +} + +static int +poly_coord_get(void *priv_data, struct coord *c, int count) +{ + struct poly_priv *poly=priv_data; + int ret=0; + + while (count--) { + if (poly->p >= poly->subpoly_next) + break; + c->x=get_u32_unal(&poly->p); + c->y=get_u32_unal(&poly->p); + c++; + ret++; + } + return ret; +} + +static void +poly_attr_rewind(void *priv_data) +{ + struct poly_priv *poly=priv_data; + + poly->aidx=0; +} + +static int +poly_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + struct poly_priv *poly=priv_data; + + attr->type=attr_type; + switch (attr_type) { + case attr_any: + while (poly->attr_next != attr_none) { + if (poly_attr_get(poly, poly->attr_next, attr)) + return 1; + } + return 0; + case attr_label: + attr->u.str=poly->name; + poly->attr_next=attr_none; + if (attr->u.str[0]) + return 1; + return 0; + default: + return 0; + } + return 1; +} + +static struct item_methods poly_meth = { + poly_coord_rewind, + poly_coord_get, + poly_attr_rewind, + poly_attr_get, +}; + +static void +poly_get_data(struct poly_priv *poly, unsigned char **p) +{ + poly->c[0].x=get_u32_unal(p); + poly->c[0].y=get_u32_unal(p); + poly->c[1].x=get_u32_unal(p); + poly->c[1].y=get_u32_unal(p); + *p+=sizeof(struct coord); + poly->name=(char *)(*p); + while (**p) { + (*p)++; + } + (*p)++; + poly->order=*(*p)++; + poly->type=*(*p)++; + poly->polys=get_u32_unal(p); + poly->count=(unsigned int *)(*p); (*p)+=poly->polys*sizeof(unsigned int); + poly->count_sum=get_u32_unal(p); +} + +int +poly_get(struct map_rect_priv *mr, struct poly_priv *poly, struct item *item) +{ + struct coord_rect r; + + for (;;) { + if (mr->b.p >= mr->b.end) + return 0; + if (mr->b.p == mr->b.p_start) { + poly->poly_num=0; + poly->subpoly_num=0; + poly->subpoly_num_all=0; + poly->poly_next=mr->b.p; + item->meth=&poly_meth; + } + if (poly->poly_num >= block_get_count(mr->b.b)) + return 0; + if (!poly->subpoly_num) { + mr->b.p=poly->poly_next; + item->id_lo=mr->b.p-mr->file->begin; + poly_get_data(poly, &mr->b.p); + poly->poly_next=mr->b.p+poly->count_sum*sizeof(struct coord); + poly->poly_num++; + r.lu=poly->c[0]; + r.rl=poly->c[1]; + if (mr->cur_sel && (poly->order > mr->cur_sel->order*3 || !coord_rect_overlap(&mr->cur_sel->u.c_rect, &r))) { + poly->subpoly_num_all+=poly->polys; + mr->b.p=poly->poly_next; + continue; + } + switch(poly->type) { + case 0x13: + item->type=type_poly_wood; + break; + case 0x14: + item->type=type_poly_town; + break; + case 0x15: + item->type=type_poly_cemetery; + break; + case 0x16: + item->type=type_poly_building; + break; + case 0x17: + item->type=type_poly_museum; + break; + case 0x19: + item->type=type_poly_place; + break; + case 0x1b: + item->type=type_poly_commercial_center; + break; + case 0x1e: + item->type=type_poly_industry; + break; + case 0x23: + /* FIXME: what is this ?*/ + item->type=type_poly_place; + break; + case 0x24: + item->type=type_poly_car_parking; + break; + case 0x28: + item->type=type_poly_airport; + break; + case 0x29: + item->type=type_poly_station; + break; + case 0x2d: + item->type=type_poly_hospital; + break; + case 0x2e: + item->type=type_poly_hospital; + break; + case 0x2f: + item->type=type_poly_university; + break; + case 0x30: + item->type=type_poly_university; + break; + case 0x32: + item->type=type_poly_park; + break; + case 0x34: + item->type=type_poly_sport; + break; + case 0x35: + item->type=type_poly_sport; + break; + case 0x37: + item->type=type_poly_golf_course; + break; + case 0x38: + item->type=type_poly_national_park; + break; + case 0x39: + item->type=type_poly_nature_park; + break; + case 0x3c: + item->type=type_poly_water; + break; + case 0xbc: + item->type=type_water_line; + break; + case 0xc3: + /* FIXME: what is this ?*/ + item->type=type_border_state; + break; + case 0xc6: + item->type=type_border_country; + break; + case 0xc7: + item->type=type_border_state; + break; + case 0xd0: + item->type=type_rail; + break; + default: + dbg(0,"Unknown poly type 0x%x '%s' 0x%x,0x%x\n", poly->type,poly->name,r.lu.x,r.lu.y); + item->type=type_street_unkn; + } + if (!map_selection_contains_item(mr->cur_sel, 0, item->type)) { + poly->subpoly_num_all+=poly->polys; + mr->b.p=poly->poly_next; + continue; + } + } else + mr->b.p=poly->subpoly_next; + dbg(1,"%d %d %s\n", poly->subpoly_num_all, mr->b.block_num, poly->name); + item->id_lo=poly->subpoly_num_all | (mr->b.block_num << 16); + item->id_hi=(mr->current_file << 16); + dbg(1,"0x%x 0x%x\n", item->id_lo, item->id_hi); + poly->subpoly_next=mr->b.p+L(poly->count[poly->subpoly_num])*sizeof(struct coord); + poly->subpoly_num++; + poly->subpoly_num_all++; + if (poly->subpoly_num >= poly->polys) + poly->subpoly_num=0; + poly->subpoly_start=poly->p=mr->b.p; + item->priv_data=poly; + poly->attr_next=attr_label; + return 1; + } +} + +int +poly_get_byid(struct map_rect_priv *mr, struct poly_priv *poly, int id_hi, int id_lo, struct item *item) +{ + int count=id_lo & 0xffff; + int ret=0; + block_get_byindex(mr->m->file[mr->current_file], id_lo >> 16, &mr->b); + while (count-- >= 0) { + ret=poly_get(mr, poly, item); + } + return ret; +} + diff --git a/navit/map/mg/street.c b/navit/map/mg/street.c new file mode 100644 index 0000000..656da21 --- /dev/null +++ b/navit/map/mg/street.c @@ -0,0 +1,1390 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include "debug.h" +#include "mg.h" + +int coord_debug; + +#if 0 +static void street_name_numbers_get(struct street_name_numbers *name_numbers, unsigned char **p); +static void street_name_number_get(struct street_name_number *name_number, unsigned char **p); + +static void +street_name_debug(struct street_name *sn, FILE *out) +{ + struct street_name_numbers nns; + unsigned char *p=sn->aux_data; + unsigned char *end=p+sn->aux_len; + int i; + + while (p < end) { + unsigned char *pn,*pn_end; + struct street_name_number nn; + street_name_numbers_get(&nns, &p); + fprintf(out,"0x%x 0x%x type=town_label label=\"%s(%d):0x%x:%d%s-%d%s\" debug=\"len=0x%x\"",nns.c->x,nns.c->y,sn->name2, sn->segment_count, nns.tag, nns.first.number,nns.first.suffix,nns.last.number,nns.last.suffix,nns.len); + for (i = 0 ; i < sn->segment_count ; i++) { + fprintf(out," debug=\"segment(%d)=0x%x\"",i,sn->segments[i].segid); + } + fprintf(out,"\n"); + pn=nns.aux_data; + pn_end=nns.aux_data+nns.aux_len; + while (pn < pn_end) { + street_name_number_get(&nn, &pn); + fprintf(out,"0x%x 0x%x type=town_label label=\"%s:0x%x:%d%s-%d%s\" debug=\"len=0x%x\"\n", nn.c->x, nn.c->y, sn->name2, nn.tag, nn.first.number, nn.first.suffix, nn.last.number,nn.last.suffix,nn.len); + } + } + fflush(out); +} +#endif + +static void +street_name_get(struct street_name *name, unsigned char **p) +{ +#if 0 + static FILE *out; + static GHashTable *hash; +#endif + unsigned char *start=*p; + name->len=get_u16_unal(p); + name->country=get_u16_unal(p); + name->townassoc=get_u32_unal(p); + name->name1=get_string(p); + name->name2=get_string(p); + name->segment_count=get_u32_unal(p); + name->segments=(struct street_name_segment *)(*p); + (*p)+=(sizeof (struct street_name_segment))*name->segment_count; + name->aux_len=name->len-(*p-start); + name->aux_data=*p; + name->tmp_len=name->aux_len; + name->tmp_data=name->aux_data; + *p=start+name->len; +#if 0 + if (! out) { + out=fopen("hn.txt","a"); + } + if (! hash) { + hash=g_hash_table_new(NULL,NULL); + } + if (! g_hash_table_lookup(hash, *p)) { + g_hash_table_insert(hash, *p, (void *)1); + street_name_debug(name, out); + } +#endif +} + +static int +street_name_eod(struct street_name *name) +{ + return (name->tmp_data >= name->aux_data+name->aux_len); +} + +static void +street_name_numbers_get(struct street_name_numbers *name_numbers, unsigned char **p) +{ + unsigned char *start=*p; + name_numbers->len=get_u16_unal(p); + name_numbers->tag=get_u8(p); + name_numbers->dist=get_u32_unal(p); + name_numbers->country=get_u32_unal(p); + name_numbers->c=coord_get(p); + name_numbers->first.number=get_u16_unal(p); + name_numbers->first.suffix=get_string(p); + name_numbers->last.number=get_u16_unal(p); + name_numbers->last.suffix=get_string(p); + name_numbers->segment_count=get_u32_unal(p); + name_numbers->segments=(struct street_name_segment *)(*p); + (*p)+=sizeof(struct street_name_segment)*name_numbers->segment_count; + name_numbers->aux_len=name_numbers->len-(*p-start); + name_numbers->aux_data=*p; + name_numbers->tmp_len=name_numbers->aux_len; + name_numbers->tmp_data=name_numbers->aux_data; + *p=start+name_numbers->len; +} + +static int +street_name_numbers_eod(struct street_name_numbers *name_numbers) +{ + return (name_numbers->tmp_data >= name_numbers->aux_data+name_numbers->aux_len); +} + + +static int +street_name_numbers_get_byid(struct street_name_numbers *name_numbers, struct street_name *name, int id) +{ + unsigned char *p=name->aux_data; + unsigned char *end=p+name->aux_len; + while (id >= 0) { + if (p >= end) + return 0; + street_name_numbers_get(name_numbers, &p); + id--; + } + return 1; +} + +static void +street_name_number_get(struct street_name_number *name_number, unsigned char **p) +{ + unsigned char *start=*p; + name_number->len=get_u16_unal(p); + name_number->tag=get_u8(p); + name_number->c=coord_get(p); + name_number->first.number=get_u16_unal(p); + name_number->first.suffix=get_string(p); + name_number->last.number=get_u16_unal(p); + name_number->last.suffix=get_string(p); + name_number->segment=(struct street_name_segment *)p; + *p=start+name_number->len; +} + +static int +street_name_number_get_byid(struct street_name_number *name_number, struct street_name_numbers *name_numbers, int id) +{ + unsigned char *p=name_numbers->tmp_data; + unsigned char *end=p+name_numbers->tmp_len; + while (id >= 0) { + if (p >= end) + return 0; + street_name_number_get(name_number, &p); + id--; + } + return 1; +} + +static void +street_name_get_by_id(struct street_name *name, struct file *file, unsigned long id) +{ + unsigned char *p; + if (id) { + p=file->begin+id+0x2000; + street_name_get(name, &p); + } +} + +static int street_get_bytes(struct coord_rect *r) +{ + int bytes,dx,dy; + bytes=2; + dx=r->rl.x-r->lu.x; + dy=r->lu.y-r->rl.y; + dbg_assert(dx > 0); + dbg_assert(dy > 0); + if (dx > 32767 || dy > 32767) + bytes=3; + if (dx > 8388608 || dy > 8388608) + bytes=4; + + return bytes; +} + +static int street_get_coord(unsigned char **pos, int bytes, struct coord_rect *ref, struct coord *f) +{ + unsigned char *p; + int x,y,flags=0; + + p=*pos; + x=*p++; + x|=(*p++) << 8; + if (bytes == 2) { + if ( x > 0x7fff) { + x=0x10000-x; + flags=1; + } + } + else if (bytes == 3) { + x|=(*p++) << 16; + if ( x > 0x7fffff) { + x=0x1000000-x; + flags=1; + } + } else { + x|=(*p++) << 16; + x|=(*p++) << 24; + if (x < 0) { + x=-x; + flags=1; + } + } + y=*p++; + y|=(*p++) << 8; + if (bytes == 3) { + y|=(*p++) << 16; + } else if (bytes == 4) { + y|=(*p++) << 16; + y|=(*p++) << 24; + } + if (f) { + f->x=ref->lu.x+x; + f->y=ref->rl.y+y; + dbg(1,"0x%x,0x%x + 0x%x,0x%x = 0x%x,0x%x\n", x, y, ref->lu.x, ref->rl.y, f->x, f->y); + } + *pos=p; + return flags; +} + +static void +street_coord_get_begin(unsigned char **p) +{ + struct street_str *str; + + str=(struct street_str *)(*p); + while (street_str_get_segid(str)) { + str++; + } + (*p)=(unsigned char *)str; + (*p)+=4; +} + + +static void +street_coord_rewind(void *priv_data) +{ + struct street_priv *street=priv_data; + + street->p=street->next=NULL; + street->status=street->status_rewind; +} + +static int +street_coord_get_helper(struct street_priv *street, struct coord *c) +{ + unsigned char *n; + if (street->p+street->bytes*2 >= street->end) + return 0; + if (street->status >= 4) + return 0; + n=street->p; + if (street_get_coord(&street->p, street->bytes, &street->ref, c)) { + if (street->status) + street->next=n; + street->status+=2; + if (street->status == 5) + return 0; + } + return 1; +} + +static int +street_coord_get(void *priv_data, struct coord *c, int count) +{ + struct street_priv *street=priv_data; + int ret=0,i,scount; +#ifdef DEBUG_COORD_GET + int segid,debug=0; +#endif + + if (! street->p && count) { + street->p=street->coord_begin; + scount=street->str-street->str_start; + for (i = 0 ; i < scount ; i++) { + street->status=street_str_get_segid(&street->str[i+1]) >= 0 ? 0:1; + while (street_coord_get_helper(street, c)); + street->p=street->next; + } + street->status_rewind=street->status=street_str_get_segid(&street->str[1]) >= 0 ? 0:1; + } +#ifdef DEBUG_COORD_GET + segid=street_str_get_segid(&street->str[0]); + if (segid < 0) + segid=-segid; + if (segid == 0x15) + debug=1; + if (debug) { + dbg(0,"enter 0x%x\n",segid); + } +#endif + while (count > 0) { + if (street_coord_get_helper(street, c)) { +#ifdef DEBUG_COORD_GET + if (debug) { + dbg(0,"0x%x,0x%x\n", c->x, c->y); + } +#endif + c++; + ret++; + count--; + } else { + street->more=0; + return ret; + } + } + return ret; +} + + static void +street_attr_rewind(void *priv_data) +{ + /* struct street_priv *street=priv_data; */ + +} + +static int +street_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + struct street_priv *street=priv_data; + int nameid; + + dbg(1,"segid 0x%x\n", street_str_get_segid(street->str)); + attr->type=attr_type; + switch (attr_type) { + case attr_any: + while (street->attr_next != attr_none) { + if (street_attr_get(street, street->attr_next, attr)) + return 1; + } + return 0; + case attr_label: + street->attr_next=attr_street_name; + nameid=street_str_get_nameid(street->str); + if (! nameid) + return 0; + if (! street->name.len) + street_name_get_by_id(&street->name,street->name_file,nameid); + attr->u.str=street->name.name2; + if (attr->u.str && attr->u.str[0]) + return 1; + attr->u.str=street->name.name1; + if (attr->u.str && attr->u.str[0]) + return 1; + return 0; + case attr_street_name: + street->attr_next=attr_street_name_systematic; + nameid=street_str_get_nameid(street->str); + if (! nameid) + return 0; + if (! street->name.len) + street_name_get_by_id(&street->name,street->name_file,nameid); + attr->u.str=street->name.name2; + return ((attr->u.str && attr->u.str[0]) ? 1:0); + case attr_street_name_systematic: + street->attr_next=attr_flags; + nameid=street_str_get_nameid(street->str); + if (! nameid) + return 0; + if (! street->name.len) + street_name_get_by_id(&street->name,street->name_file,nameid); + attr->u.str=street->name.name1; + return ((attr->u.str && attr->u.str[0]) ? 1:0); + case attr_flags: + attr->u.num=street->flags; + street->attr_next=attr_country_id; + return 1; + case attr_country_id: + street->attr_next=attr_debug; + nameid=street_str_get_nameid(street->str); + if (! nameid) + return 0; + if (! street->name.len) + street_name_get_by_id(&street->name,street->name_file,nameid); + attr->u.num=mg_country_to_isonum(street->name.country); + return 1; + case attr_debug: + street->attr_next=attr_none; + { + struct street_str *str=street->str; + sprintf(street->debug,"order:0x%x\nsegid:0x%x\nlimit:0x%x\nunknown2:0x%x\nunknown3:0x%x\ntype:0x%x\nnameid:0x%x\ntownassoc:0x%x",street_header_get_order(street->header),street_str_get_segid(str),street_str_get_limit(str),street_str_get_unknown2(str),street_str_get_unknown3(str),street_str_get_type(str),street_str_get_nameid(str), street->name.len ? street->name.townassoc : 0); + attr->u.str=street->debug; + } + return 1; + default: + return 0; + } + return 1; +} + +static struct item_methods street_meth = { + street_coord_rewind, + street_coord_get, + street_attr_rewind, + street_attr_get, +}; + +static void +street_get_data(struct street_priv *street, unsigned char **p) +{ + street->header=(struct street_header *)(*p); + (*p)+=sizeof(struct street_header); + street->type_count=street_header_get_count(street->header); + street->type=(struct street_type *)(*p); + (*p)+=street->type_count*sizeof(struct street_type); +} + + +static void +street_housenumber_coord_rewind(void *priv_data) +{ + struct street_priv *street=priv_data; + street->cidx=0; +} + +static void +street_housenumber_attr_rewind(void *priv_data) +{ + /* struct street_priv *street=priv_data; */ + +} + +static int +street_housenumber_coord_get(void *priv_data, struct coord *c, int count) +{ + struct street_priv *street=priv_data; + if (street->cidx || !count || !street->name.len) + return 0; + *c=street->hnc[street->housenumber-2]; + street->cidx=1; + return 1; +} + +static int +street_housenumber_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + struct street_priv *street=priv_data; + struct housenumber *hn; + attr->type=attr_type; + switch (attr_type) { + case attr_label: + hn=&street->hn[street->housenumber-2]; + sprintf(street->debug,"%d%s",hn->number,hn->suffix); + attr->u.str=street->debug; + return 1; + default: + dbg(0,"unknown item\n"); + return 0; + } +} + +static struct item_methods street_housenumber_meth = { + street_housenumber_coord_rewind, + street_housenumber_coord_get, + street_housenumber_attr_rewind, + street_housenumber_attr_get, +}; + +static void +project(struct coord *c, int count, int di, int dlr, struct coord *ch) +{ + struct coord cr; + int dx,dy; + int l; + + if (di > 0) { + dx=c[1].x-c[0].x; + dy=c[1].y-c[0].y; + cr=c[0]; + } else if (di < 0) { + dx=c[count-1].x-c[count-2].x; + dy=c[count-1].y-c[count-2].y; + cr=c[count-1]; + } else { + dx=c[1].x-c[0].x; + dy=c[1].y-c[0].y; + di=0; + if (count % 2) { + cr=c[count/2]; + } else { + cr.x=(c[count/2-1].x+c[count/2].x)/2; + cr.y=(c[count/2-1].y+c[count/2].y)/2; + } + } + l=sqrtf(dx*dx+dy*dy); + if (!l) { + *ch=cr; + return; + } + ch->x=cr.x+(di*dx+dlr*dy)/l; + ch->y=cr.y+(di*dy-dlr*dx)/l; +} + +static int +street_lookup_housenumber(struct street_priv *street) +{ + int i,count,scount,maxcount=16384; + struct coord c[maxcount]; + struct street_name_numbers nns; + unsigned char *p=street->name.aux_data; + unsigned char *end=p+street->name.aux_len; + unsigned char *pn,*pn_end; + + street->hn_count=0; + street_coord_rewind(street); + scount=street_coord_get(street, c, maxcount/2); + if (scount >= maxcount/2) { + dbg(0,"overflow"); + } + for (i = 0 ; i < scount-1 ; i++) { + c[scount+i].x=(c[i].x+c[i+1].x)/2; + c[scount+i].y=(c[i].y+c[i+1].y)/2; + } + count=scount*2-1; + while (p < end) { + struct street_name_number nn; + street_name_numbers_get(&nns, &p); + pn=nns.aux_data; + pn_end=nns.aux_data+nns.aux_len; + while (pn < pn_end) { + street_name_number_get(&nn, &pn); + for (i = 0 ; i < count ; i++) { + int dx=nn.c->x-c[i].x; + int dy=nn.c->y-c[i].y; + int dlr,dir; + if (dx < 3 && dx > -3 && dy < 3 && dy > -3) { + dir=15; + dlr=15; + switch (nn.tag & 0xf) { + case 0xa: + break; + case 0xb: + dlr=-dlr; + dir=-dir; + break; + case 0xe: + dlr=-dlr; + break; + case 0xf: + dir=-dir; + break; + default: + dbg(0,"unknown tag 0x%x\n",nn.tag); +#if 0 + continue; +#endif + } + if (street_str_get_type(street->str) & 0x40) { + dir=-dir; + dlr=-dlr; + } + if (nn.first.number == nn.last.number && !strcmp(nn.first.suffix, nn.last.suffix)) + dir=0; + project(c, scount, dir, dlr, &street->hnc[street->hn_count]); + street->hn[street->hn_count]=nn.first; + street->hn_count++; + dbg_assert(street->hn_count < 100); + project(c, scount, -dir, dlr, &street->hnc[street->hn_count]); + street->hn[street->hn_count]=nn.last; + street->hn_count++; + dbg_assert(street->hn_count < 100); + dbg(1,"found %d%s %d%s\n",nn.first.number,nn.first.suffix,nn.last.number,nn.last.suffix); + } + } + } + } + return 1; +} + +static int +street_get_housenumber(struct map_rect_priv *mr, struct street_priv *street, struct item *item) +{ + int nameid; + nameid=street_str_get_nameid(street->str); + if (! nameid) + return 0; + if (! street->name.len) + street_name_get_by_id(&street->name,street->name_file,nameid); + if (! street->name.aux_len) + return 0; + if (!street->hn_count) + street_lookup_housenumber(street); + if (street->housenumber > street->hn_count) + return 0; + item->type=type_town_label; + item->id_hi = (item->id_hi & 0xffffff) | (street->housenumber*0x10000000+0x1000000); + item->meth=&street_housenumber_meth; + street->cidx=0; + street->housenumber++; + return 1; +} + + /*0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 */ +static unsigned char limit[]={0,0,1,1,1,2,2,4,6,6,12,13,14,20,20,20,20,20,20}; + +int +street_get(struct map_rect_priv *mr, struct street_priv *street, struct item *item) +{ + int *flags; + struct coord_rect r; + for (;;) { + while (street->more) { + struct coord c; + street_coord_get(street, &c, 1); + } +#if 0 + if (street->housenumber) { + if (street_get_housenumber(mr, street, item)) + return 1; + street->housenumber=0; + } +#endif + if (mr->b.p == mr->b.p_start) { + street_get_data(street, &mr->b.p); + street->name_file=mr->m->file[file_strname_stn]; + if (mr->cur_sel && street_header_get_order(street->header) > limit[mr->cur_sel->order]) + return 0; + street->end=mr->b.end; + block_get_r(mr->b.b, &r); + street->ref=r; + street->bytes=street_get_bytes(&r); + street->str_start=street->str=(struct street_str *)mr->b.p; + street->coord_begin=mr->b.p; + street_coord_get_begin(&street->coord_begin); + street->p=street->coord_begin; + street->type--; + item->meth=&street_meth; + item->priv_data=street; + } else { + street->str++; + street->p=street->next; + } + if (! street_str_get_segid(street->str)) + return 0; + if (street_str_get_segid(street->str) < 0) + street->type++; +#if 0 + dbg_assert(street->p != NULL); +#endif + street->next=NULL; + street->status_rewind=street->status=street_str_get_segid(&street->str[1]) >= 0 ? 0:1; +#if 0 + if (street->type->country != 0x31) { + printf("country=0x%x\n", street->type->country); + } +#endif + item->id_hi=street_type_get_country(street->type) | (mr->current_file << 16); + item->id_lo=street_str_get_segid(street->str) > 0 ? street_str_get_segid(street->str) : -street_str_get_segid(street->str); + switch(street_str_get_type(street->str) & 0x1f) { + case 0xf: /* very small street */ + if (street_str_get_limit(street->str) == 0x33) + item->type=type_street_nopass; + else + item->type=type_street_0; + break; + case 0xd: + item->type=type_ferry; + break; + case 0xc: /* small street */ + item->type=type_street_1_city; + break; + case 0xb: + item->type=type_street_2_city; + break; + case 0xa: + if ((street_str_get_limit(street->str) == 0x03 || street_str_get_limit(street->str) == 0x30) && street_header_get_order(street->header) < 4) + item->type=type_street_4_city; + else + item->type=type_street_3_city; + break; + case 0x9: + if (street_header_get_order(street->header) < 5) + item->type=type_street_4_city; + else if (street_header_get_order(street->header) < 7) + item->type=type_street_2_city; + else + item->type=type_street_1_city; + break; + case 0x8: + item->type=type_street_2_land; + break; + case 0x7: + if ((street_str_get_limit(street->str) == 0x03 || street_str_get_limit(street->str) == 0x30) && street_header_get_order(street->header) < 4) + item->type=type_street_4_city; + else + item->type=type_street_3_land; + break; + case 0x6: + item->type=type_ramp; + break; + case 0x5: + item->type=type_street_4_land; + break; + case 0x4: + item->type=type_street_4_land; + break; + case 0x3: + item->type=type_street_n_lanes; + break; + case 0x2: + item->type=type_highway_city; + break; + case 0x1: + item->type=type_highway_land; + break; + default: + item->type=type_street_unkn; + dbg(0,"unknown type 0x%x\n",street_str_get_type(street->str)); + } + flags=item_get_default_flags(item->type); + if (flags) + street->flags=*flags; + else + street->flags=0; + if (street_str_get_type(street->str) & 0x40) { + street->flags|=(street_str_get_limit(street->str) & 0x30) ? AF_ONEWAYREV:0; + street->flags|=(street_str_get_limit(street->str) & 0x03) ? AF_ONEWAY:0; + } else { + street->flags|=(street_str_get_limit(street->str) & 0x30) ? AF_ONEWAY:0; + street->flags|=(street_str_get_limit(street->str) & 0x03) ? AF_ONEWAYREV:0; + } +#if 0 + coord_debug=(street->str->unknown2 != 0x40 || street->str->unknown3 != 0x40); + if (coord_debug) { + item->type=type_street_unkn; + printf("%d %02x %02x %02x %02x\n", street->str->segid, street->str->type, street->str->limit, street->str->unknown2, street->str->unknown3); + } +#endif + street->p_rewind=street->p; + street->name.len=0; + street->attr_next=attr_label; + street->more=1; + street->housenumber=1; + street->hn_count=0; + if (!map_selection_contains_item(mr->cur_sel, 0, item->type)) + continue; + item->meth=&street_meth; + item->priv_data=street; + return 1; + } +} + +int +street_get_byid(struct map_rect_priv *mr, struct street_priv *street, int id_hi, int id_lo, struct item *item) +{ + int country=id_hi & 0xffff; + int res; + struct coord_rect r; + dbg(1,"enter(%p,%p,0x%x,0x%x,%p)\n", mr, street, id_hi, id_lo, item); + if (! country) + return 0; + if (! tree_search_hv(mr->m->dirname, "street", (id_lo >> 8) | (country << 24), id_lo & 0xff, &res)) + return 0; + dbg(1,"res=0x%x (blk=0x%x)\n", res, res >> 12); + block_get_byindex(mr->m->file[mr->current_file], res >> 12, &mr->b); + street_get_data(street, &mr->b.p); + street->name_file=mr->m->file[file_strname_stn]; + street->end=mr->b.end; + block_get_r(mr->b.b, &r); + street->ref=r; + street->bytes=street_get_bytes(&r); + street->str_start=street->str=(struct street_str *)mr->b.p; + street->coord_begin=mr->b.p; + street_coord_get_begin(&street->coord_begin); + street->p=street->coord_begin; + street->type--; + item->meth=&street_meth; + item->priv_data=street; + street->str+=(res & 0xfff)-1; + dbg(1,"segid 0x%x\n", street_str_get_segid(&street->str[1])); + return street_get(mr, street, item); +#if 0 + mr->b.p=mr->b.block_start+(res & 0xffff); + return town_get(mr, twn, item); +#endif + + return 0; +} + +struct street_name_index { + int block; + unsigned short country; + int town_assoc; + char name[0]; +} __attribute__((packed)); + +static unsigned char +latin1_tolower(unsigned char c) +{ + if (c >= 'A' && c <= 'Z') + return c - 'A' + 'a'; + if (c == 0xc4 || c == 0xc9 || c == 0xd6 || c == 0xdc) + return c+0x20; + return c; +} + +static unsigned char +latin1_tolower_ascii(unsigned char c) +{ + unsigned char ret=latin1_tolower(c); + switch (ret) { + case 0xe4: + return 'a'; + case 0xe9: + return 'e'; + case 0xf6: + return 'o'; + case 0xfc: + return 'u'; + default: + if (ret >= 0x80) + dbg(1,"ret=0x%x\n",c); + return ret; + } +} + +static int +strncasecmp_latin1(char *str1, char *str2, int len) +{ + int d; + while (len--) { + d=latin1_tolower((unsigned char)(*str1))-latin1_tolower((unsigned char)(*str2)); + if (d) + return d; + if (! *str1) + return 0; + str1++; + str2++; + } + return 0; +} + +static int +strncasecmp_latin1_ascii(char *str1, char *str2, int len) +{ + int d; + while (len--) { + d=latin1_tolower_ascii((unsigned char)(*str1))-latin1_tolower_ascii((unsigned char)(*str2)); + if (d) + return d; + if (! *str1) + return 0; + str1++; + str2++; + } + return 0; +} + +static int +street_search_compare_do(struct map_rect_priv *mr, int country, int town_assoc, char *name) +{ + int d,len; + + dbg(1,"enter"); + dbg(1,"country 0x%x town_assoc 0x%x name '%s'\n", country, town_assoc, name); + d=(mr->search_item.id_hi & 0xffff)-country; + dbg(1,"country %d (%d vs %d)\n", d, mr->search_item.id_hi & 0xffff, country); + if (!d) { + if (mr->search_item.id_lo == town_assoc ) { + dbg(1,"town_assoc match (0x%x)\n", town_assoc); + len=mr->search_partial ? strlen(mr->search_str):INT_MAX; + d=strncasecmp_latin1(mr->search_str, name, len); + if (!strncasecmp_latin1_ascii(mr->search_str, name, len)) + d=0; + dbg(1,"string %d\n", d); + } else { + if (town_assoc < mr->search_item.id_lo) + d=1; + else + d=-1; + dbg(1,"assoc %d 0x%x-0x%x\n",d, mr->search_item.id_lo, town_assoc); + } + } + dbg(1,"d=%d\n", d); + return d; +} + +static int +street_search_compare(unsigned char **p, struct map_rect_priv *mr) +{ + struct street_name_index *i; + int ret; + + dbg(1,"enter\n"); + i=(struct street_name_index *)(*p); + *p+=sizeof(*i)+strlen(i->name)+1; + + dbg(1,"block 0x%x\n", i->block); + + ret=street_search_compare_do(mr, i->country, i->town_assoc, i->name); + if (ret <= 0) + mr->search_block=i->block; + return ret; +} + +static void +street_name_numbers_coord_rewind(void *priv_data) +{ + /* struct street_priv *street=priv_data; */ + +} + +static void +street_name_numbers_attr_rewind(void *priv_data) +{ + /* struct street_priv *street=priv_data; */ + +} + +static int +street_name_numbers_coord_get(void *priv_data, struct coord *c, int count) +{ + return 0; +} + +static int +street_name_numbers_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + attr->type=attr_type; + switch (attr_type) { + default: + dbg(0,"unknown item\n"); + return 0; + } +} + + + + + +static struct item_methods street_name_numbers_meth = { + street_name_numbers_coord_rewind, + street_name_numbers_coord_get, + street_name_numbers_attr_rewind, + street_name_numbers_attr_get, +}; + + +static void +street_name_coord_rewind(void *priv_data) +{ + /* struct street_priv *street=priv_data; */ + +} + +static void +street_name_attr_rewind(void *priv_data) +{ + /* struct street_priv *street=priv_data; */ + +} + +static int +street_name_coord_get(void *priv_data, struct coord *c, int count) +{ + struct map_rect_priv *mr=priv_data; + struct street_name_numbers snns; + unsigned char *p=mr->street.name.aux_data; + + dbg(1,"aux_data=%p\n", p); + if (count) { + street_name_numbers_get(&snns, &p); + street_name_numbers_get_coord(&snns, c); + return 1; + } + + return 0; +} + +#if 0 +static void +debug(struct map_rect_priv *mr) +{ + int i; + struct street_name_numbers nns; + unsigned char *p=mr->street.name.aux_data; + unsigned char *end=p+mr->street.name.aux_len; + printf("len=0x%x\n", mr->street.name.aux_len); + for (i = 0 ; i < mr->street.name.aux_len ; i++) { + printf("%02x ",mr->street.name.aux_data[i]); + } + printf("\n"); + { + while (p < end) { + unsigned char *pn,*pn_end; + struct street_name_number nn; + street_name_numbers_get(&nns, &p); + printf("name_numbers:\n"); + printf(" len 0x%x\n", nns.len); + printf(" tag 0x%x\n", nns.tag); + printf(" dist 0x%x\n", nns.dist); + printf(" country 0x%x\n", nns.country); + printf(" coord 0x%x,0x%x\n", nns.c->x, nns.c->y); + printf(" first %d\n", nns.first.number); + printf(" last %d\n", nns.last.number); + printf(" segment count 0x%x\n", nns.segment_count); + printf(" aux_len 0x%x\n", nns.aux_len); + pn=nns.aux_data; + pn_end=nns.aux_data+nns.aux_len; + while (pn < pn_end) { + printf(" number:\n"); + street_name_number_get(&nn, &pn); + printf(" len 0x%x\n", nn.len); + printf(" tag 0x%x\n", nn.tag); + printf(" coord 0x%x,0x%x\n", nn.c->x, nn.c->y); + printf(" first %d\n", nn.first.number); + printf(" last %d\n", nn.last.number); + } + } + } +} +#endif + +static int +street_name_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + struct map_rect_priv *mr=priv_data; + + attr->type=attr_type; + switch (attr_type) { + case attr_street_name: + attr->u.str=mr->street.name.name2; + return ((attr->u.str && attr->u.str[0]) ? 1:0); + case attr_street_name_systematic: + attr->u.str=mr->street.name.name1; + return ((attr->u.str && attr->u.str[0]) ? 1:0); + case attr_town_name: + case attr_district_name: + case attr_postal: + if (!mr->search_item_tmp) + mr->search_item_tmp=map_rect_get_item_byid_mg(mr->search_mr_tmp, mr->street.name_numbers.country | (file_town_twn << 16), mr->street.name_numbers.dist); + if (!mr->search_item_tmp) + return 0; + return item_attr_get(mr->search_item_tmp, attr_type, attr); + default: + dbg(0,"%p\n",mr->street.name_numbers.dist); + dbg(0,"unknown attr %s\n",attr_to_name(attr_type)); + return 0; + } +} + + + + + +static struct item_methods street_name_meth = { + street_name_coord_rewind, + street_name_coord_get, + street_name_attr_rewind, + street_name_attr_get, +}; + + +int +street_name_get_byid(struct map_rect_priv *mr, struct street_priv *street, int id_hi, int id_lo, struct item *item) +{ + mr->current_file=id_hi >> 16; + street->name_file=mr->m->file[mr->current_file]; + item->type=type_street_name; + item->id_hi=id_hi; + item->id_lo=id_lo; + item->meth=&street_name_meth; + item->map=NULL; + item->priv_data=mr; + mr->b.p=street->name_file->begin+item->id_lo; + dbg(1,"last %p map %p file %d begin %p\n", mr->b.p, mr->m, mr->current_file, mr->m->file[mr->current_file]->begin); + street_name_get(&street->name, &mr->b.p); + return 1; +} + +static struct item * +street_search_get_item_street_name(struct map_rect_priv *mr) +{ + int dir=1,leaf; + unsigned char *last; + + dbg(1,"enter\n"); + if (! mr->search_blk_count) { + dbg(1,"partial 0x%x '%s' ***\n", mr->town.street_assoc, mr->search_str); + if (mr->search_linear) + return NULL; + dbg(1,"tree_search_next\n"); + mr->search_block=-1; + while ((leaf=tree_search_next(&mr->ts, &mr->search_p, dir)) != -1) { + dir=street_search_compare(&mr->search_p, mr); + } + dbg(1,"dir=%d mr->search_block=0x%x\n", dir, mr->search_block); + if (mr->search_block == -1) + return NULL; + mr->search_blk_count=1; + block_get_byindex(mr->m->file[file_strname_stn], mr->search_block, &mr->b); + mr->b.p=mr->b.block_start+12; + } + dbg(1,"name id 0x%x\n", mr->b.p-mr->m->file[file_strname_stn]->begin); + if (! mr->search_blk_count) + return NULL; + for (;;) { + if (mr->b.p >= mr->b.end) { + if (!block_next_lin(mr)) { + dbg(1,"end of blocks in %p, %p\n", mr->m->file[file_strname_stn]->begin, mr->m->file[file_strname_stn]->end); + return NULL; + } + mr->b.p=mr->b.block_start+12; + } + while (mr->b.p < mr->b.end) { + last=mr->b.p; + street_name_get(&mr->street.name, &mr->b.p); + dir=street_search_compare_do(mr, mr->street.name.country, mr->street.name.townassoc, mr->street.name.name2); + dbg(1,"country 0x%x assoc 0x%x name1 '%s' name2 '%s' dir=%d\n", mr->street.name.country, mr->street.name.townassoc, mr->street.name.name1, mr->street.name.name2, dir); + if (dir < 0) { + dbg(1,"end of data\n"); + mr->search_blk_count=0; + return NULL; + } + if (!dir) { + dbg(1,"result country 0x%x assoc 0x%x name1 '%s' name2 '%s' dir=%d aux_data=%p len=0x%x\n", mr->street.name.country, mr->street.name.townassoc, mr->street.name.name1, mr->street.name.name2, dir, mr->street.name.aux_data, mr->street.name.aux_len); + mr->item.type = type_street_name; + mr->item.id_hi=(file_strname_stn << 16); + mr->item.id_lo=last-mr->m->file[file_strname_stn]->begin; + dbg(1,"id 0x%x 0x%x last %p map %p file %d begin %p\n", mr->item.id_hi, mr->item.id_lo, last, mr->m, mr->current_file, mr->m->file[mr->current_file]->begin); + mr->item.meth=&street_name_meth; + mr->item.map=NULL; + mr->item.priv_data=mr; + /* debug(mr); */ + dbg(1,"last %p\n",last); + return &mr->item; + } + } + } +} + +static void +district_debug(struct map_rect_priv *mr, int country, int dist) +{ + struct map_rect_priv *mrt; + struct item *item; + struct attr attrn; + + mrt=map_rect_new_mg(mr->m, NULL); + item=map_rect_get_item_byid_mg(mrt, country | (file_town_twn << 16), dist); + dbg(0,"item=%p\n",item); + if (item_attr_get(item, attr_town_postal, &attrn)) + dbg(0,"postal=%s\n",attrn.u.str); + if (item_attr_get(item, attr_town_name, &attrn)) + dbg(0,"town_name=%s\n",attrn.u.str); + if (item_attr_get(item, attr_district_name, &attrn)) + dbg(0,"district_name=%s\n",attrn.u.str); + map_rect_destroy_mg(mrt); +} + +static int +street_name_numbers_get_next(struct map_rect_priv *mr, struct street_name *name, char *start, unsigned char **p, int mode, int *id, struct street_name_numbers *ret) +{ + struct street_name_numbers tmp; + unsigned char *ps,*pt; + int found; + while (*p < name->aux_data+name->aux_len) { + ps=*p; + street_name_numbers_get(ret, p); + (*id)++; + found=0; + pt=name->aux_data; + while (pt < ps) { + street_name_numbers_get(&tmp, &pt); + if (tmp.country == ret->country && tmp.dist == ret->dist) { + found=1; + break; + } + } + if (!found) { + dbg(0,"district 0x%x\n",ret->dist); + district_debug(mr, ret->country, ret->dist); + return 1; + } + } + return 0; +} + + +static struct item * +street_search_get_item_street_name_district(struct map_rect_priv *mr, int flag) +{ + if (street_name_eod(&mr->street.name)) + return NULL; + if (!street_name_numbers_get_next(mr, &mr->street.name, NULL, &mr->street.name.tmp_data, 1, &mr->item.id_hi, &mr->street.name_numbers)) + return NULL; + return &mr->item; +} + +struct item * +street_search_get_item(struct map_rect_priv *mr) +{ + struct item *item; + for (;;) { + if (!mr->street.name.tmp_data || street_name_eod(&mr->street.name)) { + item=street_search_get_item_street_name(mr); + if (!item) + return NULL; + if (!mr->street.name.aux_len) + return item; + } + mr->item.id_hi++; + street_name_numbers_get(&mr->street.name_numbers, &mr->street.name.tmp_data); + mr->search_item_tmp=NULL; + return &mr->item; + } +} + +static int +street_name_numbers_next(struct map_rect_priv *mr) +{ + if (street_name_eod(&mr->street.name)) + return 0; + dbg(1,"%p vs %p\n",mr->street.name.tmp_data, mr->street.name.aux_data); + street_name_numbers_get(&mr->street.name_numbers, &mr->street.name.tmp_data); + return 1; +} + +static int +street_name_number_next(struct map_rect_priv *mr) +{ + if (street_name_numbers_eod(&mr->street.name_numbers)) + return 0; + street_name_number_get(&mr->street.name_number, &mr->street.name_numbers.tmp_data); + sprintf(mr->street.first_number,"%d%s",mr->street.name_number.first.number,mr->street.name_number.first.suffix); + sprintf(mr->street.last_number,"%d%s",mr->street.name_number.last.number,mr->street.name_number.last.suffix); + mr->street.current_number[0]='\0'; + return 1; +} + +static void +housenumber_coord_rewind(void *priv_data) +{ + /* struct street_priv *street=priv_data; */ + +} + +static void +housenumber_attr_rewind(void *priv_data) +{ + /* struct street_priv *street=priv_data; */ + +} + +static int +housenumber_coord_get(void *priv_data, struct coord *c, int count) +{ + return 0; +} + +static int +housenumber_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + struct map_rect_priv *mr=priv_data; + attr->type=attr_type; + switch (attr_type) { + case attr_house_number: + attr->u.str=mr->street.current_number; + return 1; + case attr_town_name: + case attr_district_name: + case attr_postal: + if (!mr->search_item_tmp) + mr->search_item_tmp=map_rect_get_item_byid_mg(mr->search_mr_tmp, mr->street.name_numbers.country | (file_town_twn << 16), mr->street.name_numbers.dist); + if (!mr->search_item_tmp) + return 0; + return item_attr_get(mr->search_item_tmp, attr_type, attr); + default: + dbg(0,"unknown attr %s\n",attr_to_name(attr_type)); + return 0; + } +} + + +static struct item_methods housenumber_meth = { + housenumber_coord_rewind, + housenumber_coord_get, + housenumber_attr_rewind, + housenumber_attr_get, +}; + +int +housenumber_search_setup(struct map_rect_priv *mr) +{ + dbg(1,"enter (0x%x,0x%x)\n",mr->search_item.id_hi,mr->search_item.id_lo); + int id=mr->search_item.id_hi & 0xff; + mr->current_file=file_strname_stn; + mr->street.name_file=mr->m->file[mr->current_file]; + mr->b.p=mr->street.name_file->begin+mr->search_item.id_lo; + mr->search_str=g_strdup(mr->search_attr->u.str); + dbg(1,"last %p\n",mr->b.p); + street_name_get(&mr->street.name, &mr->b.p); +#if 0 + debug(mr); +#endif + while (id > 0) { + id--; + dbg(1,"loop\n"); + if (!street_name_numbers_next(mr)) + return 0; + } + mr->item.type=type_house_number; + mr->item.priv_data=mr; + mr->item.id_hi=mr->search_item.id_hi + 0x100; + mr->item.meth=&housenumber_meth; + if (!id) + mr->item.id_hi+=1; + mr->item.id_lo=mr->search_item.id_lo; + dbg(1,"getting name_number %p vs %p + %d\n",mr->street.name_numbers.tmp_data,mr->street.name_numbers.aux_data, mr->street.name_numbers.aux_len); + if (!street_name_number_next(mr)) + return 0; + dbg(1,"enter\n"); + // debug(mr); + return 1; +} + +static int +house_number_next(char *number, char *first, char *last, int interpolation, int *percentage) +{ + int firstn=atoi(first); + int lastn=atoi(last); + int current,delta,len=lastn-firstn; + if (interpolation) { + len/=2; + } + if (!number[0]) { + strcpy(number,first); + delta=0; + } else { + current=atoi(number)+(interpolation ? 2:1); + if (current > lastn) + return 0; + sprintf(number,"%d",current); + delta=current-firstn; + } + if (percentage) { + if (len) + *percentage=delta*100/len; + else + *percentage=50; + } + return 1; +} + +struct item * +housenumber_search_get_item(struct map_rect_priv *mr) +{ + int d; + dbg(1,"enter %s %s\n",mr->street.first_number,mr->street.last_number); + for (;;) { + if (!house_number_next(mr->street.current_number, mr->street.first_number, mr->street.last_number, 0, NULL)) { + if (!street_name_number_next(mr)) + return NULL; + continue; + } + if (mr->search_partial) + d=strncasecmp(mr->search_str, mr->street.current_number, strlen(mr->search_str)); + else + d=strcasecmp(mr->search_str, mr->street.current_number); + if (!d) { + mr->search_item_tmp=NULL; + return &mr->item; + } + } +} diff --git a/navit/map/mg/town.c b/navit/map/mg/town.c new file mode 100644 index 0000000..8ef5e80 --- /dev/null +++ b/navit/map/mg/town.c @@ -0,0 +1,287 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "debug.h" +#include "mg.h" + + + +static void +town_coord_rewind(void *priv_data) +{ + struct town_priv *twn=priv_data; + + twn->cidx=0; +} + +static int +town_coord_get(void *priv_data, struct coord *c, int count) +{ + struct town_priv *twn=priv_data; + + if (twn->cidx || count <= 0) + return 0; + twn->cidx=1; + *c=twn->c; + return 1; +} + +static void +town_attr_rewind(void *priv_data) +{ + struct town_priv *twn=priv_data; + + twn->aidx=0; + twn->attr_next=attr_label; +} + +static int +town_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + struct town_priv *twn=priv_data; + int len; + + attr->type=attr_type; + switch (attr_type) { + case attr_any: + while (twn->attr_next != attr_none) { + if (town_attr_get(twn, twn->attr_next, attr)) + return 1; + } + return 0; + case attr_label: + attr->u.str=twn->district; + twn->attr_next=attr_town_name; + if (attr->u.str[0]) + return 1; + attr->u.str=twn->name; + return ((attr->u.str && attr->u.str[0]) ? 1:0); + case attr_town_name: + attr->u.str=twn->name; + twn->attr_next=attr_town_postal; + return ((attr->u.str && attr->u.str[0]) ? 1:0); + case attr_town_postal: + case attr_postal: + strncpy(twn->postal, twn->postal_code1, 32); + attr->u.str=twn->postal; + len=mg_country_postal_len(twn->country); + if (!len) + len=31; + twn->postal[len]='\0'; + twn->attr_next=attr_district_name; + return ((attr->u.str && attr->u.str[0]) ? 1:0); + case attr_district_name: + attr->u.str=twn->district; + twn->attr_next=attr_debug; + return ((attr->u.str && attr->u.str[0]) ? 1:0); + case attr_town_streets_item: + twn->town_attr_item.type=type_town_streets; + twn->town_attr_item.id_hi=twn->country | (file_town_twn << 16) | 0x10000000; + twn->town_attr_item.id_lo=twn->street_assoc; + attr->u.item=&twn->town_attr_item; + twn->attr_next=attr_debug; + return 1; + case attr_debug: + sprintf(twn->debug, "order %d\nsize %d\nstreet_assoc 0x%x", twn->order, twn->size, twn->street_assoc); + attr->u.str=twn->debug; + twn->attr_next=attr_none; + return 1; + default: + dbg(1, "Don't know about attribute %d[%04X]=%s yet\n", + attr_type, attr_type, attr_to_name(attr_type)); + return 0; + } + return 1; +} + +static struct item_methods town_meth = { + town_coord_rewind, + town_coord_get, + town_attr_rewind, + town_attr_get, +}; + +static void +town_get_data(struct town_priv *twn, unsigned char **p) +{ + twn->id=get_u32_unal(p); + twn->c.x=get_u32_unal(p); + twn->c.y=get_u32_unal(p); + twn->name=get_string(p); + twn->district=get_string(p); + twn->postal_code1=get_string(p); + twn->order=get_u8(p); /* 1-15 (19) */ + twn->country=get_u16_unal(p); + twn->type=get_u8(p); + twn->unknown2=get_u32_unal(p); + twn->size=get_u8(p); + twn->street_assoc=get_u32_unal(p); + twn->unknown3=get_u8(p); + twn->postal_code2=get_string(p); + twn->unknown4=get_u32_unal(p); +#if 0 + printf("%s\t%s\t%s\t%d\t%d\t%d\n",twn->name,twn->district,twn->postal_code1,twn->order, twn->country, twn->type); +#endif +} + /*0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 */ +static unsigned char limit[]={0,1,2,2,4,6,8,10,11,13,14,14,14,20,20,20,20,20,20}; + +static enum item_type town_item[]={type_town_label_5e1, type_town_label_1e2, type_town_label_2e2, type_town_label_5e2, type_town_label_1e3, type_town_label_1e3, type_town_label_2e3, type_town_label_5e3, type_town_label_1e4, type_town_label_2e4, type_town_label_5e4, type_town_label_1e5, type_town_label_1e5, type_town_label_2e5, type_town_label_5e5, type_town_label_1e6, type_town_label_2e6}; +static enum item_type district_item[]={type_district_label_5e1, type_district_label_1e2, type_district_label_2e2, type_district_label_5e2, type_district_label_1e3, type_district_label_1e3, type_district_label_2e3, type_district_label_5e3, type_district_label_1e4, type_district_label_2e4, type_district_label_5e4, type_district_label_1e5, type_district_label_1e5, type_district_label_2e5, type_district_label_5e5, type_district_label_1e6, type_district_label_2e6}; +int +town_get(struct map_rect_priv *mr, struct town_priv *twn, struct item *item) +{ + int size; + for (;;) { + if (mr->b.p >= mr->b.end) + return 0; + town_get_data(twn, &mr->b.p); + twn->cidx=0; + twn->aidx=0; + twn->attr_next=attr_label; + if (! mr->cur_sel || (twn->order <= limit[mr->cur_sel->order] && coord_rect_contains(&mr->cur_sel->u.c_rect,&twn->c))) { + switch(twn->type) { + case 1: + size=twn->size; + if (size >= sizeof(town_item)/sizeof(enum item_type)) + size=sizeof(town_item)/sizeof(enum item_type)-1; + item->type=town_item[size]; + break; + case 3: + size=twn->size; + if (size == 6 && twn->order < 14) + size++; + if (size == 5 && twn->order < 14) + size+=2; + if (size >= sizeof(district_item)/sizeof(enum item_type)) + size=sizeof(district_item)/sizeof(enum item_type)-1; + item->type=district_item[size]; + break; + case 4: + item->type=type_port_label; + break; + case 9: + item->type=type_highway_exit_label; + break; + default: + printf("unknown town type 0x%x '%s' '%s' 0x%x,0x%x\n", twn->type, twn->name, twn->district, twn->c.x, twn->c.y); + item->type=type_town_label; + } + if (map_selection_contains_item(mr->cur_sel, 0, item->type)) { + item->id_hi=twn->country | (mr->current_file << 16); + item->id_lo=twn->id; + item->priv_data=twn; + item->meth=&town_meth; + return 1; + } + } + } +} + +int +town_get_byid(struct map_rect_priv *mr, struct town_priv *twn, int id_hi, int id_lo, struct item *item) +{ + int country=id_hi & 0xffff; + int res; + if (!tree_search_hv(mr->m->dirname, "town", (id_lo >> 8) | (country << 24), id_lo & 0xff, &res)) + return 0; + block_get_byindex(mr->m->file[mr->current_file], res >> 16, &mr->b); + mr->b.p=mr->b.block_start+(res & 0xffff); + return town_get(mr, twn, item); +} + +static int +town_search_compare(unsigned char **p, struct map_rect_priv *mr) +{ + int country, d; + char *name; + + if (mr->search_type == attr_town_postal) { + mr->search_blk_count=1; + mr->search_blk_off=(struct block_offset *)(*p); + *p+=4; + name=get_string(p); + d=0; + } else { + country=get_u16_unal(p); + dbg(1,"country 0x%x ", country); + name=get_string(p); + dbg(1,"name '%s' ",name); + mr->search_blk_count=get_u32_unal(p); + mr->search_blk_off=(struct block_offset *)(*p); + dbg(1,"len %d ", mr->search_blk_count); + (*p)+=mr->search_blk_count*4; + d=mr->search_country-country; + } + if (!d) { + if (mr->search_partial) + d=strncasecmp(mr->search_str, name, strlen(mr->search_str)); + else + d=strcasecmp(mr->search_str, name); + } + dbg(1,"%d \n",d); + return d; + +} + + + +struct item * +town_search_get_item(struct map_rect_priv *mr) +{ + int dir=1,leaf; + + if (! mr->search_blk_count) { + dbg(1,"partial %d 0x%x '%s' ***\n", mr->search_partial, mr->search_country, mr->search_str); + if (! mr->search_linear) { + while ((leaf=tree_search_next(&mr->ts, &mr->search_p, dir)) != -1) { + dir=town_search_compare(&mr->search_p, mr); + if (! dir) { + mr->search_linear=1; + mr->search_p=NULL; + break; + } + } + if (! mr->search_linear) { + dbg(1,"not found\n"); + return NULL; + } + } + if (! tree_search_next_lin(&mr->ts, &mr->search_p)) { + dbg(1,"linear not found\n"); + return NULL; + } + if (town_search_compare(&mr->search_p, mr)) { + dbg(1,"no match\n"); + return NULL; + } + dbg(1,"found %d blocks\n",mr->search_blk_count); + } + if (! mr->search_blk_count) + return NULL; + dbg(1,"block 0x%x offset 0x%x\n", block_offset_get_block(mr->search_blk_off), block_offset_get_offset(mr->search_blk_off)); + block_get_byindex(mr->m->file[mr->current_file], block_offset_get_block(mr->search_blk_off), &mr->b); + mr->b.p=mr->b.block_start+block_offset_get_offset(mr->search_blk_off); + town_get(mr, &mr->town, &mr->item); + mr->search_blk_off++; + mr->search_blk_count--; + return &mr->item; +} diff --git a/navit/map/mg/tree.c b/navit/map/mg/tree.c new file mode 100644 index 0000000..27459cf --- /dev/null +++ b/navit/map/mg/tree.c @@ -0,0 +1,280 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "debug.h" +#include "mg.h" + +struct tree_hdr { + /*unsigned int addr; + unsigned int size; + unsigned int low;*/ + unsigned char p[12]; +}; +static inline unsigned int tree_hdr_get_addr(struct tree_hdr * tree) { unsigned char *p = tree->p; return get_u32(&p); } +static inline unsigned int tree_hdr_get_size(struct tree_hdr * tree) { unsigned char *p = tree->p+4; return get_u32(&p); } +static inline unsigned int tree_hdr_get_low(struct tree_hdr * tree) { unsigned char *p = tree->p+8; return get_u32(&p); } + +struct tree_hdr_h { +/* unsigned int addr; + unsigned int size;*/ + unsigned char p[8]; +}; +static inline unsigned int tree_hdr_h_get_addr(struct tree_hdr_h * tree) { unsigned char *p = tree->p; return get_u32(&p); } +static inline unsigned int tree_hdr_h_get_size(struct tree_hdr_h * tree) { unsigned char *p = tree->p+4; return get_u32(&p); } + +struct tree_leaf_h { +/* unsigned int lower; + unsigned int higher; + unsigned int match; + unsigned int value;*/ + unsigned char p[16]; +}; +static inline unsigned int tree_leaf_h_get_lower(struct tree_leaf_h * tree) { unsigned char *p = tree->p; return get_u32(&p); } +static inline unsigned int tree_leaf_h_get_higher(struct tree_leaf_h * tree) { unsigned char *p = tree->p+4; return get_u32(&p); } +static inline unsigned int tree_leaf_h_get_match(struct tree_leaf_h * tree) { unsigned char *p = tree->p+8; return get_u32(&p); } +static inline unsigned int tree_leaf_h_get_value(struct tree_leaf_h * tree) { unsigned char *p = tree->p+12; return get_u32(&p); } + + +struct tree_hdr_v { + /*unsigned int count; + unsigned int next; + unsigned int unknown;*/ + unsigned char p[12]; +}; +static inline unsigned int tree_hdr_v_get_count(struct tree_hdr_v * tree) { unsigned char *p = tree->p; return get_u32_unal(&p); } +static inline unsigned int tree_hdr_v_get_next(struct tree_hdr_v * tree) { unsigned char *p = tree->p+4; return get_u32_unal(&p); } +static inline unsigned int tree_hdr_v_get_unknown(struct tree_hdr_v * tree) { unsigned char *p = tree->p+8; return get_u32_unal(&p); } + +struct tree_leaf_v { + unsigned char key; + /*int value;*/ + unsigned char p[4]; +} __attribute__((packed)); +static inline int tree_leaf_v_get_value(struct tree_leaf_v * tree) { unsigned char *p = tree->p; return get_u32_unal(&p); } + +static int +tree_search_h(struct file *file, unsigned int search) +{ + unsigned char *p=file->begin,*end; + int last,i=0,value,lower; + struct tree_hdr_h *thdr; + struct tree_leaf_h *tleaf; + + dbg(1,"enter\n"); + while (i++ < 1000) { + thdr=(struct tree_hdr_h *)p; + p+=sizeof(*thdr); + end=p+tree_hdr_h_get_size(thdr); + dbg(1,"@0x%x\n", p-file->begin); + last=0; + while (p < end) { + tleaf=(struct tree_leaf_h *)p; + p+=sizeof(*tleaf); + dbg(1,"low:0x%x high:0x%x match:0x%x val:0x%x search:0x%x\n", tree_leaf_h_get_lower(tleaf), tree_leaf_h_get_higher(tleaf), tree_leaf_h_get_match(tleaf), tree_leaf_h_get_value(tleaf), search); + value=tree_leaf_h_get_value(tleaf); + if (value == search) + return tree_leaf_h_get_match(tleaf); + if (value > search) { + dbg(1,"lower\n"); + lower=tree_leaf_h_get_lower(tleaf); + if (lower) + last=lower; + break; + } + last=tree_leaf_h_get_higher(tleaf); + } + if (! last || last == -1) + return 0; + p=file->begin+last; + } + return 0; +} + +static int +tree_search_v(struct file *file, int offset, int search) +{ + unsigned char *p=file->begin+offset; + int i=0,count,next; + struct tree_hdr_v *thdr; + struct tree_leaf_v *tleaf; + while (i++ < 1000) { + thdr=(struct tree_hdr_v *)p; + p+=sizeof(*thdr); + count=tree_hdr_v_get_count(thdr); + dbg(1,"offset=0x%x count=0x%x\n", p-file->begin, count); + while (count--) { + tleaf=(struct tree_leaf_v *)p; + p+=sizeof(*tleaf); + dbg(1,"0x%x 0x%x\n", tleaf->key, search); + if (tleaf->key == search) + return tree_leaf_v_get_value(tleaf); + } + next=tree_hdr_v_get_next(thdr); + if (! next) + break; + p=file->begin+next; + } + return 0; +} + +int +tree_search_hv(char *dirname, char *filename, unsigned int search_h, unsigned int search_v, int *result) +{ + struct file *f_idx_h, *f_idx_v; + char buffer[4096]; + int h,v; + + dbg(1,"enter(%s, %s, 0x%x, 0x%x, %p)\n",dirname, filename, search_h, search_v, result); + sprintf(buffer, "%s/%s.h1", dirname, filename); + f_idx_h=file_create_caseinsensitive(buffer, 0); + if ((!f_idx_h) || (!file_mmap(f_idx_h))) + return 0; + sprintf(buffer, "%s/%s.v1", dirname, filename); + f_idx_v=file_create_caseinsensitive(buffer, 0); + dbg(1,"%p %p\n", f_idx_h, f_idx_v); + if ((!f_idx_v) || (!file_mmap(f_idx_v))) { + file_destroy(f_idx_h); + return 0; + } + if ((h=tree_search_h(f_idx_h, search_h))) { + dbg(1,"h=0x%x\n", h); + if ((v=tree_search_v(f_idx_v, h, search_v))) { + dbg(1,"v=0x%x\n", v); + *result=v; + file_destroy(f_idx_v); + file_destroy(f_idx_h); + dbg(1,"return 1\n"); + return 1; + } + } + file_destroy(f_idx_v); + file_destroy(f_idx_h); + dbg(1,"return 0\n"); + return 0; +} + +static struct tree_search_node * +tree_search_enter(struct tree_search *ts, int offset) +{ + struct tree_search_node *tsn=&ts->nodes[++ts->curr_node]; + unsigned char *p; + p=ts->f->begin+offset; + tsn->hdr=(struct tree_hdr *)p; + tsn->p=p+sizeof(struct tree_hdr); + tsn->last=tsn->p; + tsn->end=p+tree_hdr_get_size(tsn->hdr); + tsn->low=tree_hdr_get_low(tsn->hdr); + tsn->high=tree_hdr_get_low(tsn->hdr); + dbg(1,"pos 0x%x addr 0x%x size 0x%x low 0x%x end 0x%x\n", p-ts->f->begin, tree_hdr_get_addr(tsn->hdr), tree_hdr_get_size(tsn->hdr), tree_hdr_get_low(tsn->hdr), tsn->end-ts->f->begin); + return tsn; +} + +int tree_search_next(struct tree_search *ts, unsigned char **p, int dir) +{ + struct tree_search_node *tsn=&ts->nodes[ts->curr_node]; + + if (! *p) + *p=tsn->p; + dbg(1,"next *p=%p dir=%d\n", *p, dir); + dbg(1,"low1=0x%x high1=0x%x\n", tsn->low, tsn->high); + if (dir <= 0) { + dbg(1,"down 0x%x\n", tsn->low); + if (tsn->low != 0xffffffff) { + tsn=tree_search_enter(ts, tsn->low); + *p=tsn->p; + tsn->high=get_u32(p); + ts->last_node=ts->curr_node; + dbg(1,"saving last2 %d 0x%x\n", ts->curr_node, tsn->last-ts->f->begin); + dbg(1,"high2=0x%x\n", tsn->high); + return 0; + } + return -1; + } + tsn->low=tsn->high; + tsn->last=*p; + tsn->high=get_u32_unal(p); + dbg(1,"saving last3 %d %p\n", ts->curr_node, tsn->last); + if (*p < tsn->end) + return (tsn->low == 0xffffffff ? 1 : 0); + dbg(1,"end reached high=0x%x\n",tsn->high); + if (tsn->low != 0xffffffff) { + dbg(1,"low 0x%x\n", tsn->low); + tsn=tree_search_enter(ts, tsn->low); + *p=tsn->p; + tsn->high=get_u32_unal(p); + ts->last_node=ts->curr_node; + dbg(1,"saving last4 %d 0x%x\n", ts->curr_node, tsn->last-ts->f->begin); + dbg(1,"high4=0x%x\n", tsn->high); + return 0; + } + return -1; +} + +int tree_search_next_lin(struct tree_search *ts, unsigned char **p) +{ + struct tree_search_node *tsn=&ts->nodes[ts->curr_node]; + int high; + + dbg(1,"pos=%d 0x%x\n", ts->curr_node, *p-ts->f->begin); + if (*p) + ts->nodes[ts->last_node].last=*p; + *p=tsn->last; + for (;;) { + high=get_u32_unal(p); + if (*p < tsn->end) { + ts->last_node=ts->curr_node; + while (high != 0xffffffff) { + tsn=tree_search_enter(ts, high); + dbg(1,"reload %d\n",ts->curr_node); + high=tsn->low; + } + return 1; + } + dbg(1,"eon %d 0x%x 0x%x\n", ts->curr_node, *p-ts->f->begin, tsn->end-ts->f->begin); + if (! ts->curr_node) + break; + ts->curr_node--; + tsn=&ts->nodes[ts->curr_node]; + *p=tsn->last; + } + + return 0; +} + +void +tree_search_init(char *dirname, char *filename, struct tree_search *ts, int offset) +{ + char buffer[4096]; + sprintf(buffer, "%s/%s", dirname, filename); + ts->f=file_create_caseinsensitive(buffer, 0); + ts->curr_node=-1; + if (ts->f) { + file_mmap(ts->f); + tree_search_enter(ts, offset); + } +} + +void +tree_search_free(struct tree_search *ts) +{ + if (ts->f) + file_destroy(ts->f); +} diff --git a/navit/map/shapefile/Makefile.am b/navit/map/shapefile/Makefile.am new file mode 100644 index 0000000..f23fb82 --- /dev/null +++ b/navit/map/shapefile/Makefile.am @@ -0,0 +1,14 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ @SHAPEFILE_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_shapefile +if PLUGINS + modulemap_LTLIBRARIES = libmap_shapefile.la +else + noinst_LTLIBRARIES = libmap_shapefile.la +endif +libmap_shapefile_la_SOURCES = shapefile.c +libmap_shapefile_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +if HAVE_SYSTEM_SHAPEFILELIB +libmap_shapefile_la_LIBADD = @SHAPEFILE_LIBS@ +else +libmap_shapefile_la_LIBADD = $(top_builddir)/navit/support/shapefile/libsupport_shapefile.la +endif diff --git a/navit/map/shapefile/Makefile.in b/navit/map/shapefile/Makefile.in new file mode 100644 index 0000000..f250efc --- /dev/null +++ b/navit/map/shapefile/Makefile.in @@ -0,0 +1,705 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/map/shapefile +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulemapdir)" +LTLIBRARIES = $(modulemap_LTLIBRARIES) $(noinst_LTLIBRARIES) +@HAVE_SYSTEM_SHAPEFILELIB_FALSE@libmap_shapefile_la_DEPENDENCIES = $(top_builddir)/navit/support/shapefile/libsupport_shapefile.la +am_libmap_shapefile_la_OBJECTS = shapefile.lo +libmap_shapefile_la_OBJECTS = $(am_libmap_shapefile_la_OBJECTS) +libmap_shapefile_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libmap_shapefile_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libmap_shapefile_la_rpath = +@PLUGINS_TRUE@am_libmap_shapefile_la_rpath = -rpath $(modulemapdir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libmap_shapefile_la_SOURCES) +DIST_SOURCES = $(libmap_shapefile_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ @SHAPEFILE_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_shapefile +@PLUGINS_TRUE@modulemap_LTLIBRARIES = libmap_shapefile.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libmap_shapefile.la +libmap_shapefile_la_SOURCES = shapefile.c +libmap_shapefile_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +@HAVE_SYSTEM_SHAPEFILELIB_FALSE@libmap_shapefile_la_LIBADD = $(top_builddir)/navit/support/shapefile/libsupport_shapefile.la +@HAVE_SYSTEM_SHAPEFILELIB_TRUE@libmap_shapefile_la_LIBADD = @SHAPEFILE_LIBS@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/map/shapefile/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/map/shapefile/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulemapLTLIBRARIES: $(modulemap_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulemapdir)" || $(MKDIR_P) "$(DESTDIR)$(modulemapdir)" + @list='$(modulemap_LTLIBRARIES)'; test -n "$(modulemapdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulemapdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulemapdir)"; \ + } + +uninstall-modulemapLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulemap_LTLIBRARIES)'; test -n "$(modulemapdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulemapdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulemapdir)/$$f"; \ + done + +clean-modulemapLTLIBRARIES: + -test -z "$(modulemap_LTLIBRARIES)" || rm -f $(modulemap_LTLIBRARIES) + @list='$(modulemap_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libmap_shapefile.la: $(libmap_shapefile_la_OBJECTS) $(libmap_shapefile_la_DEPENDENCIES) + $(libmap_shapefile_la_LINK) $(am_libmap_shapefile_la_rpath) $(libmap_shapefile_la_OBJECTS) $(libmap_shapefile_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shapefile.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulemapdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulemapLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulemapLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulemapLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulemapLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-modulemapLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulemapLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/map/shapefile/shapefile.c b/navit/map/shapefile/shapefile.c new file mode 100644 index 0000000..03f223c --- /dev/null +++ b/navit/map/shapefile/shapefile.c @@ -0,0 +1,801 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include "config.h" +#ifdef HAVE_UNISTD_H +#include +#endif +#include "debug.h" +#include "plugin.h" +#include "projection.h" +#include "item.h" +#include "map.h" +#include "maptype.h" +#include "attr.h" +#include "transform.h" +#include "file.h" +#include "shapefil.h" + + +#define IS_ARC(x) ((x).nSHPType == SHPT_ARC || (x).nSHPType == SHPT_ARCZ || (x).nSHPType == SHPT_ARCM) +#define IS_POLYGON(x) ((x).nSHPType == SHPT_POLYGON || (x).nSHPType == SHPT_POLYGONZ || (x).nSHPType == SHPT_POLYGONM) + +struct map_priv { + int id; + char *filename; + char *charset; + SHPHandle hSHP; + DBFHandle hDBF; + int nShapeType, nEntities, nFields; + double adfMinBound[4], adfMaxBound[4]; + struct longest_match *lm; + char *dbfmap_data; + struct coord offset; + enum projection pro; + int flags; +}; + + +struct map_rect_priv { + struct map_selection *sel; + struct map_priv *m; + struct item item; + int idx; + int cidx,cidx_rewind; + int part,part_rewind; + int aidx; + enum attr_type anext; + SHPObject *psShape; + char *str; + char *line; + int attr_pos; + struct attr *attr; +}; + +static void +map_destroy_shapefile(struct map_priv *m) +{ + dbg(1,"map_destroy_shapefile\n"); + g_free(m); +} + +static void +shapefile_coord_rewind(void *priv_data) +{ + struct map_rect_priv *mr=priv_data; + mr->cidx=mr->cidx_rewind; + mr->part=mr->part_rewind; +} + +static void +shapefile_coord(struct map_rect_priv *mr, int idx, struct coord *c) +{ + SHPObject *psShape=mr->psShape; + struct coord cs; + struct coord_geo g; + + if (!mr->m->pro) { + g.lng=psShape->padfX[idx]+mr->m->offset.x; + g.lat=psShape->padfY[idx]+mr->m->offset.y; + transform_from_geo(projection_mg, &g, c); + } else { + cs.x=psShape->padfX[idx]+mr->m->offset.x; + cs.y=psShape->padfY[idx]+mr->m->offset.y; + transform_from_to(&cs, mr->m->pro, c, projection_mg); + } +} + +static int +shapefile_coord_get(void *priv_data, struct coord *c, int count) +{ + struct map_rect_priv *mr=priv_data; + int ret=0; + int idx; + + SHPObject *psShape=mr->psShape; + while (count) { + idx=mr->cidx; + if (idx >= psShape->nVertices) + break; + if (mr->part+1 < psShape->nParts && idx == psShape->panPartStart[mr->part+1]) { + if (IS_POLYGON(*psShape)) { + mr->part++; + shapefile_coord(mr, 0, c); + } else if (IS_ARC(*psShape)) { + break; + } else { + dbg_assert("Neither POLYGON or ARC and has parts" == NULL); + } + } else { + shapefile_coord(mr, idx, c); + mr->cidx++; + } + ret++; + c++; + count--; + } + return ret; +} + +static void +shapefile_attr_rewind(void *priv_data) +{ + struct map_rect_priv *mr=priv_data; + mr->aidx=0; + mr->attr_pos=0; + if (mr->m->flags & 1) + mr->anext=attr_none; + else + mr->anext=attr_debug; +} + + +struct longest_match_list_item { + void *data; + int match_idx_count; + int *match_idx; +}; + +struct longest_match_list { + GList *longest_match_list_items; +}; + + +struct longest_match { + GHashTable *match_hash; + char *match_present; + int match_present_count; + GList *longest_match_lists; + int longest_match_list_count; +}; + +static void +longest_match_add_match(struct longest_match *lm, struct longest_match_list_item *lmi, char *match) +{ + int idx; + if (!(idx=(int)(long)g_hash_table_lookup(lm->match_hash, match))) { + idx=lm->match_present_count++; + lm->match_present=g_renew(char, lm->match_present, lm->match_present_count); + g_hash_table_insert(lm->match_hash, g_strdup(match), (gpointer)(long)idx); + } + lmi->match_idx=g_renew(int, lmi->match_idx, lmi->match_idx_count+1); + lmi->match_idx[lmi->match_idx_count++]=idx; +} + +static void +longest_match_item_destroy(struct longest_match_list_item *lmi, long flags) +{ + if (!lmi) + return; + if (flags & 2) { + g_free(lmi->data); + } + g_free(lmi->match_idx); + g_free(lmi); +} + +static struct longest_match_list_item * +longest_match_item_new(struct longest_match_list *lml, void *data) +{ + struct longest_match_list_item *ret=g_new0(struct longest_match_list_item,1); + lml->longest_match_list_items=g_list_append(lml->longest_match_list_items, ret); + ret->data=data; + + return ret; +} + +static struct longest_match_list * +longest_match_list_new(struct longest_match *lm) +{ + struct longest_match_list *ret=g_new0(struct longest_match_list,1); + lm->longest_match_lists=g_list_append(lm->longest_match_lists, ret); + return ret; +} + +static void +longest_match_list_destroy(struct longest_match_list *lml, long flags) +{ + if (!lml) + return; + if (flags & 1) { + g_list_foreach(lml->longest_match_list_items, (GFunc)longest_match_item_destroy, (gpointer)flags); + g_list_free(lml->longest_match_list_items); + } + g_free(lml); +} + +static struct longest_match_list * +longest_match_get_list(struct longest_match *lm, int list) +{ + GList *l=lm->longest_match_lists; + while (l && list > 0) { + l=g_list_next(l); + list++; + } + if (l) + return l->data; + return NULL; +} + +static struct longest_match * +longest_match_new(void) +{ + struct longest_match *ret=g_new0(struct longest_match,1); + ret->match_hash=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); + ret->match_present_count=1; + return ret; +} + +static void +longest_match_destroy(struct longest_match *lm, long flags) +{ + if (!lm) + return; + if (flags & 1) { + g_list_foreach(lm->longest_match_lists, (GFunc)longest_match_list_destroy, (gpointer)flags); + g_list_free(lm->longest_match_lists); + } + g_hash_table_destroy(lm->match_hash); + g_free(lm->match_present); + g_free(lm); +} + +static void +longest_match_clear(struct longest_match *lm) +{ + if (lm->match_present) + memset(lm->match_present, 0, lm->match_present_count); +} + +static void +longest_match_add_key_value(struct longest_match *lm, char *k, char *v) +{ + char* buffer=g_alloca(strlen(k)+strlen(v)+2); + int idx; + + strcpy(buffer,"*=*"); + if ((idx=(int)(long)g_hash_table_lookup(lm->match_hash, buffer))) + lm->match_present[idx]=1; + + sprintf(buffer,"%s=*", k); + if ((idx=(int)(long)g_hash_table_lookup(lm->match_hash, buffer))) + lm->match_present[idx]=2; + + sprintf(buffer,"*=%s", v); + if ((idx=(int)(long)g_hash_table_lookup(lm->match_hash, buffer))) + lm->match_present[idx]=2; + + sprintf(buffer,"%s=%s", k, v); + if ((idx=(int)(long)g_hash_table_lookup(lm->match_hash, buffer))) + lm->match_present[idx]=4; +} + +static int +longest_match_list_find(struct longest_match *lm, struct longest_match_list *lml, void **list, int max_list_len) +{ + int j,longest=0,ret=0,sum,val; + struct longest_match_list_item *curr; + GList *l=lml->longest_match_list_items; + + + while (l) { + sum=0; + curr=l->data; + for (j = 0 ; j < curr->match_idx_count ; j++) { + val=lm->match_present[curr->match_idx[j]]; + if (val) + sum+=val; + else { + sum=-1; + break; + } + } + if (sum > longest) { + longest=sum; + ret=0; + } + if (sum > 0 && sum == longest && ret < max_list_len) + list[ret++]=curr->data; + l=g_list_next(l); + } + return ret; +} + + +static void +build_match(struct longest_match *lm, struct longest_match_list *lml, char *line) +{ + struct longest_match_list_item *lmli; + char *kvl=NULL,*i=NULL,*p,*kv; + dbg(1,"line=%s\n",line); + kvl=line; + p=strchr(line,'\t'); + if (p) { + while (*p == '\t') + *p++='\0'; + i=p; + } + lmli=longest_match_item_new(lml,g_strdup(i)); + while ((kv=strtok(kvl, ","))) { + kvl=NULL; + longest_match_add_match(lm, lmli, kv); + } +} + +static void +build_matches(struct map_priv *m,char *matches) +{ + char *matches2=g_strdup(matches); + char *l=matches2,*p; + struct longest_match_list *lml; + + m->lm=longest_match_new(); + lml=longest_match_list_new(m->lm); + while (l) { + p=strchr(l,'\n'); + if (p) + *p++='\0'; + if (strlen(l)) + build_match(m->lm,lml,l); + l=p; + } + g_free(matches2); +} + +static void +process_fields(struct map_priv *m, int id) +{ + int i; + char szTitle[12],*pszTypeName,*str; + int nWidth, nDecimals; + + for (i = 0 ; i < m->nFields ; i++) { + + switch (DBFGetFieldInfo(m->hDBF, i, szTitle, &nWidth, &nDecimals )) { + case FTString: + pszTypeName = "String"; + str=g_strdup(DBFReadStringAttribute( m->hDBF, id, i )); + break; + case FTInteger: + pszTypeName = "Integer"; + str=g_strdup_printf("%d",DBFReadIntegerAttribute( m->hDBF, id, i )); + break; + case FTDouble: + pszTypeName = "Double"; + str=g_strdup_printf("%lf",DBFReadDoubleAttribute( m->hDBF, id, i )); + break; + case FTInvalid: + pszTypeName = "Invalid"; + str=NULL; + break; + default: + pszTypeName = "Unknown"; + str=NULL; + } + longest_match_add_key_value(m->lm, szTitle, str); + } +} + +static int +attr_resolve(struct map_rect_priv *mr, enum attr_type attr_type, struct attr *attr) +{ + char name[1024]; + char value[1024]; + char szTitle[12]; + const char *str; + char *col,*type=NULL; + int i,len, nWidth, nDecimals; + if (!mr->line) + return 0; + if (attr_type != attr_any) + type=attr_to_name(attr_type); + if (attr_from_line(mr->line,type,&mr->attr_pos,value,name)) { + len=strlen(value); + if (value[0] == '$' && value[1] == '{' && value[len-1] == '}') { + int found=0; + value[len-1]='\0'; + col=value+2; + for (i = 0 ; i < mr->m->nFields ; i++) { + if (DBFGetFieldInfo(mr->m->hDBF, i, szTitle, &nWidth, &nDecimals ) == FTString && !strcmp(szTitle,col)) { + str=DBFReadStringAttribute( mr->m->hDBF, mr->item.id_hi, i); + strcpy(value,str); + found=1; + break; + } + } + if (!found) + value[0]='\0'; + } + if (!value[0]) + return -1; + dbg(1,"name=%s value=%s\n",name,value); + attr_free(mr->attr); + mr->attr=attr_new_from_text(name,value); + if (mr->attr) { + *attr=*mr->attr; + return 1; + } + return -1; + } + return 0; +} + +static int +shapefile_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + struct map_rect_priv *mr=priv_data; + struct map_priv *m=mr->m; + char szTitle[12],*pszTypeName, *str; + int code, ret, nWidth, nDecimals; + + attr->type=attr_type; + switch (attr_type) { + case attr_any: + while ((code=attr_resolve(mr, attr_type, attr))) { + if (code == 1) + return 1; + } + while (mr->anext != attr_none) { + ret=shapefile_attr_get(priv_data, mr->anext, attr); + if (ret) + return ret; + } + return 0; + case attr_debug: + if (mr->aidx >= m->nFields) { + mr->anext=attr_none; + return 0; + } + switch (DBFGetFieldInfo(m->hDBF, mr->aidx, szTitle, &nWidth, &nDecimals )) { + case FTString: + pszTypeName = "String"; + str=g_strdup(DBFReadStringAttribute( m->hDBF, mr->item.id_hi, mr->aidx )); + break; + case FTInteger: + pszTypeName = "Integer"; + str=g_strdup_printf("%d",DBFReadIntegerAttribute( m->hDBF, mr->item.id_hi, mr->aidx )); + break; + case FTDouble: + pszTypeName = "Double"; + str=g_strdup_printf("%lf",DBFReadDoubleAttribute( m->hDBF, mr->item.id_hi, mr->aidx )); + break; + case FTInvalid: + pszTypeName = "Invalid"; + str=NULL; + break; + default: + pszTypeName = "Unknown"; + str=NULL; + } + g_free(mr->str); + mr->str=attr->u.str=g_strdup_printf("%s=%s(%s)",szTitle,str,pszTypeName); + g_free(str); + mr->aidx++; + return 1; + default: + return (attr_resolve(mr, attr_type, attr) == 1); + } +} + +static struct item_methods methods_shapefile = { + shapefile_coord_rewind, + shapefile_coord_get, + shapefile_attr_rewind, + shapefile_attr_get, +}; + +static struct map_rect_priv * +map_rect_new_shapefile(struct map_priv *map, struct map_selection *sel) +{ + struct map_rect_priv *mr; + char *dbfmapfile=g_strdup_printf("%s.dbfmap", map->filename); + void *data; + struct file *file; + int size; + int changed=0; + if ((file=file_create(dbfmapfile, 0))) { + size=file_size(file); + data=file_data_read_all(file); + if (data) { + if (!map->dbfmap_data || size != strlen(map->dbfmap_data) || strncmp(data,map->dbfmap_data,size)) { + g_free(map->dbfmap_data); + map->dbfmap_data=g_malloc(size+1); + memcpy(map->dbfmap_data, data, size); + map->dbfmap_data[size]='\0'; + changed=1; + } + file_data_free(file, data); + } + file_destroy(file); + } else { + dbg(0,"Failed to open %s\n",dbfmapfile); + if (map->dbfmap_data) { + changed=1; + g_free(map->dbfmap_data); + map->dbfmap_data=NULL; + } + } + dbg(1,"%s changed %d old %p\n",dbfmapfile,changed,map->dbfmap_data); + if (changed) { + longest_match_destroy(map->lm,1); + map->lm=NULL; + if (map->dbfmap_data) { + build_matches(map,map->dbfmap_data); + } + } + dbg(1,"map_rect_new_shapefile\n"); + mr=g_new0(struct map_rect_priv, 1); + mr->m=map; + mr->idx=0; + mr->item.id_lo=0; + mr->item.id_hi=0; + mr->item.meth=&methods_shapefile; + mr->item.priv_data=mr; + g_free(dbfmapfile); + return mr; +} + + +static void +map_rect_destroy_shapefile(struct map_rect_priv *mr) +{ + if (mr->psShape) + SHPDestroyObject(mr->psShape); + attr_free(mr->attr); + g_free(mr->str); + g_free(mr); +} + +static struct item * +map_rect_get_item_shapefile(struct map_rect_priv *mr) +{ + struct map_priv *m=mr->m; + void *lines[5]; + struct longest_match_list *lml; + int count; + char type[1024]; + + if (mr->psShape && IS_ARC(*mr->psShape) && mr->part+1 < mr->psShape->nParts) { + mr->part++; + mr->part_rewind=mr->part; + mr->cidx_rewind=mr->psShape->panPartStart[mr->part]; + } else { + if (mr->idx >= m->nEntities) + return NULL; + mr->item.id_hi=mr->idx; + if (mr->psShape) + SHPDestroyObject(mr->psShape); + mr->psShape=SHPReadObject(m->hSHP, mr->idx); + if (mr->psShape->nVertices > 1) + mr->item.type=type_street_unkn; + else + mr->item.type=type_point_unkn; + if (m->lm) { + longest_match_clear(m->lm); + process_fields(m, mr->idx); + + lml=longest_match_get_list(m->lm, 0); + count=longest_match_list_find(m->lm, lml, lines, sizeof(lines)/sizeof(void *)); + if (count) { + mr->line=lines[0]; + if (attr_from_line(mr->line,"type",NULL,type,NULL)) { + dbg(1,"type='%s'\n", type); + mr->item.type=item_from_name(type); + if (mr->item.type == type_none && strcmp(type,"none")) + dbg(0,"Warning: type '%s' unknown\n", type); + } else { + dbg(0,"failed to get attribute type\n"); + } + } else + mr->line=NULL; + } + mr->idx++; + mr->part_rewind=0; + mr->cidx_rewind=0; + } + shapefile_coord_rewind(mr); + shapefile_attr_rewind(mr); + return &mr->item; +} + +static struct item * +map_rect_get_item_byid_shapefile(struct map_rect_priv *mr, int id_hi, int id_lo) +{ + mr->idx=id_hi; + while (id_lo--) { + if (!map_rect_get_item_shapefile(mr)) + return NULL; + } + return map_rect_get_item_shapefile(mr); +} + +static struct map_methods map_methods_shapefile = { + projection_mg, + "iso8859-1", + map_destroy_shapefile, + map_rect_new_shapefile, + map_rect_destroy_shapefile, + map_rect_get_item_shapefile, + map_rect_get_item_byid_shapefile, +}; + +static struct map_priv * +map_new_shapefile(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) +{ + struct map_priv *m; + struct attr *data=attr_search(attrs, NULL, attr_data); + struct attr *charset=attr_search(attrs, NULL, attr_charset); + struct attr *projectionname=attr_search(attrs, NULL, attr_projectionname); + struct attr *flags=attr_search(attrs, NULL, attr_flags); + struct file_wordexp *wexp; + char *wdata; + char **wexp_data; + char *shapefile,*dbffile; + if (! data) + return NULL; + dbg(1,"map_new_shapefile %s\n", data->u.str); + wdata=g_strdup(data->u.str); + wexp=file_wordexp_new(wdata); + wexp_data=file_wordexp_get_array(wexp); + *meth=map_methods_shapefile; + + m=g_new0(struct map_priv, 1); + m->filename=g_strdup(wexp_data[0]); + shapefile=g_strdup_printf("%s.shp", m->filename); + m->hSHP=SHPOpen(shapefile, "rb" ); + SHPGetInfo( m->hSHP, &m->nEntities, &m->nShapeType, m->adfMinBound, m->adfMaxBound ); + g_free(shapefile); + dbffile=g_strdup_printf("%s.dbf", m->filename); + m->hDBF=DBFOpen(dbffile, "rb"); + m->nFields=DBFGetFieldCount(m->hDBF); + g_free(dbffile); + dbg(1,"map_new_shapefile %s %s\n", m->filename, wdata); + if (charset) { + m->charset=g_strdup(charset->u.str); + meth->charset=m->charset; + } + if (projectionname) + m->pro=projection_from_name(projectionname->u.str, &m->offset); + if (flags) + m->flags=flags->u.num; + file_wordexp_destroy(wexp); + return m; +} + +void +plugin_init(void) +{ + dbg(1,"shapefile: plugin_init\n"); + plugin_register_map_type("shapefile", map_new_shapefile); +} + +/************************************************************************/ +/* VSI_SHP_Open() */ +/************************************************************************/ + +static SAFile VSI_SHP_Open( const char *pszFilename, const char *pszAccess ) + +{ + return (SAFile)fopen(pszFilename, pszAccess); +} + +/************************************************************************/ +/* VSI_SHP_Read() */ +/************************************************************************/ + +static SAOffset VSI_SHP_Read( void *p, SAOffset size, SAOffset nmemb, SAFile file ) + +{ + return fread(p, size, nmemb, (FILE *)file); +} + +/************************************************************************/ +/* VSI_SHP_Write() */ +/************************************************************************/ + +static SAOffset VSI_SHP_Write( void *p, SAOffset size, SAOffset nmemb, SAFile file ) + +{ + return fwrite(p, size, nmemb, (FILE *)file); +} + +/************************************************************************/ +/* VSI_SHP_Seek() */ +/************************************************************************/ + +static SAOffset VSI_SHP_Seek( SAFile file, SAOffset offset, int whence ) + +{ + return fseek((FILE *)file, offset, whence); +} + +/************************************************************************/ +/* VSI_SHP_Tell() */ +/************************************************************************/ + +static SAOffset VSI_SHP_Tell( SAFile file ) + +{ + return ftell((FILE *)file); +} + + +static int VSI_SHP_Flush( SAFile file ) + +{ + return fflush((FILE *)file); +} + +/************************************************************************/ +/* VSI_SHP_Close() */ +/************************************************************************/ + +static int VSI_SHP_Close( SAFile file ) + +{ + return fclose((FILE *)file); +} + +/************************************************************************/ +/* SADError() */ +/************************************************************************/ + +static void VSI_SHP_Error( const char *message ) + +{ + dbg(0,"error:%s\n", message); +} + +/************************************************************************/ +/* VSI_SHP_Remove() */ +/************************************************************************/ + +static int VSI_SHP_Remove( const char *pszFilename ) + +{ + return unlink(pszFilename); +} + +/************************************************************************/ +/* SASetupDefaultHooks() */ +/************************************************************************/ + +void SASetupDefaultHooks( SAHooks *psHooks ) + +{ + psHooks->FOpen = VSI_SHP_Open; + psHooks->FRead = VSI_SHP_Read; + psHooks->FWrite = VSI_SHP_Write; + psHooks->FSeek = VSI_SHP_Seek; + psHooks->FTell = VSI_SHP_Tell; + psHooks->FFlush = VSI_SHP_Flush; + psHooks->FClose = VSI_SHP_Close; + + psHooks->Remove = VSI_SHP_Remove; + psHooks->Atof = atof; + + psHooks->Error = VSI_SHP_Error; +} + + diff --git a/navit/map/textfile/Makefile.am b/navit/map/textfile/Makefile.am new file mode 100644 index 0000000..b3190e7 --- /dev/null +++ b/navit/map/textfile/Makefile.am @@ -0,0 +1,9 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_textfile +if PLUGINS + modulemap_LTLIBRARIES = libmap_textfile.la +else + noinst_LTLIBRARIES = libmap_textfile.la +endif +libmap_textfile_la_SOURCES = textfile.c textfile.h +libmap_textfile_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ diff --git a/navit/map/textfile/Makefile.in b/navit/map/textfile/Makefile.in new file mode 100644 index 0000000..3b8bcf2 --- /dev/null +++ b/navit/map/textfile/Makefile.in @@ -0,0 +1,703 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/map/textfile +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulemapdir)" +LTLIBRARIES = $(modulemap_LTLIBRARIES) $(noinst_LTLIBRARIES) +libmap_textfile_la_LIBADD = +am_libmap_textfile_la_OBJECTS = textfile.lo +libmap_textfile_la_OBJECTS = $(am_libmap_textfile_la_OBJECTS) +libmap_textfile_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libmap_textfile_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libmap_textfile_la_rpath = +@PLUGINS_TRUE@am_libmap_textfile_la_rpath = -rpath $(modulemapdir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libmap_textfile_la_SOURCES) +DIST_SOURCES = $(libmap_textfile_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=map_textfile +@PLUGINS_TRUE@modulemap_LTLIBRARIES = libmap_textfile.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libmap_textfile.la +libmap_textfile_la_SOURCES = textfile.c textfile.h +libmap_textfile_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/map/textfile/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/map/textfile/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulemapLTLIBRARIES: $(modulemap_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulemapdir)" || $(MKDIR_P) "$(DESTDIR)$(modulemapdir)" + @list='$(modulemap_LTLIBRARIES)'; test -n "$(modulemapdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulemapdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulemapdir)"; \ + } + +uninstall-modulemapLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulemap_LTLIBRARIES)'; test -n "$(modulemapdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulemapdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulemapdir)/$$f"; \ + done + +clean-modulemapLTLIBRARIES: + -test -z "$(modulemap_LTLIBRARIES)" || rm -f $(modulemap_LTLIBRARIES) + @list='$(modulemap_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libmap_textfile.la: $(libmap_textfile_la_OBJECTS) $(libmap_textfile_la_DEPENDENCIES) + $(libmap_textfile_la_LINK) $(am_libmap_textfile_la_rpath) $(libmap_textfile_la_OBJECTS) $(libmap_textfile_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/textfile.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulemapdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulemapLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulemapLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulemapLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulemapLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-modulemapLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulemapLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/map/textfile/textfile.c b/navit/map/textfile/textfile.c new file mode 100644 index 0000000..821c442 --- /dev/null +++ b/navit/map/textfile/textfile.c @@ -0,0 +1,394 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include "config.h" +#include "debug.h" +#include "plugin.h" +#include "projection.h" +#include "item.h" +#include "map.h" +#include "maptype.h" +#include "attr.h" +#include "transform.h" +#include "file.h" + +#include "textfile.h" + +static int map_id; + +static void +remove_comment_line(char* line){ + if (line==TEXTFILE_COMMENT_CHAR){ + line='\0'; + } +} + +static void +get_line(struct map_rect_priv *mr) +{ + if(mr->f) { + if (!mr->m->is_pipe) + mr->pos=ftell(mr->f); + else + mr->pos+=mr->lastlen; + fgets(mr->line, TEXTFILE_LINE_SIZE, mr->f); + dbg(1,"read textfile line: %s\n", mr->line); + remove_comment_line(mr->line); + mr->lastlen=strlen(mr->line)+1; + if (strlen(mr->line) >= TEXTFILE_LINE_SIZE-1) + printf("line too long\n"); + } +} + +static void +map_destroy_textfile(struct map_priv *m) +{ + dbg(1,"map_destroy_textfile\n"); + g_free(m->filename); + if(m->charset) { + g_free(m->charset); + } + g_free(m); +} + +static void +textfile_coord_rewind(void *priv_data) +{ +} + +static int +parse_line(struct map_rect_priv *mr, int attr) +{ + int pos; + + pos=coord_parse(mr->line, projection_mg, &mr->c); + if (pos < strlen(mr->line) && attr) { + strcpy(mr->attrs, mr->line+pos); + } + return pos; +} + +static int +textfile_coord_get(void *priv_data, struct coord *c, int count) +{ + struct map_rect_priv *mr=priv_data; + int ret=0; + dbg(1,"textfile_coord_get %d\n",count); + while (count--) { + if (mr->f && !feof(mr->f) && (!mr->item.id_hi || !mr->eoc) && parse_line(mr, mr->item.id_hi)) { + *c=mr->c; + dbg(1,"c=0x%x,0x%x\n", c->x, c->y); + c++; + ret++; + get_line(mr); + if (mr->item.id_hi) + mr->eoc=1; + } else { + mr->more=0; + break; + } + } + return ret; +} + +static void +textfile_attr_rewind(void *priv_data) +{ + struct map_rect_priv *mr=priv_data; + mr->attr_pos=0; + mr->attr_last=attr_none; +} + +static void +textfile_encode_attr(char *attr_val, enum attr_type attr_type, struct attr *attr) +{ + if (attr_type >= attr_type_int_begin && attr_type <= attr_type_int_end) + attr->u.num=atoi(attr_val); + else + attr->u.str=attr_val; +} + +static int +textfile_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + struct map_rect_priv *mr=priv_data; + char *str=NULL; + dbg(1,"textfile_attr_get mr=%p attrs='%s' ", mr, mr->attrs); + if (attr_type != mr->attr_last) { + dbg(1,"reset attr_pos\n"); + mr->attr_pos=0; + mr->attr_last=attr_type; + } + if (attr_type == attr_any) { + dbg(1,"attr_any"); + if (attr_from_line(mr->attrs,NULL,&mr->attr_pos,mr->attr, mr->attr_name)) { + attr_type=attr_from_name(mr->attr_name); + dbg(1,"found attr '%s' 0x%x\n", mr->attr_name, attr_type); + attr->type=attr_type; + textfile_encode_attr(mr->attr, attr_type, attr); + return 1; + } + } else { + str=attr_to_name(attr_type); + dbg(1,"attr='%s' ",str); + if (attr_from_line(mr->attrs,str,&mr->attr_pos,mr->attr, NULL)) { + textfile_encode_attr(mr->attr, attr_type, attr); + dbg(1,"found\n"); + return 1; + } + } + dbg(1,"not found\n"); + return 0; +} + +static struct item_methods methods_textfile = { + textfile_coord_rewind, + textfile_coord_get, + textfile_attr_rewind, + textfile_attr_get, +}; + +static struct map_rect_priv * +map_rect_new_textfile(struct map_priv *map, struct map_selection *sel) +{ + struct map_rect_priv *mr; + + dbg(1,"map_rect_new_textfile\n"); + mr=g_new0(struct map_rect_priv, 1); + mr->m=map; + mr->sel=sel; + if (map->flags & 1) + mr->item.id_hi=1; + else + mr->item.id_hi=0; + mr->item.id_lo=0; + mr->item.meth=&methods_textfile; + mr->item.priv_data=mr; + if (map->is_pipe) { +#ifdef HAVE_POPEN + char *oargs,*args=g_strdup(map->filename),*sep=" "; + enum layer_type lay; + g_free(mr->args); + while (sel) { + oargs=args; + args=g_strdup_printf("%s 0x%x 0x%x 0x%x 0x%x", oargs, sel->u.c_rect.lu.x, sel->u.c_rect.lu.y, sel->u.c_rect.rl.x, sel->u.c_rect.rl.y); + g_free(oargs); + for (lay=layer_town ; lay < layer_end ; lay++) { + oargs=args; + args=g_strdup_printf("%s%s%d", oargs, sep, sel->order); + g_free(oargs); + sep=","; + } + sel=sel->next; + } + dbg(1,"popen args %s\n", args); + mr->args=args; + mr->f=popen(mr->args, "r"); + mr->pos=0; + mr->lastlen=0; +#else + dbg(0,"map_rect_new_textfile is unable to work with pipes %s\n",map->filename); +#endif + } else { + mr->f=fopen(map->filename, "r"); + } + if(!mr->f) { + printf("map_rect_new_textfile unable to open textfile %s. Error: %s\n",map->filename, strerror(errno)); + } + get_line(mr); + return mr; +} + + +static void +map_rect_destroy_textfile(struct map_rect_priv *mr) +{ + if (mr->f) { + if (mr->m->is_pipe) { +#ifdef HAVE_POPEN + pclose(mr->f); +#endif + } + else { + fclose(mr->f); + } + } + g_free(mr); +} + +static struct item * +map_rect_get_item_textfile(struct map_rect_priv *mr) +{ + char *p,type[TEXTFILE_LINE_SIZE]; + dbg(1,"map_rect_get_item_textfile id_hi=%d line=%s", mr->item.id_hi, mr->line); + if (!mr->f) { + return NULL; + } + while (mr->more) { + struct coord c; + textfile_coord_get(mr, &c, 1); + } + for(;;) { + if (feof(mr->f)) { + dbg(1,"map_rect_get_item_textfile: eof %d\n",mr->item.id_hi); + if (mr->m->flags & 1) { + if (!mr->item.id_hi) + return NULL; + mr->item.id_hi=0; + } else { + if (mr->item.id_hi) + return NULL; + mr->item.id_hi=1; + } + if (mr->m->is_pipe) { +#ifdef HAVE_POPEN + pclose(mr->f); + mr->f=popen(mr->args, "r"); + mr->pos=0; + mr->lastlen=0; +#endif + } else { + fseek(mr->f, 0, SEEK_SET); + clearerr(mr->f); + } + get_line(mr); + } + if ((p=strchr(mr->line,'\n'))) + *p='\0'; + if (mr->item.id_hi) { + mr->attrs[0]='\0'; + if (!parse_line(mr, 1)) { + get_line(mr); + continue; + } + dbg(1,"map_rect_get_item_textfile: point found\n"); + mr->eoc=0; + mr->item.id_lo=mr->pos; + } else { + if (parse_line(mr, 1)) { + get_line(mr); + continue; + } + dbg(1,"map_rect_get_item_textfile: line found\n"); + if (! mr->line[0]) { + get_line(mr); + continue; + } + mr->item.id_lo=mr->pos; + strcpy(mr->attrs, mr->line); + get_line(mr); + dbg(1,"mr=%p attrs=%s\n", mr, mr->attrs); + } + dbg(1,"get_attrs %s\n", mr->attrs); + if (attr_from_line(mr->attrs,"type",NULL,type,NULL)) { + dbg(1,"type='%s'\n", type); + mr->item.type=item_from_name(type); + if (mr->item.type == type_none) + printf("Warning: type '%s' unknown\n", type); + } else { + get_line(mr); + continue; + } + mr->attr_last=attr_none; + mr->more=1; + dbg(1,"return attr='%s'\n", mr->attrs); + return &mr->item; + } +} + +static struct item * +map_rect_get_item_byid_textfile(struct map_rect_priv *mr, int id_hi, int id_lo) +{ + if (mr->m->is_pipe) { +#ifndef _MSC_VER + pclose(mr->f); + mr->f=popen(mr->args, "r"); + mr->pos=0; + mr->lastlen=0; +#endif /* _MSC_VER */ + } else + fseek(mr->f, id_lo, SEEK_SET); + get_line(mr); + mr->item.id_hi=id_hi; + return map_rect_get_item_textfile(mr); +} + +static struct map_methods map_methods_textfile = { + projection_mg, + "iso8859-1", + map_destroy_textfile, + map_rect_new_textfile, + map_rect_destroy_textfile, + map_rect_get_item_textfile, + map_rect_get_item_byid_textfile, +}; + +static struct map_priv * +map_new_textfile(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) +{ + struct map_priv *m; + struct attr *data=attr_search(attrs, NULL, attr_data); + struct attr *charset=attr_search(attrs, NULL, attr_charset); + struct attr *flags=attr_search(attrs, NULL, attr_flags); + struct file_wordexp *wexp; + int len,is_pipe=0; + char *wdata; + char **wexp_data; + if (! data) + return NULL; + dbg(1,"map_new_textfile %s\n", data->u.str); + wdata=g_strdup(data->u.str); + len=strlen(wdata); + if (len && wdata[len-1] == '|') { + wdata[len-1]='\0'; + is_pipe=1; + } + wexp=file_wordexp_new(wdata); + wexp_data=file_wordexp_get_array(wexp); + *meth=map_methods_textfile; + + m=g_new0(struct map_priv, 1); + m->id=++map_id; + m->filename=g_strdup(wexp_data[0]); + m->is_pipe=is_pipe; + if (flags) + m->flags=flags->u.num; + dbg(1,"map_new_textfile %s %s\n", m->filename, wdata); + if (charset) { + m->charset=g_strdup(charset->u.str); + meth->charset=m->charset; + } + file_wordexp_destroy(wexp); + g_free(wdata); + return m; +} + +void +plugin_init(void) +{ + dbg(1,"textfile: plugin_init\n"); + plugin_register_map_type("textfile", map_new_textfile); +} + diff --git a/navit/map/textfile/textfile.h b/navit/map/textfile/textfile.h new file mode 100644 index 0000000..929cfd7 --- /dev/null +++ b/navit/map/textfile/textfile.h @@ -0,0 +1,56 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include "attr.h" +#include "coord.h" + +#define TEXTFILE_COMMENT_CHAR '#' +#define TEXTFILE_COMMENT_NAVI_STOPPED "# navigation stopped\n" + +struct map_priv { + int id; + char *filename; + char *charset; + int is_pipe; + int flags; +}; + +#define TEXTFILE_LINE_SIZE 512 + +struct map_rect_priv { + struct map_selection *sel; + + FILE *f; + long pos; + char line[TEXTFILE_LINE_SIZE]; + int attr_pos; + enum attr_type attr_last; + char attrs[TEXTFILE_LINE_SIZE]; + char attr[TEXTFILE_LINE_SIZE]; + char attr_name[TEXTFILE_LINE_SIZE]; + struct coord c; + int eoc; + int more; + struct map_priv *m; + struct item item; + char *args; + int lastlen; +}; + diff --git a/navit/map_data.h b/navit/map_data.h new file mode 100644 index 0000000..656bd80 --- /dev/null +++ b/navit/map_data.h @@ -0,0 +1,54 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_MAP_DATA_H +#define NAVIT_MAP_DATA_H + +enum file_index { + file_border_ply=0, + file_bridge_ply, + file_height_ply, + file_other_ply, + file_rail_ply, + file_sea_ply, + file_street_bti, + file_street_str, + file_strname_stn, + file_town_twn, + file_tunnel_ply, + file_water_ply, + file_woodland_ply, + file_end +}; + +struct map_data { + struct file *file[file_end]; + struct map_data *next; +}; + +struct map_data *load_maps(char *map); + +struct transformation; +struct block_info; + +void map_data_foreach(struct map_data *mdata, int file, struct transformation *t, int limit, + void(*func)(struct block_info *, unsigned char *, unsigned char *, void *), void *data); + +#endif + diff --git a/navit/maps/Makefile.am b/navit/maps/Makefile.am new file mode 100644 index 0000000..798ca6d --- /dev/null +++ b/navit/maps/Makefile.am @@ -0,0 +1,51 @@ +include $(top_srcdir)/Makefile.inc + +.SECONDARY: + +SAMPLE_MAP=osm_bbox_11.3,47.9,11.7,48.2 + +maptool_args=--attr-debug-level=5 +maptool=$(top_builddir)/navit/maptool/maptool + +maps_DATA = $(SAMPLE_MAP).bin $(SAMPLE_MAP).xml + +SUFFIXES=.osm.bz2 .osm.pbf .txt .shp .osm + +samplemap: $(SAMPLE_MAP).bin + +.osm.bin: + echo "Converting osm map" + $(maptool) $(maptool_args) $@.tmp <$< + mv $@.tmp $@ + +.txt.bin: + $(maptool) $(maptool_args) $@.tmp -p $(top_builddir)/navit/map/textfile/libmap_textfile.la -m "type=textfile data="$< + mv $@.tmp $@ + +.shp.bin: + $(maptool) $(maptool_args) $@.tmp -p $(top_builddir)/navit/map/shapefile/libmap_shapefile.la -m "type=shapefile data=$(subst .shp,,$<) $(SHAPEFILE_ATTRIBUTES)" + mv $@.tmp $@ + +.osm.bz2.bin: + echo "Converting osm map" + bzcat $< | $(maptool) $(maptool_args) $@.tmp + mv $@.tmp $@ + +.osm.pbf.bin: + echo "Converting osm map" + $(maptool) --protobuf $(maptool_args) $@.tmp <$< + mv $@.tmp $@ + +.bin.xml: + echo '' >$@ + + +$(SAMPLE_MAP).osm.bz2: + echo "Downloading osm sample map" + wget -O $(SAMPLE_MAP).osm.bz2.tmp http://www.navit-project.org/maps/$(SAMPLE_MAP).osm.bz2 + mv $(SAMPLE_MAP).osm.bz2.tmp $(SAMPLE_MAP).osm.bz2 + +distclean-local: + rm -f $(SAMPLE_MAP).osm.bz2 $(SAMPLE_MAP).bin $(SAMPLE_MAP).xml + +all: diff --git a/navit/maps/Makefile.in b/navit/maps/Makefile.in new file mode 100644 index 0000000..68ed5da --- /dev/null +++ b/navit/maps/Makefile.in @@ -0,0 +1,615 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/maps +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(mapsdir)" +DATA = $(maps_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +SAMPLE_MAP = osm_bbox_11.3,47.9,11.7,48.2 +maptool_args = --attr-debug-level=5 +maptool = $(top_builddir)/navit/maptool/maptool +maps_DATA = $(SAMPLE_MAP).bin $(SAMPLE_MAP).xml +SUFFIXES = .osm.bz2 .osm.pbf .txt .shp .osm +all: all-am + +.SUFFIXES: +.SUFFIXES: .osm.bz2 .osm.pbf .txt .shp .osm .bin .xml +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/maps/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/maps/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-mapsDATA: $(maps_DATA) + @$(NORMAL_INSTALL) + test -z "$(mapsdir)" || $(MKDIR_P) "$(DESTDIR)$(mapsdir)" + @list='$(maps_DATA)'; test -n "$(mapsdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(mapsdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(mapsdir)" || exit $$?; \ + done + +uninstall-mapsDATA: + @$(NORMAL_UNINSTALL) + @list='$(maps_DATA)'; test -n "$(mapsdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(mapsdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(mapsdir)" && rm -f $$files +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(mapsdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-local + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-mapsDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-mapsDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distclean-local \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-mapsDATA install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am uninstall uninstall-am uninstall-mapsDATA + + +.SECONDARY: + +samplemap: $(SAMPLE_MAP).bin + +.osm.bin: + echo "Converting osm map" + $(maptool) $(maptool_args) $@.tmp <$< + mv $@.tmp $@ + +.txt.bin: + $(maptool) $(maptool_args) $@.tmp -p $(top_builddir)/navit/map/textfile/libmap_textfile.la -m "type=textfile data="$< + mv $@.tmp $@ + +.shp.bin: + $(maptool) $(maptool_args) $@.tmp -p $(top_builddir)/navit/map/shapefile/libmap_shapefile.la -m "type=shapefile data=$(subst .shp,,$<) $(SHAPEFILE_ATTRIBUTES)" + mv $@.tmp $@ + +.osm.bz2.bin: + echo "Converting osm map" + bzcat $< | $(maptool) $(maptool_args) $@.tmp + mv $@.tmp $@ + +.osm.pbf.bin: + echo "Converting osm map" + $(maptool) --protobuf $(maptool_args) $@.tmp <$< + mv $@.tmp $@ + +.bin.xml: + echo '' >$@ + +$(SAMPLE_MAP).osm.bz2: + echo "Downloading osm sample map" + wget -O $(SAMPLE_MAP).osm.bz2.tmp http://www.navit-project.org/maps/$(SAMPLE_MAP).osm.bz2 + mv $(SAMPLE_MAP).osm.bz2.tmp $(SAMPLE_MAP).osm.bz2 + +distclean-local: + rm -f $(SAMPLE_MAP).osm.bz2 $(SAMPLE_MAP).bin $(SAMPLE_MAP).xml + +all: + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/mapset.c b/navit/mapset.c new file mode 100644 index 0000000..bc0dd09 --- /dev/null +++ b/navit/mapset.c @@ -0,0 +1,379 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +/** @file + * + * @brief Contains code used for loading more than one map + * + * The code in this file introduces "mapsets", which are collections of several maps. + * This enables navit to operate on more than one map at once. See map.c / map.h to learn + * how maps are handled. + */ + +#include +#include +#include +#include "debug.h" +#include "item.h" +#include "mapset.h" +#include "projection.h" +#include "map.h" + +/** + * @brief A mapset + * + * This structure holds a complete mapset + */ +struct mapset { + GList *maps; /**< Linked list of all the maps in the mapset */ +}; + +struct attr_iter { + GList *last; +}; + +/** + * @brief Creates a new, empty mapset + * + * @return The new mapset + */ +struct mapset *mapset_new(struct attr *parent, struct attr **attrs) +{ + struct mapset *ms; + + ms=g_new0(struct mapset, 1); + + return ms; +} + + +struct attr_iter * +mapset_attr_iter_new(void) +{ + return g_new0(struct attr_iter, 1); +} + +void +mapset_attr_iter_destroy(struct attr_iter *iter) +{ + g_free(iter); +} + +/** + * @brief Adds a map to a mapset + * + * @param ms The mapset to add the map to + * @param m The map to be added + */ +int +mapset_add_attr(struct mapset *ms, struct attr *attr) +{ + switch (attr->type) { + case attr_map: + ms->maps=g_list_append(ms->maps, attr->u.map); + map_ref(attr->u.map); + return 1; + default: + return 0; + } +} + +int +mapset_remove_attr(struct mapset *ms, struct attr *attr) +{ + switch (attr->type) { + case attr_map: + ms->maps=g_list_remove(ms->maps, attr->u.map); + return 1; + default: + return 0; + } +} + +int +mapset_get_attr(struct mapset *ms, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + GList *map; + map=ms->maps; + attr->type=type; + switch (type) { + case attr_map: + while (map) { + if (!iter || iter->last == g_list_previous(map)) { + attr->u.map=map->data; + if (iter) + iter->last=map; + return 1; + } + map=g_list_next(map); + } + break; + default: + break; + } + return 0; +} + + +#if 0 +static void mapset_maps_free(struct mapset *ms) +{ + /* todo */ +} +#endif + +/** + * @brief Destroys a mapset. + * + * This destroys a mapset. Please note that it does not touch the contained maps + * in any way. + * + * @param ms The mapset to be destroyed + */ +void mapset_destroy(struct mapset *ms) +{ + GList *map; + map=ms->maps; + while (map) { + map_destroy(map->data); + map=g_list_next(map); + } + g_free(ms); +} + +/** + * @brief Handle for a mapset in use + * + * This struct is used for a mapset that is in use. With this it is possible to iterate + * all maps in a mapset. + */ +struct mapset_handle { + GList *l; /**< Pointer to the current (next) map */ +}; + +/** + * @brief Returns a new handle for a mapset + * + * This returns a new handle for an existing mapset. The new handle points to the first + * map in the set. + * + * @param ms The mapset to get a handle of + * @return The new mapset handle + */ +struct mapset_handle * +mapset_open(struct mapset *ms) +{ + struct mapset_handle *ret=NULL; + if(ms) + { + ret=g_new(struct mapset_handle, 1); + ret->l=ms->maps; + } + + return ret; +} + +/** + * @brief Gets the next map from a mapset handle + * + * If you set active to true, this function will not return any maps that + * have the attr_active attribute associated with them and set to false. + * + * @param msh The mapset handle to get the next map of + * @param active Set to true to only get active maps (See description) + * @return The next map + */ +struct map * mapset_next(struct mapset_handle *msh, int active) +{ + struct map *ret; + struct attr active_attr; + + for (;;) { + if (!msh || !msh->l) + return NULL; + ret=msh->l->data; + msh->l=g_list_next(msh->l); + if (!active) + return ret; + if (active == 2 && map_get_attr(ret, attr_route_active, &active_attr, NULL)) { + if (active_attr.u.num) + return ret; + else + continue; + } + if (active == 3 && map_get_attr(ret, attr_search_active, &active_attr, NULL)) { + if (active_attr.u.num) + return ret; + else + continue; + } + if (!map_get_attr(ret, attr_active, &active_attr, NULL)) + return ret; + if (active_attr.u.num) + return ret; + } +} + +/** + * @brief Gets a map from the mapset by name + * + * @param ms The map + * @param map_name the map name used by the search + * @return The next map + */ +struct map * +mapset_get_map_by_name(struct mapset *ms, char*map_name) +{ + struct mapset_handle*msh; + struct map*curr_map; + struct attr map_attr; + if( !ms || !map_name ) { + return NULL; + } + msh=mapset_open(ms); + while ((curr_map=mapset_next(msh, 1))) { + //get map name + if(map_get_attr(curr_map,attr_name, &map_attr,NULL)) { + if( ! strcmp(map_attr.u.str, map_name)) { + break; + } + } + } + return curr_map; +} + +/** + * @brief Closes a mapset handle after it is no longer used + * + * @param msh Mapset handle to be closed + */ +void +mapset_close(struct mapset_handle *msh) +{ + g_free(msh); +} + +/** + * @brief Holds information about a search in a mapset + * + * This struct holds information about a search (e.g. for a street) in a mapset. + * + * @sa For a more detailed description see the documentation of mapset_search_new(). + */ +struct mapset_search { + GList *map; /**< The list of maps to be searched within */ + struct map_search *ms; /**< A map search struct for the map currently active */ + struct item *item; /**< "Superior" item. */ + struct attr *search_attr; /**< Attribute to be searched for. */ + int partial; /**< Indicates if one would like to have partial matches */ +}; + +/** + * @brief Starts a search on a mapset + * + * This function starts a search on a mapset. What attributes one can search for depends on the + * map plugin. See the description of map_search_new() in map.c for details. + * + * If you enable partial matches bear in mind that the search matches only the begin of the + * strings - a search for a street named "street" would match to "streetfoo", but not to + * "somestreet". Search is case insensitive. + * + * The item passed to this function specifies a "superior item" to "search within" - e.g. a town + * in which we want to search for a street, or a country in which to search for a town. + * + * @param ms The mapset that should be searched + * @param item Specifies a superior item to "search within" (see description) + * @param search_attr Attribute specifying what to search for. See description. + * @param partial Set this to true to also have partial matches. See description. + * @return A new mapset search struct for this search + */ +struct mapset_search * +mapset_search_new(struct mapset *ms, struct item *item, struct attr *search_attr, int partial) +{ + struct mapset_search *this; + dbg(1,"enter(%p,%p,%p,%d)\n", ms, item, search_attr, partial); + this=g_new0(struct mapset_search,1); + if(this != NULL && ms!=NULL ) + { + this->map=ms->maps; + this->item=item; + this->search_attr=search_attr; + this->partial=partial; + this->ms=map_search_new(this->map->data, item, search_attr, partial); + return this; + } + else + { + return NULL; + } +} + +/** + * @brief Returns the next found item from a mapset search + * + * This function returns the next item from a mapset search or NULL if there are no more items found. + * It automatically iterates through all the maps in the mapset. Please note that maps which have the + * attr_active attribute associated with them and set to false are not searched. + * + * @param this The mapset search to return an item from + * @return The next found item or NULL if there are no more items found + */ +struct item * +mapset_search_get_item(struct mapset_search *this_) +{ + struct item *ret=NULL; + struct attr active_attr; + + while ((this_) && (!this_->ms || !(ret=map_search_get_item(this_->ms)))) { /* The current map has no more items to be returned */ + if (this_->search_attr->type >= attr_country_all && this_->search_attr->type <= attr_country_name) + break; + for (;;) { + this_->map=g_list_next(this_->map); + if (! this_->map) + break; + if (map_get_attr(this_->map->data, attr_search_active, &active_attr, NULL)) { + if (!active_attr.u.num) + continue; + } + if (!map_get_attr(this_->map->data, attr_active, &active_attr, NULL)) + break; + if (active_attr.u.num) + break; + } + if (! this_->map) + break; + map_search_destroy(this_->ms); + this_->ms=map_search_new(this_->map->data, this_->item, this_->search_attr, this_->partial); + } + return ret; +} + +/** + * @brief Destroys a mapset search + * + * @param this The mapset search to be destroyed + */ +void +mapset_search_destroy(struct mapset_search *this_) +{ + if (this_) { + map_search_destroy(this_->ms); + g_free(this_); + } +} diff --git a/navit/mapset.h b/navit/mapset.h new file mode 100644 index 0000000..54011bb --- /dev/null +++ b/navit/mapset.h @@ -0,0 +1,54 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_MAPSET_H +#define NAVIT_MAPSET_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* prototypes */ +enum attr_type; +struct attr; +struct attr_iter; +struct item; +struct map; +struct mapset; +struct mapset_handle; +struct mapset_search; +struct mapset *mapset_new(struct attr *parent, struct attr **attrs); +struct attr_iter *mapset_attr_iter_new(void); +void mapset_attr_iter_destroy(struct attr_iter *iter); +int mapset_add_attr(struct mapset *ms, struct attr *attr); +int mapset_remove_attr(struct mapset *ms, struct attr *attr); +int mapset_get_attr(struct mapset *ms, enum attr_type type, struct attr *attr, struct attr_iter *iter); +void mapset_destroy(struct mapset *ms); +struct map *mapset_get_map_by_name(struct mapset *ms, char*map_name); +struct mapset_handle *mapset_open(struct mapset *ms); +struct map *mapset_next(struct mapset_handle *msh, int active); +void mapset_close(struct mapset_handle *msh); +struct mapset_search *mapset_search_new(struct mapset *ms, struct item *item, struct attr *search_attr, int partial); +struct item *mapset_search_get_item(struct mapset_search *this_); +void mapset_search_destroy(struct mapset_search *this_); +/* end of prototypes */ +#ifdef __cplusplus +} +#endif +#endif diff --git a/navit/maptool/Makefile.am b/navit/maptool/Makefile.am new file mode 100644 index 0000000..b88ed7f --- /dev/null +++ b/navit/maptool/Makefile.am @@ -0,0 +1,10 @@ +include $(top_srcdir)/Makefile.inc +if !SUPPORT_ANDROID + bin_PROGRAMS = maptool + noinst_LTLIBRARIES = libmaptool.la +endif + +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit @ZLIB_CFLAGS@ @POSTGRESQL_CFLAGS@ -DMODULE=maptool +libmaptool_la_SOURCES = boundaries.c buffer.c ch.c coastline.c geom.c itembin.c itembin_buffer.c misc.c osm.c osm_o5m.c osm_psql.c osm_protobuf.c osm_protobufdb.c osm_relations.c osm_xml.c sourcesink.c tempfile.c tile.c zip.c maptool.h generated-code/fileformat.pb-c.c generated-code/fileformat.pb-c.h generated-code/osmformat.pb-c.c generated-code/osmformat.pb-c.h google/protobuf-c/protobuf-c.c google/protobuf-c/protobuf-c.h google/protobuf-c/protobuf-c-private.h +maptool_SOURCES = maptool.c +maptool_LDADD = libmaptool.la ../libnavit.la @NAVIT_LIBS@ @WORDEXP_LIBS@ @ZLIB_LIBS@ @POSTGRESQL_LIBS@ @CRYPTO_LIBS@ @INTLLIBS@ @LIBC_LIBS@ diff --git a/navit/maptool/Makefile.in b/navit/maptool/Makefile.in new file mode 100644 index 0000000..1f1fffc --- /dev/null +++ b/navit/maptool/Makefile.in @@ -0,0 +1,745 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +@SUPPORT_ANDROID_FALSE@bin_PROGRAMS = maptool$(EXEEXT) +subdir = navit/maptool +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libmaptool_la_LIBADD = +am_libmaptool_la_OBJECTS = boundaries.lo buffer.lo ch.lo coastline.lo \ + geom.lo itembin.lo itembin_buffer.lo misc.lo osm.lo osm_o5m.lo \ + osm_psql.lo osm_protobuf.lo osm_protobufdb.lo osm_relations.lo \ + osm_xml.lo sourcesink.lo tempfile.lo tile.lo zip.lo \ + fileformat.pb-c.lo osmformat.pb-c.lo protobuf-c.lo +libmaptool_la_OBJECTS = $(am_libmaptool_la_OBJECTS) +@SUPPORT_ANDROID_FALSE@am_libmaptool_la_rpath = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am_maptool_OBJECTS = maptool.$(OBJEXT) +maptool_OBJECTS = $(am_maptool_OBJECTS) +maptool_DEPENDENCIES = libmaptool.la ../libnavit.la +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libmaptool_la_SOURCES) $(maptool_SOURCES) +DIST_SOURCES = $(libmaptool_la_SOURCES) $(maptool_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +@SUPPORT_ANDROID_FALSE@noinst_LTLIBRARIES = libmaptool.la +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit @ZLIB_CFLAGS@ @POSTGRESQL_CFLAGS@ -DMODULE=maptool +libmaptool_la_SOURCES = boundaries.c buffer.c ch.c coastline.c geom.c itembin.c itembin_buffer.c misc.c osm.c osm_o5m.c osm_psql.c osm_protobuf.c osm_protobufdb.c osm_relations.c osm_xml.c sourcesink.c tempfile.c tile.c zip.c maptool.h generated-code/fileformat.pb-c.c generated-code/fileformat.pb-c.h generated-code/osmformat.pb-c.c generated-code/osmformat.pb-c.h google/protobuf-c/protobuf-c.c google/protobuf-c/protobuf-c.h google/protobuf-c/protobuf-c-private.h +maptool_SOURCES = maptool.c +maptool_LDADD = libmaptool.la ../libnavit.la @NAVIT_LIBS@ @WORDEXP_LIBS@ @ZLIB_LIBS@ @POSTGRESQL_LIBS@ @CRYPTO_LIBS@ @INTLLIBS@ @LIBC_LIBS@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/maptool/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/maptool/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libmaptool.la: $(libmaptool_la_OBJECTS) $(libmaptool_la_DEPENDENCIES) + $(LINK) $(am_libmaptool_la_rpath) $(libmaptool_la_OBJECTS) $(libmaptool_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +maptool$(EXEEXT): $(maptool_OBJECTS) $(maptool_DEPENDENCIES) + @rm -f maptool$(EXEEXT) + $(LINK) $(maptool_OBJECTS) $(maptool_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/boundaries.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/buffer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ch.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coastline.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fileformat.pb-c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/geom.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/itembin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/itembin_buffer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maptool.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osm.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osm_o5m.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osm_protobuf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osm_protobufdb.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osm_psql.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osm_relations.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osm_xml.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osmformat.pb-c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protobuf-c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sourcesink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tempfile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zip.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +fileformat.pb-c.lo: generated-code/fileformat.pb-c.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fileformat.pb-c.lo -MD -MP -MF $(DEPDIR)/fileformat.pb-c.Tpo -c -o fileformat.pb-c.lo `test -f 'generated-code/fileformat.pb-c.c' || echo '$(srcdir)/'`generated-code/fileformat.pb-c.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/fileformat.pb-c.Tpo $(DEPDIR)/fileformat.pb-c.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generated-code/fileformat.pb-c.c' object='fileformat.pb-c.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fileformat.pb-c.lo `test -f 'generated-code/fileformat.pb-c.c' || echo '$(srcdir)/'`generated-code/fileformat.pb-c.c + +osmformat.pb-c.lo: generated-code/osmformat.pb-c.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT osmformat.pb-c.lo -MD -MP -MF $(DEPDIR)/osmformat.pb-c.Tpo -c -o osmformat.pb-c.lo `test -f 'generated-code/osmformat.pb-c.c' || echo '$(srcdir)/'`generated-code/osmformat.pb-c.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/osmformat.pb-c.Tpo $(DEPDIR)/osmformat.pb-c.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generated-code/osmformat.pb-c.c' object='osmformat.pb-c.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o osmformat.pb-c.lo `test -f 'generated-code/osmformat.pb-c.c' || echo '$(srcdir)/'`generated-code/osmformat.pb-c.c + +protobuf-c.lo: google/protobuf-c/protobuf-c.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT protobuf-c.lo -MD -MP -MF $(DEPDIR)/protobuf-c.Tpo -c -o protobuf-c.lo `test -f 'google/protobuf-c/protobuf-c.c' || echo '$(srcdir)/'`google/protobuf-c/protobuf-c.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/protobuf-c.Tpo $(DEPDIR)/protobuf-c.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='google/protobuf-c/protobuf-c.c' object='protobuf-c.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o protobuf-c.lo `test -f 'google/protobuf-c/protobuf-c.c' || echo '$(srcdir)/'`google/protobuf-c/protobuf-c.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool clean-noinstLTLIBRARIES ctags \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-binPROGRAMS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/maptool/boundaries.c b/navit/maptool/boundaries.c new file mode 100644 index 0000000..95599cc --- /dev/null +++ b/navit/maptool/boundaries.c @@ -0,0 +1,302 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ +#include +#include +#include "maptool.h" + +char * +osm_tag_value(struct item_bin *ib, char *key) +{ + char *tag=NULL; + int len=strlen(key); + while ((tag=item_bin_get_attr(ib, attr_osm_tag, tag))) { + if (!strncmp(tag,key,len) && tag[len] == '=') + return tag+len+1; + } + return NULL; +} + +static char * +osm_tag_name(struct item_bin *ib) +{ + return osm_tag_value(ib, "name"); +} + +osmid +boundary_relid(struct boundary *b) +{ + long long *id; + if (!b) + return 0; + if (!b->ib) + return 0; + id=item_bin_get_attr(b->ib, attr_osm_relationid, NULL); + if (id) + return *id; + return 0; +} +static void +process_boundaries_member(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv) +{ + struct boundary *b=relation_priv; + enum geom_poly_segment_type role=(long)member_priv; + b->segments=g_list_prepend(b->segments,item_bin_to_poly_segment(member, role)); +} + +static GList * +process_boundaries_setup(FILE *boundaries, struct relations *relations) +{ + struct item_bin *ib; + GList *boundaries_list=NULL; + struct relations_func *relations_func; + + relations_func=relations_func_new(process_boundaries_member, NULL); + while ((ib=read_item(boundaries))) { + char *member=NULL; + struct boundary *boundary=g_new0(struct boundary, 1); + char *admin_level=osm_tag_value(ib, "admin_level"); + char *iso=osm_tag_value(ib, "ISO3166-1"); + /* disable spain for now since it creates a too large index */ + if (admin_level && !strcmp(admin_level, "2") && (!iso || strcasecmp(iso,"es"))) { + if (iso) { + struct country_table *country=country_from_iso2(iso); + if (!country) + osm_warning("relation",item_bin_get_relationid(ib),0,"Country Boundary contains unknown ISO3166-1 value '%s'\n",iso); + else { + boundary->iso2=g_strdup(iso); + osm_info("relation",item_bin_get_relationid(ib),0,"Country Boundary for '%s'\n",iso); + } + boundary->country=country; + } else + osm_warning("relation",item_bin_get_relationid(ib),0,"Country Boundary doesn't contain an ISO3166-1 tag\n"); + } + while ((member=item_bin_get_attr(ib, attr_osm_member, member))) { + long long wayid; + int read=0; + if (sscanf(member,"2:%Ld:%n",&wayid,&read) >= 1) { + char *rolestr=member+read; + enum geom_poly_segment_type role; + if (!strcmp(rolestr,"outer") || !strcmp(rolestr,"exclave")) + role=geom_poly_segment_type_way_outer; + else if (!strcmp(rolestr,"inner") || !strcmp(rolestr,"enclave")) + role=geom_poly_segment_type_way_inner; + else if (!strcmp(rolestr,"")) + role=geom_poly_segment_type_way_unknown; + else { + osm_warning("relation",item_bin_get_relationid(ib),0,"Unknown role %s in member ",rolestr); + osm_warning("way",wayid,1,"\n"); + role=geom_poly_segment_type_none; + } + relations_add_func(relations, relations_func, boundary, (gpointer)role, 2, wayid); + } + } + boundary->ib=item_bin_dup(ib); + boundaries_list=g_list_append(boundaries_list, boundary); + } + return boundaries_list; +} + +GList * +boundary_find_matches(GList *l, struct coord *c) +{ + GList *ret=NULL; + while (l) { + struct boundary *boundary=l->data; + if (bbox_contains_coord(&boundary->r, c)) { + if (geom_poly_segments_point_inside(boundary->sorted_segments,c) > 0) + ret=g_list_prepend(ret, boundary); + ret=g_list_concat(ret,boundary_find_matches(boundary->children, c)); + } + l=g_list_next(l); + } + return ret; +} + +static void +test(GList *boundaries_list) +{ + struct item_bin *ib; + FILE *f=fopen("country_276.bin.unsorted","r"); + printf("start\n"); + while ((ib=read_item(f))) { + struct coord *c=(struct coord *)(ib+1); + char *name=item_bin_get_attr(ib, attr_town_name, NULL); + printf("%s:",name); + boundary_find_matches(boundaries_list, c); + printf("\n"); + } + fclose(f); + printf("end\n"); +} + +static void +dump_hierarchy(GList *l, char *prefix) +{ + char *newprefix=g_alloca(sizeof(char)*(strlen(prefix)+2)); + strcpy(newprefix, prefix); + strcat(newprefix," "); + while (l) { + struct boundary *boundary=l->data; + fprintf(stderr,"%s:%s (0x%x,0x%x)-(0x%x,0x%x)\n",prefix,osm_tag_name(boundary->ib),boundary->r.l.x,boundary->r.l.y,boundary->r.h.x,boundary->r.h.y); + dump_hierarchy(boundary->children, newprefix); + l=g_list_next(l); + } +} + +static gint +boundary_bbox_compare(gconstpointer a, gconstpointer b) +{ + const struct boundary *boundarya=a; + const struct boundary *boundaryb=b; + long long areaa=bbox_area(&boundarya->r); + long long areab=bbox_area(&boundaryb->r); + if (areaa > areab) + return 1; + if (areaa < areab) + return -1; + return 0; +} + +static GList * +process_boundaries_insert(GList *list, struct boundary *boundary) +{ + GList *l=list; + while (l) { + struct boundary *b=l->data; + if (bbox_contains_bbox(&boundary->r, &b->r)) { + list=g_list_remove(list, b); + boundary->children=g_list_prepend(boundary->children, b); + l=list; + } else if (bbox_contains_bbox(&b->r, &boundary->r)) { + b->children=process_boundaries_insert(b->children, boundary); + return list; + } else + l=g_list_next(l); + } + return g_list_prepend(list, boundary); +} + + +static GList * +process_boundaries_finish(GList *boundaries_list) +{ + GList *l,*sl,*l2,*ln; + GList *ret=NULL; + l=boundaries_list; + while (l) { + struct boundary *boundary=l->data; + int first=1; + FILE *f=NULL,*fu=NULL; + if (boundary->country) { + char *name=g_strdup_printf("country_%s_poly",boundary->iso2); + f=tempfile("",name,1); + g_free(name); + } + boundary->sorted_segments=geom_poly_segments_sort(boundary->segments, geom_poly_segment_type_way_right_side); + sl=boundary->sorted_segments; + while (sl) { + struct geom_poly_segment *gs=sl->data; + struct coord *c=gs->first; + while (c <= gs->last) { + if (first) { + boundary->r.l=*c; + boundary->r.h=*c; + first=0; + } else + bbox_extend(c, &boundary->r); + c++; + } + if (f) { + struct item_bin *ib=item_bin; + item_bin_init(ib, type_selected_line); + item_bin_add_coord(ib, gs->first, gs->last-gs->first+1); + item_bin_write(ib, f); + } + if (boundary->country) { + if (!coord_is_equal(*gs->first,*gs->last)) { + if (!fu) { + char *name=g_strdup_printf("country_%s_broken",boundary->iso2); + fu=tempfile("",name,1); + g_free(name); + } + struct item_bin *ib=item_bin; + item_bin_init(ib, type_selected_point); + item_bin_add_coord(ib, gs->first, 1); + item_bin_write(ib, fu); + item_bin_init(ib, type_selected_point); + item_bin_add_coord(ib, gs->last, 1); + item_bin_write(ib, fu); + } + } + sl=g_list_next(sl); + } + ret=process_boundaries_insert(ret, boundary); + l=g_list_next(l); + if (f) + fclose(f); + if (fu) { + if (boundary->country) + osm_warning("relation",item_bin_get_relationid(boundary->ib),0,"Broken country polygon '%s'\n",boundary->iso2); + fclose(fu); + } + + } +#if 0 + printf("hierarchy\n"); +#endif +#if 0 + boundaries_list=g_list_sort(boundaries_list, boundary_bbox_compare); + l=boundaries_list; + while (l) { + struct boundary *boundary=l->data; + ln=l2=g_list_next(l); + while (l2) { + struct boundary *boundary2=l2->data; + if (bbox_contains_bbox(&boundary2->r, &boundary->r)) { + boundaries_list=g_list_remove(boundaries_list, boundary); + boundary2->children=g_list_append(boundary2->children, boundary); +#if 0 + printf("found\n"); +#endif + break; + } + l2=g_list_next(l2); + } + l=ln; + } + dump_hierarchy(boundaries_list,""); +#if 0 + printf("hierarchy done\n"); + printf("test\n"); + test(boundaries_list); +#endif +#endif + return ret; +} + +GList * +process_boundaries(FILE *boundaries, FILE *ways) +{ + GList *boundaries_list; + struct relations *relations=relations_new(); + + boundaries_list=process_boundaries_setup(boundaries, relations); + relations_process(relations, NULL, ways, NULL); + return process_boundaries_finish(boundaries_list); +} diff --git a/navit/maptool/buffer.c b/navit/maptool/buffer.c new file mode 100644 index 0000000..5f7c395 --- /dev/null +++ b/navit/maptool/buffer.c @@ -0,0 +1,73 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ +#include +#include "maptool.h" +#include "debug.h" + +void +save_buffer(char *filename, struct buffer *b, long long offset) +{ + FILE *f; + f=fopen(filename,"rb+"); + if (! f) + f=fopen(filename,"wb+"); + + dbg_assert(f != NULL); + fseek(f, offset, SEEK_SET); + fwrite(b->base, b->size, 1, f); + fclose(f); +} + +void +load_buffer(char *filename, struct buffer *b, long long offset, long long size) +{ + FILE *f; + long long len; + int ret; + if (b->base) + free(b->base); + b->malloced=0; + f=fopen(filename,"rb"); + fseek(f, 0, SEEK_END); + len=ftell(f); + if (offset+size > len) { + size=len-offset; + ret=1; + } + b->size=b->malloced=size; +#if 0 + fprintf(stderr,"reading "LONGLONG_FMT" bytes from %s at "LONGLONG_FMT"\n", b->size, filename, offset); +#endif + fseek(f, offset, SEEK_SET); + b->base=malloc(b->size); + dbg_assert(b->base != NULL); + fread(b->base, b->size, 1, f); + fclose(f); +} + +long long +sizeof_buffer(char *filename) +{ + long long ret; + FILE *f=fopen(filename,"rb"); + fseek(f, 0, SEEK_END); + ret=ftell(f); + fclose(f); + return ret; +} diff --git a/navit/maptool/ch.c b/navit/maptool/ch.c new file mode 100644 index 0000000..c16494a --- /dev/null +++ b/navit/maptool/ch.c @@ -0,0 +1,548 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "maptool.h" +#include "coord.h" +#include "file.h" +#include "debug.h" + +#if GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 10 +#define g_slice_alloc0 g_malloc0 +#define g_slice_new(x) g_new(x,1) +#define g_slice_new0(x) g_new0(x,1) +#define g_slice_free(x,y) g_free(y) +#define g_slice_free1(x,y) g_free(y) +#endif + +struct ch_edge { + int flags; + int weight; + struct item_id target,middle; +}; + +struct node { + int first_edge; + int dummy; +} *nodes; +int node_count; + +struct edge { + unsigned target:26; + unsigned scedge1:6; + unsigned weight:28; + unsigned type:2; + unsigned flags:2; + unsigned int edge_count; + unsigned scedge2:6; + unsigned scmiddle:26; +} *edges; + +int edge_count; + +struct newnode { + int newnode; +} *newnodes; + +int newnode_count; + +GHashTable *newnode_hash; + +struct edge_hash_item { + int first,last; +}; + + +GHashTable *edge_hash; + +struct file *sgr,*ddsg_node_index; + +struct coord *node_index; + +GHashTable *sgr_nodes_hash; + +static int ch_levels=14; + +static int +road_speed(enum item_type type) +{ + switch (type) { + case type_street_0: + case type_street_1_city: + case type_living_street: + case type_street_service: + case type_track_gravelled: + case type_track_unpaved: + return 10; + case type_street_2_city: + case type_track_paved: + return 30; + case type_street_3_city: + return 40; + case type_street_4_city: + return 50; + case type_highway_city: + return 80; + case type_street_1_land: + return 60; + case type_street_2_land: + return 65; + case type_street_3_land: + return 70; + case type_street_4_land: + return 80; + case type_street_n_lanes: + return 120; + case type_highway_land: + return 120; + case type_ramp: + return 40; + case type_roundabout: + return 10; + case type_ferry: + return 40; + default: + return 0; + } +} + +static void +coord_slice_free(void *data) +{ + g_slice_free(struct coord, data); +} + + +static GHashTable * +coord_hash_new(void) +{ + return g_hash_table_new_full(coord_hash, coord_equal, coord_slice_free, NULL); +} + +static void +item_id_slice_free(void *data) +{ + g_slice_free(struct item_id, data); +} + +static void +add_node_to_hash(FILE *idx, GHashTable *hash, struct coord *c, int *nodes) +{ + if (! g_hash_table_lookup(hash, c)) { + struct coord *ct=g_slice_new(struct coord); + *ct=*c; + fwrite(c, sizeof(*c), 1, idx); + (*nodes)++; + g_hash_table_insert(hash, ct, (void *)(*nodes)); + } + +} + +static void +edge_hash_slice_free(void *data) +{ + g_slice_free(struct edge_hash_item, data); +} + +static guint +edge_hash_hash(gconstpointer key) +{ + const struct edge_hash_item *itm=key; + return itm->first*2654435761UL+itm->last; +} + +static gboolean +edge_hash_equal(gconstpointer a, gconstpointer b) +{ + const struct edge_hash_item *itm_a=a; + const struct edge_hash_item *itm_b=b; + return (itm_a->first == itm_b->first && itm_a->last == itm_b->last); +} + + + +static void +ch_generate_ddsg(FILE *in, FILE *ref, FILE *idx, FILE *ddsg) +{ + GHashTable *hash=coord_hash_new(); + struct item_bin *ib; + int nodes=0,edges=0; + + while ((ib=read_item(in))) { + int ccount=ib->clen/2; + struct coord *c=(struct coord *)(ib+1); + if (road_speed(ib->type)) { + add_node_to_hash(idx, hash, &c[0], &nodes); + add_node_to_hash(idx, hash, &c[ccount-1], &nodes); + edges++; + } + } + edge_hash=g_hash_table_new_full(edge_hash_hash, edge_hash_equal, edge_hash_slice_free, item_id_slice_free); + fseek(in, 0, SEEK_SET); + fprintf(ddsg,"d\n"); + fprintf(ddsg,"%d %d\n", nodes, edges); + while ((ib=read_item(in))) { + int i,ccount=ib->clen/2; + struct coord *c=(struct coord *)(ib+1); + int n1,n2,speed=road_speed(ib->type); + struct item_id road_id; + double l; + fread(&road_id, sizeof(road_id), 1, ref); + if (speed) { + struct edge_hash_item *hi=g_slice_new(struct edge_hash_item); + struct item_id *id=g_slice_new(struct item_id); + *id=road_id; + dbg_assert((n1=GPOINTER_TO_INT(g_hash_table_lookup(hash, &c[0]))) != 0); + dbg_assert((n2=GPOINTER_TO_INT(g_hash_table_lookup(hash, &c[ccount-1]))) != 0); + l=0; + for (i = 0 ; i < ccount-1 ; i++) { + l+=sqrt(sq(c[i+1].x-c[i].x)+sq(c[i+1].y-c[i].y)); + } + fprintf(ddsg,"%d %d %d 0\n", n1-1, n2-1, (int)(l*36/speed)); + hi->first=n1-1; + hi->last=n2-1; + g_hash_table_insert(edge_hash, hi, id); + } + } + g_hash_table_destroy(hash); +} + +static void +ch_generate_sgr(char *suffix) +{ +#ifndef HAVE_API_WIN32_CE + char command[1024]; + sprintf(command,"./contraction-hierarchies-20080621/main -s -p -f ddsg_%s.tmp -o hcn_%s.tmp -l hcn_log_%s.tmp -x 190 -y 1 -e 600 -p 1000 -k 1,3.3,2,10,3,10,5",suffix,suffix,suffix); + printf("%s\n",command); + system(command); + sprintf(command,"./contraction-hierarchies-20080621/main -c -f ddsg_%s.tmp -h hcn_%s.tmp -k 1,3.3,2,10,3,10,5 -C ch_%s.tmp -O 1 -z sgr_%s.tmp",suffix,suffix,suffix,suffix); + printf("%s\n",command); + system(command); +#endif +} + +static void +ch_process_node(FILE *out, int node, int resolve) +{ + int first_edge_id=nodes[node].first_edge; + int last_edge_id=nodes[node+1].first_edge; + int edge_id; + struct ch_edge ch_edge; + struct item_bin *item_bin; + struct edge_hash_item fwd,rev; + int oldnode; + memset(&ch_edge, 0, sizeof(ch_edge)); + item_bin=init_item(type_ch_node); + oldnode=GPOINTER_TO_INT(g_hash_table_lookup(newnode_hash, GINT_TO_POINTER(node))); +#if 0 + dbg(0,"0x%x,0x%x\n",node_index[oldnode].x,node_index[oldnode].y); +#endif + item_bin_add_coord(item_bin, &node_index[oldnode], 1); + fwd.first=oldnode; + rev.last=oldnode; + for (edge_id = first_edge_id ; edge_id < last_edge_id ; edge_id++) { + if (resolve) { + struct edge *edge=&edges[edge_id]; + int oldnode=GPOINTER_TO_INT(g_hash_table_lookup(newnode_hash, GINT_TO_POINTER((int)edge->target))); + struct item_id *id; + ch_edge.weight=edge->weight; + fwd.last=oldnode; + rev.first=oldnode; + ch_edge.flags=edge->flags & 3; + if (edge->scmiddle == 67108863) { + id=g_hash_table_lookup(edge_hash, &fwd); + if (!id) { + ch_edge.flags|=8; + id=g_hash_table_lookup(edge_hash, &rev); + } + if (id == NULL) { + fprintf(stderr,"Shortcut %d Weight %d\n",edge->scmiddle,edge->weight); + fprintf(stderr,"Neither %d-%d nor %d-%d exists\n",fwd.first,fwd.last,rev.first,rev.last); + exit(1); + } else { + ch_edge.middle=*id; +#if 0 + dbg(0,"middle street id for is "ITEM_ID_FMT"\n",ITEM_ID_ARGS(*id)); +#endif + } + } else { + ch_edge.flags|=4; + id=g_hash_table_lookup(sgr_nodes_hash, GINT_TO_POINTER((int)edge->scmiddle)); + dbg_assert(id != NULL); + ch_edge.middle=*id; +#if 0 + dbg(0,"middle node id for is "ITEM_ID_FMT"\n",ITEM_ID_ARGS(*id)); +#endif + } + id=g_hash_table_lookup(sgr_nodes_hash, GINT_TO_POINTER((int)edge->target)); +#if 0 + dbg(0,"id for %d is "ITEM_ID_FMT"\n",edge->target,ITEM_ID_ARGS(*id)); +#endif + if (id == NULL) { + fprintf(stderr,"Failed to look up target %d\n",edge->target); + } else { + ch_edge.target=*id; + } + } + item_bin_add_attr_data(item_bin,attr_ch_edge,&ch_edge,sizeof(ch_edge)); + } + item_bin_write(item_bin, out); +} + +static void +ch_process_nodes(FILE *out, int pos, int count, int resolve) +{ + int i; + printf("count %d sum=%d newnode_count=%d\n",count,pos,newnode_count); + for (i = 0 ; i < count ; i++) + ch_process_node(out, pos+i, resolve); +} + + +static void +ch_process(FILE **files, int depth, int resolve) +{ + int count=newnode_count; + int pos=0; + + while (depth > 0 && pos < newnode_count) { + count=(count+1)/2; + ch_process_nodes(files[depth], pos, count, resolve); + pos+=count; + depth--; + } + ch_process_nodes(files[depth], pos, newnode_count-pos, resolve); +} + +static void +ch_setup(char *suffix) +{ + int i; + if (!sgr) { + int *data,size,offset=0; + char *filename=tempfile_name(suffix,"sgr"); + printf("filename=%s\n",filename); + sgr=file_create(filename,0); + g_free(filename); + dbg_assert(sgr != NULL); + file_mmap(sgr); + + size=sizeof(int); + data=(int *)file_data_read(sgr, offset, size); + node_count=*data; + offset+=size; + + size=node_count*sizeof(struct node); + nodes=(struct node *)file_data_read(sgr, offset, size); + offset+=size; + + size=sizeof(int); + data=(int *)file_data_read(sgr, offset, size); + edge_count=*data; + offset+=size; + + size=edge_count*sizeof(struct edge); + edges=(struct edge *)file_data_read(sgr, offset, size); + offset+=size; + + size=sizeof(int); + data=(int *)file_data_read(sgr, offset, size); + newnode_count=*data; + offset+=size; + + size=edge_count*sizeof(struct newnode); + newnodes=(struct newnode *)file_data_read(sgr, offset, size); + offset+=size; + + newnode_hash=g_hash_table_new(NULL, NULL); + + for (i = 0 ; i < newnode_count ; i++) { + g_hash_table_insert(newnode_hash, GINT_TO_POINTER(newnodes[i].newnode), GINT_TO_POINTER(i)); + } + } + if (!ddsg_node_index) { + char *filename=tempfile_name(suffix,"ddsg_coords"); + ddsg_node_index=file_create(filename,0); + g_free(filename); + dbg_assert(ddsg_node_index != NULL); + file_mmap(ddsg_node_index); + node_index=(struct coord *)file_data_read(ddsg_node_index, 0, file_size(ddsg_node_index)); + } +} + +static void +ch_create_tempfiles(char *suffix, FILE **files, int count, int mode) +{ + char name[256]; + int i; + + for (i = 0 ; i <= count ; i++) { + sprintf(name,"graph_%d",i); + files[i]=tempfile(suffix, name, mode); + } +} + +static void +ch_close_tempfiles(FILE **files, int count) +{ + int i; + + for (i = 0 ; i <= count ; i++) { + fclose(files[i]); + } +} + +static void +ch_remove_tempfiles(char *suffix, int count) +{ + char name[256]; + int i; + + for (i = 0 ; i <= count ; i++) { + sprintf(name,"graph_%d",i); + tempfile_unlink(suffix, name); + } +} + +static void +ch_copy_to_tiles(char *suffix, int count, struct tile_info *info, FILE *ref) +{ + char name[256]; + int i; + FILE *f; + struct item_bin *item_bin; + + for (i = count ; i >= 0 ; i--) { + sprintf(name,"graph_%d",i); + f=tempfile(suffix, name, 0); + while ((item_bin = read_item(f))) { + tile_write_item_minmax(info, item_bin, ref, i, i); + } + fclose(f); + } +} + +void +ch_generate_tiles(char *map_suffix, char *suffix, FILE *tilesdir_out, struct zip_info *zip_info) +{ + struct tile_info info; + FILE *in,*ref,*ddsg_coords,*ddsg; + FILE **graphfiles; + info.write=0; + info.maxlen=0; + info.suffix=suffix; + info.tiles_list=NULL; + info.tilesdir_out=tilesdir_out; + graphfiles=g_alloca(sizeof(FILE*)*(ch_levels+1)); + + ch_create_tempfiles(suffix, graphfiles, ch_levels, 1); + in=tempfile(map_suffix,"ways_split",0); + ref=tempfile(map_suffix,"ways_split_ref",0); + ddsg_coords=tempfile(suffix,"ddsg_coords",1); + ddsg=tempfile(suffix,"ddsg",1); + ch_generate_ddsg(in, ref, ddsg_coords, ddsg); + fclose(in); + fclose(ref); + fclose(ddsg_coords); + fclose(ddsg); + ch_generate_sgr(suffix); + ch_setup(suffix); + ch_process(graphfiles, ch_levels, 0); + ch_close_tempfiles(graphfiles, ch_levels); + + tile_hash=g_hash_table_new(g_str_hash, g_str_equal); + ch_copy_to_tiles(suffix, ch_levels, &info, NULL); + merge_tiles(&info); + + write_tilesdir(&info, zip_info, tilesdir_out); +} + +void +ch_assemble_map(char *map_suffix, char *suffix, struct zip_info *zip_info) +{ + struct tile_info info; + struct tile_head *th; + FILE **graphfiles=g_alloca(sizeof(FILE*)*(ch_levels+1)); + FILE *ref; + struct item_id id; + int nodeid=0; + + info.write=1; + info.maxlen=zip_get_maxnamelen(zip_info); + info.suffix=suffix; + info.tiles_list=NULL; + info.tilesdir_out=NULL; + ref=tempfile(suffix,"sgr_ref",1); + + create_tile_hash(); + + th=tile_head_root; + while (th) { + th->zip_data=NULL; + th->process=1; + th=th->next; + } + + ch_setup(suffix); + ch_copy_to_tiles(suffix, ch_levels, &info, ref); + fclose(ref); + ref=tempfile(suffix,"sgr_ref",0); + sgr_nodes_hash=g_hash_table_new_full(NULL, NULL, NULL, item_id_slice_free); + while (fread(&id, sizeof(id), 1, ref)) { + struct item_id *id2=g_slice_new(struct item_id); + *id2=id; +#if 0 + dbg(0,"%d is "ITEM_ID_FMT"\n",nodeid,ITEM_ID_ARGS(*id2)); +#endif + g_hash_table_insert(sgr_nodes_hash, GINT_TO_POINTER(nodeid), id2); + nodeid++; + } + th=tile_head_root; + while (th) { + th->zip_data=malloc(th->total_size); + th->total_size_used=0; + th=th->next; + } + ch_create_tempfiles(suffix, graphfiles, ch_levels, 1); + ch_process(graphfiles, ch_levels, 1); + ch_close_tempfiles(graphfiles, ch_levels); + + g_hash_table_destroy(newnode_hash); + g_hash_table_destroy(edge_hash); + g_hash_table_destroy(sgr_nodes_hash); + + ch_copy_to_tiles(suffix, ch_levels, &info, NULL); + write_tilesdir(&info, zip_info, NULL); + + th=tile_head_root; + while (th) { + if (th->name[0]) { + if (th->total_size != th->total_size_used) { + fprintf(stderr,"Size error '%s': %d vs %d\n", th->name, th->total_size, th->total_size_used); + exit(1); + } + write_zipmember(zip_info, th->name, zip_get_maxnamelen(zip_info), th->zip_data, th->total_size); + } else { + fwrite(th->zip_data, th->total_size, 1, zip_get_index(zip_info)); + } + g_free(th->zip_data); + th=th->next; + } +} diff --git a/navit/maptool/coastline.c b/navit/maptool/coastline.c new file mode 100644 index 0000000..042fb2b --- /dev/null +++ b/navit/maptool/coastline.c @@ -0,0 +1,631 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ +#include "maptool.h" +#include "debug.h" + +struct coastline_tile +{ + osmid wayid; + int edges; +}; + +static int distance_from_ll(struct coord *c, struct rect *bbox) +{ + int dist=0; + if (c->x == bbox->l.x) + return dist+c->y-bbox->l.y; + dist+=bbox->h.y-bbox->l.y; + if (c->y == bbox->h.y) + return dist+c->x-bbox->l.x; + dist+=bbox->h.x-bbox->l.x; + if (c->x == bbox->h.x) + return dist+bbox->h.y-c->y; + dist+=bbox->h.y-bbox->l.y; + if (c->y == bbox->l.y) + return dist+bbox->h.x-c->x; + return -1; +} + +static struct geom_poly_segment * +find_next(struct rect *bbox, GList *segments, struct coord *c, int exclude, struct coord *ci) +{ + int min=INT_MAX,search=distance_from_ll(c, bbox)+(exclude?1:0); + GList *curr; + int i; + struct geom_poly_segment *ret=NULL; + int dbgl=1; + + for (i = 0 ; i < 2 ; i++) { + curr=segments; + dbg(dbgl,"search distance %d\n",search); + while (curr) { + struct geom_poly_segment *seg=curr->data; + int dist=distance_from_ll(seg->first, bbox); + dbg(dbgl,"0x%x 0x%x dist %d\n",seg->first->x,seg->first->y,dist); + if (dist != -1 && seg->first != seg->last && dist < min && (dist >= search)) { + min=dist; + ci[0]=*seg->first; + ci[1]=*seg->last; + ret=seg; + } + curr=g_list_next(curr); + } + if (ret || !search) + break; + search=0; + } + return ret; +} + +static void +close_polygon(struct item_bin *ib, struct coord *from, struct coord *to, int dir, struct rect *bbox, int *edges) +{ + int i,e,dist,fromdist,todist; + int full=(bbox->h.x-bbox->l.x+bbox->h.y-bbox->l.y)*2; + int corners=0,first_corner=0; + struct coord c; + if (dir > 0) { + fromdist=distance_from_ll(from, bbox); + todist=distance_from_ll(to, bbox); + } else { + fromdist=distance_from_ll(to, bbox); + todist=distance_from_ll(from, bbox); + } +#if 0 + fprintf(stderr,"close_polygon fromdist %d todist %d full %d dir %d\n", fromdist, todist, full, dir); +#endif + if (fromdist > todist) + todist+=full; +#if 0 + fprintf(stderr,"close_polygon corrected fromdist %d todist %d full %d dir %d\n", fromdist, todist, full, dir); +#endif + for (i = 0 ; i < 8 ; i++) { + if (dir > 0) + e=i; + else + e=7-i; + switch (e%4) { + case 0: + c=bbox->l; + break; + case 1: + c.x=bbox->l.x; + c.y=bbox->h.y; + break; + case 2: + c=bbox->h; + break; + case 3: + c.x=bbox->h.x; + c.y=bbox->l.y; + break; + } + dist=distance_from_ll(&c, bbox); + if (e & 4) + dist+=full; +#if 0 + fprintf(stderr,"dist %d %d\n",e,dist); +#endif + if (dist > fromdist && dist < todist) { + item_bin_add_coord(ib, &c, 1); +#if 0 + fprintf(stderr,"add\n"); +#endif + } + if (dist >= fromdist && dist <= todist) { + if (!corners) + first_corner=e; + corners++; + } + } + while (corners >= 2) { + *edges |= 1<<(first_corner%4); + first_corner++; + corners--; + } +} + +struct coastline_tile_data { + struct item_bin_sink_func *sink; + GHashTable *tile_edges; + int level; +}; + +static GList * +tile_data_to_segments(int *tile_data) +{ + int *end=tile_data+tile_data[0]; + int *curr=tile_data+1; + GList *segments=NULL; + int count=0; + + while (curr < end) { + struct item_bin *ib=(struct item_bin *)curr; + segments=g_list_prepend(segments,item_bin_to_poly_segment(ib, geom_poly_segment_type_way_right_side)); + curr+=ib->len+1; + count++; + } +#if 0 + fprintf(stderr,"%d segments\n",count); +#endif + return segments; +} + +static void +tile_collector_process_tile(char *tile, int *tile_data, struct coastline_tile_data *data) +{ + int poly_start_valid,tile_start_valid,exclude,search=0; + struct rect bbox; + struct coord cn[2],end,poly_start,tile_start; + struct geom_poly_segment *first; + struct item_bin *ib=NULL; + struct item_bin_sink *out=data->sink->priv_data[1]; + int dbgl=1; + int edges=0,flags; + GList *sorted_segments,*curr; + struct item_bin *ibt=(struct item_bin *)(tile_data+1); + struct coastline_tile *ct=g_new0(struct coastline_tile, 1); + ct->wayid=item_bin_get_wayid(ibt); +#if 0 + if (strncmp(tile,"bcdbdcabddddba",7)) + return; +#endif +#if 0 + if (strncmp(tile,"bcdbdcaaaaddba",14)) + return; +#endif +#if 0 + fprintf(stderr,"tile %s of size %d\n", tile, *tile_data); +#endif + tile_bbox(tile, &bbox, 0); + sorted_segments=geom_poly_segments_sort(tile_data_to_segments(tile_data), geom_poly_segment_type_way_right_side); +#if 0 +{ + GList *sort_segments=sorted_segments; + int count=0; + while (sort_segments) { + struct geom_poly_segment *seg=sort_segments->data; + struct item_bin *ib=(struct item_bin *)buffer; + char *text=g_strdup_printf("segment %d type %d %p %s area "LONGLONG_FMT,count++,seg->type,sort_segments,coord_is_equal(*seg->first, *seg->last) ? "closed":"open",geom_poly_area(seg->first,seg->last-seg->first+1)); + item_bin_init(ib, type_rg_segment); + item_bin_add_coord(ib, seg->first, seg->last-seg->first+1); + item_bin_add_attr_string(ib, attr_debug, text); + // fprintf(stderr,"%s\n",text); + g_free(text); + // item_bin_dump(ib, stderr); + item_bin_write_to_sink(ib, out, NULL); + sort_segments=g_list_next(sort_segments); + } +} +#endif + flags=0; + curr=sorted_segments; + while (curr) { + struct geom_poly_segment *seg=curr->data; + switch (seg->type) { + case geom_poly_segment_type_way_inner: + flags|=1; + break; + case geom_poly_segment_type_way_outer: + flags|=2; + break; + default: + flags|=4; + break; + } + curr=g_list_next(curr); + } + if (flags == 1) { + ct->edges=15; + ib=init_item(type_poly_water_tiled); + item_bin_bbox(ib, &bbox); + item_bin_add_attr_longlong(ib, attr_osm_wayid, ct->wayid); + item_bin_write_to_sink(ib, out, NULL); + g_hash_table_insert(data->tile_edges, g_strdup(tile), ct); + return; + } +#if 1 + end=bbox.l; + tile_start_valid=0; + poly_start_valid=0; + exclude=0; + poly_start.x=0; + poly_start.y=0; + tile_start.x=0; + tile_start.y=0; + for (;;) { + search++; + // item_bin_write_debug_point_to_sink(out, &end, "Search %d",search); + dbg(dbgl,"searching next polygon from 0x%x 0x%x\n",end.x,end.y); + first=find_next(&bbox, sorted_segments, &end, exclude, cn); + exclude=1; + if (!first) + break; + if (!tile_start_valid) { + tile_start=cn[0]; + tile_start_valid=1; + } else { + if (cn[0].x == tile_start.x && cn[0].y == tile_start.y) { + dbg(dbgl,"end of tile reached\n"); + break; + } + } + if (first->type == geom_poly_segment_type_none) { + end=cn[0]; + continue; + } + poly_start_valid=0; + dbg(dbgl,"start of polygon 0x%x 0x%x\n",cn[0].x,cn[0].y); + for (;;) { + if (!poly_start_valid) { + poly_start=cn[0]; + poly_start_valid=1; + ib=init_item(type_poly_water_tiled); + } else { + close_polygon(ib, &end, &cn[0], 1, &bbox, &edges); + if (cn[0].x == poly_start.x && cn[0].y == poly_start.y) { + dbg(dbgl,"poly end reached\n"); + item_bin_add_attr_longlong(ib, attr_osm_wayid, ct->wayid); + item_bin_write_to_sink(ib, out, NULL); + end=cn[0]; + break; + } + } + if (first->type == geom_poly_segment_type_none) + break; + item_bin_add_coord(ib, first->first, first->last-first->first+1); + first->type=geom_poly_segment_type_none; + end=cn[1]; + if (distance_from_ll(&end, &bbox) == -1) { + dbg(dbgl,"incomplete\n"); + break; + } + first=find_next(&bbox, sorted_segments, &end, 1, cn); + dbg(dbgl,"next segment of polygon 0x%x 0x%x\n",cn[0].x,cn[0].y); + } + if (search > 55) + break; + } +#endif + +#if 0 + { + int *end=tile_data+tile_data[0]; + int *curr=tile_data+1; + while (curr < end) { + struct item_bin *ib=(struct item_bin *)curr; + // item_bin_dump(ib); + ib->type=type_rg_segment; + item_bin_write_to_sink(ib, out, NULL); + curr+=ib->len+1; +#if 0 + { + struct coord *c[2]; + int i; + char *s; + c[0]=(struct coord *)(ib+1); + c[1]=c[0]+ib->clen/2-1; + for (i = 0 ; i < 2 ; i++) { + s=coord_to_str(c[i]); + item_bin_write_debug_point_to_sink(out, c[i], "%s",s); + g_free(s); + } + + } +#endif + } + } +#endif + ct->edges=edges; + g_hash_table_insert(data->tile_edges, g_strdup(tile), ct); +#if 0 + item_bin_init(ib, type_border_country); + item_bin_bbox(ib, &bbox); + item_bin_add_attr_string(ib, attr_debug, tile); + item_bin_write_to_sink(ib, out, NULL); +#endif +#if 0 + c.x=(bbox.l.x+bbox.h.x)/2; + c.y=(bbox.l.y+bbox.h.y)/2; + item_bin_write_debug_point_to_sink(out, &c, "%s %d",tile,edges); +#endif +} + +static void +ocean_tile(GHashTable *hash, char *tile, char c, osmid wayid, struct item_bin_sink *out) +{ + int len=strlen(tile); + char *tile2=g_alloca(sizeof(char)*(len+1)); + struct rect bbox; + struct item_bin *ib; + struct coord co; + struct coastline_tile *ct=g_new0(struct coastline_tile, 1); + + strcpy(tile2, tile); + tile2[len-1]=c; + //fprintf(stderr,"Testing %s\n",tile2); + ct=g_hash_table_lookup(hash, tile2); + if (ct) + return; + //fprintf(stderr,"%s ok\n",tile2); + tile_bbox(tile2, &bbox, 0); + ib=init_item(type_poly_water_tiled); + item_bin_bbox(ib, &bbox); + item_bin_add_attr_longlong(ib, attr_osm_wayid, wayid); + item_bin_write_to_sink(ib, out, NULL); + ct=g_new0(struct coastline_tile, 1); + ct->edges=15; + ct->wayid=wayid; + g_hash_table_insert(hash, g_strdup(tile2), ct); +#if 0 + item_bin_init(ib, type_border_country); + item_bin_bbox(ib, &bbox); + item_bin_add_attr_string(ib, attr_debug, tile2); + item_bin_write_to_sink(ib, out, NULL); +#endif + co.x=(bbox.l.x+bbox.h.x)/2; + co.y=(bbox.l.y+bbox.h.y)/2; + //item_bin_write_debug_point_to_sink(out, &co, "%s 15",tile2); + +} + +/* ba */ +/* dc */ + +static void +tile_collector_add_siblings(char *tile, struct coastline_tile *ct, struct coastline_tile_data *data) +{ + int len=strlen(tile); + char t=tile[len-1]; + struct item_bin_sink *out=data->sink->priv_data[1]; + int edges=ct->edges; + int debug=0; + + if (len != data->level) + return; +#if 0 + if (!strncmp(tile,"bcacccaadbdcd",10)) + debug=1; +#endif + if (debug) + fprintf(stderr,"%s (%c) has %d edges active\n",tile,t,edges); + if (t == 'a' && (edges & 1)) + ocean_tile(data->tile_edges, tile, 'b', ct->wayid, out); + if (t == 'a' && (edges & 8)) + ocean_tile(data->tile_edges, tile, 'c', ct->wayid, out); + if (t == 'b' && (edges & 4)) + ocean_tile(data->tile_edges, tile, 'a', ct->wayid, out); + if (t == 'b' && (edges & 8)) + ocean_tile(data->tile_edges, tile, 'd', ct->wayid, out); + if (t == 'c' && (edges & 1)) + ocean_tile(data->tile_edges, tile, 'd', ct->wayid, out); + if (t == 'c' && (edges & 2)) + ocean_tile(data->tile_edges, tile, 'a', ct->wayid, out); + if (t == 'd' && (edges & 4)) + ocean_tile(data->tile_edges, tile, 'c', ct->wayid, out); + if (t == 'd' && (edges & 2)) + ocean_tile(data->tile_edges, tile, 'b', ct->wayid, out); +} + +static int +tile_sibling_edges(GHashTable *hash, char *tile, char c) +{ + int len=strlen(tile); + char *tile2=g_alloca(sizeof(char)*(len+1)); + struct coastline_tile *ct; + strcpy(tile2, tile); + tile2[len-1]=c; + ct=g_hash_table_lookup(hash, tile2); + if (ct) + return ct->edges; + return 15; +} + +static void +ocean_tile2(struct rect *r, int dx, int dy, int wf, int hf, struct item_bin_sink *out) +{ + struct item_bin *ib; + int w=r->h.x-r->l.x; + int h=r->h.y-r->l.y; + char tile2[32]; + struct rect bbox; + struct coord co; + bbox.l.x=r->l.x+dx*w; + bbox.l.y=r->l.y+dy*h; + bbox.h.x=bbox.l.x+w*wf; + bbox.h.y=bbox.l.y+h*hf; + //fprintf(stderr,"0x%x,0x%x-0x%x,0x%x -> 0x%x,0x%x-0x%x,0x%x\n",r->l.x,r->l.y,r->h.x,r->h.y,bbox.l.x,bbox.l.y,bbox.h.x,bbox.h.y); + ib=init_item(type_poly_water_tiled); + item_bin_bbox(ib, &bbox); + item_bin_write_to_sink(ib, out, NULL); +#if 0 + item_bin_init(ib, type_border_country); + item_bin_bbox(ib, &bbox); + item_bin_add_attr_string(ib, attr_debug, tile2); + item_bin_write_to_sink(ib, out, NULL); +#endif + tile(&bbox, NULL, tile2, 32, 0, NULL); + co.x=(bbox.l.x+bbox.h.x)/2; + co.y=(bbox.l.y+bbox.h.y)/2; + //item_bin_write_debug_point_to_sink(out, &co, "%s 15",tile2); +} + +static void +tile_collector_add_siblings2(char *tile, struct coastline_tile *ct, struct coastline_tile_data *data) +{ + int edges=ct->edges; + int pedges=0; + int debug=0; + int len=strlen(tile); + char *tile2=g_alloca(sizeof(char)*(len+1)); + char t=tile[len-1]; + strcpy(tile2, tile); + tile2[len-1]='\0'; + struct coastline_tile *cn, *co; +#if 0 + if (!strncmp(tile,"bcacccaadbdcd",10)) + debug=1; +#endif + if (debug) + fprintf(stderr,"len of %s %d vs %d\n",tile,len,data->level); + if (len != data->level) + return; + + + if (debug) + fprintf(stderr,"checking siblings of '%s' with %d edges active\n",tile,edges); + if (t == 'b' && (edges & 1) && (tile_sibling_edges(data->tile_edges, tile, 'd') & 1)) + pedges|=1; + if (t == 'd' && (edges & 2) && (tile_sibling_edges(data->tile_edges, tile, 'b') & 1)) + pedges|=1; + if (t == 'a' && (edges & 2) && (tile_sibling_edges(data->tile_edges, tile, 'b') & 2)) + pedges|=2; + if (t == 'b' && (edges & 2) && (tile_sibling_edges(data->tile_edges, tile, 'a') & 2)) + pedges|=2; + if (t == 'a' && (edges & 4) && (tile_sibling_edges(data->tile_edges, tile, 'c') & 4)) + pedges|=4; + if (t == 'c' && (edges & 4) && (tile_sibling_edges(data->tile_edges, tile, 'a') & 4)) + pedges|=4; + if (t == 'd' && (edges & 8) && (tile_sibling_edges(data->tile_edges, tile, 'c') & 8)) + pedges|=8; + if (t == 'c' && (edges & 8) && (tile_sibling_edges(data->tile_edges, tile, 'd') & 8)) + pedges|=8; + co=g_hash_table_lookup(data->tile_edges, tile2); + if (debug) + fprintf(stderr,"result '%s' %d old %d\n",tile2,pedges,co?co->edges:0); + cn=g_new0(struct coastline_tile, 1); + cn->edges=pedges; + if (co) { + cn->edges|=co->edges; + cn->wayid=co->wayid; + } else + cn->wayid=ct->wayid; + g_hash_table_insert(data->tile_edges, g_strdup(tile2), cn); +} + +static int +tile_collector_finish(struct item_bin_sink_func *tile_collector) +{ + struct coastline_tile_data data; + int i; + GHashTable *hash; + data.sink=tile_collector; + data.tile_edges=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + hash=tile_collector->priv_data[0]; + fprintf(stderr,"tile_collector_finish\n"); + g_hash_table_foreach(hash, (GHFunc) tile_collector_process_tile, &data); + fprintf(stderr,"tile_collector_finish foreach done\n"); + g_hash_table_destroy(hash); + fprintf(stderr,"tile_collector_finish destroy done\n"); + for (i = 14 ; i > 0 ; i--) { + fprintf(stderr,"Level=%d\n",i); + data.level=i; + g_hash_table_foreach(data.tile_edges, (GHFunc) tile_collector_add_siblings, &data); + fprintf(stderr,"*"); + g_hash_table_foreach(data.tile_edges, (GHFunc) tile_collector_add_siblings, &data); + fprintf(stderr,"*"); + g_hash_table_foreach(data.tile_edges, (GHFunc) tile_collector_add_siblings, &data); + fprintf(stderr,"*"); + g_hash_table_foreach(data.tile_edges, (GHFunc) tile_collector_add_siblings, &data); + fprintf(stderr,"*"); + g_hash_table_foreach(data.tile_edges, (GHFunc) tile_collector_add_siblings2, &data); + fprintf(stderr,"*\n"); + g_hash_table_foreach(data.tile_edges, (GHFunc) tile_collector_add_siblings2, &data); + fprintf(stderr,"*\n"); + g_hash_table_foreach(data.tile_edges, (GHFunc) tile_collector_add_siblings2, &data); + fprintf(stderr,"*\n"); + g_hash_table_foreach(data.tile_edges, (GHFunc) tile_collector_add_siblings2, &data); + fprintf(stderr,"*\n"); + } +#if 0 + data.level=13; + g_hash_table_foreach(data.tile_edges, tile_collector_add_siblings, &data); + g_hash_table_foreach(data.tile_edges, tile_collector_add_siblings, &data); + g_hash_table_foreach(data.tile_edges, tile_collector_add_siblings2, &data); + data.level=12; + g_hash_table_foreach(data.tile_edges, tile_collector_add_siblings, &data); + g_hash_table_foreach(data.tile_edges, tile_collector_add_siblings, &data); +#endif + item_bin_sink_func_destroy(tile_collector); + fprintf(stderr,"tile_collector_finish done\n"); + return 0; +} + + +static int +coastline_processor_process(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data) +{ +#if 0 + int i; + struct coord *c=(struct coord *)(ib+1); + for (i = 0 ; i < 19 ; i++) { + c[i]=c[i+420]; + } + ib->clen=(i-1)*2; +#endif + item_bin_write_clipped(ib, func->priv_data[0], func->priv_data[1]); + return 0; +} + +static struct item_bin_sink_func * +coastline_processor_new(struct item_bin_sink *out) +{ + struct item_bin_sink_func *coastline_processor=item_bin_sink_func_new(coastline_processor_process); + struct item_bin_sink *tiles=item_bin_sink_new(); + struct item_bin_sink_func *tile_collector=tile_collector_new(out); + struct tile_parameter *param=g_new0(struct tile_parameter, 1); + + param->min=14; + param->max=14; + param->overlap=0; + param->attr_to_copy=attr_osm_wayid; + + item_bin_sink_add_func(tiles, tile_collector); + coastline_processor->priv_data[0]=param; + coastline_processor->priv_data[1]=tiles; + coastline_processor->priv_data[2]=tile_collector; + return coastline_processor; +} + +static void +coastline_processor_finish(struct item_bin_sink_func *coastline_processor) +{ + struct tile_parameter *param=coastline_processor->priv_data[0]; + struct item_bin_sink *tiles=coastline_processor->priv_data[1]; + struct item_bin_sink_func *tile_collector=coastline_processor->priv_data[2]; + g_free(param); + tile_collector_finish(tile_collector); + item_bin_sink_destroy(tiles); + item_bin_sink_func_destroy(coastline_processor); +} + +void +process_coastlines(FILE *in, FILE *out) +{ + struct item_bin_sink *reader=file_reader_new(in,1000000,0); + struct item_bin_sink_func *file_writer=file_writer_new(out); + struct item_bin_sink *result=item_bin_sink_new(); + struct item_bin_sink_func *coastline_processor=coastline_processor_new(result); + item_bin_sink_add_func(reader, coastline_processor); + item_bin_sink_add_func(result, file_writer); + file_reader_finish(reader); + coastline_processor_finish(coastline_processor); + file_writer_finish(file_writer); + item_bin_sink_destroy(result); +} diff --git a/navit/maptool/generated-code/fileformat.pb-c.c b/navit/maptool/generated-code/fileformat.pb-c.c new file mode 100644 index 0000000..f67ba94 --- /dev/null +++ b/navit/maptool/generated-code/fileformat.pb-c.c @@ -0,0 +1,248 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ + +/* Do not generate deprecated warnings for self */ +#ifndef PROTOBUF_C_NO_DEPRECATED +#define PROTOBUF_C_NO_DEPRECATED +#endif + +#include "fileformat.pb-c.h" +void osmpbf__blob__init + (OSMPBF__Blob *message) +{ + static OSMPBF__Blob init_value = OSMPBF__BLOB__INIT; + *message = init_value; +} +size_t osmpbf__blob__get_packed_size + (const OSMPBF__Blob *message) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t osmpbf__blob__pack + (const OSMPBF__Blob *message, + uint8_t *out) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t osmpbf__blob__pack_to_buffer + (const OSMPBF__Blob *message, + ProtobufCBuffer *buffer) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +OSMPBF__Blob * + osmpbf__blob__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (OSMPBF__Blob *) + protobuf_c_message_unpack (&osmpbf__blob__descriptor, + allocator, len, data); +} +void osmpbf__blob__free_unpacked + (OSMPBF__Blob *message, + ProtobufCAllocator *allocator) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void osmpbf__blob_header__init + (OSMPBF__BlobHeader *message) +{ + static OSMPBF__BlobHeader init_value = OSMPBF__BLOB_HEADER__INIT; + *message = init_value; +} +size_t osmpbf__blob_header__get_packed_size + (const OSMPBF__BlobHeader *message) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob_header__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t osmpbf__blob_header__pack + (const OSMPBF__BlobHeader *message, + uint8_t *out) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob_header__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t osmpbf__blob_header__pack_to_buffer + (const OSMPBF__BlobHeader *message, + ProtobufCBuffer *buffer) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob_header__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +OSMPBF__BlobHeader * + osmpbf__blob_header__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (OSMPBF__BlobHeader *) + protobuf_c_message_unpack (&osmpbf__blob_header__descriptor, + allocator, len, data); +} +void osmpbf__blob_header__free_unpacked + (OSMPBF__BlobHeader *message, + ProtobufCAllocator *allocator) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__blob_header__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +static const ProtobufCFieldDescriptor osmpbf__blob__field_descriptors[5] = +{ + { + "raw", + 1, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_BYTES, + PROTOBUF_C_OFFSETOF(OSMPBF__Blob, has_raw), + PROTOBUF_C_OFFSETOF(OSMPBF__Blob, raw), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "raw_size", + 2, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_INT32, + PROTOBUF_C_OFFSETOF(OSMPBF__Blob, has_raw_size), + PROTOBUF_C_OFFSETOF(OSMPBF__Blob, raw_size), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "zlib_data", + 3, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_BYTES, + PROTOBUF_C_OFFSETOF(OSMPBF__Blob, has_zlib_data), + PROTOBUF_C_OFFSETOF(OSMPBF__Blob, zlib_data), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "lzma_data", + 4, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_BYTES, + PROTOBUF_C_OFFSETOF(OSMPBF__Blob, has_lzma_data), + PROTOBUF_C_OFFSETOF(OSMPBF__Blob, lzma_data), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "OBSOLETE_bzip2_data", + 5, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_BYTES, + PROTOBUF_C_OFFSETOF(OSMPBF__Blob, has_obsolete_bzip2_data), + PROTOBUF_C_OFFSETOF(OSMPBF__Blob, obsolete_bzip2_data), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned osmpbf__blob__field_indices_by_name[] = { + 4, /* field[4] = OBSOLETE_bzip2_data */ + 3, /* field[3] = lzma_data */ + 0, /* field[0] = raw */ + 1, /* field[1] = raw_size */ + 2, /* field[2] = zlib_data */ +}; +static const ProtobufCIntRange osmpbf__blob__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 5 } +}; +const ProtobufCMessageDescriptor osmpbf__blob__descriptor = +{ + PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, + "OSMPBF.Blob", + "Blob", + "OSMPBF__Blob", + "OSMPBF", + sizeof(OSMPBF__Blob), + 5, + osmpbf__blob__field_descriptors, + osmpbf__blob__field_indices_by_name, + 1, osmpbf__blob__number_ranges, + (ProtobufCMessageInit) osmpbf__blob__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor osmpbf__blob_header__field_descriptors[3] = +{ + { + "type", + 1, + PROTOBUF_C_LABEL_REQUIRED, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__BlobHeader, type), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "indexdata", + 2, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_BYTES, + PROTOBUF_C_OFFSETOF(OSMPBF__BlobHeader, has_indexdata), + PROTOBUF_C_OFFSETOF(OSMPBF__BlobHeader, indexdata), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "datasize", + 3, + PROTOBUF_C_LABEL_REQUIRED, + PROTOBUF_C_TYPE_INT32, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__BlobHeader, datasize), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned osmpbf__blob_header__field_indices_by_name[] = { + 2, /* field[2] = datasize */ + 1, /* field[1] = indexdata */ + 0, /* field[0] = type */ +}; +static const ProtobufCIntRange osmpbf__blob_header__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 3 } +}; +const ProtobufCMessageDescriptor osmpbf__blob_header__descriptor = +{ + PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, + "OSMPBF.BlobHeader", + "BlobHeader", + "OSMPBF__BlobHeader", + "OSMPBF", + sizeof(OSMPBF__BlobHeader), + 3, + osmpbf__blob_header__field_descriptors, + osmpbf__blob_header__field_indices_by_name, + 1, osmpbf__blob_header__number_ranges, + (ProtobufCMessageInit) osmpbf__blob_header__init, + NULL,NULL,NULL /* reserved[123] */ +}; diff --git a/navit/maptool/generated-code/fileformat.pb-c.h b/navit/maptool/generated-code/fileformat.pb-c.h new file mode 100644 index 0000000..9996bfb --- /dev/null +++ b/navit/maptool/generated-code/fileformat.pb-c.h @@ -0,0 +1,110 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ + +#ifndef PROTOBUF_C_fileformat_2eproto__INCLUDED +#define PROTOBUF_C_fileformat_2eproto__INCLUDED + +#include + +PROTOBUF_C_BEGIN_DECLS + + +typedef struct _OSMPBF__Blob OSMPBF__Blob; +typedef struct _OSMPBF__BlobHeader OSMPBF__BlobHeader; + + +/* --- enums --- */ + + +/* --- messages --- */ + +struct _OSMPBF__Blob +{ + ProtobufCMessage base; + protobuf_c_boolean has_raw; + ProtobufCBinaryData raw; + protobuf_c_boolean has_raw_size; + int32_t raw_size; + protobuf_c_boolean has_zlib_data; + ProtobufCBinaryData zlib_data; + protobuf_c_boolean has_lzma_data; + ProtobufCBinaryData lzma_data; + protobuf_c_boolean has_obsolete_bzip2_data PROTOBUF_C_DEPRECATED; + ProtobufCBinaryData obsolete_bzip2_data PROTOBUF_C_DEPRECATED; +}; +#define OSMPBF__BLOB__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&osmpbf__blob__descriptor) \ + , 0,{0,NULL}, 0,0, 0,{0,NULL}, 0,{0,NULL}, 0,{0,NULL} } + + +struct _OSMPBF__BlobHeader +{ + ProtobufCMessage base; + char *type; + protobuf_c_boolean has_indexdata; + ProtobufCBinaryData indexdata; + int32_t datasize; +}; +#define OSMPBF__BLOB_HEADER__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&osmpbf__blob_header__descriptor) \ + , NULL, 0,{0,NULL}, 0 } + + +/* OSMPBF__Blob methods */ +void osmpbf__blob__init + (OSMPBF__Blob *message); +size_t osmpbf__blob__get_packed_size + (const OSMPBF__Blob *message); +size_t osmpbf__blob__pack + (const OSMPBF__Blob *message, + uint8_t *out); +size_t osmpbf__blob__pack_to_buffer + (const OSMPBF__Blob *message, + ProtobufCBuffer *buffer); +OSMPBF__Blob * + osmpbf__blob__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void osmpbf__blob__free_unpacked + (OSMPBF__Blob *message, + ProtobufCAllocator *allocator); +/* OSMPBF__BlobHeader methods */ +void osmpbf__blob_header__init + (OSMPBF__BlobHeader *message); +size_t osmpbf__blob_header__get_packed_size + (const OSMPBF__BlobHeader *message); +size_t osmpbf__blob_header__pack + (const OSMPBF__BlobHeader *message, + uint8_t *out); +size_t osmpbf__blob_header__pack_to_buffer + (const OSMPBF__BlobHeader *message, + ProtobufCBuffer *buffer); +OSMPBF__BlobHeader * + osmpbf__blob_header__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void osmpbf__blob_header__free_unpacked + (OSMPBF__BlobHeader *message, + ProtobufCAllocator *allocator); +/* --- per-message closures --- */ + +typedef void (*OSMPBF__Blob_Closure) + (const OSMPBF__Blob *message, + void *closure_data); +typedef void (*OSMPBF__BlobHeader_Closure) + (const OSMPBF__BlobHeader *message, + void *closure_data); + +/* --- services --- */ + + +/* --- descriptors --- */ + +extern const ProtobufCMessageDescriptor osmpbf__blob__descriptor; +extern const ProtobufCMessageDescriptor osmpbf__blob_header__descriptor; + +PROTOBUF_C_END_DECLS + + +#endif /* PROTOBUF_fileformat_2eproto__INCLUDED */ diff --git a/navit/maptool/generated-code/osmformat.pb-c.c b/navit/maptool/generated-code/osmformat.pb-c.c new file mode 100644 index 0000000..f31a72c --- /dev/null +++ b/navit/maptool/generated-code/osmformat.pb-c.c @@ -0,0 +1,1582 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ + +/* Do not generate deprecated warnings for self */ +#ifndef PROTOBUF_C_NO_DEPRECATED +#define PROTOBUF_C_NO_DEPRECATED +#endif + +#include "osmformat.pb-c.h" +void osmpbf__header_block__init + (OSMPBF__HeaderBlock *message) +{ + static OSMPBF__HeaderBlock init_value = OSMPBF__HEADER_BLOCK__INIT; + *message = init_value; +} +size_t osmpbf__header_block__get_packed_size + (const OSMPBF__HeaderBlock *message) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_block__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t osmpbf__header_block__pack + (const OSMPBF__HeaderBlock *message, + uint8_t *out) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_block__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t osmpbf__header_block__pack_to_buffer + (const OSMPBF__HeaderBlock *message, + ProtobufCBuffer *buffer) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_block__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +OSMPBF__HeaderBlock * + osmpbf__header_block__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (OSMPBF__HeaderBlock *) + protobuf_c_message_unpack (&osmpbf__header_block__descriptor, + allocator, len, data); +} +void osmpbf__header_block__free_unpacked + (OSMPBF__HeaderBlock *message, + ProtobufCAllocator *allocator) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_block__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void osmpbf__header_bbox__init + (OSMPBF__HeaderBBox *message) +{ + static OSMPBF__HeaderBBox init_value = OSMPBF__HEADER_BBOX__INIT; + *message = init_value; +} +size_t osmpbf__header_bbox__get_packed_size + (const OSMPBF__HeaderBBox *message) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_bbox__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t osmpbf__header_bbox__pack + (const OSMPBF__HeaderBBox *message, + uint8_t *out) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_bbox__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t osmpbf__header_bbox__pack_to_buffer + (const OSMPBF__HeaderBBox *message, + ProtobufCBuffer *buffer) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_bbox__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +OSMPBF__HeaderBBox * + osmpbf__header_bbox__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (OSMPBF__HeaderBBox *) + protobuf_c_message_unpack (&osmpbf__header_bbox__descriptor, + allocator, len, data); +} +void osmpbf__header_bbox__free_unpacked + (OSMPBF__HeaderBBox *message, + ProtobufCAllocator *allocator) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__header_bbox__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void osmpbf__primitive_block__init + (OSMPBF__PrimitiveBlock *message) +{ + static OSMPBF__PrimitiveBlock init_value = OSMPBF__PRIMITIVE_BLOCK__INIT; + *message = init_value; +} +size_t osmpbf__primitive_block__get_packed_size + (const OSMPBF__PrimitiveBlock *message) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_block__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t osmpbf__primitive_block__pack + (const OSMPBF__PrimitiveBlock *message, + uint8_t *out) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_block__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t osmpbf__primitive_block__pack_to_buffer + (const OSMPBF__PrimitiveBlock *message, + ProtobufCBuffer *buffer) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_block__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +OSMPBF__PrimitiveBlock * + osmpbf__primitive_block__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (OSMPBF__PrimitiveBlock *) + protobuf_c_message_unpack (&osmpbf__primitive_block__descriptor, + allocator, len, data); +} +void osmpbf__primitive_block__free_unpacked + (OSMPBF__PrimitiveBlock *message, + ProtobufCAllocator *allocator) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_block__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void osmpbf__primitive_group__init + (OSMPBF__PrimitiveGroup *message) +{ + static OSMPBF__PrimitiveGroup init_value = OSMPBF__PRIMITIVE_GROUP__INIT; + *message = init_value; +} +size_t osmpbf__primitive_group__get_packed_size + (const OSMPBF__PrimitiveGroup *message) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_group__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t osmpbf__primitive_group__pack + (const OSMPBF__PrimitiveGroup *message, + uint8_t *out) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_group__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t osmpbf__primitive_group__pack_to_buffer + (const OSMPBF__PrimitiveGroup *message, + ProtobufCBuffer *buffer) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_group__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +OSMPBF__PrimitiveGroup * + osmpbf__primitive_group__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (OSMPBF__PrimitiveGroup *) + protobuf_c_message_unpack (&osmpbf__primitive_group__descriptor, + allocator, len, data); +} +void osmpbf__primitive_group__free_unpacked + (OSMPBF__PrimitiveGroup *message, + ProtobufCAllocator *allocator) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__primitive_group__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void osmpbf__string_table__init + (OSMPBF__StringTable *message) +{ + static OSMPBF__StringTable init_value = OSMPBF__STRING_TABLE__INIT; + *message = init_value; +} +size_t osmpbf__string_table__get_packed_size + (const OSMPBF__StringTable *message) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__string_table__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t osmpbf__string_table__pack + (const OSMPBF__StringTable *message, + uint8_t *out) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__string_table__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t osmpbf__string_table__pack_to_buffer + (const OSMPBF__StringTable *message, + ProtobufCBuffer *buffer) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__string_table__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +OSMPBF__StringTable * + osmpbf__string_table__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (OSMPBF__StringTable *) + protobuf_c_message_unpack (&osmpbf__string_table__descriptor, + allocator, len, data); +} +void osmpbf__string_table__free_unpacked + (OSMPBF__StringTable *message, + ProtobufCAllocator *allocator) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__string_table__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void osmpbf__info__init + (OSMPBF__Info *message) +{ + static OSMPBF__Info init_value = OSMPBF__INFO__INIT; + *message = init_value; +} +size_t osmpbf__info__get_packed_size + (const OSMPBF__Info *message) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__info__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t osmpbf__info__pack + (const OSMPBF__Info *message, + uint8_t *out) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__info__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t osmpbf__info__pack_to_buffer + (const OSMPBF__Info *message, + ProtobufCBuffer *buffer) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__info__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +OSMPBF__Info * + osmpbf__info__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (OSMPBF__Info *) + protobuf_c_message_unpack (&osmpbf__info__descriptor, + allocator, len, data); +} +void osmpbf__info__free_unpacked + (OSMPBF__Info *message, + ProtobufCAllocator *allocator) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__info__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void osmpbf__dense_info__init + (OSMPBF__DenseInfo *message) +{ + static OSMPBF__DenseInfo init_value = OSMPBF__DENSE_INFO__INIT; + *message = init_value; +} +size_t osmpbf__dense_info__get_packed_size + (const OSMPBF__DenseInfo *message) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_info__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t osmpbf__dense_info__pack + (const OSMPBF__DenseInfo *message, + uint8_t *out) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_info__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t osmpbf__dense_info__pack_to_buffer + (const OSMPBF__DenseInfo *message, + ProtobufCBuffer *buffer) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_info__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +OSMPBF__DenseInfo * + osmpbf__dense_info__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (OSMPBF__DenseInfo *) + protobuf_c_message_unpack (&osmpbf__dense_info__descriptor, + allocator, len, data); +} +void osmpbf__dense_info__free_unpacked + (OSMPBF__DenseInfo *message, + ProtobufCAllocator *allocator) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_info__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void osmpbf__change_set__init + (OSMPBF__ChangeSet *message) +{ + static OSMPBF__ChangeSet init_value = OSMPBF__CHANGE_SET__INIT; + *message = init_value; +} +size_t osmpbf__change_set__get_packed_size + (const OSMPBF__ChangeSet *message) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__change_set__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t osmpbf__change_set__pack + (const OSMPBF__ChangeSet *message, + uint8_t *out) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__change_set__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t osmpbf__change_set__pack_to_buffer + (const OSMPBF__ChangeSet *message, + ProtobufCBuffer *buffer) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__change_set__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +OSMPBF__ChangeSet * + osmpbf__change_set__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (OSMPBF__ChangeSet *) + protobuf_c_message_unpack (&osmpbf__change_set__descriptor, + allocator, len, data); +} +void osmpbf__change_set__free_unpacked + (OSMPBF__ChangeSet *message, + ProtobufCAllocator *allocator) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__change_set__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void osmpbf__node__init + (OSMPBF__Node *message) +{ + static OSMPBF__Node init_value = OSMPBF__NODE__INIT; + *message = init_value; +} +size_t osmpbf__node__get_packed_size + (const OSMPBF__Node *message) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__node__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t osmpbf__node__pack + (const OSMPBF__Node *message, + uint8_t *out) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__node__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t osmpbf__node__pack_to_buffer + (const OSMPBF__Node *message, + ProtobufCBuffer *buffer) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__node__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +OSMPBF__Node * + osmpbf__node__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (OSMPBF__Node *) + protobuf_c_message_unpack (&osmpbf__node__descriptor, + allocator, len, data); +} +void osmpbf__node__free_unpacked + (OSMPBF__Node *message, + ProtobufCAllocator *allocator) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__node__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void osmpbf__dense_nodes__init + (OSMPBF__DenseNodes *message) +{ + static OSMPBF__DenseNodes init_value = OSMPBF__DENSE_NODES__INIT; + *message = init_value; +} +size_t osmpbf__dense_nodes__get_packed_size + (const OSMPBF__DenseNodes *message) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_nodes__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t osmpbf__dense_nodes__pack + (const OSMPBF__DenseNodes *message, + uint8_t *out) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_nodes__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t osmpbf__dense_nodes__pack_to_buffer + (const OSMPBF__DenseNodes *message, + ProtobufCBuffer *buffer) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_nodes__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +OSMPBF__DenseNodes * + osmpbf__dense_nodes__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (OSMPBF__DenseNodes *) + protobuf_c_message_unpack (&osmpbf__dense_nodes__descriptor, + allocator, len, data); +} +void osmpbf__dense_nodes__free_unpacked + (OSMPBF__DenseNodes *message, + ProtobufCAllocator *allocator) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__dense_nodes__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void osmpbf__way__init + (OSMPBF__Way *message) +{ + static OSMPBF__Way init_value = OSMPBF__WAY__INIT; + *message = init_value; +} +size_t osmpbf__way__get_packed_size + (const OSMPBF__Way *message) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__way__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t osmpbf__way__pack + (const OSMPBF__Way *message, + uint8_t *out) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__way__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t osmpbf__way__pack_to_buffer + (const OSMPBF__Way *message, + ProtobufCBuffer *buffer) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__way__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +OSMPBF__Way * + osmpbf__way__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (OSMPBF__Way *) + protobuf_c_message_unpack (&osmpbf__way__descriptor, + allocator, len, data); +} +void osmpbf__way__free_unpacked + (OSMPBF__Way *message, + ProtobufCAllocator *allocator) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__way__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +void osmpbf__relation__init + (OSMPBF__Relation *message) +{ + static OSMPBF__Relation init_value = OSMPBF__RELATION__INIT; + *message = init_value; +} +size_t osmpbf__relation__get_packed_size + (const OSMPBF__Relation *message) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__relation__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t osmpbf__relation__pack + (const OSMPBF__Relation *message, + uint8_t *out) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__relation__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t osmpbf__relation__pack_to_buffer + (const OSMPBF__Relation *message, + ProtobufCBuffer *buffer) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__relation__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +OSMPBF__Relation * + osmpbf__relation__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (OSMPBF__Relation *) + protobuf_c_message_unpack (&osmpbf__relation__descriptor, + allocator, len, data); +} +void osmpbf__relation__free_unpacked + (OSMPBF__Relation *message, + ProtobufCAllocator *allocator) +{ + PROTOBUF_C_ASSERT (message->base.descriptor == &osmpbf__relation__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} +static const ProtobufCFieldDescriptor osmpbf__header_block__field_descriptors[5] = +{ + { + "bbox", + 1, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_MESSAGE, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, bbox), + &osmpbf__header_bbox__descriptor, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "required_features", + 4, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_STRING, + PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, n_required_features), + PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, required_features), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "optional_features", + 5, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_STRING, + PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, n_optional_features), + PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, optional_features), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "writingprogram", + 16, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, writingprogram), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "source", + 17, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_STRING, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBlock, source), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned osmpbf__header_block__field_indices_by_name[] = { + 0, /* field[0] = bbox */ + 2, /* field[2] = optional_features */ + 1, /* field[1] = required_features */ + 4, /* field[4] = source */ + 3, /* field[3] = writingprogram */ +}; +static const ProtobufCIntRange osmpbf__header_block__number_ranges[3 + 1] = +{ + { 1, 0 }, + { 4, 1 }, + { 16, 3 }, + { 0, 5 } +}; +const ProtobufCMessageDescriptor osmpbf__header_block__descriptor = +{ + PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, + "OSMPBF.HeaderBlock", + "HeaderBlock", + "OSMPBF__HeaderBlock", + "OSMPBF", + sizeof(OSMPBF__HeaderBlock), + 5, + osmpbf__header_block__field_descriptors, + osmpbf__header_block__field_indices_by_name, + 3, osmpbf__header_block__number_ranges, + (ProtobufCMessageInit) osmpbf__header_block__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor osmpbf__header_bbox__field_descriptors[4] = +{ + { + "left", + 1, + PROTOBUF_C_LABEL_REQUIRED, + PROTOBUF_C_TYPE_SINT64, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBBox, left), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "right", + 2, + PROTOBUF_C_LABEL_REQUIRED, + PROTOBUF_C_TYPE_SINT64, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBBox, right), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "top", + 3, + PROTOBUF_C_LABEL_REQUIRED, + PROTOBUF_C_TYPE_SINT64, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBBox, top), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "bottom", + 4, + PROTOBUF_C_LABEL_REQUIRED, + PROTOBUF_C_TYPE_SINT64, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__HeaderBBox, bottom), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned osmpbf__header_bbox__field_indices_by_name[] = { + 3, /* field[3] = bottom */ + 0, /* field[0] = left */ + 1, /* field[1] = right */ + 2, /* field[2] = top */ +}; +static const ProtobufCIntRange osmpbf__header_bbox__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 4 } +}; +const ProtobufCMessageDescriptor osmpbf__header_bbox__descriptor = +{ + PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, + "OSMPBF.HeaderBBox", + "HeaderBBox", + "OSMPBF__HeaderBBox", + "OSMPBF", + sizeof(OSMPBF__HeaderBBox), + 4, + osmpbf__header_bbox__field_descriptors, + osmpbf__header_bbox__field_indices_by_name, + 1, osmpbf__header_bbox__number_ranges, + (ProtobufCMessageInit) osmpbf__header_bbox__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const int32_t osmpbf__primitive_block__granularity__default_value = 100; +static const int64_t osmpbf__primitive_block__lat_offset__default_value = 0; +static const int64_t osmpbf__primitive_block__lon_offset__default_value = 0; +static const int32_t osmpbf__primitive_block__date_granularity__default_value = 1000; +static const ProtobufCFieldDescriptor osmpbf__primitive_block__field_descriptors[6] = +{ + { + "stringtable", + 1, + PROTOBUF_C_LABEL_REQUIRED, + PROTOBUF_C_TYPE_MESSAGE, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, stringtable), + &osmpbf__string_table__descriptor, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "primitivegroup", + 2, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_MESSAGE, + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, n_primitivegroup), + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, primitivegroup), + &osmpbf__primitive_group__descriptor, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "granularity", + 17, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_INT32, + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, has_granularity), + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, granularity), + NULL, + &osmpbf__primitive_block__granularity__default_value, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "date_granularity", + 18, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_INT32, + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, has_date_granularity), + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, date_granularity), + NULL, + &osmpbf__primitive_block__date_granularity__default_value, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "lat_offset", + 19, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_INT64, + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, has_lat_offset), + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, lat_offset), + NULL, + &osmpbf__primitive_block__lat_offset__default_value, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "lon_offset", + 20, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_INT64, + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, has_lon_offset), + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveBlock, lon_offset), + NULL, + &osmpbf__primitive_block__lon_offset__default_value, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned osmpbf__primitive_block__field_indices_by_name[] = { + 3, /* field[3] = date_granularity */ + 2, /* field[2] = granularity */ + 4, /* field[4] = lat_offset */ + 5, /* field[5] = lon_offset */ + 1, /* field[1] = primitivegroup */ + 0, /* field[0] = stringtable */ +}; +static const ProtobufCIntRange osmpbf__primitive_block__number_ranges[2 + 1] = +{ + { 1, 0 }, + { 17, 2 }, + { 0, 6 } +}; +const ProtobufCMessageDescriptor osmpbf__primitive_block__descriptor = +{ + PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, + "OSMPBF.PrimitiveBlock", + "PrimitiveBlock", + "OSMPBF__PrimitiveBlock", + "OSMPBF", + sizeof(OSMPBF__PrimitiveBlock), + 6, + osmpbf__primitive_block__field_descriptors, + osmpbf__primitive_block__field_indices_by_name, + 2, osmpbf__primitive_block__number_ranges, + (ProtobufCMessageInit) osmpbf__primitive_block__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor osmpbf__primitive_group__field_descriptors[5] = +{ + { + "nodes", + 1, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_MESSAGE, + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, n_nodes), + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, nodes), + &osmpbf__node__descriptor, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "dense", + 2, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_MESSAGE, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, dense), + &osmpbf__dense_nodes__descriptor, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "ways", + 3, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_MESSAGE, + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, n_ways), + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, ways), + &osmpbf__way__descriptor, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "relations", + 4, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_MESSAGE, + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, n_relations), + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, relations), + &osmpbf__relation__descriptor, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "changesets", + 5, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_MESSAGE, + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, n_changesets), + PROTOBUF_C_OFFSETOF(OSMPBF__PrimitiveGroup, changesets), + &osmpbf__change_set__descriptor, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned osmpbf__primitive_group__field_indices_by_name[] = { + 4, /* field[4] = changesets */ + 1, /* field[1] = dense */ + 0, /* field[0] = nodes */ + 3, /* field[3] = relations */ + 2, /* field[2] = ways */ +}; +static const ProtobufCIntRange osmpbf__primitive_group__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 5 } +}; +const ProtobufCMessageDescriptor osmpbf__primitive_group__descriptor = +{ + PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, + "OSMPBF.PrimitiveGroup", + "PrimitiveGroup", + "OSMPBF__PrimitiveGroup", + "OSMPBF", + sizeof(OSMPBF__PrimitiveGroup), + 5, + osmpbf__primitive_group__field_descriptors, + osmpbf__primitive_group__field_indices_by_name, + 1, osmpbf__primitive_group__number_ranges, + (ProtobufCMessageInit) osmpbf__primitive_group__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor osmpbf__string_table__field_descriptors[1] = +{ + { + "s", + 1, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_BYTES, + PROTOBUF_C_OFFSETOF(OSMPBF__StringTable, n_s), + PROTOBUF_C_OFFSETOF(OSMPBF__StringTable, s), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned osmpbf__string_table__field_indices_by_name[] = { + 0, /* field[0] = s */ +}; +static const ProtobufCIntRange osmpbf__string_table__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 1 } +}; +const ProtobufCMessageDescriptor osmpbf__string_table__descriptor = +{ + PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, + "OSMPBF.StringTable", + "StringTable", + "OSMPBF__StringTable", + "OSMPBF", + sizeof(OSMPBF__StringTable), + 1, + osmpbf__string_table__field_descriptors, + osmpbf__string_table__field_indices_by_name, + 1, osmpbf__string_table__number_ranges, + (ProtobufCMessageInit) osmpbf__string_table__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const int32_t osmpbf__info__version__default_value = -1; +static const ProtobufCFieldDescriptor osmpbf__info__field_descriptors[5] = +{ + { + "version", + 1, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_INT32, + PROTOBUF_C_OFFSETOF(OSMPBF__Info, has_version), + PROTOBUF_C_OFFSETOF(OSMPBF__Info, version), + NULL, + &osmpbf__info__version__default_value, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "timestamp", + 2, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_INT64, + PROTOBUF_C_OFFSETOF(OSMPBF__Info, has_timestamp), + PROTOBUF_C_OFFSETOF(OSMPBF__Info, timestamp), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "changeset", + 3, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_INT64, + PROTOBUF_C_OFFSETOF(OSMPBF__Info, has_changeset), + PROTOBUF_C_OFFSETOF(OSMPBF__Info, changeset), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "uid", + 4, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_INT32, + PROTOBUF_C_OFFSETOF(OSMPBF__Info, has_uid), + PROTOBUF_C_OFFSETOF(OSMPBF__Info, uid), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "user_sid", + 5, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_UINT32, + PROTOBUF_C_OFFSETOF(OSMPBF__Info, has_user_sid), + PROTOBUF_C_OFFSETOF(OSMPBF__Info, user_sid), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned osmpbf__info__field_indices_by_name[] = { + 2, /* field[2] = changeset */ + 1, /* field[1] = timestamp */ + 3, /* field[3] = uid */ + 4, /* field[4] = user_sid */ + 0, /* field[0] = version */ +}; +static const ProtobufCIntRange osmpbf__info__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 5 } +}; +const ProtobufCMessageDescriptor osmpbf__info__descriptor = +{ + PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, + "OSMPBF.Info", + "Info", + "OSMPBF__Info", + "OSMPBF", + sizeof(OSMPBF__Info), + 5, + osmpbf__info__field_descriptors, + osmpbf__info__field_indices_by_name, + 1, osmpbf__info__number_ranges, + (ProtobufCMessageInit) osmpbf__info__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor osmpbf__dense_info__field_descriptors[5] = +{ + { + "version", + 1, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_INT32, + PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, n_version), + PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, version), + NULL, + NULL, + 1, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "timestamp", + 2, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_SINT64, + PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, n_timestamp), + PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, timestamp), + NULL, + NULL, + 1, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "changeset", + 3, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_SINT64, + PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, n_changeset), + PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, changeset), + NULL, + NULL, + 1, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "uid", + 4, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_SINT32, + PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, n_uid), + PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, uid), + NULL, + NULL, + 1, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "user_sid", + 5, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_SINT32, + PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, n_user_sid), + PROTOBUF_C_OFFSETOF(OSMPBF__DenseInfo, user_sid), + NULL, + NULL, + 1, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned osmpbf__dense_info__field_indices_by_name[] = { + 2, /* field[2] = changeset */ + 1, /* field[1] = timestamp */ + 3, /* field[3] = uid */ + 4, /* field[4] = user_sid */ + 0, /* field[0] = version */ +}; +static const ProtobufCIntRange osmpbf__dense_info__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 5 } +}; +const ProtobufCMessageDescriptor osmpbf__dense_info__descriptor = +{ + PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, + "OSMPBF.DenseInfo", + "DenseInfo", + "OSMPBF__DenseInfo", + "OSMPBF", + sizeof(OSMPBF__DenseInfo), + 5, + osmpbf__dense_info__field_descriptors, + osmpbf__dense_info__field_indices_by_name, + 1, osmpbf__dense_info__number_ranges, + (ProtobufCMessageInit) osmpbf__dense_info__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor osmpbf__change_set__field_descriptors[1] = +{ + { + "id", + 1, + PROTOBUF_C_LABEL_REQUIRED, + PROTOBUF_C_TYPE_INT64, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__ChangeSet, id), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned osmpbf__change_set__field_indices_by_name[] = { + 0, /* field[0] = id */ +}; +static const ProtobufCIntRange osmpbf__change_set__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 1 } +}; +const ProtobufCMessageDescriptor osmpbf__change_set__descriptor = +{ + PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, + "OSMPBF.ChangeSet", + "ChangeSet", + "OSMPBF__ChangeSet", + "OSMPBF", + sizeof(OSMPBF__ChangeSet), + 1, + osmpbf__change_set__field_descriptors, + osmpbf__change_set__field_indices_by_name, + 1, osmpbf__change_set__number_ranges, + (ProtobufCMessageInit) osmpbf__change_set__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor osmpbf__node__field_descriptors[6] = +{ + { + "id", + 1, + PROTOBUF_C_LABEL_REQUIRED, + PROTOBUF_C_TYPE_SINT64, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__Node, id), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "keys", + 2, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_UINT32, + PROTOBUF_C_OFFSETOF(OSMPBF__Node, n_keys), + PROTOBUF_C_OFFSETOF(OSMPBF__Node, keys), + NULL, + NULL, + 1, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "vals", + 3, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_UINT32, + PROTOBUF_C_OFFSETOF(OSMPBF__Node, n_vals), + PROTOBUF_C_OFFSETOF(OSMPBF__Node, vals), + NULL, + NULL, + 1, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "info", + 4, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_MESSAGE, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__Node, info), + &osmpbf__info__descriptor, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "lat", + 8, + PROTOBUF_C_LABEL_REQUIRED, + PROTOBUF_C_TYPE_SINT64, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__Node, lat), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "lon", + 9, + PROTOBUF_C_LABEL_REQUIRED, + PROTOBUF_C_TYPE_SINT64, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__Node, lon), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned osmpbf__node__field_indices_by_name[] = { + 0, /* field[0] = id */ + 3, /* field[3] = info */ + 1, /* field[1] = keys */ + 4, /* field[4] = lat */ + 5, /* field[5] = lon */ + 2, /* field[2] = vals */ +}; +static const ProtobufCIntRange osmpbf__node__number_ranges[2 + 1] = +{ + { 1, 0 }, + { 8, 4 }, + { 0, 6 } +}; +const ProtobufCMessageDescriptor osmpbf__node__descriptor = +{ + PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, + "OSMPBF.Node", + "Node", + "OSMPBF__Node", + "OSMPBF", + sizeof(OSMPBF__Node), + 6, + osmpbf__node__field_descriptors, + osmpbf__node__field_indices_by_name, + 2, osmpbf__node__number_ranges, + (ProtobufCMessageInit) osmpbf__node__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor osmpbf__dense_nodes__field_descriptors[5] = +{ + { + "id", + 1, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_SINT64, + PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, n_id), + PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, id), + NULL, + NULL, + 1, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "denseinfo", + 5, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_MESSAGE, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, denseinfo), + &osmpbf__dense_info__descriptor, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "lat", + 8, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_SINT64, + PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, n_lat), + PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, lat), + NULL, + NULL, + 1, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "lon", + 9, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_SINT64, + PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, n_lon), + PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, lon), + NULL, + NULL, + 1, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "keys_vals", + 10, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_INT32, + PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, n_keys_vals), + PROTOBUF_C_OFFSETOF(OSMPBF__DenseNodes, keys_vals), + NULL, + NULL, + 1, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned osmpbf__dense_nodes__field_indices_by_name[] = { + 1, /* field[1] = denseinfo */ + 0, /* field[0] = id */ + 4, /* field[4] = keys_vals */ + 2, /* field[2] = lat */ + 3, /* field[3] = lon */ +}; +static const ProtobufCIntRange osmpbf__dense_nodes__number_ranges[3 + 1] = +{ + { 1, 0 }, + { 5, 1 }, + { 8, 2 }, + { 0, 5 } +}; +const ProtobufCMessageDescriptor osmpbf__dense_nodes__descriptor = +{ + PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, + "OSMPBF.DenseNodes", + "DenseNodes", + "OSMPBF__DenseNodes", + "OSMPBF", + sizeof(OSMPBF__DenseNodes), + 5, + osmpbf__dense_nodes__field_descriptors, + osmpbf__dense_nodes__field_indices_by_name, + 3, osmpbf__dense_nodes__number_ranges, + (ProtobufCMessageInit) osmpbf__dense_nodes__init, + NULL,NULL,NULL /* reserved[123] */ +}; +static const ProtobufCFieldDescriptor osmpbf__way__field_descriptors[5] = +{ + { + "id", + 1, + PROTOBUF_C_LABEL_REQUIRED, + PROTOBUF_C_TYPE_INT64, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__Way, id), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "keys", + 2, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_UINT32, + PROTOBUF_C_OFFSETOF(OSMPBF__Way, n_keys), + PROTOBUF_C_OFFSETOF(OSMPBF__Way, keys), + NULL, + NULL, + 1, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "vals", + 3, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_UINT32, + PROTOBUF_C_OFFSETOF(OSMPBF__Way, n_vals), + PROTOBUF_C_OFFSETOF(OSMPBF__Way, vals), + NULL, + NULL, + 1, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "info", + 4, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_MESSAGE, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__Way, info), + &osmpbf__info__descriptor, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "refs", + 8, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_SINT64, + PROTOBUF_C_OFFSETOF(OSMPBF__Way, n_refs), + PROTOBUF_C_OFFSETOF(OSMPBF__Way, refs), + NULL, + NULL, + 1, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned osmpbf__way__field_indices_by_name[] = { + 0, /* field[0] = id */ + 3, /* field[3] = info */ + 1, /* field[1] = keys */ + 4, /* field[4] = refs */ + 2, /* field[2] = vals */ +}; +static const ProtobufCIntRange osmpbf__way__number_ranges[2 + 1] = +{ + { 1, 0 }, + { 8, 4 }, + { 0, 5 } +}; +const ProtobufCMessageDescriptor osmpbf__way__descriptor = +{ + PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, + "OSMPBF.Way", + "Way", + "OSMPBF__Way", + "OSMPBF", + sizeof(OSMPBF__Way), + 5, + osmpbf__way__field_descriptors, + osmpbf__way__field_indices_by_name, + 2, osmpbf__way__number_ranges, + (ProtobufCMessageInit) osmpbf__way__init, + NULL,NULL,NULL /* reserved[123] */ +}; +const ProtobufCEnumValue osmpbf__relation__member_type__enum_values_by_number[3] = +{ + { "NODE", "OSMPBF__RELATION__MEMBER_TYPE__NODE", 0 }, + { "WAY", "OSMPBF__RELATION__MEMBER_TYPE__WAY", 1 }, + { "RELATION", "OSMPBF__RELATION__MEMBER_TYPE__RELATION", 2 }, +}; +static const ProtobufCIntRange osmpbf__relation__member_type__value_ranges[] = { +{0, 0},{0, 3} +}; +const ProtobufCEnumValueIndex osmpbf__relation__member_type__enum_values_by_name[3] = +{ + { "NODE", 0 }, + { "RELATION", 2 }, + { "WAY", 1 }, +}; +const ProtobufCEnumDescriptor osmpbf__relation__member_type__descriptor = +{ + PROTOBUF_C_ENUM_DESCRIPTOR_MAGIC, + "OSMPBF.Relation.MemberType", + "MemberType", + "OSMPBF__Relation__MemberType", + "OSMPBF", + 3, + osmpbf__relation__member_type__enum_values_by_number, + 3, + osmpbf__relation__member_type__enum_values_by_name, + 1, + osmpbf__relation__member_type__value_ranges, + NULL,NULL,NULL,NULL /* reserved[1234] */ +}; +static const ProtobufCFieldDescriptor osmpbf__relation__field_descriptors[7] = +{ + { + "id", + 1, + PROTOBUF_C_LABEL_REQUIRED, + PROTOBUF_C_TYPE_INT64, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__Relation, id), + NULL, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "keys", + 2, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_UINT32, + PROTOBUF_C_OFFSETOF(OSMPBF__Relation, n_keys), + PROTOBUF_C_OFFSETOF(OSMPBF__Relation, keys), + NULL, + NULL, + 1, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "vals", + 3, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_UINT32, + PROTOBUF_C_OFFSETOF(OSMPBF__Relation, n_vals), + PROTOBUF_C_OFFSETOF(OSMPBF__Relation, vals), + NULL, + NULL, + 1, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "info", + 4, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_MESSAGE, + 0, /* quantifier_offset */ + PROTOBUF_C_OFFSETOF(OSMPBF__Relation, info), + &osmpbf__info__descriptor, + NULL, + 0, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "roles_sid", + 8, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_INT32, + PROTOBUF_C_OFFSETOF(OSMPBF__Relation, n_roles_sid), + PROTOBUF_C_OFFSETOF(OSMPBF__Relation, roles_sid), + NULL, + NULL, + 1, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "memids", + 9, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_SINT64, + PROTOBUF_C_OFFSETOF(OSMPBF__Relation, n_memids), + PROTOBUF_C_OFFSETOF(OSMPBF__Relation, memids), + NULL, + NULL, + 1, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "types", + 10, + PROTOBUF_C_LABEL_REPEATED, + PROTOBUF_C_TYPE_ENUM, + PROTOBUF_C_OFFSETOF(OSMPBF__Relation, n_types), + PROTOBUF_C_OFFSETOF(OSMPBF__Relation, types), + &osmpbf__relation__member_type__descriptor, + NULL, + 1, /* packed */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned osmpbf__relation__field_indices_by_name[] = { + 0, /* field[0] = id */ + 3, /* field[3] = info */ + 1, /* field[1] = keys */ + 5, /* field[5] = memids */ + 4, /* field[4] = roles_sid */ + 6, /* field[6] = types */ + 2, /* field[2] = vals */ +}; +static const ProtobufCIntRange osmpbf__relation__number_ranges[2 + 1] = +{ + { 1, 0 }, + { 8, 4 }, + { 0, 7 } +}; +const ProtobufCMessageDescriptor osmpbf__relation__descriptor = +{ + PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC, + "OSMPBF.Relation", + "Relation", + "OSMPBF__Relation", + "OSMPBF", + sizeof(OSMPBF__Relation), + 7, + osmpbf__relation__field_descriptors, + osmpbf__relation__field_indices_by_name, + 2, osmpbf__relation__number_ranges, + (ProtobufCMessageInit) osmpbf__relation__init, + NULL,NULL,NULL /* reserved[123] */ +}; diff --git a/navit/maptool/generated-code/osmformat.pb-c.h b/navit/maptool/generated-code/osmformat.pb-c.h new file mode 100644 index 0000000..32ac757 --- /dev/null +++ b/navit/maptool/generated-code/osmformat.pb-c.h @@ -0,0 +1,523 @@ +/* Generated by the protocol buffer compiler. DO NOT EDIT! */ + +#ifndef PROTOBUF_C_osmformat_2eproto__INCLUDED +#define PROTOBUF_C_osmformat_2eproto__INCLUDED + +#include + +PROTOBUF_C_BEGIN_DECLS + + +typedef struct _OSMPBF__HeaderBlock OSMPBF__HeaderBlock; +typedef struct _OSMPBF__HeaderBBox OSMPBF__HeaderBBox; +typedef struct _OSMPBF__PrimitiveBlock OSMPBF__PrimitiveBlock; +typedef struct _OSMPBF__PrimitiveGroup OSMPBF__PrimitiveGroup; +typedef struct _OSMPBF__StringTable OSMPBF__StringTable; +typedef struct _OSMPBF__Info OSMPBF__Info; +typedef struct _OSMPBF__DenseInfo OSMPBF__DenseInfo; +typedef struct _OSMPBF__ChangeSet OSMPBF__ChangeSet; +typedef struct _OSMPBF__Node OSMPBF__Node; +typedef struct _OSMPBF__DenseNodes OSMPBF__DenseNodes; +typedef struct _OSMPBF__Way OSMPBF__Way; +typedef struct _OSMPBF__Relation OSMPBF__Relation; + + +/* --- enums --- */ + +typedef enum _OSMPBF__Relation__MemberType { + OSMPBF__RELATION__MEMBER_TYPE__NODE = 0, + OSMPBF__RELATION__MEMBER_TYPE__WAY = 1, + OSMPBF__RELATION__MEMBER_TYPE__RELATION = 2 +} OSMPBF__Relation__MemberType; + +/* --- messages --- */ + +struct _OSMPBF__HeaderBlock +{ + ProtobufCMessage base; + OSMPBF__HeaderBBox *bbox; + size_t n_required_features; + char **required_features; + size_t n_optional_features; + char **optional_features; + char *writingprogram; + char *source; +}; +#define OSMPBF__HEADER_BLOCK__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&osmpbf__header_block__descriptor) \ + , NULL, 0,NULL, 0,NULL, NULL, NULL } + + +struct _OSMPBF__HeaderBBox +{ + ProtobufCMessage base; + int64_t left; + int64_t right; + int64_t top; + int64_t bottom; +}; +#define OSMPBF__HEADER_BBOX__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&osmpbf__header_bbox__descriptor) \ + , 0, 0, 0, 0 } + + +struct _OSMPBF__PrimitiveBlock +{ + ProtobufCMessage base; + OSMPBF__StringTable *stringtable; + size_t n_primitivegroup; + OSMPBF__PrimitiveGroup **primitivegroup; + protobuf_c_boolean has_granularity; + int32_t granularity; + protobuf_c_boolean has_lat_offset; + int64_t lat_offset; + protobuf_c_boolean has_lon_offset; + int64_t lon_offset; + protobuf_c_boolean has_date_granularity; + int32_t date_granularity; +}; +#define OSMPBF__PRIMITIVE_BLOCK__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&osmpbf__primitive_block__descriptor) \ + , NULL, 0,NULL, 0,100, 0,0, 0,0, 0,1000 } + + +struct _OSMPBF__PrimitiveGroup +{ + ProtobufCMessage base; + size_t n_nodes; + OSMPBF__Node **nodes; + OSMPBF__DenseNodes *dense; + size_t n_ways; + OSMPBF__Way **ways; + size_t n_relations; + OSMPBF__Relation **relations; + size_t n_changesets; + OSMPBF__ChangeSet **changesets; +}; +#define OSMPBF__PRIMITIVE_GROUP__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&osmpbf__primitive_group__descriptor) \ + , 0,NULL, NULL, 0,NULL, 0,NULL, 0,NULL } + + +struct _OSMPBF__StringTable +{ + ProtobufCMessage base; + size_t n_s; + ProtobufCBinaryData *s; +}; +#define OSMPBF__STRING_TABLE__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&osmpbf__string_table__descriptor) \ + , 0,NULL } + + +struct _OSMPBF__Info +{ + ProtobufCMessage base; + protobuf_c_boolean has_version; + int32_t version; + protobuf_c_boolean has_timestamp; + int64_t timestamp; + protobuf_c_boolean has_changeset; + int64_t changeset; + protobuf_c_boolean has_uid; + int32_t uid; + protobuf_c_boolean has_user_sid; + uint32_t user_sid; +}; +#define OSMPBF__INFO__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&osmpbf__info__descriptor) \ + , 0,-1, 0,0, 0,0, 0,0, 0,0 } + + +struct _OSMPBF__DenseInfo +{ + ProtobufCMessage base; + size_t n_version; + int32_t *version; + size_t n_timestamp; + int64_t *timestamp; + size_t n_changeset; + int64_t *changeset; + size_t n_uid; + int32_t *uid; + size_t n_user_sid; + int32_t *user_sid; +}; +#define OSMPBF__DENSE_INFO__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&osmpbf__dense_info__descriptor) \ + , 0,NULL, 0,NULL, 0,NULL, 0,NULL, 0,NULL } + + +struct _OSMPBF__ChangeSet +{ + ProtobufCMessage base; + int64_t id; +}; +#define OSMPBF__CHANGE_SET__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&osmpbf__change_set__descriptor) \ + , 0 } + + +struct _OSMPBF__Node +{ + ProtobufCMessage base; + int64_t id; + size_t n_keys; + uint32_t *keys; + size_t n_vals; + uint32_t *vals; + OSMPBF__Info *info; + int64_t lat; + int64_t lon; +}; +#define OSMPBF__NODE__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&osmpbf__node__descriptor) \ + , 0, 0,NULL, 0,NULL, NULL, 0, 0 } + + +struct _OSMPBF__DenseNodes +{ + ProtobufCMessage base; + size_t n_id; + int64_t *id; + OSMPBF__DenseInfo *denseinfo; + size_t n_lat; + int64_t *lat; + size_t n_lon; + int64_t *lon; + size_t n_keys_vals; + int32_t *keys_vals; +}; +#define OSMPBF__DENSE_NODES__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&osmpbf__dense_nodes__descriptor) \ + , 0,NULL, NULL, 0,NULL, 0,NULL, 0,NULL } + + +struct _OSMPBF__Way +{ + ProtobufCMessage base; + int64_t id; + size_t n_keys; + uint32_t *keys; + size_t n_vals; + uint32_t *vals; + OSMPBF__Info *info; + size_t n_refs; + int64_t *refs; +}; +#define OSMPBF__WAY__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&osmpbf__way__descriptor) \ + , 0, 0,NULL, 0,NULL, NULL, 0,NULL } + + +struct _OSMPBF__Relation +{ + ProtobufCMessage base; + int64_t id; + size_t n_keys; + uint32_t *keys; + size_t n_vals; + uint32_t *vals; + OSMPBF__Info *info; + size_t n_roles_sid; + int32_t *roles_sid; + size_t n_memids; + int64_t *memids; + size_t n_types; + OSMPBF__Relation__MemberType *types; +}; +#define OSMPBF__RELATION__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&osmpbf__relation__descriptor) \ + , 0, 0,NULL, 0,NULL, NULL, 0,NULL, 0,NULL, 0,NULL } + + +/* OSMPBF__HeaderBlock methods */ +void osmpbf__header_block__init + (OSMPBF__HeaderBlock *message); +size_t osmpbf__header_block__get_packed_size + (const OSMPBF__HeaderBlock *message); +size_t osmpbf__header_block__pack + (const OSMPBF__HeaderBlock *message, + uint8_t *out); +size_t osmpbf__header_block__pack_to_buffer + (const OSMPBF__HeaderBlock *message, + ProtobufCBuffer *buffer); +OSMPBF__HeaderBlock * + osmpbf__header_block__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void osmpbf__header_block__free_unpacked + (OSMPBF__HeaderBlock *message, + ProtobufCAllocator *allocator); +/* OSMPBF__HeaderBBox methods */ +void osmpbf__header_bbox__init + (OSMPBF__HeaderBBox *message); +size_t osmpbf__header_bbox__get_packed_size + (const OSMPBF__HeaderBBox *message); +size_t osmpbf__header_bbox__pack + (const OSMPBF__HeaderBBox *message, + uint8_t *out); +size_t osmpbf__header_bbox__pack_to_buffer + (const OSMPBF__HeaderBBox *message, + ProtobufCBuffer *buffer); +OSMPBF__HeaderBBox * + osmpbf__header_bbox__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void osmpbf__header_bbox__free_unpacked + (OSMPBF__HeaderBBox *message, + ProtobufCAllocator *allocator); +/* OSMPBF__PrimitiveBlock methods */ +void osmpbf__primitive_block__init + (OSMPBF__PrimitiveBlock *message); +size_t osmpbf__primitive_block__get_packed_size + (const OSMPBF__PrimitiveBlock *message); +size_t osmpbf__primitive_block__pack + (const OSMPBF__PrimitiveBlock *message, + uint8_t *out); +size_t osmpbf__primitive_block__pack_to_buffer + (const OSMPBF__PrimitiveBlock *message, + ProtobufCBuffer *buffer); +OSMPBF__PrimitiveBlock * + osmpbf__primitive_block__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void osmpbf__primitive_block__free_unpacked + (OSMPBF__PrimitiveBlock *message, + ProtobufCAllocator *allocator); +/* OSMPBF__PrimitiveGroup methods */ +void osmpbf__primitive_group__init + (OSMPBF__PrimitiveGroup *message); +size_t osmpbf__primitive_group__get_packed_size + (const OSMPBF__PrimitiveGroup *message); +size_t osmpbf__primitive_group__pack + (const OSMPBF__PrimitiveGroup *message, + uint8_t *out); +size_t osmpbf__primitive_group__pack_to_buffer + (const OSMPBF__PrimitiveGroup *message, + ProtobufCBuffer *buffer); +OSMPBF__PrimitiveGroup * + osmpbf__primitive_group__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void osmpbf__primitive_group__free_unpacked + (OSMPBF__PrimitiveGroup *message, + ProtobufCAllocator *allocator); +/* OSMPBF__StringTable methods */ +void osmpbf__string_table__init + (OSMPBF__StringTable *message); +size_t osmpbf__string_table__get_packed_size + (const OSMPBF__StringTable *message); +size_t osmpbf__string_table__pack + (const OSMPBF__StringTable *message, + uint8_t *out); +size_t osmpbf__string_table__pack_to_buffer + (const OSMPBF__StringTable *message, + ProtobufCBuffer *buffer); +OSMPBF__StringTable * + osmpbf__string_table__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void osmpbf__string_table__free_unpacked + (OSMPBF__StringTable *message, + ProtobufCAllocator *allocator); +/* OSMPBF__Info methods */ +void osmpbf__info__init + (OSMPBF__Info *message); +size_t osmpbf__info__get_packed_size + (const OSMPBF__Info *message); +size_t osmpbf__info__pack + (const OSMPBF__Info *message, + uint8_t *out); +size_t osmpbf__info__pack_to_buffer + (const OSMPBF__Info *message, + ProtobufCBuffer *buffer); +OSMPBF__Info * + osmpbf__info__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void osmpbf__info__free_unpacked + (OSMPBF__Info *message, + ProtobufCAllocator *allocator); +/* OSMPBF__DenseInfo methods */ +void osmpbf__dense_info__init + (OSMPBF__DenseInfo *message); +size_t osmpbf__dense_info__get_packed_size + (const OSMPBF__DenseInfo *message); +size_t osmpbf__dense_info__pack + (const OSMPBF__DenseInfo *message, + uint8_t *out); +size_t osmpbf__dense_info__pack_to_buffer + (const OSMPBF__DenseInfo *message, + ProtobufCBuffer *buffer); +OSMPBF__DenseInfo * + osmpbf__dense_info__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void osmpbf__dense_info__free_unpacked + (OSMPBF__DenseInfo *message, + ProtobufCAllocator *allocator); +/* OSMPBF__ChangeSet methods */ +void osmpbf__change_set__init + (OSMPBF__ChangeSet *message); +size_t osmpbf__change_set__get_packed_size + (const OSMPBF__ChangeSet *message); +size_t osmpbf__change_set__pack + (const OSMPBF__ChangeSet *message, + uint8_t *out); +size_t osmpbf__change_set__pack_to_buffer + (const OSMPBF__ChangeSet *message, + ProtobufCBuffer *buffer); +OSMPBF__ChangeSet * + osmpbf__change_set__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void osmpbf__change_set__free_unpacked + (OSMPBF__ChangeSet *message, + ProtobufCAllocator *allocator); +/* OSMPBF__Node methods */ +void osmpbf__node__init + (OSMPBF__Node *message); +size_t osmpbf__node__get_packed_size + (const OSMPBF__Node *message); +size_t osmpbf__node__pack + (const OSMPBF__Node *message, + uint8_t *out); +size_t osmpbf__node__pack_to_buffer + (const OSMPBF__Node *message, + ProtobufCBuffer *buffer); +OSMPBF__Node * + osmpbf__node__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void osmpbf__node__free_unpacked + (OSMPBF__Node *message, + ProtobufCAllocator *allocator); +/* OSMPBF__DenseNodes methods */ +void osmpbf__dense_nodes__init + (OSMPBF__DenseNodes *message); +size_t osmpbf__dense_nodes__get_packed_size + (const OSMPBF__DenseNodes *message); +size_t osmpbf__dense_nodes__pack + (const OSMPBF__DenseNodes *message, + uint8_t *out); +size_t osmpbf__dense_nodes__pack_to_buffer + (const OSMPBF__DenseNodes *message, + ProtobufCBuffer *buffer); +OSMPBF__DenseNodes * + osmpbf__dense_nodes__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void osmpbf__dense_nodes__free_unpacked + (OSMPBF__DenseNodes *message, + ProtobufCAllocator *allocator); +/* OSMPBF__Way methods */ +void osmpbf__way__init + (OSMPBF__Way *message); +size_t osmpbf__way__get_packed_size + (const OSMPBF__Way *message); +size_t osmpbf__way__pack + (const OSMPBF__Way *message, + uint8_t *out); +size_t osmpbf__way__pack_to_buffer + (const OSMPBF__Way *message, + ProtobufCBuffer *buffer); +OSMPBF__Way * + osmpbf__way__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void osmpbf__way__free_unpacked + (OSMPBF__Way *message, + ProtobufCAllocator *allocator); +/* OSMPBF__Relation methods */ +void osmpbf__relation__init + (OSMPBF__Relation *message); +size_t osmpbf__relation__get_packed_size + (const OSMPBF__Relation *message); +size_t osmpbf__relation__pack + (const OSMPBF__Relation *message, + uint8_t *out); +size_t osmpbf__relation__pack_to_buffer + (const OSMPBF__Relation *message, + ProtobufCBuffer *buffer); +OSMPBF__Relation * + osmpbf__relation__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void osmpbf__relation__free_unpacked + (OSMPBF__Relation *message, + ProtobufCAllocator *allocator); +/* --- per-message closures --- */ + +typedef void (*OSMPBF__HeaderBlock_Closure) + (const OSMPBF__HeaderBlock *message, + void *closure_data); +typedef void (*OSMPBF__HeaderBBox_Closure) + (const OSMPBF__HeaderBBox *message, + void *closure_data); +typedef void (*OSMPBF__PrimitiveBlock_Closure) + (const OSMPBF__PrimitiveBlock *message, + void *closure_data); +typedef void (*OSMPBF__PrimitiveGroup_Closure) + (const OSMPBF__PrimitiveGroup *message, + void *closure_data); +typedef void (*OSMPBF__StringTable_Closure) + (const OSMPBF__StringTable *message, + void *closure_data); +typedef void (*OSMPBF__Info_Closure) + (const OSMPBF__Info *message, + void *closure_data); +typedef void (*OSMPBF__DenseInfo_Closure) + (const OSMPBF__DenseInfo *message, + void *closure_data); +typedef void (*OSMPBF__ChangeSet_Closure) + (const OSMPBF__ChangeSet *message, + void *closure_data); +typedef void (*OSMPBF__Node_Closure) + (const OSMPBF__Node *message, + void *closure_data); +typedef void (*OSMPBF__DenseNodes_Closure) + (const OSMPBF__DenseNodes *message, + void *closure_data); +typedef void (*OSMPBF__Way_Closure) + (const OSMPBF__Way *message, + void *closure_data); +typedef void (*OSMPBF__Relation_Closure) + (const OSMPBF__Relation *message, + void *closure_data); + +/* --- services --- */ + + +/* --- descriptors --- */ + +extern const ProtobufCMessageDescriptor osmpbf__header_block__descriptor; +extern const ProtobufCMessageDescriptor osmpbf__header_bbox__descriptor; +extern const ProtobufCMessageDescriptor osmpbf__primitive_block__descriptor; +extern const ProtobufCMessageDescriptor osmpbf__primitive_group__descriptor; +extern const ProtobufCMessageDescriptor osmpbf__string_table__descriptor; +extern const ProtobufCMessageDescriptor osmpbf__info__descriptor; +extern const ProtobufCMessageDescriptor osmpbf__dense_info__descriptor; +extern const ProtobufCMessageDescriptor osmpbf__change_set__descriptor; +extern const ProtobufCMessageDescriptor osmpbf__node__descriptor; +extern const ProtobufCMessageDescriptor osmpbf__dense_nodes__descriptor; +extern const ProtobufCMessageDescriptor osmpbf__way__descriptor; +extern const ProtobufCMessageDescriptor osmpbf__relation__descriptor; +extern const ProtobufCEnumDescriptor osmpbf__relation__member_type__descriptor; + +PROTOBUF_C_END_DECLS + + +#endif /* PROTOBUF_osmformat_2eproto__INCLUDED */ diff --git a/navit/maptool/geom.c b/navit/maptool/geom.c new file mode 100644 index 0000000..991e980 --- /dev/null +++ b/navit/maptool/geom.c @@ -0,0 +1,622 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ +#include +#include +#include "maptool.h" + +void +geom_coord_copy(struct coord *from, struct coord *to, int count, int reverse) +{ + int i; + if (!reverse) { + memcpy(to, from, count*sizeof(struct coord)); + return; + } + from+=count; + for (i = 0 ; i < count ; i++) + *to++=*--from; +} + +/** + * Get coordinates of polyline middle point. + * @param in *p array of poly vertex coordinates + * @param in count count of poly vertexes + * @param out *c coordinates of middle point + * @returns number of first vertex of segment containing middle point + */ +int +geom_line_middle(struct coord *p, int count, struct coord *c) +{ + double length=0,half=0,len=0; + int i; + + if(count==1) { + *c=*p; + return 0; + } + + for (i=0; i 0) { + i--; + half-=length; + if (len) { + c->x=(p[i].x*half+p[i+1].x*(len-half))/len; + c->y=(p[i].y*half+p[i+1].y*(len-half))/len; + } else + *c=p[i]; + } else + *c=p[0]; + return i; +} + + +void +geom_coord_revert(struct coord *c, int count) +{ + struct coord tmp; + int i; + + for (i = 0 ; i < count/2 ; i++) { + tmp=c[i]; + c[i]=c[count-1-i]; + c[count-1-i]=tmp; + } +} + + +long long +geom_poly_area(struct coord *c, int count) +{ + long long area=0; + int i,j=0; +#if 0 + fprintf(stderr,"count=%d\n",count); +#endif + for (i=0; ix=x0+sx/3/area; + c->y=y0+sy/3/area; + return 1; + } + return 0; +} + +/** + * Get coordinates of polyline point c most close to given point p. + * @param in *pl array of polyline vertex coordinates + * @param in count count of polyline vertexes + * @param in *p point coordinates + * @param out *c coordinates of polyline point most close to given point. + * @returns first vertex number of polyline segment to which c belongs + */ +int +geom_poly_closest_point(struct coord *pl, int count, struct coord *p, struct coord *c) +{ + int i,vertex=0; + long long x, y, xi, xj, yi, yj, u, d, dmin=0; + if(count<2) { + c->x=pl->x; + c->y=pl->y; + return 0; + } + for(i=0;ix-xi)*(xj-xi)+(p->y-yi)*(yj-yi))*1000/u; + } + if(u<0) + u=0; + else if (u>1000) + u=1000; + x=xi+u*(xj-xi)/1000; + y=yi+u*(yj-yi)/1000; + d=(p->x-x)*(p->x-x)+(p->y-y)*(p->y-y); + if(i==0 || dx=x; + c->y=y; + vertex=i; + } + } + return vertex; +} + +/** + * Check if point is inside polgone. + * @param in *cp array of polygon vertex coordinates + * @param in count count of polygon vertexes + * @param in *c point coordinates + * @returns 1 - inside, 0 - outside + */ +int +geom_poly_point_inside(struct coord *cp, int count, struct coord *c) +{ + int ret=0; + struct coord *last=cp+count-1; + while (cp < last) { + if ((cp[0].y > c->y) != (cp[1].y > c->y) && + c->x < ((long long)cp[1].x-cp[0].x)*(c->y-cp[0].y)/(cp[1].y-cp[0].y)+cp[0].x) { +#if 0 + fprintf(stderr," cross 0x%x,0x%x-0x%x,0x%x %dx%d",cp,cp[0].x,cp[0].y,cp[1].x,cp[1].y,cp[1].x-cp[0].x,c->y-cp[0].y); + printf("type=selected_line\n"); + coord_print(projection_mg, &cp[0], stdout); + coord_print(projection_mg, &cp[1], stdout); +#endif + ret=!ret; + } + cp++; + } + return ret; +} + + + +GList * +geom_poly_segments_insert(GList *list, struct geom_poly_segment *first, struct geom_poly_segment *second, struct geom_poly_segment *third) +{ + int count; + struct geom_poly_segment *ret; + struct coord *pos; + + if (!second) + return NULL; + ret=g_new(struct geom_poly_segment, 1); + ret->type=second->type; + count=(second->last-second->first)+1; + if (first) + count+=(first->last-first->first); + if (third) + count+=(third->last-third->first); +#if 0 + fprintf(stderr,"count=%d first=%p second=%p third=%p\n",count,first,second,third); + if (first) + fprintf(stderr,"first:0x%x,0x%x-0x%x,0x%x (%d)\n",first->first->x,first->first->y,first->last->x,first->last->y, first->last-first->first+1); + if (second) + fprintf(stderr,"second:0x%x,0x%x-0x%x,0x%x (%d)\n",second->first->x,second->first->y,second->last->x,second->last->y, second->last-second->first+1); + if (third) + fprintf(stderr,"third:0x%x,0x%x-0x%x,0x%x (%d)\n",third->first->x,third->first->y,third->last->x,third->last->y, third->last-third->first+1); +#endif + ret->first=g_new(struct coord, count); + pos=ret->first; + if (first) { + count=(first->last-first->first)+1; + geom_coord_copy(first->first, pos, count, coord_is_equal(*first->first, *second->first)); + pos+=count-1; + } + count=(second->last-second->first)+1; + geom_coord_copy(second->first, pos, count, 0); + pos+=count; + if (third) { + pos--; + count=(third->last-third->first)+1; + geom_coord_copy(third->first, pos, count, coord_is_equal(*third->last, *second->last)); + pos+=count; + } + ret->last=pos-1; +#if 0 + fprintf(stderr,"result:0x%x,0x%x-0x%x,0x%x (%d)\n",ret->first->x,ret->first->y,ret->last->x,ret->last->y, ret->last-ret->first+1); +#endif + list=g_list_prepend(list, ret); +#if 0 + fprintf(stderr,"List=%p\n",list); +#endif + return list; +} + +void +geom_poly_segment_destroy(struct geom_poly_segment *seg) +{ + g_free(seg->first); + g_free(seg); +} + +GList * +geom_poly_segments_remove(GList *list, struct geom_poly_segment *seg) +{ + if (seg) { + list=g_list_remove(list, seg); + geom_poly_segment_destroy(seg); + } + return list; +} + +int +geom_poly_segment_compatible(struct geom_poly_segment *s1, struct geom_poly_segment *s2, int dir) +{ + int same=0,opposite=0; + if (s1->type == geom_poly_segment_type_none || s2->type == geom_poly_segment_type_none) + return 0; + if (s1->type == s2->type) { + same=1; + if (s1->type == geom_poly_segment_type_way_inner || s1->type == geom_poly_segment_type_way_outer) { + opposite=1; + } + } + if (s1->type == geom_poly_segment_type_way_left_side && s2->type == geom_poly_segment_type_way_right_side) + opposite=1; + if (s1->type == geom_poly_segment_type_way_right_side && s2->type == geom_poly_segment_type_way_left_side) + opposite=1; + if (s1->type == geom_poly_segment_type_way_unknown || s2->type == geom_poly_segment_type_way_unknown) { + same=1; + opposite=1; + } + if (dir < 0) { + if ((opposite && coord_is_equal(*s1->first, *s2->first)) || (same && coord_is_equal(*s1->first, *s2->last))) + return 1; + } else { + if ((opposite && coord_is_equal(*s1->last, *s2->last)) || (same && coord_is_equal(*s1->last, *s2->first))) + return 1; + } + return 0; +} + + +GList * +geom_poly_segments_sort(GList *in, enum geom_poly_segment_type type) +{ + GList *ret=NULL; + while (in) { + struct geom_poly_segment *seg=in->data; + GList *tmp=ret; + struct geom_poly_segment *merge_first=NULL,*merge_last=NULL; + while (tmp) { + struct geom_poly_segment *cseg=tmp->data; + if (geom_poly_segment_compatible(seg, cseg, -1)) + merge_first=cseg; + if (geom_poly_segment_compatible(seg, cseg, 1)) + merge_last=cseg; + tmp=g_list_next(tmp); + } + if (merge_first == merge_last) + merge_last=NULL; + ret=geom_poly_segments_insert(ret, merge_first, seg, merge_last); + ret=geom_poly_segments_remove(ret, merge_first); + ret=geom_poly_segments_remove(ret, merge_last); + in=g_list_next(in); + } + in=ret; + while (in) { + struct geom_poly_segment *seg=in->data; + if (coord_is_equal(*seg->first, *seg->last)) { + long long area=geom_poly_area(seg->first,seg->last-seg->first+1); + if (type == geom_poly_segment_type_way_right_side && seg->type == geom_poly_segment_type_way_right_side) { + seg->type=area > 0 ? geom_poly_segment_type_way_outer : geom_poly_segment_type_way_inner; + } + } + in=g_list_next(in); + } + return ret; +} + +int +geom_poly_segments_point_inside(GList *in, struct coord *c) +{ + int open_matches=0,closed_matches=0; + struct coord *cp; +#if 0 + fprintf(stderr,"try 0x%x,0x%x:",c->x,c->y); +#endif + while (in) { + struct geom_poly_segment *seg=in->data; + cp=seg->first; + if (geom_poly_point_inside(seg->first, seg->last-seg->first+1, c)) { +#if 0 + fprintf(stderr," inside"); +#endif + if (coord_is_equal(*seg->first,*seg->last)) + closed_matches++; + else + open_matches++; + } else { +#if 0 + fprintf(stderr," outside"); +#endif + } + in=g_list_next(in); + } +#if 0 + fprintf(stderr,"\n"); + fprintf(stderr,"open_matches %d closed_matches %d\n",open_matches,closed_matches); +#endif + if (closed_matches) { + if (closed_matches & 1) + return 1; + else + return 0; + } + if (open_matches) { + if (open_matches & 1) + return -1; + else + return 0; + } + return 0; +} + +struct geom_poly_segment * +item_bin_to_poly_segment(struct item_bin *ib, int type) +{ + struct geom_poly_segment *ret=g_new(struct geom_poly_segment, 1); + int count=ib->clen*sizeof(int)/sizeof(struct coord); + ret->type=type; + ret->first=g_new(struct coord, count); + ret->last=ret->first+count-1; + geom_coord_copy((struct coord *)(ib+1), ret->first, count, 0); + return ret; +} + + +static int +clipcode(struct coord *p, struct rect *r) +{ + int code=0; + if (p->x < r->l.x) + code=1; + if (p->x > r->h.x) + code=2; + if (p->y < r->l.y) + code |=4; + if (p->y > r->h.y) + code |=8; + return code; +} + + +static int +clip_line_code(struct coord *p1, struct coord *p2, struct rect *r) +{ + int code1,code2,ret=1; + long long dx,dy; + code1=clipcode(p1, r); + if (code1) + ret |= 2; + code2=clipcode(p2, r); + if (code2) + ret |= 4; + dx=p2->x-p1->x; + dy=p2->y-p1->y; + while (code1 || code2) { + if (code1 & code2) + return 0; + if (code1 & 1) { + p1->y+=(r->l.x-p1->x)*dy/dx; + p1->x=r->l.x; + } else if (code1 & 2) { + p1->y+=(r->h.x-p1->x)*dy/dx; + p1->x=r->h.x; + } else if (code1 & 4) { + p1->x+=(r->l.y-p1->y)*dx/dy; + p1->y=r->l.y; + } else if (code1 & 8) { + p1->x+=(r->h.y-p1->y)*dx/dy; + p1->y=r->h.y; + } + code1=clipcode(p1, r); + if (code1 & code2) + return 0; + if (code2 & 1) { + p2->y+=(r->l.x-p2->x)*dy/dx; + p2->x=r->l.x; + } else if (code2 & 2) { + p2->y+=(r->h.x-p2->x)*dy/dx; + p2->x=r->h.x; + } else if (code2 & 4) { + p2->x+=(r->l.y-p2->y)*dx/dy; + p2->y=r->l.y; + } else if (code2 & 8) { + p2->x+=(r->h.y-p2->y)*dx/dy; + p2->y=r->h.y; + } + code2=clipcode(p2, r); + } + if (p1->x == p2->x && p1->y == p2->y) + ret=0; + return ret; +} + +void +clip_line(struct item_bin *ib, struct rect *r, struct tile_parameter *param, struct item_bin_sink *out) +{ + char *buffer=g_alloca(sizeof(char)*(ib->len*4+32)); + struct item_bin *ib_new=(struct item_bin *)buffer; + struct coord *pa=(struct coord *)(ib+1); + int count=ib->clen/2; + struct coord p1,p2; + int i,code; + item_bin_init(ib_new, ib->type); + for (i = 0 ; i < count ; i++) { + if (i) { + p1.x=pa[i-1].x; + p1.y=pa[i-1].y; + p2.x=pa[i].x; + p2.y=pa[i].y; + /* 0 = invisible, 1 = completely visible, 3 = start point clipped, 5 = end point clipped, 7 both points clipped */ + code=clip_line_code(&p1, &p2, r); +#if 1 + if (((code == 1 || code == 5) && ib_new->clen == 0) || (code & 2)) { + item_bin_add_coord(ib_new, &p1, 1); + } + if (code) { + item_bin_add_coord(ib_new, &p2, 1); + } + if (i == count-1 || (code & 4)) { + if (param->attr_to_copy) + item_bin_copy_attr(ib_new, ib, param->attr_to_copy); + if (ib_new->clen) + item_bin_write_clipped(ib_new, param, out); + item_bin_init(ib_new, ib->type); + } +#else + if (code) { + item_bin_init(ib_new, ib->type); + item_bin_add_coord(ib_new, &p1, 1); + item_bin_add_coord(ib_new, &p2, 1); + if (param->attr_to_copy) + item_bin_copy_attr(ib_new, ib, param->attr_to_copy); + item_bin_write_clipped(ib_new, param, out); + } +#endif + } + } +} + +static int +is_inside(struct coord *p, struct rect *r, int edge) +{ + switch(edge) { + case 0: + return p->x >= r->l.x; + case 1: + return p->x <= r->h.x; + case 2: + return p->y >= r->l.y; + case 3: + return p->y <= r->h.y; + default: + return 0; + } +} + +static void +poly_intersection(struct coord *p1, struct coord *p2, struct rect *r, int edge, struct coord *ret) +{ + int dx=p2->x-p1->x; + int dy=p2->y-p1->y; + switch(edge) { + case 0: + ret->y=p1->y+(r->l.x-p1->x)*dy/dx; + ret->x=r->l.x; + break; + case 1: + ret->y=p1->y+(r->h.x-p1->x)*dy/dx; + ret->x=r->h.x; + break; + case 2: + ret->x=p1->x+(r->l.y-p1->y)*dx/dy; + ret->y=r->l.y; + break; + case 3: + ret->x=p1->x+(r->h.y-p1->y)*dx/dy; + ret->y=r->h.y; + break; + } +} + +void +clip_polygon(struct item_bin *ib, struct rect *r, struct tile_parameter *param, struct item_bin_sink *out) +{ + int count_in=ib->clen/2; + struct coord *pin,*p,*s,pi; + char *buffer1=g_alloca(sizeof(char)*(ib->len*4+ib->clen*7+32)); + struct item_bin *ib1=(struct item_bin *)buffer1; + char *buffer2=g_alloca(sizeof(char)*(ib->len*4+ib->clen*7+32)); + struct item_bin *ib2=(struct item_bin *)buffer2; + struct item_bin *ib_in,*ib_out; + int edge,i; + ib_out=ib1; + ib_in=ib; + for (edge = 0 ; edge < 4 ; edge++) { + count_in=ib_in->clen/2; + pin=(struct coord *)(ib_in+1); + p=pin; + s=pin+count_in-1; + item_bin_init(ib_out, ib_in->type); + for (i = 0 ; i < count_in ; i++) { + if (is_inside(p, r, edge)) { + if (! is_inside(s, r, edge)) { + poly_intersection(s,p,r,edge,&pi); + item_bin_add_coord(ib_out, &pi, 1); + } + item_bin_add_coord(ib_out, p, 1); + } else { + if (is_inside(s, r, edge)) { + poly_intersection(p,s,r,edge,&pi); + item_bin_add_coord(ib_out, &pi, 1); + } + } + s=p; + p++; + } + if (ib_in == ib1) { + ib_in=ib2; + ib_out=ib1; + } else { + ib_in=ib1; + ib_out=ib2; + } + } + if (ib_in->clen) { + if (param->attr_to_copy) + item_bin_copy_attr(ib_in, ib, param->attr_to_copy); + item_bin_write_clipped(ib_in, param, out); + } +} diff --git a/navit/maptool/google/protobuf-c/protobuf-c-private.h b/navit/maptool/google/protobuf-c/protobuf-c-private.h new file mode 100644 index 0000000..01bbd35 --- /dev/null +++ b/navit/maptool/google/protobuf-c/protobuf-c-private.h @@ -0,0 +1,72 @@ +/* --- protobuf-c-private.h: private structures and functions --- */ +/* + * Copyright 2008, Dave Benson. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with + * the License. You may obtain a copy of the License + * at http://www.apache.org/licenses/LICENSE-2.0 Unless + * required by applicable law or agreed to in writing, + * software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +/* === needs to be declared for the PROTOBUF_C_BUFFER_SIMPLE_INIT macro === */ + +void protobuf_c_buffer_simple_append (ProtobufCBuffer *buffer, + size_t len, + const unsigned char *data); + +/* === stuff which needs to be declared for use in the generated code === */ + +struct _ProtobufCEnumValueIndex +{ + const char *name; + unsigned index; /* into values[] array */ +}; + +/* IntRange: helper structure for optimizing + int => index lookups + in the case where the keys are mostly consecutive values, + as they presumably are for enums and fields. + + The data structures assumes that the values in the original + array are sorted */ +struct _ProtobufCIntRange +{ + int start_value; + unsigned orig_index; + /* NOTE: the number of values in the range can + be inferred by looking at the next element's orig_index. + a dummy element is added to make this simple */ +}; + + +/* === declared for exposition on ProtobufCIntRange === */ +/* note: ranges must have an extra sentinel IntRange at the end whose + orig_index is set to the number of actual values in the original array */ +/* returns -1 if no orig_index found */ +int protobuf_c_int_ranges_lookup (unsigned n_ranges, + ProtobufCIntRange *ranges); + +#define PROTOBUF_C_SERVICE_DESCRIPTOR_MAGIC 0x14159bc3 +#define PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC 0x28aaeef9 +#define PROTOBUF_C_ENUM_DESCRIPTOR_MAGIC 0x114315af + +/* === behind the scenes on the generated service's __init functions */ +typedef void (*ProtobufCServiceDestroy) (ProtobufCService *service); +void +protobuf_c_service_generated_init (ProtobufCService *service, + const ProtobufCServiceDescriptor *descriptor, + ProtobufCServiceDestroy destroy); + +void +protobuf_c_service_invoke_internal(ProtobufCService *service, + unsigned method_index, + const ProtobufCMessage *input, + ProtobufCClosure closure, + void *closure_data); diff --git a/navit/maptool/google/protobuf-c/protobuf-c.c b/navit/maptool/google/protobuf-c/protobuf-c.c new file mode 100644 index 0000000..4e4094f --- /dev/null +++ b/navit/maptool/google/protobuf-c/protobuf-c.c @@ -0,0 +1,2596 @@ +/* --- protobuf-c.c: public protobuf c runtime implementation --- */ + +/* + * Copyright 2008, Dave Benson. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with + * the License. You may obtain a copy of the License + * at http://www.apache.org/licenses/LICENSE-2.0 Unless + * required by applicable law or agreed to in writing, + * software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* TODO items: + + * 64-BIT OPTIMIZATION: certain implementations use 32-bit math even on 64-bit platforms + (uint64_size, uint64_pack, parse_uint64) + + * get_packed_size and pack seem to use type-prefixed names, + whereas parse uses type-suffixed names. pick one and stick with it. + Decision: go with type-suffixed, since the type (or its instance) + is typically the object of the verb. + NOTE: perhaps the "parse" methods should be reanemd to "unpack" + at the same time. (this only affects internal (static) functions) + + * use TRUE and FALSE instead of 1 and 0 as appropriate + + * use size_t consistently + */ + +#include /* for occasional printf()s */ +#include /* for abort(), malloc() etc */ +#include /* for strlen(), memcpy(), memmove() */ + +#ifndef PRINT_UNPACK_ERRORS +#define PRINT_UNPACK_ERRORS 1 +#endif + +#include "protobuf-c.h" + +#define MAX_UINT64_ENCODED_SIZE 10 + +/* convenience macros */ +#define TMPALLOC(allocator, size) ((allocator)->tmp_alloc ((allocator)->allocator_data, (size))) +#define FREE(allocator, ptr) \ + do { if ((ptr) != NULL) ((allocator)->free ((allocator)->allocator_data, (ptr))); } while(0) +#define UNALIGNED_ALLOC(allocator, size) ALLOC (allocator, size) /* placeholder */ +#define STRUCT_MEMBER_P(struct_p, struct_offset) \ + ((void *) ((uint8_t*) (struct_p) + (struct_offset))) +#define STRUCT_MEMBER(member_type, struct_p, struct_offset) \ + (*(member_type*) STRUCT_MEMBER_P ((struct_p), (struct_offset))) +#define STRUCT_MEMBER_PTR(member_type, struct_p, struct_offset) \ + ((member_type*) STRUCT_MEMBER_P ((struct_p), (struct_offset))) +#define TRUE 1 +#define FALSE 0 + +static void +alloc_failed_warning (unsigned size, const char *filename, unsigned line) +{ + fprintf (stderr, + "WARNING: out-of-memory allocating a block of size %u (%s:%u)\n", + size, filename, line); +} + +/* Try to allocate memory, running some special code if it fails. */ +#define DO_ALLOC(dst, allocator, size, fail_code) \ +{ size_t da__allocation_size = (size); \ + if (da__allocation_size == 0) \ + dst = NULL; \ + else if ((dst=((allocator)->alloc ((allocator)->allocator_data, \ + da__allocation_size))) == NULL) \ + { \ + alloc_failed_warning (da__allocation_size, __FILE__, __LINE__); \ + fail_code; \ + } \ +} +#define DO_UNALIGNED_ALLOC DO_ALLOC /* placeholder */ + + + +#define ASSERT_IS_ENUM_DESCRIPTOR(desc) \ + assert((desc)->magic == PROTOBUF_C_ENUM_DESCRIPTOR_MAGIC) +#define ASSERT_IS_MESSAGE_DESCRIPTOR(desc) \ + assert((desc)->magic == PROTOBUF_C_MESSAGE_DESCRIPTOR_MAGIC) +#define ASSERT_IS_MESSAGE(message) \ + ASSERT_IS_MESSAGE_DESCRIPTOR((message)->descriptor) +#define ASSERT_IS_SERVICE_DESCRIPTOR(desc) \ + assert((desc)->magic == PROTOBUF_C_SERVICE_DESCRIPTOR_MAGIC) + +/* --- allocator --- */ + +static void protobuf_c_out_of_memory_default (void) +{ + fprintf (stderr, "Out Of Memory!!!\n"); + abort (); +} +void (*protobuf_c_out_of_memory) (void) = protobuf_c_out_of_memory_default; + +static void *system_alloc(void *allocator_data, size_t size) +{ + void *rv; + (void) allocator_data; + if (size == 0) + return NULL; + rv = malloc (size); + if (rv == NULL) + protobuf_c_out_of_memory (); + return rv; +} + +static void system_free (void *allocator_data, void *data) +{ + (void) allocator_data; + if (data) + free (data); +} + +/* Some users may configure the default allocator; + providing your own allocator to unpack() is prefered. + this allocator is still used for packing nested messages. */ +ProtobufCAllocator protobuf_c_default_allocator = +{ + system_alloc, + system_free, + NULL, + 8192, + NULL +}; + +/* Users should NOT modify this structure, + but it's difficult to prevent. + + please modify protobuf_c_default_allocator instead. */ +ProtobufCAllocator protobuf_c_system_allocator = +{ + system_alloc, + system_free, + NULL, + 8192, + NULL +}; + +/* === buffer-simple === */ +void +protobuf_c_buffer_simple_append (ProtobufCBuffer *buffer, + size_t len, + const uint8_t *data) +{ + ProtobufCBufferSimple *simp = (ProtobufCBufferSimple *) buffer; + size_t new_len = simp->len + len; + if (new_len > simp->alloced) + { + size_t new_alloced = simp->alloced * 2; + uint8_t *new_data; + while (new_alloced < new_len) + new_alloced += new_alloced; + DO_ALLOC (new_data, &protobuf_c_default_allocator, new_alloced, return); + memcpy (new_data, simp->data, simp->len); + if (simp->must_free_data) + FREE (&protobuf_c_default_allocator, simp->data); + else + simp->must_free_data = 1; + simp->data = new_data; + simp->alloced = new_alloced; + } + memcpy (simp->data + simp->len, data, len); + simp->len = new_len; +} + +/* === get_packed_size() === */ + +/* Return the number of bytes required to store the + tag for the field (which includes 3 bits for + the wire-type, and a single bit that denotes the end-of-tag. */ +static inline size_t +get_tag_size (unsigned number) +{ + if (number < (1<<4)) + return 1; + else if (number < (1<<11)) + return 2; + else if (number < (1<<18)) + return 3; + else if (number < (1<<25)) + return 4; + else + return 5; +} + +/* Return the number of bytes required to store + a variable-length unsigned integer that fits in 32-bit uint + in base-128 encoding. */ +static inline size_t +uint32_size (uint32_t v) +{ + if (v < (1<<7)) + return 1; + else if (v < (1<<14)) + return 2; + else if (v < (1<<21)) + return 3; + else if (v < (1<<28)) + return 4; + else + return 5; +} +/* Return the number of bytes required to store + a variable-length signed integer that fits in 32-bit int + in base-128 encoding. */ +static inline size_t +int32_size (int32_t v) +{ + if (v < 0) + return 10; + else if (v < (1<<7)) + return 1; + else if (v < (1<<14)) + return 2; + else if (v < (1<<21)) + return 3; + else if (v < (1<<28)) + return 4; + else + return 5; +} +/* return the zigzag-encoded 32-bit unsigned int from a 32-bit signed int */ +static inline uint32_t +zigzag32 (int32_t v) +{ + if (v < 0) + return ((uint32_t)(-v)) * 2 - 1; + else + return v * 2; +} +/* Return the number of bytes required to store + a variable-length signed integer that fits in 32-bit int, + converted to unsigned via the zig-zag algorithm, + then packed using base-128 encoding. */ +static inline size_t +sint32_size (int32_t v) +{ + return uint32_size(zigzag32(v)); +} + +/* Return the number of bytes required to store + a variable-length unsigned integer that fits in 64-bit uint + in base-128 encoding. */ +static inline size_t +uint64_size (uint64_t v) +{ + uint32_t upper_v = (v>>32); + if (upper_v == 0) + return uint32_size ((uint32_t)v); + else if (upper_v < (1<<3)) + return 5; + else if (upper_v < (1<<10)) + return 6; + else if (upper_v < (1<<17)) + return 7; + else if (upper_v < (1<<24)) + return 8; + else if (upper_v < (1U<<31)) + return 9; + else + return 10; +} + +/* return the zigzag-encoded 64-bit unsigned int from a 64-bit signed int */ +static inline uint64_t +zigzag64 (int64_t v) +{ + if (v < 0) + return ((uint64_t)(-v)) * 2 - 1; + else + return v * 2; +} + +/* Return the number of bytes required to store + a variable-length signed integer that fits in 64-bit int, + converted to unsigned via the zig-zag algorithm, + then packed using base-128 encoding. */ +static inline size_t +sint64_size (int64_t v) +{ + return uint64_size(zigzag64(v)); +} + +/* Get serialized size of a single field in the message, + including the space needed by the identifying tag. */ +static size_t +required_field_get_packed_size (const ProtobufCFieldDescriptor *field, + const void *member) +{ + size_t rv = get_tag_size (field->id); + switch (field->type) + { + case PROTOBUF_C_TYPE_SINT32: + return rv + sint32_size (*(const int32_t *) member); + case PROTOBUF_C_TYPE_INT32: + return rv + int32_size (*(const uint32_t *) member); + case PROTOBUF_C_TYPE_UINT32: + return rv + uint32_size (*(const uint32_t *) member); + case PROTOBUF_C_TYPE_SINT64: + return rv + sint64_size (*(const int64_t *) member); + case PROTOBUF_C_TYPE_INT64: + case PROTOBUF_C_TYPE_UINT64: + return rv + uint64_size (*(const uint64_t *) member); + case PROTOBUF_C_TYPE_SFIXED32: + case PROTOBUF_C_TYPE_FIXED32: + return rv + 4; + case PROTOBUF_C_TYPE_SFIXED64: + case PROTOBUF_C_TYPE_FIXED64: + return rv + 8; + case PROTOBUF_C_TYPE_BOOL: + return rv + 1; + case PROTOBUF_C_TYPE_FLOAT: + return rv + 4; + case PROTOBUF_C_TYPE_DOUBLE: + return rv + 8; + case PROTOBUF_C_TYPE_ENUM: + // TODO: is this correct for negative-valued enums? + return rv + uint32_size (*(const uint32_t *) member); + case PROTOBUF_C_TYPE_STRING: + { + const char *str = *(char * const *) member; + size_t len = str ? strlen (str) : 0; + return rv + uint32_size (len) + len; + } + case PROTOBUF_C_TYPE_BYTES: + { + size_t len = ((const ProtobufCBinaryData*) member)->len; + return rv + uint32_size (len) + len; + } + //case PROTOBUF_C_TYPE_GROUP: + case PROTOBUF_C_TYPE_MESSAGE: + { + const ProtobufCMessage *msg = * (ProtobufCMessage * const *) member; + size_t subrv = msg ? protobuf_c_message_get_packed_size (msg) : 0; + return rv + uint32_size (subrv) + subrv; + } + } + PROTOBUF_C_ASSERT_NOT_REACHED (); + return 0; +} + +/* Get serialized size of a single optional field in the message, + including the space needed by the identifying tag. + Returns 0 if the optional field isn't set. */ +static size_t +optional_field_get_packed_size (const ProtobufCFieldDescriptor *field, + const protobuf_c_boolean *has, + const void *member) +{ + if (field->type == PROTOBUF_C_TYPE_MESSAGE + || field->type == PROTOBUF_C_TYPE_STRING) + { + const void *ptr = * (const void * const *) member; + if (ptr == NULL + || ptr == field->default_value) + return 0; + } + else + { + if (!*has) + return 0; + } + return required_field_get_packed_size (field, member); +} + +/* Get serialized size of a repeated field in the message, + which may consist of any number of values (including 0). + Includes the space needed by the identifying tags (as needed). */ +static size_t +repeated_field_get_packed_size (const ProtobufCFieldDescriptor *field, + size_t count, + const void *member) +{ + size_t header_size; + size_t rv = 0; + unsigned i; + void *array = * (void * const *) member; + if (count == 0) + return 0; + header_size = get_tag_size (field->id); + if (!field->packed) + header_size *= count; + switch (field->type) + { + case PROTOBUF_C_TYPE_SINT32: + for (i = 0; i < count; i++) + rv += sint32_size (((int32_t*)array)[i]); + break; + case PROTOBUF_C_TYPE_INT32: + for (i = 0; i < count; i++) + rv += int32_size (((uint32_t*)array)[i]); + break; + case PROTOBUF_C_TYPE_UINT32: + case PROTOBUF_C_TYPE_ENUM: + for (i = 0; i < count; i++) + rv += uint32_size (((uint32_t*)array)[i]); + break; + case PROTOBUF_C_TYPE_SINT64: + for (i = 0; i < count; i++) + rv += sint64_size (((int64_t*)array)[i]); + break; + case PROTOBUF_C_TYPE_INT64: + case PROTOBUF_C_TYPE_UINT64: + for (i = 0; i < count; i++) + rv += uint64_size (((uint64_t*)array)[i]); + break; + case PROTOBUF_C_TYPE_SFIXED32: + case PROTOBUF_C_TYPE_FIXED32: + case PROTOBUF_C_TYPE_FLOAT: + rv += 4 * count; + break; + case PROTOBUF_C_TYPE_SFIXED64: + case PROTOBUF_C_TYPE_FIXED64: + case PROTOBUF_C_TYPE_DOUBLE: + rv += 8 * count; + break; + case PROTOBUF_C_TYPE_BOOL: + rv += count; + break; + case PROTOBUF_C_TYPE_STRING: + for (i = 0; i < count; i++) + { + size_t len = strlen (((char**) array)[i]); + rv += uint32_size (len) + len; + } + break; + + case PROTOBUF_C_TYPE_BYTES: + for (i = 0; i < count; i++) + { + size_t len = ((ProtobufCBinaryData*) array)[i].len; + rv += uint32_size (len) + len; + } + break; + case PROTOBUF_C_TYPE_MESSAGE: + for (i = 0; i < count; i++) + { + size_t len = protobuf_c_message_get_packed_size (((ProtobufCMessage **) array)[i]); + rv += uint32_size (len) + len; + } + break; + //case PROTOBUF_C_TYPE_GROUP: // NOT SUPPORTED + } + if (field->packed) + header_size += uint32_size (rv); + return header_size + rv; +} + +/* Get the packed size of a unknown field (meaning one that + is passed through mostly uninterpreted... this is done + for forward compatibilty with the addition of new fields). */ +static inline size_t +unknown_field_get_packed_size (const ProtobufCMessageUnknownField *field) +{ + return get_tag_size (field->tag) + field->len; +} + +/* Get the number of bytes that the message will occupy once serialized. */ +size_t +protobuf_c_message_get_packed_size(const ProtobufCMessage *message) +{ + unsigned i; + size_t rv = 0; + ASSERT_IS_MESSAGE (message); + for (i = 0; i < message->descriptor->n_fields; i++) + { + const ProtobufCFieldDescriptor *field = message->descriptor->fields + i; + const void *member = ((const char *) message) + field->offset; + const void *qmember = ((const char *) message) + field->quantifier_offset; + + if (field->label == PROTOBUF_C_LABEL_REQUIRED) + rv += required_field_get_packed_size (field, member); + else if (field->label == PROTOBUF_C_LABEL_OPTIONAL) + rv += optional_field_get_packed_size (field, qmember, member); + else + rv += repeated_field_get_packed_size (field, * (const size_t *) qmember, member); + } + for (i = 0; i < message->n_unknown_fields; i++) + rv += unknown_field_get_packed_size (&message->unknown_fields[i]); + return rv; +} +/* === pack() === */ +/* Pack an unsigned 32-bit integer in base-128 encoding, and return the number of bytes needed: + this will be 5 or less. */ +static inline size_t +uint32_pack (uint32_t value, uint8_t *out) +{ + unsigned rv = 0; + if (value >= 0x80) + { + out[rv++] = value | 0x80; + value >>= 7; + if (value >= 0x80) + { + out[rv++] = value | 0x80; + value >>= 7; + if (value >= 0x80) + { + out[rv++] = value | 0x80; + value >>= 7; + if (value >= 0x80) + { + out[rv++] = value | 0x80; + value >>= 7; + } + } + } + } + /* assert: value<128 */ + out[rv++] = value; + return rv; +} + +/* Pack a 32-bit signed integer, returning the number of bytes needed. + Negative numbers are packed as twos-complement 64-bit integers. */ +static inline size_t +int32_pack (int32_t value, uint8_t *out) +{ + if (value < 0) + { + out[0] = value | 0x80; + out[1] = (value>>7) | 0x80; + out[2] = (value>>14) | 0x80; + out[3] = (value>>21) | 0x80; + out[4] = (value>>28) | 0x80; + out[5] = out[6] = out[7] = out[8] = 0xff; + out[9] = 0x01; + return 10; + } + else + return uint32_pack (value, out); +} + +/* Pack a 32-bit integer in zigwag encoding. */ +static inline size_t +sint32_pack (int32_t value, uint8_t *out) +{ + return uint32_pack (zigzag32 (value), out); +} + +/* Pack a 64-bit unsigned integer that fits in a 64-bit uint, + using base-128 encoding. */ +static size_t +uint64_pack (uint64_t value, uint8_t *out) +{ + uint32_t hi = value>>32; + uint32_t lo = value; + unsigned rv; + if (hi == 0) + return uint32_pack ((uint32_t)lo, out); + out[0] = (lo) | 0x80; + out[1] = (lo>>7) | 0x80; + out[2] = (lo>>14) | 0x80; + out[3] = (lo>>21) | 0x80; + if (hi < 8) + { + out[4] = (hi<<4) | (lo>>28); + return 5; + } + else + { + out[4] = ((hi&7)<<4) | (lo>>28) | 0x80; + hi >>= 3; + } + rv = 5; + while (hi >= 128) + { + out[rv++] = hi | 0x80; + hi >>= 7; + } + out[rv++] = hi; + return rv; +} + +/* Pack a 64-bit signed integer in zigzan encoding, + return the size of the packed output. + (Max returned value is 10) */ +static inline size_t +sint64_pack (int64_t value, uint8_t *out) +{ + return uint64_pack (zigzag64 (value), out); +} + +/* Pack a 32-bit value, little-endian. + Used for fixed32, sfixed32, float) */ +static inline size_t +fixed32_pack (uint32_t value, uint8_t *out) +{ +#if IS_LITTLE_ENDIAN + memcpy (out, &value, 4); +#else + out[0] = value; + out[1] = value>>8; + out[2] = value>>16; + out[3] = value>>24; +#endif + return 4; +} + +/* Pack a 64-bit fixed-length value. + (Used for fixed64, sfixed64, double) */ +/* XXX: the big-endian impl is really only good for 32-bit machines, + a 64-bit version would be appreciated, plus a way + to decide to use 64-bit math where convenient. */ +static inline size_t +fixed64_pack (uint64_t value, uint8_t *out) +{ +#if IS_LITTLE_ENDIAN + memcpy (out, &value, 8); +#else + fixed32_pack (value, out); + fixed32_pack (value>>32, out+4); +#endif + return 8; +} + + +/* Pack a boolean as 0 or 1, even though the protobuf_c_boolean + can really assume any integer value. */ +/* XXX: perhaps on some platforms "*out = !!value" would be + a better impl, b/c that is idiotmatic c++ in some stl impls. */ +static inline size_t +boolean_pack (protobuf_c_boolean value, uint8_t *out) +{ + *out = value ? 1 : 0; + return 1; +} + +/* Pack a length-prefixed string. + The input string is NUL-terminated. + + The NULL pointer is treated as an empty string. + This isn't really necessary, but it allows people + to leave required strings blank. + (See Issue 13 in the bug tracker for a + little more explanation). + */ +static inline size_t +string_pack (const char * str, uint8_t *out) +{ + if (str == NULL) + { + out[0] = 0; + return 1; + } + else + { + size_t len = strlen (str); + size_t rv = uint32_pack (len, out); + memcpy (out + rv, str, len); + return rv + len; + } +} + +static inline size_t +binary_data_pack (const ProtobufCBinaryData *bd, uint8_t *out) +{ + size_t len = bd->len; + size_t rv = uint32_pack (len, out); + memcpy (out + rv, bd->data, len); + return rv + len; +} + +static inline size_t +prefixed_message_pack (const ProtobufCMessage *message, uint8_t *out) +{ + if (message == NULL) + { + out[0] = 0; + return 1; + } + else + { + size_t rv = protobuf_c_message_pack (message, out + 1); + uint32_t rv_packed_size = uint32_size (rv); + if (rv_packed_size != 1) + memmove (out + rv_packed_size, out + 1, rv); + return uint32_pack (rv, out) + rv; + } +} + +/* wire-type will be added in required_field_pack() */ +/* XXX: just call uint64_pack on 64-bit platforms. */ +static size_t +tag_pack (uint32_t id, uint8_t *out) +{ + if (id < (1<<(32-3))) + return uint32_pack (id<<3, out); + else + return uint64_pack (((uint64_t)id) << 3, out); +} + +static size_t +required_field_pack (const ProtobufCFieldDescriptor *field, + const void *member, + uint8_t *out) +{ + size_t rv = tag_pack (field->id, out); + switch (field->type) + { + case PROTOBUF_C_TYPE_SINT32: + out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; + return rv + sint32_pack (*(const int32_t *) member, out + rv); + case PROTOBUF_C_TYPE_INT32: + out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; + return rv + int32_pack (*(const uint32_t *) member, out + rv); + case PROTOBUF_C_TYPE_UINT32: + case PROTOBUF_C_TYPE_ENUM: + out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; + return rv + uint32_pack (*(const uint32_t *) member, out + rv); + case PROTOBUF_C_TYPE_SINT64: + out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; + return rv + sint64_pack (*(const int64_t *) member, out + rv); + case PROTOBUF_C_TYPE_INT64: + case PROTOBUF_C_TYPE_UINT64: + out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; + return rv + uint64_pack (*(const uint64_t *) member, out + rv); + case PROTOBUF_C_TYPE_SFIXED32: + case PROTOBUF_C_TYPE_FIXED32: + case PROTOBUF_C_TYPE_FLOAT: + out[0] |= PROTOBUF_C_WIRE_TYPE_32BIT; + return rv + fixed32_pack (*(const uint32_t *) member, out + rv); + case PROTOBUF_C_TYPE_SFIXED64: + case PROTOBUF_C_TYPE_FIXED64: + case PROTOBUF_C_TYPE_DOUBLE: + out[0] |= PROTOBUF_C_WIRE_TYPE_64BIT; + return rv + fixed64_pack (*(const uint64_t *) member, out + rv); + case PROTOBUF_C_TYPE_BOOL: + out[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; + return rv + boolean_pack (*(const protobuf_c_boolean *) member, out + rv); + case PROTOBUF_C_TYPE_STRING: + { + out[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; + return rv + string_pack (*(char * const *) member, out + rv); + } + + case PROTOBUF_C_TYPE_BYTES: + { + const ProtobufCBinaryData * bd = ((const ProtobufCBinaryData*) member); + out[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; + return rv + binary_data_pack (bd, out + rv); + } + //case PROTOBUF_C_TYPE_GROUP: // NOT SUPPORTED + case PROTOBUF_C_TYPE_MESSAGE: + { + out[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; + return rv + prefixed_message_pack (*(ProtobufCMessage * const *) member, + out + rv); + } + } + PROTOBUF_C_ASSERT_NOT_REACHED (); + return 0; +} +static size_t +optional_field_pack (const ProtobufCFieldDescriptor *field, + const protobuf_c_boolean *has, + const void *member, + uint8_t *out) +{ + if (field->type == PROTOBUF_C_TYPE_MESSAGE + || field->type == PROTOBUF_C_TYPE_STRING) + { + const void *ptr = * (const void * const *) member; + if (ptr == NULL + || ptr == field->default_value) + return 0; + } + else + { + if (!*has) + return 0; + } + return required_field_pack (field, member, out); +} + +/* TODO: implement as a table lookup */ +static inline size_t +sizeof_elt_in_repeated_array (ProtobufCType type) +{ + switch (type) + { + case PROTOBUF_C_TYPE_SINT32: + case PROTOBUF_C_TYPE_INT32: + case PROTOBUF_C_TYPE_UINT32: + case PROTOBUF_C_TYPE_SFIXED32: + case PROTOBUF_C_TYPE_FIXED32: + case PROTOBUF_C_TYPE_FLOAT: + case PROTOBUF_C_TYPE_ENUM: + return 4; + case PROTOBUF_C_TYPE_SINT64: + case PROTOBUF_C_TYPE_INT64: + case PROTOBUF_C_TYPE_UINT64: + case PROTOBUF_C_TYPE_SFIXED64: + case PROTOBUF_C_TYPE_FIXED64: + case PROTOBUF_C_TYPE_DOUBLE: + return 8; + case PROTOBUF_C_TYPE_BOOL: + return sizeof (protobuf_c_boolean); + case PROTOBUF_C_TYPE_STRING: + case PROTOBUF_C_TYPE_MESSAGE: + return sizeof (void *); + case PROTOBUF_C_TYPE_BYTES: + return sizeof (ProtobufCBinaryData); + } + PROTOBUF_C_ASSERT_NOT_REACHED (); + return 0; +} + +static void +copy_to_little_endian_32 (void *out, const void *in, unsigned N) +{ +#if IS_LITTLE_ENDIAN + memcpy (out, in, N * 4); +#else + unsigned i; + const uint32_t *ini = in; + for (i = 0; i < N; i++) + fixed32_pack (ini[i], (uint32_t*)out + i); +#endif +} +static void +copy_to_little_endian_64 (void *out, const void *in, unsigned N) +{ +#if IS_LITTLE_ENDIAN + memcpy (out, in, N * 8); +#else + unsigned i; + const uint64_t *ini = in; + for (i = 0; i < N; i++) + fixed64_pack (ini[i], (uint64_t*)out + i); +#endif +} + +static unsigned +get_type_min_size (ProtobufCType type) +{ + if (type == PROTOBUF_C_TYPE_SFIXED32 + || type == PROTOBUF_C_TYPE_FIXED32 + || type == PROTOBUF_C_TYPE_FLOAT) + return 4; + if (type == PROTOBUF_C_TYPE_SFIXED64 + || type == PROTOBUF_C_TYPE_FIXED64 + || type == PROTOBUF_C_TYPE_DOUBLE) + return 8; + return 1; +} + +static size_t +repeated_field_pack (const ProtobufCFieldDescriptor *field, + size_t count, + const void *member, + uint8_t *out) +{ + char *array = * (char * const *) member; + unsigned i; + if (field->packed) + { + unsigned header_len; + unsigned len_start; + unsigned min_length; + unsigned payload_len; + unsigned length_size_min; + unsigned actual_length_size; + uint8_t *payload_at; + if (count == 0) + return 0; + header_len = tag_pack (field->id, out); + out[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; + len_start = header_len; + min_length = get_type_min_size (field->type) * count; + length_size_min = uint32_size (min_length); + header_len += length_size_min; + payload_at = out + header_len; + switch (field->type) + { + case PROTOBUF_C_TYPE_SFIXED32: + case PROTOBUF_C_TYPE_FIXED32: + case PROTOBUF_C_TYPE_FLOAT: + copy_to_little_endian_32 (payload_at, array, count); + payload_at += count * 4; + break; + + case PROTOBUF_C_TYPE_SFIXED64: + case PROTOBUF_C_TYPE_FIXED64: + case PROTOBUF_C_TYPE_DOUBLE: + copy_to_little_endian_64 (payload_at, array, count); + payload_at += count * 8; + break; + + case PROTOBUF_C_TYPE_INT32: + { + const int32_t *arr = (const int32_t *) array; + for (i = 0; i < count; i++) + payload_at += int32_pack (arr[i], payload_at); + } + break; + + case PROTOBUF_C_TYPE_SINT32: + { + const int32_t *arr = (const int32_t *) array; + for (i = 0; i < count; i++) + payload_at += sint32_pack (arr[i], payload_at); + } + break; + + case PROTOBUF_C_TYPE_SINT64: + { + const int64_t *arr = (const int64_t *) array; + for (i = 0; i < count; i++) + payload_at += sint64_pack (arr[i], payload_at); + } + break; + case PROTOBUF_C_TYPE_ENUM: + case PROTOBUF_C_TYPE_UINT32: + { + const uint32_t *arr = (const uint32_t *) array; + for (i = 0; i < count; i++) + payload_at += uint32_pack (arr[i], payload_at); + } + break; + case PROTOBUF_C_TYPE_INT64: + case PROTOBUF_C_TYPE_UINT64: + { + const uint64_t *arr = (const uint64_t *) array; + for (i = 0; i < count; i++) + payload_at += uint64_pack (arr[i], payload_at); + } + break; + case PROTOBUF_C_TYPE_BOOL: + { + const protobuf_c_boolean *arr = (const protobuf_c_boolean *) array; + for (i = 0; i < count; i++) + payload_at += boolean_pack (arr[i], payload_at); + } + break; + + default: + assert (0); + } + payload_len = payload_at - (out + header_len); + actual_length_size = uint32_size (payload_len); + if (length_size_min != actual_length_size) + { + assert (actual_length_size == length_size_min + 1); + memmove (out + header_len + 1, out + header_len, payload_len); + header_len++; + } + uint32_pack (payload_len, out + len_start); + return header_len + payload_len; + } + else + { + /* CONSIDER: optimize this case a bit (by putting the loop inside the switch) */ + size_t rv = 0; + unsigned siz = sizeof_elt_in_repeated_array (field->type); + for (i = 0; i < count; i++) + { + rv += required_field_pack (field, array, out + rv); + array += siz; + } + return rv; + } +} +static size_t +unknown_field_pack (const ProtobufCMessageUnknownField *field, + uint8_t *out) +{ + size_t rv = tag_pack (field->tag, out); + out[0] |= field->wire_type; + memcpy (out + rv, field->data, field->len); + return rv + field->len; +} + +size_t +protobuf_c_message_pack (const ProtobufCMessage *message, + uint8_t *out) +{ + unsigned i; + size_t rv = 0; + ASSERT_IS_MESSAGE (message); + for (i = 0; i < message->descriptor->n_fields; i++) + { + const ProtobufCFieldDescriptor *field = message->descriptor->fields + i; + const void *member = ((const char *) message) + field->offset; + + /* it doesn't hurt to compute qmember (a pointer to the quantifier + field of the structure), but the pointer is only valid if + the field is one of: + - a repeated field + - an optional field that isn't a pointer type + (meaning: not a message or a string) */ + const void *qmember = ((const char *) message) + field->quantifier_offset; + + if (field->label == PROTOBUF_C_LABEL_REQUIRED) + rv += required_field_pack (field, member, out + rv); + else if (field->label == PROTOBUF_C_LABEL_OPTIONAL) + /* note that qmember is bogus for strings and messages, + but it isn't used */ + rv += optional_field_pack (field, qmember, member, out + rv); + else + rv += repeated_field_pack (field, * (const size_t *) qmember, member, out + rv); + } + for (i = 0; i < message->n_unknown_fields; i++) + rv += unknown_field_pack (&message->unknown_fields[i], out + rv); + return rv; +} + +/* === pack_to_buffer() === */ +static size_t +required_field_pack_to_buffer (const ProtobufCFieldDescriptor *field, + const void *member, + ProtobufCBuffer *buffer) +{ + size_t rv; + uint8_t scratch[MAX_UINT64_ENCODED_SIZE * 2]; + rv = tag_pack (field->id, scratch); + switch (field->type) + { + case PROTOBUF_C_TYPE_SINT32: + scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; + rv += sint32_pack (*(const int32_t *) member, scratch + rv); + buffer->append (buffer, rv, scratch); + break; + case PROTOBUF_C_TYPE_INT32: + scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; + rv += int32_pack (*(const uint32_t *) member, scratch + rv); + buffer->append (buffer, rv, scratch); + break; + case PROTOBUF_C_TYPE_UINT32: + case PROTOBUF_C_TYPE_ENUM: + scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; + rv += uint32_pack (*(const uint32_t *) member, scratch + rv); + buffer->append (buffer, rv, scratch); + break; + case PROTOBUF_C_TYPE_SINT64: + scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; + rv += sint64_pack (*(const int64_t *) member, scratch + rv); + buffer->append (buffer, rv, scratch); + break; + case PROTOBUF_C_TYPE_INT64: + case PROTOBUF_C_TYPE_UINT64: + scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; + rv += uint64_pack (*(const uint64_t *) member, scratch + rv); + buffer->append (buffer, rv, scratch); + break; + case PROTOBUF_C_TYPE_SFIXED32: + case PROTOBUF_C_TYPE_FIXED32: + case PROTOBUF_C_TYPE_FLOAT: + scratch[0] |= PROTOBUF_C_WIRE_TYPE_32BIT; + rv += fixed32_pack (*(const uint32_t *) member, scratch + rv); + buffer->append (buffer, rv, scratch); + break; + case PROTOBUF_C_TYPE_SFIXED64: + case PROTOBUF_C_TYPE_FIXED64: + case PROTOBUF_C_TYPE_DOUBLE: + scratch[0] |= PROTOBUF_C_WIRE_TYPE_64BIT; + rv += fixed64_pack (*(const uint64_t *) member, scratch + rv); + buffer->append (buffer, rv, scratch); + break; + case PROTOBUF_C_TYPE_BOOL: + scratch[0] |= PROTOBUF_C_WIRE_TYPE_VARINT; + rv += boolean_pack (*(const protobuf_c_boolean *) member, scratch + rv); + buffer->append (buffer, rv, scratch); + break; + case PROTOBUF_C_TYPE_STRING: + { + const char *str = *(char * const *) member; + size_t sublen = str ? strlen (str) : 0; + scratch[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; + rv += uint32_pack (sublen, scratch + rv); + buffer->append (buffer, rv, scratch); + buffer->append (buffer, sublen, (const uint8_t *) str); + rv += sublen; + break; + } + + case PROTOBUF_C_TYPE_BYTES: + { + const ProtobufCBinaryData * bd = ((const ProtobufCBinaryData*) member); + size_t sublen = bd->len; + scratch[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; + rv += uint32_pack (sublen, scratch + rv); + buffer->append (buffer, rv, scratch); + buffer->append (buffer, sublen, bd->data); + rv += sublen; + break; + } + //PROTOBUF_C_TYPE_GROUP, // NOT SUPPORTED + case PROTOBUF_C_TYPE_MESSAGE: + { + uint8_t simple_buffer_scratch[256]; + size_t sublen; + ProtobufCBufferSimple simple_buffer + = PROTOBUF_C_BUFFER_SIMPLE_INIT (simple_buffer_scratch); + const ProtobufCMessage *msg = *(ProtobufCMessage * const *) member; + scratch[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; + if (msg == NULL) + sublen = 0; + else + sublen = protobuf_c_message_pack_to_buffer (msg, &simple_buffer.base); + rv += uint32_pack (sublen, scratch + rv); + buffer->append (buffer, rv, scratch); + buffer->append (buffer, sublen, simple_buffer.data); + rv += sublen; + PROTOBUF_C_BUFFER_SIMPLE_CLEAR (&simple_buffer); + break; + } + default: + PROTOBUF_C_ASSERT_NOT_REACHED (); + } + return rv; +} +static size_t +optional_field_pack_to_buffer (const ProtobufCFieldDescriptor *field, + const protobuf_c_boolean *has, + const void *member, + ProtobufCBuffer *buffer) +{ + if (field->type == PROTOBUF_C_TYPE_MESSAGE + || field->type == PROTOBUF_C_TYPE_STRING) + { + const void *ptr = * (const void * const *) member; + if (ptr == NULL + || ptr == field->default_value) + return 0; + } + else + { + if (!*has) + return 0; + } + return required_field_pack_to_buffer (field, member, buffer); +} + +static size_t +get_packed_payload_length (const ProtobufCFieldDescriptor *field, + unsigned count, + const void *array) +{ + unsigned rv = 0; + unsigned i; + switch (field->type) + { + case PROTOBUF_C_TYPE_SFIXED32: + case PROTOBUF_C_TYPE_FIXED32: + case PROTOBUF_C_TYPE_FLOAT: + return count * 4; + + case PROTOBUF_C_TYPE_SFIXED64: + case PROTOBUF_C_TYPE_FIXED64: + case PROTOBUF_C_TYPE_DOUBLE: + return count * 8; + + case PROTOBUF_C_TYPE_INT32: + { + const int32_t *arr = (const int32_t *) array; + for (i = 0; i < count; i++) + rv += int32_size (arr[i]); + } + break; + + case PROTOBUF_C_TYPE_SINT32: + { + const int32_t *arr = (const int32_t *) array; + for (i = 0; i < count; i++) + rv += sint32_size (arr[i]); + } + break; + case PROTOBUF_C_TYPE_ENUM: + case PROTOBUF_C_TYPE_UINT32: + { + const uint32_t *arr = (const uint32_t *) array; + for (i = 0; i < count; i++) + rv += uint32_size (arr[i]); + } + break; + + case PROTOBUF_C_TYPE_SINT64: + { + const int64_t *arr = (const int64_t *) array; + for (i = 0; i < count; i++) + rv += sint64_size (arr[i]); + } + break; + case PROTOBUF_C_TYPE_INT64: + case PROTOBUF_C_TYPE_UINT64: + { + const uint64_t *arr = (const uint64_t *) array; + for (i = 0; i < count; i++) + rv += uint64_size (arr[i]); + } + break; + case PROTOBUF_C_TYPE_BOOL: + return count; + default: + assert (0); + } + return rv; +} +static size_t +pack_buffer_packed_payload (const ProtobufCFieldDescriptor *field, + unsigned count, + const void *array, + ProtobufCBuffer *buffer) +{ + uint8_t scratch[16]; + size_t rv = 0; + unsigned i; + switch (field->type) + { + case PROTOBUF_C_TYPE_SFIXED32: + case PROTOBUF_C_TYPE_FIXED32: + case PROTOBUF_C_TYPE_FLOAT: +#if IS_LITTLE_ENDIAN + rv = count * 4; + goto no_packing_needed; +#else + for (i = 0; i < count; i++) + { + unsigned len = fixed32_pack (((uint32_t*)array)[i], scratch); + buffer->append (buffer, len, scratch); + rv += len; + } +#endif + break; + case PROTOBUF_C_TYPE_SFIXED64: + case PROTOBUF_C_TYPE_FIXED64: + case PROTOBUF_C_TYPE_DOUBLE: +#if IS_LITTLE_ENDIAN + rv = count * 8; + goto no_packing_needed; +#else + for (i = 0; i < count; i++) + { + unsigned len = fixed64_pack (((uint64_t*)array)[i], scratch); + buffer->append (buffer, len, scratch); + rv += len; + } + break; +#endif + case PROTOBUF_C_TYPE_INT32: + for (i = 0; i < count; i++) + { + unsigned len = int32_pack (((int32_t*)array)[i], scratch); + buffer->append (buffer, len, scratch); + rv += len; + } + break; + + case PROTOBUF_C_TYPE_SINT32: + for (i = 0; i < count; i++) + { + unsigned len = sint32_pack (((int32_t*)array)[i], scratch); + buffer->append (buffer, len, scratch); + rv += len; + } + break; + case PROTOBUF_C_TYPE_ENUM: + case PROTOBUF_C_TYPE_UINT32: + for (i = 0; i < count; i++) + { + unsigned len = uint32_pack (((uint32_t*)array)[i], scratch); + buffer->append (buffer, len, scratch); + rv += len; + } + break; + + case PROTOBUF_C_TYPE_SINT64: + for (i = 0; i < count; i++) + { + unsigned len = sint64_pack (((int64_t*)array)[i], scratch); + buffer->append (buffer, len, scratch); + rv += len; + } + break; + case PROTOBUF_C_TYPE_INT64: + case PROTOBUF_C_TYPE_UINT64: + for (i = 0; i < count; i++) + { + unsigned len = uint64_pack (((uint64_t*)array)[i], scratch); + buffer->append (buffer, len, scratch); + rv += len; + } + break; + case PROTOBUF_C_TYPE_BOOL: + for (i = 0; i < count; i++) + { + unsigned len = boolean_pack (((protobuf_c_boolean*)array)[i], scratch); + buffer->append (buffer, len, scratch); + rv += len; + } + return count; + default: + assert(0); + } + return rv; + +no_packing_needed: + buffer->append (buffer, rv, array); + return rv; +} + +static size_t +repeated_field_pack_to_buffer (const ProtobufCFieldDescriptor *field, + unsigned count, + const void *member, + ProtobufCBuffer *buffer) +{ + char *array = * (char * const *) member; + if (count == 0) + return 0; + if (field->packed) + { + uint8_t scratch[MAX_UINT64_ENCODED_SIZE * 2]; + size_t rv = tag_pack (field->id, scratch); + size_t payload_len = get_packed_payload_length (field, count, array); + size_t tmp; + scratch[0] |= PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED; + rv += uint32_pack (payload_len, scratch + rv); + buffer->append (buffer, rv, scratch); + tmp = pack_buffer_packed_payload (field, count, array, buffer); + assert (tmp == payload_len); + return rv + payload_len; + } + else + { + size_t siz; + unsigned i; + /* CONSIDER: optimize this case a bit (by putting the loop inside the switch) */ + unsigned rv = 0; + siz = sizeof_elt_in_repeated_array (field->type); + for (i = 0; i < count; i++) + { + rv += required_field_pack_to_buffer (field, array, buffer); + array += siz; + } + return rv; + } +} + +static size_t +unknown_field_pack_to_buffer (const ProtobufCMessageUnknownField *field, + ProtobufCBuffer *buffer) +{ + uint8_t header[MAX_UINT64_ENCODED_SIZE]; + size_t rv = tag_pack (field->tag, header); + header[0] |= field->wire_type; + buffer->append (buffer, rv, header); + buffer->append (buffer, field->len, field->data); + return rv + field->len; +} + +size_t +protobuf_c_message_pack_to_buffer (const ProtobufCMessage *message, + ProtobufCBuffer *buffer) +{ + unsigned i; + size_t rv = 0; + ASSERT_IS_MESSAGE (message); + for (i = 0; i < message->descriptor->n_fields; i++) + { + const ProtobufCFieldDescriptor *field = message->descriptor->fields + i; + const void *member = ((const char *) message) + field->offset; + const void *qmember = ((const char *) message) + field->quantifier_offset; + + if (field->label == PROTOBUF_C_LABEL_REQUIRED) + rv += required_field_pack_to_buffer (field, member, buffer); + else if (field->label == PROTOBUF_C_LABEL_OPTIONAL) + rv += optional_field_pack_to_buffer (field, qmember, member, buffer); + else + rv += repeated_field_pack_to_buffer (field, * (const size_t *) qmember, member, buffer); + } + for (i = 0; i < message->n_unknown_fields; i++) + rv += unknown_field_pack_to_buffer (&message->unknown_fields[i], buffer); + + return rv; +} + +/* === unpacking === */ +#if PRINT_UNPACK_ERRORS +# define UNPACK_ERROR(args) do { printf args;printf("\n"); }while(0) +#else +# define UNPACK_ERROR(args) do { } while (0) +#endif + +static inline int +int_range_lookup (unsigned n_ranges, + const ProtobufCIntRange *ranges, + int value) +{ + unsigned start, n; + if (n_ranges == 0) + return -1; + start = 0; + n = n_ranges; + while (n > 1) + { + unsigned mid = start + n / 2; + if (value < ranges[mid].start_value) + { + n = mid - start; + } + else if (value >= ranges[mid].start_value + (int)(ranges[mid+1].orig_index-ranges[mid].orig_index)) + { + unsigned new_start = mid + 1; + n = start + n - new_start; + start = new_start; + } + else + return (value - ranges[mid].start_value) + ranges[mid].orig_index; + } + if (n > 0) + { + unsigned start_orig_index = ranges[start].orig_index; + unsigned range_size = ranges[start+1].orig_index - start_orig_index; + + if (ranges[start].start_value <= value + && value < (int)(ranges[start].start_value + range_size)) + return (value - ranges[start].start_value) + start_orig_index; + } + return -1; +} + +static size_t +parse_tag_and_wiretype (size_t len, + const uint8_t *data, + uint32_t *tag_out, + ProtobufCWireType *wiretype_out) +{ + unsigned max_rv = len > 5 ? 5 : len; + uint32_t tag = (data[0]&0x7f) >> 3; + unsigned shift = 4; + unsigned rv; + *wiretype_out = data[0] & 7; + if ((data[0] & 0x80) == 0) + { + *tag_out = tag; + return 1; + } + for (rv = 1; rv < max_rv; rv++) + if (data[rv] & 0x80) + { + tag |= (data[rv] & 0x7f) << shift; + shift += 7; + } + else + { + tag |= data[rv] << shift; + *tag_out = tag; + return rv + 1; + } + return 0; /* error: bad header */ +} + +/* sizeof(ScannedMember) must be <= (1< len) + { + UNPACK_ERROR (("data too short after length-prefix of %u", + val)); + return 0; + } + return hdr_len + val; +} + +static size_t +max_b128_numbers (size_t len, const uint8_t *data) +{ + size_t rv = 0; + while (len--) + if ((*data++ & 0x80) == 0) + ++rv; + return rv; +} + + +/* Given a raw slab of packed-repeated values, + determine the number of elements. + This function detects certain kinds of errors + but not others; the remaining error checking is done by + parse_packed_repeated_member() */ +static protobuf_c_boolean +count_packed_elements (ProtobufCType type, + size_t len, + const uint8_t *data, + size_t *count_out) +{ + switch (type) + { + case PROTOBUF_C_TYPE_SFIXED32: + case PROTOBUF_C_TYPE_FIXED32: + case PROTOBUF_C_TYPE_FLOAT: + if (len % 4 != 0) + { + UNPACK_ERROR (("length must be a multiple of 4 for fixed-length 32-bit types")); + return FALSE; + } + *count_out = len / 4; + return TRUE; + + case PROTOBUF_C_TYPE_SFIXED64: + case PROTOBUF_C_TYPE_FIXED64: + case PROTOBUF_C_TYPE_DOUBLE: + if (len % 8 != 0) + { + UNPACK_ERROR (("length must be a multiple of 8 for fixed-length 64-bit types")); + return FALSE; + } + *count_out = len / 8; + return TRUE; + + case PROTOBUF_C_TYPE_INT32: + case PROTOBUF_C_TYPE_SINT32: + case PROTOBUF_C_TYPE_ENUM: + case PROTOBUF_C_TYPE_UINT32: + case PROTOBUF_C_TYPE_INT64: + case PROTOBUF_C_TYPE_SINT64: + case PROTOBUF_C_TYPE_UINT64: + *count_out = max_b128_numbers (len, data); + return TRUE; + case PROTOBUF_C_TYPE_BOOL: + *count_out = len; + return TRUE; + + case PROTOBUF_C_TYPE_STRING: + case PROTOBUF_C_TYPE_BYTES: + case PROTOBUF_C_TYPE_MESSAGE: + default: + UNPACK_ERROR (("bad protobuf-c type %u for packed-repeated", type)); + return FALSE; + } +} + +static inline uint32_t +parse_uint32 (unsigned len, const uint8_t *data) +{ + unsigned rv = data[0] & 0x7f; + if (len > 1) + { + rv |= ((data[1] & 0x7f) << 7); + if (len > 2) + { + rv |= ((data[2] & 0x7f) << 14); + if (len > 3) + { + rv |= ((data[3] & 0x7f) << 21); + if (len > 4) + rv |= (data[4] << 28); + } + } + } + return rv; +} +static inline uint32_t +parse_int32 (unsigned len, const uint8_t *data) +{ + return parse_uint32 (len, data); +} +static inline int32_t +unzigzag32 (uint32_t v) +{ + if (v&1) + return -(v>>1) - 1; + else + return v>>1; +} +static inline uint32_t +parse_fixed_uint32 (const uint8_t *data) +{ +#if IS_LITTLE_ENDIAN + uint32_t t; + memcpy (&t, data, 4); + return t; +#else + return data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); +#endif +} +static uint64_t +parse_uint64 (unsigned len, const uint8_t *data) +{ + unsigned shift, i; + if (len < 5) + return parse_uint32 (len, data); + uint64_t rv = ((data[0] & 0x7f)) + | ((data[1] & 0x7f)<<7) + | ((data[2] & 0x7f)<<14) + | ((data[3] & 0x7f)<<21); + shift = 28; + for (i = 4; i < len; i++) + { + rv |= (((uint64_t)(data[i]&0x7f)) << shift); + shift += 7; + } + return rv; +} +static inline int64_t +unzigzag64 (uint64_t v) +{ + if (v&1) + return -(v>>1) - 1; + else + return v>>1; +} +static inline uint64_t +parse_fixed_uint64 (const uint8_t *data) +{ +#if IS_LITTLE_ENDIAN + uint64_t t; + memcpy (&t, data, 8); + return t; +#else + return (uint64_t)parse_fixed_uint32 (data) + | (((uint64_t)parse_fixed_uint32(data+4)) << 32); +#endif +} +static protobuf_c_boolean +parse_boolean (unsigned len, const uint8_t *data) +{ + unsigned i; + for (i = 0; i < len; i++) + if (data[i] & 0x7f) + return 1; + return 0; +} +static protobuf_c_boolean +parse_required_member (ScannedMember *scanned_member, + void *member, + ProtobufCAllocator *allocator, + protobuf_c_boolean maybe_clear) +{ + unsigned len = scanned_member->len; + const uint8_t *data = scanned_member->data; + ProtobufCWireType wire_type = scanned_member->wire_type; + switch (scanned_member->field->type) + { + case PROTOBUF_C_TYPE_INT32: + if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT) + return 0; + *(uint32_t*)member = parse_int32 (len, data); + return 1; + case PROTOBUF_C_TYPE_UINT32: + if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT) + return 0; + *(uint32_t*)member = parse_uint32 (len, data); + return 1; + case PROTOBUF_C_TYPE_SINT32: + if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT) + return 0; + *(int32_t*)member = unzigzag32 (parse_uint32 (len, data)); + return 1; + case PROTOBUF_C_TYPE_SFIXED32: + case PROTOBUF_C_TYPE_FIXED32: + case PROTOBUF_C_TYPE_FLOAT: + if (wire_type != PROTOBUF_C_WIRE_TYPE_32BIT) + return 0; + *(uint32_t*)member = parse_fixed_uint32 (data); + return 1; + + case PROTOBUF_C_TYPE_INT64: + case PROTOBUF_C_TYPE_UINT64: + if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT) + return 0; + *(uint64_t*)member = parse_uint64 (len, data); + return 1; + case PROTOBUF_C_TYPE_SINT64: + if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT) + return 0; + *(int64_t*)member = unzigzag64 (parse_uint64 (len, data)); + return 1; + case PROTOBUF_C_TYPE_SFIXED64: + case PROTOBUF_C_TYPE_FIXED64: + case PROTOBUF_C_TYPE_DOUBLE: + if (wire_type != PROTOBUF_C_WIRE_TYPE_64BIT) + return 0; + *(uint64_t*)member = parse_fixed_uint64 (data); + return 1; + + case PROTOBUF_C_TYPE_BOOL: + *(protobuf_c_boolean*)member = parse_boolean (len, data); + return 1; + + case PROTOBUF_C_TYPE_ENUM: + if (wire_type != PROTOBUF_C_WIRE_TYPE_VARINT) + return 0; + *(uint32_t*)member = parse_uint32 (len, data); + return 1; + + case PROTOBUF_C_TYPE_STRING: + if (wire_type != PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED) + return 0; + { + char **pstr = member; + unsigned pref_len = scanned_member->length_prefix_len; + if (maybe_clear && *pstr != NULL) + { + const char *def = scanned_member->field->default_value; + if (*pstr != NULL && *pstr != def) + FREE (allocator, *pstr); + } + DO_ALLOC (*pstr, allocator, len - pref_len + 1, return 0); + memcpy (*pstr, data + pref_len, len - pref_len); + (*pstr)[len-pref_len] = 0; + return 1; + } + case PROTOBUF_C_TYPE_BYTES: + if (wire_type != PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED) + return 0; + { + ProtobufCBinaryData *bd = member; + const ProtobufCBinaryData *def_bd; + unsigned pref_len = scanned_member->length_prefix_len; + def_bd = scanned_member->field->default_value; + if (maybe_clear && bd->data != NULL && bd->data != def_bd->data) + FREE (allocator, bd->data); + DO_ALLOC (bd->data, allocator, len - pref_len, return 0); + memcpy (bd->data, data + pref_len, len - pref_len); + bd->len = len - pref_len; + return 1; + } + //case PROTOBUF_C_TYPE_GROUP, // NOT SUPPORTED + case PROTOBUF_C_TYPE_MESSAGE: + if (wire_type != PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED) + return 0; + { + ProtobufCMessage **pmessage = member; + ProtobufCMessage *subm; + const ProtobufCMessage *def_mess; + unsigned pref_len = scanned_member->length_prefix_len; + def_mess = scanned_member->field->default_value; + if (maybe_clear && *pmessage != NULL && *pmessage != def_mess) + protobuf_c_message_free_unpacked (*pmessage, allocator); + subm = protobuf_c_message_unpack (scanned_member->field->descriptor, + allocator, + len - pref_len, data + pref_len); + *pmessage = subm; /* since we freed the message we must clear the field, even if NULL */ + if (subm == NULL) + return 0; + return 1; + } + } + return 0; +} + +static protobuf_c_boolean +parse_optional_member (ScannedMember *scanned_member, + void *member, + ProtobufCMessage *message, + ProtobufCAllocator *allocator) +{ + if (!parse_required_member (scanned_member, member, allocator, TRUE)) + return 0; + if (scanned_member->field->quantifier_offset != 0) + STRUCT_MEMBER (protobuf_c_boolean, + message, + scanned_member->field->quantifier_offset) = 1; + return 1; +} + +static protobuf_c_boolean +parse_repeated_member (ScannedMember *scanned_member, + void *member, + ProtobufCMessage *message, + ProtobufCAllocator *allocator) +{ + const ProtobufCFieldDescriptor *field = scanned_member->field; + size_t *p_n = STRUCT_MEMBER_PTR(size_t, message, field->quantifier_offset); + size_t siz = sizeof_elt_in_repeated_array (field->type); + char *array = *(char**)member; + if (!parse_required_member (scanned_member, + array + siz * (*p_n), + allocator, + FALSE)) + return 0; + *p_n += 1; + return 1; +} + +static unsigned scan_varint (unsigned len, const uint8_t *data) +{ + unsigned i; + if (len > 10) + len = 10; + for (i = 0; i < len; i++) + if ((data[i] & 0x80) == 0) + break; + if (i == len) + return 0; + return i + 1; +} + +static protobuf_c_boolean +parse_packed_repeated_member (ScannedMember *scanned_member, + void *member, + ProtobufCMessage *message) +{ + const ProtobufCFieldDescriptor *field = scanned_member->field; + size_t *p_n = STRUCT_MEMBER_PTR(size_t, message, field->quantifier_offset); + size_t siz = sizeof_elt_in_repeated_array (field->type); + char *array = *(char**)member + siz * (*p_n); + const uint8_t *at = scanned_member->data + scanned_member->length_prefix_len; + size_t rem = scanned_member->len - scanned_member->length_prefix_len; + size_t count = 0; + unsigned i; + switch (field->type) + { + case PROTOBUF_C_TYPE_SFIXED32: + case PROTOBUF_C_TYPE_FIXED32: + case PROTOBUF_C_TYPE_FLOAT: + count = (scanned_member->len - scanned_member->length_prefix_len) / 4; +#if IS_LITTLE_ENDIAN + goto no_unpacking_needed; +#else + for (i = 0; i < count; i++) + { + ((uint32_t*)array)[i] = parse_fixed_uint32 (at); + at += 4; + } +#endif + break; + case PROTOBUF_C_TYPE_SFIXED64: + case PROTOBUF_C_TYPE_FIXED64: + case PROTOBUF_C_TYPE_DOUBLE: + count = (scanned_member->len - scanned_member->length_prefix_len) / 8; +#if IS_LITTLE_ENDIAN + goto no_unpacking_needed; +#else + for (i = 0; i < count; i++) + { + ((uint64_t*)array)[i] = parse_fixed_uint64 (at); + at += 8; + } + break; +#endif + case PROTOBUF_C_TYPE_INT32: + while (rem > 0) + { + unsigned s = scan_varint (rem, at); + if (s == 0) + { + UNPACK_ERROR (("bad packed-repeated int32 value")); + return FALSE; + } + ((int32_t*)array)[count++] = parse_int32 (s, at); + at += s; + rem -= s; + } + break; + + case PROTOBUF_C_TYPE_SINT32: + while (rem > 0) + { + unsigned s = scan_varint (rem, at); + if (s == 0) + { + UNPACK_ERROR (("bad packed-repeated sint32 value")); + return FALSE; + } + ((int32_t*)array)[count++] = unzigzag32 (parse_uint32 (s, at)); + at += s; + rem -= s; + } + break; + case PROTOBUF_C_TYPE_ENUM: + case PROTOBUF_C_TYPE_UINT32: + while (rem > 0) + { + unsigned s = scan_varint (rem, at); + if (s == 0) + { + UNPACK_ERROR (("bad packed-repeated enum or uint32 value")); + return FALSE; + } + ((uint32_t*)array)[count++] = parse_uint32 (s, at); + at += s; + rem -= s; + } + break; + + case PROTOBUF_C_TYPE_SINT64: + while (rem > 0) + { + unsigned s = scan_varint (rem, at); + if (s == 0) + { + UNPACK_ERROR (("bad packed-repeated sint64 value")); + return FALSE; + } + ((int64_t*)array)[count++] = unzigzag64 (parse_uint64 (s, at)); + at += s; + rem -= s; + } + break; + case PROTOBUF_C_TYPE_INT64: + case PROTOBUF_C_TYPE_UINT64: + while (rem > 0) + { + unsigned s = scan_varint (rem, at); + if (s == 0) + { + UNPACK_ERROR (("bad packed-repeated int64/uint64 value")); + return FALSE; + } + ((int64_t*)array)[count++] = parse_uint64 (s, at); + at += s; + rem -= s; + } + break; + case PROTOBUF_C_TYPE_BOOL: + count = rem; + for (i = 0; i < count; i++) + { + if (at[i] > 1) + { + UNPACK_ERROR (("bad packed-repeated boolean value")); + return FALSE; + } + ((protobuf_c_boolean*)array)[i] = at[i]; + } + break; + default: + assert(0); + } + *p_n += count; + return TRUE; + +no_unpacking_needed: + memcpy (array, at, count * siz); + *p_n += count; + return TRUE; +} + +static protobuf_c_boolean +parse_member (ScannedMember *scanned_member, + ProtobufCMessage *message, + ProtobufCAllocator *allocator) +{ + const ProtobufCFieldDescriptor *field = scanned_member->field; + void *member; + if (field == NULL) + { + ProtobufCMessageUnknownField *ufield = message->unknown_fields + (message->n_unknown_fields++); + ufield->tag = scanned_member->tag; + ufield->wire_type = scanned_member->wire_type; + ufield->len = scanned_member->len; + DO_UNALIGNED_ALLOC (ufield->data, allocator, scanned_member->len, return 0); + memcpy (ufield->data, scanned_member->data, ufield->len); + return 1; + } + member = (char*)message + field->offset; + switch (field->label) + { + case PROTOBUF_C_LABEL_REQUIRED: + return parse_required_member (scanned_member, member, allocator, TRUE); + case PROTOBUF_C_LABEL_OPTIONAL: + return parse_optional_member (scanned_member, member, message, allocator); + case PROTOBUF_C_LABEL_REPEATED: + if (field->packed + && scanned_member->wire_type == PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED) + return parse_packed_repeated_member (scanned_member, member, message); + else + return parse_repeated_member (scanned_member, member, message, allocator); + } + PROTOBUF_C_ASSERT_NOT_REACHED (); + return 0; +} + + +/* TODO: expose/use this function if desc->message_init==NULL + (which occurs for old code, and may be useful for certain + programatic techniques for generating descriptors). */ +void +protobuf_c_message_init_generic (const ProtobufCMessageDescriptor *desc, + ProtobufCMessage *message) +{ + unsigned i; + memset (message, 0, desc->sizeof_message); + message->descriptor = desc; + for (i = 0; i < desc->n_fields; i++) + if (desc->fields[i].default_value != NULL + && desc->fields[i].label != PROTOBUF_C_LABEL_REPEATED) + { + void *field = STRUCT_MEMBER_P (message, desc->fields[i].offset); + const void *dv = desc->fields[i].default_value; + switch (desc->fields[i].type) + { + case PROTOBUF_C_TYPE_INT32: + case PROTOBUF_C_TYPE_SINT32: + case PROTOBUF_C_TYPE_SFIXED32: + case PROTOBUF_C_TYPE_UINT32: + case PROTOBUF_C_TYPE_FIXED32: + case PROTOBUF_C_TYPE_FLOAT: + case PROTOBUF_C_TYPE_ENUM: + memcpy (field, dv, 4); + break; + + case PROTOBUF_C_TYPE_INT64: + case PROTOBUF_C_TYPE_SINT64: + case PROTOBUF_C_TYPE_SFIXED64: + case PROTOBUF_C_TYPE_UINT64: + case PROTOBUF_C_TYPE_FIXED64: + case PROTOBUF_C_TYPE_DOUBLE: + memcpy (field, dv, 8); + break; + + case PROTOBUF_C_TYPE_BOOL: + memcpy (field, dv, sizeof (protobuf_c_boolean)); + break; + + case PROTOBUF_C_TYPE_BYTES: + memcpy (field, dv, sizeof (ProtobufCBinaryData)); + break; + + case PROTOBUF_C_TYPE_STRING: + case PROTOBUF_C_TYPE_MESSAGE: + /* the next line essentially implements a cast from const, + which is totally unavoidable. */ + *(const void**)field = dv; + break; + } + } +} + +/* ScannedMember slabs (an unpacking implementation detail). + Before doing real unpacking, we first scan through the + elements to see how many there are (for repeated fields), + and which field to use (for non-repeated fields given twice). + + * In order to avoid allocations for small messages, + we keep a stack-allocated slab of ScannedMembers of + size FIRST_SCANNED_MEMBER_SLAB_SIZE (16). + After we fill that up, we allocate each slab twice + as large as the previous one. */ +#define FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2 4 + +/* The number of slabs, including the stack-allocated ones; + choose the number so that we would overflow if we needed + a slab larger than provided. */ +#define MAX_SCANNED_MEMBER_SLAB \ + (sizeof(void*)*8 - 1 \ + - BOUND_SIZEOF_SCANNED_MEMBER_LOG2 \ + - FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2) + +ProtobufCMessage * +protobuf_c_message_unpack (const ProtobufCMessageDescriptor *desc, + ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + ProtobufCMessage *rv; + size_t rem = len; + const uint8_t *at = data; + const ProtobufCFieldDescriptor *last_field = desc->fields + 0; + ScannedMember first_member_slab[1<n_fields + word_bits - 1) / word_bits; + required_fields_bitmap = alloca(required_fields_bitmap_len * sizeof(long)); + memset(required_fields_bitmap, 0, required_fields_bitmap_len * sizeof(long)); + + DO_ALLOC (rv, allocator, desc->sizeof_message, return NULL); + scanned_member_slabs[0] = first_member_slab; + + /* Generated code always defines "message_init". + However, we provide a fallback for (1) users of old protobuf-c + generated-code that do not provide the function, + and (2) descriptors constructed from some other source + (most likely, direct construction from the .proto file) */ + if (desc->message_init != NULL) + protobuf_c_message_init (desc, rv); + else + protobuf_c_message_init_generic (desc, rv); + + while (rem > 0) + { + uint32_t tag; + ProtobufCWireType wire_type; + size_t used = parse_tag_and_wiretype (rem, at, &tag, &wire_type); + const ProtobufCFieldDescriptor *field; + ScannedMember tmp; + if (used == 0) + { + UNPACK_ERROR (("error parsing tag/wiretype at offset %u", + (unsigned)(at-data))); + goto error_cleanup_during_scan; + } + /* XXX: consider optimizing for field[1].id == tag, if field[1] exists! */ + if (last_field->id != tag) + { + /* lookup field */ + int field_index = int_range_lookup (desc->n_field_ranges, + desc->field_ranges, + tag); + if (field_index < 0) + { + field = NULL; + n_unknown++; + } + else + { + field = desc->fields + field_index; + last_field = field; + last_field_index = field_index; + } + } + else + field = last_field; + + if (field != NULL && field->label == PROTOBUF_C_LABEL_REQUIRED) + required_fields_bitmap[last_field_index / word_bits] |= (1UL << (last_field_index % word_bits)); + + at += used; + rem -= used; + tmp.tag = tag; + tmp.wire_type = wire_type; + tmp.field = field; + tmp.data = at; + switch (wire_type) + { + case PROTOBUF_C_WIRE_TYPE_VARINT: + { + unsigned max_len = rem < 10 ? rem : 10; + unsigned i; + for (i = 0; i < max_len; i++) + if ((at[i] & 0x80) == 0) + break; + if (i == max_len) + { + UNPACK_ERROR (("unterminated varint at offset %u", + (unsigned)(at-data))); + goto error_cleanup_during_scan; + } + tmp.len = i + 1; + } + break; + case PROTOBUF_C_WIRE_TYPE_64BIT: + if (rem < 8) + { + UNPACK_ERROR (("too short after 64bit wiretype at offset %u", + (unsigned)(at-data))); + goto error_cleanup_during_scan; + } + tmp.len = 8; + break; + case PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED: + { + size_t pref_len; + tmp.len = scan_length_prefixed_data (rem, at, &pref_len); + if (tmp.len == 0) + { + /* NOTE: scan_length_prefixed_data calls UNPACK_ERROR */ + goto error_cleanup_during_scan; + } + tmp.length_prefix_len = pref_len; + break; + } + case PROTOBUF_C_WIRE_TYPE_32BIT: + if (rem < 4) + { + UNPACK_ERROR (("too short after 32bit wiretype at offset %u", + (unsigned)(at-data))); + goto error_cleanup_during_scan; + } + tmp.len = 4; + break; + default: + UNPACK_ERROR (("unsupported tag %u at offset %u", + wire_type, (unsigned)(at-data))); + goto error_cleanup_during_scan; + } + if (in_slab_index == (1U<<(which_slab+FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2))) + { + size_t size; + in_slab_index = 0; + if (which_slab == MAX_SCANNED_MEMBER_SLAB) + { + UNPACK_ERROR (("too many fields")); + goto error_cleanup_during_scan; + } + which_slab++; + size = sizeof(ScannedMember) << (which_slab+FIRST_SCANNED_MEMBER_SLAB_SIZE_LOG2); + /* TODO: consider using alloca() ! */ + if (allocator->tmp_alloc != NULL) + scanned_member_slabs[which_slab] = TMPALLOC(allocator, size); + else + DO_ALLOC (scanned_member_slabs[which_slab], allocator, size, goto error_cleanup_during_scan); + } + scanned_member_slabs[which_slab][in_slab_index++] = tmp; + + if (field != NULL && field->label == PROTOBUF_C_LABEL_REPEATED) + { + size_t *n = STRUCT_MEMBER_PTR (size_t, rv, field->quantifier_offset); + if (field->packed + && wire_type == PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED) + { + size_t count; + if (!count_packed_elements (field->type, + tmp.len - tmp.length_prefix_len, + tmp.data + tmp.length_prefix_len, + &count)) + { + UNPACK_ERROR (("counting packed elements")); + goto error_cleanup_during_scan; + } + *n += count; + } + else + *n += 1; + } + + at += tmp.len; + rem -= tmp.len; + } + + /* allocate space for repeated fields, also check that all required fields have been set */ + for (f = 0; f < desc->n_fields; f++) + { + const ProtobufCFieldDescriptor *field = desc->fields + f; + if (field->label == PROTOBUF_C_LABEL_REPEATED) + { + size_t siz = sizeof_elt_in_repeated_array (field->type); + size_t *n_ptr = STRUCT_MEMBER_PTR (size_t, rv, field->quantifier_offset); + if (*n_ptr != 0) + { + unsigned n = *n_ptr; + *n_ptr = 0; + assert(rv->descriptor != NULL); +#define CLEAR_REMAINING_N_PTRS() \ + for(f++;f < desc->n_fields; f++) \ + { \ + field = desc->fields + f; \ + if (field->label == PROTOBUF_C_LABEL_REPEATED) \ + STRUCT_MEMBER (size_t, rv, field->quantifier_offset) = 0; \ + } + DO_ALLOC (STRUCT_MEMBER (void *, rv, field->offset), + allocator, siz * n, + CLEAR_REMAINING_N_PTRS (); goto error_cleanup); +#undef CLEAR_REMAINING_N_PTRS + } + } + else if (field->label == PROTOBUF_C_LABEL_REQUIRED) + { + if (field->default_value == NULL && 0 == (required_fields_bitmap[f / word_bits] & (1UL << (f % word_bits)))) + { + UNPACK_ERROR (("message '%s': missing required field '%s'", desc->name, field->name)); + goto error_cleanup; + } + } + } + + /* allocate space for unknown fields */ + if (n_unknown) + { + DO_ALLOC (rv->unknown_fields, + allocator, n_unknown * sizeof (ProtobufCMessageUnknownField), + goto error_cleanup); + } + + /* do real parsing */ + for (i_slab = 0; i_slab <= which_slab; i_slab++) + { + unsigned max = (i_slab == which_slab) ? in_slab_index : (1U<<(i_slab+4)); + ScannedMember *slab = scanned_member_slabs[i_slab]; + unsigned j; + for (j = 0; j < max; j++) + { + if (!parse_member (slab + j, rv, allocator)) + { + UNPACK_ERROR (("error parsing member %s of %s", + slab->field ? slab->field->name : "*unknown-field*", desc->name)); + goto error_cleanup; + } + } + } + + /* cleanup */ + if (allocator->tmp_alloc == NULL) + { + unsigned j; + for (j = 1; j <= which_slab; j++) + FREE (allocator, scanned_member_slabs[j]); + } + + return rv; + +error_cleanup: + protobuf_c_message_free_unpacked (rv, allocator); + if (allocator->tmp_alloc == NULL) + { + unsigned j; + for (j = 1; j <= which_slab; j++) + FREE (allocator, scanned_member_slabs[j]); + } + return NULL; + +error_cleanup_during_scan: + FREE (allocator, rv); + if (allocator->tmp_alloc == NULL) + { + unsigned j; + for (j = 1; j <= which_slab; j++) + FREE (allocator, scanned_member_slabs[j]); + } + return NULL; +} + +/* === free_unpacked === */ +void +protobuf_c_message_free_unpacked (ProtobufCMessage *message, + ProtobufCAllocator *allocator) +{ + const ProtobufCMessageDescriptor *desc = message->descriptor; + unsigned f; + ASSERT_IS_MESSAGE (message); + if (allocator == NULL) + allocator = &protobuf_c_default_allocator; + message->descriptor = NULL; + for (f = 0; f < desc->n_fields; f++) + { + if (desc->fields[f].label == PROTOBUF_C_LABEL_REPEATED) + { + size_t n = STRUCT_MEMBER (size_t, message, desc->fields[f].quantifier_offset); + void * arr = STRUCT_MEMBER (void *, message, desc->fields[f].offset); + if (desc->fields[f].type == PROTOBUF_C_TYPE_STRING) + { + unsigned i; + for (i = 0; i < n; i++) + FREE (allocator, ((char**)arr)[i]); + } + else if (desc->fields[f].type == PROTOBUF_C_TYPE_BYTES) + { + unsigned i; + for (i = 0; i < n; i++) + FREE (allocator, ((ProtobufCBinaryData*)arr)[i].data); + } + else if (desc->fields[f].type == PROTOBUF_C_TYPE_MESSAGE) + { + unsigned i; + for (i = 0; i < n; i++) + protobuf_c_message_free_unpacked (((ProtobufCMessage**)arr)[i], allocator); + } + if (arr != NULL) + FREE (allocator, arr); + } + else if (desc->fields[f].type == PROTOBUF_C_TYPE_STRING) + { + char *str = STRUCT_MEMBER (char *, message, desc->fields[f].offset); + if (str && str != desc->fields[f].default_value) + FREE (allocator, str); + } + else if (desc->fields[f].type == PROTOBUF_C_TYPE_BYTES) + { + void *data = STRUCT_MEMBER (ProtobufCBinaryData, message, desc->fields[f].offset).data; + const ProtobufCBinaryData *default_bd; + default_bd = desc->fields[f].default_value; + if (data != NULL + && (default_bd == NULL || default_bd->data != data)) + FREE (allocator, data); + } + else if (desc->fields[f].type == PROTOBUF_C_TYPE_MESSAGE) + { + ProtobufCMessage *sm; + sm = STRUCT_MEMBER (ProtobufCMessage *, message,desc->fields[f].offset); + if (sm && sm != desc->fields[f].default_value) + protobuf_c_message_free_unpacked (sm, allocator); + } + } + + for (f = 0; f < message->n_unknown_fields; f++) + FREE (allocator, message->unknown_fields[f].data); + if (message->unknown_fields != NULL) + FREE (allocator, message->unknown_fields); + + FREE (allocator, message); +} + +/* === services === */ +typedef void (*GenericHandler)(void *service, + const ProtobufCMessage *input, + ProtobufCClosure closure, + void *closure_data); +void +protobuf_c_service_invoke_internal(ProtobufCService *service, + unsigned method_index, + const ProtobufCMessage *input, + ProtobufCClosure closure, + void *closure_data) +{ + GenericHandler *handlers; + GenericHandler handler; + + /* Verify that method_index is within range. + If this fails, you are likely invoking a newly added + method on an old service. (Although other memory corruption + bugs can cause this assertion too) */ + PROTOBUF_C_ASSERT (method_index < service->descriptor->n_methods); + + /* Get the array of virtual methods (which are enumerated by + the generated code) */ + handlers = (GenericHandler *) (service + 1); + + /* get our method and invoke it */ + /* TODO: seems like handler==NULL is a situation that + needs handling */ + handler = handlers[method_index]; + (*handler) (service, input, closure, closure_data); +} + +void +protobuf_c_service_generated_init (ProtobufCService *service, + const ProtobufCServiceDescriptor *descriptor, + ProtobufCServiceDestroy destroy) +{ + ASSERT_IS_SERVICE_DESCRIPTOR(descriptor); + service->descriptor = descriptor; + service->destroy = destroy; + service->invoke = protobuf_c_service_invoke_internal; + memset (service + 1, 0, descriptor->n_methods * sizeof (GenericHandler)); +} + +void protobuf_c_service_destroy (ProtobufCService *service) +{ + service->destroy (service); +} + +/* --- querying the descriptors --- */ +const ProtobufCEnumValue * +protobuf_c_enum_descriptor_get_value_by_name + (const ProtobufCEnumDescriptor *desc, + const char *name) +{ + unsigned start = 0, count = desc->n_value_names; + while (count > 1) + { + unsigned mid = start + count / 2; + int rv = strcmp (desc->values_by_name[mid].name, name); + if (rv == 0) + return desc->values + desc->values_by_name[mid].index; + else if (rv < 0) + { + count = start + count - (mid + 1); + start = mid + 1; + } + else + count = mid - start; + } + if (count == 0) + return NULL; + if (strcmp (desc->values_by_name[start].name, name) == 0) + return desc->values + desc->values_by_name[start].index; + return NULL; +} +const ProtobufCEnumValue * +protobuf_c_enum_descriptor_get_value + (const ProtobufCEnumDescriptor *desc, + int value) +{ + int rv = int_range_lookup (desc->n_value_ranges, desc->value_ranges, value); + if (rv < 0) + return NULL; + return desc->values + rv; +} + +const ProtobufCFieldDescriptor * +protobuf_c_message_descriptor_get_field_by_name + (const ProtobufCMessageDescriptor *desc, + const char *name) +{ + unsigned start = 0, count = desc->n_fields; + const ProtobufCFieldDescriptor *field; + while (count > 1) + { + unsigned mid = start + count / 2; + int rv; + field = desc->fields + desc->fields_sorted_by_name[mid]; + rv = strcmp (field->name, name); + if (rv == 0) + return field; + else if (rv < 0) + { + count = start + count - (mid + 1); + start = mid + 1; + } + else + count = mid - start; + } + if (count == 0) + return NULL; + field = desc->fields + desc->fields_sorted_by_name[start]; + if (strcmp (field->name, name) == 0) + return field; + return NULL; +} + +const ProtobufCFieldDescriptor * +protobuf_c_message_descriptor_get_field + (const ProtobufCMessageDescriptor *desc, + unsigned value) +{ + int rv = int_range_lookup (desc->n_field_ranges, + desc->field_ranges, + value); + if (rv < 0) + return NULL; + return desc->fields + rv; +} + +const ProtobufCMethodDescriptor * +protobuf_c_service_descriptor_get_method_by_name + (const ProtobufCServiceDescriptor *desc, + const char *name) +{ + unsigned start = 0, count = desc->n_methods; + while (count > 1) + { + unsigned mid = start + count / 2; + unsigned mid_index = desc->method_indices_by_name[mid]; + const char *mid_name = desc->methods[mid_index].name; + int rv = strcmp (mid_name, name); + if (rv == 0) + return desc->methods + desc->method_indices_by_name[mid]; + if (rv < 0) + { + count = start + count - (mid + 1); + start = mid + 1; + } + else + { + count = mid - start; + } + } + if (count == 0) + return NULL; + if (strcmp (desc->methods[desc->method_indices_by_name[start]].name, name) == 0) + return desc->methods + desc->method_indices_by_name[start]; + return NULL; +} diff --git a/navit/maptool/google/protobuf-c/protobuf-c.h b/navit/maptool/google/protobuf-c/protobuf-c.h new file mode 100644 index 0000000..98bd77b --- /dev/null +++ b/navit/maptool/google/protobuf-c/protobuf-c.h @@ -0,0 +1,444 @@ +/* --- protobuf-c.h: public protobuf c runtime api --- */ + +/* + * Copyright 2008, Dave Benson. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with + * the License. You may obtain a copy of the License + * at http://www.apache.org/licenses/LICENSE-2.0 Unless + * required by applicable law or agreed to in writing, + * software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#ifndef __PROTOBUF_C_RUNTIME_H_ +#define __PROTOBUF_C_RUNTIME_H_ + +#include +#include + +#ifdef __cplusplus +# define PROTOBUF_C_BEGIN_DECLS extern "C" { +# define PROTOBUF_C_END_DECLS } +#else +# define PROTOBUF_C_BEGIN_DECLS +# define PROTOBUF_C_END_DECLS +#endif + +#if !defined(PROTOBUF_C_NO_DEPRECATED) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +#define PROTOBUF_C_DEPRECATED __attribute__((__deprecated__)) +#else +#define PROTOBUF_C_DEPRECATED +#endif + +/* Define int32_t, int64_t, uint32_t, uint64_t, uint8_t. + + Usually, just include to do the work. + XXX: should we use stdint.h? + */ +#ifndef PROTOBUF_C_SKIP_INTTYPES_H +# if defined(_MSC_VER) + /* On windows, in ms visual studio, define the types ourselves */ +# define int32_t signed __int32 +# define uint32_t unsigned __int32 +# define int64_t signed __int64 +# define uint64_t unsigned __int64 +# define uint8_t unsigned char +# else + /* Use the system inttypes.h */ +# include +# endif +#endif + +PROTOBUF_C_BEGIN_DECLS + +typedef enum +{ + PROTOBUF_C_LABEL_REQUIRED, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_LABEL_REPEATED +} ProtobufCLabel; + +typedef enum +{ + PROTOBUF_C_TYPE_INT32, + PROTOBUF_C_TYPE_SINT32, + PROTOBUF_C_TYPE_SFIXED32, + PROTOBUF_C_TYPE_INT64, + PROTOBUF_C_TYPE_SINT64, + PROTOBUF_C_TYPE_SFIXED64, + PROTOBUF_C_TYPE_UINT32, + PROTOBUF_C_TYPE_FIXED32, + PROTOBUF_C_TYPE_UINT64, + PROTOBUF_C_TYPE_FIXED64, + PROTOBUF_C_TYPE_FLOAT, + PROTOBUF_C_TYPE_DOUBLE, + PROTOBUF_C_TYPE_BOOL, + PROTOBUF_C_TYPE_ENUM, + PROTOBUF_C_TYPE_STRING, + PROTOBUF_C_TYPE_BYTES, + //PROTOBUF_C_TYPE_GROUP, // NOT SUPPORTED + PROTOBUF_C_TYPE_MESSAGE, +} ProtobufCType; + +typedef int protobuf_c_boolean; +#define PROTOBUF_C_OFFSETOF(struct, member) offsetof(struct, member) + +#define PROTOBUF_C_ASSERT(condition) assert(condition) +#define PROTOBUF_C_ASSERT_NOT_REACHED() assert(0) + +typedef struct _ProtobufCBinaryData ProtobufCBinaryData; +struct _ProtobufCBinaryData +{ + size_t len; + uint8_t *data; +}; + +typedef struct _ProtobufCIntRange ProtobufCIntRange; /* private */ + +/* --- memory management --- */ +typedef struct _ProtobufCAllocator ProtobufCAllocator; +struct _ProtobufCAllocator +{ + void *(*alloc)(void *allocator_data, size_t size); + void (*free)(void *allocator_data, void *pointer); + void *(*tmp_alloc)(void *allocator_data, size_t size); + unsigned max_alloca; + void *allocator_data; +}; + +/* This is a configurable allocator. + * By default, it uses the system allocator (meaning malloc() and free()). + * This is typically changed to adapt to frameworks that provide + * some nonstandard allocation functions. + * + * NOTE: you may modify this allocator. + */ +extern ProtobufCAllocator protobuf_c_default_allocator; /* settable */ + +/* This is the system allocator, meaning it uses malloc() and free(). + * + * NOTE: please do NOT modify this allocator. + */ +extern ProtobufCAllocator protobuf_c_system_allocator; /* use malloc, free etc */ + +/* This is the function that our default allocators call when they + run out-of-memory. The default behavior of this function is to + terminate your program. */ +extern void (*protobuf_c_out_of_memory) (void); + +/* --- append-only data buffer --- */ +typedef struct _ProtobufCBuffer ProtobufCBuffer; +struct _ProtobufCBuffer +{ + void (*append)(ProtobufCBuffer *buffer, + size_t len, + const uint8_t *data); +}; +/* --- enums --- */ +typedef struct _ProtobufCEnumValue ProtobufCEnumValue; +typedef struct _ProtobufCEnumValueIndex ProtobufCEnumValueIndex; +typedef struct _ProtobufCEnumDescriptor ProtobufCEnumDescriptor; + +/* ProtobufCEnumValue: this represents a single value of + * an enumeration. + * 'name' is the string identifying this value, as given in the .proto file. + * 'c_name' is the full name of the C enumeration value. + * 'value' is the number assigned to this value, as given in the .proto file. + */ +struct _ProtobufCEnumValue +{ + const char *name; + const char *c_name; + int value; +}; + +/* ProtobufCEnumDescriptor: the represents the enum as a whole, + * with all its values. + * 'magic' is a code we check to ensure that the api is used correctly. + * 'name' is the qualified name (e.g. "namespace.Type"). + * 'short_name' is the unqualified name ("Type"), as given in the .proto file. + * 'package_name' is the '.'-separated namespace + * 'n_values' is the number of distinct values. + * 'values' is the array of distinct values. + * 'n_value_names' number of named values (including aliases). + * 'value_names' are the named values (including aliases). + * + * The rest of the values are private essentially. + * + * see also: Use protobuf_c_enum_descriptor_get_value_by_name() + * and protobuf_c_enum_descriptor_get_value() to efficiently + * lookup values in the descriptor. + */ +struct _ProtobufCEnumDescriptor +{ + uint32_t magic; + + const char *name; + const char *short_name; + const char *c_name; + const char *package_name; + + /* sorted by value */ + unsigned n_values; + const ProtobufCEnumValue *values; + + /* sorted by name */ + unsigned n_value_names; + const ProtobufCEnumValueIndex *values_by_name; + + /* value-ranges, for faster lookups by number */ + unsigned n_value_ranges; + const ProtobufCIntRange *value_ranges; + + void *reserved1; + void *reserved2; + void *reserved3; + void *reserved4; +}; + +/* --- messages --- */ +typedef struct _ProtobufCMessageDescriptor ProtobufCMessageDescriptor; +typedef struct _ProtobufCFieldDescriptor ProtobufCFieldDescriptor; +typedef struct _ProtobufCMessage ProtobufCMessage; +typedef void (*ProtobufCMessageInit)(ProtobufCMessage *); +/* ProtobufCFieldDescriptor: description of a single field + * in a message. + * 'name' is the name of the field, as given in the .proto file. + * 'id' is the code representing the field, as given in the .proto file. + * 'label' is one of PROTOBUF_C_LABEL_{REQUIRED,OPTIONAL,REPEATED} + * 'type' is the type of field. + * 'quantifier_offset' is the offset in bytes into the message's C structure + * for this member's "has_MEMBER" field (for optional members) or + * "n_MEMBER" field (for repeated members). + * 'offset' is the offset in bytes into the message's C structure + * for the member itself. + * 'descriptor' is a pointer to a ProtobufC{Enum,Message}Descriptor + * if type is PROTOBUF_C_TYPE_{ENUM,MESSAGE} respectively, + * otherwise NULL. + * 'default_value' is a pointer to a default value for this field, + * where allowed. + */ +struct _ProtobufCFieldDescriptor +{ + const char *name; + uint32_t id; + ProtobufCLabel label; + ProtobufCType type; + unsigned quantifier_offset; + unsigned offset; + const void *descriptor; /* for MESSAGE and ENUM types */ + const void *default_value; /* or NULL if no default-value */ + protobuf_c_boolean packed; + + unsigned reserved_flags; + void *reserved2; + void *reserved3; +}; +/* ProtobufCMessageDescriptor: description of a message. + * + * 'magic' is a code we check to ensure that the api is used correctly. + * 'name' is the qualified name (e.g. "namespace.Type"). + * 'short_name' is the unqualified name ("Type"), as given in the .proto file. + * 'c_name' is the c-formatted name of the structure + * 'package_name' is the '.'-separated namespace + * 'sizeof_message' is the size in bytes of the C structure + * representing an instance of this type of message. + * 'n_fields' is the number of known fields in this message. + * 'fields' is the fields sorted by id number. + * 'fields_sorted_by_name', 'n_field_ranges' and 'field_ranges' + * are used for looking up fields by name and id. (private) + */ +struct _ProtobufCMessageDescriptor +{ + uint32_t magic; + + const char *name; + const char *short_name; + const char *c_name; + const char *package_name; + + size_t sizeof_message; + + /* sorted by field-id */ + unsigned n_fields; + const ProtobufCFieldDescriptor *fields; + const unsigned *fields_sorted_by_name; + + /* ranges, optimization for looking up fields */ + unsigned n_field_ranges; + const ProtobufCIntRange *field_ranges; + + ProtobufCMessageInit message_init; + void *reserved1; + void *reserved2; + void *reserved3; +}; + + +/* ProtobufCMessage: an instance of a message. + * + * ProtobufCMessage is sort-of a lightweight + * base-class for all messages. + * + * In particular, ProtobufCMessage doesn't have + * any allocation policy associated with it. + * That's because it is common to create ProtobufCMessage's + * on the stack. In fact, we that's what we recommend + * for sending messages (because if you just allocate from the + * stack, then you can't really have a memory leak). + * + * This means that functions like protobuf_c_message_unpack() + * which return a ProtobufCMessage must be paired + * with a free function, like protobuf_c_message_free_unpacked(). + * + * 'descriptor' gives the locations and types of the members of message + * 'n_unknown_fields' is the number of fields we didn't recognize. + * 'unknown_fields' are fields we didn't recognize. + */ +typedef struct _ProtobufCMessageUnknownField ProtobufCMessageUnknownField; +struct _ProtobufCMessage +{ + const ProtobufCMessageDescriptor *descriptor; + unsigned n_unknown_fields; + ProtobufCMessageUnknownField *unknown_fields; +}; +#define PROTOBUF_C_MESSAGE_INIT(descriptor) { descriptor, 0, NULL } + +/* To pack a message: you have two options: + (1) you can compute the size of the message + using protobuf_c_message_get_packed_size() + then pass protobuf_c_message_pack() a buffer of + that length. + (2) Provide a virtual buffer (a ProtobufCBuffer) to + accept data as we scan through it. + */ +size_t protobuf_c_message_get_packed_size(const ProtobufCMessage *message); +size_t protobuf_c_message_pack (const ProtobufCMessage *message, + uint8_t *out); +size_t protobuf_c_message_pack_to_buffer (const ProtobufCMessage *message, + ProtobufCBuffer *buffer); + +ProtobufCMessage * + protobuf_c_message_unpack (const ProtobufCMessageDescriptor *, + ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void protobuf_c_message_free_unpacked (ProtobufCMessage *message, + ProtobufCAllocator *allocator); + +/* WARNING: 'message' must be a block of memory + of size descriptor->sizeof_message. */ +#define protobuf_c_message_init(descriptor, message) ((descriptor)->message_init((ProtobufCMessage*) (message))) + +/* --- services --- */ +typedef struct _ProtobufCMethodDescriptor ProtobufCMethodDescriptor; +typedef struct _ProtobufCServiceDescriptor ProtobufCServiceDescriptor; + +struct _ProtobufCMethodDescriptor +{ + const char *name; + const ProtobufCMessageDescriptor *input; + const ProtobufCMessageDescriptor *output; +}; +struct _ProtobufCServiceDescriptor +{ + uint32_t magic; + + const char *name; + const char *short_name; + const char *c_name; + const char *package; + unsigned n_methods; + const ProtobufCMethodDescriptor *methods; /* in order from .proto file */ + const unsigned *method_indices_by_name; +}; + +typedef struct _ProtobufCService ProtobufCService; +typedef void (*ProtobufCClosure)(const ProtobufCMessage *message, + void *closure_data); +struct _ProtobufCService +{ + const ProtobufCServiceDescriptor *descriptor; + void (*invoke)(ProtobufCService *service, + unsigned method_index, + const ProtobufCMessage *input, + ProtobufCClosure closure, + void *closure_data); + void (*destroy) (ProtobufCService *service); +}; + + +void protobuf_c_service_destroy (ProtobufCService *); + + +/* --- querying the descriptors --- */ +const ProtobufCEnumValue * +protobuf_c_enum_descriptor_get_value_by_name + (const ProtobufCEnumDescriptor *desc, + const char *name); +const ProtobufCEnumValue * +protobuf_c_enum_descriptor_get_value + (const ProtobufCEnumDescriptor *desc, + int value); +const ProtobufCFieldDescriptor * +protobuf_c_message_descriptor_get_field_by_name + (const ProtobufCMessageDescriptor *desc, + const char *name); +const ProtobufCFieldDescriptor * +protobuf_c_message_descriptor_get_field + (const ProtobufCMessageDescriptor *desc, + unsigned value); +const ProtobufCMethodDescriptor * +protobuf_c_service_descriptor_get_method_by_name + (const ProtobufCServiceDescriptor *desc, + const char *name); + +/* --- wire format enums --- */ +typedef enum +{ + PROTOBUF_C_WIRE_TYPE_VARINT, + PROTOBUF_C_WIRE_TYPE_64BIT, + PROTOBUF_C_WIRE_TYPE_LENGTH_PREFIXED, + PROTOBUF_C_WIRE_TYPE_START_GROUP, /* unsupported */ + PROTOBUF_C_WIRE_TYPE_END_GROUP, /* unsupported */ + PROTOBUF_C_WIRE_TYPE_32BIT +} ProtobufCWireType; + +/* --- unknown message fields --- */ +struct _ProtobufCMessageUnknownField +{ + uint32_t tag; + ProtobufCWireType wire_type; + size_t len; + uint8_t *data; +}; + +/* --- extra (superfluous) api: trivial buffer --- */ +typedef struct _ProtobufCBufferSimple ProtobufCBufferSimple; +struct _ProtobufCBufferSimple +{ + ProtobufCBuffer base; + size_t alloced; + size_t len; + uint8_t *data; + protobuf_c_boolean must_free_data; +}; +#define PROTOBUF_C_BUFFER_SIMPLE_INIT(array_of_bytes) \ +{ { protobuf_c_buffer_simple_append }, \ + sizeof(array_of_bytes), 0, (array_of_bytes), 0 } +#define PROTOBUF_C_BUFFER_SIMPLE_CLEAR(simp_buf) \ + do { if ((simp_buf)->must_free_data) \ + protobuf_c_default_allocator.free (&protobuf_c_default_allocator.allocator_data, (simp_buf)->data); } while (0) + +/* ====== private ====== */ +#include "protobuf-c-private.h" + + +PROTOBUF_C_END_DECLS + +#endif /* __PROTOBUF_C_RUNTIME_H_ */ diff --git a/navit/maptool/itembin.c b/navit/maptool/itembin.c new file mode 100644 index 0000000..f2dce72 --- /dev/null +++ b/navit/maptool/itembin.c @@ -0,0 +1,582 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "maptool.h" +#include "linguistics.h" +#include "file.h" +#include "debug.h" + + + +int +item_bin_read(struct item_bin *ib, FILE *in) +{ + if (fread(ib, 4, 1, in) == 0) + return 0; + if (!ib->len) + return 1; + if (fread((unsigned char *)ib+4, ib->len*4, 1, in)) + return 2; + return 0; +} + +void +item_bin_set_type(struct item_bin *ib, enum item_type type) +{ + ib->type=type; +} + +void +item_bin_init(struct item_bin *ib, enum item_type type) +{ + ib->clen=0; + ib->len=2; + item_bin_set_type(ib, type); +} + + +void +item_bin_add_coord(struct item_bin *ib, struct coord *c, int count) +{ + struct coord *c2=(struct coord *)(ib+1); + c2+=ib->clen/2; + memcpy(c2, c, count*sizeof(struct coord)); + ib->clen+=count*2; + ib->len+=count*2; +} + +void +item_bin_add_coord_reverse(struct item_bin *ib, struct coord *c, int count) +{ + int i; + for (i = count-1 ; i >= 0 ; i--) + item_bin_add_coord(ib, &c[i], 1); +} + +void +item_bin_bbox(struct item_bin *ib, struct rect *r) +{ + struct coord c; + item_bin_add_coord(ib, &r->l, 1); + c.x=r->h.x; + c.y=r->l.y; + item_bin_add_coord(ib, &c, 1); + item_bin_add_coord(ib, &r->h, 1); + c.x=r->l.x; + c.y=r->h.y; + item_bin_add_coord(ib, &c, 1); + item_bin_add_coord(ib, &r->l, 1); +} + +void +item_bin_copy_coord(struct item_bin *ib, struct item_bin *from, int dir) +{ + struct coord *c=(struct coord *)(from+1); + int i,count=from->clen/2; + if (dir >= 0) { + item_bin_add_coord(ib, c, count); + return; + } + for (i = 1 ; i <= count ; i++) + item_bin_add_coord(ib, &c[count-i], 1); +} + +void +item_bin_copy_attr(struct item_bin *ib, struct item_bin *from, enum attr_type attr) +{ + struct attr_bin *ab=item_bin_get_attr_bin(from, attr, NULL); + if (ab) + item_bin_add_attr_data(ib, ab->type, (void *)(ab+1), (ab->len-1)*4); +#include + assert(attr == attr_osm_wayid); + assert(item_bin_get_wayid(ib) == item_bin_get_wayid(from)); +} + +void +item_bin_add_coord_rect(struct item_bin *ib, struct rect *r) +{ + item_bin_add_coord(ib, &r->l, 1); + item_bin_add_coord(ib, &r->h, 1); +} + +int +attr_bin_write_data(struct attr_bin *ab, enum attr_type type, void *data, int size) +{ + int pad=(4-(size%4))%4; + ab->type=type; + memcpy(ab+1, data, size); + memset((unsigned char *)(ab+1)+size, 0, pad); + ab->len=(size+pad)/4+1; + return ab->len+1; +} + +int +attr_bin_write_attr(struct attr_bin *ab, struct attr *attr) +{ + return attr_bin_write_data(ab, attr->type, attr_data_get(attr), attr_data_size(attr)); +} + +void +item_bin_add_attr_data(struct item_bin *ib, enum attr_type type, void *data, int size) +{ + struct attr_bin *ab=(struct attr_bin *)((int *)ib+ib->len+1); + ib->len+=attr_bin_write_data(ab, type, data, size); +} + +void +item_bin_add_attr(struct item_bin *ib, struct attr *attr) +{ + struct attr_bin *ab=(struct attr_bin *)((int *)ib+ib->len+1); + if (ATTR_IS_GROUP(attr->type)) { + int i=0; + int *abptr; + ab->type=attr->type; + ab->len=1; + abptr=(int *)(ab+1); + while (attr->u.attrs[i].type) { + int size=attr_bin_write_attr((struct attr_bin *)abptr, &attr->u.attrs[i]); + ab->len+=size; + abptr+=size; + i++; + } + ib->len+=ab->len+1; + + } else + ib->len+=attr_bin_write_attr(ab, attr); + +} + +void +item_bin_remove_attr(struct item_bin *ib, void *ptr) +{ + unsigned char *s=(unsigned char *)ib; + unsigned char *e=s+(ib->len+1)*4; + s+=sizeof(struct item_bin)+ib->clen*4; + while (s < e) { + struct attr_bin *ab=(struct attr_bin *)s; + s+=(ab->len+1)*4; + if ((void *)(ab+1) == ptr) { + ib->len-=ab->len+1; + memmove(ab,s,e-s); + return; + } + } +} + +void +item_bin_add_attr_int(struct item_bin *ib, enum attr_type type, int val) +{ + struct attr attr; + attr.type=type; + attr.u.num=val; + item_bin_add_attr(ib, &attr); +} + +void * +item_bin_get_attr(struct item_bin *ib, enum attr_type type, void *last) +{ + unsigned char *s=(unsigned char *)ib; + unsigned char *e=s+(ib->len+1)*4; + s+=sizeof(struct item_bin)+ib->clen*4; + while (s < e) { + struct attr_bin *ab=(struct attr_bin *)s; + s+=(ab->len+1)*4; + if (ab->type == type && (void *)(ab+1) > last) { + return (ab+1); + } + } + return NULL; +} + +struct attr_bin * +item_bin_get_attr_bin(struct item_bin *ib, enum attr_type type, void *last) +{ + unsigned char *s=(unsigned char *)ib; + unsigned char *e=s+(ib->len+1)*4; + s+=sizeof(struct item_bin)+ib->clen*4; + while (s < e) { + struct attr_bin *ab=(struct attr_bin *)s; + s+=(ab->len+1)*4; + if (ab->type == type && (void *)(ab+1) > last) { + return ab; + } + } + return NULL; +} + +struct attr_bin * +item_bin_get_attr_bin_last(struct item_bin *ib) +{ + struct attr_bin *ab=NULL; + unsigned char *s=(unsigned char *)ib; + unsigned char *e=s+(ib->len+1)*4; + s+=sizeof(struct item_bin)+ib->clen*4; + while (s < e) { + ab=(struct attr_bin *)s; + s+=(ab->len+1)*4; + } + return ab; +} + +void +item_bin_add_attr_longlong(struct item_bin *ib, enum attr_type type, long long val) +{ + struct attr attr; + attr.type=type; + attr.u.num64=&val; + item_bin_add_attr(ib, &attr); +} + +void +item_bin_add_attr_string(struct item_bin *ib, enum attr_type type, char *str) +{ + struct attr attr; + if (! str) + return; + attr.type=type; + attr.u.str=str; + item_bin_add_attr(ib, &attr); +} + +void +item_bin_add_attr_range(struct item_bin *ib, enum attr_type type, short min, short max) +{ + struct attr attr; + attr.type=type; + attr.u.range.min=min; + attr.u.range.max=max; + item_bin_add_attr(ib, &attr); +} + +void +item_bin_write(struct item_bin *ib, FILE *out) +{ + fwrite(ib, (ib->len+1)*4, 1, out); +} + +struct item_bin * +item_bin_dup(struct item_bin *ib) +{ + int len=(ib->len+1)*4; + struct item_bin *ret=g_malloc(len); + memcpy(ret, ib, len); + + return ret; +} + +void +item_bin_write_range(struct item_bin *ib, FILE *out, int min, int max) +{ + struct range r; + + r.min=min; + r.max=max; + fwrite(&r, sizeof(r), 1, out); + item_bin_write(ib, out); +} + + +void +item_bin_write_clipped(struct item_bin *ib, struct tile_parameter *param, struct item_bin_sink *out) +{ + struct tile_data tile_data; + int i; + bbox((struct coord *)(ib+1), ib->clen/2, &tile_data.item_bbox); + tile_data.buffer[0]='\0'; + tile_data.tile_depth=tile(&tile_data.item_bbox, NULL, tile_data.buffer, param->max, param->overlap, &tile_data.tile_bbox); + if (tile_data.tile_depth == param->max || tile_data.tile_depth >= param->min) { + item_bin_write_to_sink(ib, out, &tile_data); + return; + } + for (i = 0 ; i < 4 ; i++) { + struct rect clip_rect; + tile_data.buffer[tile_data.tile_depth]='a'+i; + tile_data.buffer[tile_data.tile_depth+1]='\0'; + tile_bbox(tile_data.buffer, &clip_rect, param->overlap); + if (ib->type < type_area) + clip_line(ib, &clip_rect, param, out); + else + clip_polygon(ib, &clip_rect, param, out); + } +} + +static char * +coord_to_str(struct coord *c) +{ + int x=c->x; + int y=c->y; + char *sx=""; + char *sy=""; + if (x < 0) { + sx="-"; + x=-x; + } + if (y < 0) { + sy="-"; + y=-y; + } + return g_strdup_printf("%s0x%x %s0x%x",sx,x,sy,y); +} + +static void +dump_coord(struct coord *c, FILE *out) +{ + char *str=coord_to_str(c); + fprintf(out,"%s",str); + g_free(str); +} + + +void +item_bin_dump(struct item_bin *ib, FILE *out) +{ + struct coord *c; + struct attr_bin *a; + struct attr attr; + int *attr_start; + int *attr_end; + int i; + char *str; + + c=(struct coord *)(ib+1); + if (ib->type < type_line) { + dump_coord(c,out); + fprintf(out, " "); + } + attr_start=(int *)(ib+1)+ib->clen; + attr_end=(int *)ib+ib->len+1; + fprintf(out,"type=%s", item_to_name(ib->type)); + while (attr_start < attr_end) { + a=(struct attr_bin *)(attr_start); + attr_start+=a->len+1; + attr.type=a->type; + attr_data_set(&attr, (a+1)); + str=attr_to_text(&attr, NULL, 1); + fprintf(out," %s=\"%s\"", attr_to_name(a->type), str); + g_free(str); + } + fprintf(out," debug=\"length=%d\"", ib->len); + fprintf(out,"\n"); + if (ib->type >= type_line) { + for (i = 0 ; i < ib->clen/2 ; i++) { + dump_coord(c+i,out); + fprintf(out,"\n"); + } + } +} + +void +dump_itembin(struct item_bin *ib) +{ + item_bin_dump(ib, stdout); +} + +struct population_table { + enum item_type type; + int population; +}; + +static struct population_table town_population[] = { + {type_town_label_0e0,0}, + {type_town_label_1e0,1}, + {type_town_label_2e0,2}, + {type_town_label_5e0,5}, + {type_town_label_1e1,10}, + {type_town_label_2e1,20}, + {type_town_label_5e1,50}, + {type_town_label_1e2,100}, + {type_town_label_2e2,200}, + {type_town_label_5e2,500}, + {type_town_label_1e3,1000}, + {type_town_label_2e3,2000}, + {type_town_label_5e3,5000}, + {type_town_label_1e4,10000}, + {type_town_label_2e4,20000}, + {type_town_label_5e4,50000}, + {type_town_label_1e5,100000}, + {type_town_label_2e5,200000}, + {type_town_label_5e5,500000}, + {type_town_label_1e6,1000000}, + {type_town_label_2e6,2000000}, + {type_town_label_5e6,5000000}, + {type_town_label_1e7,10000000}, +}; + +static struct population_table district_population[] = { + {type_district_label_0e0,0}, + {type_district_label_1e0,1}, + {type_district_label_2e0,2}, + {type_district_label_5e0,5}, + {type_district_label_1e1,10}, + {type_district_label_2e1,20}, + {type_district_label_5e1,50}, + {type_district_label_1e2,100}, + {type_district_label_2e2,200}, + {type_district_label_5e2,500}, + {type_district_label_1e3,1000}, + {type_district_label_2e3,2000}, + {type_district_label_5e3,5000}, + {type_district_label_1e4,10000}, + {type_district_label_2e4,20000}, + {type_district_label_5e4,50000}, + {type_district_label_1e5,100000}, + {type_district_label_2e5,200000}, + {type_district_label_5e5,500000}, + {type_district_label_1e6,1000000}, + {type_district_label_2e6,2000000}, + {type_district_label_5e6,5000000}, + {type_district_label_1e7,10000000}, +}; + +void +item_bin_set_type_by_population(struct item_bin *ib, int population) +{ + struct population_table *table; + int i,count; + + if (population < 0) + population=0; + if (item_is_district(*ib)) { + table=district_population; + count=sizeof(district_population)/sizeof(district_population[0]); + } else { + table=town_population; + count=sizeof(town_population)/sizeof(town_population[0]); + } + for (i = 0 ; i < count ; i++) { + if (population < table[i].population) + break; + } + item_bin_set_type(ib, table[i-1].type); +} + + +void +item_bin_write_match(struct item_bin *ib, enum attr_type type, enum attr_type match, FILE *out) +{ + char *word=item_bin_get_attr(ib, type, NULL); + int i,words=0,len=ib->len; + if (!word) + return; + do { + if (linguistics_search(word)) { + for (i = 0 ; i < 3 ; i++) { + char *str=linguistics_expand_special(word, i); + if (str) { + ib->len=len; + if (i || words) + item_bin_add_attr_string(ib, match, str); + item_bin_write(ib, out); + g_free(str); + } + } + words++; + } + word=linguistics_next_word(word); + } while (word); +} + +static int +item_bin_sort_compare(const void *p1, const void *p2) +{ + struct item_bin *ib1=*((struct item_bin **)p1),*ib2=*((struct item_bin **)p2); + struct attr_bin *attr1,*attr2; + char *s1,*s2; + int ret; +#if 0 + dbg_assert(ib1->clen==2); + dbg_assert(ib2->clen==2); + attr1=(struct attr_bin *)((int *)(ib1+1)+ib1->clen); + attr2=(struct attr_bin *)((int *)(ib2+1)+ib1->clen); +#else + attr1=item_bin_get_attr_bin_last(ib1); + attr2=item_bin_get_attr_bin_last(ib2); +#endif +#if 0 + dbg_assert(attr1->type == attr_town_name || attr1->type == attr_town_name_match); + dbg_assert(attr2->type == attr_town_name || attr2->type == attr_town_name_match); +#endif + s1=(char *)(attr1+1); + s2=(char *)(attr2+1); + if (attr1->type == attr_house_number && attr2->type == attr_house_number) { + ret=atoi(s1)-atoi(s2); + if (ret) + return ret; + } + ret=strcmp(s1, s2); + if (!ret) { + int match1=0,match2=0; + match1=(attr1->type == attr_town_name_match || attr1->type == attr_district_name_match); + match2=(attr2->type == attr_town_name_match || attr2->type == attr_district_name_match); + ret=match1-match2; + } +#if 0 + fprintf(stderr,"sort_countries_compare p1=%p p2=%p %s %s\n",p1,p2,s1,s2); +#endif + return ret; +} + +int +item_bin_sort_file(char *in_file, char *out_file, struct rect *r, int *size) +{ + int j,k,count,rc=0; + struct coord *c; + struct item_bin *ib; + FILE *f; + unsigned char *p,**idx,*buffer; + if (file_get_contents(in_file, &buffer, size)) { + ib=(struct item_bin *)buffer; + p=buffer; + count=0; + while (p < buffer+*size) { + count++; + p+=(*((int *)p)+1)*4; + } + idx=malloc(count*sizeof(void *)); + dbg_assert(idx != NULL); + p=buffer; + for (j = 0 ; j < count ; j++) { + idx[j]=p; + p+=(*((int *)p)+1)*4; + } + qsort(idx, count, sizeof(void *), item_bin_sort_compare); + f=fopen(out_file,"wb"); + for (j = 0 ; j < count ; j++) { + ib=(struct item_bin *)(idx[j]); + c=(struct coord *)(ib+1); + fwrite(ib, (ib->len+1)*4, 1, f); + if (r) { + for (k = 0 ; k < ib->clen/2 ; k++) { + if (rc) + bbox_extend(&c[k], r); + else { + r->l=c[k]; + r->h=c[k]; + } + rc++; + } + } + } + fclose(f); + return 1; + } + return 0; +} diff --git a/navit/maptool/itembin_buffer.c b/navit/maptool/itembin_buffer.c new file mode 100644 index 0000000..8d7bece --- /dev/null +++ b/navit/maptool/itembin_buffer.c @@ -0,0 +1,74 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ +#include +#include +#include "maptool.h" +#include "debug.h" + + +static char buffer[800000]; +struct item_bin *item_bin=(struct item_bin *)(void *)buffer; +static struct node_item *node_item=(struct node_item *)(void *)buffer; + +struct node_item * +read_node_item(FILE *in) +{ + if (fread(node_item, sizeof(struct node_item), 1, in) != 1) + return NULL; + return node_item; +} + +struct item_bin * +read_item(FILE *in) +{ + struct item_bin *ib=(struct item_bin *) buffer; + for (;;) { + switch (item_bin_read(ib, in)) { + case 0: + return NULL; + case 2: + dbg_assert((ib->len+1)*4 < sizeof(buffer)); + bytes_read+=(ib->len+1)*sizeof(int); + return ib; + default: + continue; + } + } +} + +struct item_bin * +read_item_range(FILE *in, int *min, int *max) +{ + struct range r; + + if (fread(&r, sizeof(r), 1, in) != 1) + return NULL; + *min=r.min; + *max=r.max; + return read_item(in); +} + +struct item_bin * +init_item(enum item_type type) +{ + struct item_bin *ib=(struct item_bin *) buffer; + + item_bin_init(ib, type); + return ib; +} diff --git a/navit/maptool/maptool.c b/navit/maptool/maptool.c new file mode 100644 index 0000000..d8d61be --- /dev/null +++ b/navit/maptool/maptool.c @@ -0,0 +1,921 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + + +#define _FILE_OFFSET_BITS 64 +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "file.h" +#include "item.h" +#include "map.h" +#include "main.h" +#include "config.h" +#include "zipfile.h" +#include "linguistics.h" +#include "plugin.h" +#include "util.h" +#include "maptool.h" + +long long slice_size=1024*1024*1024; +int attr_debug_level=1; +int ignore_unkown = 0; +GHashTable *dedupe_ways_hash; +int phase; +int slices; +int unknown_country; +int doway2poi=1; +char ch_suffix[] ="r"; /* Used to make compiler happy due to Bug 35903 in gcc */ +int experimental; + +struct buffer node_buffer = { + 64*1024*1024, +}; + +int processed_nodes, processed_nodes_out, processed_ways, processed_relations, processed_tiles; + +int overlap=1; + +int bytes_read; + +static long start_brk; +static struct timeval start_tv; + +static void +progress_time(void) +{ + struct timeval tv; + int seconds; + gettimeofday(&tv, NULL); + seconds=tv.tv_sec-start_tv.tv_sec; + fprintf(stderr," %d:%02d",seconds/60,seconds%60); +} + +static void +progress_memory(void) +{ +#ifdef HAVE_SBRK + long mem=(long)sbrk(0)-start_brk; + fprintf(stderr," %ld MB",mem/1024/1024); +#endif +} + +void +sig_alrm(int sig) +{ +#ifndef _WIN32 + signal(SIGALRM, sig_alrm); + alarm(30); +#endif + fprintf(stderr,"PROGRESS%d: Processed %d nodes (%d out) %d ways %d relations %d tiles", phase, processed_nodes, processed_nodes_out, processed_ways, processed_relations, processed_tiles); + progress_time(); + progress_memory(); + fprintf(stderr,"\n"); +} + + +void +sig_alrm_end(void) +{ +#ifndef _WIN32 + alarm(0); +#endif +} + + +static struct plugins *plugins; + +static void add_plugin(char *path) +{ + struct attr **attrs; + + if (! plugins) + plugins=plugins_new(); + attrs=(struct attr*[]){&(struct attr){attr_path,{path}},NULL}; + plugin_new(&(struct attr){attr_plugins,.u.plugins=plugins}, attrs); +} + +static void +maptool_init(FILE* rule_file) +{ + if (plugins) + plugins_init(plugins); + osm_init(rule_file); +} + +static void +usage(FILE *f) +{ + /* DEVELOPPERS : don't forget to update the manpage if you modify theses options */ + fprintf(f,"\n"); + fprintf(f,"maptool - parse osm textfile and convert to Navit binfile format\n\n"); + fprintf(f,"Usage (for OSM XML data):\n"); + fprintf(f,"bzcat planet.osm.bz2 | maptool mymap.bin\n"); + fprintf(f,"Usage (for OSM Protobuf/PBF data):\n"); + fprintf(f,"maptool --protobuf -i planet.osm.pbf planet.bin\n"); + fprintf(f,"Available switches:\n"); + fprintf(f,"-h (--help) : this screen\n"); + fprintf(f,"-5 (--md5) : set file where to write md5 sum\n"); + fprintf(f,"-6 (--64bit) : set zip 64 bit compression\n"); + fprintf(f,"-a (--attr-debug-level) : control which data is included in the debug attribute\n"); + fprintf(f,"-c (--dump-coordinates) : dump coordinates after phase 1\n"); +#ifdef HAVE_POSTGRESQL + fprintf(f,"-d (--db) : get osm data out of a postgresql database with osm simple scheme and given connect string\n"); +#endif + fprintf(f,"-e (--end) : end at specified phase\n"); + fprintf(f,"-E (--experimental) : Enable experimental features\n"); + fprintf(f,"-i (--input-file) : specify the input file name (OSM), overrules default stdin\n"); + fprintf(f,"-k (--keep-tmpfiles) : do not delete tmp files after processing. useful to reuse them\n\n"); + fprintf(f,"-M (--o5m) : input file os o5m\n"); + fprintf(f,"-N (--nodes-only) : process only nodes\n"); + fprintf(f,"-o (--coverage) : map every street to item coverage\n"); + fprintf(f,"-P (--protobuf) : input file is protobuf\n"); + fprintf(f,"-r (--rule-file) : read mapping rules from specified file\n"); + fprintf(f,"-s (--start) : start at specified phase\n"); + fprintf(f,"-S (--slice-size) : defines the amount of memory to use, in bytes. Default is 1GB\n"); + fprintf(f,"-t (--timestamp) y-m-dTh:m:s : Set zip timestamp\n"); + fprintf(f,"-w (--dedupe-ways) : ensure no duplicate ways or nodes. useful when using several input files\n"); + fprintf(f,"-W (--ways-only) : process only ways\n"); + fprintf(f,"-U (--unknown-country) : add objects with unknown country to index\n"); + fprintf(f,"-z (--compression-level) : set the compression level\n"); + fprintf(f,"Internal options (undocumented):\n"); + fprintf(f,"-b (--binfile)\n"); + fprintf(f,"-B \n"); + fprintf(f,"-m (--map) \n"); + fprintf(f,"-O \n"); + fprintf(f,"-p (--plugin) \n"); + + exit(1); +} + +struct maptool_params { + int zip64; + int keep_tmpfiles; + int process_nodes; + int process_ways; + int process_relations; + char *protobufdb; + char *protobufdb_operation; + char *md5file; + int start; + int end; + int output; + int o5m; + int compression_level; + int protobuf; + int dump_coordinates; + int input; + GList *map_handles; + FILE* input_file; + FILE* rule_file; + char *url; + struct maptool_osm osm; + FILE *ways_split; + char *timestamp; + char *result; + char *dbstr; + int node_table_loaded; + int countries_loaded; + int tilesdir_loaded; +}; + +static int +parse_option(struct maptool_params *p, char **argv, int argc, int *option_index) +{ + char *optarg_cp,*attr_name,*attr_value; + struct map *handle; + struct attr *attrs[10]; + int pos,c,i; + + static struct option long_options[] = { + {"md5", 1, 0, '5'}, + {"64bit", 0, 0, '6'}, + {"attr-debug-level", 1, 0, 'a'}, + {"binfile", 0, 0, 'b'}, + {"compression-level", 1, 0, 'z'}, +#ifdef HAVE_POSTGRESQL + {"db", 1, 0, 'd'}, +#endif + {"dedupe-ways", 0, 0, 'w'}, + {"dump", 0, 0, 'D'}, + {"dump-coordinates", 0, 0, 'c'}, + {"end", 1, 0, 'e'}, + {"experimental", 0, 0, 'E'}, + {"help", 0, 0, 'h'}, + {"keep-tmpfiles", 0, 0, 'k'}, + {"nodes-only", 0, 0, 'N'}, + {"map", 1, 0, 'm'}, + {"o5m", 0, 0, 'M'}, + {"plugin", 1, 0, 'p'}, + {"protobuf", 0, 0, 'P'}, + {"start", 1, 0, 's'}, + {"timestamp", 1, 0, 't'}, + {"input-file", 1, 0, 'i'}, + {"rule-file", 1, 0, 'r'}, + {"ignore-unknown", 0, 0, 'n'}, + {"url", 1, 0, 'u'}, + {"ways-only", 0, 0, 'W'}, + {"slice-size", 1, 0, 'S'}, + {"unknown-country", 0, 0, 'U'}, + {0, 0, 0, 0} + }; + c = getopt_long (argc, argv, "5:6B:DEMNO:PS:Wa:bc" +#ifdef HAVE_POSTGRESQL + "d:" +#endif + "e:hi:knm:p:r:s:t:wu:z:U", long_options, option_index); + if (c == -1) + return 1; + switch (c) { + case '5': + p->md5file=optarg; + break; + case '6': + p->zip64=1; + break; + case 'B': + p->protobufdb=optarg; + break; + case 'D': + p->output=1; + break; + case 'E': + experimental=1; + break; + case 'M': + p->o5m=1; + break; + case 'N': + p->process_ways=0; + break; + case 'R': + p->process_relations=0; + break; + case 'O': + p->protobufdb_operation=optarg; + p->output=1; + break; + case 'P': + p->protobuf=1; + break; + case 'S': + slice_size=atoll(optarg); + break; + case 'W': + p->process_nodes=0; + break; + case 'U': + unknown_country=1; + break; + case 'a': + attr_debug_level=atoi(optarg); + break; + case 'b': + p->input=1; + break; + case 'c': + p->dump_coordinates=1; + break; +#ifdef HAVE_POSTGRESQL + case 'd': + p->dbstr=optarg; + break; +#endif + case 'e': + p->end=atoi(optarg); + break; + case 'h': + return 2; + case 'm': + optarg_cp=g_strdup(optarg); + pos=0; + i=0; + attr_name=g_strdup(optarg); + attr_value=g_strdup(optarg); + while (i < 9 && attr_from_line(optarg_cp, NULL, &pos, attr_value, attr_name)) { + attrs[i]=attr_new_from_text(attr_name,attr_value); + if (attrs[i]) { + i++; + } else { + fprintf(stderr,"Failed to convert %s=%s to attribute\n",attr_name,attr_value); + } + attr_value=g_strdup(optarg); + } + attrs[i++]=NULL; + g_free(attr_value); + g_free(optarg_cp); + handle=map_new(NULL, attrs); + if (! handle) { + fprintf(stderr,"Failed to create map from attributes\n"); + exit(1); + } + p->map_handles=g_list_append(p->map_handles,handle); + break; + case 'n': + fprintf(stderr,"I will IGNORE unknown types\n"); + ignore_unkown=1; + break; + case 'k': + fprintf(stderr,"I will KEEP tmp files\n"); + p->keep_tmpfiles=1; + break; + case 'p': + add_plugin(optarg); + break; + case 's': + p->start=atoi(optarg); + break; + case 't': + p->timestamp=optarg; + break; + case 'w': + dedupe_ways_hash=g_hash_table_new(NULL, NULL); + break; + case 'i': + p->input_file = fopen( optarg, "r" ); + if (p->input_file == NULL ) + { + fprintf( stderr, "\nInput file (%s) not found\n", optarg ); + exit( -1 ); + } + break; + case 'r': + p->rule_file = fopen( optarg, "r" ); + if (p->rule_file == NULL ) + { + fprintf( stderr, "\nRule file (%s) not found\n", optarg ); + exit( -1 ); + } + break; + case 'u': + p->url=optarg; + break; +#ifdef HAVE_ZLIB + case 'z': + p->compression_level=atoi(optarg); + break; +#endif + case '?': + default: + return 0; + } + return 3; +} + +static int +start_phase(struct maptool_params *p, char *str) +{ + phase++; + if (p->start <= phase && p->end >= phase) { + fprintf(stderr,"PROGRESS: Phase %d: %s",phase,str); + progress_time(); + progress_memory(); + fprintf(stderr,"\n"); + return 1; + } else + return 0; +} + +static void +osm_collect_data(struct maptool_params *p, char *suffix) +{ + unlink("coords.tmp"); + if (p->process_ways) + p->osm.ways=tempfile(suffix,"ways",1); + if (p->process_nodes) { + p->osm.nodes=tempfile(suffix,"nodes",1); + p->osm.towns=tempfile(suffix,"towns",1); + } + if (p->process_ways && p->process_nodes) { + p->osm.turn_restrictions=tempfile(suffix,"turn_restrictions",1); + if(doway2poi) { + p->osm.line2poi=tempfile(suffix,"line2poi",1); + p->osm.poly2poi=tempfile(suffix,"poly2poi",1); + } + } + if (p->process_relations) + p->osm.boundaries=tempfile(suffix,"boundaries",1); +#ifdef HAVE_POSTGRESQL + if (p->dbstr) + map_collect_data_osm_db(p->dbstr,&p->osm); + else +#endif + if (p->map_handles) { + GList *l; + phase1_map(p->map_handles,p->osm.ways,p->osm.nodes); + l=p->map_handles; + while (l) { + map_destroy(l->data); + l=g_list_next(l); + } + } + else if (p->protobuf) + map_collect_data_osm_protobuf(p->input_file,&p->osm); + else if (p->o5m) + map_collect_data_osm_o5m(p->input_file,&p->osm); + else + map_collect_data_osm(p->input_file,&p->osm); + flush_nodes(1); + if (p->osm.ways) + fclose(p->osm.ways); + if (p->osm.nodes) + fclose(p->osm.nodes); + if (p->osm.turn_restrictions) + fclose(p->osm.turn_restrictions); + if (p->osm.boundaries) + fclose(p->osm.boundaries); + if (p->osm.poly2poi) + fclose(p->osm.poly2poi); + if (p->osm.line2poi) + fclose(p->osm.line2poi); + if (p->osm.towns) + fclose(p->osm.towns); +} +int debug_ref=0; + +static void +osm_count_references(struct maptool_params *p, char *suffix, int clear) +{ + int i,first=1; + fprintf(stderr,"%d slices\n",slices); + for (i = slices-1 ; i>=0 ; i--) { + fprintf(stderr, "slice %d of %d\n",slices-i-1,slices-1); + if (!first) { + FILE *ways=tempfile(suffix,"ways",0); + load_buffer("coords.tmp",&node_buffer, i*slice_size, slice_size); + if (clear) + clear_node_item_buffer(); + ref_ways(ways); + save_buffer("coords.tmp",&node_buffer, i*slice_size); + fclose(ways); + } + if(doway2poi) { + FILE *poly2poi=tempfile(suffix,first?"poly2poi":"poly2poi_resolved",0); + FILE *poly2poinew=tempfile(suffix,"poly2poi_resolved_new",1); + FILE *line2poi=tempfile(suffix,first?"line2poi":"line2poi_resolved",0); + FILE *line2poinew=tempfile(suffix,"line2poi_resolved_new",1); + resolve_ways(poly2poi, poly2poinew); + resolve_ways(line2poi, line2poinew); + fclose(poly2poi); + fclose(poly2poinew); + fclose(line2poi); + fclose(line2poinew); + tempfile_rename(suffix,"poly2poi_resolved_new","poly2poi_resolved"); + tempfile_rename(suffix,"line2poi_resolved_new","line2poi_resolved"); + if (first && !p->keep_tmpfiles) { + tempfile_unlink(suffix,"poly2poi"); + tempfile_unlink(suffix,"line2poi"); + } + } + first=0; + } +} + + +static void +osm_find_intersections(struct maptool_params *p, char *suffix) +{ + FILE *ways, *ways_split, *ways_split_index, *graph, *coastline; + int i; + + ways=tempfile(suffix,"ways",0); + for (i = 0 ; i < slices ; i++) { + int final=(i >= slices-1); + ways_split=tempfile(suffix,"ways_split",1); + ways_split_index=final ? tempfile(suffix,"ways_split_index",1) : NULL; + graph=tempfile(suffix,"graph",1); + coastline=tempfile(suffix,"coastline",1); + if (i) + load_buffer("coords.tmp",&node_buffer, i*slice_size, slice_size); + map_find_intersections(ways,ways_split,ways_split_index,graph,coastline,final); + fclose(ways_split); + if (ways_split_index) + fclose(ways_split_index); + fclose(ways); + fclose(graph); + fclose(coastline); + if (! final) { + tempfile_rename(suffix,"ways_split","ways_to_resolve"); + ways=tempfile(suffix,"ways_to_resolve",0); + } + } + if(!p->keep_tmpfiles) + tempfile_unlink(suffix,"ways"); + tempfile_unlink(suffix,"ways_to_resolve"); +} + +static void +osm_process_way2poi(struct maptool_params *p, char *suffix) +{ + FILE *poly2poi=tempfile(suffix,"poly2poi_resolved",0); + FILE *line2poi=tempfile(suffix,"line2poi_resolved",0); + FILE *way2poi_result=tempfile(suffix,"way2poi_result",1); + if (poly2poi) { + process_way2poi(poly2poi, way2poi_result, type_area); + fclose(poly2poi); + } + if (line2poi) { + process_way2poi(line2poi, way2poi_result, type_line); + fclose(line2poi); + } + fclose(way2poi_result); +} + +static void +osm_process_coastlines(struct maptool_params *p, char *suffix) +{ + FILE *coastline=tempfile(suffix,"coastline",0); + if (coastline) { + FILE *coastline_result=tempfile(suffix,"coastline_result",1); + process_coastlines(coastline, coastline_result); + fclose(coastline_result); + fclose(coastline); + } +} + +static void +osm_process_turn_restrictions(struct maptool_params *p, char *suffix) +{ + FILE *ways_split, *ways_split_index, *relations, *coords; + p->osm.turn_restrictions=tempfile(suffix,"turn_restrictions",0); + if (!p->osm.turn_restrictions) + return; + relations=tempfile(suffix,"relations",1); + coords=fopen("coords.tmp","rb"); + ways_split=tempfile(suffix,"ways_split",0); + ways_split_index=tempfile(suffix,"ways_split_index",0); + process_turn_restrictions(p->osm.turn_restrictions,coords,ways_split,ways_split_index,relations); + fclose(ways_split_index); + fclose(ways_split); + fclose(coords); + fclose(relations); + fclose(p->osm.turn_restrictions); + if(!p->keep_tmpfiles) + tempfile_unlink(suffix,"turn_restrictions"); +} + +static void +maptool_dump(struct maptool_params *p, char *suffix) +{ + char *files[10]; + int i,files_count=0; + if (p->process_nodes) + files[files_count++]="nodes"; + if (p->process_ways) + files[files_count++]="ways_split"; + if (p->process_relations) + files[files_count++]="relations"; + for (i = 0 ; i < files_count ; i++) { + FILE *f=tempfile(suffix,files[i],0); + if (f) { + dump(f); + fclose(f); + } + } +} + +static void +maptool_generate_tiles(struct maptool_params *p, char *suffix, char **filenames, int filename_count, int first, char *suffix0) +{ + struct zip_info *zip_info; + FILE *tilesdir; + FILE *files[10]; + int zipnum, f; + if (first) { + zip_info=zip_new(); + zip_set_zip64(zip_info, p->zip64); + zip_set_timestamp(zip_info, p->timestamp); + } + zipnum=zip_get_zipnum(zip_info); + tilesdir=tempfile(suffix,"tilesdir",1); + if (!strcmp(suffix,ch_suffix)) { /* Makes compiler happy due to bug 35903 in gcc */ + ch_generate_tiles(suffix0,suffix,tilesdir,zip_info); + } else { + for (f = 0 ; f < filename_count ; f++) + files[f]=tempfile(suffix,filenames[f],0); + phase4(files,filename_count,0,suffix,tilesdir,zip_info); + for (f = 0 ; f < filename_count ; f++) { + if (files[f]) + fclose(files[f]); + } + } + fclose(tilesdir); + zip_set_zipnum(zip_info,zipnum); +} + +static void +maptool_assemble_map(struct maptool_params *p, char *suffix, char **filenames, char **referencenames, int filename_count, int first, int last, char *suffix0) +{ + FILE *files[10]; + FILE *references[10]; + struct zip_info *zip_info; + int zipnum,f; + + if (first) { + char *zipdir=tempfile_name("zipdir",""); + char *zipindex=tempfile_name("index",""); + zip_info=zip_new(); + zip_set_zip64(zip_info, p->zip64); + zip_set_timestamp(zip_info, p->timestamp); + zip_set_maxnamelen(zip_info, 14+strlen(suffix0)); + zip_set_compression_level(zip_info, p->compression_level); + if (p->md5file) + zip_set_md5(zip_info, 1); + zip_open(zip_info, p->result, zipdir, zipindex); + if (p->url) { + map_information_attrs[1].type=attr_url; + map_information_attrs[1].u.str=p->url; + } + index_init(zip_info, 1); + } + if (!strcmp(suffix,ch_suffix)) { /* Makes compiler happy due to bug 35903 in gcc */ + ch_assemble_map(suffix0,suffix,zip_info); + } else { + for (f = 0 ; f < filename_count ; f++) { + files[f]=tempfile(suffix, filenames[f], 0); + if (referencenames[f]) + references[f]=tempfile(suffix,referencenames[f],1); + else + references[f]=NULL; + } + phase5(files,references,filename_count,0,suffix,zip_info); + for (f = 0 ; f < filename_count ; f++) { + if (files[f]) + fclose(files[f]); + if (references[f]) + fclose(references[f]); + } + } + if(!p->keep_tmpfiles) { + tempfile_unlink(suffix,"relations"); + tempfile_unlink(suffix,"nodes"); + tempfile_unlink(suffix,"ways_split"); + tempfile_unlink(suffix,"poly2poi_resolved"); + tempfile_unlink(suffix,"line2poi_resolved"); + tempfile_unlink(suffix,"ways_split_ref"); + tempfile_unlink(suffix,"coastline"); + tempfile_unlink(suffix,"turn_restrictions"); + tempfile_unlink(suffix,"graph"); + tempfile_unlink(suffix,"tilesdir"); + tempfile_unlink(suffix,"boundaries"); + tempfile_unlink(suffix,"way2poi_result"); + tempfile_unlink(suffix,"coastline_result"); + unlink("coords.tmp"); + } + if (last) { + unsigned char md5_data[16]; + zipnum=zip_get_zipnum(zip_info); + add_aux_tiles("auxtiles.txt", zip_info); + write_countrydir(zip_info); + zip_set_zipnum(zip_info, zipnum); + write_aux_tiles(zip_info); + zip_write_index(zip_info); + zip_write_directory(zip_info); + zip_close(zip_info); + if (p->md5file && zip_get_md5(zip_info, md5_data)) { + FILE *md5=fopen(p->md5file,"w"); + int i; + for (i = 0 ; i < 16 ; i++) + fprintf(md5,"%02x",md5_data[i]); + fprintf(md5,"\n"); + fclose(md5); + } + if (!p->keep_tmpfiles) { + remove_countryfiles(); + tempfile_unlink("index",""); + tempfile_unlink("zipdir",""); + } + } +} + +static void +maptool_load_node_table(struct maptool_params *p, int last) +{ + if (!p->node_table_loaded) { + slices=(sizeof_buffer("coords.tmp")+slice_size-1)/slice_size; + load_buffer("coords.tmp",&node_buffer,last?(slices-1)*slice_size:0, slice_size); + p->node_table_loaded=1; + } +} + +static void +maptool_load_countries(struct maptool_params *p) +{ + if (!p->countries_loaded) { + load_countries(); + p->countries_loaded=1; + } +} + +static void +maptool_load_tilesdir(struct maptool_params *p, char *suffix) +{ + if (!p->tilesdir_loaded) { + FILE *tilesdir=tempfile(suffix,"tilesdir",0); + load_tilesdir(tilesdir); + p->tilesdir_loaded=1; + } +} + + +int main(int argc, char **argv) +{ +#if 0 + FILE *files[10]; + FILE *references[10]; +#endif + struct maptool_params p; +#if 0 + char *suffixes[]={"m0l0", "m0l1","m0l2","m0l3","m0l4","m0l5","m0l6"}; + char *suffixes[]={"m","r"}; +#else + char *suffixes[]={""}; +#endif + char *suffix=suffixes[0]; + char *filenames[10]; + char *referencenames[10]; + int filename_count=0; + + int suffix_count=sizeof(suffixes)/sizeof(char *); + int i; + main_init(argv[0]); + int suffix_start=0; + int option_index = 0; + +#ifndef HAVE_GLIB + _g_slice_thread_init_nomessage(); +#endif + memset(&p, 0, sizeof(p)); +#ifdef HAVE_ZLIB + p.compression_level=9; +#endif + p.start=1; + p.end=99; + p.input_file=stdin; + p.process_nodes=1; + p.process_ways=1; + p.process_relations=1; + p.timestamp=current_to_iso8601(); + +#ifdef HAVE_SBRK + start_brk=(long)sbrk(0); +#endif + gettimeofday(&start_tv, NULL); + + while (1) { + int parse_result=parse_option(&p, argv, argc, &option_index); + if (!parse_result) { + usage(stderr); + exit(1); + } + if (parse_result == 1) + break; + if (parse_result == 2) { + usage(stdout); + exit(0); + } + } +#if 0 + if (experimental) { + fprintf(stderr,"No experimental features available\n"); + exit(0); + } +#endif + if (optind != argc-(p.output == 1 ? 0:1)) + usage(stderr); + p.result=argv[optind]; + + + // initialize plugins and OSM mappings + maptool_init(p.rule_file); + if (p.protobufdb_operation) { + osm_protobufdb_load(p.input_file, p.protobufdb); + return 0; + } + phase=0; + + // input from an OSM file + if (p.input == 0) { + if (start_phase(&p, "collecting data")) { + osm_collect_data(&p, suffix); + p.node_table_loaded=1; + } + if (start_phase(&p, "counting references and resolving ways")) { + maptool_load_node_table(&p,1); + osm_count_references(&p, suffix, p.start == phase); + } + if (start_phase(&p,"converting ways to pois")) { + osm_process_way2poi(&p, suffix); + } + if (start_phase(&p,"finding intersections")) { + if (p.process_ways) { + maptool_load_node_table(&p,0); + osm_find_intersections(&p, suffix); + } + } + free(node_buffer.base); + node_buffer.base=NULL; + node_buffer.malloced=0; + node_buffer.size=0; + p.node_table_loaded=0; + } else { + if (start_phase(&p,"reading data")) { + FILE *ways_split=tempfile(suffix,"ways_split",1); + process_binfile(stdin, ways_split); + fclose(ways_split); + } + } + + if (start_phase(&p,"generating coastlines")) { + osm_process_coastlines(&p, suffix); + } + if (start_phase(&p,"assinging towns to countries")) { + FILE *towns=tempfile(suffix,"towns",0),*boundaries=NULL,*ways=NULL; + if (towns) { + boundaries=tempfile(suffix,"boundaries",0); + ways=tempfile(suffix,"ways_split",0); + osm_process_towns(towns,boundaries,ways); + fclose(ways); + fclose(boundaries); + fclose(towns); + if(!p.keep_tmpfiles) + tempfile_unlink(suffix,"towns"); + } + } + if (start_phase(&p,"sorting countries")) { + sort_countries(p.keep_tmpfiles); + p.countries_loaded=1; + } + if (start_phase(&p,"generating turn restrictions")) { + if (p.process_relations) { + osm_process_turn_restrictions(&p, suffix); + } + if(!p.keep_tmpfiles) + tempfile_unlink(suffix,"ways_split_index"); + } + if (p.output == 1 && start_phase(&p,"dumping")) { + maptool_dump(&p, suffix); + exit(0); + } + if (p.process_relations) { + filenames[filename_count]="relations"; + referencenames[filename_count++]=NULL; + } + if (p.process_ways) { + filenames[filename_count]="ways_split"; + referencenames[filename_count++]=NULL; + filenames[filename_count]="coastline_result"; + referencenames[filename_count++]=NULL; + } + if (p.process_nodes) { + filenames[filename_count]="nodes"; + referencenames[filename_count++]=NULL; + filenames[filename_count]="way2poi_result"; + referencenames[filename_count++]=NULL; + } + for (i = suffix_start ; i < suffix_count ; i++) { + suffix=suffixes[i]; + if (start_phase(&p,"generating tiles")) { + maptool_load_countries(&p); + maptool_generate_tiles(&p, suffix, filenames, filename_count, i == suffix_start, suffixes[0]); + p.tilesdir_loaded=1; + } + if (start_phase(&p,"assembling map")) { + maptool_load_countries(&p); + maptool_load_tilesdir(&p, suffix); + maptool_assemble_map(&p, suffix, filenames, referencenames, filename_count, i == suffix_start, i == suffix_count-1, suffixes[0]); + } + phase-=2; + } + phase+=2; + start_phase(&p,"done"); + return 0; +} diff --git a/navit/maptool/maptool.h b/navit/maptool/maptool.h new file mode 100644 index 0000000..2738950 --- /dev/null +++ b/navit/maptool/maptool.h @@ -0,0 +1,401 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ +#include +#include "config.h" +#include "coord.h" +#include "item.h" +#include "attr.h" +#ifdef HAVE_LIBCRYPTO +#include +#endif + + +#ifdef HAVE_API_WIN32_BASE +#define LONGLONG_FMT "%I64d" +#else +#define LONGLONG_FMT "%lld" +#endif + +#define sq(x) ((double)(x)*(x)) + +#define BUFFER_SIZE 1280 + +#define debug_tile(x) 0 +#define debug_itembin(x) 0 + +struct rect { + struct coord l,h; +}; + +struct tile_data { + char buffer[1024]; + int tile_depth; + struct rect item_bbox; + struct rect tile_bbox; +}; + +struct tile_parameter { + int min; + int max; + int overlap; + enum attr_type attr_to_copy; +}; + +struct tile_info { + int write; + int maxlen; + char *suffix; + GList **tiles_list; + FILE *tilesdir_out; +}; + +extern struct tile_head { + int num_subtiles; + int total_size; + char *name; + char *zip_data; + int total_size_used; + int zipnum; + int process; + struct tile_head *next; + // char subtiles[0]; +} *tile_head_root; + + + +struct item_bin { + int len; + enum item_type type; + int clen; +}; + +struct attr_bin { + int len; + enum attr_type type; +}; + + +struct item_bin_sink_func { + int (*func)(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data); + void *priv_data[8]; +}; + +struct item_bin_sink { + void *priv_data[8]; + GList *sink_funcs; +}; + +struct node_item { + int id; + char ref_node; + char ref_way; + char ref_ref; + char dummy; + struct coord c; +}; + +struct zip_info; + +struct country_table; + +typedef long int osmid; + +/* boundaries.c */ + +struct boundary { + struct item_bin *ib; + struct country_table *country; + char *iso2; + GList *segments,*sorted_segments; + GList *children; + struct rect r; +}; + +char *osm_tag_value(struct item_bin *ib, char *key); + +osmid boundary_relid(struct boundary *b); + +GList *process_boundaries(FILE *boundaries, FILE *ways); + +GList *boundary_find_matches(GList *bl, struct coord *c); + +/* buffer.c */ +struct buffer { + int malloced_step; + long long malloced; + unsigned char *base; + long long size; +}; + +void save_buffer(char *filename, struct buffer *b, long long offset); +void load_buffer(char *filename, struct buffer *b, long long offset, long long size); +long long sizeof_buffer(char *filename); + +/* ch.c */ + +void ch_generate_tiles(char *map_suffix, char *suffix, FILE *tilesdir_out, struct zip_info *zip_info); +void ch_assemble_map(char *map_suffix, char *suffix, struct zip_info *zip_info); + +/* coastline.c */ + +void process_coastlines(FILE *in, FILE *out); + +/* geom.c */ + +enum geom_poly_segment_type { + geom_poly_segment_type_none, + geom_poly_segment_type_way_inner, + geom_poly_segment_type_way_outer, + geom_poly_segment_type_way_left_side, + geom_poly_segment_type_way_right_side, + geom_poly_segment_type_way_unknown, + +}; + +struct geom_poly_segment { + enum geom_poly_segment_type type; + struct coord *first,*last; +}; + +void geom_coord_copy(struct coord *from, struct coord *to, int count, int reverse); +void geom_coord_revert(struct coord *c, int count); +int geom_line_middle(struct coord *p, int count, struct coord *c); +long long geom_poly_area(struct coord *c, int count); +int geom_poly_centroid(struct coord *c, int count, struct coord *r); +int geom_poly_point_inside(struct coord *cp, int count, struct coord *c); +int geom_poly_closest_point(struct coord *pl, int count, struct coord *p, struct coord *c); +GList *geom_poly_segments_insert(GList *list, struct geom_poly_segment *first, struct geom_poly_segment *second, struct geom_poly_segment *third); +void geom_poly_segment_destroy(struct geom_poly_segment *seg); +GList *geom_poly_segments_remove(GList *list, struct geom_poly_segment *seg); +int geom_poly_segment_compatible(struct geom_poly_segment *s1, struct geom_poly_segment *s2, int dir); +GList *geom_poly_segments_sort(GList *in, enum geom_poly_segment_type type); +struct geom_poly_segment *item_bin_to_poly_segment(struct item_bin *ib, int type); +int geom_poly_segments_point_inside(GList *in, struct coord *c); +void clip_line(struct item_bin *ib, struct rect *r, struct tile_parameter *param, struct item_bin_sink *out); +void clip_polygon(struct item_bin *ib, struct rect *r, struct tile_parameter *param, struct item_bin_sink *out); + +/* itembin.c */ + +int item_bin_read(struct item_bin *ib, FILE *in); +void item_bin_set_type(struct item_bin *ib, enum item_type type); +void item_bin_init(struct item_bin *ib, enum item_type type); +void item_bin_add_coord(struct item_bin *ib, struct coord *c, int count); +void item_bin_add_coord_reverse(struct item_bin *ib, struct coord *c, int count); +void item_bin_bbox(struct item_bin *ib, struct rect *r); +void item_bin_copy_coord(struct item_bin *ib, struct item_bin *from, int dir); +void item_bin_copy_attr(struct item_bin *ib, struct item_bin *from, enum attr_type attr); +void item_bin_add_coord_rect(struct item_bin *ib, struct rect *r); +int attr_bin_write_data(struct attr_bin *ab, enum attr_type type, void *data, int size); +int attr_bin_write_attr(struct attr_bin *ab, struct attr *attr); +void item_bin_add_attr_data(struct item_bin *ib, enum attr_type type, void *data, int size); +void item_bin_add_attr(struct item_bin *ib, struct attr *attr); +void item_bin_add_attr_int(struct item_bin *ib, enum attr_type type, int val); +void *item_bin_get_attr(struct item_bin *ib, enum attr_type type, void *last); +struct attr_bin * item_bin_get_attr_bin(struct item_bin *ib, enum attr_type type, void *last); +struct attr_bin * item_bin_get_attr_bin_last(struct item_bin *ib); +void item_bin_add_attr_longlong(struct item_bin *ib, enum attr_type type, long long val); +void item_bin_add_attr_string(struct item_bin *ib, enum attr_type type, char *str); +void item_bin_add_attr_range(struct item_bin *ib, enum attr_type type, short min, short max); +void item_bin_remove_attr(struct item_bin *ib, void *ptr); +void item_bin_write(struct item_bin *ib, FILE *out); +struct item_bin *item_bin_dup(struct item_bin *ib); +void item_bin_write_range(struct item_bin *ib, FILE *out, int min, int max); +void item_bin_write_clipped(struct item_bin *ib, struct tile_parameter *param, struct item_bin_sink *out); +void item_bin_dump(struct item_bin *ib, FILE *out); +void dump_itembin(struct item_bin *ib); +void item_bin_set_type_by_population(struct item_bin *ib, int population); +void item_bin_write_match(struct item_bin *ib, enum attr_type type, enum attr_type match, FILE *out); +int item_bin_sort_file(char *in_file, char *out_file, struct rect *r, int *size); + +/* itembin_buffer.c */ +struct node_item *read_node_item(FILE *in); +struct item_bin *read_item(FILE *in); +struct item_bin *read_item_range(FILE *in, int *min, int *max); +struct item_bin *init_item(enum item_type type); + +/* maptool.c */ + +extern long long slice_size; +extern int attr_debug_level; +extern char *suffix; +extern int ignore_unkown; +extern GHashTable *dedupe_ways_hash; +extern int slices; +extern struct buffer node_buffer; +extern int processed_nodes, processed_nodes_out, processed_ways, processed_relations, processed_tiles; +extern struct item_bin *item_bin; +extern int bytes_read; +extern int overlap; +extern int unknown_country; +extern int experimental; +void sig_alrm(int sig); +void sig_alrm_end(void); + +/* misc.c */ +extern struct rect world_bbox; + + +void bbox_extend(struct coord *c, struct rect *r); +void bbox(struct coord *c, int count, struct rect *r); +int contains_bbox(int xl, int yl, int xh, int yh, struct rect *r); +int bbox_contains_coord(struct rect *r, struct coord *c); +int bbox_contains_bbox(struct rect *out, struct rect *in); +long long bbox_area(struct rect const *r); +void phase1_map(GList *maps, FILE *out_ways, FILE *out_nodes); +void dump(FILE *in); +int phase4(FILE **in, int in_count, int with_range, char *suffix, FILE *tilesdir_out, struct zip_info *zip_info); +int phase5(FILE **in, FILE **references, int in_count, int with_range, char *suffix, struct zip_info *zip_info); +void process_binfile(FILE *in, FILE *out); +void add_aux_tiles(char *name, struct zip_info *info); +void cat(FILE *in, FILE *out); + + +/* osm.c */ +struct maptool_osm { + FILE *boundaries; + FILE *turn_restrictions; + FILE *nodes; + FILE *ways; + FILE *line2poi; + FILE *poly2poi; + FILE *towns; +}; + +void osm_warning(char *type, long long id, int cont, char *fmt, ...); +void osm_add_tag(char *k, char *v); +void osm_add_node(osmid id, double lat, double lon); +void osm_add_way(osmid id); +void osm_add_relation(osmid id); +void osm_end_relation(struct maptool_osm *osm); +void osm_add_member(int type, osmid ref, char *role); +void osm_end_way(struct maptool_osm *osm); +void osm_end_node(struct maptool_osm *osm); +void osm_add_nd(osmid ref); +long long item_bin_get_id(struct item_bin *ib); +void flush_nodes(int final); +void sort_countries(int keep_tmpfiles); +void process_turn_restrictions(FILE *in, FILE *coords, FILE *ways, FILE *ways_index, FILE *out); +void clear_node_item_buffer(void); +void ref_ways(FILE *in); +void resolve_ways(FILE *in, FILE *out); +long long item_bin_get_nodeid(struct item_bin *ib); +long long item_bin_get_wayid(struct item_bin *ib); +long long item_bin_get_relationid(struct item_bin *ib); +FILE *resolve_ways_file(FILE *in, char *suffix, char *filename); +void process_way2poi(FILE *in, FILE *out, int type); +int map_find_intersections(FILE *in, FILE *out, FILE *out_index, FILE *out_graph, FILE *out_coastline, int final); +void write_countrydir(struct zip_info *zip_info); +void osm_process_towns(FILE *in, FILE *boundaries, FILE *ways); +void load_countries(void); +void remove_countryfiles(void); +struct country_table * country_from_iso2(char *iso); +void osm_init(FILE*); + +/* osm_o5m.c */ +int map_collect_data_osm_o5m(FILE *in, struct maptool_osm *osm); + +/* osm_psql.c */ +int map_collect_data_osm_db(char *dbstr, struct maptool_osm *osm); + +/* osm_protobuf.c */ +int map_collect_data_osm_protobuf(FILE *in, struct maptool_osm *osm); +int osm_protobufdb_load(FILE *in, char *dir); + +/* osm_relations.c */ +struct relations * relations_new(void); +struct relations_func *relations_func_new(void (*func)(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv), void *func_priv); +void relations_add_func(struct relations *rel, struct relations_func *func, void *relation_priv, void *member_priv, int type, osmid id); +void relations_process(struct relations *rel, FILE *nodes, FILE *ways, FILE *relations); + + +/* osm_xml.c */ +int osm_xml_get_attribute(char *xml, char *attribute, char *buffer, int buffer_size); +void osm_xml_decode_entities(char *buffer); +int map_collect_data_osm(FILE *in, struct maptool_osm *osm); + + +/* sourcesink.c */ + +struct item_bin_sink *item_bin_sink_new(void); +struct item_bin_sink_func *item_bin_sink_func_new(int (*func)(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data)); +void item_bin_sink_func_destroy(struct item_bin_sink_func *func); +void item_bin_sink_add_func(struct item_bin_sink *sink, struct item_bin_sink_func *func); +void item_bin_sink_destroy(struct item_bin_sink *sink); +int item_bin_write_to_sink(struct item_bin *ib, struct item_bin_sink *sink, struct tile_data *tile_data); +struct item_bin_sink *file_reader_new(FILE *in, int limit, int offset); +int file_reader_finish(struct item_bin_sink *sink); +int file_writer_process(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data); +struct item_bin_sink_func *file_writer_new(FILE *out); +int file_writer_finish(struct item_bin_sink_func *file_writer); +int tile_collector_process(struct item_bin_sink_func *tile_collector, struct item_bin *ib, struct tile_data *tile_data); +struct item_bin_sink_func *tile_collector_new(struct item_bin_sink *out); + +/* tempfile.c */ + +char *tempfile_name(char *suffix, char *name); +FILE *tempfile(char *suffix, char *name, int mode); +void tempfile_unlink(char *suffix, char *name); +void tempfile_rename(char *suffix, char *from, char *to); + +/* tile.c */ +extern GHashTable *tile_hash,*tile_hash2; + +struct aux_tile { + char *name; + char *filename; + int size; +}; + +extern GList *aux_tile_list; + +int tile(struct rect *r, char *suffix, char *ret, int max, int overlap, struct rect *tr); +void tile_bbox(char *tile, struct rect *r, int overlap); +int tile_len(char *tile); +void load_tilesdir(FILE *in); +void tile_write_item_to_tile(struct tile_info *info, struct item_bin *ib, FILE *reference, char *name); +void tile_write_item_minmax(struct tile_info *info, struct item_bin *ib, FILE *reference, int min, int max); +int add_aux_tile(struct zip_info *zip_info, char *name, char *filename, int size); +int write_aux_tiles(struct zip_info *zip_info); +int create_tile_hash(void); +void write_tilesdir(struct tile_info *info, struct zip_info *zip_info, FILE *out); +void merge_tiles(struct tile_info *info); +struct attr map_information_attrs[32]; +void index_init(struct zip_info *info, int version); +void index_submap_add(struct tile_info *info, struct tile_head *th); + +/* zip.c */ +void write_zipmember(struct zip_info *zip_info, char *name, int filelen, char *data, int data_size); +void zip_write_index(struct zip_info *info); +int zip_write_directory(struct zip_info *info); +struct zip_info *zip_new(void); +void zip_set_md5(struct zip_info *info, int on); +int zip_get_md5(struct zip_info *info, unsigned char *out); +void zip_set_zip64(struct zip_info *info, int on); +void zip_set_compression_level(struct zip_info *info, int level); +void zip_set_maxnamelen(struct zip_info *info, int max); +int zip_get_maxnamelen(struct zip_info *info); +int zip_add_member(struct zip_info *info); +int zip_set_timestamp(struct zip_info *info, char *timestamp); +int zip_set_password(struct zip_info *info, char *password); +void zip_open(struct zip_info *info, char *out, char *dir, char *index); +FILE *zip_get_index(struct zip_info *info); +int zip_get_zipnum(struct zip_info *info); +void zip_set_zipnum(struct zip_info *info, int num); +void zip_close(struct zip_info *info); +void zip_destroy(struct zip_info *info); diff --git a/navit/maptool/misc.c b/navit/maptool/misc.c new file mode 100644 index 0000000..5e6c39e --- /dev/null +++ b/navit/maptool/misc.c @@ -0,0 +1,429 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + + +#define _FILE_OFFSET_BITS 64 +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "file.h" +#include "item.h" +#include "map.h" +#include "main.h" +#include "config.h" +#include "zipfile.h" +#include "linguistics.h" +#include "plugin.h" +#include "maptool.h" + +struct rect world_bbox = { + { -20000000, -20000000}, + { 20000000, 20000000}, +}; + +void +bbox_extend(struct coord *c, struct rect *r) +{ + if (c->x < r->l.x) + r->l.x=c->x; + if (c->y < r->l.y) + r->l.y=c->y; + if (c->x > r->h.x) + r->h.x=c->x; + if (c->y > r->h.y) + r->h.y=c->y; +} + +void +bbox(struct coord *c, int count, struct rect *r) +{ + if (! count) + return; + r->l=*c; + r->h=*c; + while (--count) { + c++; + bbox_extend(c, r); + } +} + +int +contains_bbox(int xl, int yl, int xh, int yh, struct rect *r) +{ + if (r->h.x < xl || r->h.x > xh) { + return 0; + } + if (r->l.x > xh || r->l.x < xl) { + return 0; + } + if (r->h.y < yl || r->h.y > yh) { + return 0; + } + if (r->l.y > yh || r->l.y < yl) { + return 0; + } + return 1; +} + +int +bbox_contains_coord(struct rect *r, struct coord *c) +{ + if (r->h.x < c->x) + return 0; + if (r->l.x > c->x) + return 0; + if (r->h.y < c->y) + return 0; + if (r->l.y > c->y) + return 0; + return 1; +} + +int +bbox_contains_bbox(struct rect *out, struct rect *in) +{ + if (out->h.x < in->h.x) + return 0; + if (out->l.x > in->l.x) + return 0; + if (out->h.y < in->h.y) + return 0; + if (out->l.y > in->l.y) + return 0; + return 1; +} + +long long +bbox_area(struct rect const *r) +{ + return ((long long)r->h.x-r->l.x)*(r->h.y-r->l.y); +} + +void +phase1_map(GList *maps, FILE *out_ways, FILE *out_nodes) +{ + struct map_rect *mr; + struct item *item; + int count,max=16384; + struct coord ca[max]; + struct attr attr; + struct item_bin *item_bin; + + while (maps) { + mr=map_rect_new(maps->data, NULL); + while ((item = map_rect_get_item(mr))) { + count=item_coord_get(item, ca, item->type < type_line ? 1: max); + item_bin=init_item(item->type); + item_bin_add_coord(item_bin, ca, count); + while (item_attr_get(item, attr_any, &attr)) { + if (attr.type >= attr_type_string_begin && attr.type <= attr_type_string_end) { + attr.u.str=map_convert_string(maps->data, attr.u.str); + if (attr.u.str) { + item_bin_add_attr(item_bin, &attr); + map_convert_free(attr.u.str); + } + } else + item_bin_add_attr(item_bin, &attr); + } + if (item->type >= type_line) + item_bin_write(item_bin, out_ways); + else + item_bin_write(item_bin, out_nodes); + } + map_rect_destroy(mr); + maps=g_list_next(maps); + } +} + +static void +phase34_process_file(struct tile_info *info, FILE *in, FILE *reference) +{ + struct item_bin *ib; + int max; + + while ((ib=read_item(in))) { + if (ib->type < 0x80000000) + processed_nodes++; + else + processed_ways++; + max=14; + switch (ib->type) { + case type_town_label_1e7: + case type_town_label_5e6: + case type_town_label_2e6: + case type_town_label_1e6: + case type_town_label_5e5: + case type_district_label_1e7: + case type_district_label_5e6: + case type_district_label_2e6: + case type_district_label_1e6: + case type_district_label_5e5: + max=6; + break; + case type_town_label_2e5: + case type_town_label_1e5: + case type_district_label_2e5: + case type_district_label_1e5: + case type_street_n_lanes: + case type_highway_city: + case type_highway_land: + case type_ramp: + max=8; + break; + case type_town_label_5e4: + case type_town_label_2e4: + case type_town_label_1e4: + case type_district_label_5e4: + case type_district_label_2e4: + case type_district_label_1e4: + max=9; + break; + case type_street_4_land: + case type_street_4_city: + max=10; + break; + case type_town_label_5e3: + case type_town_label_2e3: + case type_town_label_1e3: + case type_district_label_5e3: + case type_district_label_2e3: + case type_district_label_1e3: + case type_street_3_city: + case type_street_3_land: + max=12; + break; + default: + break; + } + tile_write_item_minmax(info, ib, reference, 0, max); + } +} + +static void +phase34_process_file_range(struct tile_info *info, FILE *in, FILE *reference) +{ + struct item_bin *ib; + int min,max; + + while ((ib=read_item_range(in, &min, &max))) { + if (ib->type < 0x80000000) + processed_nodes++; + else + processed_ways++; + tile_write_item_minmax(info, ib, reference, min, max); + } +} + +static int +phase34(struct tile_info *info, struct zip_info *zip_info, FILE **in, FILE **reference, int in_count, int with_range) +{ + int i; + + processed_nodes=processed_nodes_out=processed_ways=processed_relations=processed_tiles=0; + bytes_read=0; + sig_alrm(0); + if (! info->write) + tile_hash=g_hash_table_new(g_str_hash, g_str_equal); + for (i = 0 ; i < in_count ; i++) { + if (in[i]) { + if (with_range) + phase34_process_file_range(info, in[i], reference ? reference[i]:NULL); + else + phase34_process_file(info, in[i], reference ? reference[i]:NULL); + } + } + if (! info->write) + merge_tiles(info); + sig_alrm(0); + sig_alrm_end(); + write_tilesdir(info, zip_info, info->tilesdir_out); + + return 0; + +} + + +void +dump(FILE *in) +{ + struct item_bin *ib; + while ((ib=read_item(in))) { + dump_itembin(ib); + } +} + +int +phase4(FILE **in, int in_count, int with_range, char *suffix, FILE *tilesdir_out, struct zip_info *zip_info) +{ + struct tile_info info; + info.write=0; + info.maxlen=0; + info.suffix=suffix; + info.tiles_list=NULL; + info.tilesdir_out=tilesdir_out; + return phase34(&info, zip_info, in, NULL, in_count, with_range); +} + +static int +process_slice(FILE **in, FILE **reference, int in_count, int with_range, long long size, char *suffix, struct zip_info *zip_info) +{ + struct tile_head *th; + char *slice_data,*zip_data; + int zipfiles=0; + struct tile_info info; + int i; + + slice_data=malloc(size); + assert(slice_data != NULL); + zip_data=slice_data; + th=tile_head_root; + while (th) { + if (th->process) { + th->zip_data=zip_data; + zip_data+=th->total_size; + } + th=th->next; + } + for (i = 0 ; i < in_count ; i++) { + if (in[i]) + fseek(in[i], 0, SEEK_SET); + if (reference && reference[i]) { + fseek(reference[i], 0, SEEK_SET); + } + } + info.write=1; + info.maxlen=zip_get_maxnamelen(zip_info); + info.suffix=suffix; + info.tiles_list=NULL; + info.tilesdir_out=NULL; + phase34(&info, zip_info, in, reference, in_count, with_range); + + th=tile_head_root; + while (th) { + if (th->process) { + if (th->name[0]) { + if (th->total_size != th->total_size_used) { + fprintf(stderr,"Size error '%s': %d vs %d\n", th->name, th->total_size, th->total_size_used); + exit(1); + } + write_zipmember(zip_info, th->name, zip_get_maxnamelen(zip_info), th->zip_data, th->total_size); + zipfiles++; + } else + fwrite(th->zip_data, th->total_size, 1, zip_get_index(zip_info)); + } + th=th->next; + } + free(slice_data); + + return zipfiles; +} + +int +phase5(FILE **in, FILE **references, int in_count, int with_range, char *suffix, struct zip_info *zip_info) +{ + long long size; + int slices; + int zipnum,written_tiles; + struct tile_head *th,*th2; + create_tile_hash(); + + th=tile_head_root; + size=0; + slices=0; + fprintf(stderr, "Maximum slice size "LONGLONG_FMT"\n", slice_size); + while (th) { + if (size + th->total_size > slice_size) { + fprintf(stderr,"Slice %d is of size "LONGLONG_FMT"\n", slices, size); + size=0; + slices++; + } + size+=th->total_size; + th=th->next; + } + if (size) + fprintf(stderr,"Slice %d is of size "LONGLONG_FMT"\n", slices, size); + th=tile_head_root; + size=0; + slices=0; + while (th) { + th2=tile_head_root; + while (th2) { + th2->process=0; + th2=th2->next; + } + size=0; + while (th && size+th->total_size < slice_size) { + size+=th->total_size; + th->process=1; + th=th->next; + } + /* process_slice() modifies zip_info, but need to retain old info */ + zipnum=zip_get_zipnum(zip_info); + written_tiles=process_slice(in, references, in_count, with_range, size, suffix, zip_info); + zip_set_zipnum(zip_info, zipnum+written_tiles); + slices++; + } + return 0; +} + +void +process_binfile(FILE *in, FILE *out) +{ + struct item_bin *ib; + while ((ib=read_item(in))) { + fwrite(ib, (ib->len+1)*4, 1, out); + } +} + +void +add_aux_tiles(char *name, struct zip_info *info) +{ + char buffer[4096]; + char *s; + FILE *in; + FILE *tmp; + in=fopen(name,"rb"); + if (!in) + return; + while (fscanf(in,"%s",buffer) == 1) { + s=strchr(buffer,'/'); + if (s) + s++; + else + s=buffer; + tmp=fopen(buffer,"rb"); + if (tmp) { + fseek(tmp, 0, SEEK_END); + add_aux_tile(info, s, buffer, ftell(tmp)); + fclose(tmp); + } + } + fclose(in); +} diff --git a/navit/maptool/osm.c b/navit/maptool/osm.c new file mode 100644 index 0000000..ecbd24e --- /dev/null +++ b/navit/maptool/osm.c @@ -0,0 +1,2695 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ +#include +#include +#include +#include +#include "maptool.h" +#include "debug.h" +#include "linguistics.h" +#include "country.h" +#include "file.h" + +extern int doway2poi; + +static int in_way, in_node, in_relation; +static int nodeid,wayid; +long long current_id; + +static GHashTable *attr_hash,*country_table_hash,*attr_hash; + +static char *attr_present; +static int attr_present_count; + +static struct item_bin item; + + +int maxspeed_attr_value; + +char debug_attr_buffer[BUFFER_SIZE]; + +int flags[4]; + +int flags_attr_value; + +struct attr_bin osmid_attr; +long int osmid_attr_value; + +char is_in_buffer[BUFFER_SIZE]; + +char attr_strings_buffer[BUFFER_SIZE*16]; +int attr_strings_buffer_len; + + +struct coord coord_buffer[65536]; + +struct attr_mapping { + enum item_type type; + int attr_present_idx_count; + int attr_present_idx[0]; +}; + +static void nodes_ref_item_bin(struct item_bin *ib); + + +static struct attr_mapping **attr_mapping_node; +static int attr_mapping_node_count; +static struct attr_mapping **attr_mapping_way; +static int attr_mapping_way_count; +static struct attr_mapping **attr_mapping_way2poi; +static int attr_mapping_way2poi_count; + + + +enum attr_strings { + attr_string_phone, + attr_string_fax, + attr_string_email, + attr_string_url, + attr_string_street_name, + attr_string_street_name_systematic, + attr_string_house_number, + attr_string_label, + attr_string_postal, + attr_string_population, + attr_string_county_name, + attr_string_last, +}; + +char *attr_strings[attr_string_last]; + +char *osm_types[]={"unknown","node","way","relation"}; + +#define IS_REF(c) ((c).x >= (1 << 30)) +#define REF(c) ((c).y) +#define SET_REF(c,ref) do { (c).x = 1 << 30; (c).y = ref ; } while(0) + +struct country_table { + int countryid; + char *names; + char *admin_levels; + FILE *file; + int size; + struct rect r; +} country_table[] = { + { 4,"Afghanistan"}, + { 8,"Albania"}, + { 10,"Antarctica"}, + { 12,"Algeria"}, + { 16,"American Samoa"}, + { 20,"Andorra"}, + { 24,"Angola"}, + { 28,"Antigua and Barbuda"}, + { 31,"Azerbaijan"}, + { 32,"Argentina,República Argentina,AR "}, + { 36,"Australia,AUS"}, + { 40,"Austria,Österreich,AUT"}, + { 44,"Bahamas"}, + { 48,"Bahrain"}, + { 50,"Bangladesh"}, + { 51,"Armenia"}, + { 52,"Barbados"}, + { 56,"Belgium,Belgique,Belgie,België,Belgien"}, + { 60,"Bermuda"}, + { 64,"Bhutan"}, + { 68,"Bolivia, Plurinational State of"}, + { 70,"Bosnia and Herzegovina,Bosna i Hercegovina,Босна и Херцеговина"}, + { 72,"Botswana"}, + { 74,"Bouvet Island"}, + { 76,"Brazil"}, + { 84,"Belize"}, + { 86,"British Indian Ocean Territory"}, + { 90,"Solomon Islands"}, + { 92,"Virgin Islands, British"}, + { 96,"Brunei Darussalam"}, + { 100,"Bulgaria,България"}, + { 104,"Myanmar"}, + { 108,"Burundi"}, + { 112,"Belarus"}, + { 116,"Cambodia"}, + { 120,"Cameroon"}, + { 124,"Canada"}, + { 132,"Cape Verde"}, + { 136,"Cayman Islands"}, + { 140,"Central African Republic"}, + { 144,"Sri Lanka"}, + { 148,"Chad"}, + { 152,"Chile"}, + { 156,"China"}, + { 158,"Taiwan, Province of China"}, + { 162,"Christmas Island"}, + { 166,"Cocos (Keeling) Islands"}, + { 170,"Colombia"}, + { 174,"Comoros"}, + { 175,"Mayotte"}, + { 178,"Congo"}, + { 180,"Congo, the Democratic Republic of the"}, + { 184,"Cook Islands"}, + { 188,"Costa Rica"}, + { 191,"Croatia,Republika Hrvatska,HR"}, + { 192,"Cuba"}, + { 196,"Cyprus"}, + { 203,"Czech Republic,Česká republika,CZ"}, + { 204,"Benin"}, + { 208,"Denmark,Danmark,DK"}, + { 212,"Dominica"}, + { 214,"Dominican Republic"}, + { 218,"Ecuador"}, + { 222,"El Salvador"}, + { 226,"Equatorial Guinea"}, + { 231,"Ethiopia"}, + { 232,"Eritrea"}, + { 233,"Estonia"}, + { 234,"Faroe Islands,Føroyar"}, + { 238,"Falkland Islands (Malvinas)"}, + { 239,"South Georgia and the South Sandwich Islands"}, + { 242,"Fiji"}, + { 246,"Finland,Suomi"}, + { 248,"Åland Islands"}, + { 250,"France,République française,FR"}, + { 254,"French Guiana"}, + { 258,"French Polynesia"}, + { 260,"French Southern Territories"}, + { 262,"Djibouti"}, + { 266,"Gabon"}, + { 268,"Georgia"}, + { 270,"Gambia"}, + { 275,"Palestinian Territory, Occupied"}, + { 276,"Germany,Deutschland,Bundesrepublik Deutschland","345c7m"}, + { 288,"Ghana"}, + { 292,"Gibraltar"}, + { 296,"Kiribati"}, + { 300,"Greece"}, + { 304,"Greenland"}, + { 308,"Grenada"}, + { 312,"Guadeloupe"}, + { 316,"Guam"}, + { 320,"Guatemala"}, + { 324,"Guinea"}, + { 328,"Guyana"}, + { 332,"Haiti"}, + { 334,"Heard Island and McDonald Islands"}, + { 336,"Holy See (Vatican City State)"}, + { 340,"Honduras"}, + { 344,"Hong Kong"}, + { 348,"Hungary,Magyarország"}, + { 352,"Iceland"}, + { 356,"India"}, + { 360,"Indonesia"}, + { 364,"Iran, Islamic Republic of"}, + { 368,"Iraq"}, + { 372,"Ireland"}, + { 376,"Israel"}, + { 380,"Italy,Italia"}, + { 384,"Côte d'Ivoire"}, + { 388,"Jamaica"}, + { 392,"Japan"}, + { 398,"Kazakhstan"}, + { 400,"Jordan"}, + { 404,"Kenya"}, + { 408,"Korea, Democratic People's Republic of"}, + { 410,"Korea, Republic of"}, + { 414,"Kuwait"}, + { 417,"Kyrgyzstan"}, + { 418,"Lao People's Democratic Republic"}, + { 422,"Lebanon"}, + { 426,"Lesotho"}, + { 428,"Latvia"}, + { 430,"Liberia"}, + { 434,"Libyan Arab Jamahiriya"}, + { 438,"Liechtenstein"}, + { 440,"Lithuania,Lietuva"}, + { 442,"Luxembourg"}, + { 446,"Macao"}, + { 450,"Madagascar"}, + { 454,"Malawi"}, + { 458,"Malaysia"}, + { 462,"Maldives"}, + { 466,"Mali"}, + { 470,"Malta"}, + { 474,"Martinique"}, + { 478,"Mauritania"}, + { 480,"Mauritius"}, + { 484,"Mexico"}, + { 492,"Monaco"}, + { 496,"Mongolia"}, + { 498,"Moldova, Republic of"}, + { 499,"Montenegro,Црна Гора,Crna Gora"}, + { 500,"Montserrat"}, + { 504,"Morocco"}, + { 508,"Mozambique"}, + { 512,"Oman"}, + { 516,"Namibia"}, + { 520,"Nauru"}, + { 524,"Nepal"}, + { 528,"Nederland,The Netherlands,Niederlande,NL,Netherlands"}, + { 530,"Netherlands Antilles"}, + { 533,"Aruba"}, + { 540,"New Caledonia"}, + { 548,"Vanuatu"}, + { 554,"New Zealand"}, + { 558,"Nicaragua"}, + { 562,"Niger"}, + { 566,"Nigeria"}, + { 570,"Niue"}, + { 574,"Norfolk Island"}, + { 578,"Norway,Norge,Noreg,NO"}, + { 580,"Northern Mariana Islands"}, + { 581,"United States Minor Outlying Islands"}, + { 583,"Micronesia, Federated States of"}, + { 584,"Marshall Islands"}, + { 585,"Palau"}, + { 586,"Pakistan"}, + { 591,"Panama"}, + { 598,"Papua New Guinea"}, + { 600,"Paraguay"}, + { 604,"Peru"}, + { 608,"Philippines"}, + { 612,"Pitcairn"}, + { 616,"Poland,Polska,PL"}, + { 620,"Portugal"}, + { 624,"Guinea-Bissau"}, + { 626,"Timor-Leste"}, + { 630,"Puerto Rico"}, + { 634,"Qatar"}, + { 638,"Réunion"}, + { 642,"România,Romania,RO"}, + { 643,"Россия,Российская Федерация,Russia,Russian Federation"}, + { 646,"Rwanda"}, + { 652,"Saint Barthélemy"}, + { 654,"Saint Helena, Ascension and Tristan da Cunha"}, + { 659,"Saint Kitts and Nevis"}, + { 660,"Anguilla"}, + { 662,"Saint Lucia"}, + { 663,"Saint Martin (French part)"}, + { 666,"Saint Pierre and Miquelon"}, + { 670,"Saint Vincent and the Grenadines"}, + { 674,"San Marino"}, + { 678,"Sao Tome and Principe"}, + { 682,"Saudi Arabia"}, + { 686,"Senegal"}, + { 688,"Srbija,Србија,Serbia"}, + { 690,"Seychelles"}, + { 694,"Sierra Leone"}, + { 702,"Singapore"}, + { 703,"Slovakia,Slovensko,SK"}, + { 704,"Viet Nam"}, + { 705,"Slovenia,Republika Slovenija,SI"}, + { 706,"Somalia"}, + { 710,"South Africa"}, + { 716,"Zimbabwe"}, + { 724,"Spain,Espana,España,Reino de Espana,Reino de España"}, + { 732,"Western Sahara"}, + { 736,"Sudan"}, + { 740,"Suriname"}, + { 744,"Svalbard and Jan Mayen"}, + { 748,"Swaziland"}, + { 752,"Sweden,Sverige,Konungariket Sverige,SE"}, + { 756,"Switzerland,Schweiz"}, + { 760,"Syrian Arab Republic"}, + { 762,"Tajikistan"}, + { 764,"Thailand"}, + { 768,"Togo"}, + { 772,"Tokelau"}, + { 776,"Tonga"}, + { 780,"Trinidad and Tobago"}, + { 784,"United Arab Emirates"}, + { 788,"Tunisia"}, + { 792,"Turkey"}, + { 795,"Turkmenistan"}, + { 796,"Turks and Caicos Islands"}, + { 798,"Tuvalu"}, + { 800,"Uganda"}, + { 804,"Ukraine"}, + { 807,"Macedonia,Македонија"}, + { 818,"Egypt"}, + { 826,"United Kingdom,UK"}, + { 831,"Guernsey"}, + { 832,"Jersey"}, + { 833,"Isle of Man"}, + { 834,"Tanzania, United Republic of"}, + { 840,"USA"}, + { 850,"Virgin Islands, U.S."}, + { 854,"Burkina Faso"}, + { 858,"Uruguay"}, + { 860,"Uzbekistan"}, + { 862,"Venezuela, Bolivarian Republic of"}, + { 876,"Wallis and Futuna"}, + { 882,"Samoa"}, + { 887,"Yemen"}, + { 894,"Zambia"}, + { 999,"Unknown"}, +}; + +// first char - item type +// =w - ways +// =? - used both for nodes and ways +// otherwise - nodes + +static char *attrmap={ + "n *=* point_unkn\n" +// "n Annehmlichkeit=Hochsitz poi_hunting_stand\n" + "? addr:housenumber=* house_number\n" + "? aeroway=aerodrome poi_airport\n" + "? aeroway=airport poi_airport\n" + "? aeroway=helipad poi_heliport\n" + "? aeroway=terminal poi_airport\n" + "? amenity=atm poi_atm\n" + "? amenity=bank poi_bank\n" + "? amenity=bar poi_bar\n" + "n amenity=bench poi_bench\n" + "? amenity=biergarten poi_biergarten\n" + "? amenity=bus_station poi_bus_station\n" + "? amenity=cafe poi_cafe\n" + "? amenity=car_wash poi_car_wash\n" + "? amenity=cinema poi_cinema\n" + "? amenity=college poi_school_college\n" + "? amenity=courthouse poi_justice\n" + "? amenity=drinking_water poi_potable_water\n" + "? amenity=fast_food poi_fastfood\n" + "? amenity=fire_station poi_firebrigade\n" + "? amenity=fountain poi_fountain\n" + "? amenity=fuel poi_fuel\n" + "? amenity=grave_yard poi_cemetery\n" + "? amenity=hospital poi_hospital\n" + "? amenity=hunting_stand poi_hunting_stand\n" + "? amenity=kindergarten poi_kindergarten\n" + "? amenity=library poi_library\n" + "? amenity=nightclub poi_nightclub\n" + "? amenity=park_bench poi_bench\n" + "? amenity=parking poi_car_parking\n" + "? amenity=pharmacy poi_pharmacy\n" + "? amenity=place_of_worship,religion=christian poi_church\n" + "? amenity=place_of_worship poi_worship\n" + "? amenity=police poi_police\n" + "? amenity=post_box poi_post_box\n" + "? amenity=post_office poi_post_office\n" + "? amenity=prison poi_prison\n" + "? amenity=pub poi_pub\n" + "? amenity=public_building poi_public_office\n" + "? amenity=recycling poi_recycling\n" + "? amenity=restaurant,cuisine=fine_dining poi_dining\n" + "? amenity=restaurant poi_restaurant\n" + "? amenity=school poi_school\n" + "? amenity=shelter poi_shelter\n" + "? amenity=taxi poi_taxi\n" + "? amenity=tec_common tec_common\n" + "? amenity=telephone poi_telephone\n" + "? amenity=theatre poi_theater\n" + "? amenity=toilets poi_restroom\n" + "? amenity=townhall poi_townhall\n" + "? amenity=university poi_school_university\n" + "? amenity=vending_machine poi_vending_machine\n" + "n barrier=bollard barrier_bollard\n" + "n barrier=cycle_barrier barrier_cycle\n" + "n barrier=lift_gate barrier_lift_gate\n" + "? car=car_rental poi_car_rent\n" + "? highway=bus_station poi_bus_station\n" + "? highway=bus_stop poi_bus_stop\n" + "n highway=mini_roundabout mini_roundabout\n" + "n highway=motorway_junction highway_exit\n" + "n highway=stop traffic_sign_stop\n" + "n highway=toll_booth poi_toll_booth\n" + "n highway=traffic_signals traffic_signals\n" + "n highway=turning_circle turning_circle\n" + "? historic=boundary_stone poi_boundary_stone\n" + "? historic=castle poi_castle\n" + "? historic=memorial poi_memorial\n" + "? historic=monument poi_monument\n" + "? historic=ruins poi_ruins\n" +// "? historic=* poi_ruins\n" + "? landuse=cemetery poi_cemetery\n" + "? leisure=fishing poi_fish\n" + "? leisure=golf_course poi_golf\n" + "? leisure=marina poi_marine\n" + "? leisure=playground poi_playground\n" + "? leisure=slipway poi_boat_ramp\n" + "? leisure=sports_centre poi_sport\n" + "? leisure=stadium poi_stadium\n" + "? man_made=tower poi_tower\n" + "? military=airfield poi_military\n" + "? military=barracks poi_military\n" + "? military=bunker poi_military\n" + "? military=danger_area poi_danger_area\n" + "? military=range poi_military\n" + "? natural=bay poi_bay\n" + "? natural=peak,ele=* poi_peak\n" // show only major peaks with elevation + "? natural=tree poi_tree\n" + "n place=city town_label_2e5\n" + "n place=hamlet town_label_2e2\n" + "n place=locality town_label_2e0\n" + "n place=suburb district_label\n" + "n place=town town_label_2e4\n" + "n place=village town_label_2e3\n" + "n power=tower power_tower\n" + "n power=sub_station power_substation\n" + "n railway=halt poi_rail_halt\n" + "n railway=level_crossing poi_level_crossing\n" + "? railway=station poi_rail_station\n" + "? railway=tram_stop poi_rail_tram_stop\n" + "? shop=baker poi_shop_baker\n" + "? shop=bakery poi_shop_baker\n" + "? shop=beverages poi_shop_beverages\n" + "? shop=bicycle poi_shop_bicycle\n" + "? shop=butcher poi_shop_butcher\n" + "? shop=car poi_car_dealer_parts\n" + "? shop=car_repair poi_repair_service\n" + "? shop=clothes poi_shop_apparel\n" + "? shop=convenience poi_shop_grocery\n" + "? shop=drogist poi_shop_drugstore\n" + "? shop=florist poi_shop_florist\n" + "? shop=fruit poi_shop_fruit\n" + "? shop=furniture poi_shop_furniture\n" + "? shop=garden_centre poi_shop_handg\n" + "? shop=hardware poi_shop_handg\n" + "? shop=hairdresser poi_hairdresser\n" + "? shop=kiosk poi_shop_kiosk\n" + "? shop=optician poi_shop_optician\n" + "? shop=parfum poi_shop_parfum\n" + "? shop=photo poi_shop_photo\n" + "? shop=shoes poi_shop_shoes\n" + "? shop=supermarket poi_shopping\n" + "? sport=10pin poi_bowling\n" + "? sport=baseball poi_baseball\n" + "? sport=basketball poi_basketball\n" + "? sport=climbing poi_climbing\n" + "? sport=golf poi_golf\n" + "? sport=motor_sports poi_motor_sport\n" + "? sport=skiing poi_skiing\n" + "? sport=soccer poi_soccer\n" + "? sport=stadium poi_stadium\n" + "? sport=swimming poi_swimming\n" + "? sport=tennis poi_tennis\n" + "? tourism=attraction poi_attraction\n" + "? tourism=camp_site poi_camp_rv\n" + "? tourism=caravan_site poi_camp_rv\n" + "? tourism=guest_house poi_guesthouse\n" + "? tourism=hostel poi_hostel\n" + "? tourism=hotel poi_hotel\n" + "? tourism=information poi_information\n" + "? tourism=motel poi_motel\n" + "? tourism=museum poi_museum_history\n" + "? tourism=picnic_site poi_picnic\n" + "? tourism=theme_park poi_resort\n" + "? tourism=viewpoint poi_viewpoint\n" + "? tourism=zoo poi_zoo\n" + "n traffic_sign=city_limit traffic_sign_city_limit\n" + "n highway=speed_camera tec_common\n" + "w *=* street_unkn\n" + "w addr:interpolation=even house_number_interpolation_even\n" + "w addr:interpolation=odd house_number_interpolation_odd\n" + "w addr:interpolation=all house_number_interpolation_all\n" + "w addr:interpolation=alphabetic house_number_interpolation_alphabetic\n" + "w aerialway=cable_car lift_cable_car\n" + "w aerialway=chair_lift lift_chair\n" + "w aerialway=drag_lift lift_drag\n" + "w aeroway=aerodrome poly_airport\n" + "w aeroway=apron poly_apron\n" + "w aeroway=runway aeroway_runway\n" + "w aeroway=taxiway aeroway_taxiway\n" + "w aeroway=terminal poly_terminal\n" + "w amenity=college poly_college\n" + "w amenity=grave_yard poly_cemetery\n" + "w amenity=parking poly_car_parking\n" + "w amenity=place_of_worship poly_building\n" + "w amenity=university poly_university\n" + "w boundary=administrative,admin_level=2 border_country\n" + "w boundary=civil border_civil\n" + "w boundary=national_park border_national_park\n" + "w boundary=political border_political\n" + "w building=* poly_building\n" + "w contour_ext=elevation_major height_line_1\n" + "w contour_ext=elevation_medium height_line_2\n" + "w contour_ext=elevation_minor height_line_3\n" + "w highway=bridleway bridleway\n" + "w highway=bus_guideway bus_guideway\n" + "w highway=construction street_construction\n" + "w highway=cyclepath cycleway\n" + "w highway=cycleway cycleway\n" + "w highway=footway footway\n" + "w highway=footway,piste:type=nordic footway_and_piste_nordic\n" + "w highway=living_street living_street\n" + "w highway=minor street_1_land\n" + "w highway=parking_lane street_parking_lane\n" + "w highway=path path\n" + "w highway=path,bicycle=designated cycleway\n" + "w highway=path,bicycle=official cycleway\n" + "w highway=path,bicycle=designated,foot=designated cycleway\n" + "w highway=path,bicycle=official,foot=official cycleway\n" + "w highway=path,foot=designated footway\n" + "w highway=path,foot=official footway\n" + "w highway=path,horse=designated bridleway\n" + "w highway=path,horse=official bridleway\n" + "w highway=path,sac_scale=alpine_hiking hiking_alpine\n" + "w highway=path,sac_scale=demanding_alpine_hiking hiking_alpine_demanding\n" + "w highway=path,sac_scale=demanding_mountain_hiking hiking_mountain_demanding\n" + "w highway=path,sac_scale=difficult_alpine_hiking hiking_alpine_difficult\n" + "w highway=path,sac_scale=hiking hiking\n" + "w highway=path,sac_scale=mountain_hiking hiking_mountain\n" + "w highway=pedestrian street_pedestrian\n" + "w highway=pedestrian,area=1 poly_pedestrian\n" + "w highway=plaza poly_plaza\n" + "w highway=motorway highway_land\n" + "w highway=motorway,rural=0 highway_city\n" + "w highway=motorway_link ramp\n" + "w highway=trunk street_n_lanes\n" + "w highway=trunk_link ramp\n" + "w highway=primary street_4_land\n" + "w highway=primary,name=*,rural=1 street_4_land\n" + "w highway=primary,name=* street_4_city\n" + "w highway=primary,rural=0 street_4_city\n" + "w highway=primary_link ramp\n" + "w highway=secondary street_3_land\n" + "w highway=secondary,name=*,rural=1 street_3_land\n" + "w highway=secondary,name=* street_3_city\n" + "w highway=secondary,rural=0 street_3_city\n" + "w highway=secondary,area=1 poly_street_3\n" + "w highway=secondary_link ramp\n" + "w highway=tertiary street_2_land\n" + "w highway=tertiary,name=*,rural=1 street_2_land\n" + "w highway=tertiary,name=* street_2_city\n" + "w highway=tertiary,rural=0 street_2_city\n" + "w highway=tertiary,area=1 poly_street_2\n" + "w highway=tertiary_link ramp\n" + "w highway=residential street_1_city\n" + "w highway=residential,area=1 poly_street_1\n" + "w highway=unclassified street_1_city\n" + "w highway=unclassified,area=1 poly_street_1\n" + "w highway=road street_1_city\n" + "w highway=service street_service\n" + "w highway=service,area=1 poly_service\n" + "w highway=service,service=parking_aisle street_parking_lane\n" + "w highway=track track_gravelled\n" + "w highway=track,surface=grass track_grass\n" + "w highway=track,surface=gravel track_gravelled\n" + "w highway=track,surface=ground track_ground\n" + "w highway=track,surface=paved track_paved\n" + "w highway=track,surface=unpaved track_unpaved\n" + "w highway=track,tracktype=grade1 track_paved\n" + "w highway=track,tracktype=grade2 track_gravelled\n" + "w highway=track,tracktype=grade3 track_unpaved\n" + "w highway=track,tracktype=grade4 track_ground\n" + "w highway=track,tracktype=grade5 track_grass\n" + "w highway=track,surface=paved,tracktype=grade1 track_paved\n" + "w highway=track,surface=gravel,tracktype=grade2 track_gravelled\n" + "w highway=track,surface=unpaved,tracktype=grade3 track_unpaved\n" + "w highway=track,surface=ground,tracktype=grade4 track_ground\n" + "w highway=track,surface=grass,tracktype=grade5 track_grass\n" + "w highway=unsurfaced track_gravelled\n" + "w highway=steps steps\n" + "w historic=archaeological_site poly_archaeological_site\n" + "w historic=battlefield poly_battlefield\n" + "w historic=ruins poly_ruins\n" + "w historic=town gate poly_building\n" + "w landuse=allotments poly_allotments\n" + "w landuse=basin poly_basin\n" + "w landuse=brownfield poly_brownfield\n" + "w landuse=cemetery poly_cemetery\n" + "w landuse=commercial poly_commercial\n" + "w landuse=construction poly_construction\n" + "w landuse=farm poly_farm\n" + "w landuse=farmland poly_farm\n" + "w landuse=farmyard poly_town\n" + "w landuse=forest poly_wood\n" + "w landuse=greenfield poly_greenfield\n" + "w landuse=industrial poly_industry\n" + "w landuse=landfill poly_landfill\n" + "w landuse=military poly_military\n" + "w landuse=plaza poly_plaza\n" + "w landuse=quarry poly_quarry\n" + "w landuse=railway poly_railway\n" + "w landuse=recreation_ground poly_recreation_ground\n" + "w landuse=reservoir poly_reservoir\n" + "w landuse=residential poly_town\n" + "w landuse=residential,area=1 poly_town\n" + "w landuse=retail poly_retail\n" + "w landuse=village_green poly_village_green\n" + "w landuse=vineyard poly_farm\n" + "w leisure=common poly_common\n" + "w leisure=fishing poly_fishing\n" + "w leisure=garden poly_garden\n" + "w leisure=golf_course poly_golf_course\n" + "w leisure=marina poly_marina\n" + "w leisure=nature_reserve poly_nature_reserve\n" + "w leisure=park poly_park\n" + "w leisure=pitch poly_sports_pitch\n" + "w leisure=playground poly_playground\n" + "w leisure=sports_centre poly_sport\n" + "w leisure=stadium poly_sports_stadium\n" + "w leisure=track poly_sports_track\n" + "w leisure=water_park poly_water_park\n" + "w military=airfield poly_airfield\n" + "w military=barracks poly_barracks\n" + "w military=danger_area poly_danger_area\n" + "w military=naval_base poly_naval_base\n" + "w military=range poly_range\n" + "w natural=beach poly_beach\n" + "w natural=coastline water_line\n" + "w natural=fell poly_fell\n" + "w natural=glacier poly_glacier\n" + "w natural=heath poly_heath\n" + "w natural=land poly_land\n" + "w natural=marsh poly_marsh\n" + "w natural=mud poly_mud\n" + "w natural=scree poly_scree\n" + "w natural=scrub poly_scrub\n" + "w natural=water poly_water\n" + "w natural=wood poly_wood\n" + "w piste:type=downhill,piste:difficulty=advanced piste_downhill_advanced\n" + "w piste:type=downhill,piste:difficulty=easy piste_downhill_easy\n" + "w piste:type=downhill,piste:difficulty=expert piste_downhill_expert\n" + "w piste:type=downhill,piste:difficulty=freeride piste_downhill_freeride\n" + "w piste:type=downhill,piste:difficulty=intermediate piste_downhill_intermediate\n" + "w piste:type=downhill,piste:difficulty=novice piste_downhill_novice\n" + "w piste:type=nordic piste_nordic\n" + "w place=suburb poly_place1\n" + "w place=hamlet poly_place2\n" + "w place=village poly_place3\n" + "w place=municipality poly_place4\n" + "w place=town poly_place5\n" + "w place=city poly_place6\n" + "w power=line powerline\n" + "w railway=abandoned rail_abandoned\n" + "w railway=disused rail_disused\n" + "w railway=light_rail rail_light\n" + "w railway=monorail rail_mono\n" + "w railway=narrow_gauge rail_narrow_gauge\n" + "w railway=preserved rail_preserved\n" + "w railway=rail rail\n" + "w railway=subway rail_subway\n" + "w railway=tram rail_tram\n" + "w route=ferry ferry\n" + "w route=ski piste_nordic\n" + "w sport=* poly_sport\n" + "w tourism=artwork poly_artwork\n" + "w tourism=attraction poly_attraction\n" + "w tourism=camp_site poly_camp_site\n" + "w tourism=caravan_site poly_caravan_site\n" + "w tourism=picnic_site poly_picnic_site\n" + "w tourism=theme_park poly_theme_park\n" + "w tourism=zoo poly_zoo\n" + "w waterway=canal water_canal\n" + "w waterway=drain water_drain\n" + "w waterway=river water_river\n" + "w waterway=riverbank poly_water\n" + "w waterway=stream water_stream\n" + "w barrier=ditch ditch\n" + "w barrier=hedge hedge\n" + "w barrier=fence fence\n" + "w barrier=wall wall\n" + "w barrier=retaining_wall retaining_wall\n" + "w barrier=city_wall city_wall\n" +}; + + +static void +build_attrmap_line(char *line) +{ + char *t=NULL,*kvl=NULL,*i=NULL,*p,*kv; + struct attr_mapping *attr_mapping=g_malloc0(sizeof(struct attr_mapping)); + int idx,attr_mapping_count=0; + t=line; + p=strchr(t,'\t'); + if (p) { + while (*p == '\t') + *p++='\0'; + kvl=p; + p=strchr(kvl,'\t'); + } + if (p) { + while (*p == '\t') + *p++='\0'; + i=p; + } + if (t[0] == 'w') { + if (! i) + i="street_unkn"; + } else { + if (! i) + i="point_unkn"; + } + attr_mapping->type=item_from_name(i); + if (!attr_mapping->type) { + printf("no id found for '%s'\n",i); + } + while ((kv=strtok(kvl, ","))) { + kvl=NULL; + if (!(idx=(int)(long)g_hash_table_lookup(attr_hash, kv))) { + idx=attr_present_count++; + g_hash_table_insert(attr_hash, kv, (gpointer)(long)idx); + } + attr_mapping=g_realloc(attr_mapping, sizeof(struct attr_mapping)+(attr_mapping_count+1)*sizeof(int)); + attr_mapping->attr_present_idx[attr_mapping_count++]=idx; + attr_mapping->attr_present_idx_count=attr_mapping_count; + } + if (t[0]== 'w') { + attr_mapping_way=g_realloc(attr_mapping_way, sizeof(*attr_mapping_way)*(attr_mapping_way_count+1)); + attr_mapping_way[attr_mapping_way_count++]=attr_mapping; + } + if (t[0]== '?' && doway2poi) { + attr_mapping_way2poi=g_realloc(attr_mapping_way2poi, sizeof(*attr_mapping_way2poi)*(attr_mapping_way2poi_count+1)); + attr_mapping_way2poi[attr_mapping_way2poi_count++]=attr_mapping; + } + if (t[0]!= 'w') { + attr_mapping_node=g_realloc(attr_mapping_node, sizeof(*attr_mapping_node)*(attr_mapping_node_count+1)); + attr_mapping_node[attr_mapping_node_count++]=attr_mapping; + } + +} + +static void +build_attrmap(FILE* rule_file) +{ + attr_hash=g_hash_table_new(g_str_hash, g_str_equal); + attr_present_count=1; + + // build attribute map from rule file if given + if( rule_file ) + { + char buffer[200], *p; + while (fgets( buffer, 200, rule_file )) { + p=strchr(buffer,'\n'); + if(p) + *p = 0; + build_attrmap_line( g_strdup( buffer ) ); + } + fclose( rule_file ); + } + // use hardcoded default attributes + else + { + char *p,*map=g_strdup(attrmap); + while (map) { + p=strchr(map,'\n'); + if (p) + *p++='\0'; + if (strlen(map)) + build_attrmap_line(map); + map=p; + } + } + + attr_present=g_malloc0(sizeof(*attr_present)*attr_present_count); +} + +static void +build_countrytable(void) +{ + int i; + char *names,*str,*tok; + country_table_hash=g_hash_table_new(g_str_hash, g_str_equal); + for (i = 0 ; i < sizeof(country_table)/sizeof(struct country_table) ; i++) { + names=g_strdup(country_table[i].names); + str=names; + while ((tok=strtok(str, ","))) { + str=NULL; + g_hash_table_insert(country_table_hash, tok, (gpointer)&country_table[i]); + } + } +} + +void +osm_warning(char *type, long long id, int cont, char *fmt, ...) +{ + char str[4096]; + va_list ap; + va_start(ap, fmt); + vsnprintf(str, sizeof(str), fmt, ap); + va_end(ap); + fprintf(stderr,"%shttp://www.openstreetmap.org/browse/%s/"LONGLONG_FMT" %s",cont ? "":"OSM Warning:",type,id,str); +} + +void +osm_info(char *type, long long id, int cont, char *fmt, ...) +{ + char str[4096]; + va_list ap; + va_start(ap, fmt); + vsnprintf(str, sizeof(str), fmt, ap); + va_end(ap); + fprintf(stderr,"%shttp://www.openstreetmap.org/browse/%s/"LONGLONG_FMT" %s",cont ? "":"OSM Info:",type,id,str); +} + +static void +attr_strings_clear(void) +{ + attr_strings_buffer_len=0; + memset(attr_strings, 0, sizeof(attr_strings)); +} + +static void +attr_strings_save(enum attr_strings id, char *str) +{ + attr_strings[id]=attr_strings_buffer+attr_strings_buffer_len; + strcpy(attr_strings[id], str); + attr_strings_buffer_len+=strlen(str)+1; +} + +long long +item_bin_get_nodeid(struct item_bin *ib) +{ + long long *ret=item_bin_get_attr(ib, attr_osm_nodeid, NULL); + if (ret) + return *ret; + return 0; +} + +long long +item_bin_get_wayid(struct item_bin *ib) +{ + long long *ret=item_bin_get_attr(ib, attr_osm_wayid, NULL); + if (ret) + return *ret; + return 0; +} + +long long +item_bin_get_relationid(struct item_bin *ib) +{ + long long *ret=item_bin_get_attr(ib, attr_osm_relationid, NULL); + if (ret) + return *ret; + return 0; +} + +long long +item_bin_get_id(struct item_bin *ib) +{ + long long ret; + if (ib->type < 0x80000000) + return item_bin_get_nodeid(ib); + ret=item_bin_get_wayid(ib); + if (!ret) + ret=item_bin_get_relationid(ib); + return ret; +} + +static int node_is_tagged; +static void relation_add_tag(char *k, char *v); + +static int +access_value(char *v) +{ + if (!strcmp(v,"1")) + return 1; + if (!strcmp(v,"yes")) + return 1; + if (!strcmp(v,"designated")) + return 1; + if (!strcmp(v,"official")) + return 1; + if (!strcmp(v,"permissive")) + return 1; + if (!strcmp(v,"0")) + return 2; + if (!strcmp(v,"no")) + return 2; + if (!strcmp(v,"agricultural")) + return 2; + if (!strcmp(v,"forestry")) + return 2; + if (!strcmp(v,"private")) + return 2; + if (!strcmp(v,"delivery")) + return 2; + if (!strcmp(v,"destination")) + return 2; + return 3; +} + +void +osm_add_tag(char *k, char *v) +{ + int idx,level=2; + char buffer[BUFFER_SIZE*2+2]; + if (in_relation) { + relation_add_tag(k,v); + return; + } + if (! strcmp(k,"ele")) + level=9; + if (! strcmp(k,"time")) + level=9; + if (! strcmp(k,"created_by")) + level=9; + if (! strncmp(k,"tiger:",6) || !strcmp(k,"AND_nodes")) + level=9; + if (! strcmp(k,"converted_by") || ! strcmp(k,"source")) + level=8; + if (! strncmp(k,"osmarender:",11) || !strncmp(k,"svg:",4)) + level=8; + if (! strcmp(k,"layer")) + level=7; + if (! strcasecmp(v,"true") || ! strcasecmp(v,"yes")) + v="1"; + if (! strcasecmp(v,"false") || ! strcasecmp(v,"no")) + v="0"; + if (! strcmp(k,"oneway")) { + if (!strcmp(v,"1")) { + flags[0] |= AF_ONEWAY | AF_ROUNDABOUT_VALID; + } + if (! strcmp(v,"-1")) { + flags[0] |= AF_ONEWAYREV | AF_ROUNDABOUT_VALID; + } + if (!in_way) + level=6; + else + level=5; + } + if (! strcmp(k,"junction")) { + if (! strcmp(v,"roundabout")) + flags[0] |= AF_ONEWAY | AF_ROUNDABOUT | AF_ROUNDABOUT_VALID; + } + if (! strcmp(k,"maxspeed")) { + if (strstr(v, "mph")) { + maxspeed_attr_value = (int)floor(atof(v) * 1.609344); + } else { + maxspeed_attr_value = atoi(v); + } + if (maxspeed_attr_value) + flags[0] |= AF_SPEED_LIMIT; + level=5; + } + if (! strcmp(k,"toll")) { + if (!strcmp(v,"1")) { + flags[0] |= AF_TOLL; + } + } + if (! strcmp(k,"access")) { + flags[access_value(v)] |= AF_DANGEROUS_GOODS|AF_EMERGENCY_VEHICLES|AF_TRANSPORT_TRUCK|AF_DELIVERY_TRUCK|AF_PUBLIC_BUS|AF_TAXI|AF_HIGH_OCCUPANCY_CAR|AF_CAR|AF_MOTORCYCLE|AF_MOPED|AF_HORSE|AF_BIKE|AF_PEDESTRIAN; + level=5; + } + if (! strcmp(k,"vehicle")) { + flags[access_value(v)] |= AF_DANGEROUS_GOODS|AF_EMERGENCY_VEHICLES|AF_TRANSPORT_TRUCK|AF_DELIVERY_TRUCK|AF_PUBLIC_BUS|AF_TAXI|AF_HIGH_OCCUPANCY_CAR|AF_CAR|AF_MOTORCYCLE|AF_MOPED|AF_BIKE; + level=5; + } + if (! strcmp(k,"motorvehicle")) { + flags[access_value(v)] |= AF_DANGEROUS_GOODS|AF_EMERGENCY_VEHICLES|AF_TRANSPORT_TRUCK|AF_DELIVERY_TRUCK|AF_PUBLIC_BUS|AF_TAXI|AF_HIGH_OCCUPANCY_CAR|AF_CAR|AF_MOTORCYCLE|AF_MOPED; + level=5; + } + if (! strcmp(k,"bicycle")) { + flags[access_value(v)] |= AF_BIKE; + level=5; + } + if (! strcmp(k,"foot")) { + flags[access_value(v)] |= AF_PEDESTRIAN; + level=5; + } + if (! strcmp(k,"horse")) { + flags[access_value(v)] |= AF_HORSE; + level=5; + } + if (! strcmp(k,"moped")) { + flags[access_value(v)] |= AF_MOPED; + level=5; + } + if (! strcmp(k,"motorcycle")) { + flags[access_value(v)] |= AF_MOTORCYCLE; + level=5; + } + if (! strcmp(k,"motorcar")) { + flags[access_value(v)] |= AF_CAR; + level=5; + } + if (! strcmp(k,"hov")) { + flags[access_value(v)] |= AF_HIGH_OCCUPANCY_CAR; + level=5; + } + if (! strcmp(k,"bus")) { + flags[access_value(v)] |= AF_PUBLIC_BUS; + level=5; + } + if (! strcmp(k,"taxi")) { + flags[access_value(v)] |= AF_TAXI; + level=5; + } + if (! strcmp(k,"goods")) { + flags[access_value(v)] |= AF_DELIVERY_TRUCK; + level=5; + } + if (! strcmp(k,"hgv")) { + flags[access_value(v)] |= AF_TRANSPORT_TRUCK; + level=5; + } + if (! strcmp(k,"emergency")) { + flags[access_value(v)] |= AF_EMERGENCY_VEHICLES; + level=5; + } + if (! strcmp(k,"hazmat")) { + flags[access_value(v)] |= AF_DANGEROUS_GOODS; + level=5; + } + if (! strcmp(k,"tunnel") && !strcmp(v,"1")) { + flags[0] |= AF_UNDERGROUND; + } + if (! strcmp(k,"note")) + level=5; + if (! strcmp(k,"name")) { + attr_strings_save(attr_string_label, v); + level=5; + } + if (! strcmp(k,"addr:email")) { + attr_strings_save(attr_string_email, v); + level=5; + } + if (! strcmp(k,"addr:housenumber")) { + attr_strings_save(attr_string_house_number, v); + level=5; + } + if (! strcmp(k,"addr:street")) { + attr_strings_save(attr_string_street_name, v); + level=5; + } + if (! strcmp(k,"phone")) { + attr_strings_save(attr_string_phone, v); + level=5; + } + if (! strcmp(k,"fax")) { + attr_strings_save(attr_string_fax, v); + level=5; + } + if (! strcmp(k,"postal_code")) { + attr_strings_save(attr_string_postal, v); + level=5; + } + if (! strcmp(k,"openGeoDB:postal_codes") && !attr_strings[attr_string_postal]) { + attr_strings_save(attr_string_postal, v); + level=5; + } + if (! strcmp(k,"population")) { + attr_strings_save(attr_string_population, v); + level=5; + } + if (! strcmp(k,"openGeoDB:population") && !attr_strings[attr_string_population]) { + attr_strings_save(attr_string_population, v); + level=5; + } + if (! strcmp(k,"ref")) { + if (in_way) + attr_strings_save(attr_string_street_name_systematic, v); + level=5; + } + if (! strcmp(k,"openGeoDB:is_in")) { + if (!is_in_buffer[0]) + strcpy(is_in_buffer, v); + level=5; + } + if (! strcmp(k,"is_in")) { + if (!is_in_buffer[0]) + strcpy(is_in_buffer, v); + level=5; + } + if (! strcmp(k,"is_in:country")) { + /** + * Sometimes there is no is_in tag, only is_in:country. + * I put this here so it can be overwritten by the previous if clause if there IS an is_in tag. + */ + strcpy(is_in_buffer, v); + level=5; + } + if (! strcmp(k,"place_county")) { + /** + * Ireland uses the place_county OSM tag to describe what county a town is in. + * This would be equivalent to is_in: Town; Locality; Country + * A real world example would be Node: Moycullen (52234625) + * The tag is processed as Moycullen; Galway; Ireland + * where Galway is the county + */ + strcpy(is_in_buffer, "Ireland"); + attr_strings_save(attr_string_county_name, v); + level=5; + } + if (! strcmp(k,"gnis:ST_alpha")) { + /* assume a gnis tag means it is part of the USA: + http://en.wikipedia.org/wiki/Geographic_Names_Information_System + many US towns do not have is_in tags + */ + strcpy(is_in_buffer, "USA"); + level=5; + } + if (! strcmp(k,"lanes")) { + level=5; + } + if (attr_debug_level >= level) { + int bytes_left = sizeof( debug_attr_buffer ) - strlen(debug_attr_buffer) - 1; + if ( bytes_left > 0 ) + { + snprintf(debug_attr_buffer+strlen(debug_attr_buffer), bytes_left, " %s=%s", k, v); + debug_attr_buffer[ sizeof( debug_attr_buffer ) - 1 ] = '\0'; + node_is_tagged=1; + } + } + if (level < 6) + node_is_tagged=1; + + strcpy(buffer,"*=*"); + if ((idx=(int)(long)g_hash_table_lookup(attr_hash, buffer))) + attr_present[idx]=1; + + sprintf(buffer,"%s=*", k); + if ((idx=(int)(long)g_hash_table_lookup(attr_hash, buffer))) + attr_present[idx]=2; + + sprintf(buffer,"*=%s", v); + if ((idx=(int)(long)g_hash_table_lookup(attr_hash, buffer))) + attr_present[idx]=2; + + sprintf(buffer,"%s=%s", k, v); + if ((idx=(int)(long)g_hash_table_lookup(attr_hash, buffer))) + attr_present[idx]=4; +} + +int coord_count; + +static void +extend_buffer(struct buffer *b) +{ + b->malloced+=b->malloced_step; + b->base=realloc(b->base, b->malloced); + if (b->base == NULL) { + fprintf(stderr,"realloc of %d bytes failed\n",(int)b->malloced); + exit(1); + } + +} + +int nodeid_last; +GHashTable *node_hash,*way_hash; + +static void +node_buffer_to_hash(void) +{ + int i,count=node_buffer.size/sizeof(struct node_item); + struct node_item *ni=(struct node_item *)node_buffer.base; + for (i = 0 ; i < count ; i++) + g_hash_table_insert(node_hash, (gpointer)(long)(ni[i].id), (gpointer)(long)i); +} + +static struct node_item *ni; + +void +flush_nodes(int final) +{ + fprintf(stderr,"flush_nodes %d\n",final); + save_buffer("coords.tmp",&node_buffer,slices*slice_size); + if (!final) { + node_buffer.size=0; + } + slices++; +} + +void +osm_add_node(osmid id, double lat, double lon) +{ + in_node=1; + if (node_buffer.size + sizeof(struct node_item) > node_buffer.malloced) + extend_buffer(&node_buffer); + attr_strings_clear(); + node_is_tagged=0; + nodeid=id; + item.type=type_point_unkn; + debug_attr_buffer[0]='\0'; + is_in_buffer[0]='\0'; + debug_attr_buffer[0]='\0'; + osmid_attr.type=attr_osm_nodeid; + osmid_attr.len=3; + osmid_attr_value=id; + if (node_buffer.size + sizeof(struct node_item) > slice_size) { + flush_nodes(0); + } + ni=(struct node_item *)(node_buffer.base+node_buffer.size); + ni->id=id; + ni->ref_node=0; + ni->ref_way=0; + ni->ref_ref=0; + ni->dummy=0; + ni->c.x=lon*6371000.0*M_PI/180; + ni->c.y=log(tan(M_PI_4+lat*M_PI/360))*6371000.0; + node_buffer.size+=sizeof(struct node_item); + if (! node_hash) { + if (ni->id > nodeid_last) { + nodeid_last=ni->id; + } else { + fprintf(stderr,"INFO: Nodes out of sequence (new %d vs old %d), adding hash\n", ni->id, nodeid_last); + node_hash=g_hash_table_new(NULL, NULL); + node_buffer_to_hash(); + } + } else + if (!g_hash_table_lookup(node_hash, (gpointer)(long)(ni->id))) + g_hash_table_insert(node_hash, (gpointer)(long)(ni->id), (gpointer)(long)(ni-(struct node_item *)node_buffer.base)); + else { + node_buffer.size-=sizeof(struct node_item); + nodeid=0; + } + +} + +void +clear_node_item_buffer(void) +{ + int j,count=node_buffer.size/sizeof(struct node_item); + struct node_item *ni=(struct node_item *)(node_buffer.base); + for (j = 0 ; j < count ; j++) { + ni[j].ref_way=0; + } +} + +static struct node_item * +node_item_get(int id) +{ + struct node_item *ni=(struct node_item *)(node_buffer.base); + int count=node_buffer.size/sizeof(struct node_item); + int interval=count/4; + int p=count/2; + if(interval==0) { + // If fewer than 4 nodes defined so far set interval to 1 to + // avoid infinite loop + interval = 1; + } + if (node_hash) { + int i; + i=(int)(long)(g_hash_table_lookup(node_hash, (gpointer)(long)id)); + return ni+i; + } + if (ni[0].id > id) + return NULL; + if (ni[count-1].id < id) + return NULL; + while (ni[p].id != id) { +#if 0 + fprintf(stderr,"p=%d count=%d interval=%d id=%d ni[p].id=%d\n", p, count, interval, id, ni[p].id); +#endif + if (ni[p].id < id) { + p+=interval; + if (interval == 1) { + if (p >= count) + return NULL; + if (ni[p].id > id) + return NULL; + } else { + if (p >= count) + p=count-1; + } + } else { + p-=interval; + if (interval == 1) { + if (p < 0) + return NULL; + if (ni[p].id < id) + return NULL; + } else { + if (p < 0) + p=0; + } + } + if (interval > 1) + interval/=2; + } + return &ni[p]; +} + +static int +load_node(FILE *coords, int p, struct node_item *ret) +{ + fseek(coords, p*sizeof(struct node_item), SEEK_SET); + if (fread(ret, sizeof(*ret), 1, coords) != 1) { + fprintf(stderr,"read failed\n"); + return 0; + } + return 1; +} + +static int +node_item_get_from_file(FILE *coords, int id, struct node_item *ret) +{ + int count; + int interval; + int p; + if (node_hash) { + int i; + i=(int)(long)(g_hash_table_lookup(node_hash, (gpointer)(long)id)); + fseek(coords, i*sizeof(*ret), SEEK_SET); + if (fread(ret, sizeof(*ret), 1, coords) == 1) + return 1; + else + return 0; + } + + fseek(coords, 0, SEEK_END); + count=ftell(coords)/sizeof(struct node_item); + interval=count/4; + p=count/2; + if(interval==0) { + // If fewer than 4 nodes defined so far set interval to 1 to + // avoid infinite loop + interval = 1; + } + if (!load_node(coords, p, ret)) + return 0; + for (;;) { + if (ret->id == id) + return 1; + if (ret->id < id) { + p+=interval; + if (interval == 1) { + if (p >= count) + return 0; + if (!load_node(coords, p, ret)) + return 0; + if (ret->id > id) + return 0; + } else { + if (p >= count) + p=count-1; + if (!load_node(coords, p, ret)) + return 0; + } + } else { + p-=interval; + if (interval == 1) { + if (p < 0) + return 0; + if (!load_node(coords, p, ret)) + return 0; + if (ret->id < id) + return 0; + } else { + if (p < 0) + p=0; + if (!load_node(coords, p, ret)) + return 0; + } + } + if (interval > 1) + interval/=2; + } +} + +void +osm_add_way(osmid id) +{ + static int wayid_last; + + in_way=1; + wayid=id; + coord_count=0; + attr_strings_clear(); + item.type=type_street_unkn; + debug_attr_buffer[0]='\0'; + maxspeed_attr_value=0; + flags_attr_value = 0; + memset(flags, 0, sizeof(flags)); + debug_attr_buffer[0]='\0'; + osmid_attr_value=id; + if (wayid < wayid_last && !way_hash) { + fprintf(stderr,"INFO: Ways out of sequence (new %d vs old %d), adding hash\n", wayid, wayid_last); + way_hash=g_hash_table_new(NULL, NULL); + } + wayid_last=wayid; +} + +char relation_type[BUFFER_SIZE]; +char iso_code[BUFFER_SIZE]; +int admin_level; +int boundary; + +void +osm_add_relation(osmid id) +{ + current_id=id; + in_relation=1; + debug_attr_buffer[0]='\0'; + relation_type[0]='\0'; + iso_code[0]='\0'; + admin_level=-1; + boundary=0; + item_bin_init(item_bin, type_none); + item_bin_add_attr_longlong(item_bin, attr_osm_relationid, current_id); +} + +static int +country_id_from_iso2(char *iso) +{ + int ret=0; + if (iso) { + struct country_search *search; + struct attr country_iso2,country_id; + struct item *item; + country_iso2.type=attr_country_iso2; + country_iso2.u.str=iso; + search=country_search_new(&country_iso2,0); + if ((item=country_search_get_item(search)) && item_attr_get(item, attr_country_id, &country_id)) + ret=country_id.u.num; + + country_search_destroy(search); + } + return ret; +} + +static struct country_table * +country_from_countryid(int id) +{ + int i; + for (i = 0 ; i < sizeof(country_table)/sizeof(struct country_table) ; i++) { + if (country_table[i].countryid == id) + return &country_table[i]; + } + return NULL; +} + +struct country_table * +country_from_iso2(char *iso) +{ + return country_from_countryid(country_id_from_iso2(iso)); +} + + +void +osm_end_relation(struct maptool_osm *osm) +{ + in_relation=0; + if ((!strcmp(relation_type, "multipolygon") || !strcmp(relation_type, "boundary")) && boundary) { +#if 0 + if (admin_level == 2) { + FILE *f; + fprintf(stderr,"Multipolygon for %s\n", iso_code); + char *name=g_strdup_printf("country_%s.tmp",iso_code); + f=fopen(name,"w"); + item_bin_write(item_bin, f); + fclose(f); + } +#endif + item_bin_write(item_bin, osm->boundaries); + } + + if (!strcmp(relation_type, "restriction") && (item_bin->type == type_street_turn_restriction_no || item_bin->type == type_street_turn_restriction_only)) + item_bin_write(item_bin, osm->turn_restrictions); +} + +void +osm_add_member(int type, osmid ref, char *role) +{ + char member_buffer[BUFFER_SIZE*3+3]; + struct attr memberattr = { attr_osm_member }; + + sprintf(member_buffer,"%d:"LONGLONG_FMT":%s", type, (long long) ref, role); + memberattr.u.str=member_buffer; + item_bin_add_attr(item_bin, &memberattr); +} + +static void +relation_add_tag(char *k, char *v) +{ + int add_tag=1; +#if 0 + fprintf(stderr,"add tag %s %s\n",k,v); +#endif + if (!strcmp(k,"type")) { + strcpy(relation_type, v); + add_tag=0; + } + else if (!strcmp(k,"restriction")) { + if (!strncmp(v,"no_",3)) { + item_bin->type=type_street_turn_restriction_no; + add_tag=0; + } else if (!strncmp(v,"only_",5)) { + item_bin->type=type_street_turn_restriction_only; + add_tag=0; + } else { + item_bin->type=type_none; + osm_warning("relation", current_id, 0, "Unknown restriction %s\n",v); + } + } else if (!strcmp(k,"admin_level")) { + admin_level=atoi(v); + } else if (!strcmp(k,"boundary")) { + if (!strcmp(v,"administrative") || (experimental && !strcmp(v,"postal_code"))) { + boundary=1; + } + } else if (!strcmp(k,"ISO3166-1")) { + strcpy(iso_code, v); + } + if (add_tag) { + char tag[strlen(k)+strlen(v)+2]; + sprintf(tag,"%s=%s",k,v); + item_bin_add_attr_string(item_bin, attr_osm_tag, tag); + } +} + + +static int +attr_longest_match(struct attr_mapping **mapping, int mapping_count, enum item_type *types, int types_count) +{ + int i,j,longest=0,ret=0,sum,val; + struct attr_mapping *curr; + for (i = 0 ; i < mapping_count ; i++) { + sum=0; + curr=mapping[i]; + for (j = 0 ; j < curr->attr_present_idx_count ; j++) { + val=attr_present[curr->attr_present_idx[j]]; + if (val) + sum+=val; + else { + sum=-1; + break; + } + } + if (sum > longest) { + longest=sum; + ret=0; + } + if (sum > 0 && sum == longest && ret < types_count) + types[ret++]=curr->type; + } + return ret; +} + +static void +attr_longest_match_clear(void) +{ + memset(attr_present, 0, sizeof(*attr_present)*attr_present_count); +} + +void +osm_end_way(struct maptool_osm *osm) +{ + int i,count; + int *def_flags,add_flags; + enum item_type types[10]; + struct item_bin *item_bin; + int count_lines=0, count_areas=0; + + in_way=0; + + if (! osm->ways) + return; + + if (dedupe_ways_hash) { + if (g_hash_table_lookup(dedupe_ways_hash, (gpointer)(long)wayid)) + return; + g_hash_table_insert(dedupe_ways_hash, (gpointer)(long)wayid, (gpointer)1); + } + + count=attr_longest_match(attr_mapping_way, attr_mapping_way_count, types, sizeof(types)/sizeof(enum item_type)); + if (!count) { + count=1; + types[0]=type_street_unkn; + } + if (count >= 10) { + fprintf(stderr,"way id %ld\n",osmid_attr_value); + dbg_assert(count < 10); + } + for (i = 0 ; i < count ; i++) { + add_flags=0; + if (types[i] == type_none) + continue; + if (ignore_unkown && (types[i] == type_street_unkn || types[i] == type_point_unkn)) + continue; + if (types[i] != type_street_unkn) { + if(types[i]ways); + } + if(osm->line2poi) { + count=attr_longest_match(attr_mapping_way2poi, attr_mapping_way2poi_count, types, sizeof(types)/sizeof(enum item_type)); + dbg_assert(count < 10); + for (i = 0 ; i < count ; i++) { + if (types[i] == type_none || types[i] == type_point_unkn) + continue; + item_bin=init_item(types[i]); + item_bin_add_coord(item_bin, coord_buffer, coord_count); + item_bin_add_attr_string(item_bin, attr_label, attr_strings[attr_string_label]); + item_bin_add_attr_string(item_bin, attr_house_number, attr_strings[attr_string_house_number]); + item_bin_add_attr_string(item_bin, attr_street_name, attr_strings[attr_string_street_name]); + item_bin_add_attr_string(item_bin, attr_phone, attr_strings[attr_string_phone]); + item_bin_add_attr_string(item_bin, attr_fax, attr_strings[attr_string_fax]); + item_bin_add_attr_string(item_bin, attr_email, attr_strings[attr_string_email]); + item_bin_add_attr_string(item_bin, attr_county_name, attr_strings[attr_string_county_name]); + item_bin_add_attr_string(item_bin, attr_url, attr_strings[attr_string_url]); + item_bin_add_attr_longlong(item_bin, attr_osm_wayid, osmid_attr_value); + item_bin_write(item_bin, count_areasline2poi:osm->poly2poi); + } + } + attr_longest_match_clear(); +} + +void +osm_end_node(struct maptool_osm *osm) +{ + int count,i; + char *postal; + enum item_type types[10]; + struct item_bin *item_bin; + in_node=0; + + if (!osm->nodes || ! node_is_tagged || ! nodeid) + return; + count=attr_longest_match(attr_mapping_node, attr_mapping_node_count, types, sizeof(types)/sizeof(enum item_type)); + if (!count) { + types[0]=type_point_unkn; + count=1; + } + dbg_assert(count < 10); + for (i = 0 ; i < count ; i++) { + if (types[i] == type_none) + continue; + if (ignore_unkown && (types[i] == type_street_unkn || types[i] == type_point_unkn)) + continue; + item_bin=init_item(types[i]); + if (item_is_town(*item_bin) && attr_strings[attr_string_population]) + item_bin_set_type_by_population(item_bin, atoi(attr_strings[attr_string_population])); + item_bin_add_coord(item_bin, &ni->c, 1); + item_bin_add_attr_string(item_bin, item_is_town(*item_bin) ? attr_town_name : attr_label, attr_strings[attr_string_label]); + item_bin_add_attr_string(item_bin, attr_house_number, attr_strings[attr_string_house_number]); + item_bin_add_attr_string(item_bin, attr_street_name, attr_strings[attr_string_street_name]); + item_bin_add_attr_string(item_bin, attr_phone, attr_strings[attr_string_phone]); + item_bin_add_attr_string(item_bin, attr_fax, attr_strings[attr_string_fax]); + item_bin_add_attr_string(item_bin, attr_email, attr_strings[attr_string_email]); + item_bin_add_attr_string(item_bin, attr_county_name, attr_strings[attr_string_county_name]); + item_bin_add_attr_string(item_bin, attr_url, attr_strings[attr_string_url]); + item_bin_add_attr_longlong(item_bin, attr_osm_nodeid, osmid_attr_value); + item_bin_add_attr_string(item_bin, attr_debug, debug_attr_buffer); + postal=attr_strings[attr_string_postal]; + if (postal) { + char *sep=strchr(postal,','); + if (sep) + *sep='\0'; + item_bin_add_attr_string(item_bin, item_is_town(*item_bin) ? attr_town_postal : attr_postal, postal); + } + item_bin_write(item_bin,osm->nodes); + if (item_is_town(*item_bin) && attr_strings[attr_string_label] && osm->towns) { + item_bin=init_item(item_bin->type); + item_bin_add_coord(item_bin, &ni->c, 1); + item_bin_add_attr_string(item_bin, attr_osm_is_in, is_in_buffer); + item_bin_add_attr_longlong(item_bin, attr_osm_nodeid, osmid_attr_value); + item_bin_add_attr_string(item_bin, attr_town_postal, postal); + item_bin_add_attr_string(item_bin, attr_county_name, attr_strings[attr_string_county_name]); + item_bin_add_attr_string(item_bin, attr_town_name, attr_strings[attr_string_label]); + item_bin_write(item_bin, osm->towns); + } + } + processed_nodes_out++; + attr_longest_match_clear(); +} + +static struct country_table * +osm_process_town_unknown_country(void) +{ + static struct country_table *unknown; + if (!unknown) + unknown=country_from_countryid(999); + + return unknown; +} + +static struct country_table * +osm_process_town_by_is_in(struct item_bin *ib,char *is_in) +{ + struct country_table *result=NULL, *lookup; + char *tok,*dup=g_strdup(is_in),*buf=dup; + int conflict; + + while ((tok=strtok(buf, ",;"))) { + while (*tok==' ') + tok++; + lookup=g_hash_table_lookup(country_table_hash,tok); + if (lookup) { + if (result && result->countryid != lookup->countryid) { + char *label=item_bin_get_attr(ib, attr_town_name, NULL); + osm_warning("node",item_bin_get_nodeid(ib),0,"conflict for %s is_in=%s country %d vs %d\n", label, is_in, lookup->countryid, result->countryid); + conflict=1; + } + result=lookup; + } + buf=NULL; + } + g_free(dup); + return result; +} + +static struct country_table * +osm_process_town_by_boundary(GList *bl, struct item_bin *ib, struct coord *c, struct attr *attrs) +{ + GList *l,*matches=boundary_find_matches(bl, c); + struct boundary *match=NULL; + + l=matches; + while (l) { + struct boundary *b=l->data; + if (b->country) { + if (match) { + osm_warning("node",item_bin_get_nodeid(ib),0,"node (0x%x,0x%x) conflict country ", c->x, c->y); + osm_warning("relation",boundary_relid(match),1,"country %d vs ",match->country->countryid); + osm_warning("relation",boundary_relid(b),1,"country %d\n",b->country->countryid); + } + match=b; + } + l=g_list_next(l); + } + if (match) { + if (match && match->country && match->country->admin_levels && experimental) { + l=matches; + while (l) { + struct boundary *b=l->data; + char *admin_level=osm_tag_value(b->ib, "admin_level"); + char *postal=osm_tag_value(b->ib, "postal_code"); + if (admin_level) { + int a=atoi(admin_level); + int end=strlen(match->country->admin_levels)+3; + char *name; + if (a > 2 && a < end) { + enum attr_type attr_type=attr_none; + switch(match->country->admin_levels[a-3]) { + case 's': + attr_type=attr_state_name; + break; + case 'c': + attr_type=attr_county_name; + break; + case 'm': + attr_type=attr_municipality_name; + break; + } + name=osm_tag_value(b->ib, "name"); + if (name && attr_type != attr_none) { + attrs[a-2].type=attr_type; + attrs[a-2].u.str=name; + } + } + } + if (postal) { + attrs[0].type=attr_town_postal; + attrs[0].u.str=postal; + } + l=g_list_next(l); + } + } + return match->country; + } else + return NULL; +} + +void +osm_process_towns(FILE *in, FILE *boundaries, FILE *ways) +{ + struct item_bin *ib; + GList *bl=NULL; + struct attr attrs[10]; + + bl=process_boundaries(boundaries, ways); + while ((ib=read_item(in))) { + struct coord *c=(struct coord *)(ib+1); + struct country_table *result=NULL; + char *is_in=item_bin_get_attr(ib, attr_osm_is_in, NULL); + int i; + + memset(attrs, 0, sizeof(attrs)); + result=osm_process_town_by_boundary(bl, ib, c, attrs); + if (!result) + result=osm_process_town_by_is_in(ib, is_in); + if (!result && unknown_country) + result=osm_process_town_unknown_country(); + if (result) { + if (!result->file) { + char *name=g_strdup_printf("country_%d.unsorted.tmp", result->countryid); + result->file=fopen(name,"wb"); + g_free(name); + } + if (result->file) { + long long *nodeid; + if (is_in) + item_bin_remove_attr(ib, is_in); + nodeid=item_bin_get_attr(ib, attr_osm_nodeid, NULL); + if (nodeid) + item_bin_remove_attr(ib, nodeid); + if (attrs[0].type != attr_none) { + char *postal=item_bin_get_attr(ib, attr_town_postal, NULL); + if (postal) + item_bin_remove_attr(ib, postal); + } + for (i = 0 ; i < 10 ; i++) { + if (attrs[i].type != attr_none) + item_bin_add_attr(ib, &attrs[i]); + } + item_bin_write_match(ib, attr_town_name, attr_town_name_match, result->file); + } + } + } +} + +void +sort_countries(int keep_tmpfiles) +{ + int i; + struct country_table *co; + char *name_in,*name_out; + for (i = 0 ; i < sizeof(country_table)/sizeof(struct country_table) ; i++) { + co=&country_table[i]; + if (co->file) { + fclose(co->file); + co->file=NULL; + } + name_in=g_strdup_printf("country_%d.unsorted.tmp", co->countryid); + name_out=g_strdup_printf("country_%d.tmp", co->countryid); + co->r=world_bbox; + item_bin_sort_file(name_in, name_out, &co->r, &co->size); + if (!keep_tmpfiles) + unlink(name_in); + g_free(name_in); + g_free(name_out); + } +} + +struct relation_member { + int type; + long long id; + char *role; +}; + +static int +get_relation_member(char *str, struct relation_member *memb) +{ + int len; + sscanf(str,"%d:"LONGLONG_FMT":%n",&memb->type,&memb->id,&len); + memb->role=str+len; + return 1; +} + +static int +search_relation_member(struct item_bin *ib, char *role, struct relation_member *memb, int *min_count) +{ + char *str=NULL; + int count=0; + while ((str=item_bin_get_attr(ib, attr_osm_member, str))) { + if (!get_relation_member(str, memb)) + return 0; + count++; + if (!strcmp(memb->role, role) && (!min_count || *min_count < count)) { + if (min_count) + *min_count=count; + return 1; + } + } + return 0; +} + +static int +load_way_index(FILE *ways_index, int p, long long *idx) +{ + int step=sizeof(*idx)*2; + fseek(ways_index, p*step, SEEK_SET); + if (fread(idx, step, 1, ways_index) != 1) { + fprintf(stderr,"read failed\n"); + return 0; + } + return 1; +} + + +static int +seek_to_way(FILE *way, FILE *ways_index, long long wayid) +{ + long offset; + long long idx[2]; + int count,interval,p; + if (way_hash) { + if (!(g_hash_table_lookup_extended(way_hash, (gpointer)(long)wayid, NULL, (gpointer)&offset))) + return 0; + fseek(way, offset, SEEK_SET); + return 1; + } + fseek(ways_index, 0, SEEK_END); + count=ftell(ways_index)/sizeof(idx); + interval=count/4; + p=count/2; + if(interval==0) { + // If fewer than 4 nodes defined so far set interval to 1 to + // avoid infinite loop + interval = 1; + } + if (!load_way_index(ways_index, p, idx)) + return 0; + for (;;) { + if (idx[0] == wayid) { + fseek(way, idx[1], SEEK_SET); + return 1; + } + if (idx[0] < wayid) { + p+=interval; + if (interval == 1) { + if (p >= count) + return 0; + if (!load_way_index(ways_index, p, idx)) + return 0; + if (idx[0] > wayid) + return 0; + } else { + if (p >= count) + p=count-1; + if (!load_way_index(ways_index, p, idx)) + return 0; + } + } else { + p-=interval; + if (interval == 1) { + if (p < 0) + return 0; + if (!load_way_index(ways_index, p, idx)) + return 0; + if (idx[0] < wayid) + return 0; + } else { + if (p < 0) + p=0; + if (!load_way_index(ways_index, p, idx)) + return 0; + } + } + if (interval > 1) + interval/=2; + } +} + + +static struct coord * +get_way(FILE *way, FILE *ways_index, struct coord *c, long long wayid, struct item_bin *ret, int debug) +{ + long long currid; + int last; + struct coord *ic; + if (!seek_to_way(way, ways_index, wayid)) { + if (debug) + fprintf(stderr,"not found in index"); + return NULL; + } + while (item_bin_read(ret, way)) { + currid=item_bin_get_wayid(ret); + if (debug) + fprintf(stderr,LONGLONG_FMT":",currid); + if (currid != wayid) + return NULL; + ic=(struct coord *)(ret+1); + last=ret->clen/2-1; + if (debug) + fprintf(stderr,"(0x%x,0x%x)-(0x%x,0x%x)",ic[0].x,ic[0].y,ic[last].x,ic[last].y); + if (!c) + return &ic[0]; + if (ic[0].x == c->x && ic[0].y == c->y) + return &ic[last]; + if (ic[last].x == c->x && ic[last].y == c->y) + return &ic[0]; + } + return NULL; +} + +struct turn_restriction { + osmid relid; + enum item_type type; + struct coord *c[3]; + int c_count[3]; +}; + +static void +process_turn_restrictions_member(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv) +{ + int count,type=(long)member_priv; + struct turn_restriction *turn_restriction=relation_priv; + struct coord *c=(struct coord *)(member+1); + int ccount=member->clen/2; + + if (member->type < type_line) + count=1; + else + count=2; + turn_restriction->c[type]=g_renew(struct coord, turn_restriction->c[type], turn_restriction->c_count[type]+count); + turn_restriction->c[type][turn_restriction->c_count[type]++]=c[0]; + if (count > 1) + turn_restriction->c[type][turn_restriction->c_count[type]++]=c[ccount-1]; +} + +static void +process_turn_restrictions_fromto(struct turn_restriction *t, int type, struct coord **c) +{ + int i,j; + for (i = 0 ; i < t->c_count[type] ; i+=2) { + for (j = 0 ; j < t->c_count[1] ; j++) { + if (coord_is_equal(t->c[type][i],t->c[1][j])) { + c[0]=&t->c[type][i+1]; + c[1]=&t->c[type][i]; + return; + } + if (coord_is_equal(t->c[type][i+1],t->c[1][j])) { + c[0]=&t->c[type][i]; + c[1]=&t->c[type][i+1]; + return; + } + } + } +} + +static void +process_turn_restrictions_dump_coord(struct coord *c, int count) +{ + int i; + for (i = 0 ; i < count ; i++) { + fprintf(stderr,"(0x%x,0x%x)",c[i].x,c[i].y); + } +} + +static void +process_turn_restrictions_finish(GList *tr, FILE *out) +{ + GList *l=tr; + while (l) { + struct turn_restriction *t=l->data; + struct coord *c[4]; + struct item_bin *ib=item_bin; + + if (!t->c_count[0]) { + osm_warning("relation",t->relid,0,"turn restriction: from member not found\n"); + } else if (!t->c_count[1]) { + osm_warning("relation",t->relid,0,"turn restriction: via member not found\n"); + } else if (!t->c_count[2]) { + osm_warning("relation",t->relid,0,"turn restriction: to member not found\n"); + } else { + process_turn_restrictions_fromto(t, 0, c); + process_turn_restrictions_fromto(t, 2, c+2); + if (!c[0] || !c[2]) { + osm_warning("relation",t->relid,0,"turn restriction: via ("); + process_turn_restrictions_dump_coord(t->c[1], t->c_count[1]); + fprintf(stderr,")"); + if (!c[0]) { + fprintf(stderr," failed to connect to from ("); + process_turn_restrictions_dump_coord(t->c[0], t->c_count[0]); + fprintf(stderr,")"); + } + if (!c[2]) { + fprintf(stderr," failed to connect to to ("); + process_turn_restrictions_dump_coord(t->c[2], t->c_count[2]); + fprintf(stderr,")"); + } + fprintf(stderr,"\n"); + } else { + if (t->c_count[1] <= 2) { + item_bin_init(ib,t->type); + item_bin_add_coord(ib, c[0], 1); + item_bin_add_coord(ib, c[1], 1); + if (t->c_count[1] > 1) + item_bin_add_coord(ib, c[3], 1); + item_bin_add_coord(ib, c[2], 1); + item_bin_write(ib, out); + } + + } + } + g_free(t); + l=g_list_next(l); + } + g_list_free(tr); +} + +static GList * +process_turn_restrictions_setup(FILE *in, struct relations *relations) +{ + struct relation_member fromm,tom,viam,tmpm; + long long relid; + struct item_bin *ib; + struct relations_func *relations_func; + int min_count; + GList *turn_restrictions=NULL; + + fseek(in, 0, SEEK_SET); + relations_func=relations_func_new(process_turn_restrictions_member, NULL); + while ((ib=read_item(in))) { + struct turn_restriction *turn_restriction=g_new0(struct turn_restriction, 1); + relid=item_bin_get_relationid(ib); + turn_restriction->relid=relid; + turn_restriction->type=ib->type; + min_count=0; + if (!search_relation_member(ib, "from",&fromm,&min_count)) { + osm_warning("relation",relid,0,"turn restriction: from member missing\n"); + continue; + } + if (search_relation_member(ib, "from",&tmpm,&min_count)) { + osm_warning("relation",relid,0,"turn restriction: multiple from members\n"); + continue; + } + min_count=0; + if (!search_relation_member(ib, "to",&tom,&min_count)) { + osm_warning("relation",relid,0,"turn restriction: to member missing\n"); + continue; + } + if (search_relation_member(ib, "to",&tmpm,&min_count)) { + osm_warning("relation",relid,0,"turn restriction: multiple to members\n"); + continue; + } + min_count=0; + if (!search_relation_member(ib, "via",&viam,&min_count)) { + osm_warning("relation",relid,0,"turn restriction: via member missing\n"); + continue; + } + if (search_relation_member(ib, "via",&tmpm,&min_count)) { + osm_warning("relation",relid,0,"turn restriction: multiple via member\n"); + continue; + } + if (fromm.type != 2) { + osm_warning("relation",relid,0,"turn restriction: wrong type for from member "); + osm_warning(osm_types[fromm.type],fromm.id,1,"\n"); + continue; + } + if (tom.type != 2) { + osm_warning("relation",relid,0,"turn restriction: wrong type for to member "); + osm_warning(osm_types[tom.type],tom.id,1,"\n"); + continue; + } + if (viam.type != 1 && viam.type != 2) { + osm_warning("relation",relid,0,"turn restriction: wrong type for via member "); + osm_warning(osm_types[viam.type],viam.id,1,"\n"); + continue; + } + relations_add_func(relations, relations_func, turn_restriction, (gpointer) 0, fromm.type, fromm.id); + relations_add_func(relations, relations_func, turn_restriction, (gpointer) 1, viam.type, viam.id); + relations_add_func(relations, relations_func, turn_restriction, (gpointer) 2, tom.type, tom.id); + turn_restrictions=g_list_append(turn_restrictions, turn_restriction); + } + return turn_restrictions; +} + +void +process_turn_restrictions(FILE *in, FILE *coords, FILE *ways, FILE *ways_index, FILE *out) +{ + struct relations *relations=relations_new(); + GList *turn_restrictions; + fseek(in, 0, SEEK_SET); + turn_restrictions=process_turn_restrictions_setup(in, relations); + relations_process(relations, coords, ways, NULL); + process_turn_restrictions_finish(turn_restrictions, out); +} + +void +process_turn_restrictions_old(FILE *in, FILE *coords, FILE *ways, FILE *ways_index, FILE *out) +{ + struct relation_member fromm,tom,viam,tmpm; + struct node_item ni; + long long relid; + char from_buffer[65536],to_buffer[65536],via_buffer[65536]; + struct item_bin *ib,*from=(struct item_bin *)from_buffer,*to=(struct item_bin *)to_buffer,*via=(struct item_bin *)via_buffer; + struct coord *fromc,*toc,*viafrom,*viato,*tmp; + int min_count; + while ((ib=read_item(in))) { + relid=item_bin_get_relationid(ib); + min_count=0; + if (!search_relation_member(ib, "from",&fromm,&min_count)) { + osm_warning("relation",relid,0,"turn restriction: from member missing\n"); + continue; + } + if (search_relation_member(ib, "from",&tmpm,&min_count)) { + osm_warning("relation",relid,0,"turn restriction: multiple from members\n"); + continue; + } + min_count=0; + if (!search_relation_member(ib, "to",&tom,&min_count)) { + osm_warning("relation",relid,0,"turn restriction: to member missing\n"); + continue; + } + if (search_relation_member(ib, "to",&tmpm,&min_count)) { + osm_warning("relation",relid,0,"turn restriction: multiple to members\n"); + continue; + } + min_count=0; + if (!search_relation_member(ib, "via",&viam,&min_count)) { + osm_warning("relation",relid,0,"turn restriction: via member missing\n"); + continue; + } + if (search_relation_member(ib, "via",&tmpm,&min_count)) { + osm_warning("relation",relid,0,"turn restriction: multiple via member\n"); + continue; + } + if (fromm.type != 2) { + osm_warning("relation",relid,0,"turn restriction: wrong type for from member "); + osm_warning(osm_types[fromm.type],fromm.id,1,"\n"); + continue; + } + if (tom.type != 2) { + osm_warning("relation",relid,0,"turn restriction: wrong type for to member "); + osm_warning(osm_types[tom.type],tom.id,1,"\n"); + continue; + } + if (viam.type != 1 && viam.type != 2) { + osm_warning("relation",relid,0,"turn restriction: wrong type for via member "); + osm_warning(osm_types[viam.type],viam.id,1,"\n"); + continue; + } + if (viam.type == 1) { + if (!node_item_get_from_file(coords, viam.id, &ni)) { + osm_warning("relation",relid,0,"turn restriction: failed to get via member "); + osm_warning(osm_types[viam.type],viam.id,1,"\n"); + continue; + } + viafrom=&ni.c; + viato=&ni.c; + } else { + if (!(viafrom=get_way(ways, ways_index, NULL, viam.id, via, 0))) { + osm_warning("relation",relid,0,"turn restriction: failed to get first via coordinate from "); + osm_warning(osm_types[viam.type],viam.id,1,"\n"); + continue; + } + if (!(viato=get_way(ways, ways_index, viafrom, viam.id, via, 0))) { + osm_warning("relation",relid,0,"turn restriction: failed to get last via coordinate from "); + osm_warning(osm_types[viam.type],viam.id,1,"\n"); + continue; + } + + } +#if 0 + fprintf(stderr,"via "LONGLONG_FMT" vs %d\n",viam.id, ni.id); + fprintf(stderr,"coord 0x%x,0x%x\n",ni.c.x,ni.c.y); + fprintf(stderr,"Lookup "LONGLONG_FMT"\n",fromm.id); +#endif + if (!(fromc=get_way(ways, ways_index, viafrom, fromm.id, from, 0))) { + if (viam.type == 1 || !(fromc=get_way(ways, ways_index, viato, fromm.id, from, 0))) { + osm_warning("relation",relid,0,"turn restriction: failed to connect via "); + osm_warning(osm_types[viam.type],viam.id,1," 0x%x,0x%x-0x%x,0x%x to from member ",viafrom->x,viafrom->y,viato->x,viato->y); + osm_warning(osm_types[fromm.type],fromm.id,1," ("); + get_way(ways, ways_index, viafrom, fromm.id, from, 1); + fprintf(stderr,")\n"); + continue; + } else { + tmp=viato; + viato=viafrom; + viafrom=tmp; + } + } + if (!(toc=get_way(ways, ways_index, viato, tom.id, to, 0))) { + osm_warning("relation",relid,0,"turn restriction: failed to connect via "); + osm_warning(osm_types[viam.type],viam.id,1," 0x%x,0x%x-0x%x,0x%x to to member ",viafrom->x,viafrom->y,viato->x,viato->y); + osm_warning(osm_types[tom.type],tom.id,1," ("); + get_way(ways, ways_index, viato, tom.id, to, 1); + fprintf(stderr,")\n"); + continue; + } +#if 0 + fprintf(stderr,"(0x%x,0x%x)-(0x%x,0x%x)-(0x%x,0x%x)\n",fromc->x,fromc->y, ni.c.x, ni.c.y, toc->x, toc->y); +#endif + item_bin_init(ib,ib->type); + item_bin_add_coord(ib, fromc, 1); + item_bin_add_coord(ib, viafrom, 1); + if (viam.type == 2) + item_bin_add_coord(ib, viato, 1); + item_bin_add_coord(ib, toc, 1); + item_bin_write(item_bin, out); + } +} + +#if 0 +static void +process_countries(FILE *way, FILE *ways_index) +{ + FILE *in=fopen("country_de.tmp","r"); + struct item_bin *ib; + char buffer2[400000]; + struct item_bin *ib2=(struct item_bin *)buffer2; + GList *segments=NULL,*sort_segments; + fseek(in, 0, SEEK_SET); + while ((ib=read_item(in))) { + char *str=NULL; + struct relation_member member; + while ((str=item_bin_get_attr(ib, attr_osm_member, str))) { + if (!get_relation_member(str, &member)) + break; + if (member.type == 2) { + if (!seek_to_way(way, ways_index, member.id)) { + fprintf(stderr,"not found in index"); + break; + } + while (item_bin_read(ib2, way)) { + if (item_bin_get_wayid(ib2) != member.id) + break; + segments=g_list_prepend(segments,item_bin_to_poly_segment(ib2, geom_poly_segment_type_way_unknown)); + break; + } + } + } + } + sort_segments=geom_poly_segments_sort(segments, geom_poly_segment_type_way_left_side); + FILE *tmp=fopen("tst.txt","w"); + while (sort_segments) { + struct geom_poly_segment *seg=sort_segments->data; + if (!seg) { + fprintf(stderr,"is null\n"); + } else { + fprintf(stderr,"segment %p %s area "LONGLONG_FMT"\n",sort_segments,coord_is_equal(*seg->first, *seg->last) ? "closed":"open",geom_poly_area(seg->first,seg->last-seg->first+1)); + } +#if 0 + int count=seg->last-seg->first+1; + item_bin_init(ib, type_border_country); + item_bin_add_coord(ib, seg->first, count); + item_bin_dump(ib, tmp); +#endif + + sort_segments=g_list_next(sort_segments); + } + fclose(tmp); + fclose(in); +} +#endif + +static void +node_ref_way(osmid node) +{ + struct node_item *ni; + ni=node_item_get(node); + if (ni) + ni->ref_way++; +} + +static void +nodes_ref_item_bin(struct item_bin *ib) +{ + int i; + struct coord *c=(struct coord *)(ib+1); + for (i = 0 ; i < ib->clen/2 ; i++) + node_ref_way(REF(c[i])); +} + + +void +osm_add_nd(osmid ref) +{ + SET_REF(coord_buffer[coord_count], ref); + coord_count++; + if (coord_count > 65536) { + fprintf(stderr,"ERROR: Overflow\n"); + exit(1); + } +} + +static void +write_item_part(FILE *out, FILE *out_index, FILE *out_graph, struct item_bin *orig, int first, int last, long long *last_id) +{ + struct item_bin new; + struct coord *c=(struct coord *)(orig+1); + char *attr=(char *)(c+orig->clen/2); + int attr_len=orig->len-orig->clen-2; + processed_ways++; + new.type=orig->type; + new.clen=(last-first+1)*2; + new.len=new.clen+attr_len+2; + if (out_index) { + long long idx[2]; + idx[0]=item_bin_get_wayid(orig); + idx[1]=ftell(out); + if (way_hash) { + if (!(g_hash_table_lookup_extended(way_hash, (gpointer)(long)idx[0], NULL, NULL))) + g_hash_table_insert(way_hash, (gpointer)(long)idx[0], (gpointer)(long)idx[1]); + } else { + if (!last_id || *last_id != idx[0]) + fwrite(idx, sizeof(idx), 1, out_index); + if (last_id) + *last_id=idx[0]; + } + + } +#if 0 + fprintf(stderr,"first %d last %d type 0x%x len %d clen %d attr_len %d\n", first, last, new.type, new.len, new.clen, attr_len); +#endif + fwrite(&new, sizeof(new), 1, out); + fwrite(c+first, new.clen*4, 1, out); + fwrite(attr, attr_len*4, 1, out); +#if 0 + fwrite(&new, sizeof(new), 1, out_graph); + fwrite(c+first, new.clen*4, 1, out_graph); + fwrite(attr, attr_len*4, 1, out_graph); +#endif +} + +void +ref_ways(FILE *in) +{ + struct item_bin *ib; + + fseek(in, 0, SEEK_SET); + while ((ib=read_item(in))) + nodes_ref_item_bin(ib); +} + +void +resolve_ways(FILE *in, FILE *out) +{ + struct item_bin *ib; + struct coord *c; + int i; + struct node_item *ni; + + fseek(in, 0, SEEK_SET); + while ((ib=read_item(in))) { + c=(struct coord *)(ib+1); + for (i = 0 ; i < ib->clen/2 ; i++) { + if(!IS_REF(c[i])) + continue; + ni=node_item_get(REF(c[i])); + if(ni) { + c[i].x=ni->c.x; + c[i].y=ni->c.y; + } + } + item_bin_write(ib,out); + } +} + +FILE * +resolve_ways_file(FILE *in, char *suffix, char *filename) +{ + char *newfilename=g_strdup_printf("%s_new",filename); + FILE *new=tempfile(suffix,newfilename,1); + resolve_ways(in, new); + fclose(in); + fclose(new); + tempfile_rename(suffix,newfilename,filename); + g_free(newfilename); + return tempfile(suffix,filename,0); +} + +/** + * Get POI coordinates from area/line coordinates. + * @param in *in input file with area/line coordinates. + * @param in *out output file with POI coordinates + * @param in type input file original contents type: type_line or type_area + * @returns nothing + */ +void +process_way2poi(FILE *in, FILE *out, int type) +{ + struct item_bin *ib; + while ((ib=read_item(in))) { + int count=ib->clen/2; + if(count>1 && ib->typetype, ib->len, ib->clen); +#endif + ccount=ib->clen/2; + if (ccount <= 1) + continue; + c=(struct coord *)(ib+1); + last=0; + for (i = 0 ; i < ccount ; i++) { + if (IS_REF(c[i])) { + ndref=REF(c[i]); + ni=node_item_get(ndref); + if (ni) { + c[i]=ni->c; + if (ni->ref_way > 1 && i != 0 && i != ccount-1 && i != last && item_get_default_flags(ib->type)) { + write_item_part(out, out_index, out_graph, ib, last, i, &last_id); + last=i; + } + } else if (final) { + osm_warning("way",item_bin_get_wayid(ib),0,"Non-existing reference to "); + osm_warning("node",ndref,1,"\n"); + remaining=(ib->len+1)*4-sizeof(struct item_bin)-i*sizeof(struct coord); + memmove(&c[i], &c[i+1], remaining); + ib->clen-=2; + ib->len-=2; + i--; + ccount--; + } + } + } + if (ccount) { + write_item_part(out, out_index, out_graph, ib, last, ccount-1, &last_id); + if (final && ib->type == type_water_line && out_coastline) { + write_item_part(out_coastline, NULL, NULL, ib, last, ccount-1, NULL); + } + } + } + sig_alrm(0); + sig_alrm_end(); + return 0; +} + +static void +index_country_add(struct zip_info *info, int country_id, int zipnum) +{ + struct item_bin *item_bin=init_item(type_countryindex); + item_bin_add_attr_int(item_bin, attr_country_id, country_id); + item_bin_add_attr_int(item_bin, attr_zipfile_ref, zipnum); + item_bin_write(item_bin, zip_get_index(info)); +} + +void +write_countrydir(struct zip_info *zip_info) +{ + int i,zipnum,num; + int max=11; + char tilename[32]; + char filename[32]; + char suffix[32]; + struct country_table *co; + for (i = 0 ; i < sizeof(country_table)/sizeof(struct country_table) ; i++) { + co=&country_table[i]; + if (co->size) { + num=0; + do { + tilename[0]='\0'; + sprintf(suffix,"s%d", num); + num++; + tile(&co->r, suffix, tilename, max, overlap, NULL); + sprintf(filename,"country_%d.tmp", co->countryid); + zipnum=add_aux_tile(zip_info, tilename, filename, co->size); + } while (zipnum == -1); + index_country_add(zip_info,co->countryid,zipnum); + } + } +} + +void +load_countries(void) +{ + char filename[32]; + FILE *f; + int i; + struct country_table *co; + + for (i = 0 ; i < sizeof(country_table)/sizeof(struct country_table) ; i++) { + co=&country_table[i]; + sprintf(filename,"country_%d.tmp", co->countryid); + f=fopen(filename,"rb"); + if (f) { + int i,first=1; + struct item_bin *ib; + while ((ib=read_item(f))) { + struct coord *c=(struct coord *)(ib+1); + co->size+=ib->len*4+4; + for (i = 0 ; i < ib->clen/2 ; i++) { + if (first) { + co->r.l=c[i]; + co->r.h=c[i]; + first=0; + } else + bbox_extend(&c[i], &co->r); + } + } + fseek(f, 0, SEEK_END); + co->size=ftell(f); + fclose(f); + } + } +} + +void +remove_countryfiles(void) +{ + int i; + char filename[32]; + struct country_table *co; + + for (i = 0 ; i < sizeof(country_table)/sizeof(struct country_table) ; i++) { + co=&country_table[i]; + if (co->size) { + sprintf(filename,"country_%d.tmp", co->countryid); + unlink(filename); + } + } +} + +void osm_init(FILE* rule_file) +{ + build_attrmap(rule_file); + build_countrytable(); +} + diff --git a/navit/maptool/osm_o5m.c b/navit/maptool/osm_o5m.c new file mode 100644 index 0000000..f988848 --- /dev/null +++ b/navit/maptool/osm_o5m.c @@ -0,0 +1,342 @@ +#include +#include +#include +#include "maptool.h" + +static int print; + +static char *types[]={"node","way","relation"}; + +struct o5m { + unsigned char buffer[65536]; + int buffer_size; + unsigned char *buffer_start; + unsigned char *buffer_end; + FILE *in; + int error; + + int lat, lon, uid, version; + long long id, rid[3], changeset; + time_t timestamp; + char *user; +}; + +static struct string_table { + char strings[15000][256]; + int pos; +} st; + +static double latlon_scale=10000000.0; + +#define buffer_end(o,x) ((o)->buffer_start+(x) > (o)->buffer_end && !fill_buffer((o), (x))) + +static int +fill_buffer(struct o5m *o, int min) +{ + int count; + + memmove(o->buffer, o->buffer_start, o->buffer_end-o->buffer_start); + o->buffer_end-=o->buffer_start-o->buffer; + o->buffer_start=o->buffer; + count=fread(o->buffer_end, 1, o->buffer+o->buffer_size-o->buffer_end, o->in); + if (!count) + return 0; + o->buffer_end+=count; + return (min <= o->buffer_end - o->buffer); +} + +static unsigned long long +get_uval(unsigned char **p) +{ + unsigned char c; + long long ret=0; + int shift=0; + + for (;;) { + c=*((*p)++); + ret+=((long long)c & 0x7f) << shift; + if (!(c & 0x80)) + return ret; + shift+=7; + } +} + +static unsigned long long +get_sval(unsigned char **p) +{ + long long ret=get_uval(p); + if (ret & 1) { + return -((ret >> 1)+1); + } else { + return ret >> 1; + } +} + +static void +get_strings(struct string_table *st, unsigned char **p, char **s1, char **s2) +{ + int len,xlen=0; + *s1=(char *)*p; + len=strlen(*s1); + xlen=1; + if (s2) { + *s2=*s1+len+1; + len+=strlen(*s2); + xlen++; + } + (*p)+=len+xlen; + if (len <= 250) { + memcpy(st->strings[st->pos++], *s1, len+xlen); + if (st->pos >= 15000) + st->pos=0; + } +} + +static void +get_strings_ref(struct string_table *st, int ref, char **s1, char **s2) +{ + int pos=st->pos-ref; + + if (pos < 0) + pos+=15000; + *s1=st->strings[pos]; + if (s2) + *s2=*s1+strlen(*s1)+1; +} + +static void +print_escaped(char *s) +{ + for (;;) { + switch (*s) { + case 0: + return; + case 9: + case 13: + case 34: + case 38: + case 39: + case 60: + case 62: + printf("&#%d;",*s); + break; + default: + putc(*s,stdout); + break; + } + s++; + } +} + +static void +o5m_reset(struct o5m *o) +{ + o->lat=0; + o->lon=0; + o->id=0; + o->rid[0]=0; + o->rid[1]=0; + o->rid[2]=0; + o->changeset=0; + o->timestamp=0; +} + +static void +o5m_print_start(struct o5m *o, int c) +{ + printf("\t<%s id=\"%Ld\"",types[c-0x10],o->id); +} + +static void +o5m_print_version(struct o5m *o, int tags) +{ + char timestamp_str[64]; + if (o->version) { + strftime(timestamp_str, sizeof(timestamp_str), "%Y-%m-%dT%H:%M:%SZ", gmtime(&o->timestamp)); + printf(" version=\"%d\" timestamp=\"%s\" changeset=\"%Ld\"",o->version,timestamp_str,o->changeset); + if (o->uid) { + printf(" uid=\"%d\" user=\"",o->uid); + print_escaped(o->user); + printf("\""); + } + } + printf("%s\n",tags?">":"/>"); +} + +static void +o5m_print_end(char c) +{ + printf("\t\n",types[c-0x10]); +} + +int +map_collect_data_osm_o5m(FILE *in, struct maptool_osm *osm) +{ + struct o5m o; + unsigned char c, *end, *rend; + int len, rlen, ref, tags; + char *uidstr, *role; + + if (print) { + printf("\n"); + printf("\n"); + } + + + o5m_reset(&o); + o.buffer_size=sizeof(o.buffer); + o.buffer_start=o.buffer; + o.buffer_end=o.buffer; + o.error=0; + o.in=in; + + fill_buffer(&o,1); + for (;;) { + if (buffer_end(&o, 1)) { + fprintf(stderr,"unexpected eof\n"); + return 1; + } + c=*(o.buffer_start++); + switch (c) { + case 0x10: + case 0x11: + case 0x12: + (void)buffer_end(&o, 4); + len=get_uval(&o.buffer_start); + if (o.buffer_start > o.buffer_end) { + fprintf(stderr,"unexpected eof\n"); + return 0; + } + if (buffer_end(&o, len)) { + fprintf(stderr,"unexpected eof or buffer too small\n"); + return 0; + } + end=o.buffer_start+len; + o.id+=get_sval(&o.buffer_start); + o.version=get_uval(&o.buffer_start); + if (o.version) { + o.timestamp+=get_sval(&o.buffer_start); + if (o.timestamp) { + o.changeset+=get_sval(&o.buffer_start); + ref=get_uval(&o.buffer_start); + if (ref) + get_strings_ref(&st, ref, &uidstr, &o.user); + else + get_strings(&st, &o.buffer_start, &uidstr, &o.user); + o.uid=get_uval((unsigned char **)&uidstr); + } + } + if (print) + o5m_print_start(&o, c); + switch (c) { + case 0x10: + o.lon+=get_sval(&o.buffer_start); + o.lat+=get_sval(&o.buffer_start); + osm_add_node(o.id, o.lat/latlon_scale,o.lon/latlon_scale); + tags=end > o.buffer_start; + if (print) { + printf(" lat=\"%.7f\" lon=\"%.7f\"",o.lat/10000000.0,o.lon/10000000.0); + o5m_print_version(&o, tags); + } + break; + case 0x11: + osm_add_way(o.id); + rlen=get_uval(&o.buffer_start); + tags=end > o.buffer_start; + rend=o.buffer_start+rlen; + if (print) + o5m_print_version(&o, tags); + while (o.buffer_start < rend) { + o.rid[0]+=get_sval(&o.buffer_start); + osm_add_nd(o.rid[0]); + if (print) + printf("\t\t\n",o.rid[0]); + } + break; + case 0x12: + osm_add_relation(o.id); + rlen=get_uval(&o.buffer_start); + tags=end > o.buffer_start; + rend=o.buffer_start+rlen; + if (print) + o5m_print_version(&o, tags); + while (o.buffer_start < rend) { + long long delta=get_sval(&o.buffer_start); + int r; + ref=get_uval(&o.buffer_start); + if (ref) + get_strings_ref(&st, ref, &role, NULL); + else + get_strings(&st, &o.buffer_start, &role, NULL); + r=role[0]-'0'; + if (r < 0) + r=0; + if (r > 2) + r=2; + o.rid[r]+=delta; + osm_add_member(r+1, o.rid[r], role+1); + if (print) + printf("\t\t\n",types[r], o.rid[r], role+1); + } + break; + } + while (end > o.buffer_start) { + char *k, *v; + ref=get_uval(&o.buffer_start); + if (ref) + get_strings_ref(&st, ref, &k, &v); + else + get_strings(&st, &o.buffer_start, &k, &v); + osm_add_tag(k, v); + if (print) { + printf("\t\t\n"); + } + } + if (print && tags) { + o5m_print_end(c); + } + switch (c) { + case 0x10: + osm_end_node(osm); + break; + case 0x11: + osm_end_way(osm); + break; + case 0x12: + osm_end_relation(osm); + break; + } + break; + case 0xdb: + if (print) + printf("\t\n"); + len=get_uval(&o.buffer_start); + if (o.buffer_start > o.buffer_end) { + return 0; + } + if (buffer_end(&o, len)) { + return 0; + } + o.buffer_start+=len; + break; + case 0xe0: + if (buffer_end(&o, 5)) + return 0; + o.buffer_start+=5; + break; + case 0xfe: + return 1; + case 0xff: + o5m_reset(&o); + break; + default: + fprintf(stderr,"Unknown tag 0x%x\n",c); + return 0; + } + } + return 0; +} diff --git a/navit/maptool/osm_protobuf.c b/navit/maptool/osm_protobuf.c new file mode 100644 index 0000000..3d3ae69 --- /dev/null +++ b/navit/maptool/osm_protobuf.c @@ -0,0 +1,370 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ +#include +#include +#include +#include +#include +#include +#include "maptool.h" +#include "debug.h" +#include "linguistics.h" +#include "file.h" +#include "generated-code/fileformat.pb-c.h" +#include "generated-code/osmformat.pb-c.h" + + +static double latlon_scale=10000000.0; + +static OSMPBF__BlobHeader * +read_header(FILE *f) +{ + unsigned char *buffer,lenb[4]; + int len; + + len=sizeof(lenb); + if (fread(lenb, 4, 1, f) != 1) + return NULL; + len=(lenb[0] << 24) | (lenb[1] << 16) | (lenb[2] << 8) | lenb[3]; + buffer=alloca(len); + if (fread(buffer, len, 1, f) != 1) + return NULL; + return osmpbf__blob_header__unpack(&protobuf_c_system_allocator, len, buffer); +} + + +static OSMPBF__Blob * +read_blob(OSMPBF__BlobHeader *header, FILE *f) +{ + unsigned char *buffer; + int len=header->datasize; + + buffer=alloca(len); + if (fread(buffer, len, 1, f) != 1) + return NULL; + return osmpbf__blob__unpack(&protobuf_c_system_allocator, len, buffer); +} + +static unsigned char * +uncompress_blob(OSMPBF__Blob *blob) +{ + unsigned char *ret=malloc(blob->raw_size); + int zerr; + z_stream strm; + + if (!ret) + return NULL; + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in=blob->zlib_data.len; + strm.next_in=blob->zlib_data.data; + strm.avail_out=blob->raw_size; + strm.next_out=ret; + zerr = inflateInit(&strm); + if (zerr != Z_OK) { + free(ret); + return NULL; + } + zerr = inflate(&strm, Z_NO_FLUSH); + if (zerr != Z_STREAM_END) { + free(ret); + return NULL; + } + inflateEnd(&strm); + return ret; +} + +static int +get_string(char *buffer, int buffer_size, OSMPBF__PrimitiveBlock *primitive_block, int id, int escape) +{ + int len=primitive_block->stringtable->s[id].len; + char *data=(char *)primitive_block->stringtable->s[id].data; + if (primitive_block->stringtable->s[id].len >= buffer_size) { + buffer[0]='\0'; + return 0; + } + if (escape) { + int i; + char *p=buffer; + for (i = 0 ; i < len ; i++) { + switch(data[i]) { + case '\t': + case '\r': + case '\n': + case '>': + case '<': + case '\'': + case '"': + case '&': + sprintf(p,"&#%d;",data[i]); + p+=strlen(p); + break; + default: + *p++=data[i]; + } + } + *p++='\0'; + return 1; + } else { + strncpy(buffer, data, len); + buffer[len]='\0'; + return 1; + } +} + + +static void +process_osmheader(OSMPBF__Blob *blob, unsigned char *data) +{ + OSMPBF__HeaderBlock *header_block; + header_block=osmpbf__header_block__unpack(&protobuf_c_system_allocator, blob->raw_size, data); + osmpbf__header_block__free_unpacked(header_block, &protobuf_c_system_allocator); +} + +#if 0 + +static void +process_user(OSMPBF__PrimitiveBlock *primitive_block, int user_sid, int uid, int swap) +{ + char userbuff[1024]; + get_string(userbuff, sizeof(userbuff), primitive_block, user_sid, 1); + if (userbuff[0] && uid != -1) { + if (swap) + printf(" uid=\"%d\" user=\"%s\"",uid,userbuff); + else + printf(" user=\"%s\" uid=\"%d\"",userbuff,uid); + } +} + +static void +process_timestamp(long long timestamp) +{ + time_t ts; + struct tm *tm; + char tsbuff[1024]; + ts=timestamp; + tm=gmtime(&ts); + strftime(tsbuff, sizeof(tsbuff), "%Y-%m-%dT%H:%M:%SZ", tm); + printf(" timestamp=\"%s\"",tsbuff); +} + +#endif + +static void +process_tag(OSMPBF__PrimitiveBlock *primitive_block, int key, int val) +{ + char keybuff[1024]; + char valbuff[1024]; +#if 0 + get_string(keybuff, sizeof(keybuff), primitive_block, key, 1); + get_string(valbuff, sizeof(valbuff), primitive_block, val, 1); + printf("\t\t\n",keybuff,valbuff); +#else + get_string(keybuff, sizeof(keybuff), primitive_block, key, 0); + get_string(valbuff, sizeof(valbuff), primitive_block, val, 0); + osm_add_tag(keybuff, valbuff); +#endif +} + + +static void +process_dense(OSMPBF__PrimitiveBlock *primitive_block, OSMPBF__DenseNodes *dense, struct maptool_osm *osm) +{ + int i,j=0,has_tags; + long long id=0,lat=0,lon=0,changeset=0,timestamp=0; + int version,user_sid=0,uid=0; + + if (!dense) + return; + + for (i = 0 ; i < dense->n_id ; i++) { + id+=dense->id[i]; + lat+=dense->lat[i]; + lon+=dense->lon[i]; + version=dense->denseinfo->version[i]; + changeset+=dense->denseinfo->changeset[i]; + user_sid+=dense->denseinfo->user_sid[i]; + uid+=dense->denseinfo->uid[i]; + timestamp+=dense->denseinfo->timestamp[i]; + has_tags=dense->keys_vals && dense->keys_vals[j]; + osm_add_node(id, lat/latlon_scale,lon/latlon_scale); +#if 0 + printf("\t\n"); +#endif + while (dense->keys_vals[j]) { + process_tag(primitive_block, dense->keys_vals[j], dense->keys_vals[j+1]); + j+=2; + } +#if 0 + printf("\t\n"); + } else + printf("/>\n"); +#else + } +#endif + osm_end_node(osm); + j++; + } +} + +#if 0 +static void +process_info(OSMPBF__PrimitiveBlock *primitive_block, OSMPBF__Info *info) +{ + printf(" version=\"%d\" changeset=\"%Ld\"",info->version,info->changeset); + process_user(primitive_block, info->user_sid, info->uid, 1); + process_timestamp(info->timestamp); +} +#endif + +static void +process_way(OSMPBF__PrimitiveBlock *primitive_block, OSMPBF__Way *way, struct maptool_osm *osm) +{ + int i; + long long ref=0; + + osm_add_way(way->id); +#if 0 + printf("\tid); + process_info(primitive_block, way->info); + printf(">\n"); +#else +#endif + for (i = 0 ; i < way->n_refs ; i++) { + ref+=way->refs[i]; + osm_add_nd(ref); +#if 0 + printf("\t\t\n",ref); +#else +#endif + } + for (i = 0 ; i < way->n_keys ; i++) + process_tag(primitive_block, way->keys[i], way->vals[i]); +#if 0 + printf("\t\n"); +#endif + osm_end_way(osm); +} + +static void +process_relation(OSMPBF__PrimitiveBlock *primitive_block, OSMPBF__Relation *relation, struct maptool_osm *osm) +{ + int i; + long long ref=0; + char rolebuff[1024]; + +#if 0 + printf("\tid); + process_info(primitive_block, relation->info); + printf(">\n"); +#endif + osm_add_relation(relation->id); + for (i = 0 ; i < relation->n_roles_sid ; i++) { +#if 0 + printf("\t\ttypes[i]) { + case 0: + printf("node"); + break; + case 1: + printf("way"); + break; + case 2: + printf("relation"); + break; + default: + printf("unknown"); + break; + } +#endif + ref+=relation->memids[i]; + get_string(rolebuff, sizeof(rolebuff), primitive_block, relation->roles_sid[i], 1); +#if 0 + printf("\" ref=\"%Ld\" role=\"%s\"/>\n",ref,rolebuff); +#else + osm_add_member(relation->types[i]+1,ref,rolebuff); +#endif + } + for (i = 0 ; i < relation->n_keys ; i++) + process_tag(primitive_block, relation->keys[i], relation->vals[i]); +#if 0 + printf("\t\n"); +#else + osm_end_relation(osm); +#endif +} + +static void +process_osmdata(OSMPBF__Blob *blob, unsigned char *data, struct maptool_osm *osm) +{ + int i,j; + OSMPBF__PrimitiveBlock *primitive_block; + primitive_block=osmpbf__primitive_block__unpack(&protobuf_c_system_allocator, blob->raw_size, data); + for (i = 0 ; i < primitive_block->n_primitivegroup ; i++) { + OSMPBF__PrimitiveGroup *primitive_group=primitive_block->primitivegroup[i]; + process_dense(primitive_block, primitive_group->dense, osm); + for (j = 0 ; j < primitive_group->n_ways ; j++) + process_way(primitive_block, primitive_group->ways[j], osm); + for (j = 0 ; j < primitive_group->n_relations ; j++) + process_relation(primitive_block, primitive_group->relations[j], osm); +#if 0 + printf("Group %p %d %d %d %d\n",primitive_group->dense,primitive_group->n_nodes,primitive_group->n_ways,primitive_group->n_relations,primitive_group->n_changesets); +#endif + } + osmpbf__primitive_block__free_unpacked(primitive_block, &protobuf_c_system_allocator); +} + + +int +map_collect_data_osm_protobuf(FILE *in, struct maptool_osm *osm) +{ + OSMPBF__BlobHeader *header; + OSMPBF__Blob *blob; + unsigned char *data; +#if 0 + printf("\n"); + printf("\n"); +#endif + while ((header=read_header(in))) { + blob=read_blob(header, in); + data=uncompress_blob(blob); + if (!strcmp(header->type,"OSMHeader")) { + process_osmheader(blob, data); + } else if (!strcmp(header->type,"OSMData")) { + process_osmdata(blob, data, osm); + } else { + printf("unknown\n"); + return 0; + } + free(data); + osmpbf__blob__free_unpacked(blob, &protobuf_c_system_allocator); + osmpbf__blob_header__free_unpacked(header, &protobuf_c_system_allocator); + } +#if 0 + printf("\n"); +#endif + return 1; +} diff --git a/navit/maptool/osm_protobufdb.c b/navit/maptool/osm_protobufdb.c new file mode 100644 index 0000000..77f4aa6 --- /dev/null +++ b/navit/maptool/osm_protobufdb.c @@ -0,0 +1,861 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ +#include +#include +#include +#include +#include +#include +#include "maptool.h" +#include "debug.h" +#include "linguistics.h" +#include "file.h" +#include "generated-code/fileformat.pb-c.h" +#include "generated-code/osmformat.pb-c.h" + +static double latlon_scale=10000000.0; + +struct db_config { + int node_ids_per_file; + int node_ids_per_blob; + int node_ids_per_group; + int way_ids_per_file; + int way_ids_per_blob; + int way_ids_per_group; + int relation_ids_per_file; + int relation_ids_per_blob; + int relation_ids_per_group; +} db_config = { + 200000, 30000, 500, + 40000, 1000, 30, + 10000, 500, 20, +}; + +struct osm_protobufdb_context { + int current_file, current_block, active_block; + int in_node, in_way, in_relation; + OSMPBF__Node n; + OSMPBF__Way w; + OSMPBF__Relation r; + OSMPBF__Info i; + FILE *f; + OSMPBF__PrimitiveBlock *pb; + OSMPBF__PrimitiveGroup *pg; + GHashTable *string_hash; + OSMPBF__DenseInfo *di; + OSMPBF__DenseNodes *dn; + OSMPBF__StringTable *st; +} context; + +static int +osm_protobufdb_write_blob(OSMPBF__Blob *blob, FILE *out) +{ + unsigned char lenb[4]; + int len,blen; + unsigned char *buffer; + OSMPBF__BlobHeader header=OSMPBF__BLOB_HEADER__INIT; + + + + blen=osmpbf__blob__get_packed_size(blob); + header.type="OSMData"; + header.datasize=blen; + len=osmpbf__blob_header__get_packed_size(&header); + buffer=alloca(len); + lenb[0]=len>>24; + lenb[1]=len>>16; + lenb[2]=len>>8; + lenb[3]=len; + osmpbf__blob_header__pack(&header, buffer); + if (fwrite(lenb, sizeof(lenb), 1, out) != 1) + return 0; + if (fwrite(buffer, len, 1, out) != 1) + return 0; + buffer=alloca(blen); + osmpbf__blob__pack(blob, buffer); + if (fwrite(buffer, blen, 1, out) != 1) + return 0; + return 1; +} + +#if 0 +void +dump_block(OSMPBF__PrimitiveBlock *pb) +{ + int i,j; + printf("%d groups\n",pb->n_primitivegroup); + for (i = 0 ; i < pb->n_primitivegroup ; i++) { + printf("%d relations\n",pb->primitivegroup[i]->n_relations); + for (j = 0 ; j < pb->primitivegroup[i]->n_relations ; j++) { + printf("Info %d\n",pb->primitivegroup[i]->relations[j]->info->version); + } + } +} +#endif + +static int +osm_protobufdb_finish_block(struct osm_protobufdb_context *ctx) +{ + OSMPBF__Blob *blob,empty_blob=OSMPBF__BLOB__INIT; + int len; + if (!ctx->pb) + return 0; + len=osmpbf__primitive_block__get_packed_size(ctx->pb); + + while (ctx->current_block < ctx->active_block) { + osm_protobufdb_write_blob(&empty_blob, ctx->f); + ctx->current_block++; + } + blob=malloc(sizeof(*blob)); + *blob=empty_blob; + blob->has_raw=1; + blob->has_raw_size=1; + blob->raw.data=malloc(len); + osmpbf__primitive_block__pack(ctx->pb, blob->raw.data); + blob->raw.len=len; + blob->raw_size=len; + osm_protobufdb_write_blob(blob, ctx->f); + osmpbf__blob__free_unpacked(blob, &protobuf_c_system_allocator); + osmpbf__primitive_block__free_unpacked(ctx->pb, &protobuf_c_system_allocator); + ctx->pb=NULL; + ctx->current_block++; + return 1; +} + +static int +osm_protobufdb_start_block(struct osm_protobufdb_context *ctx, int blocknum) +{ + OSMPBF__PrimitiveBlock pb=OSMPBF__PRIMITIVE_BLOCK__INIT; + OSMPBF__StringTable st=OSMPBF__STRING_TABLE__INIT; + if (ctx->active_block == blocknum) + return 0; + osm_protobufdb_finish_block(ctx); + ctx->active_block=blocknum; + ctx->pb=malloc(sizeof(*ctx->pb)); + *ctx->pb=pb; + ctx->pb->stringtable=malloc(sizeof(*ctx->pb->stringtable)); + *ctx->pb->stringtable=st; + ctx->st=ctx->pb->stringtable; + return 1; +} + +static int +osm_protobufdb_start_group(struct osm_protobufdb_context *ctx, int groupnum) +{ + OSMPBF__PrimitiveGroup pg=OSMPBF__PRIMITIVE_GROUP__INIT; + if (ctx->pb->n_primitivegroup <= groupnum) { + ctx->pb->primitivegroup=realloc(ctx->pb->primitivegroup, (groupnum+1)*sizeof(ctx->pb->primitivegroup[0])); + while (ctx->pb->n_primitivegroup <= groupnum) { + ctx->pb->primitivegroup[ctx->pb->n_primitivegroup]=malloc(sizeof(*context.pg)); + *ctx->pb->primitivegroup[ctx->pb->n_primitivegroup++]=pg; + } + g_hash_table_destroy(ctx->string_hash); + ctx->string_hash=g_hash_table_new(g_str_hash, g_str_equal); + } + ctx->pg=ctx->pb->primitivegroup[groupnum]; + if (!ctx->pg) { + ctx->pg=malloc(sizeof(*context.pg)); + *ctx->pg=pg; + ctx->pb->primitivegroup[groupnum]=ctx->pg; + } + return 1; +} + +static int +osm_protobufdb_start_densenode(struct osm_protobufdb_context *ctx) +{ + OSMPBF__DenseInfo di=OSMPBF__DENSE_INFO__INIT; + OSMPBF__DenseNodes dn=OSMPBF__DENSE_NODES__INIT; + + if (!ctx->pg->dense) { + ctx->dn=malloc(sizeof(*context.dn)); + *ctx->dn=dn; + ctx->pg->dense=ctx->dn; + } else + ctx->dn=ctx->pg->dense; + if (!ctx->dn->denseinfo) { + ctx->di=malloc(sizeof(*context.di)); + *ctx->di=di; + ctx->dn->denseinfo=ctx->di; + } else + ctx->di=ctx->dn->denseinfo; + return 1; +} + +static void +osm_protobufdb_write_primitive_group(OSMPBF__PrimitiveGroup *pg, OSMPBF__PrimitiveBlock *pb) +{ + pb->primitivegroup=realloc(pb->primitivegroup,(pb->n_primitivegroup+1)*sizeof(OSMPBF__PrimitiveGroup *)); + pb->primitivegroup[pb->n_primitivegroup++]=pg; +} + + +#define insert(struct, member, pos) {\ + int n=struct->n_##member; \ + int s=sizeof(struct->member[0]); \ + struct->member=realloc(struct->member, (n+1)*s); \ + memmove(&struct->member[n+1], &struct->member[n], (pos-n)*s); \ + memset(&struct->member[n], 0, s); \ + struct->n_##member++;\ +} + +static int +osm_protobufdb_insert_densenode(long long id, OSMPBF__Node *offset, OSMPBF__Info *offseti, OSMPBF__DenseNodes *dn) +{ + int i,l,p; + memset(offset, 0, sizeof(*offset)); + offseti->timestamp=0; + offseti->changeset=0; + offseti->user_sid=0; + offseti->uid=0; + l=dn->n_id; + for (i = 0 ; i < l ; i++) { + offset->id+=dn->id[i]; + offset->lat+=dn->lat[i]; + offset->lon+=dn->lon[i]; + offseti->timestamp+=dn->denseinfo->timestamp[i]; + offseti->changeset+=dn->denseinfo->changeset[i]; + offseti->user_sid+=dn->denseinfo->user_sid[i]; + offseti->uid+=dn->denseinfo->uid[i]; + } + p=l; + insert(dn, id, p); + insert(dn, lat, p); + insert(dn, lon, p); + insert(dn->denseinfo, version, p); + insert(dn->denseinfo, timestamp, p); + insert(dn->denseinfo, changeset, p); + insert(dn->denseinfo, user_sid, p); + insert(dn->denseinfo, uid, p); + return p; +} + +static void +osm_protobufdb_modify_densenode(OSMPBF__Node *node, OSMPBF__Info *info, OSMPBF__Node *offset, OSMPBF__Info *offseti, int pos, OSMPBF__DenseNodes *dn) +{ + int i; + if (pos+1 < dn->n_id) { + dn->id[pos+1]+=dn->id[pos]-node->id; + dn->lat[pos+1]+=dn->lat[pos]-node->lat; + dn->lon[pos+1]+=dn->lon[pos]-node->lon; + dn->denseinfo->timestamp[pos+1]+=dn->denseinfo->timestamp[pos]-info->timestamp; + dn->denseinfo->changeset[pos+1]+=dn->denseinfo->changeset[pos]-info->changeset; + dn->denseinfo->user_sid[pos+1]+=dn->denseinfo->user_sid[pos]-info->user_sid; + dn->denseinfo->uid[pos+1]+=dn->denseinfo->uid[pos]-info->uid; + } + dn->id[pos]=node->id-offset->id; + dn->lat[pos]=node->lat-offset->lat; + dn->lon[pos]=node->lon-offset->lon; + dn->keys_vals=realloc(dn->keys_vals, (dn->n_keys_vals+node->n_keys+node->n_vals+1)*sizeof(dn->keys_vals[0])); + for (i = 0 ; i < node->n_keys ; i++) { + dn->keys_vals[dn->n_keys_vals++]=node->keys[i]; + dn->keys_vals[dn->n_keys_vals++]=node->vals[i]; + } + dn->keys_vals[dn->n_keys_vals++]=0; + dn->denseinfo->version[pos]=info->version; + dn->denseinfo->timestamp[pos]=info->timestamp-offseti->timestamp; + dn->denseinfo->changeset[pos]=info->changeset-offseti->changeset; + dn->denseinfo->user_sid[pos]=info->user_sid-offseti->user_sid; + dn->denseinfo->uid[pos]=info->uid-offseti->uid; +} + +static int +osm_protobufdb_insert_node(long long id, OSMPBF__PrimitiveGroup *pg) +{ + int l,p; + OSMPBF__Node node=OSMPBF__NODE__INIT; + l=pg->n_nodes; + p=l; + insert(pg, nodes, p); + pg->nodes[p]=malloc(sizeof(*pg->nodes[0])); + *pg->nodes[p]=node; + return p; +} + +static void +osm_protobufdb_modify_node(OSMPBF__Node *node, OSMPBF__Info *info, int pos, OSMPBF__PrimitiveGroup *pg) +{ + OSMPBF__Node *n=pg->nodes[pos]; + OSMPBF__Info *old_info; + + if (n->keys) + free(n->keys); + if (n->vals) + free(n->vals); + old_info=n->info; + *n=*node; + if (!info) { + if (old_info) + osmpbf__info__free_unpacked(old_info, &protobuf_c_system_allocator); + n->info=NULL; + } else { + if (old_info) + n->info=old_info; + else + n->info=malloc(sizeof(*info)); + *n->info=*info; + } + +} + +static int +osm_protobufdb_insert_way(long long id, OSMPBF__PrimitiveGroup *pg) +{ + int l,p; + OSMPBF__Way way=OSMPBF__WAY__INIT; + l=pg->n_ways; + p=l; + insert(pg, ways, p); + pg->ways[p]=malloc(sizeof(*pg->ways[0])); + *pg->ways[p]=way; + return p; +} + +static void +osm_protobufdb_modify_way(OSMPBF__Way *way, OSMPBF__Info *info, int pos, OSMPBF__PrimitiveGroup *pg) +{ + OSMPBF__Way *w=pg->ways[pos]; + OSMPBF__Info *old_info; + int i; + long long ref=0; + + if (w->keys) + free(w->keys); + if (w->vals) + free(w->vals); + if (w->refs) + free(w->refs); + old_info=w->info; + *w=*way; + for (i = 0 ; i < w->n_refs ; i++) { + w->refs[i]-=ref; + ref+=w->refs[i]; + } + if (!info) { + if (old_info) + osmpbf__info__free_unpacked(old_info, &protobuf_c_system_allocator); + w->info=NULL; + } else { + if (old_info) + w->info=old_info; + else + w->info=malloc(sizeof(*info)); + *w->info=*info; + } + +} + +static int +osm_protobufdb_insert_relation(long long id, OSMPBF__PrimitiveGroup *pg) +{ + int l,p; + OSMPBF__Relation relation=OSMPBF__RELATION__INIT; + l=pg->n_relations; + p=l; + insert(pg, relations, p); + pg->relations[p]=malloc(sizeof(*pg->relations[0])); + *pg->relations[p]=relation; + return p; +} + +static void +osm_protobufdb_modify_relation(OSMPBF__Relation *relation, OSMPBF__Info *info, int pos, OSMPBF__PrimitiveGroup *pg) +{ + OSMPBF__Relation *r=pg->relations[pos]; + OSMPBF__Info *old_info; + int i; + long long ref=0; + + if (r->keys) + free(r->keys); + if (r->vals) + free(r->vals); + if (r->roles_sid) + free(r->roles_sid); + if (r->memids) + free(r->memids); + if (r->types) + free(r->types); + old_info=r->info; + *r=*relation; + for (i = 0 ; i < r->n_memids ; i++) { + r->memids[i]-=ref; + ref+=r->memids[i]; + } + if (!info) { + if (old_info) + osmpbf__info__free_unpacked(old_info, &protobuf_c_system_allocator); + r->info=NULL; + } else { + if (old_info) + r->info=old_info; + else + r->info=malloc(sizeof(*info)); + *r->info=*info; + } + +} + +static int +osm_protobufdb_string(struct osm_protobufdb_context *ctx, char *str) +{ + char *strd; + OSMPBF__StringTable *st=ctx->st; + + gpointer value; + assert(ctx->string_hash != NULL); + if (g_hash_table_lookup_extended(ctx->string_hash, str, NULL, &value)) { + return (int)value; + } + if (!st->n_s) { + st->n_s++; + } + strd=strdup(str); + st->s=realloc(st->s, sizeof(st->s[0])*(st->n_s+1)); + if (st->n_s == 1) { + st->s[0].data=NULL; + st->s[0].len=0; + } + st->s[st->n_s].data=(unsigned char *)strd; + st->s[st->n_s].len=strlen(strd); + g_hash_table_insert(ctx->string_hash, strd, (gpointer)st->n_s); + return st->n_s++; +} + + +static int +osm_protobufdb_finish_file(struct osm_protobufdb_context *ctx) +{ + osm_protobufdb_finish_block(ctx); + if (ctx->f) { + fclose(ctx->f); + ctx->f=NULL; + } + ctx->current_file=-1; + return 1; +} + + +static int +osm_protobufdb_start_file(struct osm_protobufdb_context *ctx, int type, int num) +{ + char name[1024]; + if (ctx->current_file == num) + return 0; + osm_protobufdb_finish_file(ctx); + sprintf(name,"tst/%d-%08d",type,num); + ctx->f=fopen(name,"w"); + ctx->current_file=num; + ctx->current_block=0; + ctx->active_block=-1; + return 1; +} + +static void +test(void) +{ +#if 0 + struct node n,o; + long long id=1; + long long lat=0; + long long lon=0; + long long timestamp=0; + long long changeset=0; + int version=1; + int user_sid=0; + int uid=0; + int p; + n.id=1; +#endif +#if 0 + OSMPBF__DenseInfo di=OSMPBF__DENSE_INFO__INIT; + OSMPBF__DenseNodes dn=OSMPBF__DENSE_NODES__INIT; +#endif + + context.current_file=-1; + +#if 0 + context.di=malloc(sizeof(*context.di)); + *context.di=di; + context.dn=malloc(sizeof(*context.dn)); + *context.dn=dn; +#endif + +#if 0 + di.n_version=1; + di.version=&version; + di.n_timestamp=1; + di.timestamp=×tamp; + di.n_changeset=1; + di.changeset=&changeset; + di.n_user_sid=1; + di.user_sid=&user_sid; + di.n_uid=1; + di.uid=&uid; +#endif +#if 0 + n.id=1; + n.lat=1; + n.lon=1; + n.timestamp=1; + n.changeset=1; + n.version=1; + n.user_sid=0; + n.uid=0; + p=osm_protobufdb_insert_densenode(&n.id, &o, &dn); + osm_protobufdb_modify(&n, &o, p, &dn); + p=osm_protobufdb_insert_densenode(&n.id, &o, &dn); + osm_protobufdb_modify(&n, &o, p, &dn); +#endif + + +#if 0 + dn.n_id=1; + dn.id=&id; + dn.n_lat=1; + dn.lat=⪫ + dn.n_lon=1; + dn.lon=&lon; +#endif +#if 0 + st.n_s=1; + data.data="Test"; + data.len=4; + st.s=&data; +#endif +} + +static void +finish(void) +{ + osm_protobufdb_finish_file(&context); +#if 0 + osm_protobufdb_write_primitive_group(context.pg, context.pb); + osm_protobufdb_write_primitive_block(context.pb, context.blob); + osm_protobufdb_write_blob_to_file(); +#endif +} + +static long long +osm_protobufdb_timestamp(char *str) +{ + struct tm tm; + int res=sscanf(str,"%d-%d-%dT%d:%d:%dZ",&tm.tm_year,&tm.tm_mon,&tm.tm_mday,&tm.tm_hour,&tm.tm_min,&tm.tm_sec); + if (res != 6) + return 0; + tm.tm_year-=1900; + tm.tm_mon-=1; +#if defined(HAVE_API_WIN32_BASE) || defined(ANDROID) + return 0; +#else + return timegm(&tm); +#endif +} + +static void +osm_protobufdb_parse_info(struct osm_protobufdb_context *ctx, char *str) +{ + char version[1024]; + char changeset[1024]; + char user[1024]; + char uid[1024]; + char timestamp[1024]; + + OSMPBF__Info *i=&ctx->i, ii=OSMPBF__INFO__INIT; + *i=ii; + if (osm_xml_get_attribute(str, "version", version, sizeof(version))) { + i->version=atoi(version); + i->has_version=1; + } + if (osm_xml_get_attribute(str, "changeset", changeset, sizeof(changeset))) { + i->changeset=atoll(changeset); + i->has_changeset=1; + } + if (osm_xml_get_attribute(str, "user", user, sizeof(user))) { + osm_xml_decode_entities(user); + i->user_sid=osm_protobufdb_string(ctx, user); + i->has_user_sid=1; + } + if (osm_xml_get_attribute(str, "uid", uid, sizeof(uid))) { + i->uid=atoi(uid); + i->has_uid=1; + } + if (osm_xml_get_attribute(str, "timestamp", timestamp, sizeof(timestamp))) { + i->timestamp=osm_protobufdb_timestamp(timestamp); + i->has_timestamp=1; + } +} + +static int +osm_protobufdb_parse_node(struct osm_protobufdb_context *ctx, char *str) +{ + char id[1024]; + char lat[1024]; + char lon[1024]; + OSMPBF__Node *n=&ctx->n, ni=OSMPBF__NODE__INIT; + + *n=ni; + if (!osm_xml_get_attribute(str, "id", id, sizeof(id))) + return 0; + if (!osm_xml_get_attribute(str, "lat", lat, sizeof(lat))) + return 0; + if (!osm_xml_get_attribute(str, "lon", lon, sizeof(lon))) + return 0; + n->id=atoll(id); + n->lat=atof(lat)*latlon_scale+0.5; + n->lon=atof(lon)*latlon_scale+0.5; + int file=n->id/db_config.node_ids_per_file; + int fileo=n->id%db_config.node_ids_per_file; + int blob=fileo/db_config.node_ids_per_blob; + int blobo=fileo%db_config.node_ids_per_blob; + int group=blobo/db_config.node_ids_per_group; + + osm_protobufdb_start_file(ctx, 1, file); + osm_protobufdb_start_block(ctx, blob); + osm_protobufdb_start_group(ctx, group); + osm_protobufdb_parse_info(ctx, str); + ctx->in_node=1; + return 1; +} + +static int +osm_protobufdb_end_node(struct osm_protobufdb_context *ctx) +{ + int p; +#if 0 + OSMPBF__Node *n=&ctx->n,offset; + OSMPBF__Info *i=&ctx->i,offseti; + osm_protobufdb_start_densenode(ctx); + p=osm_protobufdb_insert_densenode(n->id, &offset, &offseti, context.dn); + osm_protobufdb_modify_densenode(n, i, &offset, &offseti, p, context.dn); +#else + p=osm_protobufdb_insert_node(ctx->n.id, ctx->pg); + osm_protobufdb_modify_node(&ctx->n, &ctx->i, p, ctx->pg); +#endif + ctx->in_node=0; + return 1; +} + + +static int +osm_protobufdb_parse_way(struct osm_protobufdb_context *ctx, char *str) +{ + char id[1024]; + OSMPBF__Way *w=&ctx->w, wi=OSMPBF__WAY__INIT; + + *w=wi; + if (!osm_xml_get_attribute(str, "id", id, sizeof(id))) + return 0; + w->id=atoll(id); + int file=w->id/db_config.way_ids_per_file; + int fileo=w->id%db_config.way_ids_per_file; + int blob=fileo/db_config.way_ids_per_blob; + int blobo=fileo%db_config.way_ids_per_blob; + int group=blobo/db_config.way_ids_per_group; + + osm_protobufdb_start_file(ctx, 2, file); + osm_protobufdb_start_block(ctx, blob); + osm_protobufdb_start_group(ctx, group); + osm_protobufdb_parse_info(ctx, str); + ctx->in_way=1; + return 1; +} + +static int +osm_protobufdb_end_way(struct osm_protobufdb_context *ctx) +{ + int p; + p=osm_protobufdb_insert_way(ctx->w.id, ctx->pg); + osm_protobufdb_modify_way(&ctx->w, &ctx->i, p, ctx->pg); + ctx->in_way=0; + return 1; +} + +static int +osm_protobufdb_parse_relation(struct osm_protobufdb_context *ctx, char *str) +{ + char id[1024]; + OSMPBF__Relation *r=&ctx->r, ri=OSMPBF__RELATION__INIT; + + *r=ri; + if (!osm_xml_get_attribute(str, "id", id, sizeof(id))) + return 0; + r->id=atoll(id); + int file=r->id/db_config.relation_ids_per_file; + int fileo=r->id%db_config.relation_ids_per_file; + int blob=fileo/db_config.relation_ids_per_blob; + int blobo=fileo%db_config.relation_ids_per_blob; + int group=blobo/db_config.relation_ids_per_group; + + osm_protobufdb_start_file(ctx, 3, file); + osm_protobufdb_start_block(ctx, blob); + osm_protobufdb_start_group(ctx, group); + osm_protobufdb_parse_info(ctx, str); + ctx->in_relation=1; + return 1; +} + +static int +osm_protobufdb_end_relation(struct osm_protobufdb_context *ctx) +{ + int p; + p=osm_protobufdb_insert_relation(ctx->r.id, ctx->pg); + osm_protobufdb_modify_relation(&ctx->r, &ctx->i, p, ctx->pg); + ctx->in_node=0; + return 1; +} + +static int +osm_protobufdb_parse_tag(struct osm_protobufdb_context *ctx, char *str) +{ + OSMPBF__Node *n=&ctx->n; + OSMPBF__Way *w=&ctx->w; + OSMPBF__Relation *r=&ctx->r; + char k_buffer[BUFFER_SIZE]; + char v_buffer[BUFFER_SIZE]; + if (!osm_xml_get_attribute(str, "k", k_buffer, BUFFER_SIZE)) + return 0; + if (!osm_xml_get_attribute(str, "v", v_buffer, BUFFER_SIZE)) + return 0; + osm_xml_decode_entities(v_buffer); + if (ctx->in_node) { + n->keys=realloc(n->keys, (n->n_keys+1)*sizeof(n->keys[0])); + n->vals=realloc(n->vals, (n->n_vals+1)*sizeof(n->vals[0])); + n->keys[n->n_keys++]=osm_protobufdb_string(ctx, k_buffer); + n->vals[n->n_vals++]=osm_protobufdb_string(ctx, v_buffer); + } + if (ctx->in_way) { + w->keys=realloc(w->keys, (w->n_keys+1)*sizeof(w->keys[0])); + w->vals=realloc(w->vals, (w->n_vals+1)*sizeof(w->vals[0])); + w->keys[w->n_keys++]=osm_protobufdb_string(ctx, k_buffer); + w->vals[w->n_vals++]=osm_protobufdb_string(ctx, v_buffer); + } + if (ctx->in_relation) { + r->keys=realloc(r->keys, (r->n_keys+1)*sizeof(r->keys[0])); + r->vals=realloc(r->vals, (r->n_vals+1)*sizeof(r->vals[0])); + r->keys[r->n_keys++]=osm_protobufdb_string(ctx, k_buffer); + r->vals[r->n_vals++]=osm_protobufdb_string(ctx, v_buffer); + } + return 1; +} + +static int +osm_protobufdb_parse_nd(struct osm_protobufdb_context *ctx, char *str) +{ + OSMPBF__Way *w=&ctx->w; + char ref_buffer[BUFFER_SIZE]; + if (!osm_xml_get_attribute(str, "ref", ref_buffer, BUFFER_SIZE)) + return 0; + if (ctx->in_way) { + w->refs=realloc(w->refs, (w->n_refs+1)*sizeof(w->refs[0])); + w->refs[w->n_refs++]=atoll(ref_buffer); + } + return 1; +} + +static int +osm_protobufdb_parse_member(struct osm_protobufdb_context *ctx, char *str) +{ + OSMPBF__Relation *r=&ctx->r; + char type_buffer[BUFFER_SIZE]; + char ref_buffer[BUFFER_SIZE]; + char role_buffer[BUFFER_SIZE]; + int type=0; + if (!osm_xml_get_attribute(str, "type", type_buffer, BUFFER_SIZE)) + return 0; + if (!osm_xml_get_attribute(str, "ref", ref_buffer, BUFFER_SIZE)) + return 0; + if (!osm_xml_get_attribute(str, "role", role_buffer, BUFFER_SIZE)) + return 0; + if (!strcmp(type_buffer,"node")) + type=0; + else if (!strcmp(type_buffer,"way")) + type=1; + else if (!strcmp(type_buffer,"relation")) + type=2; + if (ctx->in_relation) { + r->roles_sid=realloc(r->roles_sid, (r->n_roles_sid+1)*sizeof(r->roles_sid[0])); + r->roles_sid[r->n_roles_sid++]=osm_protobufdb_string(ctx, role_buffer); + r->memids=realloc(r->memids, (r->n_memids+1)*sizeof(r->memids[0])); + r->memids[r->n_memids++]=atoll(ref_buffer); + r->types=realloc(r->types, (r->n_types+1)*sizeof(r->types[0])); + r->types[r->n_types++]=type; + } + return 1; +} + + + +int +osm_protobufdb_load(FILE *in, char *dir) +{ + int size=BUFFER_SIZE; + char buffer[size]; + char *p; + sig_alrm(0); + test(); + while (fgets(buffer, size, in)) { + int closed=strstr(buffer,"/>")?1:0; + p=strchr(buffer,'<'); + if (! p) { + fprintf(stderr,"WARNING: wrong line %s\n", buffer); + continue; + } + if (!strncmp(p, "",7)) { + osm_protobufdb_end_node(&context); + } else if (!strncmp(p, "",6)) { + osm_protobufdb_end_way(&context); + } else if (!strncmp(p, "",11)) { + osm_protobufdb_end_relation(&context); + } else if (!strncmp(p, "",6)) { + } else { + fprintf(stderr,"WARNING: unknown tag in %s\n", buffer); + } + } + finish(); + return 1; +} diff --git a/navit/maptool/osm_psql.c b/navit/maptool/osm_psql.c new file mode 100644 index 0000000..53ba780 --- /dev/null +++ b/navit/maptool/osm_psql.c @@ -0,0 +1,189 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ +#include +#include +#include +#include +#include "maptool.h" +#include "debug.h" +#include "linguistics.h" +#include "file.h" +#ifdef HAVE_POSTGRESQL +#include + +int +map_collect_data_osm_db(char *dbstr, struct maptool_osm *osm) +{ + PGconn *conn; + PGresult *res,*node,*way,*tag; + int count,tagged,i,j,k; + long min, max, id, tag_id, node_id; + char query[256]; + + sig_alrm(0); + conn=PQconnectdb(dbstr); + if (! conn) { + fprintf(stderr,"Failed to connect to database with '%s'\n",dbstr); + exit(1); + } + res=PQexec(conn, "begin"); + if (! res) { + fprintf(stderr, "Cannot begin transaction: %s\n", PQerrorMessage(conn)); + PQclear(res); + exit(1); + } + res=PQexec(conn, "set transaction isolation level serializable"); + if (! res) { + fprintf(stderr, "Cannot set isolation level: %s\n", PQerrorMessage(conn)); + PQclear(res); + exit(1); + } + res=PQexec(conn, "declare node cursor for select id,x(coordinate),y(coordinate) from node order by id"); + if (! res) { + fprintf(stderr, "Cannot setup cursor for nodes: %s\n", PQerrorMessage(conn)); + PQclear(res); + exit(1); + } + res=PQexec(conn, "declare way cursor for select id from way order by id"); + if (! res) { + fprintf(stderr, "Cannot setup cursor for nodes: %s\n", PQerrorMessage(conn)); + PQclear(res); + exit(1); + } + res=PQexec(conn, "declare relation cursor for select id from relation order by id"); + if (! res) { + fprintf(stderr, "Cannot setup cursor for nodes: %s\n", PQerrorMessage(conn)); + PQclear(res); + exit(1); + } + for (;;) { + node=PQexec(conn, "fetch 100000 from node"); + if (! node) { + fprintf(stderr, "Cannot setup cursor for nodes: %s\n", PQerrorMessage(conn)); + PQclear(node); + exit(1); + } + count=PQntuples(node); + if (! count) + break; + min=atol(PQgetvalue(node, 0, 0)); + max=atol(PQgetvalue(node, count-1, 0)); + sprintf(query,"select node_id,name,value from node_tag where node_id >= %ld and node_id <= %ld order by node_id", min, max); + tag=PQexec(conn, query); + if (! tag) { + fprintf(stderr, "Cannot query node_tag: %s\n", PQerrorMessage(conn)); + exit(1); + } + j=0; + for (i = 0 ; i < count ; i++) { + id=atol(PQgetvalue(node, i, 0)); + osm_add_node(id, atof(PQgetvalue(node, i, 1)), atof(PQgetvalue(node, i, 2))); + tagged=0; + processed_nodes++; + while (j < PQntuples(tag)) { + tag_id=atol(PQgetvalue(tag, j, 0)); + if (tag_id == id) { + osm_add_tag(PQgetvalue(tag, j, 1), PQgetvalue(tag, j, 2)); + tagged=1; + j++; + } + if (tag_id < id) + j++; + if (tag_id > id) + break; + } + osm_end_node(osm); + } + PQclear(tag); + PQclear(node); + } + for (;;) { + way=PQexec(conn, "fetch 100000 from way"); + if (! way) { + fprintf(stderr, "Cannot setup cursor for ways: %s\n", PQerrorMessage(conn)); + PQclear(node); + exit(1); + } + count=PQntuples(way); + if (! count) + break; + min=atol(PQgetvalue(way, 0, 0)); + max=atol(PQgetvalue(way, count-1, 0)); + sprintf(query,"select way_id,node_id from way_node where way_id >= %ld and way_id <= %ld order by way_id,sequence_id", min, max); + node=PQexec(conn, query); + if (! node) { + fprintf(stderr, "Cannot query way_node: %s\n", PQerrorMessage(conn)); + exit(1); + } + sprintf(query,"select way_id,name,value from way_tag where way_id >= %ld and way_id <= %ld order by way_id", min, max); + tag=PQexec(conn, query); + if (! tag) { + fprintf(stderr, "Cannot query way_tag: %s\n", PQerrorMessage(conn)); + exit(1); + } + j=0; + k=0; + for (i = 0 ; i < count ; i++) { + id=atol(PQgetvalue(way, i, 0)); + osm_add_way(id); + tagged=0; + processed_ways++; + while (k < PQntuples(node)) { + node_id=atol(PQgetvalue(node, k, 0)); + if (node_id == id) { + osm_add_nd(atoll(PQgetvalue(node, k, 1))); + tagged=1; + k++; + } + if (node_id < id) + k++; + if (node_id > id) + break; + } + while (j < PQntuples(tag)) { + tag_id=atol(PQgetvalue(tag, j, 0)); + if (tag_id == id) { + osm_add_tag(PQgetvalue(tag, j, 1), PQgetvalue(tag, j, 2)); + tagged=1; + j++; + } + if (tag_id < id) + j++; + if (tag_id > id) + break; + } + if (tagged) + osm_end_way(osm); + } + PQclear(tag); + PQclear(node); + PQclear(way); + } + + res=PQexec(conn, "commit"); + if (! res) { + fprintf(stderr, "Cannot commit transaction: %s\n", PQerrorMessage(conn)); + PQclear(res); + exit(1); + } + sig_alrm(0); + sig_alrm_end(); + return 1; +} +#endif diff --git a/navit/maptool/osm_relations.c b/navit/maptool/osm_relations.c new file mode 100644 index 0000000..b14165b --- /dev/null +++ b/navit/maptool/osm_relations.c @@ -0,0 +1,126 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ +#include +#include +#include "maptool.h" +#include "attr.h" + +struct relations { + GHashTable *member_hash[3]; +}; + +struct relations_func { + void (*func)(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv); + void *func_priv; +}; + +struct relations_member { + osmid memberid; + void *relation_priv,*member_priv; + struct relations_func *func; +}; + +static guint +relations_member_hash(gconstpointer key) +{ + const struct relations_member *memb=key; + return (memb->memberid >> 32)^(memb->memberid & 0xffffffff); +} + +static gboolean +relations_member_equal(gconstpointer a, gconstpointer b) +{ + const struct relations_member *memba=a; + const struct relations_member *membb=b; + return (memba->memberid == membb->memberid); +} + +struct relations * +relations_new(void) +{ + struct relations *ret=g_new(struct relations, 1); + int i; + + for (i = 0 ; i < 3 ; i++) + ret->member_hash[i]=g_hash_table_new_full(relations_member_hash, relations_member_equal, NULL, NULL); + return ret; +} + +struct relations_func * +relations_func_new(void (*func)(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv), void *func_priv) +{ + struct relations_func *relations_func=g_new(struct relations_func, 1); + relations_func->func=func; + relations_func->func_priv=func_priv; + return relations_func; +} + +void +relations_add_func(struct relations *rel, struct relations_func *func, void *relation_priv, void *member_priv, int type, osmid id) +{ + GHashTable *member_hash=rel->member_hash[type-1]; + struct relations_member *memb=g_new(struct relations_member, 1); + + memb->memberid=id; + memb->relation_priv=relation_priv; + memb->member_priv=member_priv; + memb->func=func; + g_hash_table_insert(member_hash, memb, g_list_append(g_hash_table_lookup(member_hash, memb), memb)); +} + +void +relations_process(struct relations *rel, FILE *nodes, FILE *ways, FILE *relations) +{ + char buffer[128]; + struct item_bin *ib=(struct item_bin *)buffer; + long long *id; + struct coord *c=(struct coord *)(ib+1),cn={0,0}; + struct node_item *ni; + GList *l; + + if (nodes) { + item_bin_init(ib, type_point_unkn); + item_bin_add_coord(ib, &cn, 1); + item_bin_add_attr_longlong(ib, attr_osm_nodeid, 0); + id=item_bin_get_attr(ib, attr_osm_nodeid, NULL); + while ((ni=read_node_item(nodes))) { + *id=ni->id; + *c=ni->c; + l=g_hash_table_lookup(rel->member_hash[0], id); + while (l) { + struct relations_member *memb=l->data; + memb->func->func(memb->func->func_priv, memb->relation_priv, ib, memb->member_priv); + l=g_list_next(l); + } + } + } + if (ways) { + while ((ib=read_item(ways))) { + id=item_bin_get_attr(ib, attr_osm_wayid, NULL); + if (id) { + l=g_hash_table_lookup(rel->member_hash[1], id); + while (l) { + struct relations_member *memb=l->data; + memb->func->func(memb->func->func_priv, memb->relation_priv, ib, memb->member_priv); + l=g_list_next(l); + } + } + } + } +} diff --git a/navit/maptool/osm_xml.c b/navit/maptool/osm_xml.c new file mode 100644 index 0000000..265ee59 --- /dev/null +++ b/navit/maptool/osm_xml.c @@ -0,0 +1,231 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ +#include +#include +#include +#include +#include "maptool.h" + +int +osm_xml_get_attribute(char *xml, char *attribute, char *buffer, int buffer_size) +{ + int len=strlen(attribute); + char *pos,*i,s,attr[len+2]; + strcpy(attr, attribute); + strcpy(attr+len, "="); + pos=strstr(xml, attr); + if (! pos) + return 0; + pos+=len+1; + s=*pos++; + if (! s) + return 0; + i=strchr(pos, s); + if (! i) + return 0; + if (i - pos > buffer_size) { + fprintf(stderr,"Buffer overflow %ld vs %d\n", (long)(i-pos), buffer_size); + return 0; + } + strncpy(buffer, pos, i-pos); + buffer[i-pos]='\0'; + return 1; +} + +static struct entity { + char *entity; + char c; +} entities[]= { + {""",'"'}, + {"'",'\''}, + {"&",'&'}, + {"<",'<'}, + {">",'>'}, + {""",'"'}, + {"'",'\''}, + {"&",'&'}, + {"<",'<'}, + {">",'>'}, + {"{",'{'}, + {"}",'}'}, +}; + +void +osm_xml_decode_entities(char *buffer) +{ + char *pos=buffer; + int i,len,found; + + while ((pos=strchr(pos, '&'))) { + found=0; + for (i = 0 ; i < sizeof(entities)/sizeof(struct entity); i++) { + len=strlen(entities[i].entity); + if (!strncmp(pos, entities[i].entity, len)) { + *pos=entities[i].c; + memmove(pos+1, pos+len, strlen(pos+len)+1); + found=1; + break; + } + } + pos++; + } +} + +static int +parse_tag(char *p) +{ + char k_buffer[BUFFER_SIZE]; + char v_buffer[BUFFER_SIZE]; + if (!osm_xml_get_attribute(p, "k", k_buffer, BUFFER_SIZE)) + return 0; + if (!osm_xml_get_attribute(p, "v", v_buffer, BUFFER_SIZE)) + return 0; + osm_xml_decode_entities(v_buffer); + osm_add_tag(k_buffer, v_buffer); + return 1; +} + + +static int +parse_node(char *p) +{ + char id_buffer[BUFFER_SIZE]; + char lat_buffer[BUFFER_SIZE]; + char lon_buffer[BUFFER_SIZE]; + if (!osm_xml_get_attribute(p, "id", id_buffer, BUFFER_SIZE)) + return 0; + if (!osm_xml_get_attribute(p, "lat", lat_buffer, BUFFER_SIZE)) + return 0; + if (!osm_xml_get_attribute(p, "lon", lon_buffer, BUFFER_SIZE)) + return 0; + osm_add_node(atoll(id_buffer), atof(lat_buffer), atof(lon_buffer)); + return 1; +} + + +static int +parse_way(char *p) +{ + char id_buffer[BUFFER_SIZE]; + if (!osm_xml_get_attribute(p, "id", id_buffer, BUFFER_SIZE)) + return 0; + osm_add_way(atoll(id_buffer)); + return 1; +} + +static int +parse_relation(char *p) +{ + char id_buffer[BUFFER_SIZE]; + if (!osm_xml_get_attribute(p, "id", id_buffer, BUFFER_SIZE)) + return 0; + osm_add_relation(atoll(id_buffer)); + return 1; +} + +static int +parse_member(char *p) +{ + char type_buffer[BUFFER_SIZE]; + char ref_buffer[BUFFER_SIZE]; + char role_buffer[BUFFER_SIZE]; + int type; + if (!osm_xml_get_attribute(p, "type", type_buffer, BUFFER_SIZE)) + return 0; + if (!osm_xml_get_attribute(p, "ref", ref_buffer, BUFFER_SIZE)) + return 0; + if (!osm_xml_get_attribute(p, "role", role_buffer, BUFFER_SIZE)) + return 0; + if (!strcmp(type_buffer,"node")) + type=1; + else if (!strcmp(type_buffer,"way")) + type=2; + else if (!strcmp(type_buffer,"relation")) + type=3; + else { + fprintf(stderr,"Unknown type %s\n",type_buffer); + type=0; + } + osm_add_member(type, atoll(ref_buffer), role_buffer); + + return 1; +} + +static int +parse_nd(char *p) +{ + char ref_buffer[BUFFER_SIZE]; + if (!osm_xml_get_attribute(p, "ref", ref_buffer, BUFFER_SIZE)) + return 0; + osm_add_nd(atoll(ref_buffer)); + return 1; +} + +int +map_collect_data_osm(FILE *in, struct maptool_osm *osm) +{ + int size=BUFFER_SIZE; + char buffer[size]; + char *p; + sig_alrm(0); + while (fgets(buffer, size, in)) { + p=strchr(buffer,'<'); + if (! p) { + fprintf(stderr,"WARNING: wrong line %s\n", buffer); + continue; + } + if (!strncmp(p, "",7)) { + osm_end_node(osm); + } else if (!strncmp(p, "",6)) { + osm_end_way(osm); + } else if (!strncmp(p, "",11)) { + osm_end_relation(osm); + } else if (!strncmp(p, "",6)) { + } else { + fprintf(stderr,"WARNING: unknown tag in %s\n", buffer); + } + } + sig_alrm(0); + sig_alrm_end(); + return 1; +} diff --git a/navit/maptool/sourcesink.c b/navit/maptool/sourcesink.c new file mode 100644 index 0000000..97aa7de --- /dev/null +++ b/navit/maptool/sourcesink.c @@ -0,0 +1,169 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ +#include +#include +#include +#include "coord.h" +#include "item.h" +#include "attr.h" +#include "maptool.h" + +struct item_bin_sink * +item_bin_sink_new(void) +{ + struct item_bin_sink *ret=g_new0(struct item_bin_sink, 1); + + return ret; +} + +struct item_bin_sink_func * +item_bin_sink_func_new(int (*func)(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data)) +{ + struct item_bin_sink_func *ret=g_new0(struct item_bin_sink_func, 1); + ret->func=func; + return ret; +} + +void +item_bin_sink_func_destroy(struct item_bin_sink_func *func) +{ + g_free(func); +} + +void +item_bin_sink_add_func(struct item_bin_sink *sink, struct item_bin_sink_func *func) +{ + sink->sink_funcs=g_list_append(sink->sink_funcs, func); +} + +void +item_bin_sink_destroy(struct item_bin_sink *sink) +{ + /* g_list_foreach(sink->sink_funcs, (GFunc)g_free, NULL); */ + g_list_free(sink->sink_funcs); + g_free(sink); +} + +int +item_bin_write_to_sink(struct item_bin *ib, struct item_bin_sink *sink, struct tile_data *tile_data) +{ + GList *list=sink->sink_funcs; + int ret=0; + while (list) { + struct item_bin_sink_func *func=list->data; + ret=func->func(func, ib, tile_data); + if (ret) + break; + list=g_list_next(list); + } + return ret; +} + +struct item_bin_sink * +file_reader_new(FILE *in, int limit, int offset) +{ + struct item_bin_sink *ret; + if (!in) + return NULL; + ret=item_bin_sink_new(); + ret->priv_data[0]=in; + ret->priv_data[1]=(void *)(long)limit; + ret->priv_data[2]=(void *)(long)offset; + fseek(in, 0, SEEK_SET); + return ret; +} + +int +file_reader_finish(struct item_bin_sink *sink) +{ + struct item_bin *ib; + int ret =0; + FILE *in=sink->priv_data[0]; + int limit=(int)(long)sink->priv_data[1]; + int offset=(int)(long)sink->priv_data[2]; + while ((ib=read_item(in))) { + if (offset > 0) { + offset--; + } else { + ret=item_bin_write_to_sink(ib, sink, NULL); + if (ret || (limit != -1 && !--limit)) { + item_bin_sink_destroy(sink); + return ret; + } + } + } + item_bin_sink_destroy(sink); + return 0; +} + +int +file_writer_process(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data) +{ + FILE *out=func->priv_data[0]; + item_bin_write(ib, out); + return 0; +} + +struct item_bin_sink_func * +file_writer_new(FILE *out) +{ + struct item_bin_sink_func *file_writer; + if (!out) + return NULL; + file_writer=item_bin_sink_func_new(file_writer_process); + file_writer->priv_data[0]=out; + return file_writer; +} + +int +file_writer_finish(struct item_bin_sink_func *file_writer) +{ + item_bin_sink_func_destroy(file_writer); + return 0; +} + + +int +tile_collector_process(struct item_bin_sink_func *tile_collector, struct item_bin *ib, struct tile_data *tile_data) +{ + int *buffer,*buffer2; + int len=ib->len+1; + GHashTable *hash=tile_collector->priv_data[0]; + buffer=g_hash_table_lookup(hash, tile_data->buffer); + buffer2=g_malloc((len+(buffer ? buffer[0] : 1))*4); + if (buffer) { + memcpy(buffer2, buffer, buffer[0]*4); + } else + buffer2[0]=1; + memcpy(buffer2+buffer2[0], ib, len*4); + buffer2[0]+=len; + g_hash_table_insert(hash, g_strdup(tile_data->buffer), buffer2); + return 0; +} + +struct item_bin_sink_func * +tile_collector_new(struct item_bin_sink *out) +{ + struct item_bin_sink_func *tile_collector; + tile_collector=item_bin_sink_func_new(tile_collector_process); + tile_collector->priv_data[0]=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + tile_collector->priv_data[1]=out; + return tile_collector; +} + diff --git a/navit/maptool/tempfile.c b/navit/maptool/tempfile.c new file mode 100644 index 0000000..cf78028 --- /dev/null +++ b/navit/maptool/tempfile.c @@ -0,0 +1,64 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2011 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ +#include +#include "maptool.h" +#include "debug.h" + +char * +tempfile_name(char *suffix, char *name) +{ + return g_strdup_printf("%s_%s.tmp",name, suffix); +} +FILE * +tempfile(char *suffix, char *name, int mode) +{ + char *buffer=tempfile_name(suffix, name); + FILE *ret=NULL; + switch (mode) { + case 0: + ret=fopen(buffer, "rb"); + break; + case 1: + ret=fopen(buffer, "wb+"); + break; + case 2: + ret=fopen(buffer, "ab"); + break; + } + g_free(buffer); + return ret; +} + +void +tempfile_unlink(char *suffix, char *name) +{ + char buffer[4096]; + sprintf(buffer,"%s_%s.tmp",name, suffix); + unlink(buffer); +} + +void +tempfile_rename(char *suffix, char *from, char *to) +{ + char buffer_from[4096],buffer_to[4096]; + sprintf(buffer_from,"%s_%s.tmp",from,suffix); + sprintf(buffer_to,"%s_%s.tmp",to,suffix); + dbg_assert(rename(buffer_from, buffer_to) == 0); + +} diff --git a/navit/maptool/tile.c b/navit/maptool/tile.c new file mode 100644 index 0000000..1817ba6 --- /dev/null +++ b/navit/maptool/tile.c @@ -0,0 +1,676 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + + +#define _FILE_OFFSET_BITS 64 +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "file.h" +#include "item.h" +#include "map.h" +#include "zipfile.h" +#include "main.h" +#include "config.h" +#include "linguistics.h" +#include "plugin.h" + +#include "maptool.h" + +GList *aux_tile_list; +struct tile_head *tile_head_root; +GHashTable *strings_hash,*tile_hash,*tile_hash2; + +static char* string_hash_lookup( const char* key ) +{ + char* key_ptr = NULL; + + if ( strings_hash == NULL ) { + strings_hash = g_hash_table_new(g_str_hash, g_str_equal); + } + + if ( ( key_ptr = g_hash_table_lookup(strings_hash, key )) == NULL ) { + key_ptr = g_strdup( key ); + g_hash_table_insert(strings_hash, key_ptr, (gpointer)key_ptr ); + + } + return key_ptr; +} + +static char** th_get_subtile( const struct tile_head* th, int idx ) +{ + char* subtile_ptr = NULL; + subtile_ptr = (char*)th + sizeof( struct tile_head ) + idx * sizeof( char *); + return (char**)subtile_ptr; +} + +int +tile(struct rect *r, char *suffix, char *ret, int max, int overlap, struct rect *tr) +{ + int x0,x2,x4; + int y0,y2,y4; + int xo,yo; + int i; + x0=world_bbox.l.x; + y0=world_bbox.l.y; + x4=world_bbox.h.x; + y4=world_bbox.h.y; + for (i = 0 ; i < max ; i++) { + x2=(x0+x4)/2; + y2=(y0+y4)/2; + xo=(x4-x0)*overlap/100; + yo=(y4-y0)*overlap/100; + if ( contains_bbox(x0,y0,x2+xo,y2+yo,r)) { + strcat(ret,"d"); + x4=x2+xo; + y4=y2+yo; + } else if (contains_bbox(x2-xo,y0,x4,y2+yo,r)) { + strcat(ret,"c"); + x0=x2-xo; + y4=y2+yo; + } else if (contains_bbox(x0,y2-yo,x2+xo,y4,r)) { + strcat(ret,"b"); + x4=x2+xo; + y0=y2-yo; + } else if (contains_bbox(x2-xo,y2-yo,x4,y4,r)) { + strcat(ret,"a"); + x0=x2-xo; + y0=y2-yo; + } else + break; + } + if (tr) { + tr->l.x=x0; + tr->l.y=y0; + tr->h.x=x4; + tr->h.y=y4; + } + if (suffix) + strcat(ret,suffix); + return i; +} + +void +tile_bbox(char *tile, struct rect *r, int overlap) +{ + struct coord c; + int xo,yo; + *r=world_bbox; + while (*tile) { + c.x=(r->l.x+r->h.x)/2; + c.y=(r->l.y+r->h.y)/2; + xo=(r->h.x-r->l.x)*overlap/100; + yo=(r->h.y-r->l.y)*overlap/100; + switch (*tile) { + case 'a': + r->l.x=c.x-xo; + r->l.y=c.y-yo; + break; + case 'b': + r->h.x=c.x+xo; + r->l.y=c.y-yo; + break; + case 'c': + r->l.x=c.x-xo; + r->h.y=c.y+yo; + break; + case 'd': + r->h.x=c.x+xo; + r->h.y=c.y+yo; + break; + } + tile++; + } +} + +int +tile_len(char *tile) +{ + int ret=0; + while (tile[0] >= 'a' && tile[0] <= 'd') { + tile++; + ret++; + } + return ret; +} + +static void +tile_extend(char *tile, struct item_bin *ib, GList **tiles_list) +{ + struct tile_head *th=NULL; + if (debug_tile(tile)) + fprintf(stderr,"Tile:Writing %d bytes to '%s' (%p,%p) 0x%x "LONGLONG_FMT"\n", (ib->len+1)*4, tile, g_hash_table_lookup(tile_hash, tile), tile_hash2 ? g_hash_table_lookup(tile_hash2, tile) : NULL, ib->type, item_bin_get_id(ib)); + if (tile_hash2) + th=g_hash_table_lookup(tile_hash2, tile); + if (!th) + th=g_hash_table_lookup(tile_hash, tile); + if (! th) { + th=malloc(sizeof(struct tile_head)+ sizeof( char* ) ); + assert(th != NULL); + // strcpy(th->subtiles, tile); + th->num_subtiles=1; + th->total_size=0; + th->total_size_used=0; + th->zipnum=0; + th->zip_data=NULL; + th->name=string_hash_lookup(tile); + *th_get_subtile( th, 0 ) = th->name; + + if (tile_hash2) + g_hash_table_insert(tile_hash2, string_hash_lookup( th->name ), th); + if (tiles_list) + *tiles_list=g_list_append(*tiles_list, string_hash_lookup( th->name ) ); + processed_tiles++; + if (debug_tile(tile)) + fprintf(stderr,"new '%s'\n", tile); + } + th->total_size+=ib->len*4+4; + if (debug_tile(tile)) + fprintf(stderr,"New total size of %s(%p):%d\n", th->name, th, th->total_size); + g_hash_table_insert(tile_hash, string_hash_lookup( th->name ), th); +} + +static int +tile_data_size(char *tile) +{ + struct tile_head *th; + th=g_hash_table_lookup(tile_hash, tile); + if (! th) + return 0; + return th->total_size; +} + +static int +merge_tile(char *base, char *sub) +{ + struct tile_head *thb, *ths; + thb=g_hash_table_lookup(tile_hash, base); + ths=g_hash_table_lookup(tile_hash, sub); + if (! ths) + return 0; + if (debug_tile(base) || debug_tile(sub)) + fprintf(stderr,"merging '%s'(%p) (%d) with '%s'(%p) (%d)\n", base, thb, thb ? thb->total_size : 0, sub, ths, ths->total_size); + if (! thb) { + thb=ths; + g_hash_table_remove(tile_hash, sub); + thb->name=string_hash_lookup(base); + g_hash_table_insert(tile_hash, string_hash_lookup( thb->name ), thb); + + } else { + thb=realloc(thb, sizeof(struct tile_head)+( ths->num_subtiles+thb->num_subtiles ) * sizeof( char*) ); + assert(thb != NULL); + memcpy( th_get_subtile( thb, thb->num_subtiles ), th_get_subtile( ths, 0 ), ths->num_subtiles * sizeof( char*) ); + thb->num_subtiles+=ths->num_subtiles; + thb->total_size+=ths->total_size; + g_hash_table_insert(tile_hash, string_hash_lookup( thb->name ), thb); + g_hash_table_remove(tile_hash, sub); + g_free(ths); + } + return 1; +} + +static gint +get_tiles_list_cmp(gconstpointer s1, gconstpointer s2) +{ + return strcmp((char *)s1, (char *)s2); +} + +static void +get_tiles_list_func(char *key, struct tile_head *th, GList **list) +{ + *list=g_list_prepend(*list, key); +} + +static GList * +get_tiles_list(void) +{ + GList *ret=NULL; + g_hash_table_foreach(tile_hash, (GHFunc)get_tiles_list_func, &ret); + ret=g_list_sort(ret, get_tiles_list_cmp); + return ret; +} + +#if 0 +static void +write_tile(char *key, struct tile_head *th, gpointer dummy) +{ + FILE *f; + char buffer[1024]; + fprintf(stderr,"DEBUG: Writing %s\n", key); + strcpy(buffer,"tiles/"); + strcat(buffer,key); +#if 0 + strcat(buffer,".bin"); +#endif + f=fopen(buffer, "wb+"); + while (th) { + fwrite(th->data, th->size, 1, f); + th=th->next; + } + fclose(f); +} +#endif + +static void +write_item(char *tile, struct item_bin *ib, FILE *reference) +{ + struct tile_head *th; + int size; + + th=g_hash_table_lookup(tile_hash2, tile); + if (debug_itembin(ib)) { + fprintf(stderr,"tile head %p\n",th); + } + if (! th) + th=g_hash_table_lookup(tile_hash, tile); + if (th) { + if (debug_itembin(ib)) { + fprintf(stderr,"Match %s %d %s\n",tile,th->process,th->name); + dump_itembin(ib); + } + if (th->process != 0 && th->process != 1) { + fprintf(stderr,"error with tile '%s' of length %d\n", tile, (int)strlen(tile)); + abort(); + } + if (! th->process) { + if (reference) + fseek(reference, 8, SEEK_CUR); + return; + } + if (debug_tile(tile)) + fprintf(stderr,"Data:Writing %d bytes to '%s' (%p,%p) 0x%x\n", (ib->len+1)*4, tile, g_hash_table_lookup(tile_hash, tile), tile_hash2 ? g_hash_table_lookup(tile_hash2, tile) : NULL, ib->type); + size=(ib->len+1)*4; + if (th->total_size_used+size > th->total_size) { + fprintf(stderr,"Overflow in tile %s (used %d max %d item %d)\n", tile, th->total_size_used, th->total_size, size); + exit(1); + return; + } + if (reference) { + int offset=th->total_size_used/4; + fwrite(&th->zipnum, sizeof(th->zipnum), 1, reference); + fwrite(&offset, sizeof(th->total_size_used), 1, reference); + } + if (th->zip_data) + memcpy(th->zip_data+th->total_size_used, ib, size); + th->total_size_used+=size; + } else { + fprintf(stderr,"no tile hash found for %s\n", tile); + exit(1); + } +} + +void +tile_write_item_to_tile(struct tile_info *info, struct item_bin *ib, FILE *reference, char *name) +{ + if (info->write) + write_item(name, ib, reference); + else + tile_extend(name, ib, info->tiles_list); +} + +void +tile_write_item_minmax(struct tile_info *info, struct item_bin *ib, FILE *reference, int min, int max) +{ + struct rect r; + char buffer[1024]; + bbox((struct coord *)(ib+1), ib->clen/2, &r); + buffer[0]='\0'; + tile(&r, info->suffix, buffer, max, overlap, NULL); + tile_write_item_to_tile(info, ib, reference, buffer); +} + +int +add_aux_tile(struct zip_info *zip_info, char *name, char *filename, int size) +{ + struct aux_tile *at; + GList *l; + l=aux_tile_list; + while (l) { + at=l->data; + if (!strcmp(at->name, name)) { + fprintf(stderr,"exists %s vs %s\n",at->name, name); + return -1; + } + l=g_list_next(l); + } + at=g_new0(struct aux_tile, 1); + at->name=g_strdup(name); + at->filename=g_strdup(filename); + at->size=size; + aux_tile_list=g_list_append(aux_tile_list, at); + return zip_add_member(zip_info); +} + +int +write_aux_tiles(struct zip_info *zip_info) +{ + GList *l=aux_tile_list; + struct aux_tile *at; + char *buffer; + FILE *f; + int count=0; + + while (l) { + at=l->data; + buffer=malloc(at->size); + assert(buffer != NULL); + f=fopen(at->filename,"rb"); + assert(f != NULL); + fread(buffer, at->size, 1, f); + fclose(f); + write_zipmember(zip_info, at->name, zip_get_maxnamelen(zip_info), buffer, at->size); + free(buffer); + count++; + l=g_list_next(l); + zip_add_member(zip_info); + } + return count; +} + +static int +add_tile_hash(struct tile_head *th) +{ + int idx,len,maxnamelen=0; + char **data; + +#if 0 + g_hash_table_insert(tile_hash2, string_hash_lookup( th->name ), th); +#endif + for( idx = 0; idx < th->num_subtiles; idx++ ) { + + data = th_get_subtile( th, idx ); + + if (debug_tile(((char *)data)) || debug_tile(th->name)) { + fprintf(stderr,"Parent for '%s' is '%s'\n", *data, th->name); + } + + g_hash_table_insert(tile_hash2, *data, th); + + len = strlen( *data ); + + if (len > maxnamelen) { + maxnamelen=len; + } + } + return maxnamelen; +} + + +int +create_tile_hash(void) +{ + struct tile_head *th; + int len,maxnamelen=0; + + tile_hash2=g_hash_table_new(g_str_hash, g_str_equal); + th=tile_head_root; + while (th) { + len=add_tile_hash(th); + if (len > maxnamelen) + maxnamelen=len; + th=th->next; + } + return maxnamelen; +} + +static void +create_tile_hash_list(GList *list) +{ + GList *next; + struct tile_head *th; + + tile_hash2=g_hash_table_new(g_str_hash, g_str_equal); + + next=g_list_first(list); + while (next) { + th=g_hash_table_lookup(tile_hash, next->data); + if (!th) { + fprintf(stderr,"No tile found for '%s'\n", (char *)(next->data)); + } + add_tile_hash(th); + next=g_list_next(next); + } +} + +void +load_tilesdir(FILE *in) +{ + char tile[32],subtile[32],c; + int size,zipnum=0; + create_tile_hash(); + tile_hash=g_hash_table_new(g_str_hash, g_str_equal); + struct tile_head **last=&tile_head_root; + while (fscanf(in,"%[^:]:%d",tile,&size) == 2) { + struct tile_head *th=malloc(sizeof(struct tile_head)); + if (!strcmp(tile,"index")) + tile[0]='\0'; + th->num_subtiles=0; + th->total_size=size; + th->total_size_used=0; + th->zipnum=zipnum++; + th->zip_data=NULL; + th->name=string_hash_lookup(tile); +#if 0 + printf("tile '%s' %d\n",tile,size); +#endif + while (fscanf(in,":%[^:\n]",subtile) == 1) { +#if 0 + printf("subtile '%s'\n",subtile); +#endif + th=realloc(th, sizeof(struct tile_head)+(th->num_subtiles+1)*sizeof(char*)); + *th_get_subtile( th, th->num_subtiles ) = string_hash_lookup(subtile); + th->num_subtiles++; + } + *last=th; + last=&th->next; + add_tile_hash(th); + g_hash_table_insert(tile_hash, th->name, th); + if (fread(&c, 1, 1, in) != 1 || c != '\n') { + printf("syntax error\n"); + } + } +} + +void +write_tilesdir(struct tile_info *info, struct zip_info *zip_info, FILE *out) +{ + int idx,len,maxlen; + GList *next,*tiles_list; + char **data; + struct tile_head *th,**last=NULL; + + tiles_list=get_tiles_list(); + info->tiles_list=&tiles_list; + if (! info->write) + create_tile_hash_list(tiles_list); + next=g_list_first(tiles_list); + last=&tile_head_root; + maxlen=info->maxlen; + if (! maxlen) { + while (next) { + if (strlen(next->data) > maxlen) + maxlen=strlen(next->data); + next=g_list_next(next); + } + } + len=maxlen; + while (len >= 0) { +#if 0 + fprintf(stderr,"PROGRESS: collecting tiles with len=%d\n", len); +#endif + next=g_list_first(tiles_list); + while (next) { + if (strlen(next->data) == len) { + th=g_hash_table_lookup(tile_hash, next->data); + if (!info->write) { + *last=th; + last=&th->next; + th->next=NULL; + th->zipnum=zip_get_zipnum(zip_info); + fprintf(out,"%s:%d",strlen((char *)next->data)?(char *)next->data:"index",th->total_size); + + for ( idx = 0; idx< th->num_subtiles; idx++ ){ + data= th_get_subtile( th, idx ); + fprintf(out,":%s", *data); + } + + fprintf(out,"\n"); + } + if (th->name[strlen(info->suffix)]) + index_submap_add(info, th); + zip_add_member(zip_info); + processed_tiles++; + } + next=g_list_next(next); + } + len--; + } + if (info->suffix[0] && info->write) { + struct item_bin *item_bin=init_item(type_submap); + item_bin_add_coord_rect(item_bin, &world_bbox); + item_bin_add_attr_range(item_bin, attr_order, 0, 255); + item_bin_add_attr_int(item_bin, attr_zipfile_ref, zip_get_zipnum(zip_info)-1); + item_bin_write(item_bin, zip_get_index(zip_info)); + } +} + +void +merge_tiles(struct tile_info *info) +{ + struct tile_head *th; + char basetile[1024]; + char subtile[1024]; + GList *tiles_list_sorted,*last; + int i,i_min,len,size_all,size[5],size_min,work_done; + long long zip_size; + + do { + tiles_list_sorted=get_tiles_list(); + fprintf(stderr,"PROGRESS: sorting %d tiles\n", g_list_length(tiles_list_sorted)); + tiles_list_sorted=g_list_sort(tiles_list_sorted, (GCompareFunc)strcmp); + fprintf(stderr,"PROGRESS: sorting %d tiles done\n", g_list_length(tiles_list_sorted)); + last=g_list_last(tiles_list_sorted); + zip_size=0; + while (last) { + th=g_hash_table_lookup(tile_hash, last->data); + zip_size+=th->total_size; + last=g_list_previous(last); + } + last=g_list_last(tiles_list_sorted); + work_done=0; + while (last) { + processed_tiles++; + len=tile_len(last->data); + if (len >= 1) { + strcpy(basetile,last->data); + basetile[len-1]='\0'; + strcat(basetile, info->suffix); + strcpy(subtile,last->data); + for (i = 0 ; i < 4 ; i++) { + subtile[len-1]='a'+i; + size[i]=tile_data_size(subtile); + } + size[4]=tile_data_size(basetile); + size_all=size[0]+size[1]+size[2]+size[3]+size[4]; + if (size_all < 65536 && size_all > 0 && size_all != size[4]) { + for (i = 0 ; i < 4 ; i++) { + subtile[len-1]='a'+i; + work_done+=merge_tile(basetile, subtile); + } + } else { + for (;;) { + size_min=size_all; + i_min=-1; + for (i = 0 ; i < 4 ; i++) { + if (size[i] && size[i] < size_min) { + size_min=size[i]; + i_min=i; + } + } + if (i_min == -1) + break; + if (size[4]+size_min >= 65536) + break; + subtile[len-1]='a'+i_min; + work_done+=merge_tile(basetile, subtile); + size[4]+=size[i_min]; + size[i_min]=0; + } + } + } + last=g_list_previous(last); + } + g_list_free(tiles_list_sorted); + fprintf(stderr,"PROGRESS: merged %d tiles\n", work_done); + } while (work_done); +} + +struct attr map_information_attrs[32]; + +void +index_init(struct zip_info *info, int version) +{ + struct item_bin *item_bin; + int i; + map_information_attrs[0].type=attr_version; + map_information_attrs[0].u.num=version; + item_bin=init_item(type_map_information); + for (i = 0 ; i < 32 ; i++) { + if (!map_information_attrs[i].type) + break; + item_bin_add_attr(item_bin, &map_information_attrs[i]); + } + item_bin_write(item_bin, zip_get_index(info)); +} + +void +index_submap_add(struct tile_info *info, struct tile_head *th) +{ + int tlen=tile_len(th->name); + int len=tlen; + char index_tile[len+1+strlen(info->suffix)]; + struct rect r; + struct item_bin *item_bin; + + strcpy(index_tile, th->name); + if (len > 6) + len=6; + else + len=0; + index_tile[len]=0; + strcat(index_tile, info->suffix); + tile_bbox(th->name, &r, overlap); + + item_bin=init_item(type_submap); + item_bin_add_coord_rect(item_bin, &r); + item_bin_add_attr_range(item_bin, attr_order, (tlen > 4)?tlen-4 : 0, 255); + item_bin_add_attr_int(item_bin, attr_zipfile_ref, th->zipnum); + tile_write_item_to_tile(info, item_bin, NULL, index_tile); +} diff --git a/navit/maptool/zip.c b/navit/maptool/zip.c new file mode 100644 index 0000000..578f356 --- /dev/null +++ b/navit/maptool/zip.c @@ -0,0 +1,475 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include "maptool.h" +#include "config.h" +#include "zipfile.h" + +#ifdef HAVE_LIBCRYPTO +#include +#include +#include +#include +#include +#include +#endif + +struct zip_info { + int zipnum; + int dir_size; + long long offset; + int compression_level; + int maxnamelen; + int zip64; + short date; + short time; + char *passwd; + FILE *res2; + FILE *index; + FILE *dir; +#ifdef HAVE_LIBCRYPTO + MD5_CTX md5_ctx; +#endif + int md5; +}; + +static int +zip_write(struct zip_info *info, void *data, int len) +{ + if (fwrite(data, len, 1, info->res2) != 1) + return 0; +#ifdef HAVE_LIBCRYPTO + if (info->md5) + MD5_Update(&info->md5_ctx, data, len); +#endif + return 1; +} + +#ifdef HAVE_ZLIB +static int +compress2_int(Byte *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level) +{ + z_stream stream; + int err; + + stream.next_in = (Bytef*)source; + stream.avail_in = (uInt)sourceLen; + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = deflateInit2(&stream, level, Z_DEFLATED, -15, 9, Z_DEFAULT_STRATEGY); + if (err != Z_OK) return err; + + err = deflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + deflateEnd(&stream); + return err == Z_OK ? Z_BUF_ERROR : err; + } + *destLen = stream.total_out; + + err = deflateEnd(&stream); + return err; +} +#endif + +void +write_zipmember(struct zip_info *zip_info, char *name, int filelen, char *data, int data_size) +{ + struct zip_lfh lfh = { + 0x04034b50, + 0x0a, + 0x0, + 0x0, + zip_info->time, + zip_info->date, + 0x0, + 0x0, + 0x0, + filelen, + 0x0, + }; + struct zip_cd cd = { + 0x02014b50, + 0x17, + 0x00, + 0x0a, + 0x00, + 0x0000, + 0x0, + zip_info->time, + zip_info->date, + 0x0, + 0x0, + 0x0, + filelen, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0, + zip_info->offset, + }; + struct zip_cd_ext cd_ext = { + 0x1, + 0x8, + zip_info->offset, + }; +#ifdef HAVE_LIBCRYPTO + struct zip_enc enc = { + 0x9901, + 0x7, + 0x2, + 'A','E', + 0x1, + 0x0, + }; + unsigned char salt[8], key[34], verify[2], mac[10]; +#endif + char filename[filelen+1]; + int error,crc=0,len,comp_size=data_size; + uLongf destlen=data_size+data_size/500+12; + char *compbuffer; + + compbuffer = malloc(destlen); + if (!compbuffer) { + fprintf(stderr, "No more memory.\n"); + exit (1); + } +#ifdef HAVE_LIBCRYPTO + if (zip_info->passwd) { + RAND_bytes(salt, sizeof(salt)); + PKCS5_PBKDF2_HMAC_SHA1(zip_info->passwd, strlen(zip_info->passwd), salt, sizeof(salt), 1000, sizeof(key), key); + verify[0]=key[32]; + verify[1]=key[33]; + } else { +#endif + crc=crc32(0, NULL, 0); + crc=crc32(crc, (unsigned char *)data, data_size); +#ifdef HAVE_LIBCRYPTO + } +#endif + lfh.zipmthd=zip_info->compression_level ? 8:0; +#ifdef HAVE_ZLIB + if (zip_info->compression_level) { + error=compress2_int((Byte *)compbuffer, &destlen, (Bytef *)data, data_size, zip_info->compression_level); + if (error == Z_OK) { + if (destlen < data_size) { + data=compbuffer; + comp_size=destlen; + } else + lfh.zipmthd=0; + } else { + fprintf(stderr,"compress2 returned %d\n", error); + } + } +#endif + lfh.zipcrc=crc; + lfh.zipsize=comp_size; + lfh.zipuncmp=data_size; +#ifdef HAVE_LIBCRYPTO + if (zip_info->passwd) { + enc.compress_method=lfh.zipmthd; + lfh.zipmthd=99; + lfh.zipxtraln+=sizeof(enc); + lfh.zipgenfld|=1; + lfh.zipsize+=sizeof(salt)+sizeof(verify)+sizeof(mac); + } +#endif + cd.zipccrc=crc; + cd.zipcsiz=lfh.zipsize; + cd.zipcunc=data_size; + cd.zipcmthd=lfh.zipmthd; + if (zip_info->zip64) { + cd.zipofst=0xffffffff; + cd.zipcxtl+=sizeof(cd_ext); + } +#ifdef HAVE_LIBCRYPTO + if (zip_info->passwd) { + cd.zipcmthd=99; + cd.zipcxtl+=sizeof(enc); + cd.zipcflg|=1; + } +#endif + strcpy(filename, name); + len=strlen(filename); + while (len < filelen) { + filename[len++]='_'; + } + filename[filelen]='\0'; + zip_write(zip_info, &lfh, sizeof(lfh)); + zip_write(zip_info, filename, filelen); + zip_info->offset+=sizeof(lfh)+filelen; +#ifdef HAVE_LIBCRYPTO + if (zip_info->passwd) { + unsigned char counter[16], xor[16], *datap=(unsigned char *)data; + int size=comp_size; + AES_KEY aeskey; + zip_write(zip_info, &enc, sizeof(enc)); + zip_write(zip_info, salt, sizeof(salt)); + zip_write(zip_info, verify, sizeof(verify)); + zip_info->offset+=sizeof(enc)+sizeof(salt)+sizeof(verify); + AES_set_encrypt_key(key, 128, &aeskey); + memset(counter, 0, sizeof(counter)); + while (size > 0) { + int i,curr_size,idx=0; + do { + counter[idx]++; + } while (!counter[idx++]); + AES_encrypt(counter, xor, &aeskey); + curr_size=size; + if (curr_size > sizeof(xor)) + curr_size=sizeof(xor); + for (i = 0 ; i < curr_size ; i++) + *datap++^=xor[i]; + size-=curr_size; + } + } +#endif + zip_write(zip_info, data, comp_size); + zip_info->offset+=comp_size; +#ifdef HAVE_LIBCRYPTO + if (zip_info->passwd) { + unsigned int maclen=sizeof(mac); + unsigned char mactmp[maclen*2]; + HMAC(EVP_sha1(), key+16, 16, (unsigned char *)data, comp_size, mactmp, &maclen); + zip_write(zip_info, mactmp, sizeof(mac)); + zip_info->offset+=sizeof(mac); + } +#endif + fwrite(&cd, sizeof(cd), 1, zip_info->dir); + fwrite(filename, filelen, 1, zip_info->dir); + zip_info->dir_size+=sizeof(cd)+filelen; + if (zip_info->zip64) { + fwrite(&cd_ext, sizeof(cd_ext), 1, zip_info->dir); + zip_info->dir_size+=sizeof(cd_ext); + } +#ifdef HAVE_LIBCRYPTO + if (zip_info->passwd) { + fwrite(&enc, sizeof(enc), 1, zip_info->dir); + zip_info->dir_size+=sizeof(enc); + } +#endif + + free(compbuffer); +} + +void +zip_write_index(struct zip_info *info) +{ + int size=ftell(info->index); + char buffer[size]; + + fseek(info->index, 0, SEEK_SET); + fread(buffer, size, 1, info->index); + write_zipmember(info, "index", strlen("index"), buffer, size); + info->zipnum++; +} + +static void +zip_write_file_data(struct zip_info *info, FILE *in) +{ + size_t size; + char buffer[4096]; + while ((size=fread(buffer, 1, 4096, in))) + zip_write(info, buffer, size); +} + +int +zip_write_directory(struct zip_info *info) +{ + struct zip_eoc eoc = { + 0x06054b50, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0, + 0x0, + 0x0, + }; + struct zip64_eoc eoc64 = { + 0x06064b50, + 0x0, + 0x0, + 0x0403, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + }; + struct zip64_eocl eocl = { + 0x07064b50, + 0x0, + 0x0, + 0x0, + }; + + fseek(info->dir, 0, SEEK_SET); + zip_write_file_data(info, info->dir); + if (info->zip64) { + eoc64.zip64esize=sizeof(eoc64)-12; + eoc64.zip64enum=info->zipnum; + eoc64.zip64ecenn=info->zipnum; + eoc64.zip64ecsz=info->dir_size; + eoc64.zip64eofst=info->offset; + zip_write(info, &eoc64, sizeof(eoc64)); + eocl.zip64lofst=info->offset+info->dir_size; + zip_write(info, &eocl, sizeof(eocl)); + } + eoc.zipenum=info->zipnum; + eoc.zipecenn=info->zipnum; + eoc.zipecsz=info->dir_size; + eoc.zipeofst=info->offset; + zip_write(info, &eoc, sizeof(eoc)); + sig_alrm(0); +#ifndef _WIN32 + alarm(0); +#endif + return 0; +} + +struct zip_info * +zip_new(void) +{ + return g_new0(struct zip_info, 1); +} + +void +zip_set_md5(struct zip_info *info, int on) +{ +#ifdef HAVE_LIBCRYPTO + info->md5=on; + if (on) + MD5_Init(&info->md5_ctx); +#endif +} + +int +zip_get_md5(struct zip_info *info, unsigned char *out) +{ + if (!info->md5) + return 0; +#ifdef HAVE_LIBCRYPTO + MD5_Final(out, &info->md5_ctx); + return 1; +#endif + return 0; +} + +void +zip_set_zip64(struct zip_info *info, int on) +{ + info->zip64=on; +} + +void +zip_set_compression_level(struct zip_info *info, int level) +{ + info->compression_level=level; +} + +void +zip_set_maxnamelen(struct zip_info *info, int max) +{ + info->maxnamelen=max; +} + +int +zip_get_maxnamelen(struct zip_info *info) +{ + return info->maxnamelen; +} + +int +zip_add_member(struct zip_info *info) +{ + return info->zipnum++; +} + + +int +zip_set_timestamp(struct zip_info *info, char *timestamp) +{ + int year,month,day,hour,min,sec; + + if (sscanf(timestamp,"%d-%d-%dT%d:%d:%d",&year,&month,&day,&hour,&min,&sec) == 6) { + info->date=day | (month << 5) | ((year-1980) << 9); + info->time=(sec >> 1) | (min << 5) | (hour << 11); + return 1; + } + return 0; +} + +int +zip_set_password(struct zip_info *info, char *passwd) +{ + info->passwd=passwd; + return 1; +} + + +void +zip_open(struct zip_info *info, char *out, char *dir, char *index) +{ + info->res2=fopen(out,"wb+"); + info->dir=fopen(dir,"wb+"); + info->index=fopen(index,"wb+"); +} + +FILE * +zip_get_index(struct zip_info *info) +{ + return info->index; +} + +int +zip_get_zipnum(struct zip_info *info) +{ + return info->zipnum; +} + +void +zip_set_zipnum(struct zip_info *info, int num) +{ + info->zipnum=num; +} + +void +zip_close(struct zip_info *info) +{ + fclose(info->index); + fclose(info->dir); + fclose(info->res2); +} + +void +zip_destroy(struct zip_info *info) +{ + g_free(info); +} diff --git a/navit/maptype.c b/navit/maptype.c new file mode 100644 index 0000000..cb77a1d --- /dev/null +++ b/navit/maptype.c @@ -0,0 +1,51 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include "debug.h" +#include "projection.h" +#include "item.h" +#include "map.h" +#include "maptype.h" + +static struct maptype *maptype_root; + +void +maptype_register(char *name, struct map_priv *(*map_new)(struct map_methods *meth, char *data, char **charset, enum projection *pro)) +{ + struct maptype *mt; + mt=g_new(struct maptype, 1); + mt->name=g_strdup(name); + mt->map_new=map_new; + mt->next=maptype_root; + maptype_root=mt; +} + +struct maptype * +maptype_get(const char *name) +{ + struct maptype *mt=maptype_root; + + while (mt) { + if (!g_ascii_strcasecmp(mt->name, name)) + return mt; + mt=mt->next; + } + return NULL; +} diff --git a/navit/maptype.h b/navit/maptype.h new file mode 100644 index 0000000..7ebf233 --- /dev/null +++ b/navit/maptype.h @@ -0,0 +1,40 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_MAPTYPE_H +#define NAVIT_MAPTYPE_H + +struct map_methods; +enum projection; + +struct maptype { + char *name; + struct map_priv *(*map_new)(struct map_methods *meth, char *data, char **charset, enum projection *pro); + struct maptype *next; +}; + +/* prototypes */ +struct map_methods; +struct map_priv; +struct maptype; +void maptype_register(char *name, struct map_priv *(*map_new)(struct map_methods *meth, char *data, char **charset, enum projection *pro)); +struct maptype *maptype_get(const char *name); + +#endif + diff --git a/navit/menu.c b/navit/menu.c new file mode 100644 index 0000000..92afa6c --- /dev/null +++ b/navit/menu.c @@ -0,0 +1,47 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include "menu.h" +#include "debug.h" + +struct menu * +menu_add(struct menu *menu, char *name, enum menu_type type, struct callback *cb) +{ + struct menu *this; + if (! menu || ! menu->meth.add) + return NULL; + this=g_new0(struct menu, 1); + this->priv=(*menu->meth.add)(menu->priv, &this->meth, name, type, cb); + if (! this->priv) { + g_free(this); + return NULL; + } + + return this; +} + +void +menu_popup(struct menu *menu) +{ + if (! menu || ! menu->meth.popup) + return; + (*menu->meth.popup)(menu->priv); + +} diff --git a/navit/menu.h b/navit/menu.h new file mode 100644 index 0000000..e2dd1c0 --- /dev/null +++ b/navit/menu.h @@ -0,0 +1,49 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_MENU_H +#define NAVIT_MENU_H + +enum menu_type { + menu_type_submenu, + menu_type_menu, + menu_type_toggle, +}; + +struct container; +struct menu; +struct callback; + +struct menu_methods { + struct menu_priv *(*add)(struct menu_priv *menu, struct menu_methods *meth, char *name, enum menu_type type, struct callback *cb); + void (*set_toggle)(struct menu_priv *menu, int active); + int (*get_toggle)(struct menu_priv *menu); + void (*popup)(struct menu_priv *menu); +}; + +struct menu { + struct menu_priv *priv; + struct menu_methods meth; +}; + +/* prototypes */ +struct menu *menu_add(struct menu *menu, char *name, enum menu_type type, struct callback *cb); +void menu_popup(struct menu *menu); +/* end of prototypes */ +#endif diff --git a/navit/messages.c b/navit/messages.c new file mode 100644 index 0000000..b3d9ddc --- /dev/null +++ b/navit/messages.c @@ -0,0 +1,157 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "messages.h" +#include "callback.h" +#include "event.h" +#include "attr.h" + +struct messagelist { + struct message *messages; /**< All the messages that can currently be shown */ + int last_mid; /**< Last Message ID */ + int maxage; /**< Maximum age of messages */ + int maxnum; /**< Maximum number of messages */ + struct callback *msg_cleanup_cb; /**< Callback to clean up the messages */ + struct event_timeout *msg_cleanup_to; /**< Idle event to clean up the messages */ +}; + +int +message_new(struct messagelist *this_, char *message) +{ + struct message *msg; + + msg = g_new0(struct message, 1); + msg->text = g_strdup(message); + msg->id = ++(this_->last_mid); + msg->time = time(NULL); + + msg->next = this_->messages; + this_->messages = msg; + + return msg->id; +} + +int +message_delete(struct messagelist *this_, int mid) +{ + struct message *msg,*last;; + + msg = this_->messages; + last = NULL; + + while (msg) { + if (msg->id == mid) { + break; + } + + last = msg; + msg = msg->next; + } + + if (msg) { + if (last) { + last->next = msg->next; + } else { + this_->messages = msg->next; + } + + g_free(msg->text); + g_free(msg); + + return 1; + } else { + return 0; + } +} + +static void +message_cleanup(struct messagelist *this_) +{ + struct message *msg,*next,*prev=NULL; + int i; + time_t now; + + msg = this_->messages; + + now = time(NULL); + + i = 0; + while (msg && (i < this_->maxnum)) { + if ((this_->maxage > 0) && (now - msg->time) > this_->maxage) { + break; + } + + i++; + prev = msg; + msg = msg->next; + } + + if (prev) { + prev->next = NULL; + } else { + this_->messages = NULL; + } + + while (msg) { + next = msg->next; + + g_free(msg->text); + g_free(msg); + + msg = next; + } +} + +struct messagelist +*messagelist_new(struct attr **attrs) +{ + struct messagelist *this = g_new0(struct messagelist, 1); + struct attr num_attr,age_attr; + + if (attr_generic_get_attr(attrs, NULL, attr_message_maxage, &age_attr, NULL)) { + this->maxage = age_attr.u.num; + } else { + this->maxage = 10; + } + + if (attr_generic_get_attr(attrs, NULL, attr_message_maxnum, &num_attr, NULL)) { + this->maxnum = num_attr.u.num; + } else { + this->maxnum = 3; + } + + return this; +} + +void +messagelist_init(struct messagelist *this_) +{ + if (!event_system()) + return; + this_->msg_cleanup_cb = callback_new_1(callback_cast(message_cleanup), this_); + this_->msg_cleanup_to = event_add_timeout(1000, 1, this_->msg_cleanup_cb); +} + +struct message +*message_get(struct messagelist *this_) +{ + return this_->messages; +} diff --git a/navit/messages.h b/navit/messages.h new file mode 100644 index 0000000..0b6c66c --- /dev/null +++ b/navit/messages.h @@ -0,0 +1,41 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#ifndef NAVIT_MESSAGES_H +#define NAVIT_MESSAGES_H + +struct messagelist; + +struct message { + struct message *next; + int id; + time_t time; + char *text; +}; + +/* Prototypes */ +struct attr; + +int message_new(struct messagelist *this_, char *message); +int message_delete(struct messagelist *this_, int mid); +struct messagelist *messagelist_new(struct attr **attrs); +void messagelist_init(struct messagelist *this_); +struct message *message_get(struct messagelist *this_); + +#endif diff --git a/navit/navigation.c b/navit/navigation.c new file mode 100644 index 0000000..1ce73ea --- /dev/null +++ b/navit/navigation.c @@ -0,0 +1,2372 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include "debug.h" +#include "profile.h" +#include "navigation.h" +#include "coord.h" +#include "item.h" +#include "route.h" +#include "transform.h" +#include "mapset.h" +#include "projection.h" +#include "map.h" +#include "navit.h" +#include "callback.h" +#include "speech.h" +#include "vehicleprofile.h" +#include "plugin.h" +#include "navit_nls.h" + +/* #define DEBUG */ + +static int roundabout_extra_length=50; + + +struct suffix { + char *fullname; + char *abbrev; + int sex; +} suffixes[]= { + {"weg",NULL,1}, + {"platz","pl.",1}, + {"ring",NULL,1}, + {"allee",NULL,2}, + {"gasse",NULL,2}, + {"straße","str.",2}, + {"strasse",NULL,2}, +}; + +struct navigation { + struct route *route; + struct map *map; + struct item_hash *hash; + struct vehicleprofile *vehicleprofile; + struct navigation_itm *first; + struct navigation_itm *last; + struct navigation_command *cmd_first; + struct navigation_command *cmd_last; + struct callback_list *callback_speech; + struct callback_list *callback; + struct navit *navit; + struct speech *speech; + int level_last; + struct item item_last; + int turn_around; + int turn_around_limit; + int distance_turn; + struct callback *route_cb; + int announce[route_item_last-route_item_first+1][3]; + int tell_street_name; + int delay; + int curr_delay; +}; + +int distances[]={1,2,3,4,5,10,25,50,75,100,150,200,250,300,400,500,750,-1}; + + +struct navigation_command { + struct navigation_itm *itm; + struct navigation_command *next; + struct navigation_command *prev; + int delta; + int roundabout_delta; + int length; +}; + +static void navigation_flush(struct navigation *this_); + +/** + * @brief Calculates the delta between two angles + * @param angle1 The first angle + * @param angle2 The second angle + * @return The difference between the angles: -179..-1=angle2 is left of angle1,0=same,1..179=angle2 is right of angle1,180=angle1 is opposite of angle2 + */ + +static int +angle_delta(int angle1, int angle2) +{ + int delta=angle2-angle1; + if (delta <= -180) + delta+=360; + if (delta > 180) + delta-=360; + return delta; +} + +static int +angle_median(int angle1, int angle2) +{ + int delta=angle_delta(angle1, angle2); + int ret=angle1+delta/2; + if (ret < 0) + ret+=360; + if (ret > 360) + ret-=360; + return ret; +} + +static int +angle_opposite(int angle) +{ + return ((angle+180)%360); +} + +int +navigation_get_attr(struct navigation *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + struct map_rect *mr; + struct item *item; + dbg(1,"enter %s\n", attr_to_name(type)); + switch (type) { + case attr_map: + attr->u.map=this_->map; + break; + case attr_item_type: + case attr_length: + case attr_navigation_speech: + mr=map_rect_new(this_->map, NULL); + while ((item=map_rect_get_item(mr))) { + if (item->type != type_nav_none && item->type != type_nav_position) { + if (type == attr_item_type) + attr->u.item_type=item->type; + else { + if (!item_attr_get(item, type, attr)) + item=NULL; + } + break; + } + } + map_rect_destroy(mr); + if (!item) + return 0; + break; + default: + return 0; + } + attr->type=type; + return 1; +} + +int +navigation_set_attr(struct navigation *this_, struct attr *attr) +{ + switch (attr->type) { + case attr_speech: + this_->speech=attr->u.speech; + return 1; + default: + return 0; + } +} + + +struct navigation * +navigation_new(struct attr *parent, struct attr **attrs) +{ + int i,j; + struct attr * attr; + struct navigation *ret=g_new0(struct navigation, 1); + ret->hash=item_hash_new(); + ret->callback=callback_list_new(); + ret->callback_speech=callback_list_new(); + ret->level_last=-2; + ret->distance_turn=50; + ret->turn_around_limit=3; + ret->navit=parent->u.navit; + ret->tell_street_name=1; + + for (j = 0 ; j <= route_item_last-route_item_first ; j++) { + for (i = 0 ; i < 3 ; i++) { + ret->announce[j][i]=-1; + } + } + + if ((attr=attr_search(attrs, NULL, attr_tell_street_name))) { + ret->tell_street_name = attr->u.num; + } + if ((attr=attr_search(attrs, NULL, attr_delay))) { + ret->delay = attr->u.num; + } + + return ret; +} + +int +navigation_set_announce(struct navigation *this_, enum item_type type, int *level) +{ + int i; + if (type < route_item_first || type > route_item_last) { + dbg(0,"street type %d out of range [%d,%d]", type, route_item_first, route_item_last); + return 0; + } + for (i = 0 ; i < 3 ; i++) + this_->announce[type-route_item_first][i]=level[i]; + return 1; +} + +static int +navigation_get_announce_level(struct navigation *this_, enum item_type type, int dist) +{ + int i; + + if (type < route_item_first || type > route_item_last) + return -1; + for (i = 0 ; i < 3 ; i++) { + if (dist <= this_->announce[type-route_item_first][i]) + return i; + } + return i; +} + + +/** + * @brief Holds a way that one could possibly drive from a navigation item + */ +struct navigation_way { + struct navigation_way *next; /**< Pointer to a linked-list of all navigation_ways from this navigation item */ + short dir; /**< The direction -1 or 1 of the way */ + short angle2; /**< The angle one has to steer to drive from the old item to this street */ + int flags; /**< The flags of the way */ + struct item item; /**< The item of the way */ + char *name1; + char *name2; +}; + +struct navigation_itm { + struct navigation_way way; + int angle_end; + struct coord start,end; + int time; + int length; + int speed; + int dest_time; + int dest_length; + int told; /**< Indicates if this item's announcement has been told earlier and should not be told again*/ + int streetname_told; /**< Indicates if this item's streetname has been told in speech navigation*/ + int dest_count; + struct navigation_itm *next; + struct navigation_itm *prev; +}; + +static int is_way_allowed(struct navigation *nav, struct navigation_way *way, int mode); + +static int +navigation_get_announce_level_cmd(struct navigation *this_, struct navigation_itm *itm, struct navigation_command *cmd, int distance) +{ + int level2,level=navigation_get_announce_level(this_, itm->way.item.type, distance); + if (this_->cmd_first->itm->prev) { + level2=navigation_get_announce_level(this_, cmd->itm->prev->way.item.type, distance); + if (level2 > level) + level=level2; + } + return level; +} + +/* 0=N,90=E */ +static int +road_angle(struct coord *c1, struct coord *c2, int dir) +{ + int ret=transform_get_angle_delta(c1, c2, dir); + dbg(1, "road_angle(0x%x,0x%x - 0x%x,0x%x)=%d\n", c1->x, c1->y, c2->x, c2->y, ret); + return ret; +} + +static char +*get_count_str(int n) +{ + switch (n) { + case 0: + /* TRANSLATORS: the following counts refer to streets */ + return _("zeroth"); // Not sure if this exists, neither if it will ever be needed + case 1: + return _("first"); + case 2: + return _("second"); + case 3: + return _("third"); + case 4: + return _("fourth"); + case 5: + return _("fifth"); + case 6: + return _("sixth"); + default: + return NULL; + } +} + +static char +*get_exit_count_str(int n) +{ + switch (n) { + case 0: + /* TRANSLATORS: the following counts refer to roundabout exits */ + return _("zeroth exit"); // Not sure if this exists, neither if it will ever be needed + case 1: + return _("first exit"); + case 2: + return _("second exit"); + case 3: + return _("third exit"); + case 4: + return _("fourth exit"); + case 5: + return _("fifth exit"); + case 6: + return _("sixth exit"); + default: + return NULL; + } +} +static int +round_distance(int dist) +{ + if (dist < 100) { + dist=(dist+5)/10; + return dist*10; + } + if (dist < 250) { + dist=(dist+13)/25; + return dist*25; + } + if (dist < 500) { + dist=(dist+25)/50; + return dist*50; + } + if (dist < 1000) { + dist=(dist+50)/100; + return dist*100; + } + if (dist < 5000) { + dist=(dist+50)/100; + return dist*100; + } + if (dist < 100000) { + dist=(dist+500)/1000; + return dist*1000; + } + dist=(dist+5000)/10000; + return dist*10000; +} + +static int +round_for_vocabulary(int vocabulary, int dist, int factor) +{ + if (!(vocabulary & 256)) { + if (factor != 1) + dist=(dist+factor/2)/factor; + } else + factor=1; + if (!(vocabulary & 255)) { + int i=0,d=0,m=0; + while (distances[i] > 0) { + if (!i || abs(distances[i]-dist) <= d) { + d=abs(distances[i]-dist); + m=i; + } + if (distances[i] > dist) + break; + i++; + } + dbg(0,"converted %d to %d with factor %d\n",dist,distances[m],factor); + dist=distances[m]; + } + return dist*factor; +} + +static int +vocabulary_last(int vocabulary) +{ + int i=0; + if (vocabulary == 65535) + return 1000; + while (distances[i] > 0) + i++; + return distances[i-1]; +} + +static char * +get_distance(struct navigation *nav, int dist, enum attr_type type, int is_length) +{ + int imperial=0,vocabulary=65535; + struct attr attr; + + if (type == attr_navigation_long) { + if (is_length) + return g_strdup_printf(_("%d m"), dist); + else + return g_strdup_printf(_("in %d m"), dist); + } + if (navit_get_attr(nav->navit, attr_imperial, &attr, NULL)) + imperial=attr.u.num; + if (nav->speech && speech_get_attr(nav->speech, attr_vocabulary_distances, &attr, NULL)) + vocabulary=attr.u.num; + if (imperial) { + if (dist*FEET_PER_METER < vocabulary_last(vocabulary)) { + dist=round_for_vocabulary(vocabulary, dist*FEET_PER_METER, 1); + if (is_length) + return g_strdup_printf(_("%d feet"), dist); + else + return g_strdup_printf(_("in %d feet"), dist); + } + } else { + if (dist < vocabulary_last(vocabulary)) { + dist=round_for_vocabulary(vocabulary, dist, 1); + if (is_length) + return g_strdup_printf(_("%d meters"), dist); + else + return g_strdup_printf(_("in %d meters"), dist); + } + } + if (imperial) + dist=round_for_vocabulary(vocabulary, dist*FEET_PER_METER*1000/FEET_PER_MILE, 1000); + else + dist=round_for_vocabulary(vocabulary, dist, 1000); + if (dist < 5000) { + int rem=(dist/100)%10; + if (rem) { + if (imperial) { + if (is_length) + return g_strdup_printf(_("%d.%d miles"), dist/1000, rem); + else + return g_strdup_printf(_("in %d.%d miles"), dist/1000, rem); + } else { + if (is_length) + return g_strdup_printf(_("%d.%d kilometers"), dist/1000, rem); + else + return g_strdup_printf(_("in %d.%d kilometers"), dist/1000, rem); + } + } + } + if (imperial) { + if (is_length) + return g_strdup_printf(ngettext("one mile","%d miles", dist/1000), dist/1000); + else + return g_strdup_printf(ngettext("in one mile","in %d miles", dist/1000), dist/1000); + } else { + if (is_length) + return g_strdup_printf(ngettext("one kilometer","%d kilometers", dist/1000), dist/1000); + else + return g_strdup_printf(ngettext("in one kilometer","in %d kilometers", dist/1000), dist/1000); + } +} + + +/** + * @brief This calculates the angle with which an item starts or ends + * + * This function can be used to get the angle an item (from a route graph map) + * starts or ends with. Note that the angle will point towards the inner of + * the item. + * + * This is meant to be used with items from a route graph map + * With other items this will probably not be optimal... + * + * @param w The way which should be calculated + */ +static void +calculate_angle(struct navigation_way *w) +{ + struct coord cbuf[2]; + struct item *ritem; // the "real" item + struct coord c; + struct map_rect *mr; + struct attr attr; + + w->angle2=361; + mr = map_rect_new(w->item.map, NULL); + if (!mr) + return; + + ritem = map_rect_get_item_byid(mr, w->item.id_hi, w->item.id_lo); + if (!ritem) { + dbg(1,"Item from segment not found on map!\n"); + map_rect_destroy(mr); + return; + } + + if (ritem->type < type_line || ritem->type >= type_area) { + map_rect_destroy(mr); + return; + } + if (item_attr_get(ritem, attr_flags, &attr)) + w->flags=attr.u.num; + else + w->flags=0; + if (item_attr_get(ritem, attr_street_name, &attr)) + w->name1=map_convert_string(ritem->map,attr.u.str); + else + w->name1=NULL; + if (item_attr_get(ritem, attr_street_name_systematic, &attr)) + w->name2=map_convert_string(ritem->map,attr.u.str); + else + w->name2=NULL; + + if (w->dir < 0) { + if (item_coord_get(ritem, cbuf, 2) != 2) { + dbg(1,"Using calculate_angle() with a less-than-two-coords-item?\n"); + map_rect_destroy(mr); + return; + } + + while (item_coord_get(ritem, &c, 1)) { + cbuf[0] = cbuf[1]; + cbuf[1] = c; + } + + } else { + if (item_coord_get(ritem, cbuf, 2) != 2) { + dbg(1,"Using calculate_angle() with a less-than-two-coords-item?\n"); + map_rect_destroy(mr); + return; + } + c = cbuf[0]; + cbuf[0] = cbuf[1]; + cbuf[1] = c; + } + + map_rect_destroy(mr); + + w->angle2=road_angle(&cbuf[1],&cbuf[0],0); +} + +/** + * @brief Returns the time (in seconds) one will drive between two navigation items + * + * This function returns the time needed to drive between two items, including both of them, + * in seconds. + * + * @param from The first item + * @param to The last item + * @return The travel time in seconds, or -1 on error + */ +static int +navigation_time(struct navigation_itm *from, struct navigation_itm *to) +{ + struct navigation_itm *cur; + int time; + + time = 0; + cur = from; + while (cur) { + time += cur->time; + + if (cur == to) { + break; + } + cur = cur->next; + } + + if (!cur) { + return -1; + } + + return time; +} + +/** + * @brief Clears the ways one can drive from itm + * + * @param itm The item that should have its ways cleared + */ +static void +navigation_itm_ways_clear(struct navigation_itm *itm) +{ + struct navigation_way *c,*n; + + c = itm->way.next; + while (c) { + n = c->next; + map_convert_free(c->name1); + map_convert_free(c->name2); + g_free(c); + c = n; + } + + itm->way.next = NULL; +} + +/** + * @brief Updates the ways one can drive from itm + * + * This updates the list of possible ways to drive to from itm. The item "itm" is on + * and the next navigation item are excluded. + * + * @param itm The item that should be updated + * @param graph_map The route graph's map that these items are on + */ +static void +navigation_itm_ways_update(struct navigation_itm *itm, struct map *graph_map) +{ + struct map_selection coord_sel; + struct map_rect *g_rect; // Contains a map rectangle from the route graph's map + struct item *i,*sitem; + struct attr sitem_attr,direction_attr; + struct navigation_way *w,*l; + + navigation_itm_ways_clear(itm); + + // These values cause the code in route.c to get us only the route graph point and connected segments + coord_sel.next = NULL; + coord_sel.u.c_rect.lu = itm->start; + coord_sel.u.c_rect.rl = itm->start; + // the selection's order is ignored + + g_rect = map_rect_new(graph_map, &coord_sel); + + i = map_rect_get_item(g_rect); + if (!i || i->type != type_rg_point) { // probably offroad? + return ; + } + + w = NULL; + + while (1) { + i = map_rect_get_item(g_rect); + + if (!i) { + break; + } + + if (i->type != type_rg_segment) { + continue; + } + + if (!item_attr_get(i,attr_street_item,&sitem_attr)) { + dbg(1, "Got no street item for route graph item in entering_straight()\n"); + continue; + } + + if (!item_attr_get(i,attr_direction,&direction_attr)) { + continue; + } + + sitem = sitem_attr.u.item; + if (sitem->type == type_street_turn_restriction_no || sitem->type == type_street_turn_restriction_only) + continue; + + if (item_is_equal(itm->way.item,*sitem) || ((itm->prev) && item_is_equal(itm->prev->way.item,*sitem))) { + continue; + } + + l = w; + w = g_new(struct navigation_way, 1); + w->dir = direction_attr.u.num; + w->item = *sitem; + w->next = l; + calculate_angle(w); + } + + map_rect_destroy(g_rect); + + itm->way.next = w; +} + +static void +navigation_destroy_itms_cmds(struct navigation *this_, struct navigation_itm *end) +{ + struct navigation_itm *itm; + struct navigation_command *cmd; + dbg(2,"enter this_=%p this_->first=%p this_->cmd_first=%p end=%p\n", this_, this_->first, this_->cmd_first, end); + if (this_->cmd_first) + dbg(2,"this_->cmd_first->itm=%p\n", this_->cmd_first->itm); + while (this_->first && this_->first != end) { + itm=this_->first; + dbg(3,"destroying %p\n", itm); + item_hash_remove(this_->hash, &itm->way.item); + this_->first=itm->next; + if (this_->first) + this_->first->prev=NULL; + if (this_->cmd_first && this_->cmd_first->itm == itm->next) { + cmd=this_->cmd_first; + this_->cmd_first=cmd->next; + if (cmd->next) { + cmd->next->prev = NULL; + } + g_free(cmd); + } + map_convert_free(itm->way.name1); + map_convert_free(itm->way.name2); + navigation_itm_ways_clear(itm); + g_free(itm); + } + if (! this_->first) + this_->last=NULL; + if (! this_->first && end) + dbg(0,"end wrong\n"); + dbg(2,"ret this_->first=%p this_->cmd_first=%p\n",this_->first, this_->cmd_first); +} + +static void +navigation_itm_update(struct navigation_itm *itm, struct item *ritem) +{ + struct attr length, time, speed; + + if (! item_attr_get(ritem, attr_length, &length)) { + dbg(0,"no length\n"); + return; + } + if (! item_attr_get(ritem, attr_time, &time)) { + dbg(0,"no time\n"); + return; + } + if (! item_attr_get(ritem, attr_speed, &speed)) { + dbg(0,"no time\n"); + return; + } + + dbg(1,"length=%d time=%d speed=%d\n", length.u.num, time.u.num, speed.u.num); + itm->length=length.u.num; + itm->time=time.u.num; + itm->speed=speed.u.num; +} + +/** + * @brief This check if an item is part of a roundabout + * + * @param itm The item to be checked + * @return True if the item is part of a roundabout + */ +static int +check_roundabout(struct navigation_itm *itm, struct map *graph_map) +{ + struct map_selection coord_sel; + struct map_rect *g_rect; // Contains a map rectangle from the route graph's map + struct item *i,*sitem; + struct attr sitem_attr,flags_attr; + + // These values cause the code in route.c to get us only the route graph point and connected segments + coord_sel.next = NULL; + coord_sel.u.c_rect.lu = itm->start; + coord_sel.u.c_rect.rl = itm->start; + // the selection's order is ignored + + g_rect = map_rect_new(graph_map, &coord_sel); + + i = map_rect_get_item(g_rect); + if (!i || i->type != type_rg_point) { // probably offroad? + map_rect_destroy(g_rect); + return 0; + } + + while (1) { + i = map_rect_get_item(g_rect); + + if (!i) { + break; + } + + if (i->type != type_rg_segment) { + continue; + } + + if (!item_attr_get(i,attr_street_item,&sitem_attr)) { + continue; + } + + sitem = sitem_attr.u.item; + if (item_is_equal(itm->way.item,*sitem)) { + if (item_attr_get(i,attr_flags,&flags_attr) && (flags_attr.u.num & AF_ROUNDABOUT)) { + map_rect_destroy(g_rect); + return 1; + } + } + } + + map_rect_destroy(g_rect); + return 0; +} + +static struct navigation_itm * +navigation_itm_new(struct navigation *this_, struct item *ritem) +{ + struct navigation_itm *ret=g_new0(struct navigation_itm, 1); + int i=0; + struct item *sitem; + struct map *graph_map = NULL; + struct attr street_item,direction,route_attr; + struct map_rect *mr; + struct attr attr; + struct coord c[5]; + + if (ritem) { + ret->streetname_told=0; + if (! item_attr_get(ritem, attr_street_item, &street_item)) { + dbg(1, "no street item\n"); + g_free(ret); + ret = NULL; + return ret; + } + if (item_attr_get(ritem, attr_direction, &direction)) + ret->way.dir=direction.u.num; + else + ret->way.dir=0; + + sitem=street_item.u.item; + ret->way.item=*sitem; + item_hash_insert(this_->hash, sitem, ret); + mr=map_rect_new(sitem->map, NULL); + if (! (sitem=map_rect_get_item_byid(mr, sitem->id_hi, sitem->id_lo))) + return NULL; + if (item_attr_get(sitem, attr_street_name, &attr)) + ret->way.name1=map_convert_string(sitem->map,attr.u.str); + if (item_attr_get(sitem, attr_street_name_systematic, &attr)) + ret->way.name2=map_convert_string(sitem->map,attr.u.str); + navigation_itm_update(ret, ritem); + + while (item_coord_get(ritem, &c[i], 1)) { + dbg(1, "coord %d 0x%x 0x%x\n", i, c[i].x ,c[i].y); + + if (i < 4) + i++; + else { + c[2]=c[3]; + c[3]=c[4]; + } + } + dbg(1,"count=%d\n", i); + i--; + + ret->way.angle2=road_angle(&c[0], &c[1], 0); + ret->angle_end=road_angle(&c[i-1], &c[i], 0); + + ret->start=c[0]; + ret->end=c[i]; + + item_attr_get(ritem, attr_route, &route_attr); + graph_map = route_get_graph_map(route_attr.u.route); + if (check_roundabout(ret, graph_map)) { + ret->way.flags |= AF_ROUNDABOUT; + } + + dbg(1,"i=%d start %d end %d '%s' '%s'\n", i, ret->way.angle2, ret->angle_end, ret->way.name1, ret->way.name2); + map_rect_destroy(mr); + } else { + if (this_->last) + ret->start=ret->end=this_->last->end; + } + if (! this_->first) + this_->first=ret; + if (this_->last) { + this_->last->next=ret; + ret->prev=this_->last; + if (graph_map) { + navigation_itm_ways_update(ret,graph_map); + } + } + dbg(1,"ret=%p\n", ret); + this_->last=ret; + return ret; +} + +/** + * @brief Counts how many times a driver could turn right/left + * + * This function counts how many times the driver theoretically could + * turn right/left between two navigation items, not counting the final + * turn itself. + * + * @param from The navigation item which should form the start + * @param to The navigation item which should form the end + * @param direction Set to < 0 to count turns to the left >= 0 for turns to the right + * @return The number of possibilities to turn or -1 on error + */ +static int +count_possible_turns(struct navigation *nav, struct navigation_itm *from, struct navigation_itm *to, int direction) +{ + int count; + struct navigation_itm *curr; + struct navigation_way *w; + + count = 0; + curr = from->next; + while (curr && (curr != to)) { + w = curr->way.next; + + while (w) { + if (is_way_allowed(nav, w, 4)) { + if (direction < 0) { + if (angle_delta(curr->prev->angle_end, w->angle2) < 0) { + count++; + break; + } + } else { + if (angle_delta(curr->prev->angle_end, w->angle2) > 0) { + count++; + break; + } + } + } + w = w->next; + } + curr = curr->next; + } + + if (!curr) { // from does not lead to to? + return -1; + } + + return count; +} + +/** + * @brief Calculates distance and time to the destination + * + * This function calculates the distance and the time to the destination of a + * navigation. If incr is set, this is only calculated for the first navigation + * item, which is a lot faster than re-calculation the whole destination, but works + * only if the rest of the navigation already has been calculated. + * + * @param this_ The navigation whose destination / time should be calculated + * @param incr Set this to true to only calculate the first item. See description. + */ +static void +calculate_dest_distance(struct navigation *this_, int incr) +{ + int len=0, time=0, count=0; + struct navigation_itm *next,*itm=this_->last; + dbg(1, "enter this_=%p, incr=%d\n", this_, incr); + if (incr) { + if (itm) { + dbg(2, "old values: (%p) time=%d lenght=%d\n", itm, itm->dest_length, itm->dest_time); + } else { + dbg(2, "old values: itm is null\n"); + } + itm=this_->first; + next=itm->next; + dbg(2, "itm values: time=%d lenght=%d\n", itm->length, itm->time); + dbg(2, "next values: (%p) time=%d lenght=%d\n", next, next->dest_length, next->dest_time); + itm->dest_length=next->dest_length+itm->length; + itm->dest_count=next->dest_count+1; + itm->dest_time=next->dest_time+itm->time; + dbg(2, "new values: time=%d lenght=%d\n", itm->dest_length, itm->dest_time); + return; + } + while (itm) { + len+=itm->length; + time+=itm->time; + itm->dest_length=len; + itm->dest_time=time; + itm->dest_count=count++; + itm=itm->prev; + } + dbg(1,"len %d time %d\n", len, time); +} + +/** + * @brief Checks if two navigation items are on the same street + * + * This function checks if two navigation items are on the same street. It returns + * true if either their name or their "systematic name" (e.g. "A6" or "B256") are the + * same. + * + * @param old The first item to be checked + * @param new The second item to be checked + * @return True if both old and new are on the same street + */ +static int +is_same_street2(char *old_name1, char *old_name2, char *new_name1, char *new_name2) +{ + if (old_name1 && new_name1 && !strcmp(old_name1, new_name1)) { + dbg(1,"is_same_street: '%s' '%s' vs '%s' '%s' yes (1.)\n", old_name2, new_name2, old_name1, new_name1); + return 1; + } + if (old_name2 && new_name2 && !strcmp(old_name2, new_name2)) { + dbg(1,"is_same_street: '%s' '%s' vs '%s' '%s' yes (2.)\n", old_name2, new_name2, old_name1, new_name1); + return 1; + } + dbg(1,"is_same_street: '%s' '%s' vs '%s' '%s' no\n", old_name2, new_name2, old_name1, new_name1); + return 0; +} + +#if 0 +/** + * @brief Checks if two navigation items are on the same street + * + * This function checks if two navigation items are on the same street. It returns + * true if the first part of their "systematic name" is equal. If the "systematic name" is + * for example "A352/E3" (a german highway which at the same time is part of the international + * E-road network), it would only search for "A352" in the second item's systematic name. + * + * @param old The first item to be checked + * @param new The second item to be checked + * @return True if the "systematic name" of both items matches. See description. + */ +static int +is_same_street_systematic(struct navigation_itm *old, struct navigation_itm *new) +{ + int slashold,slashnew; + if (!old->name2 || !new->name2) + return 1; + slashold=strcspn(old->name2, "/"); + slashnew=strcspn(new->name2, "/"); + if (slashold != slashnew || strncmp(old->name2, new->name2, slashold)) + return 0; + return 1; +} + + +/** + * @brief Check if there are multiple possibilities to drive from old + * + * This function checks, if there are multiple streets connected to the exit of "old". + * Sometimes it happens that an item on a map is just segmented, without any other streets + * being connected there, and it is not useful if navit creates a maneuver there. + * + * @param new The navigation item we're driving to + * @return True if there are multiple streets + */ +static int +maneuver_multiple_streets(struct navigation_itm *new) +{ + if (new->way.next) { + return 1; + } else { + return 0; + } +} + + +/** + * @brief Check if the new item is entered "straight" + * + * This function checks if the new item is entered "straight" from the old item, i.e. if there + * is no other street one could take from the old item on with less steering. + * + * @param new The navigation item we're driving to + * @param diff The absolute angle one needs to steer to drive to this item + * @return True if the new item is entered "straight" + */ +static int +maneuver_straight(struct navigation_itm *new, int diff) +{ + int curr_diff; + struct navigation_way *w; + + w = new->way.next; + dbg(1,"diff=%d\n", diff); + while (w) { + curr_diff=abs(angle_delta(new->prev->angle_end, w->angle2)); + dbg(1,"curr_diff=%d\n", curr_diff); + if (curr_diff < diff) { + return 0; + } + w = w->next; + } + return 1; +} +#endif + +static int maneuver_category(enum item_type type) +{ + switch (type) { + case type_street_0: + return 1; + case type_street_1_city: + return 2; + case type_street_2_city: + return 3; + case type_street_3_city: + return 4; + case type_street_4_city: + return 5; + case type_highway_city: + return 7; + case type_street_1_land: + return 2; + case type_street_2_land: + return 3; + case type_street_3_land: + return 4; + case type_street_4_land: + return 5; + case type_street_n_lanes: + return 6; + case type_highway_land: + return 7; + case type_ramp: + return 0; + case type_roundabout: + return 0; + case type_ferry: + return 0; + default: + return 0; + } + + +} + +static int +is_way_allowed(struct navigation *nav, struct navigation_way *way, int mode) +{ + if (!nav->vehicleprofile) + return 1; + return !way->flags || ((way->flags & (way->dir >= 0 ? nav->vehicleprofile->flags_forward_mask : nav->vehicleprofile->flags_reverse_mask)) == nav->vehicleprofile->flags); +} + +/** + * @brief Checks if navit has to create a maneuver to drive from old to new + * + * This function checks if it has to create a "maneuver" - i.e. guide the user - to drive + * from "old" to "new". + * + * @param old The old navigation item, where we're coming from + * @param new The new navigation item, where we're going to + * @param delta The angle the user has to steer to navigate from old to new + * @param reason A text string explaining how the return value resulted + * @return True if navit should guide the user, false otherwise + */ +static int +maneuver_required2(struct navigation *nav, struct navigation_itm *old, struct navigation_itm *new, int *delta, char **reason) +{ + int ret=0,d,dw,dlim; + char *r=NULL; + struct navigation_way *w; + int cat,ncat,wcat,maxcat,left=-180,right=180,is_unambigous=0,is_same_street; + + dbg(1,"enter %p %p %p\n",old, new, delta); + d=angle_delta(old->angle_end, new->way.angle2); + if (!new->way.next) { + /* No announcement necessary */ + r="no: Only one possibility"; + } else if (!new->way.next->next && new->way.next->item.type == type_ramp && !is_way_allowed(nav,new->way.next,1)) { + /* If the other way is only a ramp and it is one-way in the wrong direction, no announcement necessary */ + r="no: Only ramp"; + } + if (! r) { + if ((old->way.flags & AF_ROUNDABOUT) && ! (new->way.flags & AF_ROUNDABOUT)) { + r="yes: leaving roundabout"; + ret=1; + } else if (!(old->way.flags & AF_ROUNDABOUT) && (new->way.flags & AF_ROUNDABOUT)) { + r="no: entering roundabout"; + } else if ((old->way.flags & AF_ROUNDABOUT) && (new->way.flags & AF_ROUNDABOUT)) + r="no: staying in roundabout"; + } + if (!r && abs(d) > 75) { + /* always make an announcement if you have to make a sharp turn */ + r="yes: delta over 75"; + ret=1; + } + cat=maneuver_category(old->way.item.type); + ncat=maneuver_category(new->way.item.type); + if (!r) { + /* Check whether the street keeps its name */ + is_same_street=is_same_street2(old->way.name1, old->way.name2, new->way.name1, new->way.name2); + w = new->way.next; + maxcat=-1; + while (w) { + dw=angle_delta(old->angle_end, w->angle2); + if (dw < 0) { + if (dw > left) + left=dw; + } else { + if (dw < right) + right=dw; + } + wcat=maneuver_category(w->item.type); + /* If any other street has the same name but isn't a highway (a highway might split up temporarily), then + we can't use the same name criterium */ + if (is_same_street && is_same_street2(old->way.name1, old->way.name2, w->name1, w->name2) && (cat != 7 || wcat != 7) && is_way_allowed(nav,w,2)) + is_same_street=0; + /* Even if the ramp has the same name, announce it */ + if (new->way.item.type == type_ramp && old->way.item.type != type_ramp) + is_same_street=0; + /* Mark if the street has a higher or the same category */ + if (wcat > maxcat) + maxcat=wcat; + w = w->next; + } + /* get the delta limit for checking for other streets. It is lower if the street has no other + streets of the same or higher category */ + if (ncat < cat) + dlim=80; + else + dlim=120; + /* if the street is really straight, the others might be closer to straight */ + if (abs(d) < 20) + dlim/=2; + if ((maxcat == ncat && maxcat == cat) || (ncat == 0 && cat == 0)) + dlim=abs(d)*620/256; + else if (maxcat < ncat && maxcat < cat) + dlim=abs(d)*128/256; + if (left < -dlim && right > dlim) + is_unambigous=1; + if (!is_same_street && is_unambigous < 1) { + ret=1; + r="yes: not same street or ambigous"; + } else + r="no: same street and unambigous"; +#ifdef DEBUG + r=g_strdup_printf("yes: d %d left %d right %d dlim=%d cat old:%d new:%d max:%d unambigous=%d same_street=%d", d, left, right, dlim, cat, ncat, maxcat, is_unambigous, is_same_street); +#endif + } + *delta=d; + if (reason) + *reason=r; + return ret; + + +#if 0 + if (new->item.type == old->item.type || (new->item.type != type_ramp && old->item.type != type_ramp)) { + if (is_same_street2(old, new)) { + if (! entering_straight(new, abs(*delta))) { + dbg(1, "maneuver_required: Not driving straight: yes\n"); + if (reason) + *reason="yes: Not driving straight"; + return 1; + } + + if (check_multiple_streets(new)) { + if (entering_straight(new,abs(*delta)*2)) { + if (reason) + *reason="no: delta < ext_limit for same name"; + return 0; + } + if (reason) + *reason="yes: delta > ext_limit for same name"; + return 1; + } else { + dbg(1, "maneuver_required: Staying on the same street: no\n"); + if (reason) + *reason="no: Staying on same street"; + return 0; + } + } + } else + dbg(1, "maneuver_required: old or new is ramp\n"); +#if 0 + if (old->item.type == type_ramp && (new->item.type == type_highway_city || new->item.type == type_highway_land)) { + dbg(1, "no_maneuver_required: old is ramp new is highway\n"); + if (reason) + *reason="no: old is ramp new is highway"; + return 0; + } +#endif +#if 0 + if (old->crossings_end == 2) { + dbg(1, "maneuver_required: only 2 connections: no\n"); + return 0; + } +#endif + dbg(1,"delta=%d-%d=%d\n", new->way.angle2, old->angle_end, *delta); + if ((new->item.type == type_highway_land || new->item.type == type_highway_city || old->item.type == type_highway_land || old->item.type == type_highway_city) && (!is_same_street_systematic(old, new) || (old->name2 != NULL && new->name2 == NULL))) { + dbg(1, "maneuver_required: highway changed name\n"); + if (reason) + *reason="yes: highway changed name"; + return 1; + } + if (abs(*delta) < straight_limit) { + if (! entering_straight(new,abs(*delta))) { + if (reason) + *reason="yes: not straight"; + dbg(1, "maneuver_required: not driving straight: yes\n"); + return 1; + } + + dbg(1, "maneuver_required: delta(%d) < %d: no\n", *delta, straight_limit); + if (reason) + *reason="no: delta < limit"; + return 0; + } + if (abs(*delta) < ext_straight_limit) { + if (entering_straight(new,abs(*delta)*2)) { + if (reason) + *reason="no: delta < ext_limit"; + return 0; + } + } + + if (! check_multiple_streets(new)) { + dbg(1, "maneuver_required: only one possibility: no\n"); + if (reason) + *reason="no: only one possibility"; + return 0; + } + + dbg(1, "maneuver_required: delta=%d: yes\n", *delta); + if (reason) + *reason="yes: delta >= limit"; + return 1; +#endif +} + +static struct navigation_command * +command_new(struct navigation *this_, struct navigation_itm *itm, int delta) +{ + struct navigation_command *ret=g_new0(struct navigation_command, 1); + dbg(1,"enter this_=%p itm=%p delta=%d\n", this_, itm, delta); + ret->delta=delta; + ret->itm=itm; + if (itm && itm->prev && itm->way.next && itm->prev->way.next && !(itm->way.flags & AF_ROUNDABOUT) && (itm->prev->way.flags & AF_ROUNDABOUT)) { + int len=0; + int angle=0; + int entry_angle; + struct navigation_itm *itm2=itm->prev; + int exit_angle=angle_median(itm->prev->angle_end, itm->way.next->angle2); + dbg(1,"exit %d median from %d,%d\n", exit_angle,itm->prev->angle_end, itm->way.next->angle2); + while (itm2 && (itm2->way.flags & AF_ROUNDABOUT)) { + len+=itm2->length; + angle=itm2->angle_end; + itm2=itm2->prev; + } + if (itm2 && itm2->next && itm2->next->way.next) { + itm2=itm2->next; + entry_angle=angle_median(angle_opposite(itm2->way.angle2), itm2->way.next->angle2); + dbg(1,"entry %d median from %d(%d),%d\n", entry_angle,angle_opposite(itm2->way.angle2), itm2->way.angle2, itm2->way.next->angle2); + } else { + entry_angle=angle_opposite(angle); + } + dbg(0,"entry %d exit %d\n", entry_angle, exit_angle); + ret->roundabout_delta=angle_delta(entry_angle, exit_angle); + ret->length=len+roundabout_extra_length; + } + if (this_->cmd_last) { + this_->cmd_last->next=ret; + ret->prev = this_->cmd_last; + } + this_->cmd_last=ret; + + if (!this_->cmd_first) + this_->cmd_first=ret; + return ret; +} + +static void +make_maneuvers(struct navigation *this_, struct route *route) +{ + struct navigation_itm *itm, *last=NULL, *last_itm=NULL; + int delta; + itm=this_->first; + this_->cmd_last=NULL; + this_->cmd_first=NULL; + while (itm) { + if (last) { + if (maneuver_required2(this_, last_itm, itm,&delta,NULL)) { + command_new(this_, itm, delta); + } + } else + last=itm; + last_itm=itm; + itm=itm->next; + } + command_new(this_, last_itm, 0); +} + +static int +contains_suffix(char *name, char *suffix) +{ + if (!suffix) + return 0; + if (strlen(name) < strlen(suffix)) + return 0; + return !g_strcasecmp(name+strlen(name)-strlen(suffix), suffix); +} + +static char * +replace_suffix(char *name, char *search, char *replace) +{ + int len=strlen(name)-strlen(search); + char *ret=g_malloc(len+strlen(replace)+1); + strncpy(ret, name, len); + strcpy(ret+len, replace); + if (isupper(name[len])) { + ret[len]=toupper(ret[len]); + } + + return ret; +} + +static char * +navigation_item_destination(struct navigation *nav, struct navigation_itm *itm, struct navigation_itm *next, char *prefix) +{ + char *ret=NULL,*name1,*sep,*name2; + char *n1,*n2; + int i,sex; + int vocabulary1=65535; + int vocabulary2=65535; + struct attr attr; + + if (! prefix) + prefix=""; + if (nav->speech && speech_get_attr(nav->speech, attr_vocabulary_name, &attr, NULL)) + vocabulary1=attr.u.num; + if (nav->speech && speech_get_attr(nav->speech, attr_vocabulary_name_systematic, &attr, NULL)) + vocabulary2=attr.u.num; + n1=itm->way.name1; + n2=itm->way.name2; + if (!vocabulary1) + n1=NULL; + if (!vocabulary2) + n2=NULL; + if(!n1 && !n2 && itm->way.item.type == type_ramp && vocabulary2) { + dbg(1,">> Next is ramp %lx current is %lx \n", itm->way.item.type, next->way.item.type); + + if(next->way.item.type == type_ramp) + return NULL; + if(itm->way.item.type == type_highway_city || itm->way.item.type == type_highway_land ) + return g_strdup_printf("%s%s",prefix,_("exit")); /* %FIXME Can this even be reached? */ + else + return g_strdup_printf("%s%s",prefix,_("into the ramp")); + + } + if (!n1 && !n2) + return NULL; + if (n1) { + sex=-1; + name1=NULL; + for (i = 0 ; i < sizeof(suffixes)/sizeof(suffixes[0]) ; i++) { + if (contains_suffix(n1,suffixes[i].fullname)) { + sex=suffixes[i].sex; + name1=g_strdup(n1); + break; + } + if (contains_suffix(n1,suffixes[i].abbrev)) { + sex=suffixes[i].sex; + name1=replace_suffix(n1, suffixes[i].abbrev, suffixes[i].fullname); + break; + } + } + if (n2) { + name2=n2; + sep=" "; + } else { + name2=""; + sep=""; + } + switch (sex) { + case -1: + /* TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name */ + ret=g_strdup_printf(_("%sinto the street %s%s%s"),prefix,n1, sep, name2); + break; + case 1: + /* TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included */ + ret=g_strdup_printf(_("%sinto the %s%s%s|male form"),prefix,name1, sep, name2); + break; + case 2: + /* TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included */ + ret=g_strdup_printf(_("%sinto the %s%s%s|female form"),prefix,name1, sep, name2); + break; + case 3: + /* TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included */ + ret=g_strdup_printf(_("%sinto the %s%s%s|neutral form"),prefix,name1, sep, name2); + break; + } + g_free(name1); + + } else + /* TRANSLATORS: gives the name of the next road to turn into (into the E17) */ + ret=g_strdup_printf(_("%sinto the %s"),prefix,n2); + name1=ret; + while (name1 && *name1) { + switch (*name1) { + case '|': + *name1='\0'; + break; + case '/': + *name1++=' '; + break; + default: + name1++; + } + } + return ret; +} + +static char * +show_maneuver(struct navigation *nav, struct navigation_itm *itm, struct navigation_command *cmd, enum attr_type type, int connect) +{ + /* TRANSLATORS: right, as in 'Turn right' */ + char *dir=_("right"),*strength=""; + int distance=itm->dest_length-cmd->itm->dest_length; + char *d,*ret=NULL; + int delta=cmd->delta; + int level; + int strength_needed; + int skip_roads; + int count_roundabout; + struct navigation_itm *cur; + struct navigation_way *w; + + if (connect) { + level = -2; // level = -2 means "connect to another maneuver via 'then ...'" + } else { + level=1; + } + + w = itm->next->way.next; + strength_needed = 0; + if (angle_delta(itm->next->way.angle2,itm->angle_end) < 0) { + while (w) { + if (angle_delta(w->angle2,itm->angle_end) < 0) { + strength_needed = 1; + break; + } + w = w->next; + } + } else { + while (w) { + if (angle_delta(w->angle2,itm->angle_end) > 0) { + strength_needed = 1; + break; + } + w = w->next; + } + } + + if (delta < 0) { + /* TRANSLATORS: left, as in 'Turn left' */ + dir=_("left"); + delta=-delta; + } + + if (strength_needed) { + if (delta < 45) { + /* TRANSLATORS: Don't forget the ending space */ + strength=_("easily "); + } else if (delta < 105) { + strength=""; + } else if (delta < 165) { + /* TRANSLATORS: Don't forget the ending space */ + strength=_("strongly "); + } else if (delta < 180) { + /* TRANSLATORS: Don't forget the ending space */ + strength=_("really strongly "); + } else { + dbg(1,"delta=%d\n", delta); + /* TRANSLATORS: Don't forget the ending space */ + strength=_("unknown "); + } + } + if (type != attr_navigation_long_exact) + distance=round_distance(distance); + if (type == attr_navigation_speech) { + if (nav->turn_around && nav->turn_around == nav->turn_around_limit) + return g_strdup(_("When possible, please turn around")); + if (!connect) { + level=navigation_get_announce_level_cmd(nav, itm, cmd, distance-cmd->length); + } + dbg(1,"distance=%d level=%d type=0x%x\n", distance, level, itm->way.item.type); + } + + if (cmd->itm->prev->way.flags & AF_ROUNDABOUT) { + cur = cmd->itm->prev; + count_roundabout = 0; + while (cur && (cur->way.flags & AF_ROUNDABOUT)) { + if (cur->next->way.next && is_way_allowed(nav,cur->next->way.next,3)) { // If the next segment has no exit or the exit isn't allowed, don't count it + count_roundabout++; + } + cur = cur->prev; + } + switch (level) { + case 2: + return g_strdup(_("Enter the roundabout soon")); + case 1: + d = get_distance(nav, distance, type, 0); + /* TRANSLATORS: %s is the distance to the roundabout */ + ret = g_strdup_printf(_("Enter the roundabout %s"), d); + g_free(d); + return ret; + case -2: + return g_strdup_printf(_("then leave the roundabout at the %s"), get_exit_count_str(count_roundabout)); + case 0: + return g_strdup_printf(_("Leave the roundabout at the %s"), get_exit_count_str(count_roundabout)); + } + } + + switch(level) { + case 3: + d=get_distance(nav, distance, type, 1); + ret=g_strdup_printf(_("Follow the road for the next %s"), d); + g_free(d); + return ret; + case 2: + d=g_strdup(_("soon")); + break; + case 1: + d=get_distance(nav, distance, attr_navigation_short, 0); + break; + case 0: + skip_roads = count_possible_turns(nav,cmd->prev?cmd->prev->itm:nav->first,cmd->itm,cmd->delta); + if (skip_roads > 0) { + if (get_count_str(skip_roads+1)) { + /* TRANSLATORS: First argument is the how manieth street to take, second the direction */ + ret = g_strdup_printf(_("Take the %1$s road to the %2$s"), get_count_str(skip_roads+1), dir); + return ret; + } else { + d = g_strdup_printf(_("after %i roads"), skip_roads); + } + } else { + d=g_strdup(_("now")); + } + break; + case -2: + skip_roads = count_possible_turns(nav,cmd->prev->itm,cmd->itm,cmd->delta); + if (skip_roads > 0) { + /* TRANSLATORS: First argument is the how manieth street to take, second the direction */ + if (get_count_str(skip_roads+1)) { + ret = g_strdup_printf(_("then take the %1$s road to the %2$s"), get_count_str(skip_roads+1), dir); + return ret; + } else { + d = g_strdup_printf(_("after %i roads"), skip_roads); + } + + } else { + d = g_strdup(""); + } + break; + default: + d=g_strdup(_("error")); + } + if (cmd->itm->next) { + int tellstreetname = 0; + char *destination = NULL; + + if(type == attr_navigation_speech) { // In voice mode + // In Voice Mode only tell the street name in level 1 or in level 0 if level 1 + // was skipped + + if (level == 1) { // we are close to the intersection + cmd->itm->streetname_told = 1; // remeber to be checked when we turn + tellstreetname = 1; // Ok so we tell the name of the street + } + + if (level == 0) { + if(cmd->itm->streetname_told == 0) // we are right at the intersection + tellstreetname = 1; + else + cmd->itm->streetname_told = 0; // reset just in case we come to the same street again + } + + } + else + tellstreetname = 1; + + if(nav->tell_street_name && tellstreetname) + destination=navigation_item_destination(nav, cmd->itm, itm, " "); + + if (level != -2) { + /* TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' */ + ret=g_strdup_printf(_("Turn %1$s%2$s %3$s%4$s"), strength, dir, d, destination ? destination:""); + } else { + /* TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination */ + ret=g_strdup_printf(_("then turn %1$s%2$s %3$s%4$s"), strength, dir, d, destination ? destination:""); + } + g_free(destination); + } else { + if (!connect) { + ret=g_strdup_printf(_("You have reached your destination %s"), d); + } else { + ret=g_strdup_printf(_("then you have reached your destination.")); + } + } + g_free(d); + return ret; +} + +/** + * @brief Creates announcements for maneuvers, plus maneuvers immediately following the next maneuver + * + * This function does create an announcement for the current maneuver and for maneuvers + * immediately following that maneuver, if these are too close and we're in speech navigation. + * + * @return An announcement that should be made + */ +static char * +show_next_maneuvers(struct navigation *nav, struct navigation_itm *itm, struct navigation_command *cmd, enum attr_type type) +{ + struct navigation_command *cur,*prev; + int distance=itm->dest_length-cmd->itm->dest_length; + int level, dist, i, time; + int speech_time,time2nav; + char *ret,*old,*buf,*next; + + if (type != attr_navigation_speech) { + return show_maneuver(nav, itm, cmd, type, 0); // We accumulate maneuvers only in speech navigation + } + + level=navigation_get_announce_level(nav, itm->way.item.type, distance-cmd->length); + + if (level > 1) { + return show_maneuver(nav, itm, cmd, type, 0); // We accumulate maneuvers only if they are close + } + + if (cmd->itm->told) { + return g_strdup(""); + } + + ret = show_maneuver(nav, itm, cmd, type, 0); + time2nav = navigation_time(itm,cmd->itm->prev); + old = NULL; + + cur = cmd->next; + prev = cmd; + i = 0; + while (cur && cur->itm) { + // We don't merge more than 3 announcements... + if (i > 1) { // if you change this, please also change the value below, that is used to terminate the loop + break; + } + + next = show_maneuver(nav,prev->itm, cur, type, 0); + if (nav->speech) + speech_time = speech_estimate_duration(nav->speech,next); + else + speech_time = -1; + g_free(next); + + if (speech_time == -1) { // user didn't set cps + speech_time = 30; // assume 3 seconds + } + + dist = prev->itm->dest_length - cur->itm->dest_length; + time = navigation_time(prev->itm,cur->itm->prev); + + if (time >= (speech_time + 30)) { // 3 seconds for understanding what has been said + break; + } + + old = ret; + buf = show_maneuver(nav, prev->itm, cur, type, 1); + ret = g_strdup_printf("%s, %s", old, buf); + g_free(buf); + if (nav->speech && speech_estimate_duration(nav->speech,ret) > time2nav) { + g_free(ret); + ret = old; + i = 2; // This will terminate the loop + } else { + g_free(old); + } + + // If the two maneuvers are *really* close, we shouldn't tell the second one again, because TTS won't be fast enough + if (time <= speech_time) { + cur->itm->told = 1; + } + + prev = cur; + cur = cur->next; + i++; + } + + return ret; +} + +static void +navigation_call_callbacks(struct navigation *this_, int force_speech) +{ + int distance, level = 0; + void *p=this_; + if (!this_->cmd_first) + return; + callback_list_call(this_->callback, 1, &p); + dbg(1,"force_speech=%d turn_around=%d turn_around_limit=%d\n", force_speech, this_->turn_around, this_->turn_around_limit); + distance=round_distance(this_->first->dest_length-this_->cmd_first->itm->dest_length); + if (this_->turn_around_limit && this_->turn_around == this_->turn_around_limit) { + dbg(1,"distance=%d distance_turn=%d\n", distance, this_->distance_turn); + while (distance > this_->distance_turn) { + this_->level_last=4; + level=4; + force_speech=2; + if (this_->distance_turn >= 500) + this_->distance_turn*=2; + else + this_->distance_turn=500; + } + } else if (!this_->turn_around_limit || this_->turn_around == -this_->turn_around_limit+1) { + this_->distance_turn=50; + distance-=this_->cmd_first->length; + level=navigation_get_announce_level_cmd(this_, this_->first, this_->cmd_first, distance); + if (level < this_->level_last) { + /* only tell if the level is valid for more than 3 seconds */ + int speed_distance=this_->first->speed*30/36; + if (distance < speed_distance || navigation_get_announce_level_cmd(this_, this_->first, this_->cmd_first, distance-speed_distance) == level) { + dbg(1,"distance %d speed_distance %d\n",distance,speed_distance); + dbg(1,"level %d < %d\n", level, this_->level_last); + this_->level_last=level; + force_speech=3; + } + } + if (!item_is_equal(this_->cmd_first->itm->way.item, this_->item_last)) { + this_->item_last=this_->cmd_first->itm->way.item; + if (this_->delay) + this_->curr_delay=this_->delay; + else + force_speech=5; + } else { + if (this_->curr_delay) { + this_->curr_delay--; + if (!this_->curr_delay) + force_speech=4; + } + } + } + if (force_speech) { + this_->level_last=level; + this_->curr_delay=0; + dbg(1,"force_speech=%d distance=%d level=%d type=0x%x\n", force_speech, distance, level, this_->first->way.item.type); + callback_list_call(this_->callback_speech, 1, &p); + } +} + +static void +navigation_update(struct navigation *this_, struct route *route, struct attr *attr) +{ + struct map *map; + struct map_rect *mr; + struct item *ritem; /* Holds an item from the route map */ + struct item *sitem; /* Holds the corresponding item from the actual map */ + struct attr street_item,street_direction; + struct navigation_itm *itm; + struct attr vehicleprofile; + int mode=0, incr=0, first=1; + if (attr->type != attr_route_status) + return; + + dbg(1,"enter %d\n", mode); + if (attr->u.num == route_status_no_destination || attr->u.num == route_status_not_found || attr->u.num == route_status_path_done_new) + navigation_flush(this_); + if (attr->u.num != route_status_path_done_new && attr->u.num != route_status_path_done_incremental) + return; + + if (! this_->route) + return; + map=route_get_map(this_->route); + if (! map) + return; + mr=map_rect_new(map, NULL); + if (! mr) + return; + if (route_get_attr(route, attr_vehicleprofile, &vehicleprofile, NULL)) + this_->vehicleprofile=vehicleprofile.u.vehicleprofile; + else + this_->vehicleprofile=NULL; + dbg(1,"enter\n"); + while ((ritem=map_rect_get_item(mr))) { + if (ritem->type == type_route_start && this_->turn_around > -this_->turn_around_limit+1) + this_->turn_around--; + if (ritem->type == type_route_start_reverse && this_->turn_around < this_->turn_around_limit) + this_->turn_around++; + if (ritem->type != type_street_route) + continue; + if (first && item_attr_get(ritem, attr_street_item, &street_item)) { + first=0; + if (!item_attr_get(ritem, attr_direction, &street_direction)) + street_direction.u.num=0; + sitem=street_item.u.item; + dbg(1,"sitem=%p\n", sitem); + itm=item_hash_lookup(this_->hash, sitem); + dbg(2,"itm for item with id (0x%x,0x%x) is %p\n", sitem->id_hi, sitem->id_lo, itm); + if (itm && itm->way.dir != street_direction.u.num) { + dbg(2,"wrong direction\n"); + itm=NULL; + } + navigation_destroy_itms_cmds(this_, itm); + if (itm) { + navigation_itm_update(itm, ritem); + break; + } + dbg(1,"not on track\n"); + } + navigation_itm_new(this_, ritem); + } + dbg(2,"turn_around=%d\n", this_->turn_around); + if (first) + navigation_destroy_itms_cmds(this_, NULL); + else { + if (! ritem) { + navigation_itm_new(this_, NULL); + make_maneuvers(this_,this_->route); + } + calculate_dest_distance(this_, incr); + profile(0,"end"); + navigation_call_callbacks(this_, FALSE); + } + map_rect_destroy(mr); +} + +static void +navigation_flush(struct navigation *this_) +{ + navigation_destroy_itms_cmds(this_, NULL); +} + + +void +navigation_destroy(struct navigation *this_) +{ + navigation_flush(this_); + item_hash_destroy(this_->hash); + callback_list_destroy(this_->callback); + callback_list_destroy(this_->callback_speech); + g_free(this_); +} + +int +navigation_register_callback(struct navigation *this_, enum attr_type type, struct callback *cb) +{ + if (type == attr_navigation_speech) + callback_list_add(this_->callback_speech, cb); + else + callback_list_add(this_->callback, cb); + return 1; +} + +void +navigation_unregister_callback(struct navigation *this_, enum attr_type type, struct callback *cb) +{ + if (type == attr_navigation_speech) + callback_list_remove(this_->callback_speech, cb); + else + callback_list_remove(this_->callback, cb); +} + +struct map * +navigation_get_map(struct navigation *this_) +{ + struct attr *attrs[5]; + struct attr type,navigation,data,description; + type.type=attr_type; + type.u.str="navigation"; + navigation.type=attr_navigation; + navigation.u.navigation=this_; + data.type=attr_data; + data.u.str=""; + description.type=attr_description; + description.u.str="Navigation"; + + attrs[0]=&type; + attrs[1]=&navigation; + attrs[2]=&data; + attrs[3]=&description; + attrs[4]=NULL; + if (! this_->map) + this_->map=map_new(NULL, attrs); + return this_->map; +} + +struct map_priv { + struct navigation *navigation; +}; + +struct map_rect_priv { + struct navigation *nav; + struct navigation_command *cmd; + struct navigation_command *cmd_next; + struct navigation_itm *itm; + struct navigation_itm *itm_next; + struct navigation_itm *cmd_itm; + struct navigation_itm *cmd_itm_next; + struct item item; + enum attr_type attr_next; + int ccount; + int debug_idx; + struct navigation_way *ways; + int show_all; + char *str; +}; + +static int +navigation_map_item_coord_get(void *priv_data, struct coord *c, int count) +{ + struct map_rect_priv *this=priv_data; + if (this->ccount || ! count) + return 0; + *c=this->itm->start; + this->ccount=1; + return 1; +} + +static int +navigation_map_item_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + struct map_rect_priv *this_=priv_data; + struct navigation_command *cmd=this_->cmd; + struct navigation_itm *itm=this_->itm; + struct navigation_itm *prev=itm->prev; + attr->type=attr_type; + + if (this_->str) { + g_free(this_->str); + this_->str=NULL; + } + + if (cmd) { + if (cmd->itm != itm) + cmd=NULL; + } + switch(attr_type) { + case attr_level: + if (cmd) { + int distance=this_->cmd_itm->dest_length-cmd->itm->dest_length; + distance=round_distance(distance); + attr->u.num=navigation_get_announce_level(this_->nav, this_->cmd_itm->way.item.type, distance-cmd->length); + return 1; + } + return 0; + case attr_navigation_short: + this_->attr_next=attr_navigation_long; + if (cmd) { + this_->str=attr->u.str=show_next_maneuvers(this_->nav, this_->cmd_itm, cmd, attr_type); + return 1; + } + return 0; + case attr_navigation_long: + this_->attr_next=attr_navigation_long_exact; + if (cmd) { + this_->str=attr->u.str=show_next_maneuvers(this_->nav, this_->cmd_itm, cmd, attr_type); + return 1; + } + return 0; + case attr_navigation_long_exact: + this_->attr_next=attr_navigation_speech; + if (cmd) { + this_->str=attr->u.str=show_next_maneuvers(this_->nav, this_->cmd_itm, cmd, attr_type); + return 1; + } + return 0; + case attr_navigation_speech: + this_->attr_next=attr_length; + if (cmd) { + this_->str=attr->u.str=show_next_maneuvers(this_->nav, this_->cmd_itm, this_->cmd, attr_type); + return 1; + } + return 0; + case attr_length: + this_->attr_next=attr_time; + if (cmd) { + attr->u.num=this_->cmd_itm->dest_length-cmd->itm->dest_length; + return 1; + } + return 0; + case attr_time: + this_->attr_next=attr_destination_length; + if (cmd) { + attr->u.num=this_->cmd_itm->dest_time-cmd->itm->dest_time; + return 1; + } + return 0; + case attr_destination_length: + attr->u.num=itm->dest_length; + this_->attr_next=attr_destination_time; + return 1; + case attr_destination_time: + attr->u.num=itm->dest_time; + this_->attr_next=attr_street_name; + return 1; + case attr_street_name: + attr->u.str=itm->way.name1; + this_->attr_next=attr_street_name_systematic; + if (attr->u.str) + return 1; + return 0; + case attr_street_name_systematic: + attr->u.str=itm->way.name2; + this_->attr_next=attr_debug; + if (attr->u.str) + return 1; + return 0; + case attr_debug: + switch(this_->debug_idx) { + case 0: + this_->debug_idx++; + this_->str=attr->u.str=g_strdup_printf("angle:%d (- %d)", itm->way.angle2, itm->angle_end); + return 1; + case 1: + this_->debug_idx++; + this_->str=attr->u.str=g_strdup_printf("item type:%s", item_to_name(itm->way.item.type)); + return 1; + case 2: + this_->debug_idx++; + if (cmd) { + this_->str=attr->u.str=g_strdup_printf("delta:%d", cmd->delta); + return 1; + } + case 3: + this_->debug_idx++; + if (prev) { + this_->str=attr->u.str=g_strdup_printf("prev street_name:%s", prev->way.name1); + return 1; + } + case 4: + this_->debug_idx++; + if (prev) { + this_->str=attr->u.str=g_strdup_printf("prev street_name_systematic:%s", prev->way.name2); + return 1; + } + case 5: + this_->debug_idx++; + if (prev) { + this_->str=attr->u.str=g_strdup_printf("prev angle:(%d -) %d", prev->way.angle2, prev->angle_end); + return 1; + } + case 6: + this_->debug_idx++; + this_->ways=itm->way.next; + if (prev) { + this_->str=attr->u.str=g_strdup_printf("prev item type:%s", item_to_name(prev->way.item.type)); + return 1; + } + case 7: + if (this_->ways && prev) { + this_->str=attr->u.str=g_strdup_printf("other item angle:%d delta:%d flags:%d dir:%d type:%s id:(0x%x,0x%x)", this_->ways->angle2, angle_delta(prev->angle_end, this_->ways->angle2), this_->ways->flags, this_->ways->dir, item_to_name(this_->ways->item.type), this_->ways->item.id_hi, this_->ways->item.id_lo); + this_->ways=this_->ways->next; + return 1; + } + this_->debug_idx++; + case 8: + this_->debug_idx++; + if (prev) { + int delta=0; + char *reason=NULL; + maneuver_required2(this_->nav, prev, itm, &delta, &reason); + this_->str=attr->u.str=g_strdup_printf("reason:%s",reason); + return 1; + } + + default: + this_->attr_next=attr_none; + return 0; + } + case attr_any: + while (this_->attr_next != attr_none) { + if (navigation_map_item_attr_get(priv_data, this_->attr_next, attr)) + return 1; + } + return 0; + default: + attr->type=attr_none; + return 0; + } +} + +static struct item_methods navigation_map_item_methods = { + NULL, + navigation_map_item_coord_get, + NULL, + navigation_map_item_attr_get, +}; + + +static void +navigation_map_destroy(struct map_priv *priv) +{ + g_free(priv); +} + +static void +navigation_map_rect_init(struct map_rect_priv *priv) +{ + priv->cmd_next=priv->nav->cmd_first; + priv->cmd_itm_next=priv->itm_next=priv->nav->first; +} + +static struct map_rect_priv * +navigation_map_rect_new(struct map_priv *priv, struct map_selection *sel) +{ + struct navigation *nav=priv->navigation; + struct map_rect_priv *ret=g_new0(struct map_rect_priv, 1); + ret->nav=nav; + navigation_map_rect_init(ret); + ret->item.meth=&navigation_map_item_methods; + ret->item.priv_data=ret; +#ifdef DEBUG + ret->show_all=1; +#endif + return ret; +} + +static void +navigation_map_rect_destroy(struct map_rect_priv *priv) +{ + g_free(priv); +} + +static struct item * +navigation_map_get_item(struct map_rect_priv *priv) +{ + struct item *ret=&priv->item; + int delta; + if (!priv->itm_next) + return NULL; + priv->itm=priv->itm_next; + priv->cmd=priv->cmd_next; + priv->cmd_itm=priv->cmd_itm_next; + if (!priv->cmd) + return NULL; + if (!priv->show_all && priv->itm->prev != NULL) + priv->itm=priv->cmd->itm; + priv->itm_next=priv->itm->next; + if (priv->itm->prev) + ret->type=type_nav_none; + else + ret->type=type_nav_position; + if (priv->cmd->itm == priv->itm) { + priv->cmd_itm_next=priv->cmd->itm; + priv->cmd_next=priv->cmd->next; + if (priv->cmd_itm_next && !priv->cmd_itm_next->next) + ret->type=type_nav_destination; + else { + if (priv->itm && priv->itm->prev && !(priv->itm->way.flags & AF_ROUNDABOUT) && (priv->itm->prev->way.flags & AF_ROUNDABOUT)) { + enum item_type r=type_none,l=type_none; + switch (((180+22)-priv->cmd->roundabout_delta)/45) { + case 0: + case 1: + r=type_nav_roundabout_r1; + l=type_nav_roundabout_l7; + break; + case 2: + r=type_nav_roundabout_r2; + l=type_nav_roundabout_l6; + break; + case 3: + r=type_nav_roundabout_r3; + l=type_nav_roundabout_l5; + break; + case 4: + r=type_nav_roundabout_r4; + l=type_nav_roundabout_l4; + break; + case 5: + r=type_nav_roundabout_r5; + l=type_nav_roundabout_l3; + break; + case 6: + r=type_nav_roundabout_r6; + l=type_nav_roundabout_l2; + break; + case 7: + r=type_nav_roundabout_r7; + l=type_nav_roundabout_l1; + break; + case 8: + r=type_nav_roundabout_r8; + l=type_nav_roundabout_l8; + break; + } + dbg(1,"delta %d\n",priv->cmd->delta); + if (priv->cmd->delta < 0) + ret->type=l; + else + ret->type=r; + } else { + delta=priv->cmd->delta; + if (delta < 0) { + delta=-delta; + if (delta < 45) + ret->type=type_nav_left_1; + else if (delta < 105) + ret->type=type_nav_left_2; + else if (delta < 165) + ret->type=type_nav_left_3; + else + ret->type=type_none; + } else { + if (delta < 45) + ret->type=type_nav_right_1; + else if (delta < 105) + ret->type=type_nav_right_2; + else if (delta < 165) + ret->type=type_nav_right_3; + else + ret->type=type_none; + } + } + } + } + priv->ccount=0; + priv->debug_idx=0; + priv->attr_next=attr_navigation_short; + + ret->id_lo=priv->itm->dest_count; + dbg(1,"type=%d\n", ret->type); + return ret; +} + +static struct item * +navigation_map_get_item_byid(struct map_rect_priv *priv, int id_hi, int id_lo) +{ + struct item *ret; + navigation_map_rect_init(priv); + while ((ret=navigation_map_get_item(priv))) { + if (ret->id_hi == id_hi && ret->id_lo == id_lo) + return ret; + } + return NULL; +} + +static struct map_methods navigation_map_meth = { + projection_mg, + "utf-8", + navigation_map_destroy, + navigation_map_rect_new, + navigation_map_rect_destroy, + navigation_map_get_item, + navigation_map_get_item_byid, + NULL, + NULL, + NULL, +}; + +static struct map_priv * +navigation_map_new(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) +{ + struct map_priv *ret; + struct attr *navigation_attr; + + navigation_attr=attr_search(attrs, NULL, attr_navigation); + if (! navigation_attr) + return NULL; + ret=g_new0(struct map_priv, 1); + *meth=navigation_map_meth; + ret->navigation=navigation_attr->u.navigation; + + return ret; +} + +void +navigation_set_route(struct navigation *this_, struct route *route) +{ + struct attr callback; + if (!this_->route_cb) + this_->route_cb=callback_new_attr_1(callback_cast(navigation_update), attr_route_status, this_); + callback.type=attr_callback; + callback.u.callback=this_->route_cb; + if (this_->route) + route_remove_attr(this_->route, &callback); + this_->route=route; + if (this_->route) { + struct attr route_status; + route_add_attr(this_->route, &callback); + if (route_get_attr(this_->route, attr_route_status, &route_status, NULL)) + navigation_update(this_, this_->route, &route_status); + } +} + +void +navigation_init(void) +{ + plugin_register_map_type("navigation", navigation_map_new); +} diff --git a/navit/navigation.h b/navit/navigation.h new file mode 100644 index 0000000..528678e --- /dev/null +++ b/navit/navigation.h @@ -0,0 +1,53 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_NAVIGATION_H +#define NAVIT_NAVIGATION_H + +#define FEET_PER_METER 3.2808399 +#define FEET_PER_MILE 5280 + +#ifdef __cplusplus +extern "C" { +#endif +/* prototypes */ +enum attr_type; +enum item_type; +struct attr; +struct attr_iter; +struct callback; +struct map; +struct navigation; +struct route; +int navigation_get_attr(struct navigation *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); +int navigation_set_attr(struct navigation *this_, struct attr *attr); +struct navigation *navigation_new(struct attr *parent, struct attr **attrs); +int navigation_set_announce(struct navigation *this_, enum item_type type, int *level); +void navigation_destroy(struct navigation *this_); +int navigation_register_callback(struct navigation *this_, enum attr_type type, struct callback *cb); +void navigation_unregister_callback(struct navigation *this_, enum attr_type type, struct callback *cb); +struct map *navigation_get_map(struct navigation *this_); +void navigation_set_route(struct navigation *this_, struct route *route); +void navigation_init(void); +/* end of prototypes */ +#ifdef __cplusplus +} +#endif + +#endif diff --git a/navit/navit.c b/navit/navit.c new file mode 100644 index 0000000..1bff73e --- /dev/null +++ b/navit/navit.c @@ -0,0 +1,3271 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2009 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#define _USE_MATH_DEFINES 1 +#include "config.h" +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "debug.h" +#include "navit.h" +#include "callback.h" +#include "gui.h" +#include "item.h" +#include "projection.h" +#include "map.h" +#include "mapset.h" +#include "main.h" +#include "coord.h" +#include "point.h" +#include "transform.h" +#include "param.h" +#include "menu.h" +#include "graphics.h" +#include "popup.h" +#include "data_window.h" +#include "route.h" +#include "navigation.h" +#include "speech.h" +#include "track.h" +#include "vehicle.h" +#include "layout.h" +#include "log.h" +#include "attr.h" +#include "event.h" +#include "file.h" +#include "profile.h" +#include "command.h" +#include "navit_nls.h" +#include "map.h" +#include "util.h" +#include "messages.h" +#include "vehicleprofile.h" +#include "sunriset.h" +#include "bookmarks.h" +#include "xmlconfig.h" +#ifdef HAVE_API_WIN32_BASE +#include +#include "util.h" +#endif +#ifdef HAVE_API_WIN32_CE +#include "libc.h" +#endif + +/*FIXME: don't include pvt textfile map includes here */ +#include "map/textfile/textfile.h" + +/** + * @defgroup navit the navit core instance. navit is the object containing nearly everything: A set of maps, one or more vehicle, a graphics object for rendering the map, a gui object for displaying the user interface, a route object, a navigation object and so on. Be warned that it is theoretically possible to have more than one navit object + * @{ + */ + +//! The navit_vehicule +struct navit_vehicle { + int follow; + /*! Limit of the follow counter. See navit_add_vehicle */ + int follow_curr; + /*! Deprecated : follow counter itself. When it reaches 'update' counts, map is recentered*/ + struct coord coord; + int dir; + int speed; + struct coord last; /*< Position of the last update of this vehicle */ + struct vehicle *vehicle; + struct attr callback; + int animate_cursor; +}; + +struct navit { + struct object_func *func; + int refcount; + struct attr *attrs; + struct attr self; + GList *mapsets; + GList *layouts; + struct gui *gui; + struct layout *layout_current; + struct graphics *gra; + struct action *action; + struct transformation *trans, *trans_cursor; + struct compass *compass; + struct route *route; + struct navigation *navigation; + struct speech *speech; + struct tracking *tracking; + int ready; + struct window *win; + struct displaylist *displaylist; + int tracking_flag; + int orientation; + int recentdest_count; + int osd_configuration; + GList *vehicles; + GList *windows_items; + struct navit_vehicle *vehicle; + struct callback_list *attr_cbl; + struct callback *nav_speech_cb, *roadbook_callback, *popup_callback, *route_cb, *progress_cb; + struct datawindow *roadbook_window; + struct map *former_destination; + struct point pressed, last, current; + int button_pressed,moved,popped,zoomed; + int center_timeout; + int autozoom_secs; + int autozoom_min; + int autozoom_active; + struct event_timeout *button_timeout, *motion_timeout; + struct callback *motion_timeout_callback; + int ignore_button; + int ignore_graphics_events; + struct log *textfile_debug_log; + struct pcoord destination; + int destination_valid; + int blocked; + int w,h; + int drag_bitmap; + int use_mousewheel; + struct messagelist *messages; + struct callback *resize_callback,*button_callback,*motion_callback,*predraw_callback; + struct vehicleprofile *vehicleprofile; + GList *vehicleprofiles; + int pitch; + int follow_cursor; + int prevTs; + int graphics_flags; + int zoom_min, zoom_max; + int radius; + struct bookmarks *bookmarks; + int flags; + /* 1=No graphics ok */ + /* 2=No gui ok */ + int border; + int imperial; + struct attr **attr_list; +}; + +struct gui *main_loop_gui; + +struct attr_iter { + void *iter; + union { + GList *list; + struct mapset_handle *mapset_handle; + } u; +}; + +static void navit_vehicle_update(struct navit *this_, struct navit_vehicle *nv); +static void navit_vehicle_draw(struct navit *this_, struct navit_vehicle *nv, struct point *pnt); +static int navit_add_vehicle(struct navit *this_, struct vehicle *v); +static int navit_set_attr_do(struct navit *this_, struct attr *attr, int init); +static int navit_get_cursor_pnt(struct navit *this_, struct point *p, int keep_orientation, int *dir); +static void navit_set_cursors(struct navit *this_); +static void navit_cmd_zoom_to_route(struct navit *this); +static void navit_cmd_set_center_cursor(struct navit *this_); +static void navit_cmd_announcer_toggle(struct navit *this_); +static void navit_set_vehicle(struct navit *this_, struct navit_vehicle *nv); +struct object_func navit_func; + +struct navit *global_navit; + +void +navit_add_mapset(struct navit *this_, struct mapset *ms) +{ + this_->mapsets = g_list_append(this_->mapsets, ms); +} + +struct mapset * +navit_get_mapset(struct navit *this_) +{ + if(this_->mapsets){ + return this_->mapsets->data; + } else { + dbg(0,"No mapsets enabled! Is it on purpose? Navit can't draw a map. Please check your navit.xml\n"); + } + return NULL; +} + +struct tracking * +navit_get_tracking(struct navit *this_) +{ + return this_->tracking; +} + +/** + * @brief Get the user data directory. + * @param[in] create - create the directory if it does not exist + * + * @return char * to the data directory string. + * + * returns the directory used to store user data files (center.txt, + * destination.txt, bookmark.txt, ...) + * + */ +char* +navit_get_user_data_directory(int create) { + char *dir; + dir = getenv("NAVIT_USER_DATADIR"); + if (create && !file_exists(dir)) { + dbg(0,"creating dir %s\n", dir); + if (file_mkdir(dir,0)) { + dbg(0,"failed creating dir %s\n", dir); + return NULL; + } + } + return dir; +} /* end: navit_get_user_data_directory(gboolean create) */ + + +void +navit_draw_async(struct navit *this_, int async) +{ + + if (this_->blocked) { + this_->blocked |= 2; + return; + } + transform_setup_source_rect(this_->trans); + graphics_draw(this_->gra, this_->displaylist, this_->mapsets->data, this_->trans, this_->layout_current, async, NULL, this_->graphics_flags|1); +} + +void +navit_draw(struct navit *this_) +{ + if (this_->ready == 3) + navit_draw_async(this_, 0); +} + +int +navit_get_ready(struct navit *this_) +{ + return this_->ready; +} + + + +void +navit_draw_displaylist(struct navit *this_) +{ + if (this_->ready == 3) + graphics_displaylist_draw(this_->gra, this_->displaylist, this_->trans, this_->layout_current, this_->graphics_flags|1); +} + +static void +navit_map_progress(struct navit *this_) +{ + struct map *map; + struct mapset *ms; + struct mapset_handle *msh; + struct attr attr; + struct point p; + if (this_->ready != 3) + return; + p.x=10; + p.y=32; + + ms=this_->mapsets->data; + msh=mapset_open(ms); + while (msh && (map=mapset_next(msh, 0))) { + if (map_get_attr(map, attr_progress, &attr, NULL)) { + char *str=g_strdup_printf("%s ",attr.u.str); + graphics_draw_mode(this_->gra, draw_mode_begin); + graphics_draw_text_std(this_->gra, 16, str, &p); + g_free(str); + p.y+=32; + graphics_draw_mode(this_->gra, draw_mode_end); + } + } + mapset_close(msh); +} + +static void +navit_redraw_route(struct navit *this_, struct route *route, struct attr *attr) +{ + int updated; + if (attr->type != attr_route_status) + return; + updated=attr->u.num; + if (this_->ready != 3) + return; + if (updated != route_status_path_done_new) + return; + if (this_->vehicle) { + if (this_->vehicle->follow_curr == 1) + return; + if (this_->vehicle->follow_curr <= this_->vehicle->follow) + this_->vehicle->follow_curr=this_->vehicle->follow; + } + navit_draw(this_); +} + +void +navit_handle_resize(struct navit *this_, int w, int h) +{ + struct map_selection sel; + int callback=(this_->ready == 1); + this_->ready |= 2; + memset(&sel, 0, sizeof(sel)); + this_->w=w; + this_->h=h; + sel.u.p_rect.rl.x=w; + sel.u.p_rect.rl.y=h; + transform_set_screen_selection(this_->trans, &sel); + graphics_init(this_->gra); + graphics_set_rect(this_->gra, &sel.u.p_rect); + if (callback) + callback_list_call_attr_1(this_->attr_cbl, attr_graphics_ready, this_); + if (this_->ready == 3) + navit_draw_async(this_, 1); +} + +static void +navit_resize(void *data, int w, int h) +{ + struct navit *this=data; + if (!this->ignore_graphics_events) + navit_handle_resize(this, w, h); +} + +int +navit_get_width(struct navit *this_) +{ + return this_->w; +} + + +int +navit_get_height(struct navit *this_) +{ + return this_->h; +} + +static void +navit_popup(void *data) +{ + struct navit *this_=data; + popup(this_, 1, &this_->pressed); + this_->button_timeout=NULL; + this_->popped=1; +} + + +int +navit_ignore_button(struct navit *this_) +{ + if (this_->ignore_button) + return 1; + this_->ignore_button=1; + return 0; +} + +void +navit_ignore_graphics_events(struct navit *this_, int ignore) +{ + this_->ignore_graphics_events=ignore; +} + +static void +update_transformation(struct transformation *tr, struct point *old, struct point *new, struct point *rot) +{ + struct coord co,cn; + struct coord c,*cp; + int yaw; + double angleo,anglen; + + if (!transform_reverse(tr, old, &co)) + return; + if (rot) { + angleo=atan2(old->y-rot->y, old->x-rot->x)*180/M_PI; + anglen=atan2(new->y-rot->y, new->x-rot->x)*180/M_PI; + yaw=transform_get_yaw(tr)+angleo-anglen; + transform_set_yaw(tr, yaw % 360); + } + if (!transform_reverse(tr, new, &cn)) + return; + cp=transform_get_center(tr); + c.x=cp->x+co.x-cn.x; + c.y=cp->y+co.y-cn.y; + dbg(1,"from 0x%x,0x%x to 0x%x,0x%x\n", cp->x, cp->y, c.x, c.y); + transform_set_center(tr, &c); +} + +void +navit_set_timeout(struct navit *this_) +{ + struct attr follow; + follow.type=attr_follow; + follow.u.num=this_->center_timeout; + navit_set_attr(this_, &follow); +} + +int +navit_handle_button(struct navit *this_, int pressed, int button, struct point *p, struct callback *popup_callback) +{ + int border=16; + + dbg(1,"enter %d %d (ignore %d)\n",pressed,button,this_->ignore_button); + callback_list_call_attr_4(this_->attr_cbl, attr_button, this_, GINT_TO_POINTER(pressed), GINT_TO_POINTER(button), p); + if (this_->ignore_button) { + this_->ignore_button=0; + return 0; + } + if (pressed) { + this_->pressed=*p; + this_->last=*p; + this_->zoomed=0; + if (button == 1) { + this_->button_pressed=1; + this_->moved=0; + this_->popped=0; + if (popup_callback) + this_->button_timeout=event_add_timeout(500, 0, popup_callback); + } + if (button == 2) + navit_set_center_screen(this_, p, 1); + if (button == 3) + popup(this_, button, p); + if (button == 4 && this_->use_mousewheel) { + this_->zoomed = 1; + navit_zoom_in(this_, 2, p); + } + if (button == 5 && this_->use_mousewheel) { + this_->zoomed = 1; + navit_zoom_out(this_, 2, p); + } + } else { + + this_->button_pressed=0; + if (this_->button_timeout) { + event_remove_timeout(this_->button_timeout); + this_->button_timeout=NULL; + if (! this_->moved && ! transform_within_border(this_->trans, p, border)) { + navit_set_center_screen(this_, p, !this_->zoomed); + } + } + if (this_->motion_timeout) { + event_remove_timeout(this_->motion_timeout); + this_->motion_timeout=NULL; + } + if (this_->moved) { + struct point pr; + pr.x=this_->w/2; + pr.y=this_->h; +#if 0 + update_transformation(this_->trans, &this_->pressed, p, &pr); +#else + update_transformation(this_->trans, &this_->pressed, p, NULL); +#endif + graphics_draw_drag(this_->gra, NULL); + transform_copy(this_->trans, this_->trans_cursor); + graphics_overlay_disable(this_->gra, 0); + if (!this_->zoomed) + navit_set_timeout(this_); + navit_draw(this_); + } else + return 1; + } + return 0; +} + +static void +navit_button(void *data, int pressed, int button, struct point *p) +{ + struct navit *this=data; + dbg(1,"enter %d %d ignore %d\n",pressed,button,this->ignore_graphics_events); + if (!this->ignore_graphics_events) { + if (! this->popup_callback) + this->popup_callback=callback_new_1(callback_cast(navit_popup), this); + navit_handle_button(this, pressed, button, p, this->popup_callback); + } +} + + +static void +navit_motion_timeout(struct navit *this_) +{ + int dx, dy; + + if (this_->drag_bitmap) { + struct point point; + point.x=(this_->current.x-this_->pressed.x); + point.y=(this_->current.y-this_->pressed.y); + if (graphics_draw_drag(this_->gra, &point)) { + graphics_overlay_disable(this_->gra, 1); + graphics_draw_mode(this_->gra, draw_mode_end); + this_->moved=1; + this_->motion_timeout=NULL; + return; + } + } + dx=(this_->current.x-this_->last.x); + dy=(this_->current.y-this_->last.y); + if (dx || dy) { + struct transformation *tr; + struct point pr; + this_->last=this_->current; + graphics_overlay_disable(this_->gra, 1); + tr=transform_dup(this_->trans); + pr.x=this_->w/2; + pr.y=this_->h; +#if 0 + update_transformation(tr, &this_->pressed, &this_->current, &pr); +#else + update_transformation(tr, &this_->pressed, &this_->current, NULL); +#endif +#if 0 + graphics_displaylist_move(this_->displaylist, dx, dy); +#endif + graphics_draw_cancel(this_->gra, this_->displaylist); + graphics_displaylist_draw(this_->gra, this_->displaylist, tr, this_->layout_current, this_->graphics_flags); + transform_destroy(tr); + this_->moved=1; + } + this_->motion_timeout=NULL; + return; +} + +void +navit_handle_motion(struct navit *this_, struct point *p) +{ + int dx, dy; + + if (this_->button_pressed && !this_->popped) { + dx=(p->x-this_->pressed.x); + dy=(p->y-this_->pressed.y); + if (dx < -8 || dx > 8 || dy < -8 || dy > 8) { + this_->moved=1; + if (this_->button_timeout) { + event_remove_timeout(this_->button_timeout); + this_->button_timeout=NULL; + } + this_->current=*p; + if (! this_->motion_timeout_callback) + this_->motion_timeout_callback=callback_new_1(callback_cast(navit_motion_timeout), this_); + if (! this_->motion_timeout) + this_->motion_timeout=event_add_timeout(100, 0, this_->motion_timeout_callback); + } + } +} + +static void +navit_motion(void *data, struct point *p) +{ + struct navit *this=data; + if (!this->ignore_graphics_events) + navit_handle_motion(this, p); +} + +static void +navit_predraw(struct navit *this_) +{ + GList *l; + struct navit_vehicle *nv; + transform_copy(this_->trans, this_->trans_cursor); + l=this_->vehicles; + while (l) { + nv=l->data; + navit_vehicle_draw(this_, nv, NULL); + l=g_list_next(l); + } +} + +static void +navit_scale(struct navit *this_, long scale, struct point *p, int draw) +{ + struct coord c1, c2, *center; + if (scale < this_->zoom_min) + scale=this_->zoom_min; + if (scale > this_->zoom_max) + scale=this_->zoom_max; + if (p) + transform_reverse(this_->trans, p, &c1); + transform_set_scale(this_->trans, scale); + if (p) { + transform_reverse(this_->trans, p, &c2); + center = transform_center(this_->trans); + center->x += c1.x - c2.x; + center->y += c1.y - c2.y; + } + if (draw) + navit_draw(this_); +} + +/** + * @brief Automatically adjusts zoom level + * + * This function automatically adjusts the current + * zoom level according to the current speed. + * + * @param this_ The navit struct + * @param center The "immovable" point - i.e. the vehicles position if we're centering on the vehicle + * @param speed The vehicles speed in meters per second + * @param dir The direction into which the vehicle moves + */ +static void +navit_autozoom(struct navit *this_, struct coord *center, int speed, int draw) +{ + struct point pc; + int distance,w,h; + double new_scale; + long scale; + + if (! this_->autozoom_active) { + return; + } + + distance = speed * this_->autozoom_secs; + + transform_get_size(this_->trans, &w, &h); + transform(this_->trans, transform_get_projection(this_->trans), center, &pc, 1, 0, 0, NULL); + scale = transform_get_scale(this_->trans); + + /* We make sure that the point we want to see is within a certain range + * around the vehicle. The radius of this circle is the size of the + * screen. This doesn't necessarily mean the point is visible because of + * perspective etc. Quite rough, but should be enough. */ + + if (w > h) { + new_scale = (double)distance / h * 16; + } else { + new_scale = (double)distance / w * 16; + } + + if (abs(new_scale - scale) < 2) { + return; // Smoothing + } + + if (new_scale >= this_->autozoom_min) { + navit_scale(this_, (long)new_scale, &pc, 0); + } else { + if (scale != this_->autozoom_min) { + navit_scale(this_, this_->autozoom_min, &pc, 0); + } + } +} + +/** + * Change the current zoom level, zooming closer to the ground + * + * @param navit The navit instance + * @param factor The zoom factor, usually 2 + * @param p The invariant point (if set to NULL, default to center) + * @returns nothing + */ +void +navit_zoom_in(struct navit *this_, int factor, struct point *p) +{ + long scale=transform_get_scale(this_->trans)/factor; + if (scale < 1) + scale=1; + navit_scale(this_, scale, p, 1); +} + +/** + * Change the current zoom level + * + * @param navit The navit instance + * @param factor The zoom factor, usually 2 + * @param p The invariant point (if set to NULL, default to center) + * @returns nothing + */ +void +navit_zoom_out(struct navit *this_, int factor, struct point *p) +{ + long scale=transform_get_scale(this_->trans)*factor; + navit_scale(this_, scale, p, 1); +} + +void +navit_zoom_in_cursor(struct navit *this_, int factor) +{ + struct point p; + if (this_->vehicle && this_->vehicle->follow_curr <= 1 && navit_get_cursor_pnt(this_, &p, 0, NULL)) { + navit_zoom_in(this_, factor, &p); + this_->vehicle->follow_curr=this_->vehicle->follow; + } else + navit_zoom_in(this_, factor, NULL); +} + +void +navit_zoom_out_cursor(struct navit *this_, int factor) +{ + struct point p; + if (this_->vehicle && this_->vehicle->follow_curr <= 1 && navit_get_cursor_pnt(this_, &p, 0, NULL)) { + navit_zoom_out(this_, 2, &p); + this_->vehicle->follow_curr=this_->vehicle->follow; + } else + navit_zoom_out(this_, 2, NULL); +} + +static int +navit_cmd_zoom_in(struct navit *this_) +{ + navit_zoom_in_cursor(this_, 2); + return 0; +} + +static int +navit_cmd_zoom_out(struct navit *this_) +{ + navit_zoom_out_cursor(this_, 2); + return 0; +} + + +static void +navit_cmd_say(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + if (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) + navit_say(this, in[0]->u.str); +} + +static GHashTable *cmd_int_var_hash = NULL; +static GHashTable *cmd_attr_var_hash = NULL; + +/** + * Store key value pair for the command system (for int typed values) + * + * @param navit The navit instance + * @param function unused (needed to match command function signiture) + * @param in input attributes in[0] is the key string, in[1] is the integer value to store + * @param out output attributes, unused + * @param valid unused + * @returns nothing + */ +static void +navit_cmd_set_int_var(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + char*key; + struct attr*val; + if(!cmd_int_var_hash) { + cmd_int_var_hash = g_hash_table_new(g_str_hash, g_str_equal); + } + + if ( (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) && + (in && in[1] && ATTR_IS_NUMERIC(in[1]->type))) { + val = g_new(struct attr,1); + attr_dup_content(in[1],val); + key = g_strdup(in[0]->u.str); + g_hash_table_insert(cmd_int_var_hash, key, val); + } +} + + +/** + * Store key value pair for the command system (for attr typed values, can be used as opaque handles) + * + * @param navit The navit instance + * @param function unused (needed to match command function signiture) + * @param in input attributes in[0] is the key string, in[1] is the attr* value to store + * @param out output attributes, unused + * @param valid unused + * @returns nothing + */ +//TODO free stored attributes on navit_destroy +static void +navit_cmd_set_attr_var(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + char*key; + struct attr*val; + if(!cmd_attr_var_hash) { + cmd_attr_var_hash = g_hash_table_new(g_str_hash, g_str_equal); + } + + if ( (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) && + (in && in[1] )) { + val = attr_dup(in[1]); + //val = in[1]; + key = g_strdup(in[0]->u.str); + g_hash_table_insert(cmd_attr_var_hash, key, val); + } else { + dbg(1, "Wrong parameters for set_attr_var() command function\n"); + } +} + + + +/** + * command to toggle the active state of a named layer of the current layout + * + * @param navit The navit instance + * @param function unused (needed to match command function signiture) + * @param in input attribute in[0] is the name of the layer + * @param out output unused + * @param valid unused + * @returns nothing + */ +static void +navit_cmd_toggle_layer(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + if (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) { + if(this->layout_current && this->layout_current->layers) { + GList* layers = this->layout_current->layers; + while (layers) { + struct layer*l=layers->data; + if(l && !strcmp(l->name,in[0]->u.str) ) { + l->active ^= 1; + navit_draw(this); + return; + } + layers=g_list_next(layers); + } + } + } +} + +/** + * adds an item with the current coordinate of the vehicle to a named map + * + * @param navit The navit instance + * @param function unused (needed to match command function signiture) + * @param in input attribute in[0] is the name of the map + * @param out output attribute, 0 on error or the id of the created item on success + * @param valid unused + * @returns nothing + */ +static void +navit_cmd_map_add_curr_pos(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + struct attr **list = g_new0(struct attr *,2); + struct attr*val = g_new0(struct attr,1); + struct mapset* ms; + struct map_selection sel; + const int selection_range = 10; + enum item_type item_type; + struct item *it; + struct map* curr_map = NULL; + struct coord curr_coord; + struct map_rect *mr; + + //return invalid item on error + val->type = attr_none; + val->u.item = NULL; + list[0] = val; + list[1] = NULL; + *out = list; + if ( + in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str && //map name + in[1] && ATTR_IS_STRING(in[1]->type) && in[1]->u.str //item type + ) { + + if(!(ms=navit_get_mapset(this))) { + dbg(1, "Command function map_add_curr_pos(): there is no active mapset\n"); + return; + } + + if((item_type = item_from_name(in[1]->u.str))==type_none) { + dbg(1, "Command function map_add_curr_pos(): unknown item type\n"); + return; + } + + curr_map = mapset_get_map_by_name(ms, in[0]->u.str); + + //no map with the given name found + if( ! curr_map) { + dbg(1, "Command function map_add_curr_pos(): map not found\n"); + return; + } + + if(this->vehicle && this->vehicle->vehicle ) { + struct attr pos_attr; + if(vehicle_get_attr(this->vehicle->vehicle,attr_position_coord_geo,&pos_attr,NULL)) { + transform_from_geo(projection_mg, pos_attr.u.coord_geo, &curr_coord); + } else { + dbg(1, "Command function map_add_curr_pos(): vehicle position is not accessible\n"); + return; + } + } else { + dbg(1, "Command function map_add_curr_pos(): no vehicle\n"); + return; + } + + sel.next=NULL; + sel.order=18; + sel.range.min=type_none; + sel.range.max=type_tec_common; + sel.u.c_rect.lu.x=curr_coord.x-selection_range; + sel.u.c_rect.lu.y=curr_coord.y+selection_range; + sel.u.c_rect.rl.x=curr_coord.x+selection_range; + sel.u.c_rect.rl.y=curr_coord.y-selection_range; + + mr = map_rect_new(curr_map, &sel); + if(mr) { + it = map_rect_create_item( mr, item_type); + if (it) { + val->type = attr_type_item_begin; + item_coord_set(it,&curr_coord, 1, change_mode_modify); + } + val->u.item = it; + } + map_rect_destroy(mr); + } +} + +/** + * sets an attribute (name value pair) of a map item specified by map name and item id + * + * @param navit The navit instance + * @param function unused (needed to match command function signiture) + * @param in input attribute in[0] - name of the map ; in[1] - item ; in[2] - attr name ; in[3] - attr value + * @param out output attribute, 0 on error, 1 on success + * @param valid unused + * @returns nothing + */ +static void +navit_cmd_map_item_set_attr(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + if ( + in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str &&//map name + in[1] && ATTR_IS_ITEM(in[1]->type) && //item + in[2] && ATTR_IS_STRING(in[2]->type) && in[2]->u.str && //attr_type str + in[3] && ATTR_IS_STRING(in[3]->type) && in[3]->u.str //attr_value str + ) { + struct attr attr_to_set; + struct map* curr_map = NULL; + struct mapset *ms; + struct map_selection sel; + const int selection_range = 500; + struct coord curr_coord; + struct item *it; + + if(ATTR_IS_STRING(attr_from_name(in[2]->u.str))) { + attr_to_set.u.str = in[3]->u.str; + attr_to_set.type = attr_from_name(in[2]->u.str); + } + else if(ATTR_IS_INT(attr_from_name(in[2]->u.str))) { + attr_to_set.u.num = atoi(in[3]->u.str); + attr_to_set.type = attr_from_name(in[2]->u.str); + } + else if(ATTR_IS_DOUBLE(attr_from_name(in[2]->u.str))) { + double* val = g_new0(double,1); + *val = atof(in[3]->u.str); + attr_to_set.u.numd = val; + attr_to_set.type = attr_from_name(in[2]->u.str); + } + + ms = navit_get_mapset(this); + + curr_map = mapset_get_map_by_name(ms, in[0]->u.str); + + if( ! curr_map) { + return; + } + sel.next=NULL; + sel.order=18; + sel.range.min=type_none; + sel.range.max=type_tec_common; + sel.u.c_rect.lu.x=curr_coord.x-selection_range; + sel.u.c_rect.lu.y=curr_coord.y+selection_range; + sel.u.c_rect.rl.x=curr_coord.x+selection_range; + sel.u.c_rect.rl.y=curr_coord.y-selection_range; + + it = in[1]->u.item; + if(it) { + item_attr_set(it, &attr_to_set, change_mode_modify); + } + } else { + dbg(4,"Error in command function item_set_attr()\n"); + dbg(4,"Command function item_set_attr(): map cond: %d\n",(in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str)?1:0); + dbg(4,"Command function item_set_attr(): item cond: %d\n",(in[1] && ATTR_IS_ITEM(in[1]->type))?1:0); + dbg(4,"Command function item_set_attr(): attr type cond: %d\n",(in[2] && ATTR_IS_STRING(in[2]->type) && in[2]->u.str)?1:0); + dbg(4,"Command function item_set_attr(): attr val cond: %d\n",(in[3] && ATTR_IS_STRING(in[3]->type) && in[3]->u.str)?1:0); + } +} + +/** + * Get attr variable given a key string for the command system (for opaque usage) + * + * @param navit The navit instance + * @param function unused (needed to match command function signiture) + * @param in input attribute in[0] is the key string + * @param out output attribute, the attr for the given key string if exists or NULL + * @param valid unused + * @returns nothing + */ +static void +navit_cmd_get_attr_var(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + struct attr **list = g_new0(struct attr *,2); + if(!cmd_attr_var_hash) { + struct attr*val = g_new0(struct attr,1); + cmd_attr_var_hash = g_hash_table_new(g_str_hash, g_str_equal); + val->type = attr_type_item_begin; + val->u.item = NULL; + list[0] = val; + } + if (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) { + struct attr*ret = g_hash_table_lookup(cmd_attr_var_hash, in[0]->u.str); + if(ret) { + list[0] = attr_dup(ret); + } + else { + struct attr*val = g_new0(struct attr,1); + val->type = attr_type_int_begin; + val->u.item = NULL; + list[0] = val; + } + } + list[1] = NULL; + *out = list; +} + + +/** + * Get value given a key string for the command system + * + * @param navit The navit instance + * @param function unused (needed to match command function signiture) + * @param in input attribute in[0] is the key string + * @param out output attribute, the value for the given key string if exists or 0 + * @param valid unused + * @returns nothing + */ +static void +navit_cmd_get_int_var(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + struct attr **list = g_new0(struct attr *,2); + if(!cmd_int_var_hash) { + struct attr*val = g_new0(struct attr,1); + cmd_int_var_hash = g_hash_table_new(g_str_hash, g_str_equal); + val->type = attr_type_int_begin; + val->u.num = 0; + list[0] = val; + } + if (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) { + struct attr*ret = g_hash_table_lookup(cmd_int_var_hash, in[0]->u.str); + if(ret) { + list[0] = attr_dup(ret); + } + else { + struct attr*val = g_new0(struct attr,1); + val->type = attr_type_int_begin; + val->u.num = 0; + list[0] = val; + } + } + list[1] = NULL; + *out = list; +} + +GList *cmd_int_var_stack = NULL; + +/** + * Push an integer to the stack for the command system + * + * @param navit The navit instance + * @param function unused (needed to match command function signiture) + * @param in input attribute in[0] is the integer attibute to push + * @param out output attributes, unused + * @param valid unused + * @returns nothing + */ +static void +navit_cmd_push_int(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + if (in && in[0] && ATTR_IS_NUMERIC(in[0]->type)) { + struct attr*val = g_new(struct attr,1); + attr_dup_content(in[0],val); + cmd_int_var_stack = g_list_prepend(cmd_int_var_stack, val); + } +} + +/** + * Pop an integer from the command system's integer stack + * + * @param navit The navit instance + * @param function unused (needed to match command function signiture) + * @param in input attributes unused + * @param out output attribute, the value popped if stack isn't empty or 0 + * @param valid unused + * @returns nothing + */ +static void +navit_cmd_pop_int(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + struct attr **list = g_new0(struct attr *,2); + if(!cmd_int_var_stack) { + struct attr*val = g_new0(struct attr,1); + val->type = attr_type_int_begin; + val->u.num = 0; + list[0] = val; + } + else { + list[0] = cmd_int_var_stack->data; + cmd_int_var_stack = g_list_remove_link(cmd_int_var_stack,cmd_int_var_stack); + } + list[1] = NULL; + *out = list; +} + +/** + * Get current size of command system's integer stack + * + * @param navit The navit instance + * @param function unused (needed to match command function signiture) + * @param in input attributes unused + * @param out output attribute, the size of stack + * @param valid unused + * @returns nothing + */ +static void +navit_cmd_int_stack_size(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + struct attr **list; + struct attr *attr = g_new0(struct attr ,1); + attr->type = attr_type_int_begin; + if(!cmd_int_var_stack) { + attr->u.num = 0; + } + else { + attr->u.num = g_list_length(cmd_int_var_stack); + } + list = g_new0(struct attr *,2); + list[0] = attr; + list[1] = NULL; + *out = list; + cmd_int_var_stack = g_list_remove_link(cmd_int_var_stack,cmd_int_var_stack); +} + +static struct attr ** +navit_get_coord(struct navit *this, struct attr **in, struct pcoord *pc) +{ + if (!in) + return NULL; + if (!in[0]) + return NULL; + pc->pro = transform_get_projection(this->trans); + if (ATTR_IS_STRING(in[0]->type)) { + struct coord c; + coord_parse(in[0]->u.str, pc->pro, &c); + pc->x=c.x; + pc->y=c.y; + in++; + } else if (ATTR_IS_COORD(in[0]->type)) { + pc->x=in[0]->u.coord->x; + pc->y=in[0]->u.coord->y; + in++; + } else if (ATTR_IS_PCOORD(in[0]->type)) { + *pc=*in[0]->u.pcoord; + in++; + } else if (in[1] && in[2] && ATTR_IS_INT(in[0]->type) && ATTR_IS_INT(in[1]->type) && ATTR_IS_INT(in[2]->type)) { + pc->pro=in[0]->u.num; + pc->x=in[1]->u.num; + pc->y=in[2]->u.num; + in+=3; + } else if (in[1] && ATTR_IS_INT(in[0]->type) && ATTR_IS_INT(in[1]->type)) { + pc->x=in[0]->u.num; + pc->y=in[1]->u.num; + in+=2; + } else + return NULL; + return in; +} + +static void +navit_cmd_set_destination(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + struct pcoord pc; + char *description=NULL; + in=navit_get_coord(this, in, &pc); + if (!in) + return; + if (in[0] && ATTR_IS_STRING(in[0]->type)) + description=in[0]->u.str; + navit_set_destination(this, &pc, description, 1); +} + + +static void +navit_cmd_set_center(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + struct pcoord pc; + in=navit_get_coord(this, in, &pc); + if (!in) + return; + navit_set_center(this, &pc, 0); +} + + +static void +navit_cmd_set_position(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + struct pcoord pc; + in=navit_get_coord(this, in, &pc); + if (!in) + return; + navit_set_position(this, &pc); +} + + +static void +navit_cmd_fmt_coordinates(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + struct attr attr; + attr.type=attr_type_string_begin; + attr.u.str="Fix me"; + if (out) { + *out=attr_generic_add_attr(*out, &attr); + } +} + +/** + * Join several string attributes into one + * + * @param navit The navit instance + * @param function unused (needed to match command function signiture) + * @param in input attributes in[0] - separator, in[1..] - attributes to join + * @param out output attribute joined attribute as string + * @param valid unused + * @returns nothing + */ +static void +navit_cmd_strjoin(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + struct attr attr; + gchar *ret, *sep; + int i; + attr.type=attr_type_string_begin; + attr.u.str=NULL; + if(in[0] && in[1]) { + sep=attr_to_text(in[0],NULL,1); + ret=attr_to_text(in[1],NULL,1); + for(i=2;in[i];i++) { + gchar *in_i=attr_to_text(in[i],NULL,1); + gchar *r=g_strjoin(sep,ret,in_i,NULL); + g_free(in_i); + g_free(ret); + ret=r; + } + g_free(sep); + attr.u.str=ret; + if(out) { + *out=attr_generic_add_attr(*out, &attr); + } + g_free(ret); + } +} + +/** + * Call external program + * + * @param navit The navit instance + * @param function unused (needed to match command function signiture) + * @param in input attributes in[0] - name of executable, in[1..] - parameters + * @param out output attribute unused + * @param valid unused + * @returns nothing + */ +static void +navit_cmd_spawn(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + int i,j, nparms, nvalid; + const char ** argv=NULL; + struct spawn_process_info *pi; + + nparms=0; + nvalid=0; + if(in) { + while(in[nparms]) { + if (in[nparms]->type!=attr_none) + nvalid++; + nparms++; + } + } + + if(nvalid>0) { + argv=g_new(char*,nvalid+1); + for(i=0,j=0;in[i];i++) { + if(in[i]->type!=attr_none ) { + argv[j++]=attr_to_text(in[i],NULL,1); + } else { + dbg(0,"Parameter #%i is attr_none - skipping\n",i); + } + } + argv[j]=NULL; + pi=spawn_process(argv); + + // spawn_process() testing suite - uncomment following code to test. + //sleep(3); + // example of non-blocking wait + //int st=spawn_process_check_status(pi,0);dbg(0,"status %i\n",st); + // example of blocking wait + //st=spawn_process_check_status(pi,1);dbg(0,"status %i\n",st); + // example of wait after process is finished and status is + // already tested + //st=spawn_process_check_status(pi,1);dbg(0,"status %i\n",st); + // example of wait after process is finished and status is + // already tested - unblocked + //st=spawn_process_check_status(pi,0);dbg(0,"status %i\n",st); + + // End testing suite + spawn_process_info_free(pi); + for(i=0;argv[i];i++) + g_free(argv[i]); + g_free(argv); + } +} + + +static struct command_table commands[] = { + {"zoom_in",command_cast(navit_cmd_zoom_in)}, + {"zoom_out",command_cast(navit_cmd_zoom_out)}, + {"zoom_to_route",command_cast(navit_cmd_zoom_to_route)}, + {"say",command_cast(navit_cmd_say)}, + {"set_center",command_cast(navit_cmd_set_center)}, + {"set_center_cursor",command_cast(navit_cmd_set_center_cursor)}, + {"set_destination",command_cast(navit_cmd_set_destination)}, + {"set_position",command_cast(navit_cmd_set_position)}, + {"announcer_toggle",command_cast(navit_cmd_announcer_toggle)}, + {"fmt_coordinates",command_cast(navit_cmd_fmt_coordinates)}, + {"set_int_var",command_cast(navit_cmd_set_int_var)}, + {"get_int_var",command_cast(navit_cmd_get_int_var)}, + {"push_int",command_cast(navit_cmd_push_int)}, + {"pop_int",command_cast(navit_cmd_pop_int)}, + {"int_stack_size",command_cast(navit_cmd_int_stack_size)}, + {"toggle_layer",command_cast(navit_cmd_toggle_layer)}, + {"strjoin",command_cast(navit_cmd_strjoin)}, + {"spawn",command_cast(navit_cmd_spawn)}, + {"map_add_curr_pos",command_cast(navit_cmd_map_add_curr_pos)}, + {"map_item_set_attr",command_cast(navit_cmd_map_item_set_attr)}, + {"set_attr_var",command_cast(navit_cmd_set_attr_var)}, + {"get_attr_var",command_cast(navit_cmd_get_attr_var)}, +}; + +void +navit_command_add_table(struct navit*this_, struct command_table *commands, int count) +{ + command_add_table(this_->attr_cbl, commands, count, this_); +} + +struct navit * +navit_new(struct attr *parent, struct attr **attrs) +{ + struct navit *this_=g_new0(struct navit, 1); + struct pcoord center; + struct coord co; + struct coord_geo g; + enum projection pro=projection_mg; + int zoom = 256; + g.lat=53.13; + g.lng=11.70; + + this_->func=&navit_func; + this_->refcount=1; + this_->attrs=attr_list_dup(attrs); + this_->self.type=attr_navit; + this_->self.u.navit=this_; + this_->attr_cbl=callback_list_new(); + + this_->orientation=-1; + this_->tracking_flag=1; + this_->recentdest_count=10; + this_->osd_configuration=-1; + + this_->center_timeout = 10; + this_->use_mousewheel = 1; + this_->autozoom_secs = 10; + this_->autozoom_min = 7; + this_->autozoom_active = 0; + this_->zoom_min = 1; + this_->zoom_max = 2097152; + this_->follow_cursor = 1; + this_->radius = 30; + this_->border = 16; + + this_->trans = transform_new(); + this_->trans_cursor = transform_new(); + transform_from_geo(pro, &g, &co); + center.x=co.x; + center.y=co.y; + center.pro = pro; + + transform_setup(this_->trans, ¢er, zoom, (this_->orientation != -1) ? this_->orientation : 0); + + this_->bookmarks=bookmarks_new(&this_->self, NULL, this_->trans); + + this_->prevTs=0; + + for (;*attrs; attrs++) { + navit_set_attr_do(this_, *attrs, 1); + } + this_->displaylist=graphics_displaylist_new(); + command_add_table(this_->attr_cbl, commands, sizeof(commands)/sizeof(struct command_table), this_); + + this_->messages = messagelist_new(attrs); + + return this_; +} + +static int +navit_set_gui(struct navit *this_, struct gui *gui) +{ + if (this_->gui) + return 0; + this_->gui=gui; + if (gui_has_main_loop(this_->gui)) { + if (! main_loop_gui) { + main_loop_gui=this_->gui; + } else { + dbg(0,"gui with main loop already active, ignoring this instance"); + return 0; + } + } + return 1; +} + +void +navit_add_message(struct navit *this_, char *message) +{ + message_new(this_->messages, message); +} + +struct message +*navit_get_messages(struct navit *this_) +{ + return message_get(this_->messages); +} + +static int +navit_set_graphics(struct navit *this_, struct graphics *gra) +{ + if (this_->gra) + return 0; + this_->gra=gra; + this_->resize_callback=callback_new_attr_1(callback_cast(navit_resize), attr_resize, this_); + graphics_add_callback(gra, this_->resize_callback); + this_->button_callback=callback_new_attr_1(callback_cast(navit_button), attr_button, this_); + graphics_add_callback(gra, this_->button_callback); + this_->motion_callback=callback_new_attr_1(callback_cast(navit_motion), attr_motion, this_); + graphics_add_callback(gra, this_->motion_callback); + this_->predraw_callback=callback_new_attr_1(callback_cast(navit_predraw), attr_predraw, this_); + graphics_add_callback(gra, this_->predraw_callback); + return 1; +} + +struct graphics * +navit_get_graphics(struct navit *this_) +{ + return this_->gra; +} + +struct vehicleprofile * +navit_get_vehicleprofile(struct navit *this_) +{ + return this_->vehicleprofile; +} + +GList * +navit_get_vehicleprofiles(struct navit *this_) +{ + return this_->vehicleprofiles; +} + +static void +navit_projection_set(struct navit *this_, enum projection pro, int draw) +{ + struct coord_geo g; + struct coord *c; + + c=transform_center(this_->trans); + transform_to_geo(transform_get_projection(this_->trans), c, &g); + transform_set_projection(this_->trans, pro); + transform_from_geo(pro, &g, c); + if (draw) + navit_draw(this_); +} + +static void +navit_mark_navigation_stopped(char *former_destination_file){ + FILE *f; + f=fopen(former_destination_file, "a"); + if (f) { + fprintf(f,"%s", TEXTFILE_COMMENT_NAVI_STOPPED); + fclose(f); + }else{ + dbg(0, "Error setting mark in destination file %s: %s\n", former_destination_file, strerror(errno)); + } +} + +/** + * Start the route computing to a given set of coordinates + * + * @param navit The navit instance + * @param c The coordinate to start routing to + * @param description A label which allows the user to later identify this destination in the former destinations selection + * @returns nothing + */ +void +navit_set_destination(struct navit *this_, struct pcoord *c, const char *description, int async) +{ + char *destination_file; + destination_file = bookmarks_get_destination_file(TRUE); + if (c) { + this_->destination=*c; + this_->destination_valid=1; + + dbg(1, "c=(%i,%i)\n", c->x,c->y); + bookmarks_append_coord(this_->former_destination, destination_file, c, type_former_destination, description, this_->recentdest_count); + } else { + this_->destination_valid=0; + navit_mark_navigation_stopped(destination_file); + } + g_free(destination_file); + callback_list_call_attr_0(this_->attr_cbl, attr_destination); + if (this_->route) { + route_set_destination(this_->route, c, async); + + if (this_->ready == 3) + navit_draw(this_); + } +} + +/** + * Start the route computing to a given set of coordinates including waypoints + * + * @param navit The navit instance + * @param c The coordinate to start routing to + * @param description A label which allows the user to later identify this destination in the former destinations selection + * @returns nothing + */ +void +navit_set_destinations(struct navit *this_, struct pcoord *c, int count, const char *description, int async) +{ + char *destination_file; + if (c && count) { + this_->destination=c[count-1]; + this_->destination_valid=1; + + destination_file = bookmarks_get_destination_file(TRUE); + bookmarks_append_coord(this_->former_destination, destination_file, c, type_former_itinerary, description, this_->recentdest_count); + g_free(destination_file); + } else + this_->destination_valid=0; + callback_list_call_attr_0(this_->attr_cbl, attr_destination); + if (this_->route) { + route_set_destinations(this_->route, c, count, async); + + if (this_->ready == 3) + navit_draw(this_); + } +} + +/** + * @brief Checks if a route is calculated + * + * This function checks if a route is calculated. + * + * @param this_ The navit struct whose route should be checked. + * @return True if the route is set, false otherwise. + */ +int +navit_check_route(struct navit *this_) +{ + if (this_->route) { + return route_get_path_set(this_->route); + } + + return 0; +} + +static int +navit_former_destinations_active(struct navit *this_) +{ + char *destination_file_name = bookmarks_get_destination_file(FALSE); + FILE *destination_file; + int active=0; + char lastline[100]; + destination_file=fopen(destination_file_name,"r"); + if (destination_file) { + while(fgets(lastline, sizeof(lastline), destination_file)); + fclose(destination_file); + if ((lastline != NULL) && (strcmp(lastline, TEXTFILE_COMMENT_NAVI_STOPPED))){ + active=1; + } + } + g_free(destination_file_name); + return active; +} + +struct map* read_former_destinations_from_file(){ + struct attr type, data, flags, *attrs[4]; + char *destination_file = bookmarks_get_destination_file(FALSE); + struct map *m; + + type.type=attr_type; + type.u.str="textfile"; + + data.type=attr_data; + data.u.str=destination_file; + + flags.type=attr_flags; + flags.u.num=1; + + attrs[0]=&type; attrs[1]=&data; attrs[2]=&flags; attrs[3]=NULL; + + m=map_new(NULL, attrs); + g_free(destination_file); + return m; +} + +static void +navit_add_former_destinations_from_file(struct navit *this_) +{ + struct item *item; + int i,valid=0,count=0; + struct coord c[16]; + struct pcoord pc[16]; + struct map_rect *mr; + + this_->former_destination=read_former_destinations_from_file(); + if (!this_->route || !navit_former_destinations_active(this_)) + return; + mr=map_rect_new(this_->former_destination, NULL); + while ((item=map_rect_get_item(mr))) { + if ((item->type == type_former_destination || item->type == type_former_itinerary || item->type == type_former_itinerary_part) && (count=item_coord_get(item, c, 16))) + valid=1; + } + map_rect_destroy(mr); + if (valid && count > 0) { + for (i = 0 ; i < count ; i++) { + pc[i].pro=map_projection(this_->former_destination); + pc[i].x=c[i].x; + pc[i].y=c[i].y; + } + if (count == 1) + route_set_destination(this_->route, &pc[0], 1); + else + route_set_destinations(this_->route, pc, count, 1); + this_->destination=pc[count-1]; + this_->destination_valid=1; + } +} + + +void +navit_textfile_debug_log(struct navit *this_, const char *fmt, ...) +{ + va_list ap; + char *str1,*str2; + va_start(ap, fmt); + if (this_->textfile_debug_log && this_->vehicle) { + str1=g_strdup_vprintf(fmt, ap); + str2=g_strdup_printf("0x%x 0x%x%s%s\n", this_->vehicle->coord.x, this_->vehicle->coord.y, strlen(str1) ? " " : "", str1); + log_write(this_->textfile_debug_log, str2, strlen(str2), 0); + g_free(str2); + g_free(str1); + } + va_end(ap); +} + +void +navit_textfile_debug_log_at(struct navit *this_, struct pcoord *pc, const char *fmt, ...) +{ + va_list ap; + char *str1,*str2; + va_start(ap, fmt); + if (this_->textfile_debug_log && this_->vehicle) { + str1=g_strdup_vprintf(fmt, ap); + str2=g_strdup_printf("0x%x 0x%x%s%s\n", pc->x, pc->y, strlen(str1) ? " " : "", str1); + log_write(this_->textfile_debug_log, str2, strlen(str2), 0); + g_free(str2); + g_free(str1); + } + va_end(ap); +} + +void +navit_say(struct navit *this_, char *text) +{ + struct attr attr; + if(this_->speech) { + if (!speech_get_attr(this_->speech, attr_active, &attr, NULL)) + attr.u.num = 1; + dbg(1, "this_.speech->active %i\n", attr.u.num); + if(attr.u.num) + speech_say(this_->speech, text); + } +} + +/** + * @brief Toggles the navigation announcer for navit + * @param this_ The navit object + */ +static void +navit_cmd_announcer_toggle(struct navit *this_) +{ + struct attr attr, speechattr; + + // search for the speech attribute + if(!navit_get_attr(this_, attr_speech, &speechattr, NULL)) + return; + // find out if the corresponding attribute attr_active has been set + if(speech_get_attr(speechattr.u.speech, attr_active, &attr, NULL)) { + // flip it then... + attr.u.num = !attr.u.num; + } else { + // otherwise disable it because voice is enabled by default + attr.type = attr_active; + attr.u.num = 0; + } + + // apply the new state + if(!speech_set_attr(speechattr.u.speech, &attr)) + return; + + // announce that the speech attribute has changed + callback_list_call_attr_0(this_->attr_cbl, attr_speech); +} + +void +navit_speak(struct navit *this_) +{ + struct navigation *nav=this_->navigation; + struct map *map=NULL; + struct map_rect *mr=NULL; + struct item *item; + struct attr attr; + + if (!speech_get_attr(this_->speech, attr_active, &attr, NULL)) + attr.u.num = 1; + dbg(1, "this_.speech->active %i\n", attr.u.num); + if(!attr.u.num) + return; + + if (nav) + map=navigation_get_map(nav); + if (map) + mr=map_rect_new(map, NULL); + if (mr) { + while ((item=map_rect_get_item(mr)) && (item->type == type_nav_position || item->type == type_nav_none)); + if (item && item_attr_get(item, attr_navigation_speech, &attr)) { + speech_say(this_->speech, attr.u.str); + navit_add_message(this_, attr.u.str); + navit_textfile_debug_log(this_, "type=announcement label=\"%s\"", attr.u.str); + } + map_rect_destroy(mr); + } +} + +static void +navit_window_roadbook_update(struct navit *this_) +{ + struct navigation *nav=this_->navigation; + struct map *map=NULL; + struct map_rect *mr=NULL; + struct item *item; + struct attr attr; + struct param_list param[5]; + int secs; + + dbg(1,"enter\n"); + datawindow_mode(this_->roadbook_window, 1); + if (nav) + map=navigation_get_map(nav); + if (map) + mr=map_rect_new(map, NULL); + dbg(0,"nav=%p map=%p mr=%p\n", nav, map, mr); + if (mr) { + dbg(0,"while loop\n"); + while ((item=map_rect_get_item(mr))) { + dbg(0,"item=%p\n", item); + attr.u.str=NULL; + if (item->type != type_nav_position) { + item_attr_get(item, attr_navigation_long, &attr); + if (attr.u.str == NULL) { + continue; + } + dbg(2, "Command='%s'\n", attr.u.str); + param[0].value=g_strdup(attr.u.str); + } else + param[0].value=_("Position"); + param[0].name=_("Command"); + + item_attr_get(item, attr_length, &attr); + dbg(2, "Length=%d\n", attr.u.num); + param[1].name=_("Length"); + + if ( attr.u.num >= 2000 ) + { + param[1].value=g_strdup_printf("%5.1f %s",(float)attr.u.num / 1000, _("km") ); + } + else + { + param[1].value=g_strdup_printf("%7ld %s",attr.u.num, _("m")); + } + + item_attr_get(item, attr_time, &attr); + dbg(2, "Time=%d\n", attr.u.num); + secs=attr.u.num/10; + param[2].name=_("Time"); + if ( secs >= 3600 ) + { + param[2].value=g_strdup_printf("%d:%02d:%02d",secs / 60, ( secs / 60 ) % 60 , secs % 60); + } + else + { + param[2].value=g_strdup_printf("%d:%02d",secs / 60, secs % 60); + } + + item_attr_get(item, attr_destination_length, &attr); + dbg(2, "Destlength=%d\n", attr.u.num); + param[3].name=_("Destination Length"); + if ( attr.u.num >= 2000 ) + { + param[3].value=g_strdup_printf("%5.1f %s",(float)attr.u.num / 1000, _("km") ); + } + else + { + param[3].value=g_strdup_printf("%ld %s",attr.u.num, _("m")); + } + + item_attr_get(item, attr_destination_time, &attr); + dbg(2, "Desttime=%d\n", attr.u.num); + secs=attr.u.num/10; + param[4].name=_("Destination Time"); + if ( secs >= 3600 ) + { + param[4].value=g_strdup_printf("%d:%02d:%02d",secs / 3600, (secs / 60 ) % 60 , secs % 60); + } + else + { + param[4].value=g_strdup_printf("%d:%02d",secs / 60, secs % 60); + } + datawindow_add(this_->roadbook_window, param, 5); + } + map_rect_destroy(mr); + } + datawindow_mode(this_->roadbook_window, 0); +} + +void +navit_window_roadbook_destroy(struct navit *this_) +{ + dbg(0, "enter\n"); + navigation_unregister_callback(this_->navigation, attr_navigation_long, this_->roadbook_callback); + callback_destroy(this_->roadbook_callback); + this_->roadbook_window=NULL; + this_->roadbook_callback=NULL; +} +void +navit_window_roadbook_new(struct navit *this_) +{ + if (!this_->gui || this_->roadbook_callback || this_->roadbook_window) { + return; + } + + this_->roadbook_callback=callback_new_1(callback_cast(navit_window_roadbook_update), this_); + navigation_register_callback(this_->navigation, attr_navigation_long, this_->roadbook_callback); + this_->roadbook_window=gui_datawindow_new(this_->gui, _("Roadbook"), NULL, callback_new_1(callback_cast(navit_window_roadbook_destroy), this_)); + navit_window_roadbook_update(this_); +} + +void +navit_init(struct navit *this_) +{ + struct mapset *ms; + struct map *map; + int callback; + char *center_file; + + dbg(2,"enter gui %p graphics %p\n",this_->gui,this_->gra); + + if (!this_->gui && !(this_->flags & 2)) { + dbg(0,"no gui\n"); + navit_destroy(this_); + return; + } + if (!this_->gra && !(this_->flags & 1)) { + dbg(0,"no graphics\n"); + navit_destroy(this_); + return; + } + dbg(2,"Connecting gui to graphics\n"); + if (this_->gui && this_->gra && gui_set_graphics(this_->gui, this_->gra)) { + struct attr attr_type_gui, attr_type_graphics; + gui_get_attr(this_->gui, attr_type, &attr_type_gui, NULL); + graphics_get_attr(this_->gra, attr_type, &attr_type_graphics, NULL); + dbg(0,"failed to connect graphics '%s' to gui '%s'\n", attr_type_graphics.u.str, attr_type_gui.u.str); + dbg(0," Please see http://wiki.navit-project.org/index.php/Failed_to_connect_graphics_to_gui\n"); + dbg(0," for explanations and solutions\n"); + + navit_destroy(this_); + return; + } + if (this_->speech && this_->navigation) { + struct attr speech; + speech.type=attr_speech; + speech.u.speech=this_->speech; + navigation_set_attr(this_->navigation, &speech); + } + dbg(2,"Initializing graphics\n"); + dbg(2,"Setting Vehicle\n"); + navit_set_vehicle(this_, this_->vehicle); + dbg(2,"Adding dynamic maps to mapset %p\n",this_->mapsets); + if (this_->mapsets) { + struct mapset_handle *msh; + ms=this_->mapsets->data; + this_->progress_cb=callback_new_attr_1(callback_cast(navit_map_progress), attr_progress, this_); + msh=mapset_open(ms); + while (msh && (map=mapset_next(msh, 0))) { + //pass new callback instance for each map in the mapset to make map callback list destruction work correctly + struct callback *pcb = callback_new_attr_1(callback_cast(navit_map_progress), attr_progress, this_); + map_add_callback(map, pcb); + } + mapset_close(msh); + + if (this_->route) { + if ((map=route_get_map(this_->route))) { + struct attr map_a; + map_a.type=attr_map; + map_a.u.map=map; + mapset_add_attr(ms, &map_a); + } + if ((map=route_get_graph_map(this_->route))) { + struct attr map_a,active; + map_a.type=attr_map; + map_a.u.map=map; + active.type=attr_active; + active.u.num=0; + mapset_add_attr(ms, &map_a); + map_set_attr(map, &active); + } + route_set_mapset(this_->route, ms); + route_set_projection(this_->route, transform_get_projection(this_->trans)); + } + if (this_->tracking) { + tracking_set_mapset(this_->tracking, ms); + if (this_->route) + tracking_set_route(this_->tracking, this_->route); + } + if (this_->navigation) { + if ((map=navigation_get_map(this_->navigation))) { + struct attr map_a,active; + map_a.type=attr_map; + map_a.u.map=map; + active.type=attr_active; + active.u.num=0; + mapset_add_attr(ms, &map_a); + map_set_attr(map, &active); + } + } + if (this_->tracking) { + if ((map=tracking_get_map(this_->tracking))) { + struct attr map_a,active; + map_a.type=attr_map; + map_a.u.map=map; + active.type=attr_active; + active.u.num=0; + mapset_add_attr(ms, &map_a); + map_set_attr(map, &active); + } + } + navit_add_former_destinations_from_file(this_); + } + if (this_->route) { + struct attr callback; + this_->route_cb=callback_new_attr_1(callback_cast(navit_redraw_route), attr_route_status, this_); + callback.type=attr_callback; + callback.u.callback=this_->route_cb; + route_add_attr(this_->route, &callback); + } + if (this_->navigation) { + if (this_->speech) { + this_->nav_speech_cb=callback_new_1(callback_cast(navit_speak), this_); + navigation_register_callback(this_->navigation, attr_navigation_speech, this_->nav_speech_cb); + } + if (this_->route) + navigation_set_route(this_->navigation, this_->route); + } + dbg(2,"Setting Center\n"); + center_file = bookmarks_get_center_file(FALSE); + bookmarks_set_center_from_file(this_->bookmarks, center_file); + g_free(center_file); +#if 0 + if (this_->menubar) { + men=menu_add(this_->menubar, "Data", menu_type_submenu, NULL); + if (men) { + navit_add_menu_windows_items(this_, men); + } + } +#endif + global_navit=this_; +#if 0 + navit_window_roadbook_new(this_); + navit_window_items_new(this_); +#endif + + messagelist_init(this_->messages); + + navit_set_cursors(this_); + + callback_list_call_attr_1(this_->attr_cbl, attr_navit, this_); + callback=(this_->ready == 2); + this_->ready|=1; + dbg(2,"ready=%d\n",this_->ready); + if (this_->ready == 3) + navit_draw_async(this_, 1); + if (callback) + callback_list_call_attr_1(this_->attr_cbl, attr_graphics_ready, this_); +#if 0 + routech_test(this_); +#endif +} + +void +navit_zoom_to_rect(struct navit *this_, struct coord_rect *r) +{ + struct coord c; + int scale=16; + + c.x=(r->rl.x+r->lu.x)/2; + c.y=(r->rl.y+r->lu.y)/2; + transform_set_center(this_->trans, &c); + dbg(1,"%x,%x-%x,%x\n", r->rl.x,r->rl.y,r->lu.x,r->lu.y); + while (scale < 1<<20) { + struct point p1,p2; + transform_set_scale(this_->trans, scale); + transform_setup_source_rect(this_->trans); + transform(this_->trans, transform_get_projection(this_->trans), &r->lu, &p1, 1, 0, 0, NULL); + transform(this_->trans, transform_get_projection(this_->trans), &r->rl, &p2, 1, 0, 0, NULL); + dbg(1,"%d,%d-%d,%d\n",p1.x,p1.y,p2.x,p2.y); + if (p1.x < 0 || p2.x < 0 || p1.x > this_->w || p2.x > this_->w || + p1.y < 0 || p2.y < 0 || p1.y > this_->h || p2.y > this_->h) + scale*=2; + else + break; + + } + if (this_->ready == 3) + navit_draw_async(this_,0); +} + +void +navit_zoom_to_route(struct navit *this_, int orientation) +{ + struct map *map; + struct map_rect *mr=NULL; + struct item *item; + struct coord c; + struct coord_rect r; + int count=0; + if (! this_->route) + return; + dbg(1,"enter\n"); + map=route_get_map(this_->route); + dbg(1,"map=%p\n",map); + if (map) + mr=map_rect_new(map, NULL); + dbg(1,"mr=%p\n",mr); + if (mr) { + while ((item=map_rect_get_item(mr))) { + dbg(1,"item=%s\n", item_to_name(item->type)); + while (item_coord_get(item, &c, 1)) { + dbg(1,"coord\n"); + if (!count) + r.lu=r.rl=c; + else + coord_rect_extend(&r, &c); + count++; + } + } + map_rect_destroy(mr); + } + if (! count) + return; + if (orientation != -1) + transform_set_yaw(this_->trans, orientation); + navit_zoom_to_rect(this_, &r); +} + +static void +navit_cmd_zoom_to_route(struct navit *this) +{ + navit_zoom_to_route(this, 0); +} + + +/** + * Change the current zoom level + * + * @param navit The navit instance + * @param center The point where to center the map, including its projection + * @returns nothing + */ +void +navit_set_center(struct navit *this_, struct pcoord *center, int set_timeout) +{ + struct coord *c=transform_center(this_->trans); + struct coord c1,c2; + enum projection pro = transform_get_projection(this_->trans); + if (pro != center->pro) { + c1.x = center->x; + c1.y = center->y; + transform_from_to(&c1, center->pro, &c2, pro); + } else { + c2.x = center->x; + c2.y = center->y; + } + *c=c2; + if (set_timeout) + navit_set_timeout(this_); + if (this_->ready == 3) + navit_draw(this_); +} + +static void +navit_set_center_coord_screen(struct navit *this_, struct coord *c, struct point *p, int set_timeout) +{ + int width, height; + struct point po; + transform_set_center(this_->trans, c); + transform_get_size(this_->trans, &width, &height); + po.x=width/2; + po.y=height/2; + update_transformation(this_->trans, &po, p, NULL); + if (set_timeout) + navit_set_timeout(this_); +} + +/** + * Links all vehicles to a cursor depending on the current profile. + * + * @param this_ A navit instance + * @author Ralph Sennhauser (10/2009) + */ +static void +navit_set_cursors(struct navit *this_) +{ + struct attr name; + struct navit_vehicle *nv; + struct cursor *c; + GList *v; + + v=g_list_first(this_->vehicles); // GList of navit_vehicles + while (v) { + nv=v->data; + if (vehicle_get_attr(nv->vehicle, attr_cursorname, &name, NULL)) { + if (!strcmp(name.u.str,"none")) + c=NULL; + else + c=layout_get_cursor(this_->layout_current, name.u.str); + } else + c=layout_get_cursor(this_->layout_current, "default"); + vehicle_set_cursor(nv->vehicle, c, 0); + v=g_list_next(v); + } + return; +} + +static int +navit_get_cursor_pnt(struct navit *this_, struct point *p, int keep_orientation, int *dir) +{ + int width, height; + struct navit_vehicle *nv=this_->vehicle; + + float offset=this_->radius; // Cursor offset from the center of the screen (percent). +#if 0 /* Better improve track.c to get that issue resolved or make it configurable with being off the default, the jumping back to the center is a bit annoying */ + float min_offset = 0.; // Percent offset at min_offset_speed. + float max_offset = 30.; // Percent offset at max_offset_speed. + int min_offset_speed = 2; // Speed in km/h + int max_offset_speed = 50; // Speed ini km/h + // Calculate cursor offset from the center of the screen, upon speed. + if (nv->speed <= min_offset_speed) { + offset = min_offset; + } else if (nv->speed > max_offset_speed) { + offset = max_offset; + } else { + offset = (max_offset - min_offset) / (max_offset_speed - min_offset_speed) * (nv->speed - min_offset_speed); + } +#endif + + transform_get_size(this_->trans, &width, &height); + if (this_->orientation == -1 || keep_orientation) { + p->x=50*width/100; + p->y=(50 + offset)*height/100; + if (dir) + *dir=keep_orientation?this_->orientation:nv->dir; + } else { + int mdir; + if (this_->tracking && this_->tracking_flag) { + mdir = tracking_get_angle(this_->tracking) - this_->orientation; + } else { + mdir=nv->dir-this_->orientation; + } + + p->x=(50 - offset*sin(M_PI*mdir/180.))*width/100; + p->y=(50 + offset*cos(M_PI*mdir/180.))*height/100; + if (dir) + *dir=this_->orientation; + } + return 1; +} + +void +navit_set_center_cursor(struct navit *this_, int autozoom, int keep_orientation) +{ + int dir; + struct point pn; + struct navit_vehicle *nv=this_->vehicle; + navit_get_cursor_pnt(this_, &pn, keep_orientation, &dir); + transform_set_yaw(this_->trans, dir); + navit_set_center_coord_screen(this_, &nv->coord, &pn, 0); + if (autozoom) + navit_autozoom(this_, &nv->coord, nv->speed, 0); +} + +static void +navit_set_center_cursor_draw(struct navit *this_) +{ + navit_set_center_cursor(this_,1,0); + if (this_->ready == 3) + navit_draw_async(this_, 1); +} + +static void +navit_cmd_set_center_cursor(struct navit *this_) +{ + navit_set_center_cursor_draw(this_); +} + +void +navit_set_center_screen(struct navit *this_, struct point *p, int set_timeout) +{ + struct coord c; + struct pcoord pc; + transform_reverse(this_->trans, p, &c); + pc.x = c.x; + pc.y = c.y; + pc.pro = transform_get_projection(this_->trans); + navit_set_center(this_, &pc, set_timeout); +} + +static int +navit_set_attr_do(struct navit *this_, struct attr *attr, int init) +{ + int dir=0, orient_old=0, attr_updated=0; + struct coord co; + long zoom; + GList *l; + struct navit_vehicle *nv; + struct layout *lay; + struct attr active; + active.type=attr_active; + active.u.num=0; + + switch (attr->type) { + case attr_autozoom: + attr_updated=(this_->autozoom_secs != attr->u.num); + this_->autozoom_secs = attr->u.num; + break; + case attr_autozoom_active: + attr_updated=(this_->autozoom_active != attr->u.num); + this_->autozoom_active = attr->u.num; + break; + case attr_center: + transform_from_geo(transform_get_projection(this_->trans), attr->u.coord_geo, &co); + dbg(1,"0x%x,0x%x\n",co.x,co.y); + transform_set_center(this_->trans, &co); + break; + case attr_drag_bitmap: + attr_updated=(this_->drag_bitmap != !!attr->u.num); + this_->drag_bitmap=!!attr->u.num; + break; + case attr_flags: + attr_updated=(this_->flags != attr->u.num); + this_->flags=attr->u.num; + break; + case attr_flags_graphics: + attr_updated=(this_->graphics_flags != attr->u.num); + this_->graphics_flags=attr->u.num; + break; + case attr_follow: + if (!this_->vehicle) + return 0; + attr_updated=(this_->vehicle->follow_curr != attr->u.num); + this_->vehicle->follow_curr = attr->u.num; + break; + case attr_layout: + if(this_->layout_current!=attr->u.layout) { + this_->layout_current=attr->u.layout; + graphics_font_destroy_all(this_->gra); + navit_set_cursors(this_); + if (this_->ready == 3) + navit_draw(this_); + attr_updated=1; + } + break; + case attr_layout_name: + l=this_->layouts; + while (l) { + lay=l->data; + if (!strcmp(lay->name,attr->u.str)) { + struct attr attr; + attr.type=attr_layout; + attr.u.layout=lay; + return navit_set_attr_do(this_, &attr, init); + } + l=g_list_next(l); + } + return 0; + case attr_map_border: + if (this_->border != attr->u.num) { + this_->border=attr->u.num; + attr_updated=1; + } + break; + case attr_orientation: + orient_old=this_->orientation; + this_->orientation=attr->u.num; + if (!init) { + if (this_->orientation != -1) { + dir = this_->orientation; + } else { + if (this_->vehicle) { + dir = this_->vehicle->dir; + } + } + transform_set_yaw(this_->trans, dir); + if (orient_old != this_->orientation) { +#if 0 + if (this_->ready == 3) + navit_draw(this_); +#endif + attr_updated=1; + } + } + break; + case attr_osd_configuration: + dbg(0,"setting osd_configuration to %d (was %d)\n", attr->u.num, this_->osd_configuration); + attr_updated=(this_->osd_configuration != attr->u.num); + this_->osd_configuration=attr->u.num; + break; + case attr_pitch: + attr_updated=(this_->pitch != attr->u.num); + this_->pitch=attr->u.num; + transform_set_pitch(this_->trans, this_->pitch); + if (!init && attr_updated && this_->ready == 3) + navit_draw(this_); + break; + case attr_projection: + if(this_->trans && transform_get_projection(this_->trans) != attr->u.projection) { + navit_projection_set(this_, attr->u.projection, !init); + attr_updated=1; + } + break; + case attr_radius: + attr_updated=(this_->radius != attr->u.num); + this_->radius=attr->u.num; + break; + case attr_recent_dest: + attr_updated=(this_->recentdest_count != attr->u.num); + this_->recentdest_count=attr->u.num; + break; + case attr_speech: + if(this_->speech && this_->speech != attr->u.speech) { + attr_updated=1; + this_->speech = attr->u.speech; + } + break; + case attr_timeout: + attr_updated=(this_->center_timeout != attr->u.num); + this_->center_timeout = attr->u.num; + break; + case attr_tracking: + attr_updated=(this_->tracking_flag != !!attr->u.num); + this_->tracking_flag=!!attr->u.num; + break; + case attr_transformation: + this_->trans=attr->u.transformation; + break; + case attr_use_mousewheel: + attr_updated=(this_->use_mousewheel != !!attr->u.num); + this_->use_mousewheel=!!attr->u.num; + break; + case attr_vehicle: + l=this_->vehicles; + while(l) { + nv=l->data; + if (nv->vehicle == attr->u.vehicle) { + if (!this_->vehicle || this_->vehicle->vehicle != attr->u.vehicle) { + if (this_->vehicle) + vehicle_set_attr(this_->vehicle->vehicle, &active); + active.u.num=1; + vehicle_set_attr(nv->vehicle, &active); + attr_updated=1; + } + navit_set_vehicle(this_, nv); + } + l=g_list_next(l); + } + break; + case attr_zoom: + zoom=transform_get_scale(this_->trans); + attr_updated=(zoom != attr->u.num); + transform_set_scale(this_->trans, attr->u.num); + if (attr_updated && !init) + navit_draw(this_); + break; + case attr_zoom_min: + attr_updated=(attr->u.num != this_->zoom_min); + this_->zoom_min=attr->u.num; + break; + case attr_zoom_max: + attr_updated=(attr->u.num != this_->zoom_max); + this_->zoom_max=attr->u.num; + break; + case attr_message: + navit_add_message(this_, attr->u.str); + break; + case attr_follow_cursor: + attr_updated=(this_->follow_cursor != !!attr->u.num); + this_->follow_cursor=!!attr->u.num; + break; + case attr_imperial: + attr_updated=(this_->imperial != attr->u.num); + this_->imperial=attr->u.num; + break; + default: + return 0; + } + if (attr_updated && !init) { + callback_list_call_attr_2(this_->attr_cbl, attr->type, this_, attr); + if (attr->type == attr_osd_configuration) + graphics_draw_mode(this_->gra, draw_mode_end); + } + return 1; +} + +int +navit_set_attr(struct navit *this_, struct attr *attr) +{ + return navit_set_attr_do(this_, attr, 0); +} + +int +navit_get_attr(struct navit *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + struct message *msg; + int len,offset; + int ret=1; + + switch (type) { + case attr_message: + msg = navit_get_messages(this_); + + if (!msg) { + return 0; + } + + len = 0; + while (msg) { + len += strlen(msg->text) + 1; + msg = msg->next; + } + attr->u.str = g_malloc(len + 1); + + msg = navit_get_messages(this_); + offset = 0; + while (msg) { + g_stpcpy((attr->u.str + offset), msg->text); + offset += strlen(msg->text); + attr->u.str[offset] = '\n'; + offset++; + + msg = msg->next; + } + + attr->u.str[len] = '\0'; + break; + case attr_imperial: + attr->u.num=this_->imperial; + break; + case attr_bookmark_map: + attr->u.map=bookmarks_get_map(this_->bookmarks); + break; + case attr_bookmarks: + attr->u.bookmarks=this_->bookmarks; + break; + case attr_callback_list: + attr->u.callback_list=this_->attr_cbl; + break; + case attr_destination: + if (! this_->destination_valid) + return 0; + attr->u.pcoord=&this_->destination; + break; + case attr_displaylist: + attr->u.displaylist=this_->displaylist; + return (attr->u.displaylist != NULL); + case attr_follow: + if (!this_->vehicle) + return 0; + attr->u.num=this_->vehicle->follow_curr; + break; + case attr_former_destination_map: + attr->u.map=this_->former_destination; + break; + case attr_graphics: + attr->u.graphics=this_->gra; + ret=(attr->u.graphics != NULL); + break; + case attr_gui: + attr->u.gui=this_->gui; + ret=(attr->u.gui != NULL); + break; + case attr_layout: + if (iter) { + if (iter->u.list) { + iter->u.list=g_list_next(iter->u.list); + } else { + iter->u.list=this_->layouts; + } + if (!iter->u.list) + return 0; + attr->u.layout=(struct layout *)iter->u.list->data; + } else { + attr->u.layout=this_->layout_current; + } + break; + case attr_map: + if (iter && this_->mapsets) { + if (!iter->u.mapset_handle) { + iter->u.mapset_handle=mapset_open((struct mapset *)this_->mapsets->data); + } + attr->u.map=mapset_next(iter->u.mapset_handle, 0); + if(!attr->u.map) { + mapset_close(iter->u.mapset_handle); + return 0; + } + } else { + return 0; + } + break; + case attr_mapset: + attr->u.mapset=this_->mapsets->data; + ret=(attr->u.mapset != NULL); + break; + case attr_navigation: + attr->u.navigation=this_->navigation; + break; + case attr_orientation: + attr->u.num=this_->orientation; + break; + case attr_osd: + ret=attr_generic_get_attr(this_->attr_list, NULL, type, attr, iter?(struct attr_iter *)&iter->iter:NULL); + break; + case attr_osd_configuration: + attr->u.num=this_->osd_configuration; + break; + case attr_pitch: + attr->u.num=transform_get_pitch(this_->trans); + break; + case attr_projection: + if(this_->trans) { + attr->u.num=transform_get_projection(this_->trans); + } else { + return 0; + } + break; + case attr_route: + attr->u.route=this_->route; + break; + case attr_speech: + attr->u.speech=this_->speech; + break; + case attr_tracking: + attr->u.num=this_->tracking_flag; + break; + case attr_trackingo: + attr->u.tracking=this_->tracking; + break; + case attr_transformation: + attr->u.transformation=this_->trans; + break; + case attr_vehicle: + if(iter) { + if(iter->u.list) { + iter->u.list=g_list_next(iter->u.list); + } else { + iter->u.list=this_->vehicles; + } + if(!iter->u.list) + return 0; + attr->u.vehicle=((struct navit_vehicle*)iter->u.list->data)->vehicle; + } else { + if(this_->vehicle) { + attr->u.vehicle=this_->vehicle->vehicle; + } else { + return 0; + } + } + break; + case attr_vehicleprofile: + attr->u.vehicleprofile=this_->vehicleprofile; + break; + case attr_zoom: + attr->u.num=transform_get_scale(this_->trans); + break; + case attr_autozoom_active: + attr->u.num=this_->autozoom_active; + break; + case attr_follow_cursor: + attr->u.num=this_->follow_cursor; + break; + default: + return 0; + } + attr->type=type; + return ret; +} + +static int +navit_add_log(struct navit *this_, struct log *log) +{ + struct attr type_attr; + if (!log_get_attr(log, attr_type, &type_attr, NULL)) + return 0; + if (!strcmp(type_attr.u.str, "textfile_debug")) { + char *header = "type=track_tracked\n"; + if (this_->textfile_debug_log) + return 0; + log_set_header(log, header, strlen(header)); + this_->textfile_debug_log=log; + return 1; + } + return 0; +} + +static int +navit_add_layout(struct navit *this_, struct layout *layout) +{ + struct attr active; + this_->layouts = g_list_append(this_->layouts, layout); + layout_get_attr(layout, attr_active, &active, NULL); + if(active.u.num || !this_->layout_current) { + this_->layout_current=layout; + return 1; + } + return 0; +} + +int +navit_add_attr(struct navit *this_, struct attr *attr) +{ + int ret=1; + switch (attr->type) { + case attr_callback: + navit_add_callback(this_, attr->u.callback); + break; + case attr_log: + ret=navit_add_log(this_, attr->u.log); + break; + case attr_gui: + ret=navit_set_gui(this_, attr->u.gui); + break; + case attr_graphics: + ret=navit_set_graphics(this_, attr->u.graphics); + break; + case attr_layout: + ret=navit_add_layout(this_, attr->u.layout); + break; + case attr_route: + this_->route=attr->u.route; + break; + case attr_mapset: + this_->mapsets = g_list_append(this_->mapsets, attr->u.mapset); + break; + case attr_navigation: + this_->navigation=attr->u.navigation; + break; + case attr_osd: + this_->attr_list=attr_generic_add_attr(this_->attr_list, attr); + break; + case attr_recent_dest: + this_->recentdest_count = attr->u.num; + break; + case attr_speech: + this_->speech=attr->u.speech; + break; + case attr_tracking: + this_->tracking=attr->u.tracking; + break; + case attr_vehicle: + ret=navit_add_vehicle(this_, attr->u.vehicle); + break; + case attr_vehicleprofile: + this_->vehicleprofiles=g_list_prepend(this_->vehicleprofiles, attr->u.vehicleprofile); + break; + case attr_autozoom_min: + this_->autozoom_min = attr->u.num; + break; + default: + return 0; + } + if (ret) + this_->attrs=attr_generic_add_attr(this_->attrs, attr); + callback_list_call_attr_2(this_->attr_cbl, attr->type, this_, attr); + return ret; +} + +int +navit_remove_attr(struct navit *this_, struct attr *attr) +{ + int ret=1; + switch (attr->type) { + case attr_callback: + navit_remove_callback(this_, attr->u.callback); + break; + case attr_vehicle: + this_->attrs=attr_generic_remove_attr(this_->attrs, attr); + return 1; + default: + return 0; + } + return ret; +} + +struct attr_iter * +navit_attr_iter_new(void) +{ + return g_new0(struct attr_iter, 1); +} + +void +navit_attr_iter_destroy(struct attr_iter *iter) +{ + g_free(iter); +} + +void +navit_add_callback(struct navit *this_, struct callback *cb) +{ + callback_list_add(this_->attr_cbl, cb); +} + +void +navit_remove_callback(struct navit *this_, struct callback *cb) +{ + callback_list_remove(this_->attr_cbl, cb); +} + +/** + * Toggle the cursor update : refresh the map each time the cursor has moved (instead of only when it reaches a border) + * + * @param navit The navit instance + * @returns nothing + */ + +static void +navit_vehicle_draw(struct navit *this_, struct navit_vehicle *nv, struct point *pnt) +{ + struct point cursor_pnt; + enum projection pro; + + if (this_->blocked) + return; + if (pnt) + cursor_pnt=*pnt; + else { + pro=transform_get_projection(this_->trans_cursor); + if (!pro) + return; + transform(this_->trans_cursor, pro, &nv->coord, &cursor_pnt, 1, 0, 0, NULL); + } + vehicle_draw(nv->vehicle, this_->gra, &cursor_pnt, pnt ? 0:1, nv->dir-transform_get_yaw(this_->trans_cursor), nv->speed); +#if 0 + if (pnt) + pnt2=*pnt; + else { + pro=transform_get_projection(this_->trans); + transform(this_->trans, pro, &nv->coord, &pnt2, 1); + } +#if 1 + cursor_draw(nv->cursor, &pnt2, nv->dir-transform_get_angle(this_->trans, 0), nv->speed > 2, pnt == NULL); +#else + cursor_draw(nv->cursor, &pnt2, nv->dir-transform_get_angle(this_->trans, 0), nv->speed > 2, 1); +#endif +#endif +} + +static void +navit_vehicle_update(struct navit *this_, struct navit_vehicle *nv) +{ + struct attr attr_valid, attr_dir, attr_speed, attr_pos; + struct pcoord cursor_pc; + struct point cursor_pnt, *pnt=&cursor_pnt; + struct tracking *tracking=NULL; + struct pcoord pc[16]; + enum projection pro=transform_get_projection(this_->trans_cursor); + int count; + int (*get_attr)(void *, enum attr_type, struct attr *, struct attr_iter *); + void *attr_object; + char *destination_file; + + profile(0,NULL); + if (this_->ready != 3) { + profile(0,"return 1\n"); + return; + } + navit_layout_switch(this_); + if (this_->vehicle == nv && this_->tracking_flag) + tracking=this_->tracking; + if (tracking) { + tracking_update(tracking, nv->vehicle, this_->vehicleprofile, pro); + attr_object=tracking; + get_attr=(int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))tracking_get_attr; + } else { + attr_object=nv->vehicle; + get_attr=(int (*)(void *, enum attr_type, struct attr *, struct attr_iter *))vehicle_get_attr; + } + if (get_attr(attr_object, attr_position_valid, &attr_valid, NULL)) + if (!attr_valid.u.num != attr_position_valid_invalid) + return; + if (! get_attr(attr_object, attr_position_direction, &attr_dir, NULL) || + ! get_attr(attr_object, attr_position_speed, &attr_speed, NULL) || + ! get_attr(attr_object, attr_position_coord_geo, &attr_pos, NULL)) { + profile(0,"return 2\n"); + return; + } + nv->dir=*attr_dir.u.numd; + nv->speed=*attr_speed.u.numd; + transform_from_geo(pro, attr_pos.u.coord_geo, &nv->coord); + if (nv != this_->vehicle) { + navit_vehicle_draw(this_, nv, NULL); + profile(0,"return 3\n"); + return; + } + cursor_pc.x = nv->coord.x; + cursor_pc.y = nv->coord.y; + cursor_pc.pro = pro; + if (this_->route) { + if (tracking) + route_set_position_from_tracking(this_->route, tracking, pro); + else + route_set_position(this_->route, &cursor_pc); + } + callback_list_call_attr_0(this_->attr_cbl, attr_position); + navit_textfile_debug_log(this_, "type=trackpoint_tracked"); + if (this_->gui && nv->speed > 2) + navit_disable_suspend(); + + transform(this_->trans_cursor, pro, &nv->coord, &cursor_pnt, 1, 0, 0, NULL); + if (this_->button_pressed != 1 && this_->follow_cursor && nv->follow_curr <= nv->follow && + (nv->follow_curr == 1 || !transform_within_border(this_->trans_cursor, &cursor_pnt, this_->border))) + navit_set_center_cursor_draw(this_); + else + navit_vehicle_draw(this_, nv, pnt); + + if (nv->follow_curr > 1) + nv->follow_curr--; + else + nv->follow_curr=nv->follow; + callback_list_call_attr_2(this_->attr_cbl, attr_position_coord_geo, this_, nv->vehicle); + + /* Finally, if we reached our destination, stop navigation. */ + if (this_->route) { + switch(route_destination_reached(this_->route)) { + case 1: + route_remove_waypoint(this_->route); + count=route_get_destinations(this_->route, pc, 16); + destination_file = bookmarks_get_destination_file(TRUE); + bookmarks_append_coord(this_->former_destination, destination_file, pc, type_former_itinerary_part, NULL, this_->recentdest_count); + break; + case 2: + navit_set_destination(this_, NULL, NULL, 0); + break; + } + } + profile(0,"return 5\n"); +} + +/** + * Set the position of the vehicle + * + * @param navit The navit instance + * @param c The coordinate to set as position + * @returns nothing + */ + +void +navit_set_position(struct navit *this_, struct pcoord *c) +{ + if (this_->route) { + route_set_position(this_->route, c); + callback_list_call_attr_0(this_->attr_cbl, attr_position); + } + if (this_->ready == 3) + navit_draw(this_); +} + +static int +navit_set_vehicleprofile(struct navit *this_, char *name) +{ + struct attr attr; + GList *l; + l=this_->vehicleprofiles; + while (l) { + if (vehicleprofile_get_attr(l->data, attr_name, &attr, NULL)) { + if (!strcmp(attr.u.str, name)) { + this_->vehicleprofile=l->data; + if (this_->route) + route_set_profile(this_->route, this_->vehicleprofile); + return 1; + } + } + l=g_list_next(l); + } + return 0; +} + +static void +navit_set_vehicle(struct navit *this_, struct navit_vehicle *nv) +{ + struct attr attr; + this_->vehicle=nv; + if (nv && vehicle_get_attr(nv->vehicle, attr_profilename, &attr, NULL)) { + if (navit_set_vehicleprofile(this_, attr.u.str)) + return; + } + if (!navit_set_vehicleprofile(this_,"car")) { + /* We do not have a fallback "car" profile + * so lets set any profile */ + GList *l; + l=this_->vehicleprofiles; + if (l) { + this_->vehicleprofile=l->data; + if (this_->route) + route_set_profile(this_->route, this_->vehicleprofile); + } + } +} + +/** + * Register a new vehicle + * + * @param navit The navit instance + * @param v The vehicle instance + * @returns 1 for success + */ +static int +navit_add_vehicle(struct navit *this_, struct vehicle *v) +{ + struct navit_vehicle *nv=g_new0(struct navit_vehicle, 1); + struct attr follow, active, animate; + nv->vehicle=v; + nv->follow=0; + nv->last.x = 0; + nv->last.y = 0; + nv->animate_cursor=0; + if ((vehicle_get_attr(v, attr_follow, &follow, NULL))) + nv->follow=follow.u.num; + nv->follow_curr=nv->follow; + this_->vehicles=g_list_append(this_->vehicles, nv); + if ((vehicle_get_attr(v, attr_active, &active, NULL)) && active.u.num) + navit_set_vehicle(this_, nv); + if ((vehicle_get_attr(v, attr_animate, &animate, NULL))) + nv->animate_cursor=animate.u.num; + nv->callback.type=attr_callback; + nv->callback.u.callback=callback_new_attr_2(callback_cast(navit_vehicle_update), attr_position_coord_geo, this_, nv); + vehicle_add_attr(nv->vehicle, &nv->callback); + vehicle_set_attr(nv->vehicle, &this_->self); + return 1; +} + + + + +struct gui * +navit_get_gui(struct navit *this_) +{ + return this_->gui; +} + +struct transformation * +navit_get_trans(struct navit *this_) +{ + return this_->trans; +} + +struct route * +navit_get_route(struct navit *this_) +{ + return this_->route; +} + +struct navigation * +navit_get_navigation(struct navit *this_) +{ + return this_->navigation; +} + +struct displaylist * +navit_get_displaylist(struct navit *this_) +{ + return this_->displaylist; +} + +void +navit_layout_switch(struct navit *n) +{ + + int currTs=0; + struct attr iso8601_attr,geo_attr,valid_attr,layout_attr; + double trise,tset,trise_actual; + struct layout *l; + int year, month, day; + + if (navit_get_attr(n,attr_layout,&layout_attr,NULL)!=1) { + return; //No layout - nothing to switch + } + if (!n->vehicle) + return; + l=layout_attr.u.layout; + + if (l->dayname || l->nightname) { + //Ok, we know that we have profile to switch + + //Check that we aren't calculating too fast + if (vehicle_get_attr(n->vehicle->vehicle, attr_position_time_iso8601,&iso8601_attr,NULL)==1) { + currTs=iso8601_to_secs(iso8601_attr.u.str); + dbg(1,"currTs: %u:%u\n",currTs%86400/3600,((currTs%86400)%3600)/60); + } + if (currTs-(n->prevTs)<60) { + //We've have to wait a little + return; + } + if (sscanf(iso8601_attr.u.str,"%d-%02d-%02dT",&year,&month,&day) != 3) + return; + if (vehicle_get_attr(n->vehicle->vehicle, attr_position_valid, &valid_attr,NULL) && valid_attr.u.num==attr_position_valid_invalid) { + return; //No valid fix yet + } + if (vehicle_get_attr(n->vehicle->vehicle, attr_position_coord_geo,&geo_attr,NULL)!=1) { + //No position - no sun + return; + } + + //We calculate sunrise anyway, cause it is needed both for day and for night + if (__sunriset__(year,month,day,geo_attr.u.coord_geo->lng,geo_attr.u.coord_geo->lat,-5,1,&trise,&tset)!=0) { + //near the pole sun never rises/sets, so we should never switch profiles + dbg(1,"trise: %u:%u, sun never visible, never switch profile\n",HOURS(trise),MINUTES(trise)); + n->prevTs=currTs; + return; + } + + trise_actual=trise; + dbg(1,"trise: %u:%u\n",HOURS(trise),MINUTES(trise)); + if (l->dayname) { + + if ((HOURS(trise)*60+MINUTES(trise)==(currTs%86400)/60) || + (n->prevTs==0 && ((HOURS(trise)*60+MINUTES(trise)<(currTs%86400)/60)))) { + //The sun is rising now! + if (strcmp(l->name,l->dayname)) { + navit_set_layout_by_name(n,l->dayname); + } + } + } + if (l->nightname) { + if (__sunriset__(year,month,day,geo_attr.u.coord_geo->lng,geo_attr.u.coord_geo->lat,-5,1,&trise,&tset)!=0) { + //near the pole sun never rises/sets, so we should never switch profiles + dbg(1,"tset: %u:%u, sun always visible, never switch profile\n",HOURS(tset),MINUTES(tset)); + n->prevTs=currTs; + return; + } + dbg(1,"tset: %u:%u\n",HOURS(tset),MINUTES(tset)); + if (HOURS(tset)*60+MINUTES(tset)==((currTs%86400)/60) + || (n->prevTs==0 && (((HOURS(tset)*60+MINUTES(tset)<(currTs%86400)/60)) || + ((HOURS(trise_actual)*60+MINUTES(trise_actual)>(currTs%86400)/60))))) { + //Time to sleep + if (strcmp(l->name,l->nightname)) { + navit_set_layout_by_name(n,l->nightname); + } + } + } + + n->prevTs=currTs; + } +} + +int +navit_set_vehicle_by_name(struct navit *n,const char *name) +{ + struct vehicle *v; + struct attr_iter *iter; + struct attr vehicle_attr, name_attr; + + iter=navit_attr_iter_new(); + + while (navit_get_attr(n,attr_vehicle,&vehicle_attr,iter)) { + v=vehicle_attr.u.vehicle; + vehicle_get_attr(v,attr_name,&name_attr,NULL); + if (name_attr.type==attr_name) { + if (!strcmp(name,name_attr.u.str)) { + navit_set_attr(n,&vehicle_attr); + navit_attr_iter_destroy(iter); + return 1; + } + } + } + navit_attr_iter_destroy(iter); + return 0; +} + +int +navit_set_layout_by_name(struct navit *n,const char *name) +{ + struct layout *l; + struct attr_iter iter; + struct attr layout_attr; + + iter.u.list=0x00; + + if (navit_get_attr(n,attr_layout,&layout_attr,&iter)!=1) { + return 0; //No layouts - nothing to do + } + if (iter.u.list==NULL) { + return 0; + } + + iter.u.list=g_list_first(iter.u.list); + + while(iter.u.list) { + l=(struct layout*)iter.u.list->data; + if (!strcmp(name,l->name)) { + layout_attr.u.layout=l; + layout_attr.type=attr_layout; + navit_set_attr(n,&layout_attr); + iter.u.list=g_list_first(iter.u.list); + return 1; + } + iter.u.list=g_list_next(iter.u.list); + } + + iter.u.list=g_list_first(iter.u.list); + return 0; +} + +void +navit_disable_suspend() { + gui_disable_suspend(global_navit->gui); + callback_list_call_attr_0(global_navit->attr_cbl,attr_unsuspend); +} + +int +navit_block(struct navit *this_, int block) +{ + if (block > 0) { + this_->blocked |= 1; + if (graphics_draw_cancel(this_->gra, this_->displaylist)) + this_->blocked |= 2; + return 0; + } + if ((this_->blocked & 2) || block < 0) { + this_->blocked=0; + navit_draw(this_); + return 1; + } + this_->blocked=0; + return 0; +} + +void +navit_destroy(struct navit *this_) +{ + struct mapset*ms; + callback_list_call_attr_1(this_->attr_cbl, attr_destroy, this_); + attr_list_free(this_->attrs); + if (this_->bookmarks) { + char *center_file = bookmarks_get_center_file(TRUE); + bookmarks_write_center_to_file(this_->bookmarks, center_file); + g_free(center_file); + bookmarks_destroy(this_->bookmarks); + } + + callback_destroy(this_->nav_speech_cb); + callback_destroy(this_->roadbook_callback); + callback_destroy(this_->popup_callback); + callback_destroy(this_->motion_timeout_callback); + callback_destroy(this_->progress_cb); + + if(this_->gra) { + graphics_remove_callback(this_->gra, this_->resize_callback); + graphics_remove_callback(this_->gra, this_->button_callback); + graphics_remove_callback(this_->gra, this_->motion_callback); + graphics_remove_callback(this_->gra, this_->predraw_callback); + } + + callback_destroy(this_->resize_callback); + callback_destroy(this_->motion_callback); + callback_destroy(this_->predraw_callback); + + callback_destroy(this_->route_cb); + route_destroy(this_->route); + + map_destroy(this_->former_destination); + + graphics_displaylist_destroy(this_->displaylist); + + ms = navit_get_mapset(this_); + if(ms) + mapset_destroy(ms); + + graphics_free(this_->gra); + + g_free(this_); +} + +struct navit * +navit_ref(struct navit *this_) +{ + this_->refcount++; + dbg(0,"refcount %d\n",this_->refcount); + return this_; +} + +void +navit_unref(struct navit *this_) +{ + this_->refcount--; + dbg(0,"refcount %d\n",this_->refcount); + if (this_->refcount <= 0) + navit_destroy(this_); +} + +struct object_func navit_func = { + attr_navit, + (object_func_new)navit_new, + (object_func_get_attr)navit_get_attr, + (object_func_iter_new)navit_attr_iter_new, + (object_func_iter_destroy)navit_attr_iter_destroy, + (object_func_set_attr)navit_set_attr, + (object_func_add_attr)navit_add_attr, + (object_func_remove_attr)navit_remove_attr, + (object_func_init)navit_init, + (object_func_destroy)navit_destroy, + (object_func_dup)NULL, + (object_func_ref)navit_ref, + (object_func_unref)navit_unref, +}; + +/** @} */ diff --git a/navit/navit.dtd b/navit/navit.dtd new file mode 100644 index 0000000..8bf09d3 --- /dev/null +++ b/navit/navit.dtd @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/navit.h b/navit/navit.h new file mode 100644 index 0000000..3bb5f5e --- /dev/null +++ b/navit/navit.h @@ -0,0 +1,123 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_NAVIT_H +#define NAVIT_NAVIT_H + +#ifdef __cplusplus +extern "C" { +#endif +extern struct gui *main_loop_gui; +// defined in glib.h. +#ifndef __G_LIST_H__ +struct _GList; +typedef struct _GList GList; +#endif + +/* prototypes */ +enum attr_type; +struct attr; +struct attr_iter; +struct callback; +struct coord_rect; +struct displaylist; +struct graphics; +struct gui; +struct mapset; +struct message; +struct navigation; +struct navit; +struct pcoord; +struct point; +struct route; +struct tracking; +struct transformation; +struct vehicleprofile; +struct command_table; +void navit_add_mapset(struct navit *this_, struct mapset *ms); +struct mapset *navit_get_mapset(struct navit *this_); +struct tracking *navit_get_tracking(struct navit *this_); +char *navit_get_user_data_directory(int create); +void navit_draw_async(struct navit *this_, int async); +void navit_draw(struct navit *this_); +int navit_get_ready(struct navit *this_); +void navit_draw_displaylist(struct navit *this_); +void navit_handle_resize(struct navit *this_, int w, int h); +int navit_get_width(struct navit *this_); +int navit_get_height(struct navit *this_); +int navit_ignore_button(struct navit *this_); +void navit_ignore_graphics_events(struct navit *this_, int ignore); +void navit_set_timeout(struct navit *this_); +int navit_handle_button(struct navit *this_, int pressed, int button, struct point *p, struct callback *popup_callback); +void navit_handle_motion(struct navit *this_, struct point *p); +void navit_zoom_in(struct navit *this_, int factor, struct point *p); +void navit_zoom_out(struct navit *this_, int factor, struct point *p); +void navit_zoom_in_cursor(struct navit *this_, int factor); +void navit_zoom_out_cursor(struct navit *this_, int factor); +struct navit *navit_new(struct attr *parent, struct attr **attrs); +void navit_add_message(struct navit *this_, char *message); +struct message *navit_get_messages(struct navit *this_); +struct graphics *navit_get_graphics(struct navit *this_); +struct vehicleprofile *navit_get_vehicleprofile(struct navit *this_); +GList *navit_get_vehicleprofiles(struct navit *this_); +void navit_set_destination(struct navit *this_, struct pcoord *c, const char *description, int async); +void navit_set_destinations(struct navit *this_, struct pcoord *c, int count, const char *description, int async); +int navit_check_route(struct navit *this_); +struct map* read_former_destinations_from_file(void); +void navit_textfile_debug_log(struct navit *this_, const char *fmt, ...); +void navit_textfile_debug_log_at(struct navit *this_, struct pcoord *pc, const char *fmt, ...); +int navit_speech_estimate(struct navit *this_, char *str); +void navit_say(struct navit *this_, char *text); +void navit_speak(struct navit *this_); +void navit_window_roadbook_destroy(struct navit *this_); +void navit_window_roadbook_new(struct navit *this_); +void navit_init(struct navit *this_); +void navit_zoom_to_rect(struct navit *this_, struct coord_rect *r); +void navit_zoom_to_route(struct navit *this_, int orientation); +void navit_set_center(struct navit *this_, struct pcoord *center, int set_timeout); +void navit_set_center_cursor(struct navit *this_, int autozoom, int keep_orientation); +void navit_set_center_screen(struct navit *this_, struct point *p, int set_timeout); +int navit_set_attr(struct navit *this_, struct attr *attr); +int navit_get_attr(struct navit *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); +int navit_add_attr(struct navit *this_, struct attr *attr); +int navit_remove_attr(struct navit *this_, struct attr *attr); +struct attr_iter *navit_attr_iter_new(void); +void navit_attr_iter_destroy(struct attr_iter *iter); +void navit_add_callback(struct navit *this_, struct callback *cb); +void navit_remove_callback(struct navit *this_, struct callback *cb); +void navit_set_position(struct navit *this_, struct pcoord *c); +struct gui *navit_get_gui(struct navit *this_); +struct transformation *navit_get_trans(struct navit *this_); +struct route *navit_get_route(struct navit *this_); +struct navigation *navit_get_navigation(struct navit *this_); +struct displaylist *navit_get_displaylist(struct navit *this_); +void navit_layout_switch(struct navit *n); +int navit_set_vehicle_by_name(struct navit *n, const char *name); +int navit_set_layout_by_name(struct navit *n, const char *name); +void navit_disable_suspend(void); +int navit_block(struct navit *this_, int block); +void navit_destroy(struct navit *this_); +void navit_command_add_table(struct navit*this_, struct command_table *commands, int count); +/* end of prototypes */ +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/navit/navit_nls.h b/navit/navit_nls.h new file mode 100644 index 0000000..560d871 --- /dev/null +++ b/navit/navit_nls.h @@ -0,0 +1,27 @@ +#ifndef __NAVIT_NLS_H__ +#include "config.h" + +#ifdef ENABLE_NLS +#ifdef USE_LIBGNUINTL +#include +#else +#include +#endif +#define _(STRING) gettext(STRING) +#define gettext_noop(String) String +#define _n(STRING) gettext_noop(STRING) +#else +#define _(STRING) STRING +#define _n(STRING) STRING +#define gettext(STRING) STRING +static inline const char *ngettext(const char *msgid, const char *msgid_plural, unsigned long int n) +{ + if (n == 1) { + return msgid; + } else { + return msgid_plural; + } +} +#endif +#define __NAVIT_NLS_H__ +#endif diff --git a/navit/navit_shipped.xml b/navit/navit_shipped.xml new file mode 100644 index 0000000..d38306f --- /dev/null +++ b/navit/navit_shipped.xml @@ -0,0 +1,6520 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main menu + + Actions + Show +Map + Settings + Tools + Route + About + + Actions + Bookmarks + Former +Destinations + + + Town + Quit + Stop +Navigation + + Settings + Display + Maps + Vehicle + Rules + + Display + Layout + Fullscreen + Window Mode + 3D + 2D + + Tools + Show Locale + + Route + Description + Height Profile + + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/obj_filter.c b/navit/obj_filter.c new file mode 100755 index 0000000..7166bcd --- /dev/null +++ b/navit/obj_filter.c @@ -0,0 +1,867 @@ + +#include +#include +#include +#include +#include +#include +#include "obj_filter.h" +#include "item.h" +#include "attr.h" +#include "xmlconfig.h" + +union result_t { + int res_int; + int res_bool; + char* res_str; +}; + +enum error_t {ERR_NONE=0, ERR_SYNTAX, ERR_UNKNOWN_ATTRIBUTE, ERR_INTERNAL, ERR_NONTERMINATED_STRING }; + +struct ctx { + char*expr; + union result_t res; + enum error_t error; + struct attr *navit_obj; + struct object_func *obj_func; +}; + +//prototypes +static int parse_numeric_expr(struct ctx*the_ctx); +static int parse_cond_expr(struct ctx*the_ctx); +static int parse_bool_expr(struct ctx*the_ctx); +static enum operator_t get_operator_by_symbol(char*sym); +static char* get_opstr_by_op(enum operator_t op); +static int whitespace_num(char*str); + +static char*next_sym_ptr; + +/* + * parses an input like osd[attr1==2 && attr2==3][2] or [attr1==2 && attr2==3] + * returns 0 on failure , returns the number of parsed characters on success + */ +int parse_obj_filter(const char*input, struct obj_filter_t* out) +{ + char *curr_ch, *itt, *expr; + out->idx = 0; //default idx + + //skip whitespaces + curr_ch = (char*)input; + while(isspace(*curr_ch)) {++curr_ch;} + + //parse attr type for the list(iterator) + itt = out->iterator_type; + if(isalpha(*curr_ch) || *curr_ch=='_') { + while(isalnum(*curr_ch) || *curr_ch=='_' ) { + *itt = *curr_ch; + ++itt; + ++curr_ch; + } + } + *itt = 0; + //skip whitespaces + while(isspace(*curr_ch)) {++curr_ch;} + //parse the filter expression (first section between[]), ignore [] chars between "" or '' + expr = out->filter_expr; + if(*curr_ch++ == '[') { + while (*curr_ch && *curr_ch!=']') { + *expr = *curr_ch; + ++expr; + ++curr_ch; + } + } else { + return 0; + } + *expr = 0; + if (*curr_ch==']') { + char*end1; + ++curr_ch; + //skip whitespaces + while(isspace(*curr_ch)) {++curr_ch;} + end1 = curr_ch; //possible end of expression if no idx specified + //parse the optional idx part (another part between [] contains numeric expreession(currently only constant numers are supported)) + if (*curr_ch=='[') { + char numstr[64]; + char*numch; + ++curr_ch; + //skip whitespaces + while(isspace(*curr_ch)) {++curr_ch;} + + numch = numstr; + while ('0'<=*curr_ch && *curr_ch<='9') { + *numch = *curr_ch; + ++numch; + ++curr_ch; + } + + //skip whitespaces + while(isspace(*curr_ch)) {++curr_ch;} + + if (*curr_ch==']') { + ++curr_ch; + *numch = 0; + out->idx = atoi(numstr); + return curr_ch-input; + } else { + return end1-input; + } + } else { + return end1-input; + } + } else { + return 0; + } +} + +struct attr* filter_object(struct attr* root,char*iter_type,char*expr, int idx) +{ + struct attr_iter *iter; + struct attr the_attr; + int curr_idx = 0; + struct object_func *obj_func_root; + struct object_func *obj_func_iter; + + if (!root || !iter_type || !expr) { + return NULL; + } + + obj_func_root = object_func_lookup(((struct attr*)root)->type); + obj_func_iter = object_func_lookup(attr_from_name(iter_type)); + if( !obj_func_root || !obj_func_root->get_attr || !obj_func_root->iter_new || !obj_func_root->iter_destroy || + !obj_func_iter || !obj_func_iter->get_attr ) { + return NULL; + } + + iter = obj_func_root->iter_new(NULL); + while ( obj_func_root->get_attr(root->u.data, attr_from_name(iter_type), &the_attr, iter ) ) { + struct ctx the_ctx; + the_ctx.expr = expr; + the_ctx.navit_obj = &the_attr; + the_ctx.obj_func = obj_func_iter; + if (parse_bool_expr(&the_ctx)) { + if(the_ctx.res.res_bool) { + if (curr_idx==idx) { + return attr_dup(&the_attr); + } + ++curr_idx; + } + } + } + obj_func_root->iter_destroy(iter); + + return NULL; +} + +enum operator_t {OP_NONE=0, OP_GT, OP_GE, OP_LT, OP_LE, OP_EQ, OP_NE, OP_LOGICAL_AND, OP_LOGICAL_OR, OP_LOGICAL_XOR, OP_ADD, OP_SUB, OP_MUL, OP_DIV, OP_MOD}; + +struct op_table_entry { + char*name; + enum operator_t op_type; +}; + +struct op_table_entry op_table[] = { + {"<" , OP_GT}, + {"<=", OP_GE}, + {">" , OP_LT}, + {">=", OP_LE}, + {"!=", OP_NE}, + {"==", OP_EQ}, + {"&&", OP_LOGICAL_AND}, + {"||", OP_LOGICAL_OR}, + {"^" , OP_LOGICAL_XOR}, + {"+" , OP_ADD}, + {"-" , OP_SUB}, + {"*" , OP_MUL}, + {"/" , OP_DIV}, + {"%" , OP_MOD}, + {NULL, OP_NONE} + }; + +static enum operator_t get_operator_by_symbol(char*sym) +{ + struct op_table_entry* ote = op_table; + while(sym && ote->name) { + if ( ! strcmp(ote->name, sym)) { + return ote->op_type; + } + ++ote; + } + return OP_NONE; +} + +static char* get_opstr_by_op(enum operator_t op) +{ + struct op_table_entry* ote = op_table; + while(ote->name) { + if ( ote->op_type == op ) { + return ote->name; + } + ++ote; + } + return NULL; +} + +/* +GRAMMAR + +ident = [ [A-Z,a-z][A-Z,a-z,0-9]+ + ] . + +number = [ [A-Z,a-z][A-Z,a-z,0-9]+ + ] . + +numeric_additive_expr = [ + | numeric_mul_operand numeric_mul_operator numeric_mul_expr + | numeric_add_operand numeric_add_operator numeric_add_expr + | "(" numeric_expr ")" + | numeric_operand + ] + +bool_expr = [ bool_expr bool_operator bool_operand + | "!" bool_operand + | bool_operand + ] + +cond_expr = [ + cond_operand cond_operator cond_operand + ] + +//TODO support precedence between additive and multiplicative operators (the order of +- and * / evaluation) + +numeric_multiplicative_operator = [ "*" "/" "%" + ] + +numeric_additive_operator = [ "+" "-" + ] + +bool_operator = [ "&&" "||" "^" + ] + +cond_operator = [ "==" "!=" "< "> "<=" ">=" + ] + +cond_operand = + [ ident + | number + | numeric_expr + ] . + +numeric_operand = + [ ident + | number + | "(" numeric_expr ")" + ] . + +bool_operand = + | "(" bool_expr ")" + | cond_expr + | "true" + | "false" + ] . +*/ + +static int whitespace_num(char*str) +{ + int ret = 0; + while(isspace(*str)) { + ++str; + ++ret; + } + return ret; +} + +static char * +get_op(char *expr, ...) +{ + char *op; + char *ret=NULL; + va_list ap; + + while (isspace(*expr)) { + expr++; + } + + va_start(ap, expr); + while ((op = va_arg(ap, char *))) { + if (!strncmp(expr, op, strlen(op))) { + ret = op; + break; + } + } + va_end(ap); + return ret; +} + +static int ident_length(char*input) +{ + int ret = 0; + if(input[0] != '@') { + return 0; + } + if(isalpha((int)input[1])) { + int ii; + ++ret; + for(ii=2 ; iiexpr; + char *sym; + enum operator_t op; + sym = get_op(input,"&&","||","^",NULL); + + op = get_operator_by_symbol(sym); + switch(op) { + case OP_LOGICAL_AND: + case OP_LOGICAL_OR: + case OP_LOGICAL_XOR: + return op; + break; + default: + return OP_NONE; + break; + }; +} + +static enum operator_t parse_cond_operator(struct ctx*the_ctx) +{ + char* input = the_ctx->expr; + char *sym; + enum operator_t op; + sym = get_op(input, "==", "<", ">", "<=", ">=", "!=", NULL); + + op = get_operator_by_symbol(sym); + switch(op) { + case OP_EQ: + case OP_GT: + case OP_LT: + case OP_GE: + case OP_LE: + case OP_NE: + return op; + break; + default: + return OP_NONE; + break; + }; +} + +static enum operator_t parse_numeric_multiplicative_operator(struct ctx*the_ctx) +{ + char* input = the_ctx->expr; + char *sym; + enum operator_t op; + sym = get_op(input, "*", "/", "%", NULL); + + op = get_operator_by_symbol(sym); + switch(op) { + case OP_MUL: + case OP_DIV: + case OP_MOD: + return op; + break; + default: + return OP_NONE; + break; + }; +} + +static enum operator_t parse_numeric_additive_operator(struct ctx*the_ctx) +{ + char* input = the_ctx->expr; + char *sym; + enum operator_t op; + sym = get_op(input, "+", "-", NULL); + + op = get_operator_by_symbol(sym); + switch(op) { + case OP_ADD: + case OP_SUB: + return op; + break; + default: + return OP_NONE; + break; + }; +} + +static int parse_string_operand(struct ctx*the_ctx) +{ + char* input = the_ctx->expr; + char sym[256]; + struct ctx sub_ctx; + int ilen; + sub_ctx.navit_obj = the_ctx->navit_obj; + sub_ctx.obj_func = the_ctx->obj_func; + + while(isspace(*input)) {++input;} + + if (*input == '"' || *input=='\'') { + char delimiter = *input; + char* psym = sym; + ++input; + while(*input != delimiter && *input!='\0') { + *psym = *input; + ++psym; + ++input; + } + if(*input=='\0') { + the_ctx->error = ERR_NONTERMINATED_STRING; + return 0; + } else { //terminating delimiter found + *psym = '\0'; + the_ctx->res.res_str = g_strdup(sym); + the_ctx->error = ERR_NONE; + next_sym_ptr = input + 1; + return 1; + } + } + + ilen = ident_length(input); + if(ilen) { + struct attr the_attr; + strncpy(sym,input+1,ilen); + sym[ilen] = '\0'; + if ( attr_from_name(sym)!=attr_none && the_ctx->obj_func->get_attr(the_ctx->navit_obj->u.data, attr_from_name(sym), &the_attr, NULL ) + && attr_type_string_begin<=the_attr.type && the_attr.type <= attr_type_string_end) { + the_ctx->res.res_str = g_strdup(the_attr.u.str); + the_ctx->error = ERR_NONE; + next_sym_ptr = input+ilen+1; + return 1; + } else { + the_ctx->error = ERR_UNKNOWN_ATTRIBUTE; + return 0; + } + } + + //currently we are not supporting string expressions (eg: concatenation) + /* + if(get_op(input,"(",NULL)) { + sub_ctx.expr = input + 1 + whitespace_num(input); + if ( ! parse_string_expr(&sub_ctx)) { + the_ctx->error = ERR_SYNTAX; + return 0; + } else { + the_ctx->res.res_int = sub_ctx.res.res_int; + the_ctx->error = ERR_NONE; + } + //expect ")" + if ( get_op(next_sym_ptr,")",NULL)) { + next_sym_ptr += 1 + whitespace_num(next_sym_ptr); + return 1; + } else { + the_ctx->res.res_int = 0; + the_ctx->error = ERR_SYNTAX; + return 0; + } + } + */ + return 0; +} + + +static int parse_numeric_operand(struct ctx*the_ctx) +{ + char* input = the_ctx->expr; + char sym[256]; + struct ctx sub_ctx; + char* endptr = NULL; + int res, ilen; + sub_ctx.navit_obj = the_ctx->navit_obj; + sub_ctx.obj_func = the_ctx->obj_func; + + res = strtol(input,&endptr,0); + if( endptr!=input ) { + the_ctx->res.res_int = res; + the_ctx->error = ERR_NONE; + next_sym_ptr = endptr; + return 1; + } + + while(isspace(*input)) {++input;} + ilen = ident_length(input); + if(ilen) { + //get int value from context object and set result member of context argument + struct attr the_attr; + strncpy(sym,input+1,ilen); + sym[ilen] = '\0'; + if ( attr_from_name(sym)!=attr_none && the_ctx->obj_func->get_attr(the_ctx->navit_obj->u.data, attr_from_name(sym), &the_attr, NULL ) + && attr_type_int_begin<=the_attr.type && the_attr.type <= attr_type_int_end) { //TODO support other numeric types + the_ctx->res.res_int = the_attr.u.num; + the_ctx->error = ERR_NONE; + next_sym_ptr = input+ilen+1; + return 1; + } else { + the_ctx->error = ERR_UNKNOWN_ATTRIBUTE; + return 0; + } + } + if(get_op(input,"(",NULL)) { + sub_ctx.expr = input + 1 + whitespace_num(input); + if ( ! parse_numeric_expr(&sub_ctx)) { + the_ctx->error = ERR_SYNTAX; + return 0; + } else { + the_ctx->res.res_int = sub_ctx.res.res_int; + the_ctx->error = ERR_NONE; + } + //expect ")" + if ( get_op(next_sym_ptr,")",NULL)) { + next_sym_ptr += 1 + whitespace_num(next_sym_ptr); + return 1; + } else { + the_ctx->res.res_int = 0; + the_ctx->error = ERR_SYNTAX; + return 0; + } + } + return 0; +} + +static int parse_cond_operand(struct ctx*the_ctx) +{ + char* input = the_ctx->expr; + char sym[256]; + char* endptr = NULL; + int res, ilen; + struct attr the_attr; + struct ctx sub_ctx; + sub_ctx.navit_obj = the_ctx->navit_obj; + sub_ctx.obj_func = the_ctx->obj_func; + sub_ctx.expr = input; + if(parse_numeric_expr(&sub_ctx)) { + the_ctx->res.res_int = sub_ctx.res.res_int; + the_ctx->error = ERR_NONE; + return 1; + } + + res = strtol(input,&endptr,0); + if( endptr!=input ) { + the_ctx->res.res_int = res; + the_ctx->error = ERR_NONE; + next_sym_ptr = endptr; + return 1; + } + while(isspace(*input)) {++input;} + ilen = ident_length(input); + strncpy(sym,input+1,ilen); + sym[ilen] = '\0'; + if ( attr_from_name(sym)!=attr_none && the_ctx->obj_func->get_attr(the_ctx->navit_obj->u.data, attr_from_name(sym), &the_attr, NULL ) + && attr_type_int_begin<=the_attr.type && the_attr.type <= attr_type_int_end) { //TODO support other numeric types + the_ctx->res.res_int = the_attr.u.num; + the_ctx->error = ERR_NONE; + next_sym_ptr = input+ilen+1; + return 1; + } else { + the_ctx->error = ERR_UNKNOWN_ATTRIBUTE; + return 0; + } + the_ctx->error = ERR_SYNTAX; + return 0; +} + +static int parse_bool_operand(struct ctx*the_ctx) +{ + char* input = the_ctx->expr; + struct ctx sub_ctx; + sub_ctx.navit_obj = the_ctx->navit_obj; + sub_ctx.obj_func = the_ctx->obj_func; + if(get_op(input,"true",NULL)) { + the_ctx->res.res_bool = 1; + the_ctx->error = ERR_NONE; + next_sym_ptr += whitespace_num(input)+strlen("true"); + return 1; + } + if(get_op(input,"false",NULL)) { + the_ctx->res.res_bool = 0; + the_ctx->error = ERR_NONE; + next_sym_ptr += whitespace_num(input)+strlen("false"); + return 1; + } + if(get_op(input,"(",NULL)) { + sub_ctx.expr = input + 1 + whitespace_num(input); + if ( ! parse_bool_expr(&sub_ctx)) { + the_ctx->error = ERR_SYNTAX; + return 0; + } else { + the_ctx->res.res_bool = sub_ctx.res.res_bool; + the_ctx->error = ERR_NONE; + } + //expect ")" + if(get_op(next_sym_ptr,"(",NULL)) { + next_sym_ptr += 1 + whitespace_num(next_sym_ptr); + return 1; + } else { + the_ctx->error = ERR_SYNTAX; + return 0; + } + } + //cond_expr + sub_ctx.expr = input; + if (parse_cond_expr(&sub_ctx)) { + the_ctx->res.res_bool = sub_ctx.res.res_bool; + the_ctx->error = ERR_NONE; + return 1; + } + the_ctx->error = ERR_SYNTAX; + return 0; +} + +static int parse_cond_expr(struct ctx*the_ctx) +{ + char* input = the_ctx->expr; + struct ctx sub_ctx; + sub_ctx.navit_obj = the_ctx->navit_obj; + sub_ctx.obj_func = the_ctx->obj_func; + sub_ctx.expr = input; + + + //expect cond operand + if(parse_cond_operand(&sub_ctx)) { + enum operator_t op; + int op1 = sub_ctx.res.res_int; + //expect cond operand + sub_ctx.expr = next_sym_ptr; + if( (op=parse_cond_operator(&sub_ctx)) ) { + next_sym_ptr += whitespace_num(next_sym_ptr) + strlen(get_opstr_by_op(op)); + sub_ctx.expr = next_sym_ptr; + if(parse_cond_operand(&sub_ctx)) { + int op2 = sub_ctx.res.res_int; + switch(op) { + case OP_EQ: + the_ctx->res.res_bool = op1==op2; + break; + case OP_GT: + the_ctx->res.res_bool = op1res.res_bool = op1>op2; + break; + case OP_GE: + the_ctx->res.res_bool = op1<=op2; + break; + case OP_LE: + the_ctx->res.res_bool = op1>=op2; + break; + case OP_NE: + the_ctx->res.res_bool = op1!=op2; + break; + default: + //unknown operator + the_ctx->error = ERR_INTERNAL; + return 0; + break; + }; + the_ctx->error = ERR_NONE; + return 1; + } + } + } + + + + //expect cond operand + if(parse_string_operand(&sub_ctx)) { + char* op1 = sub_ctx.res.res_str; + enum operator_t op; + + //expect cond operand + sub_ctx.expr = next_sym_ptr; + if( (op=parse_cond_operator(&sub_ctx)) ) { + next_sym_ptr += whitespace_num(next_sym_ptr) + strlen(get_opstr_by_op(op)); + sub_ctx.expr = next_sym_ptr; + if(parse_string_operand(&sub_ctx)) { + char* op2 = sub_ctx.res.res_str; + switch(op) { + case OP_EQ: + the_ctx->res.res_bool = !strcmp(op1,op2); + break; + case OP_GT: + the_ctx->res.res_bool = strcmp(op1,op2)<=0; + break; + case OP_LT: + the_ctx->res.res_bool = strcmp(op1,op2)>=0; + break; + case OP_GE: + the_ctx->res.res_bool = strcmp(op1,op2)<0; + break; + case OP_LE: + the_ctx->res.res_bool = strcmp(op1,op2)>0; + break; + case OP_NE: + the_ctx->res.res_bool = !!strcmp(op1,op2); + break; + default: + //unknown operator + the_ctx->error = ERR_INTERNAL; + return 0; + break; + }; + the_ctx->error = ERR_NONE; + return 1; + } + } + } + the_ctx->error = ERR_SYNTAX; + return 0; +} + +/* +numeric_expr = [ + | numeric_operand numeric_multiplicative_operator numeric_expr + | numeric_operand numeric_additive_operator numeric_expr + | "(" numeric_expr ")" + | numeric_operand + ] +*/ +static int parse_numeric_expr(struct ctx*the_ctx) +{ +char* input = the_ctx->expr; +struct ctx sub_ctx; +sub_ctx.navit_obj = the_ctx->navit_obj; +sub_ctx.obj_func = the_ctx->obj_func; +sub_ctx.expr = input; +if(parse_numeric_operand(&sub_ctx)) { + enum operator_t op; + int op1 = sub_ctx.res.res_int; + //expect numeric_multiplicative operator + sub_ctx.expr = next_sym_ptr; + if( (op=parse_numeric_multiplicative_operator(&sub_ctx)) ) { + next_sym_ptr += whitespace_num(next_sym_ptr) + strlen(get_opstr_by_op(op)); + sub_ctx.expr = next_sym_ptr; + if(parse_numeric_expr(&sub_ctx)) { + int op2 = sub_ctx.res.res_int; + switch(op) { + case OP_MUL: + the_ctx->res.res_int = op1*op2; + break; + case OP_DIV: + the_ctx->res.res_int = op1/op2; + break; + case OP_MOD: + the_ctx->res.res_int = op1%op2; + break; + default: + //unknown operator + the_ctx->error = ERR_INTERNAL; + return 0; + break; + }; + the_ctx->error = ERR_NONE; + return 1; + } + } +} + +sub_ctx.expr = input; +if(parse_numeric_operand(&sub_ctx)) { + //expect numeric_additive operator + enum operator_t op; + int op1 = sub_ctx.res.res_int; + sub_ctx.expr = next_sym_ptr; + if((op=parse_numeric_additive_operator(&sub_ctx))) { + next_sym_ptr += whitespace_num(next_sym_ptr) + strlen(get_opstr_by_op(op)); + sub_ctx.expr = next_sym_ptr; + if(parse_numeric_expr(&sub_ctx)) { + int op2 = sub_ctx.res.res_int; + switch(op) { + case OP_ADD: + the_ctx->res.res_int = op1+op2; + break; + case OP_SUB: + the_ctx->res.res_int = op1-op2; + break; + default: + //unknown operator + the_ctx->error = ERR_INTERNAL; + return 0; + break; + }; + the_ctx->error = ERR_NONE; + return 1; + } + } +} + +sub_ctx.expr = input; +if(parse_numeric_operand(&sub_ctx) ) { + the_ctx->res.res_int = sub_ctx.res.res_int; + the_ctx->error = ERR_NONE; + return 1; +} + the_ctx->error = ERR_SYNTAX; + return 0; +} + +/* +bool_expr = [ bool_operand bool_operator bool_expr + | bool_operand + ] +*/ +static int parse_bool_expr(struct ctx*the_ctx) +{ + char* input = the_ctx->expr; + struct ctx sub_ctx; + sub_ctx.navit_obj = the_ctx->navit_obj; + sub_ctx.obj_func = the_ctx->obj_func; + sub_ctx.expr = input; + if(parse_bool_operand(&sub_ctx)) { + enum operator_t op; + int op1 = sub_ctx.res.res_bool; + //expect bool operator + sub_ctx.expr = next_sym_ptr; + if((op=parse_bool_operator(&sub_ctx))) { + next_sym_ptr += whitespace_num(next_sym_ptr) + strlen(get_opstr_by_op(op)); + sub_ctx.expr = next_sym_ptr; + if(parse_bool_expr(&sub_ctx)) { + int op2 = sub_ctx.res.res_bool; + switch(op) { + case OP_LOGICAL_AND: + the_ctx->res.res_bool = op1 && op2; + break; + case OP_LOGICAL_OR: + the_ctx->res.res_bool = op1 || op2; + break; + case OP_LOGICAL_XOR: + the_ctx->res.res_bool = op1 ^ op2; + break; + default: + //unknown operator + the_ctx->error = ERR_INTERNAL; + return 0; + break; + }; + return 1; + } + } + } + + if(get_op(input,"!",NULL)) { + next_sym_ptr += 1 + whitespace_num(input); + sub_ctx.expr = next_sym_ptr; + if(parse_bool_expr(&sub_ctx)) { + the_ctx->res.res_bool = ! sub_ctx.res.res_bool; + the_ctx->error = ERR_NONE; + return 1; + } + } + sub_ctx.expr = input; + if(parse_bool_operand(&sub_ctx) ) { + the_ctx->res.res_bool = sub_ctx.res.res_bool; + the_ctx->error = ERR_NONE; + return 1; + } + the_ctx->error = ERR_SYNTAX; + return 0; +} + diff --git a/navit/obj_filter.h b/navit/obj_filter.h new file mode 100644 index 0000000..9e8dcae --- /dev/null +++ b/navit/obj_filter.h @@ -0,0 +1,23 @@ + +#ifndef OBJ_FILTER +#define OBJ_FILTER + +//forward declaration +struct attr; + +struct obj_filter_t { + char iterator_type[64]; + char filter_expr[256]; + int idx; +}; + +struct obj_list { + struct navit_object* objs; + int size; +}; + +int parse_obj_filter(const char*input, struct obj_filter_t* out); +struct attr* filter_object(struct attr* root,char*iter_type,char*expr, int idx); + +#endif + diff --git a/navit/osd.c b/navit/osd.c new file mode 100644 index 0000000..8c0e378 --- /dev/null +++ b/navit/osd.c @@ -0,0 +1,369 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include "debug.h" +#include "plugin.h" +#include "item.h" +#include "color.h" +#include "point.h" +#include "navit.h" +#include "graphics.h" +#include "command.h" +#include "callback.h" +#include "osd.h" + + +struct osd { + struct osd_methods meth; + struct osd_priv *priv; + struct attr** osd_attrs; +}; + +struct osd * +osd_new(struct attr *parent, struct attr **attrs) +{ + struct attr *attr; + struct osd *o; + struct osd_priv *(*new)(struct navit *nav, struct osd_methods *meth, struct attr **attrs); + struct attr *type=attr_search(attrs, NULL, attr_type); + + if (! type) + return NULL; + new=plugin_get_osd_type(type->u.str); + if (! new) + return NULL; + o=g_new0(struct osd, 1); + o->priv=new(parent->u.navit, &o->meth, attrs); + + o->osd_attrs = attr_list_dup(attrs); + + return o; +} + +int +osd_get_attr(struct osd *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + return attr_generic_get_attr(this_->osd_attrs, NULL, type, attr, NULL); +} + +int +osd_set_attr(struct osd *osd, struct attr* attr) +{ + osd->osd_attrs=attr_generic_set_attr(osd->osd_attrs,attr); + if(osd && osd->meth.set_attr) { + osd->meth.set_attr(osd->priv, attr); + return 1; + } + return 0; +} + +void +osd_wrap_point(struct point *p, struct navit *nav) +{ + if (p->x < 0) + p->x += navit_get_width(nav); + if (p->y < 0) + p->y += navit_get_height(nav); + +} + +static void +osd_evaluate_command(struct osd_item *this, struct navit *nav) +{ + struct attr navit; + navit.type=attr_navit; + navit.u.navit=nav; + dbg(0, "calling command '%s'\n", this->command); + command_evaluate(&navit, this->command); +} + +void +osd_std_click(struct osd_item *this, struct navit *nav, int pressed, int button, struct point *p) +{ + struct point bp = this->p; + if (!this->command || !this->command[0]) + return; + osd_wrap_point(&bp, nav); + if ((p->x < bp.x || p->y < bp.y || p->x > bp.x + this->w || p->y > bp.y + this->h || !this->configured) && !this->pressed) + return; + if (button != 1) + return; + if (!!pressed == !!this->pressed) + return; + if (navit_ignore_button(nav)) + return; + this->pressed = pressed; + if (pressed && this->command) + osd_evaluate_command(this, nav); +} + +void +osd_std_resize(struct osd_item *item) +{ + graphics_overlay_resize(item->gr, &item->p, item->w, item->h, 65535, 1); +} + +static void +osd_std_calculate_sizes(struct osd_item *item, struct osd_priv *priv, int w, int h) +{ + struct attr vehicle_attr; + + if (item->rel_w) { + item->w = (item->rel_w * w) / 100; + } + + if (item->rel_h) { + item->h = (item->rel_h * h) / 100; + } + + if (item->rel_x) { + item->p.x = (item->rel_x * w) / 100; + } + + if (item->rel_y) { + item->p.y = (item->rel_y * h) / 100; + } + + osd_std_resize(item); + if (item->meth.draw) { + if (navit_get_attr(item->navit, attr_vehicle, &vehicle_attr, NULL)) { + item->meth.draw(priv, item->navit, vehicle_attr.u.vehicle); + } + } +} + +static void +osd_std_keypress(struct osd_item *item, struct navit *nav, char *key) +{ +#if 0 + int i; + dbg(0,"key=%s\n",key); + for (i = 0 ; i < strlen(key) ; i++) { + dbg(0,"key:0x%02x\n",key[i]); + } + for (i = 0 ; i < strlen(item->accesskey) ; i++) { + dbg(0,"accesskey:0x%02x\n",item->accesskey[i]); + } +#endif + if ( ! graphics_is_disabled(item->gr) && item->accesskey && key && !strcmp(key, item->accesskey)) + osd_evaluate_command(item, nav); +} + +static void +osd_std_reconfigure(struct osd_item *item, struct command_saved *cs) +{ + if (!command_saved_error(cs)) { + graphics_overlay_disable(item->gr, !command_saved_get_int(cs)); + } else { + dbg(0, "Error in saved command: %i\n", command_saved_error(cs)); + } +} + +void +osd_set_std_attr(struct attr **attrs, struct osd_item *item, int flags) +{ + struct attr *attr; + + item->flags=flags; + item->osd_configuration=-1; + item->color_white.r = 0xffff; + item->color_white.g = 0xffff; + item->color_white.b = 0xffff; + item->color_white.a = 0xffff; + item->text_color.r = 0xffff; + item->text_color.g = 0xffff; + item->text_color.b = 0xffff; + item->text_color.a = 0xffff; + if (flags & 1) { + item->color_bg.r = 0x0808; + item->color_bg.g = 0x0808; + item->color_bg.b = 0xf8f8; + item->color_bg.a = 0x0000; + } else { + item->color_bg.r = 0x0; + item->color_bg.g = 0x0; + item->color_bg.b = 0x0; + item->color_bg.a = 0x5fff; + } + + attr=attr_search(attrs, NULL, attr_osd_configuration); + if (attr) + item->osd_configuration = attr->u.num; + + attr=attr_search(attrs, NULL, attr_enable_expression); + if (attr) { + item->enable_cs = command_saved_new(attr->u.str, item->navit, NULL); + } + + attr = attr_search(attrs, NULL, attr_w); + if (attr) { + if (attr->u.num > ATTR_REL_MAXABS) { + item->rel_w = attr->u.num - ATTR_REL_RELSHIFT; + } else { + item->rel_w = 0; + item->w = attr->u.num; + } + } + + attr = attr_search(attrs, NULL, attr_h); + if (attr) { + if (attr->u.num > ATTR_REL_MAXABS) { + item->rel_h = attr->u.num - ATTR_REL_RELSHIFT; + } else { + item->rel_h = 0; + item->h = attr->u.num; + } + } + + attr = attr_search(attrs, NULL, attr_x); + if (attr) { + if (attr->u.num > ATTR_REL_MAXABS) { + item->rel_x = attr->u.num - ATTR_REL_RELSHIFT; + } else { + item->rel_x = 0; + item->p.x = attr->u.num; + } + } + + attr = attr_search(attrs, NULL, attr_y); + if (attr) { + if (attr->u.num > ATTR_REL_MAXABS) { + item->rel_y = attr->u.num - ATTR_REL_RELSHIFT; + } else { + item->rel_y = 0; + item->p.y = attr->u.num; + } + } + + attr = attr_search(attrs, NULL, attr_font_size); + if (attr) + item->font_size = attr->u.num; + + attr=attr_search(attrs, NULL, attr_background_color); + if (attr) + item->color_bg=*attr->u.color; + attr = attr_search(attrs, NULL, attr_command); + if (attr) + item->command = g_strdup(attr->u.str); + attr=attr_search(attrs, NULL, attr_text_color); + if (attr) + item->text_color=*attr->u.color; + attr=attr_search(attrs, NULL, attr_flags); + if (attr) + item->attr_flags=attr->u.num; + attr=attr_search(attrs, NULL, attr_accesskey); + if (attr) + item->accesskey = g_strdup(attr->u.str); + attr=attr_search(attrs, NULL, attr_font); + if (attr) + item->font_name = g_strdup(attr->u.str); + +} +void +osd_std_config(struct osd_item *item, struct navit *navit) +{ + struct attr attr; + dbg(1,"enter\n"); + if (item->enable_cs) { + item->reconfig_cb = callback_new_1(callback_cast(osd_std_reconfigure), item); + command_saved_set_cb(item->enable_cs, item->reconfig_cb); + + if (!command_saved_error(item->enable_cs)) { + item->configured = !! command_saved_get_int(item->enable_cs); + } else { + dbg(0, "Error in saved command: %i.\n", command_saved_error(item->enable_cs)); + } + } else { + if (!navit_get_attr(navit, attr_osd_configuration, &attr, NULL)) + attr.u.num=-1; + item->configured = !!(attr.u.num & item->osd_configuration); + } + if (item->gr && !(item->flags & 16)) + graphics_overlay_disable(item->gr, !item->configured); +} + +void +osd_set_std_config(struct navit *nav, struct osd_item *item) +{ + item->cb = callback_new_attr_2(callback_cast(osd_std_config), attr_osd_configuration, item, nav); + navit_add_callback(nav, item->cb); + osd_std_config(item, nav); +} + +void +osd_set_std_graphic(struct navit *nav, struct osd_item *item, struct osd_priv *priv) +{ + struct graphics *navit_gr; + + navit_gr = navit_get_graphics(nav); + item->gr = graphics_overlay_new(navit_gr, &item->p, item->w, item->h, 65535, 1); + + item->graphic_bg = graphics_gc_new(item->gr); + graphics_gc_set_foreground(item->graphic_bg, &item->color_bg); + graphics_background_gc(item->gr, item->graphic_bg); + + item->graphic_fg_white = graphics_gc_new(item->gr); + graphics_gc_set_foreground(item->graphic_fg_white, &item->color_white); + + if (item->flags & 2) { + item->font = graphics_named_font_new(item->gr, item->font_name, item->font_size, 1); + item->graphic_fg_text = graphics_gc_new(item->gr); + graphics_gc_set_foreground(item->graphic_fg_text, &item->text_color); + } + + osd_set_std_config(nav, item); + + item->resize_cb = callback_new_attr_2(callback_cast(osd_std_calculate_sizes), attr_resize, item, priv); + graphics_add_callback(navit_gr, item->resize_cb); + dbg(0,"accesskey %s\n",item->accesskey); + if (item->accesskey) { + item->keypress_cb=callback_new_attr_2(callback_cast(osd_std_keypress), attr_keypress, item, nav); + graphics_add_callback(navit_gr, item->keypress_cb); + } + +} + +void +osd_std_draw(struct osd_item *item) +{ + struct point p[2]; + int flags=item->attr_flags; + + graphics_draw_mode(item->gr, draw_mode_begin); + p[0].x=0; + p[0].y=0; + graphics_draw_rectangle(item->gr, item->graphic_bg, p, item->w, item->h); + p[1].x=item->w-1; + p[1].y=0; + if (flags & 1) + graphics_draw_lines(item->gr, item->graphic_fg_text, p, 2); + p[0].x=item->w-1; + p[0].y=item->h-1; + if (flags & 2) + graphics_draw_lines(item->gr, item->graphic_fg_text, p, 2); + p[1].x=0; + p[1].y=item->h-1; + if (flags & 4) + graphics_draw_lines(item->gr, item->graphic_fg_text, p, 2); + p[0].x=0; + p[0].y=0; + if (flags & 8) + graphics_draw_lines(item->gr, item->graphic_fg_text, p, 2); +} diff --git a/navit/osd.h b/navit/osd.h new file mode 100644 index 0000000..45eabd7 --- /dev/null +++ b/navit/osd.h @@ -0,0 +1,76 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_OSD_H +#define NAVIT_OSD_H + +struct osd_priv; +struct attr; + +struct osd_methods { + void (*osd_destroy)(struct osd_priv *osd); + void (*set_attr)(struct osd_priv *osd, struct attr* attr); +}; + +#define osd_draw_cast(x) (void (*)(struct osd_priv *osd, struct navit *navit, struct vehicle *v))(x) + +struct osd_item_methods { + void (*draw)(struct osd_priv *osd, struct navit *navit, struct vehicle *v); +}; + +struct osd_item { + struct point p; + struct osd_item_methods meth; + int flags, attr_flags, w, h, fg_line_width, font_size, osd_configuration, configured; + int rel_w, rel_h, rel_x, rel_y; + struct color color_bg, color_white, text_color; + struct navit *navit; + struct graphics *gr; + struct graphics_gc *graphic_bg, *graphic_fg_white, *graphic_fg_text; + struct graphics_font *font; + char *font_name; + struct callback *cb; + struct callback *resize_cb; + struct callback *reconfig_cb; + struct callback *keypress_cb; + int pressed; + char *command; + struct command_saved *enable_cs; + char *accesskey; +}; + +/* prototypes */ +struct attr; +struct navit; +struct osd; +struct osd *osd_new(struct attr *parent, struct attr **attrs); +void osd_wrap_point(struct point *p, struct navit *nav); +void osd_std_click(struct osd_item *this, struct navit *nav, int pressed, int button, struct point *p); +void osd_set_std_attr(struct attr **attrs, struct osd_item *item, int flags); +void osd_std_config(struct osd_item *item, struct navit *navit); +void osd_set_std_config(struct navit *nav, struct osd_item *item); +void osd_set_std_graphic(struct navit *nav, struct osd_item *item, struct osd_priv *priv); +void osd_std_resize(struct osd_item *item); +void osd_std_draw(struct osd_item *item); +int osd_set_attr(struct osd *osd, struct attr* attr); +int osd_get_attr(struct osd *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); +/* end of prototypes */ + +#endif + diff --git a/navit/osd/Makefile.am b/navit/osd/Makefile.am new file mode 100644 index 0000000..f14eff6 --- /dev/null +++ b/navit/osd/Makefile.am @@ -0,0 +1,6 @@ +SUBDIRS= +DIST_SUBDIRS=core + +if OSD_CORE + SUBDIRS+=core +endif diff --git a/navit/osd/Makefile.in b/navit/osd/Makefile.in new file mode 100644 index 0000000..40a0c49 --- /dev/null +++ b/navit/osd/Makefile.in @@ -0,0 +1,709 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@OSD_CORE_TRUE@am__append_1 = core +subdir = navit/osd +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = $(am__append_1) +DIST_SUBDIRS = core +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/osd/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/osd/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/osd/core/Makefile.am b/navit/osd/core/Makefile.am new file mode 100644 index 0000000..10f17f8 --- /dev/null +++ b/navit/osd/core/Makefile.am @@ -0,0 +1,10 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=osd_core +if PLUGINS + moduleosd_LTLIBRARIES = libosd_core.la +else + noinst_LTLIBRARIES = libosd_core.la +endif +libosd_core_la_SOURCES = osd_core.c +libosd_core_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ + diff --git a/navit/osd/core/Makefile.in b/navit/osd/core/Makefile.in new file mode 100644 index 0000000..0030833 --- /dev/null +++ b/navit/osd/core/Makefile.in @@ -0,0 +1,703 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/osd/core +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(moduleosddir)" +LTLIBRARIES = $(moduleosd_LTLIBRARIES) $(noinst_LTLIBRARIES) +libosd_core_la_LIBADD = +am_libosd_core_la_OBJECTS = osd_core.lo +libosd_core_la_OBJECTS = $(am_libosd_core_la_OBJECTS) +libosd_core_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libosd_core_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libosd_core_la_rpath = +@PLUGINS_TRUE@am_libosd_core_la_rpath = -rpath $(moduleosddir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libosd_core_la_SOURCES) +DIST_SOURCES = $(libosd_core_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=osd_core +@PLUGINS_TRUE@moduleosd_LTLIBRARIES = libosd_core.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libosd_core.la +libosd_core_la_SOURCES = osd_core.c +libosd_core_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/osd/core/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/osd/core/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-moduleosdLTLIBRARIES: $(moduleosd_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(moduleosddir)" || $(MKDIR_P) "$(DESTDIR)$(moduleosddir)" + @list='$(moduleosd_LTLIBRARIES)'; test -n "$(moduleosddir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(moduleosddir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(moduleosddir)"; \ + } + +uninstall-moduleosdLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(moduleosd_LTLIBRARIES)'; test -n "$(moduleosddir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(moduleosddir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(moduleosddir)/$$f"; \ + done + +clean-moduleosdLTLIBRARIES: + -test -z "$(moduleosd_LTLIBRARIES)" || rm -f $(moduleosd_LTLIBRARIES) + @list='$(moduleosd_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libosd_core.la: $(libosd_core_la_OBJECTS) $(libosd_core_la_DEPENDENCIES) + $(libosd_core_la_LINK) $(am_libosd_core_la_rpath) $(libosd_core_la_OBJECTS) $(libosd_core_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osd_core.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(moduleosddir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-moduleosdLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-moduleosdLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-moduleosdLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-moduleosdLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-moduleosdLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-moduleosdLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/osd/core/osd_core.c b/navit/osd/core/osd_core.c new file mode 100644 index 0000000..b27164c --- /dev/null +++ b/navit/osd/core/osd_core.c @@ -0,0 +1,3589 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include "config.h" +#ifdef _MSC_VER +#define _USE_MATH_DEFINES 1 +#endif /* _MSC_VER */ +#include +#include +#include +#include +#include +#ifdef HAVE_SYS_TIME_H +#include +#endif +#include +#include "item.h" +#include "point.h" +#include "coord.h" +#include "graphics.h" +#include "transform.h" +#include "route.h" +#include "navit.h" +#include "plugin.h" +#include "debug.h" +#include "callback.h" +#include "color.h" +#include "vehicle.h" +#include "navigation.h" +#include "track.h" +#include "map.h" +#include "file.h" +#include "attr.h" +#include "command.h" +#include "navit_nls.h" +#include "messages.h" +#include "vehicleprofile.h" +#include "roadprofile.h" +#include "osd.h" +#include "speech.h" +#include "event.h" +#include "mapset.h" +#include "util.h" + +#ifdef HAVE_API_WIN32_CE +#include "libc.h" +#endif + +#ifdef _MSC_VER +static double round(double x) +{ + if (x >= 0.0) + return floor(x + 0.5); + else + return ceil(x - 0.5); +} +#endif /* MSC_VER */ + +struct osd_priv_common { + struct osd_item osd_item; + struct osd_priv *data; + int (*spec_set_attr_func)(struct osd_priv_common *opc, struct attr* attr); +}; + +struct odometer; + +int set_std_osd_attr(struct osd_priv_common*opc, struct attr*the_attr); +static void osd_odometer_reset(struct osd_priv_common *opc); +static void osd_cmd_odometer_reset(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid); +static void osd_odometer_draw(struct osd_priv_common *opc, struct navit *nav, struct vehicle *v); +static struct osd_text_item * oti_new(struct osd_text_item * parent); +int osd_button_set_attr(struct osd_priv_common *opc, struct attr* attr); + +static int b_commandtable_added = 0; + + +struct compass { + int width; + struct graphics_gc *green; +}; + +static void +transform_rotate(struct point *center, int angle, struct point *p, + int count) +{ + int i, x, y; + double dx, dy; + for (i = 0; i < count; i++) { + dx = sin(M_PI * angle / 180.0); + dy = cos(M_PI * angle / 180.0); + x = dy * p->x - dx * p->y; + y = dx * p->x + dy * p->y; + + p->x = center->x + x; + p->y = center->y + y; + p++; + } +} + +static void +handle(struct graphics *gr, struct graphics_gc *gc, struct point *p, int r, + int dir) +{ + struct point ph[3]; + int l = r * 0.4; + + ph[0].x = 0; + ph[0].y = r; + ph[1].x = 0; + ph[1].y = -r; + transform_rotate(p, dir, ph, 2); + graphics_draw_lines(gr, gc, ph, 2); + ph[0].x = -l; + ph[0].y = -r + l; + ph[1].x = 0; + ph[1].y = -r; + ph[2].x = l; + ph[2].y = -r + l; + transform_rotate(p, dir, ph, 3); + graphics_draw_lines(gr, gc, ph, 3); +} + +/** + * * Format distance, choosing the unit (m or km) and precision depending on distance + * * + * * @param distance distance in meters + * * @param sep separator character to be inserted between distance value and unit + * * @returns a pointer to a string containing the formatted distance + * */ +static char * +format_distance(double distance, char *sep, int imperial) +{ + if (imperial){ + distance *= FEET_PER_METER; + if(distance <= 1500){ + return g_strdup_printf("%.0f%sft", round(distance / 10) * 10, sep); + } else { + return g_strdup_printf("%.1f%smi", distance / FEET_PER_MILE, sep); + } + } else { + if (distance >= 100000) + return g_strdup_printf("%.0f%skm", distance / 1000, sep); + else if (distance >= 10000) + return g_strdup_printf("%.1f%skm", distance / 1000, sep); + else if (distance >= 300) + return g_strdup_printf("%.0f%sm", round(distance / 25) * 25, sep); + else if (distance >= 50) + return g_strdup_printf("%.0f%sm", round(distance / 10) * 10, sep); + else if (distance >= 10) + return g_strdup_printf("%.0f%sm", distance, sep); + else + return g_strdup_printf("%.1f%sm", distance, sep); + } +} + +/** + * * Format time (duration) + * * + * * @param tm pointer to a tm structure specifying the time + * * @param days days + * * @returns a pointer to a string containing the formatted time + * */ +static char * +format_time(struct tm *tm, int days) +{ + if (days) + return g_strdup_printf("%d+%02d:%02d", days, tm->tm_hour, tm->tm_min); + else + return g_strdup_printf("%02d:%02d", tm->tm_hour, tm->tm_min); +} + +/** + * * Format speed in km/h + * * + * * @param speed speed in km/h + * * @param sep separator character to be inserted between speed value and unit + * * @returns a pointer to a string containing the formatted speed + * */ +static char * +format_speed(double speed, char *sep, char *format, int imperial) +{ + char *unit="km/h"; + if (imperial) { + speed = speed*1000*FEET_PER_METER/FEET_PER_MILE; + unit="mph"; + } + if (!format || !strcmp(format,"named")) + return g_strdup_printf("%.0f%s%s", speed, sep, unit); + else if (!strcmp(format,"value") || !strcmp(format,"unit")) { + if (!strcmp(format,"value")) + return g_strdup_printf("%.0f", speed); + else + return g_strdup(unit); + } + return g_strdup(""); +} + +static char * +format_float_0(double num) +{ + return g_strdup_printf("%.0f", num); +} + +int set_std_osd_attr(struct osd_priv_common*opc, struct attr*the_attr) +{ + if(opc && the_attr && ATTR_IS_INT(the_attr->type)) { + if(attr_w == the_attr->type) { + opc->osd_item.w = the_attr->u.num; + if(opc->osd_item.gr) { + osd_std_resize(&opc->osd_item); + return 1; + } + } + else if(attr_h == the_attr->type) { + opc->osd_item.h = the_attr->u.num; + if(opc->osd_item.gr) { + osd_std_resize(&opc->osd_item); + return 1; + } + } + else if(attr_x == the_attr->type) { + opc->osd_item.p.x = the_attr->u.num; + if(opc->osd_item.gr) { + osd_std_resize(&opc->osd_item); + return 1; + } + } + else if(attr_y == the_attr->type) { + opc->osd_item.p.y = the_attr->u.num; + if(opc->osd_item.gr) { + osd_std_resize(&opc->osd_item); + return 1; + } + } + else if(attr_font_size == the_attr->type) { + opc->osd_item.font_size = the_attr->u.num; + if(opc->osd_item.gr) { + osd_std_resize(&opc->osd_item); + return 1; + } + } + } + if(opc->spec_set_attr_func) { + opc->spec_set_attr_func(opc, the_attr); + } + return 0; +} + + +struct route_guard { + int coord_num; + struct coord *coords; + double min_dist; //distance treshold, exceeding this distance will trigger announcement + double max_dist; //out of range distance, farther than this distance no warning will be given + char*item_name; + char*map_name; + int warned; + double last_time; + int update_period; + struct color active_color; + struct graphics_gc *red; + struct graphics_gc *white; + int width; +}; + +static void osd_route_guard_draw(struct osd_priv_common *opc, struct navit *nav, struct vehicle *v) +{ + int i=0; + struct vehicle* curr_vehicle = v; + struct attr position_attr, vehicle_attr, imperial_attr; + struct coord curr_coord; + struct route_guard *this = (struct route_guard *)opc->data; + double curr_time; + struct timeval tv; + struct point p; + struct point bbox[4]; + char* dist_str; + struct graphics_gc *curr_color; + int imperial=0; + double min_dist; + + //do not execute for each gps update + gettimeofday(&tv,NULL); + curr_time = (double)(tv.tv_usec)/1000000.0+tv.tv_sec; + if ( this->last_time+this->update_period > curr_time) { + return; + } + this->last_time = curr_time; + if(nav) { + navit_get_attr(nav, attr_vehicle, &vehicle_attr, NULL); + if (vehicle_attr.u.vehicle) { + curr_vehicle = vehicle_attr.u.vehicle; + } + if (navit_get_attr(nav, attr_imperial, &imperial_attr, NULL)) { + imperial=imperial_attr.u.num; + } + } + + if(0==curr_vehicle) + return; + + if(!vehicle_get_attr(curr_vehicle, attr_position_coord_geo,&position_attr, NULL)) { + return; + } + transform_from_geo(projection_mg, position_attr.u.coord_geo, &curr_coord); + + min_dist = 1000000; + //calculate min dist + if(this->coord_num > 1) { + double scale = transform_scale(curr_coord.y); + for( i=1 ; icoord_num ; ++i ) { + struct coord proj_coord; + double curr_dist; + transform_distance_line_sq(&this->coords[i-1], &this->coords[i], &curr_coord, &proj_coord); + curr_dist = transform_distance(projection_mg, &proj_coord, &curr_coord); + curr_dist /= scale; + if (curr_distwarned == 0 && this->min_dist < min_dist && min_dist < this->max_dist) { + navit_say(nav, _("Return to route!")); + this->warned = 1; + } else if( min_dist < this->min_dist ) { + this->warned = 0; + } + } + osd_std_draw(&opc->osd_item); + + dist_str = format_distance(min_dist, "", imperial); + + graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, dist_str, 0x10000, 0, bbox, 0); + p.x=(opc->osd_item.w-bbox[2].x)/2; + p.y = opc->osd_item.h-opc->osd_item.h/10; + + curr_color = (this->min_dist < min_dist && min_dist < this->max_dist) ? this->red : this->white; + graphics_draw_text(opc->osd_item.gr, curr_color, NULL, opc->osd_item.font, dist_str, &p, 0x10000, 0); + + g_free(dist_str); + + graphics_draw_mode(opc->osd_item.gr, draw_mode_end); +} + +static void +osd_route_guard_init(struct osd_priv_common *opc, struct navit *nav) +{ + struct color red_color={0xffff,0x0000,0x0000,0xffff}; + struct route_guard *this = (struct route_guard *)opc->data; + osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); + //load coord data + if (this->map_name && this->item_name) { + struct mapset* ms; + struct map_rect *mr; + struct mapset_handle *msh; + struct map *map = NULL; + struct item *item = NULL; + if(!(ms=navit_get_mapset(nav))) { + return; + } + msh=mapset_open(ms); + while ((map=mapset_next(msh, 1))) { + struct attr attr; + if(map_get_attr(map, attr_name, &attr, NULL)) { + if( ! strcmp(this->map_name, attr.u.str) ) { + mr=map_rect_new(map, NULL); + if (mr) { + while ((item=map_rect_get_item(mr))) { + struct attr item_attr; + if(item_attr_get(item, attr_name, &item_attr)) { + if (!strcmp(item_attr.u.str,this->item_name)) { + //item found, get coords + struct coord c; + this->coord_num=0; + while (item_coord_get(item,&c,1)) { + this->coords = g_renew(struct coord,this->coords,this->coord_num+1); + this->coords[this->coord_num] = c; + ++this->coord_num; + } + } + } + } + } + } else { + continue; + } + } else { + continue; + } + } + mapset_close(msh); + } + + this->red = graphics_gc_new(opc->osd_item.gr); + graphics_gc_set_foreground(this->red, &red_color); + graphics_gc_set_linewidth(this->red, this->width); + + this->white = graphics_gc_new(opc->osd_item.gr); + graphics_gc_set_foreground(this->white, &opc->osd_item.text_color); + graphics_gc_set_linewidth(this->white, this->width); + + //setup draw callback + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_route_guard_draw), attr_position_coord_geo, opc)); +} + +static void +osd_route_guard_destroy(struct osd_priv_common *opc) +{ + struct route_guard *this = (struct route_guard *)opc->data; + g_free(this->coords); +} + +static struct osd_priv * +osd_route_guard_new(struct navit *nav, struct osd_methods *meth, + struct attr **attrs) +{ + struct route_guard *this = g_new0(struct route_guard, 1); + struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); + struct attr *attr; + + opc->data = (void*)this; + opc->osd_item.p.x = 120; + opc->osd_item.p.y = 20; + opc->osd_item.w = 60; + opc->osd_item.h = 80; + opc->osd_item.navit = nav; + opc->osd_item.font_size = 200; + opc->osd_item.meth.draw = osd_draw_cast(osd_route_guard_draw); + meth->set_attr = (void (*)(struct osd_priv *osd, struct attr* attr)) set_std_osd_attr; + osd_set_std_attr(attrs, &opc->osd_item, 2); + + attr = attr_search(attrs, NULL, attr_min_dist); + if (attr) { + this->min_dist = attr->u.num; + } + else + this->min_dist = 30; //default tolerance is 30m + + attr = attr_search(attrs, NULL, attr_max_dist); + if (attr) { + this->max_dist = attr->u.num; + } + else + this->max_dist = 500; //default + + attr = attr_search(attrs, NULL, attr_item_name); + if (attr) { + this->item_name = g_strdup(attr->u.str); + } + else + this->item_name = NULL; + + attr = attr_search(attrs, NULL, attr_map_name); + if (attr) { + this->map_name = g_strdup(attr->u.str); + } + else + this->map_name = NULL; + + attr = attr_search(attrs, NULL, attr_update_period); + this->update_period=attr ? attr->u.num : 10; + + attr = attr_search(attrs, NULL, attr_width); + this->width=attr ? attr->u.num : 2; + + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_route_guard_init), attr_graphics_ready, opc)); + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_route_guard_destroy), attr_destroy, opc)); + + return (struct osd_priv *) opc; +} + + +static int odometers_saved = 0; +static GList* odometer_list = NULL; + +static struct command_table commands[] = { + {"odometer_reset",command_cast(osd_cmd_odometer_reset)}, +}; + +struct odometer { + int width; + struct graphics_gc *orange; + struct graphics_gc *white; + struct callback *click_cb; + char *text; //text of label attribute for this osd + char *name; //unique name of the odometer (needed for handling multiple odometers persistently) + struct color idle_color; //text color when counter is idle + + int bDisableReset; + int bAutoStart; + int bActive; //counting or not + int autosave_period; //autosave period in seconds + double sum_dist; //sum of distance ofprevious intervals in meters + double sum_time; //sum of time of previous intervals in seconds (needed for avg spd calculation) + double time_all; + double last_click_time; //time of last click (for double click handling) + double last_start_time; //time of last start of counting + double last_update_time; //time of last position update + struct coord last_coord; + double last_speed; + double max_speed; + double acceleration; +}; + +static void +osd_cmd_odometer_reset(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ + if (in && in[0] && ATTR_IS_STRING(in[0]->type) && in[0]->u.str) { + GList* list = odometer_list; + while(list) { + if(!strcmp(((struct odometer*)(list->data))->name,in[0]->u.str)) { + osd_odometer_reset(list->data); + osd_odometer_draw(list->data,this,NULL); + } + list = g_list_next(list); + } + } +} + +static char* +str_replace(char*output, char*input, char*pattern, char*replacement) +{ + char *pos; + char *pos2; + if (!output || !input || !pattern || !replacement) { + return NULL; + } + if(!strcmp(pattern,"")) { + return input; + } + + pos = &input[0]; + pos2 = &input[0]; + output[0] = 0; + while ( (pos2=strstr(pos,pattern)) ) { + strncat(output,pos,pos2-pos); + strcat(output,replacement); + pos = pos2 + strlen(pattern); + } + strcat(output,pos); + return NULL; +} + +/* + * save current odometer state to string + */ +static char *osd_odometer_to_string(struct odometer *this_) +{ + return g_strdup_printf("odometer %s %lf %lf %d %lf\n",this_->name,this_->sum_dist,this_->time_all,this_->bActive,this_->max_speed); +} + +/* + * load current odometer state from string + */ +static void osd_odometer_from_string(struct odometer *this_, char*str) +{ + char* tok; + char* name_str; + char* sum_dist_str; + char* sum_time_str; + char* active_str; + char* max_spd_str; + tok = strtok(str, " "); + if( !tok || strcmp("odometer",tok)) { + return; + } + name_str = g_strdup(strtok(NULL, " ")); + if(!name_str) { + return; + } + sum_dist_str = g_strdup(strtok(NULL, " ")); + if(!sum_dist_str) { + g_free(name_str); + return; + } + sum_time_str = g_strdup(strtok(NULL, " ")); + if(!sum_time_str) { + g_free(name_str); + g_free(sum_dist_str); + return; + } + active_str = g_strdup(strtok(NULL, " ")); + if(!active_str) { + g_free(name_str); + g_free(sum_dist_str); + g_free(sum_time_str); + return; + } + max_spd_str = g_strdup(strtok(NULL, " ")); + if(!max_spd_str) { + g_free(name_str); + g_free(sum_dist_str); + g_free(sum_time_str); + g_free(active_str); + return; + } + + this_->name = name_str; + this_->sum_dist = atof(sum_dist_str); + this_->sum_time = atof(sum_time_str); + this_->bActive = atoi(active_str); + this_->max_speed = atof(max_spd_str); + this_->last_coord.x = -1; + g_free(active_str); + g_free(sum_dist_str); + g_free(sum_time_str); + g_free(max_spd_str); +} + +static void draw_multiline_osd_text(char *buffer,struct osd_item *osd_item, struct graphics_gc *curr_color) +{ + gchar**bufvec = g_strsplit(buffer,"\n",0); + struct point p, bbox[4]; + //count strings + int strnum = 0; + gchar**pch = bufvec; + while(*pch) { + ++strnum; + ++pch; + } + + if(0h / strnum; + + pch = bufvec; + p.y = 0; + while (*pch) { + graphics_get_text_bbox(osd_item->gr, osd_item->font, *pch, 0x10000, 0, bbox, 0); + p.x=(osd_item->w-bbox[2].x)/2; + p.y += dh; + graphics_draw_text(osd_item->gr, curr_color, NULL, osd_item->font, *pch, &p, 0x10000, 0); + ++pch; + } + } + g_free(bufvec); +} + + +static void osd_odometer_draw(struct osd_priv_common *opc, struct navit *nav, struct vehicle *v) +{ + struct odometer *this = (struct odometer *)opc->data; + + struct coord curr_coord; + struct graphics_gc *curr_color; + + char *dist_buffer=0; + char *spd_buffer=0; + char *max_spd_buffer=0; + char *time_buffer = 0; + char *acc_buffer = 0; + struct attr position_attr,vehicle_attr,imperial_attr,speed_attr; + enum projection pro; + struct vehicle* curr_vehicle = v; + double spd = 0; + double curr_spd = 0; + + int remainder; + int days; + int hours; + int mins; + int secs; + int imperial=0; + + char buffer [256+1]=""; + char buffer2[256+1]=""; + + if(nav) { + navit_get_attr(nav, attr_vehicle, &vehicle_attr, NULL); + if (navit_get_attr(nav, attr_imperial, &imperial_attr, NULL)) + imperial=imperial_attr.u.num; + } + if (vehicle_attr.u.vehicle) { + curr_vehicle = vehicle_attr.u.vehicle; + } + + if(0==curr_vehicle) + return; + + osd_std_draw(&opc->osd_item); + if(this->bActive) { + if(!vehicle_get_attr(curr_vehicle, attr_position_coord_geo,&position_attr, NULL)) { + return; + } + pro = projection_mg;//position_attr.u.pcoord->pro; + transform_from_geo(pro, position_attr.u.coord_geo, &curr_coord); + + if (this->last_coord.x != -1 ) { + const double cStepDistLimit = 10000; + struct timeval tv; + double curr_time; + double dt; + double dCurrDist = 0; + + gettimeofday(&tv,NULL); + curr_time = (double)(tv.tv_usec)/1000000.0+tv.tv_sec; + //we have valid previous position + dt = curr_time-this->last_update_time; + dCurrDist = transform_distance(pro, &curr_coord, &this->last_coord); + if(dCurrDist<=cStepDistLimit) { + this->sum_dist += dCurrDist; + } + this->time_all = curr_time-this->last_click_time+this->sum_time; + spd = 3.6*(double)this->sum_dist/(double)this->time_all; + if(dt != 0) { + if (curr_coord.x!=this->last_coord.x || curr_coord.y!=this->last_coord.y) { + if(vehicle_get_attr(curr_vehicle, attr_position_speed,&speed_attr, NULL)) { + double dv; + curr_spd = *speed_attr.u.numd; + dv = (curr_spd-this->last_speed)/3.6; //speed difference in m/sec + this->acceleration = dv/dt; + this->last_speed = curr_spd; + this->last_update_time = curr_time; + } + } + } + this->max_speed = (curr_spd<=this->max_speed) ? this->max_speed : curr_spd; + } + this->last_coord = curr_coord; + } + + dist_buffer = format_distance(this->sum_dist,"",imperial); + spd_buffer = format_speed(spd,"","value",imperial); + max_spd_buffer = format_speed(this->max_speed,"","value",imperial); + acc_buffer = g_strdup_printf("%.3f m/s2",this->acceleration); + remainder = (int)this->time_all; + days = remainder / (24*60*60); + remainder = remainder % (24*60*60); + hours = remainder / (60*60); + remainder = remainder % (60*60); + mins = remainder / (60); + remainder = remainder % (60); + secs = remainder; + if(0text) { + str_replace(buffer,this->text,"${avg_spd}",spd_buffer); + str_replace(buffer2,buffer,"${distance}",dist_buffer); + str_replace(buffer,buffer2,"${time}",time_buffer); + str_replace(buffer2,buffer,"${acceleration}",acc_buffer); + str_replace(buffer,buffer2,"${max_spd}",max_spd_buffer); + } + g_free(time_buffer); + + curr_color = this->bActive?this->white:this->orange; + draw_multiline_osd_text(buffer,&opc->osd_item, curr_color); + + g_free(dist_buffer); + g_free(spd_buffer); + g_free(max_spd_buffer); + g_free(acc_buffer); + graphics_draw_mode(opc->osd_item.gr, draw_mode_end); +} + + +static void +osd_odometer_reset(struct osd_priv_common *opc) +{ + struct odometer *this = (struct odometer *)opc->data; + + if(!this->bDisableReset) { + this->bActive = 0; + this->sum_dist = 0; + this->sum_time = 0; + this->max_speed = 0; + this->last_start_time = 0; + this->last_coord.x = -1; + this->last_coord.y = -1; + } +} + +static void +osd_odometer_click(struct osd_priv_common *opc, struct navit *nav, int pressed, int button, struct point *p) +{ + struct odometer *this = (struct odometer *)opc->data; + + struct point bp = opc->osd_item.p; + struct timeval tv; + double curr_time; + const double double_click_timewin = .5; + osd_wrap_point(&bp, nav); + if ((p->x < bp.x || p->y < bp.y || p->x > bp.x + opc->osd_item.w || p->y > bp.y + opc->osd_item.h || !opc->osd_item.configured ) && !opc->osd_item.pressed) + return; + if (button != 1) + return; + if (navit_ignore_button(nav)) + return; + if (!!pressed == !!opc->osd_item.pressed) + return; + + gettimeofday(&tv,NULL); + curr_time = (double)(tv.tv_usec)/1000000.0+tv.tv_sec; + + if (pressed) { //single click handling + if(this->bActive) { //being stopped + this->last_coord.x = -1; + this->last_coord.y = -1; + this->sum_time += curr_time-this->last_click_time; + } + + this->bActive ^= 1; //toggle active flag + + if (curr_time-double_click_timewin <= this->last_click_time) { //double click handling + osd_odometer_reset(opc); + } + + this->last_click_time = curr_time; + + osd_odometer_draw(opc, nav,NULL); + } +} + + +static int +osd_odometer_save(struct navit* nav) +{ + //save odometers that are persistent(ie have name) + FILE*f; + GList* list = odometer_list; + char* fn = g_strdup_printf("%s/odometer.txt",navit_get_user_data_directory(TRUE)); + f = fopen(fn,"w+"); + g_free(fn); + if(!f) { + return TRUE; + } + while (list) { + if( ((struct odometer*)(list->data))->name) { + char*odo_str = osd_odometer_to_string(list->data); + fprintf(f,"%s",odo_str); + g_free(odo_str); + + } + list = g_list_next(list); + } + fclose(f); + return TRUE; +} + + +static void +osd_odometer_init(struct osd_priv_common *opc, struct navit *nav) +{ + struct odometer *this = (struct odometer *)opc->data; + + osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); + + this->orange = graphics_gc_new(opc->osd_item.gr); + graphics_gc_set_foreground(this->orange, &this->idle_color); + graphics_gc_set_linewidth(this->orange, this->width); + + this->white = graphics_gc_new(opc->osd_item.gr); + graphics_gc_set_foreground(this->white, &opc->osd_item.text_color); + graphics_gc_set_linewidth(this->white, this->width); + + graphics_gc_set_linewidth(opc->osd_item.graphic_fg_white, this->width); + + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_odometer_draw), attr_position_coord_geo, opc)); + + navit_add_callback(nav, this->click_cb = callback_new_attr_1(callback_cast (osd_odometer_click), attr_button, opc)); + + if(this->autosave_period>0) { + event_add_timeout(this->autosave_period*1000, 1, callback_new_1(callback_cast(osd_odometer_save), NULL)); + } + + if(this->bAutoStart) { + this->bActive = 1; + } + osd_odometer_draw(opc, nav, NULL); +} + +static void +osd_odometer_destroy(struct navit* nav) +{ + if(!odometers_saved) { + odometers_saved = 1; + osd_odometer_save(NULL); + } +} + +static struct osd_priv * +osd_odometer_new(struct navit *nav, struct osd_methods *meth, + struct attr **attrs) +{ + FILE* f; + char* fn; + + struct odometer *this = g_new0(struct odometer, 1); + struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); + struct attr *attr; + struct color orange_color={0xffff,0xa5a5,0x0000,0xffff}; + + opc->data = (void*)this; + opc->osd_item.p.x = 120; + opc->osd_item.p.y = 20; + opc->osd_item.w = 60; + opc->osd_item.h = 80; + opc->osd_item.navit = nav; + opc->osd_item.font_size = 200; + opc->osd_item.meth.draw = osd_draw_cast(osd_odometer_draw); + meth->set_attr = (void (*)(struct osd_priv *osd, struct attr* attr))set_std_osd_attr; + + this->bActive = 0; //do not count on init + this->sum_dist = 0; + this->max_speed = 0; + this->last_click_time = time(0); + this->last_coord.x = -1; + this->last_coord.y = -1; + + attr = attr_search(attrs, NULL, attr_label); + //FIXME find some way to free text!!!! + if (attr) { + this->text = g_strdup(attr->u.str); + } + else + this->text = NULL; + + attr = attr_search(attrs, NULL, attr_name); + //FIXME find some way to free text!!!! + if (attr) { + this->name = g_strdup(attr->u.str); + } + else + this->name = NULL; + + attr = attr_search(attrs, NULL, attr_disable_reset); + if (attr) + this->bDisableReset = attr->u.num; + else + this->bDisableReset = 0; + + attr = attr_search(attrs, NULL, attr_autostart); + if (attr) + this->bAutoStart = attr->u.num; + else + this->bAutoStart = 0; + attr = attr_search(attrs, NULL, attr_autosave_period); + if (attr) + this->autosave_period = attr->u.num; + else + this->autosave_period = -1; //disabled by default + + osd_set_std_attr(attrs, &opc->osd_item, 2); + attr = attr_search(attrs, NULL, attr_width); + this->width=attr ? attr->u.num : 2; + attr = attr_search(attrs, NULL, attr_idle_color); + this->idle_color=attr ? *attr->u.color : orange_color; // text idle_color defaults to orange + + this->last_coord.x = -1; + this->last_coord.y = -1; + this->sum_dist = 0.0; + + //load state from file + fn = g_strdup_printf("%s/odometer.txt",navit_get_user_data_directory(FALSE)); + f = fopen(fn,"r+"); + + if(f) { + g_free(fn); + + while(!feof(f)) { + char str[128]; + char *line; + if(fgets(str,128,f)) + { + char *tok; + line = g_strdup(str); + tok = strtok(str," "); + if(!strcmp(tok,"odometer")) { + tok = strtok(NULL," "); + if(this->name && tok && !strcmp(this->name,tok)) { + osd_odometer_from_string(this,line); + } + } + g_free(line); + } + } + fclose(f); + } + + if(b_commandtable_added == 0) { + navit_command_add_table(nav, commands, sizeof(commands)/sizeof(struct command_table)); + b_commandtable_added = 1; + } + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_odometer_init), attr_graphics_ready, opc)); + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_odometer_destroy), attr_destroy, nav)); + odometer_list = g_list_append(odometer_list, this); + + return (struct osd_priv *) opc; +} + + +struct cmd_interface { + int width; + struct graphics_gc *orange,*white; + int update_period; //in sec + char* text; + struct graphics_image *img; + char*img_filename; + char* command; + int bReserved; +}; + +static void +osd_cmd_interface_draw(struct osd_priv_common *opc, struct navit *nav, + struct vehicle *v) +{ + struct cmd_interface *this = (struct cmd_interface *)opc->data; + + struct point p; + struct point bbox[4]; + struct graphics_gc *curr_color; + struct attr navit; + p.x = 0; + p.y = 0; + navit.type=attr_navit; + navit.u.navit = opc->osd_item.navit; + + if(0==this->bReserved) { + this->bReserved = 1; + command_evaluate(&navit, this->command); + this->bReserved = 0; + } + + osd_std_draw(&opc->osd_item); + + //display image + if(this->img) { + graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_bg, &p, this->img); + } + + //display text + graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, this->text, 0x10000, 0, bbox, 0); + p.x=(opc->osd_item.w-bbox[2].x)/2; + p.y = opc->osd_item.h-opc->osd_item.h/10; + curr_color = this->white; + if(this->text) + draw_multiline_osd_text(this->text,&opc->osd_item, curr_color); + graphics_draw_mode(opc->osd_item.gr, draw_mode_end); +} + + + +static void +osd_cmd_interface_init(struct osd_priv_common *opc, struct navit *nav) +{ + struct cmd_interface *this = (struct cmd_interface *)opc->data; + + osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); + + this->white = graphics_gc_new(opc->osd_item.gr); + graphics_gc_set_foreground(this->white, &opc->osd_item.text_color); + graphics_gc_set_linewidth(this->white, this->width); + + + graphics_gc_set_linewidth(opc->osd_item.graphic_fg_white, this->width); + + if(this->update_period>0) { + event_add_timeout(this->update_period*1000, 1, callback_new_1(callback_cast(osd_cmd_interface_draw), opc)); + } + + navit_add_callback(nav, callback_new_attr_1(callback_cast (osd_std_click), attr_button, &opc->osd_item)); + + this->text = g_strdup(""); +} + +static int +osd_cmd_interface_set_attr(struct osd_priv_common *opc, struct attr* attr) +{ + struct cmd_interface *this_ = (struct cmd_interface *)opc->data; + + struct navit* nav; + + if(NULL==attr || NULL==this_) { + return 0; + } + + nav = opc->osd_item.navit; + + if(attr->type == attr_status_text) { + if(this_->text) { + g_free(this_->text); + } + if(attr->u.str) { + this_->text = g_strdup(attr->u.str); + } + return 1; + } + if(attr->type == attr_src) { + if(attr->u.str) { + if((!this_->img_filename) || strcmp(this_->img_filename, graphics_icon_path(attr->u.str))) { + //destroy old img, create new image + if(this_->img) { + graphics_image_free(opc->osd_item.gr, this_->img); + } + if(this_->img_filename) { + g_free(this_->img_filename); + } + this_->img_filename = graphics_icon_path(attr->u.str); + this_->img = graphics_image_new(opc->osd_item.gr, this_->img_filename); + } + } + return 1; + } + return 0; +} + + +static struct osd_priv * +osd_cmd_interface_new(struct navit *nav, struct osd_methods *meth, + struct attr **attrs) +{ + struct cmd_interface *this = g_new0(struct cmd_interface, 1); + struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); + struct attr *attr; + + opc->data = (void*)this; + opc->osd_item.p.x = 120; + opc->osd_item.p.y = 20; + opc->osd_item.w = 60; + opc->osd_item.h = 80; + opc->osd_item.navit = nav; + opc->osd_item.font_size = 200; + opc->osd_item.meth.draw = osd_draw_cast(osd_cmd_interface_draw); + + opc->spec_set_attr_func = osd_cmd_interface_set_attr; + meth->set_attr = (void (*)(struct osd_priv *osd, struct attr* attr))set_std_osd_attr; + + osd_set_std_attr(attrs, &opc->osd_item, 2); + + attr = attr_search(attrs, NULL, attr_width); + this->width=attr ? attr->u.num : 2; + + attr = attr_search(attrs, NULL, attr_update_period); + this->update_period=attr ? attr->u.num : 5; //default update period is 5 seconds + + attr = attr_search(attrs, NULL, attr_command); + this->command = attr ? g_strdup(attr->u.str) : g_strdup(""); + + if(b_commandtable_added == 0) { + navit_command_add_table(nav, commands, sizeof(commands)/sizeof(struct command_table)); + b_commandtable_added = 1; + } + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_cmd_interface_init), attr_graphics_ready, opc)); + return (struct osd_priv *) opc; +} + + + + +struct stopwatch { + int width; + struct graphics_gc *orange,*white; + struct callback *click_cb; + struct color idle_color; //text color when counter is idle + + int bDisableReset; + int bActive; //counting or not + time_t current_base_time; //base time of currently measured time interval + time_t sum_time; //sum of previous time intervals (except current intervals) + time_t last_click_time; //time of last click (for double click handling) +}; + +static void +osd_stopwatch_draw(struct osd_priv_common *opc, struct navit *nav, + struct vehicle *v) +{ + struct stopwatch *this = (struct stopwatch *)opc->data; + + struct graphics_gc *curr_color; + char buffer[32]="00:00:00"; + struct point p; + struct point bbox[4]; + time_t total_sec,total_min,total_hours,total_days; + total_sec = this->sum_time; + + osd_std_draw(&opc->osd_item); + + if(this->bActive) { + total_sec += time(0)-this->current_base_time; + } + + total_min = total_sec/60; + total_hours = total_min/60; + total_days = total_hours/24; + + if (total_days==0) { + g_snprintf(buffer,32,"%02d:%02d:%02d", (int)total_hours%24, (int)total_min%60, (int)total_sec%60); + } else { + g_snprintf(buffer,32,"%02dd %02d:%02d:%02d", + (int)total_days, (int)total_hours%24, (int)total_min%60, (int)total_sec%60); + } + + graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, buffer, 0x10000, 0, bbox, 0); + p.x=(opc->osd_item.w-bbox[2].x)/2; + p.y = opc->osd_item.h-opc->osd_item.h/10; + + curr_color = this->bActive?this->white:this->orange; + graphics_draw_text(opc->osd_item.gr, curr_color, NULL, opc->osd_item.font, buffer, &p, 0x10000, 0); + graphics_draw_mode(opc->osd_item.gr, draw_mode_end); +} + + +static void +osd_stopwatch_click(struct osd_priv_common *opc, struct navit *nav, int pressed, int button, struct point *p) +{ + struct stopwatch *this = (struct stopwatch *)opc->data; + + struct point bp = opc->osd_item.p; + osd_wrap_point(&bp, nav); + if ((p->x < bp.x || p->y < bp.y || p->x > bp.x + opc->osd_item.w || p->y > bp.y + opc->osd_item.h || !opc->osd_item.configured ) && !opc->osd_item.pressed) + return; + if (button != 1) + return; + if (navit_ignore_button(nav)) + return; + if (!!pressed == !!opc->osd_item.pressed) + return; + + if (pressed) { //single click handling + + if(this->bActive) { + this->sum_time += time(0)-this->current_base_time; + this->current_base_time = 0; + } else { + this->current_base_time = time(0); + } + + this->bActive ^= 1; //toggle active flag + + if (this->last_click_time == time(0) && !this->bDisableReset) { //double click handling + this->bActive = 0; + this->current_base_time = 0; + this->sum_time = 0; + } + + this->last_click_time = time(0); + } + + osd_stopwatch_draw(opc, nav,NULL); +} + + +static void +osd_stopwatch_init(struct osd_priv_common *opc, struct navit *nav) +{ + struct stopwatch *this = (struct stopwatch *)opc->data; + + osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); + + this->orange = graphics_gc_new(opc->osd_item.gr); + graphics_gc_set_foreground(this->orange, &this->idle_color); + graphics_gc_set_linewidth(this->orange, this->width); + + this->white = graphics_gc_new(opc->osd_item.gr); + graphics_gc_set_foreground(this->white, &opc->osd_item.text_color); + graphics_gc_set_linewidth(this->white, this->width); + + + graphics_gc_set_linewidth(opc->osd_item.graphic_fg_white, this->width); + + event_add_timeout(500, 1, callback_new_1(callback_cast(osd_stopwatch_draw), opc)); + + navit_add_callback(nav, this->click_cb = callback_new_attr_1(callback_cast (osd_stopwatch_click), attr_button, opc)); + + osd_stopwatch_draw(opc, nav, NULL); +} + +static struct osd_priv * +osd_stopwatch_new(struct navit *nav, struct osd_methods *meth, + struct attr **attrs) +{ + struct stopwatch *this = g_new0(struct stopwatch, 1); + struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); + struct attr *attr; + struct color orange_color={0xffff,0xa5a5,0x0000,0xffff}; + + opc->data = (void*)this; + opc->osd_item.p.x = 120; + opc->osd_item.p.y = 20; + opc->osd_item.w = 60; + opc->osd_item.h = 80; + opc->osd_item.navit = nav; + opc->osd_item.font_size = 200; + opc->osd_item.meth.draw = osd_draw_cast(osd_stopwatch_draw); + meth->set_attr = (void (*)(struct osd_priv *osd, struct attr* attr))set_std_osd_attr; + + this->bActive = 0; //do not count on init + this->current_base_time = 0; + this->sum_time = 0; + this->last_click_time = 0; + + osd_set_std_attr(attrs, &opc->osd_item, 2); + attr = attr_search(attrs, NULL, attr_width); + this->width=attr ? attr->u.num : 2; + attr = attr_search(attrs, NULL, attr_idle_color); + this->idle_color=attr ? *attr->u.color : orange_color; // text idle_color defaults to orange + attr = attr_search(attrs, NULL, attr_disable_reset); + if (attr) + this->bDisableReset = attr->u.num; + else + this->bDisableReset = 0; + + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_stopwatch_init), attr_graphics_ready, opc)); + return (struct osd_priv *) opc; +} + + +static void +osd_compass_draw(struct osd_priv_common *opc, struct navit *nav, + struct vehicle *v) +{ + struct compass *this = (struct compass *)opc->data; + + struct point p,bbox[4]; + struct attr attr_dir, destination_attr, position_attr, imperial_attr; + double dir, vdir = 0; + char *buffer; + struct coord c1, c2; + enum projection pro; + int imperial=0; + + if (navit_get_attr(nav, attr_imperial, &imperial_attr, NULL)) + imperial=imperial_attr.u.num; + + osd_std_draw(&opc->osd_item); + p.x = opc->osd_item.w/2; + p.y = opc->osd_item.w/2; + graphics_draw_circle(opc->osd_item.gr, + opc->osd_item.graphic_fg_white, &p, opc->osd_item.w*5/6); + if (v) { + if (vehicle_get_attr(v, attr_position_direction, &attr_dir, NULL)) { + vdir = *attr_dir.u.numd; + handle(opc->osd_item.gr, opc->osd_item.graphic_fg_white, &p, opc->osd_item.w/3, -vdir); + } + + if (navit_get_attr(nav, attr_destination, &destination_attr, NULL) + && vehicle_get_attr(v, attr_position_coord_geo,&position_attr, NULL)) { + pro = destination_attr.u.pcoord->pro; + transform_from_geo(pro, position_attr.u.coord_geo, &c1); + c2.x = destination_attr.u.pcoord->x; + c2.y = destination_attr.u.pcoord->y; + dir = atan2(c2.x - c1.x, c2.y - c1.y) * 180.0 / M_PI; + dir -= vdir; + handle(opc->osd_item.gr, this->green, &p, opc->osd_item.w/3, dir); + buffer=format_distance(transform_distance(pro, &c1, &c2),"",imperial); + graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, buffer, 0x10000, 0, bbox, 0); + p.x=(opc->osd_item.w-bbox[2].x)/2; + p.y = opc->osd_item.h-opc->osd_item.h/10; + graphics_draw_text(opc->osd_item.gr, this->green, NULL, opc->osd_item.font, buffer, &p, 0x10000, 0); + g_free(buffer); + } + } + graphics_draw_mode(opc->osd_item.gr, draw_mode_end); +} + + + +static void +osd_compass_init(struct osd_priv_common *opc, struct navit *nav) +{ + struct color c; + + struct compass *this = (struct compass *)opc->data; + + osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); + + this->green = graphics_gc_new(opc->osd_item.gr); + c.r = 0; + c.g = 65535; + c.b = 0; + c.a = 65535; + graphics_gc_set_foreground(this->green, &c); + graphics_gc_set_linewidth(this->green, this->width); + graphics_gc_set_linewidth(opc->osd_item.graphic_fg_white, this->width); + + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_compass_draw), attr_position_coord_geo, opc)); + + osd_compass_draw(opc, nav, NULL); +} + +static struct osd_priv * +osd_compass_new(struct navit *nav, struct osd_methods *meth, + struct attr **attrs) +{ + struct compass *this = g_new0(struct compass, 1); + struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); + struct attr *attr; + + opc->data = (void*)this; + opc->osd_item.p.x = 20; + opc->osd_item.p.y = 20; + opc->osd_item.w = 60; + opc->osd_item.h = 80; + opc->osd_item.navit = nav; + opc->osd_item.font_size = 200; + opc->osd_item.meth.draw = osd_draw_cast(osd_compass_draw); + meth->set_attr = (void (*)(struct osd_priv *osd, struct attr* attr))set_std_osd_attr; + osd_set_std_attr(attrs, &opc->osd_item, 2); + attr = attr_search(attrs, NULL, attr_width); + this->width=attr ? attr->u.num : 2; + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_compass_init), attr_graphics_ready, opc)); + return (struct osd_priv *) opc; +} + +struct osd_button { + int use_overlay; + struct callback *draw_cb,*navit_init_cb; + struct graphics_image *img; + char *src; +}; + +static void +osd_button_draw(struct osd_priv_common *opc, struct navit *nav) +{ + struct osd_button *this = (struct osd_button *)opc->data; + + struct point bp = opc->osd_item.p; + if (!opc->osd_item.configured) + return; + osd_wrap_point(&bp, nav); + graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_bg, &bp, this->img); +} + +static void +osd_button_init(struct osd_priv_common *opc, struct navit *nav) +{ + struct osd_button *this = (struct osd_button *)opc->data; + + struct graphics *gra = navit_get_graphics(nav); + dbg(1, "enter\n"); + this->img = graphics_image_new(gra, this->src); + if (!this->img) { + dbg(1, "failed to load '%s'\n", this->src); + return; + } + if (!opc->osd_item.w) + opc->osd_item.w=this->img->width; + if (!opc->osd_item.h) + opc->osd_item.h=this->img->height; + if (this->use_overlay) { + struct graphics_image *img; + struct point p; + osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); + img=graphics_image_new(opc->osd_item.gr, this->src); + p.x=(opc->osd_item.w-this->img->width)/2; + p.y=(opc->osd_item.h-this->img->height)/2; + osd_std_draw(&opc->osd_item); + graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_bg, &p, img); + graphics_draw_mode(opc->osd_item.gr, draw_mode_end); + graphics_image_free(opc->osd_item.gr, img); + } else { + osd_set_std_config(nav, &opc->osd_item); + opc->osd_item.gr=gra; + opc->osd_item.graphic_bg=graphics_gc_new(opc->osd_item.gr); + graphics_add_callback(gra, this->draw_cb=callback_new_attr_2(callback_cast(osd_button_draw), attr_postdraw, opc, nav)); + } + navit_add_callback(nav, this->navit_init_cb = callback_new_attr_1(callback_cast (osd_std_click), attr_button, &opc->osd_item)); + osd_button_draw(opc,nav); +} + +int +osd_button_set_attr(struct osd_priv_common *opc, struct attr* attr) +{ + struct osd_button *this_ = (struct osd_button *)opc->data; + + if(NULL==attr || NULL==this_) { + return 0; + } + if(attr->type == attr_src) { + struct navit *nav; + struct graphics *gra; + if(this_->src) { + g_free(this_->src); + } + if(attr->u.str) { + this_->src = graphics_icon_path(attr->u.str); + } + nav = opc->osd_item.navit; + gra = navit_get_graphics(nav); + this_->img = graphics_image_new(gra, this_->src); + if (!this_->img) { + dbg(1, "failed to load '%s'\n", this_->src); + return 0; + } + if (!opc->osd_item.w) + opc->osd_item.w=this_->img->width; + if (!opc->osd_item.h) + opc->osd_item.h=this_->img->height; + + if (this_->use_overlay) { + struct graphics_image *img; + struct point p; + img=graphics_image_new(opc->osd_item.gr, this_->src); + p.x=(opc->osd_item.w-this_->img->width)/2; + p.y=(opc->osd_item.h-this_->img->height)/2; + osd_std_draw(&opc->osd_item); + graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_bg, &p, img); + graphics_image_free(opc->osd_item.gr, img); + } + osd_button_draw(opc,nav); + navit_draw(opc->osd_item.navit); + return 1; + } + return 0; +} + + + +static struct osd_priv * +osd_button_new(struct navit *nav, struct osd_methods *meth, + struct attr **attrs) +{ + struct osd_button *this = g_new0(struct osd_button, 1); + struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); + struct attr *attr; + + opc->data = (void*)this; + opc->osd_item.navit = nav; + opc->osd_item.meth.draw = osd_draw_cast(osd_button_draw); + + meth->set_attr = (void (*)(struct osd_priv *osd, struct attr* attr))set_std_osd_attr; + opc->spec_set_attr_func = osd_button_set_attr; + + osd_set_std_attr(attrs, &opc->osd_item, 1|16); + + attr=attr_search(attrs, NULL, attr_use_overlay); + if (attr) + this->use_overlay=attr->u.num; + if (!opc->osd_item.command) { + dbg(0, "no command\n"); + goto error; + } + attr = attr_search(attrs, NULL, attr_src); + if (!attr) { + dbg(0, "no src\n"); + goto error; + } + + this->src = graphics_icon_path(attr->u.str); + + navit_add_callback(nav, this->navit_init_cb = callback_new_attr_1(callback_cast (osd_button_init), attr_graphics_ready, opc)); + + if(b_commandtable_added == 0) { + navit_command_add_table(nav, commands, sizeof(commands)/sizeof(struct command_table)); + b_commandtable_added = 1; + } + + return (struct osd_priv *) opc; + error: + g_free(this); + g_free(opc); + return NULL; +} + +struct osd_image { + int use_overlay; + struct callback *draw_cb,*navit_init_cb; + struct graphics_image *img; + char *src; +}; + +static void +osd_image_draw(struct osd_priv_common *opc, struct navit *nav) +{ + struct osd_button *this = (struct osd_button *)opc->data; + + struct point bp = opc->osd_item.p; + osd_wrap_point(&bp, nav); + graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_bg, &bp, this->img); +} + +static void +osd_image_init(struct osd_priv_common *opc, struct navit *nav) +{ + struct osd_button *this = (struct osd_button *)opc->data; + + struct graphics *gra = navit_get_graphics(nav); + dbg(1, "enter\n"); + this->img = graphics_image_new(gra, this->src); + if (!this->img) { + dbg(1, "failed to load '%s'\n", this->src); + return; + } + if (!opc->osd_item.w) + opc->osd_item.w=this->img->width; + if (!opc->osd_item.h) + opc->osd_item.h=this->img->height; + if (this->use_overlay) { + struct graphics_image *img; + struct point p; + osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); + img=graphics_image_new(opc->osd_item.gr, this->src); + p.x=(opc->osd_item.w-this->img->width)/2; + p.y=(opc->osd_item.h-this->img->height)/2; + osd_std_draw(&opc->osd_item); + graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_bg, &p, img); + graphics_draw_mode(opc->osd_item.gr, draw_mode_end); + graphics_image_free(opc->osd_item.gr, img); + } else { + opc->osd_item.configured=1; + opc->osd_item.gr=gra; + opc->osd_item.graphic_bg=graphics_gc_new(opc->osd_item.gr); + graphics_add_callback(gra, this->draw_cb=callback_new_attr_2(callback_cast(osd_button_draw), attr_postdraw, opc, nav)); + } + osd_image_draw(opc,nav); +} + +static struct osd_priv * +osd_image_new(struct navit *nav, struct osd_methods *meth, + struct attr **attrs) +{ + struct osd_image *this = g_new0(struct osd_image, 1); + struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); + struct attr *attr; + + opc->data = (void*)this; + opc->osd_item.navit = nav; + opc->osd_item.meth.draw = osd_draw_cast(osd_image_draw); + meth->set_attr = (void (*)(struct osd_priv *osd, struct attr* attr))set_std_osd_attr; + + osd_set_std_attr(attrs, &opc->osd_item, 1); + + attr=attr_search(attrs, NULL, attr_use_overlay); + if (attr) + this->use_overlay=attr->u.num; + attr = attr_search(attrs, NULL, attr_src); + if (!attr) { + dbg(0, "no src\n"); + goto error; + } + + this->src = graphics_icon_path(attr->u.str); + + navit_add_callback(nav, this->navit_init_cb = callback_new_attr_1(callback_cast (osd_image_init), attr_graphics_ready, opc)); + + return (struct osd_priv *) this; + error: + g_free(this); + return NULL; +} + +struct nav_next_turn { + char *test_text; + char *icon_src; + int icon_h, icon_w, active; + char *last_name; + int level; +}; + +static void +osd_nav_next_turn_draw(struct osd_priv_common *opc, struct navit *navit, + struct vehicle *v) +{ + struct nav_next_turn *this = (struct nav_next_turn *)opc->data; + + struct point p; + int do_draw = 0; + struct navigation *nav = NULL; + struct map *map = NULL; + struct map_rect *mr = NULL; + struct item *item = NULL; + struct graphics_image *gr_image; + char *image; + char *name = "unknown"; + int level = this->level; + + if (navit) + nav = navit_get_navigation(navit); + if (nav) + map = navigation_get_map(nav); + if (map) + mr = map_rect_new(map, NULL); + if (mr) + while ((item = map_rect_get_item(mr)) + && (item->type == type_nav_position || item->type == type_nav_none || level-- > 0)); + if (item) { + name = item_to_name(item->type); + dbg(1, "name=%s\n", name); + if (this->active != 1 || this->last_name != name) { + this->active = 1; + this->last_name = name; + do_draw = 1; + } + } else { + if (this->active != 0) { + this->active = 0; + do_draw = 1; + } + } + if (mr) + map_rect_destroy(mr); + + if (do_draw) { + osd_std_draw(&opc->osd_item); + if (this->active) { + image = g_strdup_printf(this->icon_src, name); + dbg(1, "image=%s\n", image); + gr_image = + graphics_image_new_scaled(opc->osd_item.gr, + image, this->icon_w, + this->icon_h); + if (!gr_image) { + dbg(0,"failed to load %s in %dx%d\n",image,this->icon_w,this->icon_h); + g_free(image); + image = graphics_icon_path("unknown.png"); + gr_image = + graphics_image_new_scaled(opc-> + osd_item.gr, + image, + this->icon_w, + this-> + icon_h); + } + dbg(1, "gr_image=%p\n", gr_image); + if (gr_image) { + p.x = + (opc->osd_item.w - + gr_image->width) / 2; + p.y = + (opc->osd_item.h - + gr_image->height) / 2; + graphics_draw_image(opc->osd_item.gr, + opc->osd_item. + graphic_fg_white, &p, + gr_image); + graphics_image_free(opc->osd_item.gr, + gr_image); + } + g_free(image); + } + graphics_draw_mode(opc->osd_item.gr, draw_mode_end); + } +} + +static void +osd_nav_next_turn_init(struct osd_priv_common *opc, struct navit *nav) +{ + osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_nav_next_turn_draw), attr_position_coord_geo, opc)); + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_std_click), attr_button, &opc->osd_item)); + osd_nav_next_turn_draw(opc, nav, NULL); +} + +static struct osd_priv * +osd_nav_next_turn_new(struct navit *nav, struct osd_methods *meth, + struct attr **attrs) +{ + struct nav_next_turn *this = g_new0(struct nav_next_turn, 1); + struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); + struct attr *attr; + + opc->data = (void*)this; + opc->osd_item.p.x = 20; + opc->osd_item.p.y = -80; + opc->osd_item.w = 70; + opc->osd_item.navit = nav; + opc->osd_item.h = 70; + opc->osd_item.font_size = 200; + opc->osd_item.meth.draw = osd_draw_cast(osd_nav_next_turn_draw); + meth->set_attr = (void (*)(struct osd_priv *osd, struct attr* attr))set_std_osd_attr; + osd_set_std_attr(attrs, &opc->osd_item, 0); + + this->icon_w = -1; + this->icon_h = -1; + this->active = -1; + this->level = 0; + + attr = attr_search(attrs, NULL, attr_icon_w); + if (attr) + this->icon_w = attr->u.num; + + attr = attr_search(attrs, NULL, attr_icon_h); + if (attr) + this->icon_h = attr->u.num; + + attr = attr_search(attrs, NULL, attr_icon_src); + if (attr) { + struct file_wordexp *we; + char **array; + we = file_wordexp_new(attr->u.str); + array = file_wordexp_get_array(we); + this->icon_src = graphics_icon_path(array[0]); + file_wordexp_destroy(we); + } else { + this->icon_src = graphics_icon_path("%s_wh.svg"); + } + + attr = attr_search(attrs, NULL, attr_level); + if (attr) + this->level=attr->u.num; + + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_nav_next_turn_init), attr_graphics_ready, opc)); + return (struct osd_priv *) opc; +} + +struct nav_toggle_announcer +{ + int w,h; + struct callback *navit_init_cb; + char *icon_src; + int icon_h, icon_w, active, last_state; +}; + +static void +osd_nav_toggle_announcer_draw(struct osd_priv_common *opc, struct navit *navit, struct vehicle *v) +{ + struct nav_toggle_announcer *this = (struct nav_toggle_announcer *)opc->data; + + struct point p; + int do_draw = 0; + struct graphics_image *gr_image; + char *path; + char *gui_sound_off = "gui_sound_off"; + char *gui_sound_on = "gui_sound"; + struct attr attr, speechattr; + + if (this->last_state == -1) + { + if (!navit_get_attr(navit, attr_speech, &speechattr, NULL)) + if (!speech_get_attr(speechattr.u.speech, attr_active, &attr, NULL)) + attr.u.num = 1; + this->active = attr.u.num; + } else + this->active = !this->active; + + if(this->active != this->last_state) + { + this->last_state = this->active; + do_draw = 1; + } + + if (do_draw) + { + graphics_draw_mode(opc->osd_item.gr, draw_mode_begin); + p.x = 0; + p.y = 0; + graphics_draw_rectangle(opc->osd_item.gr, opc->osd_item.graphic_bg, &p, opc->osd_item.w, opc->osd_item.h); + + if (this->active) + path = g_strdup_printf(this->icon_src, gui_sound_on); + else + path = g_strdup_printf(this->icon_src, gui_sound_off); + + gr_image = graphics_image_new_scaled(opc->osd_item.gr, path, this->icon_w, this->icon_h); + if (!gr_image) + { + g_free(path); + path = graphics_icon_path("unknown.png"); + gr_image = graphics_image_new_scaled(opc->osd_item.gr, path, this->icon_w, this->icon_h); + } + + dbg(1, "gr_image=%p\n", gr_image); + + if (gr_image) + { + p.x = (opc->osd_item.w - gr_image->width) / 2; + p.y = (opc->osd_item.h - gr_image->height) / 2; + graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_fg_white, &p, gr_image); + graphics_image_free(opc->osd_item.gr, gr_image); + } + + g_free(path); + graphics_draw_mode(opc->osd_item.gr, draw_mode_end); + } +} + +static void +osd_nav_toggle_announcer_init(struct osd_priv_common *opc, struct navit *nav) +{ + struct nav_toggle_announcer *this = (struct nav_toggle_announcer *)opc->data; + + osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_nav_toggle_announcer_draw), attr_speech, opc)); + navit_add_callback(nav, this->navit_init_cb = callback_new_attr_1(callback_cast(osd_std_click), attr_button, &opc->osd_item)); + osd_nav_toggle_announcer_draw(opc, nav, NULL); +} + +static struct osd_priv * +osd_nav_toggle_announcer_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) +{ + struct nav_toggle_announcer *this = g_new0(struct nav_toggle_announcer, 1); + struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); + struct attr *attr; + char *command = "announcer_toggle()"; + + opc->data = (void*)this; + opc->osd_item.w = 48; + opc->osd_item.h = 48; + opc->osd_item.p.x = -64; + opc->osd_item.navit = nav; + opc->osd_item.p.y = 76; + opc->osd_item.meth.draw = osd_draw_cast(osd_nav_toggle_announcer_draw); + meth->set_attr = (void (*)(struct osd_priv *osd, struct attr* attr))set_std_osd_attr; + + osd_set_std_attr(attrs, &opc->osd_item, 0); + + this->icon_w = -1; + this->icon_h = -1; + this->last_state = -1; + + attr = attr_search(attrs, NULL, attr_icon_src); + if (attr) { + struct file_wordexp *we; + char **array; + we = file_wordexp_new(attr->u.str); + array = file_wordexp_get_array(we); + this->icon_src = g_strdup(array[0]); + file_wordexp_destroy(we); + } else + this->icon_src = graphics_icon_path("%s_32.xpm"); + + opc->osd_item.command = g_strdup(command); + + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_nav_toggle_announcer_init), attr_graphics_ready, opc)); + return (struct osd_priv *) opc; +} + +enum osd_speed_warner_eAnnounceState {eNoWarn=0,eWarningTold=1}; +enum camera_t {CAM_FIXED=1, CAM_TRAFFIC_LAMP, CAM_RED, CAM_SECTION, CAM_MOBILE, CAM_RAIL, CAM_TRAFFIPAX}; +char*camera_t_strs[] = {"None","Fix","Traffic lamp","Red detect","Section","Mobile","Rail","Traffipax(non persistent)"}; +char*camdir_t_strs[] = {"All dir.","UNI-dir","BI-dir"}; +enum cam_dir_t {CAMDIR_ALL=0, CAMDIR_ONE, CAMDIR_TWO}; + +struct osd_speed_cam_entry { + double lon; + double lat; + enum camera_t cam_type; + int speed_limit; + enum cam_dir_t cam_dir; + int direction; +}; + +struct osd_speed_cam { + int width; + int flags; + struct graphics_gc *white,*orange; + struct graphics_gc *red; + struct color idle_color; + + int announce_on; + enum osd_speed_warner_eAnnounceState announce_state; + char *text; //text of label attribute for this osd +}; + +static double +angle_diff(int firstAngle,int secondAngle) +{ + double difference = secondAngle - firstAngle; + while (difference < -180) difference += 360; + while (difference > 180) difference -= 360; + return difference; +} + +static void +osd_speed_cam_draw(struct osd_priv_common *opc, struct navit *navit, struct vehicle *v) +{ + struct osd_speed_cam *this_ = (struct osd_speed_cam *)opc->data; + + struct attr position_attr,vehicle_attr,imperial_attr; + struct point p, bbox[4]; + struct attr speed_attr; + struct vehicle* curr_vehicle = v; + struct coord curr_coord; + struct coord cam_coord; + struct mapset* ms; + + double dCurrDist = -1; + int dir_idx = -1; + int dir = -1; + int spd = -1; + int idx = -1; + double speed = -1; + int bFound = 0; + + int dst=2000; + int dstsq=dst*dst; + struct map_selection sel; + struct map_rect *mr; + struct mapset_handle *msh; + struct map *map; + struct item *item; + + struct attr attr_dir; + struct graphics_gc *curr_color; + int ret_attr = 0; + int imperial=0; + + if (navit_get_attr(navit, attr_imperial, &imperial_attr, NULL)) + imperial=imperial_attr.u.num; + + + if(navit) { + navit_get_attr(navit, attr_vehicle, &vehicle_attr, NULL); + } + else { + return; + } + if (vehicle_attr.u.vehicle) { + curr_vehicle = vehicle_attr.u.vehicle; + } + + if(0==curr_vehicle) + return; + + if(!(ms=navit_get_mapset(navit))) { + return; + } + + ret_attr = vehicle_get_attr(curr_vehicle, attr_position_coord_geo,&position_attr, NULL); + if(0==ret_attr) { + return; + } + + transform_from_geo(projection_mg, position_attr.u.coord_geo, &curr_coord); + + sel.next=NULL; + sel.order=18; + sel.range.min=type_tec_common; + sel.range.max=type_tec_common; + sel.u.c_rect.lu.x=curr_coord.x-dst; + sel.u.c_rect.lu.y=curr_coord.y+dst; + sel.u.c_rect.rl.x=curr_coord.x+dst; + sel.u.c_rect.rl.y=curr_coord.y-dst; + + msh=mapset_open(ms); + while ((map=mapset_next(msh, 1))) { + struct attr attr; + if(map_get_attr(map, attr_type, &attr, NULL)) { + if( strcmp("csv", attr.u.str) && strcmp("binfile", attr.u.str)) { + continue; + } + } + else { + continue; + } + mr=map_rect_new(map, &sel); + if (!mr) + continue; + while ((item=map_rect_get_item(mr))) { + struct coord cn; + if (item->type == type_tec_common && item_coord_get(item, &cn, 1)) { + int dist=transform_distance_sq(&cn, &curr_coord); + if (dist < dstsq) { + struct attr tec_attr; + bFound = 1; + dstsq=dist; + dCurrDist = sqrt(dist); + cam_coord = cn; + idx = -1; + if(item_attr_get(item,attr_tec_type,&tec_attr)) { + idx = tec_attr.u.num; + } + dir_idx = -1; + if(item_attr_get(item,attr_tec_dirtype,&tec_attr)) { + dir_idx = tec_attr.u.num; + } + dir= 0; + if(item_attr_get(item,attr_tec_direction,&tec_attr)) { + dir = tec_attr.u.num; + } + spd= 0; + if(item_attr_get(item,attr_maxspeed,&tec_attr)) { + spd = tec_attr.u.num; + } + } + } + } + map_rect_destroy(mr); + } + mapset_close(msh); + + if(bFound && (idx==-1 || this_->flags & (1<<(idx-1))) ) { + dCurrDist = transform_distance(projection_mg, &curr_coord, &cam_coord); + ret_attr = vehicle_get_attr(curr_vehicle,attr_position_speed,&speed_attr, NULL); + if(0==ret_attr) { + graphics_overlay_disable(opc->osd_item.gr,1); + return; + } + if (opc->osd_item.configured) { + graphics_overlay_disable(opc->osd_item.gr,0); + } + speed = *speed_attr.u.numd; + if(dCurrDist <= speed*750.0/130.0) { //at speed 130 distance limit is 750m + if(this_->announce_state==eNoWarn && this_->announce_on) { + this_->announce_state=eWarningTold; //warning told + navit_say(navit, _("Look out! Camera!")); + } + } + else { + this_->announce_state=eNoWarn; + } + + if(this_->text) { + char buffer [256]=""; + char buffer2[256]=""; + char dir_str[16]; + char spd_str[16]; + buffer [0] = 0; + buffer2[0] = 0; + + osd_std_draw(&opc->osd_item); + + str_replace(buffer,this_->text,"${distance}",format_distance(dCurrDist,"",imperial)); + str_replace(buffer2,buffer,"${camera_type}",(0<=idx && idx<=CAM_TRAFFIPAX)?camera_t_strs[idx]:""); + str_replace(buffer,buffer2,"${camera_dir}",(0<=dir_idx && dir_idx<=CAMDIR_TWO)?camdir_t_strs[dir_idx]:""); + sprintf(dir_str,"%d",dir); + sprintf(spd_str,"%d",spd); + str_replace(buffer2,buffer,"${direction}",dir_str); + str_replace(buffer,buffer2,"${speed_limit}",spd_str); + + graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, buffer, 0x10000, 0, bbox, 0); + p.x=(opc->osd_item.w-bbox[2].x)/2; + p.y = opc->osd_item.h-opc->osd_item.h/10; + curr_color = this_->orange; + //tolerance is +-20 degrees + if( + dir_idx==CAMDIR_ONE && + dCurrDist <= speed*750.0/130.0 && + vehicle_get_attr(v, attr_position_direction, &attr_dir, NULL) && + fabs(angle_diff(dir,*attr_dir.u.numd))<=20 ) { + curr_color = this_->red; + } + //tolerance is +-20 degrees in both directions + else if( + dir_idx==CAMDIR_TWO && + dCurrDist <= speed*750.0/130.0 && + vehicle_get_attr(v, attr_position_direction, &attr_dir, NULL) && + (fabs(angle_diff(dir,*attr_dir.u.numd))<=20 || fabs(angle_diff(dir+180,*attr_dir.u.numd))<=20 )) { + curr_color = this_->red; + } + else if(dCurrDist <= speed*750.0/130.0) { + curr_color = this_->red; + } + draw_multiline_osd_text(buffer,&opc->osd_item, curr_color); + graphics_draw_mode(opc->osd_item.gr, draw_mode_end); + } + } + else { + graphics_overlay_disable(opc->osd_item.gr,1); + } +} + +static void +osd_speed_cam_init(struct osd_priv_common *opc, struct navit *nav) +{ + struct osd_speed_cam *this = (struct osd_speed_cam *)opc->data; + + struct color red_color={0xffff,0x0000,0x0000,0xffff}; + osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); + + this->red = graphics_gc_new(opc->osd_item.gr); + graphics_gc_set_foreground(this->red, &red_color); + graphics_gc_set_linewidth(this->red, this->width); + + this->orange = graphics_gc_new(opc->osd_item.gr); + graphics_gc_set_foreground(this->orange, &this->idle_color); + graphics_gc_set_linewidth(this->orange, this->width); + + this->white = graphics_gc_new(opc->osd_item.gr); + graphics_gc_set_foreground(this->white, &opc->osd_item.text_color); + graphics_gc_set_linewidth(this->white, this->width); + + + graphics_gc_set_linewidth(opc->osd_item.graphic_fg_white, this->width); + + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_speed_cam_draw), attr_position_coord_geo, opc)); + +} + +static struct osd_priv * +osd_speed_cam_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) +{ + + struct color default_color={0xffff,0xa5a5,0x0000,0xffff}; + + struct osd_speed_cam *this = g_new0(struct osd_speed_cam, 1); + struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); + struct attr *attr; + + opc->data = (void*)this; + opc->osd_item.p.x = 120; + opc->osd_item.p.y = 20; + opc->osd_item.w = 60; + opc->osd_item.h = 80; + opc->osd_item.navit = nav; + opc->osd_item.font_size = 200; + opc->osd_item.meth.draw = osd_draw_cast(osd_speed_cam_draw); + meth->set_attr = (void (*)(struct osd_priv *osd, struct attr* attr))set_std_osd_attr; + + osd_set_std_attr(attrs, &opc->osd_item, 2); + attr = attr_search(attrs, NULL, attr_width); + this->width=attr ? attr->u.num : 2; + attr = attr_search(attrs, NULL, attr_idle_color); + this->idle_color=attr ? *attr->u.color : default_color; // text idle_color defaults to orange + + attr = attr_search(attrs, NULL, attr_label); + if (attr) { + this->text = g_strdup(attr->u.str); + } + else + this->text = NULL; + + attr = attr_search(attrs, NULL, attr_announce_on); + if (attr) { + this->announce_on = attr->u.num; + } + else { + this->announce_on = 1; //announce by default + } + + attr = attr_search(attrs, NULL, attr_flags); + if (attr) { + this->flags = attr->u.num; + } + else { + this->flags = -1; //every cam type is on by default + } + + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_speed_cam_init), attr_graphics_ready, opc)); + return (struct osd_priv *) opc; +} + +struct osd_speed_warner { + struct graphics_gc *red; + struct graphics_gc *green; + struct graphics_gc *grey; + struct graphics_gc *black; + struct graphics_gc *white; + int width; + int active; + int d; + double speed_exceed_limit_offset; + double speed_exceed_limit_percent; + int announce_on; + enum osd_speed_warner_eAnnounceState announce_state; + int bTextOnly; + struct graphics_image *img_active,*img_passive,*img_off; + char* label_str; +}; + +static void +osd_speed_warner_draw(struct osd_priv_common *opc, struct navit *navit, struct vehicle *v) +{ + struct osd_speed_warner *this = (struct osd_speed_warner *)opc->data; + + struct point p,bbox[4]; + char text[16]=""; + + struct tracking *tracking = NULL; + struct graphics_gc *osd_color=this->grey; + struct graphics_image *img = this->img_off; + + + osd_std_draw(&opc->osd_item); + p.x=opc->osd_item.w/2-this->d/4; + p.y=opc->osd_item.h/2-this->d/4; + p.x=opc->osd_item.w/2; + p.y=opc->osd_item.h/2; + + if (navit) { + tracking = navit_get_tracking(navit); + } + if (tracking) { + + struct attr maxspeed_attr,speed_attr,imperial_attr; + int *flags; + double routespeed = -1; + double tracking_speed = -1; + int osm_data = 0; + struct item *item; + int imperial=0; + + item=tracking_get_current_item(tracking); + + if(navit) { + if (navit_get_attr(navit, attr_imperial, &imperial_attr, NULL)) + imperial=imperial_attr.u.num; + } + + flags=tracking_get_current_flags(tracking); + if (flags && (*flags & AF_SPEED_LIMIT) && tracking_get_attr(tracking, attr_maxspeed, &maxspeed_attr, NULL)) { + routespeed = maxspeed_attr.u.num; + osm_data = 1; + } + if (routespeed == -1) { + struct vehicleprofile *prof=navit_get_vehicleprofile(navit); + struct roadprofile *rprof=NULL; + if (prof && item) + rprof=vehicleprofile_get_roadprofile(prof, item->type); + if (rprof) { + if(rprof->maxspeed!=0) + routespeed=rprof->maxspeed; + } + } + tracking_get_attr(tracking, attr_position_speed, &speed_attr, NULL); + tracking_speed = *speed_attr.u.numd; + if( -1 != tracking_speed && -1 != routespeed ) { + char*routespeed_str = format_speed(routespeed,"","value",imperial); + g_snprintf(text,16,"%s%s",osm_data ? "" : "~",routespeed_str); + g_free(routespeed_str); + if( this->speed_exceed_limit_offset+routespeedspeed_exceed_limit_percent)/100.0*routespeedannounce_state==eNoWarn && this->announce_on) { + this->announce_state=eWarningTold; //warning told + navit_say(navit,_("Please decrease your speed")); + } + } + if( tracking_speed <= routespeed ) { + this->announce_state=eNoWarn; //no warning + osd_color = this->green; + img = this->img_passive; + } + else { + osd_color = this->red; + img = this->img_active; + } + } else { + osd_color = this->grey; + img = this->img_off; + this->announce_state = eNoWarn; + } + } else { + //when tracking is not available display grey + osd_color = this->grey; + img = this->img_off; + this->announce_state = eNoWarn; + } + if(this->img_active && this->img_passive && this->img_off) { + struct point p; + p.x=(opc->osd_item.w-img->width)/2; + p.y=(opc->osd_item.h-img->height)/2; + graphics_draw_image(opc->osd_item.gr, opc->osd_item.graphic_bg, &p, img); + } + else if(0==this->bTextOnly) { + graphics_draw_circle(opc->osd_item.gr, osd_color, &p, this->d-this->width*2 ); + } + graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, text, 0x10000, 0, bbox, 0); + p.x=(opc->osd_item.w-bbox[2].x)/2; + p.y=(opc->osd_item.h+bbox[2].y)/2-bbox[2].y; + graphics_draw_text(opc->osd_item.gr, osd_color, NULL, opc->osd_item.font, text, &p, 0x10000, 0); + graphics_draw_mode(opc->osd_item.gr, draw_mode_end); +} + +static void +osd_speed_warner_init(struct osd_priv_common *opc, struct navit *nav) +{ + struct osd_speed_warner *this = (struct osd_speed_warner *)opc->data; + + struct color white_color={0xffff,0xffff,0xffff,0x0000}; + struct color red_color={0xffff,0,0,0xffff}; + struct color green_color={0,0xffff,0,0xffff}; + struct color grey_color={0x8888,0x8888,0x8888,0x8888}; + struct color black_color={0x1111,0x1111,0x1111,0x9999}; + + osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_speed_warner_draw), attr_position_coord_geo, opc)); + + if(this->label_str && !strncmp("images:",this->label_str,7)) { + char *tok1=NULL, *tok2=NULL, *tok3=NULL; + strtok(this->label_str,":"); + tok1 = strtok(NULL,":"); + if(tok1) { + tok2 = strtok(NULL,":"); + } + if(tok1 && tok2) { + tok3 = strtok(NULL,":"); + } + if(tok1 && tok2 && tok3) { + tok1 = graphics_icon_path(tok1); + tok2 = graphics_icon_path(tok2); + tok3 = graphics_icon_path(tok3); + this->img_active = graphics_image_new(opc->osd_item.gr, tok1); + this->img_passive = graphics_image_new(opc->osd_item.gr, tok2); + this->img_off = graphics_image_new(opc->osd_item.gr, tok3); + g_free(tok1); + g_free(tok2); + g_free(tok3); + } + } + + g_free(this->label_str); + this->label_str = NULL; + + this->white=graphics_gc_new(opc->osd_item.gr); + graphics_gc_set_foreground(this->white, &white_color); + + graphics_gc_set_linewidth(this->white, this->d/2-2 /*-this->width*/ ); + + this->red=graphics_gc_new(opc->osd_item.gr); + graphics_gc_set_foreground(this->red, &red_color); + graphics_gc_set_linewidth(this->red, this->width); + + this->green=graphics_gc_new(opc->osd_item.gr); + graphics_gc_set_foreground(this->green, &green_color); + graphics_gc_set_linewidth(this->green, this->width-2); + + this->grey=graphics_gc_new(opc->osd_item.gr); + graphics_gc_set_foreground(this->grey, &grey_color); + graphics_gc_set_linewidth(this->grey, this->width); + + this->black=graphics_gc_new(opc->osd_item.gr); + graphics_gc_set_foreground(this->black, &black_color); + graphics_gc_set_linewidth(this->black, this->width); + + osd_speed_warner_draw(opc, nav, NULL); +} + +static struct osd_priv * +osd_speed_warner_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) +{ + struct osd_speed_warner *this=g_new0(struct osd_speed_warner, 1); + struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); + struct attr *attr; + + opc->data = (void*)this; + opc->osd_item.p.x=-80; + opc->osd_item.p.y=20; + opc->osd_item.w=60; + opc->osd_item.navit = nav; + opc->osd_item.h=60; + this->active=-1; + opc->osd_item.meth.draw = osd_draw_cast(osd_speed_warner_draw); + meth->set_attr = (void (*)(struct osd_priv *osd, struct attr* attr))set_std_osd_attr; + + attr = attr_search(attrs, NULL, attr_speed_exceed_limit_offset); + if (attr) { + this->speed_exceed_limit_offset = attr->u.num; + } else + this->speed_exceed_limit_offset = 15; //by default 15 km/h + + attr = attr_search(attrs, NULL, attr_speed_exceed_limit_percent); + if (attr) { + this->speed_exceed_limit_percent = attr->u.num; + } else + this->speed_exceed_limit_percent = 10; //by default factor of 1.1 + + this->bTextOnly = 0; //by default display graphics also + attr = attr_search(attrs, NULL, attr_label); + if (attr) { + this->label_str = g_strdup(attr->u.str); + if (!strcmp("text_only",attr->u.str)) { + this->bTextOnly = 1; + } + } + + attr = attr_search(attrs, NULL, attr_announce_on); + if (attr) + this->announce_on = attr->u.num; + else + this->announce_on = 1; //announce by default + osd_set_std_attr(attrs, &opc->osd_item, 2); + this->d=opc->osd_item.w; + if (opc->osd_item.h < this->d) + this->d=opc->osd_item.h; + this->width=this->d/10; + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_speed_warner_init), attr_graphics_ready, opc)); + return (struct osd_priv *) opc; +} + +struct osd_text_item { + int static_text; + char *text; + void *prev; + void *next; + enum attr_type section; + enum attr_type attr_typ; + void *root; + int offset; + char *format; +}; + +struct osd_text { + int active; + char *text; + int align; + char *last; + struct osd_text_item *items; +}; + + +/** + * @brief Format a text attribute + * + * Returns the formatted current value of an attribute as a string + * + * @param attr Pointer to an attr structure specifying the attribute to be formatted + * @param format Pointer to a string specifying how to format the attribute. Allowed format strings depend on the attribute; this member can be NULL. + * @returns Pointer to a string containing the formatted value + */ +static char * +osd_text_format_attr(struct attr *attr, char *format, int imperial) +{ + struct tm tm, text_tm, text_tm0; + time_t textt; + int days=0; + char buffer[1024]; + + switch (attr->type) { + case attr_position_speed: + return format_speed(*attr->u.numd,"",format,imperial); + case attr_position_height: + case attr_position_direction: + return format_float_0(*attr->u.numd); + case attr_position_magnetic_direction: + return g_strdup_printf("%ld",attr->u.num); + case attr_position_coord_geo: + if ((!format) || (!strcmp(format,"pos_degminsec"))) + { + coord_format(attr->u.coord_geo->lat,attr->u.coord_geo->lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); + return g_strdup(buffer); + } + else if (!strcmp(format,"pos_degmin")) + { + coord_format(attr->u.coord_geo->lat,attr->u.coord_geo->lng,DEGREES_MINUTES,buffer,sizeof(buffer)); + return g_strdup(buffer); + } + else if (!strcmp(format,"pos_deg")) + { + coord_format(attr->u.coord_geo->lat,attr->u.coord_geo->lng,DEGREES_DECIMAL,buffer,sizeof(buffer)); + return g_strdup(buffer); + } + else if (!strcmp(format,"lat_degminsec")) + { + coord_format(attr->u.coord_geo->lat,360,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); + return g_strdup(buffer); + } + else if (!strcmp(format,"lat_degmin")) + { + coord_format(attr->u.coord_geo->lat,360,DEGREES_MINUTES,buffer,sizeof(buffer)); + return g_strdup(buffer); + } + else if (!strcmp(format,"lat_deg")) + { + coord_format(attr->u.coord_geo->lat,360,DEGREES_DECIMAL,buffer,sizeof(buffer)); + return g_strdup(buffer); + } + else if (!strcmp(format,"lng_degminsec")) + { + coord_format(360,attr->u.coord_geo->lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); + return g_strdup(buffer); + } + else if (!strcmp(format,"lng_degmin")) + { + coord_format(360,attr->u.coord_geo->lng,DEGREES_MINUTES,buffer,sizeof(buffer)); + return g_strdup(buffer); + } + else if (!strcmp(format,"lng_deg")) + { + coord_format(360,attr->u.coord_geo->lng,DEGREES_DECIMAL,buffer,sizeof(buffer)); + return g_strdup(buffer); + } + else + { // fall back to pos_degminsec + coord_format(attr->u.coord_geo->lat,attr->u.coord_geo->lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); + return g_strdup(buffer); + } + case attr_destination_time: + if (!format || (strcmp(format,"arrival") && strcmp(format,"remaining"))) + break; + textt = time(NULL); + tm = *localtime(&textt); + if (!strcmp(format,"remaining")) { + textt-=tm.tm_hour*3600+tm.tm_min*60+tm.tm_sec; + tm = *localtime(&textt); + } + textt += attr->u.num / 10; + text_tm = *localtime(&textt); + if (tm.tm_year != text_tm.tm_year || tm.tm_mon != text_tm.tm_mon || tm.tm_mday != text_tm.tm_mday) { + text_tm0 = text_tm; + text_tm0.tm_sec = 0; + text_tm0.tm_min = 0; + text_tm0.tm_hour = 0; + tm.tm_sec = 0; + tm.tm_min = 0; + tm.tm_hour = 0; + days = (mktime(&text_tm0) - mktime(&tm) + 43200) / 86400; + } + return format_time(&text_tm, days); + case attr_length: + case attr_destination_length: + if (!format) + break; + if (!strcmp(format,"named")) + return format_distance(attr->u.num,"",imperial); + if (!strcmp(format,"value") || !strcmp(format,"unit")) { + char *ret,*tmp=format_distance(attr->u.num," ",imperial); + char *pos=strchr(tmp,' '); + if (! pos) + return tmp; + *pos++='\0'; + if (!strcmp(format,"value")) + return tmp; + ret=g_strdup(pos); + g_free(tmp); + return ret; + } + case attr_position_time_iso8601: + if ((!format) || (!strcmp(format,"iso8601"))) + { + break; + } + else + { + if (strstr(format, "local;") == format) + { + textt = iso8601_to_secs(attr->u.str); + memcpy ((void *) &tm, (void *) localtime(&textt), sizeof(tm)); + strftime(buffer, sizeof(buffer), (char *)(format + 6), &tm); + } + else if ((sscanf(format, "%*c%2d:%2d;", &(text_tm.tm_hour), &(text_tm.tm_min)) == 2) && (strchr("+-", format[0]))) + { + if (strchr("-", format[0])) + { + textt = iso8601_to_secs(attr->u.str) - text_tm.tm_hour * 3600 - text_tm.tm_min * 60; + } + else + { + textt = iso8601_to_secs(attr->u.str) + text_tm.tm_hour * 3600 + text_tm.tm_min * 60; + } + memcpy ((void *) &tm, (void *) gmtime(&textt), sizeof(tm)); + strftime(buffer, sizeof(buffer), &format[strcspn(format, ";") + 1], &tm); + } + else + { + sscanf(attr->u.str, "%4d-%2d-%2dT%2d:%2d:%2d", &(tm.tm_year), &(tm.tm_mon), &(tm.tm_mday), &(tm.tm_hour), &(tm.tm_min), &(tm.tm_sec)); + // the tm structure definition is kinda weird and needs some extra voodoo + tm.tm_year-=1900; tm.tm_mon--; + // get weekday and day of the year + mktime(&tm); + strftime(buffer, sizeof(buffer), format, &tm); + } + return g_strdup(buffer); + } + default: + break; + } + return attr_to_text(attr, NULL, 1); +} + +/** + * Parse a string of the form key.subkey or key[index].subkey into its components, where subkey can itself have its own index and further subkeys + * + * @param in String to parse (the part before subkey will be modified by the function); upon returning this pointer will point to a string containing key + * @param index Pointer to an address that will receive a pointer to a string containing index or a null pointer if key does not have an index + * @returns If the function succeeds, a pointer to a string containing subkey, i.e. everything following the first period, or a pointer to an empty string if there is nothing left to parse. If the function fails(index with missing closed bracket or passing a null pointer as index argument when an index was encountered), the return value is NULL + */ +static char * +osd_text_split(char *in, char **index) +{ + char *pos; + int len; + if (index) + *index=NULL; + len=strcspn(in,"[."); + in+=len; + switch (in[0]) { + case '\0': + return in; + case '.': + *in++='\0'; + return in; + case '[': + if (!index) + return NULL; + *in++='\0'; + *index=in; + pos=strchr(in,']'); + if (pos) { + *pos++='\0'; + if (*pos == '.') { + *pos++='\0'; + } + return pos; + } + return NULL; + } + return NULL; +} + +static void +osd_text_draw(struct osd_priv_common *opc, struct navit *navit, struct vehicle *v) +{ + struct osd_text *this = (struct osd_text *)opc->data; + struct point p, p2[4]; + char *str,*last,*next,*value,*absbegin; + int do_draw = 0; + struct attr attr, vehicle_attr, maxspeed_attr, imperial_attr; + struct navigation *nav = NULL; + struct tracking *tracking = NULL; + struct route *route = NULL; + struct map *nav_map = NULL; + struct map_rect *nav_mr = NULL; + struct item *item; + struct osd_text_item *oti; + int offset,lines; + int height=opc->osd_item.font_size*13/256; + int yspacing=height/2; + int xspacing=height/4; + int imperial=0; + + if (navit_get_attr(navit, attr_imperial, &imperial_attr, NULL)) + imperial=imperial_attr.u.num; + + vehicle_attr.u.vehicle=NULL; + oti=this->items; + str=NULL; + + while (oti) { + item=NULL; + value=NULL; + + if (oti->static_text) { + value=g_strdup(oti->text); + } else if (oti->section == attr_navigation) { + if (navit && !nav) + nav = navit_get_navigation(navit); + if (nav && !nav_map) + nav_map = navigation_get_map(nav); + if (nav_map ) + nav_mr = map_rect_new(nav_map, NULL); + if (nav_mr) + item = map_rect_get_item(nav_mr); + + offset=oti->offset; + while (item) { + if (item->type == type_nav_none) + item=map_rect_get_item(nav_mr); + else if (!offset) + break; + else { + offset--; + item=map_rect_get_item(nav_mr); + } + } + + if (item) { + dbg(1,"name %s\n", item_to_name(item->type)); + dbg(1,"type %s\n", attr_to_name(oti->attr_typ)); + if (item_attr_get(item, oti->attr_typ, &attr)) + value=osd_text_format_attr(&attr, oti->format, imperial); + } + if (nav_mr) + map_rect_destroy(nav_mr); + } else if (oti->section == attr_vehicle) { + if (navit && !vehicle_attr.u.vehicle) { + navit_get_attr(navit, attr_vehicle, &vehicle_attr, NULL); + } + if (vehicle_attr.u.vehicle) { + if (vehicle_get_attr(vehicle_attr.u.vehicle, oti->attr_typ, &attr, NULL)) { + value=osd_text_format_attr(&attr, oti->format, imperial); + } + } + } else if (oti->section == attr_tracking) { + if (navit) { + tracking = navit_get_tracking(navit); + route = navit_get_route(navit); + } + if (tracking) { + item=tracking_get_current_item(tracking); + if (item && (oti->attr_typ == attr_speed)) { + double routespeed = -1; + int *flags=tracking_get_current_flags(tracking); + if (flags && (*flags & AF_SPEED_LIMIT) && tracking_get_attr(tracking, attr_maxspeed, &maxspeed_attr, NULL)) { + routespeed = maxspeed_attr.u.num; + } + if (routespeed == -1) { + struct vehicleprofile *prof=navit_get_vehicleprofile(navit); + struct roadprofile *rprof=NULL; + if (prof) + rprof=vehicleprofile_get_roadprofile(prof, item->type); + if (rprof) { + routespeed=rprof->speed; + } + } + + value = format_speed(routespeed,"", oti->format, imperial); + } else if (item) { + if (tracking_get_attr(tracking, oti->attr_typ, &attr, NULL)) + value=osd_text_format_attr(&attr, oti->format, imperial); + } + } + + } else if (oti->section == attr_navit) { + if (oti->attr_typ == attr_message) { + struct message *msg; + int len,offset; + char *tmp; + + msg = navit_get_messages(navit); + len = 0; + while (msg) { + len+= strlen(msg->text) + 2; + + msg = msg->next; + } + + value = g_malloc(len +1); + + msg = navit_get_messages(navit); + offset = 0; + while (msg) { + tmp = g_stpcpy((value+offset), msg->text); + g_stpcpy(tmp, "\\n"); + offset += strlen(msg->text) + 2; + + msg = msg->next; + } + + value[len] = '\0'; + } + } + + next=g_strdup_printf("%s%s",str ? str:"",value ? value:" "); + if (value) + g_free(value); + if (str) + g_free(str); + str=next; + oti=oti->next; + } + + if ( this->last && str && !strcmp(this->last, str) ) { + do_draw=0; + } else { + do_draw=1; + if (this->last) + g_free(this->last); + this->last = g_strdup(str); + } + + absbegin=str; + if (do_draw) { + //osd_std_draw(&opc->osd_item); + } + if (do_draw && str) { + osd_std_draw(&opc->osd_item); + lines=0; + next=str; + last=str; + while ((next=strstr(next, "\\n"))) { + last = next; + lines++; + next++; + } + + while (*last) { + if (! g_ascii_isspace(*last)) { + lines++; + break; + } + last++; + } + + dbg(1,"this->align=%d\n", this->align); + switch (this->align & 51) { + case 1: + p.y=0; + break; + case 2: + p.y=(opc->osd_item.h-lines*(height+yspacing)-yspacing); + break; + case 16: // Grow from top to bottom + p.y = 0; + if (lines != 0) { + opc->osd_item.h = (lines-1) * (height+yspacing) + height; + } else { + opc->osd_item.h = 0; + } + + if (do_draw) { + osd_std_resize(&opc->osd_item); + } + default: + p.y=(opc->osd_item.h-lines*(height+yspacing)-yspacing)/2; + } + + while (str) { + next=strstr(str, "\\n"); + if (next) { + *next='\0'; + next+=2; + } + graphics_get_text_bbox(opc->osd_item.gr, + opc->osd_item.font, + str, 0x10000, + 0x0, p2, 0); + switch (this->align & 12) { + case 4: + p.x=xspacing; + break; + case 8: + p.x=opc->osd_item.w-(p2[2].x-p2[0].x)-xspacing; + break; + default: + p.x = ((p2[0].x - p2[2].x) / 2) + (opc->osd_item.w / 2); + } + p.y += height+yspacing; + graphics_draw_text(opc->osd_item.gr, + opc->osd_item.graphic_fg_text, + NULL, opc->osd_item.font, + str, &p, 0x10000, + 0); + str=next; + } + } + if(do_draw) { + graphics_draw_mode(opc->osd_item.gr, draw_mode_end); + } + g_free(absbegin); + +} + +/** + * @brief Create a new osd_text_item and insert it into a linked list + * + * @param parent Pointer to the preceding osd_text_item structure in the list. If NULL, the new osd_text_item becomes the root element of a new list. + * @returns A pointer to the new osd_text_item element. + */ +static struct osd_text_item * +oti_new(struct osd_text_item * parent) +{ + struct osd_text_item *this; + this=g_new0(struct osd_text_item, 1); + this->prev=parent; + + if(!parent) { + this->root=this; + } else { + parent->next=this; + this->root=parent->root; + } + + return this; +} + +/** + * @brief Prepare a text type OSD element + * + * Parses the label string (as specified in the XML file) for a text type OSD element into attributes and static text. + * + * @param this Pointer to an osd_text structure representing the OSD element. The items member of this structure will receive a pointer to a list of osd_text_item structures. + * @param nav Pointer to a navit structure + * @returns nothing + */ +static void +osd_text_prepare(struct osd_priv_common *opc, struct navit *nav) +{ + struct osd_text *this = (struct osd_text *)opc->data; + + char *absbegin,*str,*start,*end,*key,*subkey,*index; + struct osd_text_item *oti; + + oti=NULL; + str=g_strdup(this->text); + absbegin=str; + + while ((start=strstr(str, "${"))) { + + *start='\0'; + start+=2; + + // find plain text before + if (start!=str) { + oti = oti_new(oti); + oti->static_text=1; + oti->text=g_strdup(str); + + } + + end=strstr(start,"}"); + if (! end) + break; + + *end++='\0'; + key=start; + + subkey=osd_text_split(key,NULL); + + oti = oti_new(oti); + oti->section=attr_from_name(key); + + if (( oti->section == attr_navigation || + oti->section == attr_tracking) && subkey) { + key=osd_text_split(subkey,&index); + + if (index) + oti->offset=atoi(index); + + subkey=osd_text_split(key,&index); + + if (!strcmp(key,"route_speed")) { + oti->attr_typ=attr_speed; + } else { + oti->attr_typ=attr_from_name(key); + } + oti->format = g_strdup(index); + + } else if ((oti->section == attr_vehicle || oti->section == attr_navit) && subkey) { + key=osd_text_split(subkey,&index); + if (!strcmp(subkey,"messages")) { + oti->attr_typ=attr_message; + } else { + oti->attr_typ=attr_from_name(subkey); + } + oti->format = g_strdup(index); + } + + switch(oti->attr_typ) { + default: + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_text_draw), attr_position_coord_geo, opc)); + break; + } + + str=(end); + } + + if(*str!='\0'){ + oti = oti_new(oti); + oti->static_text=1; + oti->text=g_strdup(str); + } + + if (oti) + this->items=oti->root; + else + this->items=NULL; + + g_free(absbegin); + +} + +static void +osd_text_init(struct osd_priv_common *opc, struct navit *nav) +{ + osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_std_click), attr_button, &opc->osd_item)); + osd_text_prepare(opc,nav); + osd_text_draw(opc, nav, NULL); + +} + +static struct osd_priv * +osd_text_new(struct navit *nav, struct osd_methods *meth, + struct attr **attrs) +{ + struct osd_text *this = g_new0(struct osd_text, 1); + struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); + struct attr *attr; + + opc->data = (void*)this; + opc->osd_item.p.x = -80; + opc->osd_item.p.y = 20; + opc->osd_item.w = 60; + opc->osd_item.h = 20; + opc->osd_item.navit = nav; + opc->osd_item.font_size = 200; + opc->osd_item.meth.draw = osd_draw_cast(osd_text_draw); + meth->set_attr = (void (*)(struct osd_priv *osd, struct attr* attr))set_std_osd_attr; + osd_set_std_attr(attrs, &opc->osd_item, 2); + + this->active = -1; + this->last = NULL; + + attr = attr_search(attrs, NULL, attr_label); + if (attr) + this->text = g_strdup(attr->u.str); + else + this->text = NULL; + attr = attr_search(attrs, NULL, attr_align); + if (attr) + this->align=attr->u.num; + + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_text_init), attr_graphics_ready, opc)); + return (struct osd_priv *) opc; +} + +struct gps_status { + char *icon_src; + int icon_h, icon_w, active; + int strength; +}; + +static void +osd_gps_status_draw(struct osd_priv_common *opc, struct navit *navit, + struct vehicle *v) +{ + struct gps_status *this = (struct gps_status *)opc->data; + + struct point p; + int do_draw = 0; + struct graphics_image *gr_image; + char *image; + struct attr attr, vehicle_attr; + int strength=-1; + + if (navit && navit_get_attr(navit, attr_vehicle, &vehicle_attr, NULL)) { + if (vehicle_get_attr(vehicle_attr.u.vehicle, attr_position_fix_type, &attr, NULL)) { + switch(attr.u.num) { + case 1: + case 2: + strength=2; + if (vehicle_get_attr(vehicle_attr.u.vehicle, attr_position_sats_used, &attr, NULL)) { + dbg(1,"num=%d\n", attr.u.num); + if (attr.u.num >= 3) + strength=attr.u.num-1; + if (strength > 5) + strength=5; + if (strength > 3) { + if (vehicle_get_attr(vehicle_attr.u.vehicle, attr_position_hdop, &attr, NULL)) { + if (*attr.u.numd > 2.0 && strength > 4) + strength=4; + if (*attr.u.numd > 4.0 && strength > 3) + strength=3; + } + } + } + break; + default: + strength=1; + } + } + } + if (this->strength != strength) { + this->strength=strength; + do_draw=1; + } + if (do_draw) { + osd_std_draw(&opc->osd_item); + if (this->active) { + image = g_strdup_printf(this->icon_src, strength); + gr_image = graphics_image_new_scaled(opc->osd_item.gr, image, this->icon_w, this->icon_h); + if (gr_image) { + p.x = (opc->osd_item.w - gr_image->width) / 2; + p.y = (opc->osd_item.h - gr_image->height) / 2; + graphics_draw_image(opc->osd_item.gr, opc->osd_item. graphic_fg_white, &p, gr_image); + graphics_image_free(opc->osd_item.gr, gr_image); + } + g_free(image); + } + graphics_draw_mode(opc->osd_item.gr, draw_mode_end); + } +} + +static void +osd_gps_status_init(struct osd_priv_common *opc, struct navit *nav) +{ + osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_gps_status_draw), attr_position_coord_geo, opc)); + osd_gps_status_draw(opc, nav, NULL); +} + +static struct osd_priv * +osd_gps_status_new(struct navit *nav, struct osd_methods *meth, + struct attr **attrs) +{ + struct gps_status *this = g_new0(struct gps_status, 1); + struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); + struct attr *attr; + + opc->data = (void*)this; + opc->osd_item.p.x = 20; + opc->osd_item.p.y = -80; + opc->osd_item.w = 60; + opc->osd_item.navit = nav; + opc->osd_item.h = 40; + opc->osd_item.font_size = 200; + opc->osd_item.meth.draw = osd_draw_cast(osd_gps_status_draw); + meth->set_attr = (void (*)(struct osd_priv *osd, struct attr* attr))set_std_osd_attr; + osd_set_std_attr(attrs, &opc->osd_item, 0); + + this->icon_w = -1; + this->icon_h = -1; + this->active = -1; + this->strength = -2; + + attr = attr_search(attrs, NULL, attr_icon_w); + if (attr) + this->icon_w = attr->u.num; + + attr = attr_search(attrs, NULL, attr_icon_h); + if (attr) + this->icon_h = attr->u.num; + + attr = attr_search(attrs, NULL, attr_icon_src); + if (attr) { + struct file_wordexp *we; + char **array; + we = file_wordexp_new(attr->u.str); + array = file_wordexp_get_array(we); + this->icon_src = g_strdup(array[0]); + file_wordexp_destroy(we); + } else + this->icon_src = graphics_icon_path("gui_strength_%d_32_32.png"); + + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_gps_status_init), attr_graphics_ready, opc)); + return (struct osd_priv *) opc; +} + + +struct volume { + char *icon_src; + int icon_h, icon_w, active; + int strength; + struct callback *click_cb; +}; + +static void +osd_volume_draw(struct osd_priv_common *opc, struct navit *navit) +{ + struct volume *this = (struct volume *)opc->data; + + struct point p; + struct graphics_image *gr_image; + char *image; + + osd_std_draw(&opc->osd_item); + if (this->active) { + image = g_strdup_printf(this->icon_src, this->strength); + gr_image = graphics_image_new_scaled(opc->osd_item.gr, image, this->icon_w, this->icon_h); + if (gr_image) { + p.x = (opc->osd_item.w - gr_image->width) / 2; + p.y = (opc->osd_item.h - gr_image->height) / 2; + graphics_draw_image(opc->osd_item.gr, opc->osd_item. graphic_fg_white, &p, gr_image); + graphics_image_free(opc->osd_item.gr, gr_image); + } + g_free(image); + } + graphics_draw_mode(opc->osd_item.gr, draw_mode_end); +} + +static void +osd_volume_click(struct osd_priv_common *opc, struct navit *nav, int pressed, int button, struct point *p) +{ + struct volume *this = (struct volume *)opc->data; + + struct point bp = opc->osd_item.p; + osd_wrap_point(&bp, nav); + if ((p->x < bp.x || p->y < bp.y || p->x > bp.x + opc->osd_item.w || p->y > bp.y + opc->osd_item.h) && !opc->osd_item.pressed) + return; + navit_ignore_button(nav); + if (pressed) { + if (p->y - bp.y < opc->osd_item.h/2) + this->strength++; + else + this->strength--; + if (this->strength < 0) + this->strength=0; + if (this->strength > 5) + this->strength=5; + osd_volume_draw(opc, nav); + } +} +static void +osd_volume_init(struct osd_priv_common *opc, struct navit *nav) +{ + struct volume *this = (struct volume *)opc->data; + + osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); + navit_add_callback(nav, this->click_cb = callback_new_attr_1(callback_cast (osd_volume_click), attr_button, opc)); + osd_volume_draw(opc, nav); +} + +static struct osd_priv * +osd_volume_new(struct navit *nav, struct osd_methods *meth, + struct attr **attrs) +{ + struct volume *this = g_new0(struct volume, 1); + struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); + struct attr *attr; + + opc->data = (void*)this; + opc->osd_item.p.x = 20; + opc->osd_item.p.y = -80; + opc->osd_item.w = 60; + opc->osd_item.navit = nav; + opc->osd_item.h = 40; + opc->osd_item.font_size = 200; + opc->osd_item.meth.draw = osd_draw_cast(osd_volume_draw); + meth->set_attr = (void (*)(struct osd_priv *osd, struct attr* attr))set_std_osd_attr; + osd_set_std_attr(attrs, &opc->osd_item, 0); + + this->icon_w = -1; + this->icon_h = -1; + this->active = -1; + this->strength = -1; + + attr = attr_search(attrs, NULL, attr_icon_w); + if (attr) + this->icon_w = attr->u.num; + + attr = attr_search(attrs, NULL, attr_icon_h); + if (attr) + this->icon_h = attr->u.num; + + attr = attr_search(attrs, NULL, attr_icon_src); + if (attr) { + struct file_wordexp *we; + char **array; + we = file_wordexp_new(attr->u.str); + array = file_wordexp_get_array(we); + this->icon_src = g_strdup(array[0]); + file_wordexp_destroy(we); + } else + this->icon_src = graphics_icon_path("gui_strength_%d_32_32.png"); + + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_volume_init), attr_graphics_ready, opc)); + return (struct osd_priv *) opc; +} + +struct osd_scale { + int use_overlay; + struct callback *draw_cb,*navit_init_cb; + struct graphics_gc *black; +}; + +static void +osd_scale_draw(struct osd_priv_common *opc, struct navit *nav) +{ + struct osd_scale *this = (struct osd_scale *)opc->data; + + struct point bp,bp1,bp2; + struct point p[10],bbox[4]; + struct coord c[2]; + struct attr transformation, imperial_attr; + int len; + double dist,exp,base,man; + char *text; + int w=opc->osd_item.w*9/10; + int o=(opc->osd_item.w-w)/2; + int imperial=0; + + if (navit_get_attr(nav, attr_imperial, &imperial_attr, NULL)) + imperial=imperial_attr.u.num; + + if (!navit_get_attr(nav, attr_transformation, &transformation, NULL)) + return; + if (this->use_overlay) { + graphics_draw_mode(opc->osd_item.gr, draw_mode_begin); + bp.x=0; + bp.y=0; + graphics_draw_rectangle(opc->osd_item.gr, opc->osd_item.graphic_bg, &bp, opc->osd_item.w, opc->osd_item.h); + } else { + bp=opc->osd_item.p; + osd_wrap_point(&bp, nav); + } + bp1=bp; + bp1.y+=opc->osd_item.h/2; + bp1.x+=o; + bp2=bp1; + bp2.x+=w; + p[0]=bp1; + p[1]=bp2; + transform_reverse(transformation.u.transformation, &p[0], &c[0]); + transform_reverse(transformation.u.transformation, &p[1], &c[1]); + dist=transform_distance(transform_get_projection(transformation.u.transformation), &c[0], &c[1]); + exp=floor(log10(dist)); + base=pow(10,exp); + man=dist/base; + if (man >= 5) + man=5; + else if (man >= 2) + man=2; + else + man=1; + len=opc->osd_item.w-man*base/dist*w; + p[0].x+=len/2; + p[1].x-=len/2; + p[2]=p[0]; + p[3]=p[0]; + p[2].y-=opc->osd_item.h/10; + p[3].y+=opc->osd_item.h/10; + p[4]=p[1]; + p[5]=p[1]; + p[4].y-=opc->osd_item.h/10; + p[5].y+=opc->osd_item.h/10; + p[6]=p[2]; + p[6].x-=2; + p[6].y-=2; + p[7]=p[0]; + p[7].y-=2; + p[8]=p[4]; + p[8].x-=2; + p[8].y-=2; + graphics_draw_rectangle(opc->osd_item.gr, opc->osd_item.graphic_fg_white, p+6, 4,opc->osd_item.h/5+4); + graphics_draw_rectangle(opc->osd_item.gr, opc->osd_item.graphic_fg_white, p+7, p[1].x-p[0].x, 4); + graphics_draw_rectangle(opc->osd_item.gr, opc->osd_item.graphic_fg_white, p+8, 4,opc->osd_item.h/5+4); + graphics_draw_lines(opc->osd_item.gr, this->black, p, 2); + graphics_draw_lines(opc->osd_item.gr, this->black, p+2, 2); + graphics_draw_lines(opc->osd_item.gr, this->black, p+4, 2); + text=format_distance(man*base, "", imperial); + graphics_get_text_bbox(opc->osd_item.gr, opc->osd_item.font, text, 0x10000, 0, bbox, 0); + p[0].x=(opc->osd_item.w-bbox[2].x)/2+bp.x; + p[0].y=bp.y+opc->osd_item.h-opc->osd_item.h/10; + graphics_draw_text(opc->osd_item.gr, this->black, opc->osd_item.graphic_fg_white, opc->osd_item.font, text, &p[0], 0x10000, 0); + g_free(text); + if (this->use_overlay) + graphics_draw_mode(opc->osd_item.gr, draw_mode_end); +} + +static void +osd_scale_init(struct osd_priv_common *opc, struct navit *nav) +{ + struct osd_scale *this = (struct osd_scale *)opc->data; + + struct color color_white={COLOR_WHITE_}; + struct color color_black={COLOR_BLACK_}; + struct graphics *gra = navit_get_graphics(nav); + dbg(1, "enter\n"); + if (this->use_overlay) { + osd_set_std_graphic(nav, &opc->osd_item, (struct osd_priv *)opc); + } else { + opc->osd_item.configured=1; + opc->osd_item.gr=gra; + opc->osd_item.font = graphics_font_new(opc->osd_item.gr, opc->osd_item.font_size, 1); + opc->osd_item.graphic_fg_white=graphics_gc_new(opc->osd_item.gr); + opc->osd_item.color_white=color_white; + graphics_gc_set_foreground(opc->osd_item.graphic_fg_white, &opc->osd_item.color_white); + } + this->black=graphics_gc_new(opc->osd_item.gr); + graphics_gc_set_foreground(this->black, &color_black); + graphics_add_callback(gra, this->draw_cb=callback_new_attr_2(callback_cast(osd_scale_draw), attr_postdraw, opc, nav)); + if (navit_get_ready(nav) == 3) + osd_scale_draw(opc, nav); +} + +static struct osd_priv * +osd_scale_new(struct navit *nav, struct osd_methods *meth, + struct attr **attrs) +{ + struct osd_scale *this = g_new0(struct osd_scale, 1); + struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); + struct attr *attr; + + opc->data = (void*)this; + + opc->osd_item.navit = nav; + opc->osd_item.meth.draw = osd_draw_cast(osd_scale_draw); + meth->set_attr = (void (*)(struct osd_priv *osd, struct attr* attr))set_std_osd_attr; + + osd_set_std_attr(attrs, &opc->osd_item, 3); + + attr=attr_search(attrs, NULL, attr_use_overlay); + if (attr) + this->use_overlay=attr->u.num; + + navit_add_callback(nav, this->navit_init_cb = callback_new_attr_1(callback_cast (osd_scale_init), attr_graphics_ready, opc)); + + return (struct osd_priv *) opc; +} + +struct auxmap { + struct displaylist *displaylist; + struct transformation *ntrans; + struct transformation *trans; + struct layout *layout; + struct callback *postdraw_cb; + struct graphics_gc *red; + struct navit *nav; +}; + +static void +osd_auxmap_draw(struct osd_priv_common *opc) +{ + struct auxmap *this = (struct auxmap *)opc->data; + + int d=10; + struct point p; + struct attr mapset; + + if (!opc->osd_item.configured) + return; + if (!navit_get_attr(this->nav, attr_mapset, &mapset, NULL) || !mapset.u.mapset) + return; + p.x=opc->osd_item.w/2; + p.y=opc->osd_item.h/2; + transform_set_center(this->trans, transform_get_center(this->ntrans)); + transform_set_scale(this->trans, 64); + transform_set_yaw(this->trans, transform_get_yaw(this->ntrans)); + transform_setup_source_rect(this->trans); + transform_set_projection(this->trans, transform_get_projection(this->ntrans)); +#if 0 + graphics_displaylist_draw(opc->osd_item.gr, this->displaylist, this->trans, this->layout, 4); +#endif + graphics_draw(opc->osd_item.gr, this->displaylist, mapset.u.mapset, this->trans, this->layout, 0, NULL, 1); + graphics_draw_circle(opc->osd_item.gr, this->red, &p, d); + graphics_draw_mode(opc->osd_item.gr, draw_mode_end); + +} + +static void +osd_auxmap_init(struct osd_priv_common *opc, struct navit *nav) +{ + struct auxmap *this = (struct auxmap *)opc->data; + + struct graphics *gra; + struct attr attr; + struct map_selection sel; + struct color red={0xffff,0x0,0x0,0xffff}; + + this->nav=nav; + if (! navit_get_attr(nav, attr_graphics, &attr, NULL)) + return; + gra=attr.u.graphics; + graphics_add_callback(gra, callback_new_attr_1(callback_cast(osd_auxmap_draw), attr_postdraw, opc)); + if (! navit_get_attr(nav, attr_transformation, &attr, NULL)) + return; + this->ntrans=attr.u.transformation; + if (! navit_get_attr(nav, attr_displaylist, &attr, NULL)) + return; + this->displaylist=attr.u.displaylist; + if (! navit_get_attr(nav, attr_layout, &attr, NULL)) + return; + this->layout=attr.u.layout; + osd_set_std_graphic(nav, &opc->osd_item, NULL); + graphics_init(opc->osd_item.gr); + this->red=graphics_gc_new(gra); + graphics_gc_set_foreground(this->red,&red); + graphics_gc_set_linewidth(this->red,3); + this->trans=transform_new(); + memset(&sel, 0, sizeof(sel)); + sel.u.p_rect.rl.x=opc->osd_item.w; + sel.u.p_rect.rl.y=opc->osd_item.h; + transform_set_screen_selection(this->trans, &sel); + graphics_set_rect(opc->osd_item.gr, &sel.u.p_rect); +#if 0 + osd_auxmap_draw(opc, nav); +#endif +} + +static struct osd_priv * +osd_auxmap_new(struct navit *nav, struct osd_methods *meth, struct attr **attrs) +{ + struct auxmap *this = g_new0(struct auxmap, 1); + struct osd_priv_common *opc = g_new0(struct osd_priv_common,1); + opc->data = (void*)this; + + opc->osd_item.p.x = 20; + opc->osd_item.p.y = -80; + opc->osd_item.w = 60; + opc->osd_item.h = 40; + opc->osd_item.font_size = 200; + meth->set_attr = (void (*)(struct osd_priv *osd, struct attr* attr))set_std_osd_attr; + osd_set_std_attr(attrs, &opc->osd_item, 0); + + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_auxmap_init), attr_navit, opc)); + return (struct osd_priv *) opc; +} + + +void +plugin_init(void) +{ + plugin_register_osd_type("compass", osd_compass_new); + plugin_register_osd_type("navigation_next_turn", osd_nav_next_turn_new); + plugin_register_osd_type("button", osd_button_new); + plugin_register_osd_type("toggle_announcer", osd_nav_toggle_announcer_new); + plugin_register_osd_type("speed_warner", osd_speed_warner_new); + plugin_register_osd_type("speed_cam", osd_speed_cam_new); + plugin_register_osd_type("text", osd_text_new); + plugin_register_osd_type("gps_status", osd_gps_status_new); + plugin_register_osd_type("volume", osd_volume_new); + plugin_register_osd_type("scale", osd_scale_new); + plugin_register_osd_type("image", osd_image_new); + plugin_register_osd_type("stopwatch", osd_stopwatch_new); + plugin_register_osd_type("odometer", osd_odometer_new); + plugin_register_osd_type("auxmap", osd_auxmap_new); + plugin_register_osd_type("cmd_interface", osd_cmd_interface_new); + plugin_register_osd_type("route_guard", osd_route_guard_new); +} diff --git a/navit/param.c b/navit/param.c new file mode 100644 index 0000000..522f19f --- /dev/null +++ b/navit/param.c @@ -0,0 +1,65 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include "param.h" + +void +param_add_string(char *name, char *value, struct param_list **param, int *count) +{ + if (*count > 0) { + (*param)->name=malloc(strlen(value)+strlen(name)+2); + (*param)->value=(*param)->name+strlen(name)+1; + strcpy((*param)->name, name); + strcpy((*param)->value, value); + (*count)--; + (*param)++; + } + +} + +void +param_add_dec(char *name, unsigned long value, struct param_list **param, int *count) +{ + char buffer[1024]; + sprintf(buffer, "%ld", value); + param_add_string(name, buffer, param, count); +} + + +void +param_add_hex(char *name, unsigned long value, struct param_list **param, int *count) +{ + char buffer[1024]; + sprintf(buffer, "0x%lx", value); + param_add_string(name, buffer, param, count); +} + +void +param_add_hex_sig(char *name, long value, struct param_list **param, int *count) +{ + char buffer[1024]; + if (value < 0) + sprintf(buffer, "-0x%lx", -value); + else + sprintf(buffer, "0x%lx", value); + param_add_string(name, buffer, param, count); +} diff --git a/navit/param.h b/navit/param.h new file mode 100644 index 0000000..d89e258 --- /dev/null +++ b/navit/param.h @@ -0,0 +1,34 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_PARAM_H +#define NAVIT_PARAM_H + +struct param_list { + char *name; + char *value; +}; + +void param_add_string(char *name, char *value, struct param_list **param, int *count); +void param_add_dec(char *name, unsigned long value, struct param_list **param, int *count); +void param_add_hex(char *name, unsigned long value, struct param_list **param, int *count); +void param_add_hex_sig(char *name, long value, struct param_list **param, int *count); + +#endif + diff --git a/navit/phrase.c b/navit/phrase.c new file mode 100644 index 0000000..9c7edaa --- /dev/null +++ b/navit/phrase.c @@ -0,0 +1,53 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "coord.h" +#include "item.h" +#include "route.h" +#include "speech.h" +#include "phrase.h" + +void +phrase_route_calc(void *speech) +{ +#if 0 + if (! speech) + return; + speech_say(speech,"Die Route wird berechnet\n"); +#endif +} + +void +phrase_route_calculated(void *speech, void *route) +{ +#if 0 + struct tm *eta; +#endif + if (! speech) + return; + +#if 0 /* FIXME */ + eta=route_get_eta(route); + + speech_sayf(speech,"Die Route wurde berechnet, geschätzte Ankunftszeit %d Uhr %d Entfernung %4.0f Kilometer", eta->tm_hour,eta->tm_min,route_get_len(route)/1000); +#endif + +} diff --git a/navit/phrase.h b/navit/phrase.h new file mode 100644 index 0000000..d184b37 --- /dev/null +++ b/navit/phrase.h @@ -0,0 +1,27 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_PHRASE_H +#define NAVIT_PHRASE_H + +void phrase_route_calc(void *speech); +void phrase_route_calculated(void *speech, void *route); + +#endif + diff --git a/navit/plugin.c b/navit/plugin.c new file mode 100644 index 0000000..7829172 --- /dev/null +++ b/navit/plugin.c @@ -0,0 +1,427 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "config.h" +#ifdef USE_PLUGINS +#ifdef HAVE_GMODULE +#include +#else +#ifdef HAVE_API_WIN32_BASE +#include +#else +#include +#endif +#endif +#endif +#include "plugin.h" +#include "file.h" +#define PLUGIN_C +#include "plugin.h" +#include "item.h" +#include "debug.h" + +#ifdef USE_PLUGINS +#ifndef HAVE_GMODULE +typedef void * GModule; +#define G_MODULE_BIND_LOCAL 1 +#define G_MODULE_BIND_LAZY 2 +static int +g_module_supported(void) +{ + return 1; +} + +#ifdef HAVE_API_WIN32_BASE + +static DWORD last_error; +static char errormsg[64]; + +static void * +g_module_open(char *name, int flags) +{ + HINSTANCE handle; + int len=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, 0, 0); + wchar_t filename[len]; + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, filename, len) ; + + handle = LoadLibraryW (filename); + if (!handle) + last_error=GetLastError(); + return handle; +} + +static char * +g_module_error(void) +{ + sprintf(errormsg,"dll error %d",(int)last_error); + return errormsg; +} + +static int +g_module_symbol(GModule *handle, char *symbol, gpointer *addr) +{ +#ifdef HAVE_API_WIN32_CE + int len=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, symbol, -1, 0, 0); + wchar_t wsymbol[len+1]; + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, symbol, -1, wsymbol, len) ; + *addr=GetProcAddress ((HANDLE)handle, wsymbol); +#else + *addr=GetProcAddress ((HANDLE)handle, symbol); +#endif + if (*addr) + return 1; + last_error=GetLastError(); + return 0; +} + +static void +g_module_close(GModule *handle) +{ + FreeLibrary((HANDLE)handle); +} + +#else +static void * +g_module_open(char *name, int flags) +{ + return dlopen(name, + (flags & G_MODULE_BIND_LAZY ? RTLD_LAZY : RTLD_NOW) | + (flags & G_MODULE_BIND_LOCAL ? RTLD_LOCAL : RTLD_GLOBAL)); +} + +static char * +g_module_error(void) +{ + return dlerror(); +} + +static int +g_module_symbol(GModule *handle, char *symbol, gpointer *addr) +{ + *addr=dlsym(handle, symbol); + return (*addr != NULL); +} + +static void +g_module_close(GModule *handle) +{ + dlclose(handle); +} +#endif +#endif +#endif + +struct plugin { + int active; + int lazy; + int ondemand; + char *name; +#ifdef USE_PLUGINS + GModule *mod; +#endif + void (*init)(void); +}; + +struct plugins { + GHashTable *hash; + GList *list; +} *pls; + +static struct plugin * +plugin_new_from_path(char *plugin) +{ +#ifdef USE_PLUGINS + struct plugin *ret; + if (! g_module_supported()) { + return NULL; + } + ret=g_new0(struct plugin, 1); + ret->name=g_strdup(plugin); + return ret; +#else + return NULL; +#endif +} + +int +plugin_load(struct plugin *pl) +{ +#ifdef USE_PLUGINS + gpointer init; + + GModule *mod; + + if (pl->mod) { + dbg(0,"can't load '%s', already loaded\n", pl->name); + return 0; + } + mod=g_module_open(pl->name, G_MODULE_BIND_LOCAL | (pl->lazy ? G_MODULE_BIND_LAZY : 0)); + if (! mod) { + dbg(0,"can't load '%s', Error '%s'\n", pl->name, g_module_error()); + return 0; + } + if (!g_module_symbol(mod, "plugin_init", &init)) { + dbg(0,"can't load '%s', plugin_init not found\n", pl->name); + g_module_close(mod); + return 0; + } else { + pl->mod=mod; + pl->init=init; + } + return 1; +#else + return 0; +#endif +} + +char * +plugin_get_name(struct plugin *pl) +{ + return pl->name; +} + +int +plugin_get_active(struct plugin *pl) +{ + return pl->active; +} + +void +plugin_set_active(struct plugin *pl, int active) +{ + pl->active=active; +} + +void +plugin_set_lazy(struct plugin *pl, int lazy) +{ + pl->lazy=lazy; +} + +#ifdef USE_PLUGINS +static int +plugin_get_ondemand(struct plugin *pl) +{ + return pl->ondemand; +} +#endif + +static void +plugin_set_ondemand(struct plugin *pl, int ondemand) +{ + pl->ondemand=ondemand; +} + +void +plugin_call_init(struct plugin *pl) +{ + pl->init(); +} + +void +plugin_unload(struct plugin *pl) +{ +#ifdef USE_PLUGINS + g_module_close(pl->mod); + pl->mod=NULL; +#endif +} + +void +plugin_destroy(struct plugin *pl) +{ + g_free(pl); +} + +struct plugins * +plugins_new(void) +{ + struct plugins *ret=g_new0(struct plugins, 1); + ret->hash=g_hash_table_new(g_str_hash, g_str_equal); + pls=ret; + return ret; +} + +struct plugin * +plugin_new(struct attr *parent, struct attr **attrs) { +#ifdef USE_PLUGINS + struct attr *path_attr, *attr; + struct file_wordexp *we; + int active=1; // default active + int lazy=0, ondemand=0; + int i, count; + char **array; + char *name; + struct plugin *pl=NULL; + struct plugins *pls=NULL; + + if (parent) + pls=parent->u.plugins; + + if (! (path_attr=attr_search(attrs, NULL, attr_path))) { + dbg(0,"missing path\n"); + return NULL; + } + if ( (attr=attr_search(attrs, NULL, attr_active))) { + active=attr->u.num; + } + if ( (attr=attr_search(attrs, NULL, attr_lazy))) { + lazy=attr->u.num; + } + if ( (attr=attr_search(attrs, NULL, attr_ondemand))) { + ondemand=attr->u.num; + } + dbg(1, "path=\"%s\", active=%d, lazy=%d, ondemand=%d\n",path_attr->u.str, active, lazy, ondemand); + + we=file_wordexp_new(path_attr->u.str); + count=file_wordexp_get_count(we); + array=file_wordexp_get_array(we); + dbg(2,"expanded to %d words\n",count); + if (count != 1 || file_exists(array[0])) { + for (i = 0 ; i < count ; i++) { + name=array[i]; + dbg(2,"name[%d]='%s'\n", i, name); + if (! (pls && (pl=g_hash_table_lookup(pls->hash, name)))) { + pl=plugin_new_from_path(name); + if (! pl) { + dbg(0,"failed to create plugin '%s'\n", name); + continue; + } + if (pls) { + g_hash_table_insert(pls->hash, plugin_get_name(pl), pl); + pls->list=g_list_append(pls->list, pl); + } + } else { + if (pls) { + pls->list=g_list_remove(pls->list, pl); + pls->list=g_list_append(pls->list, pl); + } + } + plugin_set_active(pl, active); + plugin_set_lazy(pl, lazy); + plugin_set_ondemand(pl, ondemand); + if (!pls && active) { + if (!plugin_load(pl)) + plugin_set_active(pl, 0); + else + plugin_call_init(pl); + } + } + } + file_wordexp_destroy(we); + return pl; +#else + return 0; +#endif +} + +void +plugins_init(struct plugins *pls) +{ +#ifdef USE_PLUGINS + struct plugin *pl; + GList *l; + + l=pls->list; + while (l) { + pl=l->data; + if (! plugin_get_ondemand(pl)) { + if (plugin_get_active(pl)) + if (!plugin_load(pl)) + plugin_set_active(pl, 0); + if (plugin_get_active(pl)) + plugin_call_init(pl); + } + l=g_list_next(l); + } +#endif +} + +void +plugins_destroy(struct plugins *pls) +{ + GList *l; + struct plugin *pl; + + l=pls->list; + while (l) { + pl=l->data; + plugin_unload(pl); + plugin_destroy(pl); + } + g_list_free(pls->list); + g_hash_table_destroy(pls->hash); + g_free(pls); +} + + void * +plugin_get_type(enum plugin_type type, const char *type_name, const char *name) +{ + GList *l,*lpls; + struct name_val *nv; + struct plugin *pl; + char *mod_name, *filename=NULL, *corename=NULL; + + dbg(1, "type=\"%s\", name=\"%s\"\n", type_name, name); + + l=plugin_types[type]; + while (l) { + nv=l->data; + if (!g_ascii_strcasecmp(nv->name, name)) + return nv->val; + l=g_list_next(l); + } + if (!pls) + return NULL; + lpls=pls->list; + filename=g_strjoin("", "lib", type_name, "_", name, NULL); + corename=g_strjoin("", "lib", type_name, "_", "core", NULL); + while (lpls) { + pl=lpls->data; + if ((mod_name=g_strrstr(pl->name, "/"))) + mod_name++; + else + mod_name=pl->name; + dbg(2,"compare '%s' with '%s'\n", mod_name, filename); + if (!g_ascii_strncasecmp(mod_name, filename, strlen(filename)) || !g_ascii_strncasecmp(mod_name, corename, strlen(corename))) { + dbg(1, "Loading module \"%s\"\n",pl->name) ; + if (plugin_get_active(pl)) + if (!plugin_load(pl)) + plugin_set_active(pl, 0); + if (plugin_get_active(pl)) + plugin_call_init(pl); + l=plugin_types[type]; + while (l) { + nv=l->data; + if (!g_ascii_strcasecmp(nv->name, name)) { + g_free(filename); + g_free(corename); + return nv->val; + } + l=g_list_next(l); + } + } + lpls=g_list_next(lpls); + } + g_free(filename); + g_free(corename); + return NULL; +} diff --git a/navit/plugin.h b/navit/plugin.h new file mode 100644 index 0000000..23901b4 --- /dev/null +++ b/navit/plugin.h @@ -0,0 +1,158 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef PLUGIN_C + +#ifdef __cplusplus +extern "C" { +#endif + +struct plugin; + +enum plugin_type { + plugin_type_graphics, + plugin_type_gui, + plugin_type_map, + plugin_type_osd, + plugin_type_speech, + plugin_type_vehicle, + plugin_type_event, + plugin_type_font, + plugin_type_last, +}; +#endif + +struct container; +struct popup; +struct popup_item; +#undef PLUGIN_FUNC1 +#undef PLUGIN_FUNC3 +#undef PLUGIN_FUNC4 +#undef PLUGIN_TYPE +#define PLUGIN_PROTO(name,...) void name(__VA_ARGS__) + +#ifdef PLUGIN_C +#define PLUGIN_REGISTER(name,...) \ +void \ +plugin_register_##name(PLUGIN_PROTO((*func),__VA_ARGS__)) \ +{ \ + plugin_##name##_func=func; \ +} + +#define PLUGIN_CALL(name,...) \ +{ \ + if (plugin_##name##_func) \ + (*plugin_##name##_func)(__VA_ARGS__); \ +} + +#define PLUGIN_FUNC1(name,t1,p1) \ +PLUGIN_PROTO((*plugin_##name##_func),t1 p1); \ +void plugin_call_##name(t1 p1) PLUGIN_CALL(name,p1) \ +PLUGIN_REGISTER(name,t1 p1) + +#define PLUGIN_FUNC3(name,t1,p1,t2,p2,t3,p3) \ +PLUGIN_PROTO((*plugin_##name##_func),t1 p1,t2 p2,t3 p3); \ +void plugin_call_##name(t1 p1,t2 p2, t3 p3) PLUGIN_CALL(name,p1,p2,p3) \ +PLUGIN_REGISTER(name,t1 p1,t2 p2,t3 p3) + +#define PLUGIN_FUNC4(name,t1,p1,t2,p2,t3,p3,t4,p4) \ +PLUGIN_PROTO((*plugin_##name##_func),t1 p1,t2 p2,t3 p3,t4 p4); \ +void plugin_call_##name(t1 p1,t2 p2, t3 p3, t4 p4) PLUGIN_CALL(name,p1,p2,p3,p4) \ +PLUGIN_REGISTER(name,t1 p1,t2 p2,t3 p3,t4 p4) + +struct name_val { + char *name; + void *val; +}; + +GList *plugin_types[plugin_type_last]; + +#define PLUGIN_TYPE(type,newargs) \ +struct type##_priv; \ +struct type##_methods; \ +void \ +plugin_register_##type##_type(const char *name, struct type##_priv *(*new_) newargs) \ +{ \ + struct name_val *nv; \ + nv=g_new(struct name_val, 1); \ + nv->name=g_strdup(name); \ + nv->val=new_; \ + plugin_types[plugin_type_##type]=g_list_append(plugin_types[plugin_type_##type], nv); \ +} \ + \ +void * \ +plugin_get_##type##_type(const char *name) \ +{ \ + return plugin_get_type(plugin_type_##type, #type, name); \ +} + +#else +#define PLUGIN_FUNC1(name,t1,p1) \ +void plugin_register_##name(void(*func)(t1 p1)); \ +void plugin_call_##name(t1 p1); + +#define PLUGIN_FUNC3(name,t1,p1,t2,p2,t3,p3) \ +void plugin_register_##name(void(*func)(t1 p1,t2 p2,t3 p3)); \ +void plugin_call_##name(t1 p1,t2 p2,t3 p3); + +#define PLUGIN_FUNC4(name,t1,p1,t2,p2,t3,p3,t4,p4) \ +void plugin_register_##name(void(*func)(t1 p1,t2 p2,t3 p3,t4 p4)); \ +void plugin_call_##name(t1 p1,t2 p2,t3 p3,t4 p4); + +#define PLUGIN_TYPE(type,newargs) \ +struct type##_priv; \ +struct type##_methods; \ +void plugin_register_##type##_type(const char *name, struct type##_priv *(*new_) newargs); \ +void *plugin_get_##type##_type(const char *name); + +#endif + +#include "plugin_def.h" + +#ifndef USE_PLUGINS +#define plugin_module_cat3(pre,mod,post) pre##mod##post +#define plugin_module_cat2(pre,mod,post) plugin_module_cat3(pre,mod,post) +#define plugin_module_cat(pre,post) plugin_module_cat2(pre,MODULE,post) +#define plugin_init plugin_module_cat(module_,_init) +#endif + +struct attr; + +/* prototypes */ +void plugin_init(void); +int plugin_load(struct plugin *pl); +char *plugin_get_name(struct plugin *pl); +int plugin_get_active(struct plugin *pl); +void plugin_set_active(struct plugin *pl, int active); +void plugin_set_lazy(struct plugin *pl, int lazy); +void plugin_call_init(struct plugin *pl); +void plugin_unload(struct plugin *pl); +void plugin_destroy(struct plugin *pl); +struct plugins *plugins_new(void); +struct plugin *plugin_new(struct attr *parent, struct attr ** attrs); +void plugins_init(struct plugins *pls); +void plugins_destroy(struct plugins *pls); +void *plugin_get_type(enum plugin_type type, const char *type_name, const char *name); +/* end of prototypes */ + +#ifdef __cplusplus +} +#endif + + diff --git a/navit/plugin/Makefile.am b/navit/plugin/Makefile.am new file mode 100644 index 0000000..da51c76 --- /dev/null +++ b/navit/plugin/Makefile.am @@ -0,0 +1,6 @@ +SUBDIRS= +if PLUGIN_PEDESTRIAN + SUBDIRS += pedestrian +endif + +DIST_SUBDIRS=pedestrian diff --git a/navit/plugin/Makefile.in b/navit/plugin/Makefile.in new file mode 100644 index 0000000..395b8eb --- /dev/null +++ b/navit/plugin/Makefile.in @@ -0,0 +1,709 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@PLUGIN_PEDESTRIAN_TRUE@am__append_1 = pedestrian +subdir = navit/plugin +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = $(am__append_1) +DIST_SUBDIRS = pedestrian +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/plugin/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/plugin/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/plugin/pedestrian/Makefile.am b/navit/plugin/pedestrian/Makefile.am new file mode 100644 index 0000000..9427f44 --- /dev/null +++ b/navit/plugin/pedestrian/Makefile.am @@ -0,0 +1,11 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=plugin_pedestrian +moduleplugin_LTLIBRARIES = libplugin_pedestrian.la +libplugin_pedestrian_la_LDFLAGS=-module -avoid-version @NAVIT_MODULE_LDFLAGS@ #-Wl,--no-undefined + +libplugin_pedestrian_la_SOURCES = pedestrian.c + +android: libplugin_pedestrian.la + cp .libs/libplugin_pedestrian.so ../../android/libs/armeabi +xslt: + cp *.xslt ../../xslt diff --git a/navit/plugin/pedestrian/Makefile.in b/navit/plugin/pedestrian/Makefile.in new file mode 100644 index 0000000..1abf7ad --- /dev/null +++ b/navit/plugin/pedestrian/Makefile.in @@ -0,0 +1,696 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/plugin/pedestrian +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(moduleplugindir)" +LTLIBRARIES = $(moduleplugin_LTLIBRARIES) +libplugin_pedestrian_la_LIBADD = +am_libplugin_pedestrian_la_OBJECTS = pedestrian.lo +libplugin_pedestrian_la_OBJECTS = \ + $(am_libplugin_pedestrian_la_OBJECTS) +libplugin_pedestrian_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libplugin_pedestrian_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libplugin_pedestrian_la_SOURCES) +DIST_SOURCES = $(libplugin_pedestrian_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir) -I$(top_srcdir)/navit -DMODULE=plugin_pedestrian +moduleplugin_LTLIBRARIES = libplugin_pedestrian.la +libplugin_pedestrian_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ #-Wl,--no-undefined +libplugin_pedestrian_la_SOURCES = pedestrian.c +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/plugin/pedestrian/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/plugin/pedestrian/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulepluginLTLIBRARIES: $(moduleplugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(moduleplugindir)" || $(MKDIR_P) "$(DESTDIR)$(moduleplugindir)" + @list='$(moduleplugin_LTLIBRARIES)'; test -n "$(moduleplugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(moduleplugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(moduleplugindir)"; \ + } + +uninstall-modulepluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(moduleplugin_LTLIBRARIES)'; test -n "$(moduleplugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(moduleplugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(moduleplugindir)/$$f"; \ + done + +clean-modulepluginLTLIBRARIES: + -test -z "$(moduleplugin_LTLIBRARIES)" || rm -f $(moduleplugin_LTLIBRARIES) + @list='$(moduleplugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libplugin_pedestrian.la: $(libplugin_pedestrian_la_OBJECTS) $(libplugin_pedestrian_la_DEPENDENCIES) + $(libplugin_pedestrian_la_LINK) -rpath $(moduleplugindir) $(libplugin_pedestrian_la_OBJECTS) $(libplugin_pedestrian_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pedestrian.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(moduleplugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulepluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulepluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulepluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulepluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-modulepluginLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulepluginLTLIBRARIES + + +android: libplugin_pedestrian.la + cp .libs/libplugin_pedestrian.so ../../android/libs/armeabi +xslt: + cp *.xslt ../../xslt + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/plugin/pedestrian/pedestrian.c b/navit/plugin/pedestrian/pedestrian.c new file mode 100644 index 0000000..166db1f --- /dev/null +++ b/navit/plugin/pedestrian/pedestrian.c @@ -0,0 +1,1382 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* #define DEMO 1 */ + +#ifdef HAVE_API_ANDROID +#include +#endif +static struct map *global_map; + +int orientation,orientation_old; + +struct pedestrian { + struct navit *nav; + int w,h; + int yaw; +} pedestrian_data; + +int sensors_locked; + +struct attr initial_layout, main_layout; + + +struct rocket { + struct navit *navit; + struct layout *layout; + struct graphics *gra; + struct transformation *trans; + struct displaylist *dl; + struct mapset *ms; + int a,g,t,hog,v,vscale; + struct callback *callback; + struct event_idle *idle; +}; + +static void +pedestrian_rocket_idle(struct rocket *rocket) +{ + struct attr follow; + follow.type=attr_follow; + follow.u.num=100; + transform_set_hog(rocket->trans, rocket->hog); + graphics_displaylist_draw(rocket->gra, rocket->dl, rocket->trans, rocket->layout, 0); + rocket->v+=rocket->a-rocket->g; + dbg(0,"enter v=%d\n",rocket->v); + if (rocket->t > 0) + rocket->t--; + else + rocket->a=0; + rocket->hog+=rocket->v/rocket->vscale; + dbg(0,"hog=%d\n",rocket->hog); + if (rocket->hog < 0) { + transform_set_hog(rocket->trans, 0); + transform_set_order_base(rocket->trans, 14); + transform_set_scale(rocket->trans, transform_get_scale(rocket->trans)); + graphics_overlay_disable(rocket->gra, 0); + navit_draw(rocket->navit); + follow.u.num=1; + event_remove_idle(rocket->idle); + rocket->idle=NULL; + sensors_locked=0; + } + navit_set_attr(rocket->navit, &follow); +} + +static void +pedestrian_cmd_pedestrian_rocket(struct rocket *rocket) +{ + struct attr attr; + int max=0; +#if 0 + int i,step=10; +#endif + rocket->a=2; + rocket->g=1; + rocket->t=100; + rocket->hog=0; + rocket->v=0; + rocket->vscale=10; + if (! navit_get_attr(rocket->navit, attr_graphics, &attr, NULL)) + return; + rocket->gra=attr.u.graphics; + if (! navit_get_attr(rocket->navit, attr_transformation, &attr, NULL)) + return; + rocket->trans=attr.u.transformation; + if (! navit_get_attr(rocket->navit, attr_displaylist, &attr, NULL)) + return; + rocket->dl=attr.u.displaylist; + if (! navit_get_attr(rocket->navit, attr_mapset, &attr, NULL)) + return; + rocket->ms=attr.u.mapset; + transform_set_hog(rocket->trans, max); + transform_set_order_base(rocket->trans, 14); + transform_set_scale(rocket->trans, transform_get_scale(rocket->trans)); + transform_setup_source_rect(rocket->trans); + graphics_overlay_disable(rocket->gra, 1); + graphics_draw(rocket->gra, rocket->dl, rocket->ms, rocket->trans, rocket->layout, 0, NULL, 0); + sensors_locked=1; + if (!rocket->idle) + rocket->idle=event_add_idle(50, rocket->callback); +#if 0 + while (hog >= 0) { + transform_set_hog(trans, hog); +#if 0 + graphics_draw(gra, dl, ms, trans, layout, 0, NULL); +#else + graphics_displaylist_draw(gra, dl, trans, layout, 0); +#endif + v=v+a-g; + if (t > 0) + t--; + else + a=0; + hog=hog+v/vscale; + } +#if 0 + for (i = 0 ; i < max ; i+=step) { + transform_set_hog(trans, i); + graphics_displaylist_draw(gra, dl, trans, layout, 0); + } + for (i = max ; i >= 0 ; i-=step) { + transform_set_hog(trans, i); + graphics_displaylist_draw(gra, dl, trans, layout, 0); + } +#endif +#endif +} + +static struct command_table commands[] = { + {"pedestrian_rocket",command_cast(pedestrian_cmd_pedestrian_rocket)}, +}; + + + +static void +osd_rocket_init(struct navit *nav) +{ + struct rocket *rocket=g_new0(struct rocket, 1); + struct attr attr; + rocket->navit=nav; + rocket->callback=callback_new_1(callback_cast(pedestrian_rocket_idle), rocket); + if (navit_get_attr(nav, attr_layout, &attr, NULL)) + rocket->layout=attr.u.layout; + if (navit_get_attr(nav, attr_callback_list, &attr, NULL)) { + dbg(0,"ok\n"); + command_add_table(attr.u.callback_list, commands, sizeof(commands)/sizeof(struct command_table), rocket); + } +} + +struct marker { + struct cursor *cursor; +}; + +static void +osd_marker_draw(struct marker *this, struct navit *nav) +{ +#if 0 + struct attr graphics; + struct point p; + dbg(0,"enter\n"); + if (!navit_get_attr(nav, attr_graphics, &graphics, NULL)) + return; + p.x=40; + p.y=50; + cursor_draw(this->cursor, graphics.u.graphics, &p, 0, 45, 0); +#endif + +} + +static void +osd_marker_init(struct marker *this, struct navit *nav) +{ + struct attr cursor; + struct attr itemgra,polygon,polygoncoord1,polygoncoord2,polygoncoord3; + struct attr *color=attr_new_from_text("color","#ff0000"); + + cursor=(struct attr){attr_cursor, {(void *)cursor_new(NULL, (struct attr *[]){ + &(struct attr){attr_w,{(void *)26}}, + &(struct attr){attr_h,{(void *)26}}, + NULL})}}; + itemgra=(struct attr){attr_itemgra, {(void *)itemgra_new(&cursor, (struct attr *[]){ + NULL})}}; + cursor_add_attr(cursor.u.cursor, &itemgra); + polygon=(struct attr){attr_polygon, {(void *)polygon_new(&itemgra, (struct attr *[]){ + color, + &(struct attr){attr_width,{(void *)2}}, + NULL})}}; + itemgra_add_attr(itemgra.u.itemgra, &polygon); + polygoncoord1=(struct attr){attr_coord, {(void *)coord_new_from_attrs(&polygon, (struct attr *[]){ + &(struct attr){attr_x,{(void *)-7}}, + &(struct attr){attr_y,{(void *)-10}}, + NULL})}}; + element_add_attr(polygon.u.element, &polygoncoord1); + polygoncoord2=(struct attr){attr_coord, {(void *)coord_new_from_attrs(&polygon, (struct attr *[]){ + &(struct attr){attr_x,{(void *)0}}, + &(struct attr){attr_y,{(void *)12}}, + NULL})}}; + element_add_attr(polygon.u.element, &polygoncoord2); + polygoncoord3=(struct attr){attr_coord, {(void *)coord_new_from_attrs(&polygon, (struct attr *[]){ + &(struct attr){attr_x,{(void *)7}}, + &(struct attr){attr_y,{(void *)-10}}, + NULL})}}; + element_add_attr(polygon.u.element, &polygoncoord3); + attr_free(color); + this->cursor=cursor.u.cursor; + osd_marker_draw(this, nav); +} + +static struct osd_priv * +osd_marker_new(struct navit *nav, struct osd_methods *meth, + struct attr **attrs) +{ + struct marker *this = g_new0(struct marker, 1); + navit_add_callback(nav, callback_new_attr_1(callback_cast(osd_marker_init), attr_navit, this)); + return (struct osd_priv *) this; +} + + + +struct map_priv { + struct navit *navit; +}; + +struct map_rect_priv { + struct map_priv *mpriv; + struct item item; + struct map_rect *route_map_rect; + struct item *route_item; + struct street_data *sd; + struct coord c0; + struct coord c_base; + int checked; + int idx_base; + int idx_next; + int idx; + int first,last; + int route_item_done; + struct coord c_out; + struct coord c_next; + struct coord c_next_base; + struct coord lseg[2]; + struct coord lseg_base[2]; + int lseg_done; + int lseg_done_base; +}; + +static int +map_route_occluded_bbox(struct map *map, struct coord_rect *bbox) +{ + struct coord c[128]; + struct coord_rect r; + int i,first=1,ccount; + struct map_rect *map_rect=map_rect_new(map, NULL); + struct item *item; + while ((item=map_rect_get_item(map_rect))) { + ccount=item_coord_get(item, c, 128); + if (ccount && first) { + r.lu=c[0]; + r.rl=c[0]; + first=0; + } + for (i = 0 ; i < ccount ; i++) + coord_rect_extend(&r, &c[i]); + } + map_rect_destroy(map_rect); + if (first) + return 0; + *bbox=r; + return 1; +} + +static struct building { + struct street_data *sd; + struct coord left,right; + struct building *next; +} *buildings; + +static void +map_route_occluded_buildings_free(void) +{ + struct building *next,*b=buildings; + while (b) { + street_data_free(b->sd); + next=b->next; + g_free(b); + b=next; + } + buildings=NULL; +} + +static void +map_route_occluded_get_buildings(struct mapset *mapset, struct coord_rect *r) +{ + struct mapset_handle *msh=mapset_open(mapset); + struct map *map; + struct map_selection sel; + struct map_rect *mr; + struct item *item; + struct building *b; + sel.next=NULL; + sel.u.c_rect=*r; + sel.order=18; + sel.range.min=type_poly_building; + sel.range.max=type_poly_building; + + map_route_occluded_buildings_free(); + while ((map = mapset_next(msh, 1))) { + mr=map_rect_new(map, &sel); + while ((item = map_rect_get_item(mr))) { + if (item->type == type_poly_building) { +#if 0 + if (item->id_hi != 0x1 || item->id_lo != 0x1f69) + continue; +#endif +#if 0 + if (item->id_hi != 0x8) + continue; +#if 1 + if (item->id_lo != 0x2b3e0 && item->id_lo != 0x2ae7a && item->id_lo != 0x2af1a && item->id_lo != 0x2b348 && item->id_lo != 0x18bb5 && item->id_lo != 0x18ce5 && item->id_lo != 0x18a85) +#else + if (item->id_lo != 0x18bb5 && item->id_lo != 0x18ce5 && item->id_lo != 0x18a85) +#endif + continue; +#endif + b=g_new(struct building, 1); + b->sd=street_get_data(item); + b->next=buildings; + buildings=b; + } + } + map_rect_destroy(mr); + } +} + +FILE *debug,*debug2; + +/* < 0 left, > 0 right */ + +static int +side(struct coord *l0, struct coord *l1, struct coord *p) +{ + int dxl=l1->x-l0->x; + int dyl=l1->y-l0->y; + int dxp=p->x-l0->x; + int dyp=p->y-l0->y; + + return dxp*dyl-dyp*dxl; +} + +static void +map_route_occluded_check_buildings(struct coord *c0) +{ + struct building *b=buildings; + dbg(0,"enter\n"); + int i,count; + struct coord *c; +#if 1 + FILE *bdebug,*bldebug; + bdebug=fopen("tstb.txt","w"); + bldebug=fopen("tstbl.txt","w"); +#endif + while (b) { + c=b->sd->c; + count=b->sd->count; + if (c[count-1].x == c[0].x && c[count-1].y == c[0].y) { +#if 0 + dbg(0,"closed\n"); +#endif + count--; + } + for (i = 0 ; i < count ; i++) { + if (!i || side(c0, &b->left, &c[i]) < 0) + b->left=c[i]; + if (!i || side(c0, &b->right, &c[i]) > 0) + b->right=c[i]; + } +#if 1 + if (bdebug) { + fprintf(bdebug,"0x%x 0x%x type=poi_hospital\n", b->left.x, b->left.y); + fprintf(bdebug,"0x%x 0x%x type=poi_hospital\n", b->right.x, b->right.y); + } + if (bldebug) { + fprintf(bldebug,"type=street_nopass\n"); + fprintf(bldebug,"0x%x 0x%x\n", c0->x, c0->y); + fprintf(bldebug,"0x%x 0x%x\n", c0->x+(b->left.x-c0->x)*10, c0->y+(b->left.y-c0->y)*10); + fprintf(bldebug,"type=street_nopass\n"); + fprintf(bldebug,"0x%x 0x%x\n", c0->x, c0->y); + fprintf(bldebug,"0x%x 0x%x\n", c0->x+(b->right.x-c0->x)*10, c0->y+(b->right.y-c0->y)*10); + } +#endif + b=b->next; + } +#if 1 + if (bdebug) + fclose(bdebug); + if (bldebug) + fclose(bldebug); +#endif +} + +static int +intersect(struct coord *p1, struct coord *p2, struct coord *p3, struct coord *p4, struct coord *i) +{ + double num=(p4->x-p3->x)*(p1->y-p3->y)-(p4->y-p3->y)*(p1->x-p3->x); + double den=(p4->y-p3->y)*(p2->x-p1->x)-(p4->x-p3->x)*(p2->y-p1->y); + if (num < 0 && den < 0) { + num=-num; + den=-den; + } + dbg(1,"num=%f den=%f\n", num, den); + if (i) { + i->x=p1->x+(num/den)*(p2->x-p1->x)+0.5; + i->y=p1->y+(num/den)*(p2->y-p1->y)+0.5; + dbg(1,"i=0x%x,0x%x\n", i->x, i->y); + if (debug2) + fprintf(debug2, "0x%x 0x%x type=town_label_5e3\n", i->x, i->y); + } + if (num < 0 || den < 0) + return -1; + if (num > den) + return 257; + return 256*num/den; +} + +/* return + 0=Not clipped + 1=Start clipped + 2=End clipped + 3=Both clipped + 4=Invisible +*/ + +/* #define DEBUG_VISIBLE */ + +static int +is_visible_line(struct coord *c0, struct coord *c1, struct coord *c2) +{ + int res,ret=0; + struct building *b=buildings; + struct coord cn; +#ifdef DEBUG_VISIBLE + dbg(0,"enter\n"); +#endif + while (b) { + if (side(&b->left, &b->right, c1) < 0 || side(&b->left, &b->right, c2) < 0) { +#ifdef DEBUG_VISIBLE + dbg(0,"sides left: start %d end %d right: start %d end %d\n", side(c0, &b->left, c1), side(c0, &b->left, c2), side(c0, &b->right, c1), side(c0, &b->right, c2)); +#endif + for (;;) { + if (side(c0, &b->left, c1) <= 0) { + if (side(c0, &b->left, c2) > 0) { +#ifdef DEBUG_VISIBLE + dbg(0,"visible: start is left of left corner and end is right of left corner, clipping end\n"); +#endif + res=intersect(c0, &b->left, c1, c2, &cn); + if (res < 256) + break; + if (c1->x != cn.x || c1->y != cn.y) { + *c2=cn; + ret|=2; + break; + } + } else + break; + } + if (side(c0, &b->right, c1) >= 0) { + if (side(c0, &b->right, c2) < 0) { +#ifdef DEBUG_VISIBLE + dbg(0,"visible: start is right of right corner and end is left of right corner, clipping end\n"); +#endif + res=intersect(c0, &b->right, c1, c2, &cn); + if (res < 256) + break; + if (c1->x != cn.x || c1->y != cn.y) { + *c2=cn; + ret|=2; + break; + } + } else + break; + } + if (side(c0, &b->left, c2) <= 0) { + if (side(c0, &b->left, c1) > 0) { +#ifdef DEBUG_VISIBLE + dbg(0,"visible: end is left of left corner and start is right of left corner, clipping start\n"); +#endif + res=intersect(c0, &b->left, c1, c2, &cn); + if (res < 256) + break; + if (c2->x != cn.x || c2->y != cn.y) { + *c1=cn; + ret|=1; + break; + } + } else + break; + } + if (side(c0, &b->right, c2) >= 0) { + if (side(c0, &b->right, c1) < 0) { +#ifdef DEBUG_VISIBLE + dbg(0,"visible: end is right of right corner and start is left of right corner, clipping start\n"); +#endif + res=intersect(c0, &b->right, c1, c2, &cn); + if (res < 256) + break; + if (c2->x != cn.x || c2->y != cn.y) { + *c1=cn; + ret|=1; + break; + } + } else + break; + } +#ifdef DEBUG_VISIBLE + dbg(0,"visible: not visible\n"); +#endif + return 4; + } + } + b=b->next; + } +#ifdef DEBUG_VISIBLE + dbg(0,"return %d\n",ret); +#endif + return ret; +} + +static void +map_route_occluded_coord_rewind(void *priv_data) +{ + struct map_rect_priv *mr = priv_data; + dbg(1,"enter\n"); + mr->idx=mr->idx_base; + mr->first=1; + mr->lseg_done=mr->lseg_done_base; + mr->c_next=mr->c_next_base; + mr->lseg[0]=mr->lseg_base[0]; + mr->lseg[1]=mr->lseg_base[1]; + mr->last=0; + item_coord_rewind(mr->route_item); +} + +static void +map_route_occluded_attr_rewind(void *priv_data) +{ + struct map_rect_priv *mr=priv_data; + dbg(1,"enter\n"); + item_attr_rewind(mr->route_item); +} + +static int +map_route_occluded_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + struct map_rect_priv *mr=priv_data; + dbg(1,"enter\n"); + return item_attr_get(mr->route_item, attr_type, attr); +} + +static int +coord_next(struct map_rect_priv *mr, struct coord *c) +{ + if (mr->idx >= mr->sd->count) + return 1; + *c=mr->sd->c[mr->idx++]; + return 0; +} + +#define DEBUG_COORD_GET +static int +map_route_occluded_coord_get(void *priv_data, struct coord *c, int count) +{ + struct map_rect_priv *mr=priv_data; + struct coord l0,l1; + int vis,ret=0; + char buffer[4096]; + +#ifdef DEBUG_COORD_GET + dbg(1,"enter\n"); +#endif + dbg_assert(count >= 2); + if (! mr->checked) { + mr->c0=mr->sd->c[0]; + map_route_occluded_check_buildings(&mr->c0); + mr->checked=1; + } + while (ret < count && !mr->last) { +#ifdef DEBUG_COORD_GET + dbg(1,"coord first %d lseg_done %d\n",mr->first,mr->lseg_done); +#endif + if (mr->lseg_done) { +#ifdef DEBUG_COORD_GET + dbg(1,"loading %d of %d from id_lo %d\n", mr->idx, mr->sd->count, mr->sd->item.id_lo); +#endif + if (!mr->idx) { + if (coord_next(mr, &mr->lseg[0])) { + mr->route_item_done=1; + mr->last=1; + mr->idx_base=mr->idx=0; + break; + } + mr->first=1; + } else + mr->lseg[0]=mr->lseg[1]; + if (coord_next(mr, &mr->lseg[1])) { + mr->route_item_done=1; + mr->last=1; + mr->idx_base=mr->idx=0; + break; + } + mr->c_next=mr->lseg[0]; + mr->lseg_done=0; + } + l0=mr->c_next; + l1=mr->lseg[1]; +#ifdef DEBUG_COORD_GET + dbg(1,"line (0x%x,0x%x)-(0x%x,0x%x)\n", l0.x,l0.y,l1.x,l1.y); +#endif + vis=is_visible_line(&mr->c0, &l0, &l1); + if (debug) { + fprintf(debug,"type=tracking_%d debug=\"%s\"\n",vis*20,buffer); + fprintf(debug,"0x%x 0x%x\n", l0.x, l0.y); + fprintf(debug,"0x%x 0x%x\n", l1.x, l1.y); + } +#ifdef DEBUG_COORD_GET + dbg(1,"vis=%d line (0x%x,0x%x)-(0x%x,0x%x)\n", vis, l0.x,l0.y,l1.x,l1.y); +#endif + mr->idx_base=mr->idx; + mr->c_next_base=mr->c_next; + mr->lseg_base[0]=mr->lseg[0]; + mr->lseg_base[1]=mr->lseg[1]; + mr->lseg_done_base=mr->lseg_done; + switch (vis) { + case 0: + mr->c_next_base=mr->c_next; +#ifdef DEBUG_COORD_GET + dbg(1,"out 0x%x,0x%x\n", l0.x, l1.y); +#endif + c[ret++]=l0; +#ifdef DEBUG_COORD_GET + dbg(1,"out 0x%x,0x%x\n", l1.x, l1.y); +#endif + c[ret++]=l1; + mr->lseg_done_base=mr->lseg_done=1; + mr->last=1; + break; + case 1: +#ifdef DEBUG_COORD_GET + dbg(1,"begin clipped\n"); + dbg(1,"out 0x%x,0x%x\n", l0.x, l1.y); +#endif + c[ret++]=l0; +#ifdef DEBUG_COORD_GET + dbg(1,"out 0x%x,0x%x\n", l1.x, l1.y); +#endif + c[ret++]=l1; + mr->c_next_base=mr->c_next=l1; + mr->last=1; + break; + case 2: +#ifdef DEBUG_COORD_GET + dbg(1,"end clipped\n"); +#endif + mr->c_next_base=mr->c_next; +#ifdef DEBUG_COORD_GET + dbg(1,"out 0x%x,0x%x\n", l0.x, l1.y); +#endif + c[ret++]=l0; +#ifdef DEBUG_COORD_GET + dbg(1,"out 0x%x,0x%x\n", l1.x, l1.y); +#endif + c[ret++]=l1; + mr->c_next_base=mr->c_next=l1; + mr->last=1; + break; + case 3: +#ifdef DEBUG_COORD_GET + dbg(1,"both clipped\n"); +#endif + mr->c_next_base=mr->c_next; +#ifdef DEBUG_COORD_GET + dbg(1,"out 0x%x,0x%x\n", l0.x, l1.y); +#endif + c[ret++]=l0; +#ifdef DEBUG_COORD_GET + dbg(1,"out 0x%x,0x%x\n", l1.x, l1.y); +#endif + c[ret++]=l1; + mr->c_next_base=mr->c_next=l1; + mr->last=1; + break; + case 4: + mr->last=1; + mr->lseg_done_base=mr->lseg_done=1; + break; + +#if 0 + case 2: + dbg(1,"visible up to 0x%x,0x%x\n",l1.x,l1.y); + if (mr->first) { + mr->first=0; + c[ret++]=mr->c_out; + dbg(1,"out 0x%x,0x%x\n", mr->c_out.x, mr->c_out.y); + } + c[ret++]=mr->c_out=l1; + dbg(1,"out 0x%x,0x%x\n", l1.x, l1.y); + mr->last=1; + mr->route_item_done=1; + break; + case 1: + case 3: + case 4: + dbg(1,"invisible\n"); + mr->c_out=l1; + mr->idx++; + mr->last=1; + mr->route_item_done=1; + break; + } + if (!vis) + break; +#endif + } + } +#ifdef DEBUG_COORD_GET + dbg(1,"ret=%d last=%d\n", ret, mr->last); +#endif + return ret; +} + +static struct item_methods methods_route_occluded_item = { + map_route_occluded_coord_rewind, + map_route_occluded_coord_get, + map_route_occluded_attr_rewind, + map_route_occluded_attr_get, +}; + +static void +map_route_occluded_destroy(struct map_priv *priv) +{ + g_free(priv); +} + +static int no_recurse; + +static struct map_rect_priv * +map_route_occluded_rect_new(struct map_priv *priv, struct map_selection *sel) +{ + struct map_rect_priv * mr; + struct attr route; + struct attr route_map; + struct map_rect *route_map_rect; + struct coord_rect r; + if (!navit_get_attr(priv->navit, attr_route, &route, NULL)) { + dbg(0,"no route in navit\n"); + return NULL; + } + if (!route_get_attr(route.u.route, attr_map, &route_map, NULL)) { + dbg(0,"no map in route\n"); + return NULL; + } + route_map_rect=map_rect_new(route_map.u.map, sel); + if (!route_map_rect) { + dbg(0,"no route map rect\n"); + return NULL; + } + map_dump_file(route_map.u.map, "route.txt"); + mr=g_new0(struct map_rect_priv, 1); + mr->route_map_rect=route_map_rect; + mr->mpriv = priv; + mr->item.priv_data = mr; + mr->item.meth = &methods_route_occluded_item; + mr->item.id_lo = -1; + mr->route_item_done=1; + mr->lseg_done_base=1; + mr->last=1; + if (!no_recurse && map_route_occluded_bbox(route_map.u.map, &r)) { + struct attr mapset; + no_recurse++; + if (navit_get_attr(mr->mpriv->navit, attr_mapset, &mapset, NULL)) + map_route_occluded_get_buildings(mapset.u.mapset, &r); + debug=fopen("tst.txt","w"); + debug2=fopen("tstp.txt","w"); + no_recurse--; + } + return mr; +} + + +static void +map_route_occluded_rect_destroy(struct map_rect_priv *mr) +{ + map_rect_destroy(mr->route_map_rect); + street_data_free(mr->sd); + g_free(mr); + if (!no_recurse) { + if (debug) { + fclose(debug); + debug=NULL; + } + if (debug2) { + fclose(debug2); + debug2=NULL; + } + } +#if 0 + static int in_dump; + if (! in_dump) { + in_dump=1; + map_dump_file(global_map,"route.txt"); + in_dump=0; + } +#endif +} + +static struct item * +map_route_occluded_get_item(struct map_rect_priv *mr) +{ + dbg(1,"enter last=%d\n",mr->last); + while (!mr->last) { + struct coord c[128]; + map_route_occluded_coord_get(mr, c, 128); + } + if (mr->route_item_done) { + dbg(1,"next route item\n"); + do { + mr->route_item=map_rect_get_item(mr->route_map_rect); + } while (mr->route_item && mr->route_item->type != type_street_route); + dbg(1,"item %p\n", mr->route_item); + if (!mr->route_item) + return NULL; + mr->item.type=type_street_route_occluded; + street_data_free(mr->sd); + mr->sd=street_get_data(mr->route_item); + mr->route_item_done=0; + } + mr->item.id_lo++; +#if 0 + if (mr->item.id_lo > 20) + return NULL; +#endif + map_route_occluded_coord_rewind(mr); + dbg(1,"type %s\n", item_to_name(mr->route_item->type)); + return &mr->item; +} + +static struct item * +map_route_occluded_get_item_byid(struct map_rect_priv *mr, int id_hi, int id_lo) +{ + struct item *ret=NULL; + while (id_lo-- > 0) + ret=map_route_occluded_get_item(mr); + return ret; +} + +static struct map_methods map_route_occluded_methods = { + projection_mg, + "utf-8", + map_route_occluded_destroy, + map_route_occluded_rect_new, + map_route_occluded_rect_destroy, + map_route_occluded_get_item, + map_route_occluded_get_item_byid, + NULL, + NULL, + NULL, +}; + + +static struct map_priv * +map_route_occluded_new(struct map_methods *meth, struct attr **attrs) +{ + struct map_priv *ret; + struct attr *navit; + dbg(0,"enter\n"); + navit=attr_search(attrs, NULL, attr_navit); + if (! navit) + return NULL; + ret=g_new0(struct map_priv, 1); + *meth=map_route_occluded_methods; + ret->navit=navit->u.navit; + dbg(0,"m=%p navit=%p\n", ret, ret->navit); + return ret; +} + +static void +pedestrian_graphics_resize(struct graphics *gra, int w, int h) +{ +#ifndef HAVE_API_ANDROID + static int done; + if (!done) { + int id=(int)graphics_get_data(gra, "xwindow_id"); + char buffer[1024]; + sprintf(buffer,"testxv %d &",id); + system(buffer); + done=1; + } +#endif + pedestrian_data.w=w; + pedestrian_data.h=h; +} + + +static void +pedestrian_draw_arrow(struct graphics *gra, char *name, int x, int y) +{ + char *src=graphics_icon_path(name); + struct graphics_image *img=graphics_image_new(gra, src); + struct graphics_gc *gc=graphics_gc_new(gra); + struct color col={0xffff,0xffff,0xffff,0xffff}; + struct point p; + graphics_gc_set_foreground(gc, &col); + p.x=x; + p.y=y; + graphics_draw_image(gra, gc, &p, img); + graphics_image_free(gra, img); + graphics_gc_destroy(gc); + g_free(src); +} + +static void +pedestrian_draw_arrows(struct graphics *gra) +{ + struct attr route, route_map; + struct map_rect *route_map_rect; + struct item *item; + + if (orientation == 2) + return; + if (!navit_get_attr(pedestrian_data.nav, attr_route, &route, NULL)) { + dbg(0,"no route in navit\n"); + return; + } + if (!route_get_attr(route.u.route, attr_map, &route_map, NULL)) { + dbg(0,"no map in route\n"); + return; + } + route_map_rect=map_rect_new(route_map.u.map, NULL); + if (!route_map_rect) { + dbg(0,"no route map rect\n"); + return; + } + while ((item=map_rect_get_item(route_map_rect))) { + if (item->type == type_street_route) { + struct coord c[2]; + if (item_coord_get(item, c, 2) == 2) { + struct coord *center=transform_get_center(navit_get_trans(pedestrian_data.nav)); + int angle=transform_get_angle_delta(center, &c[1], 0); + angle-=pedestrian_data.yaw; + if (angle < 0) + angle+=360; + if (angle >= 360) + angle-=360; + if (angle > 180 && angle < 350) + pedestrian_draw_arrow(gra,"gui_arrow_left_32_32.png",0,pedestrian_data.h/2-16); + if (angle > 10 && angle <= 180) + pedestrian_draw_arrow(gra,"gui_arrow_right_32_32.png",pedestrian_data.w-32,pedestrian_data.h/2-16); + } + break; + } + } + map_rect_destroy(route_map_rect); +} + +static void +pedestrian_graphics_postdraw(struct graphics *gra) +{ +#if 0 + struct graphics_gc * gc = graphics_gc_new(gra); + struct point p; + struct color c = {0xadad,0xd8d8,0xe6e6,0xffff}; + p.x=0; + p.y=0; + graphics_gc_set_foreground(gc, &c); + graphics_gc_set_stipple(gc, NULL); + graphics_draw_rectangle(gra, gc, &p, 1000, 200); + graphics_gc_destroy(gc); +#endif + pedestrian_draw_arrows(gra); +} + +#ifndef HAVE_API_ANDROID +struct tilt_data { + int len,axis; + char buffer[32]; +}; + +void +pedestrian_write_tilt(int fd, int axis) +{ + char *buffer="01"; + int ret; + + ret=write(fd, buffer+axis, 1); + if (ret != 2) { + dbg(0,"ret=%d\n",ret); + } +} + + +void +pedestrian_read_tilt(int fd, struct navit *nav, struct tilt_data *data) +{ + int val,ret,maxlen=3; + ret=read(fd, data->buffer+data->len, maxlen-data->len); + if (ret > 0) { + data->len+=ret; + data->buffer[data->len]='\0'; + } + if (data->len == 3) { + struct attr attr; + sscanf(data->buffer,"%02x",&val); + data->len=0; + if (navit_get_attr(nav, attr_transformation, &attr, NULL)) { + struct transformation *trans=attr.u.transformation; + dbg(0,"ok axis=%d val=0x%x\n", data->axis, val); + if (data->axis != 1) { + transform_set_pitch(trans, 90+(val-0x80)); + } else { + transform_set_roll(trans, 0x80-val); + } + } + data->axis=1-data->axis; + +#if 0 + pedestrian_write_tilt(fd, data->axis); +#endif + } +} + +void +pedestrian_write_tilt_timer(int fd, struct tilt_data *data) +{ + pedestrian_write_tilt(fd, data->axis); +} + +void +pedestrian_setup_tilt(struct navit *nav) +{ + int fd,on=1; + struct termios t; + struct callback *cb,*cbt; + struct tilt_data *data=g_new0(struct tilt_data, 1); + char buffer[32]; + fd=open("/dev/tiltsensor",O_RDWR); + if (fd == -1) { + dbg(0,"Failed to set up tilt sensor, error %d\n",errno); + return; + } + tcgetattr(fd, &t); + cfmakeraw(&t); + cfsetspeed(&t, B19200); + tcsetattr(fd, TCSANOW, &t); + ioctl(fd, FIONBIO, &on); + cb=callback_new_3(callback_cast(pedestrian_read_tilt), fd, nav, data); + cbt=callback_new_2(callback_cast(pedestrian_write_tilt_timer), fd, data); + event_add_watch((void *)fd, event_watch_cond_read, cb); + event_add_timeout(300, 1, cbt); + read(fd, buffer, 32); +#if 0 + pedestrian_write_tilt(fd, 0); +#endif +} + +#else + + +float sensors[2][3]; + +static void +android_sensors(struct navit *nav, int sensor, float *x, float *y, float *z) +{ + float yaw=0,pitch=0; + struct attr attr; + sensors[sensor-1][0]=*x; + sensors[sensor-1][1]=*y; + sensors[sensor-1][2]=*z; + if (sensors_locked) + return; + dbg(1,"enter %d %f %f %f\n",sensor,*x,*y,*z); + if (sensor == 1) { + if (*x > 7.5) + orientation=1; /* landscape */ + if (*y > 7.5) + orientation=0; /* portrait */ + if (*z > 7.5) + orientation=2; /* flat */ + dbg(1,"orientation=%d\n",orientation); + } + if ((orientation_old == 2) != (orientation == 2)) { + struct attr attr, flags_graphics, osd_configuration; + navit_set_attr(nav, orientation == 2 ? &initial_layout:&main_layout); + navit_get_attr(nav, attr_transformation, &attr, NULL); + transform_set_scale(attr.u.transformation, orientation == 2 ? 64:16); + flags_graphics.type=attr_flags_graphics; + flags_graphics.u.num=orientation == 2 ? 0:10; + navit_set_attr(nav, &flags_graphics); + osd_configuration.type=attr_osd_configuration; + osd_configuration.u.num=orientation == 2 ? 1:2; + navit_set_attr(nav, &osd_configuration); + } + orientation_old=orientation; + switch (orientation) { + case 2: + if (sensor == 2) { + yaw=atan2f(-*y,-*x)*180/M_PI+180; + } + pitch=0; + break; + case 1: + if (sensor == 1) { + pitch=atan2f(*x,*z)*180/M_PI; + } + if (sensor == 2) { + yaw=atan2f(-*y,*z)*180/M_PI+180; + } + break; + case 0: + if (sensor == 1) { + pitch=atan2f(*y,*z)*180/M_PI; + } + if (sensor == 2) { + yaw=atan2f(*x,*z)*180/M_PI+180; + } + break; + } + if (navit_get_attr(nav, attr_transformation, &attr, NULL)) { + struct transformation *trans=attr.u.transformation; + if (sensor == 1) { + if (orientation != 2) + pitch+=2.0; + transform_set_pitch(trans, (int)pitch); + dbg(1,"pich %d %f\n",orientation,pitch); + } else { + struct attr attr; + attr.type=attr_orientation; + attr.u.num=yaw-1.0; + if (attr.u.num < 0) + attr.u.num+=360; + pedestrian_data.yaw=attr.u.num; + navit_set_attr(nav, &attr); + dbg(1,"yaw %d %f\n",orientation,yaw); + if (orientation == 2) + navit_set_center_cursor(nav, 1, 0); + } + } +} +#endif + +static void +pedestrian_log(char **logstr) +{ +#ifdef HAVE_API_ANDROID + char *tag=g_strdup_printf( + "\t\t%f\n" + "\t\t%f\n" + "\t\t%f\n" + "\t\t%f\n" + "\t\t%f\n" + "\t\t%f\n", + sensors[0][0],sensors[0][1],sensors[0][2], + sensors[1][0],sensors[1][1],sensors[1][2]); + vehicle_log_gpx_add_tag(tag, logstr); +#endif +} + +#ifdef DEMO +static void +vehicle_changed(struct vehicle *v, struct transformation *trans) +{ + struct attr attr; + if (vehicle_get_attr(v, attr_position_direction, &attr, NULL)) { + int dir=(int)(*attr.u.numd); + dbg(0,"enter %d\n",dir); + transform_set_pitch(trans, 90); + transform_set_yaw(trans, dir); + } +} +#endif + + +static void +pedestrian_navit_init(struct navit *nav) +{ + struct attr route; + struct attr route_map; + struct attr map; + struct attr mapset; + struct attr graphics,attr,flags_graphics; + struct transformation *trans; + struct attr_iter *iter; + +#ifdef HAVE_API_ANDROID + struct callback *cb; + jclass navitsensorsclass; + jmethodID cid; + jobject navitsensors; + + dbg(0,"enter\n"); + if (android_find_class_global("org/navitproject/navit/NavitSensors", &navitsensorsclass)) { + dbg(0,"class found\n"); + cid = (*jnienv)->GetMethodID(jnienv, navitsensorsclass, "", "(Landroid/content/Context;I)V"); + dbg(0,"cid=%p\n",cid); + if (cid) { + cb=callback_new_1(callback_cast(android_sensors), nav); + navitsensors=(*jnienv)->NewObject(jnienv, navitsensorsclass, cid, android_activity, cb); + dbg(0,"object=%p\n",navitsensors); + if (navitsensors) + (*jnienv)->NewGlobalRef(jnienv, navitsensors); + } + + } +#endif + pedestrian_data.nav=nav; + flags_graphics.type=attr_flags_graphics; + flags_graphics.u.num=10; + navit_set_attr(nav, &flags_graphics); + if (navit_get_attr(nav, attr_graphics, &graphics, NULL)) { + struct attr attr; + struct callback *cb=callback_new_attr_1(callback_cast(pedestrian_graphics_resize),attr_resize,graphics.u.graphics); + graphics_add_callback(graphics.u.graphics, cb); + cb=callback_new_attr_1(callback_cast(pedestrian_graphics_postdraw),attr_postdraw,graphics.u.graphics); + graphics_add_callback(graphics.u.graphics, cb); + attr.type=attr_use_camera; + attr.u.num=1; + graphics_set_attr(graphics.u.graphics, &attr); + } + osd_rocket_init(nav); +#if 1 +#ifndef HAVE_API_ANDROID + pedestrian_setup_tilt(nav); +#endif + trans=navit_get_trans(nav); + transform_set_pitch(trans, 90); + transform_set_roll(trans, 0); + transform_set_hog(trans, 2); + transform_set_distance(trans, 0); + transform_set_scales(trans, 750, 620, 32 << 8); + if (!navit_get_attr(nav, attr_route, &route, NULL)) + return; + if (!route_get_attr(route.u.route, attr_map, &route_map, NULL)) + return; + dbg(0,"enter 1\n"); +#if 0 + struct attr active; + active.type=attr_active; + active.u.num=0; + if (!map_set_attr(route_map.u.map, &active)) + return; + dbg(0,"enter 2\n"); +#endif + if (!navit_get_attr(nav, attr_mapset, &mapset, NULL)) + return; + map.type=attr_map; + map.u.map=map_new(NULL, (struct attr*[]){ + &(struct attr){attr_type,{"route_occluded"}}, + &(struct attr){attr_data,{""}}, + &(struct attr){attr_description,{"Occluded Route"}}, + &(struct attr){attr_navit,{(void *)nav}}, + NULL}); + global_map=map.u.map; + mapset_add_attr(mapset.u.mapset, &map); + +#if 0 + map=route_get_attr(route, attr_map); +#endif +#endif + transform_set_scale(trans, 16); + navit_get_attr(nav, attr_layout, &initial_layout, NULL); + iter=navit_attr_iter_new(); + while(navit_get_attr(nav, attr_layout, &attr, iter)) { + if (!strcmp(attr.u.layout->name, "Route")) { + dbg(0,"found %s\n",attr_to_name(attr.type)); + main_layout=attr; +#if 1 + navit_set_attr(nav, &attr); +#endif + break; + } + } + navit_attr_iter_destroy(iter); + if (navit_get_attr(nav, attr_vehicle, &attr, NULL)) { + struct attr cbattr; + cbattr.u.callback=callback_new_attr_0(callback_cast(pedestrian_log), attr_log_gpx); + cbattr.type=attr_callback; + vehicle_add_attr(attr.u.vehicle, &cbattr); +#ifdef DEMO + cbattr.u.callback=callback_new_attr_2(callback_cast(vehicle_changed), attr_position_coord_geo, attr.u.vehicle, trans); + cbattr.type=attr_callback; + vehicle_add_attr(attr.u.vehicle, &cbattr); +#endif + } + +} + +static void +pedestrian_navit(struct navit *nav, int add) +{ + dbg(0,"enter\n"); + struct attr callback; + if (add) { + callback.type=attr_callback; + callback.u.callback=callback_new_attr_0(callback_cast(pedestrian_navit_init), attr_navit); + navit_add_attr(nav, &callback); + } +} + +void +plugin_init(void) +{ + struct attr callback,navit; + struct attr_iter *iter; +#ifdef HAVE_API_ANDROID + jclass ActivityClass; + jmethodID Activity_setRequestedOrientation; + + if (!android_find_class_global("android/app/Activity", &ActivityClass)) + dbg(0,"failed to get class android/app/Activity\n"); + Activity_setRequestedOrientation = (*jnienv)->GetMethodID(jnienv, ActivityClass, "setRequestedOrientation", "(I)V"); + if (Activity_setRequestedOrientation == NULL) + dbg(0,"failed to get method setRequestedOrientation from android/app/Activity\n"); + (*jnienv)->CallVoidMethod(jnienv, android_activity, Activity_setRequestedOrientation, 0); +#endif + + plugin_register_osd_type("marker", osd_marker_new); + plugin_register_map_type("route_occluded", map_route_occluded_new); + callback.type=attr_callback; + callback.u.callback=callback_new_attr_0(callback_cast(pedestrian_navit), attr_navit); + config_add_attr(config, &callback); + iter=config_attr_iter_new(); + while (config_get_attr(config, attr_navit, &navit, iter)) + pedestrian_navit_init(navit.u.navit); + config_attr_iter_destroy(iter); +} diff --git a/navit/plugin_def.h b/navit/plugin_def.h new file mode 100644 index 0000000..01acea7 --- /dev/null +++ b/navit/plugin_def.h @@ -0,0 +1,33 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +struct attr; +struct navit; +struct callback_list; +struct gui; +PLUGIN_FUNC1(draw, struct container *, co) +PLUGIN_FUNC3(popup, struct container *, map, struct popup *, p, struct popup_item **, list) +PLUGIN_TYPE(graphics, (struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl)) +PLUGIN_TYPE(gui, (struct navit *nav, struct gui_methods *meth, struct attr **attrs, struct gui *gui)) +PLUGIN_TYPE(map, (struct map_methods *meth, struct attr **attrs, struct callback_list *cbl)) +PLUGIN_TYPE(osd, (struct navit *nav, struct osd_methods *meth, struct attr **attrs)) +PLUGIN_TYPE(speech, (struct speech_methods *meth, struct attr **attrs, struct attr *parent)) +PLUGIN_TYPE(vehicle, (struct vehicle_methods *meth, struct callback_list *cbl, struct attr **attrs)) +PLUGIN_TYPE(event, (struct event_methods *meth)) +PLUGIN_TYPE(font, (void *meth)) diff --git a/navit/point.h b/navit/point.h new file mode 100644 index 0000000..cc5ccdd --- /dev/null +++ b/navit/point.h @@ -0,0 +1,32 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_POINT_H +#define NAVIT_POINT_H + +struct point { + int x; + int y; +}; + +struct point_rect { + struct point lu; + struct point rl; +}; +#endif diff --git a/navit/popup.c b/navit/popup.c new file mode 100644 index 0000000..fb716ad --- /dev/null +++ b/navit/popup.c @@ -0,0 +1,399 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008, 2010 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include "config.h" +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include +#include +#include +#include "popup.h" +#include "debug.h" +#include "navit.h" +#include "coord.h" +#include "gui.h" +#include "menu.h" +#include "point.h" +#include "transform.h" +#include "projection.h" +#include "item.h" +#include "map.h" +#include "graphics.h" +#include "callback.h" +#include "route.h" +#include "navit_nls.h" +#include "bookmarks.h" + +#if 0 +static void +popup_set_no_passing(struct popup_item *item, void *param) +{ +#if 0 + struct display_list *l=param; + struct segment *seg=(struct segment *)(l->data); + struct street_str *str=(struct street_str *)(seg->data[0]); + char log[256]; + int segid=str->segid; + if (segid < 0) + segid=-segid; + + sprintf(log,"Attributes Street 0x%x updated: limit=0x%x(0x%x)", segid, 0x33, str->limit); + str->limit=0x33; + log_write(log, seg->blk_inf.file, str, sizeof(*str)); +#endif +} + +#endif + +static void +popup_traffic_distortion(struct item *item, char *attr) +{ + /* add the configuration directory to the name of the file to use */ + char *dist_filename = g_strjoin(NULL, navit_get_user_data_directory(TRUE), + "/distortion.txt", NULL); + if (dist_filename) /* if we built the filename */ + { + FILE *map=fopen(dist_filename,"a"); + if (map) /* if the file was opened */ + { + struct coord c; + struct map_rect *mr; + fprintf(map,"type=traffic_distortion %s\n",attr); + mr=map_rect_new(item->map,NULL); + item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); + while (item_coord_get(item, &c, 1)) { + fprintf(map,"0x%x 0x%x\n",c.x,c.y); + } + fclose(map); + } + else + { + dbg(0,"could not open file for distortions !!", item); + + } /* else - if (map) */ + g_free(dist_filename); /* free the file name */ + } /* if (dist_filename) */ + +} /* end: popup_traffic_distortion(..) */ + + +static void +popup_traffic_distortion_blocked(struct item *item) +{ + dbg(0,"item=%p\n",item); + popup_traffic_distortion(item, "maxspeed=0"); +} + +static void +popup_traffic_distortion_speed(struct item *item, int maxspeed) +{ + char buffer[256]; + sprintf(buffer,"maxspeed=%d",maxspeed); + popup_traffic_distortion(item,buffer); +} + +static void +popup_traffic_distortion_delay(struct item *item, int delay) +{ + char buffer[256]; + sprintf(buffer,"delay=%d",delay*600); + popup_traffic_distortion(item,buffer); +} + +static void +popup_set_destination(struct navit *nav, struct pcoord *pc) +{ + struct coord c; + struct coord_geo g; + char buffer[1024]; + char buffer_geo[1024]; + c.x = pc->x; + c.y = pc->y; + transform_to_geo(transform_get_projection(navit_get_trans(nav)), &c, &g); + coord_format(g.lat,g.lng,DEGREES_MINUTES_SECONDS,buffer_geo,sizeof(buffer_geo)); + sprintf(buffer,"Map Point %s", buffer_geo); + navit_set_destination(nav, pc, buffer, 1); +} + +static void +popup_set_bookmark(struct navit *nav, struct pcoord *pc) +{ + struct attr attr; + struct coord c; + struct coord_geo g; + char buffer[1024]; + char buffer_geo[1024]; + c.x = pc->x; + c.y = pc->y; + transform_to_geo(pc->pro, &c, &g); + coord_format(g.lat,g.lng,DEGREES_MINUTES_SECONDS,buffer_geo,sizeof(buffer_geo)); + sprintf(buffer,"Map Point %s", buffer_geo); + if (!gui_add_bookmark(navit_get_gui(nav), pc, buffer)) { + navit_get_attr(nav, attr_bookmarks, &attr, NULL); + bookmarks_add_bookmark(attr.u.bookmarks, pc, buffer); + } +} + + +extern void *vehicle; + +static void +popup_set_position(struct navit *nav, struct pcoord *pc) +{ + dbg(1,"%p %p\n", nav, pc); + navit_set_position(nav, pc); +} + +#if 0 +static void +popup_break_crossing(struct display_list *l) +{ + struct segment *seg=(struct segment *)(l->data); + struct street_str *str=(struct street_str *)(seg->data[0]); + char log[256]; + int segid=str->segid; + if (segid < 0) + segid=-segid; + + sprintf(log,"Coordinates Street 0x%x updated: limit=0x%x(0x%x)", segid, 0x33, str->limit); + str->limit=0x33; + log_write(log, seg->blk_inf.file, str, sizeof(*str)); +} +#endif + + +#define popup_printf(menu, type, ...) popup_printf_cb(menu, type, NULL, __VA_ARGS__) + +static void * +popup_printf_cb(void *menu, enum menu_type type, struct callback *cb, const char *fmt, ...) +{ + gchar *str,*us; + int usc=0; + va_list ap; + void *ret; + + va_start(ap, fmt); + str=g_strdup_vprintf(fmt, ap); + dbg(0,"%s\n", str); + us=str; + while (*us) { + if (*us == '_') + usc++; + us++; + } + if (usc) { + gchar *str2=g_malloc(strlen(str)+usc+1); + gchar *us2=str2; + us=str; + while (*us) { + if (*us == '_') + *us2++=*us; + *us2++=*us++; + } + *us2='\0'; + g_free(str); + str=str2; + } + ret=menu_add(menu, str, type, cb); + va_end(ap); + g_free(str); + return ret; +} + +static void +popup_show_attr_val(struct map *map, void *menu, struct attr *attr) +{ + char *attr_name=attr_to_name(attr->type); + char *str; + + str=attr_to_text(attr, map, 1); + popup_printf(menu, menu_type_menu, "%s: %s", attr_name, str); + g_free(str); +} + +#if 0 +static void +popup_show_attr(void *menu, struct item *item, enum attr_type attr_type) +{ + struct attr attr; + memset(&attr, 0, sizeof(attr)); + attr.type=attr_type; + if (item_attr_get(item, attr_type, &attr)) + popup_show_attr_val(menu, &attr); +} +#endif + +static void +popup_show_attrs(struct map *map, void *menu, struct item *item) +{ +#if 0 + popup_show_attr(menu, item, attr_debug); + popup_show_attr(menu, item, attr_address); + popup_show_attr(menu, item, attr_phone); + popup_show_attr(menu, item, attr_phone); + popup_show_attr(menu, item, attr_entry_fee); + popup_show_attr(menu, item, attr_open_hours); +#else + struct attr attr; + for (;;) { + memset(&attr, 0, sizeof(attr)); + if (item_attr_get(item, attr_any, &attr)) + popup_show_attr_val(map, menu, &attr); + else + break; + } + +#endif +} + +static void +popup_item_dump(struct item *item) +{ + struct map_rect *mr; + mr=map_rect_new(item->map,NULL); + item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); + dbg(0,"item=%p\n",item); + item_dump_filedesc(item,item->map,stdout); + map_rect_destroy(mr); +} + + +static void +popup_show_item(struct navit *nav, void *popup, struct displayitem *di) +{ + struct map_rect *mr; + void *menu, *menu_map, *menu_item, *menu_dist; + char *label; + struct item *item,*diitem; + int count; + + label=graphics_displayitem_get_label(di); + diitem=graphics_displayitem_get_item(di); + count=graphics_displayitem_get_coord_count(di); + + dbg_assert(diitem); + + if (label) + menu=popup_printf(popup, menu_type_submenu, "%s '%s' (%d coords)", item_to_name(diitem->type), label, count); + else + menu=popup_printf(popup, menu_type_submenu, "%s (%d coords)", item_to_name(diitem->type), count); + menu_item=popup_printf(menu, menu_type_submenu, "Item"); + popup_printf(menu_item, menu_type_menu, "type: 0x%x", diitem->type); + popup_printf(menu_item, menu_type_menu, "id: 0x%x 0x%x", diitem->id_hi, diitem->id_lo); + if (diitem->map) { + struct attr type,data; + if (!map_get_attr(diitem->map, attr_type, &type, NULL)) + type.u.str=""; + if (!map_get_attr(diitem->map, attr_data, &data, NULL)) + data.u.str=""; + popup_printf(menu_item, menu_type_menu, "map: %s:%s", type.u.str, data.u.str); + } + if (diitem->map) { + mr=map_rect_new(diitem->map,NULL); + item=map_rect_get_item_byid(mr, diitem->id_hi, diitem->id_lo); + dbg(1,"item=%p\n", item); + if (item) { + popup_show_attrs(item->map, menu_item, item); + popup_printf_cb(menu_item, menu_type_menu, callback_new_1(callback_cast(popup_item_dump), diitem), "Dump"); + if (item->type < type_line) { + struct coord co; + struct pcoord *c; + if (item_coord_get(item, &co, 1)) { + c=g_new(struct pcoord, 1); + c->pro = transform_get_projection(navit_get_trans(nav)); + c->x = co.x; + c->y = co.y; + popup_printf_cb(menu_item, menu_type_menu, callback_new_2(callback_cast(popup_set_position), nav, c), _("Set as position")); + popup_printf_cb(menu_item, menu_type_menu, callback_new_2(callback_cast(popup_set_destination), nav, c), _("Set as destination")); + popup_printf_cb(menu_item, menu_type_menu, callback_new_2(callback_cast(popup_set_bookmark), nav, c), _("Add as bookmark")); + } + } + } + map_rect_destroy(mr); + menu_map=popup_printf(menu, menu_type_submenu, "Map"); + } else { + popup_printf(menu, menu_type_menu, "(No map)"); + } + if (item_get_default_flags(diitem->type)) { + int speeds[]={5,10,20,30,40,50,60,70,80,90,100}; + int delays[]={1,2,3,5,10,15,20,30,45,60,75,90,120,150,180,240,300}; + int i; + menu_dist=popup_printf(menu, menu_type_submenu, "Traffic distortion"); + popup_printf_cb(menu_dist, menu_type_menu, callback_new_1(callback_cast(popup_traffic_distortion_blocked), diitem), "Blocked"); + menu_item=popup_printf(menu_dist, menu_type_submenu,"Max speed"); + for (i = 0 ; i < sizeof(speeds)/sizeof(int); i++) { + popup_printf_cb(menu_item, menu_type_menu, callback_new_2(callback_cast(popup_traffic_distortion_speed), diitem, speeds[i]), "%d km/h",speeds[i]); + } + menu_item=popup_printf(menu_dist, menu_type_submenu,"Delay"); + for (i = 0 ; i < sizeof(delays)/sizeof(int); i++) { + popup_printf_cb(menu_item, menu_type_menu, callback_new_2(callback_cast(popup_traffic_distortion_delay), diitem, delays[i]*600), "%d min",delays[i]); + } + } +} + +static void +popup_display(struct navit *nav, void *popup, struct point *p) +{ + struct displaylist_handle *dlh; + struct displaylist *display; + struct displayitem *di; + + display=navit_get_displaylist(nav); + dlh=graphics_displaylist_open(display); + while ((di=graphics_displaylist_next(dlh))) { + if (graphics_displayitem_within_dist(display, di, p, 5)) { + popup_show_item(nav, popup, di); + } + } + graphics_displaylist_close(dlh); +} + +static struct pcoord c; + +void +popup(struct navit *nav, int button, struct point *p) +{ + void *popup,*men; + char buffer[1024]; + struct coord_geo g; + struct coord co; + + popup=gui_popup_new(navit_get_gui(nav)); + if (! popup) + return; + transform_reverse(navit_get_trans(nav), p, &co); + men=popup_printf(popup, menu_type_submenu, _("Point 0x%x 0x%x"), co.x, co.y); + popup_printf(men, menu_type_menu, _("Screen coord : %d %d"), p->x, p->y); + transform_to_geo(transform_get_projection(navit_get_trans(nav)), &co, &g); + coord_format(g.lat,g.lng,DEGREES_MINUTES_SECONDS,buffer,sizeof(buffer)); + popup_printf(men, menu_type_menu, "%s", buffer); + popup_printf(men, menu_type_menu, "%f %f", g.lat, g.lng); + dbg(1,"%p %p\n", nav, &c); + c.pro = transform_get_projection(navit_get_trans(nav)); + c.x = co.x; + c.y = co.y; + popup_printf_cb(men, menu_type_menu, callback_new_2(callback_cast(popup_set_position), nav, &c), _("Set as position")); + popup_printf_cb(men, menu_type_menu, callback_new_2(callback_cast(popup_set_destination), nav, &c), _("Set as destination")); + popup_printf_cb(men, menu_type_menu, callback_new_2(callback_cast(popup_set_bookmark), nav, &c), _("Add as bookmark")); + popup_display(nav, popup, p); + menu_popup(popup); +} diff --git a/navit/popup.h b/navit/popup.h new file mode 100644 index 0000000..a4c17a6 --- /dev/null +++ b/navit/popup.h @@ -0,0 +1,27 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_POPUP_H +#define NAVIT_POPUP_H + +struct navit; +struct point; +void popup(struct navit *nav, int button, struct point *p); + +#endif diff --git a/navit/profile.c b/navit/profile.c new file mode 100644 index 0000000..736dd72 --- /dev/null +++ b/navit/profile.c @@ -0,0 +1,66 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#ifndef _MSC_VER +#include +#endif /* _MSC_VER */ +#include "profile.h" +#include "debug.h" + +void +profile_timer(int level, const char *module, const char *function, const char *fmt, ...) +{ +#ifndef _MSC_VER + va_list ap; + static struct timeval last[10]; + struct timeval curr; + int msec,usec; + char buffer[strlen(module)+20]; + + va_start(ap, fmt); + if (level < 0) + level=0; + if (level > 9) + level=9; + if (fmt) { + gettimeofday(&curr, NULL); + msec=(curr.tv_usec-last[level].tv_usec)/1000+ + (curr.tv_sec-last[level].tv_sec)*1000; + + sprintf(buffer, "profile:%s", module); + debug_vprintf(1, buffer, strlen(buffer), function, strlen(function), 1, fmt, ap); + if (msec >= 100) + debug_printf(1, buffer, strlen(buffer), function, strlen(function), 0, " %d msec\n", msec); + else { + usec=(curr.tv_usec-last[level].tv_usec)+(curr.tv_sec-last[level].tv_sec)*1000*1000; + debug_printf(1, buffer, strlen(buffer), function, strlen(function), 0, " %d.%d msec\n", usec/1000, usec%1000); + } + gettimeofday(&last[level], NULL); + } else { + gettimeofday(&curr, NULL); + while (level < 10) + last[level++]=curr; + } + va_end(ap); +#endif /*_MSC_VER*/ +} diff --git a/navit/profile.h b/navit/profile.h new file mode 100644 index 0000000..5441221 --- /dev/null +++ b/navit/profile.h @@ -0,0 +1,39 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_PROFILE_H +#define NAVIT_PROFILE_H + +#ifdef __cplusplus +extern "C" { +#endif +#ifdef _MSC_VER +#define __PRETTY_FUNCTION__ __FUNCTION__ +#endif +#define profile_str2(x) #x +#define profile_str1(x) profile_str2(x) +#define profile_module profile_str1(MODULE) +#define profile(level,...) profile_timer(level,profile_module,__PRETTY_FUNCTION__,__VA_ARGS__) +void profile_timer(int level, const char *module, const char *function, const char *fmt, ...); +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/navit/projection.c b/navit/projection.c new file mode 100644 index 0000000..79f5802 --- /dev/null +++ b/navit/projection.c @@ -0,0 +1,73 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "coord.h" +#include "debug.h" +#include "projection.h" + +struct projection_name { + enum projection projection; + char *name; +}; + + +struct projection_name projection_names[]={ + {projection_none, ""}, + {projection_mg, "mg"}, + {projection_garmin, "garmin"}, + {projection_utm, "utm"}, + {projection_gk, "gk"}, +}; + + +enum projection +projection_from_name(const char *name, struct coord *offset) +{ + int i; + int zone; + char ns; + + for (i=0 ; i < sizeof(projection_names)/sizeof(struct projection_name) ; i++) { + if (! strcmp(projection_names[i].name, name)) + return projection_names[i].projection; + } + if (offset) { + if (sscanf(name,"utm%d%c",&zone,&ns) == 2 && zone > 0 && zone <= 60 && (ns == 'n' || ns == 's')) { + offset->x=zone*1000000; + offset->y=(ns == 's' ? -10000000:0); + return projection_utm; + } + } + return projection_none; +} + +char * +projection_to_name(enum projection proj) +{ + int i; + + for (i=0 ; i < sizeof(projection_names)/sizeof(struct projection_name) ; i++) { + if (projection_names[i].projection == proj) + return projection_names[i].name; + } + return NULL; +} + diff --git a/navit/projection.h b/navit/projection.h new file mode 100644 index 0000000..6dd78d1 --- /dev/null +++ b/navit/projection.h @@ -0,0 +1,36 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_PROJECTION_H +#define NAVIT_PROJECTION_H + +enum projection { + projection_none, projection_mg, projection_garmin, projection_screen, projection_utm, projection_gk +}; + +enum map_datum { + map_datum_none, map_datum_wgs84, map_datum_dhdn +}; + +struct coord; +enum projection projection_from_name(const char *name, struct coord *offset); +char * projection_to_name(enum projection proj); + +#endif + diff --git a/navit/roadprofile.c b/navit/roadprofile.c new file mode 100644 index 0000000..8fa617c --- /dev/null +++ b/navit/roadprofile.c @@ -0,0 +1,83 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include "debug.h" +#include "item.h" +#include "roadprofile.h" + +static void +roadprofile_set_attr_do(struct roadprofile *this, struct attr *attr) +{ + switch (attr->type) { + case attr_speed: + this->speed=attr->u.num; + break; + case attr_maxspeed: + this->maxspeed=attr->u.num; + break; + case attr_route_weight: + this->route_weight=attr->u.num; + break; + default: + break; + } +} + +struct roadprofile * +roadprofile_new(struct attr *parent, struct attr **attrs) +{ + struct roadprofile *this_; + struct attr **attr; + this_=g_new0(struct roadprofile, 1); + this_->attrs=attr_list_dup(attrs); + this_->maxspeed=0; + for (attr=attrs;*attr; attr++) + roadprofile_set_attr_do(this_, *attr); + return this_; +} + +int +roadprofile_get_attr(struct roadprofile *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); +} + +int +roadprofile_set_attr(struct roadprofile *this_, struct attr *attr) +{ + roadprofile_set_attr_do(this_, attr); + this_->attrs=attr_generic_set_attr(this_->attrs, attr); + return 1; +} + +int +roadprofile_add_attr(struct roadprofile *this_, struct attr *attr) +{ + this_->attrs=attr_generic_add_attr(this_->attrs, attr); + return 1; +} + +int +roadprofile_remove_attr(struct roadprofile *this_, struct attr *attr) +{ + this_->attrs=attr_generic_remove_attr(this_->attrs, attr); + return 1; +} + diff --git a/navit/roadprofile.h b/navit/roadprofile.h new file mode 100644 index 0000000..55f38f7 --- /dev/null +++ b/navit/roadprofile.h @@ -0,0 +1,38 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + + +#ifdef __cplusplus +extern "C" { +#endif +struct roadprofile { + struct attr **attrs; + int speed; + int route_weight; + int maxspeed; +}; + +struct roadprofile * roadprofile_new(struct attr *parent, struct attr **attrs); +int roadprofile_get_attr(struct roadprofile *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); +int roadprofile_set_attr(struct roadprofile *this_, struct attr *attr); +int roadprofile_add_attr(struct roadprofile *this_, struct attr *attr); +int roadprofile_remove_attr(struct roadprofile *this_, struct attr *attr); +#ifdef __cplusplus +} +#endif diff --git a/navit/route.c b/navit/route.c new file mode 100644 index 0000000..fab9e7d --- /dev/null +++ b/navit/route.c @@ -0,0 +1,3675 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +/** @file + * @brief Contains code related to finding a route from a position to a destination + * + * Routing uses segments, points and items. Items are items from the map: Streets, highways, etc. + * Segments represent such items, or parts of it. Generally, a segment is a driveable path. An item + * can be represented by more than one segment - in that case it is "segmented". Each segment has an + * "offset" associated, that indicates at which position in a segmented item this segment is - a + * segment representing a not-segmented item always has the offset 1. + * A point is located at the end of segments, often connecting several segments. + * + * The code in this file will make navit find a route between a position and a destination. + * It accomplishes this by first building a "route graph". This graph contains segments and + * points. + * + * After building this graph in route_graph_build(), the function route_graph_flood() assigns every + * point and segment a "value" which represents the "costs" of traveling from this point to the + * destination. This is done by Dijkstra's algorithm. + * + * When the graph is built a "route path" is created, which is a path in this graph from a given + * position to the destination determined at time of building the graph. + */ + +#include +#include +#include +#if 0 +#include +#include +#include +#include +#endif +#include "glib_slice.h" +#include "config.h" +#include "point.h" +#include "graphics.h" +#include "profile.h" +#include "coord.h" +#include "projection.h" +#include "item.h" +#include "map.h" +#include "mapset.h" +#include "route.h" +#include "track.h" +#include "transform.h" +#include "plugin.h" +#include "fib.h" +#include "event.h" +#include "callback.h" +#include "vehicle.h" +#include "vehicleprofile.h" +#include "roadprofile.h" +#include "debug.h" + +struct map_priv { + struct route *route; +}; + +int debug_route=0; + +/** + * @brief A point in the route graph + * + * This represents a point in the route graph. A point usually connects two or more segments, + * but there are also points which don't do that (e.g. at the end of a dead-end). + */ +struct route_graph_point { + struct route_graph_point *hash_next; /**< Pointer to a chained hashlist of all route_graph_points with this hash */ + struct route_graph_segment *start; /**< Pointer to a list of segments of which this point is the start. The links + * of this linked-list are in route_graph_segment->start_next.*/ + struct route_graph_segment *end; /**< Pointer to a list of segments of which this pointer is the end. The links + * of this linked-list are in route_graph_segment->end_next. */ + struct route_graph_segment *seg; /**< Pointer to the segment one should use to reach the destination at + * least costs */ + struct fibheap_el *el; /**< When this point is put on a Fibonacci heap, this is a pointer + * to this point's heap-element */ + int value; /**< The cost at which one can reach the destination from this point on */ + struct coord c; /**< Coordinates of this point */ + int flags; /**< Flags for this point (eg traffic distortion) */ +}; + +#define RP_TRAFFIC_DISTORTION 1 +#define RP_TURN_RESTRICTION 2 +#define RP_TURN_RESTRICTION_RESOLVED 4 + +/** + * @brief A segment in the route graph or path + * + * This is a segment in the route graph or path. A segment represents a driveable way. + */ + +struct route_segment_data { + struct item item; /**< The item (e.g. street) that this segment represents. */ + int flags; + int len; /**< Length of this segment */ + /*NOTE: After a segment, various fields may follow, depending on what flags are set. Order of fields: + 1.) maxspeed Maximum allowed speed on this segment. Present if AF_SPEED_LIMIT is set. + 2.) offset If the item is segmented (i.e. represented by more than one segment), this + indicates the position of this segment in the item. Present if AF_SEGMENTED is set. + */ +}; + + +struct size_weight_limit { + int width; + int length; + int height; + int weight; + int axle_weight; +}; + +#define RSD_OFFSET(x) *((int *)route_segment_data_field_pos((x), attr_offset)) +#define RSD_MAXSPEED(x) *((int *)route_segment_data_field_pos((x), attr_maxspeed)) +#define RSD_SIZE_WEIGHT(x) *((struct size_weight_limit *)route_segment_data_field_pos((x), attr_vehicle_width)) +#define RSD_DANGEROUS_GOODS(x) *((int *)route_segment_data_field_pos((x), attr_vehicle_dangerous_goods)) + + +struct route_graph_segment_data { + struct item *item; + int offset; + int flags; + int len; + int maxspeed; + struct size_weight_limit size_weight; + int dangerous_goods; +}; + +/** + * @brief A segment in the route graph + * + * This is a segment in the route graph. A segment represents a driveable way. + */ +struct route_graph_segment { + struct route_graph_segment *next; /**< Linked-list pointer to a list of all route_graph_segments */ + struct route_graph_segment *start_next; /**< Pointer to the next element in the list of segments that start at the + * same point. Start of this list is in route_graph_point->start. */ + struct route_graph_segment *end_next; /**< Pointer to the next element in the list of segments that end at the + * same point. Start of this list is in route_graph_point->end. */ + struct route_graph_point *start; /**< Pointer to the point this segment starts at. */ + struct route_graph_point *end; /**< Pointer to the point this segment ends at. */ + struct route_segment_data data; /**< The segment data */ +}; + +/** + * @brief A traffic distortion + * + * This is distortion in the traffic where you can't drive as fast as usual or have to wait for some time + */ +struct route_traffic_distortion { + int maxspeed; /**< Maximum speed possible in km/h */ + int delay; /**< Delay in tenths of seconds */ +}; + +/** + * @brief A segment in the route path + * + * This is a segment in the route path. + */ +struct route_path_segment { + struct route_path_segment *next; /**< Pointer to the next segment in the path */ + struct route_segment_data *data; /**< The segment data */ + int direction; /**< Order in which the coordinates are ordered. >0 means "First + * coordinate of the segment is the first coordinate of the item", <=0 + * means reverse. */ + unsigned ncoords; /**< How many coordinates does this segment have? */ + struct coord c[0]; /**< Pointer to the ncoords coordinates of this segment */ + /* WARNING: There will be coordinates following here, so do not create new fields after c! */ +}; + +/** + * @brief Usually represents a destination or position + * + * This struct usually represents a destination or position + */ +struct route_info { + struct coord c; /**< The actual destination / position */ + struct coord lp; /**< The nearest point on a street to c */ + int pos; /**< The position of lp within the coords of the street */ + int lenpos; /**< Distance between lp and the end of the street */ + int lenneg; /**< Distance between lp and the start of the street */ + int lenextra; /**< Distance between lp and c */ + int percent; /**< ratio of lenneg to lenght of whole street in percent */ + struct street_data *street; /**< The street lp is on */ + int street_direction; /**< Direction of vehicle on street -1 = Negative direction, 1 = Positive direction, 0 = Unknown */ + int dir; /**< Direction to take when following the route -1 = Negative direction, 1 = Positive direction */ +}; + +/** + * @brief A complete route path + * + * This structure describes a whole routing path + */ +struct route_path { + int in_use; /**< The path is in use and can not be updated */ + int update_required; /**< The path needs to be updated after it is no longer in use */ + int updated; /**< The path has only been updated */ + int path_time; /**< Time to pass the path */ + int path_len; /**< Length of the path */ + struct route_path_segment *path; /**< The first segment in the path, i.e. the segment one should + * drive in next */ + struct route_path_segment *path_last; /**< The last segment in the path */ + /* XXX: path_hash is not necessery now */ + struct item_hash *path_hash; /**< A hashtable of all the items represented by this route's segements */ + struct route_path *next; /**< Next route path in case of intermediate destinations */ +}; + +/** + * @brief A complete route + * + * This struct holds all information about a route. + */ +struct route { + struct mapset *ms; /**< The mapset this route is built upon */ + unsigned flags; + struct route_info *pos; /**< Current position within this route */ + GList *destinations; /**< Destinations of the route */ + struct route_info *current_dst; /**< Current destination */ + + struct route_graph *graph; /**< Pointer to the route graph */ + struct route_path *path2; /**< Pointer to the route path */ + struct map *map; + struct map *graph_map; + struct callback * route_graph_done_cb ; /**< Callback when route graph is done */ + struct callback * route_graph_flood_done_cb ; /**< Callback when route graph flooding is done */ + struct callback_list *cbl2; /**< Callback list to call when route changes */ + int destination_distance; /**< Distance to the destination at which the destination is considered "reached" */ + struct vehicleprofile *vehicleprofile; /**< Routing preferences */ + int route_status; /**< Route Status */ + int link_path; /**< Link paths over multiple waypoints together */ + struct pcoord pc; + struct vehicle *v; +}; + +/** + * @brief A complete route graph + * + * This structure describes a whole routing graph + */ +struct route_graph { + int busy; /**< The graph is being built */ + struct map_selection *sel; /**< The rectangle selection for the graph */ + struct mapset_handle *h; /**< Handle to the mapset */ + struct map *m; /**< Pointer to the currently active map */ + struct map_rect *mr; /**< Pointer to the currently active map rectangle */ + struct vehicleprofile *vehicleprofile; /**< The vehicle profile */ + struct callback *idle_cb; /**< Idle callback to process the graph */ + struct callback *done_cb; /**< Callback when graph is done */ + struct event_idle *idle_ev; /**< The pointer to the idle event */ + struct route_graph_segment *route_segments; /**< Pointer to the first route_graph_segment in the linked list of all segments */ +#define HASH_SIZE 8192 + struct route_graph_point *hash[HASH_SIZE]; /**< A hashtable containing all route_graph_points in this graph */ +}; + +#define HASHCOORD(c) ((((c)->x +(c)->y) * 2654435761UL) & (HASH_SIZE-1)) + +/** + * @brief Iterator to iterate through all route graph segments in a route graph point + * + * This structure can be used to iterate through all route graph segments connected to a + * route graph point. Use this with the rp_iterator_* functions. + */ +struct route_graph_point_iterator { + struct route_graph_point *p; /**< The route graph point whose segments should be iterated */ + int end; /**< Indicates if we have finished iterating through the "start" segments */ + struct route_graph_segment *next; /**< The next segment to be returned */ +}; + +struct attr_iter { + union { + GList *list; + } u; +}; + +static struct route_info * route_find_nearest_street(struct vehicleprofile *vehicleprofile, struct mapset *ms, struct pcoord *c); +static struct route_graph_point *route_graph_get_point(struct route_graph *this, struct coord *c); +static void route_graph_update(struct route *this, struct callback *cb, int async); +static void route_graph_build_done(struct route_graph *rg, int cancel); +static struct route_path *route_path_new(struct route_graph *this, struct route_path *oldpath, struct route_info *pos, struct route_info *dst, struct vehicleprofile *profile); +static void route_process_street_graph(struct route_graph *this, struct item *item, struct vehicleprofile *profile); +static void route_graph_destroy(struct route_graph *this); +static void route_path_update(struct route *this, int cancel, int async); +static int route_time_seg(struct vehicleprofile *profile, struct route_segment_data *over, struct route_traffic_distortion *dist); +static void route_graph_flood(struct route_graph *this, struct route_info *dst, struct vehicleprofile *profile, struct callback *cb); +static void route_graph_reset(struct route_graph *this); + + +/** + * @brief Returns the projection used for this route + * + * @param route The route to return the projection for + * @return The projection used for this route + */ +static enum projection route_projection(struct route *route) +{ + struct street_data *street; + struct route_info *dst=route_get_dst(route); + if (!route->pos && !dst) + return projection_none; + street = route->pos ? route->pos->street : dst->street; + if (!street || !street->item.map) + return projection_none; + return map_projection(street->item.map); +} + +/** + * @brief Creates a new graph point iterator + * + * This function creates a new route graph point iterator, that can be used to + * iterate through all segments connected to the point. + * + * @param p The route graph point to create the iterator from + * @return A new iterator. + */ +static struct route_graph_point_iterator +rp_iterator_new(struct route_graph_point *p) +{ + struct route_graph_point_iterator it; + + it.p = p; + if (p->start) { + it.next = p->start; + it.end = 0; + } else { + it.next = p->end; + it.end = 1; + } + + return it; +} + +/** + * @brief Gets the next segment connected to a route graph point from an iterator + * + * @param it The route graph point iterator to get the segment from + * @return The next segment or NULL if there are no more segments + */ +static struct route_graph_segment +*rp_iterator_next(struct route_graph_point_iterator *it) +{ + struct route_graph_segment *ret; + + ret = it->next; + if (!ret) { + return NULL; + } + + if (!it->end) { + if (ret->start_next) { + it->next = ret->start_next; + } else { + it->next = it->p->end; + it->end = 1; + } + } else { + it->next = ret->end_next; + } + + return ret; +} + +/** + * @brief Checks if the last segment returned from a route_graph_point_iterator comes from the end + * + * @param it The route graph point iterator to be checked + * @return 1 if the last segment returned comes from the end of the route graph point, 0 otherwise + */ +static int +rp_iterator_end(struct route_graph_point_iterator *it) { + if (it->end && (it->next != it->p->end)) { + return 1; + } else { + return 0; + } +} + +/** + * @brief Destroys a route_path + * + * @param this The route_path to be destroyed + */ +static void +route_path_destroy(struct route_path *this, int recurse) +{ + struct route_path_segment *c,*n; + struct route_path *next; + while (this) { + next=this->next; + if (this->path_hash) { + item_hash_destroy(this->path_hash); + this->path_hash=NULL; + } + c=this->path; + while (c) { + n=c->next; + g_free(c); + c=n; + } + this->in_use--; + if (!this->in_use) + g_free(this); + if (!recurse) + break; + this=next; + } +} + +/** + * @brief Creates a completely new route structure + * + * @param attrs Not used + * @return The newly created route + */ +struct route * +route_new(struct attr *parent, struct attr **attrs) +{ + struct route *this=g_new0(struct route, 1); + struct attr dest_attr; + + if (attr_generic_get_attr(attrs, NULL, attr_destination_distance, &dest_attr, NULL)) { + this->destination_distance = dest_attr.u.num; + } else { + this->destination_distance = 50; // Default value + } + this->cbl2=callback_list_new(); + + return this; +} + +/** + * @brief Checks if a segment is part of a roundabout + * + * This function checks if a segment is part of a roundabout. + * + * @param seg The segment to be checked + * @param level How deep to scan the route graph + * @param direction Set this to 1 if we're entering the segment through its end, to 0 otherwise + * @param origin Used internally, set to NULL + * @return 1 If a roundabout was detected, 0 otherwise + */ +static int +route_check_roundabout(struct route_graph_segment *seg, int level, int direction, struct route_graph_segment *origin) +{ + struct route_graph_point_iterator it,it2; + struct route_graph_segment *cur; + int count=0; + + if (!level) { + return 0; + } + if (!direction && !(seg->data.flags & AF_ONEWAY)) { + return 0; + } + if (direction && !(seg->data.flags & AF_ONEWAYREV)) { + return 0; + } + if (seg->data.flags & AF_ROUNDABOUT_VALID) + return 0; + + if (!origin) { + origin = seg; + } + + if (!direction) { + it = rp_iterator_new(seg->end); + } else { + it = rp_iterator_new(seg->start); + } + it2=it; + + while ((cur = rp_iterator_next(&it2))) + count++; + + if (count > 3) + return 0; + cur = rp_iterator_next(&it); + while (cur) { + if (cur == seg) { + cur = rp_iterator_next(&it); + continue; + } + + if (cur->data.item.type != origin->data.item.type) { + // This street is of another type, can't be part of the roundabout + cur = rp_iterator_next(&it); + continue; + } + + if (cur == origin) { + seg->data.flags |= AF_ROUNDABOUT; + return 1; + } + + if (route_check_roundabout(cur, (level-1), rp_iterator_end(&it), origin)) { + seg->data.flags |= AF_ROUNDABOUT; + return 1; + } + + cur = rp_iterator_next(&it); + } + + return 0; +} + +/** + * @brief Sets the mapset of the route passwd + * + * @param this The route to set the mapset for + * @param ms The mapset to set for this route + */ +void +route_set_mapset(struct route *this, struct mapset *ms) +{ + this->ms=ms; +} + +/** + * @brief Sets the vehicle profile of a route + * + * @param this The route to set the profile for + * @param prof The vehicle profile + */ + +void +route_set_profile(struct route *this, struct vehicleprofile *prof) +{ + if (this->vehicleprofile != prof) { + this->vehicleprofile=prof; + route_path_update(this, 1, 1); + } +} + +/** + * @brief Returns the mapset of the route passed + * + * @param this The route to get the mapset of + * @return The mapset of the route passed + */ +struct mapset * +route_get_mapset(struct route *this) +{ + return this->ms; +} + +/** + * @brief Returns the current position within the route passed + * + * @param this The route to get the position for + * @return The position within the route passed + */ +struct route_info * +route_get_pos(struct route *this) +{ + return this->pos; +} + +/** + * @brief Returns the destination of the route passed + * + * @param this The route to get the destination for + * @return The destination of the route passed + */ +struct route_info * +route_get_dst(struct route *this) +{ + struct route_info *dst=NULL; + + if (this->destinations) + dst=g_list_last(this->destinations)->data; + return dst; +} + +/** + * @brief Checks if the path is calculated for the route passed + * + * @param this The route to check + * @return True if the path is calculated, false if not + */ +int +route_get_path_set(struct route *this) +{ + return this->path2 != NULL; +} + +/** + * @brief Checks if the route passed contains a certain item within the route path + * + * This function checks if a certain items exists in the path that navit will guide + * the user to his destination. It does *not* check if this item exists in the route + * graph! + * + * @param this The route to check for this item + * @param item The item to search for + * @return True if the item was found, false if the item was not found or the route was not calculated + */ +int +route_contains(struct route *this, struct item *item) +{ + if (! this->path2 || !this->path2->path_hash) + return 0; + if (item_hash_lookup(this->path2->path_hash, item)) + return 1; + if (! this->pos || !this->pos->street) + return 0; + return item_is_equal(this->pos->street->item, *item); + +} + +static struct route_info * +route_next_destination(struct route *this) +{ + if (!this->destinations) + return NULL; + return this->destinations->data; +} + +/** + * @brief Checks if a route has reached its destination + * + * @param this The route to be checked + * @return True if the destination is "reached", false otherwise. + */ +int +route_destination_reached(struct route *this) +{ + struct street_data *sd = NULL; + enum projection pro; + struct route_info *dst=route_next_destination(this); + + if (!this->pos) + return 0; + if (!dst) + return 0; + + sd = this->pos->street; + + if (!this->path2) { + return 0; + } + + if (!item_is_equal(this->pos->street->item, dst->street->item)) { + return 0; + } + + if ((sd->flags & AF_ONEWAY) && (this->pos->lenneg >= dst->lenneg)) { // We would have to drive against the one-way road + return 0; + } + if ((sd->flags & AF_ONEWAYREV) && (this->pos->lenpos >= dst->lenpos)) { + return 0; + } + pro=route_projection(this); + if (pro == projection_none) + return 0; + + if (transform_distance(pro, &this->pos->c, &dst->lp) > this->destination_distance) { + return 0; + } + + if (g_list_next(this->destinations)) + return 1; + else + return 2; +} + +static struct route_info * +route_previous_destination(struct route *this) +{ + GList *l=g_list_find(this->destinations, this->current_dst); + if (!l) + return this->pos; + l=g_list_previous(l); + if (!l) + return this->pos; + return l->data; +} + +static void +route_path_update_done(struct route *this, int new_graph) +{ + struct route_path *oldpath=this->path2; + struct attr route_status; + struct route_info *prev_dst; + route_status.type=attr_route_status; + if (this->path2 && (this->path2->in_use>1)) { + this->path2->update_required=1+new_graph; + return; + } + route_status.u.num=route_status_building_path; + route_set_attr(this, &route_status); + prev_dst=route_previous_destination(this); + if (this->link_path) { + this->path2=route_path_new(this->graph, NULL, prev_dst, this->current_dst, this->vehicleprofile); + if (this->path2) + this->path2->next=oldpath; + } else { + this->path2=route_path_new(this->graph, oldpath, prev_dst, this->current_dst, this->vehicleprofile); + if (oldpath && this->path2) { + this->path2->next=oldpath->next; + route_path_destroy(oldpath,0); + } + } + if (this->path2) { + struct route_path_segment *seg=this->path2->path; + int path_time=0,path_len=0; + while (seg) { + /* FIXME */ + int seg_time=route_time_seg(this->vehicleprofile, seg->data, NULL); + if (seg_time == INT_MAX) { + dbg(1,"error\n"); + } else + path_time+=seg_time; + path_len+=seg->data->len; + seg=seg->next; + } + this->path2->path_time=path_time; + this->path2->path_len=path_len; + if (prev_dst != this->pos) { + this->link_path=1; + this->current_dst=prev_dst; + route_graph_reset(this->graph); + route_graph_flood(this->graph, this->current_dst, this->vehicleprofile, this->route_graph_flood_done_cb); + return; + } + if (!new_graph && this->path2->updated) + route_status.u.num=route_status_path_done_incremental; + else + route_status.u.num=route_status_path_done_new; + } else + route_status.u.num=route_status_not_found; + this->link_path=0; + route_set_attr(this, &route_status); +} + +/** + * @brief Updates the route graph and the route path if something changed with the route + * + * This will update the route graph and the route path of the route if some of the + * route's settings (destination, position) have changed. + * + * @attention For this to work the route graph has to be destroyed if the route's + * @attention destination is changed somewhere! + * + * @param this The route to update + */ +static void +route_path_update(struct route *this, int cancel, int async) +{ + dbg(1,"enter %d\n", cancel); + if (! this->pos || ! this->destinations) { + dbg(1,"destroy\n"); + route_path_destroy(this->path2,1); + this->path2 = NULL; + return; + } + if (cancel) { + route_graph_destroy(this->graph); + this->graph=NULL; + } + /* the graph is destroyed when setting the destination */ + if (this->graph) { + if (this->graph->busy) { + dbg(1,"busy building graph\n"); + return; + } + // we can try to update + dbg(1,"try update\n"); + route_path_update_done(this, 0); + } else { + route_path_destroy(this->path2,1); + this->path2 = NULL; + } + if (!this->graph || !this->path2) { + dbg(1,"rebuild graph\n"); + if (! this->route_graph_flood_done_cb) + this->route_graph_flood_done_cb=callback_new_2(callback_cast(route_path_update_done), this, (long)1); + dbg(1,"route_graph_update\n"); + route_graph_update(this, this->route_graph_flood_done_cb, async); + } +} + +/** + * @brief This will calculate all the distances stored in a route_info + * + * @param ri The route_info to calculate the distances for + * @param pro The projection used for this route + */ +static void +route_info_distances(struct route_info *ri, enum projection pro) +{ + int npos=ri->pos+1; + struct street_data *sd=ri->street; + /* 0 1 2 X 3 4 5 6 pos=2 npos=3 count=7 0,1,2 3,4,5,6*/ + ri->lenextra=transform_distance(pro, &ri->lp, &ri->c); + ri->lenneg=transform_polyline_length(pro, sd->c, npos)+transform_distance(pro, &sd->c[ri->pos], &ri->lp); + ri->lenpos=transform_polyline_length(pro, sd->c+npos, sd->count-npos)+transform_distance(pro, &sd->c[npos], &ri->lp); + if (ri->lenneg || ri->lenpos) + ri->percent=(ri->lenneg*100)/(ri->lenneg+ri->lenpos); + else + ri->percent=50; +} + +/** + * @brief This sets the current position of the route passed + * + * This will set the current position of the route passed to the street that is nearest to the + * passed coordinates. It also automatically updates the route. + * + * @param this The route to set the position of + * @param pos Coordinates to set as position + */ +void +route_set_position(struct route *this, struct pcoord *pos) +{ + if (this->pos) + route_info_free(this->pos); + this->pos=NULL; + this->pos=route_find_nearest_street(this->vehicleprofile, this->ms, pos); + + // If there is no nearest street, bail out. + if (!this->pos) return; + + this->pos->street_direction=0; + dbg(1,"this->pos=%p\n", this->pos); + route_info_distances(this->pos, pos->pro); + route_path_update(this, 0, 1); +} + +/** + * @brief Sets a route's current position based on coordinates from tracking + * + * @param this The route to set the current position of + * @param tracking The tracking to get the coordinates from + */ +void +route_set_position_from_tracking(struct route *this, struct tracking *tracking, enum projection pro) +{ + struct coord *c; + struct route_info *ret; + struct street_data *sd; + + dbg(2,"enter\n"); + c=tracking_get_pos(tracking); + ret=g_new0(struct route_info, 1); + if (!ret) { + printf("%s:Out of memory\n", __FUNCTION__); + return; + } + if (this->pos) + route_info_free(this->pos); + this->pos=NULL; + ret->c=*c; + ret->lp=*c; + ret->pos=tracking_get_segment_pos(tracking); + ret->street_direction=tracking_get_street_direction(tracking); + sd=tracking_get_street_data(tracking); + if (sd) { + ret->street=street_data_dup(sd); + route_info_distances(ret, pro); + } + dbg(3,"position 0x%x,0x%x item 0x%x,0x%x direction %d pos %d lenpos %d lenneg %d\n",c->x,c->y,sd?sd->item.id_hi:0,sd?sd->item.id_lo:0,ret->street_direction,ret->pos,ret->lenpos,ret->lenneg); + dbg(3,"c->x=0x%x, c->y=0x%x pos=%d item=(0x%x,0x%x)\n", c->x, c->y, ret->pos, ret->street?ret->street->item.id_hi:0, ret->street?ret->street->item.id_lo:0); + dbg(3,"street 0=(0x%x,0x%x) %d=(0x%x,0x%x)\n", ret->street?ret->street->c[0].x:0, ret->street?ret->street->c[0].y:0, ret->street?ret->street->count-1:0, ret->street?ret->street->c[ret->street->count-1].x:0, ret->street?ret->street->c[ret->street->count-1].y:0); + this->pos=ret; + if (this->destinations) + route_path_update(this, 0, 1); + dbg(2,"ret\n"); +} + +/* Used for debuging of route_rect, what routing sees */ +struct map_selection *route_selection; + +/** + * @brief Returns a single map selection + */ +struct map_selection * +route_rect(int order, struct coord *c1, struct coord *c2, int rel, int abs) +{ + int dx,dy,sx=1,sy=1,d,m; + struct map_selection *sel=g_new(struct map_selection, 1); + if (!sel) { + printf("%s:Out of memory\n", __FUNCTION__); + return sel; + } + sel->order=order; + sel->range.min=route_item_first; + sel->range.max=route_item_last; + dbg(1,"%p %p\n", c1, c2); + dx=c1->x-c2->x; + dy=c1->y-c2->y; + if (dx < 0) { + sx=-1; + sel->u.c_rect.lu.x=c1->x; + sel->u.c_rect.rl.x=c2->x; + } else { + sel->u.c_rect.lu.x=c2->x; + sel->u.c_rect.rl.x=c1->x; + } + if (dy < 0) { + sy=-1; + sel->u.c_rect.lu.y=c2->y; + sel->u.c_rect.rl.y=c1->y; + } else { + sel->u.c_rect.lu.y=c1->y; + sel->u.c_rect.rl.y=c2->y; + } + if (dx*sx > dy*sy) + d=dx*sx; + else + d=dy*sy; + m=d*rel/100+abs; + sel->u.c_rect.lu.x-=m; + sel->u.c_rect.rl.x+=m; + sel->u.c_rect.lu.y+=m; + sel->u.c_rect.rl.y-=m; + sel->next=NULL; + return sel; +} + +/** + * @brief Returns a list of map selections useable to create a route graph + * + * Returns a list of map selections useable to get a map rect from which items can be + * retrieved to build a route graph. The selections are a rectangle with + * c1 and c2 as two corners. + * + * @param c1 Corner 1 of the rectangle + * @param c2 Corder 2 of the rectangle + */ +static struct map_selection * +route_calc_selection(struct coord *c, int count) +{ + struct map_selection *ret,*sel; + int i; + struct coord_rect r; + + if (!count) + return NULL; + r.lu=c[0]; + r.rl=c[0]; + for (i = 1 ; i < count ; i++) + coord_rect_extend(&r, &c[i]); + sel=route_rect(4, &r.lu, &r.rl, 25, 0); + ret=sel; + for (i = 0 ; i < count ; i++) { + sel->next=route_rect(8, &c[i], &c[i], 0, 40000); + sel=sel->next; + sel->next=route_rect(18, &c[i], &c[i], 0, 10000); + sel=sel->next; + } + /* route_selection=ret; */ + return ret; +} + +/** + * @brief Destroys a list of map selections + * + * @param sel Start of the list to be destroyed + */ +static void +route_free_selection(struct map_selection *sel) +{ + struct map_selection *next; + while (sel) { + next=sel->next; + g_free(sel); + sel=next; + } +} + + +static void +route_clear_destinations(struct route *this_) +{ + g_list_foreach(this_->destinations, (GFunc)route_info_free, NULL); + g_list_free(this_->destinations); + this_->destinations=NULL; +} + +/** + * @brief Sets the destination of a route + * + * This sets the destination of a route to the street nearest to the coordinates passed + * and updates the route. + * + * @param this The route to set the destination for + * @param dst Coordinates to set as destination + * @param count: Number of destinations (last one is final) + * @param async: If set, do routing asynchronously + */ + +void +route_set_destinations(struct route *this, struct pcoord *dst, int count, int async) +{ + struct attr route_status; + struct route_info *dsti; + int i; + route_status.type=attr_route_status; + + profile(0,NULL); + route_clear_destinations(this); + if (dst && count) { + for (i = 0 ; i < count ; i++) { + dsti=route_find_nearest_street(this->vehicleprofile, this->ms, &dst[i]); + if(dsti) { + route_info_distances(dsti, dst->pro); + this->destinations=g_list_append(this->destinations, dsti); + } + } + route_status.u.num=route_status_destination_set; + } else + route_status.u.num=route_status_no_destination; + callback_list_call_attr_1(this->cbl2, attr_destination, this); + route_set_attr(this, &route_status); + profile(1,"find_nearest_street"); + + /* The graph has to be destroyed and set to NULL, otherwise route_path_update() doesn't work */ + route_graph_destroy(this->graph); + this->graph=NULL; + this->current_dst=route_get_dst(this); + route_path_update(this, 1, async); + profile(0,"end"); +} + +int +route_get_destinations(struct route *this, struct pcoord *pc, int count) +{ + int ret=0; + GList *l=this->destinations; + while (l && ret < count) { + struct route_info *dst=l->data; + pc->x=dst->c.x; + pc->y=dst->c.y; + pc->pro=projection_mg; /* FIXME */ + pc++; + ret++; + l=g_list_next(l); + } + return ret; +} + +void +route_set_destination(struct route *this, struct pcoord *dst, int async) +{ + route_set_destinations(this, dst, dst?1:0, async); +} + +void +route_remove_waypoint(struct route *this) +{ + struct route_path *path=this->path2; + this->destinations=g_list_remove(this->destinations,this->destinations->data); + this->path2=this->path2->next; + route_path_destroy(path,0); + if (!this->destinations) + return; + route_graph_reset(this->graph); + this->current_dst=this->destinations->data; + route_graph_flood(this->graph, this->current_dst, this->vehicleprofile, this->route_graph_flood_done_cb); + +} + +/** + * @brief Gets the route_graph_point with the specified coordinates + * + * @param this The route in which to search + * @param c Coordinates to search for + * @param last The last route graph point returned to iterate over multiple points with the same coordinates + * @return The point at the specified coordinates or NULL if not found + */ +static struct route_graph_point * +route_graph_get_point_next(struct route_graph *this, struct coord *c, struct route_graph_point *last) +{ + struct route_graph_point *p; + int seen=0,hashval=HASHCOORD(c); + p=this->hash[hashval]; + while (p) { + if (p->c.x == c->x && p->c.y == c->y) { + if (!last || seen) + return p; + if (p == last) + seen=1; + } + p=p->hash_next; + } + return NULL; +} + +static struct route_graph_point * +route_graph_get_point(struct route_graph *this, struct coord *c) +{ + return route_graph_get_point_next(this, c, NULL); +} + +/** + * @brief Gets the last route_graph_point with the specified coordinates + * + * @param this The route in which to search + * @param c Coordinates to search for + * @return The point at the specified coordinates or NULL if not found + */ +static struct route_graph_point * +route_graph_get_point_last(struct route_graph *this, struct coord *c) +{ + struct route_graph_point *p,*ret=NULL; + int hashval=HASHCOORD(c); + p=this->hash[hashval]; + while (p) { + if (p->c.x == c->x && p->c.y == c->y) + ret=p; + p=p->hash_next; + } + return ret; +} + + + +/** + * @brief Create a new point for the route graph with the specified coordinates + * + * @param this The route to insert the point into + * @param f The coordinates at which the point should be created + * @return The point created + */ + +static struct route_graph_point * +route_graph_point_new(struct route_graph *this, struct coord *f) +{ + int hashval; + struct route_graph_point *p; + + hashval=HASHCOORD(f); + if (debug_route) + printf("p (0x%x,0x%x)\n", f->x, f->y); + p=g_slice_new0(struct route_graph_point); + p->hash_next=this->hash[hashval]; + this->hash[hashval]=p; + p->value=INT_MAX; + p->c=*f; + return p; +} + +/** + * @brief Inserts a point into the route graph at the specified coordinates + * + * This will insert a point into the route graph at the coordinates passed in f. + * Note that the point is not yet linked to any segments. + * + * @param this The route to insert the point into + * @param f The coordinates at which the point should be inserted + * @return The point inserted or NULL on failure + */ +static struct route_graph_point * +route_graph_add_point(struct route_graph *this, struct coord *f) +{ + struct route_graph_point *p; + + p=route_graph_get_point(this,f); + if (!p) + p=route_graph_point_new(this,f); + return p; +} + +/** + * @brief Frees all the memory used for points in the route graph passed + * + * @param this The route graph to delete all points from + */ +static void +route_graph_free_points(struct route_graph *this) +{ + struct route_graph_point *curr,*next; + int i; + for (i = 0 ; i < HASH_SIZE ; i++) { + curr=this->hash[i]; + while (curr) { + next=curr->hash_next; + g_slice_free(struct route_graph_point, curr); + curr=next; + } + this->hash[i]=NULL; + } +} + +/** + * @brief Resets all nodes + * + * @param this The route graph to reset + */ +static void +route_graph_reset(struct route_graph *this) +{ + struct route_graph_point *curr; + int i; + for (i = 0 ; i < HASH_SIZE ; i++) { + curr=this->hash[i]; + while (curr) { + curr->value=INT_MAX; + curr->seg=NULL; + curr->el=NULL; + curr=curr->hash_next; + } + } +} + +/** + * @brief Returns the position of a certain field appended to a route graph segment + * + * This function returns a pointer to a field that is appended to a route graph + * segment. + * + * @param seg The route graph segment the field is appended to + * @param type Type of the field that should be returned + * @return A pointer to a field of a certain type, or NULL if no such field is present + */ +static void * +route_segment_data_field_pos(struct route_segment_data *seg, enum attr_type type) +{ + unsigned char *ptr; + + ptr = ((unsigned char*)seg) + sizeof(struct route_segment_data); + + if (seg->flags & AF_SPEED_LIMIT) { + if (type == attr_maxspeed) + return (void*)ptr; + ptr += sizeof(int); + } + if (seg->flags & AF_SEGMENTED) { + if (type == attr_offset) + return (void*)ptr; + ptr += sizeof(int); + } + if (seg->flags & AF_SIZE_OR_WEIGHT_LIMIT) { + if (type == attr_vehicle_width) + return (void*)ptr; + ptr += sizeof(struct size_weight_limit); + } + if (seg->flags & AF_DANGEROUS_GOODS) { + if (type == attr_vehicle_dangerous_goods) + return (void*)ptr; + ptr += sizeof(int); + } + return NULL; +} + +/** + * @brief Calculates the size of a route_segment_data struct with given flags + * + * @param flags The flags of the route_segment_data + */ + +static int +route_segment_data_size(int flags) +{ + int ret=sizeof(struct route_segment_data); + if (flags & AF_SPEED_LIMIT) + ret+=sizeof(int); + if (flags & AF_SEGMENTED) + ret+=sizeof(int); + if (flags & AF_SIZE_OR_WEIGHT_LIMIT) + ret+=sizeof(struct size_weight_limit); + if (flags & AF_DANGEROUS_GOODS) + ret+=sizeof(int); + return ret; +} + + +static int +route_graph_segment_is_duplicate(struct route_graph_point *start, struct route_graph_segment_data *data) +{ + struct route_graph_segment *s; + s=start->start; + while (s) { + if (item_is_equal(*data->item, s->data.item)) { + if (data->flags & AF_SEGMENTED) { + if (RSD_OFFSET(&s->data) == data->offset) { + return 1; + } + } else + return 1; + } + s=s->start_next; + } + return 0; +} + +/** + * @brief Inserts a new segment into the route graph + * + * This function performs a check if a segment for the item specified already exists, and inserts + * a new segment representing this item if it does not. + * + * @param this The route graph to insert the segment into + * @param start The graph point which should be connected to the start of this segment + * @param end The graph point which should be connected to the end of this segment + * @param len The length of this segment + * @param item The item that is represented by this segment + * @param flags Flags for this segment + * @param offset If the item passed in "item" is segmented (i.e. divided into several segments), this indicates the position of this segment within the item + * @param maxspeed The maximum speed allowed on this segment in km/h. -1 if not known. + */ +static void +route_graph_add_segment(struct route_graph *this, struct route_graph_point *start, + struct route_graph_point *end, struct route_graph_segment_data *data) +{ + struct route_graph_segment *s; + int size; + + size = sizeof(struct route_graph_segment)-sizeof(struct route_segment_data)+route_segment_data_size(data->flags); + s = g_slice_alloc0(size); + if (!s) { + printf("%s:Out of memory\n", __FUNCTION__); + return; + } + s->start=start; + s->start_next=start->start; + start->start=s; + s->end=end; + s->end_next=end->end; + end->end=s; + dbg_assert(data->len >= 0); + s->data.len=data->len; + s->data.item=*data->item; + s->data.flags=data->flags; + + if (data->flags & AF_SPEED_LIMIT) + RSD_MAXSPEED(&s->data)=data->maxspeed; + if (data->flags & AF_SEGMENTED) + RSD_OFFSET(&s->data)=data->offset; + if (data->flags & AF_SIZE_OR_WEIGHT_LIMIT) + RSD_SIZE_WEIGHT(&s->data)=data->size_weight; + if (data->flags & AF_DANGEROUS_GOODS) + RSD_DANGEROUS_GOODS(&s->data)=data->dangerous_goods; + + s->next=this->route_segments; + this->route_segments=s; + if (debug_route) + printf("l (0x%x,0x%x)-(0x%x,0x%x)\n", start->c.x, start->c.y, end->c.x, end->c.y); +} + +/** + * @brief Gets all the coordinates of an item + * + * This will get all the coordinates of the item i and return them in c, + * up to max coordinates. Additionally it is possible to limit the coordinates + * returned to all the coordinates of the item between the two coordinates + * start end end. + * + * @important Make sure that whatever c points to has enough memory allocated + * @important to hold max coordinates! + * + * @param i The item to get the coordinates of + * @param c Pointer to memory allocated for holding the coordinates + * @param max Maximum number of coordinates to return + * @param start First coordinate to get + * @param end Last coordinate to get + * @return The number of coordinates returned + */ +static int get_item_seg_coords(struct item *i, struct coord *c, int max, + struct coord *start, struct coord *end) +{ + struct map_rect *mr; + struct item *item; + int rc = 0, p = 0; + struct coord c1; + mr=map_rect_new(i->map, NULL); + if (!mr) + return 0; + item = map_rect_get_item_byid(mr, i->id_hi, i->id_lo); + if (item) { + rc = item_coord_get(item, &c1, 1); + while (rc && (c1.x != start->x || c1.y != start->y)) { + rc = item_coord_get(item, &c1, 1); + } + while (rc && p < max) { + c[p++] = c1; + if (c1.x == end->x && c1.y == end->y) + break; + rc = item_coord_get(item, &c1, 1); + } + } + map_rect_destroy(mr); + return p; +} + +/** + * @brief Returns and removes one segment from a path + * + * @param path The path to take the segment from + * @param item The item whose segment to remove + * @param offset Offset of the segment within the item to remove. If the item is not segmented this should be 1. + * @return The segment removed + */ +static struct route_path_segment * +route_extract_segment_from_path(struct route_path *path, struct item *item, + int offset) +{ + int soffset; + struct route_path_segment *sp = NULL, *s; + s = path->path; + while (s) { + if (item_is_equal(s->data->item,*item)) { + if (s->data->flags & AF_SEGMENTED) + soffset=RSD_OFFSET(s->data); + else + soffset=1; + if (soffset == offset) { + if (sp) { + sp->next = s->next; + break; + } else { + path->path = s->next; + break; + } + } + } + sp = s; + s = s->next; + } + if (s) + item_hash_remove(path->path_hash, item); + return s; +} + +/** + * @brief Adds a segment and the end of a path + * + * @param this The path to add the segment to + * @param segment The segment to add + */ +static void +route_path_add_segment(struct route_path *this, struct route_path_segment *segment) +{ + if (!this->path) + this->path=segment; + if (this->path_last) + this->path_last->next=segment; + this->path_last=segment; +} + +/** + * @brief Adds a two coordinate line to a path + * + * This adds a new line to a path, creating a new segment for it. + * + * @param this The path to add the item to + * @param start coordinate to add to the start of the item. If none should be added, make this NULL. + * @param end coordinate to add to the end of the item. If none should be added, make this NULL. + * @param len The length of the item + */ +static void +route_path_add_line(struct route_path *this, struct coord *start, struct coord *end, int len) +{ + int ccnt=2; + struct route_path_segment *segment; + int seg_size,seg_dat_size; + + dbg(1,"line from 0x%x,0x%x-0x%x,0x%x\n", start->x, start->y, end->x, end->y); + seg_size=sizeof(*segment) + sizeof(struct coord) * ccnt; + seg_dat_size=sizeof(struct route_segment_data); + segment=g_malloc0(seg_size + seg_dat_size); + segment->data=(struct route_segment_data *)((char *)segment+seg_size); + segment->ncoords=ccnt; + segment->direction=0; + segment->c[0]=*start; + segment->c[1]=*end; + segment->data->len=len; + route_path_add_segment(this, segment); +} + +/** + * @brief Inserts a new item into the path + * + * This function does almost the same as "route_path_add_item()", but identifies + * the item to add by a segment from the route graph. Another difference is that it "copies" the + * segment from the route graph, i.e. if the item is segmented, only the segment passed in rgs will + * be added to the route path, not all segments of the item. + * + * The function can be sped up by passing an old path already containing this segment in oldpath - + * the segment will then be extracted from this old path. Please note that in this case the direction + * parameter has no effect. + * + * @param this The path to add the item to + * @param oldpath Old path containing the segment to be added. Speeds up the function, but can be NULL. + * @param rgs Segment of the route graph that should be "copied" to the route path + * @param dir Order in which to add the coordinates. See route_path_add_item() + * @param pos Information about start point if this is the first segment + * @param dst Information about end point if this is the last segment + */ + +static int +route_path_add_item_from_graph(struct route_path *this, struct route_path *oldpath, struct route_graph_segment *rgs, int dir, struct route_info *pos, struct route_info *dst) +{ + struct route_path_segment *segment; + int i, ccnt, extra=0, ret=0; + struct coord *c,*cd,ca[2048]; + int offset=1; + int seg_size,seg_dat_size; + int len=rgs->data.len; + if (rgs->data.flags & AF_SEGMENTED) + offset=RSD_OFFSET(&rgs->data); + + dbg(1,"enter (0x%x,0x%x) dir=%d pos=%p dst=%p\n", rgs->data.item.id_hi, rgs->data.item.id_lo, dir, pos, dst); + if (oldpath) { + segment=item_hash_lookup(oldpath->path_hash, &rgs->data.item); + if (segment && segment->direction == dir) { + segment = route_extract_segment_from_path(oldpath, &rgs->data.item, offset); + if (segment) { + ret=1; + if (!pos) + goto linkold; + } + } + } + + if (pos) { + if (dst) { + extra=2; + if (dst->lenneg >= pos->lenneg) { + dir=1; + ccnt=dst->pos-pos->pos; + c=pos->street->c+pos->pos+1; + len=dst->lenneg-pos->lenneg; + } else { + dir=-1; + ccnt=pos->pos-dst->pos; + c=pos->street->c+dst->pos+1; + len=pos->lenneg-dst->lenneg; + } + } else { + extra=1; + dbg(1,"pos dir=%d\n", dir); + dbg(1,"pos pos=%d\n", pos->pos); + dbg(1,"pos count=%d\n", pos->street->count); + if (dir > 0) { + c=pos->street->c+pos->pos+1; + ccnt=pos->street->count-pos->pos-1; + len=pos->lenpos; + } else { + c=pos->street->c; + ccnt=pos->pos+1; + len=pos->lenneg; + } + } + pos->dir=dir; + } else if (dst) { + extra=1; + dbg(1,"dst dir=%d\n", dir); + dbg(1,"dst pos=%d\n", dst->pos); + if (dir > 0) { + c=dst->street->c; + ccnt=dst->pos+1; + len=dst->lenpos; + } else { + c=dst->street->c+dst->pos+1; + ccnt=dst->street->count-dst->pos-1; + len=dst->lenneg; + } + } else { + ccnt=get_item_seg_coords(&rgs->data.item, ca, 2047, &rgs->start->c, &rgs->end->c); + c=ca; + } + seg_size=sizeof(*segment) + sizeof(struct coord) * (ccnt + extra); + seg_dat_size=route_segment_data_size(rgs->data.flags); + segment=g_malloc0(seg_size + seg_dat_size); + segment->data=(struct route_segment_data *)((char *)segment+seg_size); + segment->direction=dir; + cd=segment->c; + if (pos && (c[0].x != pos->lp.x || c[0].y != pos->lp.y)) + *cd++=pos->lp; + if (dir < 0) + c+=ccnt-1; + for (i = 0 ; i < ccnt ; i++) { + *cd++=*c; + c+=dir; + } + segment->ncoords+=ccnt; + if (dst && (cd[-1].x != dst->lp.x || cd[-1].y != dst->lp.y)) + *cd++=dst->lp; + segment->ncoords=cd-segment->c; + if (segment->ncoords <= 1) { + g_free(segment); + return 1; + } + + /* We check if the route graph segment is part of a roundabout here, because this + * only matters for route graph segments which form parts of the route path */ + if (!(rgs->data.flags & AF_ROUNDABOUT)) { // We identified this roundabout earlier + route_check_roundabout(rgs, 13, (dir < 1), NULL); + } + + memcpy(segment->data, &rgs->data, seg_dat_size); +linkold: + segment->data->len=len; + segment->next=NULL; + item_hash_insert(this->path_hash, &rgs->data.item, segment); + + route_path_add_segment(this, segment); + + return ret; +} + +/** + * @brief Destroys all segments of a route graph + * + * @param this The graph to destroy all segments from + */ +static void +route_graph_free_segments(struct route_graph *this) +{ + struct route_graph_segment *curr,*next; + int size; + curr=this->route_segments; + while (curr) { + next=curr->next; + size = sizeof(struct route_graph_segment)-sizeof(struct route_segment_data)+route_segment_data_size(curr->data.flags); + g_slice_free1(size, curr); + curr=next; + } + this->route_segments=NULL; +} + +/** + * @brief Destroys a route graph + * + * @param this The route graph to be destroyed + */ +static void +route_graph_destroy(struct route_graph *this) +{ + if (this) { + route_graph_build_done(this, 1); + route_graph_free_points(this); + route_graph_free_segments(this); + g_free(this); + } +} + +/** + * @brief Returns the estimated speed on a segment + * + * This function returns the estimated speed to be driven on a segment, 0=not passable + * + * @param profile The routing preferences + * @param over The segment which is passed + * @param dist A traffic distortion if applicable + * @return The estimated speed + */ +static int +route_seg_speed(struct vehicleprofile *profile, struct route_segment_data *over, struct route_traffic_distortion *dist) +{ + struct roadprofile *roadprofile=vehicleprofile_get_roadprofile(profile, over->item.type); + int speed,maxspeed; + if (!roadprofile || !roadprofile->route_weight) + return 0; + /* maxspeed_handling: 0=always, 1 only if maxspeed restricts the speed, 2 never */ + speed=roadprofile->route_weight; + if (profile->maxspeed_handling != 2) { + if (over->flags & AF_SPEED_LIMIT) { + maxspeed=RSD_MAXSPEED(over); + if (!profile->maxspeed_handling) + speed=maxspeed; + } else + maxspeed=INT_MAX; + if (dist && maxspeed > dist->maxspeed) + maxspeed=dist->maxspeed; + if (maxspeed != INT_MAX && (profile->maxspeed_handling != 1 || maxspeed < speed)) + speed=maxspeed; + } + if (over->flags & AF_DANGEROUS_GOODS) { + if (profile->dangerous_goods & RSD_DANGEROUS_GOODS(over)) + return 0; + } + if (over->flags & AF_SIZE_OR_WEIGHT_LIMIT) { + struct size_weight_limit *size_weight=&RSD_SIZE_WEIGHT(over); + if (size_weight->width != -1 && profile->width != -1 && profile->width > size_weight->width) + return 0; + if (size_weight->height != -1 && profile->height != -1 && profile->height > size_weight->height) + return 0; + if (size_weight->length != -1 && profile->length != -1 && profile->length > size_weight->length) + return 0; + if (size_weight->weight != -1 && profile->weight != -1 && profile->weight > size_weight->weight) + return 0; + if (size_weight->axle_weight != -1 && profile->axle_weight != -1 && profile->axle_weight > size_weight->axle_weight) + return 0; + } + return speed; +} + +/** + * @brief Returns the time needed to drive len on item + * + * This function returns the time needed to drive len meters on + * the item passed in item in tenth of seconds. + * + * @param profile The routing preferences + * @param over The segment which is passed + * @param dist A traffic distortion if applicable + * @return The time needed to drive len on item in thenth of senconds + */ + +static int +route_time_seg(struct vehicleprofile *profile, struct route_segment_data *over, struct route_traffic_distortion *dist) +{ + int speed=route_seg_speed(profile, over, dist); + if (!speed) + return INT_MAX; + return over->len*36/speed+(dist ? dist->delay : 0); +} + +static int +route_get_traffic_distortion(struct route_graph_segment *seg, struct route_traffic_distortion *ret) +{ + struct route_graph_point *start=seg->start; + struct route_graph_point *end=seg->end; + struct route_graph_segment *tmp,*found=NULL; + tmp=start->start; + while (tmp && !found) { + if (tmp->data.item.type == type_traffic_distortion && tmp->start == start && tmp->end == end) + found=tmp; + tmp=tmp->start_next; + } + tmp=start->end; + while (tmp && !found) { + if (tmp->data.item.type == type_traffic_distortion && tmp->end == start && tmp->start == end) + found=tmp; + tmp=tmp->end_next; + } + if (found) { + ret->delay=found->data.len; + if (found->data.flags & AF_SPEED_LIMIT) + ret->maxspeed=RSD_MAXSPEED(&found->data); + else + ret->maxspeed=INT_MAX; + return 1; + } + return 0; +} + +static int +route_through_traffic_allowed(struct vehicleprofile *profile, struct route_graph_segment *seg) +{ + return (seg->data.flags & AF_THROUGH_TRAFFIC_LIMIT) == 0; +} + +/** + * @brief Returns the "costs" of driving from point from over segment over in direction dir + * + * @param profile The routing preferences + * @param from The point where we are starting + * @param over The segment we are using + * @param dir The direction of segment which we are driving + * @return The "costs" needed to drive len on item + */ + +static int +route_value_seg(struct vehicleprofile *profile, struct route_graph_point *from, struct route_graph_segment *over, int dir) +{ + int ret; + struct route_traffic_distortion dist,*distp=NULL; +#if 0 + dbg(0,"flags 0x%x mask 0x%x flags 0x%x\n", over->flags, dir >= 0 ? profile->flags_forward_mask : profile->flags_reverse_mask, profile->flags); +#endif + if ((over->data.flags & (dir >= 0 ? profile->flags_forward_mask : profile->flags_reverse_mask)) != profile->flags) + return INT_MAX; + if (dir > 0 && (over->start->flags & RP_TURN_RESTRICTION)) + return INT_MAX; + if (dir < 0 && (over->end->flags & RP_TURN_RESTRICTION)) + return INT_MAX; + if (from && from->seg == over) + return INT_MAX; + if ((over->start->flags & RP_TRAFFIC_DISTORTION) && (over->end->flags & RP_TRAFFIC_DISTORTION) && + route_get_traffic_distortion(over, &dist)) { + distp=&dist; + } + ret=route_time_seg(profile, &over->data, distp); + if (ret == INT_MAX) + return ret; + if (!route_through_traffic_allowed(profile, over) && from && route_through_traffic_allowed(profile, from->seg)) + ret+=profile->through_traffic_penalty; + return ret; +} + +/** + * @brief Adds a route distortion item to the route graph + * + * @param this The route graph to add to + * @param item The item to add + */ +static void +route_process_traffic_distortion(struct route_graph *this, struct item *item) +{ + struct route_graph_point *s_pnt,*e_pnt; + struct coord c,l; + struct attr delay_attr, maxspeed_attr; + struct route_graph_segment_data data; + + data.item=item; + data.len=0; + data.flags=0; + data.offset=1; + data.maxspeed = INT_MAX; + + if (item_coord_get(item, &l, 1)) { + s_pnt=route_graph_add_point(this,&l); + while (item_coord_get(item, &c, 1)) { + l=c; + } + e_pnt=route_graph_add_point(this,&l); + s_pnt->flags |= RP_TRAFFIC_DISTORTION; + e_pnt->flags |= RP_TRAFFIC_DISTORTION; + if (item_attr_get(item, attr_maxspeed, &maxspeed_attr)) { + data.flags |= AF_SPEED_LIMIT; + data.maxspeed=maxspeed_attr.u.num; + } + if (item_attr_get(item, attr_delay, &delay_attr)) + data.len=delay_attr.u.num; + route_graph_add_segment(this, s_pnt, e_pnt, &data); + } +} + +/** + * @brief Adds a route distortion item to the route graph + * + * @param this The route graph to add to + * @param item The item to add + */ +static void +route_process_turn_restriction(struct route_graph *this, struct item *item) +{ + struct route_graph_point *pnt[4]; + struct coord c[5]; + int i,count; + struct route_graph_segment_data data; + + count=item_coord_get(item, c, 5); + if (count != 3 && count != 4) { + dbg(0,"wrong count %d\n",count); + return; + } + if (count == 4) + return; + for (i = 0 ; i < count ; i++) + pnt[i]=route_graph_add_point(this,&c[i]); + dbg(1,"%s: (0x%x,0x%x)-(0x%x,0x%x)-(0x%x,0x%x) %p-%p-%p\n",item_to_name(item->type),c[0].x,c[0].y,c[1].x,c[1].y,c[2].x,c[2].y,pnt[0],pnt[1],pnt[2]); + data.item=item; + data.flags=0; + data.len=0; + route_graph_add_segment(this, pnt[0], pnt[1], &data); + route_graph_add_segment(this, pnt[1], pnt[2], &data); +#if 1 + if (count == 4) { + pnt[1]->flags |= RP_TURN_RESTRICTION; + pnt[2]->flags |= RP_TURN_RESTRICTION; + route_graph_add_segment(this, pnt[2], pnt[3], &data); + } else + pnt[1]->flags |= RP_TURN_RESTRICTION; +#endif +} + +/** + * @brief Adds an item to the route graph + * + * This adds an item (e.g. a street) to the route graph, creating as many segments as needed for a + * segmented item. + * + * @param this The route graph to add to + * @param item The item to add + * @param profile The vehicle profile currently in use + */ +static void +route_process_street_graph(struct route_graph *this, struct item *item, struct vehicleprofile *profile) +{ +#ifdef AVOID_FLOAT + int len=0; +#else + double len=0; +#endif + int segmented = 0; + struct roadprofile *roadp; + struct route_graph_point *s_pnt,*e_pnt; + struct coord c,l; + struct attr attr; + struct route_graph_segment_data data; + data.flags=0; + data.offset=1; + data.maxspeed=-1; + data.item=item; + + roadp = vehicleprofile_get_roadprofile(profile, item->type); + if (!roadp) { + // Don't include any roads that don't have a road profile in our vehicle profile + return; + } + + if (item_coord_get(item, &l, 1)) { + int *default_flags=item_get_default_flags(item->type); + if (! default_flags) + return; + if (item_attr_get(item, attr_flags, &attr)) { + data.flags = attr.u.num; + if (data.flags & AF_SEGMENTED) + segmented = 1; + } else + data.flags = *default_flags; + + + if (data.flags & AF_SPEED_LIMIT) { + if (item_attr_get(item, attr_maxspeed, &attr)) + data.maxspeed = attr.u.num; + } + if (data.flags & AF_DANGEROUS_GOODS) { + if (item_attr_get(item, attr_vehicle_dangerous_goods, &attr)) + data.dangerous_goods = attr.u.num; + else + data.flags &= ~AF_DANGEROUS_GOODS; + } + if (data.flags & AF_SIZE_OR_WEIGHT_LIMIT) { + if (item_attr_get(item, attr_vehicle_width, &attr)) + data.size_weight.width=attr.u.num; + else + data.size_weight.width=-1; + if (item_attr_get(item, attr_vehicle_height, &attr)) + data.size_weight.height=attr.u.num; + else + data.size_weight.height=-1; + if (item_attr_get(item, attr_vehicle_length, &attr)) + data.size_weight.length=attr.u.num; + else + data.size_weight.length=-1; + if (item_attr_get(item, attr_vehicle_weight, &attr)) + data.size_weight.weight=attr.u.num; + else + data.size_weight.weight=-1; + if (item_attr_get(item, attr_vehicle_axle_weight, &attr)) + data.size_weight.axle_weight=attr.u.num; + else + data.size_weight.axle_weight=-1; + } + + s_pnt=route_graph_add_point(this,&l); + if (!segmented) { + while (item_coord_get(item, &c, 1)) { + len+=transform_distance(map_projection(item->map), &l, &c); + l=c; + } + e_pnt=route_graph_add_point(this,&l); + dbg_assert(len >= 0); + data.len=len; + if (!route_graph_segment_is_duplicate(s_pnt, &data)) + route_graph_add_segment(this, s_pnt, e_pnt, &data); + } else { + int isseg,rc; + int sc = 0; + do { + isseg = item_coord_is_node(item); + rc = item_coord_get(item, &c, 1); + if (rc) { + len+=transform_distance(map_projection(item->map), &l, &c); + l=c; + if (isseg) { + e_pnt=route_graph_add_point(this,&l); + data.len=len; + if (!route_graph_segment_is_duplicate(s_pnt, &data)) + route_graph_add_segment(this, s_pnt, e_pnt, &data); + data.offset++; + s_pnt=route_graph_add_point(this,&l); + len = 0; + } + } + } while(rc); + e_pnt=route_graph_add_point(this,&l); + dbg_assert(len >= 0); + sc++; + data.len=len; + if (!route_graph_segment_is_duplicate(s_pnt, &data)) + route_graph_add_segment(this, s_pnt, e_pnt, &data); + } + } +} + +static struct route_graph_segment * +route_graph_get_segment(struct route_graph *graph, struct street_data *sd, struct route_graph_segment *last) +{ + struct route_graph_point *start=NULL; + struct route_graph_segment *s; + int seen=0; + + while ((start=route_graph_get_point_next(graph, &sd->c[0], start))) { + s=start->start; + while (s) { + if (item_is_equal(sd->item, s->data.item)) { + if (!last || seen) + return s; + if (last == s) + seen=1; + } + s=s->start_next; + } + } + return NULL; +} + +/** + * @brief Calculates the routing costs for each point + * + * This function is the heart of routing. It assigns each point in the route graph a + * cost at which one can reach the destination from this point on. Additionally it assigns + * each point a segment one should follow from this point on to reach the destination at the + * stated costs. + * + * This function uses Dijkstra's algorithm to do the routing. To understand it you should have a look + * at this algorithm. + */ +static void +route_graph_flood(struct route_graph *this, struct route_info *dst, struct vehicleprofile *profile, struct callback *cb) +{ + struct route_graph_point *p_min; + struct route_graph_segment *s=NULL; + int min,new,val; + struct fibheap *heap; /* This heap will hold all points with "temporarily" calculated costs */ + + heap = fh_makekeyheap(); + + while ((s=route_graph_get_segment(this, dst->street, s))) { + val=route_value_seg(profile, NULL, s, -1); + if (val != INT_MAX) { + val=val*(100-dst->percent)/100; + s->end->seg=s; + s->end->value=val; + s->end->el=fh_insertkey(heap, s->end->value, s->end); + } + val=route_value_seg(profile, NULL, s, 1); + if (val != INT_MAX) { + val=val*dst->percent/100; + s->start->seg=s; + s->start->value=val; + s->start->el=fh_insertkey(heap, s->start->value, s->start); + } + } + for (;;) { + p_min=fh_extractmin(heap); /* Starting Dijkstra by selecting the point with the minimum costs on the heap */ + if (! p_min) /* There are no more points with temporarily calculated costs, Dijkstra has finished */ + break; + min=p_min->value; + if (debug_route) + printf("extract p=%p free el=%p min=%d, 0x%x, 0x%x\n", p_min, p_min->el, min, p_min->c.x, p_min->c.y); + p_min->el=NULL; /* This point is permanently calculated now, we've taken it out of the heap */ + s=p_min->start; + while (s) { /* Iterating all the segments leading away from our point to update the points at their ends */ + val=route_value_seg(profile, p_min, s, -1); + if (val != INT_MAX && !item_is_equal(s->data.item,p_min->seg->data.item)) { + new=min+val; + if (debug_route) + printf("begin %d len %d vs %d (0x%x,0x%x)\n",new,val,s->end->value, s->end->c.x, s->end->c.y); + if (new < s->end->value) { /* We've found a less costly way to reach the end of s, update it */ + s->end->value=new; + s->end->seg=s; + if (! s->end->el) { + if (debug_route) + printf("insert_end p=%p el=%p val=%d ", s->end, s->end->el, s->end->value); + s->end->el=fh_insertkey(heap, new, s->end); + if (debug_route) + printf("el new=%p\n", s->end->el); + } + else { + if (debug_route) + printf("replace_end p=%p el=%p val=%d\n", s->end, s->end->el, s->end->value); + fh_replacekey(heap, s->end->el, new); + } + } + if (debug_route) + printf("\n"); + } + s=s->start_next; + } + s=p_min->end; + while (s) { /* Doing the same as above with the segments leading towards our point */ + val=route_value_seg(profile, p_min, s, 1); + if (val != INT_MAX && !item_is_equal(s->data.item,p_min->seg->data.item)) { + new=min+val; + if (debug_route) + printf("end %d len %d vs %d (0x%x,0x%x)\n",new,val,s->start->value,s->start->c.x, s->start->c.y); + if (new < s->start->value) { + s->start->value=new; + s->start->seg=s; + if (! s->start->el) { + if (debug_route) + printf("insert_start p=%p el=%p val=%d ", s->start, s->start->el, s->start->value); + s->start->el=fh_insertkey(heap, new, s->start); + if (debug_route) + printf("el new=%p\n", s->start->el); + } + else { + if (debug_route) + printf("replace_start p=%p el=%p val=%d\n", s->start, s->start->el, s->start->value); + fh_replacekey(heap, s->start->el, new); + } + } + if (debug_route) + printf("\n"); + } + s=s->end_next; + } + } + fh_deleteheap(heap); + callback_call_0(cb); + dbg(1,"return\n"); +} + +/** + * @brief Starts an "offroad" path + * + * This starts a path that is not located on a street. It creates a new route path + * adding only one segment, that leads from pos to dest, and which is not associated with an item. + * + * @param this Not used + * @param pos The starting position for the new path + * @param dst The destination of the new path + * @param dir Not used + * @return The new path + */ +static struct route_path * +route_path_new_offroad(struct route_graph *this, struct route_info *pos, struct route_info *dst) +{ + struct route_path *ret; + + ret=g_new0(struct route_path, 1); + ret->in_use=1; + ret->path_hash=item_hash_new(); + route_path_add_line(ret, &pos->c, &dst->c, pos->lenextra+dst->lenextra); + ret->updated=1; + + return ret; +} + +/** + * @brief Returns a coordinate at a given distance + * + * This function returns the coordinate, where the user will be if he + * follows the current route for a certain distance. + * + * @param this_ The route we're driving upon + * @param dist The distance in meters + * @return The coordinate where the user will be in that distance + */ +struct coord +route_get_coord_dist(struct route *this_, int dist) +{ + int d,l,i,len; + int dx,dy; + double frac; + struct route_path_segment *cur; + struct coord ret; + enum projection pro=route_projection(this_); + struct route_info *dst=route_get_dst(this_); + + d = dist; + + if (!this_->path2 || pro == projection_none) { + return this_->pos->c; + } + + ret = this_->pos->c; + cur = this_->path2->path; + while (cur) { + if (cur->data->len < d) { + d -= cur->data->len; + } else { + for (i=0; i < (cur->ncoords-1); i++) { + l = d; + len = (int)transform_polyline_length(pro, (cur->c + i), 2); + d -= len; + if (d <= 0) { + // We interpolate a bit here... + frac = (double)l / len; + + dx = (cur->c + i + 1)->x - (cur->c + i)->x; + dy = (cur->c + i + 1)->y - (cur->c + i)->y; + + ret.x = (cur->c + i)->x + (frac * dx); + ret.y = (cur->c + i)->y + (frac * dy); + return ret; + } + } + return cur->c[(cur->ncoords-1)]; + } + cur = cur->next; + } + + return dst->c; +} + +/** + * @brief Creates a new route path + * + * This creates a new non-trivial route. It therefore needs the routing information created by route_graph_flood, so + * make sure to run route_graph_flood() after changing the destination before using this function. + * + * @param this The route graph to create the route from + * @param oldpath (Optional) old path which may contain parts of the new part - this speeds things up a bit. May be NULL. + * @param pos The starting position of the route + * @param dst The destination of the route + * @param preferences The routing preferences + * @return The new route path + */ +static struct route_path * +route_path_new(struct route_graph *this, struct route_path *oldpath, struct route_info *pos, struct route_info *dst, struct vehicleprofile *profile) +{ + struct route_graph_segment *s=NULL,*s1=NULL,*s2=NULL; + struct route_graph_point *start; + struct route_info *posinfo, *dstinfo; + int segs=0; + int val1=INT_MAX,val2=INT_MAX; + int val,val1_new,val2_new; + struct route_path *ret; + + if (! pos->street || ! dst->street) { + dbg(0,"pos or dest not set\n"); + return NULL; + } + + if (profile->mode == 2 || (profile->mode == 0 && pos->lenextra + dst->lenextra > transform_distance(map_projection(pos->street->item.map), &pos->c, &dst->c))) + return route_path_new_offroad(this, pos, dst); + while ((s=route_graph_get_segment(this, pos->street, s))) { + val=route_value_seg(profile, NULL, s, 1); + if (val != INT_MAX && s->end->value != INT_MAX) { + val=val*(100-pos->percent)/100; + val1_new=s->end->value+val; + if (val1_new < val1) { + val1=val1_new; + s1=s; + } + } + val=route_value_seg(profile, NULL, s, -1); + if (val != INT_MAX && s->start->value != INT_MAX) { + val=val*pos->percent/100; + val2_new=s->start->value+val; + if (val2_new < val2) { + val2=val2_new; + s2=s; + } + } + } + if (val1 == INT_MAX && val2 == INT_MAX) { + dbg(0,"no route found, pos blocked\n"); + return NULL; + } + if (val1 == val2) { + val1=s1->end->value; + val2=s2->start->value; + } + if (val1 < val2) { + start=s1->start; + s=s1; + } else { + start=s2->end; + s=s2; + } + ret=g_new0(struct route_path, 1); + ret->in_use=1; + ret->updated=1; + if (pos->lenextra) + route_path_add_line(ret, &pos->c, &pos->lp, pos->lenextra); + ret->path_hash=item_hash_new(); + dstinfo=NULL; + posinfo=pos; + while (s && !dstinfo) { /* following start->seg, which indicates the least costly way to reach our destination */ + segs++; +#if 0 + printf("start->value=%d 0x%x,0x%x\n", start->value, start->c.x, start->c.y); +#endif + if (s->start == start) { + if (item_is_equal(s->data.item, dst->street->item) && (s->end->seg == s || !posinfo)) + dstinfo=dst; + if (!route_path_add_item_from_graph(ret, oldpath, s, 1, posinfo, dstinfo)) + ret->updated=0; + start=s->end; + } else { + if (item_is_equal(s->data.item, dst->street->item) && (s->start->seg == s || !posinfo)) + dstinfo=dst; + if (!route_path_add_item_from_graph(ret, oldpath, s, -1, posinfo, dstinfo)) + ret->updated=0; + start=s->start; + } + posinfo=NULL; + s=start->seg; + } + if (dst->lenextra) + route_path_add_line(ret, &dst->lp, &dst->c, dst->lenextra); + dbg(1, "%d segments\n", segs); + return ret; +} + +static int +route_graph_build_next_map(struct route_graph *rg) +{ + do { + rg->m=mapset_next(rg->h, 2); + if (! rg->m) + return 0; + map_rect_destroy(rg->mr); + rg->mr=map_rect_new(rg->m, rg->sel); + } while (!rg->mr); + + return 1; +} + + +static int +is_turn_allowed(struct route_graph_point *p, struct route_graph_segment *from, struct route_graph_segment *to) +{ + struct route_graph_point *prev,*next; + struct route_graph_segment *tmp1,*tmp2; + if (item_is_equal(from->data.item, to->data.item)) + return 0; + if (from->start == p) + prev=from->end; + else + prev=from->start; + if (to->start == p) + next=to->end; + else + next=to->start; + tmp1=p->end; + while (tmp1) { + if (tmp1->start->c.x == prev->c.x && tmp1->start->c.y == prev->c.y && + (tmp1->data.item.type == type_street_turn_restriction_no || + tmp1->data.item.type == type_street_turn_restriction_only)) { + tmp2=p->start; + dbg(1,"found %s (0x%x,0x%x) (0x%x,0x%x)-(0x%x,0x%x) %p-%p\n",item_to_name(tmp1->data.item.type),tmp1->data.item.id_hi,tmp1->data.item.id_lo,tmp1->start->c.x,tmp1->start->c.y,tmp1->end->c.x,tmp1->end->c.y,tmp1->start,tmp1->end); + while (tmp2) { + dbg(1,"compare %s (0x%x,0x%x) (0x%x,0x%x)-(0x%x,0x%x) %p-%p\n",item_to_name(tmp2->data.item.type),tmp2->data.item.id_hi,tmp2->data.item.id_lo,tmp2->start->c.x,tmp2->start->c.y,tmp2->end->c.x,tmp2->end->c.y,tmp2->start,tmp2->end); + if (item_is_equal(tmp1->data.item, tmp2->data.item)) + break; + tmp2=tmp2->start_next; + } + dbg(1,"tmp2=%p\n",tmp2); + if (tmp2) { + dbg(1,"%s tmp2->end=%p next=%p\n",item_to_name(tmp1->data.item.type),tmp2->end,next); + } + if (tmp1->data.item.type == type_street_turn_restriction_no && tmp2 && tmp2->end->c.x == next->c.x && tmp2->end->c.y == next->c.y) { + dbg(1,"from 0x%x,0x%x over 0x%x,0x%x to 0x%x,0x%x not allowed (no)\n",prev->c.x,prev->c.y,p->c.x,p->c.y,next->c.x,next->c.y); + return 0; + } + if (tmp1->data.item.type == type_street_turn_restriction_only && tmp2 && (tmp2->end->c.x != next->c.x || tmp2->end->c.y != next->c.y)) { + dbg(1,"from 0x%x,0x%x over 0x%x,0x%x to 0x%x,0x%x not allowed (only)\n",prev->c.x,prev->c.y,p->c.x,p->c.y,next->c.x,next->c.y); + return 0; + } + } + tmp1=tmp1->end_next; + } + dbg(1,"from 0x%x,0x%x over 0x%x,0x%x to 0x%x,0x%x allowed\n",prev->c.x,prev->c.y,p->c.x,p->c.y,next->c.x,next->c.y); + return 1; +} + +static void +route_graph_clone_segment(struct route_graph *this, struct route_graph_segment *s, struct route_graph_point *start, struct route_graph_point *end, int flags) +{ + struct route_graph_segment_data data; + data.flags=s->data.flags|flags; + data.offset=1; + data.maxspeed=-1; + data.item=&s->data.item; + data.len=s->data.len+1; + if (s->data.flags & AF_SPEED_LIMIT) + data.maxspeed=RSD_MAXSPEED(&s->data); + if (s->data.flags & AF_SEGMENTED) + data.offset=RSD_OFFSET(&s->data); + dbg(1,"cloning segment from %p (0x%x,0x%x) to %p (0x%x,0x%x)\n",start,start->c.x,start->c.y, end, end->c.x, end->c.y); + route_graph_add_segment(this, start, end, &data); +} + +static void +route_graph_process_restriction_segment(struct route_graph *this, struct route_graph_point *p, struct route_graph_segment *s, int dir) +{ + struct route_graph_segment *tmp; + struct route_graph_point *pn; + struct coord c=p->c; + int dx=0; + int dy=0; + c.x+=dx; + c.y+=dy; + dbg(1,"From %s %d,%d\n",item_to_name(s->data.item.type),dx,dy); + pn=route_graph_point_new(this, &c); + if (dir > 0) { /* going away */ + dbg(1,"other 0x%x,0x%x\n",s->end->c.x,s->end->c.y); + if (s->data.flags & AF_ONEWAY) { + dbg(1,"Not possible\n"); + return; + } + route_graph_clone_segment(this, s, pn, s->end, AF_ONEWAYREV); + } else { /* coming in */ + dbg(1,"other 0x%x,0x%x\n",s->start->c.x,s->start->c.y); + if (s->data.flags & AF_ONEWAYREV) { + dbg(1,"Not possible\n"); + return; + } + route_graph_clone_segment(this, s, s->start, pn, AF_ONEWAY); + } + tmp=p->start; + while (tmp) { + if (tmp != s && tmp->data.item.type != type_street_turn_restriction_no && + tmp->data.item.type != type_street_turn_restriction_only && + !(tmp->data.flags & AF_ONEWAYREV) && is_turn_allowed(p, s, tmp)) { + route_graph_clone_segment(this, tmp, pn, tmp->end, AF_ONEWAY); + dbg(1,"To start %s\n",item_to_name(tmp->data.item.type)); + } + tmp=tmp->start_next; + } + tmp=p->end; + while (tmp) { + if (tmp != s && tmp->data.item.type != type_street_turn_restriction_no && + tmp->data.item.type != type_street_turn_restriction_only && + !(tmp->data.flags & AF_ONEWAY) && is_turn_allowed(p, s, tmp)) { + route_graph_clone_segment(this, tmp, tmp->start, pn, AF_ONEWAYREV); + dbg(1,"To end %s\n",item_to_name(tmp->data.item.type)); + } + tmp=tmp->end_next; + } +} + +static void +route_graph_process_restriction_point(struct route_graph *this, struct route_graph_point *p) +{ + struct route_graph_segment *tmp; + tmp=p->start; + dbg(1,"node 0x%x,0x%x\n",p->c.x,p->c.y); + while (tmp) { + if (tmp->data.item.type != type_street_turn_restriction_no && + tmp->data.item.type != type_street_turn_restriction_only) + route_graph_process_restriction_segment(this, p, tmp, 1); + tmp=tmp->start_next; + } + tmp=p->end; + while (tmp) { + if (tmp->data.item.type != type_street_turn_restriction_no && + tmp->data.item.type != type_street_turn_restriction_only) + route_graph_process_restriction_segment(this, p, tmp, -1); + tmp=tmp->end_next; + } + p->flags |= RP_TURN_RESTRICTION_RESOLVED; +} + +static void +route_graph_process_restrictions(struct route_graph *this) +{ + struct route_graph_point *curr; + int i; + dbg(1,"enter\n"); + for (i = 0 ; i < HASH_SIZE ; i++) { + curr=this->hash[i]; + while (curr) { + if (curr->flags & RP_TURN_RESTRICTION) + route_graph_process_restriction_point(this, curr); + curr=curr->hash_next; + } + } +} + +static void +route_graph_build_done(struct route_graph *rg, int cancel) +{ + dbg(1,"cancel=%d\n",cancel); + if (rg->idle_ev) + event_remove_idle(rg->idle_ev); + if (rg->idle_cb) + callback_destroy(rg->idle_cb); + map_rect_destroy(rg->mr); + mapset_close(rg->h); + route_free_selection(rg->sel); + rg->idle_ev=NULL; + rg->idle_cb=NULL; + rg->mr=NULL; + rg->h=NULL; + rg->sel=NULL; + if (! cancel) { + route_graph_process_restrictions(rg); + callback_call_0(rg->done_cb); + } + rg->busy=0; +} + +static void +route_graph_build_idle(struct route_graph *rg, struct vehicleprofile *profile) +{ + int count=1000; + struct item *item; + + while (count > 0) { + for (;;) { + item=map_rect_get_item(rg->mr); + if (item) + break; + if (!route_graph_build_next_map(rg)) { + route_graph_build_done(rg, 0); + return; + } + } + if (item->type == type_traffic_distortion) + route_process_traffic_distortion(rg, item); + else if (item->type == type_street_turn_restriction_no || item->type == type_street_turn_restriction_only) + route_process_turn_restriction(rg, item); + else + route_process_street_graph(rg, item, profile); + count--; + } +} + +/** + * @brief Builds a new route graph from a mapset + * + * This function builds a new route graph from a map. Please note that this function does not + * add any routing information to the route graph - this has to be done via the route_graph_flood() + * function. + * + * The function does not create a graph covering the whole map, but only covering the rectangle + * between c1 and c2. + * + * @param ms The mapset to build the route graph from + * @param c1 Corner 1 of the rectangle to use from the map + * @param c2 Corner 2 of the rectangle to use from the map + * @param done_cb The callback which will be called when graph is complete + * @return The new route graph. + */ +static struct route_graph * +route_graph_build(struct mapset *ms, struct coord *c, int count, struct callback *done_cb, int async, struct vehicleprofile *profile) +{ + struct route_graph *ret=g_new0(struct route_graph, 1); + + dbg(1,"enter\n"); + + ret->sel=route_calc_selection(c, count); + ret->h=mapset_open(ms); + ret->done_cb=done_cb; + ret->busy=1; + if (route_graph_build_next_map(ret)) { + if (async) { + ret->idle_cb=callback_new_2(callback_cast(route_graph_build_idle), ret, profile); + ret->idle_ev=event_add_idle(50, ret->idle_cb); + } + } else + route_graph_build_done(ret, 0); + + return ret; +} + +static void +route_graph_update_done(struct route *this, struct callback *cb) +{ + route_graph_flood(this->graph, this->current_dst, this->vehicleprofile, cb); +} + +/** + * @brief Updates the route graph + * + * This updates the route graph after settings in the route have changed. It also + * adds routing information afterwards by calling route_graph_flood(). + * + * @param this The route to update the graph for + */ +static void +route_graph_update(struct route *this, struct callback *cb, int async) +{ + struct attr route_status; + struct coord *c=g_alloca(sizeof(struct coord)*(1+g_list_length(this->destinations))); + int i=0; + GList *tmp; + + route_status.type=attr_route_status; + route_graph_destroy(this->graph); + this->graph=NULL; + callback_destroy(this->route_graph_done_cb); + this->route_graph_done_cb=callback_new_2(callback_cast(route_graph_update_done), this, cb); + route_status.u.num=route_status_building_graph; + route_set_attr(this, &route_status); + c[i++]=this->pos->c; + tmp=this->destinations; + while (tmp) { + struct route_info *dst=tmp->data; + c[i++]=dst->c; + tmp=g_list_next(tmp); + } + this->graph=route_graph_build(this->ms, c, i, this->route_graph_done_cb, async, this->vehicleprofile); + if (! async) { + while (this->graph->busy) + route_graph_build_idle(this->graph, this->vehicleprofile); + } +} + +/** + * @brief Gets street data for an item + * + * @param item The item to get the data for + * @return Street data for the item + */ +struct street_data * +street_get_data (struct item *item) +{ + int count=0,*flags; + struct street_data *ret = NULL, *ret1; + struct attr flags_attr, maxspeed_attr; + const int step = 128; + int c; + + do { + ret1=g_realloc(ret, sizeof(struct street_data)+(count+step)*sizeof(struct coord)); + if (!ret1) { + if (ret) + g_free(ret); + return NULL; + } + ret = ret1; + c = item_coord_get(item, &ret->c[count], step); + count += c; + } while (c && c == step); + + ret1=g_realloc(ret, sizeof(struct street_data)+count*sizeof(struct coord)); + if (ret1) + ret = ret1; + ret->item=*item; + ret->count=count; + if (item_attr_get(item, attr_flags, &flags_attr)) + ret->flags=flags_attr.u.num; + else { + flags=item_get_default_flags(item->type); + if (flags) + ret->flags=*flags; + else + ret->flags=0; + } + + ret->maxspeed = -1; + if (ret->flags & AF_SPEED_LIMIT) { + if (item_attr_get(item, attr_maxspeed, &maxspeed_attr)) { + ret->maxspeed = maxspeed_attr.u.num; + } + } + + return ret; +} + +/** + * @brief Copies street data + * + * @param orig The street data to copy + * @return The copied street data + */ +struct street_data * +street_data_dup(struct street_data *orig) +{ + struct street_data *ret; + int size=sizeof(struct street_data)+orig->count*sizeof(struct coord); + + ret=g_malloc(size); + memcpy(ret, orig, size); + + return ret; +} + +/** + * @brief Frees street data + * + * @param sd Street data to be freed + */ +void +street_data_free(struct street_data *sd) +{ + g_free(sd); +} + +/** + * @brief Finds the nearest street to a given coordinate + * + * @param ms The mapset to search in for the street + * @param pc The coordinate to find a street nearby + * @return The nearest street + */ +static struct route_info * +route_find_nearest_street(struct vehicleprofile *vehicleprofile, struct mapset *ms, struct pcoord *pc) +{ + struct route_info *ret=NULL; + int max_dist=1000; + struct map_selection *sel; + int dist,mindist=0,pos; + struct mapset_handle *h; + struct map *m; + struct map_rect *mr; + struct item *item; + struct coord lp; + struct street_data *sd; + struct coord c; + struct coord_geo g; + + ret=g_new0(struct route_info, 1); + mindist = INT_MAX; + + h=mapset_open(ms); + while ((m=mapset_next(h,2))) { + c.x = pc->x; + c.y = pc->y; + if (map_projection(m) != pc->pro) { + transform_to_geo(pc->pro, &c, &g); + transform_from_geo(map_projection(m), &g, &c); + } + sel = route_rect(18, &c, &c, 0, max_dist); + if (!sel) + continue; + mr=map_rect_new(m, sel); + if (!mr) { + map_selection_destroy(sel); + continue; + } + while ((item=map_rect_get_item(mr))) { + if (item_get_default_flags(item->type)) { + sd=street_get_data(item); + if (!sd) + continue; + dist=transform_distance_polyline_sq(sd->c, sd->count, &c, &lp, &pos); + if (dist < mindist && ( + (sd->flags & vehicleprofile->flags_forward_mask) == vehicleprofile->flags || + (sd->flags & vehicleprofile->flags_reverse_mask) == vehicleprofile->flags)) { + mindist = dist; + if (ret->street) { + street_data_free(ret->street); + } + ret->c=c; + ret->lp=lp; + ret->pos=pos; + ret->street=sd; + dbg(1,"dist=%d id 0x%x 0x%x pos=%d\n", dist, item->id_hi, item->id_lo, pos); + } else { + street_data_free(sd); + } + } + } + map_selection_destroy(sel); + map_rect_destroy(mr); + } + mapset_close(h); + + if (!ret->street || mindist > max_dist*max_dist) { + if (ret->street) { + street_data_free(ret->street); + dbg(1,"Much too far %d > %d\n", mindist, max_dist); + } + g_free(ret); + ret = NULL; + } + + return ret; +} + +/** + * @brief Destroys a route_info + * + * @param info The route info to be destroyed + */ +void +route_info_free(struct route_info *inf) +{ + if (!inf) + return; + if (inf->street) + street_data_free(inf->street); + g_free(inf); +} + + +#include "point.h" + +/** + * @brief Returns street data for a route info + * + * @param rinf The route info to return the street data for + * @return Street data for the route info + */ +struct street_data * +route_info_street(struct route_info *rinf) +{ + return rinf->street; +} + +#if 0 +struct route_crossings * +route_crossings_get(struct route *this, struct coord *c) +{ + struct route_point *pnt; + struct route_segment *seg; + int crossings=0; + struct route_crossings *ret; + + pnt=route_graph_get_point(this, c); + seg=pnt->start; + while (seg) { + printf("start: 0x%x 0x%x\n", seg->item.id_hi, seg->item.id_lo); + crossings++; + seg=seg->start_next; + } + seg=pnt->end; + while (seg) { + printf("end: 0x%x 0x%x\n", seg->item.id_hi, seg->item.id_lo); + crossings++; + seg=seg->end_next; + } + ret=g_malloc(sizeof(struct route_crossings)+crossings*sizeof(struct route_crossing)); + ret->count=crossings; + return ret; +} +#endif + + +struct map_rect_priv { + struct route_info_handle *ri; + enum attr_type attr_next; + int pos; + struct map_priv *mpriv; + struct item item; + unsigned int last_coord; + struct route_path *path; + struct route_path_segment *seg,*seg_next; + struct route_graph_point *point; + struct route_graph_segment *rseg; + char *str; + int hash_bucket; + struct coord *coord_sel; /**< Set this to a coordinate if you want to filter for just a single route graph point */ + struct route_graph_point_iterator it; +}; + +static void +rm_coord_rewind(void *priv_data) +{ + struct map_rect_priv *mr = priv_data; + mr->last_coord = 0; +} + +static void +rm_attr_rewind(void *priv_data) +{ + struct map_rect_priv *mr = priv_data; + mr->attr_next = attr_street_item; +} + +static int +rm_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + struct map_rect_priv *mr = priv_data; + struct route_path_segment *seg=mr->seg; + struct route *route=mr->mpriv->route; + if (mr->item.type != type_street_route) + return 0; + attr->type=attr_type; + switch (attr_type) { + case attr_any: + while (mr->attr_next != attr_none) { + if (rm_attr_get(priv_data, mr->attr_next, attr)) + return 1; + } + return 0; + case attr_maxspeed: + mr->attr_next = attr_street_item; + if (seg && seg->data->flags & AF_SPEED_LIMIT) { + attr->u.num=RSD_MAXSPEED(seg->data); + + } else { + return 0; + } + return 1; + case attr_street_item: + mr->attr_next=attr_direction; + if (seg && seg->data->item.map) + attr->u.item=&seg->data->item; + else + return 0; + return 1; + case attr_direction: + mr->attr_next=attr_route; + if (seg) + attr->u.num=seg->direction; + else + return 0; + return 1; + case attr_route: + mr->attr_next=attr_length; + attr->u.route = mr->mpriv->route; + return 1; + case attr_length: + mr->attr_next=attr_time; + if (seg) + attr->u.num=seg->data->len; + else + return 0; + return 1; + case attr_time: + mr->attr_next=attr_speed; + if (seg) + attr->u.num=route_time_seg(route->vehicleprofile, seg->data, NULL); + else + return 0; + return 1; + case attr_speed: + mr->attr_next=attr_none; + if (seg) + attr->u.num=route_seg_speed(route->vehicleprofile, seg->data, NULL); + else + return 0; + return 1; + case attr_label: + mr->attr_next=attr_none; + return 0; + default: + mr->attr_next=attr_none; + attr->type=attr_none; + return 0; + } + return 0; +} + +static int +rm_coord_get(void *priv_data, struct coord *c, int count) +{ + struct map_rect_priv *mr = priv_data; + struct route_path_segment *seg = mr->seg; + int i,rc=0; + struct route *r = mr->mpriv->route; + enum projection pro = route_projection(r); + + if (pro == projection_none) + return 0; + if (mr->item.type == type_route_start || mr->item.type == type_route_start_reverse || mr->item.type == type_route_end) { + if (! count || mr->last_coord) + return 0; + mr->last_coord=1; + if (mr->item.type == type_route_start || mr->item.type == type_route_start_reverse) + c[0]=r->pos->c; + else { + c[0]=route_get_dst(r)->c; + } + return 1; + } + if (! seg) + return 0; + for (i=0; i < count; i++) { + if (mr->last_coord >= seg->ncoords) + break; + if (i >= seg->ncoords) + break; + if (pro != projection_mg) + transform_from_to(&seg->c[mr->last_coord++], pro, + &c[i],projection_mg); + else + c[i] = seg->c[mr->last_coord++]; + rc++; + } + dbg(1,"return %d\n",rc); + return rc; +} + +static struct item_methods methods_route_item = { + rm_coord_rewind, + rm_coord_get, + rm_attr_rewind, + rm_attr_get, +}; + +static void +rp_attr_rewind(void *priv_data) +{ + struct map_rect_priv *mr = priv_data; + mr->attr_next = attr_label; +} + +static int +rp_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + struct map_rect_priv *mr = priv_data; + struct route_graph_point *p = mr->point; + struct route_graph_segment *seg = mr->rseg; + struct route *route=mr->mpriv->route; + + attr->type=attr_type; + switch (attr_type) { + case attr_any: // works only with rg_points for now + while (mr->attr_next != attr_none) { + dbg(0,"querying %s\n", attr_to_name(mr->attr_next)); + if (rp_attr_get(priv_data, mr->attr_next, attr)) + return 1; + } + return 0; + case attr_maxspeed: + mr->attr_next = attr_label; + if (mr->item.type != type_rg_segment) + return 0; + if (seg && (seg->data.flags & AF_SPEED_LIMIT)) { + attr->type = attr_maxspeed; + attr->u.num=RSD_MAXSPEED(&seg->data); + return 1; + } else { + return 0; + } + case attr_label: + mr->attr_next=attr_street_item; + if (mr->item.type != type_rg_point) + return 0; + attr->type = attr_label; + if (mr->str) + g_free(mr->str); + if (p->value != INT_MAX) + mr->str=g_strdup_printf("%d", p->value); + else + mr->str=g_strdup("-"); + attr->u.str = mr->str; + return 1; + case attr_street_item: + mr->attr_next=attr_flags; + if (mr->item.type != type_rg_segment) + return 0; + if (seg && seg->data.item.map) + attr->u.item=&seg->data.item; + else + return 0; + return 1; + case attr_flags: + mr->attr_next = attr_direction; + if (mr->item.type != type_rg_segment) + return 0; + if (seg) { + attr->u.num = seg->data.flags; + } else { + return 0; + } + return 1; + case attr_direction: + mr->attr_next = attr_debug; + // This only works if the map has been opened at a single point, and in that case indicates if the + // segment returned last is connected to this point via its start (1) or its end (-1) + if (!mr->coord_sel || (mr->item.type != type_rg_segment)) + return 0; + if (seg->start == mr->point) { + attr->u.num=1; + } else if (seg->end == mr->point) { + attr->u.num=-1; + } else { + return 0; + } + return 1; + case attr_debug: + mr->attr_next=attr_none; + if (mr->str) + g_free(mr->str); + switch (mr->item.type) { + case type_rg_point: + { + struct route_graph_segment *tmp; + int start=0; + int end=0; + tmp=p->start; + while (tmp) { + start++; + tmp=tmp->start_next; + } + tmp=p->end; + while (tmp) { + end++; + tmp=tmp->end_next; + } + mr->str=g_strdup_printf("%d %d %p (0x%x,0x%x)", start, end, p, p->c.x, p->c.y); + attr->u.str = mr->str; + } + return 1; + case type_rg_segment: + if (! seg) + return 0; + mr->str=g_strdup_printf("len %d time %d start %p end %p",seg->data.len, route_time_seg(route->vehicleprofile, &seg->data, NULL), seg->start, seg->end); + attr->u.str = mr->str; + return 1; + default: + return 0; + } + default: + mr->attr_next=attr_none; + attr->type=attr_none; + return 0; + } +} + +/** + * @brief Returns the coordinates of a route graph item + * + * @param priv_data The route graph item's private data + * @param c Pointer where to store the coordinates + * @param count How many coordinates to get at a max? + * @return The number of coordinates retrieved + */ +static int +rp_coord_get(void *priv_data, struct coord *c, int count) +{ + struct map_rect_priv *mr = priv_data; + struct route_graph_point *p = mr->point; + struct route_graph_segment *seg = mr->rseg; + int rc = 0,i,dir; + struct route *r = mr->mpriv->route; + enum projection pro = route_projection(r); + + if (pro == projection_none) + return 0; + for (i=0; i < count; i++) { + if (mr->item.type == type_rg_point) { + if (mr->last_coord >= 1) + break; + if (pro != projection_mg) + transform_from_to(&p->c, pro, + &c[i],projection_mg); + else + c[i] = p->c; + } else { + if (mr->last_coord >= 2) + break; + dir=0; + if (seg->end->seg == seg) + dir=1; + if (mr->last_coord) + dir=1-dir; + if (dir) { + if (pro != projection_mg) + transform_from_to(&seg->end->c, pro, + &c[i],projection_mg); + else + c[i] = seg->end->c; + } else { + if (pro != projection_mg) + transform_from_to(&seg->start->c, pro, + &c[i],projection_mg); + else + c[i] = seg->start->c; + } + } + mr->last_coord++; + rc++; + } + return rc; +} + +static struct item_methods methods_point_item = { + rm_coord_rewind, + rp_coord_get, + rp_attr_rewind, + rp_attr_get, +}; + +static void +rp_destroy(struct map_priv *priv) +{ + g_free(priv); +} + +static void +rm_destroy(struct map_priv *priv) +{ + g_free(priv); +} + +static struct map_rect_priv * +rm_rect_new(struct map_priv *priv, struct map_selection *sel) +{ + struct map_rect_priv * mr; + dbg(1,"enter\n"); +#if 0 + if (! route_get_pos(priv->route)) + return NULL; + if (! route_get_dst(priv->route)) + return NULL; +#endif +#if 0 + if (! priv->route->path2) + return NULL; +#endif + mr=g_new0(struct map_rect_priv, 1); + mr->mpriv = priv; + mr->item.priv_data = mr; + mr->item.type = type_none; + mr->item.meth = &methods_route_item; + if (priv->route->path2) { + mr->path=priv->route->path2; + mr->seg_next=mr->path->path; + mr->path->in_use++; + } else + mr->seg_next=NULL; + return mr; +} + +/** + * @brief Opens a new map rectangle on the route graph's map + * + * This function opens a new map rectangle on the route graph's map. + * The "sel" parameter enables you to only search for a single route graph + * point on this map (or exactly: open a map rectangle that only contains + * this one point). To do this, pass here a single map selection, whose + * c_rect has both coordinates set to the same point. Otherwise this parameter + * has no effect. + * + * @param priv The route graph map's private data + * @param sel Here it's possible to specify a point for which to search. Please read the function's description. + * @return A new map rect's private data + */ +static struct map_rect_priv * +rp_rect_new(struct map_priv *priv, struct map_selection *sel) +{ + struct map_rect_priv * mr; + + dbg(1,"enter\n"); + if (! priv->route->graph) + return NULL; + mr=g_new0(struct map_rect_priv, 1); + mr->mpriv = priv; + mr->item.priv_data = mr; + mr->item.type = type_rg_point; + mr->item.meth = &methods_point_item; + if (sel) { + if ((sel->u.c_rect.lu.x == sel->u.c_rect.rl.x) && (sel->u.c_rect.lu.y == sel->u.c_rect.rl.y)) { + mr->coord_sel = g_malloc(sizeof(struct coord)); + *(mr->coord_sel) = sel->u.c_rect.lu; + } + } + return mr; +} + +static void +rm_rect_destroy(struct map_rect_priv *mr) +{ + if (mr->str) + g_free(mr->str); + if (mr->coord_sel) { + g_free(mr->coord_sel); + } + if (mr->path) { + mr->path->in_use--; + if (mr->path->update_required && (mr->path->in_use==1)) + route_path_update_done(mr->mpriv->route, mr->path->update_required-1); + else if (!mr->path->in_use) + g_free(mr->path); + } + + g_free(mr); +} + +static struct item * +rp_get_item(struct map_rect_priv *mr) +{ + struct route *r = mr->mpriv->route; + struct route_graph_point *p = mr->point; + struct route_graph_segment *seg = mr->rseg; + + if (mr->item.type == type_rg_point) { + if (mr->coord_sel) { + // We are supposed to return only the point at one specified coordinate... + if (!p) { + p = route_graph_get_point_last(r->graph, mr->coord_sel); + if (!p) { + mr->point = NULL; // This indicates that no point has been found + } else { + mr->it = rp_iterator_new(p); + } + } else { + p = NULL; + } + } else { + if (!p) { + mr->hash_bucket=0; + p = r->graph->hash[0]; + } else + p=p->hash_next; + while (!p) { + mr->hash_bucket++; + if (mr->hash_bucket >= HASH_SIZE) + break; + p = r->graph->hash[mr->hash_bucket]; + } + } + if (p) { + mr->point = p; + mr->item.id_lo++; + rm_coord_rewind(mr); + rp_attr_rewind(mr); + return &mr->item; + } else + mr->item.type = type_rg_segment; + } + + if (mr->coord_sel) { + if (!mr->point) { // This means that no point has been found + return NULL; + } + seg = rp_iterator_next(&(mr->it)); + } else { + if (!seg) + seg=r->graph->route_segments; + else + seg=seg->next; + } + + if (seg) { + mr->rseg = seg; + mr->item.id_lo++; + rm_coord_rewind(mr); + rp_attr_rewind(mr); + return &mr->item; + } + return NULL; + +} + +static struct item * +rp_get_item_byid(struct map_rect_priv *mr, int id_hi, int id_lo) +{ + struct item *ret=NULL; + while (id_lo-- > 0) + ret=rp_get_item(mr); + return ret; +} + + +static struct item * +rm_get_item(struct map_rect_priv *mr) +{ + struct route *route=mr->mpriv->route; + dbg(1,"enter\n", mr->pos); + + switch (mr->item.type) { + case type_none: + if (route->pos && route->pos->street_direction && route->pos->street_direction != route->pos->dir) + mr->item.type=type_route_start_reverse; + else + mr->item.type=type_route_start; + if (route->pos) + break; + default: + mr->item.type=type_street_route; + mr->seg=mr->seg_next; + if (!mr->seg && mr->path && mr->path->next) { + struct route_path *p=NULL; + mr->path->in_use--; + if (!mr->path->in_use) + p=mr->path; + mr->path=mr->path->next; + mr->path->in_use++; + mr->seg=mr->path->path; + if (p) + g_free(p); + } + if (mr->seg) { + mr->seg_next=mr->seg->next; + break; + } + mr->item.type=type_route_end; + if (mr->mpriv->route->destinations) + break; + case type_route_end: + return NULL; + } + mr->last_coord = 0; + mr->item.id_lo++; + rm_attr_rewind(mr); + return &mr->item; +} + +static struct item * +rm_get_item_byid(struct map_rect_priv *mr, int id_hi, int id_lo) +{ + struct item *ret=NULL; + while (id_lo-- > 0) + ret=rm_get_item(mr); + return ret; +} + +static struct map_methods route_meth = { + projection_mg, + "utf-8", + rm_destroy, + rm_rect_new, + rm_rect_destroy, + rm_get_item, + rm_get_item_byid, + NULL, + NULL, + NULL, +}; + +static struct map_methods route_graph_meth = { + projection_mg, + "utf-8", + rp_destroy, + rp_rect_new, + rm_rect_destroy, + rp_get_item, + rp_get_item_byid, + NULL, + NULL, + NULL, +}; + +static struct map_priv * +route_map_new_helper(struct map_methods *meth, struct attr **attrs, int graph) +{ + struct map_priv *ret; + struct attr *route_attr; + + route_attr=attr_search(attrs, NULL, attr_route); + if (! route_attr) + return NULL; + ret=g_new0(struct map_priv, 1); + if (graph) + *meth=route_graph_meth; + else + *meth=route_meth; + ret->route=route_attr->u.route; + + return ret; +} + +static struct map_priv * +route_map_new(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) +{ + return route_map_new_helper(meth, attrs, 0); +} + +static struct map_priv * +route_graph_map_new(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) +{ + return route_map_new_helper(meth, attrs, 1); +} + +static struct map * +route_get_map_helper(struct route *this_, struct map **map, char *type, char *description) +{ + struct attr *attrs[5]; + struct attr a_type,navigation,data,a_description; + a_type.type=attr_type; + a_type.u.str=type; + navigation.type=attr_route; + navigation.u.route=this_; + data.type=attr_data; + data.u.str=""; + a_description.type=attr_description; + a_description.u.str=description; + + attrs[0]=&a_type; + attrs[1]=&navigation; + attrs[2]=&data; + attrs[3]=&a_description; + attrs[4]=NULL; + + if (! *map) { + *map=map_new(NULL, attrs); + map_ref(*map); + } + + return *map; +} + +/** + * @brief Returns a new map containing the route path + * + * This function returns a new map containing the route path. + * + * @important Do not map_destroy() this! + * + * @param this_ The route to get the map of + * @return A new map containing the route path + */ +struct map * +route_get_map(struct route *this_) +{ + return route_get_map_helper(this_, &this_->map, "route","Route"); +} + + +/** + * @brief Returns a new map containing the route graph + * + * This function returns a new map containing the route graph. + * + * @important Do not map_destroy() this! + * + * @param this_ The route to get the map of + * @return A new map containing the route graph + */ +struct map * +route_get_graph_map(struct route *this_) +{ + return route_get_map_helper(this_, &this_->graph_map, "route_graph","Route Graph"); +} + +void +route_set_projection(struct route *this_, enum projection pro) +{ +} + +int +route_set_attr(struct route *this_, struct attr *attr) +{ + int attr_updated=0; + switch (attr->type) { + case attr_route_status: + attr_updated = (this_->route_status != attr->u.num); + this_->route_status = attr->u.num; + break; + case attr_destination: + route_set_destination(this_, attr->u.pcoord, 1); + return 1; + case attr_vehicle: + attr_updated = (this_->v != attr->u.vehicle); + this_->v=attr->u.vehicle; + if (attr_updated) { + struct attr g; + struct pcoord pc; + struct coord c; + if (vehicle_get_attr(this_->v, attr_position_coord_geo, &g, NULL)) { + pc.pro=projection_mg; + transform_from_geo(projection_mg, g.u.coord_geo, &c); + pc.x=c.x; + pc.y=c.y; + route_set_position(this_, &pc); + } + } + break; + default: + dbg(0,"unsupported attribute: %s\n",attr_to_name(attr->type)); + return 0; + } + if (attr_updated) + callback_list_call_attr_2(this_->cbl2, attr->type, this_, attr); + return 1; +} + +int +route_add_attr(struct route *this_, struct attr *attr) +{ + switch (attr->type) { + case attr_callback: + callback_list_add(this_->cbl2, attr->u.callback); + return 1; + default: + return 0; + } +} + +int +route_remove_attr(struct route *this_, struct attr *attr) +{ + dbg(0,"enter\n"); + switch (attr->type) { + case attr_callback: + callback_list_remove(this_->cbl2, attr->u.callback); + return 1; + case attr_vehicle: + this_->v=NULL; + return 1; + default: + return 0; + } +} + +int +route_get_attr(struct route *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + int ret=1; + switch (type) { + case attr_map: + attr->u.map=route_get_map(this_); + ret=(attr->u.map != NULL); + break; + case attr_destination: + if (this_->destinations) { + struct route_info *dst; + if (iter) { + if (iter->u.list) { + iter->u.list=g_list_next(iter->u.list); + } else { + iter->u.list=this_->destinations; + } + if (!iter->u.list) { + return 0; + } + dst = (struct route_info*)iter->u.list->data; + } else { //No iter handling + dst=route_get_dst(this_); + } + attr->u.pcoord=&this_->pc; + this_->pc.pro=projection_mg; /* fixme */ + this_->pc.x=dst->c.x; + this_->pc.y=dst->c.y; + } else + ret=0; + break; + case attr_vehicle: + attr->u.vehicle=this_->v; + ret=(this_->v != NULL); + dbg(0,"get vehicle %p\n",this_->v); + break; + case attr_vehicleprofile: + attr->u.vehicleprofile=this_->vehicleprofile; + ret=(this_->vehicleprofile != NULL); + break; + case attr_route_status: + attr->u.num=this_->route_status; + break; + case attr_destination_time: + if (this_->path2 && (this_->route_status == route_status_path_done_new || this_->route_status == route_status_path_done_incremental)) { + + attr->u.num=this_->path2->path_time; + dbg(1,"path_time %d\n",attr->u.num); + } + else + ret=0; + break; + case attr_destination_length: + if (this_->path2 && (this_->route_status == route_status_path_done_new || this_->route_status == route_status_path_done_incremental)) + attr->u.num=this_->path2->path_len; + else + ret=0; + break; + default: + return 0; + } + attr->type=type; + return ret; +} + +struct attr_iter * +route_attr_iter_new(void) +{ + return g_new0(struct attr_iter, 1); +} + +void +route_attr_iter_destroy(struct attr_iter *iter) +{ + g_free(iter); +} + +void +route_init(void) +{ + plugin_register_map_type("route", route_map_new); + plugin_register_map_type("route_graph", route_graph_map_new); +} + +void +route_destroy(struct route *this_) +{ + route_path_destroy(this_->path2,1); + route_graph_destroy(this_->graph); + route_clear_destinations(this_); + route_info_free(this_->pos); + map_destroy(this_->map); + map_destroy(this_->graph_map); + g_free(this_); +} diff --git a/navit/route.h b/navit/route.h new file mode 100644 index 0000000..c8ff022 --- /dev/null +++ b/navit/route.h @@ -0,0 +1,124 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +/** @file + * + * @brief Contains exported code for route.c + * + * This file contains code that works together with route.c and that is exported to + * other modules. + */ + +#ifndef NAVIT_ROUTE_H +#define NAVIT_ROUTE_H + +#ifdef __cplusplus +extern "C" { +#endif +enum route_status { + route_status_no_destination=0, + route_status_destination_set=1, + route_status_not_found=1|2, + route_status_building_path=1|4, + route_status_building_graph=1|4|8, + route_status_path_done_new=1|16, + route_status_path_done_incremental=1|32, +}; + +struct route_crossing { + long segid; + int dir; +}; + +struct route_crossings { + int count; + struct route_crossing crossing[0]; +}; + +/** + * @brief Information about a street + * + * This contains information about a certain street + */ +struct street_data { + struct item item; /**< The map item for this street */ + int count; /**< Number of coordinates this street has */ + int flags; + int maxspeed; /**< Maximum speed allowed on this street. */ + struct coord c[0]; /**< Pointer to the coordinates of this street. + * DO NOT INSERT FIELDS AFTER THIS. */ +}; + +/* prototypes */ +enum attr_type; +enum projection; +struct attr; +struct attr_iter; +struct coord; +struct item; +struct map; +struct map_selection; +struct mapset; +struct pcoord; +struct route; +struct route_info; +struct street_data; +struct tracking; +struct vehicleprofile; +struct route *route_new(struct attr *parent, struct attr **attrs); +void route_set_mapset(struct route *this_, struct mapset *ms); +void route_set_profile(struct route *this_, struct vehicleprofile *prof); +struct mapset *route_get_mapset(struct route *this_); +struct route_info *route_get_pos(struct route *this_); +struct route_info *route_get_dst(struct route *this_); +int route_get_path_set(struct route *this_); +int route_contains(struct route *this_, struct item *item); +int route_destination_reached(struct route *this_); +void route_set_position(struct route *this_, struct pcoord *pos); +void route_set_position_from_tracking(struct route *this_, struct tracking *tracking, enum projection pro); +struct map_selection *route_rect(int order, struct coord *c1, struct coord *c2, int rel, int abs); +void route_set_destinations(struct route *this_, struct pcoord *dst, int count, int async); +int route_get_destinations(struct route *this_, struct pcoord *pc, int count); +void route_set_destination(struct route *this_, struct pcoord *dst, int async); +void route_remove_waypoint(struct route *this_); +struct coord route_get_coord_dist(struct route *this_, int dist); +struct street_data *street_get_data(struct item *item); +struct street_data *street_data_dup(struct street_data *orig); +void street_data_free(struct street_data *sd); +void route_info_free(struct route_info *inf); +struct street_data *route_info_street(struct route_info *rinf); +struct map *route_get_map(struct route *this_); +struct map *route_get_graph_map(struct route *this_); +void route_set_projection(struct route *this_, enum projection pro); +void route_set_destinations(struct route *this_, struct pcoord *dst, int count, int async); +int route_set_attr(struct route *this_, struct attr *attr); +int route_add_attr(struct route *this_, struct attr *attr); +int route_remove_attr(struct route *this_, struct attr *attr); +struct attr_iter * route_attr_iter_new(void); +void route_attr_iter_destroy(struct attr_iter *iter); +int route_get_attr(struct route *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); +void route_init(void); +void route_destroy(struct route *this_); +/* end of prototypes */ +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/navit/routech.c b/navit/routech.c new file mode 100644 index 0000000..4f8c77a --- /dev/null +++ b/navit/routech.c @@ -0,0 +1,578 @@ +#include +#include +#include "item.h" +#include "coord.h" +#include "navit.h" +#include "transform.h" +#include "profile.h" +#include "mapset.h" +#include "map.h" + +FILE *routefile; + +void routech_test(struct navit *navit); + +struct ch_edge { + int flags; + int weight; + struct item_id target,middle; +}; + +struct routech_search { + struct pq *pq; + GHashTable *hash; + int finished; + int dir; + unsigned int upper; + struct item_id *via; +}; + + +struct pq_element { + struct item_id *node_id; + struct item_id *parent_node_id; + int stalled; + int key; + int heap_element; +}; + +struct pq_heap_element { + int key; + int element; +}; + +struct pq { + int capacity; + int size; + int step; + int elements_capacity; + int elements_size; + int elements_step; + struct pq_element *elements; + struct pq_heap_element *heap_elements; +}; + +static struct pq * +pq_new(void) +{ + struct pq *ret=g_new(struct pq, 1); + ret->step=10; + ret->capacity=0; + ret->size=1; + ret->elements_step=10; + ret->elements_capacity=0; + ret->elements_size=1; + ret->elements=NULL; + ret->heap_elements=NULL; + return ret; +} + +static int +pq_insert(struct pq *pq, int key, struct item_id *node_id) +{ + int element,i; + if (pq->size >= pq->capacity) { + pq->capacity += pq->step; + pq->heap_elements=g_renew(struct pq_heap_element, pq->heap_elements, pq->capacity); + } + if (pq->elements_size >= pq->elements_capacity) { + pq->elements_capacity += pq->elements_step; + pq->elements=g_renew(struct pq_element, pq->elements, pq->elements_capacity); + } + element=pq->elements_size++; + pq->elements[element].node_id=node_id; + i=pq->size++; + while (i > 1 && pq->heap_elements[i/2].key > key) { + pq->heap_elements[i]=pq->heap_elements[i/2]; + pq->elements[pq->heap_elements[i].element].heap_element=i; + i/=2; + } + pq->heap_elements[i].key=key; + pq->heap_elements[i].element=element; + pq->elements[element].heap_element=i; + pq->elements[element].key=key; + return element; +} + +static int +pq_get_key(struct pq *pq, int element, int *key) +{ + *key=pq->elements[element].key; + return 1; +} + +static void +pq_set_parent(struct pq *pq, int element, struct item_id *node_id, int stalled) +{ + pq->elements[element].parent_node_id=node_id; + pq->elements[element].stalled=stalled; +} + +static struct item_id * +pq_get_parent_node_id(struct pq *pq, int element) +{ + return pq->elements[element].parent_node_id; +} + +static void +pq_set_stalled(struct pq *pq, int element, int stalled) +{ + pq->elements[element].stalled=stalled; +} + +static int +pq_get_stalled(struct pq *pq, int element) +{ + return pq->elements[element].stalled; +} + +static int +pq_is_deleted(struct pq *pq, int element) +{ + return (pq->elements[element].heap_element == 0); +} + +static int +pq_min(struct pq *pq) +{ + return (pq->heap_elements[1].key); +} + +static void +pq_decrease_key(struct pq *pq, int element, int key) +{ + int i=pq->elements[element].heap_element; + while (i > 1 && pq->heap_elements[i/2].key > key) { + pq->heap_elements[i]=pq->heap_elements[i/2]; + pq->elements[pq->heap_elements[i].element].heap_element=i; + i/=2; + } + pq->heap_elements[i].element=element; + pq->heap_elements[i].key=key; + pq->elements[element].heap_element=i; + pq->elements[element].key=key; +} + +static int +pq_delete_min(struct pq *pq, struct item_id **node_id, int *key, int *element) +{ + struct pq_heap_element min, last; + int i=1,j; + if (pq->size <= 1) + return 0; + min=pq->heap_elements[1]; + if (node_id) + *node_id=pq->elements[min.element].node_id; + if (key) + *key=min.key; + if (element) + *element=min.element; + pq->elements[min.element].heap_element=0; + min.element=0; + last=pq->heap_elements[--pq->size]; + while (i <= pq->size / 2) { + j=2*i; + if (j < pq->size && pq->heap_elements[j].key > pq->heap_elements[j+1].key) + j++; + if (pq->heap_elements[j].key >= last.key) + break; + pq->heap_elements[i]=pq->heap_elements[j]; + pq->elements[pq->heap_elements[i].element].heap_element=i; + i=j; + } + pq->heap_elements[i]=last; + pq->elements[last.element].heap_element=i; + return 1; +} + +static int +pq_is_empty(struct pq *pq) +{ + return pq->size <= 1; +} + +static void +pq_check(struct pq *pq) +{ + int i; + for (i = 2 ; i < pq->size ; i++) { + if (pq->heap_elements[i/2].key > pq->heap_elements[i].key) { + printf("%d vs %d\n", pq->heap_elements[i/2].key, pq->heap_elements[i].key); + return; + } + } + for (i = 1 ; i < pq->size ; i++) { + if (i != pq->elements[pq->heap_elements[i].element].heap_element) { + printf("Error: heap_element %d points to element %d, but that points to %d\n",i,pq->heap_elements[i].element,pq->elements[pq->heap_elements[i].element].heap_element); + } + } +} + +static struct routech_search * +routech_search_new(int dir) +{ + struct routech_search *ret=g_new0(struct routech_search, 1); + ret->pq=pq_new(); + ret->hash=g_hash_table_new_full(item_id_hash, item_id_equal, g_free, NULL); + ret->upper=UINT_MAX; + ret->dir=dir; + + return ret; +} + +static int +routech_insert_node(struct routech_search *search, struct item_id **id, int val) +{ + struct item_id *ret; + int e; + if (g_hash_table_lookup_extended(search->hash, *id, (gpointer)&ret, (gpointer)&e)) { + int oldval; + pq_get_key(search->pq, e, &oldval); + // printf("Node = %d\n",node); + if (oldval > val) { + pq_decrease_key(search->pq, e, val); + *id=ret; + return e; + } + return 0; + } + ret=g_new(struct item_id, 1); + *ret=**id; + e=pq_insert(search->pq, val, ret); + g_hash_table_insert(search->hash, ret, GINT_TO_POINTER(e)); + *id=ret; + return e; +} + + +static int +routech_find_nearest(struct mapset *ms, struct coord *c, struct item_id *id, struct map **map_ret) +{ + int dst=50; + int dstsq=dst*dst; + int ret=0; + struct map_selection sel; + struct map_rect *mr; + struct mapset_handle *msh; + struct map *map; + struct item *item; + sel.next=NULL; + sel.order=18; + sel.range.min=type_ch_node; + sel.range.max=type_ch_node; + sel.u.c_rect.lu.x=c->x-dst; + sel.u.c_rect.lu.y=c->y+dst; + sel.u.c_rect.rl.x=c->x+dst; + sel.u.c_rect.rl.y=c->y-dst; + printf("0x%x,0x%x-0x%x,0x%x\n",sel.u.c_rect.lu.x,sel.u.c_rect.lu.y,sel.u.c_rect.rl.x,sel.u.c_rect.rl.y); + msh=mapset_open(ms); + while ((map=mapset_next(msh, 1))) { + mr=map_rect_new(map, &sel); + if (!mr) + continue; + while ((item=map_rect_get_item(mr))) { + struct coord cn; + if (item->type == type_ch_node && item_coord_get(item, &cn, 1)) { + int dist=transform_distance_sq(&cn, c); + if (dist < dstsq) { + dstsq=dist; + id->id_hi=item->id_hi; + id->id_lo=item->id_lo; + *map_ret=map; + ret=1; + } + } + } + map_rect_destroy(mr); + } + mapset_close(msh); + dbg_assert(ret==1); + return ret; +} + +static int +routech_edge_valid(struct ch_edge *edge, int dir) +{ + if (edge->flags & (1 << dir)) + return 1; + return 0; +} + +static void +routech_stall(struct map_rect *mr, struct routech_search *curr, struct item_id *id, int key) +{ + struct stall_element { + struct item_id id; + int key; + } *se; + GList *list=NULL; + struct item *item; + struct attr edge_attr; + + int index=GPOINTER_TO_INT(g_hash_table_lookup(curr->hash, id)); + pq_set_stalled(curr->pq, index, key); + se=g_new(struct stall_element, 1); + se->id=*id; + se->key=key; + list=g_list_append(list, se); + while (list) { + se=list->data; + key=se->key; + item=map_rect_get_item_byid(mr, se->id.id_hi, se->id.id_lo); + while (item_attr_get(item, attr_ch_edge, &edge_attr)) { + struct ch_edge *edge=edge_attr.u.data; + if (routech_edge_valid(edge, curr->dir)) { + int index=GPOINTER_TO_INT(g_hash_table_lookup(curr->hash, &edge->target)); + if (index) { + int newkey=key+edge->weight; + int target_key; + pq_get_key(curr->pq, index, &target_key); + if (newkey < target_key) { + if (!pq_get_stalled(curr->pq, index)) { + pq_set_stalled(curr->pq, index, newkey); + se=g_new(struct stall_element, 1); + se->id=edge->target; + se->key=newkey; + list=g_list_append(list, se); + } + } + } + } + } + list=g_list_remove(list, se); + g_free(se); + } +} + +static void +routech_relax(struct map_rect **mr, struct routech_search *curr, struct routech_search *opposite) +{ + int val,element; + struct item_id *id; + struct item *item; + struct attr edge_attr; + int opposite_element; + + if (!pq_delete_min(curr->pq, &id, &val, &element)) { + return; + } + pq_check(curr->pq); + opposite_element=GPOINTER_TO_INT(g_hash_table_lookup(opposite->hash, id)); + if (opposite_element && pq_is_deleted(opposite->pq, opposite_element)) { + int opposite_val; + pq_get_key(opposite->pq, opposite_element, &opposite_val); + if (val+opposite_val < curr->upper) { + curr->upper=opposite->upper=val+opposite_val; + printf("%d path found: 0x%x,0x%x ub = %d\n",curr->dir,id->id_hi,id->id_lo,curr->upper); + curr->via=opposite->via=id; + } + } + if (pq_get_stalled(curr->pq, element)) + return; + item=map_rect_get_item_byid(mr[0], id->id_hi, id->id_lo); + while (item_attr_get(item, attr_ch_edge, &edge_attr)) { + struct ch_edge *edge=edge_attr.u.data; + struct item_id *target_id=&edge->target; + int element; + if (routech_edge_valid(edge, curr->dir)) { + int index=GPOINTER_TO_INT(g_hash_table_lookup(curr->hash, target_id)); + if (index && routech_edge_valid(edge, 1-curr->dir)) { + int newkey,stallkey; + stallkey=pq_get_stalled(curr->pq, index); + if (stallkey) + newkey=stallkey; + else + pq_get_key(curr->pq, index, &newkey); + newkey+=edge->weight; + if (newkey < val) { + routech_stall(mr[1], curr, id, newkey); + return; + } + } + element=routech_insert_node(curr, &target_id, edge->weight+val); + if (element) { + pq_set_parent(curr->pq, element, id, 0); + } + } + } +} + +static void +routech_print_coord(struct coord *c, FILE *out) +{ + int x=c->x; + int y=c->y; + char *sx=""; + char *sy=""; + if (x < 0) { + sx="-"; + x=-x; + } + if (y < 0) { + sy="-"; + y=-y; + } + fprintf(out,"%s0x%x %s0x%x\n",sx,x,sy,y); +} + +static void +routech_resolve_route(struct map_rect *mr, struct item_id *id, int flags, int dir) +{ + int i,count,max=16384; + struct coord *ca=g_alloca(sizeof(struct coord)*(max)); + struct item *item; + int rev=0; + if (!(flags & 8) == dir) + rev=1; + item=map_rect_get_item_byid(mr, id->id_hi, id->id_lo); + dbg_assert(item->type >= type_line && item->type < type_area); + item->type=type_street_route; + + count=item_coord_get(item, ca, max); + item_dump_attr(item, item->map, routefile); + fprintf(routefile,"debug=\"flags=%d dir=%d rev=%d\"",flags,dir,rev); + fprintf(routefile,"\n"); + if (rev) { + for (i = count-1 ; i >= 0 ; i--) + routech_print_coord(&ca[i], routefile); + } else { + for (i = 0 ; i < count ; i++) + routech_print_coord(&ca[i], routefile); + } +} + +static int +routech_find_edge(struct map_rect *mr, struct item_id *from, struct item_id *to, struct item_id *middle) +{ + struct item *item=map_rect_get_item_byid(mr, from->id_hi, from->id_lo); + struct attr edge_attr; + dbg_assert(item->type == type_ch_node); + dbg(1,"type %s\n",item_to_name(item->type)); + dbg(1,"segment item=%p\n",item); + while (item_attr_get(item, attr_ch_edge, &edge_attr)) { + struct ch_edge *edge=edge_attr.u.data; + dbg(1,"flags=%d\n",edge->flags); + if (edge->target.id_hi == to->id_hi && edge->target.id_lo == to->id_lo) { + *middle=edge->middle; + return edge->flags; + } + } + dbg(0,"** not found\n"); + return 0; +} + +static void +routech_resolve(struct map_rect *mr, struct item_id *from, struct item_id *to, int dir) +{ + struct item_id middle_node; + int res; + if (dir) + res=routech_find_edge(mr, to, from, &middle_node); + else + res=routech_find_edge(mr, from, to, &middle_node); + dbg(1,"res=%d\n",res); + if (res & 4) { + routech_resolve(mr, from, &middle_node, 1); + routech_resolve(mr, &middle_node, to, 0); + } else + routech_resolve_route(mr, &middle_node, res, dir); +} + +static void +routech_find_path(struct map_rect *mr, struct routech_search *search) +{ + struct item_id *curr_node=search->via; + GList *i,*n,*list=NULL; + dbg(1,"node %p\n",curr_node); + for (;;) { + int element=GPOINTER_TO_INT(g_hash_table_lookup(search->hash, curr_node)); + struct item_id *next_node=pq_get_parent_node_id(search->pq,element); + if (search->dir) + list=g_list_append(list, curr_node); + else + list=g_list_prepend(list, curr_node); + dbg(1,"element %d\n",element); + dbg(1,"next node %p\n",next_node); + if (!next_node) + break; + curr_node=next_node; + } + i=list; + while (i && (n=g_list_next(i))) { + routech_resolve(mr, i->data, n->data, search->dir); + i=n; + } +} + +void +routech_test(struct navit *navit) +{ + struct attr mapset; + struct coord src={0x3fd661,0x727146}; + struct coord dst={0xfff07fc2,0x4754c9}; + struct item_id id[2],*id_ptr; + struct routech_search *search[2],*curr,*opposite; + struct map *map[2]; + struct map_rect *mr[2]; + int element; + int k; + int search_id=0; + int i; + + navit_get_attr(navit, attr_mapset, &mapset, NULL); + routech_find_nearest(mapset.u.mapset, &src, &id[0], &map[0]); + routech_find_nearest(mapset.u.mapset, &dst, &id[1], &map[1]); + for (k = 0 ; k < 2 ; k++) { + profile(0,"start\n"); + search[0]=routech_search_new(0); + search[1]=routech_search_new(1); + printf("Start 0x%x,0x%x\n",id[0].id_hi,id[0].id_lo); + printf("End 0x%x,0x%x\n",id[1].id_hi,id[1].id_lo); + id_ptr=&id[0]; + element=routech_insert_node(search[0], &id_ptr, 0); + pq_set_parent(search[0]->pq, element, NULL, 0); + + id_ptr=&id[1]; + element=routech_insert_node(search[1], &id_ptr, 0); + pq_set_parent(search[1]->pq, element, NULL, 0); + + mr[0]=map_rect_new(map[0], NULL); + mr[1]=map_rect_new(map[0], NULL); + for (i=0 ; i < 5000 ; i++) { + if (pq_is_empty(search[0]->pq) && pq_is_empty(search[1]->pq)) + break; + if (!pq_is_empty(search[1-search_id]->pq)) { + search_id=1-search_id; + } + if (search[0]->finished) + search_id=1; + if (search[1]->finished) + search_id=0; + curr=search[search_id]; + opposite=search[1-search_id]; + if (pq_is_empty(curr->pq)) { + dbg(0,"empty\n"); + break; + } + routech_relax(mr, curr, opposite); + if (pq_min(curr->pq) > curr->upper) { + dbg(0,"min %d upper %d\n",pq_min(curr->pq), curr->upper); + curr->finished=1; + } + if (curr->finished && opposite->finished) { + dbg(0,"finished\n"); + break; + } + } + + printf("finished %d\n",search[0]->upper); + profile(0,"finished\n"); + } + routefile=fopen("route.txt","w"); + routech_find_path(mr[0], search[0]); + routech_find_path(mr[0], search[1]); + fclose(routefile); + printf("Heap size %d vs %d\n",search[0]->pq->size,search[1]->pq->size); + printf("Element size %d vs %d\n",search[0]->pq->elements_size,search[1]->pq->elements_size); + +} diff --git a/navit/search.c b/navit/search.c new file mode 100644 index 0000000..1a26dab --- /dev/null +++ b/navit/search.c @@ -0,0 +1,1195 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include "debug.h" +#include "projection.h" +#include "item.h" +#include "map.h" +#include "mapset.h" +#include "coord.h" +#include "transform.h" +#include "search.h" +#include "country.h" + +#if HAVE_API_ANDROID +#include "android.h" +#endif +#include "layout.h" + +struct search_list_level { + struct mapset *ms; + struct search_list_common *parent; + struct attr *attr; + int partial; + int selected; + struct mapset_search *search; + GHashTable *hash; + GList *list,*curr,*last; +}; + +struct interpolation { + int side, mode, rev; + char *first, *last, *curr; +}; + +struct search_list { + struct mapset *ms; + struct item *item; + int level; + struct search_list_level levels[4]; + struct search_list_result result; + struct search_list_result last_result; + int last_result_valid; + char *postal; + struct interpolation inter; +}; + +static guint +search_item_hash_hash(gconstpointer key) +{ + const struct item *itm=key; + gconstpointer hashkey=(gconstpointer)GINT_TO_POINTER(itm->id_hi^itm->id_lo); + return g_direct_hash(hashkey); +} + +static gboolean +search_item_hash_equal(gconstpointer a, gconstpointer b) +{ + const struct item *itm_a=a; + const struct item *itm_b=b; + if (item_is_equal_id(*itm_a, *itm_b)) + return TRUE; + return FALSE; +} + +/** + * @brief Create new instance of search_list to run a search. + * + * @param ms mapset that is to be searched + * @returns new search_list + */ +struct search_list * +search_list_new(struct mapset *ms) +{ + struct search_list *ret; + + ret=g_new0(struct search_list, 1); + ret->ms=ms; + + return ret; +} + +static void search_list_search_free(struct search_list *sl, int level); + +/** + * @brief Determine search list level for given attr_type. + * @param attr_type attribute value + * @return corresponding search list level (country=0, town=1, ...) + */ +static int +search_list_level(enum attr_type attr_type) +{ + switch(attr_type) { + case attr_country_all: + case attr_country_id: + case attr_country_iso2: + case attr_country_iso3: + case attr_country_car: + case attr_country_name: + return 0; + case attr_town_postal: + return 1; + case attr_town_name: + case attr_district_name: + case attr_town_or_district_name: + return 1; + case attr_street_name: + return 2; + case attr_house_number: + return 3; + case attr_postal: + return -1; + default: + dbg(0,"unknown search '%s'\n",attr_to_name(attr_type)); + return -1; + } +} + +static void +interpolation_clear(struct interpolation *inter) +{ + inter->mode=inter->side=0; + g_free(inter->first); + g_free(inter->last); + g_free(inter->curr); + inter->first=inter->last=inter->curr=NULL; +} + +/** + * @brief Start a search. + * + * @param this search_list to use for the search + * @param search_attr attributes to use for the search + * @param partial do partial search? (1=yes,0=no) + */ +void +search_list_search(struct search_list *this_, struct attr *search_attr, int partial) +{ + struct search_list_level *le; + int level=search_list_level(search_attr->type); + this_->item=NULL; + interpolation_clear(&this_->inter); + //dbg(0,"level=%d\n", level); + if (level != -1) { + this_->result.id=0; + this_->level=level; + le=&this_->levels[level]; + search_list_search_free(this_, level); + le->attr=attr_dup(search_attr); + le->partial=partial; + if (level > 0) { + le=&this_->levels[level-1]; + le->curr=le->list; + } + //dbg(0,"le=%p partial=%d\n", le, partial); + } else if (search_attr->type == attr_postal) { + g_free(this_->postal); + this_->postal=g_strdup(search_attr->u.str); + } +} + +struct search_list_common * +search_list_select(struct search_list *this_, enum attr_type attr_type, int id, int mode) +{ + int level=search_list_level(attr_type); + int num=0; + struct search_list_level *le; + struct search_list_common *slc; + GList *curr; + le=&this_->levels[level]; + curr=le->list; + if (mode > 0 || !id) + le->selected=mode; + //dbg(0,"enter level=%d %d %d %p\n", level, id, mode, curr); + while (curr) { + num++; + if (! id || num == id) { + slc=curr->data; + slc->selected=mode; + if (id) { + le->last=curr; + //dbg(0,"found\n"); + return slc; + } + } + curr=g_list_next(curr); + } + //dbg(0,"not found\n"); + return NULL; +} + +static void +search_list_common_new(struct item *item, struct search_list_common *common) +{ + struct attr attr; + if (item_attr_get(item, attr_town_name, &attr)) + common->town_name=map_convert_string(item->map, attr.u.str); + else + common->town_name=NULL; + if (item_attr_get(item, attr_county_name, &attr)) + common->county_name=map_convert_string(item->map, attr.u.str); + else + common->county_name=NULL; + if (item_attr_get(item, attr_district_name, &attr)) + common->district_name=map_convert_string(item->map, attr.u.str); + else + common->district_name=NULL; + if (item_attr_get(item, attr_postal, &attr)) + common->postal=map_convert_string(item->map, attr.u.str); + else if (item_attr_get(item, attr_town_postal, &attr)) + common->postal=map_convert_string(item->map, attr.u.str); + else + common->postal=NULL; + if (item_attr_get(item, attr_postal_mask, &attr)) + common->postal_mask=map_convert_string(item->map, attr.u.str); + else + common->postal_mask=NULL; +} + +static void +search_list_common_destroy(struct search_list_common *common) +{ + map_convert_free(common->town_name); + map_convert_free(common->district_name); + map_convert_free(common->county_name); + map_convert_free(common->postal); + map_convert_free(common->postal_mask); +} + +static struct search_list_country * +search_list_country_new(struct item *item) +{ + struct search_list_country *ret=g_new0(struct search_list_country, 1); + struct attr attr; + + ret->common.item=ret->common.unique=*item; + if (item_attr_get(item, attr_country_car, &attr)) + ret->car=g_strdup(attr.u.str); + if (item_attr_get(item, attr_country_iso2, &attr)) { +#if HAVE_API_ANDROID + ret->iso2=g_malloc(strlen(attr.u.str)+1); + strtolower(ret->iso2, attr.u.str); +#else + ret->iso2=g_strdup(attr.u.str); +#endif + ret->flag=g_strdup_printf("country_%s", ret->iso2); + } + if (item_attr_get(item, attr_country_iso3, &attr)) + ret->iso3=g_strdup(attr.u.str); + if (item_attr_get(item, attr_country_name, &attr)) + ret->name=g_strdup(attr.u.str); + return ret; +} + +static void +search_list_country_destroy(struct search_list_country *this_) +{ + g_free(this_->car); + g_free(this_->iso2); + g_free(this_->iso3); + g_free(this_->flag); + g_free(this_->name); + g_free(this_); +} + +static struct search_list_town * +search_list_town_new(struct item *item) +{ + struct search_list_town *ret=g_new0(struct search_list_town, 1); + struct attr attr; + struct coord c; + + ret->itemt=*item; + ret->common.item=ret->common.unique=*item; + if (item_attr_get(item, attr_town_streets_item, &attr)) { + dbg(1,"town_assoc 0x%x 0x%x\n", attr.u.item->id_hi, attr.u.item->id_lo); + ret->common.unique=*attr.u.item; + } + search_list_common_new(item, &ret->common); + if (item_attr_get(item, attr_county_name, &attr)) + ret->county=map_convert_string(item->map,attr.u.str); + else + ret->county=NULL; + if (item_coord_get(item, &c, 1)) { + ret->common.c=g_new(struct pcoord, 1); + ret->common.c->x=c.x; + ret->common.c->y=c.y; + ret->common.c->pro = map_projection(item->map); + } + return ret; +} + +static void +search_list_town_destroy(struct search_list_town *this_) +{ + map_convert_free(this_->county); + search_list_common_destroy(&this_->common); + if (this_->common.c) + g_free(this_->common.c); + g_free(this_); +} + + +static struct search_list_street * +search_list_street_new(struct item *item) +{ + struct search_list_street *ret=g_new0(struct search_list_street, 1); + struct attr attr; + struct coord c; + + ret->common.item=ret->common.unique=*item; + if (item_attr_get(item, attr_street_name, &attr)) + ret->name=map_convert_string(item->map, attr.u.str); + else + ret->name=NULL; + search_list_common_new(item, &ret->common); + if (item_coord_get(item, &c, 1)) { + ret->common.c=g_new(struct pcoord, 1); + ret->common.c->x=c.x; + ret->common.c->y=c.y; + ret->common.c->pro = map_projection(item->map); + } + return ret; +} + + +static void +search_list_street_destroy(struct search_list_street *this_) +{ + map_convert_free(this_->name); + search_list_common_destroy(&this_->common); + if (this_->common.c) + { + g_free(this_->common.c); + } + g_free(this_); +} + +static char * +search_interpolate(struct interpolation *inter) +{ + dbg(1,"interpolate %s-%s %s\n",inter->first,inter->last,inter->curr); + if (!inter->first || !inter->last) + return NULL; + if (!inter->curr) + inter->curr=g_strdup(inter->first); + else { + if (strcmp(inter->curr, inter->last)) { + int next=atoi(inter->curr)+(inter->mode?2:1); + g_free(inter->curr); + if (next == atoi(inter->last)) + inter->curr=g_strdup(inter->last); + else + inter->curr=g_strdup_printf("%d",next); + } else { + g_free(inter->curr); + inter->curr=NULL; + } + } + dbg(1,"interpolate result %s\n",inter->curr); + return inter->curr; +} + +static void +search_interpolation_split(char *str, struct interpolation *inter) +{ + char *pos=strchr(str,'-'); + char *first,*last; + int len; + if (!pos) { + inter->first=g_strdup(str); + inter->last=g_strdup(str); + inter->rev=0; + return; + } + len=pos-str; + first=g_malloc(len+1); + strncpy(first, str, len); + first[len]='\0'; + last=g_strdup(pos+1); + dbg(1,"%s = %s - %s\n",str, first, last); + if (atoi(first) > atoi(last)) { + inter->first=last; + inter->last=first; + inter->rev=1; + } else { + inter->first=first; + inter->last=last; + inter->rev=0; + } +} + +static int +search_setup_interpolation(struct item *item, enum attr_type i0, enum attr_type i1, enum attr_type i2, struct interpolation *inter) +{ + struct attr attr; + g_free(inter->first); + g_free(inter->last); + g_free(inter->curr); + inter->first=inter->last=inter->curr=NULL; + dbg(1,"setup %s\n",attr_to_name(i0)); + if (item_attr_get(item, i0, &attr)) { + search_interpolation_split(attr.u.str, inter); + inter->mode=0; + } else if (item_attr_get(item, i1, &attr)) { + search_interpolation_split(attr.u.str, inter); + inter->mode=1; + } else if (item_attr_get(item, i2, &attr)) { + search_interpolation_split(attr.u.str, inter); + inter->mode=2; + } else + return 0; + return 1; +} + +static int +search_match(char *str, char *search, int partial) +{ + if (!partial) + return (!g_strcasecmp(str, search)); + else + return (!g_strncasecmp(str, search, strlen(search))); +} + +static struct pcoord * +search_house_number_coordinate(struct item *item, struct interpolation *inter) +{ + struct pcoord *ret=g_new(struct pcoord, 1); + ret->pro = map_projection(item->map); + dbg(0,"%s\n",item_to_name(item->type)); + if (item->typetype>type_house_number_interpolation_alphabetic) { + struct coord c; + if (item_coord_get(item, &c, 1)) { + ret->x=c.x; + ret->y=c.y; + } else { + g_free(ret); + ret=NULL; + } + } else { + int count,max=1024; + int hn_pos,hn_length; + struct coord *c=g_alloca(sizeof(struct coord)*max); + item_coord_rewind(item); + count=item_coord_get(item, c, max); + hn_length=atoi(inter->last)-atoi(inter->first); + if (inter->rev) + hn_pos=atoi(inter->last)-atoi(inter->curr); + else + hn_pos=atoi(inter->curr)-atoi(inter->first); + if (count) { + int i,distance_sum=0,hn_distance; + int *distances=g_alloca(sizeof(int)*(count-1)); + dbg(1,"count=%d hn_length=%d hn_pos=%d (%s of %s-%s)\n",count,hn_length,hn_pos,inter->curr,inter->first,inter->last); + if (!hn_length) { + hn_length=2; + hn_pos=1; + } + if (count == max) + dbg(0,"coordinate overflow\n"); + for (i = 0 ; i < count-1 ; i++) { + distances[i]=navit_sqrt(transform_distance_sq(&c[i],&c[i+1])); + distance_sum+=distances[i]; + dbg(1,"distance[%d]=%d\n",i,distances[i]); + } + dbg(1,"sum=%d\n",distance_sum); + hn_distance=distance_sum*hn_pos/hn_length; + dbg(1,"hn_distance=%d\n",hn_distance); + i=0; + while (i < count-1 && hn_distance > distances[i]) + hn_distance-=distances[i++]; + dbg(1,"remaining distance=%d from %d\n",hn_distance,distances[i]); + ret->x=(c[i+1].x-c[i].x)*hn_distance/distances[i]+c[i].x; + ret->y=(c[i+1].y-c[i].y)*hn_distance/distances[i]+c[i].y; + g_free(distances); + } + g_free(c); + } + return ret; +} + +static struct search_list_house_number * +search_list_house_number_new(struct item *item, struct interpolation *inter, char *inter_match, int inter_partial) +{ + struct search_list_house_number *ret=g_new0(struct search_list_house_number, 1); + struct attr attr; + char *hn; + + ret->common.item=ret->common.unique=*item; + //if (item_attr_get(item, attr_street_name, &attr)) + // dbg(0,"xx1 %s\n",attr.u.str); + if (item_attr_get(item, attr_house_number, &attr)) + ret->house_number=map_convert_string(item->map, attr.u.str); + else { + //if (item_attr_get(item, attr_street_name, &attr)) + // dbg(0,"xx2 %s\n",attr.u.str); + for (;;) { + //dbg(0,"interpolate 11"); + ret->interpolation=1; + switch(inter->side) { + case 0: + //dbg(0,"interpolate 11 0"); + inter->side=-1; + search_setup_interpolation(item, attr_house_number_left, attr_house_number_left_odd, attr_house_number_left_even, inter); + case -1: + //dbg(0,"interpolate 11 -1"); + if ((hn=search_interpolate(inter))) + break; + inter->side=1; + search_setup_interpolation(item, attr_house_number_right, attr_house_number_right_odd, attr_house_number_right_even, inter); + case 1: + //dbg(0,"interpolate 11 1"); + if ((hn=search_interpolate(inter))) + break; + default: + //dbg(0,"interpolate 11 default"); + g_free(ret); + return NULL; + } + if (search_match(hn, inter_match, inter_partial)) + { + //dbg(0,"interpolate 22"); + //dbg(0,"match %s %s-%s\n",hn, inter->first, inter->last); + ret->house_number=map_convert_string(item->map, hn); + break; + } + } + } + //dbg(0,"interpolate 33"); + search_list_common_new(item, &ret->common); + ret->common.c=search_house_number_coordinate(item, ret->interpolation?inter:NULL); + //dbg(0,"interpolate 44"); + return ret; +} + +static void +search_list_house_number_destroy(struct search_list_house_number *this_) +{ + map_convert_free(this_->house_number); + search_list_common_destroy(&this_->common); + if (this_->common.c) + g_free(this_->common.c); + g_free(this_); +} + +static void +search_list_result_destroy(int level, void *p) +{ + switch (level) { + case 0: + search_list_country_destroy(p); + break; + case 1: + search_list_town_destroy(p); + break; + case 2: + search_list_street_destroy(p); + break; + case 3: + search_list_house_number_destroy(p); + break; + } +} + +static void +search_list_search_free(struct search_list *sl, int level) +{ + struct search_list_level *le=&sl->levels[level]; + GList *next,*curr; + if (le->search) + { + mapset_search_destroy(le->search); + le->search=NULL; + } +#if 0 /* FIXME */ + if (le->hash) { + g_hash_table_destroy(le->hash); + le->hash=NULL; + } +#endif + curr=le->list; + while (curr) + { + search_list_result_destroy(level, curr->data); + next=g_list_next(curr); + curr=next; + } + attr_free(le->attr); + g_list_free(le->list); + le->list=NULL; + le->curr=NULL; + le->last=NULL; +} + +char * +search_postal_merge(char *mask, char *new) +{ + int i; + char *ret=NULL; + dbg(1,"enter %s %s\n", mask, new); + if (!new) + return NULL; + if (!mask) + return g_strdup(new); + i=0; + while (mask[i] && new[i]) { + if (mask[i] != '.' && mask[i] != new[i]) + break; + i++; + + } + if (mask[i]) { + ret=g_strdup(mask); + while (mask[i]) + ret[i++]='.'; + } + dbg(1,"merged %s with %s as %s\n", mask, new, ret); + return ret; +} + +char * +search_postal_merge_replace(char *mask, char *new) +{ + char *ret=search_postal_merge(mask, new); + if (!ret) + return mask; + g_free(mask); + return ret; +} + + +static int +postal_match(char *postal, char *mask) +{ + for (;;) { + if ((*postal != *mask) && (*mask != '.')) + return 0; + if (!*postal) { + if (!*mask) + return 1; + else + return 0; + } + postal++; + mask++; + } +} + +static int +search_add_result(struct search_list_level *le, struct search_list_common *slc) +{ + struct search_list_common *slo; + char *merged; + slo=g_hash_table_lookup(le->hash, &slc->unique); + if (!slo) { + g_hash_table_insert(le->hash, &slc->unique, slc); + if (slc->postal && !slc->postal_mask) { + slc->postal_mask=g_strdup(slc->postal); + } + le->list=g_list_append(le->list, slc); + return 1; + } + merged=search_postal_merge(slo->postal_mask, slc->postal); + if (merged) { + g_free(slo->postal_mask); + slo->postal_mask=merged; + } + return 0; +} + +/** + * @brief Get (next) result from a search. + * + * @param this_ search_list representing the search + * @return next result + */ +struct search_list_result * +search_list_get_result(struct search_list *this_) +{ + struct search_list_level *le,*leu; + int level=this_->level; + struct attr attr2; + int has_street_name=0; + + //dbg(0,"enter\n"); + le=&this_->levels[level]; + //dbg(0,"le=%p\n", le); + for (;;) + { + //dbg(0,"le->search=%p\n", le->search); + if (! le->search) + { + //dbg(0,"partial=%d level=%d\n", le->partial, level); + if (! level) + le->parent=NULL; + else + { + leu=&this_->levels[level-1]; + //dbg(0,"leu->curr=%p\n", leu->curr); + for (;;) + { + //dbg(0,"*********########"); + + struct search_list_common *slc; + if (! leu->curr) + { + return NULL; + } + le->parent=leu->curr->data; + leu->last=leu->curr; + leu->curr=g_list_next(leu->curr); + slc=(struct search_list_common *)(le->parent); + if (!slc) + break; + if (slc->selected == leu->selected) + break; + } + } + if (le->parent) + { + //dbg(0,"mapset_search_new with item(%d,%d)\n", le->parent->item.id_hi, le->parent->item.id_lo); + } + //dbg(0,"############## attr=%s\n", attr_to_name(le->attr->type)); + le->search=mapset_search_new(this_->ms, &le->parent->item, le->attr, le->partial); + le->hash=g_hash_table_new(search_item_hash_hash, search_item_hash_equal); + } + //dbg(0,"le->search=%p\n", le->search); + if (!this_->item) + { + //dbg(0,"sssss 1"); + this_->item=mapset_search_get_item(le->search); + //dbg(0,"sssss 1 %p\n",this_->item); + } + if (this_->item) + { + void *p=NULL; + //dbg(0,"id_hi=%d id_lo=%d\n", this_->item->id_hi, this_->item->id_lo); + if (this_->postal) + { + struct attr postal; + if (item_attr_get(this_->item, attr_postal_mask, &postal)) { + if (!postal_match(this_->postal, postal.u.str)) + continue; + } else if (item_attr_get(this_->item, attr_postal, &postal)) { + if (strcmp(this_->postal, postal.u.str)) + continue; + } + } + this_->result.country=NULL; + this_->result.town=NULL; + this_->result.street=NULL; + this_->result.c=NULL; + //dbg(0,"case x LEVEL start %d\n",level); + switch (level) + { + case 0: + //dbg(0,"case 0 COUNTRY"); + p=search_list_country_new(this_->item); + this_->result.country=p; + this_->result.country->common.parent=NULL; + this_->item=NULL; + break; + case 1: + //dbg(0,"case 1 TOWN"); + p=search_list_town_new(this_->item); + this_->result.town=p; + this_->result.town->common.parent=this_->levels[0].last->data; + this_->result.country=this_->result.town->common.parent; + this_->result.c=this_->result.town->common.c; + this_->item=NULL; + break; + case 2: + //dbg(0,"case 2 STREET"); + p=search_list_street_new(this_->item); + this_->result.street=p; + this_->result.street->common.parent=this_->levels[1].last->data; + this_->result.town=this_->result.street->common.parent; + this_->result.country=this_->result.town->common.parent; + this_->result.c=this_->result.street->common.c; + this_->item=NULL; + break; + case 3: + dbg(1,"case 3 HOUSENUMBER\n"); + has_street_name=0; + + // if this housenumber has a streetname tag, set the name now + if (item_attr_get(this_->item, attr_street_name, &attr2)) + { + dbg(1,"streetname: %s\n",attr2.u.str); + has_street_name=1; + } + + p=search_list_house_number_new(this_->item, &this_->inter, le->attr->u.str, le->partial); + if (!p) + { + interpolation_clear(&this_->inter); + this_->item=NULL; + continue; + } + + this_->result.house_number=p; + if (!this_->result.house_number->interpolation) + { + this_->item=NULL; + } else { + dbg(0,"interpolation!\n"); + } + + if(le->parent && has_street_name) { + struct search_list_street *street=this_->levels[level-1].last->data; + char *s1,*s2; + int cmpres; + s1=g_utf8_casefold(street->name,-1); + s2=g_utf8_casefold(attr2.u.str,-1); + cmpres=strcmp(s1,s2); + dbg(1,"Compared %s with %s, got %d\n",s1,s2,cmpres); + g_free(s1); + g_free(s2); + if(cmpres) { + search_list_house_number_destroy(p); + //this_->item=NULL; + continue; + } + } + + + this_->result.house_number->common.parent=this_->levels[2].last->data; + this_->result.street=this_->result.house_number->common.parent; + this_->result.town=this_->result.street->common.parent; + this_->result.country=this_->result.town->common.parent; + this_->result.c=this_->result.house_number->common.c; + + if(!has_street_name) { + static struct search_list_street null_street; + this_->result.street=&null_street; + } + } + if (p) + { + if (search_add_result(le, p)) + { + this_->result.id++; + return &this_->result; + } + else + { + search_list_result_destroy(level, p); + } + } + } else { + mapset_search_destroy(le->search); + le->search=NULL; + g_hash_table_destroy(le->hash); + if (! level) + break; + } + } + return NULL; +} + +void +search_list_destroy(struct search_list *this_) +{ + g_free(this_->postal); + g_free(this_); +} + +void +search_init(void) +{ +} + + +static char * +search_fix_spaces(const char *str) +{ + int i; + int len=strlen(str); + char c,*s,*d,*ret=g_strdup(str); + + for (i = 0 ; i < len ; i++) { + if (ret[i] == ',' || ret[i] == ',' || ret[i] == '/') + ret[i]=' '; + } + s=ret; + d=ret; + len=0; + do { + c=*s++; + if (c != ' ' || len != 0) { + *d++=c; + len++; + } + while (c == ' ' && *s == ' ') + s++; + if (c == ' ' && *s == '\0') { + d--; + len--; + } + } while (c); + return ret; +} + +static GList * +search_split_phrases(char *str) +{ + char *tmp,*s,*d; + GList *ret=NULL; + s=str; + do { + tmp=g_strdup(s); + d=tmp+strlen(s)-1; + ret=g_list_append(ret, g_strdup(s)); + while (d >= tmp) { + if (*d == ' ') { + *d = '\0'; + ret=g_list_append(ret, g_strdup(tmp)); + } + d--; + } + g_free(tmp); + do { + s++; + if (*s == ' ') { + s++; + break; + } + } while (*s != '\0'); + } while (*s != '\0'); + return ret; +} + +static GList * +search_address_housenumber_real(GList *result_list, struct search_list *sl, char *street_name, GList *phrases, GList *exclude1, GList *exclude2, GList *exclude3, int partial, struct jni_object *jni) +{ + // here we search actually for the housenumber + struct search_list_result *slr; + struct coord_geo g; + struct coord c; + + dbg(1,"street:%s\n",street_name); + while ((slr=search_list_get_result(sl))) + { + // does the streetname of the housenumber match the street we want? + if (slr->street != NULL) + if ((street_name != NULL)&&(slr->street->name != NULL)) + { + //dbg(0,"ffffff 1.1 %s %s",street_name,slr->street->name); + if (strcmp(slr->street->name, street_name)==0) + { + char *buffer; + // coords of result + c.x=slr->house_number->common.c->x; + c.y=slr->house_number->common.c->y; + transform_to_geo(slr->house_number->common.c->pro, &c, &g); + //dbg(0,"g=%f %f\n",g.lat,g.lng); + //dbg(0,"###### Result with housenumber: streetname=%s\n",slr->street->name); + //dbg(0,"###### Result with housenumber: %s %s(%s) %s %s\n",slr->house_number->common.postal,slr->house_number->common.town_name, slr->house_number->common.district_name,slr->street->name,slr->house_number->house_number); + // SHN -> street with house number + // return a string like: "SHN:H111L5555:16.766:48.76:full address name is at the end" + // ca. 9 chars : ca. 9 chars : max. 100 max. 100 max. 100 max. 15 chars -> this sould be max. about 335 chars long + if (slr->town->common.postal == NULL) + { + buffer=g_strdup_printf("SHN:H%dL%d:%f:%f:%.101s, %.101s, %.101s %.15s",slr->street->common.item.id_hi,slr->street->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.town_name,slr->street->name,slr->house_number->house_number); + } + else + { + buffer=g_strdup_printf("SHN:H%dL%d:%f:%f:%.101s, %.7s %.101s, %.101s %.15s",slr->street->common.item.id_hi,slr->street->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.postal,slr->town->common.town_name,slr->street->name,slr->house_number->house_number); + } + // deactivated now * result_list=g_list_prepend(result_list,g_strdup(buffer)); +#ifdef HAVE_API_ANDROID + // return results to android as they come in ... + android_return_search_result(jni,buffer); +#endif + g_free(buffer); + } + } + + } + return result_list; +} + +static GList * +search_address_housenumber(GList *result_list, struct search_list *sl, GList *phrases, GList *exclude1, GList *exclude2, GList *exclude3, int partial, struct jni_object *jni) +{ + // title is wrong + // this is actually "street search" and "housenumber search" is at the bottom of this function + // + // housenumbers are not found as of now (2011-02-28) + // + + //dbg(0,"enter\n"); + struct search_list_result *slr; + GList *tmp=phrases; + int count=0; + struct attr attr; + struct coord_geo g; + struct coord c; + struct attr attr2; + attr.type=attr_street_name; + while ((slr=search_list_get_result(sl))) + { + char *buffer; + //dbg(0,"%p %p\n",slr->country,slr->town); + //dbg(0,"%p\n",slr->street); + // dbg(0,"###### Result without housenumber: country=%s country_name=%s town=%s street=%s\n",slr->country->iso2,slr->country->name,slr->town->common.town_name,slr->street->name); + //dbg(0,"###### Result without housenumber: postal:%s\n",slr->town->common.postal); + //dbg(0,"###### Result without housenumber: postal_mask:%s\n",slr->town->common.postal_mask); + //dbg(0,"###### Result without housenumber: STR postal:%s\n",slr->street->common.postal); + //dbg(0,"###### Result without housenumber: STR postal_mask:%s\n",slr->street->common.postal_mask); + //dbg(0,"###### Result without housenumber: item id_hi:%d id_lo:%d\n",slr->street->common.item.id_hi,slr->street->common.item.id_lo); + + // coords of result + c.x=slr->street->common.c->x; + c.y=slr->street->common.c->y; + transform_to_geo(slr->street->common.c->pro, &c, &g); + //dbg(0,"g=%f %f\n",g.lat,g.lng); + + //dbg(0,"xx1"); + // STR -> street + // return a string like: "STR:H1111L5555:16.766:-48.76:full address name is at the end" + // ca. 9 chars : ca. 9 chars : max. 100 max. 100 max. 100 chars -> this sould be max. about 320 chars long + if (slr->town->common.postal == NULL) + { + buffer=g_strdup_printf("STR:H%dL%d:%f:%f:%.101s,%.101s, %.101s",slr->street->common.item.id_hi,slr->street->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.town_name,slr->street->name); + } + else + { + buffer=g_strdup_printf("STR:H%dL%d:%f:%f:%.101s,%.7s %.101s, %.101s",slr->street->common.item.id_hi,slr->street->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.postal,slr->town->common.town_name,slr->street->name); + } + // deactivated now * result_list=g_list_prepend(result_list,g_strdup(buffer)); + +#ifdef HAVE_API_ANDROID + // return results to android as they come in ... + android_return_search_result(jni,buffer); +#endif + count++; + + while (tmp) + { + if (tmp != exclude1 && tmp != exclude2 && tmp != exclude3 && slr->street) + { + attr2.type=attr_house_number; + attr2.u.str=tmp->data; + search_list_search(sl, &attr2, partial); + //dbg(0,"hn str=%s\n",attr2.u.str); + result_list=search_address_housenumber_real(result_list, sl, slr->street->name, phrases, exclude1, exclude2, exclude3, partial, jni); + } + tmp=g_list_next(tmp); + } + g_free(buffer); + } + if (!count) + { + return result_list; + } + return result_list; +} + +static GList * +search_address_street(GList *result_list, struct search_list *sl, GList *phrases, GList *exclude1, GList *exclude2, int partial, struct jni_object *jni) +{ + // title is wrong + // this is actually "town search" !! + + //dbg(0,"enter\n"); + struct search_list_result *slr; + GList *tmp=phrases; + int count=0; + struct coord_geo g; + struct coord c; + struct attr attr; + attr.type=attr_street_name; + while ((slr=search_list_get_result(sl))) + { + char *buffer; + //dbg(0,"##### sss1"); + // dbg(0,"###### Result town: country=%s country_name=%s town=%s",slr->country->iso2,slr->country->name,slr->town->common.town_name); + // dbg(0,"###### Result town: postal=%s postal_mask=%s",slr->town->common.postal,slr->town->common.postal_mask); + + // coords of result + c.x=slr->town->common.c->x; + c.y=slr->town->common.c->y; + transform_to_geo(slr->town->common.c->pro, &c, &g); + + // TWN -> town + if (slr->town->common.postal == NULL) + { + buffer=g_strdup_printf("TWN:H%dL%d:%f:%f:%.101s, %.101s",slr->town->common.item.id_hi,slr->town->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.town_name); + } + else + { + buffer=g_strdup_printf("TWN:H%dL%d:%f:%f:%.101s, %.7s %.101s",slr->town->common.item.id_hi,slr->town->common.item.id_lo,g.lat,g.lng,slr->country->name,slr->town->common.postal,slr->town->common.town_name); + } + // deactivated now * result_list=g_list_prepend(result_list,g_strdup(buffer)); +#ifdef HAVE_API_ANDROID + // return results to android as they come in ... + android_return_search_result(jni,buffer); +#endif + + +#if 0 + dbg(0,"%s %s %s %s",slr->country->car,slr->town->name,slr->town->district,slr->street->name); +#endif + /* + dbg(0,"%s %s %s\n",slr->country->iso2,slr->town->county,slr->street->name); + struct attr attr77; + if (item_attr_get(&slr->town->itemt, attr_label, &attr77)) + { + dbg(0,"***search result T=%s",attr77.u.str); + } + */ + count++; + g_free(buffer); + } + if (!count) + return result_list; + //dbg(0,"count %d\n",count); + while (tmp) + { + if (tmp != exclude1 && tmp != exclude2) + { + attr.u.str=tmp->data; + search_list_search(sl, &attr, partial); + result_list=search_address_housenumber(result_list, sl, phrases, exclude1, exclude2, tmp, partial, jni); + } + tmp=g_list_next(tmp); + } + return result_list; +} + +static GList * +search_address_town(GList *result_list, struct search_list *sl, GList *phrases, GList *exclude, int partial, struct jni_object *jni) +{ + GList *tmp=phrases; + int count=0; + struct attr attr; + struct search_list_result *slr; + //dbg(0,"enter\n"); + attr.type=attr_town_or_district_name; + while ((slr=search_list_get_result(sl))) + { + count++; + } + if (!count) + return result_list; + //dbg(0,"count %d\n",count); + while (tmp) + { + if (tmp != exclude) + { + attr.u.str=tmp->data; + search_list_search(sl, &attr, partial); + result_list=search_address_street(result_list, sl, phrases, exclude, tmp, partial, jni); + } + tmp=g_list_next(tmp); + } + //dbg(0,"ret"); + return result_list; +} + +GList * +search_by_address(struct search_list *sl, const char *addr, int partial, struct jni_object *jni) +{ + char *str=search_fix_spaces(addr); + GList *phrases=search_split_phrases(str); + GList *ret = NULL; + dbg(0,"enter %s\n",addr); + ret=search_address_town(ret, sl, phrases, NULL, partial, jni); + + g_free(str); + dbg(0,"leave %p\n",ret); + return ret; +} + + diff --git a/navit/search.h b/navit/search.h new file mode 100644 index 0000000..ea017ed --- /dev/null +++ b/navit/search.h @@ -0,0 +1,94 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_SEARCH_H +#define NAVIT_SEARCH_H + +#ifdef __cplusplus +extern "C" { +#endif +struct search_list_common { + void *parent; + struct item unique,item; + int selected; + struct pcoord *c; + char *town_name; + char *district_name; + char *postal; + char *postal_mask; + char *county_name; +}; + +struct search_list_country { + struct search_list_common common; + char *car; + char *iso2; + char *iso3; + char *name; + char *flag; +}; + +struct search_list_town { + struct search_list_common common; + struct item itemt; + char *county; +}; + +struct search_list_street { + struct search_list_common common; + char *name; +}; + +struct search_list_house_number { + struct search_list_common common; + char *house_number; + int interpolation; +}; + +struct search_list_result { + int id; + struct pcoord *c; + struct search_list_country *country; + struct search_list_town *town; + struct search_list_street *street; + struct search_list_house_number *house_number; +}; + +/* prototypes */ +struct attr; +struct mapset; +struct search_list; +struct search_list_result; +struct jni_object; +struct search_list *search_list_new(struct mapset *ms); +void search_list_search(struct search_list *this_, struct attr *search_attr, int partial); +char *search_postal_merge(char *mask, char *new_); +char *search_postal_merge_replace(char *mask, char *new_); +struct search_list_common *search_list_select(struct search_list *this_, enum attr_type attr_type, int id, int mode); +struct search_list_result *search_list_get_result(struct search_list *this_); +void search_list_destroy(struct search_list *this_); +void search_init(void); +GList * search_by_address(struct search_list *this_, const char *addr, int partial, struct jni_object *jni); +/* end of prototypes */ +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/navit/speech.c b/navit/speech.c new file mode 100644 index 0000000..e4bd73f --- /dev/null +++ b/navit/speech.c @@ -0,0 +1,143 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "debug.h" +#include "item.h" +#include "speech.h" +#include "plugin.h" + +struct speech { + struct speech_priv *priv; + struct speech_methods meth; + struct attr **attrs; +}; + + +struct speech * +speech_new(struct attr *parent, struct attr **attrs) +{ + struct speech *this_; + struct speech_priv *(*speech_new)(struct speech_methods *meth, struct attr **attrs, struct attr *parent); + struct attr *attr; + + attr=attr_search(attrs, NULL, attr_type); + if (! attr) { + dbg(0,"type missing\n"); + return NULL; + } + dbg(1,"type='%s'\n", attr->u.str); + speech_new=plugin_get_speech_type(attr->u.str); + dbg(1,"new=%p\n", speech_new); + if (! speech_new) { + dbg(0,"wrong type '%s'\n", attr->u.str); + return NULL; + } + this_=g_new0(struct speech, 1); + this_->priv=speech_new(&this_->meth, attrs, parent); + this_->attrs=attr_list_dup(attrs); + dbg(1, "say=%p\n", this_->meth.say); + dbg(1,"priv=%p\n", this_->priv); + if (! this_->priv) { + attr_list_free(this_->attrs); + g_free(this_); + return NULL; + } + dbg(1,"return %p\n", this_); + + return this_; +} + +void +speech_destroy(struct speech *this_) +{ + this_->meth.destroy(this_->priv); + attr_list_free(this_->attrs); + g_free(this_); +} + +int +speech_say(struct speech *this_, const char *text) +{ + dbg(1, "this_=%p text='%s' calling %p\n", this_, text, this_->meth.say); + return (this_->meth.say)(this_->priv, text); +} + +/** + * @brief Gets an attribute from a speech plugin + * + * @param this_ The speech plugin the attribute should be read from + * @param type The type of the attribute to be read + * @param attr Pointer to an attrib-structure where the attribute should be written to + * @param iter (NOT IMPLEMENTED) Used to iterate through all attributes of a type. Set this to NULL to get the first attribute, set this to an attr_iter to get the next attribute + * @return True if the attribute type was found, false if not + */ + +int +speech_get_attr(struct speech *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); +} + +/** + * @brief Tries to estimate how long it will take to speak a certain string + * + * This function tries to estimate how long it will take to speak a certain string + * passed in str. It relies on the "characters per second"-value passed from the + * configuration. + * + * @param this_ The speech whose speed should be used + * @param str The string that should be estimated + * @return Time in tenth of seconds or -1 on error + */ +int +speech_estimate_duration(struct speech *this_, char *str) +{ + int count; + struct attr cps_attr; + + if (!speech_get_attr(this_,attr_cps,&cps_attr,NULL)) { + return -1; + } + + count = strlen(str); + + return (count * 10) / cps_attr.u.num; +} + +/** + * @brief Sets an attribute from an speech plugin + * + * This sets an attribute of a speech plugin, overwriting an attribute of the same type if it + * already exists. This function also calls all the callbacks that are registred + * to be called when attributes change. + * + * @param this_ The speech plugin to set the attribute of + * @param attr The attribute to set + * @return True if the attr could be set, false otherwise + */ + +int +speech_set_attr(struct speech *this_, struct attr *attr) +{ + this_->attrs=attr_generic_set_attr(this_->attrs, attr); + //callback_list_call_attr_2(this_->attr_cbl, attr->type, this_, attr); + return 1; +} diff --git a/navit/speech.h b/navit/speech.h new file mode 100644 index 0000000..8e4d3d9 --- /dev/null +++ b/navit/speech.h @@ -0,0 +1,42 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_SPEECH_H +#define NAVIT_SPEECH_H + +struct speech_priv; +struct attr_iter; + +struct speech_methods { + void (*destroy)(struct speech_priv *this_); + int (*say)(struct speech_priv *this_, const char *text); +}; + +/* prototypes */ +struct speech * speech_new(struct attr *parent, struct attr **attrs); +int speech_say(struct speech *this_, const char *text); +int speech_sayf(struct speech *this_, const char *format, ...); +void speech_destroy(struct speech *this_); +int speech_get_attr(struct speech *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); +int speech_set_attr(struct speech *this_, struct attr *attr); +int speech_estimate_duration(struct speech *this_, char *str); +/* end of prototypes */ + +#endif + diff --git a/navit/speech/Makefile.am b/navit/speech/Makefile.am new file mode 100644 index 0000000..3c232db --- /dev/null +++ b/navit/speech/Makefile.am @@ -0,0 +1,16 @@ +SUBDIRS= +if SPEECH_ANDROID + SUBDIRS += android +endif +if SPEECH_CMDLINE + SUBDIRS += cmdline +endif +if SPEECH_DBUS + SUBDIRS += dbus +endif +if SPEECH_ESPEAK + SUBDIRS += espeak +endif +if SPEECH_SPEECH_DISPATCHER + SUBDIRS += speech_dispatcher +endif diff --git a/navit/speech/Makefile.in b/navit/speech/Makefile.in new file mode 100644 index 0000000..bbdfa23 --- /dev/null +++ b/navit/speech/Makefile.in @@ -0,0 +1,714 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@SPEECH_ANDROID_TRUE@am__append_1 = android +@SPEECH_CMDLINE_TRUE@am__append_2 = cmdline +@SPEECH_DBUS_TRUE@am__append_3 = dbus +@SPEECH_ESPEAK_TRUE@am__append_4 = espeak +@SPEECH_SPEECH_DISPATCHER_TRUE@am__append_5 = speech_dispatcher +subdir = navit/speech +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = android cmdline dbus espeak speech_dispatcher +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = $(am__append_1) $(am__append_2) $(am__append_3) \ + $(am__append_4) $(am__append_5) +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/speech/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/speech/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/speech/android/Makefile.am b/navit/speech/android/Makefile.am new file mode 100644 index 0000000..c2a0dc3 --- /dev/null +++ b/navit/speech/android/Makefile.am @@ -0,0 +1,17 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=speech_android +if PLUGINS +modulespeech_LTLIBRARIES = libspeech_android.la +else +noinst_LTLIBRARIES = libspeech_android.la +endif +libspeech_android_la_SOURCES = speech_android.c +libspeech_android_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ + + +android: libspeech_android.la + mkdir -p ../../android/libs/armeabi/navit/speech + cp .libs/libspeech_android.so ../../android/libs/armeabi + +push: libspeech_android.la + adb push .libs/libspeech_android.so /data/data/org.navitproject.navit/lib diff --git a/navit/speech/android/Makefile.in b/navit/speech/android/Makefile.in new file mode 100644 index 0000000..58eb9c8 --- /dev/null +++ b/navit/speech/android/Makefile.in @@ -0,0 +1,711 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/speech/android +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulespeechdir)" +LTLIBRARIES = $(modulespeech_LTLIBRARIES) $(noinst_LTLIBRARIES) +libspeech_android_la_LIBADD = +am_libspeech_android_la_OBJECTS = speech_android.lo +libspeech_android_la_OBJECTS = $(am_libspeech_android_la_OBJECTS) +libspeech_android_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libspeech_android_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libspeech_android_la_rpath = +@PLUGINS_TRUE@am_libspeech_android_la_rpath = -rpath \ +@PLUGINS_TRUE@ $(modulespeechdir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libspeech_android_la_SOURCES) +DIST_SOURCES = $(libspeech_android_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=speech_android +@PLUGINS_TRUE@modulespeech_LTLIBRARIES = libspeech_android.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libspeech_android.la +libspeech_android_la_SOURCES = speech_android.c +libspeech_android_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/speech/android/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/speech/android/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulespeechLTLIBRARIES: $(modulespeech_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulespeechdir)" || $(MKDIR_P) "$(DESTDIR)$(modulespeechdir)" + @list='$(modulespeech_LTLIBRARIES)'; test -n "$(modulespeechdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulespeechdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulespeechdir)"; \ + } + +uninstall-modulespeechLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulespeech_LTLIBRARIES)'; test -n "$(modulespeechdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulespeechdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulespeechdir)/$$f"; \ + done + +clean-modulespeechLTLIBRARIES: + -test -z "$(modulespeech_LTLIBRARIES)" || rm -f $(modulespeech_LTLIBRARIES) + @list='$(modulespeech_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libspeech_android.la: $(libspeech_android_la_OBJECTS) $(libspeech_android_la_DEPENDENCIES) + $(libspeech_android_la_LINK) $(am_libspeech_android_la_rpath) $(libspeech_android_la_OBJECTS) $(libspeech_android_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/speech_android.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulespeechdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulespeechLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulespeechLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulespeechLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulespeechLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-modulespeechLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulespeechLTLIBRARIES + + +android: libspeech_android.la + mkdir -p ../../android/libs/armeabi/navit/speech + cp .libs/libspeech_android.so ../../android/libs/armeabi + +push: libspeech_android.la + adb push .libs/libspeech_android.so /data/data/org.navitproject.navit/lib + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/speech/android/speech_android.c b/navit/speech/android/speech_android.c new file mode 100644 index 0000000..d383483 --- /dev/null +++ b/navit/speech/android/speech_android.c @@ -0,0 +1,148 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "config.h" +#include "item.h" +#include "debug.h" +#include "plugin.h" +#include "android.h" +#include "speech.h" + +struct speech_priv { + jclass NavitSpeechClass; + jobject NavitSpeech; + jmethodID NavitSpeech_say; + int flags; +}; + +static int +speech_android_say(struct speech_priv *this, const char *text) +{ + char *str=g_strdup(text); + jstring string; + int i; + + if (this->flags & 2) { + for (i = 0 ; i < strlen(str) ; i++) { + if (str[i] == 0xc3 && str[i+1] == 0x84) { + str[i]='A'; + str[i+1]='e'; + } + if (str[i] == 0xc3 && str[i+1] == 0x96) { + str[i]='O'; + str[i+1]='e'; + } + if (str[i] == 0xc3 && str[i+1] == 0x9c) { + str[i]='U'; + str[i+1]='e'; + } + if (str[i] == 0xc3 && str[i+1] == 0xa4) { + str[i]='a'; + str[i+1]='e'; + } + if (str[i] == 0xc3 && str[i+1] == 0xb6) { + str[i]='o'; + str[i+1]='e'; + } + if (str[i] == 0xc3 && str[i+1] == 0xbc) { + str[i]='u'; + str[i+1]='e'; + } + if (str[i] == 0xc3 && str[i+1] == 0x9f) { + str[i]='s'; + str[i+1]='s'; + } + } + } + string = (*jnienv)->NewStringUTF(jnienv, str); + dbg(0,"enter %s\n",str); + (*jnienv)->CallVoidMethod(jnienv, this->NavitSpeech, this->NavitSpeech_say, string); + (*jnienv)->DeleteLocalRef(jnienv, string); + g_free(str); + + return 1; +} + +static void +speech_android_destroy(struct speech_priv *this) { + g_free(this); +} + +static struct speech_methods speech_android_meth = { + speech_android_destroy, + speech_android_say, +}; + +static int +speech_android_init(struct speech_priv *ret) +{ + jmethodID cid; + char *class="org/navitproject/navit/NavitSpeech2"; + + if (ret->flags & 1) + class="org/navitproject/navit/NavitSpeech"; + + if (!android_find_class_global(class, &ret->NavitSpeechClass)) { + dbg(0,"No class found\n"); + return 0; + } + dbg(0,"at 3\n"); + cid = (*jnienv)->GetMethodID(jnienv, ret->NavitSpeechClass, "", "(Lorg/navitproject/navit/Navit;)V"); + if (cid == NULL) { + dbg(0,"no method found\n"); + return 0; /* exception thrown */ + } + if (!android_find_method(ret->NavitSpeechClass, "say", "(Ljava/lang/String;)V", &ret->NavitSpeech_say)) + return 0; + dbg(0,"at 4 android_activity=%p\n",android_activity); + ret->NavitSpeech=(*jnienv)->NewObject(jnienv, ret->NavitSpeechClass, cid, android_activity); + dbg(0,"result=%p\n",ret->NavitSpeech); + if (!ret->NavitSpeech) + return 0; + if (ret->NavitSpeech) + (*jnienv)->NewGlobalRef(jnienv, ret->NavitSpeech); + return 1; +} + +static struct speech_priv * +speech_android_new(struct speech_methods *meth, struct attr **attrs, struct attr *parent) { + struct speech_priv *this; + struct attr *flags; + *meth=speech_android_meth; + this=g_new0(struct speech_priv,1); + if (android_version < 4) + this->flags=3; + if (!speech_android_init(this)) { + g_free(this); + this=NULL; + } + if ((flags = attr_search(attrs, NULL, attr_flags))) + this->flags=flags->u.num; + + return this; +} + + +void +plugin_init(void) +{ + plugin_register_speech_type("android", speech_android_new); +} diff --git a/navit/speech/cmdline/Makefile.am b/navit/speech/cmdline/Makefile.am new file mode 100644 index 0000000..4597bd9 --- /dev/null +++ b/navit/speech/cmdline/Makefile.am @@ -0,0 +1,9 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=speech_cmdline +if PLUGINS +modulespeech_LTLIBRARIES = libspeech_cmdline.la +else +noinst_LTLIBRARIES = libspeech_cmdline.la +endif +libspeech_cmdline_la_SOURCES = speech_cmdline.c +libspeech_cmdline_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ diff --git a/navit/speech/cmdline/Makefile.in b/navit/speech/cmdline/Makefile.in new file mode 100644 index 0000000..65daf43 --- /dev/null +++ b/navit/speech/cmdline/Makefile.in @@ -0,0 +1,704 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/speech/cmdline +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulespeechdir)" +LTLIBRARIES = $(modulespeech_LTLIBRARIES) $(noinst_LTLIBRARIES) +libspeech_cmdline_la_LIBADD = +am_libspeech_cmdline_la_OBJECTS = speech_cmdline.lo +libspeech_cmdline_la_OBJECTS = $(am_libspeech_cmdline_la_OBJECTS) +libspeech_cmdline_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libspeech_cmdline_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libspeech_cmdline_la_rpath = +@PLUGINS_TRUE@am_libspeech_cmdline_la_rpath = -rpath \ +@PLUGINS_TRUE@ $(modulespeechdir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libspeech_cmdline_la_SOURCES) +DIST_SOURCES = $(libspeech_cmdline_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=speech_cmdline +@PLUGINS_TRUE@modulespeech_LTLIBRARIES = libspeech_cmdline.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libspeech_cmdline.la +libspeech_cmdline_la_SOURCES = speech_cmdline.c +libspeech_cmdline_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/speech/cmdline/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/speech/cmdline/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulespeechLTLIBRARIES: $(modulespeech_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulespeechdir)" || $(MKDIR_P) "$(DESTDIR)$(modulespeechdir)" + @list='$(modulespeech_LTLIBRARIES)'; test -n "$(modulespeechdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulespeechdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulespeechdir)"; \ + } + +uninstall-modulespeechLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulespeech_LTLIBRARIES)'; test -n "$(modulespeechdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulespeechdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulespeechdir)/$$f"; \ + done + +clean-modulespeechLTLIBRARIES: + -test -z "$(modulespeech_LTLIBRARIES)" || rm -f $(modulespeech_LTLIBRARIES) + @list='$(modulespeech_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libspeech_cmdline.la: $(libspeech_cmdline_la_OBJECTS) $(libspeech_cmdline_la_DEPENDENCIES) + $(libspeech_cmdline_la_LINK) $(am_libspeech_cmdline_la_rpath) $(libspeech_cmdline_la_OBJECTS) $(libspeech_cmdline_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/speech_cmdline.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulespeechdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulespeechLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulespeechLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulespeechLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulespeechLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-modulespeechLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulespeechLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/speech/cmdline/speech_cmdline.c b/navit/speech/cmdline/speech_cmdline.c new file mode 100644 index 0000000..a356cd1 --- /dev/null +++ b/navit/speech/cmdline/speech_cmdline.c @@ -0,0 +1,247 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include "config.h" +#include "debug.h" +#include "item.h" +#include "plugin.h" +#include "file.h" +#include "speech.h" +#include "util.h" +#ifdef HAVE_API_WIN32_BASE +#include +#endif +#ifdef USE_EXEC +#include +#include +#include +#endif + + +static char *urldecode(char *str) +{ + char *ret=g_strdup(str); + char *src=ret; + char *dst=ret; + while (*src) { + if (*src == '%') { + int val; + if (sscanf(src+1,"%02x",&val)) { + src+=2; + *dst++=val; + } + src++; + } else + *dst++=*src++; + } + *dst++='\0'; + return ret; +} + +static GList * +speech_cmdline_search(GList *l, int suffix_len, const char *s, int decode) +{ + GList *li=l,*ret=NULL,*tmp; + int len=0; + while (li) { + char *snd=li->data; + int snd_len; + if (decode) + snd=urldecode(snd); + snd_len=strlen(snd)-suffix_len; + if (!g_strncasecmp(s, snd, snd_len)) { + const char *ss=s+snd_len; + while (*ss == ' ' || *ss == ',') + ss++; + dbg(1,"found %s remaining %s\n",snd,ss); + if (*ss) + tmp=speech_cmdline_search(l, suffix_len, ss, decode); + else + tmp=NULL; + if (!ret || g_list_length(tmp) < len) { + len=g_list_length(tmp); + g_list_free(ret); + ret=tmp; + if (!*ss || tmp) + ret=g_list_prepend(ret, li->data); + } else + g_list_free(tmp); + } + if (decode) + g_free(snd); + li=g_list_next(li); + } + return ret; +} +#if 0 + + r=search(l, strlen(path)+1, suffix_len, argv[1]); + while (r) { + printf("%s/%s\n",path,r->data); + r=g_list_next(r); + } + return 0; +#endif + +struct speech_priv { + char *cmdline; + char *sample_dir; + char *sample_suffix; + int flags; + GList *samples; + struct spawn_process_info *spi; +}; + +static int +speechd_say(struct speech_priv *this, const char *text) +{ + char **cmdv=g_strsplit(this->cmdline," ", -1); + int variable_arg_no=-1; + GList *argl=NULL; + guint listlen; + int samplesmode=0; + int i; + + for(i=0;cmdv[i];i++) + if(strchr(cmdv[i],'%')) { + variable_arg_no=i; + break; + } + + if (this->sample_dir && this->sample_suffix) { + argl=speech_cmdline_search(this->samples, strlen(this->sample_suffix), text, !!(this->flags & 1)); + samplesmode=1; + listlen=g_list_length(argl); + } else { + listlen=1; + } + dbg(0,"text '%s'\n",text); + if(listlen>0) { + int argc; + char**argv; + int j; + int cmdvlen=g_strv_length(cmdv); + argc=cmdvlen + listlen - (variable_arg_no>0?1:0); + argv=g_new(char *,argc+1); + if(variable_arg_no==-1) { + argv[cmdvlen]=g_strdup("%s"); + variable_arg_no=cmdvlen; + } + + for(i=0,j=0;jsample_dir,(char *)l->data); + dbg(0,"new_arg %s\n",new_arg); + argv[j++]=g_strdup_printf(cmdv[i],new_arg); + g_free(new_arg); + l=g_list_next(l); + } + } else { + argv[j++]=g_strdup_printf(cmdv[i],text); + } + i++; + } else { + argv[j++]=g_strdup(cmdv[i++]); + } + } + argv[j]=NULL; + if (argl) + // No need to free data elements here as they are + // still referenced from this->samples + g_list_free(argl); + + if(this->spi) { + spawn_process_check_status(this->spi,1); // Block until previous spawned speech process is terminated. + spawn_process_info_free(this->spi); + } + this->spi=spawn_process(argv); + g_strfreev(argv); + } + g_strfreev(cmdv); + return 0; +} + + +static void +speechd_destroy(struct speech_priv *this) { + GList *l=this->samples; + g_free(this->cmdline); + g_free(this->sample_dir); + g_free(this->sample_suffix); + while(l) { + g_free(l->data); + } + g_list_free(this->samples); + if(this->spi) + spawn_process_info_free(this->spi); + g_free(this); +} + +static struct speech_methods speechd_meth = { + speechd_destroy, + speechd_say, +}; + +static struct speech_priv * +speechd_new(struct speech_methods *meth, struct attr **attrs, struct attr *parent) { + struct speech_priv *this; + struct attr *attr; + attr=attr_search(attrs, NULL, attr_data); + if (! attr) + return NULL; + this=g_new0(struct speech_priv,1); + this->cmdline=g_strdup(attr->u.str); + if ((attr=attr_search(attrs, NULL, attr_sample_dir))) + this->sample_dir=g_strdup(attr->u.str); + if ((attr=attr_search(attrs, NULL, attr_sample_suffix))) + this->sample_suffix=g_strdup(attr->u.str); + if ((attr=attr_search(attrs, NULL, attr_flags))) + this->flags=attr->u.num; + if (this->sample_dir && this->sample_suffix) { + void *handle=file_opendir(this->sample_dir); + char *name; + int suffix_len=strlen(this->sample_suffix); + while((name=file_readdir(handle))) { + int len=strlen(name); + if (len > suffix_len) { + if (!strcmp(name+len-suffix_len, this->sample_suffix)) { + dbg(0,"found %s\n",name); + this->samples=g_list_prepend(this->samples, g_strdup(name)); + } + } + } + file_closedir(handle); + } + *meth=speechd_meth; + return this; +} + + +void +plugin_init(void) +{ + plugin_register_speech_type("cmdline", speechd_new); +} diff --git a/navit/speech/dbus/Makefile.am b/navit/speech/dbus/Makefile.am new file mode 100644 index 0000000..abe285b --- /dev/null +++ b/navit/speech/dbus/Makefile.am @@ -0,0 +1,5 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=speech_dbus +modulespeech_LTLIBRARIES = libspeech_dbus.la +libspeech_dbus_la_SOURCES = speech_dbus.c +libspeech_dbus_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ diff --git a/navit/speech/dbus/Makefile.in b/navit/speech/dbus/Makefile.in new file mode 100644 index 0000000..b026088 --- /dev/null +++ b/navit/speech/dbus/Makefile.in @@ -0,0 +1,690 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/speech/dbus +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulespeechdir)" +LTLIBRARIES = $(modulespeech_LTLIBRARIES) +libspeech_dbus_la_LIBADD = +am_libspeech_dbus_la_OBJECTS = speech_dbus.lo +libspeech_dbus_la_OBJECTS = $(am_libspeech_dbus_la_OBJECTS) +libspeech_dbus_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libspeech_dbus_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libspeech_dbus_la_SOURCES) +DIST_SOURCES = $(libspeech_dbus_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=speech_dbus +modulespeech_LTLIBRARIES = libspeech_dbus.la +libspeech_dbus_la_SOURCES = speech_dbus.c +libspeech_dbus_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/speech/dbus/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/speech/dbus/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulespeechLTLIBRARIES: $(modulespeech_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulespeechdir)" || $(MKDIR_P) "$(DESTDIR)$(modulespeechdir)" + @list='$(modulespeech_LTLIBRARIES)'; test -n "$(modulespeechdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulespeechdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulespeechdir)"; \ + } + +uninstall-modulespeechLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulespeech_LTLIBRARIES)'; test -n "$(modulespeechdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulespeechdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulespeechdir)/$$f"; \ + done + +clean-modulespeechLTLIBRARIES: + -test -z "$(modulespeech_LTLIBRARIES)" || rm -f $(modulespeech_LTLIBRARIES) + @list='$(modulespeech_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libspeech_dbus.la: $(libspeech_dbus_la_OBJECTS) $(libspeech_dbus_la_DEPENDENCIES) + $(libspeech_dbus_la_LINK) -rpath $(modulespeechdir) $(libspeech_dbus_la_OBJECTS) $(libspeech_dbus_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/speech_dbus.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulespeechdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulespeechLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulespeechLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulespeechLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulespeechLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-modulespeechLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulespeechLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/speech/dbus/speech_dbus.c b/navit/speech/dbus/speech_dbus.c new file mode 100644 index 0000000..53ab46f --- /dev/null +++ b/navit/speech/dbus/speech_dbus.c @@ -0,0 +1,77 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "config.h" +#include "item.h" +#include "plugin.h" +#include "navit.h" +#include "attr.h" +#include "callback.h" +#include "speech.h" + +struct speech_priv { + struct navit *nav; +}; + +static int +speech_dbus_say(struct speech_priv *this, const char *text) +{ + struct attr attr1,attr2,cb,*attr_list[3]; + int valid=0; + attr1.type=attr_type; + attr1.u.str="speech"; + attr2.type=attr_data; + attr2.u.str=(char *)text; + attr_list[0]=&attr1; + attr_list[1]=&attr2; + attr_list[2]=NULL; + if (navit_get_attr(this->nav, attr_callback_list, &cb, NULL)) + callback_list_call_attr_4(cb.u.callback_list, attr_command, "dbus_send_signal", attr_list, NULL, &valid); + return 0; +} + +static void +speech_dbus_destroy(struct speech_priv *this) { + g_free(this); +} + +static struct speech_methods speech_dbus_meth = { + speech_dbus_destroy, + speech_dbus_say, +}; + +static struct speech_priv * +speech_dbus_new(struct speech_methods *meth, struct attr **attrs, struct attr *parent) { + struct speech_priv *this; + if (!parent || parent->type != attr_navit) + return NULL; + this=g_new(struct speech_priv,1); + this->nav=parent->u.navit; + *meth=speech_dbus_meth; + return this; +} + + +void +plugin_init(void) +{ + plugin_register_speech_type("dbus", speech_dbus_new); +} diff --git a/navit/speech/espeak/Makefile.am b/navit/speech/espeak/Makefile.am new file mode 100644 index 0000000..ecdb503 --- /dev/null +++ b/navit/speech/espeak/Makefile.am @@ -0,0 +1,13 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=speech_espeak +if PLUGINS +modulespeech_LTLIBRARIES = libspeech_espeak.la +else +noinst_LTLIBRARIES = libspeech_espeak.la +endif +libspeech_espeak_la_SOURCES = speak.c +libspeech_espeak_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ -L$(top_builddir)/navit/support/espeak -lsupport_espeak +if !SUPPORT_WIN32CE +libspeech_espeak_la_LDFLAGS += -Wl,-lwinmm +endif + diff --git a/navit/speech/espeak/Makefile.in b/navit/speech/espeak/Makefile.in new file mode 100644 index 0000000..6bdc9f2 --- /dev/null +++ b/navit/speech/espeak/Makefile.in @@ -0,0 +1,706 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +@SUPPORT_WIN32CE_FALSE@am__append_1 = -Wl,-lwinmm +subdir = navit/speech/espeak +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulespeechdir)" +LTLIBRARIES = $(modulespeech_LTLIBRARIES) $(noinst_LTLIBRARIES) +libspeech_espeak_la_LIBADD = +am_libspeech_espeak_la_OBJECTS = speak.lo +libspeech_espeak_la_OBJECTS = $(am_libspeech_espeak_la_OBJECTS) +libspeech_espeak_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libspeech_espeak_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libspeech_espeak_la_rpath = +@PLUGINS_TRUE@am_libspeech_espeak_la_rpath = -rpath $(modulespeechdir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libspeech_espeak_la_SOURCES) +DIST_SOURCES = $(libspeech_espeak_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=speech_espeak +@PLUGINS_TRUE@modulespeech_LTLIBRARIES = libspeech_espeak.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libspeech_espeak.la +libspeech_espeak_la_SOURCES = speak.c +libspeech_espeak_la_LDFLAGS = -module -avoid-version \ + @NAVIT_MODULE_LDFLAGS@ -L$(top_builddir)/navit/support/espeak \ + -lsupport_espeak $(am__append_1) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/speech/espeak/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/speech/espeak/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulespeechLTLIBRARIES: $(modulespeech_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulespeechdir)" || $(MKDIR_P) "$(DESTDIR)$(modulespeechdir)" + @list='$(modulespeech_LTLIBRARIES)'; test -n "$(modulespeechdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulespeechdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulespeechdir)"; \ + } + +uninstall-modulespeechLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulespeech_LTLIBRARIES)'; test -n "$(modulespeechdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulespeechdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulespeechdir)/$$f"; \ + done + +clean-modulespeechLTLIBRARIES: + -test -z "$(modulespeech_LTLIBRARIES)" || rm -f $(modulespeech_LTLIBRARIES) + @list='$(modulespeech_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libspeech_espeak.la: $(libspeech_espeak_la_OBJECTS) $(libspeech_espeak_la_DEPENDENCIES) + $(libspeech_espeak_la_LINK) $(am_libspeech_espeak_la_rpath) $(libspeech_espeak_la_OBJECTS) $(libspeech_espeak_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/speak.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulespeechdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulespeechLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulespeechLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulespeechLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulespeechLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-modulespeechLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulespeechLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/speech/espeak/speak.c b/navit/speech/espeak/speak.c new file mode 100644 index 0000000..18edd8c --- /dev/null +++ b/navit/speech/espeak/speak.c @@ -0,0 +1,518 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#define _WIN32_WINNT 0x0500 + +#include "config.h" + +#ifdef HAVE_API_WIN32_BASE +#include +#include +#include +#else +#include +#endif + +#include +#include +#include +#include "item.h" +#include "plugin.h" +#include "speech.h" +#include "util.h" +#include "file.h" +#include "debug.h" + +#include "support/espeak/speech.h" +#include "support/espeak/speak_lib.h" +#include "support/espeak/phoneme.h" +#include "support/espeak/synthesize.h" +#include "support/espeak/voice.h" +#include "support/espeak/translate.h" + + +#define BUFFERS 4 + + +// ----- some stuff needed by espeak ---------------------------------- +char path_home[N_PATH_HOME]; // this is the espeak-data directory +int (* uri_callback)(int, const char *, const char *) = NULL; +int (* phoneme_callback)(const char *) = NULL; +FILE *f_wave = NULL; + +int GetFileLength(const char *filename) +{ + struct stat statbuf; + + if(stat(filename,&statbuf) != 0) + return(0); + + if((statbuf.st_mode & S_IFMT) == S_IFDIR) + return(-2); // a directory + + return(statbuf.st_size); +} + +void MarkerEvent(int type, unsigned int char_position, int value, unsigned char *out_ptr) +{ +} + +char *Alloc(int size) +{ + return g_malloc(size); +} + +void Free(void *ptr) +{ + g_free(ptr); +} + +// -------------------------------------------------------------------- + + +enum speech_messages +{ + msg_say = WM_USER, + msg_exit +}; + +enum speech_state +{ + state_available, + state_speaking_phase_1, + state_speaking_phase_2, + state_speaking_phase_3 + +}; + +struct speech_priv { + GList *free_buffers; + HWAVEOUT h_wave_out; + enum speech_state state; + GList *phrases; + HWND h_queue; + HANDLE h_message_thread; +}; + + +static void waveout_close(struct speech_priv* sp_priv) +{ + waveOutClose(sp_priv->h_wave_out); +} + +static BOOL waveout_open(struct speech_priv* sp_priv) +{ + MMRESULT result = 0; + + HWAVEOUT hwo; + static WAVEFORMATEX wmTemp; + wmTemp.wFormatTag = WAVE_FORMAT_PCM; + wmTemp.nChannels = 1; + wmTemp.nSamplesPerSec = 22050; + wmTemp.wBitsPerSample = 16; + wmTemp.nBlockAlign = wmTemp.nChannels * wmTemp.wBitsPerSample / 8; + wmTemp.nAvgBytesPerSec = wmTemp.nSamplesPerSec * wmTemp.nBlockAlign; + wmTemp.cbSize = 0; + result = waveOutOpen(&hwo, (UINT) WAVE_MAPPER, &wmTemp, (DWORD)sp_priv->h_queue, (DWORD)sp_priv, CALLBACK_WINDOW); + sp_priv->h_wave_out = hwo; + + return (result==MMSYSERR_NOERROR); +} + +static int wave_out(struct speech_priv* sp_priv) +{ + int isDone; + + WAVEHDR *WaveHeader = g_list_first(sp_priv->free_buffers)->data; + sp_priv->free_buffers = g_list_remove(sp_priv->free_buffers, WaveHeader); + + out_ptr = out_start = WaveHeader->lpData; + out_end = WaveHeader->lpData + WaveHeader->dwBufferLength; + + isDone = WavegenFill(0); + + if ( out_ptr < out_end ) + { + memset ( out_ptr, 0, out_end - out_ptr ); + } + waveOutWrite(sp_priv->h_wave_out, WaveHeader, sizeof(WAVEHDR)); + + return isDone; +} + +static BOOL initialise(void) +{ + int param; + int result; + + WavegenInit(22050,0); // 22050 + if((result = LoadPhData()) != 1) + { + if(result == -1) + { + dbg(0, "Failed to load espeak-data\n"); + return FALSE; + } + else + dbg(0, "Wrong version of espeak-data 0x%x (expects 0x%x) at %s\n",result,version_phdata,path_home); + } + LoadConfig(); + SetVoiceStack(NULL); + SynthesizeInit(); + + for(param=0; paramfree_buffers && this->state != state_speaking_phase_3 ) + { + if(Generate(phoneme_list,&n_phoneme_list,1)==0) + { + if (!SpeakNextClause(NULL,NULL,1)) + { + this->state = state_speaking_phase_2; + } + } + + if ( wave_out(this)!= 0 && this->state == state_speaking_phase_2) + { + this->state = state_speaking_phase_3; + } + } +} + +static void start_speaking(struct speech_priv* sp_priv) +{ + char *phrase = g_list_first(sp_priv->phrases)->data; + + sp_priv->state = state_speaking_phase_1; + + SpeakNextClause(NULL, phrase,0); + wave_out(sp_priv); + fill_buffer(sp_priv); +} + +static LRESULT CALLBACK speech_message_handler( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + dbg(1, "message_handler called\n"); + + switch (uMsg) + { + case msg_say: + { + struct speech_priv* sp_priv = (struct speech_priv*)wParam; + sp_priv->phrases = g_list_append(sp_priv->phrases, (char*)lParam); + + if ( sp_priv->state == state_available ) + { + start_speaking(sp_priv); + } + + } + break; + case MM_WOM_DONE: + { + WAVEHDR *WaveHeader = (WAVEHDR *)lParam; + struct speech_priv* sp_priv; + dbg(2, "Wave buffer done\n"); + + sp_priv = (struct speech_priv*)WaveHeader->dwUser; + sp_priv->free_buffers = g_list_append(sp_priv->free_buffers, WaveHeader); + + if ( sp_priv->state != state_speaking_phase_3) + { + fill_buffer(sp_priv); + } + else if ( g_list_length(sp_priv->free_buffers) == BUFFERS && sp_priv->state == state_speaking_phase_3 ) + { + // remove the spoken phrase from the list + char *phrase = g_list_first(sp_priv->phrases)->data; + g_free( phrase ); + sp_priv->phrases = g_list_remove(sp_priv->phrases, phrase); + + if ( sp_priv->phrases ) + { + start_speaking(sp_priv); + } + else + { + sp_priv->state = state_available; + } + } + } + break; + case msg_exit: + ExitThread(0); + break; + + default: + break; + + } + + return TRUE; +} + +static void speech_message_dispatcher( struct speech_priv * sp_priv) +{ + BOOL bRet; + MSG msg; + + while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) + { + if (bRet == -1) + { + dbg(0, "Error getting message from queue\n"); + break; + } + else + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } +} + +static void create_buffers(struct speech_priv *sp_priv) +{ + int buffer_counter; + char *buffer_head; + + + SYSTEM_INFO system_info; + GetSystemInfo (&system_info); + + buffer_head = VirtualAlloc(0, system_info.dwPageSize * BUFFERS, MEM_RESERVE, PAGE_NOACCESS); + + for (buffer_counter = 0; buffer_counter < BUFFERS; buffer_counter++) + { + WAVEHDR *WaveHeader = g_new0(WAVEHDR, 1); + + WaveHeader->dwBufferLength = system_info.dwPageSize; + WaveHeader->lpData = (char *)VirtualAlloc(buffer_head, WaveHeader->dwBufferLength, MEM_COMMIT, PAGE_READWRITE); + buffer_head += WaveHeader->dwBufferLength; + + WaveHeader->dwUser = (DWORD)sp_priv; + waveOutPrepareHeader(sp_priv->h_wave_out, WaveHeader, sizeof(WAVEHDR)); + + sp_priv->free_buffers = g_list_append( sp_priv->free_buffers, WaveHeader ); + } +} + +static DWORD startThread( LPVOID sp_priv) +{ + struct speech_priv *this = (struct speech_priv *) sp_priv; + // Create message queue + TCHAR *g_szClassName = TEXT("SpeechQueue"); + WNDCLASS wc; + HWND hwnd; + HWND hWndParent; + + + memset(&wc, 0 , sizeof(WNDCLASS)); + wc.lpfnWndProc = speech_message_handler; + wc.hInstance = GetModuleHandle(NULL); + wc.lpszClassName = g_szClassName; + + if (!RegisterClass(&wc)) + { + dbg(0, "Window registration for message queue failed\n"); + return 1; + } + + hWndParent = NULL; +#ifndef HAVE_API_WIN32_CE + hWndParent = HWND_MESSAGE; +#endif + + // create a message only window + hwnd = CreateWindow( + g_szClassName, + TEXT("Navit"), + 0, + 0, + 0, + 0, + 0, + hWndParent, + NULL, + GetModuleHandle(NULL), + NULL); + + if (hwnd == NULL) + { + dbg(0, "Window creation failed: %d\n", GetLastError()); + return 1; + } + + this->h_queue = hwnd; + this->phrases = NULL; + this->state = state_available; + + if(!waveout_open(this)) + { + dbg(0, "Can't open wave output\n"); + return 1; + } + + this->free_buffers = NULL; + create_buffers(this); + + speech_message_dispatcher(this); + + return 0; +} + +static int +espeak_say(struct speech_priv *this, const char *text) +{ + char *phrase = g_strdup(text); + dbg(1, "Speak: '%s'\n", text); + + if (!PostMessage(this->h_queue, msg_say, (WPARAM)this, (LPARAM)phrase)) + { + dbg(0, "PostThreadMessage 'say' failed\n"); + } + + return 0; +} + +static void free_list(gpointer pointer, gpointer this ) +{ + if ( this ) + { + struct speech_priv *sp_priv = (struct speech_priv *)this; + WAVEHDR *WaveHeader = (WAVEHDR *)pointer; + + waveOutUnprepareHeader(sp_priv->h_wave_out, WaveHeader, sizeof(WAVEHDR)); + VirtualFree(WaveHeader->lpData, WaveHeader->dwBufferLength, MEM_DECOMMIT); + } + g_free(pointer); +} + +static void +espeak_destroy(struct speech_priv *this) +{ + g_list_foreach( this->free_buffers, free_list, (gpointer)this ); + g_list_free( this->free_buffers ); + + g_list_foreach( this->phrases, free_list, 0 ); + g_list_free(this->phrases); + + waveout_close(this); + g_free(this); +} + +static struct speech_methods espeak_meth = { + espeak_destroy, + espeak_say, +}; + +static struct speech_priv * +espeak_new(struct speech_methods *meth, struct attr **attrs, struct attr *parent) { + struct speech_priv *this = NULL; + struct attr *path; + struct attr *language; + char *lang_str=NULL; + + path=attr_search(attrs, NULL, attr_path); + if (path) + strcpy(path_home,path->u.str); + else + sprintf(path_home,"%s/espeak-data",getenv("NAVIT_SHAREDIR")); + dbg(0,"path_home set to %s\n",path_home); + + if ( !initialise() ) + { + return NULL; + } + + language=attr_search(attrs, NULL, attr_language); + if ( language ) { + lang_str=g_strdup(language->u.str); + } else { + char *lang_env=getenv("LANG"); + + if (lang_env) { + char *country,*lang,*lang_full; + char *file1; + char *file2; + lang_full=g_strdup(lang_env); + strtolower(lang_full,lang_env); + lang=g_strdup(lang_full); + country=strchr(lang_full,'_'); + if (country) { + lang[country-lang_full]='\0'; + *country++='-'; + } + file1=g_strdup_printf("%s/voices/%s",path_home,lang_full); + file2=g_strdup_printf("%s/voices/%s/%s",path_home,lang,lang_full); + dbg(0,"Testing %s and %s\n",file1,file2); + if (file_exists(file1) || file_exists(file2)) + lang_str=g_strdup(lang_full); + else + lang_str=g_strdup(lang); + dbg(0,"Language full %s lang %s result %s\n",lang_full,lang,lang_str); + g_free(lang_full); + g_free(lang); + g_free(file1); + g_free(file2); + } + } + if(lang_str && SetVoiceByName(lang_str) != EE_OK) + { + dbg(0, "Error setting language to: '%s',falling back to default\n", lang_str); + g_free(lang_str); + lang_str=NULL; + } + if(!lang_str && SetVoiceByName("default") != EE_OK) { + dbg(0, "Error setting language to default\n"); + } + + + SetParameter(espeakRATE,170,0); + SetParameter(espeakVOLUME,100,0); + SetParameter(espeakCAPITALS,option_capitals,0); + SetParameter(espeakPUNCTUATION,option_punctuation,0); + SetParameter(espeakWORDGAP,0,0); + +// if(pitch_adjustment != 50) +// { +// SetParameter(espeakPITCH,pitch_adjustment,0); +// } + DoVoiceChange(voice); + + this=g_new(struct speech_priv,1); + this->h_message_thread = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)startThread, (PVOID)this, 0, NULL); + + *meth=espeak_meth; + + + return this; +} + +void +plugin_init(void) +{ + plugin_register_speech_type("espeak", espeak_new); +} diff --git a/navit/speech/speech_dispatcher/Makefile.am b/navit/speech/speech_dispatcher/Makefile.am new file mode 100644 index 0000000..a040740 --- /dev/null +++ b/navit/speech/speech_dispatcher/Makefile.am @@ -0,0 +1,6 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=speech_speech_dispatcher +modulespeech_LTLIBRARIES = libspeech_speech_dispatcher.la +libspeech_speech_dispatcher_la_SOURCES = speech_speech_dispatcher.c +libspeech_speech_dispatcher_la_LIBADD = @SPEECHD_LIBS@ +libspeech_speech_dispatcher_la_LDFLAGS = -module -avoid-version diff --git a/navit/speech/speech_dispatcher/Makefile.in b/navit/speech/speech_dispatcher/Makefile.in new file mode 100644 index 0000000..83d0829 --- /dev/null +++ b/navit/speech/speech_dispatcher/Makefile.in @@ -0,0 +1,694 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/speech/speech_dispatcher +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulespeechdir)" +LTLIBRARIES = $(modulespeech_LTLIBRARIES) +libspeech_speech_dispatcher_la_DEPENDENCIES = +am_libspeech_speech_dispatcher_la_OBJECTS = \ + speech_speech_dispatcher.lo +libspeech_speech_dispatcher_la_OBJECTS = \ + $(am_libspeech_speech_dispatcher_la_OBJECTS) +libspeech_speech_dispatcher_la_LINK = $(LIBTOOL) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) \ + $(libspeech_speech_dispatcher_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libspeech_speech_dispatcher_la_SOURCES) +DIST_SOURCES = $(libspeech_speech_dispatcher_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=speech_speech_dispatcher +modulespeech_LTLIBRARIES = libspeech_speech_dispatcher.la +libspeech_speech_dispatcher_la_SOURCES = speech_speech_dispatcher.c +libspeech_speech_dispatcher_la_LIBADD = @SPEECHD_LIBS@ +libspeech_speech_dispatcher_la_LDFLAGS = -module -avoid-version +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/speech/speech_dispatcher/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/speech/speech_dispatcher/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulespeechLTLIBRARIES: $(modulespeech_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulespeechdir)" || $(MKDIR_P) "$(DESTDIR)$(modulespeechdir)" + @list='$(modulespeech_LTLIBRARIES)'; test -n "$(modulespeechdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulespeechdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulespeechdir)"; \ + } + +uninstall-modulespeechLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulespeech_LTLIBRARIES)'; test -n "$(modulespeechdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulespeechdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulespeechdir)/$$f"; \ + done + +clean-modulespeechLTLIBRARIES: + -test -z "$(modulespeech_LTLIBRARIES)" || rm -f $(modulespeech_LTLIBRARIES) + @list='$(modulespeech_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libspeech_speech_dispatcher.la: $(libspeech_speech_dispatcher_la_OBJECTS) $(libspeech_speech_dispatcher_la_DEPENDENCIES) + $(libspeech_speech_dispatcher_la_LINK) -rpath $(modulespeechdir) $(libspeech_speech_dispatcher_la_OBJECTS) $(libspeech_speech_dispatcher_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/speech_speech_dispatcher.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulespeechdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulespeechLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulespeechLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulespeechLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulespeechLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-modulespeechLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulespeechLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/speech/speech_dispatcher/speech_speech_dispatcher.c b/navit/speech/speech_dispatcher/speech_speech_dispatcher.c new file mode 100644 index 0000000..0522818 --- /dev/null +++ b/navit/speech/speech_dispatcher/speech_speech_dispatcher.c @@ -0,0 +1,81 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "config.h" +#include +#include "plugin.h" +#include "speech.h" + +struct speech_priv { + SPDConnection *conn; +}; + +static int +speechd_say(struct speech_priv *this, const char *text) { + int err; + + err = spd_sayf(this->conn, SPD_MESSAGE, text); + if (err != 1) + return 1; + return 0; +} + +static void +speechd_destroy(struct speech_priv *this) { + spd_close(this->conn); + g_free(this); +} + +static struct speech_methods speechd_meth = { + speechd_destroy, + speechd_say, +}; + +static struct speech_priv * +speechd_new(struct speech_methods *meth, struct attr **attrs, struct attr *attr) { + struct speech_priv *this; + SPDConnection *conn; + + conn = spd_open("navit","main",NULL,SPD_MODE_SINGLE); + if (! conn) + return NULL; + this=g_new(struct speech_priv,1); + if (this) { + this->conn=conn; + *meth=speechd_meth; + spd_set_punctuation(conn, SPD_PUNCT_NONE); + } + return this; +} + + +void +plugin_init(void) +{ + plugin_register_speech_type("speech_dispatcher", speechd_new); +} diff --git a/navit/start.c b/navit/start.c new file mode 100644 index 0000000..35bdce0 --- /dev/null +++ b/navit/start.c @@ -0,0 +1,26 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include "start_real.h" + +int +main(int argc, char **argv) +{ + return main_real(argc, argv); +} diff --git a/navit/start_real.c b/navit/start_real.c new file mode 100644 index 0000000..d07c68d --- /dev/null +++ b/navit/start_real.c @@ -0,0 +1,229 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include "config.h" +#ifdef HAVE_GETOPT_H +#include +#else +#include +#endif +#include "config_.h" +#include "version.h" +#include "item.h" +#include "coord.h" +#include "main.h" +#include "route.h" +#include "navigation.h" +#include "track.h" +#include "debug.h" +#include "event.h" +#include "event_glib.h" +#include "xmlconfig.h" +#include "file.h" +#include "search.h" +#include "start_real.h" +#include "linguistics.h" +#include "navit_nls.h" +#include "atom.h" +#include "command.h" +#ifdef HAVE_API_WIN32_CE +#include +#include +#endif + +char *version=PACKAGE_VERSION" "SVN_VERSION""NAVIT_VARIANT; +int main_argc; +char **main_argv; + +static void +print_usage(void) +{ + printf(_("navit usage:\nnavit [options] [configfile]\n\t-c : use as config file\n\t-d : set the global debug output level to (0-3).\n\t-h: print this usage info and exit.\n\t-v: Print the version and exit.\n")); +} + + +#ifndef USE_PLUGINS +extern void builtin_init(void); +#endif /* USE_PLUGINS*/ + +int main_real(int argc, char **argv) +{ + xmlerror *error = NULL; + char *config_file = NULL, *command=NULL, *startup_file=NULL; + int opt; + char *cp; + struct attr navit, conf; + + GList *list = NULL, *li; + main_argc=argc; + main_argv=argv; + + +#ifdef HAVE_GLIB + event_glib_init(); +#else + _g_slice_thread_init_nomessage(); +#endif + atom_init(); + main_init(argv[0]); + main_init_nls(); + debug_init(argv[0]); + + cp = getenv("NAVIT_LOGFILE"); + if (cp) { + debug_set_logfile(cp); + } +#ifdef HAVE_API_WIN32_CE + else { + debug_set_logfile("/Storage Card/navit.log"); + } +#endif + file_init(); +#ifndef USE_PLUGINS + builtin_init(); +#endif + route_init(); + navigation_init(); + tracking_init(); + search_init(); + linguistics_init(); + config_file=NULL; +#ifdef HAVE_GETOPT_H + opterr=0; //don't bomb out on errors. +#endif /* _MSC_VER */ + /* ingore iphone command line argument */ + if (argc == 2 && !strcmp(argv[1],"-RegisterForSystemEvents")) + argc=1; + if (argc > 1) { + /* DEVELOPPERS : don't forget to update the manpage if you modify theses options */ + while((opt = getopt(argc, argv, ":hvc:d:e:s:")) != -1) { + switch(opt) { + case 'h': + print_usage(); + exit(0); + break; + case 'v': + printf("%s %s\n", "navit", version); + exit(0); + break; + case 'c': + printf("config file n is set to `%s'\n", optarg); + config_file = optarg; + break; + case 'd': + debug_level_set(DEBUG_MODULE_GLOBAL, atoi(optarg)); + break; + case 'e': + command=optarg; + break; + case 's': + startup_file=optarg; + break; +#ifdef HAVE_GETOPT_H + case ':': + fprintf(stderr, "navit: Error - Option `%c' needs a value\n", optopt); + print_usage(); + exit(2); + break; + case '?': + fprintf(stderr, "navit: Error - No such option: `%c'\n", optopt); + print_usage(); + exit(3); +#endif + } + } + // use 1st cmd line option that is left for the config file + if (optind < argc) config_file = argv[optind]; + } + + // if config file is explicitely given only look for it, otherwise try std paths + if (config_file) list = g_list_append(list,g_strdup(config_file)); + else { + list = g_list_append(list,g_strjoin(NULL,getenv("NAVIT_USER_DATADIR"), "/navit.xml" , NULL)); + list = g_list_append(list,g_strdup("navit.xml.local")); + list = g_list_append(list,g_strdup("navit.xml")); +#ifdef HAVE_API_ANDROID + // new preferred location (the new one should have priority over the legacy!) + list = g_list_append(list,g_strdup("/sdcard/navit/navit.xml")); + // legacy location, still supported + list = g_list_append(list,g_strdup("/sdcard/navit.xml")); +#endif + list = g_list_append(list,g_strjoin(NULL,getenv("NAVIT_SHAREDIR"), "/navit.xml.local" , NULL)); + list = g_list_append(list,g_strjoin(NULL,getenv("NAVIT_SHAREDIR"), "/navit.xml" , NULL)); +#ifndef _WIN32 + list = g_list_append(list,g_strdup("/etc/navit/navit.xml")); +#endif + } + li = list; + for (;;) { + if (li == NULL) { + // We have not found an existing config file from all possibilities + dbg(0,_("No config file navit.xml, navit.xml.local found\n")); + return 4; + } + // Try the next config file possibility from the list + config_file = li->data; + dbg(0,"trying %s\n",config_file); + if (file_exists(config_file)) + { + break; + } + else + g_free(config_file); + li = g_list_next(li); + } + + if (!config_load(config_file, &error)) { + dbg(0, _("Error parsing '%s': %s\n"), config_file, error ? error->message : ""); + } else { + dbg(0, _("Using '%s'\n"), config_file); + } + while (li) { + g_free(li->data); + li = g_list_next(li); + } + g_list_free(list); + if (! config_get_attr(config, attr_navit, &navit, NULL) && !config_empty_ok) { + dbg(0, _("No instance has been created, exiting\n")); + exit(5); + } + conf.type=attr_config; + conf.u.config=config; + if (startup_file) { + FILE *f=fopen(startup_file,"r"); + if (f) { + char buffer[4096]; + while(fgets(buffer, sizeof(buffer), f)) { + command_evaluate(&conf, buffer); + } + } + } + if (command) { + command_evaluate(&conf, command); + } + event_main_loop_run(); + +#ifndef HAVE_API_ANDROID + debug_finished(); +#endif + return 0; +} diff --git a/navit/start_real.h b/navit/start_real.h new file mode 100644 index 0000000..838b08d --- /dev/null +++ b/navit/start_real.h @@ -0,0 +1,25 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2009 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#ifndef NAVIT_MAIN_REAL_H +#define NAVIT_MAIN_REAL_H + +int main_real(int argc, char **argv); + +#endif diff --git a/navit/sunriset.c b/navit/sunriset.c new file mode 100644 index 0000000..9c92898 --- /dev/null +++ b/navit/sunriset.c @@ -0,0 +1,300 @@ +/* + +SUNRISET.C - computes Sun rise/set times, start/end of twilight, and + the length of the day at any date and latitude + +Written as DAYLEN.C, 1989-08-16 + +Modified to SUNRISET.C, 1992-12-01 + +(c) Paul Schlyter, 1989, 1992 + +Released to the public domain by Paul Schlyter, December 1992 + +*/ + + +#include +#include + +#include "sunriset.h" + +/* The "workhorse" function for sun rise/set times */ + +int __sunriset__( int year, int month, int day, double lon, double lat, + double altit, int upper_limb, double *trise, double *tset ) +/***************************************************************************/ +/* Note: year,month,date = calendar date, 1801-2099 only. */ +/* Eastern longitude positive, Western longitude negative */ +/* Northern latitude positive, Southern latitude negative */ +/* The longitude value IS critical in this function! */ +/* altit = the altitude which the Sun should cross */ +/* Set to -35/60 degrees for rise/set, -6 degrees */ +/* for civil, -12 degrees for nautical and -18 */ +/* degrees for astronomical twilight. */ +/* upper_limb: non-zero -> upper limb, zero -> center */ +/* Set to non-zero (e.g. 1) when computing rise/set */ +/* times, and to zero when computing start/end of */ +/* twilight. */ +/* *rise = where to store the rise time */ +/* *set = where to store the set time */ +/* Both times are relative to the specified altitude, */ +/* and thus this function can be used to comupte */ +/* various twilight times, as well as rise/set times */ +/* Return value: 0 = sun rises/sets this day, times stored at */ +/* *trise and *tset. */ +/* +1 = sun above the specified "horizon" 24 hours. */ +/* *trise set to time when the sun is at south, */ +/* minus 12 hours while *tset is set to the south */ +/* time plus 12 hours. "Day" length = 24 hours */ +/* -1 = sun is below the specified "horizon" 24 hours */ +/* "Day" length = 0 hours, *trise and *tset are */ +/* both set to the time when the sun is at south. */ +/* */ +/**********************************************************************/ +{ + double d, /* Days since 2000 Jan 0.0 (negative before) */ + sr, /* Solar distance, astronomical units */ + sRA, /* Sun's Right Ascension */ + sdec, /* Sun's declination */ + sradius, /* Sun's apparent radius */ + t, /* Diurnal arc */ + tsouth, /* Time when Sun is at south */ + sidtime; /* Local sidereal time */ + + int rc = 0; /* Return cde from function - usually 0 */ + + /* Compute d of 12h local mean solar time */ + d = days_since_2000_Jan_0(year,month,day) + 0.5 - lon/360.0; + + /* Compute local sideral time of this moment */ + sidtime = revolution( GMST0(d) + 180.0 + lon ); + + /* Compute Sun's RA + Decl at this moment */ + sun_RA_dec( d, &sRA, &sdec, &sr ); + + /* Compute time when Sun is at south - in hours UT */ + tsouth = 12.0 - rev180(sidtime - sRA)/15.0; + + /* Compute the Sun's apparent radius, degrees */ + sradius = 0.2666 / sr; + + /* Do correction to upper limb, if necessary */ + if ( upper_limb ) + altit -= sradius; + + /* Compute the diurnal arc that the Sun traverses to reach */ + /* the specified altitide altit: */ + { + double cost; + cost = ( sind(altit) - sind(lat) * sind(sdec) ) / + ( cosd(lat) * cosd(sdec) ); + if ( cost >= 1.0 ) + rc = -1, t = 0.0; /* Sun always below altit */ + else if ( cost <= -1.0 ) + rc = +1, t = 12.0; /* Sun always above altit */ + else + t = acosd(cost)/15.0; /* The diurnal arc, hours */ + } + + /* Store rise and set times - in hours UT */ + *trise = tsouth - t; + *tset = tsouth + t; + + return rc; +} /* __sunriset__ */ + + + +/* The "workhorse" function */ + + +double __daylen__( int year, int month, int day, double lon, double lat, + double altit, int upper_limb ) +/**********************************************************************/ +/* Note: year,month,date = calendar date, 1801-2099 only. */ +/* Eastern longitude positive, Western longitude negative */ +/* Northern latitude positive, Southern latitude negative */ +/* The longitude value is not critical. Set it to the correct */ +/* longitude if you're picky, otherwise set to to, say, 0.0 */ +/* The latitude however IS critical - be sure to get it correct */ +/* altit = the altitude which the Sun should cross */ +/* Set to -35/60 degrees for rise/set, -6 degrees */ +/* for civil, -12 degrees for nautical and -18 */ +/* degrees for astronomical twilight. */ +/* upper_limb: non-zero -> upper limb, zero -> center */ +/* Set to non-zero (e.g. 1) when computing day length */ +/* and to zero when computing day+twilight length. */ +/**********************************************************************/ +{ + double d, /* Days since 2000 Jan 0.0 (negative before) */ + obl_ecl, /* Obliquity (inclination) of Earth's axis */ + sr, /* Solar distance, astronomical units */ + slon, /* True solar longitude */ + sin_sdecl, /* Sine of Sun's declination */ + cos_sdecl, /* Cosine of Sun's declination */ + sradius, /* Sun's apparent radius */ + t; /* Diurnal arc */ + + /* Compute d of 12h local mean solar time */ + d = days_since_2000_Jan_0(year,month,day) + 0.5 - lon/360.0; + + /* Compute obliquity of ecliptic (inclination of Earth's axis) */ + obl_ecl = 23.4393 - 3.563E-7 * d; + + /* Compute Sun's position */ + sunpos( d, &slon, &sr ); + + /* Compute sine and cosine of Sun's declination */ + sin_sdecl = sind(obl_ecl) * sind(slon); + cos_sdecl = sqrt( 1.0 - sin_sdecl * sin_sdecl ); + + /* Compute the Sun's apparent radius, degrees */ + sradius = 0.2666 / sr; + + /* Do correction to upper limb, if necessary */ + if ( upper_limb ) + altit -= sradius; + + /* Compute the diurnal arc that the Sun traverses to reach */ + /* the specified altitide altit: */ + { + double cost; + cost = ( sind(altit) - sind(lat) * sin_sdecl ) / + ( cosd(lat) * cos_sdecl ); + if ( cost >= 1.0 ) + t = 0.0; /* Sun always below altit */ + else if ( cost <= -1.0 ) + t = 24.0; /* Sun always above altit */ + else t = (2.0/15.0) * acosd(cost); /* The diurnal arc, hours */ + } + return t; +} /* __daylen__ */ + + +/* This function computes the Sun's position at any instant */ + +void sunpos( double d, double *lon, double *r ) +/******************************************************/ +/* Computes the Sun's ecliptic longitude and distance */ +/* at an instant given in d, number of days since */ +/* 2000 Jan 0.0. The Sun's ecliptic latitude is not */ +/* computed, since it's always very near 0. */ +/******************************************************/ +{ + double M, /* Mean anomaly of the Sun */ + w, /* Mean longitude of perihelion */ + /* Note: Sun's mean longitude = M + w */ + e, /* Eccentricity of Earth's orbit */ + E, /* Eccentric anomaly */ + x, y, /* x, y coordinates in orbit */ + v; /* True anomaly */ + + /* Compute mean elements */ + M = revolution( 356.0470 + 0.9856002585 * d ); + w = 282.9404 + 4.70935E-5 * d; + e = 0.016709 - 1.151E-9 * d; + + /* Compute true longitude and radius vector */ + E = M + e * RADEG * sind(M) * ( 1.0 + e * cosd(M) ); + x = cosd(E) - e; + y = sqrt( 1.0 - e*e ) * sind(E); + *r = sqrt( x*x + y*y ); /* Solar distance */ + v = atan2d( y, x ); /* True anomaly */ + *lon = v + w; /* True solar longitude */ + if ( *lon >= 360.0 ) + *lon -= 360.0; /* Make it 0..360 degrees */ +} + +void sun_RA_dec( double d, double *RA, double *dec, double *r ) +{ + double lon, obl_ecl; + double xs, ys, zs; + double xe, ye, ze; + + /* Compute Sun's ecliptical coordinates */ + sunpos( d, &lon, r ); + + /* Compute ecliptic rectangular coordinates */ + xs = *r * cosd(lon); + ys = *r * sind(lon); + zs = 0; /* because the Sun is always in the ecliptic plane! */ + + /* Compute obliquity of ecliptic (inclination of Earth's axis) */ + obl_ecl = 23.4393 - 3.563E-7 * d; + + /* Convert to equatorial rectangular coordinates - x is unchanged */ + xe = xs; + ye = ys * cosd(obl_ecl); + ze = ys * sind(obl_ecl); + + /* Convert to spherical coordinates */ + *RA = atan2d( ye, xe ); + *dec = atan2d( ze, sqrt(xe*xe + ye*ye) ); + +} /* sun_RA_dec */ + + +/******************************************************************/ +/* This function reduces any angle to within the first revolution */ +/* by subtracting or adding even multiples of 360.0 until the */ +/* result is >= 0.0 and < 360.0 */ +/******************************************************************/ + +#define INV360 ( 1.0 / 360.0 ) + +double revolution( double x ) +/*****************************************/ +/* Reduce angle to within 0..360 degrees */ +/*****************************************/ +{ + return( x - 360.0 * floor( x * INV360 ) ); +} /* revolution */ + +double rev180( double x ) +/*********************************************/ +/* Reduce angle to within -180..+180 degrees */ +/*********************************************/ +{ + return( x - 360.0 * floor( x * INV360 + 0.5 ) ); +} /* revolution */ + + +/*******************************************************************/ +/* This function computes GMST0, the Greenwhich Mean Sidereal Time */ +/* at 0h UT (i.e. the sidereal time at the Greenwhich meridian at */ +/* 0h UT). GMST is then the sidereal time at Greenwich at any */ +/* time of the day. I've generelized GMST0 as well, and define it */ +/* as: GMST0 = GMST - UT -- this allows GMST0 to be computed at */ +/* other times than 0h UT as well. While this sounds somewhat */ +/* contradictory, it is very practical: instead of computing */ +/* GMST like: */ +/* */ +/* GMST = (GMST0) + UT * (366.2422/365.2422) */ +/* */ +/* where (GMST0) is the GMST last time UT was 0 hours, one simply */ +/* computes: */ +/* */ +/* GMST = GMST0 + UT */ +/* */ +/* where GMST0 is the GMST "at 0h UT" but at the current moment! */ +/* Defined in this way, GMST0 will increase with about 4 min a */ +/* day. It also happens that GMST0 (in degrees, 1 hr = 15 degr) */ +/* is equal to the Sun's mean longitude plus/minus 180 degrees! */ +/* (if we neglect aberration, which amounts to 20 seconds of arc */ +/* or 1.33 seconds of time) */ +/* */ +/*******************************************************************/ + +double GMST0( double d ) +{ + double sidtim0; + /* Sidtime at 0h UT = L (Sun's mean longitude) + 180.0 degr */ + /* L = M + w, as defined in sunpos(). Since I'm too lazy to */ + /* add these numbers, I'll let the C compiler do it for me. */ + /* Any decent C compiler will add the constants at compile */ + /* time, imposing no runtime or code overhead. */ + sidtim0 = revolution( ( 180.0 + 356.0470 + 282.9404 ) + + ( 0.9856002585 + 4.70935E-5 ) * d ); + return sidtim0; +} /* GMST0 */ diff --git a/navit/sunriset.h b/navit/sunriset.h new file mode 100644 index 0000000..36a7709 --- /dev/null +++ b/navit/sunriset.h @@ -0,0 +1,117 @@ +extern const char* timezone_name; +extern long int timezone_offset; + +#define TMOD(x) ((x)<0?(x)+24:((x)>=24?(x)-24:(x))) +#define DAYSOFF(x) ((x)<0?"(-1) ":((x)>=24?"(+1) ":"")) + +#define HOURS(h) ((int)(floor(h))) +#define MINUTES(h) ((int)(60*(h-floor(h)))) + +#ifndef ABS +#define ABS(x) ((x)<0?-(x):(x)) +#endif + +/* A macro to compute the number of days elapsed since 2000 Jan 0.0 */ +/* (which is equal to 1999 Dec 31, 0h UT) */ +/* Dan R sez: This is some pretty fucking high magic. */ +#define days_since_2000_Jan_0(y,m,d) \ + (367L*(y)-((7*((y)+(((m)+9)/12)))/4)+((275*(m))/9)+(d)-730530L) + +/* Some conversion factors between radians and degrees */ + +#ifndef PI + #define PI 3.1415926535897932384 +#endif + +#define RADEG ( 180.0 / PI ) +#define DEGRAD ( PI / 180.0 ) + +/* The trigonometric functions in degrees */ + +#define sind(x) sin((x)*DEGRAD) +#define cosd(x) cos((x)*DEGRAD) +#define tand(x) tan((x)*DEGRAD) + +#define atand(x) (RADEG*atan(x)) +#define asind(x) (RADEG*asin(x)) +#define acosd(x) (RADEG*acos(x)) +#define atan2d(y,x) (RADEG*atan2(y,x)) + +/* Following are some macros around the "workhorse" function __daylen__ */ +/* They mainly fill in the desired values for the reference altitude */ +/* below the horizon, and also selects whether this altitude should */ +/* refer to the Sun's center or its upper limb. */ + + +/* This macro computes the length of the day, from sunrise to sunset. */ +/* Sunrise/set is considered to occur when the Sun's upper limb is */ +/* 50 arc minutes below the horizon (this accounts for the refraction */ +/* of the Earth's atmosphere). */ +/* The original version of the program used the value of 35 arc mins, */ +/* which is the accepted value in Sweden. */ +#define day_length(year,month,day,lon,lat) \ + __daylen__( year, month, day, lon, lat, -50.0/60.0, 1 ) + +/* This macro computes the length of the day, including civil twilight. */ +/* Civil twilight starts/ends when the Sun's center is 6 degrees below */ +/* the horizon. */ +#define day_civil_twilight_length(year,month,day,lon,lat) \ + __daylen__( year, month, day, lon, lat, -6.0, 0 ) + +/* This macro computes the length of the day, incl. nautical twilight. */ +/* Nautical twilight starts/ends when the Sun's center is 12 degrees */ +/* below the horizon. */ +#define day_nautical_twilight_length(year,month,day,lon,lat) \ + __daylen__( year, month, day, lon, lat, -12.0, 0 ) + +/* This macro computes the length of the day, incl. astronomical twilight. */ +/* Astronomical twilight starts/ends when the Sun's center is 18 degrees */ +/* below the horizon. */ +#define day_astronomical_twilight_length(year,month,day,lon,lat) \ + __daylen__( year, month, day, lon, lat, -18.0, 0 ) + + +/* This macro computes times for sunrise/sunset. */ +/* Sunrise/set is considered to occur when the Sun's upper limb is */ +/* 35 arc minutes below the horizon (this accounts for the refraction */ +/* of the Earth's atmosphere). */ +#define sun_rise_set(year,month,day,lon,lat,rise,set) \ + __sunriset__( year, month, day, lon, lat, -35.0/60.0, 1, rise, set ) + +/* This macro computes the start and end times of civil twilight. */ +/* Civil twilight starts/ends when the Sun's center is 6 degrees below */ +/* the horizon. */ +#define civil_twilight(year,month,day,lon,lat,start,end) \ + __sunriset__( year, month, day, lon, lat, -6.0, 0, start, end ) + +/* This macro computes the start and end times of nautical twilight. */ +/* Nautical twilight starts/ends when the Sun's center is 12 degrees */ +/* below the horizon. */ +#define nautical_twilight(year,month,day,lon,lat,start,end) \ + __sunriset__( year, month, day, lon, lat, -12.0, 0, start, end ) + +/* This macro computes the start and end times of astronomical twilight. */ +/* Astronomical twilight starts/ends when the Sun's center is 18 degrees */ +/* below the horizon. */ +#define astronomical_twilight(year,month,day,lon,lat,start,end) \ + __sunriset__( year, month, day, lon, lat, -18.0, 0, start, end ) + + +/* Function prototypes */ + +double __daylen__( int year, int month, int day, double lon, double lat, + double altit, int upper_limb ); + +int __sunriset__( int year, int month, int day, double lon, double lat, + double altit, int upper_limb, double *rise, double *set ); + +void sunpos( double d, double *lon, double *r ); + +void sun_RA_dec( double d, double *RA, double *dec, double *r ); + +double revolution( double x ); + +double rev180( double x ); + +double GMST0( double d ); + diff --git a/navit/support/Makefile.am b/navit/support/Makefile.am new file mode 100644 index 0000000..9f63840 --- /dev/null +++ b/navit/support/Makefile.am @@ -0,0 +1,32 @@ +SUBDIRS= +if SUPPORT_ESPEAK + SUBDIRS+=espeak +endif +if SUPPORT_EZXML + SUBDIRS+=ezxml +endif +if SUPPORT_GLIB + SUBDIRS+=glib +endif +if SUPPORT_WORDEXP + SUBDIRS+=wordexp +endif +if SUPPORT_WIN32 + SUBDIRS+=win32 +endif +if SUPPORT_ZLIB + SUBDIRS+=zlib +endif +if SUPPORT_LIBC + SUBDIRS+=libc +endif +if SUPPORT_LIBPNG + SUBDIRS+=libpng +endif +if SPEECH_ESPEAK + SUBDIRS+=espeak +endif +if !HAVE_SYSTEM_SHAPEFILELIB + SUBDIRS+=shapefile +endif +DIST_SUBDIRS=espeak ezxml glib wordexp win32 zlib libc libpng shapefile diff --git a/navit/support/Makefile.in b/navit/support/Makefile.in new file mode 100644 index 0000000..9af6ca2 --- /dev/null +++ b/navit/support/Makefile.in @@ -0,0 +1,721 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@SUPPORT_ESPEAK_TRUE@am__append_1 = espeak +@SUPPORT_EZXML_TRUE@am__append_2 = ezxml +@SUPPORT_GLIB_TRUE@am__append_3 = glib +@SUPPORT_WORDEXP_TRUE@am__append_4 = wordexp +@SUPPORT_WIN32_TRUE@am__append_5 = win32 +@SUPPORT_ZLIB_TRUE@am__append_6 = zlib +@SUPPORT_LIBC_TRUE@am__append_7 = libc +@SUPPORT_LIBPNG_TRUE@am__append_8 = libpng +@SPEECH_ESPEAK_TRUE@am__append_9 = espeak +@HAVE_SYSTEM_SHAPEFILELIB_FALSE@am__append_10 = shapefile +subdir = navit/support +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = $(am__append_1) $(am__append_2) $(am__append_3) \ + $(am__append_4) $(am__append_5) $(am__append_6) \ + $(am__append_7) $(am__append_8) $(am__append_9) \ + $(am__append_10) +DIST_SUBDIRS = espeak ezxml glib wordexp win32 zlib libc libpng shapefile +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/support/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/support/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/support/espeak/Makefile.am b/navit/support/espeak/Makefile.am new file mode 100755 index 0000000..3de91b4 --- /dev/null +++ b/navit/support/espeak/Makefile.am @@ -0,0 +1,67 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -DMODULE=support_espeak +noinst_LTLIBRARIES = libsupport_espeak.la +libsupport_espeak_la_SOURCES = compiledict.c dictionary.c intonation.c \ + readclause.c setlengths.c numbers.c synth_mbrola.c \ + synthdata.c synthesize.c translate.c \ + tr_languages.c voices.c wavegen.c phonemelist.c klatt.c speak_init.c +libsupport_espeak_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ + +#bin_PROGRAMS = speak + +#speak_SOURCES = speak.c $(libsupport_espeak_la_SOURCES) + +nobase_pkgdata_DATA = espeak-data/af_dict espeak-data/ca_dict espeak-data/config espeak-data/cs_dict espeak-data/cy_dict +nobase_pkgdata_DATA += espeak-data/da_dict espeak-data/de_dict espeak-data/el_dict espeak-data/en_dict espeak-data/eo_dict +nobase_pkgdata_DATA += espeak-data/es_dict espeak-data/fi_dict espeak-data/fr_dict espeak-data/grc_dict espeak-data/hbs_dict +nobase_pkgdata_DATA += espeak-data/hi_dict espeak-data/hu_dict espeak-data/hy_dict espeak-data/id_dict espeak-data/is_dict +nobase_pkgdata_DATA += espeak-data/it_dict espeak-data/jbo_dict espeak-data/ku_dict espeak-data/la_dict espeak-data/lv_dict +nobase_pkgdata_DATA += espeak-data/mk_dict espeak-data/nl_dict espeak-data/no_dict +nobase_pkgdata_DATA += espeak-data/pap_dict espeak-data/phondata espeak-data/phondata-manifest espeak-data/phonindex +nobase_pkgdata_DATA += espeak-data/phontab espeak-data/pl_dict espeak-data/pt_dict espeak-data/ro_dict espeak-data/ru_dict +nobase_pkgdata_DATA += espeak-data/sk_dict espeak-data/sq_dict espeak-data/sv_dict espeak-data/sw_dict espeak-data/ta_dict +nobase_pkgdata_DATA += espeak-data/tr_dict espeak-data/vi_dict espeak-data/voices/!v/croak espeak-data/voices/!v/f1 +nobase_pkgdata_DATA += espeak-data/voices/!v/f2 espeak-data/voices/!v/f3 espeak-data/voices/!v/f4 espeak-data/voices/!v/fast +nobase_pkgdata_DATA += espeak-data/voices/!v/m1 espeak-data/voices/!v/m2 espeak-data/voices/!v/m3 espeak-data/voices/!v/m4 +nobase_pkgdata_DATA += espeak-data/voices/!v/m5 espeak-data/voices/!v/m6 espeak-data/voices/!v/m7 espeak-data/voices/!v/whisper +nobase_pkgdata_DATA += espeak-data/voices/af espeak-data/voices/bs espeak-data/voices/ca espeak-data/voices/cs +nobase_pkgdata_DATA += espeak-data/voices/cy espeak-data/voices/da espeak-data/voices/de espeak-data/voices/default +nobase_pkgdata_DATA += espeak-data/voices/el espeak-data/voices/en/en espeak-data/voices/en/en-n espeak-data/voices/en/en-rp +nobase_pkgdata_DATA += espeak-data/voices/en/en-sc espeak-data/voices/en/en-us espeak-data/voices/en/en-wi +nobase_pkgdata_DATA += espeak-data/voices/en/en-wm espeak-data/voices/eo espeak-data/voices/es espeak-data/voices/es-la +nobase_pkgdata_DATA += espeak-data/voices/fi espeak-data/voices/fr espeak-data/voices/fr-be espeak-data/voices/hi +nobase_pkgdata_DATA += espeak-data/voices/hr espeak-data/voices/hu espeak-data/voices/hy espeak-data/voices/hy-west +nobase_pkgdata_DATA += espeak-data/voices/id espeak-data/voices/is espeak-data/voices/it espeak-data/voices/ku +nobase_pkgdata_DATA += espeak-data/voices/la espeak-data/voices/lv +nobase_pkgdata_DATA += espeak-data/voices/mk espeak-data/voices/nl espeak-data/voices/no espeak-data/voices/pl +nobase_pkgdata_DATA += espeak-data/voices/pt espeak-data/voices/pt-pt espeak-data/voices/ro espeak-data/voices/ru +nobase_pkgdata_DATA += espeak-data/voices/sk espeak-data/voices/sq espeak-data/voices/sr espeak-data/voices/sv +nobase_pkgdata_DATA += espeak-data/voices/sw espeak-data/voices/ta espeak-data/voices/test/grc espeak-data/voices/test/jbo +nobase_pkgdata_DATA += espeak-data/voices/test/pap espeak-data/voices/tr espeak-data/voices/vi espeak-data/voices/zh +nobase_pkgdata_DATA += espeak-data/voices/zh-yue espeak-data/zh_dict espeak-data/zhy_dict + +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/af1_phtrans espeak-data/mbrola_ph/ca1_phtrans espeak-data/mbrola_ph/cr1_phtrans +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/cs_phtrans espeak-data/mbrola_ph/de2_phtrans espeak-data/mbrola_ph/de4_phtrans +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/de6_phtrans espeak-data/mbrola_ph/en1_phtrans espeak-data/mbrola_ph/es_phtrans +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/fr1_phtrans espeak-data/mbrola_ph/gr2_phtrans espeak-data/mbrola_ph/grc-de6_phtrans +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/hu1_phtrans espeak-data/mbrola_ph/id1_phtrans espeak-data/mbrola_ph/in1_phtrans +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/it3_phtrans espeak-data/mbrola_ph/la1_phtrans espeak-data/mbrola_ph/nl_phtrans +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/pl1_phtrans espeak-data/mbrola_ph/pt1_phtrans espeak-data/mbrola_ph/pt_phtrans +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/ptbr4_phtrans espeak-data/mbrola_ph/ptbr_phtrans espeak-data/mbrola_ph/ro1_phtrans +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/sv2_phtrans espeak-data/mbrola_ph/sv_phtrans espeak-data/mbrola_ph/us3_phtrans +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/us_phtrans +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-af1 espeak-data/voices/mb/mb-af1-en +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-br1 espeak-data/voices/mb/mb-br3 espeak-data/voices/mb/mb-br4 +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-cr1 espeak-data/voices/mb/mb-cz2 espeak-data/voices/mb/mb-de2 +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-de4 espeak-data/voices/mb/mb-de4-en espeak-data/voices/mb/mb-de5 +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-de5-en espeak-data/voices/mb/mb-de6 espeak-data/voices/mb/mb-de6-grc +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-de7 espeak-data/voices/mb/mb-en1 espeak-data/voices/mb/mb-es1 +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-es2 espeak-data/voices/mb/mb-fr1 espeak-data/voices/mb/mb-fr1-en +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-fr4 espeak-data/voices/mb/mb-fr4-en espeak-data/voices/mb/mb-gr2 +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-gr2-en espeak-data/voices/mb/mb-hu1 espeak-data/voices/mb/mb-hu1-en +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-id1 espeak-data/voices/mb/mb-it3 espeak-data/voices/mb/mb-it4 +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-la1 espeak-data/voices/mb/mb-nl2 espeak-data/voices/mb/mb-nl2-en +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-pl1 espeak-data/voices/mb/mb-pl1-en espeak-data/voices/mb/mb-pt1 +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-ro1 espeak-data/voices/mb/mb-ro1-en espeak-data/voices/mb/mb-sw1 +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-sw1-en espeak-data/voices/mb/mb-sw2 espeak-data/voices/mb/mb-sw2-en +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-us1 espeak-data/voices/mb/mb-us2 espeak-data/voices/mb/mb-us3 diff --git a/navit/support/espeak/Makefile.in b/navit/support/espeak/Makefile.in new file mode 100644 index 0000000..a8d2925 --- /dev/null +++ b/navit/support/espeak/Makefile.in @@ -0,0 +1,797 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/support/espeak +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libsupport_espeak_la_LIBADD = +am_libsupport_espeak_la_OBJECTS = compiledict.lo dictionary.lo \ + intonation.lo readclause.lo setlengths.lo numbers.lo \ + synth_mbrola.lo synthdata.lo synthesize.lo translate.lo \ + tr_languages.lo voices.lo wavegen.lo phonemelist.lo klatt.lo \ + speak_init.lo +libsupport_espeak_la_OBJECTS = $(am_libsupport_espeak_la_OBJECTS) +libsupport_espeak_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libsupport_espeak_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libsupport_espeak_la_SOURCES) +DIST_SOURCES = $(libsupport_espeak_la_SOURCES) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(pkgdatadir)" +DATA = $(nobase_pkgdata_DATA) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -DMODULE=support_espeak +noinst_LTLIBRARIES = libsupport_espeak.la +libsupport_espeak_la_SOURCES = compiledict.c dictionary.c intonation.c \ + readclause.c setlengths.c numbers.c synth_mbrola.c \ + synthdata.c synthesize.c translate.c \ + tr_languages.c voices.c wavegen.c phonemelist.c klatt.c speak_init.c + +libsupport_espeak_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ + +#bin_PROGRAMS = speak + +#speak_SOURCES = speak.c $(libsupport_espeak_la_SOURCES) +nobase_pkgdata_DATA = espeak-data/af_dict espeak-data/ca_dict \ + espeak-data/config espeak-data/cs_dict espeak-data/cy_dict \ + espeak-data/da_dict espeak-data/de_dict espeak-data/el_dict \ + espeak-data/en_dict espeak-data/eo_dict espeak-data/es_dict \ + espeak-data/fi_dict espeak-data/fr_dict espeak-data/grc_dict \ + espeak-data/hbs_dict espeak-data/hi_dict espeak-data/hu_dict \ + espeak-data/hy_dict espeak-data/id_dict espeak-data/is_dict \ + espeak-data/it_dict espeak-data/jbo_dict espeak-data/ku_dict \ + espeak-data/la_dict espeak-data/lv_dict espeak-data/mk_dict \ + espeak-data/nl_dict espeak-data/no_dict espeak-data/pap_dict \ + espeak-data/phondata espeak-data/phondata-manifest \ + espeak-data/phonindex espeak-data/phontab espeak-data/pl_dict \ + espeak-data/pt_dict espeak-data/ro_dict espeak-data/ru_dict \ + espeak-data/sk_dict espeak-data/sq_dict espeak-data/sv_dict \ + espeak-data/sw_dict espeak-data/ta_dict espeak-data/tr_dict \ + espeak-data/vi_dict espeak-data/voices/!v/croak \ + espeak-data/voices/!v/f1 espeak-data/voices/!v/f2 \ + espeak-data/voices/!v/f3 espeak-data/voices/!v/f4 \ + espeak-data/voices/!v/fast espeak-data/voices/!v/m1 \ + espeak-data/voices/!v/m2 espeak-data/voices/!v/m3 \ + espeak-data/voices/!v/m4 espeak-data/voices/!v/m5 \ + espeak-data/voices/!v/m6 espeak-data/voices/!v/m7 \ + espeak-data/voices/!v/whisper espeak-data/voices/af \ + espeak-data/voices/bs espeak-data/voices/ca \ + espeak-data/voices/cs espeak-data/voices/cy \ + espeak-data/voices/da espeak-data/voices/de \ + espeak-data/voices/default espeak-data/voices/el \ + espeak-data/voices/en/en espeak-data/voices/en/en-n \ + espeak-data/voices/en/en-rp espeak-data/voices/en/en-sc \ + espeak-data/voices/en/en-us espeak-data/voices/en/en-wi \ + espeak-data/voices/en/en-wm espeak-data/voices/eo \ + espeak-data/voices/es espeak-data/voices/es-la \ + espeak-data/voices/fi espeak-data/voices/fr \ + espeak-data/voices/fr-be espeak-data/voices/hi \ + espeak-data/voices/hr espeak-data/voices/hu \ + espeak-data/voices/hy espeak-data/voices/hy-west \ + espeak-data/voices/id espeak-data/voices/is \ + espeak-data/voices/it espeak-data/voices/ku \ + espeak-data/voices/la espeak-data/voices/lv \ + espeak-data/voices/mk espeak-data/voices/nl \ + espeak-data/voices/no espeak-data/voices/pl \ + espeak-data/voices/pt espeak-data/voices/pt-pt \ + espeak-data/voices/ro espeak-data/voices/ru \ + espeak-data/voices/sk espeak-data/voices/sq \ + espeak-data/voices/sr espeak-data/voices/sv \ + espeak-data/voices/sw espeak-data/voices/ta \ + espeak-data/voices/test/grc espeak-data/voices/test/jbo \ + espeak-data/voices/test/pap espeak-data/voices/tr \ + espeak-data/voices/vi espeak-data/voices/zh \ + espeak-data/voices/zh-yue espeak-data/zh_dict \ + espeak-data/zhy_dict +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/support/espeak/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/support/espeak/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libsupport_espeak.la: $(libsupport_espeak_la_OBJECTS) $(libsupport_espeak_la_DEPENDENCIES) + $(libsupport_espeak_la_LINK) $(libsupport_espeak_la_OBJECTS) $(libsupport_espeak_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compiledict.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dictionary.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/intonation.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/klatt.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/numbers.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/phonemelist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readclause.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setlengths.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/speak_init.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/synth_mbrola.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/synthdata.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/synthesize.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tr_languages.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/translate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/voices.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wavegen.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-nobase_pkgdataDATA: $(nobase_pkgdata_DATA) + @$(NORMAL_INSTALL) + test -z "$(pkgdatadir)" || $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" + @list='$(nobase_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ + $(am__nobase_list) | while read dir files; do \ + xfiles=; for file in $$files; do \ + if test -f "$$file"; then xfiles="$$xfiles $$file"; \ + else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ + test -z "$$xfiles" || { \ + test "x$$dir" = x. || { \ + echo "$(MKDIR_P) '$(DESTDIR)$(pkgdatadir)/$$dir'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)/$$dir"; }; \ + echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(pkgdatadir)/$$dir'"; \ + $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(pkgdatadir)/$$dir" || exit $$?; }; \ + done + +uninstall-nobase_pkgdataDATA: + @$(NORMAL_UNINSTALL) + @list='$(nobase_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ + $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(pkgdatadir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(pkgdatadir)" && rm -f $$files + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(DATA) +installdirs: + for dir in "$(DESTDIR)$(pkgdatadir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-nobase_pkgdataDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-nobase_pkgdataDATA + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-nobase_pkgdataDATA install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-nobase_pkgdataDATA + + +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/af1_phtrans espeak-data/mbrola_ph/ca1_phtrans espeak-data/mbrola_ph/cr1_phtrans +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/cs_phtrans espeak-data/mbrola_ph/de2_phtrans espeak-data/mbrola_ph/de4_phtrans +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/de6_phtrans espeak-data/mbrola_ph/en1_phtrans espeak-data/mbrola_ph/es_phtrans +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/fr1_phtrans espeak-data/mbrola_ph/gr2_phtrans espeak-data/mbrola_ph/grc-de6_phtrans +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/hu1_phtrans espeak-data/mbrola_ph/id1_phtrans espeak-data/mbrola_ph/in1_phtrans +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/it3_phtrans espeak-data/mbrola_ph/la1_phtrans espeak-data/mbrola_ph/nl_phtrans +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/pl1_phtrans espeak-data/mbrola_ph/pt1_phtrans espeak-data/mbrola_ph/pt_phtrans +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/ptbr4_phtrans espeak-data/mbrola_ph/ptbr_phtrans espeak-data/mbrola_ph/ro1_phtrans +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/sv2_phtrans espeak-data/mbrola_ph/sv_phtrans espeak-data/mbrola_ph/us3_phtrans +#nobase_pkgdata_DATA += espeak-data/mbrola_ph/us_phtrans +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-af1 espeak-data/voices/mb/mb-af1-en +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-br1 espeak-data/voices/mb/mb-br3 espeak-data/voices/mb/mb-br4 +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-cr1 espeak-data/voices/mb/mb-cz2 espeak-data/voices/mb/mb-de2 +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-de4 espeak-data/voices/mb/mb-de4-en espeak-data/voices/mb/mb-de5 +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-de5-en espeak-data/voices/mb/mb-de6 espeak-data/voices/mb/mb-de6-grc +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-de7 espeak-data/voices/mb/mb-en1 espeak-data/voices/mb/mb-es1 +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-es2 espeak-data/voices/mb/mb-fr1 espeak-data/voices/mb/mb-fr1-en +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-fr4 espeak-data/voices/mb/mb-fr4-en espeak-data/voices/mb/mb-gr2 +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-gr2-en espeak-data/voices/mb/mb-hu1 espeak-data/voices/mb/mb-hu1-en +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-id1 espeak-data/voices/mb/mb-it3 espeak-data/voices/mb/mb-it4 +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-la1 espeak-data/voices/mb/mb-nl2 espeak-data/voices/mb/mb-nl2-en +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-pl1 espeak-data/voices/mb/mb-pl1-en espeak-data/voices/mb/mb-pt1 +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-ro1 espeak-data/voices/mb/mb-ro1-en espeak-data/voices/mb/mb-sw1 +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-sw1-en espeak-data/voices/mb/mb-sw2 espeak-data/voices/mb/mb-sw2-en +#nobase_pkgdata_DATA += espeak-data/voices/mb/mb-us1 espeak-data/voices/mb/mb-us2 espeak-data/voices/mb/mb-us3 + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/support/espeak/compiledict.c b/navit/support/espeak/compiledict.c new file mode 100755 index 0000000..a2b7865 --- /dev/null +++ b/navit/support/espeak/compiledict.c @@ -0,0 +1,1671 @@ +/*************************************************************************** + * Copyright (C) 2005 to 2007 by Jonathan Duddington * + * email: jonsd@users.sourceforge.net * + * * + * 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; either version 3 of the License, or * + * (at your option) any later version. * + * * + * 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 see: * + * . * + ***************************************************************************/ + +#include "StdAfx.h" + +#include +#include +#include +#include +#include + +#include "speak_lib.h" +#include "speech.h" +#include "phoneme.h" +#include "synthesize.h" +#include "translate.h" + +//#define OPT_FORMAT // format the text and write formatted copy to Log file +//#define OUTPUT_FORMAT + +extern void Write4Bytes(FILE *f, int value); +int HashDictionary(const char *string); + +static FILE *f_log = NULL; +extern char *dir_dictionary; + +static int linenum; +static int error_count; +static int transpose_offset; // transpose character range for LookupDictList() +static int transpose_min; +static int transpose_max; +static int text_mode = 0; +static int debug_flag = 0; + +static int hash_counts[N_HASH_DICT]; +static char *hash_chains[N_HASH_DICT]; +static char letterGroupsDefined[N_LETTER_GROUPS]; + +#define __cdecl + +MNEM_TAB mnem_flags[] = { + // these in the first group put a value in bits0-3 of dictionary_flags + {"$1", 0x41}, // stress on 1st syllable + {"$2", 0x42}, // stress on 2nd syllable + {"$3", 0x43}, + {"$4", 0x44}, + {"$5", 0x45}, + {"$6", 0x46}, + {"$7", 0x47}, + {"$u", 0x48}, // reduce to unstressed + {"$u1", 0x49}, + {"$u2", 0x4a}, + {"$u3", 0x4b}, + {"$u+", 0x4c}, // reduce to unstressed, but stress at end of clause + {"$u1+", 0x4d}, + {"$u2+", 0x4e}, + {"$u3+", 0x4f}, + + + // these set the corresponding numbered bit if dictionary_flags + {"$pause", 8}, /* ensure pause before this word */ + {"$only", 9}, /* only match on this word without suffix */ + {"$onlys", 10}, /* only match with none, or with 's' suffix */ + {"$strend", 11}, /* full stress if at end of clause */ + {"$strend2", 12}, /* full stress if at end of clause, or only followed by unstressed */ + {"$unstressend",13}, /* reduce stress at end of clause */ + {"$atend", 14}, /* use this pronunciation if at end of clause */ + + {"$dot", 16}, /* ignore '.' after this word (abbreviation) */ + {"$abbrev", 17}, /* use this pronuciation rather than split into letters */ + {"$stem", 18}, // must have a suffix + +// language specific + {"$double", 19}, // IT double the initial consonant of next word + {"$alt", 20}, // use alternative pronunciation + {"$alt2", 21}, + + + {"$max3", 27}, // limit to 3 repetitions + {"$brk", 28}, // a shorter $pause + {"$text", 29}, // word translates to replcement text, not phonemes + +// flags in dictionary word 2 + {"$verbf", 0x20}, /* verb follows */ + {"$verbsf", 0x21}, /* verb follows, allow -s suffix */ + {"$nounf", 0x22}, /* noun follows */ + {"$pastf", 0x23}, /* past tense follows */ + {"$verb", 0x24}, /* use this pronunciation when its a verb */ + {"$noun", 0x25}, /* use this pronunciation when its a noun */ + {"$past", 0x26}, /* use this pronunciation when its past tense */ + {"$verbextend",0x28}, /* extend influence of 'verb follows' */ + {"$capital", 0x29}, /* use this pronunciation if initial letter is upper case */ + {"$allcaps", 0x2a}, /* use this pronunciation if initial letter is upper case */ + {"$accent", 0x2b}, // character name is base-character name + accent name + + // doesn't set dictionary_flags + {"$?", 100}, // conditional rule, followed by byte giving the condition number + + {"$textmode", 200}, + {"$phonememode", 201}, + {NULL, -1} +}; + + +#define LEN_GROUP_NAME 12 + +typedef struct { + char name[LEN_GROUP_NAME+1]; + unsigned int start; + unsigned int length; +} RGROUP; + + +int isspace2(unsigned int c) +{//========================= +// can't use isspace() because on Windows, isspace(0xe1) gives TRUE ! + int c2; + + if(((c2 = (c & 0xff)) == 0) || (c > ' ')) + return(0); + return(1); +} + + +static const char *LookupMnem2(MNEM_TAB *table, int value) +{//======================================================= + while(table->mnem != NULL) + { + if(table->value == value) + return(table->mnem); + table++; + } + return(""); +} + + +char *print_dictionary_flags(unsigned int *flags) +{//============================================== + static char buf[20]; + + sprintf(buf,"%s 0x%x/%x",LookupMnem2(mnem_flags,(flags[0] & 0xf)+0x40), flags[0], flags[1]); + return(buf); +} + + + +static FILE *fopen_log(const char *fname,const char *access) +{//================================================== +// performs fopen, but produces error message to f_log if it fails + FILE *f; + + if((f = fopen(fname,access)) == NULL) + { + if(f_log != NULL) + fprintf(f_log,"Can't access (%s) file '%s'\n",access,fname); + } + return(f); +} + + +#ifdef OPT_FORMAT +static const char *lookup_mnem(MNEM_TAB *table, int value) +//======================================================== +/* Lookup a mnemonic string in a table, return its name */ +{ + while(table->mnem != NULL) + { + if(table->value==value) + return(table->mnem); + table++; + } + return("??"); /* not found */ +} /* end of mnem */ +#endif + + + + +static int compile_line(char *linebuf, char *dict_line, int *hash) +{//=============================================================== +// Compile a line in the language_list file + unsigned char c; + char *p; + char *word; + char *phonetic; + unsigned int ix; + int step; + unsigned int n_flag_codes = 0; + int flag_offset; + int length; + int multiple_words = 0; + int multiple_numeric_hyphen = 0; + char *multiple_string = NULL; + char *multiple_string_end = NULL; + + int len_word; + int len_phonetic; + int text_not_phonemes; // this word specifies replacement text, not phonemes + unsigned int wc; + int all_upper_case; + + char *mnemptr; + char *comment; + unsigned char flag_codes[100]; + char encoded_ph[200]; + unsigned char bad_phoneme[4]; +static char nullstring[] = {0}; + + comment = NULL; + text_not_phonemes = 0; + phonetic = word = nullstring; + +if(memcmp(linebuf,"_-",2)==0) +{ +step=1; // TEST +} + p = linebuf; +// while(isspace2(*p)) p++; + +#ifdef deleted + if(*p == '$') + { + if(memcmp(p,"$textmode",9) == 0) + { + text_mode = 1; + return(0); + } + if(memcmp(p,"$phonememode",12) == 0) + { + text_mode = 0; + return(0); + } + } +#endif + + step = 0; + + c = 0; + while(c != '\n') + { + c = *p; + + if((c == '?') && (step==0)) + { + // conditional rule, allow only if the numbered condition is set for the voice + flag_offset = 100; + + p++; + if(*p == '!') + { + // allow only if the numbered condition is NOT set + flag_offset = 132; + p++; + } + + ix = 0; + if(isdigit(*p)) + { + ix += (*p-'0'); + p++; + } + if(isdigit(*p)) + { + ix = ix*10 + (*p-'0'); + p++; + } + flag_codes[n_flag_codes++] = ix + flag_offset; + c = *p; + } + + if((c == '$') && isalnum(p[1])) + { + /* read keyword parameter */ + mnemptr = p; + while(!isspace2(c = *p)) p++; + *p = 0; + + ix = LookupMnem(mnem_flags,mnemptr); + if(ix > 0) + { + if(ix == 200) + { + text_mode = 1; + } + else + if(ix == 201) + { + text_mode = 0; + } + else + if(ix == BITNUM_FLAG_TEXTMODE) + { + text_not_phonemes = 1; + } + else + { + flag_codes[n_flag_codes++] = ix; + } + } + else + { + fprintf(f_log,"%5d: Unknown keyword: %s\n",linenum,mnemptr); + error_count++; + } + } + + if((c == '/') && (p[1] == '/') && (multiple_words==0)) + { + c = '\n'; /* "//" treat comment as end of line */ + comment = p; + } + + switch(step) + { + case 0: + if(c == '(') + { + multiple_words = 1; + word = p+1; + step = 1; + } + else + if(!isspace2(c)) + { + word = p; + step = 1; + } + break; + + case 1: + if((c == '-') && (word[0] != '_')) + { + if(isdigit(word[0])) + { + multiple_numeric_hyphen = 1; + } + else + { + flag_codes[n_flag_codes++] = BITNUM_FLAG_HYPHENATED; + } + c = ' '; + } + if(isspace2(c)) + { + p[0] = 0; /* terminate english word */ + + if(multiple_words) + { + multiple_string = multiple_string_end = p+1; + step = 2; + } + else + { + step = 3; + } + } + else + if((c == ')') && multiple_words) + { + p[0] = 0; + step = 3; + multiple_words = 0; + } + break; + + case 2: + if(isspace2(c)) + { + multiple_words++; + } + else + if(c == ')') + { + p[0] = ' '; // terminate extra string + multiple_string_end = p+1; + step = 3; + } + break; + + case 3: + if(!isspace2(c)) + { + phonetic = p; + step = 4; + } + break; + + case 4: + if(isspace2(c)) + { + p[0] = 0; /* terminate phonetic */ + step = 5; + } + break; + + case 5: + break; + } + p++; + } + + if(word[0] == 0) + { +#ifdef OPT_FORMAT + if(comment != NULL) + fprintf(f_log,"%s",comment); + else + fputc('\n',f_log); +#endif + return(0); /* blank line */ + } + + if(text_mode) + text_not_phonemes = 1; + + if(text_not_phonemes != translator->langopts.textmode) + { + flag_codes[n_flag_codes++] = BITNUM_FLAG_TEXTMODE; + } + + if(text_not_phonemes) + { + // this is replacement text, so don't encode as phonemes. Restrict the length of the replacement word + strncpy0(encoded_ph,phonetic,N_WORD_BYTES-4); + } + else + { + EncodePhonemes(phonetic,encoded_ph,bad_phoneme); + if(strchr(encoded_ph,phonSWITCH) != 0) + { + flag_codes[n_flag_codes++] = BITNUM_FLAG_ONLY_S; // don't match on suffixes (except 's') when switching languages + } + + // check for errors in the phonemes codes + for(ix=0; ix 0) + { + len_word = TransposeAlphabet(word, transpose_offset, transpose_min, transpose_max); + } + + *hash = HashDictionary(word); + len_phonetic = strlen(encoded_ph); + + dict_line[1] = len_word; // bit 6 indicates whether the word has been compressed + len_word &= 0x3f; + + memcpy(&dict_line[2],word,len_word); + + if(len_phonetic == 0) + { + // no phonemes specified. set bit 7 + dict_line[1] |= 0x80; + length = len_word + 2; + } + else + { + length = len_word + len_phonetic + 3; + strcpy(&dict_line[(len_word)+2],encoded_ph); + } + + for(ix=0; ix 0)) + { + if(multiple_words > 10) + { + fprintf(f_log,"%5d: Two many parts in a multi-word entry: %d\n",linenum,multiple_words); + } + else + { + dict_line[length++] = 80 + multiple_words + multiple_numeric_hyphen; // if numeric, count a hyphen as an extra word + ix = multiple_string_end - multiple_string; + if(multiple_numeric_hyphen) + { + // the first part is numeric, so keep the hyphen to match on + dict_line[length++] = '-'; + dict_line[length++] = ' '; + } + memcpy(&dict_line[length],multiple_string,ix); + length += ix; + } + } + dict_line[0] = length; + +#ifdef OPT_FORMAT + spaces = 16; + for(ix=0; ix= 100) + { + fprintf(f_log,"?%d ",flag_codes[ix]-100); + spaces -= 3; + } + } + + fprintf(f_log,"%s",word); + spaces -= strlen(word); + DecodePhonemes(encoded_ph,decoded_ph); + while(spaces-- > 0) fputc(' ',f_log); + spaces += (14 - strlen(decoded_ph)); + + fprintf(f_log," %s",decoded_ph); + while(spaces-- > 0) fputc(' ',f_log); + for(ix=0; ix 0) + rule_phonemes[len++] = ' '; + output = &rule_phonemes[len]; + } + sxflags = 0x808000; // to ensure non-zero bytes + + for(p=string,ix=0;;) + { + literal = 0; + c = *p++; + if(c == '\\') + { + c = *p++; // treat next character literally + if((c >= '0') && (c <= '3') && (p[0] >= '0') && (p[0] <= '7') && (p[1] >= '0') && (p[1] <= '7')) + { + // character code given by 3 digit octal value; + c = (c-'0')*64 + (p[0]-'0')*8 + (p[1]-'0'); + p += 2; + } + literal = 1; + } + + if(((*state)==1) || ((*state)==3)) + { + // replace special characters (note: 'E' is reserved for a replaced silent 'e') + if(literal == 0) + { + static const char lettergp_letters[9] = {LETTERGP_A,LETTERGP_B,LETTERGP_C,0,0,LETTERGP_F,LETTERGP_G,LETTERGP_H,LETTERGP_Y}; + switch(c) + { + case '_': + c = RULE_SPACE; + break; + + case 'Y': + c = 'I'; // drop through to next case + case 'A': // vowel + case 'B': + case 'C': + case 'H': + case 'F': + case 'G': + if((*state) == 1) + { + // pre-rule, put the number before the RULE_LETTERGP; + output[ix++] = lettergp_letters[c-'A'] + 'A'; + c = RULE_LETTERGP; + } + else + { + output[ix++] = RULE_LETTERGP; + c = lettergp_letters[c-'A'] + 'A'; + } + break; + case 'D': + c = RULE_DIGIT; + break; + case 'K': + c = RULE_NOTVOWEL; + break; + case 'N': + c = RULE_NO_SUFFIX; + break; + case 'V': + c = RULE_IFVERB; + break; + case 'Z': + c = RULE_NONALPHA; + break; + case '+': + c = RULE_INC_SCORE; + break; + case '@': + c = RULE_SYLLABLE; + break; + case '&': + c = RULE_STRESSED; + break; + case '%': + c = RULE_DOUBLE; + break; + case '#': + c = RULE_DEL_FWD; + break; + case '!': + c = RULE_CAPITAL; + break; + case 'T': + c = RULE_ALT1; + break; + case 'W': + c = RULE_SPELLING; + break; + case 'X': + c = RULE_NOVOWELS; + break; + case 'L': + // expect two digits + c = *p++ - '0'; + value = *p++ - '0'; + c = c * 10 + value; + if((value < 0) || (value > 9)) + { + c = 0; + fprintf(f_log,"%5d: Expected 2 digits after 'L'\n",linenum); + error_count++; + } + else + if((c <= 0) || (c >= N_LETTER_GROUPS) || (letterGroupsDefined[(int)c] == 0)) + { + fprintf(f_log,"%5d: Letter group L%.2d not defined\n",linenum,c); + error_count++; + } + c += 'A'; + if((*state) == 1) + { + // pre-rule, put the group number before the RULE_LETTERGP command + output[ix++] = c; + c = RULE_LETTERGP2; + } + else + { + output[ix++] = RULE_LETTERGP2; + } + break; + + case '$': // obsolete, replaced by S + fprintf(f_log,"%5d: $ now not allowed, use S for suffix",linenum); + error_count++; + break; + case 'P': + sxflags |= SUFX_P; // Prefix, now drop through to Suffix + case 'S': + output[ix++] = RULE_ENDING; + value = 0; + while(!isspace2(c = *p++) && (c != 0)) + { + switch(c) + { + case 'e': + sxflags |= SUFX_E; + break; + case 'i': + sxflags |= SUFX_I; + break; + case 'p': // obsolete, replaced by 'P' above + sxflags |= SUFX_P; + break; + case 'v': + sxflags |= SUFX_V; + break; + case 'd': + sxflags |= SUFX_D; + break; + case 'f': + sxflags |= SUFX_F; + break; + case 'q': + sxflags |= SUFX_Q; + break; + case 't': + sxflags |= SUFX_T; + break; + case 'b': + sxflags |= SUFX_B; + break; + default: + if(isdigit(c)) + value = (value*10) + (c - '0'); + break; + } + } + p--; + output[ix++] = sxflags >> 16; + output[ix++] = sxflags >> 8; + c = value | 0x80; + break; + } + } + } + output[ix++] = c; + if(c == 0) break; + } + + *state = next_state[*state]; +} // end of copy_rule_string + + + +static char *compile_rule(char *input) +{//=================================== + int ix; + unsigned char c; + int wc; + char *p; + char *prule; + int len; + int len_name; + int state=2; + int finish=0; + int pre_bracket=0; + char buf[80]; + char output[150]; + unsigned char bad_phoneme[4]; + + buf[0]=0; + rule_cond[0]=0; + rule_pre[0]=0; + rule_post[0]=0; + rule_match[0]=0; + rule_phonemes[0]=0; + + p = buf; + + for(ix=0; finish==0; ix++) + { + c = input[ix]; + + switch(c = input[ix]) + { + case ')': // end of prefix section + *p = 0; + state = 1; + pre_bracket = 1; + copy_rule_string(buf,&state); + p = buf; + break; + + case '(': // start of suffix section + *p = 0; + state = 2; + copy_rule_string(buf,&state); + state = 3; + p = buf; + break; + + case '\n': // end of line + case '\r': + case 0: // end of line + *p = 0; + copy_rule_string(buf,&state); + finish=1; + break; + + case '\t': // end of section section + case ' ': + *p = 0; + copy_rule_string(buf,&state); + p = buf; + break; + + case '?': + if(state==2) + state=0; + else + *p++ = c; + break; + + default: + *p++ = c; + break; + } + } + + if(strcmp(rule_match,"$group")==0) + strcpy(rule_match,group_name); + + if(rule_match[0]==0) + return(NULL); + + EncodePhonemes(rule_phonemes,buf,bad_phoneme); + for(ix=0;; ix++) + { + if((c = buf[ix])==0) break; + if(c==255) + { + fprintf(f_log,"%5d: Bad phoneme [%c] in %s",linenum,bad_phoneme[0],input); + error_count++; + break; + } + } + strcpy(output,buf); + len = strlen(buf)+1; + + len_name = strlen(group_name); + if((len_name > 0) && (memcmp(rule_match,group_name,len_name) != 0)) + { + utf8_in(&wc,rule_match); + if((group_name[0] == '9') && IsDigit(wc)) + { + // numeric group, rule_match starts with a digit, so OK + } + else + { + fprintf(f_log,"%5d: Wrong initial letters '%s' for group '%s'\n",linenum,rule_match,group_name); + error_count++; + } + } + strcpy(&output[len],rule_match); + len += strlen(rule_match); + + if(debug_flag) + { + output[len] = RULE_LINENUM; + output[len+1] = (linenum % 255) + 1; + output[len+2] = (linenum / 255) + 1; + len+=3; + } + + if(rule_cond[0] != 0) + { + ix = -1; + if(rule_cond[0] == '!') + { + // allow the rule only if the condition number is NOT set for the voice + ix = atoi(&rule_cond[1]) + 32; + } + else + { + // allow the rule only if the condition number is set for the voice + ix = atoi(rule_cond); + } + + if((ix > 0) && (ix < 255)) + { + output[len++] = RULE_CONDITION; + output[len++] = ix; + } + else + { + fprintf(f_log,"%5d: bad condition number ?%d\n",linenum,ix); + error_count++; + } + } + if(rule_pre[0] != 0) + { + output[len++] = RULE_PRE; + // output PRE string in reverse order + for(ix = strlen(rule_pre)-1; ix>=0; ix--) + output[len++] = rule_pre[ix]; + } + + if(rule_post[0] != 0) + { + sprintf(&output[len],"%c%s",RULE_POST,rule_post); + len += (strlen(rule_post)+1); + } + output[len++]=0; + prule = (char *)malloc(len); + memcpy(prule,output,len); + return(prule); +} // end of compile_rule + + +static int __cdecl string_sorter(char **a, char **b) +{//================================================= + char *pa, *pb; + int ix; + + if((ix = strcmp(pa = *a,pb = *b)) != 0) + return(ix); + pa += (strlen(pa)+1); + pb += (strlen(pb)+1); + return(strcmp(pa,pb)); +} /* end of string_sorter */ + + +static int __cdecl rgroup_sorter(RGROUP *a, RGROUP *b) +{//=================================================== + int ix; + ix = strcmp(a->name,b->name); + if(ix != 0) return(ix); + return(a->start-b->start); +} + + +#ifdef OUTPUT_FORMAT +static void print_rule_group(FILE *f_out, int n_rules, char **rules, char *name) +{//============================================================================= + int rule; + int ix; + unsigned char c; + int len1; + int len2; + int spaces; + char *p; + char *pout; + int condition; + char buf[80]; + char suffix[12]; + + static unsigned char symbols[] = {'@','&','%','+','#','$','D','Z','A','B','C','F'}; + + fprintf(f_out,"\n$group %s\n",name); + + for(rule=0; rule 0) + { + sprintf(buf,"?%d ",condition); + spaces -= strlen(buf); + fprintf(f_out,"%s",buf); + } + + if(rule_pre[0] != 0) + { + p = buf; + for(ix=strlen(rule_pre)-1;ix>=0;ix--) + *p++ = rule_pre[ix]; + sprintf(p,") "); + spaces -= strlen(buf); + for(ix=0; ix 30) + printf("Group %s %c %d\n",name,ix,nextchar_count[ix]); + } +#endif +} // end of output_rule_group + + + +static int compile_lettergroup(char *input, FILE *f_out) +{//===================================================== + char *p; + char *p_start; + int group; + int ix; + int n_items; + int length; + int max_length = 0; + + #define N_LETTERGP_ITEMS 200 + char *items[N_LETTERGP_ITEMS]; + char item_length[N_LETTERGP_ITEMS]; + + p = input; + if(!isdigit(p[0]) || !isdigit(p[1])) + { + fprintf(f_log,"%5d: Expected 2 digits after '.L'\n",linenum); + error_count++; + return(1); + } + + group = atoi(&p[0]); + if(group >= N_LETTER_GROUPS) + { + fprintf(f_log,"%5d: lettergroup out of range (01-%.2d)\n",linenum,N_LETTER_GROUPS-1); + error_count++; + return(1); + } + + while(!isspace2(*p)) p++; + + fputc(RULE_GROUP_START,f_out); + fputc(RULE_LETTERGP2,f_out); + fputc(group + 'A', f_out); + if(letterGroupsDefined[group] != 0) + { + fprintf(f_log,"%5d: lettergroup L%.2d is already defined\n",linenum,group); + error_count++; + } + letterGroupsDefined[group] = 1; + + n_items = 0; + while(n_items < N_LETTERGP_ITEMS) + { + while(isspace2(*p)) p++; + if(*p == 0) + break; + + items[n_items] = p_start = p; + while((*p & 0xff) > ' ') + { + p++; + } + *p++ = 0; + length = p - p_start; + if(length > max_length) + max_length = length; + item_length[n_items++] = length; + } + + // write out the items, longest first + while(max_length > 1) + { + for(ix=0; ix < n_items; ix++) + { + if(item_length[ix] == max_length) + { + fwrite(items[ix],1,max_length,f_out); + } + } + max_length--; + } + + fputc(RULE_GROUP_END,f_out); + + return(0); +} + + +static int compile_dictrules(FILE *f_in, FILE *f_out, char *fname_temp) +{//==================================================================== + char *prule; + unsigned char *p; + int ix; + int c; + int gp; + FILE *f_temp; + int n_rules=0; + int count=0; + int different; + const char *prev_rgroup_name; + unsigned int char_code; + int compile_mode=0; + char *buf; + char buf1[200]; + char *rules[N_RULES]; + + int n_rgroups = 0; + RGROUP rgroup[N_RULE_GROUP2]; + + linenum = 0; + group_name[0] = 0; + + if((f_temp = fopen_log(fname_temp,"wb")) == NULL) + return(1); + + for(;;) + { + linenum++; + buf = fgets(buf1,sizeof(buf1),f_in); + if(buf != NULL) + { + if((p = (unsigned char *)strstr(buf,"//")) != NULL) + *p = 0; + + if(buf[0] == '\r') buf++; // ignore extra \r in \r\n + } + + if((buf == NULL) || (buf[0] == '.')) + { + // next .group or end of file, write out the previous group + + if(n_rules > 0) + { + strcpy(rgroup[n_rgroups].name,group_name); + rgroup[n_rgroups].start = ftell(f_temp); + output_rule_group(f_temp,n_rules,rules,group_name); + rgroup[n_rgroups].length = ftell(f_temp) - rgroup[n_rgroups].start; + n_rgroups++; + + count += n_rules; + } + n_rules = 0; + + if(compile_mode == 2) + { + // end of the character replacements section + fwrite(&n_rules,1,4,f_out); // write a zero word to terminate the replacemenmt list + compile_mode = 0; + } + + if(buf == NULL) break; // end of file + + if(memcmp(buf,".L",2)==0) + { + compile_lettergroup(&buf[2], f_out); + continue; + } + + if(memcmp(buf,".replace",8)==0) + { + compile_mode = 2; + fputc(RULE_GROUP_START,f_out); + fputc(RULE_REPLACEMENTS,f_out); + + // advance to next word boundary + while((ftell(f_out) & 3) != 0) + fputc(0,f_out); + } + + if(memcmp(buf,".group",6)==0) + { + compile_mode = 1; + + p = (unsigned char *)&buf[6]; + while((p[0]==' ') || (p[0]=='\t')) p++; // Note: Windows isspace(0xe1) gives TRUE ! + ix = 0; + while((*p > ' ') && (ix < LEN_GROUP_NAME)) + group_name[ix++] = *p++; + group_name[ix]=0; + + if(sscanf(group_name,"0x%x",&char_code)==1) + { + // group character is given as a character code (max 16 bits) + p = (unsigned char *)group_name; + + if(char_code > 0x100) + { + *p++ = (char_code >> 8); + } + *p++ = char_code; + *p = 0; + } + + if(strlen(group_name) > 2) + { + if(utf8_in(&c,group_name) < 2) + { + fprintf(f_log,"%5d: Group name longer than 2 bytes (UTF8)",linenum); + error_count++; + } + + group_name[2] = 0; + } + } + + continue; + } + + switch(compile_mode) + { + case 1: // .group + prule = compile_rule(buf); + if((prule != NULL) && (n_rules < N_RULES)) + { + rules[n_rules++] = prule; + } + break; + + case 2: // .replace + { + int replace1; + int replace2; + char *p; + + p = buf; + replace1 = 0; + replace2 = 0; + while(isspace2(*p)) p++; + ix = 0; + while((unsigned char)(*p) > 0x20) // not space or zero-byte + { + p += utf8_in(&c,p); + replace1 += (c << ix); + ix += 16; + } + while(isspace2(*p)) p++; + ix = 0; + while((unsigned char)(*p) > 0x20) + { + p += utf8_in(&c,p); + replace2 += (c << ix); + ix += 16; + } + if(replace1 != 0) + { + Write4Bytes(f_out,replace1); // write as little-endian + Write4Bytes(f_out,replace2); // if big-endian, reverse the bytes in LoadDictionary() + } + } + break; + } + } + fclose(f_temp); + + qsort((void *)rgroup,n_rgroups,sizeof(rgroup[0]),(int (__cdecl *)(const void *,const void *))rgroup_sorter); + + if((f_temp = fopen(fname_temp,"rb"))==NULL) + return(2); + + prev_rgroup_name = "\n"; + + for(gp = 0; gp < n_rgroups; gp++) + { + fseek(f_temp,rgroup[gp].start,SEEK_SET); + + if((different = strcmp(rgroup[gp].name, prev_rgroup_name)) != 0) + { + // not the same as the previous group + if(gp > 0) + fputc(RULE_GROUP_END,f_out); + fputc(RULE_GROUP_START,f_out); + fprintf(f_out, prev_rgroup_name = rgroup[gp].name); + fputc(0,f_out); + } + + for(ix=rgroup[gp].length; ix>0; ix--) + { + c = fgetc(f_temp); + fputc(c,f_out); + } + + if(different) + { + } + } + fputc(RULE_GROUP_END,f_out); + fputc(0,f_out); + + fclose(f_temp); +#if 0 + remove(fname_temp); +#endif + + fprintf(f_log,"\t%d rules, %d groups\n\n",count,n_rgroups); + return(0); +} // end of compile_dictrules + + + +int CompileDictionary(const char *dsource, const char *dict_name, FILE *log, char *fname_err, int flags) +{//===================================================================================================== +// fname: space to write the filename in case of error +// flags: bit 0: include source line number information, for debug purposes. + + FILE *f_in; + FILE *f_out; + int offset_rules=0; + int value; + char fname_in[sizeof(path_home)+45]; + char fname_out[sizeof(path_home)+15]; + char fname_temp[sizeof(path_home)+15]; + char path[sizeof(path_home)+40]; // path_dsource+20 + + error_count = 0; + memset(letterGroupsDefined,0,sizeof(letterGroupsDefined)); + + debug_flag = flags & 1; + + if(dsource == NULL) + dsource = ""; + + f_log = log; +//f_log = fopen("log2.txt","w"); + if(f_log == NULL) + f_log = stderr; + + sprintf(path,"%s%s_",dsource,dict_name); + sprintf(fname_in,"%srules",path); + f_in = fopen_log(fname_in,"r"); + if(f_in == NULL) + { + if(fname_err) + strcpy(fname_err,fname_in); + return(-1); + } + + sprintf(fname_out,"%s%c%s_dict",path_home,PATHSEP,dict_name); + if((f_out = fopen_log(fname_out,"wb+")) == NULL) + { + if(fname_err) + strcpy(fname_err,fname_in); + return(-1); + } + sprintf(fname_temp,"%s%ctemp",path_home,PATHSEP); + + transpose_offset = 0; + + if(strcmp(dict_name,"ru") == 0) + { + // transpose cyrillic alphabet from unicode to iso8859-5 +// transpose_offset = 0x430-0xd0; + transpose_offset = 0x42f; // range 0x01 to 0x22 + transpose_min = 0x430; + transpose_max = 0x451; + } + + value = N_HASH_DICT; + Write4Bytes(f_out,value); + Write4Bytes(f_out,offset_rules); + + compile_dictlist_start(); + + fprintf(f_log,"Using phonemetable: '%s'\n",phoneme_tab_list[phoneme_tab_number].name); + compile_dictlist_file(path,"roots"); + if(translator->langopts.listx) + { + compile_dictlist_file(path,"list"); + compile_dictlist_file(path,"listx"); + } + else + { + compile_dictlist_file(path,"listx"); + compile_dictlist_file(path,"list"); + } + compile_dictlist_file(path,"extra"); + + compile_dictlist_end(f_out); + offset_rules = ftell(f_out); + + fprintf(f_log,"Compiling: '%s'\n",fname_in); + + compile_dictrules(f_in,f_out,fname_temp); + fclose(f_in); + + fseek(f_out,4,SEEK_SET); + Write4Bytes(f_out,offset_rules); + fclose(f_out); + + LoadDictionary(translator, dict_name, 0); + + return(error_count); +} // end of compile_dictionary + diff --git a/navit/support/espeak/dictionary.c b/navit/support/espeak/dictionary.c new file mode 100755 index 0000000..d7dd3dc --- /dev/null +++ b/navit/support/espeak/dictionary.c @@ -0,0 +1,3490 @@ +/*************************************************************************** + * Copyright (C) 2005 to 2007 by Jonathan Duddington * + * email: jonsd@users.sourceforge.net * + * * + * 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; either version 3 of the License, or * + * (at your option) any later version. * + * * + * 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 see: * + * . * + ***************************************************************************/ + +#include "StdAfx.h" + +#define LOG_TRANSLATE + +#include +#include +#include +#include + +#include +#include + +#include "speak_lib.h" +#include "speech.h" +#include "phoneme.h" +#include "synthesize.h" +#include "translate.h" + + +int dictionary_skipwords; +char dictionary_name[40]; + +extern char *print_dictionary_flags(unsigned int *flags); + +// accented characters which indicate (in some languages) the start of a separate syllable +//static const unsigned short diereses_list[7] = {L'ä',L'ë',L'ï',L'ö',L'ü',L'ÿ',0}; +static const unsigned short diereses_list[7] = {0xe4,0xeb,0xef,0xf6,0xfc,0xff,0}; + +// convert characters to an approximate 7 bit ascii equivalent +// used for checking for vowels +static unsigned char remove_accent[] = { +'a','a','a','a','a','a','a','c','e','e','e','e','i','i','i','i', // 0c0 +'d','n','o','o','o','o','o', 0, 'o','u','u','u','u','y','t','s', // 0d0 +'a','a','a','a','a','a','a','c','e','e','e','e','i','i','i','i', // 0e0 +'d','n','o','o','o','o','o', 0 ,'o','u','u','u','u','y','t','y', // 0f0 + +'a','a','a','a','a','a','c','c','c','c','c','c','c','c','d','d', // 100 +'d','d','e','e','e','e','e','e','e','e','e','e','g','g','g','g', // 110 +'g','g','g','g','h','h','h','h','i','i','i','i','i','i','i','i', // 120 +'i','i','i','i','j','j','k','k','k','l','l','l','l','l','l','l', // 130 +'l','l','l','n','n','n','n','n','n','n','n','n','o','o','o','o', // 140 +'o','o','o','o','r','r','r','r','r','r','s','s','s','s','s','s', // 150 +'s','s','t','t','t','t','t','t','u','u','u','u','u','u','u','u', // 160 +'u','u','u','u','w','w','y','y','y','z','z','z','z','z','z','s', // 170 +'b','b','b','b', 0, 0, 'o','c','c','d','d','d','d','d','e','e', // 180 +'e','f','f','g','g','h','i','i','k','k','l','l','m','n','n','o', // 190 +'o','o','o','o','p','p','y', 0, 0, 's','s','t','t','t','t','u', // 1a0 +'u','u','v','y','y','z','z','z','z','z','z','z', 0, 0, 0, 'w', // 1b0 +'t','t','t','k','d','d','d','l','l','l','n','n','n','a','a','i', // 1c0 +'i','o','o','u','u','u','u','u','u','u','u','u','u','e','a','a', // 1d0 +'a','a','a','a','g','g','g','g','k','k','o','o','o','o','z','z', // 1e0 +'j','d','d','d','g','g','w','w','n','n','a','a','a','a','o','o', // 1f0 + +'a','a','a','a','e','e','e','e','i','i','i','i','o','o','o','o', // 200 +'r','r','r','r','u','u','u','u','s','s','t','t','y','y','h','h', // 210 +'n','d','o','o','z','z','a','a','e','e','o','o','o','o','o','o', // 220 +'o','o','y','y','l','n','t','j','d','q','a','c','c','l','t','s', // 230 +'z', 0 }; + + + + +void strncpy0(char *to,const char *from, int size) +{//=============================================== + // strcpy with limit, ensures a zero terminator + strncpy(to,from,size); + to[size-1] = 0; +} + + +static int reverse_word_bytes(int word) +{//============================= + // reverse the order of bytes from little-endian to big-endian +#ifdef ARCH_BIG + int ix; + int word2 = 0; + + for(ix=0; ix<=24; ix+=8) + { + word2 = word2 << 8; + word2 |= (word >> ix) & 0xff; + } + return(word2); +#else + return(word); +#endif +} + + +int LookupMnem(MNEM_TAB *table, char *string) +{//========================================== + while(table->mnem != NULL) + { + if(strcmp(string,table->mnem)==0) + return(table->value); + table++; + } + return(table->value); +} + + + +//============================================================================================= +// Read pronunciation rules and pronunciation lookup dictionary +// +//============================================================================================= + + +static void InitGroups(Translator *tr) +{//=================================== +/* Called after dictionary 1 is loaded, to set up table of entry points for translation rule chains + for single-letters and two-letter combinations +*/ + + int ix; + char *p; + char *p_name; + unsigned int *pw; + unsigned char c, c2; + int len; + + tr->n_groups2 = 0; + for(ix=0; ix<256; ix++) + { + tr->groups1[ix]=NULL; + tr->groups2_count[ix]=0; + tr->groups2_start[ix]=255; // indicates "not set" + } + memset(tr->letterGroups,0,sizeof(tr->letterGroups)); + + p = tr->data_dictrules; + while(*p != 0) + { + if(*p != RULE_GROUP_START) + { + fprintf(stderr,"Bad rules data in '%s_dict' at 0x%x\n",dictionary_name,(unsigned int)(p - tr->data_dictrules)); + break; + } + p++; + + if(p[0] == RULE_REPLACEMENTS) + { + pw = (unsigned int *)(((long)p+4) & ~3); // advance to next word boundary + tr->langopts.replace_chars = pw; + while(pw[0] != 0) + { + pw += 2; // find the end of the replacement list, each entry is 2 words. + } + p = (char *)(pw+1); + +#ifdef ARCH_BIG + pw = (unsigned int *)(tr->langopts.replace_chars); + while(*pw != 0) + { + *pw = reverse_word_bytes(*pw); + pw++; + *pw = reverse_word_bytes(*pw); + pw++; + } +#endif + continue; + } + + if(p[0] == RULE_LETTERGP2) + { + ix = p[1] - 'A'; + p += 2; + if((ix >= 0) && (ix < N_LETTER_GROUPS)) + { + tr->letterGroups[ix] = p; + } + } + else + { + len = strlen(p); + p_name = p; + c = p_name[0]; + + p += (len+1); + if(len == 1) + { + tr->groups1[c] = p; + } + else + if(len == 0) + { + tr->groups1[0] = p; + } + else + { + if(tr->groups2_start[c] == 255) + tr->groups2_start[c] = tr->n_groups2; + + tr->groups2_count[c]++; + tr->groups2[tr->n_groups2] = p; + c2 = p_name[1]; + tr->groups2_name[tr->n_groups2++] = (c + (c2 << 8)); + } + } + + // skip over all the rules in this group + while(*p != RULE_GROUP_END) + { + p += (strlen(p) + 1); + } + p++; + } + +} // end of InitGroups + + + +int LoadDictionary(Translator *tr, const char *name, int no_error) +{//=============================================================== + int hash; + char *p; + int *pw; + int length; + FILE *f; + unsigned int size; + char fname[sizeof(path_home)+20]; + + strcpy(dictionary_name,name); // currently loaded dictionary name + + if(no_error) // don't load dictionary, just set the dictionary_name + return(1); + + // Load a pronunciation data file into memory + // bytes 0-3: offset to rules data + // bytes 4-7: number of hash table entries + sprintf(fname,"%s%c%s_dict",path_home,PATHSEP,name); + size = GetFileLength(fname); + + f = fopen(fname,"rb"); + if((f == NULL) || (size <= 0)) + { + if(no_error == 0) + { + fprintf(stderr,"Can't read dictionary file: '%s'\n",fname); + } + return(1); + } + + if(tr->data_dictlist != NULL) + Free(tr->data_dictlist); + + tr->data_dictlist = Alloc(size); + fread(tr->data_dictlist,size,1,f); + fclose(f); + + + pw = (int *)(tr->data_dictlist); + length = reverse_word_bytes(pw[1]); + + if(size <= (N_HASH_DICT + sizeof(int)*2)) + { + fprintf(stderr,"Empty _dict file: '%s\n",fname); + return(2); + } + + if((reverse_word_bytes(pw[0]) != N_HASH_DICT) || + (length <= 0) || (length > 0x8000000)) + { + fprintf(stderr,"Bad data: '%s' (%x length=%x)\n",fname,reverse_word_bytes(pw[0]),length); + return(2); + } + tr->data_dictrules = &(tr->data_dictlist[length]); + + // set up indices into data_dictrules + InitGroups(tr); + if(tr->groups1[0] == NULL) + { + fprintf(stderr,"Error in %s_rules, no default rule group\n",name); + } + + // set up hash table for data_dictlist + p = &(tr->data_dictlist[8]); + + for(hash=0; hashdict_hashtab[hash] = p; + while((length = *p) != 0) + { + p += length; + } + p++; // skip over the zero which terminates the list for this hash value + } + + return(0); +} // end of LoadDictionary + + +int HashDictionary(const char *string) +//==================================== +/* Generate a hash code from the specified string + This is used to access the dictionary_2 word-lookup dictionary +*/ +{ + int c; + int chars=0; + int hash=0; + + while((c = (*string++ & 0xff)) != 0) + { + hash = hash * 8 + c; + hash = (hash & 0x3ff) ^ (hash >> 8); /* exclusive or */ + chars++; + } + + return((hash+chars) & 0x3ff); // a 10 bit hash code +} // end of HashDictionary + + + +//============================================================================================= +// Translate between internal representation of phonemes and a mnemonic form for display +// +//============================================================================================= + + + +char *EncodePhonemes(char *p, char *outptr, unsigned char *bad_phoneme) +/*********************************************************************/ +/* Translate a phoneme string from ascii mnemonics to internal phoneme numbers, + from 'p' up to next blank . + Returns advanced 'p' + outptr contains encoded phonemes, unrecognised phonemes are encoded as 255 + bad_phoneme must point to char array of length 2 of more +*/ +{ + int ix; + unsigned char c; + int count; /* num. of matching characters */ + int max; /* highest num. of matching found so far */ + int max_ph; /* corresponding phoneme with highest matching */ + int consumed; + unsigned int mnemonic_word; + + bad_phoneme[0] = 0; + + // skip initial blanks + while(isspace(*p)) + { + p++; + } + + while(((c = *p) != 0) && !isspace(c)) + { + consumed = 0; + + switch(c) + { + case '|': + // used to separate phoneme mnemonics if needed, to prevent characters being treated + // as a multi-letter mnemonic + + if((c = p[1]) == '|') + { + // treat double || as a word-break symbol, drop through + // to the default case with c = '|' + } + else + { + p++; + break; + } + + default: + // lookup the phoneme mnemonic, find the phoneme with the highest number of + // matching characters + max= -1; + max_ph= 0; + + for(ix=1; ixtype == phINVALID) + continue; // this phoneme is not defined for this language + + count = 0; + mnemonic_word = phoneme_tab[ix]->mnemonic; + + while(((c = p[count]) > ' ') && (count < 4) && + (c == ((mnemonic_word >> (count*8)) & 0xff))) + count++; + + if((count > max) && + ((count == 4) || (((mnemonic_word >> (count*8)) & 0xff)==0))) + { + max = count; + max_ph = phoneme_tab[ix]->code; + } + } + + if(max_ph == 0) + { + max_ph = 255; /* not recognised */ + bad_phoneme[0] = *p; + bad_phoneme[1] = 0; + } + + if(max <= 0) + max = 1; + p += (consumed + max); + *outptr++ = (char)(max_ph); + + if(max_ph == phonSWITCH) + { + // Switch Language: this phoneme is followed by a text string + char *p_lang = outptr; + while(!isspace(c = *p) && (c != 0)) + { + p++; + *outptr++ = tolower(c); + } + *outptr = 0; + if(c == 0) + { + if(strcmp(p_lang,"en")==0) + { + *p_lang = 0; // don't need "en", it's assumed by default + return(p); + } + } + else + { + *outptr++ = '|'; // more phonemes follow, terminate language string with separator + } + } + break; + } + } + /* terminate the encoded string */ + *outptr = 0; + return(p); +} // end of EncodePhonemes + + + +void DecodePhonemes(const char *inptr, char *outptr) +//================================================== +// Translate from internal phoneme codes into phoneme mnemonics +{ + unsigned char phcode; + unsigned char c; + unsigned int mnem; + PHONEME_TAB *ph; + static const char *stress_chars = "==,,'* "; + + while((phcode = *inptr++) > 0) + { + if(phcode == 255) + continue; /* indicates unrecognised phoneme */ + if((ph = phoneme_tab[phcode]) == NULL) + continue; + + if((ph->type == phSTRESS) && (ph->std_length <= 4) && (ph->spect == 0)) + { + if(ph->std_length > 1) + *outptr++ = stress_chars[ph->std_length]; + } + else + { + mnem = ph->mnemonic; + + while((c = (mnem & 0xff)) != 0) + { + *outptr++ = c; + mnem = mnem >> 8; + } + if(phcode == phonSWITCH) + { + while(isalpha(*inptr)) + { + *outptr++ = *inptr++; + } + } + } + } + *outptr = 0; /* string terminator */ +} // end of DecodePhonemes + + + +static void WriteMnemonic(char *phon_out, int *ix, int mnem) +{//========================================================= + unsigned char c; + + while((c = mnem & 0xff) != 0) + { + if((c == '/') && (option_phoneme_variants==0)) + break; // discard phoneme variant indicator + phon_out[(*ix)++]= c; + // phon_out[phon_out_ix++]= ipa1[c]; + mnem = mnem >> 8; + } +} + + + +void GetTranslatedPhonemeString(char *phon_out, int n_phon_out) +{//============================================================ +/* Can be called after a clause has been translated into phonemes, in order + to display the clause in phoneme mnemonic form. +*/ + + int ix; + int phon_out_ix=0; + int stress; + char *p; + PHONEME_LIST *plist; + + static const char *stress_chars = "==,,''"; + + if(phon_out != NULL) + { + for(ix=1; ix<(n_phoneme_list-2) && (phon_out_ix < (n_phon_out - 6)); ix++) + { + plist = &phoneme_list[ix]; + if(plist->newword) + phon_out[phon_out_ix++] = ' '; + + if(plist->synthflags & SFLAG_SYLLABLE) + { + if((stress = plist->stresslevel) > 1) + { + if(stress > 5) stress = 5; + phon_out[phon_out_ix++] = stress_chars[stress]; + } + } + WriteMnemonic(phon_out, &phon_out_ix, plist->ph->mnemonic); + + if(plist->synthflags & SFLAG_LENGTHEN) + { + WriteMnemonic(phon_out, &phon_out_ix, phoneme_tab[phonLENGTHEN]->mnemonic); + } + if((plist->synthflags & SFLAG_SYLLABLE) && (plist->type != phVOWEL)) + { + // syllablic consonant + WriteMnemonic(phon_out, &phon_out_ix, phoneme_tab[phonSYLLABIC]->mnemonic); + } + if(plist->ph->code == phonSWITCH) + { + // the tone_ph field contains a phoneme table number + p = phoneme_tab_list[plist->tone_ph].name; + while(*p != 0) + { + phon_out[phon_out_ix++] = *p++; + } + phon_out[phon_out_ix++] = ' '; + } + else + if(plist->tone_ph > 0) + { + WriteMnemonic(phon_out, &phon_out_ix, phoneme_tab[plist->tone_ph]->mnemonic); + } + } + + if(phon_out_ix >= n_phon_out) + phon_out_ix = n_phon_out - 1; + phon_out[phon_out_ix] = 0; + } +} // end of GetTranslatedPhonemeString + + + +//============================================================================================= +// Is a word Unpronouncable - and so should be spoken as individual letters +// +//============================================================================================= + + + +static int IsLetterGroup(Translator *tr, char *word, int group, int pre) +{//===================================================================== + // match the word against a list of utf-8 strings + char *p; + char *w; + int len=0; + + p = tr->letterGroups[group]; + if(p == NULL) + return(0); + + while(*p != RULE_GROUP_END) + { + if(pre) + { + len = strlen(p); + w = word - len + 1; + } + else + { + w = word; + } + while(*p == *w) + { + w++; + p++; + } + if(*p == 0) + { + if(pre) + return(len); + return(w-word); // matched a complete string + } + + while(*p++ != 0); // skip to end of string + } + return(0); +} + + +static int IsLetter(Translator *tr, int letter, int group) +{//======================================================= + int letter2; + + if(tr->letter_groups[group] != NULL) + { + if(wcschr(tr->letter_groups[group],letter)) + return(1); + return(0); + } + + if(group > 7) + return(0); + + if(tr->letter_bits_offset > 0) + { + if(((letter2 = (letter - tr->letter_bits_offset)) > 0) && (letter2 < 0x80)) + letter = letter2; + else + return(0); + } + else + { + if((letter >= 0xc0) && (letter <= 0x241)) + return(tr->letter_bits[remove_accent[letter-0xc0]] & (1L << group)); + } + + if((letter >= 0) && (letter < 0x80)) + return(tr->letter_bits[letter] & (1L << group)); + + return(0); +} + + +static int IsVowel(Translator *tr, int letter) +{//=========================================== + return(IsLetter(tr, letter, 0)); +} + + + + +static int Unpronouncable_en(Translator *tr, char *word) +{//===================================================== +/* Determines whether a word in 'unpronouncable', i.e. whether it should + be spoken as individual letters. + + This function is language specific. +*/ + + int c; + int vowel_posn=9; + int index; + int count; + int ix; + int apostrophe=0; + + static unsigned char initials_bitmap[86] = { + 0x00, 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x88, // 0 + 0x20, 0x24, 0x20, 0x80, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x28, 0x08, 0x00, 0x88, 0x22, 0x04, 0x00, // 16 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x88, 0x22, 0x04, 0x00, 0x02, 0x00, 0x04, // 32 + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x28, 0x8a, 0x03, 0x00, 0x00, 0x40, 0x00, // 48 + 0x02, 0x00, 0x41, 0xca, 0xbb, 0x06, 0x20, 0x80, + 0x91, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, // 64 + 0x08, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x22, 0x00, 0x01, 0x00, }; + + + // words which we pass through to the dictionary, even though they look unpronouncable + static const char *exceptions[] = { + "'s ", "st ","nd ","rd ","th ",NULL }; + + if((*word == ' ') || (*word == 0)) + return(0); + + for(ix=0; exceptions[ix] != NULL; ix++) + { + // Seemingly uncpronouncable words, but to be looked in the dictionary rules instead + if(memcmp(word,exceptions[ix],3)==0) + return(0); + } + + index=0; + count=0; + for(;;) + { + index += utf8_in(&c,&word[index]); + count++; + + if((c==0) || (c==' ')) + break; + + if(IsVowel(tr, c) || (c == 'y')) + { + vowel_posn = count; + break; + } + + if(c == '\'') + apostrophe = 1; + else + if(!IsAlpha(c)) + return(0); // letter (not vowel) outside Latin character range or apostrophe, abort test + } + if((vowel_posn > 5) || ((word[0]!='s') && (vowel_posn > 4))) + return(1); // no vowel, or no vowel in first four letters + + /* there is at least one vowel, is the initial letter combination valid ? */ + + if(vowel_posn < 3) + return(0); /* vowel in first two letters, OK */ + + if(apostrophe) + return(0); // first two letters not a-z, abort test + + index = (word[0]-'a') * 26 + (word[1]-'a'); + if(initials_bitmap[index >> 3] & (1L << (index & 7))) + return(0); + else + return(1); /****/ +} /* end of Unpronounceable */ + + + + +int Unpronouncable(Translator *tr, char *word) +{//=========================================== +/* Determines whether a word in 'unpronouncable', i.e. whether it should + be spoken as individual letters. + + This function may be language specific. This is a generic version. +*/ + + int c; + int c1=0; + int vowel_posn=9; + int index; + int count; + int apostrophe=0; + + if(tr->translator_name == L('e','n')) + { + return(Unpronouncable_en(tr,word)); + } + + utf8_in(&c,word); + if((tr->letter_bits_offset > 0) && (c < 0x241)) + { + // Latin characters for a language with a non-latin alphabet + return(0); // so we can re-translate the word as English + } + + if(tr->langopts.param[LOPT_UNPRONOUNCABLE] == 1) + return(0); + + if((*word == ' ') || (*word == 0)) + return(0); + + index = 0; + count = 0; + for(;;) + { + index += utf8_in(&c,&word[index]); + if((c==0) || (c==' ')) + break; + + if(count==0) + c1 = c; + count++; + + if(IsVowel(tr, c)) + { + vowel_posn = count; // position of the first vowel + break; + } + + if(c == '\'') + apostrophe = 1; + else + if(!iswalpha(c)) + return(0); // letter (not vowel) outside a-z range or apostrophe, abort test + } + + if((vowel_posn < 9) && (tr->langopts.param[LOPT_UNPRONOUNCABLE] == 2)) + return(0); // option means allow any word with a vowel + + if(c1 == tr->langopts.param[LOPT_UNPRONOUNCABLE]) + vowel_posn--; // disregard this as the initial letter when counting + + if(vowel_posn > (tr->langopts.max_initial_consonants+1)) + return(1); // no vowel, or no vowel in first four letters + +return(0); + +} /* end of Unpronounceable */ + + + +//============================================================================================= +// Determine the stress pattern of a word +// +//============================================================================================= + + + +static int GetVowelStress(Translator *tr, unsigned char *phonemes, unsigned char *vowel_stress, int *vowel_count, int *stressed_syllable, int control) +{//==================================================================================================================================================== +// control = 1, set stress to 1 for forced unstressed vowels + unsigned char phcode; + PHONEME_TAB *ph; + unsigned char *ph_out = phonemes; + int count = 1; + int max_stress = 0; + int ix; + int j; + int stress = 0; + int primary_posn = 0; + + vowel_stress[0] = 0; + while(((phcode = *phonemes++) != 0) && (count < (N_WORD_PHONEMES/2)-1)) + { + if((ph = phoneme_tab[phcode]) == NULL) + continue; + + if((ph->type == phSTRESS) && (ph->spect == 0)) + { + /* stress marker, use this for the following vowel */ + + if(phcode == phonSTRESS_PREV) + { + /* primary stress on preceeding vowel */ + j = count - 1; + while((j > 0) && (*stressed_syllable == 0) && (vowel_stress[j] < 4)) + { + if(vowel_stress[j] != 1) + { + // don't promote a phoneme which must be unstressed + vowel_stress[j] = 4; + + if(max_stress < 4) + { + max_stress = 4; + primary_posn = j; + } + + /* reduce any preceding primary stress markers */ + for(ix=1; ixstd_length < 4) || (*stressed_syllable == 0)) + { + stress = ph->std_length; + + if(stress > max_stress) + max_stress = stress; + } + } + continue; + } + + if((ph->type == phVOWEL) && !(ph->phflags & phNONSYLLABIC)) + { + vowel_stress[count] = (char)stress; + if((stress >= 4) && (stress >= max_stress)) + { + primary_posn = count; + max_stress = stress; + } + + if((stress == 0) && (control & 1) && (ph->phflags & phUNSTRESSED)) + vowel_stress[count] = 1; /* weak vowel, must be unstressed */ + + count++; + stress = 0; + } + else + if(phcode == phonSYLLABIC) + { + // previous consonant phoneme is syllablic + vowel_stress[count] = (char)stress; + if((stress == 0) && (control & 1)) + vowel_stress[count++] = 1; // syllabic consonant, usually unstressed + } + + *ph_out++ = phcode; + } + vowel_stress[count] = 0; + *ph_out = 0; + + /* has the position of the primary stress been specified by $1, $2, etc? */ + if(*stressed_syllable > 0) + { + if(*stressed_syllable >= count) + *stressed_syllable = count-1; // the final syllable + + vowel_stress[*stressed_syllable] = 4; + max_stress = 4; + primary_posn = *stressed_syllable; + } + + if(max_stress == 5) + { + // priority stress, replaces any other primary stress marker + for(ix=1; ixlangopts.stress_flags & 0x20000) + vowel_stress[ix] = 0; + else + vowel_stress[ix] = 3; + } + + if(vowel_stress[ix] == 5) + { + vowel_stress[ix] = 4; + primary_posn = ix; + } + } + max_stress = 4; + } + + *stressed_syllable = primary_posn; + *vowel_count = count; + return(max_stress); +} // end of GetVowelStress + + + +static char stress_phonemes[] = {phonSTRESS_U, phonSTRESS_D, phonSTRESS_2, phonSTRESS_3, + phonSTRESS_P, phonSTRESS_P2, phonSTRESS_TONIC}; + + +void ChangeWordStress(Translator *tr, char *word, int new_stress) +{//============================================================== + int ix; + unsigned char *p; + int max_stress; + int vowel_count; // num of vowels + 1 + int stressed_syllable=0; // position of stressed syllable + unsigned char phonetic[N_WORD_PHONEMES]; + unsigned char vowel_stress[N_WORD_PHONEMES/2]; + + strcpy((char *)phonetic,word); + max_stress = GetVowelStress(tr, phonetic, vowel_stress, &vowel_count, &stressed_syllable, 0); + + if(new_stress >= 4) + { + // promote to primary stress + for(ix=1; ix= max_stress) + { + vowel_stress[ix] = new_stress; + break; + } + } + } + else + { + // remove primary stress + for(ix=1; ix new_stress) // >= allows for diminished stress (=1) + vowel_stress[ix] = new_stress; + } + } + + // write out phonemes + ix = 1; + p = phonetic; + while(*p != 0) + { + if((phoneme_tab[*p]->type == phVOWEL) && !(phoneme_tab[*p]->phflags & phNONSYLLABIC)) + { + if(vowel_stress[ix] != 0) + *word++ = stress_phonemes[vowel_stress[ix]]; + + ix++; + } + *word++ = *p++; + } + *word = 0; +} // end of ChangeWordStress + + + +void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, int tonic, int prev_stress) +{//========================================================================================================= +/* Guess stress pattern of word. This is language specific + + 'dictionary_flags' has bits 0-3 position of stressed vowel (if > 0) + or unstressed (if == 7) or syllables 1 and 2 (if == 6) + bits 8... dictionary flags + + If 'tonic' is set (>= 0), replace highest stress by this value. + + Parameter used for input and output +*/ + + unsigned char phcode; + unsigned char *p; + PHONEME_TAB *ph; + int stress; + int max_stress; + int vowel_count; // num of vowels + 1 + int ix; + int v; + int v_stress; + int stressed_syllable; // position of stressed syllable + int max_stress_posn; + int unstressed_word = 0; + char *max_output; + int final_ph; + int final_ph2; + int mnem; + int mnem2; + int post_tonic; + int opt_length; + int done; + int stressflags; + + unsigned char vowel_stress[N_WORD_PHONEMES/2]; + char syllable_weight[N_WORD_PHONEMES/2]; + char vowel_length[N_WORD_PHONEMES/2]; + unsigned char phonetic[N_WORD_PHONEMES]; + + static char consonant_types[16] = {0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0}; + + + /* stress numbers STRESS_BASE + + 0 diminished, unstressed within a word + 1 unstressed, weak + 2 + 3 secondary stress + 4 main stress */ + + stressflags = tr->langopts.stress_flags; + + /* copy input string into internal buffer */ + for(ix=0; ix= n_phoneme_tab) + phonetic[ix] = phonSCHWA; + if(phonetic[ix] == 0) + break; + } + if(ix == 0) return; + final_ph = phonetic[ix-1]; + final_ph2 = phonetic[ix-2]; + + max_output = output + (N_WORD_PHONEMES-3); /* check for overrun */ + + // any stress position marked in the xx_list dictionary ? + stressed_syllable = (*dictionary_flags) & 0x7; + if((*dictionary_flags) & 0x8) + { + // this indicates a word without a primary stress + stressed_syllable = (*dictionary_flags) & 0x3; + unstressed_word = 1; + } + + max_stress = GetVowelStress(tr, phonetic, vowel_stress, &vowel_count, &stressed_syllable, 1); + + if((max_stress == 0) && (tr->langopts.stress_flags & 1) && (vowel_count == 2)) + { + // option: don't stress monosyllables except at end-of-clause + vowel_stress[1] = 1; + (*dictionary_flags) |= FLAG_STRESS_END2; + } + + // heavy or light syllables + ix = 1; + for(p = phonetic; *p != 0; p++) + { + if((phoneme_tab[p[0]]->type == phVOWEL) && !(phoneme_tab[p[0]]->phflags & phNONSYLLABIC)) + { + int weight = 0; + int lengthened = 0; + + if(phoneme_tab[p[1]]->code == phonLENGTHEN) + lengthened = 1; + + if(lengthened || (phoneme_tab[p[0]]->phflags & phLONG)) + { + // long vowel, increase syllable weight + weight++; + } + vowel_length[ix] = weight; + + if(lengthened) p++; // advance over phonLENGTHEN + + if(consonant_types[phoneme_tab[p[1]]->type] && ((phoneme_tab[p[2]]->type != phVOWEL) || (phoneme_tab[p[1]]->phflags & phLONG))) + { + // followed by two consonants, a long consonant, or consonant and end-of-word + weight++; + } + syllable_weight[ix] = weight; + ix++; + } + } + + switch(tr->langopts.stress_rule) + { + case 8: + // stress on first syllable, unless it is a light syllable + if(syllable_weight[1] > 0) + break; + // else drop through to case 1 + case 1: + // stress on second syllable + if((stressed_syllable == 0) && (vowel_count > 2)) + { + stressed_syllable = 2; + if(max_stress == 0) + { + vowel_stress[stressed_syllable] = 4; + } + max_stress = 4; + } + break; + + case 2: + // a language with stress on penultimate vowel + + if(stressed_syllable == 0) + { + /* no explicit stress - stress the penultimate vowel */ + max_stress = 4; + + if(vowel_count > 2) + { + stressed_syllable = vowel_count - 2; + + if(stressflags & 0x300) + { + // LANG=Spanish, stress on last vowel if the word ends in a consonant other than 'n' or 's' + if(phoneme_tab[final_ph]->type != phVOWEL) + { + if(stressflags & 0x100) + { + stressed_syllable = vowel_count - 1; + } + else + { + mnem = phoneme_tab[final_ph]->mnemonic; + mnem2 = phoneme_tab[final_ph2]->mnemonic; + + if((mnem == 's') && (mnem2 == 'n')) + { + // -ns stress remains on penultimate syllable + } + else + if(((mnem != 'n') && (mnem != 's')) || (phoneme_tab[final_ph2]->type != phVOWEL)) + { + stressed_syllable = vowel_count - 1; + } + } + } + } + if(stressflags & 0x80000) + { + // stress on last syllable if it has a long vowel, but previous syllable has a short vowel + if(vowel_length[vowel_count - 1] > vowel_length[vowel_count - 2]) + { + stressed_syllable = vowel_count - 1; + } + } + + if(vowel_stress[stressed_syllable] == 1) + { + // but this vowel is explicitly marked as unstressed + if(stressed_syllable > 1) + stressed_syllable--; + else + stressed_syllable++; + } + } + else + { + stressed_syllable = 1; + } + + // only set the stress if it's not already marked explicitly + if(vowel_stress[stressed_syllable] == 0) + { + // don't stress if next and prev syllables are stressed + if((vowel_stress[stressed_syllable-1] < 4) || (vowel_stress[stressed_syllable+1] < 4)) + vowel_stress[stressed_syllable] = max_stress; + } + } + break; + + case 3: + // stress on last vowel + if(stressed_syllable == 0) + { + /* no explicit stress - stress the final vowel */ + stressed_syllable = vowel_count - 1; + if(max_stress == 0) + { + while(stressed_syllable > 0) + { + if(vowel_stress[stressed_syllable] == 0) + { + vowel_stress[stressed_syllable] = 4; + break; + } + else + stressed_syllable--; + } + } + max_stress = 4; + } + break; + + case 4: // stress on antipenultimate vowel + if(stressed_syllable == 0) + { + stressed_syllable = vowel_count - 3; + if(stressed_syllable < 1) + stressed_syllable = 1; + + if(max_stress == 0) + { + vowel_stress[stressed_syllable] = 4; + } + max_stress = 4; + } + break; + + case 5: + // LANG=Russian + if(stressed_syllable == 0) + { + /* no explicit stress - guess the stress from the number of syllables */ + static char guess_ru[16] = {0,0,1,1,2,3,3,4,5,6,7,7,8,9,10,11}; + static char guess_ru_v[16] = {0,0,1,1,2,2,3,3,4,5,6,7,7,8,9,10}; // for final phoneme is a vowel + static char guess_ru_t[16] = {0,0,1,2,3,3,3,4,5,6,7,7,7,8,9,10}; // for final phoneme is an unvoiced stop + + stressed_syllable = vowel_count - 3; + if(vowel_count < 16) + { + if(phoneme_tab[final_ph]->type == phVOWEL) + stressed_syllable = guess_ru_v[vowel_count]; + else + if(phoneme_tab[final_ph]->type == phSTOP) + stressed_syllable = guess_ru_t[vowel_count]; + else + stressed_syllable = guess_ru[vowel_count]; + } + vowel_stress[stressed_syllable] = 4; + max_stress = 4; + } + break; + + case 6: // LANG=hi stress on the last heaviest syllable + if(stressed_syllable == 0) + { + int wt; + int max_weight = -1; + int prev_stressed; + + // find the heaviest syllable, excluding the final syllable + for(ix = 1; ix < (vowel_count-1); ix++) + { + if(vowel_stress[ix] == 0) + { + if((wt = syllable_weight[ix]) >= max_weight) + { + max_weight = wt; + prev_stressed = stressed_syllable; + stressed_syllable = ix; + } + } + } + + if((syllable_weight[vowel_count-1] == 2) && (max_weight< 2)) + { + // the only double=heavy syllable is the final syllable, so stress this + stressed_syllable = vowel_count-1; + } + else + if(max_weight <= 0) + { + // all syllables, exclusing the last, are light. Stress the first syllable + stressed_syllable = 1; + } + + vowel_stress[stressed_syllable] = 4; + max_stress = 4; + } + break; + + case 7: // LANG=tr, the last syllable for any vowel markes explicitly as unstressed + if(stressed_syllable == 0) + { + stressed_syllable = vowel_count - 1; + for(ix=1; ix < vowel_count; ix++) + { + if(vowel_stress[ix] == 1) + { + stressed_syllable = ix-1; + break; + } + } + vowel_stress[stressed_syllable] = 4; + max_stress = 4; + } + break; + + case 9: // mark all as stressed + for(ix=1; ix 2) && (vowel_stress[2] >= 4)) + { + vowel_stress[1] = 3; + } + } +#endif + + done = 0; + for(v=1; v 1) && (stressflags & 0x40) && (syllable_weight[v]==0) && (syllable_weight[v+1]>0)) + { + // don't put secondary stress on a light syllable which is followed by a heavy syllable + continue; + } + +// should start with secondary stress on the first syllable, or should it count back from +// the primary stress and put secondary stress on alternate syllables? + vowel_stress[v] = (char)stress; + done =1; + stress = 3; /* use secondary stress for remaining syllables */ + } + } + } + + if((unstressed_word) && (tonic < 0)) + { + if(vowel_count <= 2) + tonic = tr->langopts.unstressed_wd1; /* monosyllable - unstressed */ + else + tonic = tr->langopts.unstressed_wd2; /* more than one syllable, used secondary stress as the main stress */ + } + + max_stress = 0; + max_stress_posn = 0; + for(v=1; v= max_stress) + { + max_stress = vowel_stress[v]; + max_stress_posn = v; + } + } + + if(tonic >= 0) + { + /* find position of highest stress, and replace it by 'tonic' */ + + /* don't disturb an explicitly set stress by 'unstress-at-end' flag */ + if((tonic > max_stress) || (max_stress <= 4)) + vowel_stress[max_stress_posn] = (char)tonic; + max_stress = tonic; + } + + + /* produce output phoneme string */ + p = phonetic; + v = 1; + + if((ph = phoneme_tab[*p]) != NULL) + { + + if(ph->type == phSTRESS) + ph = phoneme_tab[p[1]]; + +#ifdef deleted + int gap = tr->langopts.word_gap & 0x700; + if((gap) && (vowel_stress[1] >= 4) && (prev_stress >= 4)) + { + /* two primary stresses together, insert a short pause */ + *output++ = pause_phonemes[gap >> 8]; + } + else +#endif + if((tr->langopts.vowel_pause & 0x30) && (ph->type == phVOWEL)) + { + // word starts with a vowel + + if((tr->langopts.vowel_pause & 0x20) && (vowel_stress[1] >= 4)) + { + *output++ = phonPAUSE_NOLINK; // not to be replaced by link + } + else + { + *output++ = phonPAUSE_VSHORT; // break, but no pause + } + } + } + + p = phonetic; + post_tonic = 0; + while(((phcode = *p++) != 0) && (output < max_output)) + { + if((ph = phoneme_tab[phcode]) == NULL) + continue; + +// if(ph->type == phSTRESS) +// continue; + + if(ph->type == phPAUSE) + { + tr->prev_last_stress = 0; + } + else + if(((ph->type == phVOWEL) && !(ph->phflags & phNONSYLLABIC)) || (*p == phonSYLLABIC)) + { + // a vowel, or a consonant followed by a syllabic consonant marker + + v_stress = vowel_stress[v]; + tr->prev_last_stress = v_stress; + + if(vowel_stress[v-1] >= max_stress) + post_tonic = 1; + + if(v_stress <= 1) + { + if((v > 1) && (max_stress >= 4) && (stressflags & 4) && (v == (vowel_count-1))) + { + // option: mark unstressed final syllable as diminished + v_stress = 1; + } + else + if((stressflags & 2) || (v == 1) || (v == (vowel_count-1))) + { + // first or last syllable, or option 'don't set diminished stress' + v_stress = 0; + } + else + if((v == (vowel_count-2)) && (vowel_stress[vowel_count-1] <= 1)) + { + // penultimate syllable, followed by an unstressed final syllable + v_stress = 0; + } + else + { + // unstressed syllable within a word + if((vowel_stress[v-1] != 1) || ((stressflags & 0x10000) == 0)) + { + v_stress = 1; /* change from 0 (unstressed) to 1 (diminished stress) */ + vowel_stress[v] = v_stress; + } + } + } + + if(v_stress > 0) + *output++ = stress_phonemes[v_stress]; // mark stress of all vowels except 0 (unstressed) + + + if(vowel_stress[v] > max_stress) + { + max_stress = vowel_stress[v]; + } + + if((*p == phonLENGTHEN) && ((opt_length = tr->langopts.param[LOPT_IT_LENGTHEN]) & 1)) + { + // remove lengthen indicator from non-stressed syllables + int shorten=0; + + if(opt_length & 0x10) + { + // only allow lengthen indicator on the highest stress syllable in the word + if(v != max_stress_posn) + shorten = 1; + } + else + if(v_stress < 4) + { + // only allow lengthen indicator if stress >= 4. + shorten = 1; + } + + if(shorten) + p++; + } + + if((v_stress >= 4) && (tr->langopts.param[LOPT_IT_LENGTHEN] == 2)) + { + // LANG=Italian, lengthen penultimate stressed vowels, unless followed by 2 consonants + if((v == (vowel_count - 2)) && (syllable_weight[v] == 0)) + { + *output++ = phcode; + phcode = phonLENGTHEN; + } + } + + v++; + } + + if(phcode != 1) + *output++ = phcode; + } + *output++ = 0; + +} /* end of SetWordStress */ + + + + +//============================================================================================= +// Look up a word in the pronunciation rules +// +//============================================================================================= + + +#ifdef LOG_TRANSLATE +static char *DecodeRule(const char *group, char *rule) +{//================================================== +/* Convert compiled match template to ascii */ + + unsigned char rb; + unsigned char c; + char *p; + int ix; + int match_type; + int finished=0; + int value; + int linenum=0; + int flags; + int suffix_char; + int condition_num=0; + char buf[60]; + char buf_pre[60]; + char suffix[20]; + static char output[60]; + + static char symbols[] = {' ',' ',' ',' ',' ',' ',' ',' ',' ', + '@','&','%','+','#','S','D','Z','A','L',' ',' ',' ',' ',' ','N','K','V',' ','T','X','?','W'}; + + static char symbols_lg[] = {'A','B','C','H','F','G','Y'}; + + match_type = 0; + buf_pre[0] = 0; + strcpy(buf,group); + p = &buf[strlen(buf)]; + while(!finished) + { + rb = *rule++; + + if(rb <= RULE_LINENUM) + { + switch(rb) + { + case 0: + case RULE_PHONEMES: + finished=1; + break; + case RULE_PRE: + match_type = RULE_PRE; + *p = 0; + p = buf_pre; + break; + case RULE_POST: + match_type = RULE_POST; + *p = 0; + strcat(buf," ("); + p = &buf[strlen(buf)]; + break; + case RULE_PH_COMMON: + break; + case RULE_CONDITION: + /* conditional rule, next byte gives condition number */ + condition_num = *rule++; + break; + case RULE_LINENUM: + value = (rule[1] & 0xff) - 1; + linenum = (rule[0] & 0xff) - 1 + (value * 255); + rule+=2; + break; + } + continue; + } + + if(rb == RULE_ENDING) + { + static const char *flag_chars = "ei vtfq t"; + flags = ((rule[0] & 0x7f)<< 8) + (rule[1] & 0x7f); + suffix_char = 'S'; + if(flags & (SUFX_P >> 8)) + suffix_char = 'P'; + sprintf(suffix,"%c%d",suffix_char,rule[2] & 0x7f); + rule += 3; + for(ix=0;ix<9;ix++) + { + if(flags & 1) + sprintf(&suffix[strlen(suffix)],"%c",flag_chars[ix]); + flags = (flags >> 1); + } + strcpy(p,suffix); + p += strlen(suffix); + c = ' '; + } + else + if(rb == RULE_LETTERGP) + { + c = symbols_lg[*rule++ - 'A']; + } + else + if(rb == RULE_LETTERGP2) + { + value = *rule++ - 'A'; + p[0] = 'L'; + p[1] = (value / 10) + '0'; + c = (value % 10) + '0'; + + if(match_type == RULE_PRE) + { + p[0] = c; + c = 'L'; + } + p+=2; + } + else + if(rb <= RULE_LAST_RULE) + c = symbols[rb]; + else + if(rb == RULE_SPACE) + c = '_'; + else + c = rb; + *p++ = c; + } + *p = 0; + + p = output; + if(linenum > 0) + { + sprintf(p,"%5d:\t",linenum); + p += 7; + } + if(condition_num > 0) + { + sprintf(p,"?%d ",condition_num); + p = &p[strlen(p)]; + } + if((ix = strlen(buf_pre)) > 0) + { + while(--ix >= 0) + *p++ = buf_pre[ix]; + *p++ = ')'; + *p++ = ' '; + } + *p = 0; + strcat(p,buf); + ix = strlen(output); + while(ix < 8) + output[ix++]=' '; + output[ix]=0; + return(output); +} /* end of decode_match */ +#endif + + + +void AppendPhonemes(Translator *tr, char *string, int size, const char *ph) +{//======================================================================== +/* Add new phoneme string "ph" to "string" + Keeps count of the number of vowel phonemes in the word, and whether these + can be stressed syllables. These values can be used in translation rules +*/ + const char *p; + unsigned char c; + int unstress_mark; + int length; + + length = strlen(ph) + strlen(string); + if(length >= size) + { + return; + } + + /* any stressable vowel ? */ + unstress_mark = 0; + p = ph; + while((c = *p++) != 0) + { + if(c >= n_phoneme_tab) continue; + + if(phoneme_tab[c]->type == phSTRESS) + { + if(phoneme_tab[c]->std_length < 4) + unstress_mark = 1; + } + else + { + if(phoneme_tab[c]->type == phVOWEL) + { + if(((phoneme_tab[c]->phflags & phUNSTRESSED) == 0) && + (unstress_mark == 0)) + { + tr->word_stressed_count++; + } + unstress_mark = 0; + tr->word_vowel_count++; + } + } + } + + if(string != NULL) + strcat(string,ph); +} /* end of AppendPhonemes */ + + + +static void MatchRule(Translator *tr, char *word[], const char *group, char *rule, MatchRecord *match_out, int word_flags, int dict_flags) +{//======================================================================================================================================= +/* Checks a specified word against dictionary rules. + Returns with phoneme code string, or NULL if no match found. + + word (indirect) points to current character group within the input word + This is advanced by this procedure as characters are consumed + + group: the initial characters used to choose the rules group + + rule: address of dictionary rule data for this character group + + match_out: returns best points score + + word_flags: indicates whether this is a retranslation after a suffix has been removed +*/ + + unsigned char rb; // current instuction from rule + unsigned char letter; // current letter from input word, single byte + int letter_w; // current letter, wide character + int letter_xbytes; // number of extra bytes of multibyte character (num bytes - 1) + unsigned char last_letter; + + char *pre_ptr; + char *post_ptr; /* pointer to first character after group */ + + char *rule_start; /* start of current match template */ + char *p; + + int match_type; /* left, right, or consume */ + int failed; + int consumed; /* number of letters consumed from input */ + int count; /* count through rules in the group */ + int syllable_count; + int vowel; + int letter_group; + int distance_right; + int distance_left; + int lg_pts; + int n_bytes; + int add_points; + + MatchRecord match; + static MatchRecord best; + + int total_consumed; /* letters consumed for best match */ + int group_length; + + unsigned char condition_num; + char *common_phonemes; /* common to a group of entries */ + + + + if(rule == NULL) + { + match_out->points = 0; + (*word)++; + return; + } + + + total_consumed = 0; + count = 0; + common_phonemes = NULL; + match_type = 0; + + best.points = 0; + best.phonemes = ""; + best.end_type = 0; + best.del_fwd = NULL; + + group_length = strlen(group); + + /* search through dictionary rules */ + while(rule[0] != RULE_GROUP_END) + { + match_type=0; + consumed = 0; + letter = 0; + distance_right= -6; /* used to reduce points for matches further away the current letter */ + distance_left= -2; + count++; + + match.points = 1; + match.end_type = 0; + match.del_fwd = NULL; + + pre_ptr = *word; + post_ptr = *word + group_length; + + /* work through next rule until end, or until no-match proved */ + rule_start = rule; + failed = 0; + while(!failed) + { + rb = *rule++; + + if(rb <= RULE_LINENUM) + { + switch(rb) + { + case 0: // no phoneme string for this rule, use previous common rule + if(common_phonemes != NULL) + { + match.phonemes = common_phonemes; + while(((rb = *match.phonemes++) != 0) && (rb != RULE_PHONEMES)) + { + if(rb == RULE_CONDITION) + match.phonemes++; // skip over condition number + } + } + else + { + match.phonemes = ""; + } + rule--; // so we are still pointing at the 0 + failed=2; // matched OK + break; + case RULE_PRE: + match_type = RULE_PRE; + break; + case RULE_POST: + match_type = RULE_POST; + break; + case RULE_PHONEMES: + match.phonemes = rule; + failed=2; // matched OK + break; + case RULE_PH_COMMON: + common_phonemes = rule; + break; + case RULE_CONDITION: + /* conditional rule, next byte gives condition number */ + condition_num = *rule++; + + if(condition_num >= 32) + { + // allow the rule only if the condition number is NOT set + if((tr->dict_condition & (1L << (condition_num-32))) != 0) + failed = 1; + } + else + { + // allow the rule only if the condition number is set + if((tr->dict_condition & (1L << condition_num)) == 0) + failed = 1; + } + + if(!failed) + match.points++; // add one point for a matched conditional rule + break; + case RULE_LINENUM: + rule+=2; + break; + } + continue; + } + + add_points = 0; + + switch(match_type) + { + case 0: + /* match and consume this letter */ + last_letter = letter; + letter = *post_ptr++; + + if((letter == rb) || ((letter==(unsigned char)REPLACED_E) && (rb=='e'))) + { + add_points = 21; + consumed++; + } + else + failed = 1; + break; + + + case RULE_POST: + /* continue moving fowards */ + distance_right += 6; + if(distance_right > 18) + distance_right = 19; + last_letter = letter; + letter_xbytes = utf8_in(&letter_w,post_ptr)-1; + letter = *post_ptr++; + + switch(rb) + { + case RULE_LETTERGP: + letter_group = *rule++ - 'A'; + if(IsLetter(tr, letter_w, letter_group)) + { + lg_pts = 20; + if(letter_group==2) + lg_pts = 19; // fewer points for C, general consonant + add_points = (lg_pts-distance_right); + post_ptr += letter_xbytes; + } + else + failed = 1; + break; + + case RULE_LETTERGP2: // match against a list of utf-8 strings + letter_group = *rule++ - 'A'; + if((n_bytes = IsLetterGroup(tr, post_ptr-1,letter_group,0)) >0) + { + add_points = (20-distance_right); + post_ptr += (n_bytes-1); + } + else + failed =1; + break; + + case RULE_NOTVOWEL: + if(!IsLetter(tr, letter_w,0)) + { + add_points = (20-distance_right); + post_ptr += letter_xbytes; + } + else + failed = 1; + break; + + case RULE_DIGIT: + if(IsDigit(letter_w)) + { + add_points = (20-distance_right); + post_ptr += letter_xbytes; + } + else + if(tr->langopts.tone_numbers) + { + // also match if there is no digit + add_points = (20-distance_right); + post_ptr--; + } + else + failed = 1; + break; + + case RULE_NONALPHA: + if(!iswalpha(letter_w)) + { + add_points = (21-distance_right); + post_ptr += letter_xbytes; + } + else + failed = 1; + break; + + case RULE_DOUBLE: + if(letter == last_letter) + add_points = (21-distance_right); + else + failed = 1; + break; + + case RULE_ALT1: + if(dict_flags & FLAG_ALT_TRANS) + add_points = 1; + else + failed = 1; + break; + + case '-': + if((letter == '-') || ((letter == ' ') && (word_flags & FLAG_HYPHEN_AFTER))) + { + add_points = (22-distance_right); // one point more than match against space + } + else + failed = 1; + break; + + case RULE_SYLLABLE: + { + /* more than specified number of vowel letters to the right */ + char *p = post_ptr + letter_xbytes; + + syllable_count = 1; + while(*rule == RULE_SYLLABLE) + { + rule++; + syllable_count+=1; /* number of syllables to match */ + } + vowel = 0; + while(letter_w != RULE_SPACE) + { + if((vowel==0) && IsLetter(tr, letter_w,LETTERGP_VOWEL2)) + { + // this is counting vowels which are separated by non-vowels + syllable_count--; + } + vowel = IsLetter(tr, letter_w,LETTERGP_VOWEL2); + p += utf8_in(&letter_w,p); + } + if(syllable_count <= 0) + add_points = (19-distance_right); + else + failed = 1; + } + break; + + case RULE_NOVOWELS: + { + char *p = post_ptr + letter_xbytes; + while(letter_w != RULE_SPACE) + { + if(IsLetter(tr, letter_w,LETTERGP_VOWEL2)) + { + failed = 1; + break; + } + p += utf8_in(&letter_w,p); + } + if(!failed) + add_points = (19-distance_right); + } + break; + + case RULE_INC_SCORE: + add_points = 20; // force an increase in points + break; + + case RULE_DEL_FWD: + // find the next 'e' in the word and replace by '' + for(p = *word + group_length; *p != ' '; p++) + { + if(*p == 'e') + { + match.del_fwd = p; + break; + } + } + break; + + case RULE_ENDING: + // next 3 bytes are a (non-zero) ending type. 2 bytes of flags + suffix length + match.end_type = (rule[0] << 16) + ((rule[1] & 0x7f) << 8) + (rule[2] & 0x7f); + rule += 3; + break; + + case RULE_NO_SUFFIX: + if(word_flags & FLAG_SUFFIX_REMOVED) + failed = 1; // a suffix has been removed + else + add_points = 1; + break; + + default: + if(letter == rb) + { + if(letter == RULE_SPACE) + add_points = (21-distance_right); + else + add_points = (21-distance_right); + } + else + failed = 1; + break; + } + break; + + + case RULE_PRE: + /* match backwards from start of current group */ + distance_left += 2; + if(distance_left > 18) + distance_left = 19; + + last_letter = *pre_ptr; + pre_ptr--; + letter_xbytes = utf8_in2(&letter_w,pre_ptr,1)-1; + letter = *pre_ptr; + + switch(rb) + { + case RULE_LETTERGP: + letter_group = *rule++ - 'A'; + if(IsLetter(tr, letter_w,letter_group)) + { + lg_pts = 20; + if(letter_group==2) + lg_pts = 19; // fewer points for C, general consonant + add_points = (lg_pts-distance_left); + pre_ptr -= letter_xbytes; + } + else + failed = 1; + break; + + case RULE_LETTERGP2: // match against a list of utf-8 strings + letter_group = *rule++ - 'A'; + if((n_bytes = IsLetterGroup(tr, pre_ptr,letter_group,1)) >0) + { + add_points = (20-distance_right); + pre_ptr -= (n_bytes-1); + } + else + failed =1; + break; + + case RULE_NOTVOWEL: + if(!IsLetter(tr, letter_w,0)) + { + add_points = (20-distance_left); + pre_ptr -= letter_xbytes; + } + else + failed = 1; + break; + + case RULE_DOUBLE: + if(letter == last_letter) + add_points = (21-distance_left); + else + failed = 1; + break; + + case RULE_DIGIT: + if(IsDigit(letter_w)) + { + add_points = (21-distance_left); + pre_ptr -= letter_xbytes; + } + else + failed = 1; + break; + + case RULE_NONALPHA: + if(!iswalpha(letter_w)) + { + add_points = (21-distance_right); + pre_ptr -= letter_xbytes; + } + else + failed = 1; + break; + + case RULE_SYLLABLE: + /* more than specified number of vowels to the left */ + syllable_count = 1; + while(*rule == RULE_SYLLABLE) + { + rule++; + syllable_count++; /* number of syllables to match */ + } + if(syllable_count <= tr->word_vowel_count) + add_points = (19-distance_left); + else + failed = 1; + break; + + case RULE_STRESSED: + if(tr->word_stressed_count > 0) + add_points = 19; + else + failed = 1; + break; + + case RULE_NOVOWELS: + { + char *p = pre_ptr - letter_xbytes - 1; + while(letter_w != RULE_SPACE) + { + if(IsLetter(tr, letter_w,LETTERGP_VOWEL2)) + { + failed = 1; + break; + } + p -= utf8_in2(&letter_w,p,1); + } + if(!failed) + add_points = 3; + } + break; + + case RULE_IFVERB: + if(tr->expect_verb) + add_points = 1; + else + failed = 1; + break; + + case RULE_CAPITAL: + if(word_flags & FLAG_FIRST_UPPER) + add_points = 1; + else + failed = 1; + break; + + case '.': + // dot in pre- section, match on any dot before this point in the word + for(p=pre_ptr; *p != ' '; p--) + { + if(*p == '.') + { + add_points = 50; + break; + } + } + if(*p == ' ') + failed = 1; + break; + + case '-': + if((letter == '-') || ((letter == ' ') && (word_flags & FLAG_HYPHEN))) + { + add_points = (22-distance_right); // one point more than match against space + } + else + failed = 1; + break; + + default: + if(letter == rb) + { + if(letter == RULE_SPACE) + add_points = 4; + else + add_points = (21-distance_left); + } + else + failed = 1; + break; + } + break; + } + + if(failed == 0) + match.points += add_points; + } + + if(failed == 2) + { + /* matched OK, is this better than the last best match ? */ + if(match.points >= best.points) + { + memcpy(&best,&match,sizeof(match)); + total_consumed = consumed; + } + +#ifdef LOG_TRANSLATE + if((option_phonemes == 2) && (match.points > 0) && ((word_flags & FLAG_NO_TRACE) == 0)) + { + // show each rule that matches, and it's points score + int pts; + char decoded_phonemes[80]; + + // note: 'count' contains the rule number, if we want to include it + pts = match.points; + if(group_length > 1) + pts += 35; // to account for an extra letter matching + DecodePhonemes(match.phonemes,decoded_phonemes); + fprintf(f_trans,"%3d\t%s [%s]\n",pts,DecodeRule(group,rule_start),decoded_phonemes); + } +#endif + + } + + /* skip phoneme string to reach start of next template */ + while(*rule++ != 0); + } + +#ifdef LOG_TRANSLATE + if((option_phonemes == 2) && ((word_flags & FLAG_NO_TRACE)==0)) + { + if(group_length <= 1) + fprintf(f_trans,"\n"); + } +#endif + + /* advance input data pointer */ + total_consumed += group_length; + if(total_consumed == 0) + total_consumed = 1; /* always advance over 1st letter */ + + *word += total_consumed; + + if(best.points == 0) + best.phonemes = ""; + memcpy(match_out,&best,sizeof(MatchRecord)); +} /* end of MatchRule */ + + + + +int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, char *end_phonemes, int word_flags, unsigned int *dict_flags) +{//===================================================================================================================================== +/* Translate a word bounded by space characters + Append the result to 'phonemes' and any standard prefix/suffix in 'end_phonemes' */ + + unsigned char c, c2; + unsigned int c12; + int wc=0; + int wc_prev; + int wc_bytes; + char *p2; /* copy of p for use in double letter chain match */ + int found; + int g; /* group chain number */ + int g1; /* first group for this letter */ + int n; + int letter; + int any_alpha=0; + int ix; + unsigned int digit_count=0; + char *p; + int dict_flags0=0; + MatchRecord match1; + MatchRecord match2; + char ph_buf[40]; + char word_copy[N_WORD_BYTES]; + static const char str_pause[2] = {phonPAUSE_NOLINK,0}; + + char group_name[4]; + + if(tr->data_dictrules == NULL) + return(0); + + if(dict_flags != NULL) + dict_flags0 = dict_flags[0]; + + for(ix=0; ix<(N_WORD_BYTES-1);) + { + c = p_start[ix]; + word_copy[ix++] = c; + if(c == 0) + break; + } + word_copy[ix] = 0; + + +#ifdef LOG_TRANSLATE + if((option_phonemes == 2) && ((word_flags & FLAG_NO_TRACE)==0)) + { + char wordbuf[120]; + int ix; + + for(ix=0; ((c = p_start[ix]) != ' ') && (c != 0); ix++) + { + wordbuf[ix] = c; + } + wordbuf[ix] = 0; + fprintf(f_trans,"Translate '%s'\n",wordbuf); + } +#endif + + p = p_start; + tr->word_vowel_count = 0; + tr->word_stressed_count = 0; + + if(end_phonemes != NULL) + end_phonemes[0] = 0; + + while(((c = *p) != ' ') && (c != 0)) + { + wc_prev = wc; + wc_bytes = utf8_in(&wc,p); + if(IsAlpha(wc)) + any_alpha++; + + n = tr->groups2_count[c]; + if(IsDigit(wc) && ((tr->langopts.tone_numbers == 0) || !any_alpha)) + { + // lookup the number in *_list not *_rules + char string[8]; + char buf[40]; + string[0] = '_'; + memcpy(&string[1],p,wc_bytes); + string[1+wc_bytes] = 0; + Lookup(tr, string,buf); + if(++digit_count >= 2) + { + strcat(buf,str_pause); + digit_count=0; + } + AppendPhonemes(tr,phonemes,ph_size,buf); + p += wc_bytes; + continue; + } + else + { + digit_count = 0; + found = 0; + + if(n > 0) + { + /* there are some 2 byte chains for this initial letter */ + c2 = p[1]; + c12 = c + (c2 << 8); /* 2 characters */ + + g1 = tr->groups2_start[c]; + for(g=g1; g < (g1+n); g++) + { + if(tr->groups2_name[g] == c12) + { + found = 1; + + group_name[0] = c; + group_name[1] = c2; + group_name[2] = 0; + p2 = p; + MatchRule(tr, &p2, group_name, tr->groups2[g], &match2, word_flags, dict_flags0); + if(match2.points > 0) + match2.points += 35; /* to acount for 2 letters matching */ + + /* now see whether single letter chain gives a better match ? */ + group_name[1] = 0; + MatchRule(tr, &p, group_name, tr->groups1[c], &match1, word_flags, dict_flags0); + + if(match2.points >= match1.points) + { + // use match from the 2-letter group + memcpy(&match1,&match2,sizeof(MatchRecord)); + p = p2; + } + } + } + } + + if(!found) + { + /* alphabetic, single letter chain */ + group_name[0] = c; + group_name[1] = 0; + + if(tr->groups1[c] != NULL) + MatchRule(tr, &p, group_name, tr->groups1[c], &match1, word_flags, dict_flags0); + else + { + // no group for this letter, use default group + MatchRule(tr, &p, "", tr->groups1[0], &match1, word_flags, dict_flags0); + + if((match1.points == 0) && ((option_sayas & 0x10) == 0)) + { + n = utf8_in(&letter,p-1)-1; + + if(tr->letter_bits_offset > 0) + { + // not a Latin alphabet, switch to the default Latin alphabet language + if((letter <= 0x241) && iswalpha(letter)) + { + sprintf(phonemes,"%c%s",phonSWITCH,tr->langopts.ascii_language); + return(0); + } + } +#ifdef deleted +// can't switch to a tone language, because the tone-phoneme numbers are not valid for the original language + if((letter >= 0x4e00) && (letter < 0xa000) && (tr->langopts.ideographs != 1)) + { + // Chinese ideogram + sprintf(phonemes,"%czh",phonSWITCH); + return(0); + } +#endif + + // is it a bracket ? + if(IsBracket(letter)) + { + if(pre_pause < 4) + pre_pause = 4; + } + + // no match, try removing the accent and re-translating the word + if((letter >= 0xc0) && (letter <= 0x241) && ((ix = remove_accent[letter-0xc0]) != 0)) + { + // within range of the remove_accent table + if((p[-2] != ' ') || (p[n] != ' ')) + { + // not the only letter in the word + p2 = p-1; + p[-1] = ix; + while((p[0] = p[n]) != ' ') p++; + while(n-- > 0) *p++ = ' '; // replacement character must be no longer than original + + if(tr->langopts.param[LOPT_DIERESES] && (lookupwchar(diereses_list,letter) > 0)) + { + // vowel with dieresis, replace and continue from this point + p = p2; + continue; + } + + phonemes[0] = 0; // delete any phonemes which have been produced so far + p = p_start; + tr->word_vowel_count = 0; + tr->word_stressed_count = 0; + continue; // start again at the beginning of the word + } + } + else + if((letter >= 0x3200) && (letter < 0xa700) && (end_phonemes != NULL)) + { + // ideograms + // outside the range of the accent table, speak the unknown symbol sound + Lookup(tr, "_??", ph_buf); + match1.phonemes = ph_buf; + match1.points = 1; + p += (wc_bytes-1); + } + } + } + + if(match1.points == 0) + { + if((wc >= 0x300) && (wc <= 0x36f)) + { + // combining accent inside a word, ignore + } + else + if(IsAlpha(wc)) + { + if((any_alpha > 1) || (p[wc_bytes-1] > ' ')) + { + // an unrecognised character in a word, abort and then spell the word + phonemes[0] = 0; + if(dict_flags != NULL) + dict_flags[0] |= FLAG_SPELLWORD; + break; + } + } + else + { + LookupLetter(tr, wc, -1, ph_buf); + if(ph_buf[0]) + { + match1.phonemes = ph_buf; + match1.points = 1; + } + } + p += (wc_bytes-1); + } + else + { + tr->phonemes_repeat_count = 0; + } + } + } + + if(match1.phonemes == NULL) + match1.phonemes = ""; + + if(match1.points > 0) + { + if((match1.phonemes[0] == phonSWITCH) && ((word_flags & FLAG_DONT_SWITCH_TRANSLATOR)==0)) + { + // an instruction to switch language, return immediately so we can re-translate + strcpy(phonemes,match1.phonemes); + return(0); + } + + if((match1.end_type != 0) && (end_phonemes != NULL)) + { + /* a standard ending has been found, re-translate the word without it */ + if((match1.end_type & SUFX_P) && (word_flags & FLAG_NO_PREFIX)) + { + // ignore the match on a prefix + } + else + { + if((match1.end_type & SUFX_P) && ((match1.end_type & 0x7f) == 0)) + { + // no prefix length specified + match1.end_type |= p - p_start; + } + strcpy(end_phonemes,match1.phonemes); + memcpy(p_start,word_copy,strlen(word_copy)); + return(match1.end_type); + } + } + if(match1.del_fwd != NULL) + *match1.del_fwd = REPLACED_E; + AppendPhonemes(tr,phonemes,ph_size,match1.phonemes); + } + } + + // any language specific changes ? + ApplySpecialAttribute(tr,phonemes,dict_flags0); + memcpy(p_start,word_copy,strlen(word_copy)); + + return(0); +} /* end of TranslateRules */ + + +void ApplySpecialAttribute2(Translator *tr, char *phonemes, int dict_flags) +{//======================================================================== + // apply after the translation is complete + int ix; + int len; + char *p; + + len = strlen(phonemes); + + switch(tr->translator_name) + { + case L('i','t'): + for(ix=0; ix<(len-1); ix++) + { + if(phonemes[ix] == phonSTRESS_P) + { + p = &phonemes[ix+1]; + if((dict_flags & FLAG_ALT2_TRANS) != 0) + { + if(*p == PhonemeCode('E')) + *p = PhonemeCode('e'); + if(*p == PhonemeCode('O')) + *p = PhonemeCode('o'); + } + else + { + if(*p == PhonemeCode('e')) + *p = PhonemeCode('E'); + if(*p == PhonemeCode('o')) + *p = PhonemeCode('O'); + } + break; + } + } + break; + } +} // end of ApplySpecialAttribute2 + + +void ApplySpecialAttribute(Translator *tr, char *phonemes, int dict_flags) +{//======================================================================= +// Amend the translated phonemes according to an attribute which is specific for the language. + int len; + int ix; + char *p_end; + int phoneme_1; + + if((dict_flags & (FLAG_ALT_TRANS | FLAG_ALT2_TRANS)) == 0) + return; + + len = strlen(phonemes); + p_end = &phonemes[len-1]; + + switch(tr->translator_name) + { + case L('d','e'): + if(p_end[0] == PhonemeCode2('i',':')) + { + // words ends in ['i:], change to [=I@] + p_end[-1] = phonSTRESS_PREV; + p_end[0] = PhonemeCode('I'); + p_end[1] = phonSCHWA; + p_end[2] = 0; + } + break; + + case L('p','t'): + phoneme_1 = PhonemeCode('o'); + for(ix=0; ix<(len-1); ix++) + { + if(phonemes[ix] == phoneme_1) + { + phonemes[ix] = PhonemeCode('O'); + break; + } + } + break; + + case L('r','o'): + if(p_end[0] == PhonemeCode('j')) + { + // word end in [j], change to ['i] + p_end[0] = phonSTRESS_P; + p_end[1] = PhonemeCode('i'); + p_end[2] = 0; + } + break; + } +} // end of ApplySpecialAttribute + + + +//============================================================================================= +// Look up a word in the pronunciation dictionary list +// - exceptions which override the usual pronunciation rules, or which give a word +// special properties, such as pronounce as unstressed +//============================================================================================= + +// common letter pairs, encode these as a single byte +static const short pairs_ru[] = { +0x010c, // ла 21052 0x23 +0x010e, // на 18400 +0x0113, // та 14254 +0x0301, // ав 31083 +0x030f, // ов 13420 +0x060e, // не 21798 +0x0611, // ре 19458 +0x0903, // ви 16226 +0x0b01, // ак 14456 +0x0b0f, // ок 17836 +0x0c01, // ал 13324 +0x0c09, // ил 16877 +0x0e01, // ан 15359 +0x0e06, // ен 13543 0x30 +0x0e09, // ин 17168 +0x0e0e, // нн 15973 +0x0e0f, // он 22373 +0x0e1c, // ын 15052 +0x0f03, // во 24947 +0x0f11, // ро 13552 +0x0f12, // со 16368 +0x100f, // оп 19054 +0x1011, // рп 17067 +0x1101, // ар 23967 +0x1106, // ер 18795 +0x1109, // ир 13797 +0x110f, // ор 21737 +0x1213, // тс 25076 +0x1220, // яс 14310 +0x7fff}; +//0x040f ог 12976 +//0x1306 ет 12826 +//0x0f0d мо 12688 + + +int TransposeAlphabet(char *text, int offset, int min, int max) +{//============================================================ +// transpose cyrillic alphabet (for example) into ascii (single byte) character codes +// return: number of bytes, bit 6: 1=used compression + int c; + int c2; + int ix; + char *p = text; + char *p2 = text; + int all_alpha=1; + int bits; + int acc; + + do { + p += utf8_in(&c,p); + if((c >= min) && (c <= max)) + { + *p2++ = c - offset; + } + else + if(c != 0) + { + p2 += utf8_out(c,p2); + all_alpha=0; + } + } while (c != 0); + *p2 = 0; + + if(all_alpha) + { + // compress to 6 bits per character + acc=0; + bits=0; + + p = text; + p2 = text; + while((c = *p++) != 0) + { + c2 = c + (*p << 8); + for(ix=0; c2 >= pairs_ru[ix]; ix++) + { + if(c2 == pairs_ru[ix]) + { + // found an encoding for a 2-character pair + c = ix + 0x23; // 2-character codes start at 0x23 + p++; + break; + } + } + acc = (acc << 6) + (c & 0x3f); + bits += 6; + + if(bits >= 8) + { + bits -= 8; + *p2++ = (acc >> bits); + } + } + if(bits > 0) + { + *p2++ = (acc << (8-bits)); + } + *p2 = 0; + return((p2 - text) | 0x40); // bit 6 indicates compressed characters + } + return(p2 - text); +} // end of TransposeAlphabet + + + + +static const char *LookupDict2(Translator *tr, const char *word, const char *word2, + char *phonetic, unsigned int *flags, int end_flags, WORD_TAB *wtab) +//===================================================================================== +/* Find an entry in the word_dict file for a specified word. + Returns NULL if no match, else returns 'word_end' + + word zero terminated word to match + word2 pointer to next word(s) in the input text (terminated by space) + + flags: returns dictionary flags which are associated with a matched word + + end_flags: indicates whether this is a retranslation after removing a suffix +*/ +{ + char *p; + char *next; + int hash; + int phoneme_len; + int wlen; + unsigned char flag; + unsigned int dictionary_flags; + unsigned int dictionary_flags2; + int condition_failed=0; + int n_chars; + int no_phonemes; + int skipwords; + int ix; + const char *word_end; + const char *word1; + int wflags = 0; + char word_buf[N_WORD_BYTES]; + + if(wtab != NULL) + { + wflags = wtab->flags; + } + + word1 = word; + if(tr->transpose_offset > 0) + { + strcpy(word_buf,word); + wlen = TransposeAlphabet(word_buf, tr->transpose_offset, tr->transpose_min, tr->transpose_max); + word = word_buf; + } + else + { + wlen = strlen(word); + } + + hash = HashDictionary(word); + p = tr->dict_hashtab[hash]; + + if(p == NULL) + { + if(flags != NULL) + *flags = 0; + return(0); + } + + // Find the first entry in the list for this hash value which matches. + // This corresponds to the last matching entry in the *_list file. + + while(*p != 0) + { + next = p + p[0]; + + if(((p[1] & 0x7f) != wlen) || (memcmp(word,&p[2],wlen & 0x3f) != 0)) + { + // bit 6 of wlen indicates whether the word has been compressed; so we need to match on this also. + p = next; + continue; + } + + /* found matching entry. Decode the phonetic string */ + word_end = word2; + + dictionary_flags = 0; + dictionary_flags2 = 0; + no_phonemes = p[1] & 0x80; + + p += ((p[1] & 0x3f) + 2); + + if(no_phonemes) + { + phonetic[0] = 0; + phoneme_len = 0; + } + else + { + strcpy(phonetic,p); + phoneme_len = strlen(p); + p += (phoneme_len + 1); + } + + while(p < next) + { + // examine the flags which follow the phoneme string + + flag = *p++; + if(flag >= 100) + { + // conditional rule + if(flag >= 132) + { + // fail if this condition is set + if((tr->dict_condition & (1 << (flag-132))) != 0) + condition_failed = 1; + } + else + { + // allow only if this condition is set + if((tr->dict_condition & (1 << (flag-100))) == 0) + condition_failed = 1; + } + } + else + if(flag > 80) + { + // flags 81 to 90 match more than one word + // This comes after the other flags + n_chars = next - p; + skipwords = flag - 80; + + // don't use the contraction if any of the words are emphasized + for(ix=0; ix <= skipwords; ix++) + { + if(wflags & FLAG_EMPHASIZED2) + { + condition_failed = 1; + } + } + + if(memcmp(word2,p,n_chars) != 0) + condition_failed = 1; + + if(condition_failed) + { + p = next; + break; + } + + dictionary_flags |= FLAG_SKIPWORDS; + dictionary_skipwords = skipwords; + p = next; + word_end = word2 + n_chars; + } + else + if(flag > 64) + { + // stressed syllable information, put in bits 0-3 + dictionary_flags = (dictionary_flags & ~0xf) | (flag & 0xf); + if((flag & 0xc) == 0xc) + dictionary_flags |= FLAG_STRESS_END; + } + else + if(flag >= 32) + { + dictionary_flags2 |= (1L << (flag-32)); + } + else + { + dictionary_flags |= (1L << flag); + } + } + + if(condition_failed) + { + condition_failed=0; + continue; + } + + if((end_flags & FLAG_SUFX)==0) + { + // no suffix has been removed + if(dictionary_flags & FLAG_STEM) + continue; // this word must have a suffix + } + + if((end_flags & SUFX_P) && (dictionary_flags & (FLAG_ONLY | FLAG_ONLY_S))) + continue; // $only or $onlys, don't match if a prefix has been removed + + if(end_flags & FLAG_SUFX) + { + // a suffix was removed from the word + if(dictionary_flags & FLAG_ONLY) + continue; // no match if any suffix + + if((dictionary_flags & FLAG_ONLY_S) && ((end_flags & FLAG_SUFX_S)==0)) + { + // only a 's' suffix allowed, but the suffix wasn't 's' + continue; + } + } + + if(dictionary_flags2 & FLAG_HYPHENATED) + { + if(!(wflags & FLAG_HYPHEN_AFTER)) + { + continue; + } + } + if(dictionary_flags2 & FLAG_CAPITAL) + { + if(!(wflags & FLAG_FIRST_UPPER)) + { + continue; + } + } + if(dictionary_flags2 & FLAG_ALLCAPS) + { + if(!(wflags & FLAG_ALL_UPPER)) + { + continue; + } + } + + if((dictionary_flags & FLAG_ATEND) && (word_end < tr->clause_end)) + { + // only use this pronunciation if it's the last word of the clause + continue; + } + + if(dictionary_flags2 & FLAG_VERB) + { + // this is a verb-form pronunciation + + if(tr->expect_verb || (tr->expect_verb_s && (end_flags & FLAG_SUFX_S))) + { + // OK, we are expecting a verb + } + else + { + /* don't use the 'verb' pronunciation unless we are + expecting a verb */ + continue; + } + } + if(dictionary_flags2 & FLAG_PAST) + { + if(!tr->expect_past) + { + /* don't use the 'past' pronunciation unless we are + expecting past tense */ + continue; + } + } + if(dictionary_flags2 & FLAG_NOUN) + { + if(!tr->expect_noun) + { + /* don't use the 'noun' pronunciation unless we are + expecting a noun */ + continue; + } + } + + if(flags != NULL) + { + flags[0] = dictionary_flags | FLAG_FOUND_ATTRIBUTES; + flags[1] = dictionary_flags2; + } + + if(phoneme_len == 0) + { + if(option_phonemes == 2) + { + fprintf(f_trans,"Flags: %s %s\n",word1,print_dictionary_flags(flags)); + } + return(0); // no phoneme translation found here, only flags. So use rules + } + + if(flags != NULL) + flags[0] |= FLAG_FOUND; // this flag indicates word was found in dictionary + + if(option_phonemes == 2) + { + unsigned int flags1 = 0; + char ph_decoded[N_WORD_PHONEMES]; + int textmode; + + DecodePhonemes(phonetic,ph_decoded); + if(flags != NULL) + flags1 = flags[0]; + + if((dictionary_flags & FLAG_TEXTMODE) == 0) + textmode = 0; + else + textmode = 1; + + if(textmode == translator->langopts.textmode) + { + // only show this line if the word translates to phonemes, not replacement text + fprintf(f_trans,"Found: %s [%s] %s\n",word1,ph_decoded,print_dictionary_flags(flags)); + } + } + return(word_end); + + } + return(0); +} // end of LookupDict2 + + + +int LookupDictList(Translator *tr, char **wordptr, char *ph_out, unsigned int *flags, int end_flags, WORD_TAB *wtab) +//================================================================================================================== +/* Lookup a specified word in the word dictionary. + Returns phonetic data in 'phonetic' and bits in 'flags' + + end_flags: indicates if a suffix has been removed +*/ +{ + int length; + const char *found; + const char *word1; + const char *word2; + unsigned char c; + int nbytes; + int len; + char word[N_WORD_BYTES]; + static char word_replacement[N_WORD_BYTES]; + + length = 0; + word2 = word1 = *wordptr; + + while((word2[nbytes = utf8_nbytes(word2)]==' ') && (word2[nbytes+1]=='.')) + { + // look for an abbreviation of the form a.b.c + // try removing the spaces between the dots and looking for a match + memcpy(&word[length],word2,nbytes); + length += nbytes; + word[length++] = '.'; + word2 += nbytes+3; + } + if(length > 0) + { + // found an abbreviation containing dots + nbytes = 0; + while(((c = word2[nbytes]) != 0) && (c != ' ')) + { + nbytes++; + } + memcpy(&word[length],word2,nbytes); + word[length+nbytes] = 0; + found = LookupDict2(tr, word, word2, ph_out, flags, end_flags, wtab); + if(found) + { + // set the skip words flag + flags[0] |= FLAG_SKIPWORDS; + dictionary_skipwords = length; + return(1); + } + } + + for(length=0; lengthphonemes_repeat) == 0) + { + tr->phonemes_repeat_count++; + if(tr->phonemes_repeat_count > 3) + { + ph_out[0] = 0; + } + } + else + { + strncpy0(tr->phonemes_repeat, ph_out, sizeof(tr->phonemes_repeat)); + tr->phonemes_repeat_count = 1; + } + } + else + { + tr->phonemes_repeat_count = 0; + } + + + if((found == 0) && (flags[1] & FLAG_ACCENT)) + { + int letter; + word2 = word; + if(*word2 == '_') word2++; + len = utf8_in(&letter, word2); + LookupAccentedLetter(tr,letter, ph_out); + found = word2 + len; + } + + if(found == 0) + { + ph_out[0] = 0; + + // try modifications to find a recognised word + + if((end_flags & FLAG_SUFX_E_ADDED) && (word[length-1] == 'e')) + { + // try removing an 'e' which has been added by RemoveEnding + word[length-1] = 0; + found = LookupDict2(tr, word, word1, ph_out, flags, end_flags, wtab); + } + else + if((end_flags & SUFX_D) && (word[length-1] == word[length-2])) + { + // try removing a double letter + word[length-1] = 0; + found = LookupDict2(tr, word, word1, ph_out, flags, end_flags, wtab); + } + } + + if(found) + { + // if textmode is the default, then words which have phonemes are marked. + if(tr->langopts.textmode) + *flags ^= FLAG_TEXTMODE; + + if(*flags & FLAG_TEXTMODE) + { + // the word translates to replacement text, not to phonemes + + if(end_flags & FLAG_ALLOW_TEXTMODE) + { + // only use replacement text if this is the original word, not if a prefix or suffix has been removed + word_replacement[0] = 0; + word_replacement[1] = ' '; + sprintf(&word_replacement[2],"%s ",ph_out); // replacement word, preceded by zerochar and space + + word1 = *wordptr; + *wordptr = &word_replacement[2]; + + if(option_phonemes == 2) + { + len = found - word1; + memcpy(word,word1,len); // include multiple matching words + word[len] = 0; + fprintf(f_trans,"Replace: %s %s\n",word,*wordptr); + } + } + + ph_out[0] = 0; + return(0); + } + + return(1); + } + + ph_out[0] = 0; + return(0); +} // end of LookupDictList + + + +int Lookup(Translator *tr, const char *word, char *ph_out) +{//=================================================== + unsigned int flags[2]={0,0}; + char* word1 = (char *)word; + return(LookupDictList(tr, &word1, ph_out, flags, 0, NULL)); +} + + + +int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy) +{//======================================================================== +/* Removes a standard suffix from a word, once it has been indicated by the dictionary rules. + end_type: bits 0-6 number of letters + bits 8-14 suffix flags + + word_copy: make a copy of the original word + This routine is language specific. In English it deals with reversing y->i and e-dropping + that were done when the suffix was added to the original word. +*/ + + int i; + char *word_end; + int len_ending; + int end_flags; + const char *p; + int len; + static char ending[12]; + + // these lists are language specific, but are only relevent if the 'e' suffix flag is used + static const char *add_e_exceptions[] = { + "ion", NULL }; + + static const char *add_e_additions[] = { + "c", "rs", "ir", "ur", "ath", "ns", "lu", NULL }; + + for(word_end = word; *word_end != ' '; word_end++) + { + /* replace discarded 'e's */ + if(*word_end == REPLACED_E) + *word_end = 'e'; + } + i = word_end - word; + memcpy(word_copy,word,i); + word_copy[i] = 0; + + // look for multibyte characters to increase the number of bytes to remove + for(len_ending = i = (end_type & 0x3f); i>0 ;i--) // num.of characters of the suffix + { + word_end--; + while((*word_end & 0xc0) == 0x80) + { + word_end--; // for multibyte characters + len_ending++; + } + } + + // remove bytes from the end of the word and replace them by spaces + for(i=0; iexpect_verb==0)) + tr->expect_verb = 1; // this suffix indicates the verb pronunciation + + + if((strcmp(ending,"s")==0) || (strcmp(ending,"es")==0)) + end_flags |= FLAG_SUFX_S; + + if(strcmp(ending,"'s")==0) + end_flags &= ~FLAG_SUFX; // don't consider 's as an added suffix + + return(end_flags); +} /* end of RemoveEnding */ + + diff --git a/navit/support/espeak/intonation.c b/navit/support/espeak/intonation.c new file mode 100755 index 0000000..61b2ff2 --- /dev/null +++ b/navit/support/espeak/intonation.c @@ -0,0 +1,1104 @@ +/*************************************************************************** + * Copyright (C) 2005 to 2007 by Jonathan Duddington * + * email: jonsd@users.sourceforge.net * + * * + * 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; either version 3 of the License, or * + * (at your option) any later version. * + * * + * 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 see: * + * . * + ***************************************************************************/ + +#include "StdAfx.h" + +#include +#include +#include + +#include "speak_lib.h" +#include "speech.h" +#include "phoneme.h" +#include "synthesize.h" +#include "voice.h" +#include "translate.h" + + +/* Note this module is mostly old code that needs to be rewritten to + provide a more flexible intonation system. +*/ + +// bits in SYLLABLE.flags +#define SYL_RISE 1 +#define SYL_EMPHASIS 2 +#define SYL_END_CLAUSE 4 + +typedef struct { + char stress; + char env; + char flags; //bit 0=pitch rising, bit1=emnphasized, bit2=end of clause + char nextph_type; + short pitch1; + short pitch2; +} SYLLABLE; + +static SYLLABLE *syllable_tab; + + +static int tone_pitch_env; /* used to return pitch envelope */ + + + +/* Pitch data for tone types */ +/*****************************/ + + +#define PITCHfall 0 +#define PITCHrise 1 +#define PITCHfrise 2 // and 3 must be for the varient preceded by 'r' +#define PITCHfrise2 4 // and 5 must be the 'r' variant +#define PITCHrisefall 6 + +/* 0 fall */ +unsigned char env_fall[128] = { + 0xff, 0xfd, 0xfa, 0xf8, 0xf6, 0xf4, 0xf2, 0xf0, 0xee, 0xec, 0xea, 0xe8, 0xe6, 0xe4, 0xe2, 0xe0, + 0xde, 0xdc, 0xda, 0xd8, 0xd6, 0xd4, 0xd2, 0xd0, 0xce, 0xcc, 0xca, 0xc8, 0xc6, 0xc4, 0xc2, 0xc0, + 0xbe, 0xbc, 0xba, 0xb8, 0xb6, 0xb4, 0xb2, 0xb0, 0xae, 0xac, 0xaa, 0xa8, 0xa6, 0xa4, 0xa2, 0xa0, + 0x9e, 0x9c, 0x9a, 0x98, 0x96, 0x94, 0x92, 0x90, 0x8e, 0x8c, 0x8a, 0x88, 0x86, 0x84, 0x82, 0x80, + 0x7e, 0x7c, 0x7a, 0x78, 0x76, 0x74, 0x72, 0x70, 0x6e, 0x6c, 0x6a, 0x68, 0x66, 0x64, 0x62, 0x60, + 0x5e, 0x5c, 0x5a, 0x58, 0x56, 0x54, 0x52, 0x50, 0x4e, 0x4c, 0x4a, 0x48, 0x46, 0x44, 0x42, 0x40, + 0x3e, 0x3c, 0x3a, 0x38, 0x36, 0x34, 0x32, 0x30, 0x2e, 0x2c, 0x2a, 0x28, 0x26, 0x24, 0x22, 0x20, + 0x1e, 0x1c, 0x1a, 0x18, 0x16, 0x14, 0x12, 0x10, 0x0e, 0x0c, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x00 }; + +/* 1 rise */ +unsigned char env_rise[128] = { + 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, + 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, + 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, + 0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, + 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, + 0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, + 0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, + 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfd, 0xff }; + +unsigned char env_frise[128] = { + 0xff, 0xf4, 0xea, 0xe0, 0xd6, 0xcc, 0xc3, 0xba, 0xb1, 0xa8, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x78, + 0x71, 0x6a, 0x63, 0x5c, 0x56, 0x50, 0x4a, 0x44, 0x3f, 0x39, 0x34, 0x2f, 0x2b, 0x26, 0x22, 0x1e, + 0x1a, 0x17, 0x13, 0x10, 0x0d, 0x0b, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x13, 0x15, 0x17, + 0x1a, 0x1d, 0x1f, 0x22, 0x25, 0x28, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x39, 0x3b, 0x3d, 0x40, + 0x42, 0x45, 0x47, 0x4a, 0x4c, 0x4f, 0x51, 0x54, 0x57, 0x5a, 0x5d, 0x5f, 0x62, 0x65, 0x68, 0x6b, + 0x6e, 0x71, 0x74, 0x78, 0x7b, 0x7e, 0x81, 0x85, 0x88, 0x8b, 0x8f, 0x92, 0x96, 0x99, 0x9d, 0xa0, + 0xa4, 0xa8, 0xac, 0xaf, 0xb3, 0xb7, 0xbb, 0xbf, 0xc3, 0xc7, 0xcb, 0xcf, 0xd3, 0xd7, 0xdb, 0xe0 }; + +static unsigned char env_r_frise[128] = { + 0xcf, 0xcc, 0xc9, 0xc6, 0xc3, 0xc0, 0xbd, 0xb9, 0xb4, 0xb0, 0xab, 0xa7, 0xa2, 0x9c, 0x97, 0x92, + 0x8c, 0x86, 0x81, 0x7b, 0x75, 0x6f, 0x69, 0x63, 0x5d, 0x57, 0x50, 0x4a, 0x44, 0x3e, 0x38, 0x33, + 0x2d, 0x27, 0x22, 0x1c, 0x17, 0x12, 0x0d, 0x08, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, 0x0a, 0x0c, 0x0d, 0x0f, 0x12, 0x14, 0x16, + 0x19, 0x1b, 0x1e, 0x21, 0x24, 0x27, 0x2a, 0x2d, 0x30, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3f, 0x41, + 0x43, 0x46, 0x48, 0x4b, 0x4d, 0x50, 0x52, 0x55, 0x58, 0x5a, 0x5d, 0x60, 0x63, 0x66, 0x69, 0x6c, + 0x6f, 0x72, 0x75, 0x78, 0x7b, 0x7e, 0x81, 0x85, 0x88, 0x8b, 0x8f, 0x92, 0x96, 0x99, 0x9d, 0xa0, + 0xa4, 0xa8, 0xac, 0xaf, 0xb3, 0xb7, 0xbb, 0xbf, 0xc3, 0xc7, 0xcb, 0xcf, 0xd3, 0xd7, 0xdb, 0xe0 }; + +static unsigned char env_frise2[128] = { + 0xff, 0xf9, 0xf4, 0xee, 0xe9, 0xe4, 0xdf, 0xda, 0xd5, 0xd0, 0xcb, 0xc6, 0xc1, 0xbd, 0xb8, 0xb3, + 0xaf, 0xaa, 0xa6, 0xa1, 0x9d, 0x99, 0x95, 0x90, 0x8c, 0x88, 0x84, 0x80, 0x7d, 0x79, 0x75, 0x71, + 0x6e, 0x6a, 0x67, 0x63, 0x60, 0x5d, 0x59, 0x56, 0x53, 0x50, 0x4d, 0x4a, 0x47, 0x44, 0x41, 0x3e, + 0x3c, 0x39, 0x37, 0x34, 0x32, 0x2f, 0x2d, 0x2b, 0x28, 0x26, 0x24, 0x22, 0x20, 0x1e, 0x1c, 0x1a, + 0x19, 0x17, 0x15, 0x14, 0x12, 0x11, 0x0f, 0x0e, 0x0d, 0x0c, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, + 0x05, 0x04, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x04, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x12, 0x13, 0x15, 0x17, 0x18, 0x1a, 0x1c, 0x1e, 0x20 }; + +static unsigned char env_r_frise2[128] = { + 0xd0, 0xce, 0xcd, 0xcc, 0xca, 0xc8, 0xc7, 0xc5, 0xc3, 0xc1, 0xc0, 0xbd, 0xbb, 0xb8, 0xb5, 0xb3, + 0xb0, 0xad, 0xaa, 0xa7, 0xa3, 0xa0, 0x9d, 0x99, 0x96, 0x92, 0x8f, 0x8b, 0x87, 0x84, 0x80, 0x7c, + 0x78, 0x74, 0x70, 0x6d, 0x69, 0x65, 0x61, 0x5d, 0x59, 0x55, 0x51, 0x4d, 0x4a, 0x46, 0x42, 0x3e, + 0x3b, 0x37, 0x34, 0x31, 0x2f, 0x2d, 0x2a, 0x28, 0x26, 0x24, 0x22, 0x20, 0x1e, 0x1c, 0x1a, 0x19, + 0x17, 0x15, 0x14, 0x12, 0x11, 0x0f, 0x0e, 0x0d, 0x0c, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x05, + 0x04, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x04, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x12, 0x13, 0x15, 0x17, 0x18, 0x1a, 0x1c, 0x1e, 0x20 }; + +static unsigned char env_risefall[128] = { + 0x98, 0x99, 0x99, 0x9a, 0x9c, 0x9d, 0x9f, 0xa1, 0xa4, 0xa7, 0xa9, 0xac, 0xb0, 0xb3, 0xb6, 0xba, + 0xbe, 0xc1, 0xc5, 0xc9, 0xcd, 0xd1, 0xd4, 0xd8, 0xdc, 0xdf, 0xe3, 0xe6, 0xea, 0xed, 0xf0, 0xf2, + 0xf5, 0xf7, 0xf9, 0xfb, 0xfc, 0xfd, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, + 0xfb, 0xfa, 0xf8, 0xf6, 0xf3, 0xf1, 0xee, 0xec, 0xe9, 0xe6, 0xe4, 0xe0, 0xdd, 0xda, 0xd7, 0xd3, + 0xd0, 0xcc, 0xc8, 0xc4, 0xc0, 0xbc, 0xb8, 0xb4, 0xb0, 0xac, 0xa7, 0xa3, 0x9f, 0x9a, 0x96, 0x91, + 0x8d, 0x88, 0x84, 0x7f, 0x7b, 0x76, 0x72, 0x6d, 0x69, 0x65, 0x60, 0x5c, 0x58, 0x54, 0x50, 0x4c, + 0x48, 0x44, 0x40, 0x3c, 0x39, 0x35, 0x32, 0x2f, 0x2b, 0x28, 0x26, 0x23, 0x20, 0x1d, 0x1a, 0x17, + 0x15, 0x12, 0x0f, 0x0d, 0x0a, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +static unsigned char env_rise2[128] = { + 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x06, 0x06, + 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, + 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1f, 0x20, 0x22, 0x23, 0x25, 0x26, 0x28, 0x29, 0x2b, + 0x2d, 0x2f, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, 0x40, 0x42, 0x44, 0x47, 0x49, 0x4b, + 0x4e, 0x50, 0x52, 0x55, 0x57, 0x5a, 0x5d, 0x5f, 0x62, 0x65, 0x67, 0x6a, 0x6d, 0x70, 0x73, 0x76, + 0x79, 0x7c, 0x7f, 0x82, 0x86, 0x89, 0x8c, 0x90, 0x93, 0x96, 0x9a, 0x9d, 0xa0, 0xa3, 0xa6, 0xa9, + 0xac, 0xaf, 0xb2, 0xb5, 0xb8, 0xbb, 0xbe, 0xc1, 0xc4, 0xc7, 0xca, 0xcd, 0xd0, 0xd3, 0xd6, 0xd9, + 0xdc, 0xdf, 0xe2, 0xe4, 0xe7, 0xe9, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfb, 0xfd }; + +static unsigned char env_fall2[128] = { + 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xfb, 0xfb, 0xfa, 0xfa, 0xf9, 0xf8, 0xf8, 0xf7, 0xf7, 0xf6, 0xf6, + 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, 0xf0, 0xf0, 0xef, 0xee, 0xee, 0xed, 0xec, 0xeb, + 0xea, 0xea, 0xe9, 0xe8, 0xe7, 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, 0xe1, 0xe0, 0xde, 0xdd, 0xdc, 0xdb, + 0xd9, 0xd8, 0xd6, 0xd5, 0xd3, 0xd2, 0xd0, 0xce, 0xcc, 0xcb, 0xc9, 0xc7, 0xc5, 0xc3, 0xc0, 0xbe, + 0xbc, 0xb9, 0xb7, 0xb5, 0xb2, 0xaf, 0xad, 0xaa, 0xa7, 0xa4, 0xa1, 0x9e, 0x9a, 0x97, 0x94, 0x90, + 0x8d, 0x89, 0x85, 0x81, 0x7d, 0x79, 0x75, 0x71, 0x6d, 0x68, 0x64, 0x61, 0x5e, 0x5b, 0x57, 0x54, + 0x51, 0x4d, 0x4a, 0x46, 0x43, 0x40, 0x3c, 0x39, 0x35, 0x32, 0x2e, 0x2a, 0x27, 0x23, 0x1f, 0x1c, + 0x18, 0x14, 0x11, 0x0d, 0x0b, 0x09, 0x07, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00 }; + +static unsigned char env_fallrise3[128] = { + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf4, 0xf1, 0xee, 0xeb, + 0xe8, 0xe5, 0xe1, 0xde, 0xda, 0xd6, 0xd2, 0xcd, 0xc9, 0xc4, 0xbf, 0xba, 0xb6, 0xb0, 0xab, 0xa6, + 0xa1, 0x9c, 0x96, 0x91, 0x8b, 0x86, 0x80, 0x7b, 0x75, 0x6f, 0x6a, 0x64, 0x5f, 0x59, 0x54, 0x4f, + 0x49, 0x44, 0x3f, 0x3a, 0x35, 0x30, 0x2b, 0x26, 0x22, 0x1d, 0x19, 0x15, 0x11, 0x0d, 0x0a, 0x07, + 0x04, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x04, 0x05, + 0x07, 0x09, 0x0b, 0x0d, 0x10, 0x12, 0x15, 0x18, 0x1b, 0x1e, 0x22, 0x25, 0x29, 0x2d, 0x31, 0x35, + 0x3a, 0x3e, 0x43, 0x48, 0x4c, 0x51, 0x57, 0x5b, 0x5e, 0x62, 0x65, 0x68, 0x6b, 0x6e, 0x71, 0x74, + 0x76, 0x78, 0x7b, 0x7c, 0x7e, 0x80, 0x81, 0x82, 0x83, 0x83, 0x84, 0x84, 0x83, 0x83, 0x82, 0x81 }; + +static unsigned char env_fallrise4[128] = { + 0x72, 0x72, 0x71, 0x71, 0x70, 0x6f, 0x6d, 0x6c, 0x6a, 0x68, 0x66, 0x64, 0x61, 0x5f, 0x5c, 0x5a, + 0x57, 0x54, 0x51, 0x4e, 0x4b, 0x48, 0x45, 0x42, 0x3f, 0x3b, 0x38, 0x35, 0x32, 0x2f, 0x2c, 0x29, + 0x26, 0x23, 0x20, 0x1d, 0x1b, 0x18, 0x16, 0x14, 0x12, 0x10, 0x0e, 0x0c, 0x0b, 0x0a, 0x09, 0x08, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, + 0x07, 0x07, 0x08, 0x09, 0x0a, 0x0c, 0x0d, 0x0f, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1b, 0x1d, 0x20, + 0x23, 0x26, 0x29, 0x2c, 0x2f, 0x33, 0x37, 0x3b, 0x3f, 0x43, 0x47, 0x4c, 0x51, 0x56, 0x5b, 0x60, + 0x65, 0x6a, 0x6f, 0x74, 0x79, 0x7f, 0x84, 0x89, 0x8f, 0x95, 0x9b, 0xa1, 0xa7, 0xad, 0xb3, 0xba, + 0xc0, 0xc7, 0xce, 0xd5, 0xdc, 0xe3, 0xea, 0xf1, 0xf5, 0xf7, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xff }; + +static unsigned char env_risefallrise[128] = { + 0x7f, 0x7f, 0x7f, 0x80, 0x81, 0x83, 0x84, 0x87, 0x89, 0x8c, 0x8f, 0x92, 0x96, 0x99, 0x9d, 0xa1, + 0xa5, 0xaa, 0xae, 0xb2, 0xb7, 0xbb, 0xc0, 0xc5, 0xc9, 0xcd, 0xd2, 0xd6, 0xda, 0xde, 0xe2, 0xe6, + 0xea, 0xed, 0xf0, 0xf3, 0xf5, 0xf8, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xfe, 0xfd, 0xfc, 0xfb, 0xf9, + 0xf7, 0xf4, 0xf0, 0xec, 0xe7, 0xe2, 0xdc, 0xd5, 0xce, 0xc6, 0xbd, 0xb4, 0xa9, 0x9e, 0x92, 0x88, + 0x82, 0x7d, 0x77, 0x72, 0x6c, 0x66, 0x60, 0x5a, 0x54, 0x4e, 0x49, 0x42, 0x3c, 0x37, 0x32, 0x2d, + 0x28, 0x24, 0x1f, 0x1b, 0x18, 0x14, 0x11, 0x0e, 0x0c, 0x09, 0x07, 0x06, 0x05, 0x04, 0x04, 0x04, + 0x04, 0x05, 0x06, 0x08, 0x0a, 0x0d, 0x10, 0x14, 0x18, 0x1d, 0x23, 0x29, 0x2f, 0x37, 0x3e, 0x47, + 0x50, 0x5a, 0x64, 0x70, 0x7c, 0x83, 0x85, 0x88, 0x8a, 0x8c, 0x8e, 0x8f, 0x91, 0x92, 0x93, 0x93 }; + + + + +unsigned char *envelope_data[18] = { + env_fall, + env_rise, + env_frise, env_r_frise, + env_frise2, env_r_frise2, + env_risefall, env_risefall, + + env_fallrise3, env_fallrise3, + env_fallrise4, env_fallrise4, + env_fall2, env_fall2, + env_rise2, env_rise2, + env_risefallrise, env_risefallrise + }; + + +/* all pitches given in Hz above pitch_base */ + +// pitch change during the main part of the clause +static int drops_0[8] = {0x400,0x400,0x700,0x700,0x700,0xa00,0x1800,0x0e00}; +//static int drops_1[8] = {0x400,0x400,0x600,0x600,0xc00,0xc00,0x0e00,0x0e00}; +//static int drops_2[8] = {0x400,0x400,0x600,0x600,-0x800,0xc00,0x0e00,0x0e00}; + +static short oflow[] = {0, 20, 12, 4, 0}; +static short oflow_emf[] = {5, 24, 15, 10, 5}; +static short oflow_less[] = {3, 19, 12, 7, 2}; +// static short oflow_test2[] = {20, 0, 20, 0, 20}; +// static short back_emf[] = {35, 32, 0}; + + +#define N_TONE_HEAD_TABLE 13 +#define N_TONE_NUCLEUS_TABLE 13 + + +typedef struct { + unsigned char pre_start; + unsigned char pre_end; + + unsigned char body_start; + unsigned char body_end; + + int *body_drops; + unsigned char body_max_steps; + char body_lower_u; + + char n_overflow; + short *overflow; +} TONE_HEAD; + + +typedef struct { + unsigned char pitch_env0; /* pitch envelope, tonic syllable at end */ + unsigned char tonic_max0; + unsigned char tonic_min0; + + unsigned char pitch_env1; /* followed by unstressed */ + unsigned char tonic_max1; + unsigned char tonic_min1; + + short *backwards; + + unsigned char tail_start; + unsigned char tail_end; + unsigned char flags; +} TONE_NUCLEUS; + +#define T_EMPH 1 + +static TONE_HEAD tone_head_table[N_TONE_HEAD_TABLE] = { + {20, 25, 34, 22, drops_0, 3, 3, 5, oflow}, // 0 statement + {20, 25, 34, 20, drops_0, 3, 3, 5, oflow}, // 1 comma + {20, 25, 34, 20, drops_0, 3, 3, 5, oflow}, // 2 question + {20, 25, 36, 22, drops_0, 3, 4, 5, oflow_emf}, // 3 exclamation + {20, 25, 34, 22, drops_0, 3, 3, 5, oflow}, // 4 statement, emphatic + {20, 25, 32, 24, drops_0, 4, 3, 5, oflow_less}, // 5 statement, less intonation + {20, 25, 32, 24, drops_0, 4, 3, 5, oflow_less}, // 6 comma, less intonation + {20, 25, 32, 24, drops_0, 4, 3, 5, oflow_less}, // 7 comma, less intonation, less rise + {20, 25, 34, 22, drops_0, 3, 3, 5, oflow}, // 8 pitch raises at end of sentence + {20, 25, 34, 20, drops_0, 3, 3, 5, oflow}, // 9 comma + {20, 25, 34, 22, drops_0, 3, 3, 5, oflow}, // 10 question + {15, 18, 18, 14, drops_0, 3, 3, 5, oflow_less}, // 11 test + {20, 25, 24, 22, drops_0, 3, 3, 5, oflow_less}, // 12 test +}; + +static TONE_NUCLEUS tone_nucleus_table[N_TONE_NUCLEUS_TABLE] = { + {PITCHfall, 30, 5, PITCHfall, 32, 9, NULL, 12, 7, 0}, // 0 statement + {PITCHfrise, 35, 8, PITCHfrise2, 35,10, NULL, 15, 23, 0}, // 1 comma + {PITCHfrise, 39,10, PITCHfrise2, 36,10, NULL, 15, 28, 0}, // 2 question +// {PITCHfall, 41, 4, PITCHfall, 41,27, NULL, 16, 4, T_EMPH}, // 3 exclamation + {PITCHfall, 41, 4, PITCHfall, 41,35, NULL, 35, 4, T_EMPH}, // 3 exclamation + {PITCHfall, 38, 2, PITCHfall, 42,30, NULL, 15, 5, 0}, // 4 statement, emphatic + {PITCHfall, 28, 5, PITCHfall, 28, 9, NULL, 12, 7, 0}, // 5 statement, less intonation + {PITCHfrise, 30, 8, PITCHfrise2, 30,10, NULL, 13, 20, 0}, // 6 comma, less intonation + {PITCHfrise2, 28, 7, PITCHfall, 29,14, NULL, 14, 8, 0}, // 7 comma, less intonation, less rise + {PITCHrise, 30,20, PITCHfall, 19,14, NULL, 20, 26, 0}, // 8 pitch raises at end of sentence + {PITCHfrise, 35,11, PITCHfrise2, 32,10, NULL, 19, 24, 0}, // 9 comma + {PITCHfrise, 39,15, PITCHfall, 28,14, NULL, 20, 36, 0}, // 10 question + {PITCHfall, 28, 6, PITCHfall, 28,10, NULL, 12, 6, 0}, // 11 test + {PITCHfall, 35, 9, PITCHfall, 35,12, NULL, 16, 10, 0}, // 12 test +}; + + + +/* index by 0=. 1=, 2=?, 3=! 4=none, 5=emphasized */ +unsigned char punctuation_to_tone[INTONATION_TYPES][PUNCT_INTONATIONS] = { + {0,1,2,3,0,4}, + {0,1,2,3,0,4}, + {5,6,2,3,0,4}, + {5,7,1,3,0,4}, + {8,9,10,3,0,0}, + {8,8,10,3,0,0}, + {11,11,11,11,0,0}, // 6 test + {12,12,12,12,0,0} +}; + + + +/* indexed by stress */ +static int min_drop[] = {0x300,0x300,0x400,0x400,0x900,0x900,0x900,0xb00}; + + + + +#define SECONDARY 3 +#define PRIMARY 4 +#define PRIMARY_STRESSED 6 +#define PRIMARY_LAST 7 + + +static int number_pre; +static int number_body; +static int number_tail; +static int last_primary; +static int tone_posn; +static int tone_posn2; +static int no_tonic; + + +static void count_pitch_vowels(int start, int end, int clause_end) +/****************************************************************/ +{ + int ix; + int stress; + int max_stress = 0; + int max_stress_posn = 0; // last syllable ot the highest stress + int max_stress_posn2 = 0; // penuntimate syllable of the highest stress + + number_pre = -1; /* number of vowels before 1st primary stress */ + number_body = 0; + number_tail = 0; /* number between tonic syllable and next primary */ + last_primary = -1; + + for(ix=start; ix= max_stress) + { + if(stress > max_stress) + { + max_stress_posn2 = ix; + } + else + { + max_stress_posn2 = max_stress_posn; + } + max_stress_posn = ix; + max_stress = stress; + } + if(stress >= PRIMARY) + { + if(number_pre < 0) + number_pre = ix - start; + + last_primary = ix; + } + + } + + if(number_pre < 0) + number_pre = end; + + number_tail = end - max_stress_posn - 1; + tone_posn = max_stress_posn; + tone_posn2 = max_stress_posn2; + + if(no_tonic) + { + tone_posn = tone_posn2 = end; // next position after the end of the truncated clause + } + else + if(last_primary >= 0) + { + if(end == clause_end) + { + syllable_tab[last_primary].stress = PRIMARY_LAST; + } + } + else + { + // no primary stress. Use the highest stress + syllable_tab[tone_posn].stress = PRIMARY_LAST; + } +} /* end of count_pitch_vowels */ + + + + +static int count_increments(int ix, int end_ix, int min_stress) +/*************************************************************/ +/* Count number of primary stresses up to tonic syllable or body_reset */ +{ + int count = 0; + int stress; + + while(ix < end_ix) + { + stress = syllable_tab[ix++].stress; + if(stress >= PRIMARY_LAST) + break; + + if(stress >= min_stress) + count++; + } + return(count); +} /* end of count_increments */ + + + +static void set_pitch(SYLLABLE *syl, int base, int drop) +/******************************************************/ +// Set the pitch of a vowel in syllable_tab. Base & drop are Hz * 256 +{ + int pitch1, pitch2; + int flags = 0; + + /* adjust experimentally */ + int pitch_range2 = 148; + int pitch_base2 = 72; + + if(base < 0) base = 0; + + pitch2 = ((base * pitch_range2 ) >> 15) + pitch_base2; + + if(drop < 0) + { + flags = SYL_RISE; + drop = -drop; + } + + pitch1 = pitch2 + ((drop * pitch_range2) >> 15); + + if(pitch1 > 511) pitch1 = 511; + if(pitch2 > 511) pitch2 = 511; + + syl->pitch1 = pitch1; + syl->pitch2 = pitch2; + syl->flags |= flags; +} /* end of set_pitch */ + + + +static int calc_pitch_segment(int ix, int end_ix, TONE_HEAD *th, TONE_NUCLEUS *tn, int min_stress, int continuing) +/**********************************************************************************************/ +/* Calculate pitches until next RESET or tonic syllable, or end. + Increment pitch if stress is >= min_stress. + Used for tonic segment */ +{ + int stress; + int pitch=0; + int increment=0; + int n_primary=0; + int n_steps=0; + int initial; + int overflow=0; + int n_overflow; + int *drops; + short *overflow_tab; + SYLLABLE *syl; + + static short continue_tab[5] = {-13, 16, 10, 4, 0}; + + drops = th->body_drops; + + if(continuing) + { + initial =0; + overflow = 0; + n_overflow = 5; + overflow_tab = continue_tab; + increment = (th->body_end - th->body_start) << 8; + increment = increment / (th->body_max_steps -1); + } + else + { + n_overflow = th->n_overflow; + overflow_tab = th->overflow; + initial = 1; + } + + while(ix < end_ix) + { + syl = &syllable_tab[ix]; + stress = syl->stress; + +// if(stress == PRIMARY_MARKED) +// initial = 1; // reset the intonation pattern + + if(initial || (stress >= min_stress)) + { + // a primary stress + + if((initial) || (stress == 5)) + { + initial = 0; + overflow = 0; + n_steps = n_primary = count_increments(ix,end_ix,min_stress); + + if(n_steps > th->body_max_steps) + n_steps = th->body_max_steps; + + if(n_steps > 1) + { + increment = (th->body_end - th->body_start) << 8; + increment = increment / (n_steps -1); + } + else + increment = 0; + + pitch = th->body_start << 8; + } + else + { + if(n_steps > 0) + pitch += increment; + else + { + pitch = (th->body_end << 8) - (increment * overflow_tab[overflow++])/16; + if(overflow >= n_overflow) + { + overflow = 0; + overflow_tab = th->overflow; + } + } + } + + n_steps--; + + n_primary--; + if((tn->backwards) && (n_primary < 2)) + { + pitch = tn->backwards[n_primary] << 8; + } + } + + if(stress >= PRIMARY) + { + syl->stress = PRIMARY_STRESSED; + set_pitch(syl,pitch,drops[stress]); + } + else + if(stress >= SECONDARY) + { + set_pitch(syl,pitch,drops[stress]); + } + else + { + /* unstressed, drop pitch if preceded by PRIMARY */ + if((syllable_tab[ix-1].stress & 0x3f) >= SECONDARY) + set_pitch(syl,pitch - (th->body_lower_u << 8), drops[stress]); + else + set_pitch(syl,pitch,drops[stress]); + } + + ix++; + } + return(ix); +} /* end of calc_pitch_segment */ + + + + + +static int calc_pitch_segment2(int ix, int end_ix, int start_p, int end_p, int min_stress) +/****************************************************************************************/ +/* Linear pitch rise/fall, change pitch at min_stress or stronger + Used for pre-head and tail */ +{ + int stress; + int pitch; + int increment; + int n_increments; + int drop; + SYLLABLE *syl; + + if(ix >= end_ix) + return(ix); + + n_increments = count_increments(ix,end_ix,min_stress); + increment = (end_p - start_p) << 8; + + if(n_increments > 1) + { + increment = increment / n_increments; + } + + + pitch = start_p << 8; + while(ix < end_ix) + { + syl = &syllable_tab[ix]; + stress = syl->stress; + + if(increment > 0) + { + set_pitch(syl,pitch,-increment); + pitch += increment; + } + else + { + drop = -increment; + if(drop < min_drop[stress]) + drop = min_drop[stress]; + + pitch += increment; + + if(drop > 0x900) + drop = 0x900; + set_pitch(syl, pitch, drop); + } + + ix++; + } + return(ix); +} /* end of calc_pitch_segment2 */ + + + + + + +static int calc_pitches(int start, int end, int head_tone, int nucleus_tone) +//=========================================================================== +// Calculate pitch values for the vowels in this tone group +{ + int ix; + TONE_HEAD *th; + TONE_NUCLEUS *tn; + int drop; + int continuing = 0; + + if(start > 0) + continuing = 1; + + th = &tone_head_table[head_tone]; + tn = &tone_nucleus_table[nucleus_tone]; + ix = start; + + /* vowels before the first primary stress */ + /******************************************/ + + if(number_pre > 0) + { + ix = calc_pitch_segment2(ix, ix+number_pre, th->pre_start, th->pre_end, 0); + } + + /* body of tonic segment */ + /*************************/ + + if(option_tone_flags & OPTION_EMPHASIZE_PENULTIMATE) + { + tone_posn = tone_posn2; // put tone on the penultimate stressed word + } + ix = calc_pitch_segment(ix,tone_posn, th, tn, PRIMARY, continuing); + + if(no_tonic) + return(0); + + /* tonic syllable */ + /******************/ + + if(tn->flags & T_EMPH) + { + syllable_tab[ix].flags |= SYL_EMPHASIS; + } + + if(number_tail == 0) + { + tone_pitch_env = tn->pitch_env0; + drop = tn->tonic_max0 - tn->tonic_min0; + set_pitch(&syllable_tab[ix++],tn->tonic_min0 << 8,drop << 8); + } + else + { + tone_pitch_env = tn->pitch_env1; + drop = tn->tonic_max1 - tn->tonic_min1; + set_pitch(&syllable_tab[ix++],tn->tonic_min1 << 8,drop << 8); + } + + syllable_tab[tone_posn].env = tone_pitch_env; + if(syllable_tab[tone_posn].stress == PRIMARY) + syllable_tab[tone_posn].stress = PRIMARY_STRESSED; + + /* tail, after the tonic syllable */ + /**********************************/ + + calc_pitch_segment2(ix, end, tn->tail_start, tn->tail_end, 0); + + return(tone_pitch_env); +} /* end of calc_pitches */ + + + + + + +static void CalcPitches_Tone(Translator *tr, int clause_tone) +{//========================================================== +// clause_tone: 0=. 1=, 2=?, 3=! 4=none + PHONEME_LIST *p; + int ix; + int count_stressed=0; + int final_stressed=0; + + int tone_ph; + int pause; + int tone_promoted; + PHONEME_TAB *tph; + PHONEME_TAB *prev_tph; // forget across word boundary + PHONEME_TAB *prevw_tph; // remember across word boundary + PHONEME_TAB *prev2_tph; // 2 tones previous + PHONEME_LIST *prev_p; + + int pitch_adjust = 0; // pitch gradient through the clause - inital value + int pitch_decrement = 0; // decrease by this for each stressed syllable + int pitch_low = 0; // until it drops to this + int pitch_high = 0; // then reset to this + + p = &phoneme_list[0]; + + // count number of stressed syllables + p = &phoneme_list[0]; + for(ix=0; ixtype == phVOWEL) && (p->stresslevel >= 4)) + { + if(count_stressed == 0) + final_stressed = ix; + + if(p->stresslevel >= 4) + { + final_stressed = ix; + count_stressed++; + } + } + } + + phoneme_list[final_stressed].stresslevel = 7; + + // language specific, changes to tones + if(tr->translator_name == L('v','i')) + { + // LANG=vi + p = &phoneme_list[final_stressed]; + if(p->tone_ph == 0) + p->tone_ph = PhonemeCode('7'); // change default tone (tone 1) to falling tone at end of clause + } + + + pause = 1; + tone_promoted = 0; + + prev_p = p = &phoneme_list[0]; + prev_tph = prevw_tph = phoneme_tab[phonPAUSE]; + + // perform tone sandhi + for(ix=0; ixtype == phPAUSE) && (p->ph->std_length > 50)) + { + pause = 1; // there is a pause since the previous vowel + prevw_tph = phoneme_tab[phonPAUSE]; // forget previous tone + } + + if(p->newword) + { + prev_tph = phoneme_tab[phonPAUSE]; // forget across word boundaries + } + + if(p->synthflags & SFLAG_SYLLABLE) + { + tone_ph = p->tone_ph; + tph = phoneme_tab[tone_ph]; + + // Mandarin + if(tr->translator_name == L('z','h')) + { + if(tone_ph == 0) + { + if(pause || tone_promoted) + { + tone_ph = PhonemeCode2('5','5'); // no previous vowel, use tone 1 + tone_promoted = 1; + } + else + { + tone_ph = PhonemeCode2('1','1'); // default tone 5 + } + + p->tone_ph = tone_ph; + tph = phoneme_tab[tone_ph]; + + } + else + { + tone_promoted = 0; + } + + if(ix == final_stressed) + { + if((tph->mnemonic == 0x3535 ) || (tph->mnemonic == 0x3135)) + { + // change sentence final tone 1 or 4 to stress 6, not 7 + phoneme_list[final_stressed].stresslevel = 6; + } + } + + if(prevw_tph->mnemonic == 0x343132) // [214] + { + if(tph->mnemonic == 0x343132) // [214] + prev_p->tone_ph = PhonemeCode2('3','5'); + else + prev_p->tone_ph = PhonemeCode2('2','1'); + } + if((prev_tph->mnemonic == 0x3135) && (tph->mnemonic == 0x3135)) // [51] + [51] + { + prev_p->tone_ph = PhonemeCode2('5','3'); + } + + if(tph->mnemonic == 0x3131) // [11] Tone 5 + { + // tone 5, change its level depending on the previous tone (across word boundaries) + if(prevw_tph->mnemonic == 0x3535) + p->tone_ph = PhonemeCode2('2','2'); + if(prevw_tph->mnemonic == 0x3533) + p->tone_ph = PhonemeCode2('3','3'); + if(prevw_tph->mnemonic == 0x343132) + p->tone_ph = PhonemeCode2('4','4'); + + // tone 5 is unstressed (shorter) + p->stresslevel = 1; // diminished stress + } + } + + prev_p = p; + prev2_tph = prevw_tph; + prevw_tph = prev_tph = tph; + pause = 0; + } + } + + // convert tone numbers to pitch + p = &phoneme_list[0]; + for(ix=0; ixsynthflags & SFLAG_SYLLABLE) + { + tone_ph = p->tone_ph; + + if(p->stresslevel != 1) // TEST, consider all syllables as stressed + { + if(ix == final_stressed) + { + // the last stressed syllable + pitch_adjust = pitch_low; + } + else + { + pitch_adjust -= pitch_decrement; + if(pitch_adjust <= pitch_low) + pitch_adjust = pitch_high; + } + } + + if(tone_ph ==0) + { + tone_ph = phonDEFAULTTONE; // no tone specified, use default tone 1 + p->tone_ph = tone_ph; + } + p->pitch1 = pitch_adjust + phoneme_tab[tone_ph]->start_type; + p->pitch2 = pitch_adjust + phoneme_tab[tone_ph]->end_type; + } + } + + +} // end of Translator::CalcPitches_Tone + + + +void CalcPitches(Translator *tr, int clause_type) +{//============================================== +// clause_type: 0=. 1=, 2=?, 3=! 4=none + PHONEME_LIST *p; + SYLLABLE *syl; + int ix; + int x; + int st_ix; + int n_st; + int option; + int group_tone; + int group_tone_emph; + int group_tone_comma; + int ph_start=0; + int st_start; + int st_clause_end; + int count; + int n_primary; + int count_primary; + PHONEME_TAB *ph; + int ph_end=n_phoneme_list; + + SYLLABLE syllable_tab2[N_PHONEME_LIST]; + + syllable_tab = syllable_tab2; // don't use permanent storage. it's only needed during the call of CalcPitches() + n_st = 0; + n_primary = 0; + for(ix=0; ix<(n_phoneme_list-1); ix++) + { + p = &phoneme_list[ix]; + if(p->synthflags & SFLAG_SYLLABLE) + { + syllable_tab[n_st].flags = 0; + syllable_tab[n_st].env = PITCHfall; + syllable_tab[n_st].nextph_type = phoneme_list[ix+1].type; + syllable_tab[n_st++].stress = p->stresslevel; + + if(p->stresslevel >= 4) + n_primary++; + } + else + if((p->ph->code == phonPAUSE_CLAUSE) && (n_st > 0)) + { + syllable_tab[n_st-1].flags |= SYL_END_CLAUSE; + } + } + syllable_tab[n_st].stress = 0; // extra 0 entry at the end + + if(n_st == 0) + return; // nothing to do + + + + if(tr->langopts.tone_language == 1) + { + CalcPitches_Tone(tr,clause_type); + return; + } + + + option = tr->langopts.intonation_group; + if(option >= INTONATION_TYPES) + option = 0; + + group_tone = tr->punct_to_tone[option][clause_type]; + group_tone_emph = tr->punct_to_tone[option][5]; // emphatic form of statement + group_tone_comma = tr->punct_to_tone[option][1]; // emphatic form of statement + + if(clause_type == 4) + no_tonic = 1; /* incomplete clause, used for abbreviations such as Mr. Dr. Mrs. */ + else + no_tonic = 0; + + st_start = 0; + count_primary=0; + for(st_ix=0; st_ixstress >= 4) + count_primary++; + + if(syl->stress == 6) + { + // reduce the stress of the previous stressed syllable (review only the previous few syllables) + for(ix=st_ix-1; ix>=st_start && ix>=(st_ix-3); ix--) + { + if(syllable_tab[ix].stress == 6) + break; + if(syllable_tab[ix].stress == 4) + { + syllable_tab[ix].stress = 3; + break; + } + } + + // are the next primary syllables also emphasized ? + for(ix=st_ix+1; ixstress = 5; + break; + } + } + } + + if(syl->stress == 6) + { + // an emphasized syllable, end the tone group after the next primary stress + syllable_tab[st_ix].flags = SYL_EMPHASIS; + + count = 0; + if((n_primary - count_primary) > 1) + count =1; + + for(ix=st_ix+1; ix 4) + break; + if(syllable_tab[ix].stress == 4) + { + count++; + if(count > 1) + break; + } + } + + count_pitch_vowels(st_start, ix, n_st); + if((ix < n_st) || (clause_type == 0)) + calc_pitches(st_start, ix, group_tone_emph, group_tone_emph); // split into > 1 tone groups, use emphatic tone + else + calc_pitches(st_start, ix, group_tone, group_tone); + + st_start = ix; + } + if((st_start < st_ix) && (syl->flags & SYL_END_CLAUSE)) + { + // end of clause after this syllable, indicated by a phonPAUSE_CLAUSE phoneme + st_clause_end = st_ix+1; + count_pitch_vowels(st_start, st_clause_end, st_clause_end); + calc_pitches(st_start, st_clause_end, group_tone_comma, group_tone_comma); + st_start = st_clause_end; + } + } + + if(st_start < st_ix) + { + count_pitch_vowels(st_start, st_ix, n_st); + calc_pitches(st_start, st_ix, group_tone, group_tone); + } + + + // unpack pitch data + st_ix=0; + for(ix=ph_start; ix < ph_end; ix++) + { + p = &phoneme_list[ix]; + p->stresslevel = syllable_tab[st_ix].stress; + + if(p->synthflags & SFLAG_SYLLABLE) + { + syl = &syllable_tab[st_ix]; + + x = syl->pitch1 - 72; + if(x < 0) x = 0; + p->pitch1 = x; + + x = syl->pitch2 - 72; + if(x < 0) x = 0; + p->pitch2 = x; + + p->env = PITCHfall; + if(syl->flags & SYL_RISE) + { + p->env = PITCHrise; + } + else + if(p->stresslevel > 5) + p->env = syl->env; + + if(p->pitch1 > p->pitch2) + { + // swap so that pitch2 is the higher + x = p->pitch1; + p->pitch1 = p->pitch2; + p->pitch2 = x; + } + +if(p->tone_ph) +{ + ph = phoneme_tab[p->tone_ph]; + x = (p->pitch1 + p->pitch2)/2; + p->pitch2 = x + ph->end_type; + p->pitch1 = x + ph->start_type; +} + + if(syl->flags & SYL_EMPHASIS) + { + p->stresslevel |= 8; // emphasized + } + + st_ix++; + } + } + +} // end of Translator::CalcPitches + + diff --git a/navit/support/espeak/klatt.c b/navit/support/espeak/klatt.c new file mode 100644 index 0000000..8cdbf78 --- /dev/null +++ b/navit/support/espeak/klatt.c @@ -0,0 +1,1303 @@ + +/*************************************************************************** + * Copyright (C) 2008 by Jonathan Duddington * + * email: jonsd@users.sourceforge.net * + * * + * Based on a re-implementation by: * + * (c) 1993,94 Jon Iles and Nick Ing-Simmons * + * of the Klatt cascade-parallel formant synthesizer * + * * + * 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; either version 3 of the License, or * + * (at your option) any later version. * + * * + * 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, see: * + * . * + ***************************************************************************/ + +// See URL: ftp://svr-ftp.eng.cam.ac.uk/pub/comp.speech/synthesis/klatt.3.04.tar.gz + +#include "StdAfx.h" + +#include +#include +#include +#include + +#include "speak_lib.h" +#include "speech.h" +#include "klatt.h" +#include "phoneme.h" +#include "synthesize.h" +#include "voice.h" + +#ifdef INCLUDE_KLATT // conditional compilation for the whole file + +extern unsigned char *out_ptr; // **JSD +extern unsigned char *out_start; +extern unsigned char *out_end; +extern WGEN_DATA wdata; +static int nsamples; +static int sample_count; + + +#ifdef _MSC_VER +#define getrandom(min,max) ((rand()%(int)(((max)+1)-(min)))+(min)) +#else +#define getrandom(min,max) ((rand()%(long)(((max)+1)-(min)))+(min)) +#endif + + +/* function prototypes for functions private to this file */ + +static void flutter(klatt_frame_ptr); +static double sampled_source (void); +static double impulsive_source (void); +static double natural_source (void); +static void pitch_synch_par_reset (klatt_frame_ptr); +static double gen_noise (double); +static double DBtoLIN (long); +static void frame_init (klatt_frame_ptr); +static void setabc (long,long,resonator_ptr); +static void setzeroabc (long,long,resonator_ptr); + +static klatt_frame_t kt_frame; +static klatt_global_t kt_globals; + +/* +function RESONATOR + +This is a generic resonator function. Internal memory for the resonator +is stored in the globals structure. +*/ + +static double resonator(resonator_ptr r, double input) +{ + double x; + + x = (double) ((double)r->a * (double)input + (double)r->b * (double)r->p1 + (double)r->c * (double)r->p2); + r->p2 = (double)r->p1; + r->p1 = (double)x; + + return (double)x; +} + +static double resonator2(resonator_ptr r, double input) +{ + double x; + + x = (double) ((double)r->a * (double)input + (double)r->b * (double)r->p1 + (double)r->c * (double)r->p2); + r->p2 = (double)r->p1; + r->p1 = (double)x; + + r->a += r->a_inc; + r->b += r->b_inc; + r->c += r->c_inc; + return (double)x; +} + + + +/* +function ANTIRESONATOR + +This is a generic anti-resonator function. The code is the same as resonator +except that a,b,c need to be set with setzeroabc() and we save inputs in +p1/p2 rather than outputs. There is currently only one of these - "rnz" +Output = (rnz.a * input) + (rnz.b * oldin1) + (rnz.c * oldin2) +*/ + +#ifdef deleted +static double antiresonator(resonator_ptr r, double input) +{ + register double x = (double)r->a * (double)input + (double)r->b * (double)r->p1 + (double)r->c * (double)r->p2; + r->p2 = (double)r->p1; + r->p1 = (double)input; + return (double)x; +} +#endif + +static double antiresonator2(resonator_ptr r, double input) +{ + register double x = (double)r->a * (double)input + (double)r->b * (double)r->p1 + (double)r->c * (double)r->p2; + r->p2 = (double)r->p1; + r->p1 = (double)input; + + r->a += r->a_inc; + r->b += r->b_inc; + r->c += r->c_inc; + return (double)x; +} + + + +/* +function FLUTTER + +This function adds F0 flutter, as specified in: + +"Analysis, synthesis and perception of voice quality variations among +female and male talkers" D.H. Klatt and L.C. Klatt JASA 87(2) February 1990. + +Flutter is added by applying a quasi-random element constructed from three +slowly varying sine waves. +*/ + +static void flutter(klatt_frame_ptr frame) +{ + static int time_count; + double delta_f0; + double fla,flb,flc,fld,fle; + + fla = (double) kt_globals.f0_flutter / 50; + flb = (double) kt_globals.original_f0 / 100; +// flc = sin(2*PI*12.7*time_count); +// fld = sin(2*PI*7.1*time_count); +// fle = sin(2*PI*4.7*time_count); + flc = sin(PI*12.7*time_count); // because we are calling flutter() more frequently, every 2.9mS + fld = sin(PI*7.1*time_count); + fle = sin(PI*4.7*time_count); + delta_f0 = fla * flb * (flc + fld + fle) * 10; + frame->F0hz10 = frame->F0hz10 + (long) delta_f0; + time_count++; +} + + + +/* +function SAMPLED_SOURCE + +Allows the use of a glottal excitation waveform sampled from a real +voice. +*/ + +static double sampled_source() +{ + int itemp; + double ftemp; + double result; + double diff_value; + int current_value; + int next_value; + double temp_diff; + + if(kt_globals.T0!=0) + { + ftemp = (double) kt_globals.nper; + ftemp = ftemp / kt_globals.T0; + ftemp = ftemp * kt_globals.num_samples; + itemp = (int) ftemp; + + temp_diff = ftemp - (double) itemp; + + current_value = kt_globals.natural_samples[itemp]; + next_value = kt_globals.natural_samples[itemp+1]; + + diff_value = (double) next_value - (double) current_value; + diff_value = diff_value * temp_diff; + + result = kt_globals.natural_samples[itemp] + diff_value; + result = result * kt_globals.sample_factor; + } + else + { + result = 0; + } + return(result); +} + + + + +/* +function PARWAVE + +Converts synthesis parameters to a waveform. +*/ + + +static int parwave(klatt_frame_ptr frame) +{ + double temp; + double outbypas; + double out; + long n4; + double frics; + double glotout; + double aspiration; + double casc_next_in; + double par_glotout; + static double noise; + static double voice; + static double vlast; + static double glotlast; + static double sourc; + int ix; + + frame_init(frame); /* get parameters for next frame of speech */ + + flutter(frame); /* add f0 flutter */ + +#ifdef deleted +{ + FILE *f; + f=fopen("klatt_log","a"); + fprintf(f,"%4dhz %2dAV %4d %3d, %4d %3d, %4d %3d, %4d %3d, %4d, %3d, %4d %3d TLT=%2d\n",frame->F0hz10,frame->AVdb, + frame->F1hz,frame->B1hz,frame->F2hz,frame->B2hz,frame->F3hz,frame->B3hz,frame->F4hz,frame->B4hz,frame->F5hz,frame->B5hz,frame->F6hz,frame->B6hz,frame->TLTdb); + fclose(f); +} +#endif + + /* MAIN LOOP, for each output sample of current frame: */ + + for (kt_globals.ns=0; kt_globals.ns kt_globals.nmod) + { + noise *= (double) 0.5; + } + + /* Compute frication noise */ + frics = kt_globals.amp_frica * noise; + + /* + Compute voicing waveform. Run glottal source simulation at 4 + times normal sample rate to minimize quantization noise in + period of female voice. + */ + + for (n4=0; n4<4; n4++) + { + switch(kt_globals.glsource) + { + case IMPULSIVE: + voice = impulsive_source(); + break; + case NATURAL: + voice = natural_source(); + break; + case SAMPLED: + voice = sampled_source(); + break; + } + + /* Reset period when counter 'nper' reaches T0 */ + if (kt_globals.nper >= kt_globals.T0) + { + kt_globals.nper = 0; + pitch_synch_par_reset(frame); + } + + /* + Low-pass filter voicing waveform before downsampling from 4*samrate + to samrate samples/sec. Resonator f=.09*samrate, bw=.06*samrate + */ + + voice = resonator(&(kt_globals.rsn[RLP]),voice); + + /* Increment counter that keeps track of 4*samrate samples per sec */ + kt_globals.nper++; + } + + /* + Tilt spectrum of voicing source down by soft low-pass filtering, amount + of tilt determined by TLTdb + */ + + voice = (voice * kt_globals.onemd) + (vlast * kt_globals.decay); + vlast = voice; + + /* + Add breathiness during glottal open phase. Amount of breathiness + determined by parameter Aturb Use nrand rather than noise because + noise is low-passed. + */ + + + if (kt_globals.nper < kt_globals.nopen) + { + voice += kt_globals.amp_breth * kt_globals.nrand; + } + + /* Set amplitude of voicing */ + glotout = kt_globals.amp_voice * voice; + par_glotout = kt_globals.par_amp_voice * voice; + + /* Compute aspiration amplitude and add to voicing source */ + aspiration = kt_globals.amp_aspir * noise; + glotout += aspiration; + + par_glotout += aspiration; + + /* + Cascade vocal tract, excited by laryngeal sources. + Nasal antiresonator, then formants FNP, F5, F4, F3, F2, F1 + */ + + out=0; + if(kt_globals.synthesis_model != ALL_PARALLEL) + { + casc_next_in = antiresonator2(&(kt_globals.rsn[Rnz]),glotout); + casc_next_in = resonator(&(kt_globals.rsn[Rnpc]),casc_next_in); + casc_next_in = resonator(&(kt_globals.rsn[R8c]),casc_next_in); + casc_next_in = resonator(&(kt_globals.rsn[R7c]),casc_next_in); + casc_next_in = resonator(&(kt_globals.rsn[R6c]),casc_next_in); + casc_next_in = resonator2(&(kt_globals.rsn[R5c]),casc_next_in); + casc_next_in = resonator2(&(kt_globals.rsn[R4c]),casc_next_in); + casc_next_in = resonator2(&(kt_globals.rsn[R3c]),casc_next_in); + casc_next_in = resonator2(&(kt_globals.rsn[R2c]),casc_next_in); + out = resonator2(&(kt_globals.rsn[R1c]),casc_next_in); + } + + /* Excite parallel F1 and FNP by voicing waveform */ + sourc = par_glotout; /* Source is voicing plus aspiration */ + + /* + Standard parallel vocal tract Formants F6,F5,F4,F3,F2, + outputs added with alternating sign. Sound source for other + parallel resonators is frication plus first difference of + voicing waveform. + */ + + out += resonator(&(kt_globals.rsn[R1p]),sourc); + out += resonator(&(kt_globals.rsn[Rnpp]),sourc); + + sourc = frics + par_glotout - glotlast; + glotlast = par_glotout; + + for(ix=R2p; ix<=R6p; ix++) + { + out = resonator(&(kt_globals.rsn[ix]),sourc) - out; + } + + outbypas = kt_globals.amp_bypas * sourc; + + out = outbypas - out; + +#ifdef deleted +// for testing + if (kt_globals.outsl != 0) + { + switch(kt_globals.outsl) + { + case 1: + out = voice; + break; + case 2: + out = aspiration; + break; + case 3: + out = frics; + break; + case 4: + out = glotout; + break; + case 5: + out = par_glotout; + break; + case 6: + out = outbypas; + break; + case 7: + out = sourc; + break; + } + } +#endif + + out = resonator(&(kt_globals.rsn[Rout]),out); + temp = (out * wdata.amplitude * kt_globals.amp_gain0) ; /* Convert back to integer */ + + + // mix with a recorded WAV if required for this phoneme + { + int z2; + signed char c; + int sample; + + z2 = 0; + if(wdata.mix_wavefile_ix < wdata.n_mix_wavefile) + { + if(wdata.mix_wave_scale == 0) + { + // a 16 bit sample + c = wdata.mix_wavefile[wdata.mix_wavefile_ix+1]; + sample = wdata.mix_wavefile[wdata.mix_wavefile_ix] + (c * 256); + wdata.mix_wavefile_ix += 2; + } + else + { + // a 8 bit sample, scaled + sample = (signed char)wdata.mix_wavefile[wdata.mix_wavefile_ix++] * wdata.mix_wave_scale; + } + z2 = sample * wdata.amplitude_v / 1024; + z2 = (z2 * wdata.mix_wave_amp)/40; + temp += z2; + } + } + + // if fadeout is set, fade to zero over 64 samples, to avoid clicks at end of synthesis + if(kt_globals.fadeout > 0) + { + kt_globals.fadeout--; + temp = (temp * kt_globals.fadeout) / 64; + } + + if (temp < -32768.0) + { + temp = -32768.0; + } + + if (temp > 32767.0) + { + temp = 32767.0; + } + + *out_ptr++ = (int)(temp); // **JSD + *out_ptr++ = (int)(temp) >> 8; + sample_count++; + if(out_ptr >= out_end) + { + return(1); + } + } + return(0); +} // end of parwave + + + + +/* +function PARWAVE_INIT + +Initialises all parameters used in parwave, sets resonator internal memory +to zero. +*/ + +static void reset_resonators() +{ + int r_ix; + + for(r_ix=0; r_ix < N_RSN; r_ix++) + { + kt_globals.rsn[r_ix].p1 = 0; + kt_globals.rsn[r_ix].p2 = 0; + } +} + +static void parwave_init() +{ + kt_globals.FLPhz = (950 * kt_globals.samrate) / 10000; + kt_globals.BLPhz = (630 * kt_globals.samrate) / 10000; + kt_globals.minus_pi_t = -PI / kt_globals.samrate; + kt_globals.two_pi_t = -2.0 * kt_globals.minus_pi_t; + setabc(kt_globals.FLPhz,kt_globals.BLPhz,&(kt_globals.rsn[RLP])); + kt_globals.nper = 0; + kt_globals.T0 = 0; + kt_globals.nopen = 0; + kt_globals.nmod = 0; + + reset_resonators(); +} + + +/* +function FRAME_INIT + +Use parameters from the input frame to set up resonator coefficients. +*/ + +static void frame_init(klatt_frame_ptr frame) +{ + double amp_par[7]; + static double amp_par_factor[7] = {0.6, 0.4, 0.15, 0.06, 0.04, 0.022, 0.03}; + long Gain0_tmp; + int ix; + + kt_globals.original_f0 = frame->F0hz10 / 10; + + frame->AVdb_tmp = frame->AVdb - 7; + if (frame->AVdb_tmp < 0) + { + frame->AVdb_tmp = 0; + } + + kt_globals.amp_aspir = DBtoLIN(frame->ASP) * 0.05; + kt_globals.amp_frica = DBtoLIN(frame->AF) * 0.25; + kt_globals.par_amp_voice = DBtoLIN(frame->AVpdb); + kt_globals.amp_bypas = DBtoLIN(frame->AB) * 0.05; + + for(ix=0; ix <= 6; ix++) + { + // parallel amplitudes F1 to F6, and parallel nasal pole + amp_par[ix] = DBtoLIN(frame->Ap[ix]) * amp_par_factor[ix]; + } + + Gain0_tmp = frame->Gain0 - 3; + if (Gain0_tmp <= 0) + { + Gain0_tmp = 57; + } + kt_globals.amp_gain0 = DBtoLIN(Gain0_tmp) / kt_globals.scale_wav; + + /* Set coefficients of variable cascade resonators */ + for(ix=0; ix<=8; ix++) + { + // formants 1 to 8, plus nasal pole + setabc(frame->Fhz[ix],frame->Bhz[ix],&(kt_globals.rsn[ix])); + + if(ix <= 5) + { + setabc(frame->Fhz_next[ix],frame->Bhz_next[ix],&(kt_globals.rsn_next[ix])); + + kt_globals.rsn[ix].a_inc = (kt_globals.rsn_next[ix].a - kt_globals.rsn[ix].a) / 64.0; + kt_globals.rsn[ix].b_inc = (kt_globals.rsn_next[ix].b - kt_globals.rsn[ix].b) / 64.0; + kt_globals.rsn[ix].c_inc = (kt_globals.rsn_next[ix].c - kt_globals.rsn[ix].c) / 64.0; + } + } + + // nasal zero anti-resonator + setzeroabc(frame->Fhz[F_NZ],frame->Bhz[F_NZ],&(kt_globals.rsn[Rnz])); + setzeroabc(frame->Fhz_next[F_NZ],frame->Bhz_next[F_NZ],&(kt_globals.rsn_next[Rnz])); + kt_globals.rsn[F_NZ].a_inc = (kt_globals.rsn_next[F_NZ].a - kt_globals.rsn[F_NZ].a) / 64.0; + kt_globals.rsn[F_NZ].b_inc = (kt_globals.rsn_next[F_NZ].b - kt_globals.rsn[F_NZ].b) / 64.0; + kt_globals.rsn[F_NZ].c_inc = (kt_globals.rsn_next[F_NZ].c - kt_globals.rsn[F_NZ].c) / 64.0; + + + /* Set coefficients of parallel resonators, and amplitude of outputs */ + + for(ix=0; ix<=6; ix++) + { + setabc(frame->Fhz[ix],frame->Bphz[ix],&(kt_globals.rsn[Rparallel+ix])); + kt_globals.rsn[Rparallel+ix].a *= amp_par[ix]; + } + + /* output low-pass filter */ + + setabc((long)0.0,(long)(kt_globals.samrate/2),&(kt_globals.rsn[Rout])); + +} + + + +/* +function IMPULSIVE_SOURCE + +Generate a low pass filtered train of impulses as an approximation of +a natural excitation waveform. Low-pass filter the differentiated impulse +with a critically-damped second-order filter, time constant proportional +to Kopen. +*/ + + +static double impulsive_source() +{ + static double doublet[] = {0.0,13000000.0,-13000000.0}; + static double vwave; + + if (kt_globals.nper < 3) + { + vwave = doublet[kt_globals.nper]; + } + else + { + vwave = 0.0; + } + + return(resonator(&(kt_globals.rsn[RGL]),vwave)); +} + + + +/* +function NATURAL_SOURCE + +Vwave is the differentiated glottal flow waveform, there is a weak +spectral zero around 800 Hz, magic constants a,b reset pitch synchronously. +*/ + +static double natural_source() +{ + double lgtemp; + static double vwave; + + if (kt_globals.nper < kt_globals.nopen) + { + kt_globals.pulse_shape_a -= kt_globals.pulse_shape_b; + vwave += kt_globals.pulse_shape_a; + lgtemp=vwave * 0.028; + + return(lgtemp); + } + else + { + vwave = 0.0; + return(0.0); + } +} + + + + + +/* +function PITCH_SYNC_PAR_RESET + +Reset selected parameters pitch-synchronously. + + +Constant B0 controls shape of glottal pulse as a function +of desired duration of open phase N0 +(Note that N0 is specified in terms of 40,000 samples/sec of speech) + +Assume voicing waveform V(t) has form: k1 t**2 - k2 t**3 + + If the radiation characterivative, a temporal derivative + is folded in, and we go from continuous time to discrete + integers n: dV/dt = vwave[n] + = sum over i=1,2,...,n of { a - (i * b) } + = a n - b/2 n**2 + + where the constants a and b control the detailed shape + and amplitude of the voicing waveform over the open + potion of the voicing cycle "nopen". + + Let integral of dV/dt have no net dc flow --> a = (b * nopen) / 3 + + Let maximum of dUg(n)/dn be constant --> b = gain / (nopen * nopen) + meaning as nopen gets bigger, V has bigger peak proportional to n + + Thus, to generate the table below for 40 <= nopen <= 263: + + B0[nopen - 40] = 1920000 / (nopen * nopen) +*/ + +static void pitch_synch_par_reset(klatt_frame_ptr frame) +{ + long temp; + double temp1; + static long skew; + static short B0[224] = + { + 1200,1142,1088,1038, 991, 948, 907, 869, 833, 799, 768, 738, 710, 683, 658, + 634, 612, 590, 570, 551, 533, 515, 499, 483, 468, 454, 440, 427, 415, 403, + 391, 380, 370, 360, 350, 341, 332, 323, 315, 307, 300, 292, 285, 278, 272, + 265, 259, 253, 247, 242, 237, 231, 226, 221, 217, 212, 208, 204, 199, 195, + 192, 188, 184, 180, 177, 174, 170, 167, 164, 161, 158, 155, 153, 150, 147, + 145, 142, 140, 137, 135, 133, 131, 128, 126, 124, 122, 120, 119, 117, 115, + 113,111, 110, 108, 106, 105, 103, 102, 100, 99, 97, 96, 95, 93, 92, 91, 90, + 88, 87, 86, 85, 84, 83, 82, 80, 79, 78, 77, 76, 75, 75, 74, 73, 72, 71, + 70, 69, 68, 68, 67, 66, 65, 64, 64, 63, 62, 61, 61, 60, 59, 59, 58, 57, + 57, 56, 56, 55, 55, 54, 54, 53, 53, 52, 52, 51, 51, 50, 50, 49, 49, 48, 48, + 47, 47, 46, 46, 45, 45, 44, 44, 43, 43, 42, 42, 41, 41, 41, 41, 40, 40, + 39, 39, 38, 38, 38, 38, 37, 37, 36, 36, 36, 36, 35, 35, 35, 35, 34, 34,33, + 33, 33, 33, 32, 32, 32, 32, 31, 31, 31, 31, 30, 30, 30, 30, 29, 29, 29, 29, + 28, 28, 28, 28, 27, 27 + }; + + if (frame->F0hz10 > 0) + { + /* T0 is 4* the number of samples in one pitch period */ + + kt_globals.T0 = (40 * kt_globals.samrate) / frame->F0hz10; + + + kt_globals.amp_voice = DBtoLIN(frame->AVdb_tmp); + + /* Duration of period before amplitude modulation */ + + kt_globals.nmod = kt_globals.T0; + if (frame->AVdb_tmp > 0) + { + kt_globals.nmod >>= 1; + } + + /* Breathiness of voicing waveform */ + + kt_globals.amp_breth = DBtoLIN(frame->Aturb) * 0.1; + + /* Set open phase of glottal period where 40 <= open phase <= 263 */ + + kt_globals.nopen = 4 * frame->Kopen; + + if ((kt_globals.glsource == IMPULSIVE) && (kt_globals.nopen > 263)) + { + kt_globals.nopen = 263; + } + + if (kt_globals.nopen >= (kt_globals.T0-1)) + { +// printf("Warning: glottal open period cannot exceed T0, truncated\n"); + kt_globals.nopen = kt_globals.T0 - 2; + } + + if (kt_globals.nopen < 40) + { + /* F0 max = 1000 Hz */ +// printf("Warning: minimum glottal open period is 10 samples.\n"); +// printf("truncated, nopen = %d\n",kt_globals.nopen); + kt_globals.nopen = 40; + } + + + /* Reset a & b, which determine shape of "natural" glottal waveform */ + + kt_globals.pulse_shape_b = B0[kt_globals.nopen-40]; + kt_globals.pulse_shape_a = (kt_globals.pulse_shape_b * kt_globals.nopen) * 0.333; + + /* Reset width of "impulsive" glottal pulse */ + + temp = kt_globals.samrate / kt_globals.nopen; + + setabc((long)0,temp,&(kt_globals.rsn[RGL])); + + /* Make gain at F1 about constant */ + + temp1 = kt_globals.nopen *.00833; + kt_globals.rsn[RGL].a *= temp1 * temp1; + + /* + Truncate skewness so as not to exceed duration of closed phase + of glottal period. + */ + + + temp = kt_globals.T0 - kt_globals.nopen; + if (frame->Kskew > temp) + { +// printf("Kskew duration=%d > glottal closed period=%d, truncate\n", frame->Kskew, kt_globals.T0 - kt_globals.nopen); + frame->Kskew = temp; + } + if (skew >= 0) + { + skew = frame->Kskew; + } + else + { + skew = - frame->Kskew; + } + + /* Add skewness to closed portion of voicing period */ + kt_globals.T0 = kt_globals.T0 + skew; + skew = - skew; + } + else + { + kt_globals.T0 = 4; /* Default for f0 undefined */ + kt_globals.amp_voice = 0.0; + kt_globals.nmod = kt_globals.T0; + kt_globals.amp_breth = 0.0; + kt_globals.pulse_shape_a = 0.0; + kt_globals.pulse_shape_b = 0.0; + } + + /* Reset these pars pitch synchronously or at update rate if f0=0 */ + + if ((kt_globals.T0 != 4) || (kt_globals.ns == 0)) + { + /* Set one-pole low-pass filter that tilts glottal source */ + + kt_globals.decay = (0.033 * frame->TLTdb); + + if (kt_globals.decay > 0.0) + { + kt_globals.onemd = 1.0 - kt_globals.decay; + } + else + { + kt_globals.onemd = 1.0; + } + } +} + + + +/* +function SETABC + +Convert formant freqencies and bandwidth into resonator difference +equation constants. +*/ + + +static void setabc(long int f, long int bw, resonator_ptr rp) +{ + double r; + double arg; + + /* Let r = exp(-pi bw t) */ + arg = kt_globals.minus_pi_t * bw; + r = exp(arg); + + /* Let c = -r**2 */ + rp->c = -(r * r); + + /* Let b = r * 2*cos(2 pi f t) */ + arg = kt_globals.two_pi_t * f; + rp->b = r * cos(arg) * 2.0; + + /* Let a = 1.0 - b - c */ + rp->a = 1.0 - rp->b - rp->c; +} + + +/* +function SETZEROABC + +Convert formant freqencies and bandwidth into anti-resonator difference +equation constants. +*/ + +static void setzeroabc(long int f, long int bw, resonator_ptr rp) +{ + double r; + double arg; + + f = -f; + + if(f>=0) + { + f = -1; + } + + /* First compute ordinary resonator coefficients */ + /* Let r = exp(-pi bw t) */ + arg = kt_globals.minus_pi_t * bw; + r = exp(arg); + + /* Let c = -r**2 */ + rp->c = -(r * r); + + /* Let b = r * 2*cos(2 pi f t) */ + arg = kt_globals.two_pi_t * f; + rp->b = r * cos(arg) * 2.; + + /* Let a = 1.0 - b - c */ + rp->a = 1.0 - rp->b - rp->c; + + /* Now convert to antiresonator coefficients (a'=1/a, b'=b/a, c'=c/a) */ + rp->a = 1.0 / rp->a; + rp->c *= -rp->a; + rp->b *= -rp->a; +} + + +/* +function GEN_NOISE + +Random number generator (return a number between -8191 and +8191) +Noise spectrum is tilted down by soft low-pass filter having a pole near +the origin in the z-plane, i.e. output = input + (0.75 * lastoutput) +*/ + + +static double gen_noise(double noise) +{ + long temp; + static double nlast; + + temp = (long) getrandom(-8191,8191); + kt_globals.nrand = (long) temp; + + noise = kt_globals.nrand + (0.75 * nlast); + nlast = noise; + + return(noise); +} + + +/* +function DBTOLIN + +Convert from decibels to a linear scale factor + + +Conversion table, db to linear, 87 dB --> 32767 + 86 dB --> 29491 (1 dB down = 0.5**1/6) + ... + 81 dB --> 16384 (6 dB down = 0.5) + ... + 0 dB --> 0 + +The just noticeable difference for a change in intensity of a vowel +is approximately 1 dB. Thus all amplitudes are quantized to 1 dB +steps. +*/ + + +static double DBtoLIN(long dB) +{ + static short amptable[88] = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, + 8, 9, 10, 11, 13, 14, 16, 18, 20, 22, 25, 28, 32, + 35, 40, 45, 51, 57, 64, 71, 80, 90, 101, 114, 128, + 142, 159, 179, 202, 227, 256, 284, 318, 359, 405, + 455, 512, 568, 638, 719, 881, 911, 1024, 1137, 1276, + 1438, 1622, 1823, 2048, 2273, 2552, 2875, 3244, 3645, + 4096, 4547, 5104, 5751, 6488, 7291, 8192, 9093, 10207, + 11502, 12976, 14582, 16384, 18350, 20644, 23429, + 26214, 29491, 32767 }; + + if ((dB < 0) || (dB > 87)) + { + return(0); + } + + return((double)(amptable[dB]) * 0.001); +} + + + + + +extern voice_t *wvoice; +static klatt_peaks_t peaks[N_PEAKS]; +static int end_wave; +static int klattp[N_KLATTP]; +static double klattp1[N_KLATTP]; +static double klattp_inc[N_KLATTP]; + +static int scale_wav_tab[] = {45,38,45,45}; // scale output from different voicing sources + + + +int Wavegen_Klatt(int resume) +{//========================== + int pk; + int x; + int ix; + + if(resume==0) + { + sample_count = 0; + } + + while(sample_count < nsamples) + { + kt_frame.F0hz10 = (wdata.pitch * 10) / 4096; + + // formants F6,F7,F8 are fixed values for cascade resonators, set in KlattInit() + // but F6 is used for parallel resonator + // F0 is used for the nasal zero + for(ix=0; ix < 6; ix++) + { + kt_frame.Fhz[ix] = peaks[ix].freq; + if(ix < 4) + { + kt_frame.Bhz[ix] = peaks[ix].bw; + } + } + for(ix=1; ix < 7; ix++) + { + kt_frame.Ap[ix] = 0; + } + + kt_frame.AVdb = klattp[KLATT_AV]; + kt_frame.AVpdb = klattp[KLATT_AVp]; + kt_frame.AF = klattp[KLATT_Fric]; + kt_frame.AB = klattp[KLATT_FricBP]; + kt_frame.ASP = klattp[KLATT_Aspr]; + kt_frame.Aturb = klattp[KLATT_Turb]; + kt_frame.Kskew = klattp[KLATT_Skew]; + kt_frame.TLTdb = klattp[KLATT_Tilt]; + kt_frame.Kopen = klattp[KLATT_Kopen]; + + // advance formants + for(pk=0; pk>8) > 127) ix = 127; + x = wdata.pitch_env[ix] * wdata.pitch_range; + wdata.pitch = (x>>8) + wdata.pitch_base; + + kt_globals.nspfr = (nsamples - sample_count); + if(kt_globals.nspfr > STEPSIZE) + kt_globals.nspfr = STEPSIZE; + + if(parwave(&kt_frame) == 1) + { + return(1); + } + } + + if(end_wave == 1) + { + // fade out to avoid a click + kt_globals.fadeout = 64; + end_wave = 0; + sample_count -= 64; + kt_globals.nspfr = 64; + if(parwave(&kt_frame) == 1) + { + return(1); + } + } + + return(0); +} + + +void SetSynth_Klatt(int length, int modn, frame_t *fr1, frame_t *fr2, voice_t *v, int control) +{//=========================================================================================== + int ix; + DOUBLEX next; + int qix; + int cmd; + static frame_t prev_fr; + + if(wvoice != NULL) + { + if((wvoice->klattv[0] > 0) && (wvoice->klattv[0] <=3 )) + { + kt_globals.glsource = wvoice->klattv[0]; + kt_globals.scale_wav = scale_wav_tab[kt_globals.glsource]; + } + kt_globals.f0_flutter = wvoice->flutter/32; + } + + end_wave = 0; + if(control & 2) + { + end_wave = 1; // fadeout at the end + } + if(control & 1) + { + end_wave = 1; + for(qix=wcmdq_head+1;;qix++) + { + if(qix >= N_WCMDQ) qix = 0; + if(qix == wcmdq_tail) break; + + cmd = wcmdq[qix][0]; + if(cmd==WCMD_KLATT) + { + end_wave = 0; // next wave generation is from another spectrum + break; + } + if((cmd==WCMD_WAVE) || (cmd==WCMD_PAUSE)) + break; // next is not from spectrum, so continue until end of wave cycle + } + } + +{ +//FILE *f; +//f=fopen("klatt_log","a"); +//fprintf(f,"len %4d (%3d %4d %4d) (%3d %4d %4d)\n",length,fr1->ffreq[1],fr1->ffreq[2],fr1->ffreq[3],fr2->ffreq[1],fr2->ffreq[2],fr2->ffreq[3]); +//fclose(f); +} + + if(control & 1) + { + if(wdata.prev_was_synth == 0) + { + // A break, not following on from another synthesized sound. + // Reset the synthesizer + //reset_resonators(&kt_globals); + parwave_init(); + } + else + { + if((prev_fr.ffreq[1] != fr1->ffreq[1]) || (prev_fr.ffreq[2] != fr1->ffreq[2])) + { + + // fade out to avoid a click, but only up to the end of output buffer + ix = (out_end - out_ptr)/2; + if(ix > 64) + ix = 64; + kt_globals.fadeout = ix; + kt_globals.nspfr = ix; + parwave(&kt_frame); + + //reset_resonators(&kt_globals); + parwave_init(); + } + } + wdata.prev_was_synth = 1; + memcpy(&prev_fr,fr2,sizeof(prev_fr)); + } + if(fr2->frflags & FRFLAG_BREAK) + { +// fr2 = fr1; +// reset_resonators(&kt_globals); + } + + for(ix=0; ix= 5) && ((fr1->frflags & FRFLAG_KLATT) == 0)) + { + klattp1[ix] = klattp[ix] = 0; + klattp_inc[ix] = 0; + } + else + { + klattp1[ix] = klattp[ix] = fr1->klattp[ix]; + klattp_inc[ix] = (double)((fr2->klattp[ix] - klattp[ix]) * STEPSIZE)/length; + } + + // get klatt parameter adjustments for the voice +// if((ix>0) && (ix < KLATT_AVp)) +// klattp1[ix] = klattp[ix] = (klattp[ix] + wvoice->klattv[ix]); + } + + nsamples = length; + + for(ix=1; ix < 6; ix++) + { + peaks[ix].freq1 = (fr1->ffreq[ix] * v->freq[ix] / 256.0) + v->freqadd[ix]; + peaks[ix].freq = (int)(peaks[ix].freq1); + next = (fr2->ffreq[ix] * v->freq[ix] / 256.0) + v->freqadd[ix]; + peaks[ix].freq_inc = ((next - peaks[ix].freq1) * STEPSIZE) / length; + + if(ix < 4) + { + // klatt bandwidth for f1, f2, f3 (others are fixed) + peaks[ix].bw1 = fr1->bw[ix] * 2; + peaks[ix].bw = (int)(peaks[ix].bw1); + next = fr2->bw[ix] * 2; + peaks[ix].bw_inc = ((next - peaks[ix].bw1) * STEPSIZE) / length; + } + } + + // nasal zero frequency + peaks[0].freq1 = fr1->klattp[KLATT_FNZ] * 2; + peaks[0].freq = (int)(peaks[0].freq1); + next = fr2->klattp[KLATT_FNZ] * 2; + peaks[0].freq_inc = ((next - peaks[0].freq1) * STEPSIZE) / length; + + peaks[0].bw1 = 89; + peaks[0].bw = 89; + peaks[0].bw_inc = 0; + + if(fr1->frflags & FRFLAG_KLATT) + { + // the frame contains additional parameters for parallel resonators + for(ix=1; ix < 7; ix++) + { + peaks[ix].bp1 = fr1->klatt_bp[ix] * 4; // parallel bandwidth + peaks[ix].bp = (int)(peaks[ix].bp1); + next = fr2->klatt_bp[ix] * 2; + peaks[ix].bp_inc = ((next - peaks[ix].bp1) * STEPSIZE) / length; + + peaks[ix].ap1 = fr1->klatt_ap[ix]; // parallal amplitude + peaks[ix].ap = (int)(peaks[ix].ap1); + next = fr2->klatt_ap[ix] * 2; + peaks[ix].ap_inc = ((next - peaks[ix].ap1) * STEPSIZE) / length; + } + } +} // end of SetSynth_Klatt + + +int Wavegen_Klatt2(int length, int modulation, int resume, frame_t *fr1, frame_t *fr2) +{//=================================================================================== + if(resume==0) + SetSynth_Klatt(length, modulation, fr1, fr2, wvoice, 1); + + return(Wavegen_Klatt(resume)); +} + + + +void KlattInit() +{ +#define NUMBER_OF_SAMPLES 100 + + static short natural_samples[NUMBER_OF_SAMPLES]= + { + -310,-400,530,356,224,89,23,-10,-58,-16,461,599,536,701,770, + 605,497,461,560,404,110,224,131,104,-97,155,278,-154,-1165, + -598,737,125,-592,41,11,-247,-10,65,92,80,-304,71,167,-1,122, + 233,161,-43,278,479,485,407,266,650,134,80,236,68,260,269,179, + 53,140,275,293,296,104,257,152,311,182,263,245,125,314,140,44, + 203,230,-235,-286,23,107,92,-91,38,464,443,176,98,-784,-2449, + -1891,-1045,-1600,-1462,-1384,-1261,-949,-730 + }; + static short formant_hz[10] = {280,688,1064,2806,3260,3700,6500,7000,8000,280}; + static short bandwidth[10] = {89,160,70,160,200,200,500,500,500,89}; + static short parallel_amp[10] = { 0,59,59,59,59,59,59,0,0,0}; + static short parallel_bw[10] = {59,59,89,149,200,200,500,0,0,0}; + + int ix; + + sample_count=0; + + kt_globals.synthesis_model = CASCADE_PARALLEL; + kt_globals.samrate = 22050; + + kt_globals.glsource = IMPULSIVE; // IMPULSIVE, NATURAL, SAMPLED + kt_globals.scale_wav = scale_wav_tab[kt_globals.glsource]; + kt_globals.natural_samples = natural_samples; + kt_globals.num_samples = NUMBER_OF_SAMPLES; + kt_globals.sample_factor = 3.0; + kt_globals.nspfr = (kt_globals.samrate * 10) / 1000; + kt_globals.outsl = 0; + kt_globals.f0_flutter = 20; + + parwave_init(); + + // set default values for frame parameters + for(ix=0; ix<=9; ix++) + { + kt_frame.Fhz[ix] = formant_hz[ix]; + kt_frame.Bhz[ix] = bandwidth[ix]; + kt_frame.Ap[ix] = parallel_amp[ix]; + kt_frame.Bphz[ix] = parallel_bw[ix]; + } + kt_frame.Bhz_next[F_NZ] = bandwidth[F_NZ]; + + kt_frame.F0hz10 = 1000; + kt_frame.AVdb = 59; // 59 + kt_frame.ASP = 0; + kt_frame.Kopen = 40; // 40 + kt_frame.Aturb = 0; + kt_frame.TLTdb = 0; + kt_frame.AF =50; + kt_frame.Kskew = 0; + kt_frame.AB = 0; + kt_frame.AVpdb = 0; + kt_frame.Gain0 = 60; // 62 +} // end of KlattInit + +#endif // INCLUDE_KLATT diff --git a/navit/support/espeak/numbers.c b/navit/support/espeak/numbers.c new file mode 100644 index 0000000..9c74eac --- /dev/null +++ b/navit/support/espeak/numbers.c @@ -0,0 +1,1507 @@ +/*************************************************************************** + * Copyright (C) 2005 to 2007 by Jonathan Duddington * + * email: jonsd@users.sourceforge.net * + * * + * 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; either version 3 of the License, or * + * (at your option) any later version. * + * * + * 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, see: * + * . * + ***************************************************************************/ + +#include "StdAfx.h" + +#include +#include +#include +#include + +#include +#include + +#include "speak_lib.h" +#include "speech.h" +#include "phoneme.h" +#include "synthesize.h" +#include "voice.h" +#include "translate.h" + + + +#define M_NAME 0 +#define M_SMALLCAP 1 +#define M_TURNED 2 +#define M_REVERSED 3 +#define M_CURL 4 + +#define M_ACUTE 5 +#define M_BREVE 6 +#define M_CARON 7 +#define M_CEDILLA 8 +#define M_CIRCUMFLEX 9 +#define M_DIAERESIS 10 +#define M_DOUBLE_ACUTE 11 +#define M_DOT_ABOVE 12 +#define M_GRAVE 13 +#define M_MACRON 14 +#define M_OGONEK 15 +#define M_RING 16 +#define M_STROKE 17 +#define M_TILDE 18 + +#define M_BAR 19 +#define M_RETROFLEX 20 +#define M_HOOK 21 + + +#define M_MIDDLE_DOT M_DOT_ABOVE // duplicate of M_DOT_ABOVE +#define M_IMPLOSIVE M_HOOK + +typedef struct { +const char *name; +int flags; +} ACCENTS; + +// these are tokens to look up in the *_list file. +static ACCENTS accents_tab[] = { +{"_lig", 1}, +{"_smc", 1}, // smallcap +{"_tur", 1}, // turned +{"_rev", 1}, // reversed +{"_crl", 0}, // curl + +{"_acu", 0}, // acute +{"_brv", 0}, // breve +{"_hac", 0}, // caron/hacek +{"_ced", 0}, // cedilla +{"_cir", 0}, // circumflex +{"_dia", 0}, // diaeresis +{"_ac2", 0}, // double acute +{"_dot", 0}, // dot +{"_grv", 0}, // grave +{"_mcn", 0}, // macron +{"_ogo", 0}, // ogonek +{"_rng", 0}, // ring +{"_stk", 0}, // stroke +{"_tld", 0}, // tilde + +{"_bar", 0}, // bar +{"_rfx", 0}, // retroflex +{"_hok", 0}, // hook +}; + + +#define CAPITAL 0 +#define LETTER(ch,mod1,mod2) (ch-59)+(mod1 << 6)+(mod2 << 11) +#define LIGATURE(ch1,ch2,mod1) (ch1-59)+((ch2-59) << 6)+(mod1 << 12)+0x8000 + + +#define L_ALPHA 60 // U+3B1 +#define L_SCHWA 61 // U+259 +#define L_OPEN_E 62 // U+25B +#define L_GAMMA 63 // U+3B3 +#define L_IOTA 64 // U+3B9 +#define L_OE 65 // U+153 +#define L_OMEGA 66 // U+3C9 + +#define L_PHI 67 // U+3C6 +#define L_ESH 68 // U+283 +#define L_UPSILON 69 // U+3C5 +#define L_EZH 70 // U+292 +#define L_GLOTTAL 71 // U+294 +#define L_RTAP 72 // U+27E + + +static const short non_ascii_tab[] = { + 0, 0x3b1, 0x259, 0x25b, 0x3b3, 0x3b9, 0x153, 0x3c9, +0x3c6, 0x283, 0x3c5, 0x292, 0x294, 0x27e }; + + +// characters U+00e0 to U+017f +static const unsigned short letter_accents_0e0[] = { +LETTER('a',M_GRAVE,0), // U+00e0 +LETTER('a',M_ACUTE,0), +LETTER('a',M_CIRCUMFLEX,0), +LETTER('a',M_TILDE,0), +LETTER('a',M_DIAERESIS,0), +LETTER('a',M_RING,0), +LIGATURE('a','e',0), +LETTER('c',M_CEDILLA,0), +LETTER('e',M_GRAVE,0), +LETTER('e',M_ACUTE,0), +LETTER('e',M_CIRCUMFLEX,0), +LETTER('e',M_DIAERESIS,0), +LETTER('i',M_GRAVE,0), +LETTER('i',M_ACUTE,0), +LETTER('i',M_CIRCUMFLEX,0), +LETTER('i',M_DIAERESIS,0), +LETTER('d',M_NAME,0), // eth // U+00f0 +LETTER('n',M_TILDE,0), +LETTER('o',M_GRAVE,0), +LETTER('o',M_ACUTE,0), +LETTER('o',M_CIRCUMFLEX,0), +LETTER('o',M_TILDE,0), +LETTER('o',M_DIAERESIS,0), +0, // division sign +LETTER('o',M_STROKE,0), +LETTER('u',M_GRAVE,0), +LETTER('u',M_ACUTE,0), +LETTER('u',M_CIRCUMFLEX,0), +LETTER('u',M_DIAERESIS,0), +LETTER('y',M_ACUTE,0), +LETTER('t',M_NAME,0), // thorn +LETTER('y',M_DIAERESIS,0), +CAPITAL, // U+0100 +LETTER('a',M_MACRON,0), +CAPITAL, +LETTER('a',M_BREVE,0), +CAPITAL, +LETTER('a',M_OGONEK,0), +CAPITAL, +LETTER('c',M_ACUTE,0), +CAPITAL, +LETTER('c',M_CIRCUMFLEX,0), +CAPITAL, +LETTER('c',M_DOT_ABOVE,0), +CAPITAL, +LETTER('c',M_CARON,0), +CAPITAL, +LETTER('d',M_CARON,0), +CAPITAL, // U+0110 +LETTER('d',M_STROKE,0), +CAPITAL, +LETTER('e',M_MACRON,0), +CAPITAL, +LETTER('e',M_BREVE,0), +CAPITAL, +LETTER('e',M_DOT_ABOVE,0), +CAPITAL, +LETTER('e',M_OGONEK,0), +CAPITAL, +LETTER('e',M_CARON,0), +CAPITAL, +LETTER('g',M_CIRCUMFLEX,0), +CAPITAL, +LETTER('g',M_BREVE,0), +CAPITAL, // U+0120 +LETTER('g',M_DOT_ABOVE,0), +CAPITAL, +LETTER('g',M_CEDILLA,0), +CAPITAL, +LETTER('h',M_CIRCUMFLEX,0), +CAPITAL, +LETTER('h',M_STROKE,0), +CAPITAL, +LETTER('i',M_TILDE,0), +CAPITAL, +LETTER('i',M_MACRON,0), +CAPITAL, +LETTER('i',M_BREVE,0), +CAPITAL, +LETTER('i',M_OGONEK,0), +CAPITAL, // U+0130 +LETTER('i',M_NAME,0), // dotless i +CAPITAL, +LIGATURE('i','j',0), +CAPITAL, +LETTER('j',M_CIRCUMFLEX,0), +CAPITAL, +LETTER('k',M_CEDILLA,0), +LETTER('k',M_NAME,0), // kra +CAPITAL, +LETTER('l',M_ACUTE,0), +CAPITAL, +LETTER('l',M_CEDILLA,0), +CAPITAL, +LETTER('l',M_CARON,0), +CAPITAL, +LETTER('l',M_MIDDLE_DOT,0), // U+0140 +CAPITAL, +LETTER('l',M_STROKE,0), +CAPITAL, +LETTER('n',M_ACUTE,0), +CAPITAL, +LETTER('n',M_CEDILLA,0), +CAPITAL, +LETTER('n',M_CARON,0), +LETTER('n',M_NAME,0), // apostrophe n +CAPITAL, +LETTER('n',M_NAME,0), // eng +CAPITAL, +LETTER('o',M_MACRON,0), +CAPITAL, +LETTER('o',M_BREVE,0), +CAPITAL, // U+0150 +LETTER('o',M_DOUBLE_ACUTE,0), +CAPITAL, +LIGATURE('o','e',0), +CAPITAL, +LETTER('r',M_ACUTE,0), +CAPITAL, +LETTER('r',M_CEDILLA,0), +CAPITAL, +LETTER('r',M_CARON,0), +CAPITAL, +LETTER('s',M_ACUTE,0), +CAPITAL, +LETTER('s',M_CIRCUMFLEX,0), +CAPITAL, +LETTER('s',M_CEDILLA,0), +CAPITAL, // U+0160 +LETTER('s',M_CARON,0), +CAPITAL, +LETTER('t',M_CEDILLA,0), +CAPITAL, +LETTER('t',M_CARON,0), +CAPITAL, +LETTER('t',M_STROKE,0), +CAPITAL, +LETTER('u',M_TILDE,0), +CAPITAL, +LETTER('u',M_MACRON,0), +CAPITAL, +LETTER('u',M_BREVE,0), +CAPITAL, +LETTER('u',M_RING,0), +CAPITAL, // U+0170 +LETTER('u',M_DOUBLE_ACUTE,0), +CAPITAL, +LETTER('u',M_OGONEK,0), +CAPITAL, +LETTER('w',M_CIRCUMFLEX,0), +CAPITAL, +LETTER('y',M_CIRCUMFLEX,0), +CAPITAL, // Y-DIAERESIS +CAPITAL, +LETTER('z',M_ACUTE,0), +CAPITAL, +LETTER('z',M_DOT_ABOVE,0), +CAPITAL, +LETTER('z',M_CARON,0), +LETTER('s',M_NAME,0), // long-s // U+17f +}; + + +// characters U+0250 to U+029F +static const unsigned short letter_accents_250[] = { +LETTER('a',M_TURNED,0), // U+250 +LETTER(L_ALPHA,0,0), +LETTER(L_ALPHA,M_TURNED,0), +LETTER('b',M_IMPLOSIVE,0), +0, // open-o +LETTER('c',M_CURL,0), +LETTER('d',M_RETROFLEX,0), +LETTER('d',M_IMPLOSIVE,0), +LETTER('e',M_REVERSED,0), // U+258 +0, // schwa +LETTER(L_SCHWA,M_HOOK,0), +0, // open-e +LETTER(L_OPEN_E,M_REVERSED,0), +LETTER(L_OPEN_E,M_HOOK,M_REVERSED), +0,//LETTER(L_OPEN_E,M_CLOSED,M_REVERSED), +LETTER('j',M_BAR,0), +LETTER('g',M_IMPLOSIVE,0), // U+260 +LETTER('g',0,0), +LETTER('g',M_SMALLCAP,0), +LETTER(L_GAMMA,0,0), +0, // ramshorn +LETTER('h',M_TURNED,0), +LETTER('h',M_HOOK,0), +0,//LETTER(L_HENG,M_HOOK,0), +LETTER('i',M_BAR,0), // U+268 +LETTER(L_IOTA,0,0), +LETTER('i',M_SMALLCAP,0), +LETTER('l',M_TILDE,0), +LETTER('l',M_BAR,0), +LETTER('l',M_RETROFLEX,0), +LIGATURE('l','z',0), +LETTER('m',M_TURNED,0), +0,//LETTER('m',M_TURNED,M_LEG), // U+270 +LETTER('m',M_HOOK,0), +0,//LETTER('n',M_LEFTHOOK,0), +LETTER('n',M_RETROFLEX,0), +LETTER('n',M_SMALLCAP,0), +LETTER('o',M_BAR,0), +LIGATURE('o','e',M_SMALLCAP), +0,//LETTER(L_OMEGA,M_CLOSED,0), +LETTER(L_PHI,0,0), // U+278 +LETTER('r',M_TURNED,0), +0,//LETTER('r',M_TURNED,M_LEG), +LETTER('r',M_RETROFLEX,M_TURNED), +0,//LETTER('r',M_LEG,0), +LETTER('r',M_RETROFLEX,0), +0, // r-tap +LETTER(L_RTAP,M_REVERSED,0), +LETTER('r',M_SMALLCAP,0), // U+280 +LETTER('r',M_TURNED,M_SMALLCAP), +LETTER('s',M_RETROFLEX,0), +0, // esh +0,//LETTER('j',M_BAR,L_IMPLOSIVE), +LETTER(L_ESH,M_REVERSED,0), +LETTER(L_ESH,M_CURL,0), +LETTER('t',M_TURNED,0), +LETTER('t',M_RETROFLEX,0), // U+288 +LETTER('u',M_BAR,0), +LETTER(L_UPSILON,0,0), +LETTER('v',M_HOOK,0), +LETTER('v',M_TURNED,0), +LETTER('w',M_TURNED,0), +LETTER('y',M_TURNED,0), +LETTER('y',M_SMALLCAP,0), +LETTER('z',M_RETROFLEX,0), // U+290 +LETTER('z',M_CURL,0), +0, // ezh +LETTER(L_EZH,M_CURL,0), +0, // glottal stop +LETTER(L_GLOTTAL,M_REVERSED,0), +LETTER(L_GLOTTAL,M_TURNED,0), +0,//LETTER('c',M_LONG,0), +0, // bilabial click // U+298 +LETTER('b',M_SMALLCAP,0), +0,//LETTER(L_OPEN_E,M_CLOSED,0), +LETTER('g',M_IMPLOSIVE,M_SMALLCAP), +LETTER('h',M_SMALLCAP,0), +LETTER('j',M_CURL,0), +LETTER('k',M_TURNED,0), +LETTER('l',M_SMALLCAP,0), +LETTER('q',M_HOOK,0), // U+2a0 +LETTER(L_GLOTTAL,M_STROKE,0), +LETTER(L_GLOTTAL,M_STROKE,M_REVERSED), +LIGATURE('d','z',0), +0, // dezh +LIGATURE('d','z',M_CURL), +LIGATURE('t','s',0), +0, // tesh +LIGATURE('t','s',M_CURL), +}; + +static int LookupLetter2(Translator *tr, unsigned int letter, char *ph_buf) +{//======================================================================== + int len; + char single_letter[10]; + + single_letter[0] = 0; + single_letter[1] = '_'; + len = utf8_out(letter, &single_letter[2]); + single_letter[len+2] = ' '; + single_letter[len+3] = 0; + + if(Lookup(tr, &single_letter[1], ph_buf) == 0) + { + single_letter[1] = ' '; + if(Lookup(tr, &single_letter[2], ph_buf) == 0) + { + TranslateRules(tr, &single_letter[2], ph_buf, 20, NULL,0,NULL); + } + } + return(ph_buf[0]); +} + + +void LookupAccentedLetter(Translator *tr, unsigned int letter, char *ph_buf) +{//========================================================================= + // lookup the character in the accents table + int accent_data = 0; + int accent1 = 0; + int accent2 = 0; + int basic_letter; + int letter2=0; + char ph_letter1[30]; + char ph_letter2[30]; + char ph_accent1[30]; + char ph_accent2[30]; + + ph_accent2[0] = 0; + + if((letter >= 0xe0) && (letter < 0x17f)) + { + accent_data = letter_accents_0e0[letter - 0xe0]; + } + else + if((letter >= 0x250) && (letter <= 0x2a8)) + { + accent_data = letter_accents_250[letter - 0x250]; + } + + if(accent_data != 0) + { + basic_letter = (accent_data & 0x3f) + 59; + if(basic_letter < 'a') + basic_letter = non_ascii_tab[basic_letter-59]; + + if(accent_data & 0x8000) + { + letter2 = (accent_data >> 6) & 0x3f; + letter2 += 59; + accent2 = (accent_data >> 12) & 0x7; + } + else + { + accent1 = (accent_data >> 6) & 0x1f; + accent2 = (accent_data >> 11) & 0xf; + } + + + if(Lookup(tr, accents_tab[accent1].name, ph_accent1) != 0) + { + + if(LookupLetter2(tr, basic_letter, ph_letter1) != 0) + { + if(accent2 != 0) + { + if(Lookup(tr, accents_tab[accent2].name, ph_accent2) == 0) + { +// break; + } + + if(accents_tab[accent2].flags & 1) + { + strcpy(ph_buf,ph_accent2); + ph_buf += strlen(ph_buf); + ph_accent2[0] = 0; + } + } + if(letter2 != 0) + { + //ligature + LookupLetter2(tr, letter2, ph_letter2); + sprintf(ph_buf,"%s%c%s%c%s%s",ph_accent1, phonPAUSE_VSHORT, ph_letter1, phonSTRESS_P, ph_letter2, ph_accent2); + } + else + { + if(accent1 == 0) + strcpy(ph_buf, ph_letter1); + else + if((tr->langopts.accents & 1) || (accents_tab[accent1].flags & 1)) + sprintf(ph_buf,"%s%c%c%s", ph_accent1, phonPAUSE_VSHORT, phonSTRESS_P, ph_letter1); + else + sprintf(ph_buf,"%c%s%c%s%c", phonSTRESS_2, ph_letter1, phonPAUSE_VSHORT, ph_accent1, phonPAUSE_VSHORT); + } + } + } + } +} // end of LookupAccentedLetter + + + +void LookupLetter(Translator *tr, unsigned int letter, int next_byte, char *ph_buf1) +{//================================================================================= + int len; + unsigned char *p; + static char single_letter[10] = {0,0}; + char ph_stress[2]; + unsigned int dict_flags[2]; + char ph_buf3[40]; + char *ptr; + + ph_buf1[0] = 0; + len = utf8_out(letter,&single_letter[2]); + single_letter[len+2] = ' '; + + if(next_byte == -1) + { + // speaking normal text, not individual characters + if(Lookup(tr, &single_letter[2], ph_buf1) != 0) + return; + + single_letter[1] = '_'; + if(Lookup(tr, &single_letter[1], ph_buf3) != 0) + return; // the character is specified as _* so ignore it when speaking normal text + + // check whether this character is specified for English + if(tr->translator_name == L('e','n')) + return; // we are already using English + + SetTranslator2("en"); + if(Lookup(translator2, &single_letter[2], ph_buf3) != 0) + { + // yes, switch to English and re-translate the word + sprintf(ph_buf1,"%c",phonSWITCH); + } + SelectPhonemeTable(voice->phoneme_tab_ix); // revert to original phoneme table + return; + } + + if((letter <= 32) || iswspace(letter)) + { + // lookup space as _&32 etc. + sprintf(&single_letter[1],"_#%d ",letter); + Lookup(tr, &single_letter[1], ph_buf1); + return; + } + + if(next_byte != ' ') + next_byte = RULE_SPELLING; + single_letter[3+len] = next_byte; // follow by space-space if the end of the word, or space-0x31 + + single_letter[1] = '_'; + + // if the $accent flag is set for this letter, use the accents table (below) + dict_flags[1] = 0; + ptr = &single_letter[1]; + + if(Lookup(tr, &single_letter[1], ph_buf3) == 0) + { + single_letter[1] = ' '; + if(Lookup(tr, &single_letter[2], ph_buf3) == 0) + { + TranslateRules(tr, &single_letter[2], ph_buf3, sizeof(ph_buf3), NULL,FLAG_NO_TRACE,NULL); + } + } + + if(ph_buf3[0] == 0) + { + LookupAccentedLetter(tr, letter, ph_buf3); + } + + if(ph_buf3[0] == 0) + { + ph_buf1[0] = 0; + return; + } + if(ph_buf3[0] == phonSWITCH) + { + strcpy(ph_buf1,ph_buf3); + return; + } + // at a stress marker at the start of the letter name, unless one is already marked + ph_stress[0] = phonSTRESS_P; + ph_stress[1] = 0; + + for(p=(unsigned char *)ph_buf3; *p != 0; p++) + { + if(phoneme_tab[*p]->type == phSTRESS) + ph_stress[0] = 0; // stress is already marked + } + sprintf(ph_buf1,"%s%s",ph_stress,ph_buf3); +} + + + +int TranslateLetter(Translator *tr, char *word, char *phonemes, int control, int word_length) +{//====================================================================================== +// get pronunciation for an isolated letter +// return number of bytes used by the letter +// control 2=say-as glyphs, 3-say-as chars + int n_bytes; + int letter; + int len; + int save_option_phonemes; + char *p2; + char *pbuf; + char capital[20]; + char ph_buf[60]; + char ph_buf2[60]; + char hexbuf[6]; + + ph_buf[0] = 0; + capital[0] = 0; + + n_bytes = utf8_in(&letter,word); + + if((letter & 0xfff00) == 0x0e000) + { + letter &= 0xff; // uncode private usage area + } + + if(control > 2) + { + // include CAPITAL information + if(iswupper(letter)) + { + Lookup(tr, "_cap", capital); + } + } + letter = towlower2(letter); + + LookupLetter(tr, letter, word[n_bytes], ph_buf); + + if(ph_buf[0] == phonSWITCH) + { + strcpy(phonemes,ph_buf); + return(0); + } + + if((ph_buf[0] == 0) && (tr->translator_name != L('e','n'))) + { + // speak as English, check whether there is a translation for this character + SetTranslator2("en"); + save_option_phonemes = option_phonemes; + option_phonemes = 0; + LookupLetter(translator2, letter, word[n_bytes], ph_buf); + SelectPhonemeTable(voice->phoneme_tab_ix); // revert to original phoneme table + option_phonemes = save_option_phonemes; + + if(ph_buf[0] != 0) + { + sprintf(phonemes,"%cen",phonSWITCH); + return(0); + } + } + + if(ph_buf[0] == 0) + { + // character name not found + if(iswalpha(letter)) + Lookup(tr, "_?A", ph_buf); + + if((ph_buf[0]==0) && !iswspace(letter)) + Lookup(tr, "_??", ph_buf); + + if(ph_buf[0] != 0) + { + // speak the hexadecimal number of the character code + sprintf(hexbuf,"%x",letter); + pbuf = ph_buf; + for(p2 = hexbuf; *p2 != 0; p2++) + { + pbuf += strlen(pbuf); + *pbuf++ = phonPAUSE_VSHORT; + LookupLetter(tr, *p2, 0, pbuf); + } + } + } + + len = strlen(phonemes); + if(tr->langopts.accents & 2) + sprintf(ph_buf2,"%c%s%s",0xff,ph_buf,capital); + else + sprintf(ph_buf2,"%c%s%s",0xff,capital,ph_buf); // the 0xff marker will be removed or replaced in SetSpellingStress() + if((len + strlen(ph_buf2)) < N_WORD_PHONEMES) + { + strcpy(&phonemes[len],ph_buf2); + } + return(n_bytes); +} // end of TranslateLetter + + + +void SetSpellingStress(Translator *tr, char *phonemes, int control, int n_chars) +{//============================================================================= +// Individual letter names, reduce the stress of some. + int ix; + unsigned int c; + int n_stress=0; + int count; + unsigned char buf[N_WORD_PHONEMES]; + + for(ix=0; (c = phonemes[ix]) != 0; ix++) + { + if(c == phonSTRESS_P) + { + n_stress++; + } + buf[ix] = c; + } + buf[ix] = 0; + + count = 0; + for(ix=0; (c = buf[ix]) != 0; ix++) + { + if((c == phonSTRESS_P) && (n_chars > 1)) + { + count++; + + if(tr->langopts.spelling_stress == 1) + { + // stress on initial letter when spelling + if(count > 1) + c = phonSTRESS_3; + } + else + { + if(count != n_stress) + { + if(((count % 3) != 0) || (count == n_stress-1)) + c = phonSTRESS_3; // reduce to secondary stress + } + } + } + else + if(c == 0xff) + { + if((control < 2) || (ix==0)) + continue; // don't insert pauses + + if(control == 4) + c = phonPAUSE; // pause after each character + if(((count % 3) == 0) || (control > 2)) + c = phonPAUSE_SHORT; // pause following a primary stress + else + continue; // remove marker + } + *phonemes++ = c; + } + if(control >= 2) + *phonemes++ = phonPAUSE_NOLINK; + *phonemes = 0; +} // end of SetSpellingStress + + + +// Numbers + +static char ph_ordinal2[12]; + +int TranslateRoman(Translator *tr, char *word, char *ph_out) +{//===================================================== + int c; + char *p; + const char *p2; + int acc; + int prev; + int value; + int subtract; + int repeat = 0; + unsigned int flags; + char ph_roman[30]; + char number_chars[N_WORD_BYTES]; + + static const char *roman_numbers = "ixcmvld"; + static int roman_values[] = {1,10,100,1000,5,50,500}; + + acc = 0; + prev = 0; + subtract = 0x7fff; + + while((c = *word++) != ' ') + { + if((p2 = strchr(roman_numbers,c)) == NULL) + return(0); + + value = roman_values[p2 - roman_numbers]; + if(value == prev) + { + repeat++; + if(repeat >= 3) + return(0); + } + else + repeat = 0; + + if((prev > 1) && (prev != 10) && (prev != 100)) + { + if(value >= prev) + return(0); + } + if((prev != 0) && (prev < value)) + { + if(((acc % 10) != 0) || ((prev*10) < value)) + return(0); + subtract = prev; + value -= subtract; + } + else + if(value >= subtract) + return(0); + else + acc += prev; + prev = value; + } + acc += prev; + if(acc < 2) + return(0); + + if(acc > tr->langopts.max_roman) + return(0); + + Lookup(tr, "_roman",ph_roman); // precede by "roman" if _rom is defined in *_list + p = &ph_out[0]; + + if((tr->langopts.numbers & NUM_ROMAN_AFTER) == 0) + { + strcpy(ph_out,ph_roman); + p = &ph_out[strlen(ph_out)]; + } + + sprintf(number_chars," %d ",acc); + TranslateNumber(tr, &number_chars[1], p, &flags, 0); + + if(tr->langopts.numbers & NUM_ROMAN_AFTER) + strcat(ph_out,ph_roman); + return(1); +} // end of TranslateRoman + + +static const char *M_Variant(int value) +{//==================================== + // returns M, or perhaps MA for some cases + + if((translator->langopts.numbers2 & 0x100) && (value >= 2) && (value <= 4)) + return("0MA"); // Czech, Slovak + else + if(((value % 100) < 10) || ((value % 100) > 20)) // but not teens, 10 to 19 + { + if ((translator->langopts.numbers2 & 0x40) && + ((value % 10)>=2) && + ((value % 10)<=4)) + { + // for Polish language - two forms of plural! + return("0MA"); + } + + if((translator->langopts.numbers2 & 0x80) && + ((value % 10)==1)) + { + return("1MA"); + } + + } + return("0M"); +} + + +static int LookupThousands(Translator *tr, int value, int thousandplex, char *ph_out) +{//================================================================================== + int found; + char string[12]; + char ph_of[12]; + char ph_thousands[40]; + + ph_of[0] = 0; + + // first look fora match with the exact value of thousands + sprintf(string,"_%dM%d",value,thousandplex); + + if((found = Lookup(tr, string, ph_thousands)) == 0) + { + if((value % 100) >= 20) + { + Lookup(tr, "_0of", ph_of); + } + + sprintf(string,"_%s%d",M_Variant(value),thousandplex); + + if(Lookup(tr, string, ph_thousands) == 0) + { + // repeat "thousand" if higher order names are not available + sprintf(string,"_%dM1",value); + if((found = Lookup(tr, string, ph_thousands)) == 0) + Lookup(tr, "_0M1", ph_thousands); + } + } + sprintf(ph_out,"%s%s",ph_of,ph_thousands); + return(found); +} + + +static int LookupNum2(Translator *tr, int value, int control, char *ph_out) +{//======================================================================== +// Lookup a 2 digit number +// control bit 0: tens and units (use special form of '1') +// control bit 1: ordinal number +// control bit 2: use feminine form of '2' +// control bit 3: speak zero tens + + int found; + int ix; + int units; + int used_and=0; + int found_ordinal = 0; + int next_phtype; + char string[12]; // for looking up entries in *_list + char ph_ordinal[20]; + char ph_tens[50]; + char ph_digits[50]; + char ph_and[12]; + + // is there a special pronunciation for this 2-digit number + found = 0; + ph_ordinal[0] = 0; + + if(control & 4) + { + sprintf(string,"_%df",value); + found = Lookup(tr, string, ph_digits); + } + if(control & 2) + { + strcpy(ph_ordinal, ph_ordinal2); + + sprintf(string,"_%do",value); + if((found = Lookup(tr, string, ph_digits)) != 0) + { + found_ordinal = 1; + } + } + + if(found == 0) + { + if((value == 1) && (control & 1)) + { + if(Lookup(tr, "_1a", ph_out) != 0) + return(0); + } + sprintf(string,"_%d",value); + found = Lookup(tr, string, ph_digits); + } + + // no, speak as tens+units + + if((control & 8) && (value < 10)) + { + // speak leading zero + Lookup(tr, "_0", ph_tens); + } + else + { + if(found) + { + ph_tens[0] = 0; + } + else + { + units = (value % 10); + + if((control & 2) && ((units == 0) || (tr->langopts.numbers & 0x10))) + { + sprintf(string,"_%dXo",value / 10); + if(Lookup(tr, string, ph_tens) != 0) + { + found_ordinal = 1; + } + } + if(found_ordinal == 0) + { + sprintf(string,"_%dX",value / 10); + Lookup(tr, string, ph_tens); + } + + if((ph_tens[0] == 0) && (tr->langopts.numbers & NUM_VIGESIMAL)) + { + // tens not found, (for example) 73 is 60+13 + units = (value % 20); + sprintf(string,"_%dX",(value / 10) & 0xfe); + Lookup(tr, string, ph_tens); + } + + ph_digits[0] = 0; + if(units > 0) + { + found = 0; + if(control & 4) + { + // is there a variant form of this number? + sprintf(string,"_%df",units); + found = Lookup(tr, string, ph_digits); + } + if((control & 2) && ((tr->langopts.numbers & 0x10) == 0)) + { + // ordinal + sprintf(string,"_%do",units); + if((found = Lookup(tr, string, ph_digits)) != 0) + { + found_ordinal = 1; + } + } + if(found == 0) + { + sprintf(string,"_%d",units); + Lookup(tr, string, ph_digits); + } + } + } + } + + if((control & 2) && (found_ordinal == 0) && (ph_ordinal[0] == 0)) + { + if((value >= 20) && (((value % 10) == 0) || (tr->langopts.numbers & 0x10))) + Lookup(tr, "_ord20", ph_ordinal); + if(ph_ordinal[0] == 0) + Lookup(tr, "_ord", ph_ordinal); + } + + if((tr->langopts.numbers & 0x30) && (ph_tens[0] != 0) && (ph_digits[0] != 0)) + { + Lookup(tr, "_0and", ph_and); + if(tr->langopts.numbers & 0x10) + sprintf(ph_out,"%s%s%s%s",ph_digits, ph_and, ph_tens, ph_ordinal); + else + sprintf(ph_out,"%s%s%s%s",ph_tens, ph_and, ph_digits, ph_ordinal); + used_and = 1; + } + else + { + if(tr->langopts.numbers & 0x200) + { + // remove vowel from the end of tens if units starts with a vowel (LANG=Italian) + if(((ix = strlen(ph_tens)-1) >= 0) && (ph_digits[0] != 0)) + { + if((next_phtype = phoneme_tab[(unsigned int)(ph_digits[0])]->type) == phSTRESS) + next_phtype = phoneme_tab[(unsigned int)(ph_digits[1])]->type; + + if((phoneme_tab[(unsigned int)(ph_tens[ix])]->type == phVOWEL) && (next_phtype == phVOWEL)) + ph_tens[ix] = 0; + } + } + sprintf(ph_out,"%s%s%s",ph_tens, ph_digits, ph_ordinal); + } + + if(tr->langopts.numbers & 0x100) + { + // only one primary stress + found = 0; + for(ix=strlen(ph_out)-1; ix>=0; ix--) + { + if(ph_out[ix] == phonSTRESS_P) + { + if(found) + ph_out[ix] = phonSTRESS_3; + else + found = 1; + } + } + } + return(used_and); +} // end of LookupNum2 + + +static int LookupNum3(Translator *tr, int value, char *ph_out, int suppress_null, int thousandplex, int control) +{//============================================================================================================= +// Translate a 3 digit number +// control bit 0, previous thousands +// bit 1, ordinal number + int found; + int hundreds; + int x; + char string[12]; // for looking up entries in **_list + char buf1[100]; + char buf2[100]; + char ph_100[20]; + char ph_10T[20]; + char ph_digits[50]; + char ph_thousands[50]; + char ph_hundred_and[12]; + char ph_thousand_and[12]; + + hundreds = value / 100; + buf1[0] = 0; + + if(hundreds > 0) + { + ph_thousands[0] = 0; + ph_thousand_and[0] = 0; + + found = 0; + if((control & 2) && ((value % 100) == 0)) + { + // ordinal number, with no tens or units + found = Lookup(tr, "_0Co", ph_100); + } + if(found == 0) + { + Lookup(tr, "_0C", ph_100); + } + + if(((tr->langopts.numbers & 0x0800) != 0) && (hundreds == 19)) + { + // speak numbers such as 1984 as years: nineteen-eighty-four +// ph_100[0] = 0; // don't say "hundred", we also need to surpess "and" + } + else + if(hundreds >= 10) + { + ph_digits[0] = 0; + + if(LookupThousands(tr, hundreds / 10, thousandplex+1, ph_10T) == 0) + { + x = 0; + if(tr->langopts.numbers2 & (1 << (thousandplex+1))) + x = 4; + LookupNum2(tr, hundreds/10, x, ph_digits); + } + + if(tr->langopts.numbers2 & 0x200) + sprintf(ph_thousands,"%s%s%c",ph_10T,ph_digits,phonPAUSE_NOLINK); // say "thousands" before its number, not after + else + sprintf(ph_thousands,"%s%s%c",ph_digits,ph_10T,phonPAUSE_NOLINK); + + hundreds %= 10; + if(hundreds == 0) + ph_100[0] = 0; + suppress_null = 1; + } + + ph_digits[0] = 0; + if(hundreds > 0) + { + if((tr->langopts.numbers & 0x100000) && ((control & 1) || (ph_thousands[0] != 0))) + { + Lookup(tr, "_0and", ph_thousand_and); + } + + suppress_null = 1; + + found = 0; + if((value % 1000) == 100) + { + // is there a special pronunciation for exactly 100 ? + found = Lookup(tr, "_1C0", ph_digits); + } + if(!found) + { + sprintf(string,"_%dC",hundreds); + found = Lookup(tr, string, ph_digits); // is there a specific pronunciation for n-hundred ? + } + + if(found) + { + ph_100[0] = 0; + } + else + { + if((hundreds > 1) || ((tr->langopts.numbers & 0x400) == 0)) + { + LookupNum2(tr, hundreds, 0, ph_digits); + } + } + } + + sprintf(buf1,"%s%s%s%s",ph_thousands,ph_thousand_and,ph_digits,ph_100); + } + + ph_hundred_and[0] = 0; + if((tr->langopts.numbers & 0x40) && ((value % 100) != 0)) + { + if((value > 100) || ((control & 1) && (thousandplex==0))) + { + Lookup(tr, "_0and", ph_hundred_and); + } + } + + + buf2[0] = 0; + value = value % 100; + + if((value != 0) || (suppress_null == 0)) + { + x = 0; + if(thousandplex==0) + { + x = 1; // allow "eins" for 1 rather than "ein" + if(control & 2) + x = 3; // ordinal number + } + else + { + if(tr->langopts.numbers2 & (1 << thousandplex)) + x = 4; // use variant (feminine) for before thousands and millions + } + + if(LookupNum2(tr, value, x, buf2) != 0) + { + if(tr->langopts.numbers & 0x80) + ph_hundred_and[0] = 0; // don't put 'and' after 'hundred' if there's 'and' between tens and units + } + } + + sprintf(ph_out,"%s%s%s",buf1,ph_hundred_and,buf2); + + return(0); +} // end of LookupNum3 + + +static int TranslateNumber_1(Translator *tr, char *word, char *ph_out, unsigned int *flags, int wflags) +{//==================================================================================================== +// Number translation with various options +// the "word" may be up to 4 digits +// "words" of 3 digits may be preceded by another number "word" for thousands or millions + + int n_digits; + int value; + unsigned int ix; + unsigned char c; + int suppress_null = 0; + int decimal_point = 0; + int thousandplex = 0; + int thousands_inc = 0; + int prev_thousands = 0; + int ordinal = 0; + int this_value; + static int prev_value; + int decimal_count; + int max_decimal_count; + int decimal_mode; + int hyphen; + char *p; + char string[20]; // for looking up entries in **_list + char buf1[100]; + char ph_append[50]; + char ph_buf[200]; + char ph_buf2[50]; + char suffix[20]; + + static const char str_pause[2] = {phonPAUSE_NOLINK,0}; + + *flags = 0; + + for(ix=0; isdigit(word[ix]); ix++) ; + n_digits = ix; + value = this_value = atoi(word); + + ph_ordinal2[0] = 0; + if((tr->langopts.numbers & 0x10000) && (word[ix] == '.') && !isdigit(word[ix+2])) + { + // ordinal number is indicated by dot after the number + ordinal = 2; + word[ix] = ' '; + } + else + { + // look for an ordinal number suffix after the number + ix++; + hyphen = 0; + p = suffix; + if(word[ix] == '-') + { + *p++ = '-'; + hyphen = 1; + ix += 2; + } + while((word[ix] != 0) && (word[ix] != ' ') && (ix < (sizeof(suffix)-1))) + { + *p++ = word[ix++]; + } + *p = 0; + + if(suffix[0] != 0) + { + sprintf(string,"_0%s",suffix); + if(Lookup(tr, string, ph_ordinal2)) + { + // this is an ordinal suffix + ordinal = 2; + flags[0] |= FLAG_SKIPWORDS; + dictionary_skipwords = 1 + hyphen; + } + } + } + + ph_append[0] = 0; + ph_buf2[0] = 0; + + // is there a previous thousands part (as a previous "word") ? + if((n_digits == 3) && (word[-2] == tr->langopts.thousands_sep) && isdigit(word[-3])) + { + prev_thousands = 1; + } + else + if((tr->langopts.thousands_sep == ' ') || (tr->langopts.numbers & 0x1000)) + { + // thousands groups can be separated by spaces + if((n_digits == 3) && isdigit(word[-2])) + { + prev_thousands = 1; + } + } + + if((word[0] == '0') && (prev_thousands == 0) && (word[1] != ' ') && (word[1] != tr->langopts.decimal_sep)) + { + if((n_digits == 2) && (word[3] == ':') && isdigit(word[5]) && isspace(word[7])) + { + // looks like a time 02:30, omit the leading zero + } + else + { + return(0); // number string with leading zero, speak as individual digits + } + } + + if((tr->langopts.numbers & 0x1000) && (word[n_digits] == ' ')) + thousands_inc = 1; + else + if(word[n_digits] == tr->langopts.thousands_sep) + thousands_inc = 2; + + if(thousands_inc > 0) + { + // if the following "words" are three-digit groups, count them and add + // a "thousand"/"million" suffix to this one + + ix = n_digits + thousands_inc; + while(isdigit(word[ix]) && isdigit(word[ix+1]) && isdigit(word[ix+2])) + { + thousandplex++; + if(word[ix+3] == tr->langopts.thousands_sep) + ix += (3 + thousands_inc); + else + break; + } + } + + if((value == 0) && prev_thousands) + { + suppress_null = 1; + } + + if((word[n_digits] == tr->langopts.decimal_sep) && isdigit(word[n_digits+1])) + { + // this "word" ends with a decimal point + Lookup(tr, "_dpt", ph_append); + decimal_point = 1; + } + else + if(suppress_null == 0) + { + if(thousands_inc > 0) + { + if((thousandplex > 0) && (value < 1000)) + { + if((suppress_null == 0) && (LookupThousands(tr,value,thousandplex,ph_append))) + { + // found an exact match for N thousand + value = 0; + suppress_null = 1; + } + } + } + } + else + if((thousandplex > 1) && prev_thousands && (prev_value > 0)) + { + sprintf(string,"_%s%d",M_Variant(value),thousandplex+1); + if(Lookup(tr, string, buf1)==0) + { + // speak this thousandplex if there was no word for the previous thousandplex + sprintf(string,"_0M%d",thousandplex); + Lookup(tr, string, ph_append); + } + } + + if((ph_append[0] == 0) && (word[n_digits] == '.') && (thousandplex == 0)) + { + Lookup(tr, "_.", ph_append); + } + + LookupNum3(tr, value, ph_buf, suppress_null, thousandplex, prev_thousands | ordinal); + if((thousandplex > 0) && (tr->langopts.numbers2 & 0x200)) + sprintf(ph_out,"%s%s%s",ph_append,ph_buf2,ph_buf); // say "thousands" before its number + else + sprintf(ph_out,"%s%s%s",ph_buf2,ph_buf,ph_append); + + + while(decimal_point) + { + n_digits++; + + decimal_count = 0; + while(isdigit(word[n_digits+decimal_count])) + decimal_count++; + + if(decimal_count > 1) + { + max_decimal_count = 2; + switch(decimal_mode = (tr->langopts.numbers & 0xe000)) + { + case 0x8000: + max_decimal_count = 5; + case 0x4000: + // French/Polish decimal fraction + while(word[n_digits] == '0') + { + Lookup(tr, "_0", buf1); + strcat(ph_out,buf1); + decimal_count--; + n_digits++; + } + if((decimal_count <= max_decimal_count) && isdigit(word[n_digits])) + { + LookupNum3(tr, atoi(&word[n_digits]), buf1, 0,0,0); + strcat(ph_out,buf1); + n_digits += decimal_count; + } + break; + + case 0x2000: + case 0xa000: + // Italian decimal fractions + if(decimal_count <= 4) + { + LookupNum3(tr, atoi(&word[n_digits]), ph_buf, 0,0,0); + if((word[n_digits]=='0') || (decimal_mode == 0xa000)) + { + // decimal part has leading zeros, so add a "hundredths" or "thousandths" suffix + sprintf(string,"_0Z%d",decimal_count); + if(Lookup(tr, string, buf1) == 0) + break; // revert to speaking single digits + + strcat(ph_buf,buf1); + } + strcat(ph_out,ph_buf); + n_digits += decimal_count; + } + break; + + case 0x6000: + // Romanian decimal fractions + if((decimal_count <= 4) && (word[n_digits] != '0')) + { + LookupNum3(tr, atoi(&word[n_digits]), buf1, 0,0,0); + strcat(ph_out,buf1); + n_digits += decimal_count; + } + break; + } + } + + while(isdigit(c = word[n_digits]) && (strlen(ph_out) < (N_WORD_PHONEMES - 10))) + { + value = word[n_digits++] - '0'; + LookupNum2(tr, value, 1, buf1); + strcat(ph_out,buf1); + } + + // something after the decimal part ? + if(Lookup(tr, "_dpt2", buf1)) + strcat(ph_out,buf1); + + if((c == tr->langopts.decimal_sep) && isdigit(word[n_digits+1])) + { + Lookup(tr, "_dpt", buf1); + strcat(ph_out,buf1); + } + else + { + decimal_point = 0; + } + } + if((ph_out[0] != 0) && (ph_out[0] != phonSWITCH)) + { + int next_char; + char *p; + p = &word[n_digits+1]; + + p += utf8_in(&next_char,p); + if((tr->langopts.numbers & NUM_NOPAUSE) && (next_char == ' ')) + utf8_in(&next_char,p); + + if(!iswalpha(next_char)) + strcat(ph_out,str_pause); // don't add pause for 100s, 6th, etc. + } + + *flags |= FLAG_FOUND; + prev_value = this_value; + return(1); +} // end of TranslateNumber_1 + + + +int TranslateNumber(Translator *tr, char *word1, char *ph_out, unsigned int *flags, int wflags) +{//============================================================================================ + if(option_sayas == SAYAS_DIGITS1) + return(0); // speak digits individually + + if((tr->langopts.numbers & 0x3) == 1) + return(TranslateNumber_1(tr, word1, ph_out, flags, wflags)); + + return(0); +} // end of TranslateNumber + diff --git a/navit/support/espeak/phonemelist.c b/navit/support/espeak/phonemelist.c new file mode 100755 index 0000000..d663e2e --- /dev/null +++ b/navit/support/espeak/phonemelist.c @@ -0,0 +1,686 @@ +/*************************************************************************** + * Copyright (C) 2005 to 2007 by Jonathan Duddington * + * email: jonsd@users.sourceforge.net * + * * + * 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; either version 3 of the License, or * + * (at your option) any later version. * + * * + * 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, see: * + * . * + ***************************************************************************/ + +#include "StdAfx.h" + +#include +#include +#include + +#include "speak_lib.h" +#include "speech.h" +#include "phoneme.h" +#include "synthesize.h" +#include "translate.h" + + +const unsigned char pause_phonemes[8] = {0, phonPAUSE_VSHORT, phonPAUSE_SHORT, phonPAUSE, phonPAUSE_LONG, phonGLOTTALSTOP, phonPAUSE_LONG, phonPAUSE_LONG}; + + +extern int n_ph_list2; +extern PHONEME_LIST2 ph_list2[N_PHONEME_LIST]; // first stage of text->phonemes + + + +static int ChangePhonemes(Translator *tr, PHONEME_LIST2 *phlist, int n_ph, int index, PHONEME_TAB *ph, CHANGEPH *ch) +{//================================================================================================================= +// Called for each phoneme in the phoneme list, to allow a language to make changes +// ph The current phoneme + + if(tr->translator_name == L('r','u')) + return(ChangePhonemes_ru(tr, phlist, n_ph, index, ph, ch)); + + return(0); +} + + +static int SubstitutePhonemes(Translator *tr, PHONEME_LIST2 *plist_out) +{//==================================================================== +// Copy the phonemes list and perform any substitutions that are required for the +// current voice + int ix; + int k; + int replace_flags; + int n_plist_out = 0; + int word_end; + int max_stress = -1; + int switched_language = 0; + int max_stress_posn=0; + int n_syllables = 0; + int syllable = 0; + int syllable_stressed = 0; + PHONEME_LIST2 *plist2; + PHONEME_LIST2 *pl; + PHONEME_TAB *next=NULL; + + for(ix=0; (ix < n_ph_list2) && (n_plist_out < N_PHONEME_LIST); ix++) + { + plist2 = &ph_list2[ix]; + + if(plist2->phcode == phonSWITCH) + switched_language ^= 1; + + // don't do any substitution if the language has been temporarily changed + if(switched_language == 0) + { + if(ix < (n_ph_list2 -1)) + next = phoneme_tab[ph_list2[ix+1].phcode]; + + word_end = 0; + if((plist2+1)->sourceix || ((next != 0) && (next->type == phPAUSE))) + word_end = 1; // this phoneme is the end of a word + + if(tr->langopts.phoneme_change != 0) + { + // this language does changes to phonemes after translation + int flags; + CHANGEPH ch; + if(plist2->sourceix) + { + // start of a word, find the stressed vowel + syllable = 0; + syllable_stressed = 0; + n_syllables = 0; + + max_stress = -1; + max_stress_posn = ix; + for(k=ix; k < n_ph_list2; k++) + { + if(((pl = &ph_list2[k])->sourceix != 0) && (k > ix)) + break; + + pl->stress &= 0xf; + + if(phoneme_tab[pl->phcode]->type == phVOWEL) + { + n_syllables++; + + if(pl->stress > max_stress) + { + syllable_stressed = n_syllables; + max_stress = pl->stress; + max_stress_posn = k; + } + } + } + } + + if(phoneme_tab[plist2->phcode]->type == phVOWEL) + { + syllable++; + } + + // make any language specific changes + flags = 0; + if(ix == max_stress_posn) + flags |= 2; + if(ix > max_stress_posn) + flags |= 4; + if(ph_list2[ix].synthflags & SFLAG_DICTIONARY) + flags |= 8; + ch.flags = flags | word_end; + + ch.stress = plist2->stress; + ch.stress_highest = max_stress; + ch.n_vowels = n_syllables; + ch.vowel_this = syllable; + ch.vowel_stressed = syllable_stressed; + + ChangePhonemes(tr, ph_list2, n_ph_list2, ix, phoneme_tab[ph_list2[ix].phcode], &ch); + } + + // check whether a Voice has specified that we should replace this phoneme + for(k=0; kphcode == replace_phonemes[k].old_ph) + { + replace_flags = replace_phonemes[k].type; + + if((replace_flags & 1) && (word_end == 0)) + continue; // this replacement only occurs at the end of a word + + if((replace_flags & 2) && ((plist2->stress & 0x7) > 3)) + continue; // this replacement doesn't occur in stressed syllables + + // substitute the replacement phoneme + plist2->phcode = replace_phonemes[k].new_ph; + if((plist2->stress > 1) && (phoneme_tab[plist2->phcode]->phflags & phUNSTRESSED)) + plist2->stress = 0; // the replacement must be unstressed + break; + } + } + + if(plist2->phcode == 0) + { + continue; // phoneme has been replaced by NULL, so don't copy it + } + } + + // copy phoneme into the output list + memcpy(&plist_out[n_plist_out++],plist2,sizeof(PHONEME_LIST2)); + } + return(n_plist_out); +} // end of SubstitutePhonemes + + + +void MakePhonemeList(Translator *tr, int post_pause, int start_sentence) +{//===================================================================== + + int ix=0; + int j; + int insert_ph = 0; + PHONEME_LIST *phlist; + PHONEME_TAB *ph; + PHONEME_TAB *prev, *next, *next2; + int unstress_count = 0; + int word_stress = 0; + int switched_language = 0; + int max_stress; + int voicing; + int regression; + int end_sourceix; + int alternative; + int first_vowel=0; // first vowel in a word + PHONEME_LIST2 ph_list3[N_PHONEME_LIST]; + + static PHONEME_LIST2 ph_list2_null = {0,0,0,0,0}; + PHONEME_LIST2 *plist2 = &ph_list2_null; + PHONEME_LIST2 *plist2_inserted = NULL; + + plist2 = ph_list2; + phlist = phoneme_list; + end_sourceix = plist2[n_ph_list2-1].sourceix; + + // is the last word of the clause unstressed ? + max_stress = 0; + for(j = n_ph_list2-3; j>=0; j--) + { + // start with the last phoneme (before the terminating pauses) and move forwards + if((plist2[j].stress & 0x7f) > max_stress) + max_stress = plist2[j].stress & 0x7f; + if(plist2[j].sourceix != 0) + break; + } + if(max_stress < 4) + { + // the last word is unstressed, look for a previous word that can be stressed + while(--j >= 0) + { + if(plist2[j].synthflags & SFLAG_PROMOTE_STRESS) // dictionary flags indicated that this stress can be promoted + { + plist2[j].stress = 4; // promote to stressed + break; + } + if(plist2[j].stress >= 4) + { + // found a stressed syllable, so stop looking + break; + } + } + } + + if((regression = tr->langopts.param[LOPT_REGRESSIVE_VOICING]) != 0) + { + // set consonant clusters to all voiced or all unvoiced + // Regressive + int type; + voicing = 0; + + for(j=n_ph_list2-1; j>=0; j--) + { + ph = phoneme_tab[plist2[j].phcode]; + if(ph == NULL) + continue; + + if(ph->code == phonSWITCH) + switched_language ^= 1; + if(switched_language) + continue; + + type = ph->type; + + if(regression & 0x2) + { + // LANG=Russian, [v] amd [v;] don't cause regression, or [R^] + if((ph->mnemonic == 'v') || (ph->mnemonic == ((';'<<8)+'v')) || ((ph->mnemonic & 0xff)== 'R')) + type = phLIQUID; + } + + if((type==phSTOP) || type==(phFRICATIVE)) + { + if(voicing==0) + { + voicing = 1; + } + else + if((voicing==2) && ((ph->phflags & phALTERNATIVE)==phSWITCHVOICING)) + { + plist2[j].phcode = ph->alternative_ph; // change to voiced equivalent + } + } + else + if((type==phVSTOP) || type==(phVFRICATIVE)) + { + if(voicing==0) + { + voicing = 2; + } + else + if((voicing==1) && ((ph->phflags & phALTERNATIVE)==phSWITCHVOICING)) + { + plist2[j].phcode = ph->alternative_ph; // change to unvoiced equivalent + } + } + else + { + if(regression & 0x8) + { + // LANG=Polish, propagate through liquids and nasals + if((type == phPAUSE) || (type == phVOWEL)) + voicing = 0; + } + else + { + voicing = 0; + } + } + if((regression & 0x4) && (plist2[j].sourceix)) + { + // stop propagation at a word boundary + voicing = 0; + } + } + } + + n_ph_list2 = SubstitutePhonemes(tr,ph_list3) - 2; + + // transfer all the phonemes of the clause into phoneme_list + ph = phoneme_tab[phonPAUSE]; + switched_language = 0; + + for(j=0; insert_ph || ((j < n_ph_list2) && (ix < N_PHONEME_LIST-3)); j++) + { + prev = ph; + + plist2 = &ph_list3[j]; + + if(insert_ph != 0) + { + // we have a (linking) phoneme which we need to insert here + next = phoneme_tab[plist2->phcode]; // this phoneme, i.e. after the insert + + // re-use the previous entry for the inserted phoneme. + // That's OK because we don't look backwards from plist2 + j--; + plist2 = plist2_inserted = &ph_list3[j]; + memset(plist2, 0, sizeof(*plist2)); + plist2->phcode = insert_ph; + ph = phoneme_tab[insert_ph]; + insert_ph = 0; + } + else + { + // otherwise get the next phoneme from the list + ph = phoneme_tab[plist2->phcode]; + + if(plist2->phcode == phonSWITCH) + { + // change phoneme table + SelectPhonemeTable(plist2->tone_number); + switched_language ^= SFLAG_SWITCHED_LANG; + } + next = phoneme_tab[(plist2+1)->phcode]; // the phoneme after this one + } + + if(plist2->sourceix) + { + // start of a word + int k; + word_stress = 0; + first_vowel = 1; + + // find the highest stress level in this word + for(k=j+1; k < n_ph_list2; k++) + { + if(ph_list3[k].sourceix) + break; // start of the next word + + if(ph_list3[k].stress > word_stress) + word_stress = ph_list3[k].stress; + } + } + + if(ph == NULL) continue; + + if(ph->type == phVOWEL) + { + // check for consecutive unstressed syllables + if(plist2->stress == 0) + { + // an unstressed vowel + unstress_count++; + if((unstress_count > 1) && ((unstress_count & 1)==0)) + { + // in a sequence of unstressed syllables, reduce alternate syllables to 'diminished' + // stress. But not for the last phoneme of a stressed word + if((tr->langopts.stress_flags & 0x2) || ((word_stress > 3) && ((plist2+1)->sourceix!=0))) + { + // An unstressed final vowel of a stressed word + unstress_count=1; // try again for next syllable + } + else + { + plist2->stress = 1; // change stress to 'diminished' + } + } + } + else + { + unstress_count = 0; + } + } + + alternative = 0; + + if(ph->alternative_ph > 0) + { + switch(ph->phflags & phALTERNATIVE) + { + // This phoneme changes if vowel follows, or doesn't follow, depending on its phNOTFOLLOWS flag + case phBEFORENOTVOWEL: + if(next->type != phVOWEL) + alternative = ph->alternative_ph; + break; + + case phBEFORENOTVOWEL2: // LANG=tr + if(((plist2+1)->sourceix != 0) || + ((next->type != phVOWEL) && ((phoneme_tab[(plist2+2)->phcode]->type != phVOWEL) || ((plist2+2)->sourceix != 0)))) + { + alternative = ph->alternative_ph; + } + break; + + case phBEFOREVOWELPAUSE: + if((next->type == phVOWEL) || (next->type == phPAUSE)) + alternative = ph->alternative_ph; + break; + + case phBEFOREVOWEL: + if(next->type == phVOWEL) + alternative = ph->alternative_ph; + break; + + case phBEFORE_R: + if(next->phflags & phRHOTIC) + { + alternative = ph->alternative_ph; + } + break; + } + } + if(ph->phflags & phBEFOREPAUSE) + { + if(next->type == phPAUSE) + alternative = ph->link_out; // replace with the link_out phoneme + } + + if(alternative == 1) + continue; // NULL phoneme, discard + + if(alternative > 1) + { + PHONEME_TAB *ph2; + ph2 = ph; + ph = phoneme_tab[alternative]; + + if(ph->type == phVOWEL) + { + plist2->synthflags |= SFLAG_SYLLABLE; + if(ph2->type != phVOWEL) + plist2->stress = 0; // change from non-vowel to vowel, make sure it's unstressed + } + else + plist2->synthflags &= ~SFLAG_SYLLABLE; + } + + if(tr->langopts.param[LOPT_REDUCE_T]) + { + if((ph->mnemonic == 't') && (plist2->sourceix == 0) && ((prev->type == phVOWEL) || (prev->mnemonic == 'n'))) + { + if(((plist2+1)->sourceix == 0) && ((plist2+1)->stress < 3) && (next->type == phVOWEL)) + { + ph = phoneme_tab[phonT_REDUCED]; + } + } + } + + + while((ph->reduce_to != 0) && (!(plist2->synthflags & SFLAG_DICTIONARY) || (tr->langopts.param[LOPT_REDUCE] & 1))) + { + int reduce_level; + int stress_level; + int reduce = 0; + + reduce_level = (ph->phflags >> 28) & 7; + + if(ph->type == phVOWEL) + { + stress_level = plist2->stress; + } + else + { + // consonant, get stress from the following vowel + if(next->type == phVOWEL) + stress_level = (plist2+1)->stress; + else + break; + } + + if((stress_level == 1) && (first_vowel)) + stress_level = 0; // ignore 'dimished' stress on first syllable + + if(stress_level == 1) + reduce = 1; // stress = 'reduced' + + if(stress_level < reduce_level) + reduce =1; + + if((word_stress < 4) && (tr->langopts.param[LOPT_REDUCE] & 0x2) && (stress_level >= word_stress)) + { + // don't reduce the most stressed syllable in an unstressed word + reduce = 0; + } + + if(reduce) + ph = phoneme_tab[ph->reduce_to]; + else + break; + } + + if(ph->type == phVOWEL) + first_vowel = 0; + + if((plist2+1)->synthflags & SFLAG_LENGTHEN) + { + static char types_double[] = {phFRICATIVE,phVFRICATIVE,phNASAL,phLIQUID,0}; + if(strchr(types_double,next->type)) + { + // lengthen this consonant by doubling it + insert_ph = next->code; + (plist2+1)->synthflags ^= SFLAG_LENGTHEN; + } + } + + if((plist2+1)->sourceix != 0) + { + int x; + + if(tr->langopts.vowel_pause && (ph->type != phPAUSE)) + { + + if((ph->type != phVOWEL) && (tr->langopts.vowel_pause & 0x200)) + { + // add a pause after a word which ends in a consonant + insert_ph = phonPAUSE_NOLINK; + } + + if(next->type == phVOWEL) + { + if((x = tr->langopts.vowel_pause & 0x0c) != 0) + { + // break before a word which starts with a vowel + if(x == 0xc) + insert_ph = phonPAUSE_NOLINK; + else + insert_ph = phonPAUSE_VSHORT; + } + + if((ph->type == phVOWEL) && ((x = tr->langopts.vowel_pause & 0x03) != 0)) + { + // adjacent vowels over a word boundary + if(x == 2) + insert_ph = phonPAUSE_SHORT; + else + insert_ph = phonPAUSE_VSHORT; + } + + if(((plist2+1)->stress >= 4) && (tr->langopts.vowel_pause & 0x100)) + { + // pause before a words which starts with a stressed vowel + insert_ph = phonPAUSE_SHORT; + } + } + } + + if(plist2 != plist2_inserted) + { + if((x = (tr->langopts.word_gap & 0x7)) != 0) + { + if((x > 1) || ((insert_ph != phonPAUSE_SHORT) && (insert_ph != phonPAUSE_NOLINK))) + { + // don't reduce the pause + insert_ph = pause_phonemes[x]; + } + } + if(option_wordgap > 0) + { + insert_ph = phonPAUSE_LONG; + } + } + } + + next2 = phoneme_tab[(plist2+2)->phcode]; + + if((insert_ph == 0) && (ph->link_out != 0) && !(ph->phflags & phBEFOREPAUSE) && (((plist2+1)->synthflags & SFLAG_EMBEDDED)==0)) + { + if(ph->phflags & phAPPENDPH) + { + // always append the specified phoneme, unless it already is the next phoneme + if((ph->link_out != (plist2+1)->phcode) && (next->type == phVOWEL)) +// if(ph->link_out != (plist2+1)->phcode) + { + insert_ph = ph->link_out; + } + } + else + if(((tr->langopts.word_gap & 8)==0) || ((plist2+1)->sourceix == 0)) + { + // This phoneme can be linked to a following vowel by inserting a linking phoneme + if(next->type == phVOWEL) + insert_ph = ph->link_out; + else + if(next->code == phonPAUSE_SHORT) + { + // Pause followed by Vowel, replace the Short Pause with the linking phoneme, + if(next2->type == phVOWEL) + (plist2+1)->phcode = ph->link_out; // replace pause by linking phoneme + } + } + } + + if(ph->phflags & phVOICED) + { + // check that a voiced consonant is preceded or followed by a vowel or liquid + // and if not, add a short schwa + + // not yet implemented + } + + phlist[ix].ph = ph; + phlist[ix].type = ph->type; + phlist[ix].env = PITCHfall; // default, can be changed in the "intonation" module + phlist[ix].synthflags = plist2->synthflags | switched_language; + phlist[ix].stresslevel = plist2->stress & 0xf; + phlist[ix].tone_ph = plist2->tone_number; + phlist[ix].sourceix = 0; + + if(plist2->sourceix != 0) + { + phlist[ix].sourceix = plist2->sourceix; + phlist[ix].newword = 1; // this phoneme is the start of a word + + if(start_sentence) + { + phlist[ix].newword = 5; // start of sentence + start of word + start_sentence = 0; + } + } + else + { + phlist[ix].newword = 0; + } + + phlist[ix].length = ph->std_length; + if((ph->code == phonPAUSE_LONG) && (option_wordgap > 0)) + { + phlist[ix].ph = phoneme_tab[phonPAUSE_SHORT]; + phlist[ix].length = option_wordgap*14; // 10mS per unit at the default speed + } + + if(ph->type==phVOWEL || ph->type==phLIQUID || ph->type==phNASAL || ph->type==phVSTOP || ph->type==phVFRICATIVE) + { + phlist[ix].length = 128; // length_mod + phlist[ix].env = PITCHfall; + } + + phlist[ix].prepause = 0; + phlist[ix].amp = 20; // default, will be changed later + phlist[ix].pitch1 = 0x400; + phlist[ix].pitch2 = 0x400; + ix++; + } + phlist[ix].newword = 2; // end of clause + + phlist[ix].type = phPAUSE; // terminate with 2 Pause phonemes + phlist[ix].length = post_pause; // length of the pause, depends on the punctuation + phlist[ix].sourceix = end_sourceix; + phlist[ix].synthflags = 0; + + phlist[ix++].ph = phoneme_tab[phonPAUSE]; + phlist[ix].type = phPAUSE; + phlist[ix].length = 0; + phlist[ix].sourceix=0; + phlist[ix].synthflags = 0; + phlist[ix++].ph = phoneme_tab[phonPAUSE_SHORT]; + + n_phoneme_list = ix; +} // end of MakePhonemeList + + diff --git a/navit/support/espeak/readclause.c b/navit/support/espeak/readclause.c new file mode 100644 index 0000000..b8d302a --- /dev/null +++ b/navit/support/espeak/readclause.c @@ -0,0 +1,2440 @@ +/*************************************************************************** + * Copyright (C) 2005 to 2007 by Jonathan Duddington * + * email: jonsd@users.sourceforge.net * + * * + * 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; either version 3 of the License, or * + * (at your option) any later version. * + * * + * 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 see: * + * . * + ***************************************************************************/ + +#include "StdAfx.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "speak_lib.h" +#include "speech.h" +#include "phoneme.h" +#include "synthesize.h" +#include "voice.h" +#include "translate.h" + +#ifdef PLATFORM_POSIX +#include +#endif + +#include +#define N_XML_BUF 256 + +#define double(x) ((double)(x)) +static const char *xmlbase = ""; // base URL from + +static int namedata_ix=0; +static int n_namedata = 0; +char *namedata = NULL; + + +static FILE *f_input = NULL; +static int ungot_char2 = 0; +unsigned char *p_textinput; +wchar_t *p_wchar_input; +static int ungot_char; +static const char *ungot_word = NULL; +static int end_of_input; + +static int ignore_text=0; // set during ... to ignore text which has been replaced by an alias +static int clear_skipping_text = 0; // next clause should clear the skipping_text flag +int count_characters = 0; +static int sayas_mode; +static int ssml_ignore_l_angle = 0; + +static const char *punct_stop = ".:!?"; // pitch fall if followed by space +static const char *punct_close = ")]}>;'\""; // always pitch fall unless followed by alnum + +// alter tone for announce punctuation or capitals +static const char *tone_punct_on = "\0016T"; // add reverberation, lower pitch +static const char *tone_punct_off = "\001T"; + +// punctuations symbols that can end a clause +static const unsigned short punct_chars[] = {',','.','?','!',':',';', + 0x2013, // en-dash + 0x2014, // em-dash + 0x2026, // elipsis + + 0x037e, // Greek question mark (looks like semicolon) + 0x0387, // Greek semicolon, ano teleia + 0x0964, // Devanagari Danda (fullstop) + + 0x0589, // Armenian period + 0x055d, // Armenian comma + 0x055c, // Armenian exclamation + 0x055e, // Armenian question + 0x055b, // Armenian emphasis mark + + 0x1362, // Ethiopic period + 0x1363, + 0x1364, + 0x1365, + 0x1366, + 0x1367, + 0x1368, + + 0x3001, // ideograph comma + 0x3002, // ideograph period + + 0xff01, // fullwidth exclamation + 0xff0c, // fullwidth comma + 0xff0e, // fullwidth period + 0xff1a, // fullwidth colon + 0xff1b, // fullwidth semicolon + 0xff1f, // fullwidth question mark + + 0}; + + +// indexed by (entry num. in punct_chars) + 1 +// bits 0-7 pause x 10mS, bits 12-14 intonation type, bit 15 don't need following space or bracket +static const unsigned int punct_attributes [] = { 0, + CLAUSE_COMMA, CLAUSE_PERIOD, CLAUSE_QUESTION, CLAUSE_EXCLAMATION, CLAUSE_COLON, CLAUSE_SEMICOLON, + CLAUSE_SEMICOLON, // en-dash + CLAUSE_SEMICOLON, // em-dash + CLAUSE_SEMICOLON, // elipsis + + CLAUSE_QUESTION, // Greek question mark + CLAUSE_SEMICOLON, // Greek semicolon + CLAUSE_PERIOD+0x8000, // Devanagari Danda (fullstop) + + CLAUSE_PERIOD+0x8000, // Armenian period + CLAUSE_COMMA, // Armenian comma + CLAUSE_EXCLAMATION + PUNCT_IN_WORD, // Armenian exclamation + CLAUSE_QUESTION + PUNCT_IN_WORD, // Armenian question + CLAUSE_PERIOD + PUNCT_IN_WORD, // Armenian emphasis mark + + CLAUSE_PERIOD, // Ethiopic period + CLAUSE_COMMA, // Ethiopic comma + CLAUSE_SEMICOLON, // Ethiopic semicolon + CLAUSE_COLON, // Ethiopic colon + CLAUSE_COLON, // Ethiopic preface colon + CLAUSE_QUESTION, // Ethiopic question mark + CLAUSE_PERIOD, // Ethiopic paragraph + + CLAUSE_COMMA+0x8000, // ideograph comma + CLAUSE_PERIOD+0x8000, // ideograph period + + CLAUSE_EXCLAMATION+0x8000, // fullwidth + CLAUSE_COMMA+0x8000, + CLAUSE_PERIOD+0x8000, + CLAUSE_COLON+0x8000, + CLAUSE_SEMICOLON+0x8000, + CLAUSE_QUESTION+0x8000, + + CLAUSE_SEMICOLON, // spare + 0 }; + + +// stack for language and voice properties +// frame 0 is for the defaults, before any ssml tags. +typedef struct { + int tag_type; + int voice_variant; + int voice_gender; + int voice_age; + char voice_name[40]; + char language[20]; +} SSML_STACK; + +#define N_SSML_STACK 20 +static int n_ssml_stack; +static SSML_STACK ssml_stack[N_SSML_STACK]; + +static char current_voice_id[40] = {0}; + + +#define N_PARAM_STACK 20 +static int n_param_stack; +PARAM_STACK param_stack[N_PARAM_STACK]; + +static int speech_parameters[N_SPEECH_PARAM]; // current values, from param_stack + +const int param_defaults[N_SPEECH_PARAM] = { + 0, // silence (internal use) + 170, // rate wpm + 100, // volume + 50, // pitch + 50, // range + 0, // punctuation + 0, // capital letters + 0, // wordgap + 0, // options + 0, // intonation + 0, + 0, + 0, // emphasis + 0, // line length + 0, // voice type +}; + + +#ifdef NEED_WCHAR_FUNCTIONS + +// additional Latin characters beyond the Latin1 character set +#define MAX_WALPHA 0x233 +// indexed by character - 0x100 +// 0=not alphabetic, 0xff=lower case, other=value to add to upper case to convert to lower case +static unsigned char walpha_tab[MAX_WALPHA-0xff] = { + 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, // 100 + 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, // 110 + 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, // 120 + 0xff,0xff, 1,0xff, 1,0xff, 1,0xff,0xff, 1,0xff, 1,0xff, 1,0xff, 1, // 130 + 0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff,0xff, 1,0xff, 1,0xff, 1,0xff, // 140 + 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, // 150 + 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, // 160 + 1,0xff, 1,0xff, 1,0xff, 1,0xff,0xff, 1,0xff, 1,0xff, 1,0xff,0xff, // 170 + 0xff, 210, 1,0xff, 1,0xff, 206, 1,0xff, 205, 205, 1,0xff,0xff, 79, 202, // 180 + 203, 1,0xff, 205, 207,0xff, 211, 209, 1,0xff,0xff,0xff, 211, 213,0xff, 214, // 190 + 1,0xff, 1,0xff, 1,0xff, 218, 1,0xff, 218,0xff,0xff, 1,0xff, 218, 1, // 1a0 + 0xff, 217, 217, 1,0xff, 1,0xff, 219, 1,0xff,0xff,0xff, 1,0xff,0xff,0xff, // 1b0 + 0xff,0xff,0xff,0xff, 2, 1,0xff, 2, 1,0xff, 2, 1,0xff, 1,0xff, 1, // 1c0 + 0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff,0xff, 1,0xff, // 1d0 + 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, // 1e0 + 0xff, 2, 1,0xff, 1,0xff,0xff,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, // 1f0 + 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, // 200 + 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, // 210 + 0xff, 0, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, 1,0xff, // 220 + 1,0xff, 1,0xff }; // 230 + +// use ctype.h functions for Latin1 (character < 0x100) +int iswalpha(int c) +{ + if(c < 0x100) + return(isalpha(c)); + if((c > 0x3040) && (c <= 0xa700)) + return(1); // japanese, chinese characters + if(c > MAX_WALPHA) + return(0); + return(walpha_tab[c-0x100]); +} + +int iswdigit(int c) +{ + if(c < 0x100) + return(isdigit(c)); + return(0); +} + +int iswalnum(int c) +{ + if(iswdigit(c)) + return(1); + return(iswalpha(c)); +} + +int towlower(int c) +{ + int x; + if(c < 0x100) + return(tolower(c)); + if((c > MAX_WALPHA) || ((x = walpha_tab[c-0x100])==0xff)) + return(c); // already lower case + return(c + x); // convert to lower case +} + +int towupper(int c) +{ + // check whether the previous character code is the upper-case equivalent of this character + if(tolower(c-1) == c) + return(c-1); // yes, use it + return(c); // no +} + +int iswupper(int c) +{ + int x; + if(c < 0x100) + return(isupper(c)); + if(((c > MAX_WALPHA) || (x = walpha_tab[c-0x100])==0) || (x == 0xff)) + return(0); + return(1); +} + +int iswlower(int c) +{ + if(c < 0x100) + return(islower(c)); + if((c > MAX_WALPHA) || (walpha_tab[c-0x100] != 0xff)) + return(0); + return(1); +} + +int iswspace(int c) +{ + if(c < 0x100) + return(isspace(c)); + return(0); +} + +int iswpunct(int c) +{ + if(c < 0x100) + return(ispunct(c)); + return(0); +} + +const wchar_t *wcschr(const wchar_t *str, int c) +{ + while(*str != 0) + { + if(*str == c) + return(str); + str++; + } + return(NULL); +} + +#ifndef WINCE +// wcslen() is provided by WINCE, but not the other wchar functions +const int wcslen(const wchar_t *str) +{ + int ix=0; + + while(*str != 0) + { + ix++; + } + return(ix); +} +#endif + +float wcstod(const wchar_t *str, wchar_t **tailptr) +{ + int ix; + char buf[80]; + while(isspace(*str)) str++; + for(ix=0; ix<80; ix++) + { + buf[ix] = str[ix]; + if(isspace(buf[ix])) + break; + } + *tailptr = (wchar_t *)&str[ix]; + return(atof(buf)); +} +#endif + +int towlower2(unsigned int c) +{ + // check for non-standard upper to lower case conversions + if(c == 'I') + { + if(translator->translator_name == L('t','r')) + { + c = 0x131; // I -> ı + } + } + return(towlower(c)); +} + +static void GetC_unget(int c) +{//========================== +// This is only called with UTF8 input, not wchar input + if(f_input != NULL) + ungetc(c,f_input); + else + { + p_textinput--; + *p_textinput = c; + end_of_input = 0; + } +} + +int Eof(void) +{//========== + if(ungot_char != 0) + return(0); + + if(f_input != 0) + return(feof(f_input)); + + return(end_of_input); +} + + +static int GetC_get(void) +{//====================== + unsigned int c; + unsigned int c2; + + if(f_input != NULL) + { + c = fgetc(f_input); + if(feof(f_input)) c = ' '; + + if(option_multibyte == espeakCHARS_16BIT) + { + c2 = fgetc(f_input); + if(feof(f_input)) c2 = 0; + c = c + (c2 << 8); + } + return(c); + } + + if(option_multibyte == espeakCHARS_WCHAR) + { + if(*p_wchar_input == 0) + { + end_of_input = 1; + return(0); + } + + if(!end_of_input) + return(*p_wchar_input++); + } + else + { + if(*p_textinput == 0) + { + end_of_input = 1; + return(0); + } + + if(!end_of_input) + { + if(option_multibyte == espeakCHARS_16BIT) + { + c = p_textinput[0] + (p_textinput[1] << 8); + p_textinput += 2; + return(c); + } + return(*p_textinput++ & 0xff); + } + } + return(0); +} + + +static int GetC(void) +{//================== +// Returns a unicode wide character +// Performs UTF8 checking and conversion + + int c; + int c1; + int c2; + int cbuf[4]; + int ix; + int n_bytes; + unsigned char m; + static int ungot2 = 0; + static const unsigned char mask[4] = {0xff,0x1f,0x0f,0x07}; + static const unsigned char mask2[4] = {0,0x80,0x20,0x30}; + + if((c1 = ungot_char) != 0) + { + ungot_char = 0; + return(c1); + } + + if(ungot2 != 0) + { + c1 = ungot2; + ungot2 = 0; + } + else + { + c1 = GetC_get(); + } + + if((option_multibyte == espeakCHARS_WCHAR) || (option_multibyte == espeakCHARS_16BIT)) + { + count_characters++; + return(c1); // wchar_t text + } + + if((option_multibyte < 2) && (c1 & 0x80)) + { + // multi-byte utf8 encoding, convert to unicode + n_bytes = 0; + + if(((c1 & 0xe0) == 0xc0) && ((c1 & 0x1e) != 0)) + n_bytes = 1; + else + if((c1 & 0xf0) == 0xe0) + n_bytes = 2; + else + if(((c1 & 0xf8) == 0xf0) && ((c1 & 0x0f) <= 4)) + n_bytes = 3; + + if((ix = n_bytes) > 0) + { + c = c1 & mask[ix]; + m = mask2[ix]; + while(ix > 0) + { + if((c2 = cbuf[ix] = GetC_get()) == 0) + { + if(option_multibyte==espeakCHARS_AUTO) + option_multibyte=espeakCHARS_8BIT; // change "auto" option to "no" + GetC_unget(' '); + break; + } + + if((c2 & 0xc0) != 0x80) + { + // This is not UTF8. Change to 8-bit characterset. + if((n_bytes == 2) && (ix == 1)) + ungot2 = cbuf[2]; + GetC_unget(c2); + break; + } + m = 0x80; + c = (c << 6) + (c2 & 0x3f); + ix--; + } + if(ix == 0) + { + count_characters++; + return(c); + } + } + // top-bit-set character is not utf8, drop through to 8bit charset case + if((option_multibyte==espeakCHARS_AUTO) && !Eof()) + option_multibyte=espeakCHARS_8BIT; // change "auto" option to "no" + } + + // 8 bit character set, convert to unicode if + count_characters++; + if(c1 >= 0xa0) + return(translator->charset_a0[c1-0xa0]); + return(c1); +} // end of GetC + + +static void UngetC(int c) +{//====================== + ungot_char = c; +} + + +static const char *WordToString2(unsigned int word) +{//================================================ +// Convert a language mnemonic word into a string + int ix; + static char buf[5]; + char *p; + + p = buf; + for(ix=3; ix>=0; ix--) + { + if((*p = word >> (ix*8)) != 0) + p++; + } + *p = 0; + return(buf); +} + + +static const char *LookupSpecial(Translator *tr, const char *string, char* text_out) +{//================================================================================= + unsigned int flags[2]; + char phonemes[55]; + char phonemes2[55]; + char *string1 = (char *)string; + + if(LookupDictList(tr,&string1,phonemes,flags,0,NULL)) + { + SetWordStress(tr, phonemes, &flags[0], -1, 0); + DecodePhonemes(phonemes,phonemes2); + sprintf(text_out,"[[%s]]",phonemes2); + option_phoneme_input |= 2; + return(text_out); + } + return(NULL); +} + + +static const char *LookupCharName(Translator *tr, int c) +{//===================================================== +// Find the phoneme string (in ascii) to speak the name of character c +// Used for punctuation characters and symbols + + int ix; + unsigned int flags[2]; + char single_letter[24]; + char phonemes[60]; + char phonemes2[60]; + const char *lang_name = NULL; + char *string; + static char buf[60]; + + buf[0] = 0; + flags[0] = 0; + flags[1] = 0; + single_letter[0] = 0; + single_letter[1] = '_'; + ix = utf8_out(c,&single_letter[2]); + single_letter[2+ix]=0; + + string = &single_letter[1]; + if(LookupDictList(tr, &string, phonemes, flags, 0, NULL) == 0) + { + // try _* then * + string = &single_letter[2]; + if(LookupDictList(tr, &string, phonemes, flags, 0, NULL) == 0) + { + // now try the rules + single_letter[1] = ' '; + TranslateRules(tr, &single_letter[2], phonemes, sizeof(phonemes), NULL,0,NULL); + } + } + + if((phonemes[0] == 0) && (tr->translator_name != L('e','n'))) + { + // not found, try English + SetTranslator2("en"); + string = &single_letter[1]; + single_letter[1] = '_'; + if(LookupDictList(translator2, &string, phonemes, flags, 0, NULL) == 0) + { + string = &single_letter[2]; + LookupDictList(translator2, &string, phonemes, flags, 0, NULL); + } + if(phonemes[0]) + { + lang_name = "en"; + } + else + { + SelectPhonemeTable(voice->phoneme_tab_ix); // revert to original phoneme table + } + } + + if(phonemes[0]) + { + if(lang_name) + { + SetWordStress(translator2, phonemes, &flags[0], -1, 0); + DecodePhonemes(phonemes,phonemes2); + sprintf(buf,"[[_^_%s %s _^_%s]]","en",phonemes2,WordToString2(tr->translator_name)); + SelectPhonemeTable(voice->phoneme_tab_ix); // revert to original phoneme table + } + else + { + SetWordStress(tr, phonemes, &flags[0], -1, 0); + DecodePhonemes(phonemes,phonemes2); + sprintf(buf,"[[%s]] ",phonemes2); + } + option_phoneme_input |= 2; + } + else + { + strcpy(buf,"[[(X1)(X1)(X1)]]"); + option_phoneme_input |= 2; + } + + return(buf); +} + +int Read4Bytes(FILE *f) +{//==================== +// Read 4 bytes (least significant first) into a word + int ix; + unsigned char c; + int acc=0; + + for(ix=0; ix<4; ix++) + { + c = fgetc(f) & 0xff; + acc += (c << (ix*8)); + } + return(acc); +} + + +static int LoadSoundFile(const char *fname, int index) +{//=================================================== + FILE *f; + char *p; + int *ip; + int length; + char fname_temp[100]; + char fname2[sizeof(path_home)+13+40]; + + if(fname == NULL) + { + // filename is already in the table + fname = soundicon_tab[index].filename; + } + + if(fname==NULL) + return(1); + + if(fname[0] != '/') + { + // a relative path, look in espeak-data/soundicons + sprintf(fname2,"%s%csoundicons%c%s",path_home,PATHSEP,PATHSEP,fname); + fname = fname2; + } + + f = NULL; +#ifdef PLATFORM_POSIX + if((f = fopen(fname,"rb")) != NULL) + { + int ix; + int fd_temp; + const char *resample; + int header[3]; + char command[sizeof(fname2)+sizeof(fname2)+40]; + + fseek(f,20,SEEK_SET); + for(ix=0; ix<3; ix++) + header[ix] = Read4Bytes(f); + + // if the sound file is not mono, 16 bit signed, at the correct sample rate, then convert it + if((header[0] != 0x10001) || (header[1] != samplerate) || (header[2] != samplerate*2)) + { + fclose(f); + f = NULL; + + if(header[2] == samplerate) + resample = ""; + else + resample = "polyphase"; + + strcpy(fname_temp,"/tmp/espeakXXXXXX"); + if((fd_temp = mkstemp(fname_temp)) >= 0) + { + close(fd_temp); +// sprintf(fname_temp,"%s.wav",tmpnam(NULL)); + sprintf(command,"sox \"%s\" -r %d -w -s -c1 %s %s\n", fname, samplerate, fname_temp, resample); + if(system(command) == 0) + { + fname = fname_temp; + } + } + } + } +#endif + + if(f == NULL) + { + f = fopen(fname,"rb"); + if(f == NULL) + { + fprintf(stderr,"Can't read temp file: %s\n",fname); + return(3); + } + } + + length = GetFileLength(fname); + fseek(f,0,SEEK_SET); + if((p = (char *)realloc(soundicon_tab[index].data, length)) == NULL) + { + fclose(f); + return(4); + } + fread(p,length,1,f); + fclose(f); +#if 0 + remove(fname_temp); +#endif + + ip = (int *)(&p[40]); + soundicon_tab[index].length = (*ip) / 2; // length in samples + soundicon_tab[index].data = p; + return(0); +} // end of LoadSoundFile + + +static int LookupSoundicon(int c) +{//============================== +// Find the sound icon number for a punctuation chatacter + int ix; + + for(ix=N_SOUNDICON_SLOTS; ix= N_SOUNDICON_SLOTS) + slot = 0; + + if(LoadSoundFile(fname, slot) != 0) + return(-1); + + soundicon_tab[slot].filename = (char *)realloc(soundicon_tab[ix].filename, strlen(fname)+1); + strcpy(soundicon_tab[slot].filename, fname); + return(slot); +} + + + +static int AnnouncePunctuation(Translator *tr, int c1, int c2, char *buf, int bufix) +{//================================================================================= + // announce punctuation names + // c1: the punctuation character + // c2: the following character + + int punct_count; + const char *punctname; + int found = 0; + int soundicon; + char *p; + + if((soundicon = LookupSoundicon(c1)) >= 0) + { + // add an embedded command to play the soundicon + sprintf(&buf[bufix],"\001%dI ",soundicon); + UngetC(c2); + found = 1; + } + else + if((punctname = LookupCharName(tr, c1)) != NULL) + { + found = 1; + if(bufix==0) + { + punct_count=1; + while(c2 == c1) + { + punct_count++; + c2 = GetC(); + } + UngetC(c2); + + p = &buf[bufix]; + if(punct_count==1) + { + sprintf(p,"%s %s %s",tone_punct_on,punctname,tone_punct_off); + } + else + if(punct_count < 4) + { + sprintf(p,"\001+10S%s",tone_punct_on); + while(punct_count-- > 0) + sprintf(buf,"%s %s",buf,punctname); + sprintf(p,"%s %s\001-10S",buf,tone_punct_off); + } + else + { + sprintf(p,"%s %s %d %s %s", + tone_punct_on,punctname,punct_count,punctname,tone_punct_off); + return(CLAUSE_COMMA); + } + } + else + { + // end the clause now and pick up the punctuation next time + UngetC(c2); + if(option_ssml) + { + if((c1 == '<') || (c1 == '&')) + ssml_ignore_l_angle = c1; // this was < which was converted to <, don't pick it up again as < + } + ungot_char2 = c1; + buf[bufix] = ' '; + buf[bufix+1] = 0; + } + } + + if(found == 0) + return(-1); + + if(c1 == '-') + return(CLAUSE_NONE); // no pause + if(bufix > 0) + return(CLAUSE_SHORTCOMMA); + if((strchr_w(punct_close,c1) != NULL) && !iswalnum(c2)) + return(CLAUSE_SHORTFALL+4); + if(iswspace(c2) && strchr_w(punct_stop,c1)!=NULL) + return(punct_attributes[lookupwchar(punct_chars,c1)]); + + return(CLAUSE_SHORTCOMMA); +} // end of AnnouncePunctuation + +#define SSML_SPEAK 1 +#define SSML_VOICE 2 +#define SSML_PROSODY 3 +#define SSML_SAYAS 4 +#define SSML_MARK 5 +#define SSML_SENTENCE 6 +#define SSML_PARAGRAPH 7 +#define SSML_PHONEME 8 +#define SSML_SUB 9 +#define SSML_STYLE 10 +#define SSML_AUDIO 11 +#define SSML_EMPHASIS 12 +#define SSML_BREAK 13 +#define SSML_IGNORE_TEXT 14 +#define HTML_BREAK 15 +#define SSML_CLOSE 0x10 // for a closing tag, OR this with the tag type + +// these tags have no effect if they are self-closing, eg. +static char ignore_if_self_closing[] = {0,1,1,1,1,0,0,0,0,1,1,0,1,0,1,0,0}; + + +static MNEM_TAB ssmltags[] = { + {"speak", SSML_SPEAK}, + {"voice", SSML_VOICE}, + {"prosody", SSML_PROSODY}, + {"say-as", SSML_SAYAS}, + {"mark", SSML_MARK}, + {"s", SSML_SENTENCE}, + {"p", SSML_PARAGRAPH}, + {"phoneme", SSML_PHONEME}, + {"sub", SSML_SUB}, + {"tts:style", SSML_STYLE}, + {"audio", SSML_AUDIO}, + {"emphasis", SSML_EMPHASIS}, + {"break", SSML_BREAK}, + {"metadata", SSML_IGNORE_TEXT}, + + {"br", HTML_BREAK}, + {"li", HTML_BREAK}, + {"img", HTML_BREAK}, + {"td", HTML_BREAK}, + {"h1", SSML_PARAGRAPH}, + {"h2", SSML_PARAGRAPH}, + {"h3", SSML_PARAGRAPH}, + {"h4", SSML_PARAGRAPH}, + {"hr", SSML_PARAGRAPH}, + {"script", SSML_IGNORE_TEXT}, + {"style", SSML_IGNORE_TEXT}, + {NULL,0}}; + + + + +static const char *VoiceFromStack() +{//================================ +// Use the voice properties from the SSML stack to choose a voice, and switch +// to that voice if it's not the current voice + int ix; + SSML_STACK *sp; + const char *v_id; + int voice_name_specified; + int voice_found; + espeak_VOICE voice_select; + char voice_name[40]; + char language[40]; + + strcpy(voice_name,ssml_stack[0].voice_name); + strcpy(language,ssml_stack[0].language); + voice_select.age = ssml_stack[0].voice_age; + voice_select.gender = ssml_stack[0].voice_gender; + voice_select.variant = ssml_stack[0].voice_variant; + voice_select.identifier = NULL; + + for(ix=0; ixvoice_name[0] != 0) && (SelectVoiceByName(NULL,sp->voice_name) != NULL)) + { + voice_name_specified = 1; + strcpy(voice_name, sp->voice_name); + language[0] = 0; + voice_select.gender = 0; + voice_select.age = 0; + voice_select.variant = 0; + } + if(sp->language[0] != 0) + { + strcpy(language, sp->language); + if(voice_name_specified == 0) + voice_name[0] = 0; // forget a previous voice name if a language is specified + } + if(sp->voice_gender != 0) + voice_select.gender = sp->voice_gender; + if(sp->voice_age != 0) + voice_select.age = sp->voice_age; + if(sp->voice_variant != 0) + voice_select.variant = sp->voice_variant; + } + + voice_select.name = voice_name; + voice_select.languages = language; + v_id = SelectVoice(&voice_select, &voice_found); + if(v_id == NULL) + return("default"); + return(v_id); +} // end of VoiceFromStack + + + +static void ProcessParamStack(char *outbuf, int *outix) +{//==================================================== +// Set the speech parameters from the parameter stack + int param; + int ix; + int value; + char buf[20]; + int new_parameters[N_SPEECH_PARAM]; + static char cmd_letter[N_SPEECH_PARAM] = {0, 'S','A','P','R', 0, 0, 0, 0, 0, 0, 0, 'F'}; // embedded command letters + + + for(param=0; param= 0) + new_parameters[param] = param_stack[ix].parameter[param]; + } + } + + for(param=0; paramtype = tag_type; + for(ix=0; ixparameter[ix] = -1; + } + return(sp); +} // end of PushParamStack + + +static void PopParamStack(int tag_type, char *outbuf, int *outix) +{//============================================================== + // unwind the stack up to and including the previous tag of this type + int ix; + int top = 0; + + if(tag_type >= SSML_CLOSE) + tag_type -= SSML_CLOSE; + + for(ix=0; ix 0) + { + n_param_stack = top; + } + ProcessParamStack(outbuf, outix); +} // end of PopParamStack + + + +static wchar_t *GetSsmlAttribute(wchar_t *pw, const char *name) +{//============================================================ +// Gets the value string for an attribute. +// Returns NULL if the attribute is not present + int ix; + static wchar_t empty[1] = {0}; + + while(*pw != 0) + { + if(iswspace(pw[-1])) + { + ix = 0; + while(*pw == name[ix]) + { + pw++; + ix++; + } + if(name[ix]==0) + { + // found the attribute, now get the value + while(iswspace(*pw)) pw++; + if(*pw == '=') pw++; + while(iswspace(*pw)) pw++; + if(*pw == '"') + return(pw+1); + else + return(empty); + } + } + pw++; + } + return(NULL); +} // end of GetSsmlAttribute + + +static int attrcmp(const wchar_t *string1, const char *string2) +{//============================================================ + int ix; + + if(string1 == NULL) + return(1); + + for(ix=0; (string1[ix] == string2[ix]) && (string1[ix] != 0); ix++) + { + } + if((string1[ix]=='"') && (string2[ix]==0)) + return(0); + return(1); +} + + +static int attrlookup(const wchar_t *string1, const MNEM_TAB *mtab) +{//================================================================ + int ix; + + for(ix=0; mtab[ix].mnem != NULL; ix++) + { + if(attrcmp(string1,mtab[ix].mnem) == 0) + return(mtab[ix].value); + } + return(mtab[ix].value); +} + + +static int attrnumber(const wchar_t *pw, int default_value, int type) +{//================================================================== + int value = 0; + + if((pw == NULL) || !isdigit(*pw)) + return(default_value); + + while(isdigit(*pw)) + { + value = value*10 + *pw++ - '0'; + } + if((type==1) && (towlower(*pw)=='s')) + { + // time: seconds rather than ms + value *= 1000; + } + return(value); +} // end of attrnumber + + + +static int attrcopy_utf8(char *buf, const wchar_t *pw, int len) +{//============================================================ +// Convert attribute string into utf8, write to buf, and return its utf8 length + unsigned int c; + int ix = 0; + int n; + int prev_c = 0; + + if(pw != NULL) + { + while((ix < (len-4)) && ((c = *pw++) != 0)) + { + if((c=='"') && (prev_c != '\\')) + break; // " indicates end of attribute, unless preceded by backstroke + n = utf8_out(c,&buf[ix]); + ix += n; + prev_c = c; + } + } + buf[ix] = 0; + return(ix); +} // end of attrcopy_utf8 + + + +static int attr_prosody_value(int param_type, const wchar_t *pw, int *value_out) +{//============================================================================= + int sign = 0; + wchar_t *tail; + float value; + + while(iswspace(*pw)) pw++; + if(*pw == '+') + { + pw++; + sign = 1; + } + if(*pw == '-') + { + pw++; + sign = -1; + } + value = (float)wcstod(pw,&tail); + if(tail == pw) + { + // failed to find a number, return 100% + *value_out = 100; + return(2); + } + + if(*tail == '%') + { + if(sign != 0) + value = 100 + (sign * value); + *value_out = (int)value; + return(2); // percentage + } + + if((tail[0]=='s') && (tail[1]=='t')) + { + double x; + // convert from semitones to a frequency percentage + x = pow(double(2.0),double((value*sign)/12)) * 100; + *value_out = (int)x; + return(2); // percentage + } + + if(param_type == espeakRATE) + { + *value_out = (int)(value * 100); + return(2); // percentage + } + + *value_out = (int)value; + return(sign); // -1, 0, or 1 +} // end of attr_prosody_value + + +int AddNameData(const char *name, int wide) +{//======================================== +// Add the name to the namedata and return its position +// (Used by the Windows SAPI wrapper) + int ix; + int len; + void *vp; + + if(wide) + { + len = (wcslen((const wchar_t *)name)+1)*sizeof(wchar_t); + n_namedata = (n_namedata + sizeof(wchar_t) - 1) % sizeof(wchar_t); // round to wchar_t boundary + } + else + { + len = strlen(name)+1; + } + + if(namedata_ix+len >= n_namedata) + { + // allocate more space for marker names + if((vp = realloc(namedata, namedata_ix+len + 300)) == NULL) + return(-1); // failed to allocate, original data is unchanged but ignore this new name + + namedata = (char *)vp; + n_namedata = namedata_ix+len + 300; + } + memcpy(&namedata[ix = namedata_ix],name,len); + namedata_ix += len; + return(ix); +} // end of AddNameData + + +void SetVoiceStack(espeak_VOICE *v) +{//================================ + SSML_STACK *sp; + sp = &ssml_stack[0]; + + if(v == NULL) + { + memset(sp,0,sizeof(ssml_stack[0])); + return; + } + if(v->languages != NULL) + strcpy(sp->language,v->languages); + if(v->name != NULL) + strcpy(sp->voice_name,v->name); + sp->voice_variant = v->variant; + sp->voice_age = v->age; + sp->voice_gender = v->gender; +} + + +static int GetVoiceAttributes(wchar_t *pw, int tag_type) +{//===================================================== +// Determines whether voice attribute are specified in this tag, and if so, whether this means +// a voice change. +// If it's a closing tag, delete the top frame of the stack and determine whether this implies +// a voice change. +// Returns CLAUSE_BIT_VOICE if there is a voice change + + wchar_t *lang; + wchar_t *gender; + wchar_t *name; + wchar_t *age; + wchar_t *variant; + const char *new_voice_id; + SSML_STACK *ssml_sp; + + static const MNEM_TAB mnem_gender[] = { + {"male", 1}, + {"female", 2}, + {"neutral", 3}, + {NULL, 0}}; + + if(tag_type & SSML_CLOSE) + { + // delete a stack frame + if(n_ssml_stack > 1) + { + n_ssml_stack--; + } + } + else + { + // add a stack frame if any voice details are specified + lang = GetSsmlAttribute(pw,"xml:lang"); + + if(tag_type != SSML_VOICE) + { + // only expect an xml:lang attribute + name = NULL; + variant = NULL; + age = NULL; + gender = NULL; + } + else + { + name = GetSsmlAttribute(pw,"name"); + variant = GetSsmlAttribute(pw,"variant"); + age = GetSsmlAttribute(pw,"age"); + gender = GetSsmlAttribute(pw,"gender"); + } + + if((tag_type != SSML_VOICE) && (lang==NULL)) + return(0); // or

without language spec, nothing to do + + ssml_sp = &ssml_stack[n_ssml_stack++]; + + attrcopy_utf8(ssml_sp->language,lang,sizeof(ssml_sp->language)); + attrcopy_utf8(ssml_sp->voice_name,name,sizeof(ssml_sp->voice_name)); + ssml_sp->voice_variant = attrnumber(variant,1,0)-1; + ssml_sp->voice_age = attrnumber(age,0,0); + ssml_sp->voice_gender = attrlookup(gender,mnem_gender); + ssml_sp->tag_type = tag_type; + } + + new_voice_id = VoiceFromStack(); + if(strcmp(new_voice_id,current_voice_id) != 0) + { + // add an embedded command to change the voice + strcpy(current_voice_id,new_voice_id); + return(CLAUSE_BIT_VOICE); // change of voice + } + + return(0); +} // end of GetVoiceAttributes + + +static void SetProsodyParameter(int param_type, wchar_t *attr1, PARAM_STACK *sp) +{//============================================================================= + int value; + int sign; + + static const MNEM_TAB mnem_volume[] = { + {"default",100}, + {"silent",0}, + {"x-soft",30}, + {"soft",65}, + {"medium",100}, + {"loud",150}, + {"x-loud",230}, + {NULL, -1}}; + + static const MNEM_TAB mnem_rate[] = { + {"default",100}, + {"x-slow",60}, + {"slow",80}, + {"medium",100}, + {"fast",120}, + {"x-fast",150}, + {NULL, -1}}; + + static const MNEM_TAB mnem_pitch[] = { + {"default",100}, + {"x-low",70}, + {"low",85}, + {"medium",100}, + {"high",110}, + {"x-high",120}, + {NULL, -1}}; + + static const MNEM_TAB mnem_range[] = { + {"default",100}, + {"x-low",20}, + {"low",50}, + {"medium",100}, + {"high",140}, + {"x-high",180}, + {NULL, -1}}; + + static const MNEM_TAB *mnem_tabs[5] = { + NULL, mnem_rate, mnem_volume, mnem_pitch, mnem_range }; + + + if((value = attrlookup(attr1,mnem_tabs[param_type])) >= 0) + { + // mnemonic specifies a value as a percentage of the base pitch/range/rate/volume + sp->parameter[param_type] = (param_stack[0].parameter[param_type] * value)/100; + } + else + { + sign = attr_prosody_value(param_type,attr1,&value); + + if(sign == 0) + sp->parameter[param_type] = value; // absolute value in Hz + else + if(sign == 2) + { + // change specified as percentage or in semitones + sp->parameter[param_type] = (speech_parameters[param_type] * value)/100; + } + else + { + // change specified as plus or minus Hz + sp->parameter[param_type] = speech_parameters[param_type] + (value*sign); + } + } +} // end of SetProsodyParemeter + + + +static int ProcessSsmlTag(wchar_t *xml_buf, char *outbuf, int *outix, int n_outbuf, int self_closing) +{//================================================================================================== +// xml_buf is the tag and attributes with a zero terminator in place of the original '>' +// returns a clause terminator value. + + unsigned int ix; + int index; + int c; + int tag_type; + int value; + int value2; + int value3; + int voice_change_flag; + wchar_t *px; + wchar_t *attr1; + wchar_t *attr2; + wchar_t *attr3; + int terminator; + char *uri; + int param_type; + char tag_name[40]; + char buf[80]; + PARAM_STACK *sp; + SSML_STACK *ssml_sp; + + static const MNEM_TAB mnem_punct[] = { + {"none", 1}, + {"all", 2}, + {"some", 3}, + {NULL, -1}}; + + static const MNEM_TAB mnem_capitals[] = { + {"no", 0}, + {"spelling", 2}, + {"icon", 1}, + {"pitch", 20}, // this is the amount by which to raise the pitch + {NULL, -1}}; + + static const MNEM_TAB mnem_interpret_as[] = { + {"characters",SAYAS_CHARS}, + {"tts:char",SAYAS_SINGLE_CHARS}, + {"tts:key",SAYAS_KEY}, + {"tts:digits",SAYAS_DIGITS}, + {"telephone",SAYAS_DIGITS1}, + {NULL, -1}}; + + static const MNEM_TAB mnem_sayas_format[] = { + {"glyphs",1}, + {NULL, -1}}; + + static const MNEM_TAB mnem_break[] = { + {"none",0}, + {"x-weak",1}, + {"weak",2}, + {"medium",3}, + {"strong",4}, + {"x-strong",5}, + {NULL,-1}}; + + static const MNEM_TAB mnem_emphasis[] = { + {"none",1}, + {"reduced",2}, + {"moderate",3}, + {"strong",4}, + {NULL,-1}}; + + static const char *prosody_attr[5] = { + NULL, "rate", "volume", "pitch", "range" }; + + for(ix=0; ix<(sizeof(tag_name)-1); ix++) + { + if(((c = xml_buf[ix]) == 0) || iswspace(c)) + break; + tag_name[ix] = tolower((char)c); + } + tag_name[ix] = 0; + + px = &xml_buf[ix]; // the tag's attributes + + if(tag_name[0] == '/') + { + tag_type = LookupMnem(ssmltags,&tag_name[1]) + SSML_CLOSE; // closing tag + } + else + { + tag_type = LookupMnem(ssmltags,tag_name); + + if(self_closing && ignore_if_self_closing[tag_type]) + return(0); + } + + voice_change_flag = 0; + terminator = CLAUSE_NONE; + ssml_sp = &ssml_stack[n_ssml_stack-1]; + + switch(tag_type) + { + case SSML_STYLE: + sp = PushParamStack(tag_type); + attr1 = GetSsmlAttribute(px,"field"); + attr2 = GetSsmlAttribute(px,"mode"); + + + if(attrcmp(attr1,"punctuation")==0) + { + value = attrlookup(attr2,mnem_punct); + sp->parameter[espeakPUNCTUATION] = value; + } + else + if(attrcmp(attr1,"capital_letters")==0) + { + value = attrlookup(attr2,mnem_capitals); + sp->parameter[espeakCAPITALS] = value; + } + ProcessParamStack(outbuf, outix); + break; + + case SSML_PROSODY: + sp = PushParamStack(tag_type); + + // look for attributes: rate, volume, pitch, range + for(param_type=espeakRATE; param_type <= espeakRANGE; param_type++) + { + if((attr1 = GetSsmlAttribute(px,prosody_attr[param_type])) != NULL) + { + SetProsodyParameter(param_type, attr1, sp); + } + } + + ProcessParamStack(outbuf, outix); + break; + + case SSML_EMPHASIS: + sp = PushParamStack(tag_type); + value = 3; // default is "moderate" + if((attr1 = GetSsmlAttribute(px,"level")) != NULL) + { + value = attrlookup(attr1,mnem_emphasis); + } + + if(translator->langopts.tone_language == 1) + { + static unsigned char emphasis_to_pitch_range[] = {50,50,40,70,90,90}; + static unsigned char emphasis_to_volume[] = {100,100,70,110,140,140}; + // tone language (eg.Chinese) do emphasis by increasing the pitch range. + sp->parameter[espeakRANGE] = emphasis_to_pitch_range[value]; + sp->parameter[espeakVOLUME] = emphasis_to_volume[value]; + } + else + { + sp->parameter[espeakEMPHASIS] = value; + } + ProcessParamStack(outbuf, outix); + break; + + case SSML_STYLE + SSML_CLOSE: + case SSML_PROSODY + SSML_CLOSE: + case SSML_EMPHASIS + SSML_CLOSE: + PopParamStack(tag_type, outbuf, outix); + break; + + case SSML_SAYAS: + attr1 = GetSsmlAttribute(px,"interpret-as"); + attr2 = GetSsmlAttribute(px,"format"); + attr3 = GetSsmlAttribute(px,"detail"); + value = attrlookup(attr1,mnem_interpret_as); + value2 = attrlookup(attr2,mnem_sayas_format); + if(value2 == 1) + value = SAYAS_GLYPHS; + + value3 = attrnumber(attr3,0,0); + + if(value == SAYAS_DIGITS) + { + if(value3 <= 1) + value = SAYAS_DIGITS1; + else + value = SAYAS_DIGITS + value3; + } + + sprintf(buf,"%c%dY",CTRL_EMBEDDED,value); + strcpy(&outbuf[*outix],buf); + (*outix) += strlen(buf); + + sayas_mode = value; // punctuation doesn't end clause during SAY-AS + break; + + case SSML_SAYAS + SSML_CLOSE: + outbuf[(*outix)++] = CTRL_EMBEDDED; + outbuf[(*outix)++] = 'Y'; + sayas_mode = 0; + break; + + case SSML_SUB: + if((attr1 = GetSsmlAttribute(px,"alias")) != NULL) + { + // use the alias rather than the text + ignore_text = 1; + (*outix) += attrcopy_utf8(&outbuf[*outix],attr1,n_outbuf-*outix); + } + break; + + case SSML_IGNORE_TEXT: + ignore_text = 1; + break; + + case SSML_SUB + SSML_CLOSE: + case SSML_IGNORE_TEXT + SSML_CLOSE: + ignore_text = 0; + break; + + case SSML_MARK: + if((attr1 = GetSsmlAttribute(px,"name")) != NULL) + { + // add name to circular buffer of marker names + attrcopy_utf8(buf,attr1,sizeof(buf)); + + if(strcmp(skip_marker,buf)==0) + { + // This is the marker we are waiting for before starting to speak + clear_skipping_text = 1; + skip_marker[0] = 0; + return(CLAUSE_NONE); + } + + if((index = AddNameData(buf,0)) >= 0) + { + sprintf(buf,"%c%dM",CTRL_EMBEDDED,index); + strcpy(&outbuf[*outix],buf); + (*outix) += strlen(buf); + } + } + break; + + case SSML_AUDIO: + sp = PushParamStack(tag_type); + + if((attr1 = GetSsmlAttribute(px,"src")) != NULL) + { + char fname[256]; + attrcopy_utf8(buf,attr1,sizeof(buf)); + + if(uri_callback == NULL) + { + if((xmlbase != NULL) && (buf[0] != '/')) + { + sprintf(fname,"%s/%s",xmlbase,buf); + index = LoadSoundFile2(fname); + } + else + { + index = LoadSoundFile2(buf); + } + if(index >= 0) + { + sprintf(buf,"%c%dI",CTRL_EMBEDDED,index); + strcpy(&outbuf[*outix],buf); + (*outix) += strlen(buf); + sp->parameter[espeakSILENCE] = 1; + } + } + else + { + if((index = AddNameData(buf,0)) >= 0) + { + uri = &namedata[index]; + if(uri_callback(1,uri,xmlbase) == 0) + { + sprintf(buf,"%c%dU",CTRL_EMBEDDED,index); + strcpy(&outbuf[*outix],buf); + (*outix) += strlen(buf); + sp->parameter[espeakSILENCE] = 1; + } + } + } + } + ProcessParamStack(outbuf, outix); + + if(self_closing) + PopParamStack(tag_type, outbuf, outix); + return(CLAUSE_NONE); + + case SSML_AUDIO + SSML_CLOSE: + PopParamStack(tag_type, outbuf, outix); + return(CLAUSE_NONE); + + case SSML_BREAK: + value = 21; + terminator = CLAUSE_NONE; + + if((attr1 = GetSsmlAttribute(px,"strength")) != NULL) + { + static int break_value[6] = {0,7,14,21,40,80}; // *10mS + value = attrlookup(attr1,mnem_break); + if(value < 3) + { + // adjust prepause on the following word + sprintf(&outbuf[*outix],"%c%dB",CTRL_EMBEDDED,value); + (*outix) += 3; + terminator = 0; + } + value = break_value[value]; + } + if((attr2 = GetSsmlAttribute(px,"time")) != NULL) + { + value = (attrnumber(attr2,0,1) * 25) / speed.speed_factor1; // compensate for speaking speed to keep constant pause length + + if(terminator == 0) + terminator = CLAUSE_NONE; + } + if(terminator) + { + if(value > 0xfff) + value = 0xfff; + return(terminator + value); + } + break; + + case SSML_SPEAK: + if((attr1 = GetSsmlAttribute(px,"xml:base")) != NULL) + { + attrcopy_utf8(buf,attr1,sizeof(buf)); + if((index = AddNameData(buf,0)) >= 0) + { + xmlbase = &namedata[index]; + } + } + if(GetVoiceAttributes(px, tag_type) == 0) + return(0); // no voice change + return(CLAUSE_VOICE); + + case SSML_VOICE: + if(GetVoiceAttributes(px, tag_type) == 0) + return(0); // no voice change + return(CLAUSE_VOICE); + + case SSML_SPEAK + SSML_CLOSE: + // unwind stack until the previous or tag + while((n_ssml_stack > 1) && (ssml_stack[n_ssml_stack-1].tag_type != SSML_SPEAK)) + { + n_ssml_stack--; + } + return(CLAUSE_PERIOD + GetVoiceAttributes(px, tag_type)); + + case SSML_VOICE + SSML_CLOSE: + // unwind stack until the previous or tag + while((n_ssml_stack > 1) && (ssml_stack[n_ssml_stack-1].tag_type != SSML_VOICE)) + { + n_ssml_stack--; + } + +terminator=0; // ?? Sentence intonation, but no pause ?? + return(terminator + GetVoiceAttributes(px, tag_type)); + + case HTML_BREAK: + case HTML_BREAK + SSML_CLOSE: + return(CLAUSE_COLON); + + case SSML_SENTENCE: + if(ssml_sp->tag_type == SSML_SENTENCE) + { + // new sentence implies end-of-sentence + voice_change_flag = GetVoiceAttributes(px, SSML_SENTENCE+SSML_CLOSE); + } + voice_change_flag |= GetVoiceAttributes(px, tag_type); + return(CLAUSE_PARAGRAPH + voice_change_flag); + + + case SSML_PARAGRAPH: + if(ssml_sp->tag_type == SSML_SENTENCE) + { + // new paragraph implies end-of-sentence or end-of-paragraph + voice_change_flag = GetVoiceAttributes(px, SSML_SENTENCE+SSML_CLOSE); + } + if(ssml_sp->tag_type == SSML_PARAGRAPH) + { + // new paragraph implies end-of-sentence or end-of-paragraph + voice_change_flag |= GetVoiceAttributes(px, SSML_PARAGRAPH+SSML_CLOSE); + } + voice_change_flag |= GetVoiceAttributes(px, tag_type); + return(CLAUSE_PARAGRAPH + voice_change_flag); + + + case SSML_SENTENCE + SSML_CLOSE: + if(ssml_sp->tag_type == SSML_SENTENCE) + { + // end of a sentence which specified a language + voice_change_flag = GetVoiceAttributes(px, tag_type); + } + return(CLAUSE_PERIOD + voice_change_flag); + + + case SSML_PARAGRAPH + SSML_CLOSE: + if((ssml_sp->tag_type == SSML_SENTENCE) || (ssml_sp->tag_type == SSML_PARAGRAPH)) + { + // End of a paragraph which specified a language. + // (End-of-paragraph also implies end-of-sentence) + return(GetVoiceAttributes(px, tag_type) + CLAUSE_PARAGRAPH); + } + return(CLAUSE_PARAGRAPH); + } + return(0); +} // end of ProcessSsmlTag + + +static MNEM_TAB xml_char_mnemonics[] = { + {"gt",'>'}, + {"lt",'<'}, + {"amp", '&'}, + {"quot", '"'}, + {"nbsp", ' '}, + {"apos", '\''}, + {NULL,-1}}; + + +int ReadClause(Translator *tr, FILE *f_in, char *buf, short *charix, int *charix_top, int n_buf, int *tone_type) +{//============================================================================================================= +/* Find the end of the current clause. + Write the clause into buf + + returns: clause type (bits 0-7: pause x10mS, bits 8-11 intonation type) + + Also checks for blank line (paragraph) as end-of-clause indicator. + + Does not end clause for: + punctuation immediately followed by alphanumeric eg. 1.23 !Speak :path + repeated punctuation, eg. ... !!! +*/ + int c1=' '; // current character + int c2; // next character + int cprev=' '; // previous character + int parag; + int ix = 0; + int j; + int nl_count; + int linelength = 0; + int phoneme_mode = 0; + int n_xml_buf; + int terminator; + int punct; + int found; + int any_alnum = 0; + int self_closing; + int punct_data; + int stressed_word = 0; + const char *p; + wchar_t xml_buf[N_XML_BUF+1]; + +#define N_XML_BUF2 20 + char xml_buf2[N_XML_BUF2+2]; // for & and & sequences + static char ungot_string[N_XML_BUF2+4]; + static int ungot_string_ix = -1; + + if(clear_skipping_text) + { + skipping_text = 0; + clear_skipping_text = 0; + } + + tr->clause_upper_count = 0; + tr->clause_lower_count = 0; + end_of_input = 0; + *tone_type = 0; + +f_input = f_in; // for GetC etc + + if(ungot_word != NULL) + { + strcpy(buf,ungot_word); + ix += strlen(ungot_word); + ungot_word = NULL; + } + + if(ungot_char2 != 0) + { + c2 = ungot_char2; + } + else + { + c2 = GetC(); + } + + while(!Eof() || (ungot_char != 0) || (ungot_char2 != 0) || (ungot_string_ix >= 0)) + { + if(!iswalnum(c1)) + { + if((end_character_position > 0) && (count_characters > end_character_position)) + { + end_of_input = 1; + return(CLAUSE_EOF); + } + + if((skip_characters > 0) && (count_characters > skip_characters)) + { + // reached the specified start position + // don't break a word + clear_skipping_text = 1; + skip_characters = 0; + UngetC(c2); + return(CLAUSE_NONE); + } + } + + cprev = c1; + c1 = c2; + + if(ungot_string_ix >= 0) + { + if(ungot_string[ungot_string_ix] == 0) + ungot_string_ix = -1; + } + + if((ungot_string_ix == 0) && (ungot_char2 == 0)) + { + c1 = ungot_string[ungot_string_ix++]; + } + if(ungot_string_ix >= 0) + { + c2 = ungot_string[ungot_string_ix++]; + } + else + { + c2 = GetC(); + + if(Eof()) + { + c2 = ' '; + } + } + ungot_char2 = 0; + + if((option_ssml) && (phoneme_mode==0)) + { + if((ssml_ignore_l_angle != '&') && (c1 == '&') && ((c2=='#') || ((c2 >= 'a') && (c2 <= 'z')))) + { + n_xml_buf = 0; + c1 = c2; + while(!Eof() && (iswalnum(c1) || (c1=='#')) && (n_xml_buf < N_XML_BUF2)) + { + xml_buf2[n_xml_buf++] = c1; + c1 = GetC(); + } + xml_buf2[n_xml_buf] = 0; + c2 = GetC(); + sprintf(ungot_string,"%s%c%c",&xml_buf2[0],c1,c2); + + if(c1 == ';') + { + if(xml_buf2[0] == '#') + { + // character code number + if(xml_buf2[1] == 'x') + found = sscanf(&xml_buf2[2],"%x",(unsigned int *)(&c1)); + else + found = sscanf(&xml_buf2[1],"%d",&c1); + } + else + { + if((found = LookupMnem(xml_char_mnemonics,xml_buf2)) != -1) + { + c1 = found; + if(c2 == 0) + c2 = ' '; + } + } + } + else + { + found = -1; + } + + if(found <= 0) + { + ungot_string_ix = 0; + c1 = '&'; + c2 = ' '; + } + + if((c1 <= 0x20) && ((sayas_mode == SAYAS_SINGLE_CHARS) || (sayas_mode == SAYAS_KEY))) + { + c1 += 0xe000; // move into unicode private usage area + } + } + else + if((c1 == '<') && (ssml_ignore_l_angle != '<')) + { + if(c2 == '!') + { + // a comment, ignore until closing '<' + while(!Eof() && (c1 != '>')) + { + c1 = GetC(); + } + c2 = ' '; + } + else + if((c2 == '/') || iswalpha(c2)) + { + // SSML Tag + n_xml_buf = 0; + c1 = c2; + while(!Eof() && (c1 != '>') && (n_xml_buf < N_XML_BUF)) + { + xml_buf[n_xml_buf++] = c1; + c1 = GetC(); + } + xml_buf[n_xml_buf] = 0; + c2 = ' '; + + buf[ix++] = ' '; + + self_closing = 0; + if(xml_buf[n_xml_buf-1] == '/') + { + // a self-closing tag + xml_buf[n_xml_buf-1] = ' '; + self_closing = 1; + } + + terminator = ProcessSsmlTag(xml_buf,buf,ix,n_buf,self_closing); + + if(terminator != 0) + { + buf[ix] = ' '; + buf[ix++] = 0; + + if(terminator & CLAUSE_BIT_VOICE) + { + // a change in voice, write the new voice name to the end of the buf + p = current_voice_id; + while((*p != 0) && (ix < (n_buf-1))) + { + buf[ix++] = *p++; + } + buf[ix++] = 0; + } + return(terminator); + } + continue; + } + } + } + ssml_ignore_l_angle=0; + + if(ignore_text) + continue; + + if((c2=='\n') && (option_linelength == -1)) + { + // single-line mode, return immediately on NL + if((punct = lookupwchar(punct_chars,c1)) == 0) + { + charix[ix] = count_characters - clause_start_char; + *charix_top = ix; + ix += utf8_out(c1,&buf[ix]); + terminator = CLAUSE_PERIOD; // line doesn't end in punctuation, assume period + } + else + { + terminator = punct_attributes[punct]; + } + buf[ix] = ' '; + buf[ix+1] = 0; + return(terminator); + } + + if((c1 == CTRL_EMBEDDED) || (c1 == ctrl_embedded)) + { + // an embedded command. If it's a voice change, end the clause + if(c2 == 'V') + { + buf[ix++] = 0; // end the clause at this point + while(!iswspace(c1 = GetC()) && !Eof() && (ix < (n_buf-1))) + buf[ix++] = c1; // add voice name to end of buffer, after the text + buf[ix++] = 0; + return(CLAUSE_VOICE); + } + else + if(c2 == 'B') + { + // set the punctuation option from an embedded command + // B0 B1 B + strcpy(&buf[ix]," "); + ix += 3; + + if((c2 = GetC()) == '0') + option_punctuation = 0; + else + { + option_punctuation = 1; + option_punctlist[0] = 0; + if(c2 != '1') + { + // a list of punctuation characters to be spoken, terminated by space + j = 0; + while(!iswspace(c2) && !Eof()) + { + option_punctlist[j++] = c2; + c2 = GetC(); + buf[ix++] = ' '; + } + option_punctlist[j] = 0; // terminate punctuation list + option_punctuation = 2; + } + } + c2 = GetC(); + continue; + } + } + + linelength++; + + if(iswalnum(c1)) + any_alnum = 1; + else + { + if(stressed_word) + { + stressed_word = 0; + c1 = CHAR_EMPHASIS; // indicate this word is stressed + UngetC(c2); + c2 = ' '; + } + + if(iswspace(c1)) + { + char *p_word; + + if(tr->translator_name == 0x6a626f) + { + // language jbo : lojban + // treat "i" or ".i" as end-of-sentence + p_word = &buf[ix-1]; + if(p_word[0] == 'i') + { + if(p_word[-1] == '.') + p_word--; + if(p_word[-1] == ' ') + { + ungot_word = "i "; + UngetC(c2); + p_word[0] = 0; + return(CLAUSE_PERIOD); + } + } + } + } + } + + if(iswupper(c1)) + { + tr->clause_upper_count++; + if((option_capitals == 2) && (sayas_mode == 0) && !iswupper(cprev)) + { + char text_buf[40]; + char text_buf2[30]; + if(LookupSpecial(tr, "_cap", text_buf2) != NULL) + { + sprintf(text_buf,"%s%s%s",tone_punct_on,text_buf2,tone_punct_off); + j = strlen(text_buf); + if((ix + j) < n_buf) + { + strcpy(&buf[ix],text_buf); + ix += j; + } + } + } + } + else + if(iswalpha(c1)) + tr->clause_lower_count++; + + if(option_phoneme_input) + { + if(phoneme_mode > 0) + phoneme_mode--; + else + if((c1 == '[') && (c2 == '[')) + phoneme_mode = -1; // input is phoneme mnemonics, so don't look for punctuation + else + if((c1 == ']') && (c2 == ']')) + phoneme_mode = 2; // set phoneme_mode to zero after the next two characters + } + + if(c1 == '\n') + { + parag = 0; + + // count consecutive newlines, ignoring other spaces + while(!Eof() && iswspace(c2)) + { + if(c2 == '\n') + parag++; + c2 = GetC(); + } + if(parag > 0) + { + // 2nd newline, assume paragraph + UngetC(c2); + + buf[ix] = ' '; + buf[ix+1] = 0; + if(parag > 3) + parag = 3; +if(option_ssml) parag=1; + return((CLAUSE_PARAGRAPH-30) + 30*parag); // several blank lines, longer pause + } + + if(linelength <= option_linelength) + { + // treat lines shorter than a specified length as end-of-clause + UngetC(c2); + buf[ix] = ' '; + buf[ix+1] = 0; + return(CLAUSE_COLON); + } + + linelength = 0; + } + + if(option_punctuation && (phoneme_mode==0) && (sayas_mode==0) && iswpunct(c1)) + { + // option is set to explicitly speak punctuation characters + // if a list of allowed punctuation has been set up, check whether the character is in it + if((option_punctuation == 1) || (wcschr(option_punctlist,c1) != NULL)) + { + if((terminator = AnnouncePunctuation(tr, c1, c2, buf, ix)) >= 0) + return(terminator); + } + } + + if((phoneme_mode==0) && (sayas_mode==0) && ((punct = lookupwchar(punct_chars,c1)) != 0)) + { + punct_data = punct_attributes[punct]; + + if(punct_data & PUNCT_IN_WORD) + { + // Armenian punctuation inside a word + stressed_word = 1; + *tone_type = punct_data >> 12 & 0xf; // override the end-of-sentence type + continue; + } + + if((iswspace(c2) || (punct_data & 0x8000) || IsBracket(c2) || (c2=='?') || (c2=='-') || Eof())) + { + // note: (c2='?') is for when a smart-quote has been replaced by '?' + buf[ix] = ' '; + buf[ix+1] = 0; + + if((c1 == '.') && (cprev == '.')) + { + c1 = 0x2026; + punct = 9; // elipsis + } + + nl_count = 0; + while(!Eof() && iswspace(c2)) + { + if(c2 == '\n') + nl_count++; + c2 = GetC(); // skip past space(s) + } + if(!Eof()) + { + UngetC(c2); + } + + if((nl_count==0) && (c1 == '.')) + { + if(iswdigit(cprev) && (tr->langopts.numbers & 0x10000) && islower(c2)) + { + // dot after a number indicates an ordinal number + c2 = '.'; + continue; + } + if(iswlower(c2)) + { + c2 = ' '; + continue; // next word has no capital letter, this dot is probably from an abbreviation + } + if(any_alnum==0) + { + c2 = ' '; // no letters or digits yet, so probably not a sentence terminator + continue; + } + } + + punct_data = punct_attributes[punct]; + if(nl_count > 1) + { + if((punct_data == CLAUSE_QUESTION) || (punct_data == CLAUSE_EXCLAMATION)) + return(punct_data + 35); // with a longer pause + return(CLAUSE_PARAGRAPH); + } + return(punct_data); // only recognise punctuation if followed by a blank or bracket/quote + } + } + + if(speech_parameters[espeakSILENCE]==1) + continue; + + j = ix+1; + ix += utf8_out(c1,&buf[ix]); // buf[ix++] = c1; + if(!iswspace(c1) && !IsBracket(c1)) + { + charix[ix] = count_characters - clause_start_char; + while(j < ix) + charix[j++] = -1; // subsequent bytes of a multibyte character + } + *charix_top = ix; + + if(((ix > (n_buf-20)) && !IsAlpha(c1) && !iswdigit(c1)) || (ix >= (n_buf-2))) + { + // clause too long, getting near end of buffer, so break here + // try to break at a word boundary (unless we actually reach the end of buffer). + buf[ix] = ' '; + buf[ix+1] = 0; + UngetC(c2); + return(CLAUSE_NONE); + } + } + + if(stressed_word) + { + ix += utf8_out(CHAR_EMPHASIS, &buf[ix]); + } + buf[ix] = ' '; + buf[ix+1] = 0; + return(CLAUSE_EOF); // end of file +} // end of ReadClause + + +void InitNamedata(void) +{//==================== + namedata_ix = 0; + if(namedata != NULL) + { + free(namedata); + namedata = NULL; + n_namedata = 0; + } +} + + +void InitText2(void) +{//================= + int param; + + ungot_char = 0; + + n_ssml_stack =1; + n_param_stack = 1; + ssml_stack[0].tag_type = 0; + + for(param=0; param. * + ***************************************************************************/ + +#include "StdAfx.h" + +#include +#include +#include + +#include "speak_lib.h" +#include "speech.h" +#include "phoneme.h" +#include "synthesize.h" +#include "voice.h" +#include "translate.h" + +extern int GetAmplitude(void); + + +// convert from words-per-minute to internal speed factor +static unsigned char speed_lookup[290] = { + 250, 246, 243, 239, 236, // 80 + 233, 229, 226, 223, 220, // 85 + 217, 214, 211, 208, 205, // 90 + 202, 197, 194, 192, 190, // 95 + 187, 185, 183, 180, 178, // 100 + 176, 174, 172, 170, 168, // 105 + 166, 164, 161, 159, 158, // 110 + 156, 154, 152, 150, 148, // 115 + 146, 145, 143, 141, 137, // 120 + 136, 135, 133, 132, 131, // 125 + 129, 128, 127, 126, 125, // 130 + 124, 122, 121, 120, 119, // 135 + 117, 116, 115, 114, 113, // 140 + 112, 111, 110, 108, 107, // 145 + 106, 105, 104, 103, 102, // 150 + 101, 100, 99, 98, 97, // 155 + 96, 95, 93, 92, 92, // 160 + 91, 90, 89, 89, 88, // 165 + 87, 87, 86, 85, 85, // 170 + 84, 83, 83, 82, 81, // 175 + 80, 80, 79, 78, 78, // 180 + 77, 76, 76, 75, 73, // 185 + 72, 72, 71, 71, 70, // 190 + 70, 69, 69, 68, 67, // 195 + 67, 66, 66, 65, 65, // 200 + 64, 64, 63, 63, 62, // 205 + 62, 61, 60, 60, 59, // 210 + 59, 58, 58, 57, 57, // 215 + 56, 56, 55, 55, 55, // 220 + 54, 54, 53, 53, 52, // 225 + 52, 51, 51, 50, 50, // 230 + 49, 49, 49, 48, 48, // 235 + 47, 47, 46, 46, 46, // 240 + 45, 45, 44, 44, 43, // 245 + 43, 43, 42, 42, 41, // 250 + 41, 41, 40, 40, 39, // 255 + 39, 39, 38, 38, 38, // 260 + 37, 37, 37, 36, 36, // 265 + 35, 35, 35, 34, 34, // 270 + 34, 33, 33, 33, 32, // 275 + 32, 32, 32, 31, 31, // 280 + 31, 30, 30, 30, 29, // 285 + 29, 29, 29, 28, 28, // 290 + 28, 28, 27, 27, 27, // 295 + 26, 26, 26, 26, 25, // 300 + 25, 25, 22, 22, 22, // 305 + 22, 22, 22, 22, 22, // 310 + 21, 21, 21, 21, 21, // 315 + 21, 20, 20, 20, 20, // 320 + 20, 15, 15, 15, 15, // 325 + 15, 15, 15, 15, 16, // 330 + 16, 16, 16, 15, 15, // 335 + 15, 15, 15, 15, 15, // 340 + 15, 17, 17, 16, 16, // 345 + 15, 15, 14, 14, 13, // 350 + 13, 12, 12, 11, 11, // 355 + 10, 10, 9, 8, 8, // 360 + 7, 6, 5, 5, 4, // 365 +}; + +// speed_factor2 adjustments for speeds 370 to 390 +static unsigned char faster[] = { +114,112,110,109,107,105,104,102,100,98, // 370-379 +96,94,92,90,88,85,83,80,78,75,72 }; //380-390 + +static int speed1 = 130; +static int speed2 = 121; +static int speed3 = 118; + + + +void SetSpeed(int control) +{//======================= + int x; + int s1; + int wpm; + int wpm2; + + wpm = embedded_value[EMBED_S]; + if(control == 2) + wpm = embedded_value[EMBED_S2]; + wpm2 = wpm; + + if(wpm > 369) wpm = 369; + if(wpm < 80) wpm = 80; + + x = speed_lookup[wpm-80]; + + if(control & 1) + { + // set speed factors for different syllable positions within a word + // these are used in CalcLengths() + speed1 = (x * voice->speedf1)/256; + speed2 = (x * voice->speedf2)/256; + speed3 = (x * voice->speedf3)/256; + } + + if(control & 2) + { + // these are used in synthesis file + s1 = (x * voice->speedf1)/256; + speed.speed_factor1 = (256 * s1)/115; // full speed adjustment, used for pause length +if(speed.speed_factor1 < 15) + speed.speed_factor1 = 15; + if(wpm >= 170) +// speed_factor2 = 100 + (166*s1)/128; // reduced speed adjustment, used for playing recorded sounds + speed.speed_factor2 = 110 + (150*s1)/128; // reduced speed adjustment, used for playing recorded sounds + else + speed.speed_factor2 = 128 + (128*s1)/130; // = 215 at 170 wpm + + if(wpm2 > 369) + { + if(wpm2 > 390) + wpm2 = 390; + speed.speed_factor2 = faster[wpm2 - 370]; + } + } + + speed.min_sample_len = 450; + speed.speed_factor3 = 110; // controls the effect of FRFLAG_LEN_MOD reduce length change + + if(wpm2 >= 370) + { + // TESTING + // use experimental fast settings if they have been specified in the Voice + if(speed.fast_settings[0] > 0) + speed.speed_factor1 = speed.fast_settings[0]; + if(speed.fast_settings[1] > 0) + speed.speed_factor2 = speed.fast_settings[1]; + if(speed.fast_settings[2] > 0) + speed.speed_factor3 = speed.fast_settings[2]; + } +} // end of SetSpeed + + +#ifdef deleted +void SetAmplitude(int amp) +{//======================= + static unsigned char amplitude_factor[] = {0,5,6,7,9,11,14,17,21,26, 32, 38,44,50,56,63,70,77,84,91,100 }; + + if((amp >= 0) && (amp <= 20)) + { + option_amplitude = (amplitude_factor[amp] * 480)/256; + } +} +#endif + + + +void SetParameter(int parameter, int value, int relative) +{//====================================================== +// parameter: reset-all, amp, pitch, speed, linelength, expression, capitals, number grouping +// relative 0=absolute 1=relative + + int new_value = value; + int default_value; + + if(relative) + { + if(parameter < 5) + { + default_value = param_defaults[parameter]; + new_value = default_value + (default_value * value)/100; + } + } + param_stack[0].parameter[parameter] = new_value; + + switch(parameter) + { + case espeakRATE: + embedded_value[EMBED_S] = new_value; + embedded_value[EMBED_S2] = new_value; + SetSpeed(3); + break; + + case espeakVOLUME: + embedded_value[EMBED_A] = new_value; + GetAmplitude(); + break; + + case espeakPITCH: + if(new_value > 99) new_value = 99; + if(new_value < 0) new_value = 0; + embedded_value[EMBED_P] = new_value; + break; + + case espeakRANGE: + if(new_value > 99) new_value = 99; + embedded_value[EMBED_R] = new_value; + break; + + case espeakLINELENGTH: + option_linelength = new_value; + break; + + case espeakWORDGAP: + option_wordgap = new_value; + break; + + case espeakINTONATION: + if((new_value & 0xff) != 0) + translator->langopts.intonation_group = new_value & 0xff; + option_tone_flags = new_value; + break; + + default: + break; + } +} // end of SetParameter + + + +static void DoEmbedded2(int *embix) +{//================================ + // There were embedded commands in the text at this point + + unsigned int word; + + do { + word = embedded_list[(*embix)++]; + + if((word & 0x1f) == EMBED_S) + { + // speed + SetEmbedded(word & 0x7f, word >> 8); // adjusts embedded_value[EMBED_S] + SetSpeed(1); + } + } while((word & 0x80) == 0); +} + + +void CalcLengths(Translator *tr) +{//============================== + int ix; + int ix2; + PHONEME_LIST *prev; + PHONEME_LIST *next; + PHONEME_LIST *next2; + PHONEME_LIST *next3; + PHONEME_LIST *p; + PHONEME_LIST *p2; + + int stress; + int type; + static int more_syllables=0; + int pre_sonorant=0; + int pre_voiced=0; + int last_pitch = 0; + int pitch_start; + int length_mod; + int len; + int env2; + int end_of_clause; + int embedded_ix = 0; + int min_drop; + int emphasized; + int tone_mod; + unsigned char *pitch_env=NULL; + + for(ix=1; ixstresslevel & 0x7; + emphasized = p->stresslevel & 0x8; + + next = &phoneme_list[ix+1]; + + if(p->synthflags & SFLAG_EMBEDDED) + { + DoEmbedded2(&embedded_ix); + } + + type = p->type; + if(p->synthflags & SFLAG_SYLLABLE) + type = phVOWEL; + + switch(type) + { + case phPAUSE: + last_pitch = 0; + break; + + case phSTOP: + last_pitch = 0; + if(prev->type == phFRICATIVE) + p->prepause = 20; + else + if((more_syllables > 0) || (stress < 4)) + p->prepause = 40; + else + p->prepause = 60; + + if(prev->type == phSTOP) + p->prepause = 60; + + if((tr->langopts.word_gap & 0x10) && (p->newword)) + p->prepause = 60; + + if(p->ph->phflags & phLENGTHENSTOP) + p->prepause += 30; + + if(p->synthflags & SFLAG_LENGTHEN) + p->prepause += tr->langopts.long_stop; + break; + + case phVFRICATIVE: + if(next->type==phVOWEL) + { + pre_voiced = 1; + } // drop through + case phFRICATIVE: + if(p->newword) + p->prepause = 15; + + if(next->type==phPAUSE && prev->type==phNASAL && !(p->ph->phflags&phFORTIS)) + p->prepause = 25; + + if(prev->ph->phflags & phBRKAFTER) + p->prepause = 30; + + if((p->ph->phflags & phSIBILANT) && next->type==phSTOP && !next->newword) + { + if(prev->type == phVOWEL) + p->length = 200; // ?? should do this if it's from a prefix + else + p->length = 150; + } + else + p->length = 256; + + if((tr->langopts.word_gap & 0x10) && (p->newword)) + p->prepause = 30; + + break; + + case phVSTOP: + if(prev->type==phVFRICATIVE || prev->type==phFRICATIVE || (prev->ph->phflags & phSIBILANT) || (prev->type == phLIQUID)) + p->prepause = 30; + + if(next->type==phVOWEL || next->type==phLIQUID) + { + if((next->type==phVOWEL) || !next->newword) + pre_voiced = 1; + + p->prepause = 40; + + if((prev->type == phPAUSE) || (prev->type == phVOWEL)) // || (prev->ph->mnemonic == ('/'*256+'r'))) + p->prepause = 0; + else + if(p->newword==0) + { + if(prev->type==phLIQUID) + p->prepause = 20; + if(prev->type==phNASAL) + p->prepause = 12; + + if(prev->type==phSTOP && !(prev->ph->phflags & phFORTIS)) + p->prepause = 0; + } + } + if((tr->langopts.word_gap & 0x10) && (p->newword) && (p->prepause < 20)) + p->prepause = 20; + + break; + + case phLIQUID: + case phNASAL: + p->amp = tr->stress_amps[1]; // unless changed later + p->length = 256; // TEMPORARY + min_drop = 0; + + if(p->newword) + { + if(prev->type==phLIQUID) + p->prepause = 25; + if(prev->type==phVOWEL) + p->prepause = 12; + } + + if(next->type==phVOWEL) + { + pre_sonorant = 1; + } + else + if((prev->type==phVOWEL) || (prev->type == phLIQUID)) + { + p->length = prev->length; + p->pitch2 = last_pitch; + if(p->pitch2 < 7) + p->pitch2 = 7; + p->pitch1 = p->pitch2 - 8; + p->env = PITCHfall; + pre_voiced = 0; + + if(p->type == phLIQUID) + { + p->length = speed1; +//p->pitch1 = p->pitch2 - 20; // post vocalic [r/] + } + + if(next->type == phVSTOP) + { + p->length = (p->length * 160)/100; + } + if(next->type == phVFRICATIVE) + { + p->length = (p->length * 120)/100; + } + } + else + { + p->pitch2 = last_pitch; + for(ix2=ix; ix2pitch2 = phoneme_list[ix2].pitch2; + break; + } + } + p->pitch1 = p->pitch2-8; + p->env = PITCHfall; + pre_voiced = 0; + } + break; + + case phVOWEL: + min_drop = 0; + next2 = &phoneme_list[ix+2]; + next3 = &phoneme_list[ix+3]; + + if(stress > 7) stress = 7; + + if(pre_sonorant) + p->amp = tr->stress_amps[stress]-1; + else + p->amp = tr->stress_amps[stress]; + + if(emphasized) + p->amp = 25; + + if(ix >= (n_phoneme_list-3)) + { + // last phoneme of a clause, limit its amplitude + if(p->amp > tr->langopts.param[LOPT_MAXAMP_EOC]) + p->amp = tr->langopts.param[LOPT_MAXAMP_EOC]; + } + + // is the last syllable of a word ? + more_syllables=0; + end_of_clause = 0; + for(p2 = p+1; p2->newword== 0; p2++) + { + if((p2->type == phVOWEL) && !(p2->ph->phflags & phNONSYLLABIC)) + more_syllables++; + + if(p2->ph->code == phonPAUSE_CLAUSE) + end_of_clause = 2; + } + if(p2->ph->code == phonPAUSE_CLAUSE) + end_of_clause = 2; + + if((p2->newword & 2) && (more_syllables==0)) + { + end_of_clause = 2; + } + + // calc length modifier + if((next->ph->code == phonPAUSE_VSHORT) && (next2->type == phPAUSE)) + { + // if PAUSE_VSHORT is followed by a pause, then use that + next = next2; + next2 = next3; + next3 = &phoneme_list[ix+4]; + } + + if(more_syllables==0) + { + len = tr->langopts.length_mods0[next2->ph->length_mod *10+ next->ph->length_mod]; + + if((next->newword) && (tr->langopts.word_gap & 0x20)) + { + // consider as a pause + first phoneme of the next word + length_mod = (len + tr->langopts.length_mods0[next->ph->length_mod *10+ 1])/2; + } + else + length_mod = len; + } + else + { + length_mod = tr->langopts.length_mods[next2->ph->length_mod *10+ next->ph->length_mod]; + + if((next->type == phNASAL) && (next2->type == phSTOP || next2->type == phVSTOP) && (next3->ph->phflags & phFORTIS)) + length_mod -= 15; + } + + if(more_syllables==0) + length_mod *= speed1; + else + if(more_syllables==1) + length_mod *= speed2; + else + length_mod *= speed3; + + length_mod = length_mod / 128; + + if(length_mod < 8) + length_mod = 8; // restrict how much lengths can be reduced + + if(stress >= 7) + { + // tonic syllable, include a constant component so it doesn't decrease directly with speed + length_mod += 20; + if(emphasized) + length_mod += 10; + } + else + if(emphasized) + { + length_mod += 20; + } + + if((len = tr->stress_lengths[stress]) == 0) + len = tr->stress_lengths[6]; + + length_mod = (length_mod * len)/128; + + if(p->tone_ph != 0) + { + if((tone_mod = phoneme_tab[p->tone_ph]->std_length) > 0) + { + // a tone phoneme specifies a percentage change to the length + length_mod = (length_mod * tone_mod) / 100; + } + } + + if(end_of_clause == 2) + { + // this is the last syllable in the clause, lengthen it - more for short vowels + len = p->ph->std_length; + if(tr->langopts.stress_flags & 0x40000) + len=200; // don't lengthen short vowels more than long vowels at end-of-clause + length_mod = length_mod * (256 + (280 - len)/3)/256; + } + +if(p->type != phVOWEL) +{ + length_mod = 256; // syllabic consonant + min_drop = 8; +} + p->length = length_mod; + + // pre-vocalic part + // set last-pitch + env2 = p->env; + if(env2 > 1) env2++; // version for use with preceding semi-vowel + + if(p->tone_ph != 0) + { + pitch_env = LookupEnvelope(phoneme_tab[p->tone_ph]->spect); + } + else + { + pitch_env = envelope_data[env2]; + } + + pitch_start = p->pitch1 + ((p->pitch2-p->pitch1)*pitch_env[0])/256; + + if(pre_sonorant || pre_voiced) + { + // set pitch for pre-vocalic part + if(pitch_start == 1024) + last_pitch = pitch_start; // pitch is not set + + if(pitch_start - last_pitch > 8) // was 9 + last_pitch = pitch_start - 8; + + prev->pitch1 = last_pitch; + prev->pitch2 = pitch_start; + if(last_pitch < pitch_start) + { + prev->env = PITCHrise; + p->env = env2; + } + else + { + prev->env = PITCHfall; + } + + prev->length = length_mod; + + prev->amp = p->amp; + if((prev->type != phLIQUID) && (prev->amp > 18)) + prev->amp = 18; + } + + // vowel & post-vocalic part + next->synthflags &= ~SFLAG_SEQCONTINUE; + if(next->type == phNASAL && next2->type != phVOWEL) + next->synthflags |= SFLAG_SEQCONTINUE; + + if(next->type == phLIQUID) + { + next->synthflags |= SFLAG_SEQCONTINUE; + + if(next2->type == phVOWEL) + { + next->synthflags &= ~SFLAG_SEQCONTINUE; + } + + if(next2->type != phVOWEL) + { + if(next->ph->mnemonic == ('/'*256+'r')) + { + next->synthflags &= ~SFLAG_SEQCONTINUE; +// min_drop = 15; + } + } + } + + if((min_drop > 0) && ((p->pitch2 - p->pitch1) < min_drop)) + { + p->pitch1 = p->pitch2 - min_drop; + if(p->pitch1 < 0) + p->pitch1 = 0; + } + + last_pitch = p->pitch1 + ((p->pitch2-p->pitch1)*envelope_data[p->env][127])/256; + pre_sonorant = 0; + pre_voiced = 0; + break; + } + } +} // end of CalcLengths + diff --git a/navit/support/espeak/speak_init.c b/navit/support/espeak/speak_init.c new file mode 100644 index 0000000..06a3423 --- /dev/null +++ b/navit/support/espeak/speak_init.c @@ -0,0 +1,6 @@ +#include "../../plugin.h" + +void +plugin_init(void) +{ +} diff --git a/navit/support/espeak/synth_mbrola.c b/navit/support/espeak/synth_mbrola.c new file mode 100755 index 0000000..1055f54 --- /dev/null +++ b/navit/support/espeak/synth_mbrola.c @@ -0,0 +1,760 @@ +/*************************************************************************** + * Copyright (C) 2005 to 2007 by Jonathan Duddington * + * email: jonsd@users.sourceforge.net * + * * + * 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; either version 3 of the License, or * + * (at your option) any later version. * + * * + * 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 see: * + * . * + ***************************************************************************/ + +#include "StdAfx.h" + +#include +#include +#include +#include +#include +#include + +#include "speak_lib.h" +#include "speech.h" +#include "phoneme.h" +#include "synthesize.h" +#include "translate.h" +#include "voice.h" + +extern int Read4Bytes(FILE *f); +extern void SetPitch2(voice_t *voice, int pitch1, int pitch2, int *pitch_base, int *pitch_range); + +#ifdef USE_MBROLA_LIB + +extern unsigned char *outbuf; + +#ifndef PLATFORM_WINDOWS + +#include "mbrolib.h" +void * mb_handle; + +#else +#include +typedef void (WINAPI *PROCVV)(void); +typedef void (WINAPI *PROCVI)(int); +typedef void (WINAPI *PROCVF)(float); +typedef int (WINAPI *PROCIV)(); +typedef int (WINAPI *PROCIC) (char *); +typedef int (WINAPI *PROCISI)(short *,int); +typedef char* (WINAPI *PROCVCI)(char *,int); + +PROCIC init_MBR; +PROCIC write_MBR; +PROCIV flush_MBR; +PROCISI read_MBR; +PROCVV close_MBR; +PROCVV reset_MBR; +PROCIV lastError_MBR; +PROCVCI lastErrorStr_MBR; +PROCVI setNoError_MBR; +PROCVI setFreq_MBR; +PROCVF setVolumeRatio_MBR; + + + +HINSTANCE hinstDllMBR = NULL; + + +BOOL load_MBR() +{ + if(hinstDllMBR != NULL) + return TRUE; // already loaded + + if (!(hinstDllMBR=LoadLibraryA("mbrola.dll"))) + return FALSE; + init_MBR =(PROCIC) GetProcAddress(hinstDllMBR,"init_MBR"); + write_MBR =(PROCIC) GetProcAddress(hinstDllMBR,"write_MBR"); + flush_MBR =(PROCIV) GetProcAddress(hinstDllMBR,"flush_MBR"); + read_MBR =(PROCISI) GetProcAddress(hinstDllMBR,"read_MBR"); + close_MBR =(PROCVV) GetProcAddress(hinstDllMBR,"close_MBR"); + reset_MBR =(PROCVV) GetProcAddress(hinstDllMBR,"reset_MBR"); + lastError_MBR =(PROCIV) GetProcAddress(hinstDllMBR,"lastError_MBR"); + lastErrorStr_MBR =(PROCVCI) GetProcAddress(hinstDllMBR,"lastErrorStr_MBR"); + setNoError_MBR =(PROCVI) GetProcAddress(hinstDllMBR,"setNoError_MBR"); + setVolumeRatio_MBR =(PROCVF) GetProcAddress(hinstDllMBR,"setVolumeRatio_MBR"); + return TRUE; +} + + +void unload_MBR() +{ + if (hinstDllMBR) + { + FreeLibrary (hinstDllMBR); + hinstDllMBR=NULL; + } +} + +#endif // windows +#endif // USE_MBROLA_LIB + + +static MBROLA_TAB *mbrola_tab = NULL; +static int mbrola_control = 0; + + + + +espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int srate) +{//=================================================================================== +// Load a phoneme name translation table from espeak-data/mbrola + + int size; + int ix; + int *pw; + FILE *f_in; + char path[sizeof(path_home)+15]; + + mbrola_name[0] = 0; + mbrola_delay = 0; + + if(mbrola_voice == NULL) + { + samplerate = samplerate_native; + SetParameter(espeakVOICETYPE,0,0); + return(EE_OK); + } + + sprintf(path,"%s/mbrola/%s",path_home,mbrola_voice); +#ifdef USE_MBROLA_LIB +#ifdef PLATFORM_WINDOWS + if(load_MBR() == FALSE) // load mbrola.dll + return(EE_INTERNAL_ERROR); + + if(init_MBR(path) != 0) // initialise the required mbrola voice + return(EE_NOT_FOUND); + + setNoError_MBR(1); // don't stop on phoneme errors +#else + mb_handle = mbrolib_init(srate); + mbrolib_parameter m_parameters; + + if(mb_handle == NULL) + return(EE_INTERNAL_ERROR); + + MBROLIB_ERROR a_status = mbrolib_set_voice(mb_handle, mbrola_voice); + if(a_status != MBROLIB_OK) + return(EE_NOT_FOUND); +#endif // not windows +#endif // USE_MBROLA_LIB + + // read eSpeak's mbrola phoneme translation data, eg. en1_phtrans + sprintf(path,"%s/mbrola_ph/%s",path_home,phtrans); + size = GetFileLength(path); + if((f_in = fopen(path,"r")) == NULL) + return(EE_NOT_FOUND); + + if((mbrola_tab = (MBROLA_TAB *)realloc(mbrola_tab,size)) == NULL) + { + fclose(f_in); + return(EE_INTERNAL_ERROR); + } + + mbrola_control = Read4Bytes(f_in); + pw = (int *)mbrola_tab; + for(ix=4; ixmnemonic; + MBROLA_TAB *pr; + PHONEME_TAB *other_ph; + int found = 0; + + // control + // bit 0 skip the next phoneme + // bit 1 match this and Previous phoneme + // bit 2 only at the start of a word + // bit 3 don't match two phonemes across a word boundary + + pr = mbrola_tab; + while(pr->name != 0) + { + if(mnem == pr->name) + { + if(pr->next_phoneme == 0) + found = 1; + else + if((pr->next_phoneme == ':') && (plist->synthflags & SFLAG_LENGTHEN)) + { + found = 1; + } + else + { + if(pr->control & 2) + other_ph = ph_prev; + else + if((pr->control & 8) && ((plist+1)->newword)) + other_ph = phoneme_tab[phPAUSE]; // don't match the next phoneme over a word boundary + else + other_ph = ph_next; + + if((pr->next_phoneme == other_ph->mnemonic) || + ((pr->next_phoneme == 2) && (other_ph->type == phVOWEL)) || + ((pr->next_phoneme == '_') && (other_ph->type == phPAUSE))) + { + found = 1; + } + } + + if((pr->control & 4) && (plist->newword == 0)) // only at start of word + found = 0; + + if(found) + { + *name2 = pr->mbr_name2; + *split = pr->percent; + *control = pr->control; + return(pr->mbr_name); + } + } + + pr++; + } + *name2=0; + *split=0; + *control=0; + return(mnem); +} + + +static char *WritePitch(int env, int pitch1, int pitch2, int split, int final) +{//=========================================================================== +// final=1: only give the final pitch value. + int x; + int ix; + int pitch_base; + int pitch_range; + int p1,p2,p_end; + unsigned char *pitch_env; + int max = -1; + int min = 999; + int y_max=0; + int y_min=0; + int env100 = 80; // apply the pitch change only over this proportion of the mbrola phoneme(s) + int y2; + int y[4]; + int env_split; + char buf[50]; + static char output[50]; + + output[0] = 0; + pitch_env = envelope_data[env]; + + + SetPitch2(voice, pitch1, pitch2, &pitch_base, &pitch_range); + + + env_split = (split * 128)/100; + if(env_split < 0) + env_split = 0-env_split; + + // find max and min in the pitch envelope + for(x=0; x<128; x++) + { + if(pitch_env[x] > max) + { + max = pitch_env[x]; + y_max = x; + } + if(pitch_env[x] < min) + { + min = pitch_env[x]; + y_min = x; + } + } + // set an additional pitch point half way through the phoneme. + // but look for a maximum or a minimum and use that instead + y[2] = 64; + if((y_max > 0) && (y_max < 127)) + { + y[2] = y_max; + } + if((y_min > 0) && (y_min < 127)) + { + y[2] = y_min; + } + y[1] = y[2] / 2; + y[3] = y[2] + (127 - y[2])/2; + + // set initial pitch + p1 = ((pitch_env[0]*pitch_range)>>8) + pitch_base; // Hz << 12 + p_end = ((pitch_env[127]*pitch_range)>>8) + pitch_base; + + + if(split >= 0) + { + sprintf(buf," 0 %d",p1/4096); + strcat(output,buf); + } + + // don't use intermediate pitch points for linear rise and fall + if(env > 1) + { + for(ix=1; ix<4; ix++) + { + p2 = ((pitch_env[y[ix]]*pitch_range)>>8) + pitch_base; + + if(split > 0) + { + y2 = (y[ix] * env100)/env_split; + } + else + if(split < 0) + { + y2 = ((y[ix]-env_split) * env100)/env_split; + } + else + { + y2 = (y[ix] * env100)/128; + } + if((y2 > 0) && (y2 <= env100)) + { + sprintf(buf," %d %d",y2,p2/4096); + strcat(output,buf); + } + } + } + + p_end = p_end/4096; + if(split <= 0) + { + sprintf(buf," %d %d",env100,p_end); + strcat(output,buf); + } + if(env100 < 100) + { + sprintf(buf," %d %d",100,p_end); + strcat(output,buf); + } + strcat(output,"\n"); + + if(final) + sprintf(output,"\t100 %d\n",p_end); + return(output); +} // end of WritePitch + + +#ifdef USE_MBROLA_LIB + +static void MbrolaMarker(int type, int char_posn, int length, int value) +{//===================================================================== + + MarkerEvent(type,(char_posn & 0xffffff) | (length << 24),value,outbuf); + +} + + +static void MbrolaEmbedded(int &embix, int sourceix) +{//================================================= + // There were embedded commands in the text at this point + unsigned int word; // bit 7=last command for this word, bits 5,6 sign, bits 0-4 command + unsigned int value; + int command; + int sign=0; + + do { + word = embedded_list[embix++]; + value = word >> 8; + command = word & 0x1f; + + if((word & 0x60) == 0x60) + sign = -1; + else + if((word & 0x60) == 0x40) + sign = 1; + + if(command < N_EMBEDDED_VALUES) + { + if(sign == 0) + embedded_value[command] = value; + else + embedded_value[command] += (value * sign); + } + + switch(command & 0x1f) + { + case EMBED_M: // named marker + MbrolaMarker(espeakEVENT_MARK, (sourceix & 0x7ff) + clause_start_char, 0, value); + break; + } + } while ((word & 0x80) == 0); +} + + +#ifdef PLATFORM_WINDOWS +static int MbrolaSynth(char *p_mbrola) +{//=================================== +// p_mbrola is a string of mbrola pho lines - Windows + int len; + int finished; + int result=0; + + if(synth_callback == NULL) + return(1); + + if(p_mbrola == NULL) + flush_MBR(); + else + result = write_MBR(p_mbrola); + + + finished = 0; + while(!finished && ((len = read_MBR((short *)outbuf, outbuf_size/2)) > 0)) + { + out_ptr = outbuf + len*2; + + if(event_list) + { + event_list[event_list_ix].type = espeakEVENT_LIST_TERMINATED; // indicates end of event list + event_list[event_list_ix].user_data = 0; + } + count_samples += len; + finished = synth_callback((short *)outbuf, len, event_list); + event_list_ix=0; + } + + if(finished) + { + // cancelled by user, discard any unused mbrola speech + flush_MBR(); + while((len = read_MBR((short *)outbuf, outbuf_size/2)) > 0); + } + return(finished); +} // end of SynthMbrola +#else + +static int MbrolaSynth(char *p_mbrola) +{//=================================== +// p_mbrola is a string of mbrola pho lines - Linux + +// This is wrong +// It must be called from WavegenFill() + + int len; + int finished; + int result=0; + + if(synth_callback == NULL) + return(1); + + if(p_mbrola == NULL) + mbrolib_flush(mb_handle); + else + result = mbrolib_write(mb_handle,p_mbrola,strlen(p_mbrola)); + + + finished = 0; + while(!finished && (mbrolib_read(mb_handle, (short *)out_ptr, (out_end - out_ptr)/2, &len) == MBROLIB_OK)) + { + if(len == 0) + break; + + out_ptr += (len*2); + + if(event_list) + { + event_list[event_list_ix].type = espeakEVENT_LIST_TERMINATED; // indicates end of event list + event_list[event_list_ix].user_data = 0; + } + count_samples += len; + finished = synth_callback((short *)outbuf, len, event_list); + event_list_ix=0; + } + + if(finished) + { + // cancelled by user, discard any unused mbrola speech + mbrolib_flush(mb_handle); + while(mbrolib_read(mb_handle, (short *)outbuf, outbuf_size/2, &len) == MBROLIB_OK) + { + if(len == 0) + break; + } + } + return(finished); +} // end of SynthMbrola +#endif // not windows +#endif // USE_MBROLA_LIB + + + +void MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, FILE *f_mbrola) +{//====================================================================== +// Generate a mbrola pho file + unsigned int name; + int phix; + int len; + int len1; + PHONEME_TAB *ph; + PHONEME_TAB *ph_next; + PHONEME_TAB *ph_prev; + PHONEME_LIST *p; + PHONEME_LIST *next; + PHONEME_LIST *prev; + int pause = 0; + int released; + int name2; + int control; + int done; + int len_percent; + const char *final_pitch; + char buf[80]; + char mbr_buf[120]; + +#ifdef USE_MBROLA_LIB + int embedded_ix=0; + int word_count=0; + + event_list_ix = 0; + out_ptr = outbuf; +#ifdef PLATFORM_WINDOWS + setNoError_MBR(1); // don't stop on phoneme errors +#endif +#else +// fprintf(f_mbrola,";; v=%.2f\n",(float)(mbrola_control & 0xff)/16.0); // ;; v= has no effect on mbrola +#endif + + for(phix=1; phix < n_phonemes; phix++) + { + mbr_buf[0] = 0; + + p = &plist[phix]; + next = &plist[phix+1]; + prev = &plist[phix-1]; + ph = p->ph; + ph_prev = plist[phix-1].ph; + ph_next = plist[phix+1].ph; + +#ifdef USE_MBROLA_LIB + if(p->synthflags & SFLAG_EMBEDDED) + { + MbrolaEmbedded(embedded_ix, p->sourceix); + } + if(p->newword & 4) + MbrolaMarker(espeakEVENT_SENTENCE, (p->sourceix & 0x7ff) + clause_start_char, 0, count_sentences); + + if(p->newword & 1) + MbrolaMarker(espeakEVENT_WORD, (p->sourceix & 0x7ff) + clause_start_char, p->sourceix >> 11, clause_start_word + word_count++); +#endif + + name = GetMbrName(p,ph,ph_prev,ph_next,&name2,&len_percent,&control); + if(control & 1) + phix++; + + if(name == 0) + continue; // ignore this phoneme + + if((ph->type == phPAUSE) && (name == ph->mnemonic)) + { + // a pause phoneme, which has not been changed by the translation + name = '_'; + len = (p->length * speed.speed_factor1)/256; +// if(len == 0) continue; + if(len == 0) + len = 1; + } + else + len = (80 * speed.speed_factor2)/256; + +#ifdef USE_MBROLA_LIB + MbrolaMarker(espeakEVENT_PHONEME, (p->sourceix & 0x7ff) + clause_start_char, 0, ph->mnemonic); +#endif + + sprintf(buf,"%s\t",WordToString(name)); + strcat(mbr_buf,buf); + + if(name2 == '_') + { + // add a pause after this phoneme + pause = PauseLength(len_percent,0); + name2 = 0; + } + + done = 0; + final_pitch = ""; + + switch(ph->type) + { + case phVOWEL: + len = ph->std_length; + if(p->synthflags & SFLAG_LENGTHEN) + len += phoneme_tab[phonLENGTHEN]->std_length; // phoneme was followed by an extra : symbol + + if(ph_next->type == phPAUSE) + len += 50; // lengthen vowels before a pause + len = (len * p->length)/256; + + if(name2 == 0) + { + sprintf(buf,"%d\t%s", len, WritePitch(p->env,p->pitch1,p->pitch2,0,0)); + strcat(mbr_buf,buf); + } + else + { + len1 = (len * len_percent)/100; + sprintf(buf,"%d\t%s", len1, WritePitch(p->env,p->pitch1,p->pitch2,len_percent,0)); + strcat(mbr_buf,buf); + + sprintf(buf,"%s\t%d\t%s", WordToString(name2), len-len1, WritePitch(p->env,p->pitch1,p->pitch2,-len_percent,0)); + strcat(mbr_buf,buf); + } + done = 1; + break; + + case phSTOP: + released = 0; + if(next->type==phVOWEL) released = 1; + if(next->type==phLIQUID && !next->newword) released = 1; + + if(released) + len = DoSample(p->ph,next->ph,2,0,-1); + else + len = DoSample(p->ph,phoneme_tab[phonPAUSE],2,0,-1); + len = (len * 1000)/samplerate; // convert to mS + len += PauseLength(p->prepause,1); + break; + + case phVSTOP: + len = (80 * speed.speed_factor2)/256; + break; + + case phFRICATIVE: + len = 0; + if(p->synthflags & SFLAG_LENGTHEN) + len = DoSample(ph,ph_next,2,p->length,-1); // play it twice for [s:] etc. + len += DoSample(ph,ph_next,2,p->length,-1); + + len = (len * 1000)/samplerate; // convert to mS + break; + + case phNASAL: + if(next->type != phVOWEL) + { + len = DoSpect(p->ph,prev->ph,phoneme_tab[phonPAUSE],2,p,-1); + len = (len * 1000)/samplerate; + if(next->type == phPAUSE) + len += 50; + final_pitch = WritePitch(p->env,p->pitch1,p->pitch2,0,1); + } + break; + + case phLIQUID: + if(next->type == phPAUSE) + { + len += 50; + final_pitch = WritePitch(p->env,p->pitch1,p->pitch2,0,1); + } + break; + } + + if(!done) + { + if(name2 != 0) + { + len1 = (len * len_percent)/100; + sprintf(buf,"%d\n%s\t",len1,WordToString(name2)); + strcat(mbr_buf,buf); + len -= len1; + } + sprintf(buf,"%d%s\n",len,final_pitch); + strcat(mbr_buf,buf); + } + + if(pause) + { + sprintf(buf,"_ \t%d\n",PauseLength(pause,0)); + strcat(mbr_buf,buf); + pause = 0; + } + + if(f_mbrola) + { + fwrite(mbr_buf,1,strlen(mbr_buf),f_mbrola); // write .pho to a file + } + else + { +#ifdef USE_MBROLA_LIB + if(MbrolaSynth(mbr_buf) != 0) + return; +#endif + } + } + +#ifdef USE_MBROLA_LIB + MbrolaSynth(NULL); +#endif +} // end of MbrolaTranslate + + +#ifdef TEST_MBROLA + +static PHONEME_LIST mbrola_phlist; +static int mbrola_n_ph; +static int mbrola_phix; + + +int MbrolaFill(int fill_zeros) +{//=========================== +} + +int MbrolaGenerate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) +{//================================================================== + if(resume == 0) + { + mbrola_phlist = phoneme_list; + mbrola_n_ph = n_ph; + mbrola_phix = 0; + } + + resume(0); // finished phoneme list +} +#endif diff --git a/navit/support/espeak/synthdata.c b/navit/support/espeak/synthdata.c new file mode 100755 index 0000000..4f8234b --- /dev/null +++ b/navit/support/espeak/synthdata.c @@ -0,0 +1,682 @@ +/*************************************************************************** + * Copyright (C) 2005 to 2007 by Jonathan Duddington * + * email: jonsd@users.sourceforge.net * + * * + * 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; either version 3 of the License, or * + * (at your option) any later version. * + * * + * 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, see: * + * . * + ***************************************************************************/ + + +#include "StdAfx.h" + +#include +#include +#include +#include +#include + + +#include "speak_lib.h" +#include "speech.h" +#include "phoneme.h" +#include "synthesize.h" +#include "voice.h" +#include "translate.h" +#include "wave.h" + +const char *version_string = "1.41.01 25.Aug.09"; +const int version_phdata = 0x014100; + +int option_device_number = -1; + +// copy the current phoneme table into here +int n_phoneme_tab; +int current_phoneme_table; +PHONEME_TAB *phoneme_tab[N_PHONEME_TAB]; +unsigned char phoneme_tab_flags[N_PHONEME_TAB]; // bit 0: not inherited + +static unsigned int *phoneme_index=NULL; +char *spects_data=NULL; +unsigned char *wavefile_data=NULL; +static unsigned char *phoneme_tab_data = NULL; + +int n_phoneme_tables; +PHONEME_TAB_LIST phoneme_tab_list[N_PHONEME_TABS]; +int phoneme_tab_number = 0; + +int wavefile_ix; // a wavefile to play along with the synthesis +int wavefile_amp; +int wavefile_ix2; +int wavefile_amp2; + +int seq_len_adjust; +int vowel_transition[4]; +int vowel_transition0; +int vowel_transition1; + +int FormantTransition2(frameref_t *seq, int *n_frames, unsigned int data1, unsigned int data2, PHONEME_TAB *other_ph, int which); + + + +static char *ReadPhFile(void *ptr, const char *fname) +{//================================================== + FILE *f_in; + char *p; + unsigned int length; + char buf[sizeof(path_home)+40]; + + sprintf(buf,"%s%c%s",path_home,PATHSEP,fname); + length = GetFileLength(buf); + + if((f_in = fopen(buf,"rb")) == NULL) + { + fprintf(stderr,"Can't read data file: '%s'\n",buf); + return(NULL); + } + + if(ptr != NULL) + Free(ptr); + + if((p = Alloc(length)) == NULL) + { + fclose(f_in); + return(NULL); + } + if(fread(p,1,length,f_in) != length) + { + fclose(f_in); + return(NULL); + } + + fclose(f_in); + return(p); +} // end of ReadPhFile + + +int LoadPhData() +{//============= + int ix; + int n_phonemes; + int version; + int result = 1; + unsigned char *p; + + if((phoneme_tab_data = (unsigned char *)ReadPhFile((void *)(phoneme_tab_data),"phontab")) == NULL) + return(-1); + if((phoneme_index = (unsigned int *)ReadPhFile((void *)(phoneme_index),"phonindex")) == NULL) + return(-1); + if((spects_data = ReadPhFile((void *)(spects_data),"phondata")) == NULL) + return(-1); + wavefile_data = (unsigned char *)spects_data; + + // read the version number from the first 4 bytes of phondata + version = 0; + for(ix=0; ix<4; ix++) + { + version += (wavefile_data[ix] << (ix*8)); + } + + if(version != version_phdata) + { + result = version; + } + + // set up phoneme tables + p = phoneme_tab_data; + n_phoneme_tables = p[0]; + p+=4; + + for(ix=0; ix= n_phoneme_tables) + phoneme_tab_number = 0; + + return(result); +} // end of LoadPhData + + +void FreePhData(void) +{//================== + Free(phoneme_tab_data); + Free(phoneme_index); + Free(spects_data); + phoneme_tab_data=NULL; + phoneme_index=NULL; + spects_data=NULL; +} + + +int PhonemeCode(unsigned int mnem) +{//=============================== + int ix; + + for(ix=0; ixmnemonic == mnem) + return(phoneme_tab[ix]->code); + } + return(0); +} + + +int LookupPhonemeString(const char *string) +{//======================================== + int ix; + unsigned char c; + unsigned int mnem; + + // Pack up to 4 characters into a word + mnem = 0; + for(ix=0; ix<4; ix++) + { + if(string[ix]==0) break; + c = string[ix]; + mnem |= (c << (ix*8)); + } + + return(PhonemeCode(mnem)); +} + + + +static unsigned int LookupSound2(int index, unsigned int other_phcode, int control) +{//================================================================================ +// control=1 get formant transition data only + + unsigned int code; + unsigned int value, value2; + + while((value = phoneme_index[index++]) != 0) + { + if((code = (value & 0xff)) == other_phcode) + { + while(((value2 = phoneme_index[index]) != 0) && ((value2 & 0xff) < 8)) + { + switch(value2 & 0xff) + { + case 0: + // next entry is a wavefile to be played along with the synthesis + if(control==0) + { + wavefile_ix = value2 >> 8; + } + break; + case 1: + if(control==0) + { + seq_len_adjust = value2 >> 8; + } + break; + case 2: + if(control==0) + { + seq_len_adjust = value2 >> 8; + seq_len_adjust = -seq_len_adjust; + } + break; + case 3: + if(control==0) + { + wavefile_amp = value2 >> 8; + } + break; + case 4: + // formant transition data, 2 words + vowel_transition[0] = value2 >> 8; + vowel_transition[1] = phoneme_index[index++ + 1]; + break; + case 5: + // formant transition data, 2 words + vowel_transition[2] = value2 >> 8; + vowel_transition[3] = phoneme_index[index++ + 1]; + break; + } + index++; + } + return(value >> 8); + } + else + if((code == 4) || (code == 5)) + { + // formant transition data, ignore next word of data + index++; + } + } + return(3); // not found +} // end of LookupSound2 + + +unsigned int LookupSound(PHONEME_TAB *this_ph, PHONEME_TAB *other_ph, int which, int *match_level, int control) +{//============================================================================================================ + // follows, 1 other_ph preceeds this_ph, 2 other_ph follows this_ph + // control: 1= get formant transition data only + int spect_list; + int spect_list2; + int s_list; + unsigned char virtual_ph; + int result; + int level=0; + unsigned int other_code; + unsigned int other_virtual; + + if(control==0) + { + wavefile_ix = 0; + wavefile_amp = 32; + seq_len_adjust = 0; + } + memset(vowel_transition,0,sizeof(vowel_transition)); + + other_code = other_ph->code; + if(phoneme_tab[other_code]->type == phPAUSE) + other_code = phonPAUSE_SHORT; // use this version of Pause for matching + + if(which==1) + { + spect_list = this_ph->after; + virtual_ph = this_ph->start_type; + spect_list2 = phoneme_tab[virtual_ph]->after; + other_virtual = other_ph->end_type; + } + else + { + spect_list = this_ph->before; + virtual_ph = this_ph->end_type; + spect_list2 = phoneme_tab[virtual_ph]->before; + other_virtual = other_ph->start_type; + } + + result = 3; + // look for ph1-ph2 combination + if((s_list = spect_list) != 0) + { + if((result = LookupSound2(s_list,other_code,control)) != 3) + { + level = 2; + } + else + if(other_virtual != 0) + { + if((result = LookupSound2(spect_list,other_virtual,control)) != 3) + { + level = 1; + } + } + } + // not found, look in a virtual phoneme if one is given for this phoneme + if((result==3) && (virtual_ph != 0) && ((s_list = spect_list2) != 0)) + { + if((result = LookupSound2(s_list,other_code,control)) != 3) + { + level = 1; + } + else + if(other_virtual != 0) + { + if((result = LookupSound2(spect_list2,other_virtual,control)) != 3) + { + level = 1; + } + } + } + + if(match_level != NULL) + *match_level = level; + + if(result==0) + return(0); // NULL was given in the phoneme source + + // note: values = 1 indicates use the default for this phoneme, even though we found a match + // which set a secondary reference + if(result >= 4) + { + // values 1-3 can be used for special codes + // 1 = DFT from the phoneme source file + return(result); + } + + // no match found for other_ph, return the default + return(LookupSound2(this_ph->spect,phonPAUSE,control)); + +} // end of LookupSound + + + +frameref_t *LookupSpect(PHONEME_TAB *this_ph, PHONEME_TAB *prev_ph, PHONEME_TAB *next_ph, + int which, int *match_level, int *n_frames, PHONEME_LIST *plist) +{//========================================================================================================= + int ix; + int nf; + int nf1; + int seq_break; + frameref_t *frames; + int length1; + int length_std; + int length_factor; + SPECT_SEQ *seq, *seq2; + SPECT_SEQK *seqk, *seqk2; + PHONEME_TAB *next2_ph; + frame_t *frame; + static frameref_t frames_buf[N_SEQ_FRAMES]; + + PHONEME_TAB *other_ph; + if(which == 1) + other_ph = prev_ph; + else + other_ph = next_ph; + + if((ix = LookupSound(this_ph,other_ph,which,match_level,0)) < 4) + return(NULL); + seq = (SPECT_SEQ *)(&spects_data[ix]); + seqk = (SPECT_SEQK *)seq; + nf = seq->n_frames; + + + if(nf >= N_SEQ_FRAMES) + nf = N_SEQ_FRAMES - 1; + + seq_break = 0; + length1 = 0; + + for(ix=0; ixframe[0].frflags & FRFLAG_KLATT) + frame = &seqk->frame[ix]; + else + frame = (frame_t *)&seq->frame[ix]; + frames_buf[ix].frame = frame; + frames_buf[ix].frflags = frame->frflags; + frames_buf[ix].length = frame->length; + if(frame->frflags & FRFLAG_VOWEL_CENTRE) + seq_break = ix; + } + + frames = &frames_buf[0]; + if(seq_break > 0) + { + if(which==1) + { + nf = seq_break + 1; + } + else + { + frames = &frames_buf[seq_break]; // body of vowel, skip past initial frames + nf -= seq_break; + } + } + + // do we need to modify a frame for blending with a consonant? + if(this_ph->type == phVOWEL) + { + if((which==2) && ((frames[nf-1].frflags & FRFLAG_BREAK) == 0)) + { + // lookup formant transition for the following phoneme + + if((*match_level == 0) || (next_ph->type == phNASAL)) + { + LookupSound(next_ph,this_ph,1,NULL,1); + seq_len_adjust += FormantTransition2(frames,&nf,vowel_transition[2],vowel_transition[3],next_ph,which); + } + else + if(next_ph->phflags == phVOWEL2) + { + // not really a consonant, rather a coloured vowel + if(LookupSound(next_ph,this_ph,1,NULL,1) == 0) + { + next2_ph = plist[2].ph; + LookupSound(next2_ph,next_ph,1,NULL,1); + seq_len_adjust += FormantTransition2(frames,&nf,vowel_transition[2],vowel_transition[3],next2_ph,which); + } + } + } + else + { + if(*match_level == 0) + seq_len_adjust = FormantTransition2(frames,&nf,vowel_transition0,vowel_transition1,prev_ph,which); + } + } + + nf1 = nf - 1; + for(ix=0; ixn_frames; ix++) + { + if(seq2->frame[0].frflags & FRFLAG_KLATT) + frame = &seqk2->frame[ix]; + else + frame = (frame_t *)&seq2->frame[ix]; + + frames[nf].length = frame->length; + if(ix > 0) + { + frames[nf].frame = frame; + frames[nf].frflags = frame->frflags; + } + nf++; + } + wavefile_ix = 0; + } + + if((this_ph->type == phVOWEL) && (length1 > 0)) + { + if(which==2) + { + // adjust the length of the main part to match the standard length specified for the vowel + // less the front part of the vowel and any added suffix + + length_std = this_ph->std_length + seq_len_adjust - 45; + if(length_std < 10) + length_std = 10; + if(plist->synthflags & SFLAG_LENGTHEN) + length_std += phoneme_tab[phonLENGTHEN]->std_length; // phoneme was followed by an extra : symbol + +// can adjust vowel length for stressed syllables here + + + length_factor = (length_std * 256)/ length1; + + for(ix=0; ixstd_length < 130) + frames[0].length = (frames[0].length * this_ph->std_length)/130; + } + + if(seq_len_adjust != 0) + { + length_std = 0; + for(ix=0; ix 0) + { + // recursively include base phoneme tables + SetUpPhonemeTable(includes-1,1); + } + + // now add the phonemes from this table + phtab = phoneme_tab_list[number].phoneme_tab_ptr; + for(ix=0; ix n_phoneme_tab) + n_phoneme_tab = ph_code; + + if(recursing == 0) + phoneme_tab_flags[ph_code] |= 1; // not inherited + } +} // end of SetUpPhonemeTable + + +void SelectPhonemeTable(int number) +{//================================ + n_phoneme_tab = 0; + SetUpPhonemeTable(number,0); // recursively for included phoneme tables + n_phoneme_tab++; + current_phoneme_table = number; +} // end of SelectPhonemeTable + + +int LookupPhonemeTable(const char *name) +{//===================================== + int ix; + + for(ix=0; ix. * + ***************************************************************************/ + +#include "StdAfx.h" + +#include +#include +#include +#include +#include +#include + +#include "speak_lib.h" +#include "speech.h" +#include "phoneme.h" +#include "synthesize.h" +#include "voice.h" +#include "translate.h" + + +extern FILE *f_log; +static void SmoothSpect(void); + + +// list of phonemes in a clause +int n_phoneme_list=0; +PHONEME_LIST phoneme_list[N_PHONEME_LIST]; + +int mbrola_delay; +char mbrola_name[20]; + +SPEED_FACTORS speed; + +static int last_pitch_cmd; +static int last_amp_cmd; +static frame_t *last_frame; +static int last_wcmdq; +static int pitch_length; +static int amp_length; +static int modn_flags; + +static int syllable_start; +static int syllable_end; +static int syllable_centre; + +static voice_t *new_voice=NULL; + +int n_soundicon_tab=N_SOUNDICON_SLOTS; +SOUND_ICON soundicon_tab[N_SOUNDICON_TAB]; + +#define RMS_GLOTTAL1 35 // vowel before glottal stop +#define RMS_START 28 // 28 + +#define VOWEL_FRONT_LENGTH 50 + +#define long(x) ((long)(x)) + +// a dummy phoneme_list entry which looks like a pause +static PHONEME_LIST next_pause; + + +const char *WordToString(unsigned int word) +{//======================================== +// Convert a phoneme mnemonic word into a string + int ix; + static char buf[5]; + + for(ix=0; ix<3; ix++) + buf[ix] = word >> (ix*8); + buf[4] = 0; + return(buf); +} + + + +void SynthesizeInit() +{//================== + last_pitch_cmd = 0; + last_amp_cmd = 0; + last_frame = NULL; + syllable_centre = -1; + + // initialise next_pause, a dummy phoneme_list entry +// next_pause.ph = phoneme_tab[phonPAUSE]; // this must be done after voice selection + next_pause.type = phPAUSE; + next_pause.newword = 0; +} + + + +static void EndAmplitude(void) +{//=========================== + if(amp_length > 0) + { + if(wcmdq[last_amp_cmd][1] == 0) + wcmdq[last_amp_cmd][1] = amp_length; + amp_length = 0; + } +} + + + +static void EndPitch(int voice_break) +{//================================== + // posssible end of pitch envelope, fill in the length + if((pitch_length > 0) && (last_pitch_cmd >= 0)) + { + if(wcmdq[last_pitch_cmd][1] == 0) + wcmdq[last_pitch_cmd][1] = pitch_length; + pitch_length = 0; + } + + if(voice_break) + { + last_wcmdq = -1; + last_frame = NULL; + syllable_end = wcmdq_tail; + SmoothSpect(); + syllable_centre = -1; + memset(vowel_transition,0,sizeof(vowel_transition)); + } +} // end of Synthesize::EndPitch + + + +static void DoAmplitude(int amp, unsigned char *amp_env) +{//===================================================== + long *q; + + last_amp_cmd = wcmdq_tail; + amp_length = 0; // total length of vowel with this amplitude envelope + + q = wcmdq[wcmdq_tail]; + q[0] = WCMD_AMPLITUDE; + q[1] = 0; // fill in later from amp_length + q[2] = (long)amp_env; + q[3] = amp; + WcmdqInc(); +} // end of Synthesize::DoAmplitude + + + +static void DoPitch(unsigned char *env, int pitch1, int pitch2) +{//============================================================ + long *q; + + EndPitch(0); + + if(pitch1 == 1024) + { + // pitch was not set + pitch1 = 24; + pitch2 = 33; + env = envelope_data[PITCHfall]; + } + last_pitch_cmd = wcmdq_tail; + pitch_length = 0; // total length of spect with this pitch envelope + + if(pitch2 < 0) + pitch2 = 0; + + q = wcmdq[wcmdq_tail]; + q[0] = WCMD_PITCH; + q[1] = 0; // length, fill in later from pitch_length + q[2] = (long)env; + q[3] = (pitch1 << 16) + pitch2; + WcmdqInc(); +} // end of Synthesize::DoPitch + + + +int PauseLength(int pause, int control) +{//==================================== + int len; + + if(control == 0) + len = (pause * speed.speed_factor1)/256; + else + len = (pause * speed.speed_factor2)/256; + + if(len < 5) len = 5; // mS, limit the amount to which pauses can be shortened + return(len); +} + + +static void DoPause(int length, int control) +{//========================================= +// control = 1, less shortening at fast speeds + int len; + + len = PauseLength(length, control); + + len = (len * samplerate) / 1000; // convert from mS to number of samples + + EndPitch(1); + wcmdq[wcmdq_tail][0] = WCMD_PAUSE; + wcmdq[wcmdq_tail][1] = len; + WcmdqInc(); + last_frame = NULL; +} // end of Synthesize::DoPause + + +extern int seq_len_adjust; // temporary fix to advance the start point for playing the wav sample + + +static int DoSample2(int index, int which, int length_mod, int amp) +{//================================================================ + int length; + int length1; + int format; + int min_length; + int start=0; + long *q; + unsigned char *p; + + index = index & 0x7fffff; + p = &wavefile_data[index]; + format = p[2]; + length1 = (p[1] * 256); + length1 += p[0]; // length in bytes + + if(seq_len_adjust > 0) + { + start = (seq_len_adjust * samplerate)/1000; + if(format == 0) + start *= 2; + length1 -= start; + index += start; + } + + + if(length_mod > 0) + length = (length1 * length_mod) / 256; + else + length = length1; + + + length = (length * speed.speed_factor2)/256; + min_length = speed.min_sample_len; + if(format==0) + min_length *= 2; + + if(length < min_length) + length = min_length; + + if(length > length1) + length = length1; // don't exceed wavefile length + + if(format==0) + length /= 2; // 2 byte samples + + + index += 4; + + if(amp >= 0) + { + last_wcmdq = wcmdq_tail; + q = wcmdq[wcmdq_tail]; + if(which & 0x100) + q[0] = WCMD_WAVE2; // mix this with synthesised wave + else + q[0] = WCMD_WAVE; + q[1] = length; // length in samples + q[2] = long(&wavefile_data[index]); + q[3] = format + (amp << 8); + WcmdqInc(); + } + return(length); +} // end of Synthesize::DoSample2 + + +int DoSample(PHONEME_TAB *ph1, PHONEME_TAB *ph2, int which, int length_mod, int amp) +{//====================== ========================================================== + int index; + int match_level; + int amp2; + int result; + + EndPitch(1); + index = LookupSound(ph1,ph2,which & 0xff,&match_level,0); + if((index & 0x800000) == 0) + return(0); // not wavefile data + + amp2 = wavefile_amp; + if(amp != 0) + amp2 = (amp * wavefile_amp)/20; + + if(amp == -1) + amp2 = amp; + + result = DoSample2(index,which,length_mod,amp2); + last_frame = NULL; + return(result); +} // end of Synthesize::DoSample + + + + +static frame_t *AllocFrame() +{//========================= + // Allocate a temporary spectrum frame for the wavegen queue. Use a pool which is big + // enough to use a round-robin without checks. + // Only needed for modifying spectra for blending to consonants + +#define N_FRAME_POOL N_WCMDQ + static int ix=0; + static frame_t frame_pool[N_FRAME_POOL]; + + ix++; + if(ix >= N_FRAME_POOL) + ix = 0; + return(&frame_pool[ix]); +} + + +static void set_frame_rms(frame_t *fr, int new_rms) +{//================================================= +// Each frame includes its RMS amplitude value, so to set a new +// RMS just adjust the formant amplitudes by the appropriate ratio + + int x; + int h; + int ix; + + static const short sqrt_tab[200] = { + 0, 64, 90,110,128,143,156,169,181,192,202,212,221,230,239,247, + 256,263,271,278,286,293,300,306,313,320,326,332,338,344,350,356, + 362,367,373,378,384,389,394,399,404,409,414,419,424,429,434,438, + 443,448,452,457,461,465,470,474,478,483,487,491,495,499,503,507, + 512,515,519,523,527,531,535,539,543,546,550,554,557,561,565,568, + 572,576,579,583,586,590,593,596,600,603,607,610,613,617,620,623, + 627,630,633,636,640,643,646,649,652,655,658,662,665,668,671,674, + 677,680,683,686,689,692,695,698,701,704,706,709,712,715,718,721, + 724,726,729,732,735,738,740,743,746,749,751,754,757,759,762,765, + 768,770,773,775,778,781,783,786,789,791,794,796,799,801,804,807, + 809,812,814,817,819,822,824,827,829,832,834,836,839,841,844,846, + 849,851,853,856,858,861,863,865,868,870,872,875,877,879,882,884, + 886,889,891,893,896,898,900,902}; + + if(voice->klattv[0]) + { + if(new_rms == -1) + { + fr->klattp[KLATT_AV] = 50; + } + return; + } + + if(fr->rms == 0) return; // check for divide by zero + x = (new_rms * 64)/fr->rms; + if(x >= 200) x = 199; + + x = sqrt_tab[x]; // sqrt(new_rms/fr->rms)*0x200; + + for(ix=0; ix < 8; ix++) + { + h = fr->fheight[ix] * x; + fr->fheight[ix] = h/0x200; + } +} /* end of set_frame_rms */ + + + +static void formants_reduce_hf(frame_t *fr, int level) +{//==================================================== +// change height of peaks 2 to 8, percentage + int ix; + int x; + + if(voice->klattv[0]) + return; + + for(ix=2; ix < 8; ix++) + { + x = fr->fheight[ix] * level; + fr->fheight[ix] = x/100; + } +} + + +static frame_t *CopyFrame(frame_t *frame1, int copy) +{//================================================= +// create a copy of the specified frame in temporary buffer + frame_t *frame2; + + if((copy==0) && (frame1->frflags & FRFLAG_COPIED)) + { + // this frame has already been copied in temporary rw memory + return(frame1); + } + + frame2 = AllocFrame(); + if(frame2 != NULL) + { + memcpy(frame2,frame1,sizeof(frame_t)); + frame2->length = 0; + frame2->frflags |= FRFLAG_COPIED; + } + return(frame2); +} + + +static frame_t *DuplicateLastFrame(frameref_t *seq, int n_frames, int length) +{//========================================================================== + frame_t *fr; + + seq[n_frames-1].length = length; + fr = CopyFrame(seq[n_frames-1].frame,1); + seq[n_frames].frame = fr; + seq[n_frames].length = 0; + return fr; +} + + +static void AdjustFormants(frame_t *fr, int target, int min, int max, int f1_adj, int f3_adj, int hf_reduce, int flags) +{//==================================================================================================================== + int x; + +//hf_reduce = 70; // ?? using fixed amount rather than the parameter?? + + target = (target * voice->formant_factor)/256; + + x = (target - fr->ffreq[2]) / 2; + if(x > max) x = max; + if(x < min) x = min; + fr->ffreq[2] += x; + fr->ffreq[3] += f3_adj; + + if(flags & 0x20) + { + f3_adj = -f3_adj; //. reverse direction for f4,f5 change + } + fr->ffreq[4] += f3_adj; + fr->ffreq[5] += f3_adj; + + if(f1_adj==1) + { + x = (235 - fr->ffreq[1]); + if(x < -100) x = -100; + if(x > -60) x = -60; + fr->ffreq[1] += x; + } + if(f1_adj==2) + { + x = (235 - fr->ffreq[1]); + if(x < -300) x = -300; + if(x > -150) x = -150; + fr->ffreq[1] += x; + fr->ffreq[0] += x; + } + if(f1_adj==3) + { + x = (100 - fr->ffreq[1]); + if(x < -400) x = -400; + if(x > -300) x = -400; + fr->ffreq[1] += x; + fr->ffreq[0] += x; + } + formants_reduce_hf(fr,hf_reduce); +} + + +static int VowelCloseness(frame_t *fr) +{//=================================== +// return a value 0-3 depending on the vowel's f1 + int f1; + + if((f1 = fr->ffreq[1]) < 300) + return(3); + if(f1 < 400) + return(2); + if(f1 < 500) + return(1); + return(0); +} + + +int FormantTransition2(frameref_t *seq, int *n_frames, unsigned int data1, unsigned int data2, PHONEME_TAB *other_ph, int which) +{//============================================================================================================================== + int ix; + int formant; + int next_rms; + + int len; + int rms; + int f1; + int f2; + int f2_min; + int f2_max; + int f3_adj; + int f3_amp; + int flags; + int vcolour; + +#define N_VCOLOUR 2 +// percentage change for each formant in 256ths +static short vcolouring[N_VCOLOUR][5] = { + {243,272,256,256,256}, // palatal consonant follows + {256,256,240,240,240}, // retroflex +}; + + frame_t *fr = NULL; + + if(*n_frames < 2) + return(0); + + len = (data1 & 0x3f) * 2; + rms = (data1 >> 6) & 0x3f; + flags = (data1 >> 12); + + f2 = (data2 & 0x3f) * 50; + f2_min = (((data2 >> 6) & 0x1f) - 15) * 50; + f2_max = (((data2 >> 11) & 0x1f) - 15) * 50; + f3_adj = (((data2 >> 16) & 0x1f) - 15) * 50; + f3_amp = ((data2 >> 21) & 0x1f) * 8; + f1 = ((data2 >> 26) & 0x7); + vcolour = (data2 >> 29); + +// fprintf(stderr,"FMT%d %3s %3d-%3d f1=%d f2=%4d %4d %4d f3=%4d %3d\n", +// which,WordToString(other_ph->mnemonic),len,rms,f1,f2,f2_min,f2_max,f3_adj,f3_amp); + + if(other_ph->mnemonic == '?') + flags |= 8; + + if(which == 1) + { + /* entry to vowel */ + fr = CopyFrame(seq[0].frame,0); + seq[0].frame = fr; + seq[0].length = VOWEL_FRONT_LENGTH; + if(len > 0) + seq[0].length = len; + seq[0].frflags |= FRFLAG_LEN_MOD; // reduce length modification + fr->frflags |= FRFLAG_LEN_MOD; + + next_rms = seq[1].frame->rms; + +if(voice->klattv[0]) +{ + fr->klattp[KLATT_AV] = 53; // reduce the amplituide of the start of a vowel +} + if(f2 != 0) + { + if(rms & 0x20) + { + set_frame_rms(fr,(next_rms * (rms & 0x1f))/30); + } + AdjustFormants(fr, f2, f2_min, f2_max, f1, f3_adj, f3_amp, flags); + + if((rms & 0x20) == 0) + { + set_frame_rms(fr,rms*2); + } + } + else + { + if(flags & 8) + set_frame_rms(fr,(next_rms*24)/32); + else + set_frame_rms(fr,RMS_START); + } + + if(flags & 8) + { +// set_frame_rms(fr,next_rms - 5); + modn_flags = 0x800 + (VowelCloseness(fr) << 8); + } + } + else + { + // exit from vowel + rms = rms*2; + if((f2 != 0) || (flags != 0)) + { + + if(flags & 8) + { + fr = CopyFrame(seq[*n_frames-1].frame,0); + seq[*n_frames-1].frame = fr; + rms = RMS_GLOTTAL1; + + // degree of glottal-stop effect depends on closeness of vowel (indicated by f1 freq) + modn_flags = 0x400 + (VowelCloseness(fr) << 8); + } + else + { + fr = DuplicateLastFrame(seq,(*n_frames)++,len); + if(len > 36) + seq_len_adjust += (len - 36); + + if(f2 != 0) + { + AdjustFormants(fr, f2, f2_min, f2_max, f1, f3_adj, f3_amp, flags); + } + } + + set_frame_rms(fr,rms); + + if((vcolour > 0) && (vcolour <= N_VCOLOUR)) + { + for(ix=0; ix<*n_frames; ix++) + { + fr = CopyFrame(seq[ix].frame,0); + seq[ix].frame = fr; + + for(formant=1; formant<=5; formant++) + { + int x; + x = fr->ffreq[formant] * vcolouring[vcolour-1][formant-1]; + fr->ffreq[formant] = x / 256; + } + } + } + } + } + + if(fr != NULL) + { + if(flags & 4) + fr->frflags |= FRFLAG_FORMANT_RATE; + if(flags & 2) + fr->frflags |= FRFLAG_BREAK; // don't merge with next frame + } + + if(flags & 0x40) + DoPause(12,0); // add a short pause after the consonant + + if(flags & 16) + return(len); + return(0); +} // end of FormantTransition2 + + + +static void SmoothSpect(void) +{//========================== + // Limit the rate of frequence change of formants, to reduce chirping + + long *q; + frame_t *frame; + frame_t *frame2; + frame_t *frame1; + frame_t *frame_centre; + int ix; + int len; + int pk; + int modified; + int allowed; + int diff; + + if(syllable_start == syllable_end) + return; + + if((syllable_centre < 0) || (syllable_centre == syllable_start)) + { + syllable_start = syllable_end; + return; + } + + q = wcmdq[syllable_centre]; + frame_centre = (frame_t *)q[2]; + + // backwards + ix = syllable_centre -1; + frame = frame2 = frame_centre; + for(;;) + { + if(ix < 0) ix = N_WCMDQ-1; + q = wcmdq[ix]; + + if(q[0] == WCMD_PAUSE || q[0] == WCMD_WAVE) + break; + + if(q[0] <= WCMD_SPECT2) + { + len = q[1] & 0xffff; + + frame1 = (frame_t *)q[3]; + if(frame1 == frame) + { + q[3] = (long)frame2; + frame1 = frame2; + } + else + break; // doesn't follow on from previous frame + + frame = frame2 = (frame_t *)q[2]; + modified = 0; + + if(frame->frflags & FRFLAG_BREAK) + break; + + if(frame->frflags & FRFLAG_FORMANT_RATE) + len = (len * 12)/10; // allow slightly greater rate of change for this frame (was 12/10) + + for(pk=0; pk<6; pk++) + { + int f1, f2; + + if((frame->frflags & FRFLAG_BREAK_LF) && (pk < 3)) + continue; + + f1 = frame1->ffreq[pk]; + f2 = frame->ffreq[pk]; + + // backwards + if((diff = f2 - f1) > 0) + { + allowed = f1*2 + f2; + } + else + { + allowed = f1 + f2*2; + } + + // the allowed change is specified as percentage (%*10) of the frequency + // take "frequency" as 1/3 from the lower freq + allowed = (allowed * formant_rate[pk])/3000; + allowed = (allowed * len)/256; + + if(diff > allowed) + { + if(modified == 0) + { + frame2 = CopyFrame(frame,0); + modified = 1; + } + frame2->ffreq[pk] = frame1->ffreq[pk] + allowed; + q[2] = (long)frame2; + } + else + if(diff < -allowed) + { + if(modified == 0) + { + frame2 = CopyFrame(frame,0); + modified = 1; + } + frame2->ffreq[pk] = frame1->ffreq[pk] - allowed; + q[2] = (long)frame2; + } + } + } + + if(ix == syllable_start) + break; + ix--; + } + + // forwards + ix = syllable_centre; + + frame = NULL; + for(;;) + { + q = wcmdq[ix]; + + if(q[0] == WCMD_PAUSE || q[0] == WCMD_WAVE) + break; + + if(q[0] <= WCMD_SPECT2) + { + + len = q[1] & 0xffff; + + frame1 = (frame_t *)q[2]; + if(frame != NULL) + { + if(frame1 == frame) + { + q[2] = (long)frame2; + frame1 = frame2; + } + else + break; // doesn't follow on from previous frame + } + + frame = frame2 = (frame_t *)q[3]; + modified = 0; + + if(frame1->frflags & FRFLAG_BREAK) + break; + + if(frame1->frflags & FRFLAG_FORMANT_RATE) + len = (len *6)/5; // allow slightly greater rate of change for this frame + + for(pk=0; pk<6; pk++) + { + int f1, f2; + f1 = frame1->ffreq[pk]; + f2 = frame->ffreq[pk]; + + // forwards + if((diff = f2 - f1) > 0) + { + allowed = f1*2 + f2; + } + else + { + allowed = f1 + f2*2; + } + allowed = (allowed * formant_rate[pk])/3000; + allowed = (allowed * len)/256; + + if(diff > allowed) + { + if(modified == 0) + { + frame2 = CopyFrame(frame,0); + modified = 1; + } + frame2->ffreq[pk] = frame1->ffreq[pk] + allowed; + q[3] = (long)frame2; + } + else + if(diff < -allowed) + { + if(modified == 0) + { + frame2 = CopyFrame(frame,0); + modified = 1; + } + frame2->ffreq[pk] = frame1->ffreq[pk] - allowed; + q[3] = (long)frame2; + } + } + } + + ix++; + if(ix >= N_WCMDQ) ix = 0; + if(ix == syllable_end) + break; + } + + syllable_start = syllable_end; +} // end of SmoothSpect + + +static void StartSyllable(void) +{//============================ + // start of syllable, if not already started + if(syllable_end == syllable_start) + syllable_end = wcmdq_tail; +} + + +int DoSpect(PHONEME_TAB *this_ph, PHONEME_TAB *prev_ph, PHONEME_TAB *next_ph, + int which, PHONEME_LIST *plist, int modulation) +{//=================================================================================== + // which 1 start of phoneme, 2 body and end + // length_mod: 256 = 100% + // modulation: -1 = don't write to wcmdq + + int n_frames; + frameref_t *frames; + int frameix; + frame_t *frame1; + frame_t *frame2; + frame_t *fr; + int ix; + long *q; + int len; + int match_level; + int frame_length; + int frame1_length; + int frame2_length; + int length_factor; + int length_mod; + int total_len = 0; + static int wave_flag = 0; + int wcmd_spect = WCMD_SPECT; + + length_mod = plist->length; + if(length_mod==0) length_mod=256; + +if(which==1) +{ + // limit the shortening of sonorants before shortened (eg. unstressed vowels) + if((this_ph->type==phLIQUID) || (prev_ph->type==phLIQUID) || (prev_ph->type==phNASAL)) + { + if(length_mod < (len = translator->langopts.param[LOPT_SONORANT_MIN])) + { + length_mod = len; + } + } +} + + modn_flags = 0; + frames = LookupSpect(this_ph,prev_ph,next_ph,which,&match_level,&n_frames, plist); + if(frames == NULL) + return(0); // not found + + frame1 = frames[0].frame; + frame1_length = frames[0].length; + if(voice->klattv[0]) + wcmd_spect = WCMD_KLATT; + + if(wavefile_ix == 0) + { + if(wave_flag) + { + // cancel any wavefile that was playing previously + wcmd_spect = WCMD_SPECT2; + if(voice->klattv[0]) + wcmd_spect = WCMD_KLATT2; + wave_flag = 0; + } + else + { + wcmd_spect = WCMD_SPECT; + if(voice->klattv[0]) + wcmd_spect = WCMD_KLATT; + } + } + + if(last_frame != NULL) + { + if(((last_frame->length < 2) || (last_frame->frflags & FRFLAG_VOWEL_CENTRE)) + && !(last_frame->frflags & FRFLAG_BREAK)) + { + // last frame of previous sequence was zero-length, replace with first of this sequence + wcmdq[last_wcmdq][3] = (long)frame1; + + if(last_frame->frflags & FRFLAG_BREAK_LF) + { + // but flag indicates keep HF peaks in last segment + fr = CopyFrame(frame1,1); + for(ix=3; ix < 8; ix++) + { + if(ix < 7) + fr->ffreq[ix] = last_frame->ffreq[ix]; + fr->fheight[ix] = last_frame->fheight[ix]; + } + wcmdq[last_wcmdq][3] = (long)fr; + } + } + } + + if((this_ph->type == phVOWEL) && (which == 2)) + { + SmoothSpect(); // process previous syllable + + // remember the point in the output queue of the centre of the vowel + syllable_centre = wcmdq_tail; + } + + frame_length = frame1_length; + for(frameix=1; frameixfrflags & FRFLAG_DEFER_WAV)==0)) + { + // there is a wave file to play along with this synthesis + seq_len_adjust = 0; + DoSample2(wavefile_ix,which+0x100,0,wavefile_amp); + wave_flag = 1; + wavefile_ix = 0; + } + + length_factor = length_mod; + if(frame1->frflags & FRFLAG_LEN_MOD) // reduce effect of length mod + { + length_factor = (length_mod*(256-speed.speed_factor3) + 256*speed.speed_factor3)/256; + } + len = (frame_length * samplerate)/1000; + len = (len * length_factor)/256; + + if(modulation >= 0) + { + if(frame1->frflags & FRFLAG_MODULATE) + { + modulation = 6; + } + if((frameix == n_frames-1) && (modn_flags & 0xf00)) + modulation |= modn_flags; // before or after a glottal stop + } + + pitch_length += len; + amp_length += len; + + if(frame_length < 2) + { + last_frame = NULL; + frame_length = frame2_length; + frame1 = frame2; + } + else + { + last_wcmdq = wcmdq_tail; + + if(modulation >= 0) + { + q = wcmdq[wcmdq_tail]; + q[0] = wcmd_spect; + q[1] = len + (modulation << 16); + q[2] = long(frame1); + q[3] = long(frame2); + + WcmdqInc(); + } + last_frame = frame1 = frame2; + frame_length = frame2_length; + total_len += len; + } + } + return(total_len); +} // end of Synthesize::DoSpect + + +static void DoMarker(int type, int char_posn, int length, int value) +{//================================================================= +// This could be used to return an index to the word currently being spoken +// Type 1=word, 2=sentence, 3=named marker, 4=play audio, 5=end + wcmdq[wcmdq_tail][0] = WCMD_MARKER; + wcmdq[wcmdq_tail][1] = type; + wcmdq[wcmdq_tail][2] = (char_posn & 0xffffff) | (length << 24); + wcmdq[wcmdq_tail][3] = value; + WcmdqInc(); + +} // end of Synthesize::DoMarker + + +void DoVoiceChange(voice_t *v) +{//=========================== +// allocate memory for a copy of the voice data, and free it in wavegenfill() + voice_t *v2; + + v2 = (voice_t *)malloc(sizeof(voice_t)); + memcpy(v2,v,sizeof(voice_t)); + wcmdq[wcmdq_tail][0] = WCMD_VOICE; + wcmdq[wcmdq_tail][1] = (long)(v2); + WcmdqInc(); +} + + +static void DoEmbedded(int *embix, int sourceix) +{//============================================= + // There were embedded commands in the text at this point + unsigned int word; // bit 7=last command for this word, bits 5,6 sign, bits 0-4 command + unsigned int value; + int command; + + do { + word = embedded_list[(*embix)++]; + value = word >> 8; + command = word & 0x7f; + + switch(command & 0x1f) + { + case EMBED_S: // speed + SetEmbedded((command & 0x60) + EMBED_S2,value); // adjusts embedded_value[EMBED_S2] + SetSpeed(2); + break; + + case EMBED_I: // play dynamically loaded wav data (sound icon) + if((int)value < n_soundicon_tab) + { + if(soundicon_tab[value].length != 0) + { + DoPause(10,0); // ensure a break in the speech + wcmdq[wcmdq_tail][0] = WCMD_WAVE; + wcmdq[wcmdq_tail][1] = soundicon_tab[value].length; + wcmdq[wcmdq_tail][2] = (long)soundicon_tab[value].data + 44; // skip WAV header + wcmdq[wcmdq_tail][3] = 0x1500; // 16 bit data, amp=21 + WcmdqInc(); + } + } + break; + + case EMBED_M: // named marker + DoMarker(espeakEVENT_MARK, (sourceix & 0x7ff) + clause_start_char, 0, value); + break; + + case EMBED_U: // play sound + DoMarker(espeakEVENT_PLAY, count_characters+1, 0, value); // always occurs at end of clause + break; + + default: + DoPause(10,0); // ensure a break in the speech + wcmdq[wcmdq_tail][0] = WCMD_EMBEDDED; + wcmdq[wcmdq_tail][1] = command; + wcmdq[wcmdq_tail][2] = value; + WcmdqInc(); + break; + } + } while ((word & 0x80) == 0); +} + + + +int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) +{//============================================================ + static int ix; + static int embedded_ix; + static int word_count; + PHONEME_LIST *prev; + PHONEME_LIST *next; + PHONEME_LIST *next2; + PHONEME_LIST *p; + int released; + int stress; + int modulation; + int pre_voiced; + int free_min; + unsigned char *pitch_env=NULL; + unsigned char *amp_env; + PHONEME_TAB *ph; + PHONEME_TAB *prev_ph; + static int sourceix=0; + +#ifdef TEST_MBROLA + if(mbrola_name[0] != 0) + return(MbrolaGenerate(phoneme_list,n_ph,resume)); +#endif + + if(option_quiet) + return(0); + + if(resume == 0) + { + ix = 1; + embedded_ix=0; + word_count = 0; + pitch_length = 0; + amp_length = 0; + last_frame = NULL; + last_wcmdq = -1; + syllable_start = wcmdq_tail; + syllable_end = wcmdq_tail; + syllable_centre = -1; + last_pitch_cmd = -1; + memset(vowel_transition,0,sizeof(vowel_transition)); + } + + while(ix < (*n_ph)) + { + p = &phoneme_list[ix]; + + if(p->type == phPAUSE) + free_min = 5; + else + if(p->type != phVOWEL) + free_min = 10; // we need less Q space for non-vowels, and we need to generate phonemes after a vowel so that the pitch_length is filled in + else + free_min = MIN_WCMDQ; // 22 + + if(WcmdqFree() <= free_min) + return(1); // wait + + prev = &phoneme_list[ix-1]; + next = &phoneme_list[ix+1]; + next2 = &phoneme_list[ix+2]; + + if(p->synthflags & SFLAG_EMBEDDED) + { + DoEmbedded(&embedded_ix, p->sourceix); + } + + if(p->newword) + { + if(translator->langopts.param[LOPT_WORD_MERGE] == 0) + last_frame = NULL; + + sourceix = (p->sourceix & 0x7ff) + clause_start_char; + + if(p->newword & 4) + DoMarker(espeakEVENT_SENTENCE, sourceix, 0, count_sentences); // start of sentence + +// if(p->newword & 2) +// DoMarker(espeakEVENT_END, count_characters, 0, count_sentences); // end of clause + + if(p->newword & 1) + DoMarker(espeakEVENT_WORD, sourceix, p->sourceix >> 11, clause_start_word + word_count++); + } + + EndAmplitude(); + + if(p->prepause > 0) + DoPause(p->prepause,1); + + if(option_phoneme_events && (p->type != phVOWEL)) + { + // Note, for vowels, do the phoneme event after the vowel-start + DoMarker(espeakEVENT_PHONEME, sourceix, 0, p->ph->mnemonic); + } + + switch(p->type) + { + case phPAUSE: + DoPause(p->length,0); + break; + + case phSTOP: + released = 0; + if(next->type==phVOWEL) released = 1; + if(next->type==phLIQUID && !next->newword) released = 1; + + if(released) + DoSample(p->ph,next->ph,2,0,0); + else + DoSample(p->ph,phoneme_tab[phonPAUSE],2,0,0); + break; + + case phFRICATIVE: + if(p->synthflags & SFLAG_LENGTHEN) + DoSample(p->ph,next->ph,2,p->length,0); // play it twice for [s:] etc. + DoSample(p->ph,next->ph,2,p->length,0); + break; + + case phVSTOP: + pre_voiced = 0; + if(next->type==phVOWEL) + { + DoAmplitude(p->amp,NULL); + DoPitch(envelope_data[p->env],p->pitch1,p->pitch2); + pre_voiced = 1; + } + else + if((next->type==phLIQUID) && !next->newword) + { + DoAmplitude(next->amp,NULL); + DoPitch(envelope_data[next->env],next->pitch1,next->pitch2); + pre_voiced = 1; + } + else + { + if(last_pitch_cmd < 0) + { + DoAmplitude(next->amp,NULL); + DoPitch(envelope_data[p->env],p->pitch1,p->pitch2); + } + } + + if((prev->type==phVOWEL) || (prev->ph->phflags & phVOWEL2)) + { + // a period of voicing before the release + DoSpect(p->ph,phoneme_tab[phonSCHWA],next->ph,1,p,0); + if(p->synthflags & SFLAG_LENGTHEN) + { + DoPause(20,0); + DoSpect(p->ph,phoneme_tab[phonSCHWA],next->ph,1,p,0); + } + } + else + { + if(p->synthflags & SFLAG_LENGTHEN) + { + DoPause(50,0); + } + } + + if(pre_voiced) + { + // followed by a vowel, or liquid + vowel + StartSyllable(); + DoSpect(p->ph,prev->ph,next->ph,2,p,0); + } + else + { +// if((prev->type != phVOWEL) && ((prev->ph->phflags & phVOICED)==0) && ((next->ph->phflags & phVOICED)==0)) +// DoSpect(p->ph,prev->ph,phoneme_tab[phonPAUSE_SHORT],2,p,0); +// else + DoSpect(p->ph,prev->ph,phoneme_tab[phonPAUSE],2,p,0); +// DoSpect(p->ph,prev->ph,next->ph,2,p,0); + } + break; + + case phVFRICATIVE: + if(next->type==phVOWEL) + { + DoAmplitude(p->amp,NULL); + DoPitch(envelope_data[p->env],p->pitch1,p->pitch2); + } + else + if(next->type==phLIQUID) + { + DoAmplitude(next->amp,NULL); + DoPitch(envelope_data[next->env],next->pitch1,next->pitch2); + } + else + { + if(last_pitch_cmd < 0) + { + DoAmplitude(p->amp,NULL); + DoPitch(envelope_data[p->env],p->pitch1,p->pitch2); + } + } + + if((next->type==phVOWEL) || ((next->type==phLIQUID)) && (next->newword==0)) // ?? test 14.Aug.2007 + { + StartSyllable(); + if(p->synthflags & SFLAG_LENGTHEN) + DoSpect(p->ph,prev->ph,next->ph,2,p,0); + DoSpect(p->ph,prev->ph,next->ph,2,p,0); + } + else + { + if(p->synthflags & SFLAG_LENGTHEN) + DoSpect(p->ph,prev->ph,phoneme_tab[phonPAUSE],2,p,0); + DoSpect(p->ph,prev->ph,phoneme_tab[phonPAUSE],2,p,0); + } + break; + + case phNASAL: + if(!(p->synthflags & SFLAG_SEQCONTINUE)) + { + DoAmplitude(p->amp,NULL); + DoPitch(envelope_data[p->env],p->pitch1,p->pitch2); + } + + if(prev->type==phNASAL) + { + last_frame = NULL; + } + + if(next->type==phVOWEL) + { + StartSyllable(); + DoSpect(p->ph,prev->ph,next->ph,1,p,0); + } + else + if(prev->type==phVOWEL && (p->synthflags & SFLAG_SEQCONTINUE)) + { + DoSpect(p->ph,prev->ph,phoneme_tab[phonPAUSE],2,p,0); + } + else + { + last_frame = NULL; // only for nasal ? + if(next->type == phLIQUID) + DoSpect(p->ph,prev->ph,phoneme_tab[phonSONORANT],2,p,0); + else + DoSpect(p->ph,prev->ph,phoneme_tab[phonPAUSE],2,p,0); + last_frame = NULL; + } + + break; + + case phLIQUID: + modulation = 0; + if(p->ph->phflags & phTRILL) + modulation = 5; + + prev_ph = prev->ph; +// if(p->newword) +// prev_ph = phoneme_tab[phonPAUSE]; // pronounce fully at the start of a word + + if(!(p->synthflags & SFLAG_SEQCONTINUE)) + { + DoAmplitude(p->amp,NULL); + DoPitch(envelope_data[p->env],p->pitch1,p->pitch2); + } + + if(prev->type==phNASAL) + { + last_frame = NULL; + } + + if(next->type==phVOWEL) + { + StartSyllable(); + DoSpect(p->ph,prev_ph,next->ph,1,p,modulation); // (,)r + } + else + if(prev->type==phVOWEL && (p->synthflags & SFLAG_SEQCONTINUE)) + { + DoSpect(p->ph,prev_ph,next->ph,1,p,modulation); + } + else + { + DoSpect(p->ph,prev_ph,next->ph,1,p,modulation); + } + + break; + + case phVOWEL: + ph = p->ph; + stress = p->stresslevel & 0xf; + + // vowel transition from the preceding phoneme + vowel_transition0 = vowel_transition[0]; + vowel_transition1 = vowel_transition[1]; + + pitch_env = envelope_data[p->env]; + amp_env = NULL; + if(p->tone_ph != 0) + { + pitch_env = LookupEnvelope(phoneme_tab[p->tone_ph]->spect); + amp_env = LookupEnvelope(phoneme_tab[p->tone_ph]->after); + } + + StartSyllable(); + + modulation = 2; + if(stress <= 1) + modulation = 1; // 16ths + else + if(stress >= 7) + modulation = 3; + + if(prev->type == phVSTOP || prev->type == phVFRICATIVE) + { + DoAmplitude(p->amp,amp_env); + DoPitch(pitch_env,p->pitch1,p->pitch2); // don't use prevocalic rising tone + DoSpect(ph,prev->ph,next->ph,1,p,modulation); + } + else + if(prev->type==phLIQUID || prev->type==phNASAL) + { + DoAmplitude(p->amp,amp_env); + DoSpect(ph,prev->ph,next->ph,1,p,modulation); // continue with pre-vocalic rising tone + DoPitch(pitch_env,p->pitch1,p->pitch2); + } + else + { + if(!(p->synthflags & SFLAG_SEQCONTINUE)) + { + DoAmplitude(p->amp,amp_env); + DoPitch(pitch_env,p->pitch1,p->pitch2); + } + + DoSpect(ph,prev->ph,next->ph,1,p,modulation); + } + + if(option_phoneme_events) + { + DoMarker(espeakEVENT_PHONEME, sourceix, 0, p->ph->mnemonic); + } + + DoSpect(p->ph,prev->ph,next->ph,2,p,modulation); + + memset(vowel_transition,0,sizeof(vowel_transition)); + break; + } + ix++; + } + EndPitch(1); + if(*n_ph > 0) + { + DoMarker(espeakEVENT_END, count_characters, 0, count_sentences); // end of clause + *n_ph = 0; + } + + return(0); // finished the phoneme list +} // end of Generate + + + + +static int timer_on = 0; +static int paused = 0; + +int SynthOnTimer() +{//=============== + if(!timer_on) + { + return(WavegenCloseSound()); + } + + do { + if(WcmdqUsed() > 0) + WavegenOpenSound(); + + if(Generate(phoneme_list,&n_phoneme_list,1)==0) + { + SpeakNextClause(NULL,NULL,1); + } + } while(skipping_text); + + return(0); +} + + +int SynthStatus() +{//============== + return(timer_on | paused); +} + + + +int SpeakNextClause(FILE *f_in, const void *text_in, int control) +{//============================================================== +// Speak text from file (f_in) or memory (text_in) +// control 0: start +// either f_in or text_in is set, the other must be NULL + +// The other calls have f_in and text_in = NULL +// control 1: speak next text +// 2: stop +// 3: pause (toggle) +// 4: is file being read (0=no, 1=yes) +// 5: interrupt and flush current text. + + int clause_tone; + char *voice_change; + static FILE *f_text=NULL; + static const void *p_text=NULL; + + if(control == 4) + { + if((f_text == NULL) && (p_text == NULL)) + return(0); + else + return(1); + } + + if(control == 2) + { + // stop speaking + timer_on = 0; + p_text = NULL; + if(f_text != NULL) + { + fclose(f_text); + f_text=NULL; + } + n_phoneme_list = 0; + WcmdqStop(); + + embedded_value[EMBED_T] = 0; + return(0); + } + + if(control == 3) + { + // toggle pause + if(paused == 0) + { + timer_on = 0; + paused = 2; + } + else + { + WavegenOpenSound(); + timer_on = 1; + paused = 0; + Generate(phoneme_list,&n_phoneme_list,0); // re-start from beginning of clause + } + return(0); + } + + if(control == 5) + { + // stop speaking, but continue looking for text + n_phoneme_list = 0; + WcmdqStop(); + return(0); + } + + if((f_in != NULL) || (text_in != NULL)) + { + f_text = f_in; + p_text = text_in; + timer_on = 1; + paused = 0; + } + + if((f_text==NULL) && (p_text==NULL)) + { + skipping_text = 0; + timer_on = 0; + return(0); + } + + if((f_text != NULL) && feof(f_text)) + { + timer_on = 0; + fclose(f_text); + f_text=NULL; + return(0); + } + + if(current_phoneme_table != voice->phoneme_tab_ix) + { + SelectPhonemeTable(voice->phoneme_tab_ix); + } + + // read the next clause from the input text file, translate it, and generate + // entries in the wavegen command queue + p_text = TranslateClause(translator, f_text, p_text, &clause_tone, &voice_change); + + CalcPitches(translator, clause_tone); + CalcLengths(translator); + + GetTranslatedPhonemeString(translator->phon_out,sizeof(translator->phon_out)); + if(option_phonemes > 0) + { + fprintf(f_trans,"%s\n",translator->phon_out); + + if(!iswalpha(0x010d)) + { + // check that c-caron is recognized as an alphabetic character + fprintf(stderr,"Warning: Accented letters are not recognized, eg: U+010D\nSet LC_CTYPE to a UTF-8 locale\n"); + } + } + if(phoneme_callback != NULL) + { + phoneme_callback(translator->phon_out); + } + + + if(skipping_text) + { + n_phoneme_list = 0; + return(1); + } + + if(mbrola_name[0] != 0) + { +#ifdef USE_MBROLA_LIB + MbrolaTranslate(phoneme_list,n_phoneme_list,NULL); +#else + { + FILE *f_mbrola; + if((f_mbrola = f_trans) == stderr) + f_mbrola = stdout; + MbrolaTranslate(phoneme_list,n_phoneme_list,f_mbrola); + } +#endif + } + + Generate(phoneme_list,&n_phoneme_list,0); + WavegenOpenSound(); + + if(voice_change != NULL) + { + // voice change at the end of the clause (i.e. clause was terminated by a voice change) + new_voice = LoadVoiceVariant(voice_change,0); // add a Voice instruction to wavegen at the end of the clause + } + + if(new_voice) + { + // finished the current clause, now change the voice if there was an embedded + // change voice command at the end of it (i.e. clause was broken at the change voice command) + DoVoiceChange(voice); + new_voice = NULL; + } + + return(1); +} // end of SpeakNextClause + diff --git a/navit/support/espeak/tr_languages.c b/navit/support/espeak/tr_languages.c new file mode 100644 index 0000000..2416755 --- /dev/null +++ b/navit/support/espeak/tr_languages.c @@ -0,0 +1,1335 @@ +/*************************************************************************** + * Copyright (C) 2005 to 2007 by Jonathan Duddington * + * email: jonsd@users.sourceforge.net * + * * + * 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; either version 3 of the License, or * + * (at your option) any later version. * + * * + * 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, see: * + * . * + ***************************************************************************/ + +#include "StdAfx.h" + +#include +#include +#include +#include +#include +#include + +#include + +#include "speak_lib.h" +#include "speech.h" +#include "phoneme.h" +#include "synthesize.h" +#include "translate.h" + + + +#define L_qa 0x716100 +#define L_grc 0x677263 // grc Ancient Greek +#define L_jbo 0x6a626f // jbo Lojban +#define L_pap 0x706170 // pap Papiamento +#define L_zhy 0x7a6879 // zhy + +// start of unicode pages for character sets +#define OFFSET_GREEK 0x380 +#define OFFSET_CYRILLIC 0x420 +#define OFFSET_ARMENIAN 0x530 +#define OFFSET_DEVANAGARI 0x900 +#define OFFSET_BENGALI 0x980 +#define OFFSET_TAMIL 0xb80 +#define OFFSET_KANNADA 0xc80 +#define OFFSET_MALAYALAM 0xd00 +#define OFFSET_KOREAN 0x1100 + +static void Translator_Russian(Translator *tr); + +static void SetLetterVowel(Translator *tr, int c) +{//============================================== + tr->letter_bits[c] = (tr->letter_bits[c] & 0x40) | 0x81; // keep value for group 6 (front vowels e,i,y) +} + +static void ResetLetterBits(Translator *tr, int groups) +{//==================================================== +// Clear all the specified groups + unsigned int ix; + unsigned int mask; + + mask = ~groups; + + for(ix=0; ixletter_bits); ix++) + { + tr->letter_bits[ix] &= mask; + } +} + +static void SetLetterBits(Translator *tr, int group, const char *string) +{//===================================================================== + int bits; + unsigned char c; + + bits = (1L << group); + while((c = *string++) != 0) + tr->letter_bits[c] |= bits; +} + +static void SetLetterBitsRange(Translator *tr, int group, int first, int last) +{//=========================================================================== + int bits; + int ix; + + bits = (1L << group); + for(ix=first; ix<=last; ix++) + { + tr->letter_bits[ix] |= bits; + } +} + + +static Translator* NewTranslator(void) +{//=================================== + Translator *tr; + int ix; + static const unsigned char stress_amps2[] = {17,17, 20,20, 20,22, 22,20 }; + static const short stress_lengths2[8] = {182,140, 220,220, 220,240, 260,280}; + static const wchar_t empty_wstring[1] = {0}; + static const wchar_t punct_in_word[2] = {'\'', 0}; // allow hyphen within words + + tr = (Translator *)Alloc(sizeof(Translator)); + if(tr == NULL) + return(NULL); + + tr->charset_a0 = charsets[1]; // ISO-8859-1, this is for when the input is not utf8 + dictionary_name[0] = 0; + tr->dict_condition=0; + tr->data_dictrules = NULL; // language_1 translation rules file + tr->data_dictlist = NULL; // language_2 dictionary lookup file + + tr->transpose_offset = 0; + + // only need lower case + tr->letter_bits_offset = 0; + memset(tr->letter_bits,0,sizeof(tr->letter_bits)); + memset(tr->letter_groups,0,sizeof(tr->letter_groups)); + + // 0-5 sets of characters matched by A B C E F G in pronunciation rules + // these may be set differently for different languages + SetLetterBits(tr,0,"aeiou"); // A vowels, except y + SetLetterBits(tr,1,"bcdfgjklmnpqstvxz"); // B hard consonants, excluding h,r,w + SetLetterBits(tr,2,"bcdfghjklmnpqrstvwxz"); // C all consonants + SetLetterBits(tr,3,"hlmnr"); // H 'soft' consonants + SetLetterBits(tr,4,"cfhkpqstx"); // F voiceless consonants + SetLetterBits(tr,5,"bdgjlmnrvwyz"); // G voiced + SetLetterBits(tr,6,"eiy"); // Letter group Y, front vowels + SetLetterBits(tr,7,"aeiouy"); // vowels, including y + + + tr->char_plus_apostrophe = empty_wstring; + tr->punct_within_word = punct_in_word; + + for(ix=0; ix<8; ix++) + { + tr->stress_amps[ix] = stress_amps2[ix]; + tr->stress_amps_r[ix] = stress_amps2[ix] - 1; + tr->stress_lengths[ix] = stress_lengths2[ix]; + } + memset(&(tr->langopts),0,sizeof(tr->langopts)); + + tr->langopts.stress_rule = 2; + tr->langopts.unstressed_wd1 = 1; + tr->langopts.unstressed_wd2 = 3; + tr->langopts.param[LOPT_SONORANT_MIN] = 95; + tr->langopts.param[LOPT_MAXAMP_EOC] = 19; + tr->langopts.param[LOPT_UNPRONOUNCABLE] = 's'; // don't count this character at start of word + tr->langopts.max_initial_consonants = 3; + tr->langopts.replace_chars = NULL; + tr->langopts.ascii_language = ""; // Non-Latin alphabet languages, use this language to speak Latin words, default is English + + SetLengthMods(tr,201); +// tr->langopts.length_mods = length_mods_en; +// tr->langopts.length_mods0 = length_mods_en0; + + tr->langopts.long_stop = 100; + + tr->langopts.max_roman = 49; + tr->langopts.thousands_sep = ','; + tr->langopts.decimal_sep = '.'; + + memcpy(tr->punct_to_tone, punctuation_to_tone, sizeof(tr->punct_to_tone)); + + return(tr); +} + + +static const unsigned int replace_cyrillic_latin[] = + {0x430,'a', + 0x431,'b', + 0x446,'c', + 0x45b,0x107, + 0x447,0x10d, + 0x45f,'d'+(0x17e<<16), + 0x455,'d'+('z'<<16), + 0x434,'d', + 0x452,0x111, + 0x435,'e', + 0x444,'f', + 0x433,'g', + 0x445,'h', + 0x438,'i', + 0x458,'j', + 0x43a,'k', + 0x459,'l'+('j'<<16), + 0x43b,'l', + 0x43c,'m', + 0x45a,'n'+('j'<<16), + 0x43d,'n', + 0x43e,'o', + 0x43f,'p', + 0x440,'r', + 0x441,'s', + 0x448,0x161, + 0x442,'t', + 0x443,'u', + 0x432,'v', + 0x437,'z', + 0x436,0x17e, + 0x453,0x111, + 0x45c,0x107, +0}; // ѓ ѕ ќ + + +void SetIndicLetters(Translator *tr) +{//================================= + // Set letter types for Indic scripts, Devanagari, Tamill, etc + static const char dev_consonants2[] = {0x02,0x03,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f}; + + memset(tr->letter_bits,0,sizeof(tr->letter_bits)); + SetLetterBitsRange(tr,LETTERGP_A,0x04,0x14); // vowel letters only + SetLetterBitsRange(tr,LETTERGP_B,0x3e,0x4d); // vowel signs, and virama + + SetLetterBitsRange(tr,LETTERGP_C,0x15,0x39); // the main consonant range + SetLetterBits(tr,LETTERGP_C,dev_consonants2); // + additional consonants + + SetLetterBitsRange(tr,LETTERGP_Y,0x04,0x14); // vowel letters + SetLetterBitsRange(tr,LETTERGP_Y,0x3e,0x4c); // + vowel signs + + tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words +} + +void SetupTranslator(Translator *tr, const short *lengths, const unsigned char *amps) +{//================================================================================== + if(lengths != NULL) + memcpy(tr->stress_lengths,lengths,sizeof(tr->stress_lengths)); + if(amps != NULL) + memcpy(tr->stress_amps,amps,sizeof(tr->stress_amps)); +} + + +Translator *SelectTranslator(const char *name) +{//=========================================== + int name2 = 0; + Translator *tr; + + static const unsigned char stress_amps_sk[8] = {17,17, 20,20, 20,22, 22,21 }; + static const short stress_lengths_sk[8] = {190,190, 210,210, 0,0, 210,210}; + + // convert name string into a word of up to 4 characters, for the switch() + while(*name != 0) + name2 = (name2 << 8) + *name++; + + tr = NewTranslator(); + + switch(name2) + { + case L('a','f'): + { + static const short stress_lengths_af[8] = {170,140, 220,220, 0, 0, 250,270}; + SetupTranslator(tr,stress_lengths_af,NULL); + + tr->langopts.stress_rule = 0; + tr->langopts.vowel_pause = 0x30; + tr->langopts.param[LOPT_DIERESES] = 1; + tr->langopts.param[LOPT_PREFIXES] = 1; + SetLetterVowel(tr,'y'); // add 'y' to vowels + + tr->langopts.numbers = 0x8d1 + NUM_ROMAN; + tr->langopts.accents = 1; + } + break; + + case L('b','n'): // Bengali + { + static const short stress_lengths_bn[8] = {180, 180, 210, 210, 0, 0, 230, 240}; + static const unsigned char stress_amps_bn[8] = {18,18, 18,18, 20,20, 22,22 }; + + SetupTranslator(tr,stress_lengths_bn,stress_amps_bn); + tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable + + tr->langopts.stress_rule = 0; + tr->langopts.stress_flags = 0x10004; // use 'diminished' for unstressed final syllable + tr->letter_bits_offset = OFFSET_BENGALI; + SetIndicLetters(tr); // call this after setting OFFSET_BENGALI + SetLetterBitsRange(tr,LETTERGP_F,0x3e,0x4c); // vowel signs, but not virama + + tr->langopts.numbers = 0x1; + tr->langopts.numbers2 = NUM2_100000; + } + break; + + case L('c','y'): // Welsh + { + static const short stress_lengths_cy[8] = {170,220, 180,180, 0, 0, 250,270}; + static const unsigned char stress_amps_cy[8] = {17,15, 18,18, 0,0, 22,20 }; // 'diminished' is used to mark a quieter, final unstressed syllable + + SetupTranslator(tr,stress_lengths_cy,stress_amps_cy); + + tr->charset_a0 = charsets[14]; // ISO-8859-14 +// tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable + tr->langopts.stress_rule = 2; +// tr->langopts.intonation_group = 4; + + // 'diminished' is an unstressed final syllable + tr->langopts.stress_flags = 0x6 | 0x10; + tr->langopts.unstressed_wd1 = 0; + tr->langopts.unstressed_wd2 = 2; + tr->langopts.param[LOPT_SONORANT_MIN] = 120; // limit the shortening of sonorants before short vowels + + tr->langopts.numbers = 0x401; + + SetLetterVowel(tr,'w'); // add letter to vowels and remove from consonants + SetLetterVowel(tr,'y'); + } + break; + + case L('d','a'): // Danish + { + static const short stress_lengths_da[8] = {160,140, 200,200, 0,0, 220,210}; + SetupTranslator(tr,stress_lengths_da,NULL); + + tr->langopts.stress_rule = 0; + SetLetterVowel(tr,'y'); + tr->langopts.numbers = 0x10c59; + } + break; + + + case L('d','e'): + { + static const short stress_lengths_de[8] = {150,130, 200,200, 0, 0, 260,275}; + tr->langopts.stress_rule = 0; + tr->langopts.word_gap = 0x8; // don't use linking phonemes + tr->langopts.vowel_pause = 0x30; + tr->langopts.param[LOPT_PREFIXES] = 1; + memcpy(tr->stress_lengths,stress_lengths_de,sizeof(tr->stress_lengths)); + + tr->langopts.numbers = 0x11419 + NUM_ROMAN; + SetLetterVowel(tr,'y'); + } + break; + + case L('e','n'): + { + static const short stress_lengths_en[8] = {182,140, 220,220, 0,0, 248,275}; + SetupTranslator(tr,stress_lengths_en,NULL); + + tr->langopts.stress_rule = 0; + tr->langopts.numbers = 0x841 + NUM_ROMAN; + tr->langopts.param[LOPT_COMBINE_WORDS] = 2; // allow "mc" to cmbine with the following word + } + break; + + case L('e','l'): // Greek + case L_grc: // Ancient Greek + { + static const short stress_lengths_el[8] = {155, 180, 210, 210, 0, 0, 270, 300}; + static const unsigned char stress_amps_el[8] = {15,12, 20,20, 20,22, 22,21 }; // 'diminished' is used to mark a quieter, final unstressed syllable + + // character codes offset by 0x380 + static const char el_vowels[] = {0x10,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x35,0x37,0x39,0x3f,0x45,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0}; + static const char el_fvowels[] = {0x2d,0x2e,0x2f,0x35,0x37,0x39,0x45,0x4d,0}; // ε η ι υ έ ή ί ύ + static const char el_voiceless[]= {0x38,0x3a,0x3e,0x40,0x42,0x43,0x44,0x46,0x47,0}; // θ κ ξ π ς σ τ φ χ + static const char el_consonants[]={0x32,0x33,0x34,0x36,0x38,0x3a,0x3b,0x3c,0x3d,0x3e,0x40,0x41,0x42,0x43,0x44,0x46,0x47,0x48,0}; + static const wchar_t el_char_apostrophe[] = {0x3c3,0}; // σ + + SetupTranslator(tr,stress_lengths_el,stress_amps_el); + + tr->charset_a0 = charsets[7]; // ISO-8859-7 + tr->char_plus_apostrophe = el_char_apostrophe; + + tr->letter_bits_offset = OFFSET_GREEK; + memset(tr->letter_bits,0,sizeof(tr->letter_bits)); + SetLetterBits(tr,LETTERGP_A,el_vowels); + SetLetterBits(tr,LETTERGP_B,el_voiceless); + SetLetterBits(tr,LETTERGP_C,el_consonants); + SetLetterBits(tr,LETTERGP_Y,el_fvowels); // front vowels: ε η ι υ + + tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable + tr->langopts.stress_rule = 2; + tr->langopts.stress_flags = 0x6; // mark unstressed final syllables as diminished + tr->langopts.unstressed_wd1 = 0; + tr->langopts.unstressed_wd2 = 2; + tr->langopts.param[LOPT_SONORANT_MIN] = 130; // limit the shortening of sonorants before short vowels + + tr->langopts.numbers = 0x109; + tr->langopts.numbers2 = 0x2; // variant form of numbers before thousands + + if(name2 == L_grc) + { + // ancient greek + tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; + } + } + break; + + case L('e','o'): + { + static const short stress_lengths_eo[8] = {145, 145, 230, 170, 0, 0, 360, 370}; + static const unsigned char stress_amps_eo[] = {16,14, 20,20, 20,22, 22,21 }; + static const wchar_t eo_char_apostrophe[2] = {'l',0}; + + SetupTranslator(tr,stress_lengths_eo,stress_amps_eo); + + tr->charset_a0 = charsets[3]; // ISO-8859-3 + tr->char_plus_apostrophe = eo_char_apostrophe; + + tr->langopts.word_gap = 1; + tr->langopts.vowel_pause = 2; + tr->langopts.stress_rule = 2; + tr->langopts.stress_flags = 0x6 | 0x10; + tr->langopts.unstressed_wd1 = 3; + tr->langopts.unstressed_wd2 = 2; + + tr->langopts.numbers = 0x1409 + NUM_ROMAN; + } + break; + + case L('e','s'): // Spanish + case L('c','a'): // Catalan + case L_pap: // Papiamento + { + static const short stress_lengths_es[8] = {180, 210, 190, 190, 0, 0, 230, 260}; +// static const short stress_lengths_es[8] = {170, 200, 180, 180, 0, 0, 220, 250}; + static const unsigned char stress_amps_es[8] = {16,12, 18,18, 20,20, 20,20 }; // 'diminished' is used to mark a quieter, final unstressed syllable + static const wchar_t ca_punct_within_word[] = {'\'',0xb7,0}; // ca: allow middle-dot within word + + SetupTranslator(tr,stress_lengths_es,stress_amps_es); + + tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable + tr->langopts.stress_rule = 2; + + // stress last syllable if it doesn't end in vowel or "s" or "n" + // 'diminished' is an unstressed final syllable + tr->langopts.stress_flags = 0x200 | 0x6 | 0x10; + tr->langopts.unstressed_wd1 = 0; + tr->langopts.unstressed_wd2 = 2; + tr->langopts.param[LOPT_SONORANT_MIN] = 120; // limit the shortening of sonorants before short vowels + + tr->langopts.numbers = 0x529 + NUM_ROMAN + NUM_ROMAN_AFTER; + + if(name2 == L('c','a')) + { + tr->punct_within_word = ca_punct_within_word; + tr->langopts.stress_flags = 0x200 | 0x6 | 0x30; // stress last syllable unless word ends with a vowel + } + else + if(name2 == L_pap) + { + tr->langopts.stress_flags = 0x100 | 0x6 | 0x30; // stress last syllable unless word ends with a vowel + } + } + break; + + + case L('e','u'): // basque + { + static const short stress_lengths_eu[8] = {200, 200, 200, 200, 0, 0, 210, 230}; // very weak stress + static const unsigned char stress_amps_eu[8] = {16,16, 18,18, 18,18, 18,18 }; + SetupTranslator(tr,stress_lengths_eu,stress_amps_eu); + tr->langopts.stress_rule = 1; // ?? second syllable ?? + tr->langopts.numbers = 0x569 + NUM_VIGESIMAL; + } + break; + + + case L('f','i'): // Finnish + { + static const unsigned char stress_amps_fi[8] = {18,16, 22,22, 20,22, 22,22 }; + static const short stress_lengths_fi[8] = {150,180, 200,200, 0,0, 210,250}; + + SetupTranslator(tr,stress_lengths_fi,stress_amps_fi); + + tr->langopts.stress_rule = 0; + tr->langopts.stress_flags = 0x56; // move secondary stress from light to a following heavy syllable + tr->langopts.param[LOPT_IT_DOUBLING] = 1; + tr->langopts.long_stop = 130; + + tr->langopts.numbers = 0x1009; + SetLetterVowel(tr,'y'); +// tr->langopts.max_initial_consonants = 2; // BUT foreign words may have 3 + tr->langopts.spelling_stress = 1; + tr->langopts.intonation_group = 3; // less intonation, don't raise pitch at comma + } + break; + + + case L('f','r'): // french + { + static const short stress_lengths_fr[8] = {190, 170, 190, 200, 0, 0, 235, 240}; + static const unsigned char stress_amps_fr[8] = {18,16, 20,20, 20,22, 22,21 }; + + SetupTranslator(tr,stress_lengths_fr,stress_amps_fr); + tr->langopts.stress_rule = 3; // stress on final syllable + tr->langopts.stress_flags = 0x0024; // don't use secondary stress + tr->langopts.param[LOPT_IT_LENGTHEN] = 1; // remove lengthen indicator from unstressed syllables + + tr->langopts.numbers = 0x1509 + 0x8000 + NUM_NOPAUSE | NUM_ROMAN | NUM_VIGESIMAL; + SetLetterVowel(tr,'y'); + } + break; + +#ifdef deleted + case L('g','a'): // Irish Gaelic + { + tr->langopts.stress_rule = 1; + } + break; +#endif + + case L('h','i'): // Hindi + case L('n','e'): // Nepali + { + static const short stress_lengths_hi[8] = {190, 190, 210, 210, 0, 0, 230, 250}; + static const unsigned char stress_amps_hi[8] = {17,14, 20,19, 20,22, 22,21 }; + + SetupTranslator(tr,stress_lengths_hi,stress_amps_hi); + tr->charset_a0 = charsets[19]; // ISCII + tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable + + tr->langopts.stress_rule = 6; // stress on last heaviest syllable, excluding final syllable + tr->langopts.stress_flags = 0x10004; // use 'diminished' for unstressed final syllable + tr->langopts.numbers = 0x011; + tr->langopts.numbers2 = NUM2_100000; + tr->letter_bits_offset = OFFSET_DEVANAGARI; + SetIndicLetters(tr); + } + break; + + + case L('h','r'): // Croatian + case L('b','s'): // Bosnian + case L('s','r'): // Serbian + { + static const unsigned char stress_amps_hr[8] = {17,17, 20,20, 20,22, 22,21 }; + static const short stress_lengths_hr[8] = {180,160, 200,200, 0,0, 220,230}; + static const short stress_lengths_sr[8] = {160,150, 200,200, 0,0, 250,260}; + + if(name2 == L('s','r')) + SetupTranslator(tr,stress_lengths_sr,stress_amps_hr); + else + SetupTranslator(tr,stress_lengths_hr,stress_amps_hr); + tr->charset_a0 = charsets[2]; // ISO-8859-2 + + tr->langopts.stress_rule = 0; + tr->langopts.stress_flags = 0x10; + tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x3; + tr->langopts.max_initial_consonants = 5; + tr->langopts.spelling_stress = 1; + tr->langopts.accents = 1; + + tr->langopts.numbers = 0x140d + 0x4000 + NUM_ROMAN_UC; + tr->langopts.numbers2 = 0x4a; // variant numbers before thousands,milliards + tr->langopts.replace_chars = replace_cyrillic_latin; + + SetLetterVowel(tr,'y'); + SetLetterVowel(tr,'r'); + } + break; + + + case L('h','u'): // Hungarian + { + static const unsigned char stress_amps_hu[8] = {17,17, 19,19, 20,22, 22,21 }; + static const short stress_lengths_hu[8] = {185,195, 195,190, 0,0, 210,220}; + + SetupTranslator(tr,stress_lengths_hu,stress_amps_hu); + tr->charset_a0 = charsets[2]; // ISO-8859-2 + + tr->langopts.vowel_pause = 0x20; + tr->langopts.stress_rule = 0; + tr->langopts.stress_flags = 0x8036; + tr->langopts.unstressed_wd1 = 2; +// tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x4; // don't propagate over word boundaries + tr->langopts.param[LOPT_IT_DOUBLING] = 1; + tr->langopts.param[LOPT_COMBINE_WORDS] = 99; // combine some prepositions with the following word + + tr->langopts.numbers = 0x1009 + 0xa000 + NUM_ROMAN + 0x10000; + SetLetterVowel(tr,'y'); + tr->langopts.spelling_stress = 1; +SetLengthMods(tr,3); // all equal + } + break; + + case L('h','y'): // Armenian + { + static const short stress_lengths_hy[8] = {250, 200, 250, 250, 0, 0, 250, 250}; + static const char hy_vowels[] = {0x31, 0x35, 0x37, 0x38, 0x3b, 0x48, 0x55, 0}; + static const char hy_consonants[] = {0x32,0x33,0x34,0x36,0x39,0x3a,0x3c,0x3d,0x3e,0x3f, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x56,0}; + + SetupTranslator(tr,stress_lengths_hy,NULL); + tr->langopts.stress_rule = 3; // default stress on final syllable + + tr->letter_bits_offset = OFFSET_ARMENIAN; + memset(tr->letter_bits,0,sizeof(tr->letter_bits)); + SetLetterBits(tr,LETTERGP_A,hy_vowels); + SetLetterBits(tr,LETTERGP_C,hy_consonants); + tr->langopts.max_initial_consonants = 6; + tr->langopts.numbers = 0x409; +// tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words + } + break; + + case L('i','d'): // Indonesian + { + static const short stress_lengths_id[8] = {160, 200, 180, 180, 0, 0, 220, 240}; + static const unsigned char stress_amps_id[8] = {16,18, 18,18, 20,22, 22,21 }; + + SetupTranslator(tr,stress_lengths_id,stress_amps_id); + tr->langopts.stress_rule = 2; + tr->langopts.numbers = 0x1009 + NUM_ROMAN; + tr->langopts.stress_flags = 0x6 | 0x10; + tr->langopts.accents = 2; // "capital" after letter name + } + break; + + case L('i','s'): // Icelandic + { + static const short stress_lengths_is[8] = {180,160, 200,200, 0,0, 240,250}; + static const wchar_t is_lettergroup_B[] = {'c','f','h','k','p','t','x',0xfe,0}; // voiceless conants, including 'þ' ?? 's' + + SetupTranslator(tr,stress_lengths_is,NULL); + tr->langopts.stress_rule = 0; + tr->langopts.stress_flags = 0x10; + tr->langopts.param[LOPT_IT_LENGTHEN] = 0x11; // remove lengthen indicator from unstressed vowels + tr->langopts.param[LOPT_REDUCE] = 2; + + ResetLetterBits(tr,0x18); + SetLetterBits(tr,4,"kpst"); // Letter group F + SetLetterBits(tr,3,"jvr"); // Letter group H + tr->letter_groups[1] = is_lettergroup_B; + SetLetterVowel(tr,'y'); + tr->langopts.numbers = 0x8e9; + tr->langopts.numbers2 = 0x2; + } + break; + + case L('i','t'): // Italian + { + static const short stress_lengths_it[8] = {150, 140, 170, 170, 0, 0, 300, 330}; + static const unsigned char stress_amps_it[8] = {15,14, 19,19, 20,22, 22,20 }; + + SetupTranslator(tr,stress_lengths_it,stress_amps_it); + + tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable + tr->langopts.stress_rule = 2; + tr->langopts.stress_flags = 0x10 | 0x20000; + tr->langopts.vowel_pause = 1; + tr->langopts.unstressed_wd1 = 2; + tr->langopts.unstressed_wd2 = 2; + tr->langopts.param[LOPT_IT_LENGTHEN] = 2; // remove lengthen indicator from unstressed or non-penultimate syllables + tr->langopts.param[LOPT_IT_DOUBLING] = 2; // double the first consonant if the previous word ends in a stressed vowel + tr->langopts.param[LOPT_SONORANT_MIN] = 130; // limit the shortening of sonorants before short vowels + tr->langopts.param[LOPT_REDUCE] = 1; // reduce vowels even if phonemes are specified in it_list + tr->langopts.param[LOPT_ALT] = 2; // call ApplySpecialAttributes2() if a word has $alt or $alt2 + tr->langopts.numbers = 0x2709 + NUM_ROMAN; + tr->langopts.accents = 2; // Say "Capital" after the letter. + SetLetterVowel(tr,'y'); + } + break; + + case L_jbo: // Lojban + { + static const short stress_lengths_jbo[8] = {145,145, 170,160, 0,0, 330,350}; + static const wchar_t jbo_punct_within_word[] = {'.',',','\'',0x2c8,0}; // allow period and comma within a word, also stress marker (from LOPT_CAPS_IN_WORD) + + SetupTranslator(tr,stress_lengths_jbo,NULL); + tr->langopts.stress_rule = 2; + tr->langopts.vowel_pause = 0x20c; // pause before a word which starts with a vowel, or after a word which ends in a consonant +// tr->langopts.word_gap = 1; + tr->punct_within_word = jbo_punct_within_word; + tr->langopts.param[LOPT_CAPS_IN_WORD] = 2; // capitals indicate stressed syllables + SetLetterVowel(tr,'y'); + } + break; + + case L('k','o'): // Korean, TEST + { + static const char ko_ivowels[] = {0x63,0x64,0x67,0x68,0x6d,0x72,0x74,0x75,0}; // y and i vowels + static const unsigned char ko_voiced[] = {0x02,0x05,0x06,0xab,0xaf,0xb7,0xbc,0}; // voiced consonants, l,m,n,N + + tr->letter_bits_offset = OFFSET_KOREAN; + memset(tr->letter_bits,0,sizeof(tr->letter_bits)); + SetLetterBitsRange(tr,LETTERGP_A,0x61,0x75); + SetLetterBits(tr,LETTERGP_Y,ko_ivowels); + SetLetterBits(tr,LETTERGP_G,(const char *)ko_voiced); + + tr->langopts.stress_rule = 8; // ?? 1st syllable if it is heavy, else 2nd syllable + tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words + tr->langopts.numbers = 0x0401; + } + break; + + case L('k','u'): // Kurdish + { + static const unsigned char stress_amps_ku[8] = {18,18, 20,20, 20,22, 22,21 }; + static const short stress_lengths_ku[8] = {180,180, 190,180, 0,0, 230,240}; + + SetupTranslator(tr,stress_lengths_ku,stress_amps_ku); + tr->charset_a0 = charsets[9]; // ISO-8859-9 - Latin5 + + tr->langopts.stress_rule = 7; // stress on the last syllable, before any explicitly unstressed syllable + + tr->langopts.numbers = 0x100461; + tr->langopts.max_initial_consonants = 2; + } + break; + + case L('l','a'): //Latin + { + tr->charset_a0 = charsets[4]; // ISO-8859-4, includes a,e,i,o,u-macron + tr->langopts.stress_rule = 2; + tr->langopts.stress_flags = 0x20; + tr->langopts.unstressed_wd1 = 0; + tr->langopts.unstressed_wd2 = 2; + tr->langopts.param[LOPT_DIERESES] = 1; + tr->langopts.numbers = 0x1 + NUM_ROMAN; + tr->langopts.max_roman = 5000; + } + break; + + case L('l','v'): // latvian + { + static const unsigned char stress_amps_lv[8] = {17,13, 20,20, 20,22, 22,21 }; + static const short stress_lengths_lv[8] = {180,130, 210,210, 0,0, 210,210}; + + SetupTranslator(tr,stress_lengths_lv,stress_amps_lv); + + tr->langopts.stress_rule = 0; + tr->langopts.spelling_stress = 1; + tr->charset_a0 = charsets[4]; // ISO-8859-4 + tr->langopts.numbers = 0x409 + 0x8000 + 0x10000; + tr->langopts.stress_flags = 0x16 + 0x40000; + } + break; + + case L('m','k'): // Macedonian + { + static wchar_t vowels_cyrillic[] = {0x440, // also include 'р' [R] + 0x430,0x435,0x438,0x439,0x43e,0x443,0x44b,0x44d,0x44e,0x44f,0x450,0x451,0x456,0x457,0x45d,0x45e,0}; + static const unsigned char stress_amps_mk[8] = {17,17, 20,20, 20,22, 22,21 }; + static const short stress_lengths_mk[8] = {180,160, 200,200, 0,0, 220,230}; + + SetupTranslator(tr,stress_lengths_mk,stress_amps_mk); + tr->charset_a0 = charsets[5]; // ISO-8859-5 + tr->letter_groups[0] = vowels_cyrillic; + + tr->langopts.stress_rule = 4; // antipenultimate + tr->langopts.numbers = 0x0429 + 0x4000; + tr->langopts.numbers2 = 0x8a; // variant numbers before thousands,milliards + } + break; + + + case L('n','l'): // Dutch + { + static const short stress_lengths_nl[8] = {160,135, 210,210, 0, 0, 260,280}; + + tr->langopts.stress_rule = 0; + tr->langopts.vowel_pause = 1; + tr->langopts.param[LOPT_DIERESES] = 1; + tr->langopts.param[LOPT_PREFIXES] = 1; + SetLetterVowel(tr,'y'); + + tr->langopts.numbers = 0x11c19; + memcpy(tr->stress_lengths,stress_lengths_nl,sizeof(tr->stress_lengths)); + } + break; + + case L('n','o'): // Norwegian + { + static const short stress_lengths_no[8] = {160,140, 200,200, 0,0, 220,210}; + + SetupTranslator(tr,stress_lengths_no,NULL); + tr->langopts.stress_rule = 0; + SetLetterVowel(tr,'y'); + tr->langopts.numbers = 0x11849; + } + break; + + case L('o','m'): + { + static const unsigned char stress_amps_om[] = {18,15, 20,20, 20,22, 22,22 }; + static const short stress_lengths_om[8] = {200,200, 200,200, 0,0, 200,200}; + + SetupTranslator(tr,stress_lengths_om,stress_amps_om); + tr->langopts.stress_rule = 2; + tr->langopts.stress_flags = 0x16 + 0x80000; + } + break; + + case L('p','l'): // Polish + { + static const short stress_lengths_pl[8] = {160, 190, 175, 175, 0, 0, 200, 210}; + static const unsigned char stress_amps_pl[8] = {17,13, 19,19, 20,22, 22,21 }; // 'diminished' is used to mark a quieter, final unstressed syllable + + SetupTranslator(tr,stress_lengths_pl,stress_amps_pl); + + tr->charset_a0 = charsets[2]; // ISO-8859-2 + tr->langopts.stress_rule = 2; + tr->langopts.stress_flags = 0x6; // mark unstressed final syllables as diminished + tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x8; + tr->langopts.max_initial_consonants = 7; // for example: wchrzczony :) + tr->langopts.numbers=0x1009 + 0x4000; + tr->langopts.numbers2=0x40; + tr->langopts.param[LOPT_COMBINE_WORDS] = 4 + 0x100; // combine 'nie' (marked with $alt2) with some 1-syllable (and 2-syllable) words (marked with $alt) + SetLetterVowel(tr,'y'); + } + break; + + case L('p','t'): // Portuguese + { + static const short stress_lengths_pt[8] = {180, 125, 210, 210, 0, 0, 270, 295}; + static const unsigned char stress_amps_pt[8] = {16,13, 19,19, 20,22, 22,21 }; // 'diminished' is used to mark a quieter, final unstressed syllable + + SetupTranslator(tr,stress_lengths_pt,stress_amps_pt); + tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable + + tr->langopts.stress_rule = 3; // stress on final syllable + tr->langopts.stress_flags = 0x6 | 0x10 | 0x20000; + tr->langopts.numbers = 0x069 + 0x4000 + NUM_ROMAN; + SetLetterVowel(tr,'y'); + ResetLetterBits(tr,0x2); + SetLetterBits(tr,1,"bcdfgjkmnpqstvxz"); // B hard consonants, excluding h,l,r,w,y + } + break; + + case L('r','o'): // Romanian + { + static const short stress_lengths_ro[8] = {170, 170, 180, 180, 0, 0, 240, 260}; + static const unsigned char stress_amps_ro[8] = {15,13, 18,18, 20,22, 22,21 }; + + SetupTranslator(tr,stress_lengths_ro,stress_amps_ro); + + tr->langopts.stress_rule = 2; + tr->langopts.stress_flags = 0x100 + 0x6; + + tr->charset_a0 = charsets[2]; // ISO-8859-2 + tr->langopts.numbers = 0x1029+0x6000 + NUM_ROMAN; + tr->langopts.numbers2 = 0x1e; // variant numbers before all thousandplex + } + break; + + case L('r','u'): // Russian + Translator_Russian(tr); + break; + + case L('r','w'): // Kiryarwanda + { + tr->langopts.stress_rule = 2; + tr->langopts.stress_flags = 0x16; + tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable + + tr->langopts.numbers = 0x61 + 0x100000 + 0x4000; + tr->langopts.numbers2 = 0x200; // say "thousands" before its number + } + break; + + case L('s','k'): // Slovak + case L('c','s'): // Czech + { + static const char *sk_voiced = "bdgjlmnrvwzaeiouy"; + + SetupTranslator(tr,stress_lengths_sk,stress_amps_sk); + tr->charset_a0 = charsets[2]; // ISO-8859-2 + + tr->langopts.stress_rule = 0; + tr->langopts.stress_flags = 0x16; + tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x3; + tr->langopts.max_initial_consonants = 5; + tr->langopts.spelling_stress = 1; + tr->langopts.param[LOPT_COMBINE_WORDS] = 4; // combine some prepositions with the following word + + tr->langopts.numbers = 0x0401 + 0x4000 + NUM_ROMAN; + tr->langopts.numbers2 = 0x100; + tr->langopts.thousands_sep = 0; //no thousands separator + tr->langopts.decimal_sep = ','; + + if(name2 == L('c','s')) + { + tr->langopts.numbers2 = 0x108; // variant numbers before milliards + } + + SetLetterVowel(tr,'y'); + SetLetterVowel(tr,'r'); + ResetLetterBits(tr,0x20); + SetLetterBits(tr,5,sk_voiced); + } + break; + + case L('s','q'): // Albanian + { + static const short stress_lengths_sq[8] = {150, 150, 180, 180, 0, 0, 300, 300}; + static const unsigned char stress_amps_sq[8] = {16,12, 16,16, 20,20, 21,19 }; + + SetupTranslator(tr,stress_lengths_sq,stress_amps_sq); + + tr->langopts.stress_rule = 2; + tr->langopts.stress_flags = 0x16 + 0x100; + SetLetterVowel(tr,'y'); + tr->langopts.numbers = 0x69 + 0x8000; + tr->langopts.accents = 2; // "capital" after letter name + } + break; + + + case L('s','v'): // Swedish + { + static const unsigned char stress_amps_sv[] = {16,16, 20,20, 20,22, 22,21 }; + static const short stress_lengths_sv[8] = {160,135, 220,220, 0,0, 250,280}; + SetupTranslator(tr,stress_lengths_sv,stress_amps_sv); + + tr->langopts.stress_rule = 0; + SetLetterVowel(tr,'y'); + tr->langopts.numbers = 0x1909; + tr->langopts.accents = 1; + } + break; + + case L('s','w'): // Swahili + { + static const short stress_lengths_sw[8] = {160, 170, 200, 200, 0, 0, 320, 340}; + static const unsigned char stress_amps_sw[] = {16,12, 19,19, 20,22, 22,21 }; + + SetupTranslator(tr,stress_lengths_sw,stress_amps_sw); + tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable + + tr->langopts.vowel_pause = 1; + tr->langopts.stress_rule = 2; + tr->langopts.stress_flags = 0x6 | 0x10; + + tr->langopts.numbers = 0x4e1; + tr->langopts.numbers2 = NUM2_100000a; + } + break; + + case L('t','a'): // Tamil + case L('m','l'): // Malayalam + case L('k','n'): // Kannada + case L('m','r'): // Marathi + { + static const short stress_lengths_ta[8] = {200, 200, 210, 210, 0, 0, 230, 230}; + static const unsigned char stress_amps_ta[8] = {18,18, 18,18, 20,20, 22,22 }; + + SetupTranslator(tr,stress_lengths_ta,stress_amps_ta); + tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable + + tr->langopts.stress_rule = 0; + tr->langopts.stress_flags = 0x10004; // use 'diminished' for unstressed final syllable + tr->letter_bits_offset = OFFSET_TAMIL; + + if(name2 == L('m','r')) + { + tr->letter_bits_offset = OFFSET_DEVANAGARI; + } + else + if(name2 == L('m','l')) + { + tr->letter_bits_offset = OFFSET_MALAYALAM; + } + else + if(name2 == L('k','n')) + { + tr->letter_bits_offset = OFFSET_KANNADA; + tr->langopts.numbers = 0x1; + tr->langopts.numbers2 = NUM2_100000; + } + tr->langopts.param[LOPT_WORD_MERGE] = 1; // don't break vowels betwen words + SetIndicLetters(tr); // call this after setting OFFSET_ + } + break; + +#ifdef deleted + case L('t','h'): // Thai + { + static const short stress_lengths_th[8] = {230,150, 230,230, 230,0, 230,250}; + static const unsigned char stress_amps_th[] = {22,16, 22,22, 22,22, 22,22 }; + + SetupTranslator(tr,stress_lengths_th,stress_amps_th); + + tr->langopts.stress_rule = 0; // stress on final syllable of a "word" + tr->langopts.stress_flags = 2; // don't automatically set diminished stress (may be set in the intonation module) + tr->langopts.tone_language = 1; // Tone language, use CalcPitches_Tone() rather than CalcPitches() + tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable +// tr->langopts.tone_numbers = 1; // a number after letters indicates a tone number (eg. pinyin or jyutping) + tr->langopts.word_gap = 0x21; // length of a final vowel is less dependent on the next consonant, don't merge consonant with next word + } + break; +#endif + + case L('t','r'): // Turkish + { + static const unsigned char stress_amps_tr[8] = {18,18, 20,20, 20,22, 22,21 }; + static const short stress_lengths_tr[8] = {190,190, 190,190, 0,0, 250,270}; + + SetupTranslator(tr,stress_lengths_tr,stress_amps_tr); + tr->charset_a0 = charsets[9]; // ISO-8859-9 - Latin5 + + tr->langopts.stress_rule = 7; // stress on the last syllable, before any explicitly unstressed syllable + tr->langopts.stress_flags = 0x20; //no automatic secondary stress + + tr->langopts.numbers = 0x1509 + 0x4000; + tr->langopts.max_initial_consonants = 2; + } + break; + + case L('v','i'): // Vietnamese + { + static const short stress_lengths_vi[8] = {150, 150, 180, 180, 210, 230, 230, 240}; + static const unsigned char stress_amps_vi[] = {16,16, 16,16, 22,22, 22,22 }; + static wchar_t vowels_vi[] = { + 0x61, 0xe0, 0xe1, 0x1ea3, 0xe3, 0x1ea1, // a + 0x103, 0x1eb1, 0x1eaf, 0x1eb3, 0x1eb5, 0x1eb7, // ă + 0xe2, 0x1ea7, 0x1ea5, 0x1ea9, 0x1eab, 0x1ead, // â + 0x65, 0xe8, 0xe9, 0x1ebb, 0x1ebd, 0x1eb9, // e + 0xea, 0x1ec1, 0x1ebf, 0x1ec3, 0x1ec5, 0x1ec7, // i + 0x69, 0xec, 0xed, 0x1ec9, 0x129, 0x1ecb, // i + 0x6f, 0xf2, 0xf3, 0x1ecf, 0xf5, 0x1ecd, // o + 0xf4, 0x1ed3, 0x1ed1, 0x1ed5, 0x1ed7, 0x1ed9, // ô + 0x1a1, 0x1edd, 0x1edb, 0x1edf, 0x1ee1, 0x1ee3, // Æ¡ + 0x75, 0xf9, 0xfa, 0x1ee7, 0x169, 0x1ee5, // u + 0x1b0, 0x1eeb, 0x1ee9, 0x1eed, 0x1eef, 0x1ef1, // Æ° + 0x79, 0x1ef3, 0xfd, 0x1ef7, 0x1ef9, 0x1e, 0 }; // y + + SetupTranslator(tr,stress_lengths_vi,stress_amps_vi); + tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable + + tr->langopts.stress_rule = 0; + tr->langopts.word_gap = 0x21; // length of a final vowel is less dependent on the next consonant, don't merge consonant with next word +// tr->langopts.vowel_pause = 4; + tr->letter_groups[0] = vowels_vi; + tr->langopts.tone_language = 1; // Tone language, use CalcPitches_Tone() rather than CalcPitches() + tr->langopts.unstressed_wd1 = 2; + tr->langopts.numbers = 0x0049 + 0x8000; + + } + break; + + case L('z','h'): + case L_zhy: + { + static const short stress_lengths_zh[8] = {230,150, 230,230, 230,0, 240,250}; // 1=tone5. end-of-sentence, 6=tone 1&4, 7=tone 2&3 + static const unsigned char stress_amps_zh[] = {22,16, 22,22, 22,22, 22,22 }; + + SetupTranslator(tr,stress_lengths_zh,stress_amps_zh); + + tr->langopts.stress_rule = 3; // stress on final syllable of a "word" + tr->langopts.stress_flags = 2; // don't automatically set diminished stress (may be set in the intonation module) + tr->langopts.vowel_pause = 0; + tr->langopts.tone_language = 1; // Tone language, use CalcPitches_Tone() rather than CalcPitches() + tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable + tr->langopts.tone_numbers = 1; // a number after letters indicates a tone number (eg. pinyin or jyutping) + tr->langopts.ideographs = 1; + tr->langopts.word_gap = 0x21; // length of a final vowel is less dependent on the next consonant, don't merge consonant with next word + if(name2 == L('z','h')) + { + tr->langopts.textmode = 1; + tr->langopts.listx = 1; // compile zh_listx after zh_list + } + } + break; + + default: + tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words + break; + } + + tr->translator_name = name2; + + if(tr->langopts.numbers & 0x8) + { + // use . and ; for thousands and decimal separators + tr->langopts.thousands_sep = '.'; + tr->langopts.decimal_sep = ','; + } + if(tr->langopts.numbers & 0x4) + { + tr->langopts.thousands_sep = 0; // don't allow thousands separator, except space + } + return(tr); +} // end of SelectTranslator + + + +//********************************************************************************************************** + + + +static void Translator_Russian(Translator *tr) +{//=========================================== + static const unsigned char stress_amps_ru[] = {16,16, 18,18, 20,24, 24,22 }; + static const short stress_lengths_ru[8] = {150,140, 220,220, 0,0, 260,280}; + + + // character codes offset by 0x420 + static const char ru_vowels[] = {0x10,0x15,0x31,0x18,0x1e,0x23,0x2b,0x2d,0x2e,0x2f,0}; + static const char ru_consonants[] = {0x11,0x12,0x13,0x14,0x16,0x17,0x19,0x1a,0x1b,0x1c,0x1d,0x1f,0x20,0x21,0x22,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2c,0}; + static const char ru_soft[] = {0x2c,0x19,0x27,0x29,0}; // letter group B [k ts; s;] + static const char ru_hard[] = {0x2a,0x16,0x26,0x28,0}; // letter group H [S Z ts] + static const char ru_nothard[] = {0x11,0x12,0x13,0x14,0x17,0x19,0x1a,0x1b,0x1c,0x1d,0x1f,0x20,0x21,0x22,0x24,0x25,0x27,0x29,0x2c,0}; + static const char ru_voiced[] = {0x11,0x12,0x13,0x14,0x16,0x17,0}; // letter group G (voiced obstruents) + static const char ru_ivowels[] = {0x2c,0x15,0x31,0x18,0x2e,0x2f,0}; // letter group Y (iotated vowels & soft-sign) + + SetupTranslator(tr,stress_lengths_ru,stress_amps_ru); + + tr->charset_a0 = charsets[18]; // KOI8-R + tr->transpose_offset = 0x42f; // convert cyrillic from unicode into range 0x01 to 0x22 + tr->transpose_min = 0x430; + tr->transpose_max = 0x451; + + tr->letter_bits_offset = OFFSET_CYRILLIC; + memset(tr->letter_bits,0,sizeof(tr->letter_bits)); + SetLetterBits(tr,0,ru_vowels); + SetLetterBits(tr,1,ru_soft); + SetLetterBits(tr,2,ru_consonants); + SetLetterBits(tr,3,ru_hard); + SetLetterBits(tr,4,ru_nothard); + SetLetterBits(tr,5,ru_voiced); + SetLetterBits(tr,6,ru_ivowels); + SetLetterBits(tr,7,ru_vowels); + + tr->langopts.param[LOPT_UNPRONOUNCABLE] = 0x432; // [v] don't count this character at start of word + tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 1; + tr->langopts.param[LOPT_REDUCE] = 2; + tr->langopts.stress_rule = 5; + tr->langopts.stress_flags = 0x0020; // waas 0x1010 + + tr->langopts.numbers = 0x0409; + tr->langopts.numbers2 = 0xc2; // variant numbers before thousands + tr->langopts.phoneme_change = 1; + tr->langopts.testing = 2; + +} // end of Translator_Russian + + + +/* +typedef struct { + int flags; + unsigned char stress; // stress level of this vowel + unsigned char stress_highest; // the highest stress level of a vowel in this word + unsigned char n_vowels; // number of vowels in the word + unsigned char vowel_this; // syllable number of this vowel (counting from 1) + unsigned char vowel_stressed; // syllable number of the highest stressed vowel +} CHANGEPH; +*/ + + +#define RUSSIAN2 +#ifdef RUSSIAN2 + +int ChangePhonemes_ru(Translator *tr, PHONEME_LIST2 *phlist, int n_ph, int index, PHONEME_TAB *ph, CHANGEPH *ch) +{//============================================================================================================= +// Called for each phoneme in the phoneme list, to allow a language to make changes +// ph The current phoneme + + int variant; + int vowelix; + int stressed; + int soft; + PHONEME_TAB *prev, *next; + + if(ch->flags & 8) + return(0); // full phoneme translation has already been given + // Russian vowel softening and reduction rules + + if(ph->type == phVOWEL) + { + int prestressed = ch->vowel_stressed==ch->vowel_this+1; // the next vowel after this has the main stress + + #define N_VOWELS_RU 11 + static unsigned int vowels_ru[N_VOWELS_RU] = {'a','V','O','I',PH('I','#'),PH('E','#'),PH('E','2'), +PH('V','#'),PH('I','3'),PH('I','2'),PH('E','3')}; + + + static unsigned int vowel_replace[N_VOWELS_RU][6] = { + // stressed, soft, soft-stressed, j+stressed, j+soft, j+soft-stressed + /*0*/ {'A', 'I', PH('j','a'), 'a', 'a', 'a'}, // a Uses 3,4,5 columns. + /*1*/ {'A', 'V', PH('j','a'), 'a', 'V', 'a'}, // V Uses 3,4,5 columns. + /*2*/ {'o', '8', '8', 'o', '8', '8'}, // O + /*3*/ {'i', 'I', 'i', 'a', 'I', 'a'}, // I Uses 3,4,5 columns. + /*4*/ {'i', PH('I','#'), 'i', 'i', PH('I','#'), 'i'}, // I# + /*5*/ {'E', PH('E','#'), 'E', 'e', PH('E','#'), 'e'}, // E# + /*6*/ {'E', PH('E','2'), 'E', 'e', PH('E','2'), 'e'}, // E2 Uses 3,4,5 columns. + /*7*/ {PH('j','a'), 'V', PH('j','a'), 'A', 'V', 'A'}, // V# + /*8*/ {PH('j','a'), 'I', PH('j','a'), 'e', 'I', 'e'}, // I3 Uses 3,4,5 columns. + /*9*/ {'e', 'I', 'e', 'e', 'I', 'e'}, // I2 + /*10*/ {'e', PH('E', '2'), 'e', 'e', PH('E','2'), 'e'} // E3 + }; + + prev = phoneme_tab[phlist[index-1].phcode]; + next = phoneme_tab[phlist[index+1].phcode]; + + // lookup the vowel name to get an index into the vowel_replace[] table + for(vowelix=0; vowelixmnemonic) + break; + } + if(vowelix == N_VOWELS_RU) + return(0); + + if(prestressed) + { + if((vowelix==6)&&(prev->mnemonic=='j')) + vowelix=8; + if(vowelix==1) + vowelix=0; + if(vowelix==4) + vowelix=3; + if(vowelix==6) + vowelix=5; + if(vowelix==7) + vowelix=8; + if(vowelix==10) + vowelix=9; + } + // do we need a variant of this vowel, depending on the stress and adjacent phonemes ? + variant = -1; + stressed = ch->flags & 2; + soft=prev->phflags & phPALATAL; + + if (soft && stressed) + variant = 2; else + if (stressed) + variant = 0; else + if (soft) + variant = 1; + if(variant >= 0) + { + if(prev->mnemonic == 'j') + variant += 3; + + phlist[index].phcode = PhonemeCode(vowel_replace[vowelix][variant]); + } + else + { + phlist[index].phcode = PhonemeCode(vowels_ru[vowelix]); + } + } + + return(0); +} +#else + + +int ChangePhonemes_ru(Translator *tr, PHONEME_LIST2 *phlist, int n_ph, int index, PHONEME_TAB *ph, CHANGEPH *ch) +{//============================================================================================================= +// Called for each phoneme in the phoneme list, to allow a language to make changes +// flags: bit 0=1 last phoneme in a word +// bit 1=1 this is the highest stressed vowel in the current word +// bit 2=1 after the highest stressed vowel in the current word +// bit 3=1 the phonemes were specified explicitly, or found from an entry in the xx_list dictionary +// ph The current phoneme + + int variant; + int vowelix; + PHONEME_TAB *prev, *next; + + if(ch->flags & 8) + return(0); // full phoneme translation has already been given + + // Russian vowel softening and reduction rules + if(ph->type == phVOWEL) + { + #define N_VOWELS_RU 7 + static unsigned char vowels_ru[N_VOWELS_RU] = {'a','A','o','E','i','u','y'}; + + // each line gives: soft, reduced, soft-reduced, post-tonic + static unsigned short vowel_replace[N_VOWELS_RU][4] = { + {'&', 'V', 'I', 'V'}, // a + {'&', 'V', 'I', 'V'}, // A + {'8', 'V', 'I', 'V'}, // o + {'e', 'I', 'I', 'I'}, // E + {'i', 'I', 'I', 'I'}, // i + {'u'+('"'<<8), 'U', 'U', 'U'}, // u + {'y', 'Y', 'Y', 'Y'}}; // y + + prev = phoneme_tab[phlist[index-1].phcode]; + next = phoneme_tab[phlist[index+1].phcode]; + +if(prev->mnemonic == 'j') + return(0); + + // lookup the vowel name to get an index into the vowel_replace[] table + for(vowelix=0; vowelixmnemonic) + break; + } + if(vowelix == N_VOWELS_RU) + return(0); + + // do we need a variant of this vowel, depending on the stress and adjacent phonemes ? + variant = -1; + if(ch->flags & 2) + { + // a stressed vowel + if((prev->phflags & phPALATAL) && ((next->phflags & phPALATAL) || phoneme_tab[phlist[index+2].phcode]->mnemonic == ';')) + { + // between two palatal consonants, use the soft variant + variant = 0; + } + } + else + { + // an unstressed vowel + if(prev->phflags & phPALATAL) + { + variant = 2; // unstressed soft + } + else + if((ph->mnemonic == 'o') && ((prev->phflags & phPLACE) == phPLACE_pla)) + { + variant = 2; // unstressed soft ([o] vowel following: ш ж + } + else + if(ch->flags & 4) + { + variant = 3; // post tonic + } + else + { + variant = 1; // unstressed + } + } + if(variant >= 0) + { + phlist[index].phcode = PhonemeCode(vowel_replace[vowelix][variant]); + } + } + + return(0); +} +#endif + diff --git a/navit/support/espeak/translate.c b/navit/support/espeak/translate.c new file mode 100755 index 0000000..4891644 --- /dev/null +++ b/navit/support/espeak/translate.c @@ -0,0 +1,2800 @@ +/*************************************************************************** + * Copyright (C) 2005 to 2007 by Jonathan Duddington * + * email: jonsd@users.sourceforge.net * + * * + * 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; either version 3 of the License, or * + * (at your option) any later version. * + * * + * 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, see: * + * . * + ***************************************************************************/ + +#include "StdAfx.h" + +#include +#include +#include +#include + +#include +#include + +#include "speak_lib.h" +#include "speech.h" +#include "phoneme.h" +#include "synthesize.h" +#include "voice.h" +#include "translate.h" + +#define WORD_STRESS_CHAR '*' + + +Translator *translator = NULL; // the main translator +Translator *translator2 = NULL; // secondary translator for certain words +static char translator2_language[20] = {0}; + +FILE *f_trans = NULL; // phoneme output text +int option_tone2 = 0; +int option_tone_flags = 0; // bit 8=emphasize allcaps, bit 9=emphasize penultimate stress +int option_phonemes = 0; +int option_phoneme_events = 0; +int option_quiet = 0; +int option_endpause = 0; // suppress pause after end of text +int option_capitals = 0; +int option_punctuation = 0; +int option_sayas = 0; +static int option_sayas2 = 0; // used in translate_clause() +static int option_emphasis = 0; // 0=normal, 1=normal, 2=weak, 3=moderate, 4=strong +int option_ssml = 0; +int option_phoneme_input = 0; // allow [[phonemes]] in input +int option_phoneme_variants = 0; // 0= don't display phoneme variant mnemonics +int option_wordgap = 0; + +static int count_sayas_digits; +int skip_sentences; +int skip_words; +int skip_characters; +char skip_marker[N_MARKER_LENGTH]; +int skipping_text; // waiting until word count, sentence count, or named marker is reached +int end_character_position; +int count_sentences; +int count_words; +int clause_start_char; +int clause_start_word; +int new_sentence; +static int word_emphasis = 0; // set if emphasis level 3 or 4 +static int embedded_flag = 0; // there are embedded commands to be applied to the next phoneme, used in TranslateWord2() + +static int prev_clause_pause=0; +static int max_clause_pause = 0; +int pre_pause; + + +// these were previously in translator class +char word_phonemes[N_WORD_PHONEMES]; // a word translated into phoneme codes +int n_ph_list2; +PHONEME_LIST2 ph_list2[N_PHONEME_LIST]; // first stage of text->phonemes + + + +wchar_t option_punctlist[N_PUNCTLIST]={0}; +char ctrl_embedded = '\001'; // to allow an alternative CTRL for embedded commands +int option_multibyte=espeakCHARS_AUTO; // 0=auto, 1=utf8, 2=8bit, 3=wchar, 4=16bit + +// these are overridden by defaults set in the "speak" file +int option_linelength = 0; + +#define N_EMBEDDED_LIST 250 +static int embedded_ix; +static int embedded_read; +unsigned int embedded_list[N_EMBEDDED_LIST]; + +// the source text of a single clause (UTF8 bytes) +#define N_TR_SOURCE 700 +static char source[N_TR_SOURCE+40]; // extra space for embedded command & voice change info at end + +int n_replace_phonemes; +REPLACE_PHONEMES replace_phonemes[N_REPLACE_PHONEMES]; + + +// brackets, also 0x2014 to 0x021f which don't need to be in this list +static const unsigned short brackets[] = { +'(',')','[',']','{','}','<','>','"','\'','`', +0xab,0xbb, // double angle brackets +0x300a,0x300b, // double angle brackets (ideograph) +0}; + +// other characters which break a word, but don't produce a pause +static const unsigned short breaks[] = {'_', 0}; + +// treat these characters as spaces, in addition to iswspace() +static const wchar_t chars_space[] = {0x2500,0}; // box drawing horiz + + +// Translate character codes 0xA0 to 0xFF into their unicode values +// ISO_8859_1 is set as default +static const unsigned short ISO_8859_1[0x60] = { + 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, // a0 + 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, // a8 + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, // b0 + 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, // b8 + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, // c0 + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, // c8 + 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, // d0 + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, // d8 + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, // e0 + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, // e8 + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, // f0 + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff, // f8 +}; + +static const unsigned short ISO_8859_2[0x60] = { + 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, // a0 + 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b, // a8 + 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, // b0 + 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, // b8 + 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, // c0 + 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, // c8 + 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, // d0 + 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, // d8 + 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, // e0 + 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, // e8 + 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, // f0 + 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, // f8 +}; + +static const unsigned short ISO_8859_3[0x60] = { + 0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0x0000, 0x0124, 0x00a7, // a0 + 0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0x0000, 0x017b, // a8 + 0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7, // b0 + 0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0x0000, 0x017c, // b8 + 0x00c0, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x010a, 0x0108, 0x00c7, // c0 + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, // c8 + 0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7, // d0 + 0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df, // d8 + 0x00e0, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x010b, 0x0109, 0x00e7, // e0 + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, // e8 + 0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7, // f0 + 0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9, // f8 +}; + +static const unsigned short ISO_8859_4[0x60] = { + 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7, // a0 + 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af, // a8 + 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, // b0 + 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b, // b8 + 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, // c0 + 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a, // c8 + 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, // d0 + 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df, // d8 + 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, // e0 + 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b, // e8 + 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, // f0 + 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9, // f8 +}; + +static const unsigned short ISO_8859_5[0x60] = { + 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, // a0 Cyrillic + 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f, // a8 + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, // b0 + 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, // b8 + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, // c0 + 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, // c8 + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, // d0 + 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, // d8 + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, // e0 + 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, // e8 + 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, // f0 + 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f, // f8 +}; + +static const unsigned short ISO_8859_7[0x60] = { + 0x00a0, 0x2018, 0x2019, 0x00a3, 0x20ac, 0x20af, 0x00a6, 0x00a7, // a0 Greek + 0x00a8, 0x00a9, 0x037a, 0x00ab, 0x00ac, 0x00ad, 0x0000, 0x2015, // a8 + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7, // b0 + 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, // b8 + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, // c0 + 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, // c8 + 0x03a0, 0x03a1, 0x0000, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, // d0 + 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, // d8 + 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, // e0 + 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, // e8 + 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, // f0 + 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000, // f8 +}; + +static const unsigned short ISO_8859_9[0x60] = { + 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, // a0 + 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, // a8 + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, // b0 + 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, // b8 + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, // c0 + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, // c8 + 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, // d0 + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, // d8 + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, // e0 + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, // e8 + 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, // f0 + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, // f8 +}; + +static const unsigned short ISO_8859_14[0x60] = { + 0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7, // a0 Welsh + 0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178, // a8 + 0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56, // b0 + 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61, // b8 + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, // c0 + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, // c8 + 0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a, // d0 + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df, // d8 + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, // e0 + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, // e8 + 0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b, // f0 + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff, // f8 +}; + +static const unsigned short KOI8_R[0x60] = { + 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556, // a0 Russian + 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, // a8 + 0x255f, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565, // b0 + 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x00a9, // b8 + 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, // c0 + 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, // c8 + 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, // d0 + 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, // d8 + 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, // e0 + 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, // e8 + 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, // f0 + 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a, // f8 +}; + +static const unsigned short ISCII[0x60] = { + 0x0020, 0x0901, 0x0902, 0x0903, 0x0905, 0x0906, 0x0907, 0x0908, // a0 + 0x0909, 0x090a, 0x090b, 0x090e, 0x090f, 0x0910, 0x090d, 0x0912, // a8 + 0x0913, 0x0914, 0x0911, 0x0915, 0x0916, 0x0917, 0x0918, 0x0919, // b0 + 0x091a, 0x091b, 0x091c, 0x091d, 0x091e, 0x091f, 0x0920, 0x0921, // b8 + 0x0922, 0x0923, 0x0924, 0x0925, 0x0926, 0x0927, 0x0928, 0x0929, // c0 + 0x092a, 0x092b, 0x092c, 0x092d, 0x092e, 0x092f, 0x095f, 0x0930, // c8 + 0x0931, 0x0932, 0x0933, 0x0934, 0x0935, 0x0936, 0x0937, 0x0938, // d0 + 0x0939, 0x0020, 0x093e, 0x093f, 0x0940, 0x0941, 0x0942, 0x0943, // d8 + 0x0946, 0x0947, 0x0948, 0x0945, 0x094a, 0x094b, 0x094c, 0x0949, // e0 + 0x094d, 0x093c, 0x0964, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, // e8 + 0x0020, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, // f0 + 0x0037, 0x0038, 0x0039, 0x20, 0x20, 0x20, 0x20, 0x20, // f8 +}; + +const unsigned short *charsets[N_CHARSETS] = { + ISO_8859_1, + ISO_8859_1, + ISO_8859_2, + ISO_8859_3, + ISO_8859_4, + ISO_8859_5, + ISO_8859_1, + ISO_8859_7, + ISO_8859_1, + ISO_8859_9, + ISO_8859_1, + ISO_8859_1, + ISO_8859_1, + ISO_8859_1, + ISO_8859_14, + ISO_8859_1, + ISO_8859_1, + ISO_8859_1, + KOI8_R, // 18 + ISCII }; + +// Tables of the relative lengths of vowels, depending on the +// type of the two phonemes that follow +// indexes are the "length_mod" value for the following phonemes + +// use this table if vowel is not the last in the word +static unsigned char length_mods_en[100] = { +/* a , t s n d z r N <- next */ + 100,120,100,105,100,110,110,100, 95, 100, /* a <- next2 */ + 105,120,105,110,125,130,135,115,125, 100, /* , */ + 105,120, 75,100, 75,105,120, 85, 75, 100, /* t */ + 105,120, 85,105, 95,115,120,100, 95, 100, /* s */ + 110,120, 95,105,100,115,120,100,100, 100, /* n */ + 105,120,100,105, 95,115,120,110, 95, 100, /* d */ + 105,120,100,105,105,122,125,110,105, 100, /* z */ + 105,120,100,105,105,122,125,110,105, 100, /* r */ + 105,120, 95,105,100,115,120,110,100, 100, /* N */ + 100,120,100,100,100,100,100,100,100, 100 }; // SPARE + +// as above, but for the last syllable in a word +static unsigned char length_mods_en0[100] = { +/* a , t s n d z r N <- next */ + 100,150,100,105,110,115,110,110,110, 100, /* a <- next2 */ + 105,150,105,110,125,135,140,115,135, 100, /* , */ + 105,150, 90,105, 90,122,135,100, 90, 100, /* t */ + 105,150,100,105,100,122,135,100,100, 100, /* s */ + 105,150,100,105,105,115,135,110,105, 100, /* n */ + 105,150,100,105,105,122,130,120,125, 100, /* d */ + 105,150,100,105,110,122,125,115,110, 100, /* z */ + 105,150,100,105,105,122,135,120,105, 100, /* r */ + 105,150,100,105,105,115,135,110,105, 100, /* N */ + 100,100,100,100,100,100,100,100,100, 100 }; // SPARE + + +static unsigned char length_mods_equal[100] = { +/* a , t s n d z r N <- next */ + 110,110,110,110,110,110,110,110,110, 110, /* a <- next2 */ + 110,110,110,110,110,110,110,110,110, 110, /* , */ + 110,110,110,110,110,110,110,110,110, 110, /* t */ + 110,110,110,110,110,110,110,110,110, 110, /* s */ + 110,110,110,110,110,110,110,110,110, 110, /* n */ + 110,110,110,110,110,110,110,110,110, 110, /* d */ + 110,110,110,110,110,110,110,110,110, 110, /* z */ + 110,110,110,110,110,110,110,110,110, 110, /* r */ + 110,110,110,110,110,110,110,110,110, 110, /* N */ + 110,110,110,110,110,110,110,110,110, 110 }; // SPARE + + +static unsigned char *length_mod_tabs[6] = { + length_mods_en, + length_mods_en, // 1 + length_mods_en0, // 2 + length_mods_equal, // 3 + length_mods_equal, // 4 + length_mods_equal // 5 + }; + + +void SetLengthMods(Translator *tr, int value) +{//========================================== + int value2; + + tr->langopts.length_mods0 = tr->langopts.length_mods = length_mod_tabs[value % 100]; + if((value2 = value / 100) != 0) + { + tr->langopts.length_mods0 = length_mod_tabs[value2]; + } +} + + +int IsAlpha(unsigned int c) +{//======================== +// Replacement for iswalph() which also checks for some in-word symbols + + if(iswalpha(c)) + return(1); + + if((c >= 0x901) && (c <= 0xdf7)) + { + // Indic scripts: Devanagari, Tamil, etc + if((c & 0x7f) < 0x64) + return(1); + return(0); + } + + if((c >= 0x300) && (c <= 0x36f)) + return(1); // combining accents + + if((c >= 0x1100) && (c <= 0x11ff)) + return(1); //Korean jamo + + if((c > 0x3040) && (c <= 0xa700)) + return(1); // Chinese/Japanese. Should never get here, but Mac OS 10.4's iswalpha seems to be broken, so just make sure + + return(0); +} + +static int IsDigit09(unsigned int c) +{//========================= + if((c >= '0') && (c <= '9')) + return(1); + return(0); +} + +int IsDigit(unsigned int c) +{//======================== + if(iswdigit(c)) + return(1); + + if((c >= 0x966) && (c <= 0x96f)) + return(1); + + return(0); +} + +int IsSpace(unsigned int c) +{//======================== + if(c == 0) + return(0); + if(wcschr(chars_space,c)) + return(1); + return(iswspace(c)); +} + + +void DeleteTranslator(Translator *tr) +{//================================== + if(tr->data_dictlist != NULL) + Free(tr->data_dictlist); + Free(tr); +} + + +int lookupwchar(const unsigned short *list,int c) +{//============================================== +// Is the character c in the list ? + int ix; + + for(ix=0; list[ix] != 0; ix++) + { + if(list[ix] == c) + return(ix+1); + } + return(0); +} + +int IsBracket(int c) +{//================= + if((c >= 0x2014) && (c <= 0x201f)) + return(1); + return(lookupwchar(brackets,c)); +} + + +int utf8_out(unsigned int c, char *buf) +{//==================================== +// write a unicode character into a buffer as utf8 +// returns the number of bytes written + int n_bytes; + int j; + int shift; + static char unsigned code[4] = {0,0xc0,0xe0,0xf0}; + + if(c < 0x80) + { + buf[0] = c; + return(1); + } + if(c >= 0x110000) + { + buf[0] = ' '; // out of range character code + return(1); + } + if(c < 0x0800) + n_bytes = 1; + else + if(c < 0x10000) + n_bytes = 2; + else + n_bytes = 3; + + shift = 6*n_bytes; + buf[0] = code[n_bytes] | (c >> shift); + for(j=0; j> shift) & 0x3f); + } + return(n_bytes+1); +} // end of utf8_out + + +int utf8_nbytes(const char *buf) +{//============================= +// Returns the number of bytes for the first UTF-8 character in buf + unsigned char c = (unsigned char)buf[0]; + if(c < 0x80) + return(1); + if(c < 0xe0) + return(2); + if(c < 0xf0) + return(3); + return(4); +} + + +int utf8_in2(int *c, const char *buf, int backwards) +{//================================================= +// Read a unicode characater from a UTF8 string +// Returns the number of UTF8 bytes used. +// backwards: set if we are moving backwards through the UTF8 string + int c1; + int n_bytes; + int ix; + static const unsigned char mask[4] = {0xff,0x1f,0x0f,0x07}; + + // find the start of the next/previous character + while((*buf & 0xc0) == 0x80) + { + // skip over non-initial bytes of a multi-byte utf8 character + if(backwards) + buf--; + else + buf++; + } + + n_bytes = 0; + + if((c1 = *buf++) & 0x80) + { + if((c1 & 0xe0) == 0xc0) + n_bytes = 1; + else + if((c1 & 0xf0) == 0xe0) + n_bytes = 2; + else + if((c1 & 0xf8) == 0xf0) + n_bytes = 3; + + c1 &= mask[n_bytes]; + for(ix=0; ix= 0x80) + return(NULL); + return(strchr((char *)s,c)); // (char *) is needed for Borland compiler +} + + + + +int TranslateWord(Translator *tr, char *word1, int next_pause, WORD_TAB *wtab) +{//=========================================================================== +// word1 is terminated by space (0x20) character + + int length; + int word_length; + int ix; + int posn; + int pfix; + int n_chars; + unsigned int dictionary_flags[2]; + unsigned int dictionary_flags2[2]; + int end_type=0; + int prefix_type=0; + char *wordx; + char phonemes[N_WORD_PHONEMES]; + char *ph_limit; + char *phonemes_ptr; + char prefix_phonemes[N_WORD_PHONEMES]; + char end_phonemes[N_WORD_PHONEMES]; + char word_copy[N_WORD_BYTES]; + char prefix_chars[N_WORD_BYTES]; + int found=0; + int end_flags; + char c_temp; // save a character byte while we temporarily replace it with space + int first_char; + int last_char = 0; + int unpron_length; + int add_plural_suffix = 0; + int prefix_flags = 0; + int confirm_prefix; + int spell_word; + int stress_bits; + int emphasize_allcaps = 0; + int wflags = wtab->flags; + int wmark = wtab->wmark; + + // translate these to get pronunciations of plural 's' suffix (different forms depending on + // the preceding letter + static char word_zz[4] = {0,'z','z',0}; + static char word_iz[4] = {0,'i','z',0}; + static char word_ss[4] = {0,'s','s',0}; + + dictionary_flags[0] = 0; + dictionary_flags[1] = 0; + dictionary_flags2[0] = 0; + dictionary_flags2[1] = 0; + dictionary_skipwords = 0; + + prefix_phonemes[0] = 0; + end_phonemes[0] = 0; + ph_limit = &phonemes[N_WORD_PHONEMES]; + + // count the length of the word + wordx = word1; + utf8_in(&first_char,wordx); + word_length = 0; + while((*wordx != 0) && (*wordx != ' ')) + { + wordx += utf8_in(&last_char,wordx); + word_length++; + } + + // try an initial lookup in the dictionary list, we may find a pronunciation specified, or + // we may just find some flags + spell_word = 0; + if(option_sayas == SAYAS_KEY) + { + if(word_length == 1) + spell_word = 4; + } + + if(option_sayas & 0x10) + { + // SAYAS_CHAR, SAYAS_GYLPH, or SAYAS_SINGLE_CHAR + spell_word = option_sayas & 0xf; // 2,3,4 + } + else + { + found = LookupDictList(tr, &word1, phonemes, dictionary_flags, FLAG_ALLOW_TEXTMODE, wtab); // the original word + if(dictionary_flags[0] & FLAG_TEXTMODE) + { + first_char = word1[0]; + stress_bits = dictionary_flags[0] & 0x7f; + found = LookupDictList(tr, &word1, phonemes, dictionary_flags2, 0, wtab); // the text replacement + if(dictionary_flags2[0]!=0) + { + dictionary_flags[0] = dictionary_flags2[0]; + dictionary_flags[1] = dictionary_flags2[1]; + if(stress_bits != 0) + { + // keep any stress information from the original word + dictionary_flags[0] = (dictionary_flags[0] & ~0x7f) | stress_bits; + } + } + } + else + if((found==0) && (dictionary_flags[0] & FLAG_SKIPWORDS)) + { + // grouped words, but no translation. Join the words with hyphens. + wordx = word1; + ix = 0; + while(ix < dictionary_skipwords) + { + if(*wordx == ' ') + { + *wordx = '-'; + ix++; + } + wordx++; + } + } + + // if textmode, LookupDictList() replaces word1 by the new text and returns found=0 + + if(phonemes[0] == phonSWITCH) + { + // change to another language in order to translate this word + strcpy(word_phonemes,phonemes); + return(0); + } + +if((wmark > 0) && (wmark < 8)) +{ + // the stressed syllable has been specified in the text (TESTING) + dictionary_flags[0] = (dictionary_flags[0] & ~0xf) | wmark; +} + + if(!found && (dictionary_flags[0] & FLAG_ABBREV)) + { + // the word has $abbrev flag, but no pronunciation specified. Speak as individual letters + spell_word = 1; + } + + if(!found && iswdigit(first_char)) + { + Lookup(tr,"_0lang",word_phonemes); + if(word_phonemes[0] == phonSWITCH) + return(0); + + found = TranslateNumber(tr,word1,phonemes,dictionary_flags,wflags); + } + + if(!found & ((wflags & FLAG_UPPERS) != FLAG_FIRST_UPPER)) + { + // either all upper or all lower case + + if((tr->langopts.numbers & NUM_ROMAN) || ((tr->langopts.numbers & NUM_ROMAN_UC) && (wflags & FLAG_ALL_UPPER))) + { + if((found = TranslateRoman(tr, word1, phonemes)) != 0) + dictionary_flags[0] |= FLAG_ABBREV; // prevent emphasis if capitals + } + } + + if((wflags & FLAG_ALL_UPPER) && (word_length > 1)&& iswalpha(first_char)) + { + if((option_tone_flags & OPTION_EMPHASIZE_ALLCAPS) && !(dictionary_flags[0] & FLAG_ABBREV)) + { + // emphasize words which are in capitals + emphasize_allcaps = FLAG_EMPHASIZED; + } + else + if(!found && !(dictionary_flags[0] & FLAG_SKIPWORDS) && (word_length<4) && (tr->clause_lower_count > 3) + && (tr->clause_upper_count <= tr->clause_lower_count)) + { + // An upper case word in a lower case clause. This could be an abbreviation. + spell_word = 1; + } + } + } + + if(spell_word > 0) + { + // Speak as individual letters + wordx = word1; + posn = 0; + phonemes[0] = 0; + end_type = 0; + + while(*wordx != ' ') + { + wordx += TranslateLetter(tr,wordx, phonemes,spell_word, word_length); + posn++; + if(phonemes[0] == phonSWITCH) + { + // change to another language in order to translate this word + strcpy(word_phonemes,phonemes); + if(word_length > 1) + return(FLAG_SPELLWORD); // a mixture of languages, retranslate as individual letters, separated by spaces + return(0); + } + } + SetSpellingStress(tr,phonemes,spell_word,posn); + } + else + if(found == 0) + { + // word's pronunciation is not given in the dictionary list, although + // dictionary_flags may have ben set there + + posn = 0; + length = 999; + wordx = word1; + + while(((length < 3) && (length > 0))|| (word_length > 1 && Unpronouncable(tr,wordx))) + { + char *p; + // This word looks "unpronouncable", so speak letters individually until we + // find a remainder that we can pronounce. + emphasize_allcaps = 0; + wordx += TranslateLetter(tr,wordx,phonemes,0, word_length); + posn++; + if(phonemes[0] == phonSWITCH) + { + // change to another language in order to translate this word + strcpy(word_phonemes,phonemes); + if(strcmp(&phonemes[1],"en")==0) + return(FLAG_SPELLWORD); // _^_en must have been set in TranslateLetter(), not *_rules + return(0); + } + + p = &wordx[word_length-3]; // this looks wrong. Doesn't consider multi-byte chars. + if(memcmp(p,"'s ",3) == 0) + { + // remove a 's suffix and pronounce this separately (not as an individual letter) + add_plural_suffix = 1; + p[0] = ' '; + p[1] = ' '; + last_char = p[-1]; + } + + length=0; + while(wordx[length] != ' ') length++; + if(length > 0) + wordx[-1] = ' '; // prevent this affecting the pronunciation of the pronuncable part + } + SetSpellingStress(tr,phonemes,0,posn); + + // anything left ? + if(*wordx != ' ') + { + // Translate the stem + unpron_length = strlen(phonemes); + end_type = TranslateRules(tr, wordx, phonemes, N_WORD_PHONEMES, end_phonemes, wflags, dictionary_flags); + + if(phonemes[0] == phonSWITCH) + { + // change to another language in order to translate this word + strcpy(word_phonemes,phonemes); + return(0); + } + + if((phonemes[0] == 0) && (end_phonemes[0] == 0)) + { + int wc; + // characters not recognised, speak them individually + + utf8_in(&wc, wordx); + if((word_length == 1) && IsAlpha(wc)) + { + posn = 0; + while((*wordx != ' ') && (*wordx != 0)) + { + wordx += TranslateLetter(tr,wordx, phonemes, 4, word_length); + posn++; + if(phonemes[0] == phonSWITCH) + { + // change to another language in order to translate this word + strcpy(word_phonemes,phonemes); + return(0); + } + } + SetSpellingStress(tr,phonemes,spell_word,posn); + } + } + + c_temp = wordx[-1]; + + found = 0; + confirm_prefix = 1; + while(end_type & SUFX_P) + { + // Found a standard prefix, remove it and retranslate + + if(confirm_prefix && !(end_type & SUFX_B)) + { + int end2; + char phonemes2[N_WORD_PHONEMES]; + char end_phonemes2[N_WORD_PHONEMES]; + + // remove any standard suffix and confirm that the prefix is still recognised + phonemes2[0] = 0; + end2 = TranslateRules(tr, wordx, phonemes2, N_WORD_PHONEMES, end_phonemes2, wflags|FLAG_NO_PREFIX|FLAG_NO_TRACE, dictionary_flags); + if(end2) + { + RemoveEnding(tr, wordx, end2, word_copy); + end_type = TranslateRules(tr, wordx, phonemes, N_WORD_PHONEMES, end_phonemes, wflags|FLAG_NO_TRACE, dictionary_flags); + memcpy(wordx,word_copy,strlen(word_copy)); + if((end_type & SUFX_P) == 0) + { + // after removing the suffix, the prefix is no longer recognised. + // Keep the suffix, but don't use the prefix + end_type = end2; + strcpy(phonemes,phonemes2); + strcpy(end_phonemes,end_phonemes2); + if(option_phonemes == 2) + { + DecodePhonemes(end_phonemes,end_phonemes2); + fprintf(f_trans," suffix [%s]\n\n",end_phonemes2); + } + } + confirm_prefix = 0; + continue; + } + } + + prefix_type = end_type; + + if(prefix_type & SUFX_V) + { + tr->expect_verb = 1; // use the verb form of the word + } + + wordx[-1] = c_temp; + + if((prefix_type & SUFX_B) == 0) + { + for(ix=(prefix_type & 0xf); ix>0; ix--) // num. of characters to remove + { + wordx++; + while((*wordx & 0xc0) == 0x80) wordx++; // for multibyte characters + } + } + else + { + pfix = 1; + prefix_chars[0] = 0; + n_chars = prefix_type & 0x3f; + + for(ix=0; ix < n_chars; ix++) // num. of bytes to remove + { + prefix_chars[pfix++] = *wordx++; + + if((prefix_type & SUFX_B) && (ix == (n_chars-1))) + { + prefix_chars[pfix-1] = 0; // discard the last character of the prefix, this is the separator character + } + } + prefix_chars[pfix] = 0; + } + c_temp = wordx[-1]; + wordx[-1] = ' '; + confirm_prefix = 1; + + if(prefix_type & SUFX_B) + { +// SUFX_B is used for Turkish, tr_rules contains "(Pb£ + // retranslate the prefix part + char *wordpf; + char prefix_phonemes2[12]; + + strncpy0(prefix_phonemes2,end_phonemes,sizeof(prefix_phonemes2)); + wordpf = &prefix_chars[1]; + found = LookupDictList(tr, &wordpf, phonemes, dictionary_flags, SUFX_P, wtab); // without prefix + if(found == 0) + { + end_type = TranslateRules(tr, wordpf, phonemes, N_WORD_PHONEMES, end_phonemes, 0, dictionary_flags); + sprintf(prefix_phonemes,"%s%s%s",phonemes,end_phonemes,prefix_phonemes2); + } + prefix_flags = 1; + } + else + { + strcat(prefix_phonemes,end_phonemes); + } + end_phonemes[0] = 0; + + end_type = 0; + found = LookupDictList(tr, &wordx, phonemes, dictionary_flags2, SUFX_P, wtab); // without prefix + if(dictionary_flags[0]==0) + { + dictionary_flags[0] = dictionary_flags2[0]; + dictionary_flags[1] = dictionary_flags2[1]; + } + else + prefix_flags = 1; + if(found == 0) + { + end_type = TranslateRules(tr, wordx, phonemes, N_WORD_PHONEMES, end_phonemes, 0, dictionary_flags); + + if(phonemes[0] == phonSWITCH) + { + // change to another language in order to translate this word + wordx[-1] = c_temp; + strcpy(word_phonemes,phonemes); + return(0); + } + } + } + + if((end_type != 0) && !(end_type & SUFX_P)) + { +char phonemes2[N_WORD_PHONEMES]; +strcpy(phonemes2,phonemes); + + // The word has a standard ending, re-translate without this ending + end_flags = RemoveEnding(tr, wordx, end_type, word_copy); + + phonemes_ptr = &phonemes[unpron_length]; + phonemes_ptr[0] = 0; + + if(prefix_phonemes[0] != 0) + { + // lookup the stem without the prefix removed + wordx[-1] = c_temp; + found = LookupDictList(tr, &word1, phonemes_ptr, dictionary_flags2, end_flags, wtab); // include prefix, but not suffix + wordx[-1] = ' '; + if(dictionary_flags[0]==0) + { + dictionary_flags[0] = dictionary_flags2[0]; + dictionary_flags[1] = dictionary_flags2[1]; + } + if(found) + prefix_phonemes[0] = 0; // matched whole word, don't need prefix now + + if((found==0) && (dictionary_flags2[0] != 0)) + prefix_flags = 1; + } + if(found == 0) + { + found = LookupDictList(tr, &wordx, phonemes_ptr, dictionary_flags2, end_flags, wtab); // without prefix and suffix + if(phonemes_ptr[0] == phonSWITCH) + { + // change to another language in order to translate this word + memcpy(wordx,word_copy,strlen(word_copy)); + strcpy(word_phonemes,phonemes_ptr); + return(0); + } + if(dictionary_flags[0]==0) + { + dictionary_flags[0] = dictionary_flags2[0]; + dictionary_flags[1] = dictionary_flags2[1]; + } + } + if(found == 0) + { + if(end_type & SUFX_Q) + { + // don't retranslate, use the original lookup result + strcpy(phonemes,phonemes2); + + // language specific changes + ApplySpecialAttribute(tr,phonemes,dictionary_flags[0]); + } + else + { + if(end_flags & FLAG_SUFX) + TranslateRules(tr, wordx, phonemes, N_WORD_PHONEMES, NULL,wflags | FLAG_SUFFIX_REMOVED, dictionary_flags); + else + TranslateRules(tr, wordx, phonemes, N_WORD_PHONEMES, NULL,wflags,dictionary_flags); + + if(phonemes[0] == phonSWITCH) + { + // change to another language in order to translate this word + strcpy(word_phonemes,phonemes); + memcpy(wordx,word_copy,strlen(word_copy)); + wordx[-1] = c_temp; + return(0); + } + } + } + + if((end_type & SUFX_T) == 0) + { + // the default is to add the suffix and then determine the word's stress pattern + AppendPhonemes(tr,phonemes, N_WORD_PHONEMES, end_phonemes); + end_phonemes[0] = 0; + } + } + wordx[-1] = c_temp; + } + } + + if((add_plural_suffix) || (wflags & FLAG_HAS_PLURAL)) + { + // s or 's suffix, append [s], [z] or [Iz] depending on previous letter + if(last_char == 'f') + TranslateRules(tr, &word_ss[1], phonemes, N_WORD_PHONEMES, NULL, 0, NULL); + else + if((last_char==0) || (strchr_w("hsx",last_char)==NULL)) + TranslateRules(tr, &word_zz[1], phonemes, N_WORD_PHONEMES, NULL, 0, NULL); + else + TranslateRules(tr, &word_iz[1], phonemes, N_WORD_PHONEMES, NULL, 0, NULL); + } + + wflags |= emphasize_allcaps; + + + /* determine stress pattern for this word */ + /******************************************/ + /* NOTE: this also adds a single PAUSE if the previous word ended + in a primary stress, and this one starts with one */ + if(prefix_flags || (strchr(prefix_phonemes,phonSTRESS_P)!=NULL)) + { + if((tr->langopts.param[LOPT_PREFIXES]) || (prefix_type & SUFX_T)) + { + char *p; + // German, keep a secondary stress on the stem + SetWordStress(tr, phonemes, &dictionary_flags[0], 3, 0); + + // reduce all but the first primary stress + ix=0; + for(p=prefix_phonemes; *p != 0; p++) + { + if(*p == phonSTRESS_P) + { + if(ix==0) + ix=1; + else + *p = phonSTRESS_3; + } + } + strcpy(word_phonemes,prefix_phonemes); + strcat(word_phonemes,phonemes); + SetWordStress(tr, word_phonemes, &dictionary_flags[0], -1, 0); + } + else + { + // stress position affects the whole word, including prefix + strcpy(word_phonemes,prefix_phonemes); + strcat(word_phonemes,phonemes); + SetWordStress(tr, word_phonemes, &dictionary_flags[0], -1, tr->prev_last_stress); + } + } + else + { + if(prefix_phonemes[0] == 0) + SetWordStress(tr, phonemes, &dictionary_flags[0], -1, tr->prev_last_stress); + else + SetWordStress(tr, phonemes, &dictionary_flags[0], -1, 0); + strcpy(word_phonemes,prefix_phonemes); + strcat(word_phonemes,phonemes); + } + + if(end_phonemes[0] != 0) + { + // a suffix had the SUFX_T option set, add the suffix after the stress pattern has been determined + strcat(word_phonemes,end_phonemes); + } + + if(wflags & FLAG_LAST_WORD) + { + // don't use $brk pause before the last word of a sentence + // (but allow it for emphasis, see below + dictionary_flags[0] &= ~FLAG_PAUSE1; + } + + if(wflags & FLAG_EMPHASIZED2) + { + // A word is indicated in the source text as stressed + // Give it stress level 6 (for the intonation module) + ChangeWordStress(tr,word_phonemes,6); + + if(wflags & FLAG_EMPHASIZED) + dictionary_flags[0] |= FLAG_PAUSE1; // precede by short pause + } + else + if(wtab[dictionary_skipwords].flags & FLAG_LAST_WORD) + { + // the word has attribute to stress or unstress when at end of clause + if(dictionary_flags[0] & (FLAG_STRESS_END | FLAG_STRESS_END2)) + ChangeWordStress(tr,word_phonemes,4); + else + if(dictionary_flags[0] & FLAG_UNSTRESS_END) + ChangeWordStress(tr,word_phonemes,3); + } + + // dictionary flags for this word give a clue about which alternative pronunciations of + // following words to use. + if(end_type & SUFX_F) + { + // expect a verb form, with or without -s suffix + tr->expect_verb = 2; + tr->expect_verb_s = 2; + } + + if(dictionary_flags[1] & FLAG_PASTF) + { + /* expect perfect tense in next two words */ + tr->expect_past = 3; + tr->expect_verb = 0; + tr->expect_noun = 0; + } + else + if(dictionary_flags[1] & FLAG_VERBF) + { + /* expect a verb in the next word */ + tr->expect_verb = 2; + tr->expect_verb_s = 0; /* verb won't have -s suffix */ + tr->expect_noun = 0; + } + else + if(dictionary_flags[1] & FLAG_VERBSF) + { + // expect a verb, must have a -s suffix + tr->expect_verb = 0; + tr->expect_verb_s = 2; + tr->expect_past = 0; + tr->expect_noun = 0; + } + else + if(dictionary_flags[1] & FLAG_NOUNF) + { + /* not expecting a verb next */ + tr->expect_noun = 2; + tr->expect_verb = 0; + tr->expect_verb_s = 0; + tr->expect_past = 0; + } + + if((wordx[0] != 0) && (!(dictionary_flags[1] & FLAG_VERB_EXT))) + { + if(tr->expect_verb > 0) + tr->expect_verb--; + + if(tr->expect_verb_s > 0) + tr->expect_verb_s--; + + if(tr->expect_noun >0) + tr->expect_noun--; + + if(tr->expect_past > 0) + tr->expect_past--; + } + + if((word_length == 1) && iswalpha(first_char) && (first_char != 'i')) + { +// English Specific !!!! + // any single letter before a dot is an abbreviation, except 'I' + dictionary_flags[0] |= FLAG_DOT; + } + + if((tr->langopts.param[LOPT_ALT] & 2) && ((dictionary_flags[0] & (FLAG_ALT_TRANS | FLAG_ALT2_TRANS)) != 0)) + { + ApplySpecialAttribute2(tr,word_phonemes,dictionary_flags[0]); + } + + return(dictionary_flags[0]); +} // end of TranslateWord + + + +static void SetPlist2(PHONEME_LIST2 *p, unsigned char phcode) +{//========================================================== + p->phcode = phcode; + p->stress = 0; + p->tone_number = 0; + p->synthflags = embedded_flag; + p->sourceix = 0; + embedded_flag = 0; +} + +static int CountSyllables(unsigned char *phonemes) +{//=============================================== + int count = 0; + int phon; + while((phon = *phonemes++) != 0) + { + if(phoneme_tab[phon]->type == phVOWEL) + count++; + } + return(count); +} + + +int SetTranslator2(const char *new_language) +{//========================================= +// Set translator2 to a second language + int new_phoneme_tab; + + if((new_phoneme_tab = SelectPhonemeTableName(new_language)) >= 0) + { + if((translator2 != NULL) && (strcmp(new_language,translator2_language) != 0)) + { + // we already have an alternative translator, but not for the required language, delete it + DeleteTranslator(translator2); + translator2 = NULL; + } + + if(translator2 == NULL) + { + translator2 = SelectTranslator(new_language); + strcpy(translator2_language,new_language); + + if(LoadDictionary(translator2, new_language, 0) != 0) + { + SelectPhonemeTable(voice->phoneme_tab_ix); // revert to original phoneme table + new_phoneme_tab = -1; + translator2_language[0] = 0; + } + } + } + return(new_phoneme_tab); +} // end of SetTranslator2 + + + +static int TranslateWord2(Translator *tr, char *word, WORD_TAB *wtab, int pre_pause, int next_pause) +{//================================================================================================= + int flags=0; + int stress; + int next_stress; + int next_tone=0; + unsigned char *p; + int srcix; + int embedded_cmd; + int value; + int found_dict_flag; + unsigned char ph_code; + PHONEME_LIST2 *plist2; + PHONEME_TAB *ph; + int max_stress; + int max_stress_ix=0; + int prev_vowel = -1; + int pitch_raised = 0; + int switch_phonemes = -1; + int first_phoneme = 1; + int source_ix; + int len; + int ix; + int sylimit; // max. number of syllables in a word to be combined with a preceding preposition + const char *new_language; + unsigned char bad_phoneme[4]; + int word_flags; + int word_copy_len; + char word_copy[N_WORD_BYTES+1]; + + len = wtab->length; + if(len > 31) len = 31; + source_ix = (wtab->sourceix & 0x7ff) | (len << 11); // bits 0-10 sourceix, bits 11-15 word length + + word_flags = wtab[0].flags; + if(word_flags & FLAG_EMBEDDED) + { + embedded_flag = SFLAG_EMBEDDED; + + do + { + embedded_cmd = embedded_list[embedded_read++]; + value = embedded_cmd >> 8; + + switch(embedded_cmd & 0x1f) + { + case EMBED_Y: + option_sayas = value; + break; + + case EMBED_F: + option_emphasis = value; + break; + + case EMBED_B: + // break command + if(value == 0) + pre_pause = 0; // break=none + else + pre_pause += value; + break; + } + } while((embedded_cmd & 0x80) == 0); + } + + if(word[0] == 0) + { + // nothing to translate + word_phonemes[0] = 0; + return(0); + } + + // after a $pause word attribute, ignore a $pause attribute on the next two words + if(tr->prepause_timeout > 0) + tr->prepause_timeout--; + + if((option_sayas & 0xf0) == 0x10) + { + if(!(word_flags & FLAG_FIRST_WORD)) + { + // SAYAS_CHARS, SAYAS_GLYPHS, or SAYAS_SINGLECHARS. Pause between each word. + pre_pause += 4; + } + } + + if(word_flags & FLAG_FIRST_UPPER) + { + if((option_capitals > 2) && (embedded_ix < N_EMBEDDED_LIST-6)) + { + // indicate capital letter by raising pitch + if(embedded_flag) + embedded_list[embedded_ix-1] &= ~0x80; // already embedded command before this word, remove terminator + if((pitch_raised = option_capitals) == 3) + pitch_raised = 20; // default pitch raise for capitals + embedded_list[embedded_ix++] = EMBED_P+0x40+0x80 + (pitch_raised << 8); // raise pitch + embedded_flag = SFLAG_EMBEDDED; + } + } + + p = (unsigned char *)word_phonemes; + if(word_flags & FLAG_PHONEMES) + { + // The input is in phoneme mnemonics, not language text + int c1; + char lang_name[12]; + + if(memcmp(word,"_^_",3)==0) + { + // switch languages + word+=3; + for(ix=0;;) + { + c1 = *word++; + if((c1==' ') || (c1==0)) + break; + lang_name[ix++] = tolower(c1); + } + lang_name[ix] = 0; + + if((ix = LookupPhonemeTable(lang_name)) > 0) + { + SelectPhonemeTable(ix); + word_phonemes[0] = phonSWITCH; + word_phonemes[1] = ix; + word_phonemes[2] = 0; + } + } + else + { + EncodePhonemes(word,word_phonemes,bad_phoneme); + } + flags = FLAG_FOUND; + } + else + { + int c2; + ix = 0; + while(((c2 = word_copy[ix] = word[ix]) != ' ') && (c2 != 0) && (ix < N_WORD_BYTES)) ix++; + word_copy_len = ix; + + flags = TranslateWord(translator, word, next_pause, wtab); + + if(flags & FLAG_SPELLWORD) + { + // re-translate the word as individual letters, separated by spaces + memcpy(word, word_copy, word_copy_len); + return(flags); + } + + if((flags & FLAG_ALT2_TRANS) && ((sylimit = tr->langopts.param[LOPT_COMBINE_WORDS]) > 0)) + { + char *p2; + int ok = 1; + int flags2; + int c_word2; + char ph_buf[N_WORD_PHONEMES]; + + // LANG=cs,sk + // combine a preposition with the following word + p2 = word; + while(*p2 != ' ') p2++; + + utf8_in(&c_word2, p2+1); // first character of the next word; + if(!iswalpha(c_word2)) + { + ok =0; + } + + if(ok != 0) + { + if(sylimit & 0x100) + { + // only if the second word has $alt attribute + strcpy(ph_buf,word_phonemes); + flags2 = TranslateWord(translator, p2+1, 0, wtab+1); + if((flags2 & FLAG_ALT_TRANS) == 0) + { + ok = 0; + strcpy(word_phonemes,ph_buf); + } + } + + if((sylimit & 0x200) && ((wtab+1)->flags & FLAG_LAST_WORD)) + { + // not if the next word is end-of-sentence + ok = 0; + } + } + + if(ok) + { + *p2 = '-'; // replace next space by hyphen + flags = TranslateWord(translator, word, next_pause, wtab); // translate the combined word + if(CountSyllables(p) > (sylimit & 0xf)) + { + // revert to separate words + *p2 = ' '; + flags = TranslateWord(translator, word, next_pause, wtab); + } + else + { + flags |= FLAG_SKIPWORDS; + dictionary_skipwords = 1; + } + } + } + + if(p[0] == phonSWITCH) + { + // this word uses a different language + memcpy(word, word_copy, word_copy_len); + + new_language = (char *)(&p[1]); + if(new_language[0]==0) + new_language = "en"; + + switch_phonemes = SetTranslator2(new_language); + + if(switch_phonemes >= 0) + { + // re-translate the word using the new translator + flags = TranslateWord(translator2, word, next_pause, wtab); +// strcpy((char *)p,translator2->word_phonemes); + if(p[0] == phonSWITCH) + { + // the second translator doesn't want to process this word + switch_phonemes = -1; + } + } + if(switch_phonemes < 0) + { + // language code is not recognised or 2nd translator won't translate it + p[0] = phonSCHWA; // just say something + p[1] = phonSCHWA; + p[2] = 0; + } + } + + if(!(word_flags & FLAG_HYPHEN)) + { + if(flags & FLAG_PAUSE1) + { + if(pre_pause < 1) + pre_pause = 1; + } + if((flags & FLAG_PREPAUSE) && ((word_flags && FLAG_LAST_WORD) == 0) && (tr->prepause_timeout == 0)) + { + // the word is marked in the dictionary list with $pause + if(pre_pause < 4) pre_pause = 4; + tr->prepause_timeout = 3; + } + } + + if((option_emphasis >= 3) && (pre_pause < 1)) + pre_pause = 1; + } + + plist2 = &ph_list2[n_ph_list2]; + stress = 0; + next_stress = 0; + srcix = 0; + max_stress = -1; + + found_dict_flag = 0; + if(flags & FLAG_FOUND) + found_dict_flag = SFLAG_DICTIONARY; + + while((pre_pause > 0) && (n_ph_list2 < N_PHONEME_LIST-4)) + { + // add pause phonemes here. Either because of punctuation (brackets or quotes) in the + // text, or because the word is marked in the dictionary lookup as a conjunction + if(pre_pause > 1) + { + SetPlist2(&ph_list2[n_ph_list2++],phonPAUSE); + pre_pause -= 2; + } + else + { + SetPlist2(&ph_list2[n_ph_list2++],phonPAUSE_NOLINK); + pre_pause--; + } + tr->end_stressed_vowel = 0; // forget about the previous word + tr->prev_dict_flags = 0; + } + + if((option_capitals==1) && (word_flags & FLAG_FIRST_UPPER)) + { + SetPlist2(&ph_list2[n_ph_list2++],phonPAUSE_SHORT); + SetPlist2(&ph_list2[n_ph_list2++],phonCAPITAL); + if((word_flags & FLAG_ALL_UPPER) && IsAlpha(word[1])) + { + // word > 1 letter and all capitals + SetPlist2(&ph_list2[n_ph_list2++],phonPAUSE_SHORT); + SetPlist2(&ph_list2[n_ph_list2++],phonCAPITAL); + } + } + + if(switch_phonemes >= 0) + { + // this word uses a different phoneme table + SetPlist2(&ph_list2[n_ph_list2],phonSWITCH); + ph_list2[n_ph_list2++].tone_number = switch_phonemes; // temporary phoneme table number + } + + // remove initial pause from a word if it follows a hyphen + if((word_flags & FLAG_HYPHEN) && (phoneme_tab[*p]->type == phPAUSE)) + p++; + + while(((ph_code = *p++) != 0) && (n_ph_list2 < N_PHONEME_LIST-4)) + { + if(ph_code == 255) + continue; // unknown phoneme + + // Add the phonemes to the first stage phoneme list (ph_list2) + ph = phoneme_tab[ph_code]; + + if(ph_code == phonSWITCH) + { + ph_list2[n_ph_list2].phcode = ph_code; + ph_list2[n_ph_list2].sourceix = 0; + ph_list2[n_ph_list2].synthflags = embedded_flag; + ph_list2[n_ph_list2++].tone_number = *p++; + } + else + if(ph->type == phSTRESS) + { + // don't add stress phonemes codes to the list, but give their stress + // value to the next vowel phoneme + // std_length is used to hold stress number or (if >10) a tone number for a tone language + if(ph->spect == 0) + next_stress = ph->std_length; + else + { + // for tone languages, the tone number for a syllable follows the vowel + if(prev_vowel >= 0) + { + ph_list2[prev_vowel].tone_number = ph_code; + } + else + { + next_tone = ph_code; // no previous vowel, apply to the next vowel + } + } + } + else + if(ph_code == phonSYLLABIC) + { + // mark the previous phoneme as a syllabic consonant + prev_vowel = n_ph_list2-1; + ph_list2[prev_vowel].synthflags |= SFLAG_SYLLABLE; + ph_list2[prev_vowel].stress = next_stress; + } + else + if(ph_code == phonLENGTHEN) + { + ph_list2[n_ph_list2-1].synthflags |= SFLAG_LENGTHEN; + } + else + if(ph_code == phonEND_WORD) + { + // a || symbol in a phoneme string was used to indicate a word boundary + // Don't add this phoneme to the list, but make sure the next phoneme has + // a newword indication + srcix = source_ix+1; + } + else + if(ph_code == phonX1) + { + // a language specific action + if(tr->langopts.param[LOPT_IT_DOUBLING]) + { + flags |= FLAG_DOUBLING; + } + } + else + { + ph_list2[n_ph_list2].phcode = ph_code; + ph_list2[n_ph_list2].tone_number = 0; + ph_list2[n_ph_list2].synthflags = embedded_flag | found_dict_flag; + embedded_flag = 0; + ph_list2[n_ph_list2].sourceix = srcix; + srcix = 0; + + if(ph->type == phVOWEL) + { + stress = next_stress; + next_stress = 0; + + if((prev_vowel >= 0) && (n_ph_list2-1) != prev_vowel) + ph_list2[n_ph_list2-1].stress = stress; // set stress for previous consonant + + ph_list2[n_ph_list2].synthflags |= SFLAG_SYLLABLE; + prev_vowel = n_ph_list2; + + if(stress > max_stress) + { + max_stress = stress; + max_stress_ix = n_ph_list2; + } + if(next_tone != 0) + { + ph_list2[n_ph_list2].tone_number = next_tone; + next_tone=0; + } + } + else + { + if(first_phoneme && tr->langopts.param[LOPT_IT_DOUBLING]) + { + if(((tr->prev_dict_flags & FLAG_DOUBLING) && (tr->langopts.param[LOPT_IT_DOUBLING] & 1)) || + (tr->end_stressed_vowel && (tr->langopts.param[LOPT_IT_DOUBLING] & 2))) + { + // italian, double the initial consonant if the previous word ends with a + // stressed vowel, or is marked with a flag + ph_list2[n_ph_list2].synthflags |= SFLAG_LENGTHEN; + } + } + } + + ph_list2[n_ph_list2].stress = stress; + n_ph_list2++; + first_phoneme = 0; + } + } + // don't set new-word if there is a hyphen before it + if((word_flags & FLAG_HYPHEN) == 0) + { + plist2->sourceix = source_ix; + } + + tr->end_stressed_vowel = 0; + if((stress >= 4) && (phoneme_tab[ph_list2[n_ph_list2-1].phcode]->type == phVOWEL)) + { + tr->end_stressed_vowel = 1; // word ends with a stressed vowel + } + + if(switch_phonemes >= 0) + { + // this word uses a different phoneme table, now switch back + SelectPhonemeTable(voice->phoneme_tab_ix); + SetPlist2(&ph_list2[n_ph_list2],phonSWITCH); + ph_list2[n_ph_list2++].tone_number = voice->phoneme_tab_ix; // original phoneme table number + } + + + if(pitch_raised > 0) + { + embedded_list[embedded_ix++] = EMBED_P+0x60+0x80 + (pitch_raised << 8); // lower pitch + SetPlist2(&ph_list2[n_ph_list2],phonPAUSE_SHORT); + ph_list2[n_ph_list2++].synthflags = SFLAG_EMBEDDED; + } + + if(flags & FLAG_STRESS_END2) + { + // this's word's stress could be increased later + ph_list2[max_stress_ix].synthflags |= SFLAG_PROMOTE_STRESS; + } + + tr->prev_dict_flags = flags; + return(flags); +} // end of TranslateWord2 + + + +static int EmbeddedCommand(unsigned int *source_index) +{//=================================================== + // An embedded command to change the pitch, volume, etc. + // returns number of commands added to embedded_list + + // pitch,speed,amplitude,expression,reverb,tone,voice,sayas + const char *commands = "PSARHTIVYMUBF"; + int value = -1; + int sign = 0; + unsigned char c; + char *p; + int cmd; + + c = source[*source_index]; + if(c == '+') + { + sign = 0x40; + (*source_index)++; + } + else + if(c == '-') + { + sign = 0x60; + (*source_index)++; + } + + if(isdigit(source[*source_index])) + { + value = atoi(&source[*source_index]); + while(isdigit(source[*source_index])) + source_index++; + } + + c = source[(*source_index)++]; + if(embedded_ix >= (N_EMBEDDED_LIST - 2)) + return(0); // list is full + + if((p = strchr_w(commands,c)) == NULL) + return(0); + cmd = (p - commands)+1; + if(value == -1) + { + value = embedded_default[cmd]; + sign = 0; + } + + if(cmd == EMBED_Y) + { + option_sayas2 = value; + count_sayas_digits = 0; + } + if(cmd == EMBED_F) + { + if(value >= 3) + word_emphasis = FLAG_EMPHASIZED; + else + word_emphasis = 0; + } + + embedded_list[embedded_ix++] = cmd + sign + (value << 8); + return(1); +} // end of EmbeddedCommand + + + +static int SubstituteChar(Translator *tr, unsigned int c, unsigned int next_in, int *insert) +{//========================================================================================= + int ix; + unsigned int word; + unsigned int new_c, c2, c_lower; + int upper_case = 0; + static int ignore_next = 0; + const unsigned int *replace_chars; + + if(ignore_next) + { + ignore_next = 0; + return(8); + } + if(c == 0) return(0); + + if((replace_chars = tr->langopts.replace_chars) == NULL) + return(c); + + // there is a list of character codes to be substituted with alternative codes + + if(iswupper(c_lower = c)) + { + c_lower = towlower(c); + upper_case = 1; + } + + new_c = 0; + for(ix=0; (word = replace_chars[ix]) != 0; ix+=2) + { + if(c_lower == (word & 0xffff)) + { + if((word >> 16) == 0) + { + new_c = replace_chars[ix+1]; + break; + } + if((word >> 16) == (unsigned int)towlower(next_in)) + { + new_c = replace_chars[ix+1]; + ignore_next = 1; + break; + } + } + } + + if(new_c == 0) + return(c); // no substitution + + if(new_c & 0xffe00000) + { + // there is a second character to be inserted + // don't convert the case of the second character unless the next letter is also upper case + c2 = new_c >> 16; + if(upper_case && iswupper(next_in)) + c2 = towupper(c2); + *insert = c2; + new_c &= 0xffff; + } + + if(upper_case) + new_c = towupper(new_c); + return(new_c); + +} + + +static int TranslateChar(Translator *tr, char *ptr, int prev_in, unsigned int c, unsigned int next_in, int *insert) +{//================================================================================================================ + // To allow language specific examination and replacement of characters + + int code; + int initial; + int medial; + int final; + int next2; + + static const unsigned char hangul_compatibility[0x34] = { + 0, 0x00,0x01,0xaa,0x02,0xac,0xad,0x03, + 0x04,0x05,0xb0,0xb1,0xb2,0xb3,0xb4,0xb4, + 0xb6,0x06,0x07,0x08,0xb9,0x09,0x0a,0xbc, + 0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x61, + 0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69, + 0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71, + 0x72,0x73,0x74,0x75 }; + + switch(tr->translator_name) + { + case L('a','f'): + // look for 'n and replace by a special character (unicode: schwa) + + utf8_in(&next2, &ptr[1]); + + if(!iswalpha(prev_in)) + { + if((c == '\'') && (next_in == 'n') && IsSpace(next2)) + { + // n preceded by either apostrophe or U2019 "right single quotation mark" + ptr[0] = ' '; // delete the n + return(0x0259); // replace ' by unicode schwa character + } + } + break; + + case L('k','o'): + if(((code = c - 0xac00) >= 0) && (c <= 0xd7af)) + { + // break a syllable hangul into 2 or 3 individual jamo + initial = (code/28)/21; + medial = (code/28) % 21; + final = code % 28; + + if(initial == 11) + { + // null initial + c = medial + 0x1161; + if(final > 0) + *insert = final + 0x11a7; + } + else + { + // extact the initial and insert the remainder with a null initial + c = initial + 0x1100; + *insert = (11*28*21) + (medial*28) + final + 0xac00; + } + return(c); + } + else + if(((code = c - 0x3130) >= 0) && (code < 0x34)) + { + // Hangul compatibility jamo + return(hangul_compatibility[code] + 0x1100); + } + break; + } + return(SubstituteChar(tr,c,next_in,insert)); +} + + +void *TranslateClause(Translator *tr, FILE *f_text, const void *vp_input, int *tone_out, char **voice_change) +{//========================================================================================================== + int ix; + int c; + int cc; + unsigned int source_index=0; + unsigned int prev_source_index=0; + int prev_in; + int prev_out=' '; + int prev_out2; + int prev_in2=0; + int next_in; + int char_inserted=0; + int clause_pause; + int pre_pause_add=0; + int word_mark = 0; + int all_upper_case=FLAG_ALL_UPPER; + int finished; + int single_quoted; + int phoneme_mode = 0; + int dict_flags = 0; // returned from dictionary lookup + int word_flags; // set here + int next_word_flags; + int embedded_count = 0; + int letter_count = 0; + int space_inserted = 0; + int syllable_marked = 0; + int decimal_sep_count = 0; + char *word; + char *p; + int j, k; + int n_digits; + int charix_top=0; + + short charix[N_TR_SOURCE+4]; + WORD_TAB words[N_CLAUSE_WORDS]; + int word_count=0; // index into words + + char sbuf[N_TR_SOURCE]; + + int terminator; + int tone; + int tone2; + + p_textinput = (unsigned char *)vp_input; + p_wchar_input = (wchar_t *)vp_input; + + embedded_ix = 0; + embedded_read = 0; + option_phoneme_input &= ~2; // clear bit 1 (temporary indication) + pre_pause = 0; + + if((clause_start_char = count_characters) < 0) + clause_start_char = 0; + clause_start_word = count_words + 1; + + for(ix=0; ix> 12) & 0xf; + if(tone2 != 0) + { + // override the tone type + tone = tone2; + } + + for(p=source; *p != 0; p++) + { + if(!isspace2(*p)) + { + break; + } + } + if(*p == 0) + { + // No characters except spaces. This is not a sentence. + // Don't add this pause, just make up the previous pause to this value; + clause_pause -= max_clause_pause; + if(clause_pause < 0) + clause_pause = 0; + + terminator &= ~CLAUSE_BIT_SENTENCE; // clear sentence bit + max_clause_pause += clause_pause; + } + else + { + max_clause_pause = clause_pause; + } + + if(new_sentence) + { + count_sentences++; + if(skip_sentences > 0) + { + skip_sentences--; + if(skip_sentences == 0) + skipping_text = 0; + } + } + + memset(&ph_list2[0],0,sizeof(ph_list2[0])); + ph_list2[0].phcode = phonPAUSE_SHORT; + + n_ph_list2 = 1; + tr->prev_last_stress = 0; + tr->prepause_timeout = 0; + tr->expect_verb=0; + tr->expect_noun=0; + tr->expect_past=0; + tr->expect_verb_s=0; + tr->phonemes_repeat_count = 0; + tr->end_stressed_vowel=0; + tr->prev_dict_flags = 0; + + word_count = 0; + single_quoted = 0; + word_flags = 0; + next_word_flags = 0; + + sbuf[0] = 0; + sbuf[1] = ' '; + sbuf[2] = ' '; + ix = 3; + prev_in = ' '; + + words[0].start = ix; + words[0].flags = 0; + finished = 0; + + for(j=0; charix[j]==0; j++); + words[0].sourceix = charix[j]; + k = 0; + while(charix[j] != 0) + { + // count the number of characters (excluding multibyte continuation bytes) + if(charix[j++] != -1) + k++; + } + words[0].length = k; + + while(!finished && (ix < (int)sizeof(sbuf))&& (n_ph_list2 < N_PHONEME_LIST-4)) + { + prev_out2 = prev_out; + utf8_in2(&prev_out,&sbuf[ix-1],1); // prev_out = sbuf[ix-1]; + + if(tr->langopts.tone_numbers && IsDigit09(prev_out) && IsAlpha(prev_out2)) + { + // tone numbers can be part of a word, consider them as alphabetic + prev_out = 'a'; + } + + if(prev_in2 != 0) + { + prev_in = prev_in2; + prev_in2 = 0; + } + else + if(source_index > 0) + { + utf8_in2(&prev_in,&source[source_index-1],1); // prev_in = source[source_index-1]; + } + + prev_source_index = source_index; + + if(char_inserted) + { + c = char_inserted; + char_inserted = 0; + } + else + { + source_index += utf8_in(&cc,&source[source_index]); // cc = source[source_index++]; + c = cc; + } + utf8_in(&next_in,&source[source_index]); + + if((c == CTRL_EMBEDDED) || (c == ctrl_embedded)) + { + // start of embedded command in the text + int srcix = source_index-1; + + if(prev_in != ' ') + { + c = ' '; + prev_in2 = c; + source_index--; + } + else + { + embedded_count += EmbeddedCommand(&source_index); + prev_in2 = prev_in; + // replace the embedded command by spaces + memset(&source[srcix],' ',source_index-srcix); + source_index = srcix; + continue; + } + } + + if(option_sayas2 == SAYAS_KEY) + { + if(((c == '_') || (c == '-')) && IsAlpha(prev_in)) + { + c = ' '; + } + c = towlower2(c); + } + + if(phoneme_mode) + { + all_upper_case = FLAG_PHONEMES; + + if((c == ']') && (next_in == ']')) + { + phoneme_mode = 0; + source_index++; + c = ' '; + } + } + else + if((option_sayas2 & 0xf0) == SAYAS_DIGITS) + { + if(iswdigit(c)) + { + count_sayas_digits++; + if(count_sayas_digits > (option_sayas2 & 0xf)) + { + // break after the specified number of digits + c = ' '; + space_inserted = 1; + count_sayas_digits = 0; + } + } + else + { + count_sayas_digits = 0; + if(iswdigit(prev_out)) + { + c = ' '; + space_inserted = 1; + } + } + } + else + if((option_sayas2 & 0x30) == 0) + { + // speak as words + +#ifdef deleted +if((c == '/') && (tr->langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(prev_out)) +{ + // TESTING, explicit indication of stressed syllable by /2 after the word + word_mark = next_in-'0'; + source_index++; + c = ' '; +} +#endif + if((c == 0x92) || (c == 0xb4) || (c == 0x2019) || (c == 0x2032)) + c = '\''; // 'microsoft' quote or sexed closing single quote, or prime - possibly used as apostrophe + + if((c == '?') && IsAlpha(prev_out) && IsAlpha(next_in)) + { + // ? between two letters may be a smart-quote replaced by ? + c = '\''; + } + + if(c == CHAR_EMPHASIS) + { + // this character is a marker that the previous word is the focus of the clause + c = ' '; + word_flags |= FLAG_FOCUS; + } + + c = TranslateChar(tr, &source[source_index], prev_in,c, next_in, &char_inserted); // optional language specific function + if(c == 8) + continue; // ignore this character + + if(char_inserted) + next_in = char_inserted; + + // allow certain punctuation within a word (usually only apostrophe) + if(!IsAlpha(c) && !IsSpace(c) && (wcschr(tr->punct_within_word,c) == 0)) + { + if(IsAlpha(prev_out)) + { + if(tr->langopts.tone_numbers && IsDigit09(c) && !IsDigit09(next_in)) + { + // allow a tone number as part of the word + } + else + { + c = ' '; // ensure we have an end-of-word terminator + space_inserted = 1; + } + } + } + + if(iswdigit(prev_out)) + { + if(!iswdigit(c) && (c != '.') && (c != ',')) + { + c = ' '; // terminate digit string with a space + space_inserted = 1; + } + } + else + { + if(prev_in != ',') + { + decimal_sep_count = 0; + } + } + + if((c == '[') && (next_in == '[') && option_phoneme_input) + { + phoneme_mode = FLAG_PHONEMES; + source_index++; + continue; + } + + if(c == 0) + { + finished = 1; + c = ' '; + } + else + if(IsAlpha(c)) + { + if(!IsAlpha(prev_out) || (tr->langopts.ideographs && ((c > 0x3040) || (prev_out > 0x3040)))) + { + if(wcschr(tr->punct_within_word,prev_out) == 0) + letter_count = 0; // don't reset count for an apostrophy within a word + + if((prev_out != ' ') && (wcschr(tr->punct_within_word,prev_out) == 0)) + { + // start of word, insert space if not one there already + c = ' '; + space_inserted = 1; + } + else + { + if(iswupper(c)) + word_flags |= FLAG_FIRST_UPPER; + + if((prev_out == ' ') && iswdigit(sbuf[ix-2]) && !iswdigit(prev_in)) + { + // word, following a number, but with a space between + // Add an extra space, to distinguish "2 a" from "2a" + sbuf[ix++] = ' '; + words[word_count].start++; + } + } + } + + letter_count++; + + if(iswupper(c)) + { + c = towlower2(c); + + if((j = tr->langopts.param[LOPT_CAPS_IN_WORD]) > 0) + { + if((j == 2) && (syllable_marked == 0)) + { + char_inserted = c; + c = 0x2c8; // stress marker + syllable_marked = 1; + } + } + else + { + if(iswlower(prev_in)) + { + c = ' '; // lower case followed by upper case, treat as new word + space_inserted = 1; + prev_in2 = c; + } + else + if((c != ' ') && iswupper(prev_in) && iswlower(next_in) && + (memcmp(&source[source_index],"s ",2) != 0)) // ENGLISH specific plural + { + c = ' '; // change from upper to lower case, start new word at the last uppercase + space_inserted = 1; + prev_in2 = c; + next_word_flags |= FLAG_NOSPACE; + } + } + } + else + { + if((all_upper_case) && (letter_count > 2)) + { + if((c == 's') && (next_in==' ')) + { + c = ' '; + all_upper_case |= FLAG_HAS_PLURAL; + + if(sbuf[ix-1] == '\'') + sbuf[ix-1] = ' '; + } + else + all_upper_case = 0; // current word contains lower case letters, not "'s" + } + else + all_upper_case = 0; + } + } + else + if(c=='-') + { + if(IsAlpha(prev_in) && IsAlpha(next_in)) + { + // '-' between two letters is a hyphen, treat as a space + word_flags |= FLAG_HYPHEN; + words[word_count-1].flags |= FLAG_HYPHEN_AFTER; + c = ' '; + } + else + if((prev_in==' ') && (next_in==' ')) + { + // ' - ' dash between two spaces, treat as pause + c = ' '; + pre_pause_add = 4; + } + else + if(next_in=='-') + { + // double hyphen, treat as pause + source_index++; + c = ' '; + pre_pause_add = 4; + } + else + if((prev_out == ' ') && IsAlpha(sbuf[ix-2]) && !IsAlpha(prev_in)) + { + // insert extra space between a word + space + hyphen, to distinguish 'a -2' from 'a-2' + sbuf[ix++] = ' '; + words[word_count].start++; + } + } + else + if(c == '\'') + { + if(iswalnum(prev_in) && IsAlpha(next_in)) + { + // between two letters, consider apostrophe as part of the word + single_quoted = 0; + } + else + if((wcschr(tr->char_plus_apostrophe,prev_in) != 0) && (prev_out2 == ' ')) + { + // consider single character plus apostrophe as a word + single_quoted = 0; + if(next_in == ' ') + { + source_index++; // skip following space + } + } + else + { + if((prev_out == 's') && (single_quoted==0)) + { + // looks like apostrophe after an 's' + c = ' '; + } + else + { + if(IsSpace(prev_out)) + single_quoted = 1; + else + single_quoted = 0; + + pre_pause_add = 4; // single quote + c = ' '; + } + } + } + else +#ifdef deleted +// Brackets are now recognised in TranslateRules() + if(IsBracket(c)) + { + pre_pause_add = 4; + c = ' '; + } + else +#endif + if(lookupwchar(breaks,c) != 0) + { + c = ' '; // various characters to treat as space + } + else + if(iswdigit(c)) + { + if(tr->langopts.tone_numbers && IsAlpha(prev_out) && !IsDigit(next_in)) + { + } + else + if((prev_out != ' ') && !iswdigit(prev_out)) + { + if((prev_out != tr->langopts.decimal_sep) || ((decimal_sep_count > 0) && (tr->langopts.decimal_sep == ','))) + { + c = ' '; + space_inserted = 1; + } + else + { + decimal_sep_count = 1; + } + } + else + if((prev_out == ' ') && IsAlpha(sbuf[ix-2]) && !IsAlpha(prev_in)) + { + // insert extra space between a word and a number, to distinguish 'a 2' from 'a2' + sbuf[ix++] = ' '; + words[word_count].start++; + } + } + } + + if(IsSpace(c)) + { + if(prev_out == ' ') + { + continue; // multiple spaces + } + + if(space_inserted) + { + words[word_count].length = source_index - words[word_count].sourceix; + } + + // end of 'word' + sbuf[ix++] = ' '; + + if((ix > words[word_count].start) && (word_count < N_CLAUSE_WORDS-1)) + { + if(embedded_count > 0) + { + // there are embedded commands before this word + embedded_list[embedded_ix-1] |= 0x80; // terminate list of commands for this word + words[word_count].flags |= FLAG_EMBEDDED; + embedded_count = 0; + } + words[word_count].pre_pause = pre_pause; + words[word_count].flags |= (all_upper_case | word_flags | word_emphasis); + words[word_count].wmark = word_mark; + + if(pre_pause > 0) + { + // insert an extra space before the word, to prevent influence from previous word across the pause + for(j=ix; j>words[word_count].start; j--) + { + sbuf[j] = sbuf[j-1]; + } + sbuf[j] = ' '; + words[word_count].start++; + ix++; + } + + word_count++; + words[word_count].start = ix; + words[word_count].flags = 0; + + for(j=source_index; charix[j] <= 0; j++); // skip blanks + words[word_count].sourceix = charix[j]; + k = 0; + while(charix[j] != 0) + { + // count the number of characters (excluding multibyte continuation bytes) + if(charix[j++] != -1) + k++; + } + words[word_count].length = k; + + word_flags = next_word_flags; + next_word_flags = 0; + pre_pause = 0; + word_mark = 0; + all_upper_case = FLAG_ALL_UPPER; + syllable_marked = 0; + } + + if(space_inserted) + { + source_index = prev_source_index; // rewind to the previous character + char_inserted = 0; + space_inserted = 0; + } + } + else + { + ix += utf8_out(c,&sbuf[ix]); // sbuf[ix++] = c; + } + if(pre_pause_add > pre_pause) + pre_pause = pre_pause_add; + pre_pause_add = 0; + } + + if((word_count==0) && (embedded_count > 0)) + { + // add a null 'word' to carry the embedded command flag + embedded_list[embedded_ix-1] |= 0x80; + words[word_count].flags |= FLAG_EMBEDDED; + word_count = 1; + } + + tr->clause_end = &sbuf[ix-1]; + sbuf[ix] = 0; + words[0].pre_pause = 0; // don't add extra pause at beginning of clause + words[word_count].pre_pause = 8; + if(word_count > 0) + words[word_count-1].flags |= FLAG_LAST_WORD; + words[0].flags |= FLAG_FIRST_WORD; + + for(ix=0; ix 0) + { + skip_words--; + if(skip_words == 0) + skipping_text = 0; + } + if(skipping_text) + continue; + + + // digits should have been converted to Latin alphabet ('0' to '9') + word = pw = &sbuf[words[ix].start]; + + if(iswdigit(word[0]) && (tr->langopts.numbers2 & NUM2_100000)) + { + // Languages with 100000 numbers. Remove thousands separators so that we can insert them again later + pn = number_buf; + while(pn < &number_buf[sizeof(number_buf)-3]) + { + if(iswdigit(*pw)) + { + *pn++ = *pw++; + } + else + if((*pw == tr->langopts.thousands_sep) && (pw[1] == ' ') && iswdigit(pw[2])) + { + pw += 2; + ix++; // skip "word" + } + else + { + nx = pw - word; + memset(word,' ',nx); + nx = pn - number_buf; + memcpy(word,number_buf,nx); + break; + } + } + pw = word; + } + + for(n_digits=0; iswdigit(word[n_digits]); n_digits++); // count consecutive digits + + if((n_digits > 4) && (word[0] != '0')) + { + // word is entirely digits, insert commas and break into 3 digit "words" + number_buf[0] = ' '; + pn = &number_buf[1]; + nx = n_digits; + + if((tr->langopts.numbers2 & NUM2_100000a) == NUM2_100000a) + break_numbers = break_numbers3; + else + if(tr->langopts.numbers2 & NUM2_100000) + break_numbers = break_numbers2; + else + break_numbers = break_numbers1; + + while(pn < &number_buf[sizeof(number_buf)-3]) + { + if(!isdigit(c = *pw++) && (c != tr->langopts.decimal_sep)) + break; + + *pn++ = c; + if((--nx > 0) && (break_numbers & (1 << nx))) + { + if(tr->langopts.thousands_sep != ' ') + { + *pn++ = tr->langopts.thousands_sep; + } + *pn++ = ' '; + if(break_numbers & (1 << (nx-1))) + { + // the next group only has 1 digits (i.e. NUM2_10000), make it three + *pn++ = '0'; + *pn++ = '0'; + } + if(break_numbers & (1 << (nx-2))) + { + // the next group only has 2 digits (i.e. NUM2_10000), make it three + *pn++ = '0'; + } + } + } + word = pw; + + // include the next few characters, in case there are an ordinal indicator + pn[0] = ' '; + memcpy(pn+1, pw, 8); + pn[8] = 0; + + for(pw = &number_buf[1]; pw < pn;) + { + dict_flags = TranslateWord2(tr, pw, &words[ix], words[ix].pre_pause,0 ); + while(*pw++ != ' '); + words[ix].pre_pause = 0; + words[ix].flags = 0; + } + } + else + { + pre_pause = 0; + dict_flags = TranslateWord2(tr, word, &words[ix], words[ix].pre_pause, words[ix+1].pre_pause); + + if(pre_pause > words[ix+1].pre_pause) + { + words[ix+1].pre_pause = pre_pause; + pre_pause = 0; + } + + if(dict_flags & FLAG_SPELLWORD) + { + // redo the word, speaking single letters + for(pw = word; *pw != ' ';) + { + memset(number_buf,' ',9); + nx = utf8_in(&c_temp, pw); + memcpy(&number_buf[2],pw,nx); + TranslateWord2(tr, &number_buf[2], &words[ix], 0, 0 ); + pw += nx; + } + } + + if((dict_flags & FLAG_DOT) && (ix == word_count-1) && (terminator == CLAUSE_PERIOD)) + { + // probably an abbreviation such as Mr. or B. rather than end of sentence + clause_pause = 10; + tone = 4; + } + } + + if(dict_flags & FLAG_SKIPWORDS) + { + ix += dictionary_skipwords; // dictionary indicates skip next word(s) + } + } + + for(ix=0; ix<2; ix++) + { + // terminate the clause with 2 PAUSE phonemes + PHONEME_LIST2 *p2; + p2 = &ph_list2[n_ph_list2 + ix]; + p2->phcode = phonPAUSE; + p2->stress = 0; + p2->sourceix = source_index; + p2->synthflags = 0; + } + n_ph_list2 += 2; + + if(count_words == 0) + { + clause_pause = 0; + } + if(Eof() && ((word_count == 0) || (option_endpause==0))) + { + clause_pause = 10; + } + + MakePhonemeList(tr, clause_pause, new_sentence); + + if(embedded_count) // ???? is this needed + { + phoneme_list[n_phoneme_list-2].synthflags = SFLAG_EMBEDDED; + embedded_list[embedded_ix-1] |= 0x80; + } + + + prev_clause_pause = clause_pause; + + *tone_out = tone; + + new_sentence = 0; + if(terminator & CLAUSE_BIT_SENTENCE) + { + new_sentence = 1; // next clause is a new sentence + } + + + if(voice_change != NULL) + { + // return new voice name if an embedded voice change command terminated the clause + if(terminator & CLAUSE_BIT_VOICE) + *voice_change = &source[source_index]; + else + *voice_change = NULL; + } + + if(Eof() || (vp_input==NULL)) + return(NULL); + + if(option_multibyte == espeakCHARS_WCHAR) + return((void *)p_wchar_input); + else + return((void *)p_textinput); +} // end of TranslateClause + + + + + +void InitText(int control) +{//======================= + count_sentences = 0; + count_words = 0; + end_character_position = 0; + skip_sentences = 0; + skip_marker[0] = 0; + skip_words = 0; + skip_characters = 0; + skipping_text = 0; + new_sentence = 1; + + prev_clause_pause = 0; + + option_sayas = 0; + option_sayas2 = 0; + option_emphasis = 0; + word_emphasis = 0; + embedded_flag = 0; + + InitText2(); + + if((control & espeakKEEP_NAMEDATA) == 0) + { + InitNamedata(); + } +} + diff --git a/navit/support/espeak/voices.c b/navit/support/espeak/voices.c new file mode 100755 index 0000000..a7bd3f5 --- /dev/null +++ b/navit/support/espeak/voices.c @@ -0,0 +1,1746 @@ +/*************************************************************************** + * Copyright (C) 2005 to 2007 by Jonathan Duddington * + * email: jonsd@users.sourceforge.net * + * * + * 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; either version 3 of the License, or * + * (at your option) any later version. * + * * + * 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 see: * + * . * + ***************************************************************************/ + +#include "StdAfx.h" + +#include "stdio.h" +#include "ctype.h" +#include "wctype.h" +#include "string.h" +#include "stdlib.h" +#include "speech.h" + +#ifdef PLATFORM_WINDOWS +#include "windows.h" +#else +#ifdef PLATFORM_RISCOS +#include "kernel.h" +#else +#include "dirent.h" +#endif +#endif + +#include "speak_lib.h" +#include "phoneme.h" +#include "synthesize.h" +#include "voice.h" +#include "translate.h" + +#define int(x) ((int)(x)) +#define double(x) ((double)(x)) +#define __cdecl + +MNEM_TAB genders [] = { + {"unknown", 0}, + {"male", 1}, + {"female", 2}, + {NULL, 0 }}; + +int tone_points[12] = {600,170, 1200,135, 2000,110, 3000,110, -1,0}; +//int tone_points[12] = {250,200, 400,170, 600,170, 1200,135, 2000,110, -1,0}; + +// limit the rate of change for each formant number +//static int formant_rate_22050[9] = {50, 104, 165, 230, 220, 220, 220, 220, 220}; // values for 22kHz sample rate +//static int formant_rate_22050[9] = {240, 180, 180, 180, 180, 180, 180, 180, 180}; // values for 22kHz sample rate +static int formant_rate_22050[9] = {240, 170, 170, 170, 170, 170, 170, 170, 170}; // values for 22kHz sample rate +int formant_rate[9]; // values adjusted for actual sample rate + + + +#define DEFAULT_LANGUAGE_PRIORITY 5 +#define N_VOICES_LIST 150 +static int n_voices_list = 0; +static espeak_VOICE *voices_list[N_VOICES_LIST]; +static int len_path_voices; + +espeak_VOICE voice_selected; + + +enum { + V_NAME = 1, + V_LANGUAGE, + V_GENDER, + V_TRANSLATOR, + V_PHONEMES, + V_DICTIONARY, + +// these affect voice quality, are independent of language + V_FORMANT, + V_PITCH, + V_ECHO, + V_FLUTTER, + V_ROUGHNESS, + V_CLARITY, + V_TONE, + V_VOICING, + V_BREATH, + V_BREATHW, + +// these override defaults set by the translator + V_WORDGAP, + V_INTONATION, + V_STRESSLENGTH, + V_STRESSAMP, + V_STRESSADD, + V_DICTRULES, + V_STRESSRULE, + V_CHARSET, + V_NUMBERS, + V_OPTION, + + V_MBROLA, + V_KLATT, + V_FAST, + +// these need a phoneme table to have been specified + V_REPLACE, + V_CONSONANTS +}; + + + +typedef struct { + const char *mnem; + int data; +} keywtab_t; + +static keywtab_t keyword_tab[] = { + {"name", V_NAME}, + {"language", V_LANGUAGE}, + {"gender", V_GENDER}, + + {"formant", V_FORMANT}, + {"pitch", V_PITCH}, + {"phonemes", V_PHONEMES}, + {"translator", V_TRANSLATOR}, + {"dictionary", V_DICTIONARY}, + {"stressLength", V_STRESSLENGTH}, + {"stressAmp", V_STRESSAMP}, + {"stressAdd", V_STRESSADD}, + {"intonation", V_INTONATION}, + {"dictrules", V_DICTRULES}, + {"stressrule", V_STRESSRULE}, + {"charset", V_CHARSET}, + {"replace", V_REPLACE}, + {"words", V_WORDGAP}, + {"echo", V_ECHO}, + {"flutter", V_FLUTTER}, + {"roughness", V_ROUGHNESS}, + {"clarity", V_CLARITY}, + {"tone", V_TONE}, + {"voicing", V_VOICING}, + {"breath", V_BREATH}, + {"breathw", V_BREATHW}, + {"numbers", V_NUMBERS}, + {"option", V_OPTION}, + {"mbrola", V_MBROLA}, + {"consonants", V_CONSONANTS}, + {"klatt", V_KLATT}, + {"fast_test", V_FAST}, + + // these just set a value in langopts.param[] + {"l_dieresis", 0x100+LOPT_DIERESES}, +// {"l_lengthen", 0x100+LOPT_IT_LENGTHEN}, + {"l_prefix", 0x100+LOPT_PREFIXES}, + {"l_regressive_v", 0x100+LOPT_REGRESSIVE_VOICING}, + {"l_unpronouncable", 0x100+LOPT_UNPRONOUNCABLE}, + {"l_sonorant_min", 0x100+LOPT_SONORANT_MIN}, + {"l_length_mods", 0x100+LOPT_LENGTH_MODS}, + {NULL, 0} }; + +#define N_VOICE_VARIANTS 12 +const char variants_either[N_VOICE_VARIANTS] = {1,2,12,3,13,4,14,5,11,0}; +const char variants_male[N_VOICE_VARIANTS] = {1,2,3,4,5,0}; +const char variants_female[N_VOICE_VARIANTS] = {11,12,13,14,0}; +const char *variant_lists[3] = {variants_either, variants_male, variants_female}; + +static voice_t voicedata; +voice_t *voice = &voicedata; + + +static char *fgets_strip(char *buf, int size, FILE *f_in) +{//====================================================== +// strip trailing spaces, and truncate lines at // comment + int len; + char *p; + + if(fgets(buf,size,f_in) == NULL) + return(NULL); + + len = strlen(buf); + while((--len > 0) && isspace(buf[len])) + buf[len] = 0; + + if((p = strstr(buf,"//")) != NULL) + *p = 0; + + return(buf); +} + + +static void SetToneAdjust(voice_t *voice, int *tone_pts) +{//===================================================== + int ix; + int pt; + int y; + int freq1=0; + int freq2; + int height1 = tone_pts[1]; + int height2; + double rate; + + for(pt=0; pt<12; pt+=2) + { + if(tone_pts[pt] == -1) + { + tone_pts[pt] = N_TONE_ADJUST*8; + if(pt > 0) + tone_pts[pt+1] = tone_pts[pt-1]; + } + freq2 = tone_pts[pt] / 8; // 8Hz steps + height2 = tone_pts[pt+1]; + if((freq2 - freq1) > 0) + { + rate = double(height2-height1)/(freq2-freq1); + + for(ix=freq1; ix 255) + y = 255; + voice->tone_adjust[ix] = y; + } + } + freq1 = freq2; + height1 = height2; + } +} + + +void ReadTonePoints(char *string, int *tone_pts) +{//============================================= +// tone_pts[] is int[12] + int ix; + + for(ix=0; ix<12; ix++) + tone_pts[ix] = -1; + + sscanf(string,"%d %d %d %d %d %d %d %d %d %d", + &tone_pts[0],&tone_pts[1],&tone_pts[2],&tone_pts[3], + &tone_pts[4],&tone_pts[5],&tone_pts[6],&tone_pts[7], + &tone_pts[8],&tone_pts[9]); +} + + + + +static espeak_VOICE *ReadVoiceFile(FILE *f_in, const char *fname, const char*leafname) +{//=================================================================================== +// Read a Voice file, allocate a VOICE_DATA and set data from the +// file's language, gender, name lines + + char linebuf[120]; + char vname[80]; + char vgender[80]; + char vlanguage[80]; + char languages[300]; // allow space for several alternate language names and priorities + + + unsigned int len; + int langix = 0; + int n_languages = 0; + char *p; + espeak_VOICE *voice_data; + int priority; + int age; + int n_variants = 3; // default, number of variants of this voice before using another voice + int gender; + +#ifdef PLATFORM_WINDOWS + char fname_buf[sizeof(path_home)+15]; + if(memcmp(leafname,"mb-",3) == 0) + { + // check whether the mbrola speech data is present for this voice + memcpy(vname,&leafname[3],3); + vname[3] = 0; + sprintf(fname_buf,"%s/mbrola/%s",path_home,vname); + + if(GetFileLength(fname_buf) <= 0) + return(0); + } +#endif + + vname[0] = 0; + vgender[0] = 0; + age = 0; + + while(fgets_strip(linebuf,sizeof(linebuf),f_in) != NULL) + { + if(memcmp(linebuf,"name",4)==0) + { + p = &linebuf[4]; + while(isspace(*p)) p++; + strncpy0(vname,p,sizeof(vname)); + } + else + if(memcmp(linebuf,"language",8)==0) + { + priority = DEFAULT_LANGUAGE_PRIORITY; + vlanguage[0] = 0; + + sscanf(&linebuf[8],"%s %d",vlanguage,&priority); + len = strlen(vlanguage) + 2; + // check for space in languages[] + if(len < (sizeof(languages)-langix-1)) + { + languages[langix] = priority; + + strcpy(&languages[langix+1],vlanguage); + langix += len; + n_languages++; + } + } + else + if(memcmp(linebuf,"gender",6)==0) + { + sscanf(&linebuf[6],"%s %d",vgender,&age); + } + else + if(memcmp(linebuf,"variants",8)==0) + { + sscanf(&linebuf[8],"%d",&n_variants); + } + } + languages[langix++] = 0; + + gender = LookupMnem(genders,vgender); + + if(n_languages == 0) + { + return(NULL); // no language lines in the voice file + } + + p = (char *)calloc(sizeof(espeak_VOICE) + langix + strlen(fname) + strlen(vname) + 3, 1); + voice_data = (espeak_VOICE *)p; + p = &p[sizeof(espeak_VOICE)]; + + memcpy(p,languages,langix); + voice_data->languages = p; + + strcpy(&p[langix],fname); + voice_data->identifier = &p[langix]; + voice_data->name = &p[langix]; + + if(vname[0] != 0) + { + langix += strlen(fname)+1; + strcpy(&p[langix],vname); + voice_data->name = &p[langix]; + } + + voice_data->age = age; + voice_data->gender = gender; + voice_data->variant = 0; + voice_data->xx1 = n_variants; + return(voice_data); +} // end of ReadVoiceFile + + + + +void VoiceReset(int tone_only) +{//=========================== +// Set voice to the default values + + int pk; + static unsigned char default_heights[N_PEAKS] = {128,128,120,120,110,110,128,128,128}; + static unsigned char default_widths[N_PEAKS] = {128,128,128,160,171,171,128,128,128}; + + static int breath_widths[N_PEAKS] = {0,200,200,400,400,400,600,600,600}; + + // default is: pitch 82,118 +// voice->pitch_base = 0x49000; // default, 73 << 12; +// voice->pitch_range = 0x0f30; // default = 0x1000 + voice->pitch_base = 0x47000; + voice->pitch_range = 3996; + + voice->formant_factor = 256; + + voice->echo_delay = 0; + voice->echo_amp = 0; + voice->flutter = 64; + voice->n_harmonic_peaks = 5; + voice->peak_shape = 0; + voice->voicing = 64; + voice->consonant_amp = 100; + voice->consonant_ampv = 100; + memset(voice->klattv,0,sizeof(voice->klattv)); + memset(speed.fast_settings,0,sizeof(speed.fast_settings)); + +#ifdef PLATFORM_RISCOS + voice->roughness = 1; +#else + voice->roughness = 2; +#endif + + InitBreath(); + for(pk=0; pkfreq[pk] = 256; + voice->height[pk] = default_heights[pk]*2; + voice->width[pk] = default_widths[pk]*2; + voice->breath[pk] = 0; + voice->breathw[pk] = breath_widths[pk]; // default breath formant woidths + voice->freqadd[pk] = 0; + + // adjust formant smoothing depending on sample rate + formant_rate[pk] = (formant_rate_22050[pk] * 22050)/samplerate; + } + voice->height[2] = 240; // reduce F2 slightly + + // This table provides the opportunity for tone control. + // Adjustment of harmonic amplitudes, steps of 8Hz + // value of 128 means no change +// memset(voice->tone_adjust,128,sizeof(voice->tone_adjust)); +SetToneAdjust(voice,tone_points); + + // default values of speed factors + voice->speedf1 = 256; + voice->speedf2 = 238; + voice->speedf3 = 232; + + if(tone_only == 0) + { + n_replace_phonemes = 0; + option_quiet = 0; + LoadMbrolaTable(NULL,NULL,0); + } +} // end of VoiceReset + + +static void VoiceFormant(char *p) +{//============================== + // Set parameters for a formant + int ix; + int formant; + int freq = 100; + int height = 100; + int width = 100; + int freqadd = 0; + + ix = sscanf(p,"%d %d %d %d %d",&formant,&freq,&height,&width,&freqadd); + if(ix < 2) + return; + + if((formant < 0) || (formant > 8)) + return; + + if(freq >= 0) + voice->freq[formant] = int(freq * 2.56001); + if(height >= 0) + voice->height[formant] = int(height * 2.56001); + if(width >= 0) + voice->width[formant] = int(width * 2.56001); + voice->freqadd[formant] = freqadd; +} + + + + + +static void PhonemeReplacement(int type, char *p) +{//============================================== + int n; + int phon; + int flags = 0; + char phon_string1[12]; + char phon_string2[12]; + + strcpy(phon_string2,"NULL"); + n = sscanf(p,"%d %s %s",&flags,phon_string1,phon_string2); + if((n < 2) || (n_replace_phonemes >= N_REPLACE_PHONEMES)) + return; + + if((phon = LookupPhonemeString(phon_string1)) == 0) + return; // not recognised + + replace_phonemes[n_replace_phonemes].old_ph = phon; + replace_phonemes[n_replace_phonemes].new_ph = LookupPhonemeString(phon_string2); + replace_phonemes[n_replace_phonemes++].type = flags; +} // end of PhonemeReplacement + + + +static int Read8Numbers(char *data_in,int *data) +{//============================================= +// Read 8 integer numbers + return(sscanf(data_in,"%d %d %d %d %d %d %d %d", + &data[0],&data[1],&data[2],&data[3],&data[4],&data[5],&data[6],&data[7])); +} + + +voice_t *LoadVoice(const char *vname, int control) +{//=============================================== +// control, bit 0 1= no_default +// bit 1 1 = change tone only, not language +// bit 2 1 = don't report error on LoadDictionary +// bit 4 1 = vname = full path + + FILE *f_voice = NULL; + keywtab_t *k; + char *p; + int key; + int ix; + int n; + int value; + int error = 0; + int langix = 0; + int tone_only = control & 2; + int language_set = 0; + int phonemes_set = 0; + int stress_amps_set = 0; + int stress_lengths_set = 0; + int stress_add_set = 0; + int conditional_rules = 0; + LANGUAGE_OPTIONS *langopts = NULL; + + Translator *new_translator = NULL; + + char voicename[40]; + char language_name[40]; + char translator_name[40]; + char new_dictionary[40]; + char phonemes_name[40]; + const char *language_type; + char buf[200]; + char path_voices[sizeof(path_home)+12]; + char langname[4]; + + int stress_amps[8]; + int stress_lengths[8]; + int stress_add[8]; + + int pitch1; + int pitch2; + + static char voice_identifier[40]; // file name for voice_selected + static char voice_name[40]; // voice name for voice_selected + static char voice_languages[100]; // list of languages and priorities for voice_selected + + strcpy(voicename,vname); + if(voicename[0]==0) + strcpy(voicename,"default"); + + if(control & 0x10) + { + strcpy(buf,vname); + if(GetFileLength(buf) <= 0) + return(NULL); + } + else + { + sprintf(path_voices,"%s%cvoices%c",path_home,PATHSEP,PATHSEP); + sprintf(buf,"%s%s",path_voices,voicename); + + if(GetFileLength(buf) <= 0) + { + // look for the voice in a sub-directory of the language name + langname[0] = voicename[0]; + langname[1] = voicename[1]; + langname[2] = 0; + sprintf(buf,"%s%s%c%s",path_voices,langname,PATHSEP,voicename); + + if(GetFileLength(buf) <= 0) + { + // look in "test" sub-directory + sprintf(buf,"%stest%c%s",path_voices,PATHSEP,voicename); + } + } + } + + f_voice = fopen(buf,"r"); + + language_type = "en"; // default + if(f_voice == NULL) + { + if(control & 3) + return(NULL); // can't open file + + if(SelectPhonemeTableName(voicename) >= 0) + language_type = voicename; + } + + if(!tone_only && (translator != NULL)) + { + DeleteTranslator(translator); + translator = NULL; + } + + strcpy(translator_name,language_type); + strcpy(new_dictionary,language_type); + strcpy(phonemes_name,language_type); + + + if(!tone_only) + { + voice = &voicedata; + strncpy0(voice_identifier,vname,sizeof(voice_identifier)); + voice_name[0] = 0; + voice_languages[0] = 0; + + voice_selected.identifier = voice_identifier; + voice_selected.name = voice_name; + voice_selected.languages = voice_languages; + } + else + { + // append the variant file name to the voice identifier + if((p = strchr(voice_identifier,'+')) != NULL) + *p = 0; // remove previous variant name + sprintf(buf,"+%s",&vname[3]); // omit !v/ from the variant filename + strcat(voice_identifier,buf); + langopts = &translator->langopts; + } + VoiceReset(tone_only); + + if(!tone_only) + SelectPhonemeTableName(phonemes_name); // set up phoneme_tab + + + while((f_voice != NULL) && (fgets_strip(buf,sizeof(buf),f_voice) != NULL)) + { + // isolate the attribute name + for(p=buf; (*p != 0) && !isspace(*p); p++); + *p++ = 0; + + if(buf[0] == 0) continue; + + key = 0; + for(k=keyword_tab; k->mnem != NULL; k++) + { + if(strcmp(buf,k->mnem)==0) + { + key = k->data; + break; + } + } + + switch(key) + { + case V_LANGUAGE: + { + unsigned int len; + int priority; + + if(tone_only) + break; + + priority = DEFAULT_LANGUAGE_PRIORITY; + language_name[0] = 0; + + sscanf(p,"%s %d",language_name,&priority); + if(strcmp(language_name,"variant") == 0) + break; + + len = strlen(language_name) + 2; + // check for space in languages[] + if(len < (sizeof(voice_languages)-langix-1)) + { + voice_languages[langix] = priority; + + strcpy(&voice_languages[langix+1],language_name); + langix += len; + } + + // only act on the first language line + if(language_set == 0) + { + language_type = strtok(language_name,"-"); + language_set = 1; + strcpy(translator_name,language_type); + strcpy(new_dictionary,language_type); + strcpy(phonemes_name,language_type); + SelectPhonemeTableName(phonemes_name); + + if(new_translator != NULL) + DeleteTranslator(new_translator); + + new_translator = SelectTranslator(translator_name); + langopts = &new_translator->langopts; + } + } + break; + + case V_NAME: + if(tone_only == 0) + { + while(isspace(*p)) p++; + strncpy0(voice_name,p,sizeof(voice_name)); + } + break; + + case V_GENDER: + { + int age; + char vgender[80]; + sscanf(p,"%s %d",vgender,&age); + voice_selected.gender = LookupMnem(genders,vgender); + voice_selected.age = age; + } + break; + + case V_TRANSLATOR: + if(tone_only) break; + + sscanf(p,"%s",translator_name); + + if(new_translator != NULL) + DeleteTranslator(new_translator); + + new_translator = SelectTranslator(translator_name); + langopts = &new_translator->langopts; + break; + + case V_DICTIONARY: // dictionary + sscanf(p,"%s",new_dictionary); + break; + + case V_PHONEMES: // phoneme table + sscanf(p,"%s",phonemes_name); + break; + + case V_FORMANT: + VoiceFormant(p); + break; + + case V_PITCH: + { + double factor; + // default is pitch 82 118 + n = sscanf(p,"%d %d",&pitch1,&pitch2); + voice->pitch_base = (pitch1 - 9) << 12; + voice->pitch_range = (pitch2 - pitch1) * 108; + factor = double(pitch1 - 82)/82; + voice->formant_factor = (int)((1+factor/4) * 256); // nominal formant shift for a different voice pitch + } + break; + + case V_STRESSLENGTH: // stressLength + stress_lengths_set = Read8Numbers(p,stress_lengths); + break; + + case V_STRESSAMP: // stressAmp + stress_amps_set = Read8Numbers(p,stress_amps); + break; + + case V_STRESSADD: // stressAdd + stress_add_set = Read8Numbers(p,stress_add); + break; + + case V_INTONATION: // intonation + sscanf(p,"%d %d",&option_tone_flags,&option_tone2); + if((option_tone_flags & 0xff) != 0) + langopts->intonation_group = option_tone_flags & 0xff; + break; + + case V_DICTRULES: // conditional dictionary rules and list entries + while(*p != 0) + { + while(isspace(*p)) p++; + n = -1; + if(((n = atoi(p)) > 0) && (n < 32)) + { + p++; + conditional_rules |= (1 << n); + } + while(isalnum(*p)) p++; + } + break; + + case V_REPLACE: + if(phonemes_set == 0) + { + // must set up a phoneme table before we can lookup phoneme mnemonics + SelectPhonemeTableName(phonemes_name); + phonemes_set = 1; + } + PhonemeReplacement(key,p); + break; + + case V_WORDGAP: // words + sscanf(p,"%d %d",&langopts->word_gap, &langopts->vowel_pause); + break; + + case V_STRESSRULE: + sscanf(p,"%d %d %d %d",&langopts->stress_rule, + &langopts->stress_flags, + &langopts->unstressed_wd1, + &langopts->unstressed_wd2); + break; + + case V_CHARSET: + if((sscanf(p,"%d",&value)==1) && (value < N_CHARSETS)) + new_translator->charset_a0 = charsets[value]; + break; + + case V_NUMBERS: + sscanf(p,"%d %d",&langopts->numbers,&langopts->numbers2); + break; + + case V_OPTION: + if(sscanf(p,"%d %d",&ix,&value) == 2) + { + if((ix >= 0) && (ix < N_LOPTS)) + langopts->param[ix] = value; + } + break; + + case V_ECHO: + // echo. suggest: 135mS 11% + value = 0; + voice->echo_amp = 0; + sscanf(p,"%d %d",&voice->echo_delay,&voice->echo_amp); + break; + + case V_FLUTTER: // flutter + if(sscanf(p,"%d",&value)==1) + voice->flutter = value * 32; + break; + + case V_ROUGHNESS: // roughness + if(sscanf(p,"%d",&value)==1) + voice->roughness = value; + break; + + case V_CLARITY: // formantshape + if(sscanf(p,"%d",&value)==1) + { + if(value > 4) + { + voice->peak_shape = 1; // squarer formant peaks + value = 4; + } + voice->n_harmonic_peaks = 1+value; + } + break; + + case V_TONE: + { + int tone_data[12]; + ReadTonePoints(p,tone_data); + SetToneAdjust(voice,tone_data); + } + break; + + case V_VOICING: + if(sscanf(p,"%d",&value)==1) + voice->voicing = (value * 64)/100; + break; + + case V_BREATH: + voice->breath[0] = Read8Numbers(p,&voice->breath[1]); + for(ix=1; ix<8; ix++) + { + if(ix % 2) + voice->breath[ix] = -voice->breath[ix]; + } + break; + + case V_BREATHW: + voice->breathw[0] = Read8Numbers(p,&voice->breathw[1]); + break; + + case V_CONSONANTS: + value = sscanf(p,"%d %d",&voice->consonant_amp, &voice->consonant_ampv); + break; + + case V_MBROLA: + { + int srate = 16000; + char name[40]; + char phtrans[40]; + + phtrans[0] = 0; + sscanf(p,"%s %s %d",name,phtrans,&srate); + LoadMbrolaTable(name,phtrans,srate); + } + break; + + case V_KLATT: + voice->klattv[0] = 1; // default source: IMPULSIVE + Read8Numbers(p,voice->klattv); + voice->klattv[KLATT_Kopen] -= 40; + break; + + case V_FAST: + Read8Numbers(p,speed.fast_settings); + SetSpeed(2); + break; + + default: + if((key & 0xff00) == 0x100) + { + sscanf(p,"%d",&langopts->param[key &0xff]); + } + else + { + fprintf(stderr,"Bad voice attribute: %s\n",buf); + } + break; + } + } + if(f_voice != NULL) + fclose(f_voice); + + if((new_translator == NULL) && (!tone_only)) + { + // not set by language attribute + new_translator = SelectTranslator(translator_name); + } + + for(ix=0; ixfreq2[ix] = voice->freq[ix]; + voice->height2[ix] = voice->height[ix]; + voice->width2[ix] = voice->width[ix]; + } + + if(tone_only) + { + new_translator = translator; + } + else + { + if((ix = SelectPhonemeTableName(phonemes_name)) < 0) + { + fprintf(stderr,"Unknown phoneme table: '%s'\n",phonemes_name); + } + voice->phoneme_tab_ix = ix; + error = LoadDictionary(new_translator, new_dictionary, control & 4); + if(dictionary_name[0]==0) + return(NULL); // no dictionary loaded + + new_translator->dict_condition = conditional_rules; + + voice_languages[langix] = 0; + } + + langopts = &new_translator->langopts; + + + if((value = langopts->param[LOPT_LENGTH_MODS]) != 0) + { + SetLengthMods(new_translator,value); + } + + voice->width[0] = (voice->width[0] * 105)/100; + + if(!tone_only) + { + translator = new_translator; + } + + // relative lengths of different stress syllables + for(ix=0; ixstress_lengths[ix] = stress_lengths[ix]; + } + for(ix=0; ixstress_lengths[ix] += stress_add[ix]; + } + for(ix=0; ixstress_amps[ix] = stress_amps[ix]; + translator->stress_amps_r[ix] = stress_amps[ix] -1; + } + + return(voice); +} // end of LoadVoice + + +static char *ExtractVoiceVariantName(char *vname, int variant_num) +{//=============================================================== +// Remove any voice variant suffix (name or number) from a voice name +// Returns the voice variant name + + char *p; + static char variant_name[20]; + char variant_prefix[5]; + + variant_name[0] = 0; + sprintf(variant_prefix,"!v%c",PATHSEP); + + if(vname != NULL) + { + if((p = strchr(vname,'+')) != NULL) + { + // The voice name has a +variant suffix + *p++ = 0; // delete the suffix from the voice name + if(isdigit(*p)) + { + variant_num = atoi(p); // variant number + } + else + { + // voice variant name, not number + strcpy(variant_name,variant_prefix); + strncpy0(&variant_name[3],p,sizeof(variant_name)-3); + } + } + } + + if(variant_num > 0) + { + if(variant_num < 10) + sprintf(variant_name,"%sm%d",variant_prefix, variant_num); // male + else + sprintf(variant_name,"%sf%d",variant_prefix, variant_num-10); // female + } + + return(variant_name); +} // end of ExtractVoiceVariantName + + + +voice_t *LoadVoiceVariant(const char *vname, int variant_num) +{//========================================================== +// Load a voice file. +// Also apply a voice variant if specified by "variant", or by "+number" or "+name" in the "vname" + + voice_t *v; + char *variant_name; + char buf[60]; + + strncpy0(buf,vname,sizeof(buf)); + variant_name = ExtractVoiceVariantName(buf,variant_num); + + if((v = LoadVoice(buf,0)) == NULL) + return(NULL); + + if(variant_name[0] != 0) + { + v = LoadVoice(variant_name,2); + } + return(v); +} + + + +static int __cdecl VoiceNameSorter(const void *p1, const void *p2) +{//======================================================= + int ix; + espeak_VOICE *v1 = *(espeak_VOICE **)p1; + espeak_VOICE *v2 = *(espeak_VOICE **)p2; + + + if((ix = strcmp(&v1->languages[1],&v2->languages[1])) != 0) // primary language name + return(ix); + if((ix = v1->languages[0] - v2->languages[0]) != 0) // priority number + return(ix); + return(strcmp(v1->name,v2->name)); +} + + +static int __cdecl VoiceScoreSorter(const void *p1, const void *p2) +{//======================================================== + int ix; + espeak_VOICE *v1 = *(espeak_VOICE **)p1; + espeak_VOICE *v2 = *(espeak_VOICE **)p2; + + if((ix = v2->score - v1->score) != 0) + return(ix); + return(strcmp(v1->name,v2->name)); +} + + +static int ScoreVoice(espeak_VOICE *voice_spec, const char *spec_language, int spec_n_parts, int spec_lang_len, espeak_VOICE *voice) +{//========================================================================================================================= + int ix; + const char *p; + int c1, c2; + int language_priority; + int n_parts; + int matching; + int matching_parts; + int score = 0; + int x; + int ratio; + int required_age; + int diff; + + p = voice->languages; // list of languages+dialects for which this voice is suitable + + if(strcmp(spec_language,"mbrola")==0) + { + // only list mbrola voices + if(memcmp(voice->identifier,"mb/",3) == 0) + return(100); + return(0); + } + + if(spec_n_parts == 0) + { + score = 100; + } + else + { + if((*p == 0) && (strcmp(spec_language,"variants")==0)) + { + // match on a voice with no languages if the required language is "variants" + score = 100; + } + + // compare the required language with each of the languages of this voice + while(*p != 0) + { + language_priority = *p++; + + matching = 1; + matching_parts = 0; + n_parts = 1; + + for(ix=0; ; ix++) + { + if((ix >= spec_lang_len) || ((c1 = spec_language[ix]) == '-')) + c1 = 0; + if((c2 = p[ix]) == '-') + c2 = 0; + + if(c1 != c2) + { + matching = 0; + } + + if(p[ix] == '-') + { + n_parts++; + if(matching) + matching_parts++; + } + if(p[ix] == 0) + break; + } + p += (ix+1); + matching_parts += matching; // number of parts which match + + if(matching_parts == 0) + continue; // no matching parts for this language + + x = 5; + // reduce the score if not all parts of the required language match + if((diff = (spec_n_parts - matching_parts)) > 0) + x -= diff; + + // reduce score if the language is more specific than required + if((diff = (n_parts - matching_parts)) > 0) + x -= diff; + + x = x*100 - (language_priority * 2); + + if(x > score) + score = x; + } + } + if(score == 0) + return(0); + + if(voice_spec->name != NULL) + { + if(strcmp(voice_spec->name,voice->name)==0) + { + // match on voice name + score += 500; + } + else + if(strcmp(voice_spec->name,voice->identifier)==0) + { + score += 400; + } + } + + if(((voice_spec->gender == 1) || (voice_spec->gender == 2)) && + ((voice->gender == 1) || (voice->gender == 2))) + { + if(voice_spec->gender == voice->gender) + score += 50; + else + score -= 50; + } + + if((voice_spec->age <= 12) && (voice->gender == 2) && (voice->age > 12)) + { + score += 5; // give some preference for non-child female voice if a child is requested + } + + if(voice->age != 0) + { + if(voice_spec->age == 0) + required_age = 30; + else + required_age = voice_spec->age; + + ratio = (required_age*100)/voice->age; + if(ratio < 100) + ratio = 10000/ratio; + ratio = (ratio - 100)/10; // 0=exact match, 10=out by factor of 2 + x = 5 - ratio; + if(x > 0) x = 0; + + score = score + x; + + if(voice_spec->age > 0) + score += 10; // required age specified, favour voices with a specified age (near it) + } + if(score < 1) + score = 1; + return(score); +} // end of ScoreVoice + + +static int SetVoiceScores(espeak_VOICE *voice_select, espeak_VOICE **voices, int control) +{//====================================================================================== +// control: bit0=1 include mbrola voices + int ix; + int score; + int nv; // number of candidates + int n_parts=0; + int lang_len=0; + espeak_VOICE *vp; + char language[80]; + + // count number of parts in the specified language + if((voice_select->languages != NULL) && (voice_select->languages[0] != 0)) + { + n_parts = 1; + lang_len = strlen(voice_select->languages); + for(ix=0; (ix<=lang_len) && ((unsigned)ix < sizeof(language)); ix++) + { + if((language[ix] = tolower(voice_select->languages[ix])) == '-') + n_parts++; + } + } + // select those voices which match the specified language + nv = 0; + for(ix=0; ixidentifier,"mb/",3) == 0)) + continue; + + if((score = ScoreVoice(voice_select, language, n_parts, lang_len, voices_list[ix])) > 0) + { + voices[nv++] = vp; + vp->score = score; + } + } + voices[nv] = NULL; // list terminator + + if(nv==0) + return(0); + + // sort the selected voices by their score + qsort(voices,nv,sizeof(espeak_VOICE *),VoiceScoreSorter); + + return(nv); +} // end of SetVoiceScores + + + + +espeak_VOICE *SelectVoiceByName(espeak_VOICE **voices, const char *name) +{//===================================================================== + int ix; + int match_fname = -1; + int match_fname2 = -1; + int match_name = -1; + const char *id; + int last_part_len; + char last_part[41]; + + if(voices == NULL) + { + if(n_voices_list == 0) + espeak_ListVoices(NULL); // create the voices list + voices = voices_list; + } + + sprintf(last_part,"%c%s",PATHSEP,name); + last_part_len = strlen(last_part); + + for(ix=0; voices[ix] != NULL; ix++) + { + if(strcmp(name,voices[ix]->name)==0) + { + match_name = ix; // found matching voice name + break; + } + else + if(strcmp(name,id = voices[ix]->identifier)==0) + { + match_fname = ix; // matching identifier, use this if no matching name + } + else + if(strcmp(last_part,&id[strlen(id)-last_part_len])==0) + { + match_fname2 = ix; + } + } + + if(match_name < 0) + { + match_name = match_fname; // no matching name, try matching filename + if(match_name < 0) + match_name = match_fname2; // try matching just the last part of the filename + } + + if(match_name < 0) + return(NULL); + + return(voices[match_name]); +} // end of SelectVoiceByName + + + + +char const *SelectVoice(espeak_VOICE *voice_select, int *found) +{//============================================================ +// Returns a path within espeak-voices, with a possible +variant suffix +// variant is an output-only parameter + int nv; // number of candidates + int ix, ix2; + int j; + int n_variants; + int variant_number; + int gender; + int skip; + int aged=1; + char *variant_name; + const char *p, *p_start; + espeak_VOICE *vp = NULL; + espeak_VOICE *vp2; + espeak_VOICE voice_select2; + espeak_VOICE *voices[N_VOICES_LIST]; // list of candidates + espeak_VOICE *voices2[N_VOICES_LIST+N_VOICE_VARIANTS]; + static espeak_VOICE voice_variants[N_VOICE_VARIANTS]; + static char voice_id[50]; + + *found = 1; + memcpy(&voice_select2,voice_select,sizeof(voice_select2)); + + if(n_voices_list == 0) + espeak_ListVoices(NULL); // create the voices list + + if((voice_select2.languages == NULL) || (voice_select2.languages[0] == 0)) + { + // no language is specified. Get language from the named voice + static char buf[60]; + + if(voice_select2.name == NULL) + { + if((voice_select2.name = voice_select2.identifier) == NULL) + voice_select2.name = "default"; + } + + strncpy0(buf,voice_select2.name,sizeof(buf)); + variant_name = ExtractVoiceVariantName(buf,0); + + vp = SelectVoiceByName(voices_list,buf); + if(vp != NULL) + { + voice_select2.languages = &(vp->languages[1]); + + if((voice_select2.gender==0) && (voice_select2.age==0) && (voice_select2.variant==0)) + { + if(variant_name[0] != 0) + { + sprintf(voice_id,"%s+%s",vp->identifier,&variant_name[3]); // omit the !v/ from variant_name + return(voice_id); + } + + return(vp->identifier); + } + } + } + + // select and sort voices for the required language + nv = SetVoiceScores(&voice_select2,voices,0); + + if(nv == 0) + { + // no matching voice, choose the default + *found = 0; + if((voices[0] = SelectVoiceByName(voices_list,"default")) != NULL) + nv = 1; + } + + gender = 0; + if((voice_select2.gender == 2) || ((voice_select2.age > 0) && (voice_select2.age < 13))) + gender = 2; + else + if(voice_select2.gender == 1) + gender = 1; + +#define AGE_OLD 60 + if(voice_select2.age < AGE_OLD) + aged = 0; + + p = p_start = variant_lists[gender]; + if(aged == 0) + p++; // the first voice in the variants list is older + + // add variants for the top voices + n_variants = 0; + for(ix=0, ix2=0; ixgender != gender)) + { + skip=1; + } + if((ix2==0) && aged && (vp->age < AGE_OLD)) + { + skip=1; + } + if(skip==0) + { + voices2[ix2++] = vp; + } + + for(j=0; (j < vp->xx1) && (n_variants < N_VOICE_VARIANTS);) + { + if((variant_number = *p) == 0) + { + p = p_start; + continue; + } + + vp2 = &voice_variants[n_variants++]; // allocate space for voice variant + memcpy(vp2,vp,sizeof(espeak_VOICE)); // copy from the original voice + vp2->variant = variant_number; + voices2[ix2++] = vp2; + p++; + j++; + } + } + // add any more variants to the end of the list + while((vp != NULL) && ((variant_number = *p++) != 0) && (n_variants < N_VOICE_VARIANTS)) + { + vp2 = &voice_variants[n_variants++]; // allocate space for voice variant + memcpy(vp2,vp,sizeof(espeak_VOICE)); // copy from the original voice + vp2->variant = variant_number; + voices2[ix2++] = vp2; + } + + // index the sorted list by the required variant number + vp = voices2[voice_select2.variant % ix2]; + + if(vp->variant != 0) + { + variant_name = ExtractVoiceVariantName(NULL,vp->variant); + sprintf(voice_id,"%s+%s",vp->identifier,&variant_name[3]); + return(voice_id); + } + + return(vp->identifier); +} // end of SelectVoice + + + +static void GetVoices(const char *path) +{//==================================== + FILE *f_voice; + espeak_VOICE *voice_data; + int ftype; + char fname[sizeof(path_home)+100]; + +#ifdef PLATFORM_RISCOS + int len; + int *type; + char *p; + _kernel_swi_regs regs; + _kernel_oserror *error; + char buf[80]; + char directory2[sizeof(path_home)+100]; + + regs.r[0] = 10; + regs.r[1] = (int)path; + regs.r[2] = (int)buf; + regs.r[3] = 1; + regs.r[4] = 0; + regs.r[5] = sizeof(buf); + regs.r[6] = 0; + + while(regs.r[3] > 0) + { + error = _kernel_swi(0x0c+0x20000,®s,®s); /* OS_GBPB 10, read directory entries */ + if((error != NULL) || (regs.r[3] == 0)) + { + break; + } + type = (int *)(&buf[16]); + len = strlen(&buf[20]); + sprintf(fname,"%s.%s",path,&buf[20]); + + if(*type == 2) + { + // a sub-directory + GetVoices(fname); + } + else + { + // a regular line, add it to the voices list + if((f_voice = fopen(fname,"r")) == NULL) + continue; + + // pass voice file name within the voices directory + voice_data = ReadVoiceFile(f_voice, fname+len_path_voices, &buf[20]); + fclose(f_voice); + + if(voice_data != NULL) + { + voices_list[n_voices_list++] = voice_data; + } + } + } +#else +#ifdef PLATFORM_WINDOWS + WIN32_FIND_DATAA FindFileData; + HANDLE hFind = INVALID_HANDLE_VALUE; + +#undef UNICODE // we need FindFirstFileA() which takes an 8-bit c-string + sprintf(fname,"%s\\*",path); + hFind = FindFirstFileA(fname, &FindFileData); + if(hFind == INVALID_HANDLE_VALUE) + return; + + do { + sprintf(fname,"%s%c%s",path,PATHSEP,FindFileData.cFileName); + + ftype = GetFileLength(fname); + + if((ftype == -2) && (FindFileData.cFileName[0] != '.')) + { + // a sub-sirectory + GetVoices(fname); + } + else + if(ftype > 0) + { + // a regular line, add it to the voices list + if((f_voice = fopen(fname,"r")) == NULL) + continue; + + // pass voice file name within the voices directory + voice_data = ReadVoiceFile(f_voice, fname+len_path_voices, FindFileData.cFileName); + fclose(f_voice); + + if(voice_data != NULL) + { + voices_list[n_voices_list++] = voice_data; + } + } + } while(FindNextFileA(hFind, &FindFileData) != 0); + FindClose(hFind); + +#else + DIR *dir; + struct dirent *ent; + + if((dir = opendir((char *)path)) == NULL) // note: (char *) is needed for WINCE + return; + + while((ent = readdir(dir)) != NULL) + { + if(n_voices_list >= (N_VOICES_LIST-2)) + break; // voices list is full + + sprintf(fname,"%s%c%s",path,PATHSEP,ent->d_name); + + ftype = GetFileLength(fname); + + if((ftype == -2) && (ent->d_name[0] != '.')) + { + // a sub-sirectory + GetVoices(fname); + } + else + if(ftype > 0) + { + // a regular line, add it to the voices list + if((f_voice = fopen(fname,"r")) == NULL) + continue; + + // pass voice file name within the voices directory + voice_data = ReadVoiceFile(f_voice, fname+len_path_voices, ent->d_name); + fclose(f_voice); + + if(voice_data != NULL) + { + voices_list[n_voices_list++] = voice_data; + } + } + } + closedir(dir); +#endif +#endif +} // end of GetVoices + + + +espeak_ERROR SetVoiceByName(const char *name) +{//========================================= + espeak_VOICE *v; + espeak_VOICE voice_selector; + char *variant_name; + static char buf[60]; + + strncpy0(buf,name,sizeof(buf)); + variant_name = ExtractVoiceVariantName(buf,0); + + memset(&voice_selector,0,sizeof(voice_selector)); +// voice_selector.name = buf; + voice_selector.name = (char *)name; // include variant name in voice stack ?? + + // first check for a voice with this filename + // This may avoid the need to call espeak_ListVoices(). + + if(LoadVoice(buf,1) != NULL) + { + if(variant_name[0] != 0) + { + LoadVoice(variant_name,2); + } + + DoVoiceChange(voice); + SetVoiceStack(&voice_selector); + return(EE_OK); + } + + if(n_voices_list == 0) + espeak_ListVoices(NULL); // create the voices list + + if((v = SelectVoiceByName(voices_list,buf)) != NULL) + { + if(LoadVoice(v->identifier,0) != NULL) + { + if(variant_name[0] != 0) + { + LoadVoice(variant_name,2); + } + DoVoiceChange(voice); + SetVoiceStack(&voice_selector); + return(EE_OK); + } + } + return(EE_INTERNAL_ERROR); // voice name not found +} // end of SetVoiceByName + + + +espeak_ERROR SetVoiceByProperties(espeak_VOICE *voice_selector) +{//============================================================ + const char *voice_id; + int voice_found; + + voice_id = SelectVoice(voice_selector, &voice_found); + + if(voice_found == 0) + return(EE_NOT_FOUND); + + LoadVoiceVariant(voice_id,0); + DoVoiceChange(voice); + SetVoiceStack(voice_selector); + + return(EE_OK); +} // end of SetVoiceByProperties + + + + +//======================================================================= +// Library Interface Functions +//======================================================================= +#pragma GCC visibility push(default) + + +const espeak_VOICE **espeak_ListVoices(espeak_VOICE *voice_spec) +{//======================================================================== +#ifndef PLATFORM_RISCOS + int ix; + int j; + espeak_VOICE *v; + static espeak_VOICE *voices[N_VOICES_LIST]; + char path_voices[sizeof(path_home)+12]; + + // free previous voice list data + + for(ix=0; ixlanguages[0] != 0) && (strcmp(&v->languages[1],"variant") != 0) && (memcmp(v->identifier,"mb/",3) != 0)) + { + voices[j++] = v; + } + } + voices[j] = NULL; + } + return((const espeak_VOICE **)voices); +#endif + return((const espeak_VOICE **)voices_list); +} // end of espeak_ListVoices + + + +espeak_VOICE *espeak_GetCurrentVoice(void) +{//================================================== + return(&voice_selected); +} + +#pragma GCC visibility pop + + diff --git a/navit/support/espeak/wavegen.c b/navit/support/espeak/wavegen.c new file mode 100755 index 0000000..a5467ca --- /dev/null +++ b/navit/support/espeak/wavegen.c @@ -0,0 +1,1941 @@ +/*************************************************************************** + * Copyright (C) 2005 to 2007 by Jonathan Duddington * + * email: jonsd@users.sourceforge.net * + * * + * 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; either version 3 of the License, or * + * (at your option) any later version. * + * * + * 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, see: * + * . * + ***************************************************************************/ + +#include "StdAfx.h" + +// this version keeps wavemult window as a constant fraction +// of the cycle length - but that spreads out the HF peaks too much + +#include +#include +#include +#include + + +#include "speak_lib.h" +#include "speech.h" +#include "phoneme.h" +#include "synthesize.h" +#include "voice.h" + +//#undef INCLUDE_KLATT + +#ifdef USE_PORTAUDIO +#include "portaudio.h" +#undef USE_PORTAUDIO +// determine portaudio version by looking for a #define which is not in V18 +#ifdef paNeverDropInput +#define USE_PORTAUDIO 19 +#else +#define USE_PORTAUDIO 18 +#endif +#endif + +#define N_SINTAB 2048 +#include "sintab.h" + + +#define PI 3.1415927 +#define PI2 6.283185307 +#define N_WAV_BUF 10 + +voice_t *wvoice; + +FILE *f_log = NULL; +int option_waveout = 0; +static int option_harmonic1 = 10; // 10 +int option_log_frames = 0; +static int flutter_amp = 64; + +static int general_amplitude = 60; +static int consonant_amp = 26; // 24 + +int embedded_value[N_EMBEDDED_VALUES]; + +static int PHASE_INC_FACTOR; +int samplerate = 0; // this is set by Wavegeninit() +int samplerate_native=0; +extern int option_device_number; +extern int option_quiet; + +static wavegen_peaks_t peaks[N_PEAKS]; +static int peak_harmonic[N_PEAKS]; +static int peak_height[N_PEAKS]; + +#define N_ECHO_BUF 5500 // max of 250mS at 22050 Hz +static int echo_head; +static int echo_tail; +static int echo_length = 0; // period (in sample\) to ensure completion of echo at the end of speech, set in WavegenSetEcho() +static int echo_amp = 0; +static short echo_buf[N_ECHO_BUF]; + +static int voicing; +static RESONATOR rbreath[N_PEAKS]; + +static int harm_sqrt_n = 0; + + +#define N_LOWHARM 30 +static int harm_inc[N_LOWHARM]; // only for these harmonics do we interpolate amplitude between steps +static int *harmspect; +static int hswitch=0; +static int hspect[2][MAX_HARMONIC]; // 2 copies, we interpolate between then +static int max_hval=0; + +static int nsamples=0; // number to do +static int modulation_type = 0; +static int glottal_flag = 0; +static int glottal_reduce = 0; + + +WGEN_DATA wdata; + +static int amp_ix; +static int amp_inc; +static unsigned char *amplitude_env = NULL; + +static int samplecount=0; // number done +static int samplecount_start=0; // count at start of this segment +static int end_wave=0; // continue to end of wave cycle +static int wavephase; +static int phaseinc; +static int cycle_samples; // number of samples in a cycle at current pitch +static int cbytes; +static int hf_factor; + +static double minus_pi_t; +static double two_pi_t; + + +unsigned char *out_ptr; +unsigned char *out_start; +unsigned char *out_end; +int outbuf_size = 0; + +// the queue of operations passed to wavegen from sythesize +long wcmdq[N_WCMDQ][4]; +int wcmdq_head=0; +int wcmdq_tail=0; + +// pitch,speed, +int embedded_default[N_EMBEDDED_VALUES] = {0,50,170,100,50, 0,0, 0,170,0,0,0,0,0}; +static int embedded_max[N_EMBEDDED_VALUES] = {0,0x7fff,600,300,99,99,99, 0,600,0,0,0,0,4}; + +#define N_CALLBACK_IX N_WAV_BUF-2 // adjust this delay to match display with the currently spoken word +int current_source_index=0; + +extern FILE *f_wave; + +#if (USE_PORTAUDIO == 18) +static PortAudioStream *pa_stream=NULL; +#endif +#if (USE_PORTAUDIO == 19) +static PaStream *pa_stream=NULL; +#endif + +/* default pitch envelope, a steady fall */ +#define ENV_LEN 128 + +#define int(x) (int)(x) +/* +unsigned char Pitch_env0[ENV_LEN] = { + 255,253,251,249,247,245,243,241,239,237,235,233,231,229,227,225, + 223,221,219,217,215,213,211,209,207,205,203,201,199,197,195,193, + 191,189,187,185,183,181,179,177,175,173,171,169,167,165,163,161, + 159,157,155,153,151,149,147,145,143,141,139,137,135,133,131,129, + 127,125,123,121,119,117,115,113,111,109,107,105,103,101, 99, 97, + 95, 93, 91, 89, 87, 85, 83, 81, 79, 77, 75, 73, 71, 69, 67, 65, + 63, 61, 59, 57, 55, 53, 51, 49, 47, 45, 43, 41, 39, 37, 35, 33, + 31, 29, 27, 25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1 +}; +*/ + +/* +unsigned char Pitch_long[ENV_LEN] = { + 254,249,250,251,252,253,254,254, 255,255,255,255,254,254,253,252, + 251,250,249,247,244,242,238,234, 230,225,221,217,213,209,206,203, + 199,195,191,187,183,179,175,172, 168,165,162,159,156,153,150,148, + 145,143,140,138,136,134,132,130, 128,126,123,120,117,114,111,107, + 104,100,96,91, 86,82,77,73, 70,66,63,60, 58,55,53,51, + 49,47,46,45, 43,42,40,38, 36,34,31,28, 26,24,22,20, + 18,16,14,12, 11,10,9,8, 8,8,8,8, 9,8,8,8, + 8,8,7,7, 6,6,6,5, 4,4,3,3, 2,1,1,0 +}; +*/ + +// 1st index=roughness +// 2nd index=modulation_type +// value: bits 0-3 amplitude (16ths), bits 4-7 every n cycles +#define N_ROUGHNESS 8 +static unsigned char modulation_tab[N_ROUGHNESS][8] = { + {0, 0x00, 0x00, 0x00, 0, 0x46, 0xf2, 0x29}, + {0, 0x2f, 0x00, 0x2f, 0, 0x45, 0xf2, 0x29}, + {0, 0x2f, 0x00, 0x2e, 0, 0x45, 0xf2, 0x28}, + {0, 0x2e, 0x00, 0x2d, 0, 0x34, 0xf2, 0x28}, + {0, 0x2d, 0x2d, 0x2c, 0, 0x34, 0xf2, 0x28}, + {0, 0x2b, 0x2b, 0x2b, 0, 0x34, 0xf2, 0x28}, + {0, 0x2a, 0x2a, 0x2a, 0, 0x34, 0xf2, 0x28}, + {0, 0x29, 0x29, 0x29, 0, 0x34, 0xf2, 0x28}, +}; + +// Flutter table, to add natural variations to the pitch +#define N_FLUTTER 0x170 +static int Flutter_inc; +static const unsigned char Flutter_tab[N_FLUTTER] = { + 0x80, 0x9b, 0xb5, 0xcb, 0xdc, 0xe8, 0xed, 0xec, + 0xe6, 0xdc, 0xce, 0xbf, 0xb0, 0xa3, 0x98, 0x90, + 0x8c, 0x8b, 0x8c, 0x8f, 0x92, 0x94, 0x95, 0x92, + 0x8c, 0x83, 0x78, 0x69, 0x59, 0x49, 0x3c, 0x31, + 0x2a, 0x29, 0x2d, 0x36, 0x44, 0x56, 0x69, 0x7d, + 0x8f, 0x9f, 0xaa, 0xb1, 0xb2, 0xad, 0xa4, 0x96, + 0x87, 0x78, 0x69, 0x5c, 0x53, 0x4f, 0x4f, 0x55, + 0x5e, 0x6b, 0x7a, 0x88, 0x96, 0xa2, 0xab, 0xb0, + + 0xb1, 0xae, 0xa8, 0xa0, 0x98, 0x91, 0x8b, 0x88, + 0x89, 0x8d, 0x94, 0x9d, 0xa8, 0xb2, 0xbb, 0xc0, + 0xc1, 0xbd, 0xb4, 0xa5, 0x92, 0x7c, 0x63, 0x4a, + 0x32, 0x1e, 0x0e, 0x05, 0x02, 0x05, 0x0f, 0x1e, + 0x30, 0x44, 0x59, 0x6d, 0x7f, 0x8c, 0x96, 0x9c, + 0x9f, 0x9f, 0x9d, 0x9b, 0x99, 0x99, 0x9c, 0xa1, + 0xa9, 0xb3, 0xbf, 0xca, 0xd5, 0xdc, 0xe0, 0xde, + 0xd8, 0xcc, 0xbb, 0xa6, 0x8f, 0x77, 0x60, 0x4b, + + 0x3a, 0x2e, 0x28, 0x29, 0x2f, 0x3a, 0x48, 0x59, + 0x6a, 0x7a, 0x86, 0x90, 0x94, 0x95, 0x91, 0x89, + 0x80, 0x75, 0x6b, 0x62, 0x5c, 0x5a, 0x5c, 0x61, + 0x69, 0x74, 0x80, 0x8a, 0x94, 0x9a, 0x9e, 0x9d, + 0x98, 0x90, 0x86, 0x7c, 0x71, 0x68, 0x62, 0x60, + 0x63, 0x6b, 0x78, 0x88, 0x9b, 0xaf, 0xc2, 0xd2, + 0xdf, 0xe6, 0xe7, 0xe2, 0xd7, 0xc6, 0xb2, 0x9c, + 0x84, 0x6f, 0x5b, 0x4b, 0x40, 0x39, 0x37, 0x38, + + 0x3d, 0x43, 0x4a, 0x50, 0x54, 0x56, 0x55, 0x52, + 0x4d, 0x48, 0x42, 0x3f, 0x3e, 0x41, 0x49, 0x56, + 0x67, 0x7c, 0x93, 0xab, 0xc3, 0xd9, 0xea, 0xf6, + 0xfc, 0xfb, 0xf4, 0xe7, 0xd5, 0xc0, 0xaa, 0x94, + 0x80, 0x71, 0x64, 0x5d, 0x5a, 0x5c, 0x61, 0x68, + 0x70, 0x77, 0x7d, 0x7f, 0x7f, 0x7b, 0x74, 0x6b, + 0x61, 0x57, 0x4e, 0x48, 0x46, 0x48, 0x4e, 0x59, + 0x66, 0x75, 0x84, 0x93, 0x9f, 0xa7, 0xab, 0xaa, + + 0xa4, 0x99, 0x8b, 0x7b, 0x6a, 0x5b, 0x4e, 0x46, + 0x43, 0x45, 0x4d, 0x5a, 0x6b, 0x7f, 0x92, 0xa6, + 0xb8, 0xc5, 0xcf, 0xd3, 0xd2, 0xcd, 0xc4, 0xb9, + 0xad, 0xa1, 0x96, 0x8e, 0x89, 0x87, 0x87, 0x8a, + 0x8d, 0x91, 0x92, 0x91, 0x8c, 0x84, 0x78, 0x68, + 0x55, 0x41, 0x2e, 0x1c, 0x0e, 0x05, 0x01, 0x05, + 0x0f, 0x1f, 0x34, 0x4d, 0x68, 0x81, 0x9a, 0xb0, + 0xc1, 0xcd, 0xd3, 0xd3, 0xd0, 0xc8, 0xbf, 0xb5, + + 0xab, 0xa4, 0x9f, 0x9c, 0x9d, 0xa0, 0xa5, 0xaa, + 0xae, 0xb1, 0xb0, 0xab, 0xa3, 0x96, 0x87, 0x76, + 0x63, 0x51, 0x42, 0x36, 0x2f, 0x2d, 0x31, 0x3a, + 0x48, 0x59, 0x6b, 0x7e, 0x8e, 0x9c, 0xa6, 0xaa, + 0xa9, 0xa3, 0x98, 0x8a, 0x7b, 0x6c, 0x5d, 0x52, + 0x4a, 0x48, 0x4a, 0x50, 0x5a, 0x67, 0x75, 0x82 +}; + +// waveform shape table for HF peaks, formants 6,7,8 +#define N_WAVEMULT 128 +static int wavemult_offset=0; +static int wavemult_max=0; + +// the presets are for 22050 Hz sample rate. +// A different rate will need to recalculate the presets in WavegenInit() +static unsigned char wavemult[N_WAVEMULT] = { + 0, 0, 0, 2, 3, 5, 8, 11, 14, 18, 22, 27, 32, 37, 43, 49, + 55, 62, 69, 76, 83, 90, 98,105,113,121,128,136,144,152,159,166, + 174,181,188,194,201,207,213,218,224,228,233,237,240,244,246,249, + 251,252,253,253,253,253,252,251,249,246,244,240,237,233,228,224, + 218,213,207,201,194,188,181,174,166,159,152,144,136,128,121,113, + 105, 98, 90, 83, 76, 69, 62, 55, 49, 43, 37, 32, 27, 22, 18, 14, + 11, 8, 5, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + +// set from y = pow(2,x) * 128, x=-1 to 1 +unsigned char pitch_adjust_tab[MAX_PITCH_VALUE+1] = { + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 86, 87, 88, + 89, 91, 92, 93, 94, 96, 97, 98, + 100,101,103,104,105,107,108,110, + 111,113,115,116,118,119,121,123, + 124,126,128,130,132,133,135,137, + 139,141,143,145,147,149,151,153, + 155,158,160,162,164,167,169,171, + 174,176,179,181,184,186,189,191, + 194,197,199,202,205,208,211,214, + 217,220,223,226,229,232,236,239, + 242,246,249,252, 254,255 }; + +int WavegenFill(int fill_zeros); + + +#ifdef LOG_FRAMES +static void LogMarker(int type, int value) +{//======================================= + if(option_log_frames == 0) + return; + + if((type == espeakEVENT_PHONEME) || (type == espeakEVENT_SENTENCE)) + { + f_log=fopen("log-espeakedit","a"); + if(f_log) + { + if(type == espeakEVENT_PHONEME) + fprintf(f_log,"Phoneme [%s]\n",WordToString(value)); + else + fprintf(f_log,"\n"); + fclose(f_log); + f_log = NULL; + } + } +} +#endif + +void WcmdqStop() +{//============= + wcmdq_head = 0; + wcmdq_tail = 0; +#ifdef USE_PORTAUDIO + Pa_AbortStream(pa_stream); +#endif +} + + +int WcmdqFree() +{//============ + int i; + i = wcmdq_head - wcmdq_tail; + if(i <= 0) i += N_WCMDQ; + return(i); +} + +int WcmdqUsed() +{//============ + return(N_WCMDQ - WcmdqFree()); +} + + +void WcmdqInc() +{//============ + wcmdq_tail++; + if(wcmdq_tail >= N_WCMDQ) wcmdq_tail=0; +} + +static void WcmdqIncHead() +{//======================= + wcmdq_head++; + if(wcmdq_head >= N_WCMDQ) wcmdq_head=0; +} + + + +// data points from which to make the presets for pk_shape1 and pk_shape2 +#define PEAKSHAPEW 256 +static const float pk_shape_x[2][8] = { + {0,-0.6f, 0.0f, 0.6f, 1.4f, 2.5f, 4.5f, 5.5f}, + {0,-0.6f, 0.0f, 0.6f, 1.4f, 2.0f, 4.5f, 5.5f }}; +static const float pk_shape_y[2][8] = { + {0, 67, 81, 67, 31, 14, 0, -6} , + {0, 77, 81, 77, 31, 7, 0, -6 }}; + +unsigned char pk_shape1[PEAKSHAPEW+1] = { + 255,254,254,254,254,254,253,253,252,251,251,250,249,248,247,246, + 245,244,242,241,239,238,236,234,233,231,229,227,225,223,220,218, + 216,213,211,209,207,205,203,201,199,197,195,193,191,189,187,185, + 183,180,178,176,173,171,169,166,164,161,159,156,154,151,148,146, + 143,140,138,135,132,129,126,123,120,118,115,112,108,105,102, 99, + 96, 95, 93, 91, 90, 88, 86, 85, 83, 82, 80, 79, 77, 76, 74, 73, + 72, 70, 69, 68, 67, 66, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, + 55, 54, 53, 52, 52, 51, 50, 50, 49, 48, 48, 47, 47, 46, 46, 46, + 45, 45, 45, 44, 44, 44, 44, 44, 44, 44, 43, 43, 43, 43, 44, 43, + 42, 42, 41, 40, 40, 39, 38, 38, 37, 36, 36, 35, 35, 34, 33, 33, + 32, 32, 31, 30, 30, 29, 29, 28, 28, 27, 26, 26, 25, 25, 24, 24, + 23, 23, 22, 22, 21, 21, 20, 20, 19, 19, 18, 18, 18, 17, 17, 16, + 16, 15, 15, 15, 14, 14, 13, 13, 13, 12, 12, 11, 11, 11, 10, 10, + 10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, 5, 5, + 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, + 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; + +static unsigned char pk_shape2[PEAKSHAPEW+1] = { + 255,254,254,254,254,254,254,254,254,254,253,253,253,253,252,252, + 252,251,251,251,250,250,249,249,248,248,247,247,246,245,245,244, + 243,243,242,241,239,237,235,233,231,229,227,225,223,221,218,216, + 213,211,208,205,203,200,197,194,191,187,184,181,178,174,171,167, + 163,160,156,152,148,144,140,136,132,127,123,119,114,110,105,100, + 96, 94, 91, 88, 86, 83, 81, 78, 76, 74, 71, 69, 66, 64, 62, 60, + 57, 55, 53, 51, 49, 47, 44, 42, 40, 38, 36, 34, 32, 30, 29, 27, + 25, 23, 21, 19, 18, 16, 14, 12, 11, 9, 7, 6, 4, 3, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; + +static unsigned char *pk_shape; + + +static void WavegenInitPkData(int which) +{//===================================== +// this is only needed to set up the presets for pk_shape1 and pk_shape2 +// These have already been pre-calculated and preset +#ifdef deleted + int ix; + int p; + float x; + float y[PEAKSHAPEW]; + float maxy=0; + + if(which==0) + pk_shape = pk_shape1; + else + pk_shape = pk_shape2; + + p = 0; + for(ix=0;ix= pk_shape_x[which][p+3]) p++; + y[ix] = polint(&pk_shape_x[which][p],&pk_shape_y[which][p],3,x); + if(y[ix] > maxy) maxy = y[ix]; + } + for(ix=0;ix= 0) ? p : 0; + } + pk_shape[PEAKSHAPEW]=0; +#endif +} // end of WavegenInitPkData + + + +#ifdef USE_PORTAUDIO +// PortAudio interface + +static int userdata[4]; +static PaError pa_init_err=0; +static int out_channels=1; + +#if USE_PORTAUDIO == 18 +static int WaveCallback(void *inputBuffer, void *outputBuffer, + unsigned long framesPerBuffer, PaTimestamp outTime, void *userData ) +#else +static int WaveCallback(const void *inputBuffer, void *outputBuffer, + long unsigned int framesPerBuffer, const PaStreamCallbackTimeInfo *outTime, + PaStreamCallbackFlags flags, void *userData ) +#endif +{ + int ix; + int result; + unsigned char *p; + + out_ptr = out_start = (unsigned char *)outputBuffer; + out_end = out_ptr + framesPerBuffer*2; + +#ifdef LIBRARY + event_list_ix = 0; +#endif + + result = WavegenFill(1); + +#ifdef LIBRARY + count_samples += framesPerBuffer; + if(synth_callback) + { + // synchronous-playback mode, allow the calling process to abort the speech + event_list[event_list_ix].type = espeakEVENT_LIST_TERMINATED; // indicates end of event list + event_list[event_list_ix].user_data = 0; + + if(synth_callback(NULL,0,event_list) == 1) + { + SpeakNextClause(NULL,NULL,2); // stop speaking + result = 1; + } + } +#endif + +#ifdef ARCH_BIG + { + // swap the order of bytes in each sound sample in the portaudio buffer + int c; + out_ptr = (unsigned char *)outputBuffer; + out_end = out_ptr + framesPerBuffer*2; + while(out_ptr < out_end) + { + c = out_ptr[0]; + out_ptr[0] = out_ptr[1]; + out_ptr[1] = c; + out_ptr += 2; + } + } +#endif + + if(out_channels == 2) + { + // sound output can only do stereo, not mono. Duplicate each sound sample to + // produce 2 channels. + out_ptr = (unsigned char *)outputBuffer; + for(ix=framesPerBuffer-1; ix>=0; ix--) + { + p = &out_ptr[ix*4]; + p[3] = p[1] = out_ptr[ix*2 + 1]; + p[2] = p[0] = out_ptr[ix*2]; + } + } + +#if USE_PORTAUDIO == 18 +#ifdef PLATFORM_WINDOWS + return(result); +#endif + if(result != 0) + { + static int end_timer = 0; + if(end_timer == 0) + end_timer = 4; + if(end_timer > 0) + { + end_timer--; + if(end_timer == 0) + return(1); + } + } + return(0); +#else + return(result); +#endif + +} // end of WaveCallBack + + +#if USE_PORTAUDIO == 19 +/* This is a fixed version of Pa_OpenDefaultStream() for use if the version in portaudio V19 + is broken */ + +static PaError Pa_OpenDefaultStream2( PaStream** stream, + int inputChannelCount, + int outputChannelCount, + PaSampleFormat sampleFormat, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamCallback *streamCallback, + void *userData ) +{ + PaError result; + PaStreamParameters hostApiOutputParameters; + + if(option_device_number >= 0) + hostApiOutputParameters.device = option_device_number; + else + hostApiOutputParameters.device = Pa_GetDefaultOutputDevice(); + + if( hostApiOutputParameters.device == paNoDevice ) + return paDeviceUnavailable; + + hostApiOutputParameters.channelCount = outputChannelCount; + hostApiOutputParameters.sampleFormat = sampleFormat; + /* defaultHighOutputLatency is used below instead of + defaultLowOutputLatency because it is more important for the default + stream to work reliably than it is for it to work with the lowest + latency. + */ + hostApiOutputParameters.suggestedLatency = + Pa_GetDeviceInfo( hostApiOutputParameters.device )->defaultHighOutputLatency; + hostApiOutputParameters.hostApiSpecificStreamInfo = NULL; + + result = Pa_OpenStream( + stream, NULL, &hostApiOutputParameters, sampleRate, framesPerBuffer, paNoFlag, streamCallback, userData ); + + return(result); +} +#endif + + +int WavegenOpenSound() +{//=================== + PaError err, err2; + PaError active; + + if(option_waveout || option_quiet) + { + // writing to WAV file, not to portaudio + return(0); + } + +#if USE_PORTAUDIO == 18 + active = Pa_StreamActive(pa_stream); +#else + active = Pa_IsStreamActive(pa_stream); +#endif + + if(active == 1) + return(0); + if(active < 0) + { + out_channels = 1; + +#if USE_PORTAUDIO == 18 + err2 = Pa_OpenDefaultStream(&pa_stream,0,1,paInt16,samplerate,512,N_WAV_BUF,WaveCallback,(void *)userdata); + + if(err2 == paInvalidChannelCount) + { + // failed to open with mono, try stereo + out_channels=2; + err2 = Pa_OpenDefaultStream(&pa_stream,0,2,paInt16,samplerate,512,N_WAV_BUF,WaveCallback,(void *)userdata); + } +#else + err2 = Pa_OpenDefaultStream2(&pa_stream,0,1,paInt16,(double)samplerate,512,WaveCallback,(void *)userdata); + + if(err2 == paInvalidChannelCount) + { + // failed to open with mono, try stereo + out_channels=2; + err2 = Pa_OpenDefaultStream(&pa_stream,0,2,paInt16,(double)samplerate,512,WaveCallback,(void *)userdata); + } +#endif + } + err = Pa_StartStream(pa_stream); + +#if USE_PORTAUDIO == 19 + if(err == paStreamIsNotStopped) + { + // not sure why we need this, but PA v19 seems to need it + err = Pa_StopStream(pa_stream); + err = Pa_StartStream(pa_stream); + } +#endif + + if(err != paNoError) + { + // exit speak if we can't open the sound device - this is OK if speak is being run for each utterance + exit(2); + } + + return(0); +} + + + +int WavegenCloseSound() +{//==================== + PaError active; + + // check whether speaking has finished, and close the stream + if(pa_stream != NULL) + { +#if USE_PORTAUDIO == 18 + active = Pa_StreamActive(pa_stream); +#else + active = Pa_IsStreamActive(pa_stream); +#endif + if(WcmdqUsed() == 0) // also check that the queue is empty + { + if(active == 0) + { + Pa_CloseStream(pa_stream); + pa_stream = NULL; + return(1); + } + } + else + { + WavegenOpenSound(); // still items in the queue, shouldn't be closed + } + } + return(0); +} + + +int WavegenInitSound() +{//=================== + PaError err; + + if(option_quiet) + return(0); + + // PortAudio sound output library + err = Pa_Initialize(); + pa_init_err = err; + if(err != paNoError) + { + fprintf(stderr,"Failed to initialise the PortAudio sound\n"); + return(1); + } + return(0); +} +#else +int WavegenOpenSound() +{//=================== + return(0); +} +int WavegenCloseSound() +{//==================== + return(0); +} +int WavegenInitSound() +{//=================== + return(0); +} +#endif + + +void WavegenInit(int rate, int wavemult_fact) +{//========================================== + int ix; + double x; + + if(wavemult_fact == 0) + wavemult_fact=60; // default + + wvoice = NULL; + samplerate = samplerate_native = rate; + PHASE_INC_FACTOR = 0x8000000 / samplerate; // assumes pitch is Hz*32 + Flutter_inc = (64 * samplerate)/rate; + samplecount = 0; + nsamples = 0; + wavephase = 0x7fffffff; + max_hval = 0; + + wdata.amplitude = 32; + wdata.prev_was_synth = 0; + + for(ix=0; ix N_WAVEMULT) wavemult_max = N_WAVEMULT; + + wavemult_offset = wavemult_max/2; + + if(samplerate != 22050) + { + // wavemult table has preset values for 22050 Hz, we only need to + // recalculate them if we have a different sample rate + for(ix=0; ixvoicing; + delay = wvoice->echo_delay; + amp = wvoice->echo_amp; + + if(delay >= N_ECHO_BUF) + delay = N_ECHO_BUF-1; + if(amp > 100) + amp = 100; + + memset(echo_buf,0,sizeof(echo_buf)); + echo_tail = 0; + + if(embedded_value[EMBED_H] > 0) + { + // set echo from an embedded command in the text + amp = embedded_value[EMBED_H]; + delay = 130; + } + if(embedded_value[EMBED_T] > 0) + { + // announcing punctuation + amp = embedded_value[EMBED_T] * 8; + delay = 60; + } + + if(delay == 0) + amp = 0; + + echo_head = (delay * samplerate)/1000; + echo_length = echo_head; // ensure completion of echo at the end of speech. Use 1 delay period? + if(amp == 0) + echo_length = 0; + if(amp > 20) + echo_length = echo_head * 2; // perhaps allow 2 echo periods if the echo is loud. + + // echo_amp units are 1/256ths of the amplitude of the original sound. + echo_amp = amp; + // compensate (partially) for increase in amplitude due to echo + general_amplitude = GetAmplitude(); + general_amplitude = ((general_amplitude * (500-amp))/500); +} // end of WavegenSetEcho + + + +int PeaksToHarmspect(wavegen_peaks_t *peaks, int pitch, int *htab, int control) +{//============================================================================ +// Calculate the amplitude of each harmonics from the formants +// Only for formants 0 to 5 + +// control 0=initial call, 1=every 64 cycles + + // pitch and freqs are Hz<<16 + + int f; + wavegen_peaks_t *p; + int fp; // centre freq of peak + int fhi; // high freq of peak + int h; // harmonic number + int pk; + int hmax; + int hmax_samplerate; // highest harmonic allowed for the samplerate + int x; + int ix; + int h1; + +#ifdef SPECT_EDITOR + if(harm_sqrt_n > 0) + return(HarmToHarmspect(pitch,htab)); +#endif + + // initialise as much of *out as we will need + if(wvoice == NULL) + return(1); + hmax = (peaks[wvoice->n_harmonic_peaks].freq + peaks[wvoice->n_harmonic_peaks].right)/pitch; + if(hmax >= MAX_HARMONIC) + hmax = MAX_HARMONIC-1; + + // restrict highest harmonic to half the samplerate + hmax_samplerate = (((samplerate * 19)/40) << 16)/pitch; // only 95% of Nyquist freq +// hmax_samplerate = (samplerate << 16)/(pitch*2); + + if(hmax > hmax_samplerate) + hmax = hmax_samplerate; + + for(h=0;h<=hmax;h++) + htab[h]=0; + + h=0; + for(pk=0; pk<=wvoice->n_harmonic_peaks; pk++) + { + p = &peaks[pk]; + if((p->height == 0) || (fp = p->freq)==0) + continue; + + fhi = p->freq + p->right; + h = ((p->freq - p->left) / pitch) + 1; + if(h <= 0) h = 1; + + for(f=pitch*h; f < fp; f+=pitch) + { + htab[h++] += pk_shape[(fp-f)/(p->left>>8)] * p->height; + } + for(; f < fhi; f+=pitch) + { + htab[h++] += pk_shape[(f-fp)/(p->right>>8)] * p->height; + } + } + +{ +int y; +int h2; + // increase bass + y = peaks[1].height * 10; // addition as a multiple of 1/256s + h2 = (1000<<16)/pitch; // decrease until 1000Hz + if(h2 > 0) + { + x = y/h2; + h = 1; + while(y > 0) + { + htab[h++] += y; + y -= x; + } + } +} + + // find the nearest harmonic for HF peaks where we don't use shape + for(; pk> 14; + peak_height[pk] = (x * x * 5)/2; + + // find the nearest harmonic for HF peaks where we don't use shape + if(control == 0) + { + // set this initially, but make changes only at the quiet point + peak_harmonic[pk] = peaks[pk].freq / pitch; + } + // only use harmonics up to half the samplerate + if(peak_harmonic[pk] >= hmax_samplerate) + peak_height[pk] = 0; + } + + // convert from the square-rooted values + f = 0; + for(h=0; h<=hmax; h++, f+=pitch) + { + x = htab[h] >> 15; + htab[h] = (x * x) >> 8; + + if((ix = (f >> 19)) < N_TONE_ADJUST) + { + htab[h] = (htab[h] * wvoice->tone_adjust[ix]) >> 13; // index tone_adjust with Hz/8 + } + } + + // adjust the amplitude of the first harmonic, affects tonal quality + h1 = htab[1] * option_harmonic1; + htab[1] = h1/8; + + + // calc intermediate increments of LF harmonics + if(control & 1) + { + for(h=1; h> 3; + } + } + + return(hmax); // highest harmonic number +} // end of PeaksToHarmspect + + + +static void AdvanceParameters() +{//============================ +// Called every 64 samples to increment the formant freq, height, and widths + + int x; + int ix; + static int Flutter_ix = 0; + + // advance the pitch + wdata.pitch_ix += wdata.pitch_inc; + if((ix = wdata.pitch_ix>>8) > 127) ix = 127; + x = wdata.pitch_env[ix] * wdata.pitch_range; + wdata.pitch = (x>>8) + wdata.pitch_base; + + amp_ix += amp_inc; + + /* add pitch flutter */ + if(Flutter_ix >= (N_FLUTTER*64)) + Flutter_ix = 0; + x = ((int)(Flutter_tab[Flutter_ix >> 6])-0x80) * flutter_amp; + Flutter_ix += Flutter_inc; + wdata.pitch += x; + if(wdata.pitch < 102400) + wdata.pitch = 102400; // min pitch, 25 Hz (25 << 12) + + if(samplecount == samplecount_start) + return; + + for(ix=0; ix <= wvoice->n_harmonic_peaks; ix++) + { + peaks[ix].freq1 += peaks[ix].freq_inc; + peaks[ix].freq = (int)(peaks[ix].freq1); + peaks[ix].height1 += peaks[ix].height_inc; + if((peaks[ix].height = (int)(peaks[ix].height1)) < 0) + peaks[ix].height = 0; + peaks[ix].left1 += peaks[ix].left_inc; + peaks[ix].left = (int)(peaks[ix].left1); + if(ix < 3) + { + peaks[ix].right1 += peaks[ix].right_inc; + peaks[ix].right = (int)(peaks[ix].right1); + } + else + { + peaks[ix].right = peaks[ix].left; + } + } + for(;ix < 8; ix++) + { + // formants 6,7,8 don't have a width parameter + if(ix < 7) + { + peaks[ix].freq1 += peaks[ix].freq_inc; + peaks[ix].freq = (int)(peaks[ix].freq1); + } + peaks[ix].height1 += peaks[ix].height_inc; + if((peaks[ix].height = (int)(peaks[ix].height1)) < 0) + peaks[ix].height = 0; + } + +#ifdef SPECT_EDITOR + if(harm_sqrt_n != 0) + { + // We are generating from a harmonic spectrum at a given pitch, not from formant peaks + for(ix=0; ixa * input + r->b * r->x1 + r->c * r->x2; + r->x2 = r->x1; + r->x1 = x; + + return x; +} + + + +static void setresonator(RESONATOR *rp, int freq, int bwidth, int init) +{//==================================================================== +// freq Frequency of resonator in Hz +// bwidth Bandwidth of resonator in Hz +// init Initialize internal data + + double x; + double arg; + + if(init) + { + rp->x1 = 0; + rp->x2 = 0; + } + + // x = exp(-pi * bwidth * t) + arg = minus_pi_t * bwidth; + x = exp(arg); + + // c = -(x*x) + rp->c = -(x * x); + + // b = x * 2*cos(2 pi * freq * t) + + arg = two_pi_t * freq; + rp->b = x * cos(arg) * 2.0; + + // a = 1.0 - b - c + rp->a = 1.0 - rp->b - rp->c; +} // end if setresonator +#endif + + +void InitBreath(void) +{//================== +#ifndef PLATFORM_RISCOS + int ix; + + minus_pi_t = -PI / samplerate; + two_pi_t = -2.0 * minus_pi_t; + + for(ix=0; ixbreath[0] == 0) + return; + + for(pk=1; pkbreath[pk] != 0) + { + // breath[0] indicates that some breath formants are needed + // set the freq from the current ynthesis formant and the width from the voice data + setresonator(&rbreath[pk], peaks[pk].freq >> 16, wvoice->breathw[pk],0); + } + } +#endif +} // end of SetBreath + + +static int ApplyBreath(void) +{//========================= + int value = 0; +#ifndef PLATFORM_RISCOS + int noise; + int ix; + int amp; + + // use two random numbers, for alternate formants + noise = (rand() & 0x3fff) - 0x2000; + + for(ix=1; ix < N_PEAKS; ix++) + { + if((amp = wvoice->breath[ix]) != 0) + { + amp *= (peaks[ix].height >> 14); + value += (int)(resonator(&rbreath[ix],noise) * amp); + } + } +#endif + return (value); +} + + + +int Wavegen() +{//========== + unsigned short waveph; + unsigned short theta; + int total; + int h; + int ix; + int z, z1, z2; + int echo; + int ov; + static int maxh, maxh2; + int pk; + signed char c; + int sample; + int amp; + int modn_amp, modn_period; + static int agc = 256; + static int h_switch_sign = 0; + static int cycle_count = 0; + static int amplitude2 = 0; // adjusted for pitch + + // continue until the output buffer is full, or + // the required number of samples have been produced + + for(;;) + { + if((end_wave==0) && (samplecount==nsamples)) + return(0); + + if((samplecount & 0x3f) == 0) + { + // every 64 samples, adjust the parameters + if(samplecount == 0) + { + hswitch = 0; + harmspect = hspect[0]; + maxh2 = PeaksToHarmspect(peaks, wdata.pitch<<4, hspect[0], 0); + + // adjust amplitude to compensate for fewer harmonics at higher pitch + amplitude2 = (wdata.amplitude * wdata.pitch)/(100 << 11); + + // switch sign of harmonics above about 900Hz, to reduce max peak amplitude + h_switch_sign = 890 / (wdata.pitch >> 12); + } + else + AdvanceParameters(); + + // pitch is Hz<<12 + phaseinc = (wdata.pitch>>7) * PHASE_INC_FACTOR; + cycle_samples = samplerate/(wdata.pitch >> 12); // sr/(pitch*2) + hf_factor = wdata.pitch >> 11; + + maxh = maxh2; + harmspect = hspect[hswitch]; + hswitch ^= 1; + maxh2 = PeaksToHarmspect(peaks, wdata.pitch<<4, hspect[hswitch], 1); + + SetBreath(); + } + else + if((samplecount & 0x07) == 0) + { + for(h=1; h 0) + { + wavephase += phaseinc; + if(wavephase < 0) + { + // sign has changed, reached a quiet point in the waveform + cbytes = wavemult_offset - (cycle_samples)/2; + if(samplecount > nsamples) + return(0); + + cycle_count++; + + for(pk=wvoice->n_harmonic_peaks+1; pk 0) + { + if(glottal_flag == 3) + { + if((nsamples-samplecount) < (cycle_samples*2)) + { + // Vowel before glottal-stop. + // This is the start of the penultimate cycle, reduce its amplitude + glottal_flag = 2; + amplitude2 = (amplitude2 * glottal_reduce)/256; + } + } + else + if(glottal_flag == 4) + { + // Vowel following a glottal-stop. + // This is the start of the second cycle, reduce its amplitude + glottal_flag = 2; + amplitude2 = (amplitude2 * glottal_reduce)/256; + } + else + { + glottal_flag--; + } + } + + if(amplitude_env != NULL) + { + // amplitude envelope is only used for creaky voice effect on certain vowels/tones + if((ix = amp_ix>>8) > 127) ix = 127; + amp = amplitude_env[ix]; + amplitude2 = (amplitude2 * amp)/128; +// if(amp < 255) +// modulation_type = 7; + } + + // introduce roughness into the sound by reducing the amplitude of + modn_period = 0; + if(voice->roughness < N_ROUGHNESS) + { + modn_period = modulation_tab[voice->roughness][modulation_type]; + modn_amp = modn_period & 0xf; + modn_period = modn_period >> 4; + } + + if(modn_period != 0) + { + if(modn_period==0xf) + { + // just once */ + amplitude2 = (amplitude2 * modn_amp)/16; + modulation_type = 0; + } + else + { + // reduce amplitude every [modn_period} cycles + if((cycle_count % modn_period)==0) + amplitude2 = (amplitude2 * modn_amp)/16; + } + } + } + } + else + { + wavephase += phaseinc; + } + waveph = (unsigned short)(wavephase >> 16); + total = 0; + + // apply HF peaks, formants 6,7,8 + // add a single harmonic and then spread this my multiplying by a + // window. This is to reduce the processing power needed to add the + // higher frequence harmonics. + cbytes++; + if(cbytes >=0 && cbytesn_harmonic_peaks+1; pk> 5] * peak_height[pk]; + } + + // spread the peaks by multiplying by a window + total = (long)(total / hf_factor) * wavemult[cbytes]; + } + + // apply main peaks, formants 0 to 5 +#ifdef USE_ASSEMBLER_1 + // use an optimised routine for this loop, if available + total += AddSineWaves(waveph, h_switch_sign, maxh, harmspect); // call an assembler code routine +#else + theta = waveph; + + for(h=1; h<=h_switch_sign; h++) + { + total += ((int)(sin_tab[theta >> 5]) * harmspect[h]); + theta += waveph; + } + while(h<=maxh) + { + total -= ((int)(sin_tab[theta >> 5]) * harmspect[h]); + theta += waveph; + h++; + } +#endif + + if(voicing != 64) + { + total = (total >> 6) * voicing; + } + +#ifndef PLATFORM_RISCOS + if(wvoice->breath[0]) + { + total += ApplyBreath(); + } +#endif + + // mix with sampled wave if required + z2 = 0; + if(wdata.mix_wavefile_ix < wdata.n_mix_wavefile) + { + if(wdata.mix_wave_scale == 0) + { + // a 16 bit sample + c = wdata.mix_wavefile[wdata.mix_wavefile_ix+1]; + sample = wdata.mix_wavefile[wdata.mix_wavefile_ix] + (c * 256); + wdata.mix_wavefile_ix += 2; + } + else + { + // a 8 bit sample, scaled + sample = (signed char)wdata.mix_wavefile[wdata.mix_wavefile_ix++] * wdata.mix_wave_scale; + } + z2 = (sample * wdata.amplitude_v) >> 10; + z2 = (z2 * wdata.mix_wave_amp)/32; + } + + z1 = z2 + (((total>>8) * amplitude2) >> 13); + + echo = (echo_buf[echo_tail++] * echo_amp); + z1 += echo >> 8; + if(echo_tail >= N_ECHO_BUF) + echo_tail=0; + + z = (z1 * agc) >> 8; + + // check for overflow, 16bit signed samples + if(z >= 32768) + { + ov = 8388608/z1 - 1; // 8388608 is 2^23, i.e. max value * 256 + if(ov < agc) agc = ov; // set agc to number of 1/256ths to multiply the sample by + z = (z1 * agc) >> 8; // reduce sample by agc value to prevent overflow + } + else + if(z <= -32768) + { + ov = -8388608/z1 - 1; + if(ov < agc) agc = ov; + z = (z1 * agc) >> 8; + } + *out_ptr++ = z; + *out_ptr++ = z >> 8; + + echo_buf[echo_head++] = z; + if(echo_head >= N_ECHO_BUF) + echo_head = 0; + + if(out_ptr >= out_end) + return(1); + } + return(0); +} // end of Wavegen + + +static int PlaySilence(int length, int resume) +{//=========================================== + static int n_samples; + int value=0; + + if(length == 0) + return(0); + + nsamples = 0; + samplecount = 0; + + if(resume==0) + n_samples = length; + + while(n_samples-- > 0) + { + value = (echo_buf[echo_tail++] * echo_amp) >> 8; + + if(echo_tail >= N_ECHO_BUF) + echo_tail = 0; + + *out_ptr++ = value; + *out_ptr++ = value >> 8; + + echo_buf[echo_head++] = value; + if(echo_head >= N_ECHO_BUF) + echo_head = 0; + + if(out_ptr >= out_end) + return(1); + } + return(0); +} // end of PlaySilence + + + +static int PlayWave(int length, int resume, unsigned char *data, int scale, int amp) +{//================================================================================= + static int n_samples; + static int ix=0; + int value; + signed char c; + + if(resume==0) + { + n_samples = length; + ix = 0; + } + + nsamples = 0; + samplecount = 0; + + while(n_samples-- > 0) + { + if(scale == 0) + { + // 16 bits data + c = data[ix+1]; + value = data[ix] + (c * 256); + ix+=2; + } + else + { + // 8 bit data, shift by the specified scale factor + value = (signed char)data[ix++] * scale; + } + value *= (consonant_amp * general_amplitude); // reduce strength of consonant + value = value >> 10; + value = (value * amp)/32; + + value += ((echo_buf[echo_tail++] * echo_amp) >> 8); + + if(value > 32767) + value = 32768; + else + if(value < -32768) + value = -32768; + + if(echo_tail >= N_ECHO_BUF) + echo_tail = 0; + + out_ptr[0] = value; + out_ptr[1] = value >> 8; + out_ptr+=2; + + echo_buf[echo_head++] = (value*3)/4; + if(echo_head >= N_ECHO_BUF) + echo_head = 0; + + if(out_ptr >= out_end) + return(1); + } + return(0); +} + + +static int SetWithRange0(int value, int max) +{//========================================= + if(value < 0) + return(0); + if(value > max) + return(max); + return(value); +} + + +void SetEmbedded(int control, int value) +{//===================================== + // there was an embedded command in the text at this point + int sign=0; + int command; + int ix; + int factor; + int pitch_value; + + command = control & 0x1f; + if((control & 0x60) == 0x60) + sign = -1; + else + if((control & 0x60) == 0x40) + sign = 1; + + if(command < N_EMBEDDED_VALUES) + { + if(sign == 0) + embedded_value[command] = value; + else + embedded_value[command] += (value * sign); + embedded_value[command] = SetWithRange0(embedded_value[command],embedded_max[command]); + } + + switch(command) + { + case EMBED_T: + WavegenSetEcho(); // and drop through to case P + case EMBED_P: + // adjust formants to give better results for a different voice pitch + if((pitch_value = embedded_value[EMBED_P]) > MAX_PITCH_VALUE) + pitch_value = MAX_PITCH_VALUE; + + factor = 256 + (25 * (pitch_value - 50))/50; + for(ix=0; ix<=5; ix++) + { + wvoice->freq[ix] = (wvoice->freq2[ix] * factor)/256; + } + factor = embedded_value[EMBED_T]*3; + wvoice->height[0] = (wvoice->height2[0] * (256 - factor*2))/256; + wvoice->height[1] = (wvoice->height2[1] * (256 - factor))/256; + break; + + case EMBED_A: // amplitude + general_amplitude = GetAmplitude(); + break; + + case EMBED_F: // emphasiis + general_amplitude = GetAmplitude(); + break; + + case EMBED_H: + WavegenSetEcho(); + break; + } +} + + +void WavegenSetVoice(voice_t *v) +{//============================= + static voice_t v2; + + memcpy(&v2,v,sizeof(v2)); + wvoice = &v2; + + if(v->peak_shape==0) + pk_shape = pk_shape1; + else + pk_shape = pk_shape2; + + consonant_amp = (v->consonant_amp * 26) /100; + if(samplerate <= 11000) + { + consonant_amp = consonant_amp*2; // emphasize consonants at low sample rates + option_harmonic1 = 6; + } + WavegenSetEcho(); +} + + +static void SetAmplitude(int length, unsigned char *amp_env, int value) +{//==================================================================== + amp_ix = 0; + if(length==0) + amp_inc = 0; + else + amp_inc = (256 * ENV_LEN * STEPSIZE)/length; + + wdata.amplitude = (value * general_amplitude)/16; + wdata.amplitude_v = (wdata.amplitude * wvoice->consonant_ampv * 15)/100; // for wave mixed with voiced sounds + + amplitude_env = amp_env; +} + + +void SetPitch2(voice_t *voice, int pitch1, int pitch2, int *pitch_base, int *pitch_range) +{//====================================================================================== + int x; + int base; + int range; + int pitch_value; + + if(pitch1 > pitch2) + { + x = pitch1; // swap values + pitch1 = pitch2; + pitch2 = x; + } + + if((pitch_value = embedded_value[EMBED_P]) > MAX_PITCH_VALUE) + pitch_value = MAX_PITCH_VALUE; + pitch_value -= embedded_value[EMBED_T]; // adjust tone for announcing punctuation + if(pitch_value < 0) + pitch_value = 0; + + base = (voice->pitch_base * pitch_adjust_tab[pitch_value])/128; + range = (voice->pitch_range * embedded_value[EMBED_R])/50; + + // compensate for change in pitch when the range is narrowed or widened + base -= (range - voice->pitch_range)*18; + + *pitch_base = base + (pitch1 * range); + *pitch_range = base + (pitch2 * range) - *pitch_base; +} + + +void SetPitch(int length, unsigned char *env, int pitch1, int pitch2) +{//================================================================== +// length in samples + +#ifdef LOG_FRAMES +if(option_log_frames) +{ + f_log=fopen("log-espeakedit","a"); + if(f_log != NULL) + { + fprintf(f_log," pitch %3d %3d %3dmS\n",pitch1,pitch2,(length*1000)/samplerate); + fclose(f_log); + f_log=NULL; + } +} +#endif + if((wdata.pitch_env = env)==NULL) + wdata.pitch_env = env_fall; // default + + wdata.pitch_ix = 0; + if(length==0) + wdata.pitch_inc = 0; + else + wdata.pitch_inc = (256 * ENV_LEN * STEPSIZE)/length; + + SetPitch2(wvoice, pitch1, pitch2, &wdata.pitch_base, &wdata.pitch_range); + // set initial pitch + wdata.pitch = ((wdata.pitch_env[0] * wdata.pitch_range) >>8) + wdata.pitch_base; // Hz << 12 + + flutter_amp = wvoice->flutter; + +} // end of SetPitch + + + + + +void SetSynth(int length, int modn, frame_t *fr1, frame_t *fr2, voice_t *v) +{//======================================================================== + int ix; + DOUBLEX next; + int length2; + int length4; + int qix; + int cmd; + static int glottal_reduce_tab1[4] = {0x30, 0x30, 0x40, 0x50}; // vowel before [?], amp * 1/256 +// static int glottal_reduce_tab1[4] = {0x30, 0x40, 0x50, 0x60}; // vowel before [?], amp * 1/256 + static int glottal_reduce_tab2[4] = {0x90, 0xa0, 0xb0, 0xc0}; // vowel after [?], amp * 1/256 + +#ifdef LOG_FRAMES +if(option_log_frames) +{ + f_log=fopen("log-espeakedit","a"); + if(f_log != NULL) + { + fprintf(f_log,"%3dmS %3d %3d %4d %4d (%3d %3d %3d %3d) to %3d %3d %4d %4d (%3d %3d %3d %3d)\n",length*1000/samplerate, + fr1->ffreq[0],fr1->ffreq[1],fr1->ffreq[2],fr1->ffreq[3], fr1->fheight[0],fr1->fheight[1],fr1->fheight[2],fr1->fheight[3], + fr2->ffreq[0],fr2->ffreq[1],fr2->ffreq[2],fr2->ffreq[3], fr2->fheight[0],fr2->fheight[1],fr2->fheight[2],fr2->fheight[3] ); + + fclose(f_log); + f_log=NULL; + } +} +#endif + + harm_sqrt_n = 0; + end_wave = 1; + + // any additional information in the param1 ? + modulation_type = modn & 0xff; + + glottal_flag = 0; + if(modn & 0x400) + { + glottal_flag = 3; // before a glottal stop + glottal_reduce = glottal_reduce_tab1[(modn >> 8) & 3]; + } + if(modn & 0x800) + { + glottal_flag = 4; // after a glottal stop + glottal_reduce = glottal_reduce_tab2[(modn >> 8) & 3]; + } + + for(qix=wcmdq_head+1;;qix++) + { + if(qix >= N_WCMDQ) qix = 0; + if(qix == wcmdq_tail) break; + + cmd = wcmdq[qix][0]; + if(cmd==WCMD_SPECT) + { + end_wave = 0; // next wave generation is from another spectrum + break; + } + if((cmd==WCMD_WAVE) || (cmd==WCMD_PAUSE)) + break; // next is not from spectrum, so continue until end of wave cycle + } + + // round the length to a multiple of the stepsize + length2 = (length + STEPSIZE/2) & ~0x3f; + if(length2 == 0) + length2 = STEPSIZE; + + // add this length to any left over from the previous synth + samplecount_start = samplecount; + nsamples += length2; + + length4 = length2/4; + + peaks[7].freq = (7800 * v->freq[7] + v->freqadd[7]*256) << 8; + peaks[8].freq = (9000 * v->freq[8] + v->freqadd[8]*256) << 8; + + for(ix=0; ix < 8; ix++) + { + if(ix < 7) + { + peaks[ix].freq1 = (fr1->ffreq[ix] * v->freq[ix] + v->freqadd[ix]*256) << 8; + peaks[ix].freq = (int)(peaks[ix].freq1); + next = (fr2->ffreq[ix] * v->freq[ix] + v->freqadd[ix]*256) << 8; + peaks[ix].freq_inc = ((next - peaks[ix].freq1) * (STEPSIZE/4)) / length4; // lower headroom for fixed point math + } + + peaks[ix].height1 = (fr1->fheight[ix] * v->height[ix]) << 6; + peaks[ix].height = (int)(peaks[ix].height1); + next = (fr2->fheight[ix] * v->height[ix]) << 6; + peaks[ix].height_inc = ((next - peaks[ix].height1) * STEPSIZE) / length2; + + if(ix <= wvoice->n_harmonic_peaks) + { + peaks[ix].left1 = (fr1->fwidth[ix] * v->width[ix]) << 10; + peaks[ix].left = int(peaks[ix].left1); + next = (fr2->fwidth[ix] * v->width[ix]) << 10; + peaks[ix].left_inc = ((next - peaks[ix].left1) * STEPSIZE) / length2; + + if(ix < 3) + { + peaks[ix].right1 = (fr1->fright[ix] * v->width[ix]) << 10; + peaks[ix].right = int(peaks[ix].right1); + next = (fr2->fright[ix] * v->width[ix]) << 10; + peaks[ix].right_inc = ((next - peaks[ix].right1) * STEPSIZE) / length2; + } + else + { + peaks[ix].right = peaks[ix].left; + } + } + } +} // end of SetSynth + + +static int Wavegen2(int length, int modulation, int resume, frame_t *fr1, frame_t *fr2) +{//==================================================================================== + if(resume==0) + SetSynth(length, modulation, fr1, fr2, wvoice); + + return(Wavegen()); +} + +void Write4Bytes(FILE *f, int value) +{//================================= +// Write 4 bytes to a file, least significant first + int ix; + + for(ix=0; ix<4; ix++) + { + fputc(value & 0xff,f); + value = value >> 8; + } +} + + + + +int WavegenFill(int fill_zeros) +{//============================ +// Pick up next wavegen commands from the queue +// return: 0 output buffer has been filled +// return: 1 input command queue is now empty + + long *q; + int length; + int result; + static int resume=0; + static int echo_complete=0; + +#ifdef TEST_MBROLA + if(mbrola_name[0] != 0) + return(MbrolaFill(fill_zeros)); +#endif + + while(out_ptr < out_end) + { + if(WcmdqUsed() <= 0) + { + if(echo_complete > 0) + { + // continue to play silence until echo is completed + resume = PlaySilence(echo_complete,resume); + if(resume == 1) + return(0); // not yet finished + } + + if(fill_zeros) + { + while(out_ptr < out_end) + *out_ptr++ = 0; + } + return(1); // queue empty, close sound channel + } + + result = 0; + q = wcmdq[wcmdq_head]; + length = q[1]; + + switch(q[0]) + { + case WCMD_PITCH: + SetPitch(length,(unsigned char *)q[2],q[3] >> 16,q[3] & 0xffff); + break; + + case WCMD_PAUSE: + if(resume==0) + { + echo_complete -= length; + } + wdata.n_mix_wavefile = 0; + wdata.prev_was_synth = 0; + result = PlaySilence(length,resume); + break; + + case WCMD_WAVE: + echo_complete = echo_length; + wdata.n_mix_wavefile = 0; + wdata.prev_was_synth = 0; + result = PlayWave(length,resume,(unsigned char*)q[2], q[3] & 0xff, q[3] >> 8); + break; + + case WCMD_WAVE2: + // wave file to be played at the same time as synthesis + wdata.mix_wave_amp = q[3] >> 8; + wdata.mix_wave_scale = q[3] & 0xff; + if(wdata.mix_wave_scale == 0) + wdata.n_mix_wavefile = length*2; + else + wdata.n_mix_wavefile = length; + wdata.mix_wavefile_ix = 0; + wdata.mix_wavefile = (unsigned char *)q[2]; + break; + + case WCMD_SPECT2: // as WCMD_SPECT but stop any concurrent wave file + wdata.n_mix_wavefile = 0; // ... and drop through to WCMD_SPECT case + case WCMD_SPECT: + echo_complete = echo_length; + result = Wavegen2(length & 0xffff,q[1] >> 16,resume,(frame_t *)q[2],(frame_t *)q[3]); + break; + +#ifdef INCLUDE_KLATT + case WCMD_KLATT2: // as WCMD_SPECT but stop any concurrent wave file + wdata.n_mix_wavefile = 0; // ... and drop through to WCMD_SPECT case + case WCMD_KLATT: + echo_complete = echo_length; + result = Wavegen_Klatt2(length & 0xffff,q[1] >> 16,resume,(frame_t *)q[2],(frame_t *)q[3]); + break; +#endif + + case WCMD_MARKER: + MarkerEvent(q[1],q[2],q[3],out_ptr); +#ifdef LOG_FRAMES + LogMarker(q[1],q[3]); +#endif + if(q[1] == 1) + { + current_source_index = q[2] & 0xffffff; + } + break; + + case WCMD_AMPLITUDE: + SetAmplitude(length,(unsigned char *)q[2],q[3]); + break; + + case WCMD_VOICE: + WavegenSetVoice((voice_t *)q[1]); + free((voice_t *)q[1]); + break; + + case WCMD_EMBEDDED: + SetEmbedded(q[1],q[2]); + break; + } + + if(result==0) + { + WcmdqIncHead(); + resume=0; + } + else + { + resume=1; + } + } + + return(0); +} // end of WavegenFill + + diff --git a/navit/support/ezxml/Makefile.am b/navit/support/ezxml/Makefile.am new file mode 100644 index 0000000..1b091a3 --- /dev/null +++ b/navit/support/ezxml/Makefile.am @@ -0,0 +1,4 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=support_ezxml -DEZXML_NOMMAP +noinst_LTLIBRARIES = libsupport_ezxml.la +libsupport_ezxml_la_SOURCES = ezxml.c ezxml_init.c ezxml.h diff --git a/navit/support/ezxml/Makefile.in b/navit/support/ezxml/Makefile.in new file mode 100644 index 0000000..6b0e703 --- /dev/null +++ b/navit/support/ezxml/Makefile.in @@ -0,0 +1,639 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/support/ezxml +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libsupport_ezxml_la_LIBADD = +am_libsupport_ezxml_la_OBJECTS = ezxml.lo ezxml_init.lo +libsupport_ezxml_la_OBJECTS = $(am_libsupport_ezxml_la_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libsupport_ezxml_la_SOURCES) +DIST_SOURCES = $(libsupport_ezxml_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=support_ezxml -DEZXML_NOMMAP +noinst_LTLIBRARIES = libsupport_ezxml.la +libsupport_ezxml_la_SOURCES = ezxml.c ezxml_init.c ezxml.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/support/ezxml/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/support/ezxml/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libsupport_ezxml.la: $(libsupport_ezxml_la_OBJECTS) $(libsupport_ezxml_la_DEPENDENCIES) + $(LINK) $(libsupport_ezxml_la_OBJECTS) $(libsupport_ezxml_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ezxml.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ezxml_init.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/support/ezxml/ezxml.c b/navit/support/ezxml/ezxml.c new file mode 100644 index 0000000..4ade3a5 --- /dev/null +++ b/navit/support/ezxml/ezxml.c @@ -0,0 +1,1022 @@ +/* ezxml.c + * + * Copyright 2004-2006 Aaron Voisine + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include +#include "config.h" +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#ifndef EZXML_NOMMAP +#include +#endif // EZXML_NOMMAP +#include +#include "ezxml.h" +#ifdef HAVE_API_WIN32_CE +#include "libc.h" +#endif + +#define EZXML_WS "\t\r\n " // whitespace +#define EZXML_ERRL 128 // maximum error string length + +typedef struct ezxml_root *ezxml_root_t; +struct ezxml_root { // additional data for the root tag + struct ezxml xml; // is a super-struct built on top of ezxml struct + ezxml_t cur; // current xml tree insertion point + char *m; // original xml string + size_t len; // length of allocated memory for mmap, -1 for malloc + char *u; // UTF-8 conversion of string if original was UTF-16 + char *s; // start of work area + char *e; // end of work area + char **ent; // general entities (ampersand sequences) + char ***attr; // default attributes + char ***pi; // processing instructions + short standalone; // non-zero if + char err[EZXML_ERRL]; // error string +}; + +char *EZXML_NIL[] = { NULL }; // empty, null terminated array of strings + +// returns the first child tag with the given name or NULL if not found +ezxml_t ezxml_child(ezxml_t xml, const char *name) +{ + xml = (xml) ? xml->child : NULL; + while (xml && strcmp(name, xml->name)) xml = xml->sibling; + return xml; +} + +// returns the Nth tag with the same name in the same subsection or NULL if not +// found +ezxml_t ezxml_idx(ezxml_t xml, int idx) +{ + for (; xml && idx; idx--) xml = xml->next; + return xml; +} + +// returns the value of the requested tag attribute or NULL if not found +const char *ezxml_attr(ezxml_t xml, const char *attr) +{ + int i = 0, j = 1; + ezxml_root_t root = (ezxml_root_t)xml; + + if (! xml || ! xml->attr) return NULL; + while (xml->attr[i] && strcmp(attr, xml->attr[i])) i += 2; + if (xml->attr[i]) return xml->attr[i + 1]; // found attribute + + while (root->xml.parent) root = (ezxml_root_t)root->xml.parent; // root tag + for (i = 0; root->attr[i] && strcmp(xml->name, root->attr[i][0]); i++); + if (! root->attr[i]) return NULL; // no matching default attributes + while (root->attr[i][j] && strcmp(attr, root->attr[i][j])) j += 3; + return (root->attr[i][j]) ? root->attr[i][j + 1] : NULL; // found default +} + +// same as ezxml_get but takes an already initialized va_list +ezxml_t ezxml_vget(ezxml_t xml, va_list ap) +{ + char *name = va_arg(ap, char *); + int idx = -1; + + if (name && *name) { + idx = va_arg(ap, int); + xml = ezxml_child(xml, name); + } + return (idx < 0) ? xml : ezxml_vget(ezxml_idx(xml, idx), ap); +} + +// Traverses the xml tree to retrieve a specific subtag. Takes a variable +// length list of tag names and indexes. The argument list must be terminated +// by either an index of -1 or an empty string tag name. Example: +// title = ezxml_get(library, "shelf", 0, "book", 2, "title", -1); +// This retrieves the title of the 3rd book on the 1st shelf of library. +// Returns NULL if not found. +ezxml_t ezxml_get(ezxml_t xml, ...) +{ + va_list ap; + ezxml_t r; + + va_start(ap, xml); + r = ezxml_vget(xml, ap); + va_end(ap); + return r; +} + +// returns a null terminated array of processing instructions for the given +// target +const char **ezxml_pi(ezxml_t xml, const char *target) +{ + ezxml_root_t root = (ezxml_root_t)xml; + int i = 0; + + if (! root) return (const char **)EZXML_NIL; + while (root->xml.parent) root = (ezxml_root_t)root->xml.parent; // root tag + while (root->pi[i] && strcmp(target, root->pi[i][0])) i++; // find target + return (const char **)((root->pi[i]) ? root->pi[i] + 1 : EZXML_NIL); +} + +// set an error string and return root +ezxml_t ezxml_err(ezxml_root_t root, char *s, const char *err, ...) +{ + va_list ap; + int line = 1; + char *t, fmt[EZXML_ERRL]; + + for (t = root->s; t < s; t++) if (*t == '\n') line++; + g_snprintf(fmt, EZXML_ERRL, "[error near line %d]: %s", line, err); + + va_start(ap, err); + g_vsnprintf(root->err, EZXML_ERRL, fmt, ap); + va_end(ap); + + return &root->xml; +} + +// Recursively decodes entity and character references and normalizes new lines +// ent is a null terminated array of alternating entity names and values. set t +// to '&' for general entity decoding, '%' for parameter entity decoding, 'c' +// for cdata sections, ' ' for attribute normalization, or '*' for non-cdata +// attribute normalization. Returns s, or if the decoded string is longer than +// s, returns a malloced string that must be freed. +char *ezxml_decode(char *s, char **ent, char t) +{ + char *e, *r = s, *m = s; + long b, c, d, l; + + for (; *s; s++) { // normalize line endings + while (*s == '\r') { + *(s++) = '\n'; + if (*s == '\n') memmove(s, (s + 1), strlen(s)); + } + } + + for (s = r; ; ) { + while (*s && *s != '&' && (*s != '%' || t != '%') && !isspace(*s)) s++; + + if (! *s) break; + else if (t != 'c' && ! strncmp(s, "&#", 2)) { // character reference + if (s[2] == 'x') c = strtol(s + 3, &e, 16); // base 16 + else c = strtol(s + 2, &e, 10); // base 10 + if (! c || *e != ';') { s++; continue; } // not a character ref + + if (c < 0x80) *(s++) = c; // US-ASCII subset + else { // multi-byte UTF-8 sequence + for (b = 0, d = c; d; d /= 2) b++; // number of bits in c + b = (b - 2) / 5; // number of bytes in payload + *(s++) = (0xFF << (7 - b)) | (c >> (6 * b)); // head + while (b) *(s++) = 0x80 | ((c >> (6 * --b)) & 0x3F); // payload + } + + memmove(s, strchr(s, ';') + 1, strlen(strchr(s, ';'))); + } + else if ((*s == '&' && (t == '&' || t == ' ' || t == '*')) || + (*s == '%' && t == '%')) { // entity reference + for (b = 0; ent[b] && strncmp(s + 1, ent[b], strlen(ent[b])); + b += 2); // find entity in entity list + + if (ent[b++]) { // found a match + if ((c = strlen(ent[b])) - 1 > (e = strchr(s, ';')) - s) { + l = (d = (s - r)) + c + strlen(e); // new length + r = (r == m) ? strcpy(malloc(l), r) : realloc(r, l); + e = strchr((s = r + d), ';'); // fix up pointers + } + + memmove(s + c, e + 1, strlen(e)); // shift rest of string + strncpy(s, ent[b], c); // copy in replacement text + } + else s++; // not a known entity + } + else if ((t == ' ' || t == '*') && isspace(*s)) *(s++) = ' '; + else s++; // no decoding needed + } + + if (t == '*') { // normalize spaces for non-cdata attributes + for (s = r; *s; s++) { + if ((l = strspn(s, " "))) memmove(s, s + l, strlen(s + l) + 1); + while (*s && *s != ' ') s++; + } + if (--s >= r && *s == ' ') *s = '\0'; // trim any trailing space + } + return r; +} + +// called when parser finds start of new tag +void ezxml_open_tag(ezxml_root_t root, char *name, char **attr) +{ + ezxml_t xml = root->cur; + + if (xml->name) xml = ezxml_add_child(xml, name, strlen(xml->txt)); + else xml->name = name; // first open tag + + xml->attr = attr; + root->cur = xml; // update tag insertion point +} + +// called when parser finds character content between open and closing tag +void ezxml_char_content(ezxml_root_t root, char *s, size_t len, char t) +{ + ezxml_t xml = root->cur; + char *m = s; + size_t l; + + if (! xml || ! xml->name || ! len) return; // sanity check + + s[len] = '\0'; // null terminate text (calling functions anticipate this) + len = strlen(s = ezxml_decode(s, root->ent, t)) + 1; + + if (! *(xml->txt)) xml->txt = s; // initial character content + else { // allocate our own memory and make a copy + xml->txt = (xml->flags & EZXML_TXTM) // allocate some space + ? realloc(xml->txt, (l = strlen(xml->txt)) + len) + : strcpy(malloc((l = strlen(xml->txt)) + len), xml->txt); + strcpy(xml->txt + l, s); // add new char content + if (s != m) free(s); // free s if it was malloced by ezxml_decode() + } + + if (xml->txt != m) ezxml_set_flag(xml, EZXML_TXTM); +} + +// called when parser finds closing tag +ezxml_t ezxml_close_tag(ezxml_root_t root, char *name, char *s) +{ + if (! root->cur || ! root->cur->name || strcmp(name, root->cur->name)) + return ezxml_err(root, s, "unexpected closing tag ", name); + + root->cur = root->cur->parent; + return NULL; +} + +// checks for circular entity references, returns non-zero if no circular +// references are found, zero otherwise +int ezxml_ent_ok(char *name, char *s, char **ent) +{ + int i; + + for (; ; s++) { + while (*s && *s != '&') s++; // find next entity reference + if (! *s) return 1; + if (! strncmp(s + 1, name, strlen(name))) return 0; // circular ref. + for (i = 0; ent[i] && strncmp(ent[i], s + 1, strlen(ent[i])); i += 2); + if (ent[i] && ! ezxml_ent_ok(name, ent[i + 1], ent)) return 0; + } +} + +// called when the parser finds a processing instruction +void ezxml_proc_inst(ezxml_root_t root, char *s, size_t len) +{ + int i = 0, j = 1; + char *target = s; + + s[len] = '\0'; // null terminate instruction + if (*(s += strcspn(s, EZXML_WS))) { + *s = '\0'; // null terminate target + s += strspn(s + 1, EZXML_WS) + 1; // skip whitespace after target + } + + if (! strcmp(target, "xml")) { // + if ((s = strstr(s, "standalone")) && ! strncmp(s + strspn(s + 10, + EZXML_WS "='\"") + 10, "yes", 3)) root->standalone = 1; + return; + } + + if (! root->pi[0]) *(root->pi = malloc(sizeof(char **))) = NULL; //first pi + + while (root->pi[i] && strcmp(target, root->pi[i][0])) i++; // find target + if (! root->pi[i]) { // new target + root->pi = realloc(root->pi, sizeof(char **) * (i + 2)); + root->pi[i] = malloc(sizeof(char *) * 3); + root->pi[i][0] = target; + root->pi[i][1] = (char *)(root->pi[i + 1] = NULL); // terminate pi list + root->pi[i][2] = g_strdup(""); // empty document position list + } + + while (root->pi[i][j]) j++; // find end of instruction list for this target + root->pi[i] = realloc(root->pi[i], sizeof(char *) * (j + 3)); + root->pi[i][j + 2] = realloc(root->pi[i][j + 1], j + 1); + strcpy(root->pi[i][j + 2] + j - 1, (root->xml.name) ? ">" : "<"); + root->pi[i][j + 1] = NULL; // null terminate pi list for this target + root->pi[i][j] = s; // set instruction +} + +// called when the parser finds an internal doctype subset +short ezxml_internal_dtd(ezxml_root_t root, char *s, size_t len) +{ + char q, *c, *t, *n = NULL, *v, **ent, **pe; + int i, j; + + pe = memcpy(malloc(sizeof(EZXML_NIL)), EZXML_NIL, sizeof(EZXML_NIL)); + + for (s[len] = '\0'; s; ) { + while (*s && *s != '<' && *s != '%') s++; // find next declaration + + if (! *s) break; + else if (! strncmp(s, "'); + continue; + } + + for (i = 0, ent = (*c == '%') ? pe : root->ent; ent[i]; i++); + ent = realloc(ent, (i + 3) * sizeof(char *)); // space for next ent + if (*c == '%') pe = ent; + else root->ent = ent; + + *(++s) = '\0'; // null terminate name + if ((s = strchr(v, q))) *(s++) = '\0'; // null terminate value + ent[i + 1] = ezxml_decode(v, pe, '%'); // set value + ent[i + 2] = NULL; // null terminate entity list + if (! ezxml_ent_ok(n, ent[i + 1], ent)) { // circular reference + if (ent[i + 1] != v) free(ent[i + 1]); + ezxml_err(root, v, "circular entity declaration &%s", n); + break; + } + else ent[i] = n; // set entity name + } + else if (! strncmp(s, "")) == '>') continue; + else *s = '\0'; // null terminate tag name + for (i = 0; root->attr[i] && strcmp(n, root->attr[i][0]); i++); + + while (*(n = ++s + strspn(s, EZXML_WS)) && *n != '>') { + if (*(s = n + strcspn(n, EZXML_WS))) *s = '\0'; // attr name + else { ezxml_err(root, t, "malformed ") - 1; + if (*c == ' ') continue; // cdata is default, nothing to do + v = NULL; + } + else if ((*s == '"' || *s == '\'') && // default value + (s = strchr(v = s + 1, *s))) *s = '\0'; + else { ezxml_err(root, t, "malformed attr[i]) { // new tag name + root->attr = (! i) ? malloc(2 * sizeof(char **)) + : realloc(root->attr, + (i + 2) * sizeof(char **)); + root->attr[i] = malloc(2 * sizeof(char *)); + root->attr[i][0] = t; // set tag name + root->attr[i][1] = (char *)(root->attr[i + 1] = NULL); + } + + for (j = 1; root->attr[i][j]; j += 3); // find end of list + root->attr[i] = realloc(root->attr[i], + (j + 4) * sizeof(char *)); + + root->attr[i][j + 3] = NULL; // null terminate list + root->attr[i][j + 2] = c; // is it cdata? + root->attr[i][j + 1] = (v) ? ezxml_decode(v, root->ent, *c) + : NULL; + root->attr[i][j] = n; // attribute name + } + } + else if (! strncmp(s, ""); // comments + else if (! strncmp(s, ""))) + ezxml_proc_inst(root, c, s++ - c); + } + else if (*s == '<') s = strchr(s, '>'); // skip other declarations + else if (*(s++) == '%' && ! root->standalone) break; + } + + free(pe); + return ! *root->err; +} + +// Converts a UTF-16 string to UTF-8. Returns a new string that must be freed +// or NULL if no conversion was needed. +char *ezxml_str2utf8(char **s, size_t *len) +{ + char *u; + size_t l = 0, sl, max = *len; + long c, d; + int b, be = (**s == '\xFE') ? 1 : (**s == '\xFF') ? 0 : -1; + + if (be == -1) return NULL; // not UTF-16 + + u = malloc(max); + for (sl = 2; sl < *len - 1; sl += 2) { + c = (be) ? (((*s)[sl] & 0xFF) << 8) | ((*s)[sl + 1] & 0xFF) //UTF-16BE + : (((*s)[sl + 1] & 0xFF) << 8) | ((*s)[sl] & 0xFF); //UTF-16LE + if (c >= 0xD800 && c <= 0xDFFF && (sl += 2) < *len - 1) { // high-half + d = (be) ? (((*s)[sl] & 0xFF) << 8) | ((*s)[sl + 1] & 0xFF) + : (((*s)[sl + 1] & 0xFF) << 8) | ((*s)[sl] & 0xFF); + c = (((c & 0x3FF) << 10) | (d & 0x3FF)) + 0x10000; + } + + while (l + 6 > max) u = realloc(u, max += EZXML_BUFSIZE); + if (c < 0x80) u[l++] = c; // US-ASCII subset + else { // multi-byte UTF-8 sequence + for (b = 0, d = c; d; d /= 2) b++; // bits in c + b = (b - 2) / 5; // bytes in payload + u[l++] = (0xFF << (7 - b)) | (c >> (6 * b)); // head + while (b) u[l++] = 0x80 | ((c >> (6 * --b)) & 0x3F); // payload + } + } + return *s = realloc(u, *len = l); +} + +// frees a tag attribute list +void ezxml_free_attr(char **attr) { + int i = 0; + char *m; + + if (! attr || attr == EZXML_NIL) return; // nothing to free + while (attr[i]) i += 2; // find end of attribute list + m = attr[i + 1]; // list of which names and values are malloced + for (i = 0; m[i]; i++) { + if (m[i] & EZXML_NAMEM) free(attr[i * 2]); + if (m[i] & EZXML_TXTM) free(attr[(i * 2) + 1]); + } + free(m); + free(attr); +} + +// parse the given xml string and return an ezxml structure +ezxml_t ezxml_parse_str(char *s, size_t len) +{ + ezxml_root_t root = (ezxml_root_t)ezxml_new(NULL); + char q, e, *d, **attr, **a = NULL; // initialize a to avoid compile warning + int l, i, j; + + root->m = s; + if (! len) return ezxml_err(root, NULL, "root tag missing"); + root->u = ezxml_str2utf8(&s, &len); // convert utf-16 to utf-8 + root->e = (root->s = s) + len; // record start and end of work area + + e = s[len - 1]; // save end char + s[len - 1] = '\0'; // turn end char into null terminator + + while (*s && *s != '<') s++; // find first tag + if (! *s) return ezxml_err(root, s, "root tag missing"); + + for (; ; ) { + attr = (char **)EZXML_NIL; + d = ++s; + + if (isalpha(*s) || *s == '_' || *s == ':' || *s < '\0') { // new tag + if (! root->cur) + return ezxml_err(root, d, "markup outside of root element"); + + s += strcspn(s, EZXML_WS "/>"); + while (isspace(*s)) *(s++) = '\0'; // null terminate tag name + + if (*s && *s != '/' && *s != '>') // find tag in default attr list + for (i = 0; (a = root->attr[i]) && strcmp(a[0], d); i++); + + for (l = 0; *s && *s != '/' && *s != '>'; l += 2) { // new attrib + attr = (l) ? realloc(attr, (l + 4) * sizeof(char *)) + : malloc(4 * sizeof(char *)); // allocate space + attr[l + 3] = (l) ? realloc(attr[l + 1], (l / 2) + 2) + : malloc(2); // mem for list of maloced vals + strcpy(attr[l + 3] + (l / 2), " "); // value is not malloced + attr[l + 2] = NULL; // null terminate list + attr[l + 1] = ""; // temporary attribute value + attr[l] = s; // set attribute name + + s += strcspn(s, EZXML_WS "=/>"); + if (*s == '=' || isspace(*s)) { + *(s++) = '\0'; // null terminate tag attribute name + q = *(s += strspn(s, EZXML_WS "=")); + if (q == '"' || q == '\'') { // attribute value + attr[l + 1] = ++s; + while (*s && *s != q) s++; + if (*s) *(s++) = '\0'; // null terminate attribute val + else { + ezxml_free_attr(attr); + return ezxml_err(root, d, "missing %c", q); + } + + for (j = 1; a && a[j] && strcmp(a[j], attr[l]); j +=3); + attr[l + 1] = ezxml_decode(attr[l + 1], root->ent, (a + && a[j]) ? *a[j + 2] : ' '); + if (attr[l + 1] < d || attr[l + 1] > s) + attr[l + 3][l / 2] = EZXML_TXTM; // value malloced + } + } + while (isspace(*s)) s++; + } + + if (*s == '/') { // self closing tag + *(s++) = '\0'; + if ((*s && *s != '>') || (! *s && e != '>')) { + if (l) ezxml_free_attr(attr); + return ezxml_err(root, d, "missing >"); + } + ezxml_open_tag(root, d, attr); + ezxml_close_tag(root, d, s); + } + else if ((q = *s) == '>' || (! *s && e == '>')) { // open tag + *s = '\0'; // temporarily null terminate tag name + ezxml_open_tag(root, d, attr); + *s = q; + } + else { + if (l) ezxml_free_attr(attr); + return ezxml_err(root, d, "missing >"); + } + } + else if (*s == '/') { // close tag + s += strcspn(d = s + 1, EZXML_WS ">") + 1; + if (! (q = *s) && e != '>') return ezxml_err(root, d, "missing >"); + *s = '\0'; // temporarily null terminate tag name + if (ezxml_close_tag(root, d, s)) return &root->xml; + if (isspace(*s = q)) s += strspn(s, EZXML_WS); + } + else if (! strncmp(s, "!--", 3)) { // xml comment + if (! (s = strstr(s + 3, "--")) || (*(s += 2) != '>' && *s) || + (! *s && e != '>')) return ezxml_err(root, d, "unclosed B1------->B2-->B3--> + * + * IEEE Standard 754 Double Precision Storage Format (gdouble): + * + * 63 62 52 51 32 31 0 + * +--------+----------------+----------------+ +---------------+ + * | s 1bit | e[62:52] 11bit | f[51:32] 20bit | | f[31:0] 32bit | + * +--------+----------------+----------------+ +---------------+ + * B0--------------->B1---------->B2--->B3----> B4->B5->B6->B7-> + */ +/* subtract from biased_exponent to form base2 exponent (normal numbers) */ +typedef union _GDoubleIEEE754 GDoubleIEEE754; +typedef union _GFloatIEEE754 GFloatIEEE754; +#define G_IEEE754_FLOAT_BIAS (127) +#define G_IEEE754_DOUBLE_BIAS (1023) +/* multiply with base2 exponent to get base10 exponent (normal numbers) */ +#define G_LOG_2_BASE_10 (0.30102999566398119521) +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +union _GFloatIEEE754 +{ + gfloat v_float; + struct { + guint mantissa : 23; + guint biased_exponent : 8; + guint sign : 1; + } mpn; +}; +union _GDoubleIEEE754 +{ + gdouble v_double; + struct { + guint mantissa_low : 32; + guint mantissa_high : 20; + guint biased_exponent : 11; + guint sign : 1; + } mpn; +}; +#elif G_BYTE_ORDER == G_BIG_ENDIAN +union _GFloatIEEE754 +{ + gfloat v_float; + struct { + guint sign : 1; + guint biased_exponent : 8; + guint mantissa : 23; + } mpn; +}; +union _GDoubleIEEE754 +{ + gdouble v_double; + struct { + guint sign : 1; + guint biased_exponent : 11; + guint mantissa_high : 20; + guint mantissa_low : 32; + } mpn; +}; +#else /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */ +#error unknown ENDIAN type +#endif /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */ + +typedef struct _GTimeVal GTimeVal; + +struct _GTimeVal +{ + glong tv_sec; + glong tv_usec; +}; + +G_END_DECLS + +/* We prefix variable declarations so they can + * properly get exported in Windows DLLs. + */ +#ifndef GLIB_VAR +# ifdef G_PLATFORM_WIN32 +# ifdef GLIB_STATIC_COMPILATION +# define GLIB_VAR extern +# else /* !GLIB_STATIC_COMPILATION */ +# ifdef GLIB_COMPILATION +# ifdef DLL_EXPORT +# define GLIB_VAR __declspec(dllexport) +# else /* !DLL_EXPORT */ +# define GLIB_VAR extern +# endif /* !DLL_EXPORT */ +# else /* !GLIB_COMPILATION */ +# define GLIB_VAR extern __declspec(dllimport) +# endif /* !GLIB_COMPILATION */ +# endif /* !GLIB_STATIC_COMPILATION */ +# else /* !G_PLATFORM_WIN32 */ +# define GLIB_VAR extern +# endif /* !G_PLATFORM_WIN32 */ +#endif /* GLIB_VAR */ + +#endif /* __G_TYPES_H__ */ diff --git a/navit/support/glib/gutf8.c b/navit/support/glib/gutf8.c new file mode 100644 index 0000000..d6cd83b --- /dev/null +++ b/navit/support/glib/gutf8.c @@ -0,0 +1,1891 @@ +/* gutf8.c - Operations on UTF-8 strings. + * + * Copyright (C) 1999 Tom Tromey + * Copyright (C) 2000 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include +#ifdef HAVE_CODESET +#include +#endif +#include + +#include "glib.h" + +#ifdef G_PLATFORM_WIN32 +#include +#define STRICT +#include +#undef STRICT +#endif + +#ifdef NOT_NEEDED_FOR_NAVIT +#include "libcharset/libcharset.h" + +#include "glibintl.h" +#include "galias.h" +#endif + +#define UTF8_COMPUTE(Char, Mask, Len) \ + if (Char < 128) \ + { \ + Len = 1; \ + Mask = 0x7f; \ + } \ + else if ((Char & 0xe0) == 0xc0) \ + { \ + Len = 2; \ + Mask = 0x1f; \ + } \ + else if ((Char & 0xf0) == 0xe0) \ + { \ + Len = 3; \ + Mask = 0x0f; \ + } \ + else if ((Char & 0xf8) == 0xf0) \ + { \ + Len = 4; \ + Mask = 0x07; \ + } \ + else if ((Char & 0xfc) == 0xf8) \ + { \ + Len = 5; \ + Mask = 0x03; \ + } \ + else if ((Char & 0xfe) == 0xfc) \ + { \ + Len = 6; \ + Mask = 0x01; \ + } \ + else \ + Len = -1; + +#define UTF8_LENGTH(Char) \ + ((Char) < 0x80 ? 1 : \ + ((Char) < 0x800 ? 2 : \ + ((Char) < 0x10000 ? 3 : \ + ((Char) < 0x200000 ? 4 : \ + ((Char) < 0x4000000 ? 5 : 6))))) + + +#define UTF8_GET(Result, Chars, Count, Mask, Len) \ + (Result) = (Chars)[0] & (Mask); \ + for ((Count) = 1; (Count) < (Len); ++(Count)) \ + { \ + if (((Chars)[(Count)] & 0xc0) != 0x80) \ + { \ + (Result) = -1; \ + break; \ + } \ + (Result) <<= 6; \ + (Result) |= ((Chars)[(Count)] & 0x3f); \ + } + +#define UNICODE_VALID(Char) \ + ((Char) < 0x110000 && \ + (((Char) & 0xFFFFF800) != 0xD800) && \ + ((Char) < 0xFDD0 || (Char) > 0xFDEF) && \ + ((Char) & 0xFFFE) != 0xFFFE) + + +static const gchar utf8_skip_data[256] = { + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1 +}; + +const gchar * const g_utf8_skip = utf8_skip_data; + +/** + * g_utf8_find_prev_char: + * @str: pointer to the beginning of a UTF-8 encoded string + * @p: pointer to some position within @str + * + * Given a position @p with a UTF-8 encoded string @str, find the start + * of the previous UTF-8 character starting before @p. Returns %NULL if no + * UTF-8 characters are present in @str before @p. + * + * @p does not have to be at the beginning of a UTF-8 character. No check + * is made to see if the character found is actually valid other than + * it starts with an appropriate byte. + * + * Return value: a pointer to the found character or %NULL. + **/ +gchar * +g_utf8_find_prev_char (const char *str, + const char *p) +{ + for (--p; p >= str; --p) + { + if ((*p & 0xc0) != 0x80) + return (gchar *)p; + } + return NULL; +} + +/** + * g_utf8_find_next_char: + * @p: a pointer to a position within a UTF-8 encoded string + * @end: a pointer to the byte following the end of the string, + * or %NULL to indicate that the string is nul-terminated. + * + * Finds the start of the next UTF-8 character in the string after @p. + * + * @p does not have to be at the beginning of a UTF-8 character. No check + * is made to see if the character found is actually valid other than + * it starts with an appropriate byte. + * + * Return value: a pointer to the found character or %NULL + **/ +gchar * +g_utf8_find_next_char (const gchar *p, + const gchar *end) +{ + if (*p) + { + if (end) + for (++p; p < end && (*p & 0xc0) == 0x80; ++p) + ; + else + for (++p; (*p & 0xc0) == 0x80; ++p) + ; + } + return (p == end) ? NULL : (gchar *)p; +} + +/** + * g_utf8_prev_char: + * @p: a pointer to a position within a UTF-8 encoded string + * + * Finds the previous UTF-8 character in the string before @p. + * + * @p does not have to be at the beginning of a UTF-8 character. No check + * is made to see if the character found is actually valid other than + * it starts with an appropriate byte. If @p might be the first + * character of the string, you must use g_utf8_find_prev_char() instead. + * + * Return value: a pointer to the found character. + **/ +gchar * +g_utf8_prev_char (const gchar *p) +{ + while (TRUE) + { + p--; + if ((*p & 0xc0) != 0x80) + return (gchar *)p; + } +} + +/** + * g_utf8_strlen: + * @p: pointer to the start of a UTF-8 encoded string. + * @max: the maximum number of bytes to examine. If @max + * is less than 0, then the string is assumed to be + * nul-terminated. If @max is 0, @p will not be examined and + * may be %NULL. + * + * Returns the length of the string in characters. + * + * Return value: the length of the string in characters + **/ +glong +g_utf8_strlen (const gchar *p, + gssize max) +{ + glong len = 0; + const gchar *start = p; + g_return_val_if_fail (p != NULL || max == 0, 0); + + if (max < 0) + { + while (*p) + { + p = g_utf8_next_char (p); + ++len; + } + } + else + { + if (max == 0 || !*p) + return 0; + + p = g_utf8_next_char (p); + + while (p - start < max && *p) + { + ++len; + p = g_utf8_next_char (p); + } + + /* only do the last len increment if we got a complete + * char (don't count partial chars) + */ + if (p - start <= max) + ++len; + } + + return len; +} + +/** + * g_utf8_get_char: + * @p: a pointer to Unicode character encoded as UTF-8 + * + * Converts a sequence of bytes encoded as UTF-8 to a Unicode character. + * If @p does not point to a valid UTF-8 encoded character, results are + * undefined. If you are not sure that the bytes are complete + * valid Unicode characters, you should use g_utf8_get_char_validated() + * instead. + * + * Return value: the resulting character + **/ +gunichar +g_utf8_get_char (const gchar *p) +{ + int i, mask = 0, len; + gunichar result; + unsigned char c = (unsigned char) *p; + + UTF8_COMPUTE (c, mask, len); + if (len == -1) + return (gunichar)-1; + UTF8_GET (result, p, i, mask, len); + + return result; +} + + +/** + * g_utf8_offset_to_pointer: + * @str: a UTF-8 encoded string + * @offset: a character offset within @str + * + * Converts from an integer character offset to a pointer to a position + * within the string. + * + * Since 2.10, this function allows to pass a negative @offset to + * step backwards. It is usually worth stepping backwards from the end + * instead of forwards if @offset is in the last fourth of the string, + * since moving forward is about 3 times faster than moving backward. + * + * Return value: the resulting pointer + **/ +gchar * +g_utf8_offset_to_pointer (const gchar *str, + glong offset) +{ + const gchar *s = str; + + if (offset > 0) + while (offset--) + s = g_utf8_next_char (s); + else + { + const char *s1; + + /* This nice technique for fast backwards stepping + * through a UTF-8 string was dubbed "stutter stepping" + * by its inventor, Larry Ewing. + */ + while (offset) + { + s1 = s; + s += offset; + while ((*s & 0xc0) == 0x80) + s--; + + offset += g_utf8_pointer_to_offset (s, s1); + } + } + + return (gchar *)s; +} + +/** + * g_utf8_pointer_to_offset: + * @str: a UTF-8 encoded string + * @pos: a pointer to a position within @str + * + * Converts from a pointer to position within a string to a integer + * character offset. + * + * Since 2.10, this function allows @pos to be before @str, and returns + * a negative offset in this case. + * + * Return value: the resulting character offset + **/ +glong +g_utf8_pointer_to_offset (const gchar *str, + const gchar *pos) +{ + const gchar *s = str; + glong offset = 0; + + if (pos < str) + offset = - g_utf8_pointer_to_offset (pos, str); + else + while (s < pos) + { + s = g_utf8_next_char (s); + offset++; + } + + return offset; +} + + +/** + * g_utf8_strncpy: + * @dest: buffer to fill with characters from @src + * @src: UTF-8 encoded string + * @n: character count + * + * Like the standard C strncpy() function, but + * copies a given number of characters instead of a given number of + * bytes. The @src string must be valid UTF-8 encoded text. + * (Use g_utf8_validate() on all text before trying to use UTF-8 + * utility functions with it.) + * + * Return value: @dest + **/ +gchar * +g_utf8_strncpy (gchar *dest, + const gchar *src, + gsize n) +{ + const gchar *s = src; + while (n && *s) + { + s = g_utf8_next_char(s); + n--; + } + strncpy(dest, src, s - src); + dest[s - src] = 0; + return dest; +} + +#if NOT_NEEDED_FOR_NAVIT +G_LOCK_DEFINE_STATIC (aliases); + +static GHashTable * +get_alias_hash (void) +{ + static GHashTable *alias_hash = NULL; + const char *aliases; + + G_LOCK (aliases); + + if (!alias_hash) + { + alias_hash = g_hash_table_new (g_str_hash, g_str_equal); + + aliases = _g_locale_get_charset_aliases (); + while (*aliases != '\0') + { + const char *canonical; + const char *alias; + const char **alias_array; + int count = 0; + + alias = aliases; + aliases += strlen (aliases) + 1; + canonical = aliases; + aliases += strlen (aliases) + 1; + + alias_array = g_hash_table_lookup (alias_hash, canonical); + if (alias_array) + { + while (alias_array[count]) + count++; + } + + alias_array = g_renew (const char *, alias_array, count + 2); + alias_array[count] = alias; + alias_array[count + 1] = NULL; + + g_hash_table_insert (alias_hash, (char *)canonical, alias_array); + } + } + + G_UNLOCK (aliases); + + return alias_hash; +} + +/* As an abuse of the alias table, the following routines gets + * the charsets that are aliases for the canonical name. + */ +G_GNUC_INTERNAL const char ** +_g_charset_get_aliases (const char *canonical_name) +{ + GHashTable *alias_hash = get_alias_hash (); + + return g_hash_table_lookup (alias_hash, canonical_name); +} + +static gboolean +g_utf8_get_charset_internal (const char *raw_data, + const char **a) +{ + const char *charset = getenv("CHARSET"); + + if (charset && *charset) + { + *a = charset; + + if (charset && strstr (charset, "UTF-8")) + return TRUE; + else + return FALSE; + } + + /* The libcharset code tries to be thread-safe without + * a lock, but has a memory leak and a missing memory + * barrier, so we lock for it + */ + G_LOCK (aliases); + charset = _g_locale_charset_unalias (raw_data); + G_UNLOCK (aliases); + + if (charset && *charset) + { + *a = charset; + + if (charset && strstr (charset, "UTF-8")) + return TRUE; + else + return FALSE; + } + + /* Assume this for compatibility at present. */ + *a = "US-ASCII"; + + return FALSE; +} + +typedef struct _GCharsetCache GCharsetCache; + +struct _GCharsetCache { + gboolean is_utf8; + gchar *raw; + gchar *charset; +}; + +static void +charset_cache_free (gpointer data) +{ + GCharsetCache *cache = data; + g_free (cache->raw); + g_free (cache->charset); + g_free (cache); +} + +/** + * g_get_charset: + * @charset: return location for character set name + * + * Obtains the character set for the current + * locale; you might use this character set as an argument to + * g_convert(), to convert from the current locale's encoding to some + * other encoding. (Frequently g_locale_to_utf8() and g_locale_from_utf8() + * are nice shortcuts, though.) + * + * On Windows the character set returned by this function is the + * so-called system default ANSI code-page. That is the character set + * used by the "narrow" versions of C library and Win32 functions that + * handle file names. It might be different from the character set + * used by the C library's current locale. + * + * The return value is %TRUE if the locale's encoding is UTF-8, in that + * case you can perhaps avoid calling g_convert(). + * + * The string returned in @charset is not allocated, and should not be + * freed. + * + * Return value: %TRUE if the returned charset is UTF-8 + **/ +gboolean +g_get_charset (G_CONST_RETURN char **charset) +{ + static GStaticPrivate cache_private = G_STATIC_PRIVATE_INIT; + GCharsetCache *cache = g_static_private_get (&cache_private); + const gchar *raw; + + if (!cache) + { + cache = g_new0 (GCharsetCache, 1); + g_static_private_set (&cache_private, cache, charset_cache_free); + } + + raw = _g_locale_charset_raw (); + + if (!(cache->raw && strcmp (cache->raw, raw) == 0)) + { + const gchar *new_charset; + + g_free (cache->raw); + g_free (cache->charset); + cache->raw = g_strdup (raw); + cache->is_utf8 = g_utf8_get_charset_internal (raw, &new_charset); + cache->charset = g_strdup (new_charset); + } + + if (charset) + *charset = cache->charset; + + return cache->is_utf8; +} +#endif + +/* unicode_strchr */ + +/** + * g_unichar_to_utf8: + * @c: a Unicode character code + * @outbuf: output buffer, must have at least 6 bytes of space. + * If %NULL, the length will be computed and returned + * and nothing will be written to @outbuf. + * + * Converts a single character to UTF-8. + * + * Return value: number of bytes written + **/ +int +g_unichar_to_utf8 (gunichar c, + gchar *outbuf) +{ + /* If this gets modified, also update the copy in g_string_insert_unichar() */ + guint len = 0; + int first; + int i; + + if (c < 0x80) + { + first = 0; + len = 1; + } + else if (c < 0x800) + { + first = 0xc0; + len = 2; + } + else if (c < 0x10000) + { + first = 0xe0; + len = 3; + } + else if (c < 0x200000) + { + first = 0xf0; + len = 4; + } + else if (c < 0x4000000) + { + first = 0xf8; + len = 5; + } + else + { + first = 0xfc; + len = 6; + } + + if (outbuf) + { + for (i = len - 1; i > 0; --i) + { + outbuf[i] = (c & 0x3f) | 0x80; + c >>= 6; + } + outbuf[0] = c | first; + } + + return len; +} + +/** + * g_utf8_strchr: + * @p: a nul-terminated UTF-8 encoded string + * @len: the maximum length of @p + * @c: a Unicode character + * + * Finds the leftmost occurrence of the given Unicode character + * in a UTF-8 encoded string, while limiting the search to @len bytes. + * If @len is -1, allow unbounded search. + * + * Return value: %NULL if the string does not contain the character, + * otherwise, a pointer to the start of the leftmost occurrence of + * the character in the string. + **/ +gchar * +g_utf8_strchr (const char *p, + gssize len, + gunichar c) +{ + gchar ch[10]; + + gint charlen = g_unichar_to_utf8 (c, ch); + ch[charlen] = '\0'; + + return g_strstr_len (p, len, ch); +} + + +/** + * g_utf8_strrchr: + * @p: a nul-terminated UTF-8 encoded string + * @len: the maximum length of @p + * @c: a Unicode character + * + * Find the rightmost occurrence of the given Unicode character + * in a UTF-8 encoded string, while limiting the search to @len bytes. + * If @len is -1, allow unbounded search. + * + * Return value: %NULL if the string does not contain the character, + * otherwise, a pointer to the start of the rightmost occurrence of the + * character in the string. + **/ +gchar * +g_utf8_strrchr (const char *p, + gssize len, + gunichar c) +{ + gchar ch[10]; + + gint charlen = g_unichar_to_utf8 (c, ch); + ch[charlen] = '\0'; + + return g_strrstr_len (p, len, ch); +} + + +/* Like g_utf8_get_char, but take a maximum length + * and return (gunichar)-2 on incomplete trailing character + */ +static inline gunichar +g_utf8_get_char_extended (const gchar *p, + gssize max_len) +{ + guint i, len; + gunichar wc = (guchar) *p; + + if (wc < 0x80) + { + return wc; + } + else if (wc < 0xc0) + { + return (gunichar)-1; + } + else if (wc < 0xe0) + { + len = 2; + wc &= 0x1f; + } + else if (wc < 0xf0) + { + len = 3; + wc &= 0x0f; + } + else if (wc < 0xf8) + { + len = 4; + wc &= 0x07; + } + else if (wc < 0xfc) + { + len = 5; + wc &= 0x03; + } + else if (wc < 0xfe) + { + len = 6; + wc &= 0x01; + } + else + { + return (gunichar)-1; + } + + if (max_len >= 0 && len > max_len) + { + for (i = 1; i < max_len; i++) + { + if ((((guchar *)p)[i] & 0xc0) != 0x80) + return (gunichar)-1; + } + return (gunichar)-2; + } + + for (i = 1; i < len; ++i) + { + gunichar ch = ((guchar *)p)[i]; + + if ((ch & 0xc0) != 0x80) + { + if (ch) + return (gunichar)-1; + else + return (gunichar)-2; + } + + wc <<= 6; + wc |= (ch & 0x3f); + } + + if (UTF8_LENGTH(wc) != len) + return (gunichar)-1; + + return wc; +} + +/** + * g_utf8_get_char_validated: + * @p: a pointer to Unicode character encoded as UTF-8 + * @max_len: the maximum number of bytes to read, or -1, for no maximum or + * if @p is nul-terminated + * + * Convert a sequence of bytes encoded as UTF-8 to a Unicode character. + * This function checks for incomplete characters, for invalid characters + * such as characters that are out of the range of Unicode, and for + * overlong encodings of valid characters. + * + * Return value: the resulting character. If @p points to a partial + * sequence at the end of a string that could begin a valid + * character (or if @max_len is zero), returns (gunichar)-2; + * otherwise, if @p does not point to a valid UTF-8 encoded + * Unicode character, returns (gunichar)-1. + **/ +gunichar +g_utf8_get_char_validated (const gchar *p, + gssize max_len) +{ + gunichar result; + + if (max_len == 0) + return (gunichar)-2; + + result = g_utf8_get_char_extended (p, max_len); + + if (result & 0x80000000) + return result; + else if (!UNICODE_VALID (result)) + return (gunichar)-1; + else + return result; +} + +/** + * g_utf8_to_ucs4_fast: + * @str: a UTF-8 encoded string + * @len: the maximum length of @str to use, in bytes. If @len < 0, + * then the string is nul-terminated. + * @items_written: location to store the number of characters in the + * result, or %NULL. + * + * Convert a string from UTF-8 to a 32-bit fixed width + * representation as UCS-4, assuming valid UTF-8 input. + * This function is roughly twice as fast as g_utf8_to_ucs4() + * but does no error checking on the input. + * + * Return value: a pointer to a newly allocated UCS-4 string. + * This value must be freed with g_free(). + **/ +gunichar * +g_utf8_to_ucs4_fast (const gchar *str, + glong len, + glong *items_written) +{ + gint j, charlen; + gunichar *result; + gint n_chars, i; + const gchar *p; + + g_return_val_if_fail (str != NULL, NULL); + + p = str; + n_chars = 0; + if (len < 0) + { + while (*p) + { + p = g_utf8_next_char (p); + ++n_chars; + } + } + else + { + while (p < str + len && *p) + { + p = g_utf8_next_char (p); + ++n_chars; + } + } + + result = g_new (gunichar, n_chars + 1); + + p = str; + for (i=0; i < n_chars; i++) + { + gunichar wc = ((unsigned char *)p)[0]; + + if (wc < 0x80) + { + result[i] = wc; + p++; + } + else + { + if (wc < 0xe0) + { + charlen = 2; + wc &= 0x1f; + } + else if (wc < 0xf0) + { + charlen = 3; + wc &= 0x0f; + } + else if (wc < 0xf8) + { + charlen = 4; + wc &= 0x07; + } + else if (wc < 0xfc) + { + charlen = 5; + wc &= 0x03; + } + else + { + charlen = 6; + wc &= 0x01; + } + + for (j = 1; j < charlen; j++) + { + wc <<= 6; + wc |= ((unsigned char *)p)[j] & 0x3f; + } + + result[i] = wc; + p += charlen; + } + } + result[i] = 0; + + if (items_written) + *items_written = i; + + return result; +} + +#if NOT_NEEDED_FOR_NAVIT +/** + * g_utf8_to_ucs4: + * @str: a UTF-8 encoded string + * @len: the maximum length of @str to use, in bytes. If @len < 0, + * then the string is nul-terminated. + * @items_read: location to store number of bytes read, or %NULL. + * If %NULL, then %G_CONVERT_ERROR_PARTIAL_INPUT will be + * returned in case @str contains a trailing partial + * character. If an error occurs then the index of the + * invalid input is stored here. + * @items_written: location to store number of characters written or %NULL. + * The value here stored does not include the trailing 0 + * character. + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError other than + * %G_CONVERT_ERROR_NO_CONVERSION may occur. + * + * Convert a string from UTF-8 to a 32-bit fixed width + * representation as UCS-4. A trailing 0 will be added to the + * string after the converted text. + * + * Return value: a pointer to a newly allocated UCS-4 string. + * This value must be freed with g_free(). If an + * error occurs, %NULL will be returned and + * @error set. + **/ +gunichar * +g_utf8_to_ucs4 (const gchar *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) +{ + gunichar *result = NULL; + gint n_chars, i; + const gchar *in; + + in = str; + n_chars = 0; + while ((len < 0 || str + len - in > 0) && *in) + { + gunichar wc = g_utf8_get_char_extended (in, len < 0 ? 6 : str + len - in); + if (wc & 0x80000000) + { + if (wc == (gunichar)-2) + { + if (items_read) + break; + else + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, + _("Partial character sequence at end of input")); + } + else + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid byte sequence in conversion input")); + + goto err_out; + } + + n_chars++; + + in = g_utf8_next_char (in); + } + + result = g_new (gunichar, n_chars + 1); + + in = str; + for (i=0; i < n_chars; i++) + { + result[i] = g_utf8_get_char (in); + in = g_utf8_next_char (in); + } + result[i] = 0; + + if (items_written) + *items_written = n_chars; + + err_out: + if (items_read) + *items_read = in - str; + + return result; +} + +/** + * g_ucs4_to_utf8: + * @str: a UCS-4 encoded string + * @len: the maximum length (number of characters) of @str to use. + * If @len < 0, then the string is nul-terminated. + * @items_read: location to store number of characters read, or %NULL. + * @items_written: location to store number of bytes written or %NULL. + * The value here stored does not include the trailing 0 + * byte. + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError other than + * %G_CONVERT_ERROR_NO_CONVERSION may occur. + * + * Convert a string from a 32-bit fixed width representation as UCS-4. + * to UTF-8. The result will be terminated with a 0 byte. + * + * Return value: a pointer to a newly allocated UTF-8 string. + * This value must be freed with g_free(). If an + * error occurs, %NULL will be returned and + * @error set. In that case, @items_read will be + * set to the position of the first invalid input + * character. + **/ +gchar * +g_ucs4_to_utf8 (const gunichar *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) +{ + gint result_length; + gchar *result = NULL; + gchar *p; + gint i; + + result_length = 0; + for (i = 0; len < 0 || i < len ; i++) + { + if (!str[i]) + break; + + if (str[i] >= 0x80000000) + { + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Character out of range for UTF-8")); + goto err_out; + } + + result_length += UTF8_LENGTH (str[i]); + } + + result = g_malloc (result_length + 1); + p = result; + + i = 0; + while (p < result + result_length) + p += g_unichar_to_utf8 (str[i++], p); + + *p = '\0'; + + if (items_written) + *items_written = p - result; + + err_out: + if (items_read) + *items_read = i; + + return result; +} +#endif +#define SURROGATE_VALUE(h,l) (((h) - 0xd800) * 0x400 + (l) - 0xdc00 + 0x10000) + +/** + * g_utf16_to_utf8: + * @str: a UTF-16 encoded string + * @len: the maximum length (number of gunichar2) of @str to use. + * If @len < 0, then the string is nul-terminated. + * @items_read: location to store number of words read, or %NULL. + * If %NULL, then %G_CONVERT_ERROR_PARTIAL_INPUT will be + * returned in case @str contains a trailing partial + * character. If an error occurs then the index of the + * invalid input is stored here. + * @items_written: location to store number of bytes written, or %NULL. + * The value stored here does not include the trailing + * 0 byte. + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError other than + * %G_CONVERT_ERROR_NO_CONVERSION may occur. + * + * Convert a string from UTF-16 to UTF-8. The result will be + * terminated with a 0 byte. + * + * Note that the input is expected to be already in native endianness, + * an initial byte-order-mark character is not handled specially. + * g_convert() can be used to convert a byte buffer of UTF-16 data of + * ambiguous endianess. + * + * Return value: a pointer to a newly allocated UTF-8 string. + * This value must be freed with g_free(). If an + * error occurs, %NULL will be returned and + * @error set. + **/ +gchar * +g_utf16_to_utf8 (const gunichar2 *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) +{ + /* This function and g_utf16_to_ucs4 are almost exactly identical - The lines that differ + * are marked. + */ + const gunichar2 *in; + gchar *out; + gchar *result = NULL; + gint n_bytes; + gunichar high_surrogate; + + g_return_val_if_fail (str != NULL, NULL); + + n_bytes = 0; + in = str; + high_surrogate = 0; + while ((len < 0 || in - str < len) && *in) + { + gunichar2 c = *in; + gunichar wc; + + if (c >= 0xdc00 && c < 0xe000) /* low surrogate */ + { + if (high_surrogate) + { + wc = SURROGATE_VALUE (high_surrogate, c); + high_surrogate = 0; + } + else + { +#if NOT_NEEDED_FOR_NAVIT + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid sequence in conversion input")); +#endif + goto err_out; + } + } + else + { + if (high_surrogate) + { +#if NOT_NEEDED_FOR_NAVIT + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid sequence in conversion input")); +#endif + goto err_out; + } + + if (c >= 0xd800 && c < 0xdc00) /* high surrogate */ + { + high_surrogate = c; + goto next1; + } + else + wc = c; + } + + /********** DIFFERENT for UTF8/UCS4 **********/ + n_bytes += UTF8_LENGTH (wc); + + next1: + in++; + } + + if (high_surrogate && !items_read) + { +#if NOT_NEEDED_FOR_NAVIT + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, + _("Partial character sequence at end of input")); +#endif + goto err_out; + } + + /* At this point, everything is valid, and we just need to convert + */ + /********** DIFFERENT for UTF8/UCS4 **********/ + result = g_malloc (n_bytes + 1); + + high_surrogate = 0; + out = result; + in = str; + while (out < result + n_bytes) + { + gunichar2 c = *in; + gunichar wc; + + if (c >= 0xdc00 && c < 0xe000) /* low surrogate */ + { + wc = SURROGATE_VALUE (high_surrogate, c); + high_surrogate = 0; + } + else if (c >= 0xd800 && c < 0xdc00) /* high surrogate */ + { + high_surrogate = c; + goto next2; + } + else + wc = c; + + /********** DIFFERENT for UTF8/UCS4 **********/ + out += g_unichar_to_utf8 (wc, out); + + next2: + in++; + } + + /********** DIFFERENT for UTF8/UCS4 **********/ + *out = '\0'; + + if (items_written) + /********** DIFFERENT for UTF8/UCS4 **********/ + *items_written = out - result; + + err_out: + if (items_read) + *items_read = in - str; + + return result; +} + +/** + * g_utf16_to_ucs4: + * @str: a UTF-16 encoded string + * @len: the maximum length (number of gunichar2) of @str to use. + * If @len < 0, then the string is nul-terminated. + * @items_read: location to store number of words read, or %NULL. + * If %NULL, then %G_CONVERT_ERROR_PARTIAL_INPUT will be + * returned in case @str contains a trailing partial + * character. If an error occurs then the index of the + * invalid input is stored here. + * @items_written: location to store number of characters written, or %NULL. + * The value stored here does not include the trailing + * 0 character. + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError other than + * %G_CONVERT_ERROR_NO_CONVERSION may occur. + * + * Convert a string from UTF-16 to UCS-4. The result will be + * nul-terminated. + * + * Return value: a pointer to a newly allocated UCS-4 string. + * This value must be freed with g_free(). If an + * error occurs, %NULL will be returned and + * @error set. + **/ +gunichar * +g_utf16_to_ucs4 (const gunichar2 *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) +{ + const gunichar2 *in; + gchar *out; + gchar *result = NULL; + gint n_bytes; + gunichar high_surrogate; + + g_return_val_if_fail (str != NULL, NULL); + + n_bytes = 0; + in = str; + high_surrogate = 0; + while ((len < 0 || in - str < len) && *in) + { + gunichar2 c = *in; + gunichar wc; + + if (c >= 0xdc00 && c < 0xe000) /* low surrogate */ + { + if (high_surrogate) + { + wc = SURROGATE_VALUE (high_surrogate, c); + high_surrogate = 0; + } + else + { +#if NOT_NEEDED_FOR_NAVIT + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid sequence in conversion input")); +#endif + goto err_out; + } + } + else + { + if (high_surrogate) + { +#if NOT_NEEDED_FOR_NAVIT + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid sequence in conversion input")); +#endif + goto err_out; + } + + if (c >= 0xd800 && c < 0xdc00) /* high surrogate */ + { + high_surrogate = c; + goto next1; + } + else + wc = c; + } + + /********** DIFFERENT for UTF8/UCS4 **********/ + n_bytes += sizeof (gunichar); + + next1: + in++; + } + + if (high_surrogate && !items_read) + { +#if NOT_NEEDED_FOR_NAVIT + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, + _("Partial character sequence at end of input")); +#endif + goto err_out; + } + + /* At this point, everything is valid, and we just need to convert + */ + /********** DIFFERENT for UTF8/UCS4 **********/ + result = g_malloc (n_bytes + 4); + + high_surrogate = 0; + out = result; + in = str; + while (out < result + n_bytes) + { + gunichar2 c = *in; + gunichar wc; + + if (c >= 0xdc00 && c < 0xe000) /* low surrogate */ + { + wc = SURROGATE_VALUE (high_surrogate, c); + high_surrogate = 0; + } + else if (c >= 0xd800 && c < 0xdc00) /* high surrogate */ + { + high_surrogate = c; + goto next2; + } + else + wc = c; + + /********** DIFFERENT for UTF8/UCS4 **********/ + *(gunichar *)out = wc; + out += sizeof (gunichar); + + next2: + in++; + } + + /********** DIFFERENT for UTF8/UCS4 **********/ + *(gunichar *)out = 0; + + if (items_written) + /********** DIFFERENT for UTF8/UCS4 **********/ + *items_written = (out - result) / sizeof (gunichar); + + err_out: + if (items_read) + *items_read = in - str; + + return (gunichar *)result; +} + +/** + * g_utf8_to_utf16: + * @str: a UTF-8 encoded string + * @len: the maximum length (number of characters) of @str to use. + * If @len < 0, then the string is nul-terminated. + * @items_read: location to store number of bytes read, or %NULL. + * If %NULL, then %G_CONVERT_ERROR_PARTIAL_INPUT will be + * returned in case @str contains a trailing partial + * character. If an error occurs then the index of the + * invalid input is stored here. + * @items_written: location to store number of gunichar2 written, + * or %NULL. + * The value stored here does not include the trailing 0. + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError other than + * %G_CONVERT_ERROR_NO_CONVERSION may occur. + * + * Convert a string from UTF-8 to UTF-16. A 0 character will be + * added to the result after the converted text. + * + * Return value: a pointer to a newly allocated UTF-16 string. + * This value must be freed with g_free(). If an + * error occurs, %NULL will be returned and + * @error set. + **/ +gunichar2 * +g_utf8_to_utf16 (const gchar *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) +{ + gunichar2 *result = NULL; + gint n16; + const gchar *in; + gint i; + + g_return_val_if_fail (str != NULL, NULL); + + in = str; + n16 = 0; + while ((len < 0 || str + len - in > 0) && *in) + { + gunichar wc = g_utf8_get_char_extended (in, len < 0 ? 6 : str + len - in); + if (wc & 0x80000000) + { + if (wc == (gunichar)-2) + { + if (items_read) + break; +#if NOT_NEEDED_FOR_NAVIT + else + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, + _("Partial character sequence at end of input")); +#endif + } +#if NOT_NEEDED_FOR_NAVIT + else + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid byte sequence in conversion input")); +#endif + goto err_out; + } + + if (wc < 0xd800) + n16 += 1; + else if (wc < 0xe000) + { +#if NOT_NEEDED_FOR_NAVIT + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid sequence in conversion input")); +#endif + + goto err_out; + } + else if (wc < 0x10000) + n16 += 1; + else if (wc < 0x110000) + n16 += 2; + else + { +#if NOT_NEEDED_FOR_NAVIT +// g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, +// _("Character out of range for UTF-16")); +#endif + + goto err_out; + } + + in = g_utf8_next_char (in); + } + + result = g_new (gunichar2, n16 + 1); + + in = str; + for (i = 0; i < n16;) + { + gunichar wc = g_utf8_get_char (in); + + if (wc < 0x10000) + { + result[i++] = wc; + } + else + { + result[i++] = (wc - 0x10000) / 0x400 + 0xd800; + result[i++] = (wc - 0x10000) % 0x400 + 0xdc00; + } + + in = g_utf8_next_char (in); + } + + result[i] = 0; + + if (items_written) + *items_written = n16; + + err_out: + if (items_read) + *items_read = in - str; + + return result; +} + +/** + * g_ucs4_to_utf16: + * @str: a UCS-4 encoded string + * @len: the maximum length (number of characters) of @str to use. + * If @len < 0, then the string is nul-terminated. + * @items_read: location to store number of bytes read, or %NULL. + * If an error occurs then the index of the invalid input + * is stored here. + * @items_written: location to store number of gunichar2 + * written, or %NULL. The value stored here does not + * include the trailing 0. + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError other than + * %G_CONVERT_ERROR_NO_CONVERSION may occur. + * + * Convert a string from UCS-4 to UTF-16. A 0 character will be + * added to the result after the converted text. + * + * Return value: a pointer to a newly allocated UTF-16 string. + * This value must be freed with g_free(). If an + * error occurs, %NULL will be returned and + * @error set. + **/ +gunichar2 * +g_ucs4_to_utf16 (const gunichar *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) +{ + gunichar2 *result = NULL; + gint n16; + gint i, j; + + n16 = 0; + i = 0; + while ((len < 0 || i < len) && str[i]) + { + gunichar wc = str[i]; + + if (wc < 0xd800) + n16 += 1; + else if (wc < 0xe000) + { +#if NOT_NEEDED_FOR_NAVIT + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid sequence in conversion input")); +#endif + + goto err_out; + } + else if (wc < 0x10000) + n16 += 1; + else if (wc < 0x110000) + n16 += 2; + else + { +#if NOT_NEEDED_FOR_NAVIT + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Character out of range for UTF-16")); +#endif + + goto err_out; + } + + i++; + } + + result = g_new (gunichar2, n16 + 1); + + for (i = 0, j = 0; j < n16; i++) + { + gunichar wc = str[i]; + + if (wc < 0x10000) + { + result[j++] = wc; + } + else + { + result[j++] = (wc - 0x10000) / 0x400 + 0xd800; + result[j++] = (wc - 0x10000) % 0x400 + 0xdc00; + } + } + result[j] = 0; + + if (items_written) + *items_written = n16; + + err_out: + if (items_read) + *items_read = i; + + return result; +} + +#define CONTINUATION_CHAR \ + G_STMT_START { \ + if ((*(guchar *)p & 0xc0) != 0x80) /* 10xxxxxx */ \ + goto error; \ + val <<= 6; \ + val |= (*(guchar *)p) & 0x3f; \ + } G_STMT_END + +static const gchar * +fast_validate (const char *str) + +{ + gunichar val = 0; + gunichar min = 0; + const gchar *p; + + for (p = str; *p; p++) + { + if (*(guchar *)p < 128) + /* done */; + else + { + const gchar *last; + + last = p; + if ((*(guchar *)p & 0xe0) == 0xc0) /* 110xxxxx */ + { + if (G_UNLIKELY ((*(guchar *)p & 0x1e) == 0)) + goto error; + p++; + if (G_UNLIKELY ((*(guchar *)p & 0xc0) != 0x80)) /* 10xxxxxx */ + goto error; + } + else + { + if ((*(guchar *)p & 0xf0) == 0xe0) /* 1110xxxx */ + { + min = (1 << 11); + val = *(guchar *)p & 0x0f; + goto TWO_REMAINING; + } + else if ((*(guchar *)p & 0xf8) == 0xf0) /* 11110xxx */ + { + min = (1 << 16); + val = *(guchar *)p & 0x07; + } + else + goto error; + + p++; + CONTINUATION_CHAR; + TWO_REMAINING: + p++; + CONTINUATION_CHAR; + p++; + CONTINUATION_CHAR; + + if (G_UNLIKELY (val < min)) + goto error; + + if (G_UNLIKELY (!UNICODE_VALID(val))) + goto error; + } + + continue; + + error: + return last; + } + } + + return p; +} + +static const gchar * +fast_validate_len (const char *str, + gssize max_len) + +{ + gunichar val = 0; + gunichar min = 0; + const gchar *p; + + g_assert (max_len >= 0); + + for (p = str; ((p - str) < max_len) && *p; p++) + { + if (*(guchar *)p < 128) + /* done */; + else + { + const gchar *last; + + last = p; + if ((*(guchar *)p & 0xe0) == 0xc0) /* 110xxxxx */ + { + if (G_UNLIKELY (max_len - (p - str) < 2)) + goto error; + + if (G_UNLIKELY ((*(guchar *)p & 0x1e) == 0)) + goto error; + p++; + if (G_UNLIKELY ((*(guchar *)p & 0xc0) != 0x80)) /* 10xxxxxx */ + goto error; + } + else + { + if ((*(guchar *)p & 0xf0) == 0xe0) /* 1110xxxx */ + { + if (G_UNLIKELY (max_len - (p - str) < 3)) + goto error; + + min = (1 << 11); + val = *(guchar *)p & 0x0f; + goto TWO_REMAINING; + } + else if ((*(guchar *)p & 0xf8) == 0xf0) /* 11110xxx */ + { + if (G_UNLIKELY (max_len - (p - str) < 4)) + goto error; + + min = (1 << 16); + val = *(guchar *)p & 0x07; + } + else + goto error; + + p++; + CONTINUATION_CHAR; + TWO_REMAINING: + p++; + CONTINUATION_CHAR; + p++; + CONTINUATION_CHAR; + + if (G_UNLIKELY (val < min)) + goto error; + if (G_UNLIKELY (!UNICODE_VALID(val))) + goto error; + } + + continue; + + error: + return last; + } + } + + return p; +} + +/** + * g_utf8_validate: + * @str: a pointer to character data + * @max_len: max bytes to validate, or -1 to go until NUL + * @end: return location for end of valid data + * + * Validates UTF-8 encoded text. @str is the text to validate; + * if @str is nul-terminated, then @max_len can be -1, otherwise + * @max_len should be the number of bytes to validate. + * If @end is non-%NULL, then the end of the valid range + * will be stored there (i.e. the start of the first invalid + * character if some bytes were invalid, or the end of the text + * being validated otherwise). + * + * Note that g_utf8_validate() returns %FALSE if @max_len is + * positive and NUL is met before @max_len bytes have been read. + * + * Returns %TRUE if all of @str was valid. Many GLib and GTK+ + * routines require valid UTF-8 as input; + * so data read from a file or the network should be checked + * with g_utf8_validate() before doing anything else with it. + * + * Return value: %TRUE if the text was valid UTF-8 + **/ +gboolean +g_utf8_validate (const char *str, + gssize max_len, + const gchar **end) + +{ + const gchar *p; + + if (max_len < 0) + p = fast_validate (str); + else + p = fast_validate_len (str, max_len); + + if (end) + *end = p; + + if ((max_len >= 0 && p != str + max_len) || + (max_len < 0 && *p != '\0')) + return FALSE; + else + return TRUE; +} + +/** + * g_unichar_validate: + * @ch: a Unicode character + * + * Checks whether @ch is a valid Unicode character. Some possible + * integer values of @ch will not be valid. 0 is considered a valid + * character, though it's normally a string terminator. + * + * Return value: %TRUE if @ch is a valid Unicode character + **/ +gboolean +g_unichar_validate (gunichar ch) +{ + return UNICODE_VALID (ch); +} + +/** + * g_utf8_strreverse: + * @str: a UTF-8 encoded string + * @len: the maximum length of @str to use, in bytes. If @len < 0, + * then the string is nul-terminated. + * + * Reverses a UTF-8 string. @str must be valid UTF-8 encoded text. + * (Use g_utf8_validate() on all text before trying to use UTF-8 + * utility functions with it.) + * + * This function is intended for programmatic uses of reversed strings. + * It pays no attention to decomposed characters, combining marks, byte + * order marks, directional indicators (LRM, LRO, etc) and similar + * characters which might need special handling when reversing a string + * for display purposes. + * + * Note that unlike g_strreverse(), this function returns + * newly-allocated memory, which should be freed with g_free() when + * no longer needed. + * + * Returns: a newly-allocated string which is the reverse of @str. + * + * Since: 2.2 + */ +gchar * +g_utf8_strreverse (const gchar *str, + gssize len) +{ + gchar *r, *result; + const gchar *p; + + if (len < 0) + len = strlen (str); + + result = g_new (gchar, len + 1); + r = result + len; + p = str; + while (r > result) + { + gchar *m, skip = g_utf8_skip[*(guchar*) p]; + r -= skip; + for (m = r; skip; skip--) + *m++ = *p++; + } + result[len] = 0; + + return result; +} + +#if NOT_NEEDED_FOR_NAVIT + +gchar * +_g_utf8_make_valid (const gchar *name) +{ + GString *string; + const gchar *remainder, *invalid; + gint remaining_bytes, valid_bytes; + + string = NULL; + remainder = name; + remaining_bytes = strlen (name); + + while (remaining_bytes != 0) + { + if (g_utf8_validate (remainder, remaining_bytes, &invalid)) + break; + valid_bytes = invalid - remainder; + + if (string == NULL) + string = g_string_sized_new (remaining_bytes); + + g_string_append_len (string, remainder, valid_bytes); + /* append U+FFFD REPLACEMENT CHARACTER */ + g_string_append (string, "\357\277\275"); + + remaining_bytes -= valid_bytes + 1; + remainder = invalid + 1; + } + + if (string == NULL) + return g_strdup (name); + + g_string_append (string, remainder); + + g_assert (g_utf8_validate (string->str, -1, NULL)); + + return g_string_free (string, FALSE); +} +#endif + +#define __G_UTF8_C__ +#include "galiasdef.c" diff --git a/navit/support/glib/gutils.c b/navit/support/glib/gutils.c new file mode 100644 index 0000000..2871e38 --- /dev/null +++ b/navit/support/glib/gutils.c @@ -0,0 +1,3421 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe for the unix part, FIXME: make the win32 part MT safe as well. + */ + +#include "config.h" + +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include +#include +#include +#include /* For tolower() */ +#include +#include +#include +#ifdef HAVE_PWD_H +#include +#endif +#include +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#ifdef HAVE_CRT_EXTERNS_H +#include /* for _NSGetEnviron */ +#endif + +/* implement gutils's inline functions + */ +#define G_IMPLEMENT_INLINES 1 +#define __G_UTILS_C__ +#include "glib.h" +#include "gprintfint.h" +#include "gthreadprivate.h" +#include "glibintl.h" +#include "galias.h" + +#ifdef MAXPATHLEN +#define G_PATH_LENGTH MAXPATHLEN +#elif defined (PATH_MAX) +#define G_PATH_LENGTH PATH_MAX +#elif defined (_PC_PATH_MAX) +#define G_PATH_LENGTH sysconf(_PC_PATH_MAX) +#else +#define G_PATH_LENGTH 2048 +#endif + +#ifdef G_PLATFORM_WIN32 +# define STRICT /* Strict typing, please */ +# include +# undef STRICT +# ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS +# define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 2 +# define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 4 +# endif +# include /* For UNLEN */ +#endif /* G_PLATFORM_WIN32 */ + +#ifdef G_OS_WIN32 +#if NOT_NEEDED_FOR_NAVIT +# include +#endif /* NOT_NEEDED_FOR_NAVIT */ +# include + /* older SDK (e.g. msvc 5.0) does not have these*/ +# ifndef CSIDL_MYMUSIC +# define CSIDL_MYMUSIC 13 +# endif +# ifndef CSIDL_MYVIDEO +# define CSIDL_MYVIDEO 14 +# endif +# ifndef CSIDL_INTERNET_CACHE +# define CSIDL_INTERNET_CACHE 32 +# endif +# ifndef CSIDL_COMMON_APPDATA +# define CSIDL_COMMON_APPDATA 35 +# endif +# ifndef CSIDL_MYPICTURES +# define CSIDL_MYPICTURES 0x27 +# endif +# ifndef CSIDL_COMMON_DOCUMENTS +# define CSIDL_COMMON_DOCUMENTS 46 +# endif +# ifndef CSIDL_PROFILE +# define CSIDL_PROFILE 40 +# endif +# include +#endif + +#ifdef HAVE_CARBON +#include +#endif + +#ifdef HAVE_CODESET +#include +#endif + +#ifdef HAVE_BIND_TEXTDOMAIN_CODESET +#include +#endif + +#if NOT_NEEDED_FOR_NAVIT +const guint glib_major_version = GLIB_MAJOR_VERSION; +const guint glib_minor_version = GLIB_MINOR_VERSION; +const guint glib_micro_version = GLIB_MICRO_VERSION; +const guint glib_interface_age = GLIB_INTERFACE_AGE; +const guint glib_binary_age = GLIB_BINARY_AGE; + +#ifdef G_PLATFORM_WIN32 + +static HMODULE glib_dll = NULL; + +#ifdef DLL_EXPORT + +BOOL WINAPI +DllMain (HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ + if (fdwReason == DLL_PROCESS_ATTACH) + glib_dll = hinstDLL; + + return TRUE; +} + +#endif + +gchar * +_glib_get_installation_directory (void) +{ +#ifdef DLL_EXPORT + if (glib_dll == NULL) + return NULL; +#endif + /* In a static build of GLib just use the application's .exe file's + * installation directory... + */ + return g_win32_get_package_installation_directory_of_module (glib_dll); +} + +#endif + +/** + * glib_check_version: + * @required_major: the required major version. + * @required_minor: the required minor version. + * @required_micro: the required micro version. + * + * Checks that the GLib library in use is compatible with the + * given version. Generally you would pass in the constants + * #GLIB_MAJOR_VERSION, #GLIB_MINOR_VERSION, #GLIB_MICRO_VERSION + * as the three arguments to this function; that produces + * a check that the library in use is compatible with + * the version of GLib the application or module was compiled + * against. + * + * Compatibility is defined by two things: first the version + * of the running library is newer than the version + * @required_major.required_minor.@required_micro. Second + * the running library must be binary compatible with the + * version @required_major.required_minor.@required_micro + * (same major version.) + * + * Return value: %NULL if the GLib library is compatible with the + * given version, or a string describing the version mismatch. + * The returned string is owned by GLib and must not be modified + * or freed. + * + * Since: 2.6 + **/ +const gchar * +glib_check_version (guint required_major, + guint required_minor, + guint required_micro) +{ + gint glib_effective_micro = 100 * GLIB_MINOR_VERSION + GLIB_MICRO_VERSION; + gint required_effective_micro = 100 * required_minor + required_micro; + + if (required_major > GLIB_MAJOR_VERSION) + return "GLib version too old (major mismatch)"; + if (required_major < GLIB_MAJOR_VERSION) + return "GLib version too new (major mismatch)"; + if (required_effective_micro < glib_effective_micro - GLIB_BINARY_AGE) + return "GLib version too new (micro mismatch)"; + if (required_effective_micro > glib_effective_micro) + return "GLib version too old (micro mismatch)"; + return NULL; +} + +#if !defined (HAVE_MEMMOVE) && !defined (HAVE_WORKING_BCOPY) +/** + * g_memmove: + * @dest: the destination address to copy the bytes to. + * @src: the source address to copy the bytes from. + * @len: the number of bytes to copy. + * + * Copies a block of memory @len bytes long, from @src to @dest. + * The source and destination areas may overlap. + * + * In order to use this function, you must include + * string.h yourself, because this macro will + * typically simply resolve to memmove() and GLib does not include + * string.h for you. + */ +void +g_memmove (gpointer dest, + gconstpointer src, + gulong len) +{ + gchar* destptr = dest; + const gchar* srcptr = src; + if (src + len < dest || dest + len < src) + { + bcopy (src, dest, len); + return; + } + else if (dest <= src) + { + while (len--) + *(destptr++) = *(srcptr++); + } + else + { + destptr += len; + srcptr += len; + while (len--) + *(--destptr) = *(--srcptr); + } +} +#endif /* !HAVE_MEMMOVE && !HAVE_WORKING_BCOPY */ + +#ifdef G_OS_WIN32 +#undef g_atexit +#endif + +/** + * g_atexit: + * @func: the function to call on normal program termination. + * + * Specifies a function to be called at normal program termination. + * + * Since GLib 2.8.2, on Windows g_atexit() actually is a preprocessor + * macro that maps to a call to the atexit() function in the C + * library. This means that in case the code that calls g_atexit(), + * i.e. atexit(), is in a DLL, the function will be called when the + * DLL is detached from the program. This typically makes more sense + * than that the function is called when the GLib DLL is detached, + * which happened earlier when g_atexit() was a function in the GLib + * DLL. + * + * The behaviour of atexit() in the context of dynamically loaded + * modules is not formally specified and varies wildly. + * + * On POSIX systems, calling g_atexit() (or atexit()) in a dynamically + * loaded module which is unloaded before the program terminates might + * well cause a crash at program exit. + * + * Some POSIX systems implement atexit() like Windows, and have each + * dynamically loaded module maintain an own atexit chain that is + * called when the module is unloaded. + * + * On other POSIX systems, before a dynamically loaded module is + * unloaded, the registered atexit functions (if any) residing in that + * module are called, regardless where the code that registered them + * resided. This is presumably the most robust approach. + * + * As can be seen from the above, for portability it's best to avoid + * calling g_atexit() (or atexit()) except in the main executable of a + * program. + */ +void +g_atexit (GVoidFunc func) +{ + gint result; + const gchar *error = NULL; + + /* keep this in sync with glib.h */ + +#ifdef G_NATIVE_ATEXIT + result = ATEXIT (func); + if (result) + error = g_strerror (errno); +#elif defined (HAVE_ATEXIT) +# ifdef NeXT /* @#%@! NeXTStep */ + result = !atexit ((void (*)(void)) func); + if (result) + error = g_strerror (errno); +# else + result = atexit ((void (*)(void)) func); + if (result) + error = g_strerror (errno); +# endif /* NeXT */ +#elif defined (HAVE_ON_EXIT) + result = on_exit ((void (*)(int, void *)) func, NULL); + if (result) + error = g_strerror (errno); +#else + result = 0; + error = "no implementation"; +#endif /* G_NATIVE_ATEXIT */ + + if (error) + g_error ("Could not register atexit() function: %s", error); +} + +/* Based on execvp() from GNU Libc. + * Some of this code is cut-and-pasted into gspawn.c + */ + +static gchar* +my_strchrnul (const gchar *str, + gchar c) +{ + gchar *p = (gchar*)str; + while (*p && (*p != c)) + ++p; + + return p; +} + +#ifdef G_OS_WIN32 + +static gchar *inner_find_program_in_path (const gchar *program); + +gchar* +g_find_program_in_path (const gchar *program) +{ + const gchar *last_dot = strrchr (program, '.'); + + if (last_dot == NULL || + strchr (last_dot, '\\') != NULL || + strchr (last_dot, '/') != NULL) + { + const gint program_length = strlen (program); + gchar *pathext = g_build_path (";", + ".exe;.cmd;.bat;.com", + g_getenv ("PATHEXT"), + NULL); + gchar *p; + gchar *decorated_program; + gchar *retval; + + p = pathext; + do + { + gchar *q = my_strchrnul (p, ';'); + + decorated_program = g_malloc (program_length + (q-p) + 1); + memcpy (decorated_program, program, program_length); + memcpy (decorated_program+program_length, p, q-p); + decorated_program [program_length + (q-p)] = '\0'; + + retval = inner_find_program_in_path (decorated_program); + g_free (decorated_program); + + if (retval != NULL) + { + g_free (pathext); + return retval; + } + p = q; + } while (*p++ != '\0'); + g_free (pathext); + return NULL; + } + else + return inner_find_program_in_path (program); +} + +#endif + +/** + * g_find_program_in_path: + * @program: a program name in the GLib file name encoding + * + * Locates the first executable named @program in the user's path, in the + * same way that execvp() would locate it. Returns an allocated string + * with the absolute path name, or %NULL if the program is not found in + * the path. If @program is already an absolute path, returns a copy of + * @program if @program exists and is executable, and %NULL otherwise. + * + * On Windows, if @program does not have a file type suffix, tries + * with the suffixes .exe, .cmd, .bat and .com, and the suffixes in + * the PATHEXT environment variable. + * + * On Windows, it looks for the file in the same way as CreateProcess() + * would. This means first in the directory where the executing + * program was loaded from, then in the current directory, then in the + * Windows 32-bit system directory, then in the Windows directory, and + * finally in the directories in the PATH environment + * variable. If the program is found, the return value contains the + * full name including the type suffix. + * + * Return value: absolute path, or %NULL + **/ +#ifdef G_OS_WIN32 +static gchar * +inner_find_program_in_path (const gchar *program) +#else +gchar* +g_find_program_in_path (const gchar *program) +#endif +{ + const gchar *path, *p; + gchar *name, *freeme; +#ifdef G_OS_WIN32 + const gchar *path_copy; + gchar *filename = NULL, *appdir = NULL; + gchar *sysdir = NULL, *windir = NULL; + int n; + wchar_t wfilename[MAXPATHLEN], wsysdir[MAXPATHLEN], + wwindir[MAXPATHLEN]; +#endif + gsize len; + gsize pathlen; + + g_return_val_if_fail (program != NULL, NULL); + + /* If it is an absolute path, or a relative path including subdirectories, + * don't look in PATH. + */ + if (g_path_is_absolute (program) + || strchr (program, G_DIR_SEPARATOR) != NULL +#ifdef G_OS_WIN32 + || strchr (program, '/') != NULL +#endif + ) + { + if (g_file_test (program, G_FILE_TEST_IS_EXECUTABLE) && + !g_file_test (program, G_FILE_TEST_IS_DIR)) + return g_strdup (program); + else + return NULL; + } + + path = g_getenv ("PATH"); +#if defined(G_OS_UNIX) || defined(G_OS_BEOS) + if (path == NULL) + { + /* There is no `PATH' in the environment. The default + * search path in GNU libc is the current directory followed by + * the path `confstr' returns for `_CS_PATH'. + */ + + /* In GLib we put . last, for security, and don't use the + * unportable confstr(); UNIX98 does not actually specify + * what to search if PATH is unset. POSIX may, dunno. + */ + + path = "/bin:/usr/bin:."; + } +#else + n = GetModuleFileNameW (NULL, wfilename, MAXPATHLEN); + if (n > 0 && n < MAXPATHLEN) + filename = g_utf16_to_utf8 (wfilename, -1, NULL, NULL, NULL); + + n = GetSystemDirectoryW (wsysdir, MAXPATHLEN); + if (n > 0 && n < MAXPATHLEN) + sysdir = g_utf16_to_utf8 (wsysdir, -1, NULL, NULL, NULL); + + n = GetWindowsDirectoryW (wwindir, MAXPATHLEN); + if (n > 0 && n < MAXPATHLEN) + windir = g_utf16_to_utf8 (wwindir, -1, NULL, NULL, NULL); + + if (filename) + { + appdir = g_path_get_dirname (filename); + g_free (filename); + } + + path = g_strdup (path); + + if (windir) + { + const gchar *tem = path; + path = g_strconcat (windir, ";", path, NULL); + g_free ((gchar *) tem); + g_free (windir); + } + + if (sysdir) + { + const gchar *tem = path; + path = g_strconcat (sysdir, ";", path, NULL); + g_free ((gchar *) tem); + g_free (sysdir); + } + + { + const gchar *tem = path; + path = g_strconcat (".;", path, NULL); + g_free ((gchar *) tem); + } + + if (appdir) + { + const gchar *tem = path; + path = g_strconcat (appdir, ";", path, NULL); + g_free ((gchar *) tem); + g_free (appdir); + } + + path_copy = path; +#endif + + len = strlen (program) + 1; + pathlen = strlen (path); + freeme = name = g_malloc (pathlen + len + 1); + + /* Copy the file name at the top, including '\0' */ + memcpy (name + pathlen + 1, program, len); + name = name + pathlen; + /* And add the slash before the filename */ + *name = G_DIR_SEPARATOR; + + p = path; + do + { + char *startp; + + path = p; + p = my_strchrnul (path, G_SEARCHPATH_SEPARATOR); + + if (p == path) + /* Two adjacent colons, or a colon at the beginning or the end + * of `PATH' means to search the current directory. + */ + startp = name + 1; + else + startp = memcpy (name - (p - path), path, p - path); + + if (g_file_test (startp, G_FILE_TEST_IS_EXECUTABLE) && + !g_file_test (startp, G_FILE_TEST_IS_DIR)) + { + gchar *ret; + ret = g_strdup (startp); + g_free (freeme); +#ifdef G_OS_WIN32 + g_free ((gchar *) path_copy); +#endif + return ret; + } + } + while (*p++ != '\0'); + + g_free (freeme); +#ifdef G_OS_WIN32 + g_free ((gchar *) path_copy); +#endif + + return NULL; +} + +static gboolean +debug_key_matches (const gchar *key, + const gchar *token, + guint length) +{ + for (; length; length--, key++, token++) + { + char k = (*key == '_') ? '-' : tolower (*key ); + char t = (*token == '_') ? '-' : tolower (*token); + + if (k != t) + return FALSE; + } + + return *key == '\0'; +} + +/** + * g_parse_debug_string: + * @string: a list of debug options separated by colons, spaces, or + * commas; or the string "all" to set all flags, or %NULL. + * @keys: pointer to an array of #GDebugKey which associate + * strings with bit flags. + * @nkeys: the number of #GDebugKeys in the array. + * + * Parses a string containing debugging options + * into a %guint containing bit flags. This is used + * within GDK and GTK+ to parse the debug options passed on the + * command line or through environment variables. + * + * Returns: the combined set of bit flags. + */ +guint +g_parse_debug_string (const gchar *string, + const GDebugKey *keys, + guint nkeys) +{ + guint i; + guint result = 0; + + if (string == NULL) + return 0; + + /* this function is used by gmem.c/gslice.c initialization code, + * so introducing malloc dependencies here would require adaptions + * of those code portions. + */ + + if (!g_ascii_strcasecmp (string, "all")) + { + for (i=0; i base)) + base = q; + } +#endif + + if (base) + return base + 1; + +#ifdef G_OS_WIN32 + if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':') + return (gchar*) file_name + 2; +#endif /* G_OS_WIN32 */ + + return (gchar*) file_name; +} +#endif + +/** + * g_path_get_basename: + * @file_name: the name of the file. + * + * Gets the last component of the filename. If @file_name ends with a + * directory separator it gets the component before the last slash. If + * @file_name consists only of directory separators (and on Windows, + * possibly a drive letter), a single separator is returned. If + * @file_name is empty, it gets ".". + * + * Return value: a newly allocated string containing the last component of + * the filename. + */ +gchar* +g_path_get_basename (const gchar *file_name) +{ + register gssize base; + register gssize last_nonslash; + gsize len; + gchar *retval; + + g_return_val_if_fail (file_name != NULL, NULL); + + if (file_name[0] == '\0') + /* empty string */ + return g_strdup ("."); + + last_nonslash = strlen (file_name) - 1; + + while (last_nonslash >= 0 && G_IS_DIR_SEPARATOR (file_name [last_nonslash])) + last_nonslash--; + + if (last_nonslash == -1) + /* string only containing slashes */ + return g_strdup (G_DIR_SEPARATOR_S); + +#ifdef G_OS_WIN32 + if (last_nonslash == 1 && g_ascii_isalpha (file_name[0]) && file_name[1] == ':') + /* string only containing slashes and a drive */ + return g_strdup (G_DIR_SEPARATOR_S); +#endif /* G_OS_WIN32 */ + + base = last_nonslash; + + while (base >=0 && !G_IS_DIR_SEPARATOR (file_name [base])) + base--; + +#ifdef G_OS_WIN32 + if (base == -1 && g_ascii_isalpha (file_name[0]) && file_name[1] == ':') + base = 1; +#endif /* G_OS_WIN32 */ + + len = last_nonslash - base; + retval = g_malloc (len + 1); + memcpy (retval, file_name + base + 1, len); + retval [len] = '\0'; + return retval; +} + +#if NOT_NEEDED_FOR_NAVIT +/** + * g_path_is_absolute: + * @file_name: a file name. + * + * Returns %TRUE if the given @file_name is an absolute file name, + * i.e. it contains a full path from the root directory such as "/usr/local" + * on UNIX or "C:\windows" on Windows systems. + * + * Returns: %TRUE if @file_name is an absolute path. + */ +gboolean +g_path_is_absolute (const gchar *file_name) +{ + g_return_val_if_fail (file_name != NULL, FALSE); + + if (G_IS_DIR_SEPARATOR (file_name[0])) + return TRUE; + +#ifdef G_OS_WIN32 + /* Recognize drive letter on native Windows */ + if (g_ascii_isalpha (file_name[0]) && + file_name[1] == ':' && G_IS_DIR_SEPARATOR (file_name[2])) + return TRUE; +#endif /* G_OS_WIN32 */ + + return FALSE; +} + +/** + * g_path_skip_root: + * @file_name: a file name. + * + * Returns a pointer into @file_name after the root component, i.e. after + * the "/" in UNIX or "C:\" under Windows. If @file_name is not an absolute + * path it returns %NULL. + * + * Returns: a pointer into @file_name after the root component. + */ +G_CONST_RETURN gchar* +g_path_skip_root (const gchar *file_name) +{ + g_return_val_if_fail (file_name != NULL, NULL); + +#ifdef G_PLATFORM_WIN32 + /* Skip \\server\share or //server/share */ + if (G_IS_DIR_SEPARATOR (file_name[0]) && + G_IS_DIR_SEPARATOR (file_name[1]) && + file_name[2] && + !G_IS_DIR_SEPARATOR (file_name[2])) + { + gchar *p; + + p = strchr (file_name + 2, G_DIR_SEPARATOR); +#ifdef G_OS_WIN32 + { + gchar *q = strchr (file_name + 2, '/'); + if (p == NULL || (q != NULL && q < p)) + p = q; + } +#endif + if (p && + p > file_name + 2 && + p[1]) + { + file_name = p + 1; + + while (file_name[0] && !G_IS_DIR_SEPARATOR (file_name[0])) + file_name++; + + /* Possibly skip a backslash after the share name */ + if (G_IS_DIR_SEPARATOR (file_name[0])) + file_name++; + + return (gchar *)file_name; + } + } +#endif + + /* Skip initial slashes */ + if (G_IS_DIR_SEPARATOR (file_name[0])) + { + while (G_IS_DIR_SEPARATOR (file_name[0])) + file_name++; + return (gchar *)file_name; + } + +#ifdef G_OS_WIN32 + /* Skip X:\ */ + if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':' && G_IS_DIR_SEPARATOR (file_name[2])) + return (gchar *)file_name + 3; +#endif + + return NULL; +} + +/** + * g_path_get_dirname: + * @file_name: the name of the file. + * + * Gets the directory components of a file name. If the file name has no + * directory components "." is returned. The returned string should be + * freed when no longer needed. + * + * Returns: the directory components of the file. + */ +gchar* +g_path_get_dirname (const gchar *file_name) +{ + register gchar *base; + register gsize len; + + g_return_val_if_fail (file_name != NULL, NULL); + + base = strrchr (file_name, G_DIR_SEPARATOR); +#ifdef G_OS_WIN32 + { + gchar *q = strrchr (file_name, '/'); + if (base == NULL || (q != NULL && q > base)) + base = q; + } +#endif + if (!base) + { +#ifdef G_OS_WIN32 + if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':') + { + gchar drive_colon_dot[4]; + + drive_colon_dot[0] = file_name[0]; + drive_colon_dot[1] = ':'; + drive_colon_dot[2] = '.'; + drive_colon_dot[3] = '\0'; + + return g_strdup (drive_colon_dot); + } +#endif + return g_strdup ("."); + } + + while (base > file_name && G_IS_DIR_SEPARATOR (*base)) + base--; + +#ifdef G_OS_WIN32 + /* base points to the char before the last slash. + * + * In case file_name is the root of a drive (X:\) or a child of the + * root of a drive (X:\foo), include the slash. + * + * In case file_name is the root share of an UNC path + * (\\server\share), add a slash, returning \\server\share\ . + * + * In case file_name is a direct child of a share in an UNC path + * (\\server\share\foo), include the slash after the share name, + * returning \\server\share\ . + */ + if (base == file_name + 1 && g_ascii_isalpha (file_name[0]) && file_name[1] == ':') + base++; + else if (G_IS_DIR_SEPARATOR (file_name[0]) && + G_IS_DIR_SEPARATOR (file_name[1]) && + file_name[2] && + !G_IS_DIR_SEPARATOR (file_name[2]) && + base >= file_name + 2) + { + const gchar *p = file_name + 2; + while (*p && !G_IS_DIR_SEPARATOR (*p)) + p++; + if (p == base + 1) + { + len = (guint) strlen (file_name) + 1; + base = g_new (gchar, len + 1); + strcpy (base, file_name); + base[len-1] = G_DIR_SEPARATOR; + base[len] = 0; + return base; + } + if (G_IS_DIR_SEPARATOR (*p)) + { + p++; + while (*p && !G_IS_DIR_SEPARATOR (*p)) + p++; + if (p == base + 1) + base++; + } + } +#endif + + len = (guint) 1 + base - file_name; + + base = g_new (gchar, len + 1); + g_memmove (base, file_name, len); + base[len] = 0; + + return base; +} + +/** + * g_get_current_dir: + * + * Gets the current directory. + * The returned string should be freed when no longer needed. The encoding + * of the returned string is system defined. On Windows, it is always UTF-8. + * + * Returns: the current directory. + */ +gchar* +g_get_current_dir (void) +{ +#ifdef G_OS_WIN32 + + gchar *dir = NULL; + wchar_t dummy[2], *wdir; + int len; + + len = GetCurrentDirectoryW (2, dummy); + wdir = g_new (wchar_t, len); + + if (GetCurrentDirectoryW (len, wdir) == len - 1) + dir = g_utf16_to_utf8 (wdir, -1, NULL, NULL, NULL); + + g_free (wdir); + + if (dir == NULL) + dir = g_strdup ("\\"); + + return dir; + +#else + + gchar *buffer = NULL; + gchar *dir = NULL; + static gulong max_len = 0; + + if (max_len == 0) + max_len = (G_PATH_LENGTH == -1) ? 2048 : G_PATH_LENGTH; + + /* We don't use getcwd(3) on SUNOS, because, it does a popen("pwd") + * and, if that wasn't bad enough, hangs in doing so. + */ +#if (defined (sun) && !defined (__SVR4)) || !defined(HAVE_GETCWD) + buffer = g_new (gchar, max_len + 1); + *buffer = 0; + dir = getwd (buffer); +#else /* !sun || !HAVE_GETCWD */ + while (max_len < G_MAXULONG / 2) + { + g_free (buffer); + buffer = g_new (gchar, max_len + 1); + *buffer = 0; + dir = getcwd (buffer, max_len); + + if (dir || errno != ERANGE) + break; + + max_len *= 2; + } +#endif /* !sun || !HAVE_GETCWD */ + + if (!dir || !*buffer) + { + /* hm, should we g_error() out here? + * this can happen if e.g. "./" has mode \0000 + */ + buffer[0] = G_DIR_SEPARATOR; + buffer[1] = 0; + } + + dir = g_strdup (buffer); + g_free (buffer); + + return dir; +#endif /* !Win32 */ +} + +/** + * g_getenv: + * @variable: the environment variable to get, in the GLib file name encoding. + * + * Returns the value of an environment variable. The name and value + * are in the GLib file name encoding. On UNIX, this means the actual + * bytes which might or might not be in some consistent character set + * and encoding. On Windows, it is in UTF-8. On Windows, in case the + * environment variable's value contains references to other + * environment variables, they are expanded. + * + * Return value: the value of the environment variable, or %NULL if + * the environment variable is not found. The returned string may be + * overwritten by the next call to g_getenv(), g_setenv() or + * g_unsetenv(). + **/ +G_CONST_RETURN gchar* +g_getenv (const gchar *variable) +{ +#ifndef G_OS_WIN32 + + g_return_val_if_fail (variable != NULL, NULL); + + return getenv (variable); + +#else /* G_OS_WIN32 */ + + GQuark quark; + gchar *value; + wchar_t dummy[2], *wname, *wvalue; + int len; + + g_return_val_if_fail (variable != NULL, NULL); + g_return_val_if_fail (g_utf8_validate (variable, -1, NULL), NULL); + + /* On Windows NT, it is relatively typical that environment + * variables contain references to other environment variables. If + * so, use ExpandEnvironmentStrings(). (In an ideal world, such + * environment variables would be stored in the Registry as + * REG_EXPAND_SZ type values, and would then get automatically + * expanded before a program sees them. But there is broken software + * that stores environment variables as REG_SZ values even if they + * contain references to other environment variables.) + */ + + wname = g_utf8_to_utf16 (variable, -1, NULL, NULL, NULL); + + len = GetEnvironmentVariableW (wname, dummy, 2); + + if (len == 0) + { + g_free (wname); + return NULL; + } + else if (len == 1) + len = 2; + + wvalue = g_new (wchar_t, len); + + if (GetEnvironmentVariableW (wname, wvalue, len) != len - 1) + { + g_free (wname); + g_free (wvalue); + return NULL; + } + + if (wcschr (wvalue, L'%') != NULL) + { + wchar_t *tem = wvalue; + + len = ExpandEnvironmentStringsW (wvalue, dummy, 2); + + if (len > 0) + { + wvalue = g_new (wchar_t, len); + + if (ExpandEnvironmentStringsW (tem, wvalue, len) != len) + { + g_free (wvalue); + wvalue = tem; + } + else + g_free (tem); + } + } + + value = g_utf16_to_utf8 (wvalue, -1, NULL, NULL, NULL); + + g_free (wname); + g_free (wvalue); + + quark = g_quark_from_string (value); + g_free (value); + + return g_quark_to_string (quark); + +#endif /* G_OS_WIN32 */ +} + +/* _g_getenv_nomalloc + * this function does a getenv() without doing any kind of allocation + * through glib. it's suitable for chars <= 127 only (both, for the + * variable name and the contents) and for contents < 1024 chars in + * length. also, it aliases "" to a NULL return value. + **/ +const gchar* +_g_getenv_nomalloc (const gchar *variable, + gchar buffer[1024]) +{ + const gchar *retval = getenv (variable); + if (retval && retval[0]) + { + gint l = strlen (retval); + if (l < 1024) + { + strncpy (buffer, retval, l); + buffer[l] = 0; + return buffer; + } + } + return NULL; +} + +/** + * g_setenv: + * @variable: the environment variable to set, must not contain '='. + * @value: the value for to set the variable to. + * @overwrite: whether to change the variable if it already exists. + * + * Sets an environment variable. Both the variable's name and value + * should be in the GLib file name encoding. On UNIX, this means that + * they can be any sequence of bytes. On Windows, they should be in + * UTF-8. + * + * Note that on some systems, when variables are overwritten, the memory + * used for the previous variables and its value isn't reclaimed. + * + * Returns: %FALSE if the environment variable couldn't be set. + * + * Since: 2.4 + */ +gboolean +g_setenv (const gchar *variable, + const gchar *value, + gboolean overwrite) +{ +#ifndef G_OS_WIN32 + + gint result; +#ifndef HAVE_SETENV + gchar *string; +#endif + + g_return_val_if_fail (variable != NULL, FALSE); + g_return_val_if_fail (strchr (variable, '=') == NULL, FALSE); + +#ifdef HAVE_SETENV + result = setenv (variable, value, overwrite); +#else + if (!overwrite && getenv (variable) != NULL) + return TRUE; + + /* This results in a leak when you overwrite existing + * settings. It would be fairly easy to fix this by keeping + * our own parallel array or hash table. + */ + string = g_strconcat (variable, "=", value, NULL); + result = putenv (string); +#endif + return result == 0; + +#else /* G_OS_WIN32 */ + + gboolean retval; + wchar_t *wname, *wvalue, *wassignment; + gchar *tem; + + g_return_val_if_fail (variable != NULL, FALSE); + g_return_val_if_fail (strchr (variable, '=') == NULL, FALSE); + g_return_val_if_fail (g_utf8_validate (variable, -1, NULL), FALSE); + g_return_val_if_fail (g_utf8_validate (value, -1, NULL), FALSE); + + if (!overwrite && g_getenv (variable) != NULL) + return TRUE; + + /* We want to (if possible) set both the environment variable copy + * kept by the C runtime and the one kept by the system. + * + * We can't use only the C runtime's putenv or _wputenv() as that + * won't work for arbitrary Unicode strings in a "non-Unicode" app + * (with main() and not wmain()). In a "main()" app the C runtime + * initializes the C runtime's environment table by converting the + * real (wide char) environment variables to system codepage, thus + * breaking those that aren't representable in the system codepage. + * + * As the C runtime's putenv() will also set the system copy, we do + * the putenv() first, then call SetEnvironmentValueW ourselves. + */ + + wname = g_utf8_to_utf16 (variable, -1, NULL, NULL, NULL); + wvalue = g_utf8_to_utf16 (value, -1, NULL, NULL, NULL); + tem = g_strconcat (variable, "=", value, NULL); + wassignment = g_utf8_to_utf16 (tem, -1, NULL, NULL, NULL); + + g_free (tem); + _wputenv (wassignment); + g_free (wassignment); + + retval = (SetEnvironmentVariableW (wname, wvalue) != 0); + + g_free (wname); + g_free (wvalue); + + return retval; + +#endif /* G_OS_WIN32 */ +} + +#ifdef HAVE__NSGETENVIRON +#define environ (*_NSGetEnviron()) +#elif !defined(G_OS_WIN32) + +/* According to the Single Unix Specification, environ is not in + * any system header, although unistd.h often declares it. + */ +extern char **environ; +#endif + +/** + * g_unsetenv: + * @variable: the environment variable to remove, must not contain '='. + * + * Removes an environment variable from the environment. + * + * Note that on some systems, when variables are overwritten, the memory + * used for the previous variables and its value isn't reclaimed. + * Furthermore, this function can't be guaranteed to operate in a + * threadsafe way. + * + * Since: 2.4 + **/ +void +g_unsetenv (const gchar *variable) +{ +#ifndef G_OS_WIN32 + +#ifdef HAVE_UNSETENV + g_return_if_fail (variable != NULL); + g_return_if_fail (strchr (variable, '=') == NULL); + + unsetenv (variable); +#else /* !HAVE_UNSETENV */ + int len; + gchar **e, **f; + + g_return_if_fail (variable != NULL); + g_return_if_fail (strchr (variable, '=') == NULL); + + len = strlen (variable); + + /* Mess directly with the environ array. + * This seems to be the only portable way to do this. + * + * Note that we remove *all* environment entries for + * the variable name, not just the first. + */ + e = f = environ; + while (*e != NULL) + { + if (strncmp (*e, variable, len) != 0 || (*e)[len] != '=') + { + *f = *e; + f++; + } + e++; + } + *f = NULL; +#endif /* !HAVE_UNSETENV */ + +#else /* G_OS_WIN32 */ + + wchar_t *wname, *wassignment; + gchar *tem; + + g_return_if_fail (variable != NULL); + g_return_if_fail (strchr (variable, '=') == NULL); + g_return_if_fail (g_utf8_validate (variable, -1, NULL)); + + wname = g_utf8_to_utf16 (variable, -1, NULL, NULL, NULL); + tem = g_strconcat (variable, "=", NULL); + wassignment = g_utf8_to_utf16 (tem, -1, NULL, NULL, NULL); + + g_free (tem); + _wputenv (wassignment); + g_free (wassignment); + + SetEnvironmentVariableW (wname, NULL); + + g_free (wname); + +#endif /* G_OS_WIN32 */ +} + +/** + * g_listenv: + * + * Gets the names of all variables set in the environment. + * + * Returns: a %NULL-terminated list of strings which must be freed + * with g_strfreev(). + * + * Programs that want to be portable to Windows should typically use + * this function and g_getenv() instead of using the environ array + * from the C library directly. On Windows, the strings in the environ + * array are in system codepage encoding, while in most of the typical + * use cases for environment variables in GLib-using programs you want + * the UTF-8 encoding that this function and g_getenv() provide. + * + * Since: 2.8 + */ +gchar ** +g_listenv (void) +{ +#ifndef G_OS_WIN32 + gchar **result, *eq; + gint len, i, j; + + len = g_strv_length (environ); + result = g_new0 (gchar *, len + 1); + + j = 0; + for (i = 0; i < len; i++) + { + eq = strchr (environ[i], '='); + if (eq) + result[j++] = g_strndup (environ[i], eq - environ[i]); + } + + result[j] = NULL; + + return result; +#else + gchar **result, *eq; + gint len = 0, j; + wchar_t *p, *q; + + p = (wchar_t *) GetEnvironmentStringsW (); + if (p != NULL) + { + q = p; + while (*q) + { + q += wcslen (q) + 1; + len++; + } + } + result = g_new0 (gchar *, len + 1); + + j = 0; + q = p; + while (*q) + { + result[j] = g_utf16_to_utf8 (q, -1, NULL, NULL, NULL); + if (result[j] != NULL) + { + eq = strchr (result[j], '='); + if (eq && eq > result[j]) + { + *eq = '\0'; + j++; + } + else + g_free (result[j]); + } + q += wcslen (q) + 1; + } + result[j] = NULL; + FreeEnvironmentStringsW (p); + + return result; +#endif +} + +G_LOCK_DEFINE_STATIC (g_utils_global); + +static gchar *g_tmp_dir = NULL; +static gchar *g_user_name = NULL; +static gchar *g_real_name = NULL; +static gchar *g_home_dir = NULL; +static gchar *g_host_name = NULL; + +#ifdef G_OS_WIN32 +/* System codepage versions of the above, kept at file level so that they, + * too, are produced only once. + */ +static gchar *g_tmp_dir_cp = NULL; +static gchar *g_user_name_cp = NULL; +static gchar *g_real_name_cp = NULL; +static gchar *g_home_dir_cp = NULL; +#endif + +static gchar *g_user_data_dir = NULL; +static gchar **g_system_data_dirs = NULL; +static gchar *g_user_cache_dir = NULL; +static gchar *g_user_config_dir = NULL; +static gchar **g_system_config_dirs = NULL; + +static gchar **g_user_special_dirs = NULL; + +/* fifteen minutes of fame for everybody */ +#define G_USER_DIRS_EXPIRE 15 * 60 + +#ifdef G_OS_WIN32 + +static gchar * +get_special_folder (int csidl) +{ + wchar_t path[MAX_PATH+1]; + HRESULT hr; + LPITEMIDLIST pidl = NULL; + BOOL b; + gchar *retval = NULL; + + hr = SHGetSpecialFolderLocation (NULL, csidl, &pidl); + if (hr == S_OK) + { + b = SHGetPathFromIDListW (pidl, path); + if (b) + retval = g_utf16_to_utf8 (path, -1, NULL, NULL, NULL); + CoTaskMemFree (pidl); + } + return retval; +} + +static char * +get_windows_directory_root (void) +{ + wchar_t wwindowsdir[MAX_PATH]; + + if (GetWindowsDirectoryW (wwindowsdir, G_N_ELEMENTS (wwindowsdir))) + { + /* Usually X:\Windows, but in terminal server environments + * might be an UNC path, AFAIK. + */ + char *windowsdir = g_utf16_to_utf8 (wwindowsdir, -1, NULL, NULL, NULL); + char *p; + + if (windowsdir == NULL) + return g_strdup ("C:\\"); + + p = (char *) g_path_skip_root (windowsdir); + if (G_IS_DIR_SEPARATOR (p[-1]) && p[-2] != ':') + p--; + *p = '\0'; + return windowsdir; + } + else + return g_strdup ("C:\\"); +} + +#endif + +/* HOLDS: g_utils_global_lock */ +static void +g_get_any_init_do (void) +{ + gchar hostname[100]; + + g_tmp_dir = g_strdup (g_getenv ("TMPDIR")); + if (!g_tmp_dir) + g_tmp_dir = g_strdup (g_getenv ("TMP")); + if (!g_tmp_dir) + g_tmp_dir = g_strdup (g_getenv ("TEMP")); + +#ifdef G_OS_WIN32 + if (!g_tmp_dir) + g_tmp_dir = get_windows_directory_root (); +#else +#ifdef P_tmpdir + if (!g_tmp_dir) + { + gsize k; + g_tmp_dir = g_strdup (P_tmpdir); + k = strlen (g_tmp_dir); + if (k > 1 && G_IS_DIR_SEPARATOR (g_tmp_dir[k - 1])) + g_tmp_dir[k - 1] = '\0'; + } +#endif + + if (!g_tmp_dir) + { + g_tmp_dir = g_strdup ("/tmp"); + } +#endif /* !G_OS_WIN32 */ + +#ifdef G_OS_WIN32 + /* We check $HOME first for Win32, though it is a last resort for Unix + * where we prefer the results of getpwuid(). + */ + g_home_dir = g_strdup (g_getenv ("HOME")); + + /* Only believe HOME if it is an absolute path and exists */ + if (g_home_dir) + { + if (!(g_path_is_absolute (g_home_dir) && + g_file_test (g_home_dir, G_FILE_TEST_IS_DIR))) + { + g_free (g_home_dir); + g_home_dir = NULL; + } + } + + /* In case HOME is Unix-style (it happens), convert it to + * Windows style. + */ + if (g_home_dir) + { + gchar *p; + while ((p = strchr (g_home_dir, '/')) != NULL) + *p = '\\'; + } + + if (!g_home_dir) + { + /* USERPROFILE is probably the closest equivalent to $HOME? */ + if (g_getenv ("USERPROFILE") != NULL) + g_home_dir = g_strdup (g_getenv ("USERPROFILE")); + } + + if (!g_home_dir) + g_home_dir = get_special_folder (CSIDL_PROFILE); + + if (!g_home_dir) + g_home_dir = get_windows_directory_root (); +#endif /* G_OS_WIN32 */ + +#ifdef HAVE_PWD_H + { + struct passwd *pw = NULL; + gpointer buffer = NULL; + gint error; + gchar *logname; + +# if defined (HAVE_POSIX_GETPWUID_R) || defined (HAVE_NONPOSIX_GETPWUID_R) + struct passwd pwd; +# ifdef _SC_GETPW_R_SIZE_MAX + /* This reurns the maximum length */ + glong bufsize = sysconf (_SC_GETPW_R_SIZE_MAX); + + if (bufsize < 0) + bufsize = 64; +# else /* _SC_GETPW_R_SIZE_MAX */ + glong bufsize = 64; +# endif /* _SC_GETPW_R_SIZE_MAX */ + + logname = (gchar *) g_getenv ("LOGNAME"); + + do + { + g_free (buffer); + /* we allocate 6 extra bytes to work around a bug in + * Mac OS < 10.3. See #156446 + */ + buffer = g_malloc (bufsize + 6); + errno = 0; + +# ifdef HAVE_POSIX_GETPWUID_R + if (logname) { + error = getpwnam_r (logname, &pwd, buffer, bufsize, &pw); + if (!pw || (pw->pw_uid != getuid ())) { + /* LOGNAME is lying, fall back to looking up the uid */ + error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw); + } + } else { + error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw); + } + error = error < 0 ? errno : error; +# else /* HAVE_NONPOSIX_GETPWUID_R */ + /* HPUX 11 falls into the HAVE_POSIX_GETPWUID_R case */ +# if defined(_AIX) || defined(__hpux) + error = getpwuid_r (getuid (), &pwd, buffer, bufsize); + pw = error == 0 ? &pwd : NULL; +# else /* !_AIX */ + if (logname) { + pw = getpwnam_r (logname, &pwd, buffer, bufsize); + if (!pw || (pw->pw_uid != getuid ())) { + /* LOGNAME is lying, fall back to looking up the uid */ + pw = getpwuid_r (getuid (), &pwd, buffer, bufsize); + } + } else { + pw = getpwuid_r (getuid (), &pwd, buffer, bufsize); + } + error = pw ? 0 : errno; +# endif /* !_AIX */ +# endif /* HAVE_NONPOSIX_GETPWUID_R */ + + if (!pw) + { + /* we bail out prematurely if the user id can't be found + * (should be pretty rare case actually), or if the buffer + * should be sufficiently big and lookups are still not + * successfull. + */ + if (error == 0 || error == ENOENT) + { + g_warning ("getpwuid_r(): failed due to unknown user id (%lu)", + (gulong) getuid ()); + break; + } + if (bufsize > 32 * 1024) + { + g_warning ("getpwuid_r(): failed due to: %s.", + g_strerror (error)); + break; + } + + bufsize *= 2; + } + } + while (!pw); +# endif /* HAVE_POSIX_GETPWUID_R || HAVE_NONPOSIX_GETPWUID_R */ + + if (!pw) + { + setpwent (); + pw = getpwuid (getuid ()); + endpwent (); + } + if (pw) + { + g_user_name = g_strdup (pw->pw_name); + + if (pw->pw_gecos && *pw->pw_gecos != '\0') + { + gchar **gecos_fields; + gchar **name_parts; + + /* split the gecos field and substitute '&' */ + gecos_fields = g_strsplit (pw->pw_gecos, ",", 0); + name_parts = g_strsplit (gecos_fields[0], "&", 0); + pw->pw_name[0] = g_ascii_toupper (pw->pw_name[0]); + g_real_name = g_strjoinv (pw->pw_name, name_parts); + g_strfreev (gecos_fields); + g_strfreev (name_parts); + } + + if (!g_home_dir) + g_home_dir = g_strdup (pw->pw_dir); + } + g_free (buffer); + } + +#else /* !HAVE_PWD_H */ + +#ifdef G_OS_WIN32 + { + guint len = UNLEN+1; + wchar_t buffer[UNLEN+1]; + + if (GetUserNameW (buffer, (LPDWORD) &len)) + { + g_user_name = g_utf16_to_utf8 (buffer, -1, NULL, NULL, NULL); + g_real_name = g_strdup (g_user_name); + } + } +#endif /* G_OS_WIN32 */ + +#endif /* !HAVE_PWD_H */ + +#ifndef G_OS_WIN32 + if (!g_home_dir) + g_home_dir = g_strdup (g_getenv ("HOME")); +#endif + +#ifdef __EMX__ + /* change '\\' in %HOME% to '/' */ + g_strdelimit (g_home_dir, "\\",'/'); +#endif + if (!g_user_name) + g_user_name = g_strdup ("somebody"); + if (!g_real_name) + g_real_name = g_strdup ("Unknown"); + + { +#ifndef G_OS_WIN32 + gboolean hostname_fail = (gethostname (hostname, sizeof (hostname)) == -1); +#else + DWORD size = sizeof (hostname); + gboolean hostname_fail = (!GetComputerName (hostname, &size)); +#endif + g_host_name = g_strdup (hostname_fail ? "localhost" : hostname); + } + +#ifdef G_OS_WIN32 + g_tmp_dir_cp = g_locale_from_utf8 (g_tmp_dir, -1, NULL, NULL, NULL); + g_user_name_cp = g_locale_from_utf8 (g_user_name, -1, NULL, NULL, NULL); + g_real_name_cp = g_locale_from_utf8 (g_real_name, -1, NULL, NULL, NULL); + + if (!g_tmp_dir_cp) + g_tmp_dir_cp = g_strdup ("\\"); + if (!g_user_name_cp) + g_user_name_cp = g_strdup ("somebody"); + if (!g_real_name_cp) + g_real_name_cp = g_strdup ("Unknown"); + + /* home_dir might be NULL, unlike tmp_dir, user_name and + * real_name. + */ + if (g_home_dir) + g_home_dir_cp = g_locale_from_utf8 (g_home_dir, -1, NULL, NULL, NULL); + else + g_home_dir_cp = NULL; +#endif /* G_OS_WIN32 */ +} + +static inline void +g_get_any_init (void) +{ + if (!g_tmp_dir) + g_get_any_init_do (); +} + +static inline void +g_get_any_init_locked (void) +{ + G_LOCK (g_utils_global); + g_get_any_init (); + G_UNLOCK (g_utils_global); +} + + +/** + * g_get_user_name: + * + * Gets the user name of the current user. The encoding of the returned + * string is system-defined. On UNIX, it might be the preferred file name + * encoding, or something else, and there is no guarantee that it is even + * consistent on a machine. On Windows, it is always UTF-8. + * + * Returns: the user name of the current user. + */ +G_CONST_RETURN gchar* +g_get_user_name (void) +{ + g_get_any_init_locked (); + return g_user_name; +} + +/** + * g_get_real_name: + * + * Gets the real name of the user. This usually comes from the user's entry + * in the passwd file. The encoding of the returned + * string is system-defined. (On Windows, it is, however, always UTF-8.) + * If the real user name cannot be determined, the string "Unknown" is + * returned. + * + * Returns: the user's real name. + */ +G_CONST_RETURN gchar* +g_get_real_name (void) +{ + g_get_any_init_locked (); + return g_real_name; +} + +/** + * g_get_home_dir: + * + * Gets the current user's home directory as defined in the + * password database. + * + * Note that in contrast to traditional UNIX tools, this function + * prefers passwd entries over the HOME + * environment variable. + * + * One of the reasons for this decision is that applications in many + * cases need special handling to deal with the case where + * HOME is + * + * Not owned by the user + * Not writeable + * Not even readable + * + * Since applications are in general not written + * to deal with these situations it was considered better to make + * g_get_home_dir() not pay attention to HOME and to + * return the real home directory for the user. If applications + * want to pay attention to HOME, they can do: + * |[ + * const char *homedir = g_getenv ("HOME"); + * if (!homedir) + * homedir = g_get_home_dir (); + * ]| + * + * Returns: the current user's home directory + */ +G_CONST_RETURN gchar* +g_get_home_dir (void) +{ + g_get_any_init_locked (); + return g_home_dir; +} + +/** + * g_get_tmp_dir: + * + * Gets the directory to use for temporary files. This is found from + * inspecting the environment variables TMPDIR, + * TMP, and TEMP in that order. If none + * of those are defined "/tmp" is returned on UNIX and "C:\" on Windows. + * The encoding of the returned string is system-defined. On Windows, + * it is always UTF-8. The return value is never %NULL. + * + * Returns: the directory to use for temporary files. + */ +G_CONST_RETURN gchar* +g_get_tmp_dir (void) +{ + g_get_any_init_locked (); + return g_tmp_dir; +} + +/** + * g_get_host_name: + * + * Return a name for the machine. + * + * The returned name is not necessarily a fully-qualified domain name, + * or even present in DNS or some other name service at all. It need + * not even be unique on your local network or site, but usually it + * is. Callers should not rely on the return value having any specific + * properties like uniqueness for security purposes. Even if the name + * of the machine is changed while an application is running, the + * return value from this function does not change. The returned + * string is owned by GLib and should not be modified or freed. If no + * name can be determined, a default fixed string "localhost" is + * returned. + * + * Returns: the host name of the machine. + * + * Since: 2.8 + */ +const gchar * +g_get_host_name (void) +{ + g_get_any_init_locked (); + return g_host_name; +} +#endif + +G_LOCK_DEFINE_STATIC (g_prgname); +static gchar *g_prgname = NULL; + +/** + * g_get_prgname: + * + * Gets the name of the program. This name should not + * be localized, contrast with g_get_application_name(). + * (If you are using GDK or GTK+ the program name is set in gdk_init(), + * which is called by gtk_init(). The program name is found by taking + * the last component of argv[0].) + * + * Returns: the name of the program. The returned string belongs + * to GLib and must not be modified or freed. + */ +gchar* +g_get_prgname (void) +{ + gchar* retval; + +return 0; +// G_LOCK (g_prgname); +//#ifdef G_OS_WIN32 +// if (g_prgname == NULL) +// { +// static gboolean beenhere = FALSE; +// +// if (!beenhere) +// { +// gchar *utf8_buf = NULL; +// wchar_t buf[MAX_PATH+1]; +// +// beenhere = TRUE; +// if (GetModuleFileNameW (GetModuleHandle (NULL), +// buf, G_N_ELEMENTS (buf)) > 0) +// utf8_buf = g_utf16_to_utf8 (buf, -1, NULL, NULL, NULL); +// +// if (utf8_buf) +// { +// g_prgname = g_path_get_basename (utf8_buf); +// g_free (utf8_buf); +// } +// } +// } +//#endif +// retval = g_prgname; +// G_UNLOCK (g_prgname); +// +// return retval; +} + +/** + * g_set_prgname: + * @prgname: the name of the program. + * + * Sets the name of the program. This name should not + * be localized, contrast with g_set_application_name(). Note that for + * thread-safety reasons this function can only be called once. + */ +void +g_set_prgname (const gchar *prgname) +{ + G_LOCK (g_prgname); + g_free (g_prgname); + g_prgname = g_strdup (prgname); + G_UNLOCK (g_prgname); +} + +#if NOT_NEEDED_FOR_NAVIT +G_LOCK_DEFINE_STATIC (g_application_name); +static gchar *g_application_name = NULL; + +/** + * g_get_application_name: + * + * Gets a human-readable name for the application, as set by + * g_set_application_name(). This name should be localized if + * possible, and is intended for display to the user. Contrast with + * g_get_prgname(), which gets a non-localized name. If + * g_set_application_name() has not been called, returns the result of + * g_get_prgname() (which may be %NULL if g_set_prgname() has also not + * been called). + * + * Return value: human-readable application name. may return %NULL + * + * Since: 2.2 + **/ +G_CONST_RETURN gchar* +g_get_application_name (void) +{ + gchar* retval; + + G_LOCK (g_application_name); + retval = g_application_name; + G_UNLOCK (g_application_name); + + if (retval == NULL) + return g_get_prgname (); + + return retval; +} + +/** + * g_set_application_name: + * @application_name: localized name of the application + * + * Sets a human-readable name for the application. This name should be + * localized if possible, and is intended for display to the user. + * Contrast with g_set_prgname(), which sets a non-localized name. + * g_set_prgname() will be called automatically by gtk_init(), + * but g_set_application_name() will not. + * + * Note that for thread safety reasons, this function can only + * be called once. + * + * The application name will be used in contexts such as error messages, + * or when displaying an application's name in the task list. + * + * Since: 2.2 + **/ +void +g_set_application_name (const gchar *application_name) +{ + gboolean already_set = FALSE; + + G_LOCK (g_application_name); + if (g_application_name) + already_set = TRUE; + else + g_application_name = g_strdup (application_name); + G_UNLOCK (g_application_name); + + if (already_set) + g_warning ("g_set_application() name called multiple times"); +} + +/** + * g_get_user_data_dir: + * + * Returns a base directory in which to access application data such + * as icons that is customized for a particular user. + * + * On UNIX platforms this is determined using the mechanisms described in + * the + * XDG Base Directory Specification + * + * Return value: a string owned by GLib that must not be modified + * or freed. + * Since: 2.6 + **/ +G_CONST_RETURN gchar* +g_get_user_data_dir (void) +{ + gchar *data_dir; + + G_LOCK (g_utils_global); + + if (!g_user_data_dir) + { +#ifdef G_OS_WIN32 + data_dir = get_special_folder (CSIDL_PERSONAL); +#else + data_dir = (gchar *) g_getenv ("XDG_DATA_HOME"); + + if (data_dir && data_dir[0]) + data_dir = g_strdup (data_dir); +#endif + if (!data_dir || !data_dir[0]) + { + g_get_any_init (); + + if (g_home_dir) + data_dir = g_build_filename (g_home_dir, ".local", + "share", NULL); + else + data_dir = g_build_filename (g_tmp_dir, g_user_name, ".local", + "share", NULL); + } + + g_user_data_dir = data_dir; + } + else + data_dir = g_user_data_dir; + + G_UNLOCK (g_utils_global); + + return data_dir; +} + +static void +g_init_user_config_dir (void) +{ + gchar *config_dir; + + if (!g_user_config_dir) + { +#ifdef G_OS_WIN32 + config_dir = get_special_folder (CSIDL_APPDATA); +#else + config_dir = (gchar *) g_getenv ("XDG_CONFIG_HOME"); + + if (config_dir && config_dir[0]) + config_dir = g_strdup (config_dir); +#endif + if (!config_dir || !config_dir[0]) + { + g_get_any_init (); + + if (g_home_dir) + config_dir = g_build_filename (g_home_dir, ".config", NULL); + else + config_dir = g_build_filename (g_tmp_dir, g_user_name, ".config", NULL); + } + + g_user_config_dir = config_dir; + } +} + +/** + * g_get_user_config_dir: + * + * Returns a base directory in which to store user-specific application + * configuration information such as user preferences and settings. + * + * On UNIX platforms this is determined using the mechanisms described in + * the + * XDG Base Directory Specification + * + * Return value: a string owned by GLib that must not be modified + * or freed. + * Since: 2.6 + **/ +G_CONST_RETURN gchar* +g_get_user_config_dir (void) +{ + G_LOCK (g_utils_global); + + g_init_user_config_dir (); + + G_UNLOCK (g_utils_global); + + return g_user_config_dir; +} + +/** + * g_get_user_cache_dir: + * + * Returns a base directory in which to store non-essential, cached + * data specific to particular user. + * + * On UNIX platforms this is determined using the mechanisms described in + * the + * XDG Base Directory Specification + * + * Return value: a string owned by GLib that must not be modified + * or freed. + * Since: 2.6 + **/ +G_CONST_RETURN gchar* +g_get_user_cache_dir (void) +{ + gchar *cache_dir; + + G_LOCK (g_utils_global); + + if (!g_user_cache_dir) + { +#ifdef G_OS_WIN32 + cache_dir = get_special_folder (CSIDL_INTERNET_CACHE); /* XXX correct? */ +#else + cache_dir = (gchar *) g_getenv ("XDG_CACHE_HOME"); + + if (cache_dir && cache_dir[0]) + cache_dir = g_strdup (cache_dir); +#endif + if (!cache_dir || !cache_dir[0]) + { + g_get_any_init (); + + if (g_home_dir) + cache_dir = g_build_filename (g_home_dir, ".cache", NULL); + else + cache_dir = g_build_filename (g_tmp_dir, g_user_name, ".cache", NULL); + } + g_user_cache_dir = cache_dir; + } + else + cache_dir = g_user_cache_dir; + + G_UNLOCK (g_utils_global); + + return cache_dir; +} + +#ifdef HAVE_CARBON + +static gchar * +find_folder (OSType type) +{ + gchar *filename = NULL; + FSRef found; + + if (FSFindFolder (kUserDomain, type, kDontCreateFolder, &found) == noErr) + { + CFURLRef url = CFURLCreateFromFSRef (kCFAllocatorSystemDefault, &found); + + if (url) + { + CFStringRef path = CFURLCopyFileSystemPath (url, kCFURLPOSIXPathStyle); + + if (path) + { + filename = g_strdup (CFStringGetCStringPtr (path, kCFStringEncodingUTF8)); + + if (! filename) + { + filename = g_new0 (gchar, CFStringGetLength (path) * 3 + 1); + + CFStringGetCString (path, filename, + CFStringGetLength (path) * 3 + 1, + kCFStringEncodingUTF8); + } + + CFRelease (path); + } + + CFRelease (url); + } + } + + return filename; +} + +static void +load_user_special_dirs (void) +{ + g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] = find_folder (kDesktopFolderType); + g_user_special_dirs[G_USER_DIRECTORY_DOCUMENTS] = find_folder (kDocumentsFolderType); + g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = find_folder (kDesktopFolderType); /* XXX correct ? */ + g_user_special_dirs[G_USER_DIRECTORY_MUSIC] = find_folder (kMusicDocumentsFolderType); + g_user_special_dirs[G_USER_DIRECTORY_PICTURES] = find_folder (kPictureDocumentsFolderType); + g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = NULL; + g_user_special_dirs[G_USER_DIRECTORY_TEMPLATES] = NULL; + g_user_special_dirs[G_USER_DIRECTORY_VIDEOS] = find_folder (kMovieDocumentsFolderType); +} + +#endif /* HAVE_CARBON */ + +#if defined(G_OS_WIN32) +static void +load_user_special_dirs (void) +{ + typedef HRESULT (WINAPI *t_SHGetKnownFolderPath) (const GUID *rfid, + DWORD dwFlags, + HANDLE hToken, + PWSTR *ppszPath); + t_SHGetKnownFolderPath p_SHGetKnownFolderPath; + static const GUID FOLDERID_Downloads = + { 0x374de290, 0x123f, 0x4565, { 0x91, 0x64, 0x39, 0xc4, 0x92, 0x5e, 0x46, 0x7b } }; + static const GUID FOLDERID_Public = + { 0xDFDF76A2, 0xC82A, 0x4D63, { 0x90, 0x6A, 0x56, 0x44, 0xAC, 0x45, 0x73, 0x85 } }; + wchar_t *wcp; + + p_SHGetKnownFolderPath = (t_SHGetKnownFolderPath) GetProcAddress (LoadLibrary ("shell32.dll"), + "SHGetKnownFolderPath"); + + g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] = get_special_folder (CSIDL_DESKTOPDIRECTORY); + g_user_special_dirs[G_USER_DIRECTORY_DOCUMENTS] = get_special_folder (CSIDL_PERSONAL); + + if (p_SHGetKnownFolderPath == NULL) + { + g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = get_special_folder (CSIDL_DESKTOPDIRECTORY); + } + else + { + wcp = NULL; + (*p_SHGetKnownFolderPath) (&FOLDERID_Downloads, 0, NULL, &wcp); + g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = g_utf16_to_utf8 (wcp, -1, NULL, NULL, NULL); + if (g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] == NULL) + g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = get_special_folder (CSIDL_DESKTOPDIRECTORY); + CoTaskMemFree (wcp); + } + + g_user_special_dirs[G_USER_DIRECTORY_MUSIC] = get_special_folder (CSIDL_MYMUSIC); + g_user_special_dirs[G_USER_DIRECTORY_PICTURES] = get_special_folder (CSIDL_MYPICTURES); + + if (p_SHGetKnownFolderPath == NULL) + { + /* XXX */ + g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = get_special_folder (CSIDL_COMMON_DOCUMENTS); + } + else + { + wcp = NULL; + (*p_SHGetKnownFolderPath) (&FOLDERID_Public, 0, NULL, &wcp); + g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = g_utf16_to_utf8 (wcp, -1, NULL, NULL, NULL); + if (g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] == NULL) + g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = get_special_folder (CSIDL_COMMON_DOCUMENTS); + CoTaskMemFree (wcp); + } + + g_user_special_dirs[G_USER_DIRECTORY_TEMPLATES] = get_special_folder (CSIDL_TEMPLATES); + g_user_special_dirs[G_USER_DIRECTORY_VIDEOS] = get_special_folder (CSIDL_MYVIDEO); +} +#endif /* G_OS_WIN32 */ + +static void g_init_user_config_dir (void); + +#if defined(G_OS_UNIX) && !defined(HAVE_CARBON) + +/* adapted from xdg-user-dir-lookup.c + * + * Copyright (C) 2007 Red Hat Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +static void +load_user_special_dirs (void) +{ + gchar *config_file; + gchar *data; + gchar **lines; + gint n_lines, i; + + g_init_user_config_dir (); + config_file = g_build_filename (g_user_config_dir, + "user-dirs.dirs", + NULL); + + if (!g_file_get_contents (config_file, &data, NULL, NULL)) + { + g_free (config_file); + return; + } + + lines = g_strsplit (data, "\n", -1); + n_lines = g_strv_length (lines); + g_free (data); + + for (i = 0; i < n_lines; i++) + { + gchar *buffer = lines[i]; + gchar *d, *p; + gint len; + gboolean is_relative = FALSE; + GUserDirectory directory; + + /* Remove newline at end */ + len = strlen (buffer); + if (len > 0 && buffer[len - 1] == '\n') + buffer[len - 1] = 0; + + p = buffer; + while (*p == ' ' || *p == '\t') + p++; + + if (strncmp (p, "XDG_DESKTOP_DIR", strlen ("XDG_DESKTOP_DIR")) == 0) + { + directory = G_USER_DIRECTORY_DESKTOP; + p += strlen ("XDG_DESKTOP_DIR"); + } + else if (strncmp (p, "XDG_DOCUMENTS_DIR", strlen ("XDG_DOCUMENTS_DIR")) == 0) + { + directory = G_USER_DIRECTORY_DOCUMENTS; + p += strlen ("XDG_DOCUMENTS_DIR"); + } + else if (strncmp (p, "XDG_DOWNLOAD_DIR", strlen ("XDG_DOWNLOAD_DIR")) == 0) + { + directory = G_USER_DIRECTORY_DOWNLOAD; + p += strlen ("XDG_DOWNLOAD_DIR"); + } + else if (strncmp (p, "XDG_MUSIC_DIR", strlen ("XDG_MUSIC_DIR")) == 0) + { + directory = G_USER_DIRECTORY_MUSIC; + p += strlen ("XDG_MUSIC_DIR"); + } + else if (strncmp (p, "XDG_PICTURES_DIR", strlen ("XDG_PICTURES_DIR")) == 0) + { + directory = G_USER_DIRECTORY_PICTURES; + p += strlen ("XDG_PICTURES_DIR"); + } + else if (strncmp (p, "XDG_PUBLICSHARE_DIR", strlen ("XDG_PUBLICSHARE_DIR")) == 0) + { + directory = G_USER_DIRECTORY_PUBLIC_SHARE; + p += strlen ("XDG_PUBLICSHARE_DIR"); + } + else if (strncmp (p, "XDG_TEMPLATES_DIR", strlen ("XDG_TEMPLATES_DIR")) == 0) + { + directory = G_USER_DIRECTORY_TEMPLATES; + p += strlen ("XDG_TEMPLATES_DIR"); + } + else if (strncmp (p, "XDG_VIDEOS_DIR", strlen ("XDG_VIDEOS_DIR")) == 0) + { + directory = G_USER_DIRECTORY_VIDEOS; + p += strlen ("XDG_VIDEOS_DIR"); + } + else + continue; + + while (*p == ' ' || *p == '\t') + p++; + + if (*p != '=') + continue; + p++; + + while (*p == ' ' || *p == '\t') + p++; + + if (*p != '"') + continue; + p++; + + if (strncmp (p, "$HOME", 5) == 0) + { + p += 5; + is_relative = TRUE; + } + else if (*p != '/') + continue; + + d = strrchr (p, '"'); + if (!d) + continue; + *d = 0; + + d = p; + + /* remove trailing slashes */ + len = strlen (d); + if (d[len - 1] == '/') + d[len - 1] = 0; + + if (is_relative) + { + g_get_any_init (); + g_user_special_dirs[directory] = g_build_filename (g_home_dir, d, NULL); + } + else + g_user_special_dirs[directory] = g_strdup (d); + } + + g_strfreev (lines); + g_free (config_file); +} + +#endif /* G_OS_UNIX && !HAVE_CARBON */ + +/** + * g_get_user_special_dir: + * @directory: the logical id of special directory + * + * Returns the full path of a special directory using its logical id. + * + * On Unix this is done using the XDG special user directories. + * For compatibility with existing practise, %G_USER_DIRECTORY_DESKTOP + * falls back to $HOME/Desktop when XDG special + * user directories have not been set up. + * + * Depending on the platform, the user might be able to change the path + * of the special directory without requiring the session to restart; GLib + * will not reflect any change once the special directories are loaded. + * + * Return value: the path to the specified special directory, or %NULL + * if the logical id was not found. The returned string is owned by + * GLib and should not be modified or freed. + * + * Since: 2.14 + */ +G_CONST_RETURN gchar * +g_get_user_special_dir (GUserDirectory directory) +{ + g_return_val_if_fail (directory >= G_USER_DIRECTORY_DESKTOP && + directory < G_USER_N_DIRECTORIES, NULL); + + G_LOCK (g_utils_global); + + if (G_UNLIKELY (g_user_special_dirs == NULL)) + { + g_user_special_dirs = g_new0 (gchar *, G_USER_N_DIRECTORIES); + + load_user_special_dirs (); + + /* Special-case desktop for historical compatibility */ + if (g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] == NULL) + { + g_get_any_init (); + + g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] = + g_build_filename (g_home_dir, "Desktop", NULL); + } + } + + G_UNLOCK (g_utils_global); + + return g_user_special_dirs[directory]; +} + +#ifdef G_OS_WIN32 + +#undef g_get_system_data_dirs + +static HMODULE +get_module_for_address (gconstpointer address) +{ + /* Holds the g_utils_global lock */ + + static gboolean beenhere = FALSE; + typedef BOOL (WINAPI *t_GetModuleHandleExA) (DWORD, LPCTSTR, HMODULE *); + static t_GetModuleHandleExA p_GetModuleHandleExA = NULL; + HMODULE hmodule = NULL; + + if (!address) + return NULL; + + if (!beenhere) + { + p_GetModuleHandleExA = + (t_GetModuleHandleExA) GetProcAddress (LoadLibrary ("kernel32.dll"), + "GetModuleHandleExA"); + beenhere = TRUE; + } + + if (p_GetModuleHandleExA == NULL || + !(*p_GetModuleHandleExA) (GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT | + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, + address, &hmodule)) + { + MEMORY_BASIC_INFORMATION mbi; + VirtualQuery (address, &mbi, sizeof (mbi)); + hmodule = (HMODULE) mbi.AllocationBase; + } + + return hmodule; +} + +static gchar * +get_module_share_dir (gconstpointer address) +{ + HMODULE hmodule; + gchar *filename; + gchar *retval; + + hmodule = get_module_for_address (address); + if (hmodule == NULL) + return NULL; + + filename = g_win32_get_package_installation_directory_of_module (hmodule); + retval = g_build_filename (filename, "share", NULL); + g_free (filename); + + return retval; +} + +G_CONST_RETURN gchar * G_CONST_RETURN * +g_win32_get_system_data_dirs_for_module (gconstpointer address) +{ + GArray *data_dirs; + HMODULE hmodule; + static GHashTable *per_module_data_dirs = NULL; + gchar **retval; + gchar *p; + gchar *exe_root; + + if (address) + { + G_LOCK (g_utils_global); + hmodule = get_module_for_address (address); + if (hmodule != NULL) + { + if (per_module_data_dirs == NULL) + per_module_data_dirs = g_hash_table_new (NULL, NULL); + else + { + retval = g_hash_table_lookup (per_module_data_dirs, hmodule); + + if (retval != NULL) + { + G_UNLOCK (g_utils_global); + return (G_CONST_RETURN gchar * G_CONST_RETURN *) retval; + } + } + } + } + + data_dirs = g_array_new (TRUE, TRUE, sizeof (char *)); + + /* Documents and Settings\All Users\Application Data */ + p = get_special_folder (CSIDL_COMMON_APPDATA); + if (p) + g_array_append_val (data_dirs, p); + + /* Documents and Settings\All Users\Documents */ + p = get_special_folder (CSIDL_COMMON_DOCUMENTS); + if (p) + g_array_append_val (data_dirs, p); + + /* Using the above subfolders of Documents and Settings perhaps + * makes sense from a Windows perspective. + * + * But looking at the actual use cases of this function in GTK+ + * and GNOME software, what we really want is the "share" + * subdirectory of the installation directory for the package + * our caller is a part of. + * + * The address parameter, if non-NULL, points to a function in the + * calling module. Use that to determine that module's installation + * folder, and use its "share" subfolder. + * + * Additionally, also use the "share" subfolder of the installation + * locations of GLib and the .exe file being run. + * + * To guard against none of the above being what is really wanted, + * callers of this function should have Win32-specific code to look + * up their installation folder themselves, and handle a subfolder + * "share" of it in the same way as the folders returned from this + * function. + */ + + p = get_module_share_dir (address); + if (p) + g_array_append_val (data_dirs, p); + + if (glib_dll != NULL) + { + gchar *glib_root = g_win32_get_package_installation_directory_of_module (glib_dll); + p = g_build_filename (glib_root, "share", NULL); + if (p) + g_array_append_val (data_dirs, p); + g_free (glib_root); + } + + exe_root = g_win32_get_package_installation_directory_of_module (NULL); + p = g_build_filename (exe_root, "share", NULL); + if (p) + g_array_append_val (data_dirs, p); + g_free (exe_root); + + retval = (gchar **) g_array_free (data_dirs, FALSE); + + if (address) + { + if (hmodule != NULL) + g_hash_table_insert (per_module_data_dirs, hmodule, retval); + G_UNLOCK (g_utils_global); + } + + return (G_CONST_RETURN gchar * G_CONST_RETURN *) retval; +} + +#endif + +/** + * g_get_system_data_dirs: + * + * Returns an ordered list of base directories in which to access + * system-wide application data. + * + * On UNIX platforms this is determined using the mechanisms described in + * the + * XDG Base Directory Specification + * + * On Windows the first elements in the list are the Application Data + * and Documents folders for All Users. (These can be determined only + * on Windows 2000 or later and are not present in the list on other + * Windows versions.) See documentation for CSIDL_COMMON_APPDATA and + * CSIDL_COMMON_DOCUMENTS. + * + * Then follows the "share" subfolder in the installation folder for + * the package containing the DLL that calls this function, if it can + * be determined. + * + * Finally the list contains the "share" subfolder in the installation + * folder for GLib, and in the installation folder for the package the + * application's .exe file belongs to. + * + * The installation folders above are determined by looking up the + * folder where the module (DLL or EXE) in question is located. If the + * folder's name is "bin", its parent is used, otherwise the folder + * itself. + * + * Note that on Windows the returned list can vary depending on where + * this function is called. + * + * Return value: a %NULL-terminated array of strings owned by GLib that must + * not be modified or freed. + * Since: 2.6 + **/ +G_CONST_RETURN gchar * G_CONST_RETURN * +g_get_system_data_dirs (void) +{ + gchar **data_dir_vector; + + G_LOCK (g_utils_global); + + if (!g_system_data_dirs) + { +#ifdef G_OS_WIN32 + data_dir_vector = (gchar **) g_win32_get_system_data_dirs_for_module (NULL); +#else + gchar *data_dirs = (gchar *) g_getenv ("XDG_DATA_DIRS"); + + if (!data_dirs || !data_dirs[0]) + data_dirs = "/usr/local/share/:/usr/share/"; + + data_dir_vector = g_strsplit (data_dirs, G_SEARCHPATH_SEPARATOR_S, 0); +#endif + + g_system_data_dirs = data_dir_vector; + } + else + data_dir_vector = g_system_data_dirs; + + G_UNLOCK (g_utils_global); + + return (G_CONST_RETURN gchar * G_CONST_RETURN *) data_dir_vector; +} + +/** + * g_get_system_config_dirs: + * + * Returns an ordered list of base directories in which to access + * system-wide configuration information. + * + * On UNIX platforms this is determined using the mechanisms described in + * the + * XDG Base Directory Specification + * + * Return value: a %NULL-terminated array of strings owned by GLib that must + * not be modified or freed. + * Since: 2.6 + **/ +G_CONST_RETURN gchar * G_CONST_RETURN * +g_get_system_config_dirs (void) +{ + gchar *conf_dirs, **conf_dir_vector; + + G_LOCK (g_utils_global); + + if (!g_system_config_dirs) + { +#ifdef G_OS_WIN32 + conf_dirs = get_special_folder (CSIDL_COMMON_APPDATA); + if (conf_dirs) + { + conf_dir_vector = g_strsplit (conf_dirs, G_SEARCHPATH_SEPARATOR_S, 0); + g_free (conf_dirs); + } + else + { + /* Return empty list */ + conf_dir_vector = g_strsplit ("", G_SEARCHPATH_SEPARATOR_S, 0); + } +#else + conf_dirs = (gchar *) g_getenv ("XDG_CONFIG_DIRS"); + + if (!conf_dirs || !conf_dirs[0]) + conf_dirs = "/etc/xdg"; + + conf_dir_vector = g_strsplit (conf_dirs, G_SEARCHPATH_SEPARATOR_S, 0); +#endif + + g_system_config_dirs = conf_dir_vector; + } + else + conf_dir_vector = g_system_config_dirs; + G_UNLOCK (g_utils_global); + + return (G_CONST_RETURN gchar * G_CONST_RETURN *) conf_dir_vector; +} + +#ifndef G_OS_WIN32 + +static GHashTable *alias_table = NULL; + +/* read an alias file for the locales */ +static void +read_aliases (gchar *file) +{ + FILE *fp; + char buf[256]; + + if (!alias_table) + alias_table = g_hash_table_new (g_str_hash, g_str_equal); + fp = fopen (file,"r"); + if (!fp) + return; + while (fgets (buf, 256, fp)) + { + char *p, *q; + + g_strstrip (buf); + + /* Line is a comment */ + if ((buf[0] == '#') || (buf[0] == '\0')) + continue; + + /* Reads first column */ + for (p = buf, q = NULL; *p; p++) { + if ((*p == '\t') || (*p == ' ') || (*p == ':')) { + *p = '\0'; + q = p+1; + while ((*q == '\t') || (*q == ' ')) { + q++; + } + break; + } + } + /* The line only had one column */ + if (!q || *q == '\0') + continue; + + /* Read second column */ + for (p = q; *p; p++) { + if ((*p == '\t') || (*p == ' ')) { + *p = '\0'; + break; + } + } + + /* Add to alias table if necessary */ + if (!g_hash_table_lookup (alias_table, buf)) { + g_hash_table_insert (alias_table, g_strdup (buf), g_strdup (q)); + } + } + fclose (fp); +} + +#endif + +static char * +unalias_lang (char *lang) +{ +#ifndef G_OS_WIN32 + char *p; + int i; + + if (!alias_table) + read_aliases ("/usr/share/locale/locale.alias"); + + i = 0; + while ((p = g_hash_table_lookup (alias_table, lang)) && (strcmp (p, lang) != 0)) + { + lang = p; + if (i++ == 30) + { + static gboolean said_before = FALSE; + if (!said_before) + g_warning ("Too many alias levels for a locale, " + "may indicate a loop"); + said_before = TRUE; + return lang; + } + } +#endif + return lang; +} + +/* Mask for components of locale spec. The ordering here is from + * least significant to most significant + */ +enum +{ + COMPONENT_CODESET = 1 << 0, + COMPONENT_TERRITORY = 1 << 1, + COMPONENT_MODIFIER = 1 << 2 +}; + +/* Break an X/Open style locale specification into components + */ +static guint +explode_locale (const gchar *locale, + gchar **language, + gchar **territory, + gchar **codeset, + gchar **modifier) +{ + const gchar *uscore_pos; + const gchar *at_pos; + const gchar *dot_pos; + + guint mask = 0; + + uscore_pos = strchr (locale, '_'); + dot_pos = strchr (uscore_pos ? uscore_pos : locale, '.'); + at_pos = strchr (dot_pos ? dot_pos : (uscore_pos ? uscore_pos : locale), '@'); + + if (at_pos) + { + mask |= COMPONENT_MODIFIER; + *modifier = g_strdup (at_pos); + } + else + at_pos = locale + strlen (locale); + + if (dot_pos) + { + mask |= COMPONENT_CODESET; + *codeset = g_strndup (dot_pos, at_pos - dot_pos); + } + else + dot_pos = at_pos; + + if (uscore_pos) + { + mask |= COMPONENT_TERRITORY; + *territory = g_strndup (uscore_pos, dot_pos - uscore_pos); + } + else + uscore_pos = dot_pos; + + *language = g_strndup (locale, uscore_pos - locale); + + return mask; +} + +/* + * Compute all interesting variants for a given locale name - + * by stripping off different components of the value. + * + * For simplicity, we assume that the locale is in + * X/Open format: language[_territory][.codeset][@modifier] + * + * TODO: Extend this to handle the CEN format (see the GNUlibc docs) + * as well. We could just copy the code from glibc wholesale + * but it is big, ugly, and complicated, so I'm reluctant + * to do so when this should handle 99% of the time... + */ +GSList * +_g_compute_locale_variants (const gchar *locale) +{ + GSList *retval = NULL; + + gchar *language = NULL; + gchar *territory = NULL; + gchar *codeset = NULL; + gchar *modifier = NULL; + + guint mask; + guint i; + + g_return_val_if_fail (locale != NULL, NULL); + + mask = explode_locale (locale, &language, &territory, &codeset, &modifier); + + /* Iterate through all possible combinations, from least attractive + * to most attractive. + */ + for (i = 0; i <= mask; i++) + if ((i & ~mask) == 0) + { + gchar *val = g_strconcat (language, + (i & COMPONENT_TERRITORY) ? territory : "", + (i & COMPONENT_CODESET) ? codeset : "", + (i & COMPONENT_MODIFIER) ? modifier : "", + NULL); + retval = g_slist_prepend (retval, val); + } + + g_free (language); + if (mask & COMPONENT_CODESET) + g_free (codeset); + if (mask & COMPONENT_TERRITORY) + g_free (territory); + if (mask & COMPONENT_MODIFIER) + g_free (modifier); + + return retval; +} + +/* The following is (partly) taken from the gettext package. + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. */ + +static const gchar * +guess_category_value (const gchar *category_name) +{ + const gchar *retval; + + /* The highest priority value is the `LANGUAGE' environment + variable. This is a GNU extension. */ + retval = g_getenv ("LANGUAGE"); + if ((retval != NULL) && (retval[0] != '\0')) + return retval; + + /* `LANGUAGE' is not set. So we have to proceed with the POSIX + methods of looking to `LC_ALL', `LC_xxx', and `LANG'. On some + systems this can be done by the `setlocale' function itself. */ + + /* Setting of LC_ALL overwrites all other. */ + retval = g_getenv ("LC_ALL"); + if ((retval != NULL) && (retval[0] != '\0')) + return retval; + + /* Next comes the name of the desired category. */ + retval = g_getenv (category_name); + if ((retval != NULL) && (retval[0] != '\0')) + return retval; + + /* Last possibility is the LANG environment variable. */ + retval = g_getenv ("LANG"); + if ((retval != NULL) && (retval[0] != '\0')) + return retval; + +#ifdef G_PLATFORM_WIN32 + /* g_win32_getlocale() first checks for LC_ALL, LC_MESSAGES and + * LANG, which we already did above. Oh well. The main point of + * calling g_win32_getlocale() is to get the thread's locale as used + * by Windows and the Microsoft C runtime (in the "English_United + * States" format) translated into the Unixish format. + */ + retval = g_win32_getlocale (); + if ((retval != NULL) && (retval[0] != '\0')) + return retval; +#endif + + return NULL; +} + +typedef struct _GLanguageNamesCache GLanguageNamesCache; + +struct _GLanguageNamesCache { + gchar *languages; + gchar **language_names; +}; + +static void +language_names_cache_free (gpointer data) +{ + GLanguageNamesCache *cache = data; + g_free (cache->languages); + g_strfreev (cache->language_names); + g_free (cache); +} + +/** + * g_get_language_names: + * + * Computes a list of applicable locale names, which can be used to + * e.g. construct locale-dependent filenames or search paths. The returned + * list is sorted from most desirable to least desirable and always contains + * the default locale "C". + * + * For example, if LANGUAGE=de:en_US, then the returned list is + * "de", "en_US", "en", "C". + * + * This function consults the environment variables LANGUAGE, + * LC_ALL, LC_MESSAGES and LANG + * to find the list of locales specified by the user. + * + * Return value: a %NULL-terminated array of strings owned by GLib + * that must not be modified or freed. + * + * Since: 2.6 + **/ +G_CONST_RETURN gchar * G_CONST_RETURN * +g_get_language_names (void) +{ + static GStaticPrivate cache_private = G_STATIC_PRIVATE_INIT; + GLanguageNamesCache *cache = g_static_private_get (&cache_private); + const gchar *value; + + if (!cache) + { + cache = g_new0 (GLanguageNamesCache, 1); + g_static_private_set (&cache_private, cache, language_names_cache_free); + } + + value = guess_category_value ("LC_MESSAGES"); + if (!value) + value = "C"; + + if (!(cache->languages && strcmp (cache->languages, value) == 0)) + { + gchar **languages; + gchar **alist, **a; + GSList *list, *l; + gint i; + + g_free (cache->languages); + g_strfreev (cache->language_names); + cache->languages = g_strdup (value); + + alist = g_strsplit (value, ":", 0); + list = NULL; + for (a = alist; *a; a++) + { + gchar *b = unalias_lang (*a); + list = g_slist_concat (list, _g_compute_locale_variants (b)); + } + g_strfreev (alist); + list = g_slist_append (list, g_strdup ("C")); + + cache->language_names = languages = g_new (gchar *, g_slist_length (list) + 1); + for (l = list, i = 0; l; l = l->next, i++) + languages[i] = l->data; + languages[i] = NULL; + + g_slist_free (list); + } + + return (G_CONST_RETURN gchar * G_CONST_RETURN *) cache->language_names; +} + +#endif /* NOT_NEEDED_FOR_NAVIT */ +/** + * g_direct_hash: + * @v: a #gpointer key + * + * Converts a gpointer to a hash value. + * It can be passed to g_hash_table_new() as the @hash_func parameter, + * when using pointers as keys in a #GHashTable. + * + * Returns: a hash value corresponding to the key. + */ +guint +g_direct_hash (gconstpointer v) +{ + return GPOINTER_TO_UINT (v); +} + +/** + * g_direct_equal: + * @v1: a key. + * @v2: a key to compare with @v1. + * + * Compares two #gpointer arguments and returns %TRUE if they are equal. + * It can be passed to g_hash_table_new() as the @key_equal_func + * parameter, when using pointers as keys in a #GHashTable. + * + * Returns: %TRUE if the two keys match. + */ +gboolean +g_direct_equal (gconstpointer v1, + gconstpointer v2) +{ + return v1 == v2; +} + +/** + * g_int_equal: + * @v1: a pointer to a #gint key. + * @v2: a pointer to a #gint key to compare with @v1. + * + * Compares the two #gint values being pointed to and returns + * %TRUE if they are equal. + * It can be passed to g_hash_table_new() as the @key_equal_func + * parameter, when using pointers to integers as keys in a #GHashTable. + * + * Returns: %TRUE if the two keys match. + */ +gboolean +g_int_equal (gconstpointer v1, + gconstpointer v2) +{ + return *((const gint*) v1) == *((const gint*) v2); +} + +/** + * g_int_hash: + * @v: a pointer to a #gint key + * + * Converts a pointer to a #gint to a hash value. + * It can be passed to g_hash_table_new() as the @hash_func parameter, + * when using pointers to integers values as keys in a #GHashTable. + * + * Returns: a hash value corresponding to the key. + */ +guint +g_int_hash (gconstpointer v) +{ + return *(const gint*) v; +} + +#if NOT_NEEDED_FOR_NAVIT +/** + * g_nullify_pointer: + * @nullify_location: the memory address of the pointer. + * + * Set the pointer at the specified location to %NULL. + **/ +void +g_nullify_pointer (gpointer *nullify_location) +{ + g_return_if_fail (nullify_location != NULL); + + *nullify_location = NULL; +} + +/** + * g_get_codeset: + * + * Get the codeset for the current locale. + * + * Return value: a newly allocated string containing the name + * of the codeset. This string must be freed with g_free(). + **/ +gchar * +g_get_codeset (void) +{ + const gchar *charset; + + g_get_charset (&charset); + + return g_strdup (charset); +} + +/* This is called from g_thread_init(). It's used to + * initialize some static data in a threadsafe way. + */ +void +_g_utils_thread_init (void) +{ + g_get_language_names (); +} + +#ifdef G_OS_WIN32 + +/** + * _glib_get_locale_dir: + * + * Return the path to the share\locale or lib\locale subfolder of the + * GLib installation folder. The path is in the system codepage. We + * have to use system codepage as bindtextdomain() doesn't have a + * UTF-8 interface. + */ +static gchar * +_glib_get_locale_dir (void) +{ + gchar *install_dir = NULL, *locale_dir; + gchar *retval = NULL; + + if (glib_dll != NULL) + install_dir = g_win32_get_package_installation_directory_of_module (glib_dll); + + if (install_dir) + { + /* + * Append "/share/locale" or "/lib/locale" depending on whether + * autoconfigury detected GNU gettext or not. + */ + const char *p = GLIB_LOCALE_DIR + strlen (GLIB_LOCALE_DIR); + while (*--p != '/') + ; + while (*--p != '/') + ; + + locale_dir = g_build_filename (install_dir, p, NULL); + + retval = g_win32_locale_filename_from_utf8 (locale_dir); + + g_free (install_dir); + g_free (locale_dir); + } + + if (retval) + return retval; + else + return g_strdup (""); +} + +#undef GLIB_LOCALE_DIR + +#endif /* G_OS_WIN32 */ + +/** + * glib_gettext: + * @str: The string to be translated + * + * Returns the translated string from the glib translations. + * This is an internal function and should only be used by + * the internals of glib (such as libgio). + * + * Returns: the transation of @str to the current locale + */ +G_CONST_RETURN gchar * +glib_gettext (const gchar *str) +{ + static gboolean _glib_gettext_initialized = FALSE; + + if (!_glib_gettext_initialized) + { +#ifdef G_OS_WIN32 + gchar *tmp = _glib_get_locale_dir (); + bindtextdomain (GETTEXT_PACKAGE, tmp); + g_free (tmp); +#else + bindtextdomain (GETTEXT_PACKAGE, GLIB_LOCALE_DIR); +#endif +# ifdef HAVE_BIND_TEXTDOMAIN_CODESET + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +# endif + _glib_gettext_initialized = TRUE; + } + + return g_dgettext (GETTEXT_PACKAGE, str); +} + +#if defined (G_OS_WIN32) && !defined (_WIN64) + +/* Binary compatibility versions. Not for newly compiled code. */ + +#undef g_find_program_in_path + +gchar* +g_find_program_in_path (const gchar *program) +{ + gchar *utf8_program = g_locale_to_utf8 (program, -1, NULL, NULL, NULL); + gchar *utf8_retval = g_find_program_in_path_utf8 (utf8_program); + gchar *retval; + + g_free (utf8_program); + if (utf8_retval == NULL) + return NULL; + retval = g_locale_from_utf8 (utf8_retval, -1, NULL, NULL, NULL); + g_free (utf8_retval); + + return retval; +} + +#undef g_get_current_dir + +gchar* +g_get_current_dir (void) +{ + gchar *utf8_dir = g_get_current_dir_utf8 (); + gchar *dir = g_locale_from_utf8 (utf8_dir, -1, NULL, NULL, NULL); + g_free (utf8_dir); + return dir; +} + +#undef g_getenv + +G_CONST_RETURN gchar* +g_getenv (const gchar *variable) +{ + gchar *utf8_variable = g_locale_to_utf8 (variable, -1, NULL, NULL, NULL); + const gchar *utf8_value = g_getenv_utf8 (utf8_variable); + gchar *value; + GQuark quark; + + g_free (utf8_variable); + if (!utf8_value) + return NULL; + value = g_locale_from_utf8 (utf8_value, -1, NULL, NULL, NULL); + quark = g_quark_from_string (value); + g_free (value); + + return g_quark_to_string (quark); +} + +#undef g_setenv + +gboolean +g_setenv (const gchar *variable, + const gchar *value, + gboolean overwrite) +{ + gchar *utf8_variable = g_locale_to_utf8 (variable, -1, NULL, NULL, NULL); + gchar *utf8_value = g_locale_to_utf8 (value, -1, NULL, NULL, NULL); + gboolean retval = g_setenv_utf8 (utf8_variable, utf8_value, overwrite); + + g_free (utf8_variable); + g_free (utf8_value); + + return retval; +} + +#undef g_unsetenv + +void +g_unsetenv (const gchar *variable) +{ + gchar *utf8_variable = g_locale_to_utf8 (variable, -1, NULL, NULL, NULL); + + g_unsetenv_utf8 (utf8_variable); + + g_free (utf8_variable); +} + +#undef g_get_user_name + +G_CONST_RETURN gchar* +g_get_user_name (void) +{ + g_get_any_init_locked (); + return g_user_name_cp; +} + +#undef g_get_real_name + +G_CONST_RETURN gchar* +g_get_real_name (void) +{ + g_get_any_init_locked (); + return g_real_name_cp; +} + +#undef g_get_home_dir + +G_CONST_RETURN gchar* +g_get_home_dir (void) +{ + g_get_any_init_locked (); + return g_home_dir_cp; +} + +#undef g_get_tmp_dir + +G_CONST_RETURN gchar* +g_get_tmp_dir (void) +{ + g_get_any_init_locked (); + return g_tmp_dir_cp; +} + +#endif +#endif /* NOT_NEEDED_FOR_NAVIT */ + +#define __G_UTILS_C__ +#include "galiasdef.c" diff --git a/navit/support/libc/Makefile.am b/navit/support/libc/Makefile.am new file mode 100644 index 0000000..fae600f --- /dev/null +++ b/navit/support/libc/Makefile.am @@ -0,0 +1,8 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=support_libc +noinst_LTLIBRARIES = libsupport_libc.la +libsupport_libc_la_SOURCES = libc.c libc_init.c +if SUPPORT_WIN32CE +noinst_LIBRARIES = libc.a +libc_a_SOURCES = +endif diff --git a/navit/support/libc/Makefile.in b/navit/support/libc/Makefile.in new file mode 100644 index 0000000..ff0c89a --- /dev/null +++ b/navit/support/libc/Makefile.in @@ -0,0 +1,656 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/support/libc +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +libc_a_AR = $(AR) $(ARFLAGS) +libc_a_LIBADD = +am_libc_a_OBJECTS = +libc_a_OBJECTS = $(am_libc_a_OBJECTS) +LTLIBRARIES = $(noinst_LTLIBRARIES) +libsupport_libc_la_LIBADD = +am_libsupport_libc_la_OBJECTS = libc.lo libc_init.lo +libsupport_libc_la_OBJECTS = $(am_libsupport_libc_la_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libc_a_SOURCES) $(libsupport_libc_la_SOURCES) +DIST_SOURCES = $(libc_a_SOURCES) $(libsupport_libc_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=support_libc +noinst_LTLIBRARIES = libsupport_libc.la +libsupport_libc_la_SOURCES = libc.c libc_init.c +@SUPPORT_WIN32CE_TRUE@noinst_LIBRARIES = libc.a +@SUPPORT_WIN32CE_TRUE@libc_a_SOURCES = +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/support/libc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/support/libc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +libc.a: $(libc_a_OBJECTS) $(libc_a_DEPENDENCIES) + -rm -f libc.a + $(libc_a_AR) libc.a $(libc_a_OBJECTS) $(libc_a_LIBADD) + $(RANLIB) libc.a + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libsupport_libc.la: $(libsupport_libc_la_OBJECTS) $(libsupport_libc_la_DEPENDENCIES) + $(LINK) $(libsupport_libc_la_OBJECTS) $(libsupport_libc_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libc_init.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES clean-noinstLTLIBRARIES \ + ctags distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/support/libc/libc.c b/navit/support/libc/libc.c new file mode 100644 index 0000000..a71f329 --- /dev/null +++ b/navit/support/libc/libc.c @@ -0,0 +1,254 @@ +#include "locale.h" +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef PLATFORM_WINDOWS +#include "windows.h" +#endif + +int errno; + +#define MAXENV 32 +static char *envnames[MAXENV]; +static char *envvars[MAXENV]; + +static void cleanup_libc(void) +#ifndef _MSC_VER +__attribute__((destructor)) +#endif +; +static void cleanup_libc(void) +{ + int i; + for (i=0; i dwFileAttributes = wFindFileData.dwFileAttributes; + pFindFileData->ftCreationTime = wFindFileData.ftCreationTime; + pFindFileData->ftLastAccessTime = wFindFileData.ftLastAccessTime; + pFindFileData->ftLastWriteTime = wFindFileData.ftLastWriteTime; + pFindFileData->nFileSizeHigh = wFindFileData.nFileSizeHigh; + pFindFileData->nFileSizeLow = wFindFileData.nFileSizeLow; + + if (WideCharToMultiByte(CP_UTF8, WC_SEPCHARS, wFileName, -1, pFindFileData->cFileName, MAX_PATH, NULL, NULL) == 0) + { + hRetVal = INVALID_HANDLE_VALUE; + } + } + + return hRetVal; +} + +BOOL FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA pFindFileData) +{ + BOOL boRetVal = FALSE; + WIN32_FIND_DATAW wFindFileData; + + wFindFileData.dwFileAttributes = pFindFileData->dwFileAttributes; + wFindFileData.ftCreationTime = pFindFileData->ftCreationTime; + wFindFileData.ftLastAccessTime = pFindFileData->ftLastAccessTime; + wFindFileData.ftLastWriteTime = pFindFileData->ftLastWriteTime; + wFindFileData.nFileSizeHigh = pFindFileData->nFileSizeHigh; + wFindFileData.nFileSizeLow = pFindFileData->nFileSizeLow; + + if (MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED, pFindFileData->cFileName, -1, wFindFileData.cFileName, MAX_PATH) != 0) + { + boRetVal = FindNextFileW(hFindFile, &wFindFileData); + + pFindFileData->dwFileAttributes = wFindFileData.dwFileAttributes; + pFindFileData->ftCreationTime = wFindFileData.ftCreationTime; + pFindFileData->ftLastAccessTime = wFindFileData.ftLastAccessTime; + pFindFileData->ftLastWriteTime = wFindFileData.ftLastWriteTime; + pFindFileData->nFileSizeHigh = wFindFileData.nFileSizeHigh; + pFindFileData->nFileSizeLow = wFindFileData.nFileSizeLow; + + if (WideCharToMultiByte(CP_UTF8, WC_SEPCHARS, wFindFileData.cFileName, -1, pFindFileData->cFileName, MAX_PATH, NULL, NULL) == 0) + { + boRetVal = FALSE; + } + } + + return boRetVal; +} + +#endif + +#endif diff --git a/navit/support/libc/libc_init.c b/navit/support/libc/libc_init.c new file mode 100644 index 0000000..32be387 --- /dev/null +++ b/navit/support/libc/libc_init.c @@ -0,0 +1,6 @@ +#include "plugin.h" + +void +plugin_init(void) +{ +} diff --git a/navit/support/libpng/Makefile.am b/navit/support/libpng/Makefile.am new file mode 100644 index 0000000..e8ed41c --- /dev/null +++ b/navit/support/libpng/Makefile.am @@ -0,0 +1,8 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit @ZLIB_CFLAGS@ -DMODULE=support_libpng +noinst_LTLIBRARIES = libsupport_libpng.la +libsupport_libpng_la_SOURCES = png.c pngerror.c pngget.c pngmem.c pngread.c pngrio.c pngrtran.c pngrutil.c pngset.c pngtrans.c libpng_init.c + +#bin_PROGRAMS = pngm2pnm +#pngm2pnm_LDADD=libsupport_libpng.la @ZLIB_LIBS@ + diff --git a/navit/support/libpng/Makefile.in b/navit/support/libpng/Makefile.in new file mode 100644 index 0000000..99d156a --- /dev/null +++ b/navit/support/libpng/Makefile.in @@ -0,0 +1,653 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/support/libpng +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libsupport_libpng_la_LIBADD = +am_libsupport_libpng_la_OBJECTS = png.lo pngerror.lo pngget.lo \ + pngmem.lo pngread.lo pngrio.lo pngrtran.lo pngrutil.lo \ + pngset.lo pngtrans.lo libpng_init.lo +libsupport_libpng_la_OBJECTS = $(am_libsupport_libpng_la_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libsupport_libpng_la_SOURCES) +DIST_SOURCES = $(libsupport_libpng_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit @ZLIB_CFLAGS@ -DMODULE=support_libpng +noinst_LTLIBRARIES = libsupport_libpng.la +libsupport_libpng_la_SOURCES = png.c pngerror.c pngget.c pngmem.c pngread.c pngrio.c pngrtran.c pngrutil.c pngset.c pngtrans.c libpng_init.c +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/support/libpng/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/support/libpng/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libsupport_libpng.la: $(libsupport_libpng_la_OBJECTS) $(libsupport_libpng_la_DEPENDENCIES) + $(LINK) $(libsupport_libpng_la_OBJECTS) $(libsupport_libpng_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpng_init.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/png.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pngerror.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pngget.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pngmem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pngread.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pngrio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pngrtran.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pngrutil.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pngset.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pngtrans.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +#bin_PROGRAMS = pngm2pnm +#pngm2pnm_LDADD=libsupport_libpng.la @ZLIB_LIBS@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/support/libpng/libpng_init.c b/navit/support/libpng/libpng_init.c new file mode 100644 index 0000000..32be387 --- /dev/null +++ b/navit/support/libpng/libpng_init.c @@ -0,0 +1,6 @@ +#include "plugin.h" + +void +plugin_init(void) +{ +} diff --git a/navit/support/libpng/png.c b/navit/support/libpng/png.c new file mode 100644 index 0000000..e1c0666 --- /dev/null +++ b/navit/support/libpng/png.c @@ -0,0 +1,912 @@ + +/* png.c - location for general purpose libpng functions + * + * Last changed in libpng 1.2.34 [December 18, 2008] + * For conditions of distribution and use, see copyright notice in png.h + * Copyright (c) 1998-2008 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + */ + +#define PNG_INTERNAL +#define PNG_NO_EXTERN +#include "png.h" + +/* Generate a compiler error if there is an old png.h in the search path. */ +typedef version_1_2_36 Your_png_h_is_not_version_1_2_36; + +/* Version information for C files. This had better match the version + * string defined in png.h. */ + +#ifdef PNG_USE_GLOBAL_ARRAYS +/* png_libpng_ver was changed to a function in version 1.0.5c */ +PNG_CONST char png_libpng_ver[18] = PNG_LIBPNG_VER_STRING; + +#ifdef PNG_READ_SUPPORTED + +/* png_sig was changed to a function in version 1.0.5c */ +/* Place to hold the signature string for a PNG file. */ +PNG_CONST png_byte FARDATA png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10}; +#endif /* PNG_READ_SUPPORTED */ + +/* Invoke global declarations for constant strings for known chunk types */ +PNG_IHDR; +PNG_IDAT; +PNG_IEND; +PNG_PLTE; +PNG_bKGD; +PNG_cHRM; +PNG_gAMA; +PNG_hIST; +PNG_iCCP; +PNG_iTXt; +PNG_oFFs; +PNG_pCAL; +PNG_sCAL; +PNG_pHYs; +PNG_sBIT; +PNG_sPLT; +PNG_sRGB; +PNG_tEXt; +PNG_tIME; +PNG_tRNS; +PNG_zTXt; + +#ifdef PNG_READ_SUPPORTED +/* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ + +/* start of interlace block */ +PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; + +/* offset to next interlace block */ +PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; + +/* start of interlace block in the y direction */ +PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; + +/* offset to next interlace block in the y direction */ +PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; + +/* Height of interlace block. This is not currently used - if you need + * it, uncomment it here and in png.h +PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1}; +*/ + +/* Mask to determine which pixels are valid in a pass */ +PNG_CONST int FARDATA png_pass_mask[] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff}; + +/* Mask to determine which pixels to overwrite while displaying */ +PNG_CONST int FARDATA png_pass_dsp_mask[] + = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; + +#endif /* PNG_READ_SUPPORTED */ +#endif /* PNG_USE_GLOBAL_ARRAYS */ + +/* Tells libpng that we have already handled the first "num_bytes" bytes + * of the PNG file signature. If the PNG data is embedded into another + * stream we can set num_bytes = 8 so that libpng will not attempt to read + * or write any of the magic bytes before it starts on the IHDR. + */ + +#ifdef PNG_READ_SUPPORTED +void PNGAPI +png_set_sig_bytes(png_structp png_ptr, int num_bytes) +{ + if (png_ptr == NULL) return; + png_debug(1, "in png_set_sig_bytes"); + if (num_bytes > 8) + png_error(png_ptr, "Too many bytes for PNG signature."); + + png_ptr->sig_bytes = (png_byte)(num_bytes < 0 ? 0 : num_bytes); +} + +/* Checks whether the supplied bytes match the PNG signature. We allow + * checking less than the full 8-byte signature so that those apps that + * already read the first few bytes of a file to determine the file type + * can simply check the remaining bytes for extra assurance. Returns + * an integer less than, equal to, or greater than zero if sig is found, + * respectively, to be less than, to match, or be greater than the correct + * PNG signature (this is the same behaviour as strcmp, memcmp, etc). + */ +int PNGAPI +png_sig_cmp(png_bytep sig, png_size_t start, png_size_t num_to_check) +{ + png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; + if (num_to_check > 8) + num_to_check = 8; + else if (num_to_check < 1) + return (-1); + + if (start > 7) + return (-1); + + if (start + num_to_check > 8) + num_to_check = 8 - start; + + return ((int)(png_memcmp(&sig[start], &png_signature[start], num_to_check))); +} + +#if defined(PNG_1_0_X) || defined(PNG_1_2_X) +/* (Obsolete) function to check signature bytes. It does not allow one + * to check a partial signature. This function might be removed in the + * future - use png_sig_cmp(). Returns true (nonzero) if the file is PNG. + */ +int PNGAPI +png_check_sig(png_bytep sig, int num) +{ + return ((int)!png_sig_cmp(sig, (png_size_t)0, (png_size_t)num)); +} +#endif +#endif /* PNG_READ_SUPPORTED */ + +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) +/* Function to allocate memory for zlib and clear it to 0. */ +#ifdef PNG_1_0_X +voidpf PNGAPI +#else +voidpf /* private */ +#endif +png_zalloc(voidpf png_ptr, uInt items, uInt size) +{ + png_voidp ptr; + png_structp p=(png_structp)png_ptr; + png_uint_32 save_flags=p->flags; + png_uint_32 num_bytes; + + if (png_ptr == NULL) return (NULL); + if (items > PNG_UINT_32_MAX/size) + { + png_warning (p, "Potential overflow in png_zalloc()"); + return (NULL); + } + num_bytes = (png_uint_32)items * size; + + p->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK; + ptr = (png_voidp)png_malloc((png_structp)png_ptr, num_bytes); + p->flags=save_flags; + +#if defined(PNG_1_0_X) && !defined(PNG_NO_ZALLOC_ZERO) + if (ptr == NULL) + return ((voidpf)ptr); + + if (num_bytes > (png_uint_32)0x8000L) + { + png_memset(ptr, 0, (png_size_t)0x8000L); + png_memset((png_bytep)ptr + (png_size_t)0x8000L, 0, + (png_size_t)(num_bytes - (png_uint_32)0x8000L)); + } + else + { + png_memset(ptr, 0, (png_size_t)num_bytes); + } +#endif + return ((voidpf)ptr); +} + +/* function to free memory for zlib */ +#ifdef PNG_1_0_X +void PNGAPI +#else +void /* private */ +#endif +png_zfree(voidpf png_ptr, voidpf ptr) +{ + png_free((png_structp)png_ptr, (png_voidp)ptr); +} + +/* Reset the CRC variable to 32 bits of 1's. Care must be taken + * in case CRC is > 32 bits to leave the top bits 0. + */ +void /* PRIVATE */ +png_reset_crc(png_structp png_ptr) +{ + png_ptr->crc = crc32(0, Z_NULL, 0); +} + +/* Calculate the CRC over a section of data. We can only pass as + * much data to this routine as the largest single buffer size. We + * also check that this data will actually be used before going to the + * trouble of calculating it. + */ +void /* PRIVATE */ +png_calculate_crc(png_structp png_ptr, png_bytep ptr, png_size_t length) +{ + int need_crc = 1; + + if (png_ptr->chunk_name[0] & 0x20) /* ancillary */ + { + if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) == + (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN)) + need_crc = 0; + } + else /* critical */ + { + if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) + need_crc = 0; + } + + if (need_crc) + png_ptr->crc = crc32(png_ptr->crc, ptr, (uInt)length); +} + +/* Allocate the memory for an info_struct for the application. We don't + * really need the png_ptr, but it could potentially be useful in the + * future. This should be used in favour of malloc(png_sizeof(png_info)) + * and png_info_init() so that applications that want to use a shared + * libpng don't have to be recompiled if png_info changes size. + */ +png_infop PNGAPI +png_create_info_struct(png_structp png_ptr) +{ + png_infop info_ptr; + + png_debug(1, "in png_create_info_struct"); + if (png_ptr == NULL) return (NULL); +#ifdef PNG_USER_MEM_SUPPORTED + info_ptr = (png_infop)png_create_struct_2(PNG_STRUCT_INFO, + png_ptr->malloc_fn, png_ptr->mem_ptr); +#else + info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO); +#endif + if (info_ptr != NULL) + png_info_init_3(&info_ptr, png_sizeof(png_info)); + + return (info_ptr); +} + +/* This function frees the memory associated with a single info struct. + * Normally, one would use either png_destroy_read_struct() or + * png_destroy_write_struct() to free an info struct, but this may be + * useful for some applications. + */ +void PNGAPI +png_destroy_info_struct(png_structp png_ptr, png_infopp info_ptr_ptr) +{ + png_infop info_ptr = NULL; + if (png_ptr == NULL) return; + + png_debug(1, "in png_destroy_info_struct"); + if (info_ptr_ptr != NULL) + info_ptr = *info_ptr_ptr; + + if (info_ptr != NULL) + { + png_info_destroy(png_ptr, info_ptr); + +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)info_ptr, png_ptr->free_fn, + png_ptr->mem_ptr); +#else + png_destroy_struct((png_voidp)info_ptr); +#endif + *info_ptr_ptr = NULL; + } +} + +/* Initialize the info structure. This is now an internal function (0.89) + * and applications using it are urged to use png_create_info_struct() + * instead. + */ +#if defined(PNG_1_0_X) || defined(PNG_1_2_X) +#undef png_info_init +void PNGAPI +png_info_init(png_infop info_ptr) +{ + /* We only come here via pre-1.0.12-compiled applications */ + png_info_init_3(&info_ptr, 0); +} +#endif + +void PNGAPI +png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size) +{ + png_infop info_ptr = *ptr_ptr; + + if (info_ptr == NULL) return; + + png_debug(1, "in png_info_init_3"); + + if (png_sizeof(png_info) > png_info_struct_size) + { + png_destroy_struct(info_ptr); + info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO); + *ptr_ptr = info_ptr; + } + + /* set everything to 0 */ + png_memset(info_ptr, 0, png_sizeof(png_info)); +} + +#ifdef PNG_FREE_ME_SUPPORTED +void PNGAPI +png_data_freer(png_structp png_ptr, png_infop info_ptr, + int freer, png_uint_32 mask) +{ + png_debug(1, "in png_data_freer"); + if (png_ptr == NULL || info_ptr == NULL) + return; + if (freer == PNG_DESTROY_WILL_FREE_DATA) + info_ptr->free_me |= mask; + else if (freer == PNG_USER_WILL_FREE_DATA) + info_ptr->free_me &= ~mask; + else + png_warning(png_ptr, + "Unknown freer parameter in png_data_freer."); +} +#endif + +void PNGAPI +png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask, + int num) +{ + png_debug(1, "in png_free_data"); + if (png_ptr == NULL || info_ptr == NULL) + return; + +#if defined(PNG_TEXT_SUPPORTED) +/* free text item num or (if num == -1) all text items */ +#ifdef PNG_FREE_ME_SUPPORTED +if ((mask & PNG_FREE_TEXT) & info_ptr->free_me) +#else +if (mask & PNG_FREE_TEXT) +#endif +{ + if (num != -1) + { + if (info_ptr->text && info_ptr->text[num].key) + { + png_free(png_ptr, info_ptr->text[num].key); + info_ptr->text[num].key = NULL; + } + } + else + { + int i; + for (i = 0; i < info_ptr->num_text; i++) + png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i); + png_free(png_ptr, info_ptr->text); + info_ptr->text = NULL; + info_ptr->num_text=0; + } +} +#endif + +#if defined(PNG_tRNS_SUPPORTED) +/* free any tRNS entry */ +#ifdef PNG_FREE_ME_SUPPORTED +if ((mask & PNG_FREE_TRNS) & info_ptr->free_me) +#else +if ((mask & PNG_FREE_TRNS) && (png_ptr->flags & PNG_FLAG_FREE_TRNS)) +#endif +{ + png_free(png_ptr, info_ptr->trans); + info_ptr->trans = NULL; + info_ptr->valid &= ~PNG_INFO_tRNS; +#ifndef PNG_FREE_ME_SUPPORTED + png_ptr->flags &= ~PNG_FLAG_FREE_TRNS; +#endif +} +#endif + +#if defined(PNG_sCAL_SUPPORTED) +/* free any sCAL entry */ +#ifdef PNG_FREE_ME_SUPPORTED +if ((mask & PNG_FREE_SCAL) & info_ptr->free_me) +#else +if (mask & PNG_FREE_SCAL) +#endif +{ +#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) + png_free(png_ptr, info_ptr->scal_s_width); + png_free(png_ptr, info_ptr->scal_s_height); + info_ptr->scal_s_width = NULL; + info_ptr->scal_s_height = NULL; +#endif + info_ptr->valid &= ~PNG_INFO_sCAL; +} +#endif + +#if defined(PNG_pCAL_SUPPORTED) +/* free any pCAL entry */ +#ifdef PNG_FREE_ME_SUPPORTED +if ((mask & PNG_FREE_PCAL) & info_ptr->free_me) +#else +if (mask & PNG_FREE_PCAL) +#endif +{ + png_free(png_ptr, info_ptr->pcal_purpose); + png_free(png_ptr, info_ptr->pcal_units); + info_ptr->pcal_purpose = NULL; + info_ptr->pcal_units = NULL; + if (info_ptr->pcal_params != NULL) + { + int i; + for (i = 0; i < (int)info_ptr->pcal_nparams; i++) + { + png_free(png_ptr, info_ptr->pcal_params[i]); + info_ptr->pcal_params[i]=NULL; + } + png_free(png_ptr, info_ptr->pcal_params); + info_ptr->pcal_params = NULL; + } + info_ptr->valid &= ~PNG_INFO_pCAL; +} +#endif + +#if defined(PNG_iCCP_SUPPORTED) +/* free any iCCP entry */ +#ifdef PNG_FREE_ME_SUPPORTED +if ((mask & PNG_FREE_ICCP) & info_ptr->free_me) +#else +if (mask & PNG_FREE_ICCP) +#endif +{ + png_free(png_ptr, info_ptr->iccp_name); + png_free(png_ptr, info_ptr->iccp_profile); + info_ptr->iccp_name = NULL; + info_ptr->iccp_profile = NULL; + info_ptr->valid &= ~PNG_INFO_iCCP; +} +#endif + +#if defined(PNG_sPLT_SUPPORTED) +/* free a given sPLT entry, or (if num == -1) all sPLT entries */ +#ifdef PNG_FREE_ME_SUPPORTED +if ((mask & PNG_FREE_SPLT) & info_ptr->free_me) +#else +if (mask & PNG_FREE_SPLT) +#endif +{ + if (num != -1) + { + if (info_ptr->splt_palettes) + { + png_free(png_ptr, info_ptr->splt_palettes[num].name); + png_free(png_ptr, info_ptr->splt_palettes[num].entries); + info_ptr->splt_palettes[num].name = NULL; + info_ptr->splt_palettes[num].entries = NULL; + } + } + else + { + if (info_ptr->splt_palettes_num) + { + int i; + for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) + png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i); + + png_free(png_ptr, info_ptr->splt_palettes); + info_ptr->splt_palettes = NULL; + info_ptr->splt_palettes_num = 0; + } + info_ptr->valid &= ~PNG_INFO_sPLT; + } +} +#endif + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + if (png_ptr->unknown_chunk.data) + { + png_free(png_ptr, png_ptr->unknown_chunk.data); + png_ptr->unknown_chunk.data = NULL; + } + +#ifdef PNG_FREE_ME_SUPPORTED +if ((mask & PNG_FREE_UNKN) & info_ptr->free_me) +#else +if (mask & PNG_FREE_UNKN) +#endif +{ + if (num != -1) + { + if (info_ptr->unknown_chunks) + { + png_free(png_ptr, info_ptr->unknown_chunks[num].data); + info_ptr->unknown_chunks[num].data = NULL; + } + } + else + { + int i; + + if (info_ptr->unknown_chunks_num) + { + for (i = 0; i < (int)info_ptr->unknown_chunks_num; i++) + png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i); + + png_free(png_ptr, info_ptr->unknown_chunks); + info_ptr->unknown_chunks = NULL; + info_ptr->unknown_chunks_num = 0; + } + } +} +#endif + +#if defined(PNG_hIST_SUPPORTED) +/* free any hIST entry */ +#ifdef PNG_FREE_ME_SUPPORTED +if ((mask & PNG_FREE_HIST) & info_ptr->free_me) +#else +if ((mask & PNG_FREE_HIST) && (png_ptr->flags & PNG_FLAG_FREE_HIST)) +#endif +{ + png_free(png_ptr, info_ptr->hist); + info_ptr->hist = NULL; + info_ptr->valid &= ~PNG_INFO_hIST; +#ifndef PNG_FREE_ME_SUPPORTED + png_ptr->flags &= ~PNG_FLAG_FREE_HIST; +#endif +} +#endif + +/* free any PLTE entry that was internally allocated */ +#ifdef PNG_FREE_ME_SUPPORTED +if ((mask & PNG_FREE_PLTE) & info_ptr->free_me) +#else +if ((mask & PNG_FREE_PLTE) && (png_ptr->flags & PNG_FLAG_FREE_PLTE)) +#endif +{ + png_zfree(png_ptr, info_ptr->palette); + info_ptr->palette = NULL; + info_ptr->valid &= ~PNG_INFO_PLTE; +#ifndef PNG_FREE_ME_SUPPORTED + png_ptr->flags &= ~PNG_FLAG_FREE_PLTE; +#endif + info_ptr->num_palette = 0; +} + +#if defined(PNG_INFO_IMAGE_SUPPORTED) +/* free any image bits attached to the info structure */ +#ifdef PNG_FREE_ME_SUPPORTED +if ((mask & PNG_FREE_ROWS) & info_ptr->free_me) +#else +if (mask & PNG_FREE_ROWS) +#endif +{ + if (info_ptr->row_pointers) + { + int row; + for (row = 0; row < (int)info_ptr->height; row++) + { + png_free(png_ptr, info_ptr->row_pointers[row]); + info_ptr->row_pointers[row]=NULL; + } + png_free(png_ptr, info_ptr->row_pointers); + info_ptr->row_pointers=NULL; + } + info_ptr->valid &= ~PNG_INFO_IDAT; +} +#endif + +#ifdef PNG_FREE_ME_SUPPORTED + if (num == -1) + info_ptr->free_me &= ~mask; + else + info_ptr->free_me &= ~(mask & ~PNG_FREE_MUL); +#endif +} + +/* This is an internal routine to free any memory that the info struct is + * pointing to before re-using it or freeing the struct itself. Recall + * that png_free() checks for NULL pointers for us. + */ +void /* PRIVATE */ +png_info_destroy(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_info_destroy"); + + png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + if (png_ptr->num_chunk_list) + { + png_free(png_ptr, png_ptr->chunk_list); + png_ptr->chunk_list=NULL; + png_ptr->num_chunk_list = 0; + } +#endif + + png_info_init_3(&info_ptr, png_sizeof(png_info)); +} +#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ + +/* This function returns a pointer to the io_ptr associated with the user + * functions. The application should free any memory associated with this + * pointer before png_write_destroy() or png_read_destroy() are called. + */ +png_voidp PNGAPI +png_get_io_ptr(png_structp png_ptr) +{ + if (png_ptr == NULL) return (NULL); + return (png_ptr->io_ptr); +} + +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) +#if !defined(PNG_NO_STDIO) +/* Initialize the default input/output functions for the PNG file. If you + * use your own read or write routines, you can call either png_set_read_fn() + * or png_set_write_fn() instead of png_init_io(). If you have defined + * PNG_NO_STDIO, you must use a function of your own because "FILE *" isn't + * necessarily available. + */ +void PNGAPI +png_init_io(png_structp png_ptr, png_FILE_p fp) +{ + png_debug(1, "in png_init_io"); + if (png_ptr == NULL) return; + png_ptr->io_ptr = (png_voidp)fp; +} +#endif + +#if defined(PNG_TIME_RFC1123_SUPPORTED) +/* Convert the supplied time into an RFC 1123 string suitable for use in + * a "Creation Time" or other text-based time string. + */ +png_charp PNGAPI +png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime) +{ + static PNG_CONST char short_months[12][4] = + {"Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + + if (png_ptr == NULL) return (NULL); + if (png_ptr->time_buffer == NULL) + { + png_ptr->time_buffer = (png_charp)png_malloc(png_ptr, (png_uint_32)(29* + png_sizeof(char))); + } + +#if defined(_WIN32_WCE) + { + wchar_t time_buf[29]; + wsprintf(time_buf, TEXT("%d %S %d %02d:%02d:%02d +0000"), + ptime->day % 32, short_months[(ptime->month - 1) % 12], + ptime->year, ptime->hour % 24, ptime->minute % 60, + ptime->second % 61); + WideCharToMultiByte(CP_ACP, 0, time_buf, -1, png_ptr->time_buffer, 29, + NULL, NULL); + } +#else +#ifdef USE_FAR_KEYWORD + { + char near_time_buf[29]; + png_snprintf6(near_time_buf, 29, "%d %s %d %02d:%02d:%02d +0000", + ptime->day % 32, short_months[(ptime->month - 1) % 12], + ptime->year, ptime->hour % 24, ptime->minute % 60, + ptime->second % 61); + png_memcpy(png_ptr->time_buffer, near_time_buf, + 29*png_sizeof(char)); + } +#else + png_snprintf6(png_ptr->time_buffer, 29, "%d %s %d %02d:%02d:%02d +0000", + ptime->day % 32, short_months[(ptime->month - 1) % 12], + ptime->year, ptime->hour % 24, ptime->minute % 60, + ptime->second % 61); +#endif +#endif /* _WIN32_WCE */ + return ((png_charp)png_ptr->time_buffer); +} +#endif /* PNG_TIME_RFC1123_SUPPORTED */ + +#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ + +png_charp PNGAPI +png_get_copyright(png_structp png_ptr) +{ + png_ptr = png_ptr; /* silence compiler warning about unused png_ptr */ + return ((png_charp) "\n libpng version 1.2.36 - May 7, 2009\n\ + Copyright (c) 1998-2008 Glenn Randers-Pehrson\n\ + Copyright (c) 1996-1997 Andreas Dilger\n\ + Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.\n"); +} + +/* The following return the library version as a short string in the + * format 1.0.0 through 99.99.99zz. To get the version of *.h files + * used with your application, print out PNG_LIBPNG_VER_STRING, which + * is defined in png.h. + * Note: now there is no difference between png_get_libpng_ver() and + * png_get_header_ver(). Due to the version_nn_nn_nn typedef guard, + * it is guaranteed that png.c uses the correct version of png.h. + */ +png_charp PNGAPI +png_get_libpng_ver(png_structp png_ptr) +{ + /* Version of *.c files used when building libpng */ + png_ptr = png_ptr; /* silence compiler warning about unused png_ptr */ + return ((png_charp) PNG_LIBPNG_VER_STRING); +} + +png_charp PNGAPI +png_get_header_ver(png_structp png_ptr) +{ + /* Version of *.h files used when building libpng */ + png_ptr = png_ptr; /* silence compiler warning about unused png_ptr */ + return ((png_charp) PNG_LIBPNG_VER_STRING); +} + +png_charp PNGAPI +png_get_header_version(png_structp png_ptr) +{ + /* Returns longer string containing both version and date */ + png_ptr = png_ptr; /* silence compiler warning about unused png_ptr */ + return ((png_charp) PNG_HEADER_VERSION_STRING +#ifndef PNG_READ_SUPPORTED + " (NO READ SUPPORT)" +#endif + "\n"); +} + +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED +int PNGAPI +png_handle_as_unknown(png_structp png_ptr, png_bytep chunk_name) +{ + /* check chunk_name and return "keep" value if it's on the list, else 0 */ + int i; + png_bytep p; + if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list<=0) + return 0; + p = png_ptr->chunk_list + png_ptr->num_chunk_list*5 - 5; + for (i = png_ptr->num_chunk_list; i; i--, p -= 5) + if (!png_memcmp(chunk_name, p, 4)) + return ((int)*(p + 4)); + return 0; +} +#endif + +/* This function, added to libpng-1.0.6g, is untested. */ +int PNGAPI +png_reset_zstream(png_structp png_ptr) +{ + if (png_ptr == NULL) return Z_STREAM_ERROR; + return (inflateReset(&png_ptr->zstream)); +} +#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ + +/* This function was added to libpng-1.0.7 */ +png_uint_32 PNGAPI +png_access_version_number(void) +{ + /* Version of *.c files used when building libpng */ + return((png_uint_32) PNG_LIBPNG_VER); +} + + +#if defined(PNG_READ_SUPPORTED) && defined(PNG_ASSEMBLER_CODE_SUPPORTED) +#if !defined(PNG_1_0_X) +/* this function was added to libpng 1.2.0 */ +int PNGAPI +png_mmx_support(void) +{ + /* obsolete, to be removed from libpng-1.4.0 */ + return -1; +} +#endif /* PNG_1_0_X */ +#endif /* PNG_READ_SUPPORTED && PNG_ASSEMBLER_CODE_SUPPORTED */ + +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) +#ifdef PNG_SIZE_T +/* Added at libpng version 1.2.6 */ + PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size)); +png_size_t PNGAPI +png_convert_size(size_t size) +{ + if (size > (png_size_t)-1) + PNG_ABORT(); /* We haven't got access to png_ptr, so no png_error() */ + return ((png_size_t)size); +} +#endif /* PNG_SIZE_T */ + +/* Added at libpng version 1.2.34 and 1.4.0 (moved from pngset.c) */ +#if defined(PNG_cHRM_SUPPORTED) +#if !defined(PNG_NO_CHECK_cHRM) + +/* + Multiply two 32-bit numbers, V1 and V2, using 32-bit + arithmetic, to produce a 64 bit result in the HI/LO words. + + A B + x C D + ------ + AD || BD +AC || CB || 0 + + where A and B are the high and low 16-bit words of V1, + C and D are the 16-bit words of V2, AD is the product of + A and D, and X || Y is (X << 16) + Y. +*/ + +void png_64bit_product (long v1, long v2, unsigned long *hi_product, + unsigned long *lo_product) +{ + int a, b, c, d; + long lo, hi, x, y; + + a = (v1 >> 16) & 0xffff; + b = v1 & 0xffff; + c = (v2 >> 16) & 0xffff; + d = v2 & 0xffff; + + lo = b * d; /* BD */ + x = a * d + c * b; /* AD + CB */ + y = ((lo >> 16) & 0xffff) + x; + + lo = (lo & 0xffff) | ((y & 0xffff) << 16); + hi = (y >> 16) & 0xffff; + + hi += a * c; /* AC */ + + *hi_product = (unsigned long)hi; + *lo_product = (unsigned long)lo; +} +int /* private */ +png_check_cHRM_fixed(png_structp png_ptr, + png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x, + png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y, + png_fixed_point blue_x, png_fixed_point blue_y) +{ + int ret = 1; + unsigned long xy_hi,xy_lo,yx_hi,yx_lo; + + png_debug(1, "in function png_check_cHRM_fixed"); + if (png_ptr == NULL) + return 0; + + if (white_x < 0 || white_y <= 0 || + red_x < 0 || red_y < 0 || + green_x < 0 || green_y < 0 || + blue_x < 0 || blue_y < 0) + { + png_warning(png_ptr, + "Ignoring attempt to set negative chromaticity value"); + ret = 0; + } + if (white_x > (png_fixed_point) PNG_UINT_31_MAX || + white_y > (png_fixed_point) PNG_UINT_31_MAX || + red_x > (png_fixed_point) PNG_UINT_31_MAX || + red_y > (png_fixed_point) PNG_UINT_31_MAX || + green_x > (png_fixed_point) PNG_UINT_31_MAX || + green_y > (png_fixed_point) PNG_UINT_31_MAX || + blue_x > (png_fixed_point) PNG_UINT_31_MAX || + blue_y > (png_fixed_point) PNG_UINT_31_MAX ) + { + png_warning(png_ptr, + "Ignoring attempt to set chromaticity value exceeding 21474.83"); + ret = 0; + } + if (white_x > 100000L - white_y) + { + png_warning(png_ptr, "Invalid cHRM white point"); + ret = 0; + } + if (red_x > 100000L - red_y) + { + png_warning(png_ptr, "Invalid cHRM red point"); + ret = 0; + } + if (green_x > 100000L - green_y) + { + png_warning(png_ptr, "Invalid cHRM green point"); + ret = 0; + } + if (blue_x > 100000L - blue_y) + { + png_warning(png_ptr, "Invalid cHRM blue point"); + ret = 0; + } + + png_64bit_product(green_x - red_x, blue_y - red_y, &xy_hi, &xy_lo); + png_64bit_product(green_y - red_y, blue_x - red_x, &yx_hi, &yx_lo); + + if (xy_hi == yx_hi && xy_lo == yx_lo) + { + png_warning(png_ptr, + "Ignoring attempt to set cHRM RGB triangle with zero area"); + ret = 0; + } + + return ret; +} +#endif /* NO_PNG_CHECK_cHRM */ +#endif /* PNG_cHRM_SUPPORTED */ +#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ diff --git a/navit/support/libpng/pngerror.c b/navit/support/libpng/pngerror.c new file mode 100644 index 0000000..b85ee11 --- /dev/null +++ b/navit/support/libpng/pngerror.c @@ -0,0 +1,359 @@ + +/* pngerror.c - stub functions for i/o and memory allocation + * + * Last changed in libpng 1.2.36 [May 7, 2009] + * For conditions of distribution and use, see copyright notice in png.h + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This file provides a location for all error handling. Users who + * need special error handling are expected to write replacement functions + * and use png_set_error_fn() to use those functions. See the instructions + * at each function. + */ + +#define PNG_INTERNAL +#include "png.h" +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + +static void /* PRIVATE */ +png_default_error PNGARG((png_structp png_ptr, + png_const_charp error_message)); +#ifndef PNG_NO_WARNINGS +static void /* PRIVATE */ +png_default_warning PNGARG((png_structp png_ptr, + png_const_charp warning_message)); +#endif /* PNG_NO_WARNINGS */ + +/* This function is called whenever there is a fatal error. This function + * should not be changed. If there is a need to handle errors differently, + * you should supply a replacement error function and use png_set_error_fn() + * to replace the error function at run-time. + */ +#ifndef PNG_NO_ERROR_TEXT +void PNGAPI +png_error(png_structp png_ptr, png_const_charp error_message) +{ +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + char msg[16]; + if (png_ptr != NULL) + { + if (png_ptr->flags& + (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) + { + if (*error_message == '#') + { + /* Strip "#nnnn " from beginning of error message. */ + int offset; + for (offset = 1; offset<15; offset++) + if (error_message[offset] == ' ') + break; + if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) + { + int i; + for (i = 0; i < offset - 1; i++) + msg[i] = error_message[i + 1]; + msg[i - 1] = '\0'; + error_message = msg; + } + else + error_message += offset; + } + else + { + if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) + { + msg[0] = '0'; + msg[1] = '\0'; + error_message = msg; + } + } + } + } +#endif + if (png_ptr != NULL && png_ptr->error_fn != NULL) + (*(png_ptr->error_fn))(png_ptr, error_message); + + /* If the custom handler doesn't exist, or if it returns, + use the default handler, which will not return. */ + png_default_error(png_ptr, error_message); +} +#else +void PNGAPI +png_err(png_structp png_ptr) +{ + if (png_ptr != NULL && png_ptr->error_fn != NULL) + (*(png_ptr->error_fn))(png_ptr, '\0'); + + /* If the custom handler doesn't exist, or if it returns, + use the default handler, which will not return. */ + png_default_error(png_ptr, '\0'); +} +#endif /* PNG_NO_ERROR_TEXT */ + +#ifndef PNG_NO_WARNINGS +/* This function is called whenever there is a non-fatal error. This function + * should not be changed. If there is a need to handle warnings differently, + * you should supply a replacement warning function and use + * png_set_error_fn() to replace the warning function at run-time. + */ +void PNGAPI +png_warning(png_structp png_ptr, png_const_charp warning_message) +{ + int offset = 0; + if (png_ptr != NULL) + { +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + if (png_ptr->flags& + (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) +#endif + { + if (*warning_message == '#') + { + for (offset = 1; offset < 15; offset++) + if (warning_message[offset] == ' ') + break; + } + } + } + if (png_ptr != NULL && png_ptr->warning_fn != NULL) + (*(png_ptr->warning_fn))(png_ptr, warning_message + offset); + else + png_default_warning(png_ptr, warning_message + offset); +} +#endif /* PNG_NO_WARNINGS */ + + +/* These utilities are used internally to build an error message that relates + * to the current chunk. The chunk name comes from png_ptr->chunk_name, + * this is used to prefix the message. The message is limited in length + * to 63 bytes, the name characters are output as hex digits wrapped in [] + * if the character is invalid. + */ +#define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97)) +static PNG_CONST char png_digit[16] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F' +}; + +#define PNG_MAX_ERROR_TEXT 64 + +#if !defined(PNG_NO_WARNINGS) || !defined(PNG_NO_ERROR_TEXT) +static void /* PRIVATE */ +png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp + error_message) +{ + int iout = 0, iin = 0; + + while (iin < 4) + { + int c = png_ptr->chunk_name[iin++]; + if (isnonalpha(c)) + { + buffer[iout++] = '['; + buffer[iout++] = png_digit[(c & 0xf0) >> 4]; + buffer[iout++] = png_digit[c & 0x0f]; + buffer[iout++] = ']'; + } + else + { + buffer[iout++] = (png_byte)c; + } + } + + if (error_message == NULL) + buffer[iout] = '\0'; + else + { + buffer[iout++] = ':'; + buffer[iout++] = ' '; + png_memcpy(buffer + iout, error_message, PNG_MAX_ERROR_TEXT); + buffer[iout + PNG_MAX_ERROR_TEXT - 1] = '\0'; + } +} + +#ifdef PNG_READ_SUPPORTED +void PNGAPI +png_chunk_error(png_structp png_ptr, png_const_charp error_message) +{ + char msg[18+PNG_MAX_ERROR_TEXT]; + if (png_ptr == NULL) + png_error(png_ptr, error_message); + else + { + png_format_buffer(png_ptr, msg, error_message); + png_error(png_ptr, msg); + } +} +#endif /* PNG_READ_SUPPORTED */ +#endif /* !defined(PNG_NO_WARNINGS) || !defined(PNG_NO_ERROR_TEXT) */ + +#ifndef PNG_NO_WARNINGS +void PNGAPI +png_chunk_warning(png_structp png_ptr, png_const_charp warning_message) +{ + char msg[18+PNG_MAX_ERROR_TEXT]; + if (png_ptr == NULL) + png_warning(png_ptr, warning_message); + else + { + png_format_buffer(png_ptr, msg, warning_message); + png_warning(png_ptr, msg); + } +} +#endif /* PNG_NO_WARNINGS */ + + +/* This is the default error handling function. Note that replacements for + * this function MUST NOT RETURN, or the program will likely crash. This + * function is used by default, or if the program supplies NULL for the + * error function pointer in png_set_error_fn(). + */ +static void /* PRIVATE */ +png_default_error(png_structp png_ptr, png_const_charp error_message) +{ +#ifndef PNG_NO_CONSOLE_IO +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + if (*error_message == '#') + { + /* Strip "#nnnn " from beginning of error message. */ + int offset; + char error_number[16]; + for (offset = 0; offset<15; offset++) + { + error_number[offset] = error_message[offset + 1]; + if (error_message[offset] == ' ') + break; + } + if ((offset > 1) && (offset < 15)) + { + error_number[offset - 1] = '\0'; + fprintf(stderr, "libpng error no. %s: %s", + error_number, error_message + offset + 1); + fprintf(stderr, PNG_STRING_NEWLINE); + } + else + fprintf(stderr, "libpng error: %s, offset=%d", + error_message, offset); + fprintf(stderr, PNG_STRING_NEWLINE); + } + else +#endif + { + fprintf(stderr, "libpng error: %s", error_message); + fprintf(stderr, PNG_STRING_NEWLINE); + } +#endif + +#ifdef PNG_SETJMP_SUPPORTED + if (png_ptr) + { +# ifdef USE_FAR_KEYWORD + { + jmp_buf jmpbuf; + png_memcpy(jmpbuf, png_ptr->jmpbuf, png_sizeof(jmp_buf)); + longjmp(jmpbuf, 1); + } +# else + longjmp(png_ptr->jmpbuf, 1); +# endif + } +#else + PNG_ABORT(); +#endif +#ifdef PNG_NO_CONSOLE_IO + error_message = error_message; /* make compiler happy */ +#endif +} + +#ifndef PNG_NO_WARNINGS +/* This function is called when there is a warning, but the library thinks + * it can continue anyway. Replacement functions don't have to do anything + * here if you don't want them to. In the default configuration, png_ptr is + * not used, but it is passed in case it may be useful. + */ +static void /* PRIVATE */ +png_default_warning(png_structp png_ptr, png_const_charp warning_message) +{ +#ifndef PNG_NO_CONSOLE_IO +# ifdef PNG_ERROR_NUMBERS_SUPPORTED + if (*warning_message == '#') + { + int offset; + char warning_number[16]; + for (offset = 0; offset < 15; offset++) + { + warning_number[offset] = warning_message[offset + 1]; + if (warning_message[offset] == ' ') + break; + } + if ((offset > 1) && (offset < 15)) + { + warning_number[offset + 1] = '\0'; + fprintf(stderr, "libpng warning no. %s: %s", + warning_number, warning_message + offset); + fprintf(stderr, PNG_STRING_NEWLINE); + } + else + { + fprintf(stderr, "libpng warning: %s", + warning_message); + fprintf(stderr, PNG_STRING_NEWLINE); + } + } + else +# endif + { + fprintf(stderr, "libpng warning: %s", warning_message); + fprintf(stderr, PNG_STRING_NEWLINE); + } +#else + warning_message = warning_message; /* make compiler happy */ +#endif + png_ptr = png_ptr; /* make compiler happy */ +} +#endif /* PNG_NO_WARNINGS */ + +/* This function is called when the application wants to use another method + * of handling errors and warnings. Note that the error function MUST NOT + * return to the calling routine or serious problems will occur. The return + * method used in the default routine calls longjmp(png_ptr->jmpbuf, 1) + */ +void PNGAPI +png_set_error_fn(png_structp png_ptr, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warning_fn) +{ + if (png_ptr == NULL) + return; + png_ptr->error_ptr = error_ptr; + png_ptr->error_fn = error_fn; + png_ptr->warning_fn = warning_fn; +} + + +/* This function returns a pointer to the error_ptr associated with the user + * functions. The application should free any memory associated with this + * pointer before png_write_destroy and png_read_destroy are called. + */ +png_voidp PNGAPI +png_get_error_ptr(png_structp png_ptr) +{ + if (png_ptr == NULL) + return NULL; + return ((png_voidp)png_ptr->error_ptr); +} + + +#ifdef PNG_ERROR_NUMBERS_SUPPORTED +void PNGAPI +png_set_strip_error_numbers(png_structp png_ptr, png_uint_32 strip_mode) +{ + if (png_ptr != NULL) + { + png_ptr->flags &= + ((~(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode); + } +} +#endif +#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/navit/support/libpng/pngget.c b/navit/support/libpng/pngget.c new file mode 100644 index 0000000..3b2b646 --- /dev/null +++ b/navit/support/libpng/pngget.c @@ -0,0 +1,900 @@ + +/* pngget.c - retrieval of values from info struct + * + * Last changed in libpng 1.2.30 [August 15, 2008] + * For conditions of distribution and use, see copyright notice in png.h + * Copyright (c) 1998-2008 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + */ + +#define PNG_INTERNAL +#include "png.h" +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + +png_uint_32 PNGAPI +png_get_valid(png_structp png_ptr, png_infop info_ptr, png_uint_32 flag) +{ + if (png_ptr != NULL && info_ptr != NULL) + return(info_ptr->valid & flag); + else + return(0); +} + +png_uint_32 PNGAPI +png_get_rowbytes(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return(info_ptr->rowbytes); + else + return(0); +} + +#if defined(PNG_INFO_IMAGE_SUPPORTED) +png_bytepp PNGAPI +png_get_rows(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return(info_ptr->row_pointers); + else + return(0); +} +#endif + +#ifdef PNG_EASY_ACCESS_SUPPORTED +/* easy access to info, added in libpng-0.99 */ +png_uint_32 PNGAPI +png_get_image_width(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + { + return info_ptr->width; + } + return (0); +} + +png_uint_32 PNGAPI +png_get_image_height(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + { + return info_ptr->height; + } + return (0); +} + +png_byte PNGAPI +png_get_bit_depth(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + { + return info_ptr->bit_depth; + } + return (0); +} + +png_byte PNGAPI +png_get_color_type(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + { + return info_ptr->color_type; + } + return (0); +} + +png_byte PNGAPI +png_get_filter_type(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + { + return info_ptr->filter_type; + } + return (0); +} + +png_byte PNGAPI +png_get_interlace_type(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + { + return info_ptr->interlace_type; + } + return (0); +} + +png_byte PNGAPI +png_get_compression_type(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + { + return info_ptr->compression_type; + } + return (0); +} + +png_uint_32 PNGAPI +png_get_x_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) +#if defined(PNG_pHYs_SUPPORTED) + if (info_ptr->valid & PNG_INFO_pHYs) + { + png_debug1(1, "in %s retrieval function", "png_get_x_pixels_per_meter"); + if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER) + return (0); + else return (info_ptr->x_pixels_per_unit); + } +#else + return (0); +#endif + return (0); +} + +png_uint_32 PNGAPI +png_get_y_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) +#if defined(PNG_pHYs_SUPPORTED) + if (info_ptr->valid & PNG_INFO_pHYs) + { + png_debug1(1, "in %s retrieval function", "png_get_y_pixels_per_meter"); + if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER) + return (0); + else return (info_ptr->y_pixels_per_unit); + } +#else + return (0); +#endif + return (0); +} + +png_uint_32 PNGAPI +png_get_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) +#if defined(PNG_pHYs_SUPPORTED) + if (info_ptr->valid & PNG_INFO_pHYs) + { + png_debug1(1, "in %s retrieval function", "png_get_pixels_per_meter"); + if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER || + info_ptr->x_pixels_per_unit != info_ptr->y_pixels_per_unit) + return (0); + else return (info_ptr->x_pixels_per_unit); + } +#else + return (0); +#endif + return (0); +} + +#ifdef PNG_FLOATING_POINT_SUPPORTED +float PNGAPI +png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr) + { + if (png_ptr != NULL && info_ptr != NULL) +#if defined(PNG_pHYs_SUPPORTED) + if (info_ptr->valid & PNG_INFO_pHYs) + { + png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio"); + if (info_ptr->x_pixels_per_unit == 0) + return ((float)0.0); + else + return ((float)((float)info_ptr->y_pixels_per_unit + /(float)info_ptr->x_pixels_per_unit)); + } +#else + return (0.0); +#endif + return ((float)0.0); +} +#endif + +png_int_32 PNGAPI +png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) +#if defined(PNG_oFFs_SUPPORTED) + if (info_ptr->valid & PNG_INFO_oFFs) + { + png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns"); + if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER) + return (0); + else return (info_ptr->x_offset); + } +#else + return (0); +#endif + return (0); +} + +png_int_32 PNGAPI +png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) +#if defined(PNG_oFFs_SUPPORTED) + if (info_ptr->valid & PNG_INFO_oFFs) + { + png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns"); + if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER) + return (0); + else return (info_ptr->y_offset); + } +#else + return (0); +#endif + return (0); +} + +png_int_32 PNGAPI +png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) +#if defined(PNG_oFFs_SUPPORTED) + if (info_ptr->valid & PNG_INFO_oFFs) + { + png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns"); + if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL) + return (0); + else return (info_ptr->x_offset); + } +#else + return (0); +#endif + return (0); +} + +png_int_32 PNGAPI +png_get_y_offset_pixels(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) +#if defined(PNG_oFFs_SUPPORTED) + if (info_ptr->valid & PNG_INFO_oFFs) + { + png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns"); + if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL) + return (0); + else return (info_ptr->y_offset); + } +#else + return (0); +#endif + return (0); +} + +#if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED) +png_uint_32 PNGAPI +png_get_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) +{ + return ((png_uint_32)((float)png_get_pixels_per_meter(png_ptr, info_ptr) + *.0254 +.5)); +} + +png_uint_32 PNGAPI +png_get_x_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) +{ + return ((png_uint_32)((float)png_get_x_pixels_per_meter(png_ptr, info_ptr) + *.0254 +.5)); +} + +png_uint_32 PNGAPI +png_get_y_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) +{ + return ((png_uint_32)((float)png_get_y_pixels_per_meter(png_ptr, info_ptr) + *.0254 +.5)); +} + +float PNGAPI +png_get_x_offset_inches(png_structp png_ptr, png_infop info_ptr) +{ + return ((float)png_get_x_offset_microns(png_ptr, info_ptr) + *.00003937); +} + +float PNGAPI +png_get_y_offset_inches(png_structp png_ptr, png_infop info_ptr) +{ + return ((float)png_get_y_offset_microns(png_ptr, info_ptr) + *.00003937); +} + +#if defined(PNG_pHYs_SUPPORTED) +png_uint_32 PNGAPI +png_get_pHYs_dpi(png_structp png_ptr, png_infop info_ptr, + png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) +{ + png_uint_32 retval = 0; + + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) + { + png_debug1(1, "in %s retrieval function", "pHYs"); + if (res_x != NULL) + { + *res_x = info_ptr->x_pixels_per_unit; + retval |= PNG_INFO_pHYs; + } + if (res_y != NULL) + { + *res_y = info_ptr->y_pixels_per_unit; + retval |= PNG_INFO_pHYs; + } + if (unit_type != NULL) + { + *unit_type = (int)info_ptr->phys_unit_type; + retval |= PNG_INFO_pHYs; + if (*unit_type == 1) + { + if (res_x != NULL) *res_x = (png_uint_32)(*res_x * .0254 + .50); + if (res_y != NULL) *res_y = (png_uint_32)(*res_y * .0254 + .50); + } + } + } + return (retval); +} +#endif /* PNG_pHYs_SUPPORTED */ +#endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */ + +/* png_get_channels really belongs in here, too, but it's been around longer */ + +#endif /* PNG_EASY_ACCESS_SUPPORTED */ + +png_byte PNGAPI +png_get_channels(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return(info_ptr->channels); + else + return (0); +} + +png_bytep PNGAPI +png_get_signature(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return(info_ptr->signature); + else + return (NULL); +} + +#if defined(PNG_bKGD_SUPPORTED) +png_uint_32 PNGAPI +png_get_bKGD(png_structp png_ptr, png_infop info_ptr, + png_color_16p *background) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD) + && background != NULL) + { + png_debug1(1, "in %s retrieval function", "bKGD"); + *background = &(info_ptr->background); + return (PNG_INFO_bKGD); + } + return (0); +} +#endif + +#if defined(PNG_cHRM_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +png_uint_32 PNGAPI +png_get_cHRM(png_structp png_ptr, png_infop info_ptr, + double *white_x, double *white_y, double *red_x, double *red_y, + double *green_x, double *green_y, double *blue_x, double *blue_y) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) + { + png_debug1(1, "in %s retrieval function", "cHRM"); + if (white_x != NULL) + *white_x = (double)info_ptr->x_white; + if (white_y != NULL) + *white_y = (double)info_ptr->y_white; + if (red_x != NULL) + *red_x = (double)info_ptr->x_red; + if (red_y != NULL) + *red_y = (double)info_ptr->y_red; + if (green_x != NULL) + *green_x = (double)info_ptr->x_green; + if (green_y != NULL) + *green_y = (double)info_ptr->y_green; + if (blue_x != NULL) + *blue_x = (double)info_ptr->x_blue; + if (blue_y != NULL) + *blue_y = (double)info_ptr->y_blue; + return (PNG_INFO_cHRM); + } + return (0); +} +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED +png_uint_32 PNGAPI +png_get_cHRM_fixed(png_structp png_ptr, png_infop info_ptr, + png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x, + png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y, + png_fixed_point *blue_x, png_fixed_point *blue_y) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) + { + png_debug1(1, "in %s retrieval function", "cHRM"); + if (white_x != NULL) + *white_x = info_ptr->int_x_white; + if (white_y != NULL) + *white_y = info_ptr->int_y_white; + if (red_x != NULL) + *red_x = info_ptr->int_x_red; + if (red_y != NULL) + *red_y = info_ptr->int_y_red; + if (green_x != NULL) + *green_x = info_ptr->int_x_green; + if (green_y != NULL) + *green_y = info_ptr->int_y_green; + if (blue_x != NULL) + *blue_x = info_ptr->int_x_blue; + if (blue_y != NULL) + *blue_y = info_ptr->int_y_blue; + return (PNG_INFO_cHRM); + } + return (0); +} +#endif +#endif + +#if defined(PNG_gAMA_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +png_uint_32 PNGAPI +png_get_gAMA(png_structp png_ptr, png_infop info_ptr, double *file_gamma) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) + && file_gamma != NULL) + { + png_debug1(1, "in %s retrieval function", "gAMA"); + *file_gamma = (double)info_ptr->gamma; + return (PNG_INFO_gAMA); + } + return (0); +} +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED +png_uint_32 PNGAPI +png_get_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, + png_fixed_point *int_file_gamma) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) + && int_file_gamma != NULL) + { + png_debug1(1, "in %s retrieval function", "gAMA"); + *int_file_gamma = info_ptr->int_gamma; + return (PNG_INFO_gAMA); + } + return (0); +} +#endif +#endif + +#if defined(PNG_sRGB_SUPPORTED) +png_uint_32 PNGAPI +png_get_sRGB(png_structp png_ptr, png_infop info_ptr, int *file_srgb_intent) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB) + && file_srgb_intent != NULL) + { + png_debug1(1, "in %s retrieval function", "sRGB"); + *file_srgb_intent = (int)info_ptr->srgb_intent; + return (PNG_INFO_sRGB); + } + return (0); +} +#endif + +#if defined(PNG_iCCP_SUPPORTED) +png_uint_32 PNGAPI +png_get_iCCP(png_structp png_ptr, png_infop info_ptr, + png_charpp name, int *compression_type, + png_charpp profile, png_uint_32 *proflen) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP) + && name != NULL && profile != NULL && proflen != NULL) + { + png_debug1(1, "in %s retrieval function", "iCCP"); + *name = info_ptr->iccp_name; + *profile = info_ptr->iccp_profile; + /* compression_type is a dummy so the API won't have to change + if we introduce multiple compression types later. */ + *proflen = (int)info_ptr->iccp_proflen; + *compression_type = (int)info_ptr->iccp_compression; + return (PNG_INFO_iCCP); + } + return (0); +} +#endif + +#if defined(PNG_sPLT_SUPPORTED) +png_uint_32 PNGAPI +png_get_sPLT(png_structp png_ptr, png_infop info_ptr, + png_sPLT_tpp spalettes) +{ + if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL) + { + *spalettes = info_ptr->splt_palettes; + return ((png_uint_32)info_ptr->splt_palettes_num); + } + return (0); +} +#endif + +#if defined(PNG_hIST_SUPPORTED) +png_uint_32 PNGAPI +png_get_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST) + && hist != NULL) + { + png_debug1(1, "in %s retrieval function", "hIST"); + *hist = info_ptr->hist; + return (PNG_INFO_hIST); + } + return (0); +} +#endif + +png_uint_32 PNGAPI +png_get_IHDR(png_structp png_ptr, png_infop info_ptr, + png_uint_32 *width, png_uint_32 *height, int *bit_depth, + int *color_type, int *interlace_type, int *compression_type, + int *filter_type) + +{ + if (png_ptr != NULL && info_ptr != NULL && width != NULL && height != NULL && + bit_depth != NULL && color_type != NULL) + { + png_debug1(1, "in %s retrieval function", "IHDR"); + *width = info_ptr->width; + *height = info_ptr->height; + *bit_depth = info_ptr->bit_depth; + if (info_ptr->bit_depth < 1 || info_ptr->bit_depth > 16) + png_error(png_ptr, "Invalid bit depth"); + *color_type = info_ptr->color_type; + if (info_ptr->color_type > 6) + png_error(png_ptr, "Invalid color type"); + if (compression_type != NULL) + *compression_type = info_ptr->compression_type; + if (filter_type != NULL) + *filter_type = info_ptr->filter_type; + if (interlace_type != NULL) + *interlace_type = info_ptr->interlace_type; + + /* check for potential overflow of rowbytes */ + if (*width == 0 || *width > PNG_UINT_31_MAX) + png_error(png_ptr, "Invalid image width"); + if (*height == 0 || *height > PNG_UINT_31_MAX) + png_error(png_ptr, "Invalid image height"); + if (info_ptr->width > (PNG_UINT_32_MAX + >> 3) /* 8-byte RGBA pixels */ + - 64 /* bigrowbuf hack */ + - 1 /* filter byte */ + - 7*8 /* rounding of width to multiple of 8 pixels */ + - 8) /* extra max_pixel_depth pad */ + { + png_warning(png_ptr, + "Width too large for libpng to process image data."); + } + return (1); + } + return (0); +} + +#if defined(PNG_oFFs_SUPPORTED) +png_uint_32 PNGAPI +png_get_oFFs(png_structp png_ptr, png_infop info_ptr, + png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs) + && offset_x != NULL && offset_y != NULL && unit_type != NULL) + { + png_debug1(1, "in %s retrieval function", "oFFs"); + *offset_x = info_ptr->x_offset; + *offset_y = info_ptr->y_offset; + *unit_type = (int)info_ptr->offset_unit_type; + return (PNG_INFO_oFFs); + } + return (0); +} +#endif + +#if defined(PNG_pCAL_SUPPORTED) +png_uint_32 PNGAPI +png_get_pCAL(png_structp png_ptr, png_infop info_ptr, + png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams, + png_charp *units, png_charpp *params) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL) + && purpose != NULL && X0 != NULL && X1 != NULL && type != NULL && + nparams != NULL && units != NULL && params != NULL) + { + png_debug1(1, "in %s retrieval function", "pCAL"); + *purpose = info_ptr->pcal_purpose; + *X0 = info_ptr->pcal_X0; + *X1 = info_ptr->pcal_X1; + *type = (int)info_ptr->pcal_type; + *nparams = (int)info_ptr->pcal_nparams; + *units = info_ptr->pcal_units; + *params = info_ptr->pcal_params; + return (PNG_INFO_pCAL); + } + return (0); +} +#endif + +#if defined(PNG_sCAL_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +png_uint_32 PNGAPI +png_get_sCAL(png_structp png_ptr, png_infop info_ptr, + int *unit, double *width, double *height) +{ + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_sCAL)) + { + *unit = info_ptr->scal_unit; + *width = info_ptr->scal_pixel_width; + *height = info_ptr->scal_pixel_height; + return (PNG_INFO_sCAL); + } + return(0); +} +#else +#ifdef PNG_FIXED_POINT_SUPPORTED +png_uint_32 PNGAPI +png_get_sCAL_s(png_structp png_ptr, png_infop info_ptr, + int *unit, png_charpp width, png_charpp height) +{ + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_sCAL)) + { + *unit = info_ptr->scal_unit; + *width = info_ptr->scal_s_width; + *height = info_ptr->scal_s_height; + return (PNG_INFO_sCAL); + } + return(0); +} +#endif +#endif +#endif + +#if defined(PNG_pHYs_SUPPORTED) +png_uint_32 PNGAPI +png_get_pHYs(png_structp png_ptr, png_infop info_ptr, + png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) +{ + png_uint_32 retval = 0; + + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_pHYs)) + { + png_debug1(1, "in %s retrieval function", "pHYs"); + if (res_x != NULL) + { + *res_x = info_ptr->x_pixels_per_unit; + retval |= PNG_INFO_pHYs; + } + if (res_y != NULL) + { + *res_y = info_ptr->y_pixels_per_unit; + retval |= PNG_INFO_pHYs; + } + if (unit_type != NULL) + { + *unit_type = (int)info_ptr->phys_unit_type; + retval |= PNG_INFO_pHYs; + } + } + return (retval); +} +#endif + +png_uint_32 PNGAPI +png_get_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp *palette, + int *num_palette) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE) + && palette != NULL) + { + png_debug1(1, "in %s retrieval function", "PLTE"); + *palette = info_ptr->palette; + *num_palette = info_ptr->num_palette; + png_debug1(3, "num_palette = %d", *num_palette); + return (PNG_INFO_PLTE); + } + return (0); +} + +#if defined(PNG_sBIT_SUPPORTED) +png_uint_32 PNGAPI +png_get_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT) + && sig_bit != NULL) + { + png_debug1(1, "in %s retrieval function", "sBIT"); + *sig_bit = &(info_ptr->sig_bit); + return (PNG_INFO_sBIT); + } + return (0); +} +#endif + +#if defined(PNG_TEXT_SUPPORTED) +png_uint_32 PNGAPI +png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr, + int *num_text) +{ + if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0) + { + png_debug1(1, "in %s retrieval function", + (png_ptr->chunk_name[0] == '\0' ? "text" + : (png_const_charp)png_ptr->chunk_name)); + if (text_ptr != NULL) + *text_ptr = info_ptr->text; + if (num_text != NULL) + *num_text = info_ptr->num_text; + return ((png_uint_32)info_ptr->num_text); + } + if (num_text != NULL) + *num_text = 0; + return(0); +} +#endif + +#if defined(PNG_tIME_SUPPORTED) +png_uint_32 PNGAPI +png_get_tIME(png_structp png_ptr, png_infop info_ptr, png_timep *mod_time) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME) + && mod_time != NULL) + { + png_debug1(1, "in %s retrieval function", "tIME"); + *mod_time = &(info_ptr->mod_time); + return (PNG_INFO_tIME); + } + return (0); +} +#endif + +#if defined(PNG_tRNS_SUPPORTED) +png_uint_32 PNGAPI +png_get_tRNS(png_structp png_ptr, png_infop info_ptr, + png_bytep *trans, int *num_trans, png_color_16p *trans_values) +{ + png_uint_32 retval = 0; + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) + { + png_debug1(1, "in %s retrieval function", "tRNS"); + if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + if (trans != NULL) + { + *trans = info_ptr->trans; + retval |= PNG_INFO_tRNS; + } + if (trans_values != NULL) + *trans_values = &(info_ptr->trans_values); + } + else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */ + { + if (trans_values != NULL) + { + *trans_values = &(info_ptr->trans_values); + retval |= PNG_INFO_tRNS; + } + if (trans != NULL) + *trans = NULL; + } + if (num_trans != NULL) + { + *num_trans = info_ptr->num_trans; + retval |= PNG_INFO_tRNS; + } + } + return (retval); +} +#endif + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) +png_uint_32 PNGAPI +png_get_unknown_chunks(png_structp png_ptr, png_infop info_ptr, + png_unknown_chunkpp unknowns) +{ + if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL) + { + *unknowns = info_ptr->unknown_chunks; + return ((png_uint_32)info_ptr->unknown_chunks_num); + } + return (0); +} +#endif + +#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) +png_byte PNGAPI +png_get_rgb_to_gray_status (png_structp png_ptr) +{ + return (png_byte)(png_ptr? png_ptr->rgb_to_gray_status : 0); +} +#endif + +#if defined(PNG_USER_CHUNKS_SUPPORTED) +png_voidp PNGAPI +png_get_user_chunk_ptr(png_structp png_ptr) +{ + return (png_ptr? png_ptr->user_chunk_ptr : NULL); +} +#endif + +#ifdef PNG_WRITE_SUPPORTED +png_uint_32 PNGAPI +png_get_compression_buffer_size(png_structp png_ptr) +{ + return (png_uint_32)(png_ptr? png_ptr->zbuf_size : 0L); +} +#endif + +#ifdef PNG_ASSEMBLER_CODE_SUPPORTED +#ifndef PNG_1_0_X +/* this function was added to libpng 1.2.0 and should exist by default */ +png_uint_32 PNGAPI +png_get_asm_flags (png_structp png_ptr) +{ + /* obsolete, to be removed from libpng-1.4.0 */ + return (png_ptr? 0L: 0L); +} + +/* this function was added to libpng 1.2.0 and should exist by default */ +png_uint_32 PNGAPI +png_get_asm_flagmask (int flag_select) +{ + /* obsolete, to be removed from libpng-1.4.0 */ + flag_select=flag_select; + return 0L; +} + + /* GRR: could add this: && defined(PNG_MMX_CODE_SUPPORTED) */ +/* this function was added to libpng 1.2.0 */ +png_uint_32 PNGAPI +png_get_mmx_flagmask (int flag_select, int *compilerID) +{ + /* obsolete, to be removed from libpng-1.4.0 */ + flag_select=flag_select; + *compilerID = -1; /* unknown (i.e., no asm/MMX code compiled) */ + return 0L; +} + +/* this function was added to libpng 1.2.0 */ +png_byte PNGAPI +png_get_mmx_bitdepth_threshold (png_structp png_ptr) +{ + /* obsolete, to be removed from libpng-1.4.0 */ + return (png_ptr? 0: 0); +} + +/* this function was added to libpng 1.2.0 */ +png_uint_32 PNGAPI +png_get_mmx_rowbytes_threshold (png_structp png_ptr) +{ + /* obsolete, to be removed from libpng-1.4.0 */ + return (png_ptr? 0L: 0L); +} +#endif /* ?PNG_1_0_X */ +#endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */ + +#ifdef PNG_SET_USER_LIMITS_SUPPORTED +/* These functions were added to libpng 1.2.6 */ +png_uint_32 PNGAPI +png_get_user_width_max (png_structp png_ptr) +{ + return (png_ptr? png_ptr->user_width_max : 0); +} +png_uint_32 PNGAPI +png_get_user_height_max (png_structp png_ptr) +{ + return (png_ptr? png_ptr->user_height_max : 0); +} +#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ + + +#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/navit/support/libpng/pngmem.c b/navit/support/libpng/pngmem.c new file mode 100644 index 0000000..f3394d7 --- /dev/null +++ b/navit/support/libpng/pngmem.c @@ -0,0 +1,610 @@ + +/* pngmem.c - stub functions for memory allocation + * + * Last changed in libpng 1.2.30 [August 15, 2008] + * For conditions of distribution and use, see copyright notice in png.h + * Copyright (c) 1998-2008 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This file provides a location for all memory allocation. Users who + * need special memory handling are expected to supply replacement + * functions for png_malloc() and png_free(), and to use + * png_create_read_struct_2() and png_create_write_struct_2() to + * identify the replacement functions. + */ + +#define PNG_INTERNAL +#include "png.h" +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + +/* Borland DOS special memory handler */ +#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) +/* if you change this, be sure to change the one in png.h also */ + +/* Allocate memory for a png_struct. The malloc and memset can be replaced + by a single call to calloc() if this is thought to improve performance. */ +png_voidp /* PRIVATE */ +png_create_struct(int type) +{ +#ifdef PNG_USER_MEM_SUPPORTED + return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); +} + +/* Alternate version of png_create_struct, for use with user-defined malloc. */ +png_voidp /* PRIVATE */ +png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) +{ +#endif /* PNG_USER_MEM_SUPPORTED */ + png_size_t size; + png_voidp struct_ptr; + + if (type == PNG_STRUCT_INFO) + size = png_sizeof(png_info); + else if (type == PNG_STRUCT_PNG) + size = png_sizeof(png_struct); + else + return (png_get_copyright(NULL)); + +#ifdef PNG_USER_MEM_SUPPORTED + if (malloc_fn != NULL) + { + png_struct dummy_struct; + png_structp png_ptr = &dummy_struct; + png_ptr->mem_ptr=mem_ptr; + struct_ptr = (*(malloc_fn))(png_ptr, (png_uint_32)size); + } + else +#endif /* PNG_USER_MEM_SUPPORTED */ + struct_ptr = (png_voidp)farmalloc(size); + if (struct_ptr != NULL) + png_memset(struct_ptr, 0, size); + return (struct_ptr); +} + +/* Free memory allocated by a png_create_struct() call */ +void /* PRIVATE */ +png_destroy_struct(png_voidp struct_ptr) +{ +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); +} + +/* Free memory allocated by a png_create_struct() call */ +void /* PRIVATE */ +png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, + png_voidp mem_ptr) +{ +#endif + if (struct_ptr != NULL) + { +#ifdef PNG_USER_MEM_SUPPORTED + if (free_fn != NULL) + { + png_struct dummy_struct; + png_structp png_ptr = &dummy_struct; + png_ptr->mem_ptr=mem_ptr; + (*(free_fn))(png_ptr, struct_ptr); + return; + } +#endif /* PNG_USER_MEM_SUPPORTED */ + farfree (struct_ptr); + } +} + +/* Allocate memory. For reasonable files, size should never exceed + * 64K. However, zlib may allocate more then 64K if you don't tell + * it not to. See zconf.h and png.h for more information. zlib does + * need to allocate exactly 64K, so whatever you call here must + * have the ability to do that. + * + * Borland seems to have a problem in DOS mode for exactly 64K. + * It gives you a segment with an offset of 8 (perhaps to store its + * memory stuff). zlib doesn't like this at all, so we have to + * detect and deal with it. This code should not be needed in + * Windows or OS/2 modes, and only in 16 bit mode. This code has + * been updated by Alexander Lehmann for version 0.89 to waste less + * memory. + * + * Note that we can't use png_size_t for the "size" declaration, + * since on some systems a png_size_t is a 16-bit quantity, and as a + * result, we would be truncating potentially larger memory requests + * (which should cause a fatal error) and introducing major problems. + */ + +png_voidp PNGAPI +png_malloc(png_structp png_ptr, png_uint_32 size) +{ + png_voidp ret; + + if (png_ptr == NULL || size == 0) + return (NULL); + +#ifdef PNG_USER_MEM_SUPPORTED + if (png_ptr->malloc_fn != NULL) + ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); + else + ret = (png_malloc_default(png_ptr, size)); + if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out of memory!"); + return (ret); +} + +png_voidp PNGAPI +png_malloc_default(png_structp png_ptr, png_uint_32 size) +{ + png_voidp ret; +#endif /* PNG_USER_MEM_SUPPORTED */ + + if (png_ptr == NULL || size == 0) + return (NULL); + +#ifdef PNG_MAX_MALLOC_64K + if (size > (png_uint_32)65536L) + { + png_warning(png_ptr, "Cannot Allocate > 64K"); + ret = NULL; + } + else +#endif + + if (size != (size_t)size) + ret = NULL; + else if (size == (png_uint_32)65536L) + { + if (png_ptr->offset_table == NULL) + { + /* try to see if we need to do any of this fancy stuff */ + ret = farmalloc(size); + if (ret == NULL || ((png_size_t)ret & 0xffff)) + { + int num_blocks; + png_uint_32 total_size; + png_bytep table; + int i; + png_byte huge * hptr; + + if (ret != NULL) + { + farfree(ret); + ret = NULL; + } + + if (png_ptr->zlib_window_bits > 14) + num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14)); + else + num_blocks = 1; + if (png_ptr->zlib_mem_level >= 7) + num_blocks += (int)(1 << (png_ptr->zlib_mem_level - 7)); + else + num_blocks++; + + total_size = ((png_uint_32)65536L) * (png_uint_32)num_blocks+16; + + table = farmalloc(total_size); + + if (table == NULL) + { +#ifndef PNG_USER_MEM_SUPPORTED + if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out Of Memory."); /* Note "O" and "M" */ + else + png_warning(png_ptr, "Out Of Memory."); +#endif + return (NULL); + } + + if ((png_size_t)table & 0xfff0) + { +#ifndef PNG_USER_MEM_SUPPORTED + if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, + "Farmalloc didn't return normalized pointer"); + else + png_warning(png_ptr, + "Farmalloc didn't return normalized pointer"); +#endif + return (NULL); + } + + png_ptr->offset_table = table; + png_ptr->offset_table_ptr = farmalloc(num_blocks * + png_sizeof(png_bytep)); + + if (png_ptr->offset_table_ptr == NULL) + { +#ifndef PNG_USER_MEM_SUPPORTED + if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out Of memory."); /* Note "O" and "M" */ + else + png_warning(png_ptr, "Out Of memory."); +#endif + return (NULL); + } + + hptr = (png_byte huge *)table; + if ((png_size_t)hptr & 0xf) + { + hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L); + hptr = hptr + 16L; /* "hptr += 16L" fails on Turbo C++ 3.0 */ + } + for (i = 0; i < num_blocks; i++) + { + png_ptr->offset_table_ptr[i] = (png_bytep)hptr; + hptr = hptr + (png_uint_32)65536L; /* "+=" fails on TC++3.0 */ + } + + png_ptr->offset_table_number = num_blocks; + png_ptr->offset_table_count = 0; + png_ptr->offset_table_count_free = 0; + } + } + + if (png_ptr->offset_table_count >= png_ptr->offset_table_number) + { +#ifndef PNG_USER_MEM_SUPPORTED + if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out of Memory."); /* Note "o" and "M" */ + else + png_warning(png_ptr, "Out of Memory."); +#endif + return (NULL); + } + + ret = png_ptr->offset_table_ptr[png_ptr->offset_table_count++]; + } + else + ret = farmalloc(size); + +#ifndef PNG_USER_MEM_SUPPORTED + if (ret == NULL) + { + if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out of memory."); /* Note "o" and "m" */ + else + png_warning(png_ptr, "Out of memory."); /* Note "o" and "m" */ + } +#endif + + return (ret); +} + +/* free a pointer allocated by png_malloc(). In the default + configuration, png_ptr is not used, but is passed in case it + is needed. If ptr is NULL, return without taking any action. */ + +void PNGAPI +png_free(png_structp png_ptr, png_voidp ptr) +{ + if (png_ptr == NULL || ptr == NULL) + return; + +#ifdef PNG_USER_MEM_SUPPORTED + if (png_ptr->free_fn != NULL) + { + (*(png_ptr->free_fn))(png_ptr, ptr); + return; + } + else png_free_default(png_ptr, ptr); +} + +void PNGAPI +png_free_default(png_structp png_ptr, png_voidp ptr) +{ +#endif /* PNG_USER_MEM_SUPPORTED */ + + if (png_ptr == NULL || ptr == NULL) return; + + if (png_ptr->offset_table != NULL) + { + int i; + + for (i = 0; i < png_ptr->offset_table_count; i++) + { + if (ptr == png_ptr->offset_table_ptr[i]) + { + ptr = NULL; + png_ptr->offset_table_count_free++; + break; + } + } + if (png_ptr->offset_table_count_free == png_ptr->offset_table_count) + { + farfree(png_ptr->offset_table); + farfree(png_ptr->offset_table_ptr); + png_ptr->offset_table = NULL; + png_ptr->offset_table_ptr = NULL; + } + } + + if (ptr != NULL) + { + farfree(ptr); + } +} + +#else /* Not the Borland DOS special memory handler */ + +/* Allocate memory for a png_struct or a png_info. The malloc and + memset can be replaced by a single call to calloc() if this is thought + to improve performance noticably. */ +png_voidp /* PRIVATE */ +png_create_struct(int type) +{ +#ifdef PNG_USER_MEM_SUPPORTED + return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); +} + +/* Allocate memory for a png_struct or a png_info. The malloc and + memset can be replaced by a single call to calloc() if this is thought + to improve performance noticably. */ +png_voidp /* PRIVATE */ +png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) +{ +#endif /* PNG_USER_MEM_SUPPORTED */ + png_size_t size; + png_voidp struct_ptr; + + if (type == PNG_STRUCT_INFO) + size = png_sizeof(png_info); + else if (type == PNG_STRUCT_PNG) + size = png_sizeof(png_struct); + else + return (NULL); + +#ifdef PNG_USER_MEM_SUPPORTED + if (malloc_fn != NULL) + { + png_struct dummy_struct; + png_structp png_ptr = &dummy_struct; + png_ptr->mem_ptr=mem_ptr; + struct_ptr = (*(malloc_fn))(png_ptr, size); + if (struct_ptr != NULL) + png_memset(struct_ptr, 0, size); + return (struct_ptr); + } +#endif /* PNG_USER_MEM_SUPPORTED */ + +#if defined(__TURBOC__) && !defined(__FLAT__) + struct_ptr = (png_voidp)farmalloc(size); +#else +# if defined(_MSC_VER) && defined(MAXSEG_64K) + struct_ptr = (png_voidp)halloc(size, 1); +# else + struct_ptr = (png_voidp)malloc(size); +# endif +#endif + if (struct_ptr != NULL) + png_memset(struct_ptr, 0, size); + + return (struct_ptr); +} + + +/* Free memory allocated by a png_create_struct() call */ +void /* PRIVATE */ +png_destroy_struct(png_voidp struct_ptr) +{ +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); +} + +/* Free memory allocated by a png_create_struct() call */ +void /* PRIVATE */ +png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, + png_voidp mem_ptr) +{ +#endif /* PNG_USER_MEM_SUPPORTED */ + if (struct_ptr != NULL) + { +#ifdef PNG_USER_MEM_SUPPORTED + if (free_fn != NULL) + { + png_struct dummy_struct; + png_structp png_ptr = &dummy_struct; + png_ptr->mem_ptr=mem_ptr; + (*(free_fn))(png_ptr, struct_ptr); + return; + } +#endif /* PNG_USER_MEM_SUPPORTED */ +#if defined(__TURBOC__) && !defined(__FLAT__) + farfree(struct_ptr); +#else +# if defined(_MSC_VER) && defined(MAXSEG_64K) + hfree(struct_ptr); +# else + free(struct_ptr); +# endif +#endif + } +} + +/* Allocate memory. For reasonable files, size should never exceed + 64K. However, zlib may allocate more then 64K if you don't tell + it not to. See zconf.h and png.h for more information. zlib does + need to allocate exactly 64K, so whatever you call here must + have the ability to do that. */ + + +png_voidp PNGAPI +png_malloc(png_structp png_ptr, png_uint_32 size) +{ + png_voidp ret; + +#ifdef PNG_USER_MEM_SUPPORTED + if (png_ptr == NULL || size == 0) + return (NULL); + + if (png_ptr->malloc_fn != NULL) + ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); + else + ret = (png_malloc_default(png_ptr, size)); + if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out of Memory!"); + return (ret); +} + +png_voidp PNGAPI +png_malloc_default(png_structp png_ptr, png_uint_32 size) +{ + png_voidp ret; +#endif /* PNG_USER_MEM_SUPPORTED */ + + if (png_ptr == NULL || size == 0) + return (NULL); + +#ifdef PNG_MAX_MALLOC_64K + if (size > (png_uint_32)65536L) + { +#ifndef PNG_USER_MEM_SUPPORTED + if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Cannot Allocate > 64K"); + else +#endif + return NULL; + } +#endif + + /* Check for overflow */ +#if defined(__TURBOC__) && !defined(__FLAT__) + if (size != (unsigned long)size) + ret = NULL; + else + ret = farmalloc(size); +#else +# if defined(_MSC_VER) && defined(MAXSEG_64K) + if (size != (unsigned long)size) + ret = NULL; + else + ret = halloc(size, 1); +# else + if (size != (size_t)size) + ret = NULL; + else + ret = malloc((size_t)size); +# endif +#endif + +#ifndef PNG_USER_MEM_SUPPORTED + if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out of Memory"); +#endif + + return (ret); +} + +/* Free a pointer allocated by png_malloc(). If ptr is NULL, return + without taking any action. */ +void PNGAPI +png_free(png_structp png_ptr, png_voidp ptr) +{ + if (png_ptr == NULL || ptr == NULL) + return; + +#ifdef PNG_USER_MEM_SUPPORTED + if (png_ptr->free_fn != NULL) + { + (*(png_ptr->free_fn))(png_ptr, ptr); + return; + } + else png_free_default(png_ptr, ptr); +} +void PNGAPI +png_free_default(png_structp png_ptr, png_voidp ptr) +{ + if (png_ptr == NULL || ptr == NULL) + return; + +#endif /* PNG_USER_MEM_SUPPORTED */ + +#if defined(__TURBOC__) && !defined(__FLAT__) + farfree(ptr); +#else +# if defined(_MSC_VER) && defined(MAXSEG_64K) + hfree(ptr); +# else + free(ptr); +# endif +#endif +} + +#endif /* Not Borland DOS special memory handler */ + +#if defined(PNG_1_0_X) +# define png_malloc_warn png_malloc +#else +/* This function was added at libpng version 1.2.3. The png_malloc_warn() + * function will set up png_malloc() to issue a png_warning and return NULL + * instead of issuing a png_error, if it fails to allocate the requested + * memory. + */ +png_voidp PNGAPI +png_malloc_warn(png_structp png_ptr, png_uint_32 size) +{ + png_voidp ptr; + png_uint_32 save_flags; + if (png_ptr == NULL) return (NULL); + + save_flags = png_ptr->flags; + png_ptr->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK; + ptr = (png_voidp)png_malloc((png_structp)png_ptr, size); + png_ptr->flags=save_flags; + return(ptr); +} +#endif + +png_voidp PNGAPI +png_memcpy_check (png_structp png_ptr, png_voidp s1, png_voidp s2, + png_uint_32 length) +{ + png_size_t size; + + size = (png_size_t)length; + if ((png_uint_32)size != length) + png_error(png_ptr, "Overflow in png_memcpy_check."); + + return(png_memcpy (s1, s2, size)); +} + +png_voidp PNGAPI +png_memset_check (png_structp png_ptr, png_voidp s1, int value, + png_uint_32 length) +{ + png_size_t size; + + size = (png_size_t)length; + if ((png_uint_32)size != length) + png_error(png_ptr, "Overflow in png_memset_check."); + + return (png_memset (s1, value, size)); + +} + +#ifdef PNG_USER_MEM_SUPPORTED +/* This function is called when the application wants to use another method + * of allocating and freeing memory. + */ +void PNGAPI +png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr + malloc_fn, png_free_ptr free_fn) +{ + if (png_ptr != NULL) + { + png_ptr->mem_ptr = mem_ptr; + png_ptr->malloc_fn = malloc_fn; + png_ptr->free_fn = free_fn; + } +} + +/* This function returns a pointer to the mem_ptr associated with the user + * functions. The application should free any memory associated with this + * pointer before png_write_destroy and png_read_destroy are called. + */ +png_voidp PNGAPI +png_get_mem_ptr(png_structp png_ptr) +{ + if (png_ptr == NULL) return (NULL); + return ((png_voidp)png_ptr->mem_ptr); +} +#endif /* PNG_USER_MEM_SUPPORTED */ +#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/navit/support/libpng/pngread.c b/navit/support/libpng/pngread.c new file mode 100644 index 0000000..8e9c0cb --- /dev/null +++ b/navit/support/libpng/pngread.c @@ -0,0 +1,1459 @@ + +/* pngread.c - read a PNG file + * + * Last changed in libpng 1.2.35 [February 14, 2009] + * For conditions of distribution and use, see copyright notice in png.h + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This file contains routines that an application calls directly to + * read a PNG file or stream. + */ + +#define PNG_INTERNAL +#include "png.h" +#if defined(PNG_READ_SUPPORTED) + +/* Create a PNG structure for reading, and allocate any memory needed. */ +png_structp PNGAPI +png_create_read_struct(png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn) +{ + +#ifdef PNG_USER_MEM_SUPPORTED + return (png_create_read_struct_2(user_png_ver, error_ptr, error_fn, + warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL)); +} + +/* Alternate create PNG structure for reading, and allocate any memory needed. */ +png_structp PNGAPI +png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, + png_malloc_ptr malloc_fn, png_free_ptr free_fn) +{ +#endif /* PNG_USER_MEM_SUPPORTED */ + +#ifdef PNG_SETJMP_SUPPORTED + volatile +#endif + png_structp png_ptr; + +#ifdef PNG_SETJMP_SUPPORTED +#ifdef USE_FAR_KEYWORD + jmp_buf jmpbuf; +#endif +#endif + + int i; + + png_debug(1, "in png_create_read_struct"); +#ifdef PNG_USER_MEM_SUPPORTED + png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, + (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); +#else + png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); +#endif + if (png_ptr == NULL) + return (NULL); + + /* added at libpng-1.2.6 */ +#ifdef PNG_SET_USER_LIMITS_SUPPORTED + png_ptr->user_width_max=PNG_USER_WIDTH_MAX; + png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; +#endif + +#ifdef PNG_SETJMP_SUPPORTED +#ifdef USE_FAR_KEYWORD + if (setjmp(jmpbuf)) +#else + if (setjmp(png_ptr->jmpbuf)) +#endif + { + png_free(png_ptr, png_ptr->zbuf); + png_ptr->zbuf = NULL; +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)png_ptr, + (png_free_ptr)free_fn, (png_voidp)mem_ptr); +#else + png_destroy_struct((png_voidp)png_ptr); +#endif + return (NULL); + } +#ifdef USE_FAR_KEYWORD + png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf)); +#endif +#endif + +#ifdef PNG_USER_MEM_SUPPORTED + png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn); +#endif + + png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn); + + if (user_png_ver) + { + i = 0; + do + { + if (user_png_ver[i] != png_libpng_ver[i]) + png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; + } while (png_libpng_ver[i++]); + } + else + png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; + + + if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) + { + /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so + * we must recompile any applications that use any older library version. + * For versions after libpng 1.0, we will be compatible, so we need + * only check the first digit. + */ + if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] || + (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) || + (user_png_ver[0] == '0' && user_png_ver[2] < '9')) + { +#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) + char msg[80]; + if (user_png_ver) + { + png_snprintf(msg, 80, + "Application was compiled with png.h from libpng-%.20s", + user_png_ver); + png_warning(png_ptr, msg); + } + png_snprintf(msg, 80, + "Application is running with png.c from libpng-%.20s", + png_libpng_ver); + png_warning(png_ptr, msg); +#endif +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + png_ptr->flags = 0; +#endif + png_error(png_ptr, + "Incompatible libpng version in application and library"); + } + } + + /* initialize zbuf - compression buffer */ + png_ptr->zbuf_size = PNG_ZBUF_SIZE; + png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, + (png_uint_32)png_ptr->zbuf_size); + png_ptr->zstream.zalloc = png_zalloc; + png_ptr->zstream.zfree = png_zfree; + png_ptr->zstream.opaque = (voidpf)png_ptr; + + switch (inflateInit(&png_ptr->zstream)) + { + case Z_OK: /* Do nothing */ break; + case Z_MEM_ERROR: + case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory error"); break; + case Z_VERSION_ERROR: png_error(png_ptr, "zlib version error"); break; + default: png_error(png_ptr, "Unknown zlib error"); + } + + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + + png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL); + +#ifdef PNG_SETJMP_SUPPORTED +/* Applications that neglect to set up their own setjmp() and then encounter + a png_error() will longjmp here. Since the jmpbuf is then meaningless we + abort instead of returning. */ +#ifdef USE_FAR_KEYWORD + if (setjmp(jmpbuf)) + PNG_ABORT(); + png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf)); +#else + if (setjmp(png_ptr->jmpbuf)) + PNG_ABORT(); +#endif +#endif + return (png_ptr); +} + +#if defined(PNG_1_0_X) || defined(PNG_1_2_X) +/* Initialize PNG structure for reading, and allocate any memory needed. + This interface is deprecated in favour of the png_create_read_struct(), + and it will disappear as of libpng-1.3.0. */ +#undef png_read_init +void PNGAPI +png_read_init(png_structp png_ptr) +{ + /* We only come here via pre-1.0.7-compiled applications */ + png_read_init_2(png_ptr, "1.0.6 or earlier", 0, 0); +} + +void PNGAPI +png_read_init_2(png_structp png_ptr, png_const_charp user_png_ver, + png_size_t png_struct_size, png_size_t png_info_size) +{ + /* We only come here via pre-1.0.12-compiled applications */ + if (png_ptr == NULL) return; +#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) + if (png_sizeof(png_struct) > png_struct_size || + png_sizeof(png_info) > png_info_size) + { + char msg[80]; + png_ptr->warning_fn = NULL; + if (user_png_ver) + { + png_snprintf(msg, 80, + "Application was compiled with png.h from libpng-%.20s", + user_png_ver); + png_warning(png_ptr, msg); + } + png_snprintf(msg, 80, + "Application is running with png.c from libpng-%.20s", + png_libpng_ver); + png_warning(png_ptr, msg); + } +#endif + if (png_sizeof(png_struct) > png_struct_size) + { + png_ptr->error_fn = NULL; +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + png_ptr->flags = 0; +#endif + png_error(png_ptr, + "The png struct allocated by the application for reading is too small."); + } + if (png_sizeof(png_info) > png_info_size) + { + png_ptr->error_fn = NULL; +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + png_ptr->flags = 0; +#endif + png_error(png_ptr, + "The info struct allocated by application for reading is too small."); + } + png_read_init_3(&png_ptr, user_png_ver, png_struct_size); +} +#endif /* PNG_1_0_X || PNG_1_2_X */ + +void PNGAPI +png_read_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver, + png_size_t png_struct_size) +{ +#ifdef PNG_SETJMP_SUPPORTED + jmp_buf tmp_jmp; /* to save current jump buffer */ +#endif + + int i = 0; + + png_structp png_ptr=*ptr_ptr; + + if (png_ptr == NULL) return; + + do + { + if (user_png_ver[i] != png_libpng_ver[i]) + { +#ifdef PNG_LEGACY_SUPPORTED + png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; +#else + png_ptr->warning_fn = NULL; + png_warning(png_ptr, + "Application uses deprecated png_read_init() and should be recompiled."); + break; +#endif + } + } while (png_libpng_ver[i++]); + + png_debug(1, "in png_read_init_3"); + +#ifdef PNG_SETJMP_SUPPORTED + /* save jump buffer and error functions */ + png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf)); +#endif + + if (png_sizeof(png_struct) > png_struct_size) + { + png_destroy_struct(png_ptr); + *ptr_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); + png_ptr = *ptr_ptr; + } + + /* reset all variables to 0 */ + png_memset(png_ptr, 0, png_sizeof(png_struct)); + +#ifdef PNG_SETJMP_SUPPORTED + /* restore jump buffer */ + png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf)); +#endif + + /* added at libpng-1.2.6 */ +#ifdef PNG_SET_USER_LIMITS_SUPPORTED + png_ptr->user_width_max=PNG_USER_WIDTH_MAX; + png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; +#endif + + /* initialize zbuf - compression buffer */ + png_ptr->zbuf_size = PNG_ZBUF_SIZE; + png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, + (png_uint_32)png_ptr->zbuf_size); + png_ptr->zstream.zalloc = png_zalloc; + png_ptr->zstream.zfree = png_zfree; + png_ptr->zstream.opaque = (voidpf)png_ptr; + + switch (inflateInit(&png_ptr->zstream)) + { + case Z_OK: /* Do nothing */ break; + case Z_MEM_ERROR: + case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory"); break; + case Z_VERSION_ERROR: png_error(png_ptr, "zlib version"); break; + default: png_error(png_ptr, "Unknown zlib error"); + } + + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + + png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL); +} + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* Read the information before the actual image data. This has been + * changed in v0.90 to allow reading a file that already has the magic + * bytes read from the stream. You can tell libpng how many bytes have + * been read from the beginning of the stream (up to the maximum of 8) + * via png_set_sig_bytes(), and we will only check the remaining bytes + * here. The application can then have access to the signature bytes we + * read if it is determined that this isn't a valid PNG file. + */ +void PNGAPI +png_read_info(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr == NULL || info_ptr == NULL) return; + png_debug(1, "in png_read_info"); + /* If we haven't checked all of the PNG signature bytes, do so now. */ + if (png_ptr->sig_bytes < 8) + { + png_size_t num_checked = png_ptr->sig_bytes, + num_to_check = 8 - num_checked; + + png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check); + png_ptr->sig_bytes = 8; + + if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) + { + if (num_checked < 4 && + png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) + png_error(png_ptr, "Not a PNG file"); + else + png_error(png_ptr, "PNG file corrupted by ASCII conversion"); + } + if (num_checked < 3) + png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE; + } + + for (;;) + { +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_CONST PNG_IHDR; + PNG_CONST PNG_IDAT; + PNG_CONST PNG_IEND; + PNG_CONST PNG_PLTE; +#if defined(PNG_READ_bKGD_SUPPORTED) + PNG_CONST PNG_bKGD; +#endif +#if defined(PNG_READ_cHRM_SUPPORTED) + PNG_CONST PNG_cHRM; +#endif +#if defined(PNG_READ_gAMA_SUPPORTED) + PNG_CONST PNG_gAMA; +#endif +#if defined(PNG_READ_hIST_SUPPORTED) + PNG_CONST PNG_hIST; +#endif +#if defined(PNG_READ_iCCP_SUPPORTED) + PNG_CONST PNG_iCCP; +#endif +#if defined(PNG_READ_iTXt_SUPPORTED) + PNG_CONST PNG_iTXt; +#endif +#if defined(PNG_READ_oFFs_SUPPORTED) + PNG_CONST PNG_oFFs; +#endif +#if defined(PNG_READ_pCAL_SUPPORTED) + PNG_CONST PNG_pCAL; +#endif +#if defined(PNG_READ_pHYs_SUPPORTED) + PNG_CONST PNG_pHYs; +#endif +#if defined(PNG_READ_sBIT_SUPPORTED) + PNG_CONST PNG_sBIT; +#endif +#if defined(PNG_READ_sCAL_SUPPORTED) + PNG_CONST PNG_sCAL; +#endif +#if defined(PNG_READ_sPLT_SUPPORTED) + PNG_CONST PNG_sPLT; +#endif +#if defined(PNG_READ_sRGB_SUPPORTED) + PNG_CONST PNG_sRGB; +#endif +#if defined(PNG_READ_tEXt_SUPPORTED) + PNG_CONST PNG_tEXt; +#endif +#if defined(PNG_READ_tIME_SUPPORTED) + PNG_CONST PNG_tIME; +#endif +#if defined(PNG_READ_tRNS_SUPPORTED) + PNG_CONST PNG_tRNS; +#endif +#if defined(PNG_READ_zTXt_SUPPORTED) + PNG_CONST PNG_zTXt; +#endif +#endif /* PNG_USE_LOCAL_ARRAYS */ + png_uint_32 length = png_read_chunk_header(png_ptr); + PNG_CONST png_bytep chunk_name = png_ptr->chunk_name; + + /* This should be a binary subdivision search or a hash for + * matching the chunk name rather than a linear search. + */ + if (!png_memcmp(chunk_name, png_IDAT, 4)) + if (png_ptr->mode & PNG_AFTER_IDAT) + png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; + + if (!png_memcmp(chunk_name, png_IHDR, 4)) + png_handle_IHDR(png_ptr, info_ptr, length); + else if (!png_memcmp(chunk_name, png_IEND, 4)) + png_handle_IEND(png_ptr, info_ptr, length); +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED + else if (png_handle_as_unknown(png_ptr, chunk_name)) + { + if (!png_memcmp(chunk_name, png_IDAT, 4)) + png_ptr->mode |= PNG_HAVE_IDAT; + png_handle_unknown(png_ptr, info_ptr, length); + if (!png_memcmp(chunk_name, png_PLTE, 4)) + png_ptr->mode |= PNG_HAVE_PLTE; + else if (!png_memcmp(chunk_name, png_IDAT, 4)) + { + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before IDAT"); + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && + !(png_ptr->mode & PNG_HAVE_PLTE)) + png_error(png_ptr, "Missing PLTE before IDAT"); + break; + } + } +#endif + else if (!png_memcmp(chunk_name, png_PLTE, 4)) + png_handle_PLTE(png_ptr, info_ptr, length); + else if (!png_memcmp(chunk_name, png_IDAT, 4)) + { + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before IDAT"); + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && + !(png_ptr->mode & PNG_HAVE_PLTE)) + png_error(png_ptr, "Missing PLTE before IDAT"); + + png_ptr->idat_size = length; + png_ptr->mode |= PNG_HAVE_IDAT; + break; + } +#if defined(PNG_READ_bKGD_SUPPORTED) + else if (!png_memcmp(chunk_name, png_bKGD, 4)) + png_handle_bKGD(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_cHRM_SUPPORTED) + else if (!png_memcmp(chunk_name, png_cHRM, 4)) + png_handle_cHRM(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_gAMA_SUPPORTED) + else if (!png_memcmp(chunk_name, png_gAMA, 4)) + png_handle_gAMA(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_hIST_SUPPORTED) + else if (!png_memcmp(chunk_name, png_hIST, 4)) + png_handle_hIST(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_oFFs_SUPPORTED) + else if (!png_memcmp(chunk_name, png_oFFs, 4)) + png_handle_oFFs(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_pCAL_SUPPORTED) + else if (!png_memcmp(chunk_name, png_pCAL, 4)) + png_handle_pCAL(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_sCAL_SUPPORTED) + else if (!png_memcmp(chunk_name, png_sCAL, 4)) + png_handle_sCAL(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_pHYs_SUPPORTED) + else if (!png_memcmp(chunk_name, png_pHYs, 4)) + png_handle_pHYs(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_sBIT_SUPPORTED) + else if (!png_memcmp(chunk_name, png_sBIT, 4)) + png_handle_sBIT(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_sRGB_SUPPORTED) + else if (!png_memcmp(chunk_name, png_sRGB, 4)) + png_handle_sRGB(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_iCCP_SUPPORTED) + else if (!png_memcmp(chunk_name, png_iCCP, 4)) + png_handle_iCCP(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_sPLT_SUPPORTED) + else if (!png_memcmp(chunk_name, png_sPLT, 4)) + png_handle_sPLT(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_tEXt_SUPPORTED) + else if (!png_memcmp(chunk_name, png_tEXt, 4)) + png_handle_tEXt(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_tIME_SUPPORTED) + else if (!png_memcmp(chunk_name, png_tIME, 4)) + png_handle_tIME(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_tRNS_SUPPORTED) + else if (!png_memcmp(chunk_name, png_tRNS, 4)) + png_handle_tRNS(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_zTXt_SUPPORTED) + else if (!png_memcmp(chunk_name, png_zTXt, 4)) + png_handle_zTXt(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_iTXt_SUPPORTED) + else if (!png_memcmp(chunk_name, png_iTXt, 4)) + png_handle_iTXt(png_ptr, info_ptr, length); +#endif + else + png_handle_unknown(png_ptr, info_ptr, length); + } +} +#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ + +/* optional call to update the users info_ptr structure */ +void PNGAPI +png_read_update_info(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_read_update_info"); + if (png_ptr == NULL) return; + if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) + png_read_start_row(png_ptr); + else + png_warning(png_ptr, + "Ignoring extra png_read_update_info() call; row buffer not reallocated"); + png_read_transform_info(png_ptr, info_ptr); +} + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* Initialize palette, background, etc, after transformations + * are set, but before any reading takes place. This allows + * the user to obtain a gamma-corrected palette, for example. + * If the user doesn't call this, we will do it ourselves. + */ +void PNGAPI +png_start_read_image(png_structp png_ptr) +{ + png_debug(1, "in png_start_read_image"); + if (png_ptr == NULL) return; + if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) + png_read_start_row(png_ptr); +} +#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +void PNGAPI +png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_CONST PNG_IDAT; + PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, + 0xff}; + PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff}; +#endif + int ret; + if (png_ptr == NULL) return; + png_debug2(1, "in png_read_row (row %lu, pass %d)", + png_ptr->row_number, png_ptr->pass); + if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) + png_read_start_row(png_ptr); + if (png_ptr->row_number == 0 && png_ptr->pass == 0) + { + /* check for transforms that have been set but were defined out */ +#if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED) + if (png_ptr->transformations & PNG_INVERT_MONO) + png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined."); +#endif +#if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED) + if (png_ptr->transformations & PNG_FILLER) + png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined."); +#endif +#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && !defined(PNG_READ_PACKSWAP_SUPPORTED) + if (png_ptr->transformations & PNG_PACKSWAP) + png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined."); +#endif +#if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED) + if (png_ptr->transformations & PNG_PACK) + png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined."); +#endif +#if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) + if (png_ptr->transformations & PNG_SHIFT) + png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined."); +#endif +#if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED) + if (png_ptr->transformations & PNG_BGR) + png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined."); +#endif +#if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED) + if (png_ptr->transformations & PNG_SWAP_BYTES) + png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined."); +#endif + } + +#if defined(PNG_READ_INTERLACING_SUPPORTED) + /* if interlaced and we do not need a new row, combine row and return */ + if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) + { + switch (png_ptr->pass) + { + case 0: + if (png_ptr->row_number & 0x07) + { + if (dsp_row != NULL) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + png_read_finish_row(png_ptr); + return; + } + break; + case 1: + if ((png_ptr->row_number & 0x07) || png_ptr->width < 5) + { + if (dsp_row != NULL) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + png_read_finish_row(png_ptr); + return; + } + break; + case 2: + if ((png_ptr->row_number & 0x07) != 4) + { + if (dsp_row != NULL && (png_ptr->row_number & 4)) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + png_read_finish_row(png_ptr); + return; + } + break; + case 3: + if ((png_ptr->row_number & 3) || png_ptr->width < 3) + { + if (dsp_row != NULL) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + png_read_finish_row(png_ptr); + return; + } + break; + case 4: + if ((png_ptr->row_number & 3) != 2) + { + if (dsp_row != NULL && (png_ptr->row_number & 2)) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + png_read_finish_row(png_ptr); + return; + } + break; + case 5: + if ((png_ptr->row_number & 1) || png_ptr->width < 2) + { + if (dsp_row != NULL) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + png_read_finish_row(png_ptr); + return; + } + break; + case 6: + if (!(png_ptr->row_number & 1)) + { + png_read_finish_row(png_ptr); + return; + } + break; + } + } +#endif + + if (!(png_ptr->mode & PNG_HAVE_IDAT)) + png_error(png_ptr, "Invalid attempt to read row data"); + + png_ptr->zstream.next_out = png_ptr->row_buf; + png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; + do + { + if (!(png_ptr->zstream.avail_in)) + { + while (!png_ptr->idat_size) + { + png_crc_finish(png_ptr, 0); + + png_ptr->idat_size = png_read_chunk_header(png_ptr); + if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) + png_error(png_ptr, "Not enough image data"); + } + png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size; + png_ptr->zstream.next_in = png_ptr->zbuf; + if (png_ptr->zbuf_size > png_ptr->idat_size) + png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size; + png_crc_read(png_ptr, png_ptr->zbuf, + (png_size_t)png_ptr->zstream.avail_in); + png_ptr->idat_size -= png_ptr->zstream.avail_in; + } + ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); + if (ret == Z_STREAM_END) + { + if (png_ptr->zstream.avail_out || png_ptr->zstream.avail_in || + png_ptr->idat_size) + png_error(png_ptr, "Extra compressed data"); + png_ptr->mode |= PNG_AFTER_IDAT; + png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; + break; + } + if (ret != Z_OK) + png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg : + "Decompression error"); + + } while (png_ptr->zstream.avail_out); + + png_ptr->row_info.color_type = png_ptr->color_type; + png_ptr->row_info.width = png_ptr->iwidth; + png_ptr->row_info.channels = png_ptr->channels; + png_ptr->row_info.bit_depth = png_ptr->bit_depth; + png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; + png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, + png_ptr->row_info.width); + + if (png_ptr->row_buf[0]) + png_read_filter_row(png_ptr, &(png_ptr->row_info), + png_ptr->row_buf + 1, png_ptr->prev_row + 1, + (int)(png_ptr->row_buf[0])); + + png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf, + png_ptr->rowbytes + 1); + +#if defined(PNG_MNG_FEATURES_SUPPORTED) + if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && + (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) + { + /* Intrapixel differencing */ + png_do_read_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1); + } +#endif + + + if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) + png_do_read_transformations(png_ptr); + +#if defined(PNG_READ_INTERLACING_SUPPORTED) + /* blow up interlaced rows to full size */ + if (png_ptr->interlaced && + (png_ptr->transformations & PNG_INTERLACE)) + { + if (png_ptr->pass < 6) +/* old interface (pre-1.0.9): + png_do_read_interlace(&(png_ptr->row_info), + png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); + */ + png_do_read_interlace(png_ptr); + + if (dsp_row != NULL) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + if (row != NULL) + png_combine_row(png_ptr, row, + png_pass_mask[png_ptr->pass]); + } + else +#endif + { + if (row != NULL) + png_combine_row(png_ptr, row, 0xff); + if (dsp_row != NULL) + png_combine_row(png_ptr, dsp_row, 0xff); + } + png_read_finish_row(png_ptr); + + if (png_ptr->read_row_fn != NULL) + (*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass); +} +#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* Read one or more rows of image data. If the image is interlaced, + * and png_set_interlace_handling() has been called, the rows need to + * contain the contents of the rows from the previous pass. If the + * image has alpha or transparency, and png_handle_alpha()[*] has been + * called, the rows contents must be initialized to the contents of the + * screen. + * + * "row" holds the actual image, and pixels are placed in it + * as they arrive. If the image is displayed after each pass, it will + * appear to "sparkle" in. "display_row" can be used to display a + * "chunky" progressive image, with finer detail added as it becomes + * available. If you do not want this "chunky" display, you may pass + * NULL for display_row. If you do not want the sparkle display, and + * you have not called png_handle_alpha(), you may pass NULL for rows. + * If you have called png_handle_alpha(), and the image has either an + * alpha channel or a transparency chunk, you must provide a buffer for + * rows. In this case, you do not have to provide a display_row buffer + * also, but you may. If the image is not interlaced, or if you have + * not called png_set_interlace_handling(), the display_row buffer will + * be ignored, so pass NULL to it. + * + * [*] png_handle_alpha() does not exist yet, as of this version of libpng + */ + +void PNGAPI +png_read_rows(png_structp png_ptr, png_bytepp row, + png_bytepp display_row, png_uint_32 num_rows) +{ + png_uint_32 i; + png_bytepp rp; + png_bytepp dp; + + png_debug(1, "in png_read_rows"); + if (png_ptr == NULL) return; + rp = row; + dp = display_row; + if (rp != NULL && dp != NULL) + for (i = 0; i < num_rows; i++) + { + png_bytep rptr = *rp++; + png_bytep dptr = *dp++; + + png_read_row(png_ptr, rptr, dptr); + } + else if (rp != NULL) + for (i = 0; i < num_rows; i++) + { + png_bytep rptr = *rp; + png_read_row(png_ptr, rptr, png_bytep_NULL); + rp++; + } + else if (dp != NULL) + for (i = 0; i < num_rows; i++) + { + png_bytep dptr = *dp; + png_read_row(png_ptr, png_bytep_NULL, dptr); + dp++; + } +} +#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* Read the entire image. If the image has an alpha channel or a tRNS + * chunk, and you have called png_handle_alpha()[*], you will need to + * initialize the image to the current image that PNG will be overlaying. + * We set the num_rows again here, in case it was incorrectly set in + * png_read_start_row() by a call to png_read_update_info() or + * png_start_read_image() if png_set_interlace_handling() wasn't called + * prior to either of these functions like it should have been. You can + * only call this function once. If you desire to have an image for + * each pass of a interlaced image, use png_read_rows() instead. + * + * [*] png_handle_alpha() does not exist yet, as of this version of libpng + */ +void PNGAPI +png_read_image(png_structp png_ptr, png_bytepp image) +{ + png_uint_32 i, image_height; + int pass, j; + png_bytepp rp; + + png_debug(1, "in png_read_image"); + if (png_ptr == NULL) return; + +#ifdef PNG_READ_INTERLACING_SUPPORTED + pass = png_set_interlace_handling(png_ptr); +#else + if (png_ptr->interlaced) + png_error(png_ptr, + "Cannot read interlaced image -- interlace handler disabled."); + pass = 1; +#endif + + + image_height=png_ptr->height; + png_ptr->num_rows = image_height; /* Make sure this is set correctly */ + + for (j = 0; j < pass; j++) + { + rp = image; + for (i = 0; i < image_height; i++) + { + png_read_row(png_ptr, *rp, png_bytep_NULL); + rp++; + } + } +} +#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* Read the end of the PNG file. Will not read past the end of the + * file, will verify the end is accurate, and will read any comments + * or time information at the end of the file, if info is not NULL. + */ +void PNGAPI +png_read_end(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_read_end"); + if (png_ptr == NULL) return; + png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */ + + do + { +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_CONST PNG_IHDR; + PNG_CONST PNG_IDAT; + PNG_CONST PNG_IEND; + PNG_CONST PNG_PLTE; +#if defined(PNG_READ_bKGD_SUPPORTED) + PNG_CONST PNG_bKGD; +#endif +#if defined(PNG_READ_cHRM_SUPPORTED) + PNG_CONST PNG_cHRM; +#endif +#if defined(PNG_READ_gAMA_SUPPORTED) + PNG_CONST PNG_gAMA; +#endif +#if defined(PNG_READ_hIST_SUPPORTED) + PNG_CONST PNG_hIST; +#endif +#if defined(PNG_READ_iCCP_SUPPORTED) + PNG_CONST PNG_iCCP; +#endif +#if defined(PNG_READ_iTXt_SUPPORTED) + PNG_CONST PNG_iTXt; +#endif +#if defined(PNG_READ_oFFs_SUPPORTED) + PNG_CONST PNG_oFFs; +#endif +#if defined(PNG_READ_pCAL_SUPPORTED) + PNG_CONST PNG_pCAL; +#endif +#if defined(PNG_READ_pHYs_SUPPORTED) + PNG_CONST PNG_pHYs; +#endif +#if defined(PNG_READ_sBIT_SUPPORTED) + PNG_CONST PNG_sBIT; +#endif +#if defined(PNG_READ_sCAL_SUPPORTED) + PNG_CONST PNG_sCAL; +#endif +#if defined(PNG_READ_sPLT_SUPPORTED) + PNG_CONST PNG_sPLT; +#endif +#if defined(PNG_READ_sRGB_SUPPORTED) + PNG_CONST PNG_sRGB; +#endif +#if defined(PNG_READ_tEXt_SUPPORTED) + PNG_CONST PNG_tEXt; +#endif +#if defined(PNG_READ_tIME_SUPPORTED) + PNG_CONST PNG_tIME; +#endif +#if defined(PNG_READ_tRNS_SUPPORTED) + PNG_CONST PNG_tRNS; +#endif +#if defined(PNG_READ_zTXt_SUPPORTED) + PNG_CONST PNG_zTXt; +#endif +#endif /* PNG_USE_LOCAL_ARRAYS */ + png_uint_32 length = png_read_chunk_header(png_ptr); + PNG_CONST png_bytep chunk_name = png_ptr->chunk_name; + + if (!png_memcmp(chunk_name, png_IHDR, 4)) + png_handle_IHDR(png_ptr, info_ptr, length); + else if (!png_memcmp(chunk_name, png_IEND, 4)) + png_handle_IEND(png_ptr, info_ptr, length); +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED + else if (png_handle_as_unknown(png_ptr, chunk_name)) + { + if (!png_memcmp(chunk_name, png_IDAT, 4)) + { + if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) + png_error(png_ptr, "Too many IDAT's found"); + } + png_handle_unknown(png_ptr, info_ptr, length); + if (!png_memcmp(chunk_name, png_PLTE, 4)) + png_ptr->mode |= PNG_HAVE_PLTE; + } +#endif + else if (!png_memcmp(chunk_name, png_IDAT, 4)) + { + /* Zero length IDATs are legal after the last IDAT has been + * read, but not after other chunks have been read. + */ + if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) + png_error(png_ptr, "Too many IDAT's found"); + png_crc_finish(png_ptr, length); + } + else if (!png_memcmp(chunk_name, png_PLTE, 4)) + png_handle_PLTE(png_ptr, info_ptr, length); +#if defined(PNG_READ_bKGD_SUPPORTED) + else if (!png_memcmp(chunk_name, png_bKGD, 4)) + png_handle_bKGD(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_cHRM_SUPPORTED) + else if (!png_memcmp(chunk_name, png_cHRM, 4)) + png_handle_cHRM(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_gAMA_SUPPORTED) + else if (!png_memcmp(chunk_name, png_gAMA, 4)) + png_handle_gAMA(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_hIST_SUPPORTED) + else if (!png_memcmp(chunk_name, png_hIST, 4)) + png_handle_hIST(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_oFFs_SUPPORTED) + else if (!png_memcmp(chunk_name, png_oFFs, 4)) + png_handle_oFFs(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_pCAL_SUPPORTED) + else if (!png_memcmp(chunk_name, png_pCAL, 4)) + png_handle_pCAL(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_sCAL_SUPPORTED) + else if (!png_memcmp(chunk_name, png_sCAL, 4)) + png_handle_sCAL(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_pHYs_SUPPORTED) + else if (!png_memcmp(chunk_name, png_pHYs, 4)) + png_handle_pHYs(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_sBIT_SUPPORTED) + else if (!png_memcmp(chunk_name, png_sBIT, 4)) + png_handle_sBIT(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_sRGB_SUPPORTED) + else if (!png_memcmp(chunk_name, png_sRGB, 4)) + png_handle_sRGB(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_iCCP_SUPPORTED) + else if (!png_memcmp(chunk_name, png_iCCP, 4)) + png_handle_iCCP(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_sPLT_SUPPORTED) + else if (!png_memcmp(chunk_name, png_sPLT, 4)) + png_handle_sPLT(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_tEXt_SUPPORTED) + else if (!png_memcmp(chunk_name, png_tEXt, 4)) + png_handle_tEXt(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_tIME_SUPPORTED) + else if (!png_memcmp(chunk_name, png_tIME, 4)) + png_handle_tIME(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_tRNS_SUPPORTED) + else if (!png_memcmp(chunk_name, png_tRNS, 4)) + png_handle_tRNS(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_zTXt_SUPPORTED) + else if (!png_memcmp(chunk_name, png_zTXt, 4)) + png_handle_zTXt(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_iTXt_SUPPORTED) + else if (!png_memcmp(chunk_name, png_iTXt, 4)) + png_handle_iTXt(png_ptr, info_ptr, length); +#endif + else + png_handle_unknown(png_ptr, info_ptr, length); + } while (!(png_ptr->mode & PNG_HAVE_IEND)); +} +#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ + +/* free all memory used by the read */ +void PNGAPI +png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr, + png_infopp end_info_ptr_ptr) +{ + png_structp png_ptr = NULL; + png_infop info_ptr = NULL, end_info_ptr = NULL; +#ifdef PNG_USER_MEM_SUPPORTED + png_free_ptr free_fn = NULL; + png_voidp mem_ptr = NULL; +#endif + + png_debug(1, "in png_destroy_read_struct"); + if (png_ptr_ptr != NULL) + png_ptr = *png_ptr_ptr; + if (png_ptr == NULL) + return; + +#ifdef PNG_USER_MEM_SUPPORTED + free_fn = png_ptr->free_fn; + mem_ptr = png_ptr->mem_ptr; +#endif + + if (info_ptr_ptr != NULL) + info_ptr = *info_ptr_ptr; + + if (end_info_ptr_ptr != NULL) + end_info_ptr = *end_info_ptr_ptr; + + png_read_destroy(png_ptr, info_ptr, end_info_ptr); + + if (info_ptr != NULL) + { +#if defined(PNG_TEXT_SUPPORTED) + png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, -1); +#endif + +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn, + (png_voidp)mem_ptr); +#else + png_destroy_struct((png_voidp)info_ptr); +#endif + *info_ptr_ptr = NULL; + } + + if (end_info_ptr != NULL) + { +#if defined(PNG_READ_TEXT_SUPPORTED) + png_free_data(png_ptr, end_info_ptr, PNG_FREE_TEXT, -1); +#endif +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)end_info_ptr, (png_free_ptr)free_fn, + (png_voidp)mem_ptr); +#else + png_destroy_struct((png_voidp)end_info_ptr); +#endif + *end_info_ptr_ptr = NULL; + } + + if (png_ptr != NULL) + { +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn, + (png_voidp)mem_ptr); +#else + png_destroy_struct((png_voidp)png_ptr); +#endif + *png_ptr_ptr = NULL; + } +} + +/* free all memory used by the read (old method) */ +void /* PRIVATE */ +png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr) +{ +#ifdef PNG_SETJMP_SUPPORTED + jmp_buf tmp_jmp; +#endif + png_error_ptr error_fn; + png_error_ptr warning_fn; + png_voidp error_ptr; +#ifdef PNG_USER_MEM_SUPPORTED + png_free_ptr free_fn; +#endif + + png_debug(1, "in png_read_destroy"); + if (info_ptr != NULL) + png_info_destroy(png_ptr, info_ptr); + + if (end_info_ptr != NULL) + png_info_destroy(png_ptr, end_info_ptr); + + png_free(png_ptr, png_ptr->zbuf); + png_free(png_ptr, png_ptr->big_row_buf); + png_free(png_ptr, png_ptr->prev_row); + png_free(png_ptr, png_ptr->chunkdata); +#if defined(PNG_READ_DITHER_SUPPORTED) + png_free(png_ptr, png_ptr->palette_lookup); + png_free(png_ptr, png_ptr->dither_index); +#endif +#if defined(PNG_READ_GAMMA_SUPPORTED) + png_free(png_ptr, png_ptr->gamma_table); +#endif +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + png_free(png_ptr, png_ptr->gamma_from_1); + png_free(png_ptr, png_ptr->gamma_to_1); +#endif +#ifdef PNG_FREE_ME_SUPPORTED + if (png_ptr->free_me & PNG_FREE_PLTE) + png_zfree(png_ptr, png_ptr->palette); + png_ptr->free_me &= ~PNG_FREE_PLTE; +#else + if (png_ptr->flags & PNG_FLAG_FREE_PLTE) + png_zfree(png_ptr, png_ptr->palette); + png_ptr->flags &= ~PNG_FLAG_FREE_PLTE; +#endif +#if defined(PNG_tRNS_SUPPORTED) || \ + defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) +#ifdef PNG_FREE_ME_SUPPORTED + if (png_ptr->free_me & PNG_FREE_TRNS) + png_free(png_ptr, png_ptr->trans); + png_ptr->free_me &= ~PNG_FREE_TRNS; +#else + if (png_ptr->flags & PNG_FLAG_FREE_TRNS) + png_free(png_ptr, png_ptr->trans); + png_ptr->flags &= ~PNG_FLAG_FREE_TRNS; +#endif +#endif +#if defined(PNG_READ_hIST_SUPPORTED) +#ifdef PNG_FREE_ME_SUPPORTED + if (png_ptr->free_me & PNG_FREE_HIST) + png_free(png_ptr, png_ptr->hist); + png_ptr->free_me &= ~PNG_FREE_HIST; +#else + if (png_ptr->flags & PNG_FLAG_FREE_HIST) + png_free(png_ptr, png_ptr->hist); + png_ptr->flags &= ~PNG_FLAG_FREE_HIST; +#endif +#endif +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (png_ptr->gamma_16_table != NULL) + { + int i; + int istop = (1 << (8 - png_ptr->gamma_shift)); + for (i = 0; i < istop; i++) + { + png_free(png_ptr, png_ptr->gamma_16_table[i]); + } + png_free(png_ptr, png_ptr->gamma_16_table); + } +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->gamma_16_from_1 != NULL) + { + int i; + int istop = (1 << (8 - png_ptr->gamma_shift)); + for (i = 0; i < istop; i++) + { + png_free(png_ptr, png_ptr->gamma_16_from_1[i]); + } + png_free(png_ptr, png_ptr->gamma_16_from_1); + } + if (png_ptr->gamma_16_to_1 != NULL) + { + int i; + int istop = (1 << (8 - png_ptr->gamma_shift)); + for (i = 0; i < istop; i++) + { + png_free(png_ptr, png_ptr->gamma_16_to_1[i]); + } + png_free(png_ptr, png_ptr->gamma_16_to_1); + } +#endif +#endif +#if defined(PNG_TIME_RFC1123_SUPPORTED) + png_free(png_ptr, png_ptr->time_buffer); +#endif + + inflateEnd(&png_ptr->zstream); +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED + png_free(png_ptr, png_ptr->save_buffer); +#endif + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +#ifdef PNG_TEXT_SUPPORTED + png_free(png_ptr, png_ptr->current_text); +#endif /* PNG_TEXT_SUPPORTED */ +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + + /* Save the important info out of the png_struct, in case it is + * being used again. + */ +#ifdef PNG_SETJMP_SUPPORTED + png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf)); +#endif + + error_fn = png_ptr->error_fn; + warning_fn = png_ptr->warning_fn; + error_ptr = png_ptr->error_ptr; +#ifdef PNG_USER_MEM_SUPPORTED + free_fn = png_ptr->free_fn; +#endif + + png_memset(png_ptr, 0, png_sizeof(png_struct)); + + png_ptr->error_fn = error_fn; + png_ptr->warning_fn = warning_fn; + png_ptr->error_ptr = error_ptr; +#ifdef PNG_USER_MEM_SUPPORTED + png_ptr->free_fn = free_fn; +#endif + +#ifdef PNG_SETJMP_SUPPORTED + png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf)); +#endif + +} + +void PNGAPI +png_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn) +{ + if (png_ptr == NULL) return; + png_ptr->read_row_fn = read_row_fn; +} + + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +#if defined(PNG_INFO_IMAGE_SUPPORTED) +void PNGAPI +png_read_png(png_structp png_ptr, png_infop info_ptr, + int transforms, + voidp params) +{ + int row; + + if (png_ptr == NULL) return; +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) + /* invert the alpha channel from opacity to transparency + */ + if (transforms & PNG_TRANSFORM_INVERT_ALPHA) + png_set_invert_alpha(png_ptr); +#endif + + /* png_read_info() gives us all of the information from the + * PNG file before the first IDAT (image data chunk). + */ + png_read_info(png_ptr, info_ptr); + if (info_ptr->height > PNG_UINT_32_MAX/png_sizeof(png_bytep)) + png_error(png_ptr, "Image is too high to process with png_read_png()"); + + /* -------------- image transformations start here ------------------- */ + +#if defined(PNG_READ_16_TO_8_SUPPORTED) + /* tell libpng to strip 16 bit/color files down to 8 bits per color + */ + if (transforms & PNG_TRANSFORM_STRIP_16) + png_set_strip_16(png_ptr); +#endif + +#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) + /* Strip alpha bytes from the input data without combining with + * the background (not recommended). + */ + if (transforms & PNG_TRANSFORM_STRIP_ALPHA) + png_set_strip_alpha(png_ptr); +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) && !defined(PNG_READ_EXPAND_SUPPORTED) + /* Extract multiple pixels with bit depths of 1, 2, or 4 from a single + * byte into separate bytes (useful for paletted and grayscale images). + */ + if (transforms & PNG_TRANSFORM_PACKING) + png_set_packing(png_ptr); +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) + /* Change the order of packed pixels to least significant bit first + * (not useful if you are using png_set_packing). + */ + if (transforms & PNG_TRANSFORM_PACKSWAP) + png_set_packswap(png_ptr); +#endif + +#if defined(PNG_READ_EXPAND_SUPPORTED) + /* Expand paletted colors into true RGB triplets + * Expand grayscale images to full 8 bits from 1, 2, or 4 bits/pixel + * Expand paletted or RGB images with transparency to full alpha + * channels so the data will be available as RGBA quartets. + */ + if (transforms & PNG_TRANSFORM_EXPAND) + if ((png_ptr->bit_depth < 8) || + (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) || + (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))) + png_set_expand(png_ptr); +#endif + + /* We don't handle background color or gamma transformation or dithering. + */ + +#if defined(PNG_READ_INVERT_SUPPORTED) + /* invert monochrome files to have 0 as white and 1 as black + */ + if (transforms & PNG_TRANSFORM_INVERT_MONO) + png_set_invert_mono(png_ptr); +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) + /* If you want to shift the pixel values from the range [0,255] or + * [0,65535] to the original [0,7] or [0,31], or whatever range the + * colors were originally in: + */ + if ((transforms & PNG_TRANSFORM_SHIFT) + && png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT)) + { + png_color_8p sig_bit; + + png_get_sBIT(png_ptr, info_ptr, &sig_bit); + png_set_shift(png_ptr, sig_bit); + } +#endif + +#if defined(PNG_READ_BGR_SUPPORTED) + /* flip the RGB pixels to BGR (or RGBA to BGRA) + */ + if (transforms & PNG_TRANSFORM_BGR) + png_set_bgr(png_ptr); +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) + /* swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) + */ + if (transforms & PNG_TRANSFORM_SWAP_ALPHA) + png_set_swap_alpha(png_ptr); +#endif + +#if defined(PNG_READ_SWAP_SUPPORTED) + /* swap bytes of 16 bit files to least significant byte first + */ + if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) + png_set_swap(png_ptr); +#endif + + /* We don't handle adding filler bytes */ + + /* Optional call to gamma correct and add the background to the palette + * and update info structure. REQUIRED if you are expecting libpng to + * update the palette for you (i.e., you selected such a transform above). + */ + png_read_update_info(png_ptr, info_ptr); + + /* -------------- image transformations end here ------------------- */ + +#ifdef PNG_FREE_ME_SUPPORTED + png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0); +#endif + if (info_ptr->row_pointers == NULL) + { + info_ptr->row_pointers = (png_bytepp)png_malloc(png_ptr, + info_ptr->height * png_sizeof(png_bytep)); + png_memset(info_ptr->row_pointers, 0, info_ptr->height + * png_sizeof(png_bytep)); +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_ROWS; +#endif + for (row = 0; row < (int)info_ptr->height; row++) + info_ptr->row_pointers[row] = (png_bytep)png_malloc(png_ptr, + png_get_rowbytes(png_ptr, info_ptr)); + } + + png_read_image(png_ptr, info_ptr->row_pointers); + info_ptr->valid |= PNG_INFO_IDAT; + + /* read rest of file, and get additional chunks in info_ptr - REQUIRED */ + png_read_end(png_ptr, info_ptr); + + transforms = transforms; /* quiet compiler warnings */ + params = params; + +} +#endif /* PNG_INFO_IMAGE_SUPPORTED */ +#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ +#endif /* PNG_READ_SUPPORTED */ diff --git a/navit/support/libpng/pngrio.c b/navit/support/libpng/pngrio.c new file mode 100644 index 0000000..44a99e2 --- /dev/null +++ b/navit/support/libpng/pngrio.c @@ -0,0 +1,168 @@ + +/* pngrio.c - functions for data input + * + * Last changed in libpng 1.2.36 [May 7, 2009] + * For conditions of distribution and use, see copyright notice in png.h + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This file provides a location for all input. Users who need + * special handling are expected to write a function that has the same + * arguments as this and performs a similar function, but that possibly + * has a different input method. Note that you shouldn't change this + * function, but rather write a replacement function and then make + * libpng use it at run time with png_set_read_fn(...). + */ + +#define PNG_INTERNAL +#include "png.h" +#if defined(PNG_READ_SUPPORTED) + +/* Read the data from whatever input you are using. The default routine + reads from a file pointer. Note that this routine sometimes gets called + with very small lengths, so you should implement some kind of simple + buffering if you are using unbuffered reads. This should never be asked + to read more then 64K on a 16 bit machine. */ +void /* PRIVATE */ +png_read_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + png_debug1(4, "reading %d bytes", (int)length); + if (png_ptr->read_data_fn != NULL) + (*(png_ptr->read_data_fn))(png_ptr, data, length); + else + png_error(png_ptr, "Call to NULL read function"); +} + +#if !defined(PNG_NO_STDIO) +/* This is the function that does the actual reading of data. If you are + not reading from a standard C stream, you should create a replacement + read_data function and use it at run time with png_set_read_fn(), rather + than changing the library. */ +#ifndef USE_FAR_KEYWORD +void PNGAPI +png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + png_size_t check; + + if (png_ptr == NULL) return; + /* fread() returns 0 on error, so it is OK to store this in a png_size_t + * instead of an int, which is what fread() actually returns. + */ +#if 0 /* defined(_WIN32_WCE) */ + if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) ) + check = 0; +#else + check = (png_size_t)fread(data, (png_size_t)1, length, + (png_FILE_p)png_ptr->io_ptr); +#endif + + if (check != length) + png_error(png_ptr, "Read Error"); +} +#else +/* this is the model-independent version. Since the standard I/O library + can't handle far buffers in the medium and small models, we have to copy + the data. +*/ + +#define NEAR_BUF_SIZE 1024 +#define MIN(a,b) (a <= b ? a : b) + +static void PNGAPI +png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + int check; + png_byte *n_data; + png_FILE_p io_ptr; + + if (png_ptr == NULL) return; + /* Check if data really is near. If so, use usual code. */ + n_data = (png_byte *)CVT_PTR_NOCHECK(data); + io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); + if ((png_bytep)n_data == data) + { +#if 0 /* defined(_WIN32_WCE) */ + if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) ) + check = 0; +#else + check = fread(n_data, 1, length, io_ptr); +#endif + } + else + { + png_byte buf[NEAR_BUF_SIZE]; + png_size_t read, remaining, err; + check = 0; + remaining = length; + do + { + read = MIN(NEAR_BUF_SIZE, remaining); +#if 0 /* defined(_WIN32_WCE) */ + if ( !ReadFile((HANDLE)(io_ptr), buf, read, &err, NULL) ) + err = 0; +#else + err = fread(buf, (png_size_t)1, read, io_ptr); +#endif + png_memcpy(data, buf, read); /* copy far buffer to near buffer */ + if (err != read) + break; + else + check += err; + data += read; + remaining -= read; + } + while (remaining != 0); + } + if ((png_uint_32)check != (png_uint_32)length) + png_error(png_ptr, "read Error"); +} +#endif +#endif + +/* This function allows the application to supply a new input function + for libpng if standard C streams aren't being used. + + This function takes as its arguments: + png_ptr - pointer to a png input data structure + io_ptr - pointer to user supplied structure containing info about + the input functions. May be NULL. + read_data_fn - pointer to a new input function that takes as its + arguments a pointer to a png_struct, a pointer to + a location where input data can be stored, and a 32-bit + unsigned int that is the number of bytes to be read. + To exit and output any fatal error messages the new write + function should call png_error(png_ptr, "Error msg"). + May be NULL, in which case libpng's default function will + be used. */ +void PNGAPI +png_set_read_fn(png_structp png_ptr, png_voidp io_ptr, + png_rw_ptr read_data_fn) +{ + if (png_ptr == NULL) return; + png_ptr->io_ptr = io_ptr; + +#if !defined(PNG_NO_STDIO) + if (read_data_fn != NULL) + png_ptr->read_data_fn = read_data_fn; + else + png_ptr->read_data_fn = png_default_read_data; +#else + png_ptr->read_data_fn = read_data_fn; +#endif + + /* It is an error to write to a read device */ + if (png_ptr->write_data_fn != NULL) + { + png_ptr->write_data_fn = NULL; + png_warning(png_ptr, + "It's an error to set both read_data_fn and write_data_fn in the "); + png_warning(png_ptr, + "same structure. Resetting write_data_fn to NULL."); + } + +#if defined(PNG_WRITE_FLUSH_SUPPORTED) + png_ptr->output_flush_fn = NULL; +#endif +} +#endif /* PNG_READ_SUPPORTED */ diff --git a/navit/support/libpng/pngrtran.c b/navit/support/libpng/pngrtran.c new file mode 100644 index 0000000..d7dd8e7 --- /dev/null +++ b/navit/support/libpng/pngrtran.c @@ -0,0 +1,4296 @@ + +/* pngrtran.c - transforms the data in a row for PNG readers + * + * Last changed in libpng 1.2.35 [February 14, 2009] + * For conditions of distribution and use, see copyright notice in png.h + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This file contains functions optionally called by an application + * in order to tell libpng how to handle data when reading a PNG. + * Transformations that are used in both reading and writing are + * in pngtrans.c. + */ + +#define PNG_INTERNAL +#include "png.h" +#if defined(PNG_READ_SUPPORTED) + +/* Set the action on getting a CRC error for an ancillary or critical chunk. */ +void PNGAPI +png_set_crc_action(png_structp png_ptr, int crit_action, int ancil_action) +{ + png_debug(1, "in png_set_crc_action"); + /* Tell libpng how we react to CRC errors in critical chunks */ + if (png_ptr == NULL) return; + switch (crit_action) + { + case PNG_CRC_NO_CHANGE: /* leave setting as is */ + break; + case PNG_CRC_WARN_USE: /* warn/use data */ + png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK; + png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE; + break; + case PNG_CRC_QUIET_USE: /* quiet/use data */ + png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK; + png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE | + PNG_FLAG_CRC_CRITICAL_IGNORE; + break; + case PNG_CRC_WARN_DISCARD: /* not a valid action for critical data */ + png_warning(png_ptr, + "Can't discard critical data on CRC error."); + case PNG_CRC_ERROR_QUIT: /* error/quit */ + case PNG_CRC_DEFAULT: + default: + png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK; + break; + } + + switch (ancil_action) + { + case PNG_CRC_NO_CHANGE: /* leave setting as is */ + break; + case PNG_CRC_WARN_USE: /* warn/use data */ + png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; + png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE; + break; + case PNG_CRC_QUIET_USE: /* quiet/use data */ + png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; + png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE | + PNG_FLAG_CRC_ANCILLARY_NOWARN; + break; + case PNG_CRC_ERROR_QUIT: /* error/quit */ + png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; + png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_NOWARN; + break; + case PNG_CRC_WARN_DISCARD: /* warn/discard data */ + case PNG_CRC_DEFAULT: + default: + png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; + break; + } +} + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \ + defined(PNG_FLOATING_POINT_SUPPORTED) +/* handle alpha and tRNS via a background color */ +void PNGAPI +png_set_background(png_structp png_ptr, + png_color_16p background_color, int background_gamma_code, + int need_expand, double background_gamma) +{ + png_debug(1, "in png_set_background"); + if (png_ptr == NULL) return; + if (background_gamma_code == PNG_BACKGROUND_GAMMA_UNKNOWN) + { + png_warning(png_ptr, "Application must supply a known background gamma"); + return; + } + + png_ptr->transformations |= PNG_BACKGROUND; + png_memcpy(&(png_ptr->background), background_color, + png_sizeof(png_color_16)); + png_ptr->background_gamma = (float)background_gamma; + png_ptr->background_gamma_type = (png_byte)(background_gamma_code); + png_ptr->transformations |= (need_expand ? PNG_BACKGROUND_EXPAND : 0); +} +#endif + +#if defined(PNG_READ_16_TO_8_SUPPORTED) +/* strip 16 bit depth files to 8 bit depth */ +void PNGAPI +png_set_strip_16(png_structp png_ptr) +{ + png_debug(1, "in png_set_strip_16"); + if (png_ptr == NULL) return; + png_ptr->transformations |= PNG_16_TO_8; +} +#endif + +#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) +void PNGAPI +png_set_strip_alpha(png_structp png_ptr) +{ + png_debug(1, "in png_set_strip_alpha"); + if (png_ptr == NULL) return; + png_ptr->flags |= PNG_FLAG_STRIP_ALPHA; +} +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) +/* Dither file to 8 bit. Supply a palette, the current number + * of elements in the palette, the maximum number of elements + * allowed, and a histogram if possible. If the current number + * of colors is greater then the maximum number, the palette will be + * modified to fit in the maximum number. "full_dither" indicates + * whether we need a dithering cube set up for RGB images, or if we + * simply are reducing the number of colors in a paletted image. + */ + +typedef struct png_dsort_struct +{ + struct png_dsort_struct FAR * next; + png_byte left; + png_byte right; +} png_dsort; +typedef png_dsort FAR * png_dsortp; +typedef png_dsort FAR * FAR * png_dsortpp; + +void PNGAPI +png_set_dither(png_structp png_ptr, png_colorp palette, + int num_palette, int maximum_colors, png_uint_16p histogram, + int full_dither) +{ + png_debug(1, "in png_set_dither"); + if (png_ptr == NULL) return; + png_ptr->transformations |= PNG_DITHER; + + if (!full_dither) + { + int i; + + png_ptr->dither_index = (png_bytep)png_malloc(png_ptr, + (png_uint_32)(num_palette * png_sizeof(png_byte))); + for (i = 0; i < num_palette; i++) + png_ptr->dither_index[i] = (png_byte)i; + } + + if (num_palette > maximum_colors) + { + if (histogram != NULL) + { + /* This is easy enough, just throw out the least used colors. + Perhaps not the best solution, but good enough. */ + + int i; + + /* initialize an array to sort colors */ + png_ptr->dither_sort = (png_bytep)png_malloc(png_ptr, + (png_uint_32)(num_palette * png_sizeof(png_byte))); + + /* initialize the dither_sort array */ + for (i = 0; i < num_palette; i++) + png_ptr->dither_sort[i] = (png_byte)i; + + /* Find the least used palette entries by starting a + bubble sort, and running it until we have sorted + out enough colors. Note that we don't care about + sorting all the colors, just finding which are + least used. */ + + for (i = num_palette - 1; i >= maximum_colors; i--) + { + int done; /* to stop early if the list is pre-sorted */ + int j; + + done = 1; + for (j = 0; j < i; j++) + { + if (histogram[png_ptr->dither_sort[j]] + < histogram[png_ptr->dither_sort[j + 1]]) + { + png_byte t; + + t = png_ptr->dither_sort[j]; + png_ptr->dither_sort[j] = png_ptr->dither_sort[j + 1]; + png_ptr->dither_sort[j + 1] = t; + done = 0; + } + } + if (done) + break; + } + + /* swap the palette around, and set up a table, if necessary */ + if (full_dither) + { + int j = num_palette; + + /* put all the useful colors within the max, but don't + move the others */ + for (i = 0; i < maximum_colors; i++) + { + if ((int)png_ptr->dither_sort[i] >= maximum_colors) + { + do + j--; + while ((int)png_ptr->dither_sort[j] >= maximum_colors); + palette[i] = palette[j]; + } + } + } + else + { + int j = num_palette; + + /* move all the used colors inside the max limit, and + develop a translation table */ + for (i = 0; i < maximum_colors; i++) + { + /* only move the colors we need to */ + if ((int)png_ptr->dither_sort[i] >= maximum_colors) + { + png_color tmp_color; + + do + j--; + while ((int)png_ptr->dither_sort[j] >= maximum_colors); + + tmp_color = palette[j]; + palette[j] = palette[i]; + palette[i] = tmp_color; + /* indicate where the color went */ + png_ptr->dither_index[j] = (png_byte)i; + png_ptr->dither_index[i] = (png_byte)j; + } + } + + /* find closest color for those colors we are not using */ + for (i = 0; i < num_palette; i++) + { + if ((int)png_ptr->dither_index[i] >= maximum_colors) + { + int min_d, k, min_k, d_index; + + /* find the closest color to one we threw out */ + d_index = png_ptr->dither_index[i]; + min_d = PNG_COLOR_DIST(palette[d_index], palette[0]); + for (k = 1, min_k = 0; k < maximum_colors; k++) + { + int d; + + d = PNG_COLOR_DIST(palette[d_index], palette[k]); + + if (d < min_d) + { + min_d = d; + min_k = k; + } + } + /* point to closest color */ + png_ptr->dither_index[i] = (png_byte)min_k; + } + } + } + png_free(png_ptr, png_ptr->dither_sort); + png_ptr->dither_sort = NULL; + } + else + { + /* This is much harder to do simply (and quickly). Perhaps + we need to go through a median cut routine, but those + don't always behave themselves with only a few colors + as input. So we will just find the closest two colors, + and throw out one of them (chosen somewhat randomly). + [We don't understand this at all, so if someone wants to + work on improving it, be our guest - AED, GRP] + */ + int i; + int max_d; + int num_new_palette; + png_dsortp t; + png_dsortpp hash; + + t = NULL; + + /* initialize palette index arrays */ + png_ptr->index_to_palette = (png_bytep)png_malloc(png_ptr, + (png_uint_32)(num_palette * png_sizeof(png_byte))); + png_ptr->palette_to_index = (png_bytep)png_malloc(png_ptr, + (png_uint_32)(num_palette * png_sizeof(png_byte))); + + /* initialize the sort array */ + for (i = 0; i < num_palette; i++) + { + png_ptr->index_to_palette[i] = (png_byte)i; + png_ptr->palette_to_index[i] = (png_byte)i; + } + + hash = (png_dsortpp)png_malloc(png_ptr, (png_uint_32)(769 * + png_sizeof(png_dsortp))); + png_memset(hash, 0, 769 * png_sizeof(png_dsortp)); + + num_new_palette = num_palette; + + /* initial wild guess at how far apart the farthest pixel + pair we will be eliminating will be. Larger + numbers mean more areas will be allocated, Smaller + numbers run the risk of not saving enough data, and + having to do this all over again. + + I have not done extensive checking on this number. + */ + max_d = 96; + + while (num_new_palette > maximum_colors) + { + for (i = 0; i < num_new_palette - 1; i++) + { + int j; + + for (j = i + 1; j < num_new_palette; j++) + { + int d; + + d = PNG_COLOR_DIST(palette[i], palette[j]); + + if (d <= max_d) + { + + t = (png_dsortp)png_malloc_warn(png_ptr, + (png_uint_32)(png_sizeof(png_dsort))); + if (t == NULL) + break; + t->next = hash[d]; + t->left = (png_byte)i; + t->right = (png_byte)j; + hash[d] = t; + } + } + if (t == NULL) + break; + } + + if (t != NULL) + for (i = 0; i <= max_d; i++) + { + if (hash[i] != NULL) + { + png_dsortp p; + + for (p = hash[i]; p; p = p->next) + { + if ((int)png_ptr->index_to_palette[p->left] + < num_new_palette && + (int)png_ptr->index_to_palette[p->right] + < num_new_palette) + { + int j, next_j; + + if (num_new_palette & 0x01) + { + j = p->left; + next_j = p->right; + } + else + { + j = p->right; + next_j = p->left; + } + + num_new_palette--; + palette[png_ptr->index_to_palette[j]] + = palette[num_new_palette]; + if (!full_dither) + { + int k; + + for (k = 0; k < num_palette; k++) + { + if (png_ptr->dither_index[k] == + png_ptr->index_to_palette[j]) + png_ptr->dither_index[k] = + png_ptr->index_to_palette[next_j]; + if ((int)png_ptr->dither_index[k] == + num_new_palette) + png_ptr->dither_index[k] = + png_ptr->index_to_palette[j]; + } + } + + png_ptr->index_to_palette[png_ptr->palette_to_index + [num_new_palette]] = png_ptr->index_to_palette[j]; + png_ptr->palette_to_index[png_ptr->index_to_palette[j]] + = png_ptr->palette_to_index[num_new_palette]; + + png_ptr->index_to_palette[j] = (png_byte)num_new_palette; + png_ptr->palette_to_index[num_new_palette] = (png_byte)j; + } + if (num_new_palette <= maximum_colors) + break; + } + if (num_new_palette <= maximum_colors) + break; + } + } + + for (i = 0; i < 769; i++) + { + if (hash[i] != NULL) + { + png_dsortp p = hash[i]; + while (p) + { + t = p->next; + png_free(png_ptr, p); + p = t; + } + } + hash[i] = 0; + } + max_d += 96; + } + png_free(png_ptr, hash); + png_free(png_ptr, png_ptr->palette_to_index); + png_free(png_ptr, png_ptr->index_to_palette); + png_ptr->palette_to_index = NULL; + png_ptr->index_to_palette = NULL; + } + num_palette = maximum_colors; + } + if (png_ptr->palette == NULL) + { + png_ptr->palette = palette; + } + png_ptr->num_palette = (png_uint_16)num_palette; + + if (full_dither) + { + int i; + png_bytep distance; + int total_bits = PNG_DITHER_RED_BITS + PNG_DITHER_GREEN_BITS + + PNG_DITHER_BLUE_BITS; + int num_red = (1 << PNG_DITHER_RED_BITS); + int num_green = (1 << PNG_DITHER_GREEN_BITS); + int num_blue = (1 << PNG_DITHER_BLUE_BITS); + png_size_t num_entries = ((png_size_t)1 << total_bits); + png_ptr->palette_lookup = (png_bytep )png_malloc(png_ptr, + (png_uint_32)(num_entries * png_sizeof(png_byte))); + png_memset(png_ptr->palette_lookup, 0, num_entries * + png_sizeof(png_byte)); + + distance = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_entries * + png_sizeof(png_byte))); + + png_memset(distance, 0xff, num_entries * png_sizeof(png_byte)); + + for (i = 0; i < num_palette; i++) + { + int ir, ig, ib; + int r = (palette[i].red >> (8 - PNG_DITHER_RED_BITS)); + int g = (palette[i].green >> (8 - PNG_DITHER_GREEN_BITS)); + int b = (palette[i].blue >> (8 - PNG_DITHER_BLUE_BITS)); + + for (ir = 0; ir < num_red; ir++) + { + /* int dr = abs(ir - r); */ + int dr = ((ir > r) ? ir - r : r - ir); + int index_r = (ir << (PNG_DITHER_BLUE_BITS + PNG_DITHER_GREEN_BITS)); + + for (ig = 0; ig < num_green; ig++) + { + /* int dg = abs(ig - g); */ + int dg = ((ig > g) ? ig - g : g - ig); + int dt = dr + dg; + int dm = ((dr > dg) ? dr : dg); + int index_g = index_r | (ig << PNG_DITHER_BLUE_BITS); + + for (ib = 0; ib < num_blue; ib++) + { + int d_index = index_g | ib; + /* int db = abs(ib - b); */ + int db = ((ib > b) ? ib - b : b - ib); + int dmax = ((dm > db) ? dm : db); + int d = dmax + dt + db; + + if (d < (int)distance[d_index]) + { + distance[d_index] = (png_byte)d; + png_ptr->palette_lookup[d_index] = (png_byte)i; + } + } + } + } + } + + png_free(png_ptr, distance); + } +} +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) +/* Transform the image from the file_gamma to the screen_gamma. We + * only do transformations on images where the file_gamma and screen_gamma + * are not close reciprocals, otherwise it slows things down slightly, and + * also needlessly introduces small errors. + * + * We will turn off gamma transformation later if no semitransparent entries + * are present in the tRNS array for palette images. We can't do it here + * because we don't necessarily have the tRNS chunk yet. + */ +void PNGAPI +png_set_gamma(png_structp png_ptr, double scrn_gamma, double file_gamma) +{ + png_debug(1, "in png_set_gamma"); + if (png_ptr == NULL) return; + if ((fabs(scrn_gamma * file_gamma - 1.0) > PNG_GAMMA_THRESHOLD) || + (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) || + (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)) + png_ptr->transformations |= PNG_GAMMA; + png_ptr->gamma = (float)file_gamma; + png_ptr->screen_gamma = (float)scrn_gamma; +} +#endif + +#if defined(PNG_READ_EXPAND_SUPPORTED) +/* Expand paletted images to RGB, expand grayscale images of + * less than 8-bit depth to 8-bit depth, and expand tRNS chunks + * to alpha channels. + */ +void PNGAPI +png_set_expand(png_structp png_ptr) +{ + png_debug(1, "in png_set_expand"); + if (png_ptr == NULL) return; + png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); + png_ptr->flags &= ~PNG_FLAG_ROW_INIT; +} + +/* GRR 19990627: the following three functions currently are identical + * to png_set_expand(). However, it is entirely reasonable that someone + * might wish to expand an indexed image to RGB but *not* expand a single, + * fully transparent palette entry to a full alpha channel--perhaps instead + * convert tRNS to the grayscale/RGB format (16-bit RGB value), or replace + * the transparent color with a particular RGB value, or drop tRNS entirely. + * IOW, a future version of the library may make the transformations flag + * a bit more fine-grained, with separate bits for each of these three + * functions. + * + * More to the point, these functions make it obvious what libpng will be + * doing, whereas "expand" can (and does) mean any number of things. + * + * GRP 20060307: In libpng-1.4.0, png_set_gray_1_2_4_to_8() was modified + * to expand only the sample depth but not to expand the tRNS to alpha. + */ + +/* Expand paletted images to RGB. */ +void PNGAPI +png_set_palette_to_rgb(png_structp png_ptr) +{ + png_debug(1, "in png_set_palette_to_rgb"); + if (png_ptr == NULL) return; + png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); + png_ptr->flags &= ~PNG_FLAG_ROW_INIT; +} + +#if !defined(PNG_1_0_X) +/* Expand grayscale images of less than 8-bit depth to 8 bits. */ +void PNGAPI +png_set_expand_gray_1_2_4_to_8(png_structp png_ptr) +{ + png_debug(1, "in png_set_expand_gray_1_2_4_to_8"); + if (png_ptr == NULL) return; + png_ptr->transformations |= PNG_EXPAND; + png_ptr->flags &= ~PNG_FLAG_ROW_INIT; +} +#endif + +#if defined(PNG_1_0_X) || defined(PNG_1_2_X) +/* Expand grayscale images of less than 8-bit depth to 8 bits. */ +/* Deprecated as of libpng-1.2.9 */ +void PNGAPI +png_set_gray_1_2_4_to_8(png_structp png_ptr) +{ + png_debug(1, "in png_set_gray_1_2_4_to_8"); + if (png_ptr == NULL) return; + png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); +} +#endif + + +/* Expand tRNS chunks to alpha channels. */ +void PNGAPI +png_set_tRNS_to_alpha(png_structp png_ptr) +{ + png_debug(1, "in png_set_tRNS_to_alpha"); + png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); + png_ptr->flags &= ~PNG_FLAG_ROW_INIT; +} +#endif /* defined(PNG_READ_EXPAND_SUPPORTED) */ + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) +void PNGAPI +png_set_gray_to_rgb(png_structp png_ptr) +{ + png_debug(1, "in png_set_gray_to_rgb"); + png_ptr->transformations |= PNG_GRAY_TO_RGB; + png_ptr->flags &= ~PNG_FLAG_ROW_INIT; +} +#endif + +#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) +#if defined(PNG_FLOATING_POINT_SUPPORTED) +/* Convert a RGB image to a grayscale of the same width. This allows us, + * for example, to convert a 24 bpp RGB image into an 8 bpp grayscale image. + */ + +void PNGAPI +png_set_rgb_to_gray(png_structp png_ptr, int error_action, double red, + double green) +{ + int red_fixed = (int)((float)red*100000.0 + 0.5); + int green_fixed = (int)((float)green*100000.0 + 0.5); + if (png_ptr == NULL) return; + png_set_rgb_to_gray_fixed(png_ptr, error_action, red_fixed, green_fixed); +} +#endif + +void PNGAPI +png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action, + png_fixed_point red, png_fixed_point green) +{ + png_debug(1, "in png_set_rgb_to_gray"); + if (png_ptr == NULL) return; + switch(error_action) + { + case 1: png_ptr->transformations |= PNG_RGB_TO_GRAY; + break; + case 2: png_ptr->transformations |= PNG_RGB_TO_GRAY_WARN; + break; + case 3: png_ptr->transformations |= PNG_RGB_TO_GRAY_ERR; + } + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) +#if defined(PNG_READ_EXPAND_SUPPORTED) + png_ptr->transformations |= PNG_EXPAND; +#else + { + png_warning(png_ptr, + "Cannot do RGB_TO_GRAY without EXPAND_SUPPORTED."); + png_ptr->transformations &= ~PNG_RGB_TO_GRAY; + } +#endif + { + png_uint_16 red_int, green_int; + if (red < 0 || green < 0) + { + red_int = 6968; /* .212671 * 32768 + .5 */ + green_int = 23434; /* .715160 * 32768 + .5 */ + } + else if (red + green < 100000L) + { + red_int = (png_uint_16)(((png_uint_32)red*32768L)/100000L); + green_int = (png_uint_16)(((png_uint_32)green*32768L)/100000L); + } + else + { + png_warning(png_ptr, "ignoring out of range rgb_to_gray coefficients"); + red_int = 6968; + green_int = 23434; + } + png_ptr->rgb_to_gray_red_coeff = red_int; + png_ptr->rgb_to_gray_green_coeff = green_int; + png_ptr->rgb_to_gray_blue_coeff = + (png_uint_16)(32768 - red_int - green_int); + } +} +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_LEGACY_SUPPORTED) +void PNGAPI +png_set_read_user_transform_fn(png_structp png_ptr, png_user_transform_ptr + read_user_transform_fn) +{ + png_debug(1, "in png_set_read_user_transform_fn"); + if (png_ptr == NULL) return; +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) + png_ptr->transformations |= PNG_USER_TRANSFORM; + png_ptr->read_user_transform_fn = read_user_transform_fn; +#endif +#ifdef PNG_LEGACY_SUPPORTED + if (read_user_transform_fn) + png_warning(png_ptr, + "This version of libpng does not support user transforms"); +#endif +} +#endif + +/* Initialize everything needed for the read. This includes modifying + * the palette. + */ +void /* PRIVATE */ +png_init_read_transformations(png_structp png_ptr) +{ + png_debug(1, "in png_init_read_transformations"); +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (png_ptr != NULL) +#endif + { +#if defined(PNG_READ_BACKGROUND_SUPPORTED) || defined(PNG_READ_SHIFT_SUPPORTED) \ + || defined(PNG_READ_GAMMA_SUPPORTED) + int color_type = png_ptr->color_type; +#endif + +#if defined(PNG_READ_EXPAND_SUPPORTED) && defined(PNG_READ_BACKGROUND_SUPPORTED) + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) + /* Detect gray background and attempt to enable optimization + * for gray --> RGB case */ + /* Note: if PNG_BACKGROUND_EXPAND is set and color_type is either RGB or + * RGB_ALPHA (in which case need_expand is superfluous anyway), the + * background color might actually be gray yet not be flagged as such. + * This is not a problem for the current code, which uses + * PNG_BACKGROUND_IS_GRAY only to decide when to do the + * png_do_gray_to_rgb() transformation. + */ + if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) && + !(color_type & PNG_COLOR_MASK_COLOR)) + { + png_ptr->mode |= PNG_BACKGROUND_IS_GRAY; + } else if ((png_ptr->transformations & PNG_BACKGROUND) && + !(png_ptr->transformations & PNG_BACKGROUND_EXPAND) && + (png_ptr->transformations & PNG_GRAY_TO_RGB) && + png_ptr->background.red == png_ptr->background.green && + png_ptr->background.red == png_ptr->background.blue) + { + png_ptr->mode |= PNG_BACKGROUND_IS_GRAY; + png_ptr->background.gray = png_ptr->background.red; + } +#endif + + if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) && + (png_ptr->transformations & PNG_EXPAND)) + { + if (!(color_type & PNG_COLOR_MASK_COLOR)) /* i.e., GRAY or GRAY_ALPHA */ + { + /* expand background and tRNS chunks */ + switch (png_ptr->bit_depth) + { + case 1: + png_ptr->background.gray *= (png_uint_16)0xff; + png_ptr->background.red = png_ptr->background.green + = png_ptr->background.blue = png_ptr->background.gray; + if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) + { + png_ptr->trans_values.gray *= (png_uint_16)0xff; + png_ptr->trans_values.red = png_ptr->trans_values.green + = png_ptr->trans_values.blue = png_ptr->trans_values.gray; + } + break; + case 2: + png_ptr->background.gray *= (png_uint_16)0x55; + png_ptr->background.red = png_ptr->background.green + = png_ptr->background.blue = png_ptr->background.gray; + if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) + { + png_ptr->trans_values.gray *= (png_uint_16)0x55; + png_ptr->trans_values.red = png_ptr->trans_values.green + = png_ptr->trans_values.blue = png_ptr->trans_values.gray; + } + break; + case 4: + png_ptr->background.gray *= (png_uint_16)0x11; + png_ptr->background.red = png_ptr->background.green + = png_ptr->background.blue = png_ptr->background.gray; + if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) + { + png_ptr->trans_values.gray *= (png_uint_16)0x11; + png_ptr->trans_values.red = png_ptr->trans_values.green + = png_ptr->trans_values.blue = png_ptr->trans_values.gray; + } + break; + case 8: + case 16: + png_ptr->background.red = png_ptr->background.green + = png_ptr->background.blue = png_ptr->background.gray; + break; + } + } + else if (color_type == PNG_COLOR_TYPE_PALETTE) + { + png_ptr->background.red = + png_ptr->palette[png_ptr->background.index].red; + png_ptr->background.green = + png_ptr->palette[png_ptr->background.index].green; + png_ptr->background.blue = + png_ptr->palette[png_ptr->background.index].blue; + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) + if (png_ptr->transformations & PNG_INVERT_ALPHA) + { +#if defined(PNG_READ_EXPAND_SUPPORTED) + if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) +#endif + { + /* invert the alpha channel (in tRNS) unless the pixels are + going to be expanded, in which case leave it for later */ + int i, istop; + istop=(int)png_ptr->num_trans; + for (i=0; itrans[i] = (png_byte)(255 - png_ptr->trans[i]); + } + } +#endif + + } + } +#endif + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED) + png_ptr->background_1 = png_ptr->background; +#endif +#if defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) + + if ((color_type == PNG_COLOR_TYPE_PALETTE && png_ptr->num_trans != 0) + && (fabs(png_ptr->screen_gamma * png_ptr->gamma - 1.0) + < PNG_GAMMA_THRESHOLD)) + { + int i, k; + k=0; + for (i=0; inum_trans; i++) + { + if (png_ptr->trans[i] != 0 && png_ptr->trans[i] != 0xff) + k=1; /* partial transparency is present */ + } + if (k == 0) + png_ptr->transformations &= ~PNG_GAMMA; + } + + if ((png_ptr->transformations & (PNG_GAMMA | PNG_RGB_TO_GRAY)) && + png_ptr->gamma != 0.0) + { + png_build_gamma_table(png_ptr); +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->transformations & PNG_BACKGROUND) + { + if (color_type == PNG_COLOR_TYPE_PALETTE) + { + /* could skip if no transparency and + */ + png_color back, back_1; + png_colorp palette = png_ptr->palette; + int num_palette = png_ptr->num_palette; + int i; + if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_FILE) + { + back.red = png_ptr->gamma_table[png_ptr->background.red]; + back.green = png_ptr->gamma_table[png_ptr->background.green]; + back.blue = png_ptr->gamma_table[png_ptr->background.blue]; + + back_1.red = png_ptr->gamma_to_1[png_ptr->background.red]; + back_1.green = png_ptr->gamma_to_1[png_ptr->background.green]; + back_1.blue = png_ptr->gamma_to_1[png_ptr->background.blue]; + } + else + { + double g, gs; + + switch (png_ptr->background_gamma_type) + { + case PNG_BACKGROUND_GAMMA_SCREEN: + g = (png_ptr->screen_gamma); + gs = 1.0; + break; + case PNG_BACKGROUND_GAMMA_FILE: + g = 1.0 / (png_ptr->gamma); + gs = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); + break; + case PNG_BACKGROUND_GAMMA_UNIQUE: + g = 1.0 / (png_ptr->background_gamma); + gs = 1.0 / (png_ptr->background_gamma * + png_ptr->screen_gamma); + break; + default: + g = 1.0; /* back_1 */ + gs = 1.0; /* back */ + } + + if ( fabs(gs - 1.0) < PNG_GAMMA_THRESHOLD) + { + back.red = (png_byte)png_ptr->background.red; + back.green = (png_byte)png_ptr->background.green; + back.blue = (png_byte)png_ptr->background.blue; + } + else + { + back.red = (png_byte)(pow( + (double)png_ptr->background.red/255, gs) * 255.0 + .5); + back.green = (png_byte)(pow( + (double)png_ptr->background.green/255, gs) * 255.0 + .5); + back.blue = (png_byte)(pow( + (double)png_ptr->background.blue/255, gs) * 255.0 + .5); + } + + back_1.red = (png_byte)(pow( + (double)png_ptr->background.red/255, g) * 255.0 + .5); + back_1.green = (png_byte)(pow( + (double)png_ptr->background.green/255, g) * 255.0 + .5); + back_1.blue = (png_byte)(pow( + (double)png_ptr->background.blue/255, g) * 255.0 + .5); + } + for (i = 0; i < num_palette; i++) + { + if (i < (int)png_ptr->num_trans && png_ptr->trans[i] != 0xff) + { + if (png_ptr->trans[i] == 0) + { + palette[i] = back; + } + else /* if (png_ptr->trans[i] != 0xff) */ + { + png_byte v, w; + + v = png_ptr->gamma_to_1[palette[i].red]; + png_composite(w, v, png_ptr->trans[i], back_1.red); + palette[i].red = png_ptr->gamma_from_1[w]; + + v = png_ptr->gamma_to_1[palette[i].green]; + png_composite(w, v, png_ptr->trans[i], back_1.green); + palette[i].green = png_ptr->gamma_from_1[w]; + + v = png_ptr->gamma_to_1[palette[i].blue]; + png_composite(w, v, png_ptr->trans[i], back_1.blue); + palette[i].blue = png_ptr->gamma_from_1[w]; + } + } + else + { + palette[i].red = png_ptr->gamma_table[palette[i].red]; + palette[i].green = png_ptr->gamma_table[palette[i].green]; + palette[i].blue = png_ptr->gamma_table[palette[i].blue]; + } + } + /* Prevent the transformations being done again, and make sure + * that the now spurious alpha channel is stripped - the code + * has just reduced background composition and gamma correction + * to a simple alpha channel strip. + */ + png_ptr->transformations &= ~PNG_BACKGROUND; + png_ptr->transformations &= ~PNG_GAMMA; + png_ptr->transformations |= PNG_STRIP_ALPHA; + } + /* if (png_ptr->background_gamma_type!=PNG_BACKGROUND_GAMMA_UNKNOWN) */ + else + /* color_type != PNG_COLOR_TYPE_PALETTE */ + { + double m = (double)(((png_uint_32)1 << png_ptr->bit_depth) - 1); + double g = 1.0; + double gs = 1.0; + + switch (png_ptr->background_gamma_type) + { + case PNG_BACKGROUND_GAMMA_SCREEN: + g = (png_ptr->screen_gamma); + gs = 1.0; + break; + case PNG_BACKGROUND_GAMMA_FILE: + g = 1.0 / (png_ptr->gamma); + gs = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); + break; + case PNG_BACKGROUND_GAMMA_UNIQUE: + g = 1.0 / (png_ptr->background_gamma); + gs = 1.0 / (png_ptr->background_gamma * + png_ptr->screen_gamma); + break; + } + + png_ptr->background_1.gray = (png_uint_16)(pow( + (double)png_ptr->background.gray / m, g) * m + .5); + png_ptr->background.gray = (png_uint_16)(pow( + (double)png_ptr->background.gray / m, gs) * m + .5); + + if ((png_ptr->background.red != png_ptr->background.green) || + (png_ptr->background.red != png_ptr->background.blue) || + (png_ptr->background.red != png_ptr->background.gray)) + { + /* RGB or RGBA with color background */ + png_ptr->background_1.red = (png_uint_16)(pow( + (double)png_ptr->background.red / m, g) * m + .5); + png_ptr->background_1.green = (png_uint_16)(pow( + (double)png_ptr->background.green / m, g) * m + .5); + png_ptr->background_1.blue = (png_uint_16)(pow( + (double)png_ptr->background.blue / m, g) * m + .5); + png_ptr->background.red = (png_uint_16)(pow( + (double)png_ptr->background.red / m, gs) * m + .5); + png_ptr->background.green = (png_uint_16)(pow( + (double)png_ptr->background.green / m, gs) * m + .5); + png_ptr->background.blue = (png_uint_16)(pow( + (double)png_ptr->background.blue / m, gs) * m + .5); + } + else + { + /* GRAY, GRAY ALPHA, RGB, or RGBA with gray background */ + png_ptr->background_1.red = png_ptr->background_1.green + = png_ptr->background_1.blue = png_ptr->background_1.gray; + png_ptr->background.red = png_ptr->background.green + = png_ptr->background.blue = png_ptr->background.gray; + } + } + } + else + /* transformation does not include PNG_BACKGROUND */ +#endif /* PNG_READ_BACKGROUND_SUPPORTED */ + if (color_type == PNG_COLOR_TYPE_PALETTE) + { + png_colorp palette = png_ptr->palette; + int num_palette = png_ptr->num_palette; + int i; + + for (i = 0; i < num_palette; i++) + { + palette[i].red = png_ptr->gamma_table[palette[i].red]; + palette[i].green = png_ptr->gamma_table[palette[i].green]; + palette[i].blue = png_ptr->gamma_table[palette[i].blue]; + } + + /* Done the gamma correction. */ + png_ptr->transformations &= ~PNG_GAMMA; + } + } +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + else +#endif +#endif /* PNG_READ_GAMMA_SUPPORTED && PNG_FLOATING_POINT_SUPPORTED */ +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + /* No GAMMA transformation */ + if ((png_ptr->transformations & PNG_BACKGROUND) && + (color_type == PNG_COLOR_TYPE_PALETTE)) + { + int i; + int istop = (int)png_ptr->num_trans; + png_color back; + png_colorp palette = png_ptr->palette; + + back.red = (png_byte)png_ptr->background.red; + back.green = (png_byte)png_ptr->background.green; + back.blue = (png_byte)png_ptr->background.blue; + + for (i = 0; i < istop; i++) + { + if (png_ptr->trans[i] == 0) + { + palette[i] = back; + } + else if (png_ptr->trans[i] != 0xff) + { + /* The png_composite() macro is defined in png.h */ + png_composite(palette[i].red, palette[i].red, + png_ptr->trans[i], back.red); + png_composite(palette[i].green, palette[i].green, + png_ptr->trans[i], back.green); + png_composite(palette[i].blue, palette[i].blue, + png_ptr->trans[i], back.blue); + } + } + + /* Handled alpha, still need to strip the channel. */ + png_ptr->transformations &= ~PNG_BACKGROUND; + png_ptr->transformations |= PNG_STRIP_ALPHA; + } +#endif /* PNG_READ_BACKGROUND_SUPPORTED */ + +#if defined(PNG_READ_SHIFT_SUPPORTED) + if ((png_ptr->transformations & PNG_SHIFT) && + (color_type == PNG_COLOR_TYPE_PALETTE)) + { + png_uint_16 i; + png_uint_16 istop = png_ptr->num_palette; + int sr = 8 - png_ptr->sig_bit.red; + int sg = 8 - png_ptr->sig_bit.green; + int sb = 8 - png_ptr->sig_bit.blue; + + if (sr < 0 || sr > 8) + sr = 0; + if (sg < 0 || sg > 8) + sg = 0; + if (sb < 0 || sb > 8) + sb = 0; + for (i = 0; i < istop; i++) + { + png_ptr->palette[i].red >>= sr; + png_ptr->palette[i].green >>= sg; + png_ptr->palette[i].blue >>= sb; + } + } +#endif /* PNG_READ_SHIFT_SUPPORTED */ + } +#if !defined(PNG_READ_GAMMA_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) \ + && !defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr) + return; +#endif +} + +/* Modify the info structure to reflect the transformations. The + * info should be updated so a PNG file could be written with it, + * assuming the transformations result in valid PNG data. + */ +void /* PRIVATE */ +png_read_transform_info(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_read_transform_info"); +#if defined(PNG_READ_EXPAND_SUPPORTED) + if (png_ptr->transformations & PNG_EXPAND) + { + if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + if (png_ptr->num_trans && + (png_ptr->transformations & PNG_EXPAND_tRNS)) + info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA; + else + info_ptr->color_type = PNG_COLOR_TYPE_RGB; + info_ptr->bit_depth = 8; + info_ptr->num_trans = 0; + } + else + { + if (png_ptr->num_trans) + { + if (png_ptr->transformations & PNG_EXPAND_tRNS) + info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; +#if 0 /* Removed from libpng-1.2.27 */ + else + info_ptr->color_type |= PNG_COLOR_MASK_COLOR; +#endif + } + if (info_ptr->bit_depth < 8) + info_ptr->bit_depth = 8; + info_ptr->num_trans = 0; + } + } +#endif + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->transformations & PNG_BACKGROUND) + { + info_ptr->color_type &= ~PNG_COLOR_MASK_ALPHA; + info_ptr->num_trans = 0; + info_ptr->background = png_ptr->background; + } +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (png_ptr->transformations & PNG_GAMMA) + { +#ifdef PNG_FLOATING_POINT_SUPPORTED + info_ptr->gamma = png_ptr->gamma; +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED + info_ptr->int_gamma = png_ptr->int_gamma; +#endif + } +#endif + +#if defined(PNG_READ_16_TO_8_SUPPORTED) + if ((png_ptr->transformations & PNG_16_TO_8) && (info_ptr->bit_depth == 16)) + info_ptr->bit_depth = 8; +#endif + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) + if (png_ptr->transformations & PNG_GRAY_TO_RGB) + info_ptr->color_type |= PNG_COLOR_MASK_COLOR; +#endif + +#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) + if (png_ptr->transformations & PNG_RGB_TO_GRAY) + info_ptr->color_type &= ~PNG_COLOR_MASK_COLOR; +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) + if (png_ptr->transformations & PNG_DITHER) + { + if (((info_ptr->color_type == PNG_COLOR_TYPE_RGB) || + (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)) && + png_ptr->palette_lookup && info_ptr->bit_depth == 8) + { + info_ptr->color_type = PNG_COLOR_TYPE_PALETTE; + } + } +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) + if ((png_ptr->transformations & PNG_PACK) && (info_ptr->bit_depth < 8)) + info_ptr->bit_depth = 8; +#endif + + if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + info_ptr->channels = 1; + else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) + info_ptr->channels = 3; + else + info_ptr->channels = 1; + +#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) + if (png_ptr->flags & PNG_FLAG_STRIP_ALPHA) + info_ptr->color_type &= ~PNG_COLOR_MASK_ALPHA; +#endif + + if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) + info_ptr->channels++; + +#if defined(PNG_READ_FILLER_SUPPORTED) + /* STRIP_ALPHA and FILLER allowed: MASK_ALPHA bit stripped above */ + if ((png_ptr->transformations & PNG_FILLER) && + ((info_ptr->color_type == PNG_COLOR_TYPE_RGB) || + (info_ptr->color_type == PNG_COLOR_TYPE_GRAY))) + { + info_ptr->channels++; + /* if adding a true alpha channel not just filler */ +#if !defined(PNG_1_0_X) + if (png_ptr->transformations & PNG_ADD_ALPHA) + info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; +#endif + } +#endif + +#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) && \ +defined(PNG_READ_USER_TRANSFORM_SUPPORTED) + if (png_ptr->transformations & PNG_USER_TRANSFORM) + { + if (info_ptr->bit_depth < png_ptr->user_transform_depth) + info_ptr->bit_depth = png_ptr->user_transform_depth; + if (info_ptr->channels < png_ptr->user_transform_channels) + info_ptr->channels = png_ptr->user_transform_channels; + } +#endif + + info_ptr->pixel_depth = (png_byte)(info_ptr->channels * + info_ptr->bit_depth); + + info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, info_ptr->width); + +#if !defined(PNG_READ_EXPAND_SUPPORTED) + if (png_ptr) + return; +#endif +} + +/* Transform the row. The order of transformations is significant, + * and is very touchy. If you add a transformation, take care to + * decide how it fits in with the other transformations here. + */ +void /* PRIVATE */ +png_do_read_transformations(png_structp png_ptr) +{ + png_debug(1, "in png_do_read_transformations"); + if (png_ptr->row_buf == NULL) + { +#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) + char msg[50]; + + png_snprintf2(msg, 50, + "NULL row buffer for row %ld, pass %d", (long)png_ptr->row_number, + png_ptr->pass); + png_error(png_ptr, msg); +#else + png_error(png_ptr, "NULL row buffer"); +#endif + } +#ifdef PNG_WARN_UNINITIALIZED_ROW + if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) + /* Application has failed to call either png_read_start_image() + * or png_read_update_info() after setting transforms that expand + * pixels. This check added to libpng-1.2.19 */ +#if (PNG_WARN_UNINITIALIZED_ROW==1) + png_error(png_ptr, "Uninitialized row"); +#else + png_warning(png_ptr, "Uninitialized row"); +#endif +#endif + +#if defined(PNG_READ_EXPAND_SUPPORTED) + if (png_ptr->transformations & PNG_EXPAND) + { + if (png_ptr->row_info.color_type == PNG_COLOR_TYPE_PALETTE) + { + png_do_expand_palette(&(png_ptr->row_info), png_ptr->row_buf + 1, + png_ptr->palette, png_ptr->trans, png_ptr->num_trans); + } + else + { + if (png_ptr->num_trans && + (png_ptr->transformations & PNG_EXPAND_tRNS)) + png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1, + &(png_ptr->trans_values)); + else + png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1, + NULL); + } + } +#endif + +#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) + if (png_ptr->flags & PNG_FLAG_STRIP_ALPHA) + png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, + PNG_FLAG_FILLER_AFTER | (png_ptr->flags & PNG_FLAG_STRIP_ALPHA)); +#endif + +#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) + if (png_ptr->transformations & PNG_RGB_TO_GRAY) + { + int rgb_error = + png_do_rgb_to_gray(png_ptr, &(png_ptr->row_info), png_ptr->row_buf + 1); + if (rgb_error) + { + png_ptr->rgb_to_gray_status=1; + if ((png_ptr->transformations & PNG_RGB_TO_GRAY) == + PNG_RGB_TO_GRAY_WARN) + png_warning(png_ptr, "png_do_rgb_to_gray found nongray pixel"); + if ((png_ptr->transformations & PNG_RGB_TO_GRAY) == + PNG_RGB_TO_GRAY_ERR) + png_error(png_ptr, "png_do_rgb_to_gray found nongray pixel"); + } + } +#endif + +/* +From Andreas Dilger e-mail to png-implement, 26 March 1998: + + In most cases, the "simple transparency" should be done prior to doing + gray-to-RGB, or you will have to test 3x as many bytes to check if a + pixel is transparent. You would also need to make sure that the + transparency information is upgraded to RGB. + + To summarize, the current flow is: + - Gray + simple transparency -> compare 1 or 2 gray bytes and composite + with background "in place" if transparent, + convert to RGB if necessary + - Gray + alpha -> composite with gray background and remove alpha bytes, + convert to RGB if necessary + + To support RGB backgrounds for gray images we need: + - Gray + simple transparency -> convert to RGB + simple transparency, compare + 3 or 6 bytes and composite with background + "in place" if transparent (3x compare/pixel + compared to doing composite with gray bkgrnd) + - Gray + alpha -> convert to RGB + alpha, composite with background and + remove alpha bytes (3x float operations/pixel + compared with composite on gray background) + + Greg's change will do this. The reason it wasn't done before is for + performance, as this increases the per-pixel operations. If we would check + in advance if the background was gray or RGB, and position the gray-to-RGB + transform appropriately, then it would save a lot of work/time. + */ + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) + /* if gray -> RGB, do so now only if background is non-gray; else do later + * for performance reasons */ + if ((png_ptr->transformations & PNG_GRAY_TO_RGB) && + !(png_ptr->mode & PNG_BACKGROUND_IS_GRAY)) + png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + if ((png_ptr->transformations & PNG_BACKGROUND) && + ((png_ptr->num_trans != 0 ) || + (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) + png_do_background(&(png_ptr->row_info), png_ptr->row_buf + 1, + &(png_ptr->trans_values), &(png_ptr->background) +#if defined(PNG_READ_GAMMA_SUPPORTED) + , &(png_ptr->background_1), + png_ptr->gamma_table, png_ptr->gamma_from_1, + png_ptr->gamma_to_1, png_ptr->gamma_16_table, + png_ptr->gamma_16_from_1, png_ptr->gamma_16_to_1, + png_ptr->gamma_shift +#endif +); +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) + if ((png_ptr->transformations & PNG_GAMMA) && +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + !((png_ptr->transformations & PNG_BACKGROUND) && + ((png_ptr->num_trans != 0) || + (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) && +#endif + (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE)) + png_do_gamma(&(png_ptr->row_info), png_ptr->row_buf + 1, + png_ptr->gamma_table, png_ptr->gamma_16_table, + png_ptr->gamma_shift); +#endif + +#if defined(PNG_READ_16_TO_8_SUPPORTED) + if (png_ptr->transformations & PNG_16_TO_8) + png_do_chop(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) + if (png_ptr->transformations & PNG_DITHER) + { + png_do_dither((png_row_infop)&(png_ptr->row_info), png_ptr->row_buf + 1, + png_ptr->palette_lookup, png_ptr->dither_index); + if (png_ptr->row_info.rowbytes == (png_uint_32)0) + png_error(png_ptr, "png_do_dither returned rowbytes=0"); + } +#endif + +#if defined(PNG_READ_INVERT_SUPPORTED) + if (png_ptr->transformations & PNG_INVERT_MONO) + png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) + if (png_ptr->transformations & PNG_SHIFT) + png_do_unshift(&(png_ptr->row_info), png_ptr->row_buf + 1, + &(png_ptr->shift)); +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) + if (png_ptr->transformations & PNG_PACK) + png_do_unpack(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_BGR_SUPPORTED) + if (png_ptr->transformations & PNG_BGR) + png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) + if (png_ptr->transformations & PNG_PACKSWAP) + png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) + /* if gray -> RGB, do so now only if we did not do so above */ + if ((png_ptr->transformations & PNG_GRAY_TO_RGB) && + (png_ptr->mode & PNG_BACKGROUND_IS_GRAY)) + png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_FILLER_SUPPORTED) + if (png_ptr->transformations & PNG_FILLER) + png_do_read_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, + (png_uint_32)png_ptr->filler, png_ptr->flags); +#endif + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) + if (png_ptr->transformations & PNG_INVERT_ALPHA) + png_do_read_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) + if (png_ptr->transformations & PNG_SWAP_ALPHA) + png_do_read_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_SWAP_SUPPORTED) + if (png_ptr->transformations & PNG_SWAP_BYTES) + png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) + if (png_ptr->transformations & PNG_USER_TRANSFORM) + { + if (png_ptr->read_user_transform_fn != NULL) + (*(png_ptr->read_user_transform_fn)) /* user read transform function */ + (png_ptr, /* png_ptr */ + &(png_ptr->row_info), /* row_info: */ + /* png_uint_32 width; width of row */ + /* png_uint_32 rowbytes; number of bytes in row */ + /* png_byte color_type; color type of pixels */ + /* png_byte bit_depth; bit depth of samples */ + /* png_byte channels; number of channels (1-4) */ + /* png_byte pixel_depth; bits per pixel (depth*channels) */ + png_ptr->row_buf + 1); /* start of pixel data for row */ +#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) + if (png_ptr->user_transform_depth) + png_ptr->row_info.bit_depth = png_ptr->user_transform_depth; + if (png_ptr->user_transform_channels) + png_ptr->row_info.channels = png_ptr->user_transform_channels; +#endif + png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * + png_ptr->row_info.channels); + png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, + png_ptr->row_info.width); + } +#endif + +} + +#if defined(PNG_READ_PACK_SUPPORTED) +/* Unpack pixels of 1, 2, or 4 bits per pixel into 1 byte per pixel, + * without changing the actual values. Thus, if you had a row with + * a bit depth of 1, you would end up with bytes that only contained + * the numbers 0 or 1. If you would rather they contain 0 and 255, use + * png_do_shift() after this. + */ +void /* PRIVATE */ +png_do_unpack(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_unpack"); +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row != NULL && row_info != NULL && row_info->bit_depth < 8) +#else + if (row_info->bit_depth < 8) +#endif + { + png_uint_32 i; + png_uint_32 row_width=row_info->width; + + switch (row_info->bit_depth) + { + case 1: + { + png_bytep sp = row + (png_size_t)((row_width - 1) >> 3); + png_bytep dp = row + (png_size_t)row_width - 1; + png_uint_32 shift = 7 - (int)((row_width + 7) & 0x07); + for (i = 0; i < row_width; i++) + { + *dp = (png_byte)((*sp >> shift) & 0x01); + if (shift == 7) + { + shift = 0; + sp--; + } + else + shift++; + + dp--; + } + break; + } + case 2: + { + + png_bytep sp = row + (png_size_t)((row_width - 1) >> 2); + png_bytep dp = row + (png_size_t)row_width - 1; + png_uint_32 shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); + for (i = 0; i < row_width; i++) + { + *dp = (png_byte)((*sp >> shift) & 0x03); + if (shift == 6) + { + shift = 0; + sp--; + } + else + shift += 2; + + dp--; + } + break; + } + case 4: + { + png_bytep sp = row + (png_size_t)((row_width - 1) >> 1); + png_bytep dp = row + (png_size_t)row_width - 1; + png_uint_32 shift = (int)((1 - ((row_width + 1) & 0x01)) << 2); + for (i = 0; i < row_width; i++) + { + *dp = (png_byte)((*sp >> shift) & 0x0f); + if (shift == 4) + { + shift = 0; + sp--; + } + else + shift = 4; + + dp--; + } + break; + } + } + row_info->bit_depth = 8; + row_info->pixel_depth = (png_byte)(8 * row_info->channels); + row_info->rowbytes = row_width * row_info->channels; + } +} +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) +/* Reverse the effects of png_do_shift. This routine merely shifts the + * pixels back to their significant bits values. Thus, if you have + * a row of bit depth 8, but only 5 are significant, this will shift + * the values back to 0 through 31. + */ +void /* PRIVATE */ +png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits) +{ + png_debug(1, "in png_do_unshift"); + if ( +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && sig_bits != NULL && +#endif + row_info->color_type != PNG_COLOR_TYPE_PALETTE) + { + int shift[4]; + int channels = 0; + int c; + png_uint_16 value = 0; + png_uint_32 row_width = row_info->width; + + if (row_info->color_type & PNG_COLOR_MASK_COLOR) + { + shift[channels++] = row_info->bit_depth - sig_bits->red; + shift[channels++] = row_info->bit_depth - sig_bits->green; + shift[channels++] = row_info->bit_depth - sig_bits->blue; + } + else + { + shift[channels++] = row_info->bit_depth - sig_bits->gray; + } + if (row_info->color_type & PNG_COLOR_MASK_ALPHA) + { + shift[channels++] = row_info->bit_depth - sig_bits->alpha; + } + + for (c = 0; c < channels; c++) + { + if (shift[c] <= 0) + shift[c] = 0; + else + value = 1; + } + + if (!value) + return; + + switch (row_info->bit_depth) + { + case 2: + { + png_bytep bp; + png_uint_32 i; + png_uint_32 istop = row_info->rowbytes; + + for (bp = row, i = 0; i < istop; i++) + { + *bp >>= 1; + *bp++ &= 0x55; + } + break; + } + case 4: + { + png_bytep bp = row; + png_uint_32 i; + png_uint_32 istop = row_info->rowbytes; + png_byte mask = (png_byte)((((int)0xf0 >> shift[0]) & (int)0xf0) | + (png_byte)((int)0xf >> shift[0])); + + for (i = 0; i < istop; i++) + { + *bp >>= shift[0]; + *bp++ &= mask; + } + break; + } + case 8: + { + png_bytep bp = row; + png_uint_32 i; + png_uint_32 istop = row_width * channels; + + for (i = 0; i < istop; i++) + { + *bp++ >>= shift[i%channels]; + } + break; + } + case 16: + { + png_bytep bp = row; + png_uint_32 i; + png_uint_32 istop = channels * row_width; + + for (i = 0; i < istop; i++) + { + value = (png_uint_16)((*bp << 8) + *(bp + 1)); + value >>= shift[i%channels]; + *bp++ = (png_byte)(value >> 8); + *bp++ = (png_byte)(value & 0xff); + } + break; + } + } + } +} +#endif + +#if defined(PNG_READ_16_TO_8_SUPPORTED) +/* chop rows of bit depth 16 down to 8 */ +void /* PRIVATE */ +png_do_chop(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_chop"); +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row != NULL && row_info != NULL && row_info->bit_depth == 16) +#else + if (row_info->bit_depth == 16) +#endif + { + png_bytep sp = row; + png_bytep dp = row; + png_uint_32 i; + png_uint_32 istop = row_info->width * row_info->channels; + + for (i = 0; i> 8)) >> 8; + * + * Approximate calculation with shift/add instead of multiply/divide: + * *dp = ((((png_uint_32)(*sp) << 8) | + * (png_uint_32)((int)(*(sp + 1)) - *sp)) + 128) >> 8; + * + * What we actually do to avoid extra shifting and conversion: + */ + + *dp = *sp + ((((int)(*(sp + 1)) - *sp) > 128) ? 1 : 0); +#else + /* Simply discard the low order byte */ + *dp = *sp; +#endif + } + row_info->bit_depth = 8; + row_info->pixel_depth = (png_byte)(8 * row_info->channels); + row_info->rowbytes = row_info->width * row_info->channels; + } +} +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) +void /* PRIVATE */ +png_do_read_swap_alpha(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_read_swap_alpha"); +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row != NULL && row_info != NULL) +#endif + { + png_uint_32 row_width = row_info->width; + if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + /* This converts from RGBA to ARGB */ + if (row_info->bit_depth == 8) + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_byte save; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + save = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = save; + } + } + /* This converts from RRGGBBAA to AARRGGBB */ + else + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_byte save[2]; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + save[0] = *(--sp); + save[1] = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = save[0]; + *(--dp) = save[1]; + } + } + } + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + /* This converts from GA to AG */ + if (row_info->bit_depth == 8) + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_byte save; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + save = *(--sp); + *(--dp) = *(--sp); + *(--dp) = save; + } + } + /* This converts from GGAA to AAGG */ + else + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_byte save[2]; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + save[0] = *(--sp); + save[1] = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = save[0]; + *(--dp) = save[1]; + } + } + } + } +} +#endif + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) +void /* PRIVATE */ +png_do_read_invert_alpha(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_read_invert_alpha"); +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row != NULL && row_info != NULL) +#endif + { + png_uint_32 row_width = row_info->width; + if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + /* This inverts the alpha channel in RGBA */ + if (row_info->bit_depth == 8) + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + *(--dp) = (png_byte)(255 - *(--sp)); + +/* This does nothing: + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + We can replace it with: +*/ + sp-=3; + dp=sp; + } + } + /* This inverts the alpha channel in RRGGBBAA */ + else + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + *(--dp) = (png_byte)(255 - *(--sp)); + *(--dp) = (png_byte)(255 - *(--sp)); + +/* This does nothing: + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + We can replace it with: +*/ + sp-=6; + dp=sp; + } + } + } + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + /* This inverts the alpha channel in GA */ + if (row_info->bit_depth == 8) + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + *(--dp) = (png_byte)(255 - *(--sp)); + *(--dp) = *(--sp); + } + } + /* This inverts the alpha channel in GGAA */ + else + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + *(--dp) = (png_byte)(255 - *(--sp)); + *(--dp) = (png_byte)(255 - *(--sp)); +/* + *(--dp) = *(--sp); + *(--dp) = *(--sp); +*/ + sp-=2; + dp=sp; + } + } + } + } +} +#endif + +#if defined(PNG_READ_FILLER_SUPPORTED) +/* Add filler channel if we have RGB color */ +void /* PRIVATE */ +png_do_read_filler(png_row_infop row_info, png_bytep row, + png_uint_32 filler, png_uint_32 flags) +{ + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + png_byte hi_filler = (png_byte)((filler>>8) & 0xff); + png_byte lo_filler = (png_byte)(filler & 0xff); + + png_debug(1, "in png_do_read_filler"); + if ( +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + row_info->color_type == PNG_COLOR_TYPE_GRAY) + { + if (row_info->bit_depth == 8) + { + /* This changes the data from G to GX */ + if (flags & PNG_FLAG_FILLER_AFTER) + { + png_bytep sp = row + (png_size_t)row_width; + png_bytep dp = sp + (png_size_t)row_width; + for (i = 1; i < row_width; i++) + { + *(--dp) = lo_filler; + *(--dp) = *(--sp); + } + *(--dp) = lo_filler; + row_info->channels = 2; + row_info->pixel_depth = 16; + row_info->rowbytes = row_width * 2; + } + /* This changes the data from G to XG */ + else + { + png_bytep sp = row + (png_size_t)row_width; + png_bytep dp = sp + (png_size_t)row_width; + for (i = 0; i < row_width; i++) + { + *(--dp) = *(--sp); + *(--dp) = lo_filler; + } + row_info->channels = 2; + row_info->pixel_depth = 16; + row_info->rowbytes = row_width * 2; + } + } + else if (row_info->bit_depth == 16) + { + /* This changes the data from GG to GGXX */ + if (flags & PNG_FLAG_FILLER_AFTER) + { + png_bytep sp = row + (png_size_t)row_width * 2; + png_bytep dp = sp + (png_size_t)row_width * 2; + for (i = 1; i < row_width; i++) + { + *(--dp) = hi_filler; + *(--dp) = lo_filler; + *(--dp) = *(--sp); + *(--dp) = *(--sp); + } + *(--dp) = hi_filler; + *(--dp) = lo_filler; + row_info->channels = 2; + row_info->pixel_depth = 32; + row_info->rowbytes = row_width * 4; + } + /* This changes the data from GG to XXGG */ + else + { + png_bytep sp = row + (png_size_t)row_width * 2; + png_bytep dp = sp + (png_size_t)row_width * 2; + for (i = 0; i < row_width; i++) + { + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = hi_filler; + *(--dp) = lo_filler; + } + row_info->channels = 2; + row_info->pixel_depth = 32; + row_info->rowbytes = row_width * 4; + } + } + } /* COLOR_TYPE == GRAY */ + else if (row_info->color_type == PNG_COLOR_TYPE_RGB) + { + if (row_info->bit_depth == 8) + { + /* This changes the data from RGB to RGBX */ + if (flags & PNG_FLAG_FILLER_AFTER) + { + png_bytep sp = row + (png_size_t)row_width * 3; + png_bytep dp = sp + (png_size_t)row_width; + for (i = 1; i < row_width; i++) + { + *(--dp) = lo_filler; + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + } + *(--dp) = lo_filler; + row_info->channels = 4; + row_info->pixel_depth = 32; + row_info->rowbytes = row_width * 4; + } + /* This changes the data from RGB to XRGB */ + else + { + png_bytep sp = row + (png_size_t)row_width * 3; + png_bytep dp = sp + (png_size_t)row_width; + for (i = 0; i < row_width; i++) + { + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = lo_filler; + } + row_info->channels = 4; + row_info->pixel_depth = 32; + row_info->rowbytes = row_width * 4; + } + } + else if (row_info->bit_depth == 16) + { + /* This changes the data from RRGGBB to RRGGBBXX */ + if (flags & PNG_FLAG_FILLER_AFTER) + { + png_bytep sp = row + (png_size_t)row_width * 6; + png_bytep dp = sp + (png_size_t)row_width * 2; + for (i = 1; i < row_width; i++) + { + *(--dp) = hi_filler; + *(--dp) = lo_filler; + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + } + *(--dp) = hi_filler; + *(--dp) = lo_filler; + row_info->channels = 4; + row_info->pixel_depth = 64; + row_info->rowbytes = row_width * 8; + } + /* This changes the data from RRGGBB to XXRRGGBB */ + else + { + png_bytep sp = row + (png_size_t)row_width * 6; + png_bytep dp = sp + (png_size_t)row_width * 2; + for (i = 0; i < row_width; i++) + { + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = hi_filler; + *(--dp) = lo_filler; + } + row_info->channels = 4; + row_info->pixel_depth = 64; + row_info->rowbytes = row_width * 8; + } + } + } /* COLOR_TYPE == RGB */ +} +#endif + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) +/* expand grayscale files to RGB, with or without alpha */ +void /* PRIVATE */ +png_do_gray_to_rgb(png_row_infop row_info, png_bytep row) +{ + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + png_debug(1, "in png_do_gray_to_rgb"); + if (row_info->bit_depth >= 8 && +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + !(row_info->color_type & PNG_COLOR_MASK_COLOR)) + { + if (row_info->color_type == PNG_COLOR_TYPE_GRAY) + { + if (row_info->bit_depth == 8) + { + png_bytep sp = row + (png_size_t)row_width - 1; + png_bytep dp = sp + (png_size_t)row_width * 2; + for (i = 0; i < row_width; i++) + { + *(dp--) = *sp; + *(dp--) = *sp; + *(dp--) = *(sp--); + } + } + else + { + png_bytep sp = row + (png_size_t)row_width * 2 - 1; + png_bytep dp = sp + (png_size_t)row_width * 4; + for (i = 0; i < row_width; i++) + { + *(dp--) = *sp; + *(dp--) = *(sp - 1); + *(dp--) = *sp; + *(dp--) = *(sp - 1); + *(dp--) = *(sp--); + *(dp--) = *(sp--); + } + } + } + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + if (row_info->bit_depth == 8) + { + png_bytep sp = row + (png_size_t)row_width * 2 - 1; + png_bytep dp = sp + (png_size_t)row_width * 2; + for (i = 0; i < row_width; i++) + { + *(dp--) = *(sp--); + *(dp--) = *sp; + *(dp--) = *sp; + *(dp--) = *(sp--); + } + } + else + { + png_bytep sp = row + (png_size_t)row_width * 4 - 1; + png_bytep dp = sp + (png_size_t)row_width * 4; + for (i = 0; i < row_width; i++) + { + *(dp--) = *(sp--); + *(dp--) = *(sp--); + *(dp--) = *sp; + *(dp--) = *(sp - 1); + *(dp--) = *sp; + *(dp--) = *(sp - 1); + *(dp--) = *(sp--); + *(dp--) = *(sp--); + } + } + } + row_info->channels += (png_byte)2; + row_info->color_type |= PNG_COLOR_MASK_COLOR; + row_info->pixel_depth = (png_byte)(row_info->channels * + row_info->bit_depth); + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); + } +} +#endif + +#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) +/* reduce RGB files to grayscale, with or without alpha + * using the equation given in Poynton's ColorFAQ at + * (THIS LINK IS DEAD June 2008) + * New link: + * + * Charles Poynton poynton at poynton.com + * + * Y = 0.212671 * R + 0.715160 * G + 0.072169 * B + * + * We approximate this with + * + * Y = 0.21268 * R + 0.7151 * G + 0.07217 * B + * + * which can be expressed with integers as + * + * Y = (6969 * R + 23434 * G + 2365 * B)/32768 + * + * The calculation is to be done in a linear colorspace. + * + * Other integer coefficents can be used via png_set_rgb_to_gray(). + */ +int /* PRIVATE */ +png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) + +{ + png_uint_32 i; + + png_uint_32 row_width = row_info->width; + int rgb_error = 0; + + png_debug(1, "in png_do_rgb_to_gray"); + if ( +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + (row_info->color_type & PNG_COLOR_MASK_COLOR)) + { + png_uint_32 rc = png_ptr->rgb_to_gray_red_coeff; + png_uint_32 gc = png_ptr->rgb_to_gray_green_coeff; + png_uint_32 bc = png_ptr->rgb_to_gray_blue_coeff; + + if (row_info->color_type == PNG_COLOR_TYPE_RGB) + { + if (row_info->bit_depth == 8) + { +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL) + { + png_bytep sp = row; + png_bytep dp = row; + + for (i = 0; i < row_width; i++) + { + png_byte red = png_ptr->gamma_to_1[*(sp++)]; + png_byte green = png_ptr->gamma_to_1[*(sp++)]; + png_byte blue = png_ptr->gamma_to_1[*(sp++)]; + if (red != green || red != blue) + { + rgb_error |= 1; + *(dp++) = png_ptr->gamma_from_1[ + (rc*red + gc*green + bc*blue)>>15]; + } + else + *(dp++) = *(sp - 1); + } + } + else +#endif + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_byte red = *(sp++); + png_byte green = *(sp++); + png_byte blue = *(sp++); + if (red != green || red != blue) + { + rgb_error |= 1; + *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15); + } + else + *(dp++) = *(sp - 1); + } + } + } + + else /* RGB bit_depth == 16 */ + { +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->gamma_16_to_1 != NULL && + png_ptr->gamma_16_from_1 != NULL) + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 red, green, blue, w; + + red = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + + if (red == green && red == blue) + w = red; + else + { + png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff) >> + png_ptr->gamma_shift][red>>8]; + png_uint_16 green_1 = png_ptr->gamma_16_to_1[(green&0xff) >> + png_ptr->gamma_shift][green>>8]; + png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff) >> + png_ptr->gamma_shift][blue>>8]; + png_uint_16 gray16 = (png_uint_16)((rc*red_1 + gc*green_1 + + bc*blue_1)>>15); + w = png_ptr->gamma_16_from_1[(gray16&0xff) >> + png_ptr->gamma_shift][gray16 >> 8]; + rgb_error |= 1; + } + + *(dp++) = (png_byte)((w>>8) & 0xff); + *(dp++) = (png_byte)(w & 0xff); + } + } + else +#endif + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 red, green, blue, gray16; + + red = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + + if (red != green || red != blue) + rgb_error |= 1; + gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15); + *(dp++) = (png_byte)((gray16>>8) & 0xff); + *(dp++) = (png_byte)(gray16 & 0xff); + } + } + } + } + if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + if (row_info->bit_depth == 8) + { +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL) + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_byte red = png_ptr->gamma_to_1[*(sp++)]; + png_byte green = png_ptr->gamma_to_1[*(sp++)]; + png_byte blue = png_ptr->gamma_to_1[*(sp++)]; + if (red != green || red != blue) + rgb_error |= 1; + *(dp++) = png_ptr->gamma_from_1 + [(rc*red + gc*green + bc*blue)>>15]; + *(dp++) = *(sp++); /* alpha */ + } + } + else +#endif + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_byte red = *(sp++); + png_byte green = *(sp++); + png_byte blue = *(sp++); + if (red != green || red != blue) + rgb_error |= 1; + *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15); + *(dp++) = *(sp++); /* alpha */ + } + } + } + else /* RGBA bit_depth == 16 */ + { +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->gamma_16_to_1 != NULL && + png_ptr->gamma_16_from_1 != NULL) + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 red, green, blue, w; + + red = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + + if (red == green && red == blue) + w = red; + else + { + png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff) >> + png_ptr->gamma_shift][red>>8]; + png_uint_16 green_1 = png_ptr->gamma_16_to_1[(green&0xff) >> + png_ptr->gamma_shift][green>>8]; + png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff) >> + png_ptr->gamma_shift][blue>>8]; + png_uint_16 gray16 = (png_uint_16)((rc * red_1 + + gc * green_1 + bc * blue_1)>>15); + w = png_ptr->gamma_16_from_1[(gray16&0xff) >> + png_ptr->gamma_shift][gray16 >> 8]; + rgb_error |= 1; + } + + *(dp++) = (png_byte)((w>>8) & 0xff); + *(dp++) = (png_byte)(w & 0xff); + *(dp++) = *(sp++); /* alpha */ + *(dp++) = *(sp++); + } + } + else +#endif + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 red, green, blue, gray16; + red = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2; + green = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2; + blue = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2; + if (red != green || red != blue) + rgb_error |= 1; + gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15); + *(dp++) = (png_byte)((gray16>>8) & 0xff); + *(dp++) = (png_byte)(gray16 & 0xff); + *(dp++) = *(sp++); /* alpha */ + *(dp++) = *(sp++); + } + } + } + } + row_info->channels -= (png_byte)2; + row_info->color_type &= ~PNG_COLOR_MASK_COLOR; + row_info->pixel_depth = (png_byte)(row_info->channels * + row_info->bit_depth); + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); + } + return rgb_error; +} +#endif + +/* Build a grayscale palette. Palette is assumed to be 1 << bit_depth + * large of png_color. This lets grayscale images be treated as + * paletted. Most useful for gamma correction and simplification + * of code. + */ +void PNGAPI +png_build_grayscale_palette(int bit_depth, png_colorp palette) +{ + int num_palette; + int color_inc; + int i; + int v; + + png_debug(1, "in png_do_build_grayscale_palette"); + if (palette == NULL) + return; + + switch (bit_depth) + { + case 1: + num_palette = 2; + color_inc = 0xff; + break; + case 2: + num_palette = 4; + color_inc = 0x55; + break; + case 4: + num_palette = 16; + color_inc = 0x11; + break; + case 8: + num_palette = 256; + color_inc = 1; + break; + default: + num_palette = 0; + color_inc = 0; + break; + } + + for (i = 0, v = 0; i < num_palette; i++, v += color_inc) + { + palette[i].red = (png_byte)v; + palette[i].green = (png_byte)v; + palette[i].blue = (png_byte)v; + } +} + +/* This function is currently unused. Do we really need it? */ +#if defined(PNG_READ_DITHER_SUPPORTED) && defined(PNG_CORRECT_PALETTE_SUPPORTED) +void /* PRIVATE */ +png_correct_palette(png_structp png_ptr, png_colorp palette, + int num_palette) +{ + png_debug(1, "in png_correct_palette"); +#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \ + defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) + if (png_ptr->transformations & (PNG_GAMMA | PNG_BACKGROUND)) + { + png_color back, back_1; + + if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_FILE) + { + back.red = png_ptr->gamma_table[png_ptr->background.red]; + back.green = png_ptr->gamma_table[png_ptr->background.green]; + back.blue = png_ptr->gamma_table[png_ptr->background.blue]; + + back_1.red = png_ptr->gamma_to_1[png_ptr->background.red]; + back_1.green = png_ptr->gamma_to_1[png_ptr->background.green]; + back_1.blue = png_ptr->gamma_to_1[png_ptr->background.blue]; + } + else + { + double g; + + g = 1.0 / (png_ptr->background_gamma * png_ptr->screen_gamma); + + if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_SCREEN || + fabs(g - 1.0) < PNG_GAMMA_THRESHOLD) + { + back.red = png_ptr->background.red; + back.green = png_ptr->background.green; + back.blue = png_ptr->background.blue; + } + else + { + back.red = + (png_byte)(pow((double)png_ptr->background.red/255, g) * + 255.0 + 0.5); + back.green = + (png_byte)(pow((double)png_ptr->background.green/255, g) * + 255.0 + 0.5); + back.blue = + (png_byte)(pow((double)png_ptr->background.blue/255, g) * + 255.0 + 0.5); + } + + g = 1.0 / png_ptr->background_gamma; + + back_1.red = + (png_byte)(pow((double)png_ptr->background.red/255, g) * + 255.0 + 0.5); + back_1.green = + (png_byte)(pow((double)png_ptr->background.green/255, g) * + 255.0 + 0.5); + back_1.blue = + (png_byte)(pow((double)png_ptr->background.blue/255, g) * + 255.0 + 0.5); + } + + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + png_uint_32 i; + + for (i = 0; i < (png_uint_32)num_palette; i++) + { + if (i < png_ptr->num_trans && png_ptr->trans[i] == 0) + { + palette[i] = back; + } + else if (i < png_ptr->num_trans && png_ptr->trans[i] != 0xff) + { + png_byte v, w; + + v = png_ptr->gamma_to_1[png_ptr->palette[i].red]; + png_composite(w, v, png_ptr->trans[i], back_1.red); + palette[i].red = png_ptr->gamma_from_1[w]; + + v = png_ptr->gamma_to_1[png_ptr->palette[i].green]; + png_composite(w, v, png_ptr->trans[i], back_1.green); + palette[i].green = png_ptr->gamma_from_1[w]; + + v = png_ptr->gamma_to_1[png_ptr->palette[i].blue]; + png_composite(w, v, png_ptr->trans[i], back_1.blue); + palette[i].blue = png_ptr->gamma_from_1[w]; + } + else + { + palette[i].red = png_ptr->gamma_table[palette[i].red]; + palette[i].green = png_ptr->gamma_table[palette[i].green]; + palette[i].blue = png_ptr->gamma_table[palette[i].blue]; + } + } + } + else + { + int i; + + for (i = 0; i < num_palette; i++) + { + if (palette[i].red == (png_byte)png_ptr->trans_values.gray) + { + palette[i] = back; + } + else + { + palette[i].red = png_ptr->gamma_table[palette[i].red]; + palette[i].green = png_ptr->gamma_table[palette[i].green]; + palette[i].blue = png_ptr->gamma_table[palette[i].blue]; + } + } + } + } + else +#endif +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (png_ptr->transformations & PNG_GAMMA) + { + int i; + + for (i = 0; i < num_palette; i++) + { + palette[i].red = png_ptr->gamma_table[palette[i].red]; + palette[i].green = png_ptr->gamma_table[palette[i].green]; + palette[i].blue = png_ptr->gamma_table[palette[i].blue]; + } + } +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + else +#endif +#endif +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->transformations & PNG_BACKGROUND) + { + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + png_color back; + + back.red = (png_byte)png_ptr->background.red; + back.green = (png_byte)png_ptr->background.green; + back.blue = (png_byte)png_ptr->background.blue; + + for (i = 0; i < (int)png_ptr->num_trans; i++) + { + if (png_ptr->trans[i] == 0) + { + palette[i].red = back.red; + palette[i].green = back.green; + palette[i].blue = back.blue; + } + else if (png_ptr->trans[i] != 0xff) + { + png_composite(palette[i].red, png_ptr->palette[i].red, + png_ptr->trans[i], back.red); + png_composite(palette[i].green, png_ptr->palette[i].green, + png_ptr->trans[i], back.green); + png_composite(palette[i].blue, png_ptr->palette[i].blue, + png_ptr->trans[i], back.blue); + } + } + } + else /* assume grayscale palette (what else could it be?) */ + { + int i; + + for (i = 0; i < num_palette; i++) + { + if (i == (png_byte)png_ptr->trans_values.gray) + { + palette[i].red = (png_byte)png_ptr->background.red; + palette[i].green = (png_byte)png_ptr->background.green; + palette[i].blue = (png_byte)png_ptr->background.blue; + } + } + } + } +#endif +} +#endif + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) +/* Replace any alpha or transparency with the supplied background color. + * "background" is already in the screen gamma, while "background_1" is + * at a gamma of 1.0. Paletted files have already been taken care of. + */ +void /* PRIVATE */ +png_do_background(png_row_infop row_info, png_bytep row, + png_color_16p trans_values, png_color_16p background +#if defined(PNG_READ_GAMMA_SUPPORTED) + , png_color_16p background_1, + png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1, + png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1, + png_uint_16pp gamma_16_to_1, int gamma_shift +#endif + ) +{ + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width=row_info->width; + int shift; + + png_debug(1, "in png_do_background"); + if (background != NULL && +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + (!(row_info->color_type & PNG_COLOR_MASK_ALPHA) || + (row_info->color_type != PNG_COLOR_TYPE_PALETTE && trans_values))) + { + switch (row_info->color_type) + { + case PNG_COLOR_TYPE_GRAY: + { + switch (row_info->bit_depth) + { + case 1: + { + sp = row; + shift = 7; + for (i = 0; i < row_width; i++) + { + if ((png_uint_16)((*sp >> shift) & 0x01) + == trans_values->gray) + { + *sp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff); + *sp |= (png_byte)(background->gray << shift); + } + if (!shift) + { + shift = 7; + sp++; + } + else + shift--; + } + break; + } + case 2: + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_table != NULL) + { + sp = row; + shift = 6; + for (i = 0; i < row_width; i++) + { + if ((png_uint_16)((*sp >> shift) & 0x03) + == trans_values->gray) + { + *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); + *sp |= (png_byte)(background->gray << shift); + } + else + { + png_byte p = (png_byte)((*sp >> shift) & 0x03); + png_byte g = (png_byte)((gamma_table [p | (p << 2) | + (p << 4) | (p << 6)] >> 6) & 0x03); + *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); + *sp |= (png_byte)(g << shift); + } + if (!shift) + { + shift = 6; + sp++; + } + else + shift -= 2; + } + } + else +#endif + { + sp = row; + shift = 6; + for (i = 0; i < row_width; i++) + { + if ((png_uint_16)((*sp >> shift) & 0x03) + == trans_values->gray) + { + *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); + *sp |= (png_byte)(background->gray << shift); + } + if (!shift) + { + shift = 6; + sp++; + } + else + shift -= 2; + } + } + break; + } + case 4: + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_table != NULL) + { + sp = row; + shift = 4; + for (i = 0; i < row_width; i++) + { + if ((png_uint_16)((*sp >> shift) & 0x0f) + == trans_values->gray) + { + *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); + *sp |= (png_byte)(background->gray << shift); + } + else + { + png_byte p = (png_byte)((*sp >> shift) & 0x0f); + png_byte g = (png_byte)((gamma_table[p | + (p << 4)] >> 4) & 0x0f); + *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); + *sp |= (png_byte)(g << shift); + } + if (!shift) + { + shift = 4; + sp++; + } + else + shift -= 4; + } + } + else +#endif + { + sp = row; + shift = 4; + for (i = 0; i < row_width; i++) + { + if ((png_uint_16)((*sp >> shift) & 0x0f) + == trans_values->gray) + { + *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); + *sp |= (png_byte)(background->gray << shift); + } + if (!shift) + { + shift = 4; + sp++; + } + else + shift -= 4; + } + } + break; + } + case 8: + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_table != NULL) + { + sp = row; + for (i = 0; i < row_width; i++, sp++) + { + if (*sp == trans_values->gray) + { + *sp = (png_byte)background->gray; + } + else + { + *sp = gamma_table[*sp]; + } + } + } + else +#endif + { + sp = row; + for (i = 0; i < row_width; i++, sp++) + { + if (*sp == trans_values->gray) + { + *sp = (png_byte)background->gray; + } + } + } + break; + } + case 16: + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_16 != NULL) + { + sp = row; + for (i = 0; i < row_width; i++, sp += 2) + { + png_uint_16 v; + + v = (png_uint_16)(((*sp) << 8) + *(sp + 1)); + if (v == trans_values->gray) + { + /* background is already in screen gamma */ + *sp = (png_byte)((background->gray >> 8) & 0xff); + *(sp + 1) = (png_byte)(background->gray & 0xff); + } + else + { + v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + } + } + } + else +#endif + { + sp = row; + for (i = 0; i < row_width; i++, sp += 2) + { + png_uint_16 v; + + v = (png_uint_16)(((*sp) << 8) + *(sp + 1)); + if (v == trans_values->gray) + { + *sp = (png_byte)((background->gray >> 8) & 0xff); + *(sp + 1) = (png_byte)(background->gray & 0xff); + } + } + } + break; + } + } + break; + } + case PNG_COLOR_TYPE_RGB: + { + if (row_info->bit_depth == 8) + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_table != NULL) + { + sp = row; + for (i = 0; i < row_width; i++, sp += 3) + { + if (*sp == trans_values->red && + *(sp + 1) == trans_values->green && + *(sp + 2) == trans_values->blue) + { + *sp = (png_byte)background->red; + *(sp + 1) = (png_byte)background->green; + *(sp + 2) = (png_byte)background->blue; + } + else + { + *sp = gamma_table[*sp]; + *(sp + 1) = gamma_table[*(sp + 1)]; + *(sp + 2) = gamma_table[*(sp + 2)]; + } + } + } + else +#endif + { + sp = row; + for (i = 0; i < row_width; i++, sp += 3) + { + if (*sp == trans_values->red && + *(sp + 1) == trans_values->green && + *(sp + 2) == trans_values->blue) + { + *sp = (png_byte)background->red; + *(sp + 1) = (png_byte)background->green; + *(sp + 2) = (png_byte)background->blue; + } + } + } + } + else /* if (row_info->bit_depth == 16) */ + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_16 != NULL) + { + sp = row; + for (i = 0; i < row_width; i++, sp += 6) + { + png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); + png_uint_16 g = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); + png_uint_16 b = (png_uint_16)(((*(sp+4)) << 8) + *(sp+5)); + if (r == trans_values->red && g == trans_values->green && + b == trans_values->blue) + { + /* background is already in screen gamma */ + *sp = (png_byte)((background->red >> 8) & 0xff); + *(sp + 1) = (png_byte)(background->red & 0xff); + *(sp + 2) = (png_byte)((background->green >> 8) & 0xff); + *(sp + 3) = (png_byte)(background->green & 0xff); + *(sp + 4) = (png_byte)((background->blue >> 8) & 0xff); + *(sp + 5) = (png_byte)(background->blue & 0xff); + } + else + { + png_uint_16 v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)]; + *(sp + 2) = (png_byte)((v >> 8) & 0xff); + *(sp + 3) = (png_byte)(v & 0xff); + v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)]; + *(sp + 4) = (png_byte)((v >> 8) & 0xff); + *(sp + 5) = (png_byte)(v & 0xff); + } + } + } + else +#endif + { + sp = row; + for (i = 0; i < row_width; i++, sp += 6) + { + png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp+1)); + png_uint_16 g = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); + png_uint_16 b = (png_uint_16)(((*(sp+4)) << 8) + *(sp+5)); + + if (r == trans_values->red && g == trans_values->green && + b == trans_values->blue) + { + *sp = (png_byte)((background->red >> 8) & 0xff); + *(sp + 1) = (png_byte)(background->red & 0xff); + *(sp + 2) = (png_byte)((background->green >> 8) & 0xff); + *(sp + 3) = (png_byte)(background->green & 0xff); + *(sp + 4) = (png_byte)((background->blue >> 8) & 0xff); + *(sp + 5) = (png_byte)(background->blue & 0xff); + } + } + } + } + break; + } + case PNG_COLOR_TYPE_GRAY_ALPHA: + { + if (row_info->bit_depth == 8) + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_to_1 != NULL && gamma_from_1 != NULL && + gamma_table != NULL) + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 2, dp++) + { + png_uint_16 a = *(sp + 1); + + if (a == 0xff) + { + *dp = gamma_table[*sp]; + } + else if (a == 0) + { + /* background is already in screen gamma */ + *dp = (png_byte)background->gray; + } + else + { + png_byte v, w; + + v = gamma_to_1[*sp]; + png_composite(w, v, a, background_1->gray); + *dp = gamma_from_1[w]; + } + } + } + else +#endif + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 2, dp++) + { + png_byte a = *(sp + 1); + + if (a == 0xff) + { + *dp = *sp; + } +#if defined(PNG_READ_GAMMA_SUPPORTED) + else if (a == 0) + { + *dp = (png_byte)background->gray; + } + else + { + png_composite(*dp, *sp, a, background_1->gray); + } +#else + *dp = (png_byte)background->gray; +#endif + } + } + } + else /* if (png_ptr->bit_depth == 16) */ + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_16 != NULL && gamma_16_from_1 != NULL && + gamma_16_to_1 != NULL) + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 4, dp += 2) + { + png_uint_16 a = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); + + if (a == (png_uint_16)0xffff) + { + png_uint_16 v; + + v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; + *dp = (png_byte)((v >> 8) & 0xff); + *(dp + 1) = (png_byte)(v & 0xff); + } +#if defined(PNG_READ_GAMMA_SUPPORTED) + else if (a == 0) +#else + else +#endif + { + /* background is already in screen gamma */ + *dp = (png_byte)((background->gray >> 8) & 0xff); + *(dp + 1) = (png_byte)(background->gray & 0xff); + } +#if defined(PNG_READ_GAMMA_SUPPORTED) + else + { + png_uint_16 g, v, w; + + g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; + png_composite_16(v, g, a, background_1->gray); + w = gamma_16_from_1[(v&0xff) >> gamma_shift][v >> 8]; + *dp = (png_byte)((w >> 8) & 0xff); + *(dp + 1) = (png_byte)(w & 0xff); + } +#endif + } + } + else +#endif + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 4, dp += 2) + { + png_uint_16 a = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); + if (a == (png_uint_16)0xffff) + { + png_memcpy(dp, sp, 2); + } +#if defined(PNG_READ_GAMMA_SUPPORTED) + else if (a == 0) +#else + else +#endif + { + *dp = (png_byte)((background->gray >> 8) & 0xff); + *(dp + 1) = (png_byte)(background->gray & 0xff); + } +#if defined(PNG_READ_GAMMA_SUPPORTED) + else + { + png_uint_16 g, v; + + g = (png_uint_16)(((*sp) << 8) + *(sp + 1)); + png_composite_16(v, g, a, background_1->gray); + *dp = (png_byte)((v >> 8) & 0xff); + *(dp + 1) = (png_byte)(v & 0xff); + } +#endif + } + } + } + break; + } + case PNG_COLOR_TYPE_RGB_ALPHA: + { + if (row_info->bit_depth == 8) + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_to_1 != NULL && gamma_from_1 != NULL && + gamma_table != NULL) + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 4, dp += 3) + { + png_byte a = *(sp + 3); + + if (a == 0xff) + { + *dp = gamma_table[*sp]; + *(dp + 1) = gamma_table[*(sp + 1)]; + *(dp + 2) = gamma_table[*(sp + 2)]; + } + else if (a == 0) + { + /* background is already in screen gamma */ + *dp = (png_byte)background->red; + *(dp + 1) = (png_byte)background->green; + *(dp + 2) = (png_byte)background->blue; + } + else + { + png_byte v, w; + + v = gamma_to_1[*sp]; + png_composite(w, v, a, background_1->red); + *dp = gamma_from_1[w]; + v = gamma_to_1[*(sp + 1)]; + png_composite(w, v, a, background_1->green); + *(dp + 1) = gamma_from_1[w]; + v = gamma_to_1[*(sp + 2)]; + png_composite(w, v, a, background_1->blue); + *(dp + 2) = gamma_from_1[w]; + } + } + } + else +#endif + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 4, dp += 3) + { + png_byte a = *(sp + 3); + + if (a == 0xff) + { + *dp = *sp; + *(dp + 1) = *(sp + 1); + *(dp + 2) = *(sp + 2); + } + else if (a == 0) + { + *dp = (png_byte)background->red; + *(dp + 1) = (png_byte)background->green; + *(dp + 2) = (png_byte)background->blue; + } + else + { + png_composite(*dp, *sp, a, background->red); + png_composite(*(dp + 1), *(sp + 1), a, + background->green); + png_composite(*(dp + 2), *(sp + 2), a, + background->blue); + } + } + } + } + else /* if (row_info->bit_depth == 16) */ + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_16 != NULL && gamma_16_from_1 != NULL && + gamma_16_to_1 != NULL) + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 8, dp += 6) + { + png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6)) + << 8) + (png_uint_16)(*(sp + 7))); + if (a == (png_uint_16)0xffff) + { + png_uint_16 v; + + v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; + *dp = (png_byte)((v >> 8) & 0xff); + *(dp + 1) = (png_byte)(v & 0xff); + v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)]; + *(dp + 2) = (png_byte)((v >> 8) & 0xff); + *(dp + 3) = (png_byte)(v & 0xff); + v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)]; + *(dp + 4) = (png_byte)((v >> 8) & 0xff); + *(dp + 5) = (png_byte)(v & 0xff); + } + else if (a == 0) + { + /* background is already in screen gamma */ + *dp = (png_byte)((background->red >> 8) & 0xff); + *(dp + 1) = (png_byte)(background->red & 0xff); + *(dp + 2) = (png_byte)((background->green >> 8) & 0xff); + *(dp + 3) = (png_byte)(background->green & 0xff); + *(dp + 4) = (png_byte)((background->blue >> 8) & 0xff); + *(dp + 5) = (png_byte)(background->blue & 0xff); + } + else + { + png_uint_16 v, w, x; + + v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; + png_composite_16(w, v, a, background_1->red); + x = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; + *dp = (png_byte)((x >> 8) & 0xff); + *(dp + 1) = (png_byte)(x & 0xff); + v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)]; + png_composite_16(w, v, a, background_1->green); + x = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; + *(dp + 2) = (png_byte)((x >> 8) & 0xff); + *(dp + 3) = (png_byte)(x & 0xff); + v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)]; + png_composite_16(w, v, a, background_1->blue); + x = gamma_16_from_1[(w & 0xff) >> gamma_shift][w >> 8]; + *(dp + 4) = (png_byte)((x >> 8) & 0xff); + *(dp + 5) = (png_byte)(x & 0xff); + } + } + } + else +#endif + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 8, dp += 6) + { + png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6)) + << 8) + (png_uint_16)(*(sp + 7))); + if (a == (png_uint_16)0xffff) + { + png_memcpy(dp, sp, 6); + } + else if (a == 0) + { + *dp = (png_byte)((background->red >> 8) & 0xff); + *(dp + 1) = (png_byte)(background->red & 0xff); + *(dp + 2) = (png_byte)((background->green >> 8) & 0xff); + *(dp + 3) = (png_byte)(background->green & 0xff); + *(dp + 4) = (png_byte)((background->blue >> 8) & 0xff); + *(dp + 5) = (png_byte)(background->blue & 0xff); + } + else + { + png_uint_16 v; + + png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); + png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8) + + *(sp + 3)); + png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8) + + *(sp + 5)); + + png_composite_16(v, r, a, background->red); + *dp = (png_byte)((v >> 8) & 0xff); + *(dp + 1) = (png_byte)(v & 0xff); + png_composite_16(v, g, a, background->green); + *(dp + 2) = (png_byte)((v >> 8) & 0xff); + *(dp + 3) = (png_byte)(v & 0xff); + png_composite_16(v, b, a, background->blue); + *(dp + 4) = (png_byte)((v >> 8) & 0xff); + *(dp + 5) = (png_byte)(v & 0xff); + } + } + } + } + break; + } + } + + if (row_info->color_type & PNG_COLOR_MASK_ALPHA) + { + row_info->color_type &= ~PNG_COLOR_MASK_ALPHA; + row_info->channels--; + row_info->pixel_depth = (png_byte)(row_info->channels * + row_info->bit_depth); + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); + } + } +} +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) +/* Gamma correct the image, avoiding the alpha channel. Make sure + * you do this after you deal with the transparency issue on grayscale + * or RGB images. If your bit depth is 8, use gamma_table, if it + * is 16, use gamma_16_table and gamma_shift. Build these with + * build_gamma_table(). + */ +void /* PRIVATE */ +png_do_gamma(png_row_infop row_info, png_bytep row, + png_bytep gamma_table, png_uint_16pp gamma_16_table, + int gamma_shift) +{ + png_bytep sp; + png_uint_32 i; + png_uint_32 row_width=row_info->width; + + png_debug(1, "in png_do_gamma"); + if ( +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + ((row_info->bit_depth <= 8 && gamma_table != NULL) || + (row_info->bit_depth == 16 && gamma_16_table != NULL))) + { + switch (row_info->color_type) + { + case PNG_COLOR_TYPE_RGB: + { + if (row_info->bit_depth == 8) + { + sp = row; + for (i = 0; i < row_width; i++) + { + *sp = gamma_table[*sp]; + sp++; + *sp = gamma_table[*sp]; + sp++; + *sp = gamma_table[*sp]; + sp++; + } + } + else /* if (row_info->bit_depth == 16) */ + { + sp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 v; + + v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 2; + v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 2; + v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 2; + } + } + break; + } + case PNG_COLOR_TYPE_RGB_ALPHA: + { + if (row_info->bit_depth == 8) + { + sp = row; + for (i = 0; i < row_width; i++) + { + *sp = gamma_table[*sp]; + sp++; + *sp = gamma_table[*sp]; + sp++; + *sp = gamma_table[*sp]; + sp++; + sp++; + } + } + else /* if (row_info->bit_depth == 16) */ + { + sp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 2; + v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 2; + v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 4; + } + } + break; + } + case PNG_COLOR_TYPE_GRAY_ALPHA: + { + if (row_info->bit_depth == 8) + { + sp = row; + for (i = 0; i < row_width; i++) + { + *sp = gamma_table[*sp]; + sp += 2; + } + } + else /* if (row_info->bit_depth == 16) */ + { + sp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 4; + } + } + break; + } + case PNG_COLOR_TYPE_GRAY: + { + if (row_info->bit_depth == 2) + { + sp = row; + for (i = 0; i < row_width; i += 4) + { + int a = *sp & 0xc0; + int b = *sp & 0x30; + int c = *sp & 0x0c; + int d = *sp & 0x03; + + *sp = (png_byte)( + ((((int)gamma_table[a|(a>>2)|(a>>4)|(a>>6)]) ) & 0xc0)| + ((((int)gamma_table[(b<<2)|b|(b>>2)|(b>>4)])>>2) & 0x30)| + ((((int)gamma_table[(c<<4)|(c<<2)|c|(c>>2)])>>4) & 0x0c)| + ((((int)gamma_table[(d<<6)|(d<<4)|(d<<2)|d])>>6) )); + sp++; + } + } + if (row_info->bit_depth == 4) + { + sp = row; + for (i = 0; i < row_width; i += 2) + { + int msb = *sp & 0xf0; + int lsb = *sp & 0x0f; + + *sp = (png_byte)((((int)gamma_table[msb | (msb >> 4)]) & 0xf0) + | (((int)gamma_table[(lsb << 4) | lsb]) >> 4)); + sp++; + } + } + else if (row_info->bit_depth == 8) + { + sp = row; + for (i = 0; i < row_width; i++) + { + *sp = gamma_table[*sp]; + sp++; + } + } + else if (row_info->bit_depth == 16) + { + sp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 2; + } + } + break; + } + } + } +} +#endif + +#if defined(PNG_READ_EXPAND_SUPPORTED) +/* Expands a palette row to an RGB or RGBA row depending + * upon whether you supply trans and num_trans. + */ +void /* PRIVATE */ +png_do_expand_palette(png_row_infop row_info, png_bytep row, + png_colorp palette, png_bytep trans, int num_trans) +{ + int shift, value; + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width=row_info->width; + + png_debug(1, "in png_do_expand_palette"); + if ( +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + row_info->color_type == PNG_COLOR_TYPE_PALETTE) + { + if (row_info->bit_depth < 8) + { + switch (row_info->bit_depth) + { + case 1: + { + sp = row + (png_size_t)((row_width - 1) >> 3); + dp = row + (png_size_t)row_width - 1; + shift = 7 - (int)((row_width + 7) & 0x07); + for (i = 0; i < row_width; i++) + { + if ((*sp >> shift) & 0x01) + *dp = 1; + else + *dp = 0; + if (shift == 7) + { + shift = 0; + sp--; + } + else + shift++; + + dp--; + } + break; + } + case 2: + { + sp = row + (png_size_t)((row_width - 1) >> 2); + dp = row + (png_size_t)row_width - 1; + shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); + for (i = 0; i < row_width; i++) + { + value = (*sp >> shift) & 0x03; + *dp = (png_byte)value; + if (shift == 6) + { + shift = 0; + sp--; + } + else + shift += 2; + + dp--; + } + break; + } + case 4: + { + sp = row + (png_size_t)((row_width - 1) >> 1); + dp = row + (png_size_t)row_width - 1; + shift = (int)((row_width & 0x01) << 2); + for (i = 0; i < row_width; i++) + { + value = (*sp >> shift) & 0x0f; + *dp = (png_byte)value; + if (shift == 4) + { + shift = 0; + sp--; + } + else + shift += 4; + + dp--; + } + break; + } + } + row_info->bit_depth = 8; + row_info->pixel_depth = 8; + row_info->rowbytes = row_width; + } + switch (row_info->bit_depth) + { + case 8: + { + if (trans != NULL) + { + sp = row + (png_size_t)row_width - 1; + dp = row + (png_size_t)(row_width << 2) - 1; + + for (i = 0; i < row_width; i++) + { + if ((int)(*sp) >= num_trans) + *dp-- = 0xff; + else + *dp-- = trans[*sp]; + *dp-- = palette[*sp].blue; + *dp-- = palette[*sp].green; + *dp-- = palette[*sp].red; + sp--; + } + row_info->bit_depth = 8; + row_info->pixel_depth = 32; + row_info->rowbytes = row_width * 4; + row_info->color_type = 6; + row_info->channels = 4; + } + else + { + sp = row + (png_size_t)row_width - 1; + dp = row + (png_size_t)(row_width * 3) - 1; + + for (i = 0; i < row_width; i++) + { + *dp-- = palette[*sp].blue; + *dp-- = palette[*sp].green; + *dp-- = palette[*sp].red; + sp--; + } + row_info->bit_depth = 8; + row_info->pixel_depth = 24; + row_info->rowbytes = row_width * 3; + row_info->color_type = 2; + row_info->channels = 3; + } + break; + } + } + } +} + +/* If the bit depth < 8, it is expanded to 8. Also, if the already + * expanded transparency value is supplied, an alpha channel is built. + */ +void /* PRIVATE */ +png_do_expand(png_row_infop row_info, png_bytep row, + png_color_16p trans_value) +{ + int shift, value; + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width=row_info->width; + + png_debug(1, "in png_do_expand"); +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row != NULL && row_info != NULL) +#endif + { + if (row_info->color_type == PNG_COLOR_TYPE_GRAY) + { + png_uint_16 gray = (png_uint_16)(trans_value ? trans_value->gray : 0); + + if (row_info->bit_depth < 8) + { + switch (row_info->bit_depth) + { + case 1: + { + gray = (png_uint_16)((gray&0x01)*0xff); + sp = row + (png_size_t)((row_width - 1) >> 3); + dp = row + (png_size_t)row_width - 1; + shift = 7 - (int)((row_width + 7) & 0x07); + for (i = 0; i < row_width; i++) + { + if ((*sp >> shift) & 0x01) + *dp = 0xff; + else + *dp = 0; + if (shift == 7) + { + shift = 0; + sp--; + } + else + shift++; + + dp--; + } + break; + } + case 2: + { + gray = (png_uint_16)((gray&0x03)*0x55); + sp = row + (png_size_t)((row_width - 1) >> 2); + dp = row + (png_size_t)row_width - 1; + shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); + for (i = 0; i < row_width; i++) + { + value = (*sp >> shift) & 0x03; + *dp = (png_byte)(value | (value << 2) | (value << 4) | + (value << 6)); + if (shift == 6) + { + shift = 0; + sp--; + } + else + shift += 2; + + dp--; + } + break; + } + case 4: + { + gray = (png_uint_16)((gray&0x0f)*0x11); + sp = row + (png_size_t)((row_width - 1) >> 1); + dp = row + (png_size_t)row_width - 1; + shift = (int)((1 - ((row_width + 1) & 0x01)) << 2); + for (i = 0; i < row_width; i++) + { + value = (*sp >> shift) & 0x0f; + *dp = (png_byte)(value | (value << 4)); + if (shift == 4) + { + shift = 0; + sp--; + } + else + shift = 4; + + dp--; + } + break; + } + } + row_info->bit_depth = 8; + row_info->pixel_depth = 8; + row_info->rowbytes = row_width; + } + + if (trans_value != NULL) + { + if (row_info->bit_depth == 8) + { + gray = gray & 0xff; + sp = row + (png_size_t)row_width - 1; + dp = row + (png_size_t)(row_width << 1) - 1; + for (i = 0; i < row_width; i++) + { + if (*sp == gray) + *dp-- = 0; + else + *dp-- = 0xff; + *dp-- = *sp--; + } + } + else if (row_info->bit_depth == 16) + { + png_byte gray_high = (gray >> 8) & 0xff; + png_byte gray_low = gray & 0xff; + sp = row + row_info->rowbytes - 1; + dp = row + (row_info->rowbytes << 1) - 1; + for (i = 0; i < row_width; i++) + { + if (*(sp - 1) == gray_high && *(sp) == gray_low) + { + *dp-- = 0; + *dp-- = 0; + } + else + { + *dp-- = 0xff; + *dp-- = 0xff; + } + *dp-- = *sp--; + *dp-- = *sp--; + } + } + row_info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA; + row_info->channels = 2; + row_info->pixel_depth = (png_byte)(row_info->bit_depth << 1); + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, + row_width); + } + } + else if (row_info->color_type == PNG_COLOR_TYPE_RGB && trans_value) + { + if (row_info->bit_depth == 8) + { + png_byte red = trans_value->red & 0xff; + png_byte green = trans_value->green & 0xff; + png_byte blue = trans_value->blue & 0xff; + sp = row + (png_size_t)row_info->rowbytes - 1; + dp = row + (png_size_t)(row_width << 2) - 1; + for (i = 0; i < row_width; i++) + { + if (*(sp - 2) == red && *(sp - 1) == green && *(sp) == blue) + *dp-- = 0; + else + *dp-- = 0xff; + *dp-- = *sp--; + *dp-- = *sp--; + *dp-- = *sp--; + } + } + else if (row_info->bit_depth == 16) + { + png_byte red_high = (trans_value->red >> 8) & 0xff; + png_byte green_high = (trans_value->green >> 8) & 0xff; + png_byte blue_high = (trans_value->blue >> 8) & 0xff; + png_byte red_low = trans_value->red & 0xff; + png_byte green_low = trans_value->green & 0xff; + png_byte blue_low = trans_value->blue & 0xff; + sp = row + row_info->rowbytes - 1; + dp = row + (png_size_t)(row_width << 3) - 1; + for (i = 0; i < row_width; i++) + { + if (*(sp - 5) == red_high && + *(sp - 4) == red_low && + *(sp - 3) == green_high && + *(sp - 2) == green_low && + *(sp - 1) == blue_high && + *(sp ) == blue_low) + { + *dp-- = 0; + *dp-- = 0; + } + else + { + *dp-- = 0xff; + *dp-- = 0xff; + } + *dp-- = *sp--; + *dp-- = *sp--; + *dp-- = *sp--; + *dp-- = *sp--; + *dp-- = *sp--; + *dp-- = *sp--; + } + } + row_info->color_type = PNG_COLOR_TYPE_RGB_ALPHA; + row_info->channels = 4; + row_info->pixel_depth = (png_byte)(row_info->bit_depth << 2); + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); + } + } +} +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) +void /* PRIVATE */ +png_do_dither(png_row_infop row_info, png_bytep row, + png_bytep palette_lookup, png_bytep dither_lookup) +{ + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width=row_info->width; + + png_debug(1, "in png_do_dither"); +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row != NULL && row_info != NULL) +#endif + { + if (row_info->color_type == PNG_COLOR_TYPE_RGB && + palette_lookup && row_info->bit_depth == 8) + { + int r, g, b, p; + sp = row; + dp = row; + for (i = 0; i < row_width; i++) + { + r = *sp++; + g = *sp++; + b = *sp++; + + /* this looks real messy, but the compiler will reduce + it down to a reasonable formula. For example, with + 5 bits per color, we get: + p = (((r >> 3) & 0x1f) << 10) | + (((g >> 3) & 0x1f) << 5) | + ((b >> 3) & 0x1f); + */ + p = (((r >> (8 - PNG_DITHER_RED_BITS)) & + ((1 << PNG_DITHER_RED_BITS) - 1)) << + (PNG_DITHER_GREEN_BITS + PNG_DITHER_BLUE_BITS)) | + (((g >> (8 - PNG_DITHER_GREEN_BITS)) & + ((1 << PNG_DITHER_GREEN_BITS) - 1)) << + (PNG_DITHER_BLUE_BITS)) | + ((b >> (8 - PNG_DITHER_BLUE_BITS)) & + ((1 << PNG_DITHER_BLUE_BITS) - 1)); + + *dp++ = palette_lookup[p]; + } + row_info->color_type = PNG_COLOR_TYPE_PALETTE; + row_info->channels = 1; + row_info->pixel_depth = row_info->bit_depth; + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); + } + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA && + palette_lookup != NULL && row_info->bit_depth == 8) + { + int r, g, b, p; + sp = row; + dp = row; + for (i = 0; i < row_width; i++) + { + r = *sp++; + g = *sp++; + b = *sp++; + sp++; + + p = (((r >> (8 - PNG_DITHER_RED_BITS)) & + ((1 << PNG_DITHER_RED_BITS) - 1)) << + (PNG_DITHER_GREEN_BITS + PNG_DITHER_BLUE_BITS)) | + (((g >> (8 - PNG_DITHER_GREEN_BITS)) & + ((1 << PNG_DITHER_GREEN_BITS) - 1)) << + (PNG_DITHER_BLUE_BITS)) | + ((b >> (8 - PNG_DITHER_BLUE_BITS)) & + ((1 << PNG_DITHER_BLUE_BITS) - 1)); + + *dp++ = palette_lookup[p]; + } + row_info->color_type = PNG_COLOR_TYPE_PALETTE; + row_info->channels = 1; + row_info->pixel_depth = row_info->bit_depth; + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); + } + else if (row_info->color_type == PNG_COLOR_TYPE_PALETTE && + dither_lookup && row_info->bit_depth == 8) + { + sp = row; + for (i = 0; i < row_width; i++, sp++) + { + *sp = dither_lookup[*sp]; + } + } + } +} +#endif + +#ifdef PNG_FLOATING_POINT_SUPPORTED +#if defined(PNG_READ_GAMMA_SUPPORTED) +static PNG_CONST int png_gamma_shift[] = + {0x10, 0x21, 0x42, 0x84, 0x110, 0x248, 0x550, 0xff0, 0x00}; + +/* We build the 8- or 16-bit gamma tables here. Note that for 16-bit + * tables, we don't make a full table if we are reducing to 8-bit in + * the future. Note also how the gamma_16 tables are segmented so that + * we don't need to allocate > 64K chunks for a full 16-bit table. + */ +void /* PRIVATE */ +png_build_gamma_table(png_structp png_ptr) +{ + png_debug(1, "in png_build_gamma_table"); + + if (png_ptr->bit_depth <= 8) + { + int i; + double g; + + if (png_ptr->screen_gamma > .000001) + g = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); + else + g = 1.0; + + png_ptr->gamma_table = (png_bytep)png_malloc(png_ptr, + (png_uint_32)256); + + for (i = 0; i < 256; i++) + { + png_ptr->gamma_table[i] = (png_byte)(pow((double)i / 255.0, + g) * 255.0 + .5); + } + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ + defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) + if (png_ptr->transformations & ((PNG_BACKGROUND) | PNG_RGB_TO_GRAY)) + { + + g = 1.0 / (png_ptr->gamma); + + png_ptr->gamma_to_1 = (png_bytep)png_malloc(png_ptr, + (png_uint_32)256); + + for (i = 0; i < 256; i++) + { + png_ptr->gamma_to_1[i] = (png_byte)(pow((double)i / 255.0, + g) * 255.0 + .5); + } + + + png_ptr->gamma_from_1 = (png_bytep)png_malloc(png_ptr, + (png_uint_32)256); + + if (png_ptr->screen_gamma > 0.000001) + g = 1.0 / png_ptr->screen_gamma; + else + g = png_ptr->gamma; /* probably doing rgb_to_gray */ + + for (i = 0; i < 256; i++) + { + png_ptr->gamma_from_1[i] = (png_byte)(pow((double)i / 255.0, + g) * 255.0 + .5); + + } + } +#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */ + } + else + { + double g; + int i, j, shift, num; + int sig_bit; + png_uint_32 ig; + + if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) + { + sig_bit = (int)png_ptr->sig_bit.red; + if ((int)png_ptr->sig_bit.green > sig_bit) + sig_bit = png_ptr->sig_bit.green; + if ((int)png_ptr->sig_bit.blue > sig_bit) + sig_bit = png_ptr->sig_bit.blue; + } + else + { + sig_bit = (int)png_ptr->sig_bit.gray; + } + + if (sig_bit > 0) + shift = 16 - sig_bit; + else + shift = 0; + + if (png_ptr->transformations & PNG_16_TO_8) + { + if (shift < (16 - PNG_MAX_GAMMA_8)) + shift = (16 - PNG_MAX_GAMMA_8); + } + + if (shift > 8) + shift = 8; + if (shift < 0) + shift = 0; + + png_ptr->gamma_shift = (png_byte)shift; + + num = (1 << (8 - shift)); + + if (png_ptr->screen_gamma > .000001) + g = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); + else + g = 1.0; + + png_ptr->gamma_16_table = (png_uint_16pp)png_malloc(png_ptr, + (png_uint_32)(num * png_sizeof(png_uint_16p))); + png_memset(png_ptr->gamma_16_table, 0, num * png_sizeof(png_uint_16p)); + + if (png_ptr->transformations & (PNG_16_TO_8 | PNG_BACKGROUND)) + { + double fin, fout; + png_uint_32 last, max; + + for (i = 0; i < num; i++) + { + png_ptr->gamma_16_table[i] = (png_uint_16p)png_malloc(png_ptr, + (png_uint_32)(256 * png_sizeof(png_uint_16))); + } + + g = 1.0 / g; + last = 0; + for (i = 0; i < 256; i++) + { + fout = ((double)i + 0.5) / 256.0; + fin = pow(fout, g); + max = (png_uint_32)(fin * (double)((png_uint_32)num << 8)); + while (last <= max) + { + png_ptr->gamma_16_table[(int)(last & (0xff >> shift))] + [(int)(last >> (8 - shift))] = (png_uint_16)( + (png_uint_16)i | ((png_uint_16)i << 8)); + last++; + } + } + while (last < ((png_uint_32)num << 8)) + { + png_ptr->gamma_16_table[(int)(last & (0xff >> shift))] + [(int)(last >> (8 - shift))] = (png_uint_16)65535L; + last++; + } + } + else + { + for (i = 0; i < num; i++) + { + png_ptr->gamma_16_table[i] = (png_uint_16p)png_malloc(png_ptr, + (png_uint_32)(256 * png_sizeof(png_uint_16))); + + ig = (((png_uint_32)i * (png_uint_32)png_gamma_shift[shift]) >> 4); + for (j = 0; j < 256; j++) + { + png_ptr->gamma_16_table[i][j] = + (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) / + 65535.0, g) * 65535.0 + .5); + } + } + } + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ + defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) + if (png_ptr->transformations & (PNG_BACKGROUND | PNG_RGB_TO_GRAY)) + { + + g = 1.0 / (png_ptr->gamma); + + png_ptr->gamma_16_to_1 = (png_uint_16pp)png_malloc(png_ptr, + (png_uint_32)(num * png_sizeof(png_uint_16p ))); + png_memset(png_ptr->gamma_16_to_1, 0, num * png_sizeof(png_uint_16p)); + + for (i = 0; i < num; i++) + { + png_ptr->gamma_16_to_1[i] = (png_uint_16p)png_malloc(png_ptr, + (png_uint_32)(256 * png_sizeof(png_uint_16))); + + ig = (((png_uint_32)i * + (png_uint_32)png_gamma_shift[shift]) >> 4); + for (j = 0; j < 256; j++) + { + png_ptr->gamma_16_to_1[i][j] = + (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) / + 65535.0, g) * 65535.0 + .5); + } + } + + if (png_ptr->screen_gamma > 0.000001) + g = 1.0 / png_ptr->screen_gamma; + else + g = png_ptr->gamma; /* probably doing rgb_to_gray */ + + png_ptr->gamma_16_from_1 = (png_uint_16pp)png_malloc(png_ptr, + (png_uint_32)(num * png_sizeof(png_uint_16p))); + png_memset(png_ptr->gamma_16_from_1, 0, + num * png_sizeof(png_uint_16p)); + + for (i = 0; i < num; i++) + { + png_ptr->gamma_16_from_1[i] = (png_uint_16p)png_malloc(png_ptr, + (png_uint_32)(256 * png_sizeof(png_uint_16))); + + ig = (((png_uint_32)i * + (png_uint_32)png_gamma_shift[shift]) >> 4); + for (j = 0; j < 256; j++) + { + png_ptr->gamma_16_from_1[i][j] = + (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) / + 65535.0, g) * 65535.0 + .5); + } + } + } +#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */ + } +} +#endif +/* To do: install integer version of png_build_gamma_table here */ +#endif + +#if defined(PNG_MNG_FEATURES_SUPPORTED) +/* undoes intrapixel differencing */ +void /* PRIVATE */ +png_do_read_intrapixel(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_read_intrapixel"); + if ( +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + (row_info->color_type & PNG_COLOR_MASK_COLOR)) + { + int bytes_per_pixel; + png_uint_32 row_width = row_info->width; + if (row_info->bit_depth == 8) + { + png_bytep rp; + png_uint_32 i; + + if (row_info->color_type == PNG_COLOR_TYPE_RGB) + bytes_per_pixel = 3; + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + bytes_per_pixel = 4; + else + return; + + for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) + { + *(rp) = (png_byte)((256 + *rp + *(rp+1))&0xff); + *(rp+2) = (png_byte)((256 + *(rp+2) + *(rp+1))&0xff); + } + } + else if (row_info->bit_depth == 16) + { + png_bytep rp; + png_uint_32 i; + + if (row_info->color_type == PNG_COLOR_TYPE_RGB) + bytes_per_pixel = 6; + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + bytes_per_pixel = 8; + else + return; + + for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) + { + png_uint_32 s0 = (*(rp ) << 8) | *(rp + 1); + png_uint_32 s1 = (*(rp + 2) << 8) | *(rp + 3); + png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5); + png_uint_32 red = (png_uint_32)((s0 + s1 + 65536L) & 0xffffL); + png_uint_32 blue = (png_uint_32)((s2 + s1 + 65536L) & 0xffffL); + *(rp ) = (png_byte)((red >> 8) & 0xff); + *(rp+1) = (png_byte)(red & 0xff); + *(rp+4) = (png_byte)((blue >> 8) & 0xff); + *(rp+5) = (png_byte)(blue & 0xff); + } + } + } +} +#endif /* PNG_MNG_FEATURES_SUPPORTED */ +#endif /* PNG_READ_SUPPORTED */ diff --git a/navit/support/libpng/pngrutil.c b/navit/support/libpng/pngrutil.c new file mode 100644 index 0000000..f6f9859 --- /dev/null +++ b/navit/support/libpng/pngrutil.c @@ -0,0 +1,3223 @@ + +/* pngrutil.c - utilities to read a PNG file + * + * Last changed in libpng 1.2.36 [May 7, 2009] + * For conditions of distribution and use, see copyright notice in png.h + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This file contains routines that are only called from within + * libpng itself during the course of reading an image. + */ + +#define PNG_INTERNAL +#include "png.h" +#if defined(PNG_READ_SUPPORTED) + +#if defined(_WIN32_WCE) && (_WIN32_WCE<0x500) +# define WIN32_WCE_OLD +#endif + +#ifdef PNG_FLOATING_POINT_SUPPORTED +# if defined(WIN32_WCE_OLD) +/* strtod() function is not supported on WindowsCE */ +__inline double png_strtod(png_structp png_ptr, PNG_CONST char *nptr, char **endptr) +{ + double result = 0; + int len; + wchar_t *str, *end; + + len = MultiByteToWideChar(CP_ACP, 0, nptr, -1, NULL, 0); + str = (wchar_t *)png_malloc(png_ptr, len * png_sizeof(wchar_t)); + if ( NULL != str ) + { + MultiByteToWideChar(CP_ACP, 0, nptr, -1, str, len); + result = wcstod(str, &end); + len = WideCharToMultiByte(CP_ACP, 0, end, -1, NULL, 0, NULL, NULL); + *endptr = (char *)nptr + (png_strlen(nptr) - len + 1); + png_free(png_ptr, str); + } + return result; +} +# else +# define png_strtod(p,a,b) strtod(a,b) +# endif +#endif + +png_uint_32 PNGAPI +png_get_uint_31(png_structp png_ptr, png_bytep buf) +{ +#ifdef PNG_READ_BIG_ENDIAN_SUPPORTED + png_uint_32 i = png_get_uint_32(buf); +#else + /* Avoid an extra function call by inlining the result. */ + png_uint_32 i = ((png_uint_32)(*buf) << 24) + + ((png_uint_32)(*(buf + 1)) << 16) + + ((png_uint_32)(*(buf + 2)) << 8) + + (png_uint_32)(*(buf + 3)); +#endif + if (i > PNG_UINT_31_MAX) + png_error(png_ptr, "PNG unsigned integer out of range."); + return (i); +} +#ifndef PNG_READ_BIG_ENDIAN_SUPPORTED +/* Grab an unsigned 32-bit integer from a buffer in big-endian format. */ +png_uint_32 PNGAPI +png_get_uint_32(png_bytep buf) +{ + png_uint_32 i = ((png_uint_32)(*buf) << 24) + + ((png_uint_32)(*(buf + 1)) << 16) + + ((png_uint_32)(*(buf + 2)) << 8) + + (png_uint_32)(*(buf + 3)); + + return (i); +} + +/* Grab a signed 32-bit integer from a buffer in big-endian format. The + * data is stored in the PNG file in two's complement format, and it is + * assumed that the machine format for signed integers is the same. */ +png_int_32 PNGAPI +png_get_int_32(png_bytep buf) +{ + png_int_32 i = ((png_int_32)(*buf) << 24) + + ((png_int_32)(*(buf + 1)) << 16) + + ((png_int_32)(*(buf + 2)) << 8) + + (png_int_32)(*(buf + 3)); + + return (i); +} + +/* Grab an unsigned 16-bit integer from a buffer in big-endian format. */ +png_uint_16 PNGAPI +png_get_uint_16(png_bytep buf) +{ + png_uint_16 i = (png_uint_16)(((png_uint_16)(*buf) << 8) + + (png_uint_16)(*(buf + 1))); + + return (i); +} +#endif /* PNG_READ_BIG_ENDIAN_SUPPORTED */ + +/* Read the chunk header (length + type name). + * Put the type name into png_ptr->chunk_name, and return the length. + */ +png_uint_32 /* PRIVATE */ +png_read_chunk_header(png_structp png_ptr) +{ + png_byte buf[8]; + png_uint_32 length; + + /* read the length and the chunk name */ + png_read_data(png_ptr, buf, 8); + length = png_get_uint_31(png_ptr, buf); + + /* put the chunk name into png_ptr->chunk_name */ + png_memcpy(png_ptr->chunk_name, buf + 4, 4); + + png_debug2(0, "Reading %s chunk, length = %lu", + png_ptr->chunk_name, length); + + /* reset the crc and run it over the chunk name */ + png_reset_crc(png_ptr); + png_calculate_crc(png_ptr, png_ptr->chunk_name, 4); + + /* check to see if chunk name is valid */ + png_check_chunk_name(png_ptr, png_ptr->chunk_name); + + return length; +} + +/* Read data, and (optionally) run it through the CRC. */ +void /* PRIVATE */ +png_crc_read(png_structp png_ptr, png_bytep buf, png_size_t length) +{ + if (png_ptr == NULL) return; + png_read_data(png_ptr, buf, length); + png_calculate_crc(png_ptr, buf, length); +} + +/* Optionally skip data and then check the CRC. Depending on whether we + are reading a ancillary or critical chunk, and how the program has set + things up, we may calculate the CRC on the data and print a message. + Returns '1' if there was a CRC error, '0' otherwise. */ +int /* PRIVATE */ +png_crc_finish(png_structp png_ptr, png_uint_32 skip) +{ + png_size_t i; + png_size_t istop = png_ptr->zbuf_size; + + for (i = (png_size_t)skip; i > istop; i -= istop) + { + png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); + } + if (i) + { + png_crc_read(png_ptr, png_ptr->zbuf, i); + } + + if (png_crc_error(png_ptr)) + { + if (((png_ptr->chunk_name[0] & 0x20) && /* Ancillary */ + !(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) || + (!(png_ptr->chunk_name[0] & 0x20) && /* Critical */ + (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_USE))) + { + png_chunk_warning(png_ptr, "CRC error"); + } + else + { + png_chunk_error(png_ptr, "CRC error"); + } + return (1); + } + + return (0); +} + +/* Compare the CRC stored in the PNG file with that calculated by libpng from + the data it has read thus far. */ +int /* PRIVATE */ +png_crc_error(png_structp png_ptr) +{ + png_byte crc_bytes[4]; + png_uint_32 crc; + int need_crc = 1; + + if (png_ptr->chunk_name[0] & 0x20) /* ancillary */ + { + if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) == + (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN)) + need_crc = 0; + } + else /* critical */ + { + if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) + need_crc = 0; + } + + png_read_data(png_ptr, crc_bytes, 4); + + if (need_crc) + { + crc = png_get_uint_32(crc_bytes); + return ((int)(crc != png_ptr->crc)); + } + else + return (0); +} + +#if defined(PNG_READ_zTXt_SUPPORTED) || defined(PNG_READ_iTXt_SUPPORTED) || \ + defined(PNG_READ_iCCP_SUPPORTED) +/* + * Decompress trailing data in a chunk. The assumption is that chunkdata + * points at an allocated area holding the contents of a chunk with a + * trailing compressed part. What we get back is an allocated area + * holding the original prefix part and an uncompressed version of the + * trailing part (the malloc area passed in is freed). + */ +void /* PRIVATE */ +png_decompress_chunk(png_structp png_ptr, int comp_type, + png_size_t chunklength, + png_size_t prefix_size, png_size_t *newlength) +{ + static PNG_CONST char msg[] = "Error decoding compressed text"; + png_charp text; + png_size_t text_size; + + if (comp_type == PNG_COMPRESSION_TYPE_BASE) + { + int ret = Z_OK; + png_ptr->zstream.next_in = (png_bytep)(png_ptr->chunkdata + prefix_size); + png_ptr->zstream.avail_in = (uInt)(chunklength - prefix_size); + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + + text_size = 0; + text = NULL; + + while (png_ptr->zstream.avail_in) + { + ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); + if (ret != Z_OK && ret != Z_STREAM_END) + { + if (png_ptr->zstream.msg != NULL) + png_warning(png_ptr, png_ptr->zstream.msg); + else + png_warning(png_ptr, msg); + inflateReset(&png_ptr->zstream); + png_ptr->zstream.avail_in = 0; + + if (text == NULL) + { + text_size = prefix_size + png_sizeof(msg) + 1; + text = (png_charp)png_malloc_warn(png_ptr, text_size); + if (text == NULL) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_error(png_ptr, "Not enough memory to decompress chunk"); + } + png_memcpy(text, png_ptr->chunkdata, prefix_size); + } + + text[text_size - 1] = 0x00; + + /* Copy what we can of the error message into the text chunk */ + text_size = (png_size_t)(chunklength - + (text - png_ptr->chunkdata) - 1); + if (text_size > png_sizeof(msg)) + text_size = png_sizeof(msg); + png_memcpy(text + prefix_size, msg, text_size); + break; + } + if (!png_ptr->zstream.avail_out || ret == Z_STREAM_END) + { + if (text == NULL) + { + text_size = prefix_size + + png_ptr->zbuf_size - png_ptr->zstream.avail_out; + text = (png_charp)png_malloc_warn(png_ptr, text_size + 1); + if (text == NULL) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_error(png_ptr, + "Not enough memory to decompress chunk."); + } + png_memcpy(text + prefix_size, png_ptr->zbuf, + text_size - prefix_size); + png_memcpy(text, png_ptr->chunkdata, prefix_size); + *(text + text_size) = 0x00; + } + else + { + png_charp tmp; + + tmp = text; + text = (png_charp)png_malloc_warn(png_ptr, + (png_uint_32)(text_size + + png_ptr->zbuf_size - png_ptr->zstream.avail_out + 1)); + if (text == NULL) + { + png_free(png_ptr, tmp); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_error(png_ptr, + "Not enough memory to decompress chunk.."); + } + png_memcpy(text, tmp, text_size); + png_free(png_ptr, tmp); + png_memcpy(text + text_size, png_ptr->zbuf, + (png_ptr->zbuf_size - png_ptr->zstream.avail_out)); + text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; + *(text + text_size) = 0x00; + } + if (ret == Z_STREAM_END) + break; + else + { + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + } + } + } + if (ret != Z_STREAM_END) + { +#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) + char umsg[52]; + + if (ret == Z_BUF_ERROR) + png_snprintf(umsg, 52, + "Buffer error in compressed datastream in %s chunk", + png_ptr->chunk_name); + else if (ret == Z_DATA_ERROR) + png_snprintf(umsg, 52, + "Data error in compressed datastream in %s chunk", + png_ptr->chunk_name); + else + png_snprintf(umsg, 52, + "Incomplete compressed datastream in %s chunk", + png_ptr->chunk_name); + png_warning(png_ptr, umsg); +#else + png_warning(png_ptr, + "Incomplete compressed datastream in chunk other than IDAT"); +#endif + text_size = prefix_size; + if (text == NULL) + { + text = (png_charp)png_malloc_warn(png_ptr, text_size+1); + if (text == NULL) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_error(png_ptr, "Not enough memory for text."); + } + png_memcpy(text, png_ptr->chunkdata, prefix_size); + } + *(text + text_size) = 0x00; + } + + inflateReset(&png_ptr->zstream); + png_ptr->zstream.avail_in = 0; + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = text; + *newlength=text_size; + } + else /* if (comp_type != PNG_COMPRESSION_TYPE_BASE) */ + { +#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) + char umsg[50]; + + png_snprintf(umsg, 50, "Unknown zTXt compression type %d", comp_type); + png_warning(png_ptr, umsg); +#else + png_warning(png_ptr, "Unknown zTXt compression type"); +#endif + + *(png_ptr->chunkdata + prefix_size) = 0x00; + *newlength = prefix_size; + } +} +#endif + +/* read and check the IDHR chunk */ +void /* PRIVATE */ +png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte buf[13]; + png_uint_32 width, height; + int bit_depth, color_type, compression_type, filter_type; + int interlace_type; + + png_debug(1, "in png_handle_IHDR"); + + if (png_ptr->mode & PNG_HAVE_IHDR) + png_error(png_ptr, "Out of place IHDR"); + + /* check the length */ + if (length != 13) + png_error(png_ptr, "Invalid IHDR chunk"); + + png_ptr->mode |= PNG_HAVE_IHDR; + + png_crc_read(png_ptr, buf, 13); + png_crc_finish(png_ptr, 0); + + width = png_get_uint_31(png_ptr, buf); + height = png_get_uint_31(png_ptr, buf + 4); + bit_depth = buf[8]; + color_type = buf[9]; + compression_type = buf[10]; + filter_type = buf[11]; + interlace_type = buf[12]; + + /* set internal variables */ + png_ptr->width = width; + png_ptr->height = height; + png_ptr->bit_depth = (png_byte)bit_depth; + png_ptr->interlaced = (png_byte)interlace_type; + png_ptr->color_type = (png_byte)color_type; +#if defined(PNG_MNG_FEATURES_SUPPORTED) + png_ptr->filter_type = (png_byte)filter_type; +#endif + png_ptr->compression_type = (png_byte)compression_type; + + /* find number of channels */ + switch (png_ptr->color_type) + { + case PNG_COLOR_TYPE_GRAY: + case PNG_COLOR_TYPE_PALETTE: + png_ptr->channels = 1; + break; + case PNG_COLOR_TYPE_RGB: + png_ptr->channels = 3; + break; + case PNG_COLOR_TYPE_GRAY_ALPHA: + png_ptr->channels = 2; + break; + case PNG_COLOR_TYPE_RGB_ALPHA: + png_ptr->channels = 4; + break; + } + + /* set up other useful info */ + png_ptr->pixel_depth = (png_byte)(png_ptr->bit_depth * + png_ptr->channels); + png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->width); + png_debug1(3, "bit_depth = %d", png_ptr->bit_depth); + png_debug1(3, "channels = %d", png_ptr->channels); + png_debug1(3, "rowbytes = %lu", png_ptr->rowbytes); + png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, + color_type, interlace_type, compression_type, filter_type); +} + +/* read and check the palette */ +void /* PRIVATE */ +png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_color palette[PNG_MAX_PALETTE_LENGTH]; + int num, i; +#ifndef PNG_NO_POINTER_INDEXING + png_colorp pal_ptr; +#endif + + png_debug(1, "in png_handle_PLTE"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before PLTE"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid PLTE after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (png_ptr->mode & PNG_HAVE_PLTE) + png_error(png_ptr, "Duplicate PLTE chunk"); + + png_ptr->mode |= PNG_HAVE_PLTE; + + if (!(png_ptr->color_type&PNG_COLOR_MASK_COLOR)) + { + png_warning(png_ptr, + "Ignoring PLTE chunk in grayscale PNG"); + png_crc_finish(png_ptr, length); + return; + } +#if !defined(PNG_READ_OPT_PLTE_SUPPORTED) + if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE) + { + png_crc_finish(png_ptr, length); + return; + } +#endif + + if (length > 3*PNG_MAX_PALETTE_LENGTH || length % 3) + { + if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE) + { + png_warning(png_ptr, "Invalid palette chunk"); + png_crc_finish(png_ptr, length); + return; + } + else + { + png_error(png_ptr, "Invalid palette chunk"); + } + } + + num = (int)length / 3; + +#ifndef PNG_NO_POINTER_INDEXING + for (i = 0, pal_ptr = palette; i < num; i++, pal_ptr++) + { + png_byte buf[3]; + + png_crc_read(png_ptr, buf, 3); + pal_ptr->red = buf[0]; + pal_ptr->green = buf[1]; + pal_ptr->blue = buf[2]; + } +#else + for (i = 0; i < num; i++) + { + png_byte buf[3]; + + png_crc_read(png_ptr, buf, 3); + /* don't depend upon png_color being any order */ + palette[i].red = buf[0]; + palette[i].green = buf[1]; + palette[i].blue = buf[2]; + } +#endif + + /* If we actually NEED the PLTE chunk (ie for a paletted image), we do + whatever the normal CRC configuration tells us. However, if we + have an RGB image, the PLTE can be considered ancillary, so + we will act as though it is. */ +#if !defined(PNG_READ_OPT_PLTE_SUPPORTED) + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) +#endif + { + png_crc_finish(png_ptr, 0); + } +#if !defined(PNG_READ_OPT_PLTE_SUPPORTED) + else if (png_crc_error(png_ptr)) /* Only if we have a CRC error */ + { + /* If we don't want to use the data from an ancillary chunk, + we have two options: an error abort, or a warning and we + ignore the data in this chunk (which should be OK, since + it's considered ancillary for a RGB or RGBA image). */ + if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_USE)) + { + if (png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) + { + png_chunk_error(png_ptr, "CRC error"); + } + else + { + png_chunk_warning(png_ptr, "CRC error"); + return; + } + } + /* Otherwise, we (optionally) emit a warning and use the chunk. */ + else if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) + { + png_chunk_warning(png_ptr, "CRC error"); + } + } +#endif + + png_set_PLTE(png_ptr, info_ptr, palette, num); + +#if defined(PNG_READ_tRNS_SUPPORTED) + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) + { + if (png_ptr->num_trans > (png_uint_16)num) + { + png_warning(png_ptr, "Truncating incorrect tRNS chunk length"); + png_ptr->num_trans = (png_uint_16)num; + } + if (info_ptr->num_trans > (png_uint_16)num) + { + png_warning(png_ptr, "Truncating incorrect info tRNS chunk length"); + info_ptr->num_trans = (png_uint_16)num; + } + } + } +#endif + +} + +void /* PRIVATE */ +png_handle_IEND(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_debug(1, "in png_handle_IEND"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR) || !(png_ptr->mode & PNG_HAVE_IDAT)) + { + png_error(png_ptr, "No image in file"); + } + + png_ptr->mode |= (PNG_AFTER_IDAT | PNG_HAVE_IEND); + + if (length != 0) + { + png_warning(png_ptr, "Incorrect IEND chunk length"); + } + png_crc_finish(png_ptr, length); + + info_ptr = info_ptr; /* quiet compiler warnings about unused info_ptr */ +} + +#if defined(PNG_READ_gAMA_SUPPORTED) +void /* PRIVATE */ +png_handle_gAMA(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_fixed_point igamma; +#ifdef PNG_FLOATING_POINT_SUPPORTED + float file_gamma; +#endif + png_byte buf[4]; + + png_debug(1, "in png_handle_gAMA"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before gAMA"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid gAMA after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (png_ptr->mode & PNG_HAVE_PLTE) + /* Should be an error, but we can cope with it */ + png_warning(png_ptr, "Out of place gAMA chunk"); + + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) +#if defined(PNG_READ_sRGB_SUPPORTED) + && !(info_ptr->valid & PNG_INFO_sRGB) +#endif + ) + { + png_warning(png_ptr, "Duplicate gAMA chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (length != 4) + { + png_warning(png_ptr, "Incorrect gAMA chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 4); + if (png_crc_finish(png_ptr, 0)) + return; + + igamma = (png_fixed_point)png_get_uint_32(buf); + /* check for zero gamma */ + if (igamma == 0) + { + png_warning(png_ptr, + "Ignoring gAMA chunk with gamma=0"); + return; + } + +#if defined(PNG_READ_sRGB_SUPPORTED) + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB)) + if (PNG_OUT_OF_RANGE(igamma, 45500L, 500)) + { + png_warning(png_ptr, + "Ignoring incorrect gAMA value when sRGB is also present"); +#ifndef PNG_NO_CONSOLE_IO + fprintf(stderr, "gamma = (%d/100000)", (int)igamma); +#endif + return; + } +#endif /* PNG_READ_sRGB_SUPPORTED */ + +#ifdef PNG_FLOATING_POINT_SUPPORTED + file_gamma = (float)igamma / (float)100000.0; +# ifdef PNG_READ_GAMMA_SUPPORTED + png_ptr->gamma = file_gamma; +# endif + png_set_gAMA(png_ptr, info_ptr, file_gamma); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED + png_set_gAMA_fixed(png_ptr, info_ptr, igamma); +#endif +} +#endif + +#if defined(PNG_READ_sBIT_SUPPORTED) +void /* PRIVATE */ +png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_size_t truelen; + png_byte buf[4]; + + png_debug(1, "in png_handle_sBIT"); + + buf[0] = buf[1] = buf[2] = buf[3] = 0; + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before sBIT"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid sBIT after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (png_ptr->mode & PNG_HAVE_PLTE) + { + /* Should be an error, but we can cope with it */ + png_warning(png_ptr, "Out of place sBIT chunk"); + } + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)) + { + png_warning(png_ptr, "Duplicate sBIT chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + truelen = 3; + else + truelen = (png_size_t)png_ptr->channels; + + if (length != truelen || length > 4) + { + png_warning(png_ptr, "Incorrect sBIT chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, truelen); + if (png_crc_finish(png_ptr, 0)) + return; + + if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) + { + png_ptr->sig_bit.red = buf[0]; + png_ptr->sig_bit.green = buf[1]; + png_ptr->sig_bit.blue = buf[2]; + png_ptr->sig_bit.alpha = buf[3]; + } + else + { + png_ptr->sig_bit.gray = buf[0]; + png_ptr->sig_bit.red = buf[0]; + png_ptr->sig_bit.green = buf[0]; + png_ptr->sig_bit.blue = buf[0]; + png_ptr->sig_bit.alpha = buf[1]; + } + png_set_sBIT(png_ptr, info_ptr, &(png_ptr->sig_bit)); +} +#endif + +#if defined(PNG_READ_cHRM_SUPPORTED) +void /* PRIVATE */ +png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte buf[32]; +#ifdef PNG_FLOATING_POINT_SUPPORTED + float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y; +#endif + png_fixed_point int_x_white, int_y_white, int_x_red, int_y_red, int_x_green, + int_y_green, int_x_blue, int_y_blue; + + png_uint_32 uint_x, uint_y; + + png_debug(1, "in png_handle_cHRM"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before cHRM"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid cHRM after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (png_ptr->mode & PNG_HAVE_PLTE) + /* Should be an error, but we can cope with it */ + png_warning(png_ptr, "Missing PLTE before cHRM"); + + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM) +#if defined(PNG_READ_sRGB_SUPPORTED) + && !(info_ptr->valid & PNG_INFO_sRGB) +#endif + ) + { + png_warning(png_ptr, "Duplicate cHRM chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (length != 32) + { + png_warning(png_ptr, "Incorrect cHRM chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 32); + if (png_crc_finish(png_ptr, 0)) + return; + + uint_x = png_get_uint_32(buf); + uint_y = png_get_uint_32(buf + 4); + int_x_white = (png_fixed_point)uint_x; + int_y_white = (png_fixed_point)uint_y; + + uint_x = png_get_uint_32(buf + 8); + uint_y = png_get_uint_32(buf + 12); + int_x_red = (png_fixed_point)uint_x; + int_y_red = (png_fixed_point)uint_y; + + uint_x = png_get_uint_32(buf + 16); + uint_y = png_get_uint_32(buf + 20); + int_x_green = (png_fixed_point)uint_x; + int_y_green = (png_fixed_point)uint_y; + + uint_x = png_get_uint_32(buf + 24); + uint_y = png_get_uint_32(buf + 28); + int_x_blue = (png_fixed_point)uint_x; + int_y_blue = (png_fixed_point)uint_y; + +#ifdef PNG_FLOATING_POINT_SUPPORTED + white_x = (float)int_x_white / (float)100000.0; + white_y = (float)int_y_white / (float)100000.0; + red_x = (float)int_x_red / (float)100000.0; + red_y = (float)int_y_red / (float)100000.0; + green_x = (float)int_x_green / (float)100000.0; + green_y = (float)int_y_green / (float)100000.0; + blue_x = (float)int_x_blue / (float)100000.0; + blue_y = (float)int_y_blue / (float)100000.0; +#endif + +#if defined(PNG_READ_sRGB_SUPPORTED) + if ((info_ptr != NULL) && (info_ptr->valid & PNG_INFO_sRGB)) + { + if (PNG_OUT_OF_RANGE(int_x_white, 31270, 1000) || + PNG_OUT_OF_RANGE(int_y_white, 32900, 1000) || + PNG_OUT_OF_RANGE(int_x_red, 64000L, 1000) || + PNG_OUT_OF_RANGE(int_y_red, 33000, 1000) || + PNG_OUT_OF_RANGE(int_x_green, 30000, 1000) || + PNG_OUT_OF_RANGE(int_y_green, 60000L, 1000) || + PNG_OUT_OF_RANGE(int_x_blue, 15000, 1000) || + PNG_OUT_OF_RANGE(int_y_blue, 6000, 1000)) + { + png_warning(png_ptr, + "Ignoring incorrect cHRM value when sRGB is also present"); +#ifndef PNG_NO_CONSOLE_IO +#ifdef PNG_FLOATING_POINT_SUPPORTED + fprintf(stderr, "wx=%f, wy=%f, rx=%f, ry=%f\n", + white_x, white_y, red_x, red_y); + fprintf(stderr, "gx=%f, gy=%f, bx=%f, by=%f\n", + green_x, green_y, blue_x, blue_y); +#else + fprintf(stderr, "wx=%ld, wy=%ld, rx=%ld, ry=%ld\n", + int_x_white, int_y_white, int_x_red, int_y_red); + fprintf(stderr, "gx=%ld, gy=%ld, bx=%ld, by=%ld\n", + int_x_green, int_y_green, int_x_blue, int_y_blue); +#endif +#endif /* PNG_NO_CONSOLE_IO */ + } + return; + } +#endif /* PNG_READ_sRGB_SUPPORTED */ + +#ifdef PNG_FLOATING_POINT_SUPPORTED + png_set_cHRM(png_ptr, info_ptr, + white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED + png_set_cHRM_fixed(png_ptr, info_ptr, + int_x_white, int_y_white, int_x_red, int_y_red, int_x_green, + int_y_green, int_x_blue, int_y_blue); +#endif +} +#endif + +#if defined(PNG_READ_sRGB_SUPPORTED) +void /* PRIVATE */ +png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + int intent; + png_byte buf[1]; + + png_debug(1, "in png_handle_sRGB"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before sRGB"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid sRGB after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (png_ptr->mode & PNG_HAVE_PLTE) + /* Should be an error, but we can cope with it */ + png_warning(png_ptr, "Out of place sRGB chunk"); + + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB)) + { + png_warning(png_ptr, "Duplicate sRGB chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (length != 1) + { + png_warning(png_ptr, "Incorrect sRGB chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 1); + if (png_crc_finish(png_ptr, 0)) + return; + + intent = buf[0]; + /* check for bad intent */ + if (intent >= PNG_sRGB_INTENT_LAST) + { + png_warning(png_ptr, "Unknown sRGB intent"); + return; + } + +#if defined(PNG_READ_gAMA_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED) + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)) + { + png_fixed_point igamma; +#ifdef PNG_FIXED_POINT_SUPPORTED + igamma=info_ptr->int_gamma; +#else +# ifdef PNG_FLOATING_POINT_SUPPORTED + igamma=(png_fixed_point)(info_ptr->gamma * 100000.); +# endif +#endif + if (PNG_OUT_OF_RANGE(igamma, 45500L, 500)) + { + png_warning(png_ptr, + "Ignoring incorrect gAMA value when sRGB is also present"); +#ifndef PNG_NO_CONSOLE_IO +# ifdef PNG_FIXED_POINT_SUPPORTED + fprintf(stderr, "incorrect gamma=(%d/100000)\n", + (int)png_ptr->int_gamma); +# else +# ifdef PNG_FLOATING_POINT_SUPPORTED + fprintf(stderr, "incorrect gamma=%f\n", png_ptr->gamma); +# endif +# endif +#endif + } + } +#endif /* PNG_READ_gAMA_SUPPORTED */ + +#ifdef PNG_READ_cHRM_SUPPORTED +#ifdef PNG_FIXED_POINT_SUPPORTED + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) + if (PNG_OUT_OF_RANGE(info_ptr->int_x_white, 31270, 1000) || + PNG_OUT_OF_RANGE(info_ptr->int_y_white, 32900, 1000) || + PNG_OUT_OF_RANGE(info_ptr->int_x_red, 64000L, 1000) || + PNG_OUT_OF_RANGE(info_ptr->int_y_red, 33000, 1000) || + PNG_OUT_OF_RANGE(info_ptr->int_x_green, 30000, 1000) || + PNG_OUT_OF_RANGE(info_ptr->int_y_green, 60000L, 1000) || + PNG_OUT_OF_RANGE(info_ptr->int_x_blue, 15000, 1000) || + PNG_OUT_OF_RANGE(info_ptr->int_y_blue, 6000, 1000)) + { + png_warning(png_ptr, + "Ignoring incorrect cHRM value when sRGB is also present"); + } +#endif /* PNG_FIXED_POINT_SUPPORTED */ +#endif /* PNG_READ_cHRM_SUPPORTED */ + + png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr, intent); +} +#endif /* PNG_READ_sRGB_SUPPORTED */ + +#if defined(PNG_READ_iCCP_SUPPORTED) +void /* PRIVATE */ +png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +/* Note: this does not properly handle chunks that are > 64K under DOS */ +{ + png_byte compression_type; + png_bytep pC; + png_charp profile; + png_uint_32 skip = 0; + png_uint_32 profile_size, profile_length; + png_size_t slength, prefix_length, data_length; + + png_debug(1, "in png_handle_iCCP"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before iCCP"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid iCCP after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (png_ptr->mode & PNG_HAVE_PLTE) + /* Should be an error, but we can cope with it */ + png_warning(png_ptr, "Out of place iCCP chunk"); + + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)) + { + png_warning(png_ptr, "Duplicate iCCP chunk"); + png_crc_finish(png_ptr, length); + return; + } + +#ifdef PNG_MAX_MALLOC_64K + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "iCCP chunk too large to fit in memory"); + skip = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; + } +#endif + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = (png_charp)png_malloc(png_ptr, length + 1); + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + + if (png_crc_finish(png_ptr, skip)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_ptr->chunkdata[slength] = 0x00; + + for (profile = png_ptr->chunkdata; *profile; profile++) + /* empty loop to find end of name */ ; + + ++profile; + + /* there should be at least one zero (the compression type byte) + following the separator, and we should be on it */ + if ( profile >= png_ptr->chunkdata + slength - 1) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_warning(png_ptr, "Malformed iCCP chunk"); + return; + } + + /* compression_type should always be zero */ + compression_type = *profile++; + if (compression_type) + { + png_warning(png_ptr, "Ignoring nonzero compression type in iCCP chunk"); + compression_type = 0x00; /* Reset it to zero (libpng-1.0.6 through 1.0.8 + wrote nonzero) */ + } + + prefix_length = profile - png_ptr->chunkdata; + png_decompress_chunk(png_ptr, compression_type, + slength, prefix_length, &data_length); + + profile_length = data_length - prefix_length; + + if ( prefix_length > data_length || profile_length < 4) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_warning(png_ptr, "Profile size field missing from iCCP chunk"); + return; + } + + /* Check the profile_size recorded in the first 32 bits of the ICC profile */ + pC = (png_bytep)(png_ptr->chunkdata + prefix_length); + profile_size = ((*(pC ))<<24) | + ((*(pC + 1))<<16) | + ((*(pC + 2))<< 8) | + ((*(pC + 3)) ); + + if (profile_size < profile_length) + profile_length = profile_size; + + if (profile_size > profile_length) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_warning(png_ptr, "Ignoring truncated iCCP profile."); + return; + } + + png_set_iCCP(png_ptr, info_ptr, png_ptr->chunkdata, + compression_type, png_ptr->chunkdata + prefix_length, profile_length); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; +} +#endif /* PNG_READ_iCCP_SUPPORTED */ + +#if defined(PNG_READ_sPLT_SUPPORTED) +void /* PRIVATE */ +png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +/* Note: this does not properly handle chunks that are > 64K under DOS */ +{ + png_bytep entry_start; + png_sPLT_t new_palette; +#ifdef PNG_NO_POINTER_INDEXING + png_sPLT_entryp pp; +#endif + int data_length, entry_size, i; + png_uint_32 skip = 0; + png_size_t slength; + + png_debug(1, "in png_handle_sPLT"); + + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before sPLT"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid sPLT after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + +#ifdef PNG_MAX_MALLOC_64K + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "sPLT chunk too large to fit in memory"); + skip = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; + } +#endif + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = (png_charp)png_malloc(png_ptr, length + 1); + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + + if (png_crc_finish(png_ptr, skip)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_ptr->chunkdata[slength] = 0x00; + + for (entry_start = (png_bytep)png_ptr->chunkdata; *entry_start; entry_start++) + /* empty loop to find end of name */ ; + ++entry_start; + + /* a sample depth should follow the separator, and we should be on it */ + if (entry_start > (png_bytep)png_ptr->chunkdata + slength - 2) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_warning(png_ptr, "malformed sPLT chunk"); + return; + } + + new_palette.depth = *entry_start++; + entry_size = (new_palette.depth == 8 ? 6 : 10); + data_length = (slength - (entry_start - (png_bytep)png_ptr->chunkdata)); + + /* integrity-check the data length */ + if (data_length % entry_size) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_warning(png_ptr, "sPLT chunk has bad length"); + return; + } + + new_palette.nentries = (png_int_32) ( data_length / entry_size); + if ((png_uint_32) new_palette.nentries > + (png_uint_32) (PNG_SIZE_MAX / png_sizeof(png_sPLT_entry))) + { + png_warning(png_ptr, "sPLT chunk too long"); + return; + } + new_palette.entries = (png_sPLT_entryp)png_malloc_warn( + png_ptr, new_palette.nentries * png_sizeof(png_sPLT_entry)); + if (new_palette.entries == NULL) + { + png_warning(png_ptr, "sPLT chunk requires too much memory"); + return; + } + +#ifndef PNG_NO_POINTER_INDEXING + for (i = 0; i < new_palette.nentries; i++) + { + png_sPLT_entryp pp = new_palette.entries + i; + + if (new_palette.depth == 8) + { + pp->red = *entry_start++; + pp->green = *entry_start++; + pp->blue = *entry_start++; + pp->alpha = *entry_start++; + } + else + { + pp->red = png_get_uint_16(entry_start); entry_start += 2; + pp->green = png_get_uint_16(entry_start); entry_start += 2; + pp->blue = png_get_uint_16(entry_start); entry_start += 2; + pp->alpha = png_get_uint_16(entry_start); entry_start += 2; + } + pp->frequency = png_get_uint_16(entry_start); entry_start += 2; + } +#else + pp = new_palette.entries; + for (i = 0; i < new_palette.nentries; i++) + { + + if (new_palette.depth == 8) + { + pp[i].red = *entry_start++; + pp[i].green = *entry_start++; + pp[i].blue = *entry_start++; + pp[i].alpha = *entry_start++; + } + else + { + pp[i].red = png_get_uint_16(entry_start); entry_start += 2; + pp[i].green = png_get_uint_16(entry_start); entry_start += 2; + pp[i].blue = png_get_uint_16(entry_start); entry_start += 2; + pp[i].alpha = png_get_uint_16(entry_start); entry_start += 2; + } + pp->frequency = png_get_uint_16(entry_start); entry_start += 2; + } +#endif + + /* discard all chunk data except the name and stash that */ + new_palette.name = png_ptr->chunkdata; + + png_set_sPLT(png_ptr, info_ptr, &new_palette, 1); + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_free(png_ptr, new_palette.entries); +} +#endif /* PNG_READ_sPLT_SUPPORTED */ + +#if defined(PNG_READ_tRNS_SUPPORTED) +void /* PRIVATE */ +png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte readbuf[PNG_MAX_PALETTE_LENGTH]; + + png_debug(1, "in png_handle_tRNS"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before tRNS"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid tRNS after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) + { + png_warning(png_ptr, "Duplicate tRNS chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) + { + png_byte buf[2]; + + if (length != 2) + { + png_warning(png_ptr, "Incorrect tRNS chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 2); + png_ptr->num_trans = 1; + png_ptr->trans_values.gray = png_get_uint_16(buf); + } + else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) + { + png_byte buf[6]; + + if (length != 6) + { + png_warning(png_ptr, "Incorrect tRNS chunk length"); + png_crc_finish(png_ptr, length); + return; + } + png_crc_read(png_ptr, buf, (png_size_t)length); + png_ptr->num_trans = 1; + png_ptr->trans_values.red = png_get_uint_16(buf); + png_ptr->trans_values.green = png_get_uint_16(buf + 2); + png_ptr->trans_values.blue = png_get_uint_16(buf + 4); + } + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + if (!(png_ptr->mode & PNG_HAVE_PLTE)) + { + /* Should be an error, but we can cope with it. */ + png_warning(png_ptr, "Missing PLTE before tRNS"); + } + if (length > (png_uint_32)png_ptr->num_palette || + length > PNG_MAX_PALETTE_LENGTH) + { + png_warning(png_ptr, "Incorrect tRNS chunk length"); + png_crc_finish(png_ptr, length); + return; + } + if (length == 0) + { + png_warning(png_ptr, "Zero length tRNS chunk"); + png_crc_finish(png_ptr, length); + return; + } + png_crc_read(png_ptr, readbuf, (png_size_t)length); + png_ptr->num_trans = (png_uint_16)length; + } + else + { + png_warning(png_ptr, "tRNS chunk not allowed with alpha channel"); + png_crc_finish(png_ptr, length); + return; + } + + if (png_crc_finish(png_ptr, 0)) + { + png_ptr->num_trans = 0; + return; + } + + png_set_tRNS(png_ptr, info_ptr, readbuf, png_ptr->num_trans, + &(png_ptr->trans_values)); +} +#endif + +#if defined(PNG_READ_bKGD_SUPPORTED) +void /* PRIVATE */ +png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_size_t truelen; + png_byte buf[6]; + + png_debug(1, "in png_handle_bKGD"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before bKGD"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid bKGD after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && + !(png_ptr->mode & PNG_HAVE_PLTE)) + { + png_warning(png_ptr, "Missing PLTE before bKGD"); + png_crc_finish(png_ptr, length); + return; + } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD)) + { + png_warning(png_ptr, "Duplicate bKGD chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + truelen = 1; + else if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) + truelen = 6; + else + truelen = 2; + + if (length != truelen) + { + png_warning(png_ptr, "Incorrect bKGD chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, truelen); + if (png_crc_finish(png_ptr, 0)) + return; + + /* We convert the index value into RGB components so that we can allow + * arbitrary RGB values for background when we have transparency, and + * so it is easy to determine the RGB values of the background color + * from the info_ptr struct. */ + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + png_ptr->background.index = buf[0]; + if (info_ptr && info_ptr->num_palette) + { + if (buf[0] >= info_ptr->num_palette) + { + png_warning(png_ptr, "Incorrect bKGD chunk index value"); + return; + } + png_ptr->background.red = + (png_uint_16)png_ptr->palette[buf[0]].red; + png_ptr->background.green = + (png_uint_16)png_ptr->palette[buf[0]].green; + png_ptr->background.blue = + (png_uint_16)png_ptr->palette[buf[0]].blue; + } + } + else if (!(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) /* GRAY */ + { + png_ptr->background.red = + png_ptr->background.green = + png_ptr->background.blue = + png_ptr->background.gray = png_get_uint_16(buf); + } + else + { + png_ptr->background.red = png_get_uint_16(buf); + png_ptr->background.green = png_get_uint_16(buf + 2); + png_ptr->background.blue = png_get_uint_16(buf + 4); + } + + png_set_bKGD(png_ptr, info_ptr, &(png_ptr->background)); +} +#endif + +#if defined(PNG_READ_hIST_SUPPORTED) +void /* PRIVATE */ +png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + unsigned int num, i; + png_uint_16 readbuf[PNG_MAX_PALETTE_LENGTH]; + + png_debug(1, "in png_handle_hIST"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before hIST"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid hIST after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (!(png_ptr->mode & PNG_HAVE_PLTE)) + { + png_warning(png_ptr, "Missing PLTE before hIST"); + png_crc_finish(png_ptr, length); + return; + } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST)) + { + png_warning(png_ptr, "Duplicate hIST chunk"); + png_crc_finish(png_ptr, length); + return; + } + + num = length / 2 ; + if (num != (unsigned int) png_ptr->num_palette || num > + (unsigned int) PNG_MAX_PALETTE_LENGTH) + { + png_warning(png_ptr, "Incorrect hIST chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + for (i = 0; i < num; i++) + { + png_byte buf[2]; + + png_crc_read(png_ptr, buf, 2); + readbuf[i] = png_get_uint_16(buf); + } + + if (png_crc_finish(png_ptr, 0)) + return; + + png_set_hIST(png_ptr, info_ptr, readbuf); +} +#endif + +#if defined(PNG_READ_pHYs_SUPPORTED) +void /* PRIVATE */ +png_handle_pHYs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte buf[9]; + png_uint_32 res_x, res_y; + int unit_type; + + png_debug(1, "in png_handle_pHYs"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before pHYs"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid pHYs after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) + { + png_warning(png_ptr, "Duplicate pHYs chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (length != 9) + { + png_warning(png_ptr, "Incorrect pHYs chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 9); + if (png_crc_finish(png_ptr, 0)) + return; + + res_x = png_get_uint_32(buf); + res_y = png_get_uint_32(buf + 4); + unit_type = buf[8]; + png_set_pHYs(png_ptr, info_ptr, res_x, res_y, unit_type); +} +#endif + +#if defined(PNG_READ_oFFs_SUPPORTED) +void /* PRIVATE */ +png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte buf[9]; + png_int_32 offset_x, offset_y; + int unit_type; + + png_debug(1, "in png_handle_oFFs"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before oFFs"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid oFFs after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) + { + png_warning(png_ptr, "Duplicate oFFs chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (length != 9) + { + png_warning(png_ptr, "Incorrect oFFs chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 9); + if (png_crc_finish(png_ptr, 0)) + return; + + offset_x = png_get_int_32(buf); + offset_y = png_get_int_32(buf + 4); + unit_type = buf[8]; + png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y, unit_type); +} +#endif + +#if defined(PNG_READ_pCAL_SUPPORTED) +/* read the pCAL chunk (described in the PNG Extensions document) */ +void /* PRIVATE */ +png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_int_32 X0, X1; + png_byte type, nparams; + png_charp buf, units, endptr; + png_charpp params; + png_size_t slength; + int i; + + png_debug(1, "in png_handle_pCAL"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before pCAL"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid pCAL after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL)) + { + png_warning(png_ptr, "Duplicate pCAL chunk"); + png_crc_finish(png_ptr, length); + return; + } + + png_debug1(2, "Allocating and reading pCAL chunk data (%lu bytes)", + length + 1); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + if (png_ptr->chunkdata == NULL) + { + png_warning(png_ptr, "No memory for pCAL purpose."); + return; + } + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + + if (png_crc_finish(png_ptr, 0)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_ptr->chunkdata[slength] = 0x00; /* null terminate the last string */ + + png_debug(3, "Finding end of pCAL purpose string"); + for (buf = png_ptr->chunkdata; *buf; buf++) + /* empty loop */ ; + + endptr = png_ptr->chunkdata + slength; + + /* We need to have at least 12 bytes after the purpose string + in order to get the parameter information. */ + if (endptr <= buf + 12) + { + png_warning(png_ptr, "Invalid pCAL data"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_debug(3, "Reading pCAL X0, X1, type, nparams, and units"); + X0 = png_get_int_32((png_bytep)buf+1); + X1 = png_get_int_32((png_bytep)buf+5); + type = buf[9]; + nparams = buf[10]; + units = buf + 11; + + png_debug(3, "Checking pCAL equation type and number of parameters"); + /* Check that we have the right number of parameters for known + equation types. */ + if ((type == PNG_EQUATION_LINEAR && nparams != 2) || + (type == PNG_EQUATION_BASE_E && nparams != 3) || + (type == PNG_EQUATION_ARBITRARY && nparams != 3) || + (type == PNG_EQUATION_HYPERBOLIC && nparams != 4)) + { + png_warning(png_ptr, "Invalid pCAL parameters for equation type"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + else if (type >= PNG_EQUATION_LAST) + { + png_warning(png_ptr, "Unrecognized equation type for pCAL chunk"); + } + + for (buf = units; *buf; buf++) + /* Empty loop to move past the units string. */ ; + + png_debug(3, "Allocating pCAL parameters array"); + params = (png_charpp)png_malloc_warn(png_ptr, + (png_uint_32)(nparams * png_sizeof(png_charp))) ; + if (params == NULL) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_warning(png_ptr, "No memory for pCAL params."); + return; + } + + /* Get pointers to the start of each parameter string. */ + for (i = 0; i < (int)nparams; i++) + { + buf++; /* Skip the null string terminator from previous parameter. */ + + png_debug1(3, "Reading pCAL parameter %d", i); + for (params[i] = buf; buf <= endptr && *buf != 0x00; buf++) + /* Empty loop to move past each parameter string */ ; + + /* Make sure we haven't run out of data yet */ + if (buf > endptr) + { + png_warning(png_ptr, "Invalid pCAL data"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_free(png_ptr, params); + return; + } + } + + png_set_pCAL(png_ptr, info_ptr, png_ptr->chunkdata, X0, X1, type, nparams, + units, params); + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_free(png_ptr, params); +} +#endif + +#if defined(PNG_READ_sCAL_SUPPORTED) +/* read the sCAL chunk */ +void /* PRIVATE */ +png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_charp ep; +#ifdef PNG_FLOATING_POINT_SUPPORTED + double width, height; + png_charp vp; +#else +#ifdef PNG_FIXED_POINT_SUPPORTED + png_charp swidth, sheight; +#endif +#endif + png_size_t slength; + + png_debug(1, "in png_handle_sCAL"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before sCAL"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid sCAL after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sCAL)) + { + png_warning(png_ptr, "Duplicate sCAL chunk"); + png_crc_finish(png_ptr, length); + return; + } + + png_debug1(2, "Allocating and reading sCAL chunk data (%lu bytes)", + length + 1); + png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + if (png_ptr->chunkdata == NULL) + { + png_warning(png_ptr, "Out of memory while processing sCAL chunk"); + return; + } + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + + if (png_crc_finish(png_ptr, 0)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_ptr->chunkdata[slength] = 0x00; /* null terminate the last string */ + + ep = png_ptr->chunkdata + 1; /* skip unit byte */ + +#ifdef PNG_FLOATING_POINT_SUPPORTED + width = png_strtod(png_ptr, ep, &vp); + if (*vp) + { + png_warning(png_ptr, "malformed width string in sCAL chunk"); + return; + } +#else +#ifdef PNG_FIXED_POINT_SUPPORTED + swidth = (png_charp)png_malloc_warn(png_ptr, png_strlen(ep) + 1); + if (swidth == NULL) + { + png_warning(png_ptr, "Out of memory while processing sCAL chunk width"); + return; + } + png_memcpy(swidth, ep, (png_size_t)png_strlen(ep)); +#endif +#endif + + for (ep = png_ptr->chunkdata; *ep; ep++) + /* empty loop */ ; + ep++; + + if (png_ptr->chunkdata + slength < ep) + { + png_warning(png_ptr, "Truncated sCAL chunk"); +#if defined(PNG_FIXED_POINT_SUPPORTED) && \ + !defined(PNG_FLOATING_POINT_SUPPORTED) + png_free(png_ptr, swidth); +#endif + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + +#ifdef PNG_FLOATING_POINT_SUPPORTED + height = png_strtod(png_ptr, ep, &vp); + if (*vp) + { + png_warning(png_ptr, "malformed height string in sCAL chunk"); + return; + } +#else +#ifdef PNG_FIXED_POINT_SUPPORTED + sheight = (png_charp)png_malloc_warn(png_ptr, png_strlen(ep) + 1); + if (sheight == NULL) + { + png_warning(png_ptr, "Out of memory while processing sCAL chunk height"); + return; + } + png_memcpy(sheight, ep, (png_size_t)png_strlen(ep)); +#endif +#endif + + if (png_ptr->chunkdata + slength < ep +#ifdef PNG_FLOATING_POINT_SUPPORTED + || width <= 0. || height <= 0. +#endif + ) + { + png_warning(png_ptr, "Invalid sCAL data"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; +#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) + png_free(png_ptr, swidth); + png_free(png_ptr, sheight); +#endif + return; + } + + +#ifdef PNG_FLOATING_POINT_SUPPORTED + png_set_sCAL(png_ptr, info_ptr, png_ptr->chunkdata[0], width, height); +#else +#ifdef PNG_FIXED_POINT_SUPPORTED + png_set_sCAL_s(png_ptr, info_ptr, png_ptr->chunkdata[0], swidth, sheight); +#endif +#endif + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; +#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) + png_free(png_ptr, swidth); + png_free(png_ptr, sheight); +#endif +} +#endif + +#if defined(PNG_READ_tIME_SUPPORTED) +void /* PRIVATE */ +png_handle_tIME(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte buf[7]; + png_time mod_time; + + png_debug(1, "in png_handle_tIME"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Out of place tIME chunk"); + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)) + { + png_warning(png_ptr, "Duplicate tIME chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (png_ptr->mode & PNG_HAVE_IDAT) + png_ptr->mode |= PNG_AFTER_IDAT; + + if (length != 7) + { + png_warning(png_ptr, "Incorrect tIME chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 7); + if (png_crc_finish(png_ptr, 0)) + return; + + mod_time.second = buf[6]; + mod_time.minute = buf[5]; + mod_time.hour = buf[4]; + mod_time.day = buf[3]; + mod_time.month = buf[2]; + mod_time.year = png_get_uint_16(buf); + + png_set_tIME(png_ptr, info_ptr, &mod_time); +} +#endif + +#if defined(PNG_READ_tEXt_SUPPORTED) +/* Note: this does not properly handle chunks that are > 64K under DOS */ +void /* PRIVATE */ +png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_textp text_ptr; + png_charp key; + png_charp text; + png_uint_32 skip = 0; + png_size_t slength; + int ret; + + png_debug(1, "in png_handle_tEXt"); + + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before tEXt"); + + if (png_ptr->mode & PNG_HAVE_IDAT) + png_ptr->mode |= PNG_AFTER_IDAT; + +#ifdef PNG_MAX_MALLOC_64K + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "tEXt chunk too large to fit in memory"); + skip = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; + } +#endif + + png_free(png_ptr, png_ptr->chunkdata); + + png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + if (png_ptr->chunkdata == NULL) + { + png_warning(png_ptr, "No memory to process text chunk."); + return; + } + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + + if (png_crc_finish(png_ptr, skip)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + key = png_ptr->chunkdata; + + key[slength] = 0x00; + + for (text = key; *text; text++) + /* empty loop to find end of key */ ; + + if (text != key + slength) + text++; + + text_ptr = (png_textp)png_malloc_warn(png_ptr, + (png_uint_32)png_sizeof(png_text)); + if (text_ptr == NULL) + { + png_warning(png_ptr, "Not enough memory to process text chunk."); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; + text_ptr->key = key; +#ifdef PNG_iTXt_SUPPORTED + text_ptr->lang = NULL; + text_ptr->lang_key = NULL; + text_ptr->itxt_length = 0; +#endif + text_ptr->text = text; + text_ptr->text_length = png_strlen(text); + + ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_free(png_ptr, text_ptr); + if (ret) + png_warning(png_ptr, "Insufficient memory to process text chunk."); +} +#endif + +#if defined(PNG_READ_zTXt_SUPPORTED) +/* note: this does not correctly handle chunks that are > 64K under DOS */ +void /* PRIVATE */ +png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_textp text_ptr; + png_charp text; + int comp_type; + int ret; + png_size_t slength, prefix_len, data_len; + + png_debug(1, "in png_handle_zTXt"); + + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before zTXt"); + + if (png_ptr->mode & PNG_HAVE_IDAT) + png_ptr->mode |= PNG_AFTER_IDAT; + +#ifdef PNG_MAX_MALLOC_64K + /* We will no doubt have problems with chunks even half this size, but + there is no hard and fast rule to tell us where to stop. */ + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "zTXt chunk too large to fit in memory"); + png_crc_finish(png_ptr, length); + return; + } +#endif + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + if (png_ptr->chunkdata == NULL) + { + png_warning(png_ptr, "Out of memory processing zTXt chunk."); + return; + } + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + if (png_crc_finish(png_ptr, 0)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_ptr->chunkdata[slength] = 0x00; + + for (text = png_ptr->chunkdata; *text; text++) + /* empty loop */ ; + + /* zTXt must have some text after the chunkdataword */ + if (text >= png_ptr->chunkdata + slength - 2) + { + png_warning(png_ptr, "Truncated zTXt chunk"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + else + { + comp_type = *(++text); + if (comp_type != PNG_TEXT_COMPRESSION_zTXt) + { + png_warning(png_ptr, "Unknown compression type in zTXt chunk"); + comp_type = PNG_TEXT_COMPRESSION_zTXt; + } + text++; /* skip the compression_method byte */ + } + prefix_len = text - png_ptr->chunkdata; + + png_decompress_chunk(png_ptr, comp_type, + (png_size_t)length, prefix_len, &data_len); + + text_ptr = (png_textp)png_malloc_warn(png_ptr, + (png_uint_32)png_sizeof(png_text)); + if (text_ptr == NULL) + { + png_warning(png_ptr, "Not enough memory to process zTXt chunk."); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + text_ptr->compression = comp_type; + text_ptr->key = png_ptr->chunkdata; +#ifdef PNG_iTXt_SUPPORTED + text_ptr->lang = NULL; + text_ptr->lang_key = NULL; + text_ptr->itxt_length = 0; +#endif + text_ptr->text = png_ptr->chunkdata + prefix_len; + text_ptr->text_length = data_len; + + ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); + + png_free(png_ptr, text_ptr); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + if (ret) + png_error(png_ptr, "Insufficient memory to store zTXt chunk."); +} +#endif + +#if defined(PNG_READ_iTXt_SUPPORTED) +/* note: this does not correctly handle chunks that are > 64K under DOS */ +void /* PRIVATE */ +png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_textp text_ptr; + png_charp key, lang, text, lang_key; + int comp_flag; + int comp_type = 0; + int ret; + png_size_t slength, prefix_len, data_len; + + png_debug(1, "in png_handle_iTXt"); + + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before iTXt"); + + if (png_ptr->mode & PNG_HAVE_IDAT) + png_ptr->mode |= PNG_AFTER_IDAT; + +#ifdef PNG_MAX_MALLOC_64K + /* We will no doubt have problems with chunks even half this size, but + there is no hard and fast rule to tell us where to stop. */ + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "iTXt chunk too large to fit in memory"); + png_crc_finish(png_ptr, length); + return; + } +#endif + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + if (png_ptr->chunkdata == NULL) + { + png_warning(png_ptr, "No memory to process iTXt chunk."); + return; + } + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + if (png_crc_finish(png_ptr, 0)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_ptr->chunkdata[slength] = 0x00; + + for (lang = png_ptr->chunkdata; *lang; lang++) + /* empty loop */ ; + lang++; /* skip NUL separator */ + + /* iTXt must have a language tag (possibly empty), two compression bytes, + translated keyword (possibly empty), and possibly some text after the + keyword */ + + if (lang >= png_ptr->chunkdata + slength - 3) + { + png_warning(png_ptr, "Truncated iTXt chunk"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + else + { + comp_flag = *lang++; + comp_type = *lang++; + } + + for (lang_key = lang; *lang_key; lang_key++) + /* empty loop */ ; + lang_key++; /* skip NUL separator */ + + if (lang_key >= png_ptr->chunkdata + slength) + { + png_warning(png_ptr, "Truncated iTXt chunk"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + for (text = lang_key; *text; text++) + /* empty loop */ ; + text++; /* skip NUL separator */ + if (text >= png_ptr->chunkdata + slength) + { + png_warning(png_ptr, "Malformed iTXt chunk"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + prefix_len = text - png_ptr->chunkdata; + + key=png_ptr->chunkdata; + if (comp_flag) + png_decompress_chunk(png_ptr, comp_type, + (size_t)length, prefix_len, &data_len); + else + data_len = png_strlen(png_ptr->chunkdata + prefix_len); + text_ptr = (png_textp)png_malloc_warn(png_ptr, + (png_uint_32)png_sizeof(png_text)); + if (text_ptr == NULL) + { + png_warning(png_ptr, "Not enough memory to process iTXt chunk."); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + text_ptr->compression = (int)comp_flag + 1; + text_ptr->lang_key = png_ptr->chunkdata + (lang_key - key); + text_ptr->lang = png_ptr->chunkdata + (lang - key); + text_ptr->itxt_length = data_len; + text_ptr->text_length = 0; + text_ptr->key = png_ptr->chunkdata; + text_ptr->text = png_ptr->chunkdata + prefix_len; + + ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); + + png_free(png_ptr, text_ptr); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + if (ret) + png_error(png_ptr, "Insufficient memory to store iTXt chunk."); +} +#endif + +/* This function is called when we haven't found a handler for a + chunk. If there isn't a problem with the chunk itself (ie bad + chunk name, CRC, or a critical chunk), the chunk is silently ignored + -- unless the PNG_FLAG_UNKNOWN_CHUNKS_SUPPORTED flag is on in which + case it will be saved away to be written out later. */ +void /* PRIVATE */ +png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_uint_32 skip = 0; + + png_debug(1, "in png_handle_unknown"); + + + if (png_ptr->mode & PNG_HAVE_IDAT) + { +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_CONST PNG_IDAT; +#endif + if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) /* not an IDAT */ + png_ptr->mode |= PNG_AFTER_IDAT; + } + + if (!(png_ptr->chunk_name[0] & 0x20)) + { +#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) + if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != + PNG_HANDLE_CHUNK_ALWAYS +#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) + && png_ptr->read_user_chunk_fn == NULL +#endif + ) +#endif + png_chunk_error(png_ptr, "unknown critical chunk"); + } + +#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) + if ((png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) || + (png_ptr->read_user_chunk_fn != NULL)) + { +#ifdef PNG_MAX_MALLOC_64K + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "unknown chunk too large to fit in memory"); + skip = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; + } +#endif + png_memcpy((png_charp)png_ptr->unknown_chunk.name, + (png_charp)png_ptr->chunk_name, + png_sizeof(png_ptr->unknown_chunk.name)); + png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name)-1] = '\0'; + png_ptr->unknown_chunk.size = (png_size_t)length; + if (length == 0) + png_ptr->unknown_chunk.data = NULL; + else + { + png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, length); + png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); + } +#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) + if (png_ptr->read_user_chunk_fn != NULL) + { + /* callback to user unknown chunk handler */ + int ret; + ret = (*(png_ptr->read_user_chunk_fn)) + (png_ptr, &png_ptr->unknown_chunk); + if (ret < 0) + png_chunk_error(png_ptr, "error in user chunk"); + if (ret == 0) + { + if (!(png_ptr->chunk_name[0] & 0x20)) + if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != + PNG_HANDLE_CHUNK_ALWAYS) + png_chunk_error(png_ptr, "unknown critical chunk"); + png_set_unknown_chunks(png_ptr, info_ptr, + &png_ptr->unknown_chunk, 1); + } + } + else +#endif + png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); + png_free(png_ptr, png_ptr->unknown_chunk.data); + png_ptr->unknown_chunk.data = NULL; + } + else +#endif + skip = length; + + png_crc_finish(png_ptr, skip); + +#if !defined(PNG_READ_USER_CHUNKS_SUPPORTED) + info_ptr = info_ptr; /* quiet compiler warnings about unused info_ptr */ +#endif +} + +/* This function is called to verify that a chunk name is valid. + This function can't have the "critical chunk check" incorporated + into it, since in the future we will need to be able to call user + functions to handle unknown critical chunks after we check that + the chunk name itself is valid. */ + +#define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97)) + +void /* PRIVATE */ +png_check_chunk_name(png_structp png_ptr, png_bytep chunk_name) +{ + png_debug(1, "in png_check_chunk_name"); + if (isnonalpha(chunk_name[0]) || isnonalpha(chunk_name[1]) || + isnonalpha(chunk_name[2]) || isnonalpha(chunk_name[3])) + { + png_chunk_error(png_ptr, "invalid chunk type"); + } +} + +/* Combines the row recently read in with the existing pixels in the + row. This routine takes care of alpha and transparency if requested. + This routine also handles the two methods of progressive display + of interlaced images, depending on the mask value. + The mask value describes which pixels are to be combined with + the row. The pattern always repeats every 8 pixels, so just 8 + bits are needed. A one indicates the pixel is to be combined, + a zero indicates the pixel is to be skipped. This is in addition + to any alpha or transparency value associated with the pixel. If + you want all pixels to be combined, pass 0xff (255) in mask. */ + +void /* PRIVATE */ +png_combine_row(png_structp png_ptr, png_bytep row, int mask) +{ + png_debug(1, "in png_combine_row"); + if (mask == 0xff) + { + png_memcpy(row, png_ptr->row_buf + 1, + PNG_ROWBYTES(png_ptr->row_info.pixel_depth, png_ptr->width)); + } + else + { + switch (png_ptr->row_info.pixel_depth) + { + case 1: + { + png_bytep sp = png_ptr->row_buf + 1; + png_bytep dp = row; + int s_inc, s_start, s_end; + int m = 0x80; + int shift; + png_uint_32 i; + png_uint_32 row_width = png_ptr->width; + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) + if (png_ptr->transformations & PNG_PACKSWAP) + { + s_start = 0; + s_end = 7; + s_inc = 1; + } + else +#endif + { + s_start = 7; + s_end = 0; + s_inc = -1; + } + + shift = s_start; + + for (i = 0; i < row_width; i++) + { + if (m & mask) + { + int value; + + value = (*sp >> shift) & 0x01; + *dp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff); + *dp |= (png_byte)(value << shift); + } + + if (shift == s_end) + { + shift = s_start; + sp++; + dp++; + } + else + shift += s_inc; + + if (m == 1) + m = 0x80; + else + m >>= 1; + } + break; + } + case 2: + { + png_bytep sp = png_ptr->row_buf + 1; + png_bytep dp = row; + int s_start, s_end, s_inc; + int m = 0x80; + int shift; + png_uint_32 i; + png_uint_32 row_width = png_ptr->width; + int value; + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) + if (png_ptr->transformations & PNG_PACKSWAP) + { + s_start = 0; + s_end = 6; + s_inc = 2; + } + else +#endif + { + s_start = 6; + s_end = 0; + s_inc = -2; + } + + shift = s_start; + + for (i = 0; i < row_width; i++) + { + if (m & mask) + { + value = (*sp >> shift) & 0x03; + *dp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); + *dp |= (png_byte)(value << shift); + } + + if (shift == s_end) + { + shift = s_start; + sp++; + dp++; + } + else + shift += s_inc; + if (m == 1) + m = 0x80; + else + m >>= 1; + } + break; + } + case 4: + { + png_bytep sp = png_ptr->row_buf + 1; + png_bytep dp = row; + int s_start, s_end, s_inc; + int m = 0x80; + int shift; + png_uint_32 i; + png_uint_32 row_width = png_ptr->width; + int value; + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) + if (png_ptr->transformations & PNG_PACKSWAP) + { + s_start = 0; + s_end = 4; + s_inc = 4; + } + else +#endif + { + s_start = 4; + s_end = 0; + s_inc = -4; + } + shift = s_start; + + for (i = 0; i < row_width; i++) + { + if (m & mask) + { + value = (*sp >> shift) & 0xf; + *dp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); + *dp |= (png_byte)(value << shift); + } + + if (shift == s_end) + { + shift = s_start; + sp++; + dp++; + } + else + shift += s_inc; + if (m == 1) + m = 0x80; + else + m >>= 1; + } + break; + } + default: + { + png_bytep sp = png_ptr->row_buf + 1; + png_bytep dp = row; + png_size_t pixel_bytes = (png_ptr->row_info.pixel_depth >> 3); + png_uint_32 i; + png_uint_32 row_width = png_ptr->width; + png_byte m = 0x80; + + + for (i = 0; i < row_width; i++) + { + if (m & mask) + { + png_memcpy(dp, sp, pixel_bytes); + } + + sp += pixel_bytes; + dp += pixel_bytes; + + if (m == 1) + m = 0x80; + else + m >>= 1; + } + break; + } + } + } +} + +#ifdef PNG_READ_INTERLACING_SUPPORTED +/* OLD pre-1.0.9 interface: +void png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass, + png_uint_32 transformations) + */ +void /* PRIVATE */ +png_do_read_interlace(png_structp png_ptr) +{ + png_row_infop row_info = &(png_ptr->row_info); + png_bytep row = png_ptr->row_buf + 1; + int pass = png_ptr->pass; + png_uint_32 transformations = png_ptr->transformations; +#ifdef PNG_USE_LOCAL_ARRAYS + /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ + /* offset to next interlace block */ + PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; +#endif + + png_debug(1, "in png_do_read_interlace"); + if (row != NULL && row_info != NULL) + { + png_uint_32 final_width; + + final_width = row_info->width * png_pass_inc[pass]; + + switch (row_info->pixel_depth) + { + case 1: + { + png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 3); + png_bytep dp = row + (png_size_t)((final_width - 1) >> 3); + int sshift, dshift; + int s_start, s_end, s_inc; + int jstop = png_pass_inc[pass]; + png_byte v; + png_uint_32 i; + int j; + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) + if (transformations & PNG_PACKSWAP) + { + sshift = (int)((row_info->width + 7) & 0x07); + dshift = (int)((final_width + 7) & 0x07); + s_start = 7; + s_end = 0; + s_inc = -1; + } + else +#endif + { + sshift = 7 - (int)((row_info->width + 7) & 0x07); + dshift = 7 - (int)((final_width + 7) & 0x07); + s_start = 0; + s_end = 7; + s_inc = 1; + } + + for (i = 0; i < row_info->width; i++) + { + v = (png_byte)((*sp >> sshift) & 0x01); + for (j = 0; j < jstop; j++) + { + *dp &= (png_byte)((0x7f7f >> (7 - dshift)) & 0xff); + *dp |= (png_byte)(v << dshift); + if (dshift == s_end) + { + dshift = s_start; + dp--; + } + else + dshift += s_inc; + } + if (sshift == s_end) + { + sshift = s_start; + sp--; + } + else + sshift += s_inc; + } + break; + } + case 2: + { + png_bytep sp = row + (png_uint_32)((row_info->width - 1) >> 2); + png_bytep dp = row + (png_uint_32)((final_width - 1) >> 2); + int sshift, dshift; + int s_start, s_end, s_inc; + int jstop = png_pass_inc[pass]; + png_uint_32 i; + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) + if (transformations & PNG_PACKSWAP) + { + sshift = (int)(((row_info->width + 3) & 0x03) << 1); + dshift = (int)(((final_width + 3) & 0x03) << 1); + s_start = 6; + s_end = 0; + s_inc = -2; + } + else +#endif + { + sshift = (int)((3 - ((row_info->width + 3) & 0x03)) << 1); + dshift = (int)((3 - ((final_width + 3) & 0x03)) << 1); + s_start = 0; + s_end = 6; + s_inc = 2; + } + + for (i = 0; i < row_info->width; i++) + { + png_byte v; + int j; + + v = (png_byte)((*sp >> sshift) & 0x03); + for (j = 0; j < jstop; j++) + { + *dp &= (png_byte)((0x3f3f >> (6 - dshift)) & 0xff); + *dp |= (png_byte)(v << dshift); + if (dshift == s_end) + { + dshift = s_start; + dp--; + } + else + dshift += s_inc; + } + if (sshift == s_end) + { + sshift = s_start; + sp--; + } + else + sshift += s_inc; + } + break; + } + case 4: + { + png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 1); + png_bytep dp = row + (png_size_t)((final_width - 1) >> 1); + int sshift, dshift; + int s_start, s_end, s_inc; + png_uint_32 i; + int jstop = png_pass_inc[pass]; + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) + if (transformations & PNG_PACKSWAP) + { + sshift = (int)(((row_info->width + 1) & 0x01) << 2); + dshift = (int)(((final_width + 1) & 0x01) << 2); + s_start = 4; + s_end = 0; + s_inc = -4; + } + else +#endif + { + sshift = (int)((1 - ((row_info->width + 1) & 0x01)) << 2); + dshift = (int)((1 - ((final_width + 1) & 0x01)) << 2); + s_start = 0; + s_end = 4; + s_inc = 4; + } + + for (i = 0; i < row_info->width; i++) + { + png_byte v = (png_byte)((*sp >> sshift) & 0xf); + int j; + + for (j = 0; j < jstop; j++) + { + *dp &= (png_byte)((0xf0f >> (4 - dshift)) & 0xff); + *dp |= (png_byte)(v << dshift); + if (dshift == s_end) + { + dshift = s_start; + dp--; + } + else + dshift += s_inc; + } + if (sshift == s_end) + { + sshift = s_start; + sp--; + } + else + sshift += s_inc; + } + break; + } + default: + { + png_size_t pixel_bytes = (row_info->pixel_depth >> 3); + png_bytep sp = row + (png_size_t)(row_info->width - 1) * pixel_bytes; + png_bytep dp = row + (png_size_t)(final_width - 1) * pixel_bytes; + + int jstop = png_pass_inc[pass]; + png_uint_32 i; + + for (i = 0; i < row_info->width; i++) + { + png_byte v[8]; + int j; + + png_memcpy(v, sp, pixel_bytes); + for (j = 0; j < jstop; j++) + { + png_memcpy(dp, v, pixel_bytes); + dp -= pixel_bytes; + } + sp -= pixel_bytes; + } + break; + } + } + row_info->width = final_width; + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, final_width); + } +#if !defined(PNG_READ_PACKSWAP_SUPPORTED) + transformations = transformations; /* silence compiler warning */ +#endif +} +#endif /* PNG_READ_INTERLACING_SUPPORTED */ + +void /* PRIVATE */ +png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row, + png_bytep prev_row, int filter) +{ + png_debug(1, "in png_read_filter_row"); + png_debug2(2, "row = %lu, filter = %d", png_ptr->row_number, filter); + switch (filter) + { + case PNG_FILTER_VALUE_NONE: + break; + case PNG_FILTER_VALUE_SUB: + { + png_uint_32 i; + png_uint_32 istop = row_info->rowbytes; + png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; + png_bytep rp = row + bpp; + png_bytep lp = row; + + for (i = bpp; i < istop; i++) + { + *rp = (png_byte)(((int)(*rp) + (int)(*lp++)) & 0xff); + rp++; + } + break; + } + case PNG_FILTER_VALUE_UP: + { + png_uint_32 i; + png_uint_32 istop = row_info->rowbytes; + png_bytep rp = row; + png_bytep pp = prev_row; + + for (i = 0; i < istop; i++) + { + *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); + rp++; + } + break; + } + case PNG_FILTER_VALUE_AVG: + { + png_uint_32 i; + png_bytep rp = row; + png_bytep pp = prev_row; + png_bytep lp = row; + png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; + png_uint_32 istop = row_info->rowbytes - bpp; + + for (i = 0; i < bpp; i++) + { + *rp = (png_byte)(((int)(*rp) + + ((int)(*pp++) / 2 )) & 0xff); + rp++; + } + + for (i = 0; i < istop; i++) + { + *rp = (png_byte)(((int)(*rp) + + (int)(*pp++ + *lp++) / 2 ) & 0xff); + rp++; + } + break; + } + case PNG_FILTER_VALUE_PAETH: + { + png_uint_32 i; + png_bytep rp = row; + png_bytep pp = prev_row; + png_bytep lp = row; + png_bytep cp = prev_row; + png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; + png_uint_32 istop=row_info->rowbytes - bpp; + + for (i = 0; i < bpp; i++) + { + *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); + rp++; + } + + for (i = 0; i < istop; i++) /* use leftover rp,pp */ + { + int a, b, c, pa, pb, pc, p; + + a = *lp++; + b = *pp++; + c = *cp++; + + p = b - c; + pc = a - c; + +#ifdef PNG_USE_ABS + pa = abs(p); + pb = abs(pc); + pc = abs(p + pc); +#else + pa = p < 0 ? -p : p; + pb = pc < 0 ? -pc : pc; + pc = (p + pc) < 0 ? -(p + pc) : p + pc; +#endif + + /* + if (pa <= pb && pa <= pc) + p = a; + else if (pb <= pc) + p = b; + else + p = c; + */ + + p = (pa <= pb && pa <= pc) ? a : (pb <= pc) ? b : c; + + *rp = (png_byte)(((int)(*rp) + p) & 0xff); + rp++; + } + break; + } + default: + png_warning(png_ptr, "Ignoring bad adaptive filter type"); + *row = 0; + break; + } +} + +void /* PRIVATE */ +png_read_finish_row(png_structp png_ptr) +{ +#ifdef PNG_USE_LOCAL_ARRAYS +#ifdef PNG_READ_INTERLACING_SUPPORTED + /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ + + /* start of interlace block */ + PNG_CONST int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; + + /* offset to next interlace block */ + PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; + + /* start of interlace block in the y direction */ + PNG_CONST int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; + + /* offset to next interlace block in the y direction */ + PNG_CONST int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; +#endif /* PNG_READ_INTERLACING_SUPPORTED */ +#endif + + png_debug(1, "in png_read_finish_row"); + png_ptr->row_number++; + if (png_ptr->row_number < png_ptr->num_rows) + return; + +#ifdef PNG_READ_INTERLACING_SUPPORTED + if (png_ptr->interlaced) + { + png_ptr->row_number = 0; + png_memset_check(png_ptr, png_ptr->prev_row, 0, + png_ptr->rowbytes + 1); + do + { + png_ptr->pass++; + if (png_ptr->pass >= 7) + break; + png_ptr->iwidth = (png_ptr->width + + png_pass_inc[png_ptr->pass] - 1 - + png_pass_start[png_ptr->pass]) / + png_pass_inc[png_ptr->pass]; + + png_ptr->irowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, + png_ptr->iwidth) + 1; + + if (!(png_ptr->transformations & PNG_INTERLACE)) + { + png_ptr->num_rows = (png_ptr->height + + png_pass_yinc[png_ptr->pass] - 1 - + png_pass_ystart[png_ptr->pass]) / + png_pass_yinc[png_ptr->pass]; + if (!(png_ptr->num_rows)) + continue; + } + else /* if (png_ptr->transformations & PNG_INTERLACE) */ + break; + } while (png_ptr->iwidth == 0); + + if (png_ptr->pass < 7) + return; + } +#endif /* PNG_READ_INTERLACING_SUPPORTED */ + + if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) + { +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_CONST PNG_IDAT; +#endif + char extra; + int ret; + + png_ptr->zstream.next_out = (Byte *)&extra; + png_ptr->zstream.avail_out = (uInt)1; + for (;;) + { + if (!(png_ptr->zstream.avail_in)) + { + while (!png_ptr->idat_size) + { + png_byte chunk_length[4]; + + png_crc_finish(png_ptr, 0); + + png_read_data(png_ptr, chunk_length, 4); + png_ptr->idat_size = png_get_uint_31(png_ptr, chunk_length); + png_reset_crc(png_ptr); + png_crc_read(png_ptr, png_ptr->chunk_name, 4); + if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) + png_error(png_ptr, "Not enough image data"); + + } + png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size; + png_ptr->zstream.next_in = png_ptr->zbuf; + if (png_ptr->zbuf_size > png_ptr->idat_size) + png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size; + png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zstream.avail_in); + png_ptr->idat_size -= png_ptr->zstream.avail_in; + } + ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); + if (ret == Z_STREAM_END) + { + if (!(png_ptr->zstream.avail_out) || png_ptr->zstream.avail_in || + png_ptr->idat_size) + png_warning(png_ptr, "Extra compressed data"); + png_ptr->mode |= PNG_AFTER_IDAT; + png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; + break; + } + if (ret != Z_OK) + png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg : + "Decompression Error"); + + if (!(png_ptr->zstream.avail_out)) + { + png_warning(png_ptr, "Extra compressed data."); + png_ptr->mode |= PNG_AFTER_IDAT; + png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; + break; + } + + } + png_ptr->zstream.avail_out = 0; + } + + if (png_ptr->idat_size || png_ptr->zstream.avail_in) + png_warning(png_ptr, "Extra compression data"); + + inflateReset(&png_ptr->zstream); + + png_ptr->mode |= PNG_AFTER_IDAT; +} + +void /* PRIVATE */ +png_read_start_row(png_structp png_ptr) +{ +#ifdef PNG_USE_LOCAL_ARRAYS +#ifdef PNG_READ_INTERLACING_SUPPORTED + /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ + + /* start of interlace block */ + PNG_CONST int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; + + /* offset to next interlace block */ + PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; + + /* start of interlace block in the y direction */ + PNG_CONST int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; + + /* offset to next interlace block in the y direction */ + PNG_CONST int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; +#endif +#endif + + int max_pixel_depth; + png_size_t row_bytes; + + png_debug(1, "in png_read_start_row"); + png_ptr->zstream.avail_in = 0; + png_init_read_transformations(png_ptr); +#ifdef PNG_READ_INTERLACING_SUPPORTED + if (png_ptr->interlaced) + { + if (!(png_ptr->transformations & PNG_INTERLACE)) + png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 - + png_pass_ystart[0]) / png_pass_yinc[0]; + else + png_ptr->num_rows = png_ptr->height; + + png_ptr->iwidth = (png_ptr->width + + png_pass_inc[png_ptr->pass] - 1 - + png_pass_start[png_ptr->pass]) / + png_pass_inc[png_ptr->pass]; + + png_ptr->irowbytes = + PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->iwidth) + 1; + } + else +#endif /* PNG_READ_INTERLACING_SUPPORTED */ + { + png_ptr->num_rows = png_ptr->height; + png_ptr->iwidth = png_ptr->width; + png_ptr->irowbytes = png_ptr->rowbytes + 1; + } + max_pixel_depth = png_ptr->pixel_depth; + +#if defined(PNG_READ_PACK_SUPPORTED) + if ((png_ptr->transformations & PNG_PACK) && png_ptr->bit_depth < 8) + max_pixel_depth = 8; +#endif + +#if defined(PNG_READ_EXPAND_SUPPORTED) + if (png_ptr->transformations & PNG_EXPAND) + { + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + if (png_ptr->num_trans) + max_pixel_depth = 32; + else + max_pixel_depth = 24; + } + else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) + { + if (max_pixel_depth < 8) + max_pixel_depth = 8; + if (png_ptr->num_trans) + max_pixel_depth *= 2; + } + else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) + { + if (png_ptr->num_trans) + { + max_pixel_depth *= 4; + max_pixel_depth /= 3; + } + } + } +#endif + +#if defined(PNG_READ_FILLER_SUPPORTED) + if (png_ptr->transformations & (PNG_FILLER)) + { + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + max_pixel_depth = 32; + else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) + { + if (max_pixel_depth <= 8) + max_pixel_depth = 16; + else + max_pixel_depth = 32; + } + else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) + { + if (max_pixel_depth <= 32) + max_pixel_depth = 32; + else + max_pixel_depth = 64; + } + } +#endif + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) + if (png_ptr->transformations & PNG_GRAY_TO_RGB) + { + if ( +#if defined(PNG_READ_EXPAND_SUPPORTED) + (png_ptr->num_trans && (png_ptr->transformations & PNG_EXPAND)) || +#endif +#if defined(PNG_READ_FILLER_SUPPORTED) + (png_ptr->transformations & (PNG_FILLER)) || +#endif + png_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + if (max_pixel_depth <= 16) + max_pixel_depth = 32; + else + max_pixel_depth = 64; + } + else + { + if (max_pixel_depth <= 8) + { + if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + max_pixel_depth = 32; + else + max_pixel_depth = 24; + } + else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + max_pixel_depth = 64; + else + max_pixel_depth = 48; + } + } +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) && \ +defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) + if (png_ptr->transformations & PNG_USER_TRANSFORM) + { + int user_pixel_depth = png_ptr->user_transform_depth* + png_ptr->user_transform_channels; + if (user_pixel_depth > max_pixel_depth) + max_pixel_depth=user_pixel_depth; + } +#endif + + /* align the width on the next larger 8 pixels. Mainly used + for interlacing */ + row_bytes = ((png_ptr->width + 7) & ~((png_uint_32)7)); + /* calculate the maximum bytes needed, adding a byte and a pixel + for safety's sake */ + row_bytes = PNG_ROWBYTES(max_pixel_depth, row_bytes) + + 1 + ((max_pixel_depth + 7) >> 3); +#ifdef PNG_MAX_MALLOC_64K + if (row_bytes > (png_uint_32)65536L) + png_error(png_ptr, "This image requires a row greater than 64KB"); +#endif + + if (row_bytes + 64 > png_ptr->old_big_row_buf_size) + { + png_free(png_ptr, png_ptr->big_row_buf); + png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, row_bytes + 64); + if (png_ptr->interlaced) + png_memset(png_ptr->big_row_buf, 0, png_ptr->rowbytes + 64); + png_ptr->row_buf = png_ptr->big_row_buf + 32; + png_ptr->old_big_row_buf_size = row_bytes + 64; + } + +#ifdef PNG_MAX_MALLOC_64K + if ((png_uint_32)png_ptr->rowbytes + 1 > (png_uint_32)65536L) + png_error(png_ptr, "This image requires a row greater than 64KB"); +#endif + if ((png_uint_32)png_ptr->rowbytes > (png_uint_32)(PNG_SIZE_MAX - 1)) + png_error(png_ptr, "Row has too many bytes to allocate in memory."); + + if (png_ptr->rowbytes+1 > png_ptr->old_prev_row_size) + { + png_free(png_ptr, png_ptr->prev_row); + png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)( + png_ptr->rowbytes + 1)); + png_ptr->old_prev_row_size = png_ptr->rowbytes+1; + } + + png_memset_check(png_ptr, png_ptr->prev_row, 0, png_ptr->rowbytes + 1); + + png_debug1(3, "width = %lu,", png_ptr->width); + png_debug1(3, "height = %lu,", png_ptr->height); + png_debug1(3, "iwidth = %lu,", png_ptr->iwidth); + png_debug1(3, "num_rows = %lu,", png_ptr->num_rows); + png_debug1(3, "rowbytes = %lu,", png_ptr->rowbytes); + png_debug1(3, "irowbytes = %lu", png_ptr->irowbytes); + + png_ptr->flags |= PNG_FLAG_ROW_INIT; +} +#endif /* PNG_READ_SUPPORTED */ diff --git a/navit/support/libpng/pngset.c b/navit/support/libpng/pngset.c new file mode 100644 index 0000000..9aa29f1 --- /dev/null +++ b/navit/support/libpng/pngset.c @@ -0,0 +1,1253 @@ + +/* pngset.c - storage of image information into info struct + * + * Last changed in libpng 1.2.36 [May 7, 2009] + * For conditions of distribution and use, see copyright notice in png.h + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * The functions here are used during reads to store data from the file + * into the info struct, and during writes to store application data + * into the info struct for writing into the file. This abstracts the + * info struct and allows us to change the structure in the future. + */ + +#define PNG_INTERNAL +#include "png.h" +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + +#if defined(PNG_bKGD_SUPPORTED) +void PNGAPI +png_set_bKGD(png_structp png_ptr, png_infop info_ptr, png_color_16p background) +{ + png_debug1(1, "in %s storage function", "bKGD"); + if (png_ptr == NULL || info_ptr == NULL) + return; + + png_memcpy(&(info_ptr->background), background, png_sizeof(png_color_16)); + info_ptr->valid |= PNG_INFO_bKGD; +} +#endif + +#if defined(PNG_cHRM_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +void PNGAPI +png_set_cHRM(png_structp png_ptr, png_infop info_ptr, + double white_x, double white_y, double red_x, double red_y, + double green_x, double green_y, double blue_x, double blue_y) +{ + png_debug1(1, "in %s storage function", "cHRM"); + if (png_ptr == NULL || info_ptr == NULL) + return; + + info_ptr->x_white = (float)white_x; + info_ptr->y_white = (float)white_y; + info_ptr->x_red = (float)red_x; + info_ptr->y_red = (float)red_y; + info_ptr->x_green = (float)green_x; + info_ptr->y_green = (float)green_y; + info_ptr->x_blue = (float)blue_x; + info_ptr->y_blue = (float)blue_y; +#ifdef PNG_FIXED_POINT_SUPPORTED + info_ptr->int_x_white = (png_fixed_point)(white_x*100000.+0.5); + info_ptr->int_y_white = (png_fixed_point)(white_y*100000.+0.5); + info_ptr->int_x_red = (png_fixed_point)( red_x*100000.+0.5); + info_ptr->int_y_red = (png_fixed_point)( red_y*100000.+0.5); + info_ptr->int_x_green = (png_fixed_point)(green_x*100000.+0.5); + info_ptr->int_y_green = (png_fixed_point)(green_y*100000.+0.5); + info_ptr->int_x_blue = (png_fixed_point)( blue_x*100000.+0.5); + info_ptr->int_y_blue = (png_fixed_point)( blue_y*100000.+0.5); +#endif + info_ptr->valid |= PNG_INFO_cHRM; +} +#endif /* PNG_FLOATING_POINT_SUPPORTED */ + +#ifdef PNG_FIXED_POINT_SUPPORTED +void PNGAPI +png_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr, + png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x, + png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y, + png_fixed_point blue_x, png_fixed_point blue_y) +{ + png_debug1(1, "in %s storage function", "cHRM fixed"); + if (png_ptr == NULL || info_ptr == NULL) + return; + +#if !defined(PNG_NO_CHECK_cHRM) + if (png_check_cHRM_fixed(png_ptr, + white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y)) +#endif + { + info_ptr->int_x_white = white_x; + info_ptr->int_y_white = white_y; + info_ptr->int_x_red = red_x; + info_ptr->int_y_red = red_y; + info_ptr->int_x_green = green_x; + info_ptr->int_y_green = green_y; + info_ptr->int_x_blue = blue_x; + info_ptr->int_y_blue = blue_y; +#ifdef PNG_FLOATING_POINT_SUPPORTED + info_ptr->x_white = (float)(white_x/100000.); + info_ptr->y_white = (float)(white_y/100000.); + info_ptr->x_red = (float)( red_x/100000.); + info_ptr->y_red = (float)( red_y/100000.); + info_ptr->x_green = (float)(green_x/100000.); + info_ptr->y_green = (float)(green_y/100000.); + info_ptr->x_blue = (float)( blue_x/100000.); + info_ptr->y_blue = (float)( blue_y/100000.); +#endif + info_ptr->valid |= PNG_INFO_cHRM; + } +} +#endif /* PNG_FIXED_POINT_SUPPORTED */ +#endif /* PNG_cHRM_SUPPORTED */ + +#if defined(PNG_gAMA_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +void PNGAPI +png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma) +{ + double png_gamma; + png_debug1(1, "in %s storage function", "gAMA"); + if (png_ptr == NULL || info_ptr == NULL) + return; + + /* Check for overflow */ + if (file_gamma > 21474.83) + { + png_warning(png_ptr, "Limiting gamma to 21474.83"); + png_gamma=21474.83; + } + else + png_gamma = file_gamma; + info_ptr->gamma = (float)png_gamma; +#ifdef PNG_FIXED_POINT_SUPPORTED + info_ptr->int_gamma = (int)(png_gamma*100000.+.5); +#endif + info_ptr->valid |= PNG_INFO_gAMA; + if (png_gamma == 0.0) + png_warning(png_ptr, "Setting gamma=0"); +} +#endif +void PNGAPI +png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point + int_gamma) +{ + png_fixed_point png_gamma; + + png_debug1(1, "in %s storage function", "gAMA"); + if (png_ptr == NULL || info_ptr == NULL) + return; + + if (int_gamma > (png_fixed_point) PNG_UINT_31_MAX) + { + png_warning(png_ptr, "Limiting gamma to 21474.83"); + png_gamma=PNG_UINT_31_MAX; + } + else + { + if (int_gamma < 0) + { + png_warning(png_ptr, "Setting negative gamma to zero"); + png_gamma = 0; + } + else + png_gamma = int_gamma; + } +#ifdef PNG_FLOATING_POINT_SUPPORTED + info_ptr->gamma = (float)(png_gamma/100000.); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED + info_ptr->int_gamma = png_gamma; +#endif + info_ptr->valid |= PNG_INFO_gAMA; + if (png_gamma == 0) + png_warning(png_ptr, "Setting gamma=0"); +} +#endif + +#if defined(PNG_hIST_SUPPORTED) +void PNGAPI +png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p hist) +{ + int i; + + png_debug1(1, "in %s storage function", "hIST"); + if (png_ptr == NULL || info_ptr == NULL) + return; + if (info_ptr->num_palette == 0 || info_ptr->num_palette + > PNG_MAX_PALETTE_LENGTH) + { + png_warning(png_ptr, + "Invalid palette size, hIST allocation skipped."); + return; + } + +#ifdef PNG_FREE_ME_SUPPORTED + png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0); +#endif + /* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in version + 1.2.1 */ + png_ptr->hist = (png_uint_16p)png_malloc_warn(png_ptr, + (png_uint_32)(PNG_MAX_PALETTE_LENGTH * png_sizeof(png_uint_16))); + if (png_ptr->hist == NULL) + { + png_warning(png_ptr, "Insufficient memory for hIST chunk data."); + return; + } + + for (i = 0; i < info_ptr->num_palette; i++) + png_ptr->hist[i] = hist[i]; + info_ptr->hist = png_ptr->hist; + info_ptr->valid |= PNG_INFO_hIST; + +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_HIST; +#else + png_ptr->flags |= PNG_FLAG_FREE_HIST; +#endif +} +#endif + +void PNGAPI +png_set_IHDR(png_structp png_ptr, png_infop info_ptr, + png_uint_32 width, png_uint_32 height, int bit_depth, + int color_type, int interlace_type, int compression_type, + int filter_type) +{ + png_debug1(1, "in %s storage function", "IHDR"); + if (png_ptr == NULL || info_ptr == NULL) + return; + + /* check for width and height valid values */ + if (width == 0 || height == 0) + png_error(png_ptr, "Image width or height is zero in IHDR"); +#ifdef PNG_SET_USER_LIMITS_SUPPORTED + if (width > png_ptr->user_width_max || height > png_ptr->user_height_max) + png_error(png_ptr, "image size exceeds user limits in IHDR"); +#else + if (width > PNG_USER_WIDTH_MAX || height > PNG_USER_HEIGHT_MAX) + png_error(png_ptr, "image size exceeds user limits in IHDR"); +#endif + if (width > PNG_UINT_31_MAX || height > PNG_UINT_31_MAX) + png_error(png_ptr, "Invalid image size in IHDR"); + if ( width > (PNG_UINT_32_MAX + >> 3) /* 8-byte RGBA pixels */ + - 64 /* bigrowbuf hack */ + - 1 /* filter byte */ + - 7*8 /* rounding of width to multiple of 8 pixels */ + - 8) /* extra max_pixel_depth pad */ + png_warning(png_ptr, "Width is too large for libpng to process pixels"); + + /* check other values */ + if (bit_depth != 1 && bit_depth != 2 && bit_depth != 4 && + bit_depth != 8 && bit_depth != 16) + png_error(png_ptr, "Invalid bit depth in IHDR"); + + if (color_type < 0 || color_type == 1 || + color_type == 5 || color_type > 6) + png_error(png_ptr, "Invalid color type in IHDR"); + + if (((color_type == PNG_COLOR_TYPE_PALETTE) && bit_depth > 8) || + ((color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA || + color_type == PNG_COLOR_TYPE_RGB_ALPHA) && bit_depth < 8)) + png_error(png_ptr, "Invalid color type/bit depth combination in IHDR"); + + if (interlace_type >= PNG_INTERLACE_LAST) + png_error(png_ptr, "Unknown interlace method in IHDR"); + + if (compression_type != PNG_COMPRESSION_TYPE_BASE) + png_error(png_ptr, "Unknown compression method in IHDR"); + +#if defined(PNG_MNG_FEATURES_SUPPORTED) + /* Accept filter_method 64 (intrapixel differencing) only if + * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and + * 2. Libpng did not read a PNG signature (this filter_method is only + * used in PNG datastreams that are embedded in MNG datastreams) and + * 3. The application called png_permit_mng_features with a mask that + * included PNG_FLAG_MNG_FILTER_64 and + * 4. The filter_method is 64 and + * 5. The color_type is RGB or RGBA + */ + if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&png_ptr->mng_features_permitted) + png_warning(png_ptr, "MNG features are not allowed in a PNG datastream"); + if (filter_type != PNG_FILTER_TYPE_BASE) + { + if (!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && + (filter_type == PNG_INTRAPIXEL_DIFFERENCING) && + ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) && + (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA))) + png_error(png_ptr, "Unknown filter method in IHDR"); + if (png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) + png_warning(png_ptr, "Invalid filter method in IHDR"); + } +#else + if (filter_type != PNG_FILTER_TYPE_BASE) + png_error(png_ptr, "Unknown filter method in IHDR"); +#endif + + info_ptr->width = width; + info_ptr->height = height; + info_ptr->bit_depth = (png_byte)bit_depth; + info_ptr->color_type =(png_byte) color_type; + info_ptr->compression_type = (png_byte)compression_type; + info_ptr->filter_type = (png_byte)filter_type; + info_ptr->interlace_type = (png_byte)interlace_type; + if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + info_ptr->channels = 1; + else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) + info_ptr->channels = 3; + else + info_ptr->channels = 1; + if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) + info_ptr->channels++; + info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth); + + /* check for potential overflow */ + if (width > (PNG_UINT_32_MAX + >> 3) /* 8-byte RGBA pixels */ + - 64 /* bigrowbuf hack */ + - 1 /* filter byte */ + - 7*8 /* rounding of width to multiple of 8 pixels */ + - 8) /* extra max_pixel_depth pad */ + info_ptr->rowbytes = (png_size_t)0; + else + info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width); +} + +#if defined(PNG_oFFs_SUPPORTED) +void PNGAPI +png_set_oFFs(png_structp png_ptr, png_infop info_ptr, + png_int_32 offset_x, png_int_32 offset_y, int unit_type) +{ + png_debug1(1, "in %s storage function", "oFFs"); + if (png_ptr == NULL || info_ptr == NULL) + return; + + info_ptr->x_offset = offset_x; + info_ptr->y_offset = offset_y; + info_ptr->offset_unit_type = (png_byte)unit_type; + info_ptr->valid |= PNG_INFO_oFFs; +} +#endif + +#if defined(PNG_pCAL_SUPPORTED) +void PNGAPI +png_set_pCAL(png_structp png_ptr, png_infop info_ptr, + png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, + png_charp units, png_charpp params) +{ + png_uint_32 length; + int i; + + png_debug1(1, "in %s storage function", "pCAL"); + if (png_ptr == NULL || info_ptr == NULL) + return; + + length = png_strlen(purpose) + 1; + png_debug1(3, "allocating purpose for info (%lu bytes)", + (unsigned long)length); + info_ptr->pcal_purpose = (png_charp)png_malloc_warn(png_ptr, length); + if (info_ptr->pcal_purpose == NULL) + { + png_warning(png_ptr, "Insufficient memory for pCAL purpose."); + return; + } + png_memcpy(info_ptr->pcal_purpose, purpose, (png_size_t)length); + + png_debug(3, "storing X0, X1, type, and nparams in info"); + info_ptr->pcal_X0 = X0; + info_ptr->pcal_X1 = X1; + info_ptr->pcal_type = (png_byte)type; + info_ptr->pcal_nparams = (png_byte)nparams; + + length = png_strlen(units) + 1; + png_debug1(3, "allocating units for info (%lu bytes)", + (unsigned long)length); + info_ptr->pcal_units = (png_charp)png_malloc_warn(png_ptr, length); + if (info_ptr->pcal_units == NULL) + { + png_warning(png_ptr, "Insufficient memory for pCAL units."); + return; + } + png_memcpy(info_ptr->pcal_units, units, (png_size_t)length); + + info_ptr->pcal_params = (png_charpp)png_malloc_warn(png_ptr, + (png_uint_32)((nparams + 1) * png_sizeof(png_charp))); + if (info_ptr->pcal_params == NULL) + { + png_warning(png_ptr, "Insufficient memory for pCAL params."); + return; + } + + png_memset(info_ptr->pcal_params, 0, (nparams + 1) * png_sizeof(png_charp)); + + for (i = 0; i < nparams; i++) + { + length = png_strlen(params[i]) + 1; + png_debug2(3, "allocating parameter %d for info (%lu bytes)", i, + (unsigned long)length); + info_ptr->pcal_params[i] = (png_charp)png_malloc_warn(png_ptr, length); + if (info_ptr->pcal_params[i] == NULL) + { + png_warning(png_ptr, "Insufficient memory for pCAL parameter."); + return; + } + png_memcpy(info_ptr->pcal_params[i], params[i], (png_size_t)length); + } + + info_ptr->valid |= PNG_INFO_pCAL; +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_PCAL; +#endif +} +#endif + +#if defined(PNG_READ_sCAL_SUPPORTED) || defined(PNG_WRITE_sCAL_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +void PNGAPI +png_set_sCAL(png_structp png_ptr, png_infop info_ptr, + int unit, double width, double height) +{ + png_debug1(1, "in %s storage function", "sCAL"); + if (png_ptr == NULL || info_ptr == NULL) + return; + + info_ptr->scal_unit = (png_byte)unit; + info_ptr->scal_pixel_width = width; + info_ptr->scal_pixel_height = height; + + info_ptr->valid |= PNG_INFO_sCAL; +} +#else +#ifdef PNG_FIXED_POINT_SUPPORTED +void PNGAPI +png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr, + int unit, png_charp swidth, png_charp sheight) +{ + png_uint_32 length; + + png_debug1(1, "in %s storage function", "sCAL"); + if (png_ptr == NULL || info_ptr == NULL) + return; + + info_ptr->scal_unit = (png_byte)unit; + + length = png_strlen(swidth) + 1; + png_debug1(3, "allocating unit for info (%u bytes)", + (unsigned int)length); + info_ptr->scal_s_width = (png_charp)png_malloc_warn(png_ptr, length); + if (info_ptr->scal_s_width == NULL) + { + png_warning(png_ptr, + "Memory allocation failed while processing sCAL."); + return; + } + png_memcpy(info_ptr->scal_s_width, swidth, (png_size_t)length); + + length = png_strlen(sheight) + 1; + png_debug1(3, "allocating unit for info (%u bytes)", + (unsigned int)length); + info_ptr->scal_s_height = (png_charp)png_malloc_warn(png_ptr, length); + if (info_ptr->scal_s_height == NULL) + { + png_free (png_ptr, info_ptr->scal_s_width); + info_ptr->scal_s_width = NULL; + png_warning(png_ptr, + "Memory allocation failed while processing sCAL."); + return; + } + png_memcpy(info_ptr->scal_s_height, sheight, (png_size_t)length); + info_ptr->valid |= PNG_INFO_sCAL; +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_SCAL; +#endif +} +#endif +#endif +#endif + +#if defined(PNG_pHYs_SUPPORTED) +void PNGAPI +png_set_pHYs(png_structp png_ptr, png_infop info_ptr, + png_uint_32 res_x, png_uint_32 res_y, int unit_type) +{ + png_debug1(1, "in %s storage function", "pHYs"); + if (png_ptr == NULL || info_ptr == NULL) + return; + + info_ptr->x_pixels_per_unit = res_x; + info_ptr->y_pixels_per_unit = res_y; + info_ptr->phys_unit_type = (png_byte)unit_type; + info_ptr->valid |= PNG_INFO_pHYs; +} +#endif + +void PNGAPI +png_set_PLTE(png_structp png_ptr, png_infop info_ptr, + png_colorp palette, int num_palette) +{ + + png_debug1(1, "in %s storage function", "PLTE"); + if (png_ptr == NULL || info_ptr == NULL) + return; + + if (num_palette < 0 || num_palette > PNG_MAX_PALETTE_LENGTH) + { + if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + png_error(png_ptr, "Invalid palette length"); + else + { + png_warning(png_ptr, "Invalid palette length"); + return; + } + } + + /* + * It may not actually be necessary to set png_ptr->palette here; + * we do it for backward compatibility with the way the png_handle_tRNS + * function used to do the allocation. + */ +#ifdef PNG_FREE_ME_SUPPORTED + png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0); +#endif + + /* Changed in libpng-1.2.1 to allocate PNG_MAX_PALETTE_LENGTH instead + of num_palette entries, + in case of an invalid PNG file that has too-large sample values. */ + png_ptr->palette = (png_colorp)png_malloc(png_ptr, + PNG_MAX_PALETTE_LENGTH * png_sizeof(png_color)); + png_memset(png_ptr->palette, 0, PNG_MAX_PALETTE_LENGTH * + png_sizeof(png_color)); + png_memcpy(png_ptr->palette, palette, num_palette * png_sizeof(png_color)); + info_ptr->palette = png_ptr->palette; + info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette; + +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_PLTE; +#else + png_ptr->flags |= PNG_FLAG_FREE_PLTE; +#endif + + info_ptr->valid |= PNG_INFO_PLTE; +} + +#if defined(PNG_sBIT_SUPPORTED) +void PNGAPI +png_set_sBIT(png_structp png_ptr, png_infop info_ptr, + png_color_8p sig_bit) +{ + png_debug1(1, "in %s storage function", "sBIT"); + if (png_ptr == NULL || info_ptr == NULL) + return; + + png_memcpy(&(info_ptr->sig_bit), sig_bit, png_sizeof(png_color_8)); + info_ptr->valid |= PNG_INFO_sBIT; +} +#endif + +#if defined(PNG_sRGB_SUPPORTED) +void PNGAPI +png_set_sRGB(png_structp png_ptr, png_infop info_ptr, int intent) +{ + png_debug1(1, "in %s storage function", "sRGB"); + if (png_ptr == NULL || info_ptr == NULL) + return; + + info_ptr->srgb_intent = (png_byte)intent; + info_ptr->valid |= PNG_INFO_sRGB; +} + +void PNGAPI +png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr, + int intent) +{ +#if defined(PNG_gAMA_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED + float file_gamma; +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED + png_fixed_point int_file_gamma; +#endif +#endif +#if defined(PNG_cHRM_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED + float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y; +#endif + png_fixed_point int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, + int_green_y, int_blue_x, int_blue_y; +#endif + png_debug1(1, "in %s storage function", "sRGB_gAMA_and_cHRM"); + if (png_ptr == NULL || info_ptr == NULL) + return; + + png_set_sRGB(png_ptr, info_ptr, intent); + +#if defined(PNG_gAMA_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED + file_gamma = (float).45455; + png_set_gAMA(png_ptr, info_ptr, file_gamma); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED + int_file_gamma = 45455L; + png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma); +#endif +#endif + +#if defined(PNG_cHRM_SUPPORTED) + int_white_x = 31270L; + int_white_y = 32900L; + int_red_x = 64000L; + int_red_y = 33000L; + int_green_x = 30000L; + int_green_y = 60000L; + int_blue_x = 15000L; + int_blue_y = 6000L; + +#ifdef PNG_FLOATING_POINT_SUPPORTED + white_x = (float).3127; + white_y = (float).3290; + red_x = (float).64; + red_y = (float).33; + green_x = (float).30; + green_y = (float).60; + blue_x = (float).15; + blue_y = (float).06; +#endif + +#if !defined(PNG_NO_CHECK_cHRM) + if (png_check_cHRM_fixed(png_ptr, + int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, + int_green_y, int_blue_x, int_blue_y)) +#endif + { +#ifdef PNG_FIXED_POINT_SUPPORTED + png_set_cHRM_fixed(png_ptr, info_ptr, + int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, + int_green_y, int_blue_x, int_blue_y); +#endif +#ifdef PNG_FLOATING_POINT_SUPPORTED + png_set_cHRM(png_ptr, info_ptr, + white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y); +#endif + } +#endif /* cHRM */ +} +#endif /* sRGB */ + + +#if defined(PNG_iCCP_SUPPORTED) +void PNGAPI +png_set_iCCP(png_structp png_ptr, png_infop info_ptr, + png_charp name, int compression_type, + png_charp profile, png_uint_32 proflen) +{ + png_charp new_iccp_name; + png_charp new_iccp_profile; + png_uint_32 length; + + png_debug1(1, "in %s storage function", "iCCP"); + if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL) + return; + + length = png_strlen(name)+1; + new_iccp_name = (png_charp)png_malloc_warn(png_ptr, length); + if (new_iccp_name == NULL) + { + png_warning(png_ptr, "Insufficient memory to process iCCP chunk."); + return; + } + png_memcpy(new_iccp_name, name, length); + new_iccp_profile = (png_charp)png_malloc_warn(png_ptr, proflen); + if (new_iccp_profile == NULL) + { + png_free (png_ptr, new_iccp_name); + png_warning(png_ptr, + "Insufficient memory to process iCCP profile."); + return; + } + png_memcpy(new_iccp_profile, profile, (png_size_t)proflen); + + png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, 0); + + info_ptr->iccp_proflen = proflen; + info_ptr->iccp_name = new_iccp_name; + info_ptr->iccp_profile = new_iccp_profile; + /* Compression is always zero but is here so the API and info structure + * does not have to change if we introduce multiple compression types */ + info_ptr->iccp_compression = (png_byte)compression_type; +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_ICCP; +#endif + info_ptr->valid |= PNG_INFO_iCCP; +} +#endif + +#if defined(PNG_TEXT_SUPPORTED) +void PNGAPI +png_set_text(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, + int num_text) +{ + int ret; + ret = png_set_text_2(png_ptr, info_ptr, text_ptr, num_text); + if (ret) + png_error(png_ptr, "Insufficient memory to store text"); +} + +int /* PRIVATE */ +png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, + int num_text) +{ + int i; + + png_debug1(1, "in %s storage function", (png_ptr->chunk_name[0] == '\0' ? + "text" : (png_const_charp)png_ptr->chunk_name)); + + if (png_ptr == NULL || info_ptr == NULL || num_text == 0) + return(0); + + /* Make sure we have enough space in the "text" array in info_struct + * to hold all of the incoming text_ptr objects. + */ + if (info_ptr->num_text + num_text > info_ptr->max_text) + { + if (info_ptr->text != NULL) + { + png_textp old_text; + int old_max; + + old_max = info_ptr->max_text; + info_ptr->max_text = info_ptr->num_text + num_text + 8; + old_text = info_ptr->text; + info_ptr->text = (png_textp)png_malloc_warn(png_ptr, + (png_uint_32)(info_ptr->max_text * png_sizeof(png_text))); + if (info_ptr->text == NULL) + { + png_free(png_ptr, old_text); + return(1); + } + png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max * + png_sizeof(png_text))); + png_free(png_ptr, old_text); + } + else + { + info_ptr->max_text = num_text + 8; + info_ptr->num_text = 0; + info_ptr->text = (png_textp)png_malloc_warn(png_ptr, + (png_uint_32)(info_ptr->max_text * png_sizeof(png_text))); + if (info_ptr->text == NULL) + return(1); +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_TEXT; +#endif + } + png_debug1(3, "allocated %d entries for info_ptr->text", + info_ptr->max_text); + } + for (i = 0; i < num_text; i++) + { + png_size_t text_length, key_len; + png_size_t lang_len, lang_key_len; + png_textp textp = &(info_ptr->text[info_ptr->num_text]); + + if (text_ptr[i].key == NULL) + continue; + + key_len = png_strlen(text_ptr[i].key); + + if (text_ptr[i].compression <= 0) + { + lang_len = 0; + lang_key_len = 0; + } + else +#ifdef PNG_iTXt_SUPPORTED + { + /* set iTXt data */ + if (text_ptr[i].lang != NULL) + lang_len = png_strlen(text_ptr[i].lang); + else + lang_len = 0; + if (text_ptr[i].lang_key != NULL) + lang_key_len = png_strlen(text_ptr[i].lang_key); + else + lang_key_len = 0; + } +#else + { + png_warning(png_ptr, "iTXt chunk not supported."); + continue; + } +#endif + + if (text_ptr[i].text == NULL || text_ptr[i].text[0] == '\0') + { + text_length = 0; +#ifdef PNG_iTXt_SUPPORTED + if (text_ptr[i].compression > 0) + textp->compression = PNG_ITXT_COMPRESSION_NONE; + else +#endif + textp->compression = PNG_TEXT_COMPRESSION_NONE; + } + else + { + text_length = png_strlen(text_ptr[i].text); + textp->compression = text_ptr[i].compression; + } + + textp->key = (png_charp)png_malloc_warn(png_ptr, + (png_uint_32) + (key_len + text_length + lang_len + lang_key_len + 4)); + if (textp->key == NULL) + return(1); + png_debug2(2, "Allocated %lu bytes at %x in png_set_text", + (png_uint_32) + (key_len + lang_len + lang_key_len + text_length + 4), + (int)textp->key); + + png_memcpy(textp->key, text_ptr[i].key, + (png_size_t)(key_len)); + *(textp->key + key_len) = '\0'; +#ifdef PNG_iTXt_SUPPORTED + if (text_ptr[i].compression > 0) + { + textp->lang = textp->key + key_len + 1; + png_memcpy(textp->lang, text_ptr[i].lang, lang_len); + *(textp->lang + lang_len) = '\0'; + textp->lang_key = textp->lang + lang_len + 1; + png_memcpy(textp->lang_key, text_ptr[i].lang_key, lang_key_len); + *(textp->lang_key + lang_key_len) = '\0'; + textp->text = textp->lang_key + lang_key_len + 1; + } + else +#endif + { +#ifdef PNG_iTXt_SUPPORTED + textp->lang=NULL; + textp->lang_key=NULL; +#endif + textp->text = textp->key + key_len + 1; + } + if (text_length) + png_memcpy(textp->text, text_ptr[i].text, + (png_size_t)(text_length)); + *(textp->text + text_length) = '\0'; + +#ifdef PNG_iTXt_SUPPORTED + if (textp->compression > 0) + { + textp->text_length = 0; + textp->itxt_length = text_length; + } + else +#endif + { + textp->text_length = text_length; +#ifdef PNG_iTXt_SUPPORTED + textp->itxt_length = 0; +#endif + } + info_ptr->num_text++; + png_debug1(3, "transferred text chunk %d", info_ptr->num_text); + } + return(0); +} +#endif + +#if defined(PNG_tIME_SUPPORTED) +void PNGAPI +png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_timep mod_time) +{ + png_debug1(1, "in %s storage function", "tIME"); + if (png_ptr == NULL || info_ptr == NULL || + (png_ptr->mode & PNG_WROTE_tIME)) + return; + + png_memcpy(&(info_ptr->mod_time), mod_time, png_sizeof(png_time)); + info_ptr->valid |= PNG_INFO_tIME; +} +#endif + +#if defined(PNG_tRNS_SUPPORTED) +void PNGAPI +png_set_tRNS(png_structp png_ptr, png_infop info_ptr, + png_bytep trans, int num_trans, png_color_16p trans_values) +{ + png_debug1(1, "in %s storage function", "tRNS"); + if (png_ptr == NULL || info_ptr == NULL) + return; + + if (trans != NULL) + { + /* + * It may not actually be necessary to set png_ptr->trans here; + * we do it for backward compatibility with the way the png_handle_tRNS + * function used to do the allocation. + */ + +#ifdef PNG_FREE_ME_SUPPORTED + png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0); +#endif + + /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */ + png_ptr->trans = info_ptr->trans = (png_bytep)png_malloc(png_ptr, + (png_uint_32)PNG_MAX_PALETTE_LENGTH); + if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH) + png_memcpy(info_ptr->trans, trans, (png_size_t)num_trans); + } + + if (trans_values != NULL) + { + int sample_max = (1 << info_ptr->bit_depth); + if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY && + (int)trans_values->gray > sample_max) || + (info_ptr->color_type == PNG_COLOR_TYPE_RGB && + ((int)trans_values->red > sample_max || + (int)trans_values->green > sample_max || + (int)trans_values->blue > sample_max))) + png_warning(png_ptr, + "tRNS chunk has out-of-range samples for bit_depth"); + png_memcpy(&(info_ptr->trans_values), trans_values, + png_sizeof(png_color_16)); + if (num_trans == 0) + num_trans = 1; + } + + info_ptr->num_trans = (png_uint_16)num_trans; + if (num_trans != 0) + { + info_ptr->valid |= PNG_INFO_tRNS; +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_TRNS; +#else + png_ptr->flags |= PNG_FLAG_FREE_TRNS; +#endif + } +} +#endif + +#if defined(PNG_sPLT_SUPPORTED) +void PNGAPI +png_set_sPLT(png_structp png_ptr, + png_infop info_ptr, png_sPLT_tp entries, int nentries) +/* + * entries - array of png_sPLT_t structures + * to be added to the list of palettes + * in the info structure. + * nentries - number of palette structures to be + * added. + */ +{ + png_sPLT_tp np; + int i; + + if (png_ptr == NULL || info_ptr == NULL) + return; + + np = (png_sPLT_tp)png_malloc_warn(png_ptr, + (info_ptr->splt_palettes_num + nentries) * + (png_uint_32)png_sizeof(png_sPLT_t)); + if (np == NULL) + { + png_warning(png_ptr, "No memory for sPLT palettes."); + return; + } + + png_memcpy(np, info_ptr->splt_palettes, + info_ptr->splt_palettes_num * png_sizeof(png_sPLT_t)); + png_free(png_ptr, info_ptr->splt_palettes); + info_ptr->splt_palettes=NULL; + + for (i = 0; i < nentries; i++) + { + png_sPLT_tp to = np + info_ptr->splt_palettes_num + i; + png_sPLT_tp from = entries + i; + png_uint_32 length; + + length = png_strlen(from->name) + 1; + to->name = (png_charp)png_malloc_warn(png_ptr, length); + if (to->name == NULL) + { + png_warning(png_ptr, + "Out of memory while processing sPLT chunk"); + continue; + } + png_memcpy(to->name, from->name, length); + to->entries = (png_sPLT_entryp)png_malloc_warn(png_ptr, + (png_uint_32)(from->nentries * png_sizeof(png_sPLT_entry))); + if (to->entries == NULL) + { + png_warning(png_ptr, + "Out of memory while processing sPLT chunk"); + png_free(png_ptr, to->name); + to->name = NULL; + continue; + } + png_memcpy(to->entries, from->entries, + from->nentries * png_sizeof(png_sPLT_entry)); + to->nentries = from->nentries; + to->depth = from->depth; + } + + info_ptr->splt_palettes = np; + info_ptr->splt_palettes_num += nentries; + info_ptr->valid |= PNG_INFO_sPLT; +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_SPLT; +#endif +} +#endif /* PNG_sPLT_SUPPORTED */ + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) +void PNGAPI +png_set_unknown_chunks(png_structp png_ptr, + png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns) +{ + png_unknown_chunkp np; + int i; + + if (png_ptr == NULL || info_ptr == NULL || num_unknowns == 0) + return; + + np = (png_unknown_chunkp)png_malloc_warn(png_ptr, + (png_uint_32)((info_ptr->unknown_chunks_num + num_unknowns) * + png_sizeof(png_unknown_chunk))); + if (np == NULL) + { + png_warning(png_ptr, + "Out of memory while processing unknown chunk."); + return; + } + + png_memcpy(np, info_ptr->unknown_chunks, + info_ptr->unknown_chunks_num * png_sizeof(png_unknown_chunk)); + png_free(png_ptr, info_ptr->unknown_chunks); + info_ptr->unknown_chunks=NULL; + + for (i = 0; i < num_unknowns; i++) + { + png_unknown_chunkp to = np + info_ptr->unknown_chunks_num + i; + png_unknown_chunkp from = unknowns + i; + + png_memcpy((png_charp)to->name, + (png_charp)from->name, + png_sizeof(from->name)); + to->name[png_sizeof(to->name)-1] = '\0'; + to->size = from->size; + /* note our location in the read or write sequence */ + to->location = (png_byte)(png_ptr->mode & 0xff); + + if (from->size == 0) + to->data=NULL; + else + { + to->data = (png_bytep)png_malloc_warn(png_ptr, + (png_uint_32)from->size); + if (to->data == NULL) + { + png_warning(png_ptr, + "Out of memory while processing unknown chunk."); + to->size = 0; + } + else + png_memcpy(to->data, from->data, from->size); + } + } + + info_ptr->unknown_chunks = np; + info_ptr->unknown_chunks_num += num_unknowns; +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_UNKN; +#endif +} +void PNGAPI +png_set_unknown_chunk_location(png_structp png_ptr, png_infop info_ptr, + int chunk, int location) +{ + if (png_ptr != NULL && info_ptr != NULL && chunk >= 0 && chunk < + (int)info_ptr->unknown_chunks_num) + info_ptr->unknown_chunks[chunk].location = (png_byte)location; +} +#endif + +#if defined(PNG_1_0_X) || defined(PNG_1_2_X) +#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ + defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) +void PNGAPI +png_permit_empty_plte (png_structp png_ptr, int empty_plte_permitted) +{ + /* This function is deprecated in favor of png_permit_mng_features() + and will be removed from libpng-1.3.0 */ + png_debug(1, "in png_permit_empty_plte, DEPRECATED."); + if (png_ptr == NULL) + return; + png_ptr->mng_features_permitted = (png_byte) + ((png_ptr->mng_features_permitted & (~PNG_FLAG_MNG_EMPTY_PLTE)) | + ((empty_plte_permitted & PNG_FLAG_MNG_EMPTY_PLTE))); +} +#endif +#endif + +#if defined(PNG_MNG_FEATURES_SUPPORTED) +png_uint_32 PNGAPI +png_permit_mng_features (png_structp png_ptr, png_uint_32 mng_features) +{ + png_debug(1, "in png_permit_mng_features"); + if (png_ptr == NULL) + return (png_uint_32)0; + png_ptr->mng_features_permitted = + (png_byte)(mng_features & PNG_ALL_MNG_FEATURES); + return (png_uint_32)png_ptr->mng_features_permitted; +} +#endif + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) +void PNGAPI +png_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_bytep + chunk_list, int num_chunks) +{ + png_bytep new_list, p; + int i, old_num_chunks; + if (png_ptr == NULL) + return; + if (num_chunks == 0) + { + if (keep == PNG_HANDLE_CHUNK_ALWAYS || keep == PNG_HANDLE_CHUNK_IF_SAFE) + png_ptr->flags |= PNG_FLAG_KEEP_UNKNOWN_CHUNKS; + else + png_ptr->flags &= ~PNG_FLAG_KEEP_UNKNOWN_CHUNKS; + + if (keep == PNG_HANDLE_CHUNK_ALWAYS) + png_ptr->flags |= PNG_FLAG_KEEP_UNSAFE_CHUNKS; + else + png_ptr->flags &= ~PNG_FLAG_KEEP_UNSAFE_CHUNKS; + return; + } + if (chunk_list == NULL) + return; + old_num_chunks = png_ptr->num_chunk_list; + new_list=(png_bytep)png_malloc(png_ptr, + (png_uint_32) + (5*(num_chunks + old_num_chunks))); + if (png_ptr->chunk_list != NULL) + { + png_memcpy(new_list, png_ptr->chunk_list, + (png_size_t)(5*old_num_chunks)); + png_free(png_ptr, png_ptr->chunk_list); + png_ptr->chunk_list=NULL; + } + png_memcpy(new_list + 5*old_num_chunks, chunk_list, + (png_size_t)(5*num_chunks)); + for (p = new_list + 5*old_num_chunks + 4, i = 0; inum_chunk_list = old_num_chunks + num_chunks; + png_ptr->chunk_list = new_list; +#ifdef PNG_FREE_ME_SUPPORTED + png_ptr->free_me |= PNG_FREE_LIST; +#endif +} +#endif + +#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) +void PNGAPI +png_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr, + png_user_chunk_ptr read_user_chunk_fn) +{ + png_debug(1, "in png_set_read_user_chunk_fn"); + if (png_ptr == NULL) + return; + png_ptr->read_user_chunk_fn = read_user_chunk_fn; + png_ptr->user_chunk_ptr = user_chunk_ptr; +} +#endif + +#if defined(PNG_INFO_IMAGE_SUPPORTED) +void PNGAPI +png_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers) +{ + png_debug1(1, "in %s storage function", "rows"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + if (info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers)) + png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0); + info_ptr->row_pointers = row_pointers; + if (row_pointers) + info_ptr->valid |= PNG_INFO_IDAT; +} +#endif + +#ifdef PNG_WRITE_SUPPORTED +void PNGAPI +png_set_compression_buffer_size(png_structp png_ptr, + png_uint_32 size) +{ + if (png_ptr == NULL) + return; + png_free(png_ptr, png_ptr->zbuf); + png_ptr->zbuf_size = (png_size_t)size; + png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, size); + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; +} +#endif + +void PNGAPI +png_set_invalid(png_structp png_ptr, png_infop info_ptr, int mask) +{ + if (png_ptr && info_ptr) + info_ptr->valid &= ~mask; +} + + +#ifndef PNG_1_0_X +#ifdef PNG_ASSEMBLER_CODE_SUPPORTED +/* function was added to libpng 1.2.0 and should always exist by default */ +void PNGAPI +png_set_asm_flags (png_structp png_ptr, png_uint_32 asm_flags) +{ +/* Obsolete as of libpng-1.2.20 and will be removed from libpng-1.4.0 */ + if (png_ptr != NULL) + png_ptr->asm_flags = 0; + asm_flags = asm_flags; /* Quiet the compiler */ +} + +/* this function was added to libpng 1.2.0 */ +void PNGAPI +png_set_mmx_thresholds (png_structp png_ptr, + png_byte mmx_bitdepth_threshold, + png_uint_32 mmx_rowbytes_threshold) +{ +/* Obsolete as of libpng-1.2.20 and will be removed from libpng-1.4.0 */ + if (png_ptr == NULL) + return; + /* Quiet the compiler */ + mmx_bitdepth_threshold = mmx_bitdepth_threshold; + mmx_rowbytes_threshold = mmx_rowbytes_threshold; +} +#endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */ + +#ifdef PNG_SET_USER_LIMITS_SUPPORTED +/* this function was added to libpng 1.2.6 */ +void PNGAPI +png_set_user_limits (png_structp png_ptr, png_uint_32 user_width_max, + png_uint_32 user_height_max) +{ + /* Images with dimensions larger than these limits will be + * rejected by png_set_IHDR(). To accept any PNG datastream + * regardless of dimensions, set both limits to 0x7ffffffL. + */ + if (png_ptr == NULL) return; + png_ptr->user_width_max = user_width_max; + png_ptr->user_height_max = user_height_max; +} +#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ + +#endif /* ?PNG_1_0_X */ +#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/navit/support/libpng/pngtrans.c b/navit/support/libpng/pngtrans.c new file mode 100644 index 0000000..f92f4b0 --- /dev/null +++ b/navit/support/libpng/pngtrans.c @@ -0,0 +1,662 @@ + +/* pngtrans.c - transforms the data in a row (used by both readers and writers) + * + * Last changed in libpng 1.2.30 [August 15, 2008] + * For conditions of distribution and use, see copyright notice in png.h + * Copyright (c) 1998-2008 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + */ + +#define PNG_INTERNAL +#include "png.h" +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + +#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) +/* turn on BGR-to-RGB mapping */ +void PNGAPI +png_set_bgr(png_structp png_ptr) +{ + png_debug(1, "in png_set_bgr"); + if (png_ptr == NULL) return; + png_ptr->transformations |= PNG_BGR; +} +#endif + +#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) +/* turn on 16 bit byte swapping */ +void PNGAPI +png_set_swap(png_structp png_ptr) +{ + png_debug(1, "in png_set_swap"); + if (png_ptr == NULL) return; + if (png_ptr->bit_depth == 16) + png_ptr->transformations |= PNG_SWAP_BYTES; +} +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) +/* turn on pixel packing */ +void PNGAPI +png_set_packing(png_structp png_ptr) +{ + png_debug(1, "in png_set_packing"); + if (png_ptr == NULL) return; + if (png_ptr->bit_depth < 8) + { + png_ptr->transformations |= PNG_PACK; + png_ptr->usr_bit_depth = 8; + } +} +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) +/* turn on packed pixel swapping */ +void PNGAPI +png_set_packswap(png_structp png_ptr) +{ + png_debug(1, "in png_set_packswap"); + if (png_ptr == NULL) return; + if (png_ptr->bit_depth < 8) + png_ptr->transformations |= PNG_PACKSWAP; +} +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) +void PNGAPI +png_set_shift(png_structp png_ptr, png_color_8p true_bits) +{ + png_debug(1, "in png_set_shift"); + if (png_ptr == NULL) return; + png_ptr->transformations |= PNG_SHIFT; + png_ptr->shift = *true_bits; +} +#endif + +#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ + defined(PNG_WRITE_INTERLACING_SUPPORTED) +int PNGAPI +png_set_interlace_handling(png_structp png_ptr) +{ + png_debug(1, "in png_set_interlace handling"); + if (png_ptr && png_ptr->interlaced) + { + png_ptr->transformations |= PNG_INTERLACE; + return (7); + } + + return (1); +} +#endif + +#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) +/* Add a filler byte on read, or remove a filler or alpha byte on write. + * The filler type has changed in v0.95 to allow future 2-byte fillers + * for 48-bit input data, as well as to avoid problems with some compilers + * that don't like bytes as parameters. + */ +void PNGAPI +png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc) +{ + png_debug(1, "in png_set_filler"); + if (png_ptr == NULL) return; + png_ptr->transformations |= PNG_FILLER; + png_ptr->filler = (png_byte)filler; + if (filler_loc == PNG_FILLER_AFTER) + png_ptr->flags |= PNG_FLAG_FILLER_AFTER; + else + png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER; + + /* This should probably go in the "do_read_filler" routine. + * I attempted to do that in libpng-1.0.1a but that caused problems + * so I restored it in libpng-1.0.2a + */ + + if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) + { + png_ptr->usr_channels = 4; + } + + /* Also I added this in libpng-1.0.2a (what happens when we expand + * a less-than-8-bit grayscale to GA? */ + + if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8) + { + png_ptr->usr_channels = 2; + } +} + +#if !defined(PNG_1_0_X) +/* Added to libpng-1.2.7 */ +void PNGAPI +png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc) +{ + png_debug(1, "in png_set_add_alpha"); + if (png_ptr == NULL) return; + png_set_filler(png_ptr, filler, filler_loc); + png_ptr->transformations |= PNG_ADD_ALPHA; +} +#endif + +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) +void PNGAPI +png_set_swap_alpha(png_structp png_ptr) +{ + png_debug(1, "in png_set_swap_alpha"); + if (png_ptr == NULL) return; + png_ptr->transformations |= PNG_SWAP_ALPHA; +} +#endif + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) +void PNGAPI +png_set_invert_alpha(png_structp png_ptr) +{ + png_debug(1, "in png_set_invert_alpha"); + if (png_ptr == NULL) return; + png_ptr->transformations |= PNG_INVERT_ALPHA; +} +#endif + +#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) +void PNGAPI +png_set_invert_mono(png_structp png_ptr) +{ + png_debug(1, "in png_set_invert_mono"); + if (png_ptr == NULL) return; + png_ptr->transformations |= PNG_INVERT_MONO; +} + +/* invert monochrome grayscale data */ +void /* PRIVATE */ +png_do_invert(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_invert"); + /* This test removed from libpng version 1.0.13 and 1.2.0: + * if (row_info->bit_depth == 1 && + */ +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row == NULL || row_info == NULL) + return; +#endif + if (row_info->color_type == PNG_COLOR_TYPE_GRAY) + { + png_bytep rp = row; + png_uint_32 i; + png_uint_32 istop = row_info->rowbytes; + + for (i = 0; i < istop; i++) + { + *rp = (png_byte)(~(*rp)); + rp++; + } + } + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && + row_info->bit_depth == 8) + { + png_bytep rp = row; + png_uint_32 i; + png_uint_32 istop = row_info->rowbytes; + + for (i = 0; i < istop; i+=2) + { + *rp = (png_byte)(~(*rp)); + rp+=2; + } + } + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && + row_info->bit_depth == 16) + { + png_bytep rp = row; + png_uint_32 i; + png_uint_32 istop = row_info->rowbytes; + + for (i = 0; i < istop; i+=4) + { + *rp = (png_byte)(~(*rp)); + *(rp+1) = (png_byte)(~(*(rp+1))); + rp+=4; + } + } +} +#endif + +#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) +/* swaps byte order on 16 bit depth images */ +void /* PRIVATE */ +png_do_swap(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_swap"); + if ( +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + row_info->bit_depth == 16) + { + png_bytep rp = row; + png_uint_32 i; + png_uint_32 istop= row_info->width * row_info->channels; + + for (i = 0; i < istop; i++, rp += 2) + { + png_byte t = *rp; + *rp = *(rp + 1); + *(rp + 1) = t; + } + } +} +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) +static PNG_CONST png_byte onebppswaptable[256] = { + 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, + 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, + 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, + 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, + 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, + 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, + 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, + 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, + 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, + 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, + 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, + 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, + 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, + 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, + 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, + 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, + 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, + 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, + 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, + 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, + 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, + 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, + 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, + 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, + 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, + 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, + 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, + 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, + 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, + 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, + 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, + 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF +}; + +static PNG_CONST png_byte twobppswaptable[256] = { + 0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0, + 0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0, + 0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4, + 0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4, + 0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8, + 0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8, + 0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC, + 0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC, + 0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1, + 0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1, + 0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5, + 0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5, + 0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9, + 0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9, + 0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD, + 0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD, + 0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2, + 0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2, + 0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6, + 0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6, + 0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA, + 0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA, + 0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE, + 0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE, + 0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3, + 0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3, + 0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7, + 0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7, + 0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB, + 0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB, + 0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF, + 0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF +}; + +static PNG_CONST png_byte fourbppswaptable[256] = { + 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, + 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, + 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, + 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1, + 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, + 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2, + 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73, + 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3, + 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74, + 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4, + 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75, + 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5, + 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76, + 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6, + 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77, + 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7, + 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78, + 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8, + 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79, + 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9, + 0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A, + 0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA, + 0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B, + 0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB, + 0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C, + 0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC, + 0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D, + 0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD, + 0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E, + 0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE, + 0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F, + 0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF +}; + +/* swaps pixel packing order within bytes */ +void /* PRIVATE */ +png_do_packswap(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_packswap"); + if ( +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + row_info->bit_depth < 8) + { + png_bytep rp, end, table; + + end = row + row_info->rowbytes; + + if (row_info->bit_depth == 1) + table = (png_bytep)onebppswaptable; + else if (row_info->bit_depth == 2) + table = (png_bytep)twobppswaptable; + else if (row_info->bit_depth == 4) + table = (png_bytep)fourbppswaptable; + else + return; + + for (rp = row; rp < end; rp++) + *rp = table[*rp]; + } +} +#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */ + +#if defined(PNG_WRITE_FILLER_SUPPORTED) || \ + defined(PNG_READ_STRIP_ALPHA_SUPPORTED) +/* remove filler or alpha byte(s) */ +void /* PRIVATE */ +png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags) +{ + png_debug(1, "in png_do_strip_filler"); +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row != NULL && row_info != NULL) +#endif + { + png_bytep sp=row; + png_bytep dp=row; + png_uint_32 row_width=row_info->width; + png_uint_32 i; + + if ((row_info->color_type == PNG_COLOR_TYPE_RGB || + (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA && + (flags & PNG_FLAG_STRIP_ALPHA))) && + row_info->channels == 4) + { + if (row_info->bit_depth == 8) + { + /* This converts from RGBX or RGBA to RGB */ + if (flags & PNG_FLAG_FILLER_AFTER) + { + dp+=3; sp+=4; + for (i = 1; i < row_width; i++) + { + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + sp++; + } + } + /* This converts from XRGB or ARGB to RGB */ + else + { + for (i = 0; i < row_width; i++) + { + sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + } + } + row_info->pixel_depth = 24; + row_info->rowbytes = row_width * 3; + } + else /* if (row_info->bit_depth == 16) */ + { + if (flags & PNG_FLAG_FILLER_AFTER) + { + /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */ + sp += 8; dp += 6; + for (i = 1; i < row_width; i++) + { + /* This could be (although png_memcpy is probably slower): + png_memcpy(dp, sp, 6); + sp += 8; + dp += 6; + */ + + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + sp += 2; + } + } + else + { + /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */ + for (i = 0; i < row_width; i++) + { + /* This could be (although png_memcpy is probably slower): + png_memcpy(dp, sp, 6); + sp += 8; + dp += 6; + */ + + sp+=2; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + } + } + row_info->pixel_depth = 48; + row_info->rowbytes = row_width * 6; + } + row_info->channels = 3; + } + else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY || + (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && + (flags & PNG_FLAG_STRIP_ALPHA))) && + row_info->channels == 2) + { + if (row_info->bit_depth == 8) + { + /* This converts from GX or GA to G */ + if (flags & PNG_FLAG_FILLER_AFTER) + { + for (i = 0; i < row_width; i++) + { + *dp++ = *sp++; + sp++; + } + } + /* This converts from XG or AG to G */ + else + { + for (i = 0; i < row_width; i++) + { + sp++; + *dp++ = *sp++; + } + } + row_info->pixel_depth = 8; + row_info->rowbytes = row_width; + } + else /* if (row_info->bit_depth == 16) */ + { + if (flags & PNG_FLAG_FILLER_AFTER) + { + /* This converts from GGXX or GGAA to GG */ + sp += 4; dp += 2; + for (i = 1; i < row_width; i++) + { + *dp++ = *sp++; + *dp++ = *sp++; + sp += 2; + } + } + else + { + /* This converts from XXGG or AAGG to GG */ + for (i = 0; i < row_width; i++) + { + sp += 2; + *dp++ = *sp++; + *dp++ = *sp++; + } + } + row_info->pixel_depth = 16; + row_info->rowbytes = row_width * 2; + } + row_info->channels = 1; + } + if (flags & PNG_FLAG_STRIP_ALPHA) + row_info->color_type &= ~PNG_COLOR_MASK_ALPHA; + } +} +#endif + +#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) +/* swaps red and blue bytes within a pixel */ +void /* PRIVATE */ +png_do_bgr(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_bgr"); + if ( +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + (row_info->color_type & PNG_COLOR_MASK_COLOR)) + { + png_uint_32 row_width = row_info->width; + if (row_info->bit_depth == 8) + { + if (row_info->color_type == PNG_COLOR_TYPE_RGB) + { + png_bytep rp; + png_uint_32 i; + + for (i = 0, rp = row; i < row_width; i++, rp += 3) + { + png_byte save = *rp; + *rp = *(rp + 2); + *(rp + 2) = save; + } + } + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + png_bytep rp; + png_uint_32 i; + + for (i = 0, rp = row; i < row_width; i++, rp += 4) + { + png_byte save = *rp; + *rp = *(rp + 2); + *(rp + 2) = save; + } + } + } + else if (row_info->bit_depth == 16) + { + if (row_info->color_type == PNG_COLOR_TYPE_RGB) + { + png_bytep rp; + png_uint_32 i; + + for (i = 0, rp = row; i < row_width; i++, rp += 6) + { + png_byte save = *rp; + *rp = *(rp + 4); + *(rp + 4) = save; + save = *(rp + 1); + *(rp + 1) = *(rp + 5); + *(rp + 5) = save; + } + } + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + png_bytep rp; + png_uint_32 i; + + for (i = 0, rp = row; i < row_width; i++, rp += 8) + { + png_byte save = *rp; + *rp = *(rp + 4); + *(rp + 4) = save; + save = *(rp + 1); + *(rp + 1) = *(rp + 5); + *(rp + 5) = save; + } + } + } + } +} +#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */ + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_LEGACY_SUPPORTED) +void PNGAPI +png_set_user_transform_info(png_structp png_ptr, png_voidp + user_transform_ptr, int user_transform_depth, int user_transform_channels) +{ + png_debug(1, "in png_set_user_transform_info"); + if (png_ptr == NULL) return; +#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) + png_ptr->user_transform_ptr = user_transform_ptr; + png_ptr->user_transform_depth = (png_byte)user_transform_depth; + png_ptr->user_transform_channels = (png_byte)user_transform_channels; +#else + if (user_transform_ptr || user_transform_depth || user_transform_channels) + png_warning(png_ptr, + "This version of libpng does not support user transform info"); +#endif +} +#endif + +/* This function returns a pointer to the user_transform_ptr associated with + * the user transform functions. The application should free any memory + * associated with this pointer before png_write_destroy and png_read_destroy + * are called. + */ +png_voidp PNGAPI +png_get_user_transform_ptr(png_structp png_ptr) +{ + if (png_ptr == NULL) return (NULL); +#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) + return ((png_voidp)png_ptr->user_transform_ptr); +#else + return (NULL); +#endif +} +#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/navit/support/shapefile/Makefile.am b/navit/support/shapefile/Makefile.am new file mode 100644 index 0000000..3f5115c --- /dev/null +++ b/navit/support/shapefile/Makefile.am @@ -0,0 +1,4 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=support_shapefile +noinst_LTLIBRARIES = libsupport_shapefile.la +libsupport_shapefile_la_SOURCES = dbfopen.c shpopen.c shptree.c shapefil.h diff --git a/navit/support/shapefile/Makefile.in b/navit/support/shapefile/Makefile.in new file mode 100644 index 0000000..98d54ac --- /dev/null +++ b/navit/support/shapefile/Makefile.in @@ -0,0 +1,641 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/support/shapefile +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libsupport_shapefile_la_LIBADD = +am_libsupport_shapefile_la_OBJECTS = dbfopen.lo shpopen.lo shptree.lo +libsupport_shapefile_la_OBJECTS = \ + $(am_libsupport_shapefile_la_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libsupport_shapefile_la_SOURCES) +DIST_SOURCES = $(libsupport_shapefile_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=support_shapefile +noinst_LTLIBRARIES = libsupport_shapefile.la +libsupport_shapefile_la_SOURCES = dbfopen.c shpopen.c shptree.c shapefil.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/support/shapefile/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/support/shapefile/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libsupport_shapefile.la: $(libsupport_shapefile_la_OBJECTS) $(libsupport_shapefile_la_DEPENDENCIES) + $(LINK) $(libsupport_shapefile_la_OBJECTS) $(libsupport_shapefile_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbfopen.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpopen.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shptree.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/support/shapefile/dbfopen.c b/navit/support/shapefile/dbfopen.c new file mode 100644 index 0000000..51944fc --- /dev/null +++ b/navit/support/shapefile/dbfopen.c @@ -0,0 +1,1869 @@ +/****************************************************************************** + * $Id: dbfopen.c,v 1.83 2008/11/12 14:28:15 fwarmerdam Exp $ + * + * Project: Shapelib + * Purpose: Implementation of .dbf access API documented in dbf_api.html. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: dbfopen.c,v $ + * Revision 1.83 2008/11/12 14:28:15 fwarmerdam + * DBFCreateField() now works on files with records + * + * Revision 1.82 2008/11/11 17:47:09 fwarmerdam + * added DBFDeleteField() function + * + * Revision 1.81 2008/01/03 17:48:13 bram + * in DBFCreate, use default code page LDID/87 (= 0x57, ANSI) + * instead of LDID/3. This seems to be the same as what ESRI + * would be doing by default. + * + * Revision 1.80 2007/12/30 14:36:39 fwarmerdam + * avoid syntax issue with last comment. + * + * Revision 1.79 2007/12/30 14:35:48 fwarmerdam + * Avoid char* / unsigned char* warnings. + * + * Revision 1.78 2007/12/18 18:28:07 bram + * - create hook for client specific atof (bugzilla ticket 1615) + * - check for NULL handle before closing cpCPG file, and close after reading. + * + * Revision 1.77 2007/12/15 20:25:21 bram + * dbfopen.c now reads the Code Page information from the DBF file, and exports + * this information as a string through the DBFGetCodePage function. This is + * either the number from the LDID header field ("LDID/") or as the + * content of an accompanying .CPG file. When creating a DBF file, the code can + * be set using DBFCreateEx. + * + * Revision 1.76 2007/12/12 22:21:32 bram + * DBFClose: check for NULL psDBF handle before trying to close it. + * + * Revision 1.75 2007/12/06 13:58:19 fwarmerdam + * make sure file offset calculations are done in as SAOffset + * + * Revision 1.74 2007/12/06 07:00:25 fwarmerdam + * dbfopen now using SAHooks for fileio + * + * Revision 1.73 2007/09/03 19:48:11 fwarmerdam + * move DBFReadAttribute() static dDoubleField into dbfinfo + * + * Revision 1.72 2007/09/03 19:34:06 fwarmerdam + * Avoid use of static tuple buffer in DBFReadTuple() + * + * Revision 1.71 2006/06/22 14:37:18 fwarmerdam + * avoid memory leak if dbfopen fread fails + * + * Revision 1.70 2006/06/17 17:47:05 fwarmerdam + * use calloc() for dbfinfo in DBFCreate + * + * Revision 1.69 2006/06/17 15:34:32 fwarmerdam + * disallow creating fields wider than 255 + * + * Revision 1.68 2006/06/17 15:12:40 fwarmerdam + * Fixed C++ style comments. + * + * Revision 1.67 2006/06/17 00:24:53 fwarmerdam + * Don't treat non-zero decimals values as high order byte for length + * for strings. It causes serious corruption for some files. + * http://bugzilla.remotesensing.org/show_bug.cgi?id=1202 + * + * Revision 1.66 2006/03/29 18:26:20 fwarmerdam + * fixed bug with size of pachfieldtype in dbfcloneempty + * + * Revision 1.65 2006/02/15 01:14:30 fwarmerdam + * added DBFAddNativeFieldType + * + * Revision 1.64 2006/02/09 00:29:04 fwarmerdam + * Changed to put spaces into string fields that are NULL as + * per http://bugzilla.maptools.org/show_bug.cgi?id=316. + * + * Revision 1.63 2006/01/25 15:35:43 fwarmerdam + * check success on DBFFlushRecord + * + * Revision 1.62 2006/01/10 16:28:03 fwarmerdam + * Fixed typo in CPLError. + * + * Revision 1.61 2006/01/10 16:26:29 fwarmerdam + * Push loading record buffer into DBFLoadRecord. + * Implement CPL error reporting if USE_CPL defined. + * + * Revision 1.60 2006/01/05 01:27:27 fwarmerdam + * added dbf deletion mark/fetch + * + * Revision 1.59 2005/03/14 15:20:28 fwarmerdam + * Fixed last change. + * + * Revision 1.58 2005/03/14 15:18:54 fwarmerdam + * Treat very wide fields with no decimals as double. This is + * more than 32bit integer fields. + * + * Revision 1.57 2005/02/10 20:16:54 fwarmerdam + * Make the pszStringField buffer for DBFReadAttribute() static char [256] + * as per bug 306. + * + * Revision 1.56 2005/02/10 20:07:56 fwarmerdam + * Fixed bug 305 in DBFCloneEmpty() - header length problem. + * + * Revision 1.55 2004/09/26 20:23:46 fwarmerdam + * avoid warnings with rcsid and signed/unsigned stuff + * + * Revision 1.54 2004/09/15 16:26:10 fwarmerdam + * Treat all blank numeric fields as null too. + */ + +#include "shapefil.h" + +#include +#include +#include +#include + +#ifndef FALSE +# define FALSE 0 +# define TRUE 1 +#endif + +/************************************************************************/ +/* SfRealloc() */ +/* */ +/* A realloc cover function that will access a NULL pointer as */ +/* a valid input. */ +/************************************************************************/ + +static void * SfRealloc( void * pMem, int nNewSize ) + +{ + if( pMem == NULL ) + return( (void *) malloc(nNewSize) ); + else + return( (void *) realloc(pMem,nNewSize) ); +} + +/************************************************************************/ +/* DBFWriteHeader() */ +/* */ +/* This is called to write out the file header, and field */ +/* descriptions before writing any actual data records. This */ +/* also computes all the DBFDataSet field offset/size/decimals */ +/* and so forth values. */ +/************************************************************************/ + +static void DBFWriteHeader(DBFHandle psDBF) + +{ + unsigned char abyHeader[XBASE_FLDHDR_SZ]; + int i; + + if( !psDBF->bNoHeader ) + return; + + psDBF->bNoHeader = FALSE; + +/* -------------------------------------------------------------------- */ +/* Initialize the file header information. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < XBASE_FLDHDR_SZ; i++ ) + abyHeader[i] = 0; + + abyHeader[0] = 0x03; /* memo field? - just copying */ + + /* write out a dummy date */ + abyHeader[1] = 95; /* YY */ + abyHeader[2] = 7; /* MM */ + abyHeader[3] = 26; /* DD */ + + /* record count preset at zero */ + + abyHeader[8] = (unsigned char) (psDBF->nHeaderLength % 256); + abyHeader[9] = (unsigned char) (psDBF->nHeaderLength / 256); + + abyHeader[10] = (unsigned char) (psDBF->nRecordLength % 256); + abyHeader[11] = (unsigned char) (psDBF->nRecordLength / 256); + + abyHeader[29] = (unsigned char) (psDBF->iLanguageDriver); + +/* -------------------------------------------------------------------- */ +/* Write the initial 32 byte file header, and all the field */ +/* descriptions. */ +/* -------------------------------------------------------------------- */ + psDBF->sHooks.FSeek( psDBF->fp, 0, 0 ); + psDBF->sHooks.FWrite( abyHeader, XBASE_FLDHDR_SZ, 1, psDBF->fp ); + psDBF->sHooks.FWrite( psDBF->pszHeader, XBASE_FLDHDR_SZ, psDBF->nFields, + psDBF->fp ); + +/* -------------------------------------------------------------------- */ +/* Write out the newline character if there is room for it. */ +/* -------------------------------------------------------------------- */ + if( psDBF->nHeaderLength > 32*psDBF->nFields + 32 ) + { + char cNewline; + + cNewline = 0x0d; + psDBF->sHooks.FWrite( &cNewline, 1, 1, psDBF->fp ); + } +} + +/************************************************************************/ +/* DBFFlushRecord() */ +/* */ +/* Write out the current record if there is one. */ +/************************************************************************/ + +static int DBFFlushRecord( DBFHandle psDBF ) + +{ + SAOffset nRecordOffset; + + if( psDBF->bCurrentRecordModified && psDBF->nCurrentRecord > -1 ) + { + psDBF->bCurrentRecordModified = FALSE; + + nRecordOffset = + psDBF->nRecordLength * (SAOffset) psDBF->nCurrentRecord + + psDBF->nHeaderLength; + + if( psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ) != 0 + || psDBF->sHooks.FWrite( psDBF->pszCurrentRecord, + psDBF->nRecordLength, + 1, psDBF->fp ) != 1 ) + { +#ifdef USE_CPL + CPLError( CE_Failure, CPLE_FileIO, + "Failure writing DBF record %d.", + psDBF->nCurrentRecord ); +#else + fprintf( stderr, "Failure writing DBF record %d.", + psDBF->nCurrentRecord ); +#endif + return FALSE; + } + } + + return TRUE; +} + +/************************************************************************/ +/* DBFLoadRecord() */ +/************************************************************************/ + +static int DBFLoadRecord( DBFHandle psDBF, int iRecord ) + +{ + if( psDBF->nCurrentRecord != iRecord ) + { + SAOffset nRecordOffset; + + if( !DBFFlushRecord( psDBF ) ) + return FALSE; + + nRecordOffset = + psDBF->nRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; + + if( psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, SEEK_SET ) != 0 ) + { +#ifdef USE_CPL + CPLError( CE_Failure, CPLE_FileIO, + "fseek(%ld) failed on DBF file.\n", + (long) nRecordOffset ); +#else + fprintf( stderr, "fseek(%ld) failed on DBF file.\n", + (long) nRecordOffset ); +#endif + return FALSE; + } + + if( psDBF->sHooks.FRead( psDBF->pszCurrentRecord, + psDBF->nRecordLength, 1, psDBF->fp ) != 1 ) + { +#ifdef USE_CPL + CPLError( CE_Failure, CPLE_FileIO, + "fread(%d) failed on DBF file.\n", + psDBF->nRecordLength ); +#else + fprintf( stderr, "fread(%d) failed on DBF file.\n", + psDBF->nRecordLength ); +#endif + return FALSE; + } + + psDBF->nCurrentRecord = iRecord; + } + + return TRUE; +} + +/************************************************************************/ +/* DBFUpdateHeader() */ +/************************************************************************/ + +void SHPAPI_CALL +DBFUpdateHeader( DBFHandle psDBF ) + +{ + unsigned char abyFileHeader[32]; + + if( psDBF->bNoHeader ) + DBFWriteHeader( psDBF ); + + DBFFlushRecord( psDBF ); + + psDBF->sHooks.FSeek( psDBF->fp, 0, 0 ); + psDBF->sHooks.FRead( abyFileHeader, 32, 1, psDBF->fp ); + + abyFileHeader[4] = (unsigned char) (psDBF->nRecords % 256); + abyFileHeader[5] = (unsigned char) ((psDBF->nRecords/256) % 256); + abyFileHeader[6] = (unsigned char) ((psDBF->nRecords/(256*256)) % 256); + abyFileHeader[7] = (unsigned char) ((psDBF->nRecords/(256*256*256)) % 256); + + psDBF->sHooks.FSeek( psDBF->fp, 0, 0 ); + psDBF->sHooks.FWrite( abyFileHeader, 32, 1, psDBF->fp ); + + psDBF->sHooks.FFlush( psDBF->fp ); +} + +/************************************************************************/ +/* DBFOpen() */ +/* */ +/* Open a .dbf file. */ +/************************************************************************/ + +DBFHandle SHPAPI_CALL +DBFOpen( const char * pszFilename, const char * pszAccess ) + +{ + SAHooks sHooks; + + SASetupDefaultHooks( &sHooks ); + + return DBFOpenLL( pszFilename, pszAccess, &sHooks ); +} + +/************************************************************************/ +/* DBFOpen() */ +/* */ +/* Open a .dbf file. */ +/************************************************************************/ + +DBFHandle SHPAPI_CALL +DBFOpenLL( const char * pszFilename, const char * pszAccess, SAHooks *psHooks ) + +{ + DBFHandle psDBF; + SAFile pfCPG; + unsigned char *pabyBuf; + int nFields, nHeadLen, iField, i; + char *pszBasename, *pszFullname; + int nBufSize = 500; + +/* -------------------------------------------------------------------- */ +/* We only allow the access strings "rb" and "r+". */ +/* -------------------------------------------------------------------- */ + if( strcmp(pszAccess,"r") != 0 && strcmp(pszAccess,"r+") != 0 + && strcmp(pszAccess,"rb") != 0 && strcmp(pszAccess,"rb+") != 0 + && strcmp(pszAccess,"r+b") != 0 ) + return( NULL ); + + if( strcmp(pszAccess,"r") == 0 ) + pszAccess = "rb"; + + if( strcmp(pszAccess,"r+") == 0 ) + pszAccess = "rb+"; + +/* -------------------------------------------------------------------- */ +/* Compute the base (layer) name. If there is any extension */ +/* on the passed in filename we will strip it off. */ +/* -------------------------------------------------------------------- */ + pszBasename = (char *) malloc(strlen(pszFilename)+5); + strcpy( pszBasename, pszFilename ); + for( i = strlen(pszBasename)-1; + i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' + && pszBasename[i] != '\\'; + i-- ) {} + + if( pszBasename[i] == '.' ) + pszBasename[i] = '\0'; + + pszFullname = (char *) malloc(strlen(pszBasename) + 5); + sprintf( pszFullname, "%s.dbf", pszBasename ); + + psDBF = (DBFHandle) calloc( 1, sizeof(DBFInfo) ); + psDBF->fp = psHooks->FOpen( pszFullname, pszAccess ); + memcpy( &(psDBF->sHooks), psHooks, sizeof(SAHooks) ); + + if( psDBF->fp == NULL ) + { + sprintf( pszFullname, "%s.DBF", pszBasename ); + psDBF->fp = psDBF->sHooks.FOpen(pszFullname, pszAccess ); + } + + sprintf( pszFullname, "%s.cpg", pszBasename ); + pfCPG = psHooks->FOpen( pszFullname, "r" ); + if( pfCPG == NULL ) + { + sprintf( pszFullname, "%s.CPG", pszBasename ); + pfCPG = psHooks->FOpen( pszFullname, "r" ); + } + + free( pszBasename ); + free( pszFullname ); + + if( psDBF->fp == NULL ) + { + free( psDBF ); + if( pfCPG ) psHooks->FClose( pfCPG ); + return( NULL ); + } + + psDBF->bNoHeader = FALSE; + psDBF->nCurrentRecord = -1; + psDBF->bCurrentRecordModified = FALSE; + +/* -------------------------------------------------------------------- */ +/* Read Table Header info */ +/* -------------------------------------------------------------------- */ + pabyBuf = (unsigned char *) malloc(nBufSize); + if( psDBF->sHooks.FRead( pabyBuf, 32, 1, psDBF->fp ) != 1 ) + { + psDBF->sHooks.FClose( psDBF->fp ); + if( pfCPG ) psDBF->sHooks.FClose( pfCPG ); + free( pabyBuf ); + free( psDBF ); + return NULL; + } + + psDBF->nRecords = + pabyBuf[4] + pabyBuf[5]*256 + pabyBuf[6]*256*256 + pabyBuf[7]*256*256*256; + + psDBF->nHeaderLength = nHeadLen = pabyBuf[8] + pabyBuf[9]*256; + psDBF->nRecordLength = pabyBuf[10] + pabyBuf[11]*256; + psDBF->iLanguageDriver = pabyBuf[29]; + + psDBF->nFields = nFields = (nHeadLen - 32) / 32; + + psDBF->pszCurrentRecord = (char *) malloc(psDBF->nRecordLength); + +/* -------------------------------------------------------------------- */ +/* Figure out the code page from the LDID and CPG */ +/* -------------------------------------------------------------------- */ + + psDBF->pszCodePage = NULL; + if( pfCPG ) + { + size_t n; + char *buffer = (char *) pabyBuf; + buffer[0] = '\0'; + psDBF->sHooks.FRead( pabyBuf, nBufSize - 1, 1, pfCPG ); + n = strcspn( (char *) pabyBuf, "\n\r" ); + if( n > 0 ) + { + pabyBuf[n] = '\0'; + psDBF->pszCodePage = (char *) malloc(n + 1); + memcpy( psDBF->pszCodePage, pabyBuf, n + 1 ); + } + psDBF->sHooks.FClose( pfCPG ); + } + if( psDBF->pszCodePage == NULL && pabyBuf[29] != 0 ) + { + sprintf( (char *) pabyBuf, "LDID/%d", psDBF->iLanguageDriver ); + psDBF->pszCodePage = (char *) malloc(strlen((char*)pabyBuf) + 1); + strcpy( psDBF->pszCodePage, (char *) pabyBuf ); + } + +/* -------------------------------------------------------------------- */ +/* Read in Field Definitions */ +/* -------------------------------------------------------------------- */ + + pabyBuf = (unsigned char *) SfRealloc(pabyBuf,nHeadLen); + psDBF->pszHeader = (char *) pabyBuf; + + psDBF->sHooks.FSeek( psDBF->fp, 32, 0 ); + if( psDBF->sHooks.FRead( pabyBuf, nHeadLen-32, 1, psDBF->fp ) != 1 ) + { + psDBF->sHooks.FClose( psDBF->fp ); + free( pabyBuf ); + free( psDBF->pszCurrentRecord ); + free( psDBF ); + return NULL; + } + + psDBF->panFieldOffset = (int *) malloc(sizeof(int) * nFields); + psDBF->panFieldSize = (int *) malloc(sizeof(int) * nFields); + psDBF->panFieldDecimals = (int *) malloc(sizeof(int) * nFields); + psDBF->pachFieldType = (char *) malloc(sizeof(char) * nFields); + + for( iField = 0; iField < nFields; iField++ ) + { + unsigned char *pabyFInfo; + + pabyFInfo = pabyBuf+iField*32; + + if( pabyFInfo[11] == 'N' || pabyFInfo[11] == 'F' ) + { + psDBF->panFieldSize[iField] = pabyFInfo[16]; + psDBF->panFieldDecimals[iField] = pabyFInfo[17]; + } + else + { + psDBF->panFieldSize[iField] = pabyFInfo[16]; + psDBF->panFieldDecimals[iField] = 0; + +/* +** The following seemed to be used sometimes to handle files with long +** string fields, but in other cases (such as bug 1202) the decimals field +** just seems to indicate some sort of preferred formatting, not very +** wide fields. So I have disabled this code. FrankW. + psDBF->panFieldSize[iField] = pabyFInfo[16] + pabyFInfo[17]*256; + psDBF->panFieldDecimals[iField] = 0; +*/ + } + + psDBF->pachFieldType[iField] = (char) pabyFInfo[11]; + if( iField == 0 ) + psDBF->panFieldOffset[iField] = 1; + else + psDBF->panFieldOffset[iField] = + psDBF->panFieldOffset[iField-1] + psDBF->panFieldSize[iField-1]; + } + + return( psDBF ); +} + +/************************************************************************/ +/* DBFClose() */ +/************************************************************************/ + +void SHPAPI_CALL +DBFClose(DBFHandle psDBF) +{ + if( psDBF == NULL ) + return; + +/* -------------------------------------------------------------------- */ +/* Write out header if not already written. */ +/* -------------------------------------------------------------------- */ + if( psDBF->bNoHeader ) + DBFWriteHeader( psDBF ); + + DBFFlushRecord( psDBF ); + +/* -------------------------------------------------------------------- */ +/* Update last access date, and number of records if we have */ +/* write access. */ +/* -------------------------------------------------------------------- */ + if( psDBF->bUpdated ) + DBFUpdateHeader( psDBF ); + +/* -------------------------------------------------------------------- */ +/* Close, and free resources. */ +/* -------------------------------------------------------------------- */ + psDBF->sHooks.FClose( psDBF->fp ); + + if( psDBF->panFieldOffset != NULL ) + { + free( psDBF->panFieldOffset ); + free( psDBF->panFieldSize ); + free( psDBF->panFieldDecimals ); + free( psDBF->pachFieldType ); + } + + if( psDBF->pszWorkField != NULL ) + free( psDBF->pszWorkField ); + + free( psDBF->pszHeader ); + free( psDBF->pszCurrentRecord ); + free( psDBF->pszCodePage ); + + free( psDBF ); +} + +/************************************************************************/ +/* DBFCreate() */ +/* */ +/* Create a new .dbf file with default code page LDID/87 (0x57) */ +/************************************************************************/ + +DBFHandle SHPAPI_CALL +DBFCreate( const char * pszFilename ) + +{ + return DBFCreateEx( pszFilename, "LDID/87" ); // 0x57 +} + +/************************************************************************/ +/* DBFCreateEx() */ +/* */ +/* Create a new .dbf file. */ +/************************************************************************/ + +DBFHandle SHPAPI_CALL +DBFCreateEx( const char * pszFilename, const char* pszCodePage ) + +{ + SAHooks sHooks; + + SASetupDefaultHooks( &sHooks ); + + return DBFCreateLL( pszFilename, pszCodePage , &sHooks ); +} + +/************************************************************************/ +/* DBFCreate() */ +/* */ +/* Create a new .dbf file. */ +/************************************************************************/ + +DBFHandle SHPAPI_CALL +DBFCreateLL( const char * pszFilename, const char * pszCodePage, SAHooks *psHooks ) + +{ + DBFHandle psDBF; + SAFile fp; + char *pszFullname, *pszBasename; + int i, ldid = -1; + char chZero = '\0'; + +/* -------------------------------------------------------------------- */ +/* Compute the base (layer) name. If there is any extension */ +/* on the passed in filename we will strip it off. */ +/* -------------------------------------------------------------------- */ + pszBasename = (char *) malloc(strlen(pszFilename)+5); + strcpy( pszBasename, pszFilename ); + for( i = strlen(pszBasename)-1; + i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' + && pszBasename[i] != '\\'; + i-- ) {} + + if( pszBasename[i] == '.' ) + pszBasename[i] = '\0'; + + pszFullname = (char *) malloc(strlen(pszBasename) + 5); + sprintf( pszFullname, "%s.dbf", pszBasename ); + +/* -------------------------------------------------------------------- */ +/* Create the file. */ +/* -------------------------------------------------------------------- */ + fp = psHooks->FOpen( pszFullname, "wb" ); + if( fp == NULL ) + return( NULL ); + + psHooks->FWrite( &chZero, 1, 1, fp ); + psHooks->FClose( fp ); + + fp = psHooks->FOpen( pszFullname, "rb+" ); + if( fp == NULL ) + return( NULL ); + + + sprintf( pszFullname, "%s.cpg", pszBasename ); + if( pszCodePage != NULL ) + { + if( strncmp( pszCodePage, "LDID/", 5 ) == 0 ) + { + ldid = atoi( pszCodePage + 5 ); + if( ldid > 255 ) + ldid = -1; // don't use 0 to indicate out of range as LDID/0 is a valid one + } + if( ldid < 0 ) + { + SAFile fpCPG = psHooks->FOpen( pszFullname, "w" ); + psHooks->FWrite( (char*) pszCodePage, strlen(pszCodePage), 1, fpCPG ); + psHooks->FClose( fpCPG ); + } + } + if( pszCodePage == NULL || ldid >= 0 ) + { + psHooks->Remove( pszFullname ); + } + + free( pszBasename ); + free( pszFullname ); + +/* -------------------------------------------------------------------- */ +/* Create the info structure. */ +/* -------------------------------------------------------------------- */ + psDBF = (DBFHandle) calloc(1,sizeof(DBFInfo)); + + memcpy( &(psDBF->sHooks), psHooks, sizeof(SAHooks) ); + psDBF->fp = fp; + psDBF->nRecords = 0; + psDBF->nFields = 0; + psDBF->nRecordLength = 1; + psDBF->nHeaderLength = 33; + + psDBF->panFieldOffset = NULL; + psDBF->panFieldSize = NULL; + psDBF->panFieldDecimals = NULL; + psDBF->pachFieldType = NULL; + psDBF->pszHeader = NULL; + + psDBF->nCurrentRecord = -1; + psDBF->bCurrentRecordModified = FALSE; + psDBF->pszCurrentRecord = NULL; + + psDBF->bNoHeader = TRUE; + + psDBF->iLanguageDriver = ldid > 0 ? ldid : 0; + psDBF->pszCodePage = NULL; + if( pszCodePage ) + { + psDBF->pszCodePage = (char * ) malloc( strlen(pszCodePage) + 1 ); + strcpy( psDBF->pszCodePage, pszCodePage ); + } + + return( psDBF ); +} + +/************************************************************************/ +/* DBFAddField() */ +/* */ +/* Add a field to a newly created .dbf or to an existing one */ +/************************************************************************/ + +int SHPAPI_CALL +DBFAddField(DBFHandle psDBF, const char * pszFieldName, + DBFFieldType eType, int nWidth, int nDecimals ) + +{ + char chNativeType = 'C'; + + if( eType == FTLogical ) + chNativeType = 'L'; + else if( eType == FTString ) + chNativeType = 'C'; + else + chNativeType = 'N'; + + return DBFAddNativeFieldType( psDBF, pszFieldName, chNativeType, + nWidth, nDecimals ); +} + +/************************************************************************/ +/* DBFAddField() */ +/* */ +/* Add a field to a newly created .dbf file before any records */ +/* are written. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFAddNativeFieldType(DBFHandle psDBF, const char * pszFieldName, + char chType, int nWidth, int nDecimals ) + +{ + char *pszFInfo; + int i; + int nOldRecordLength, nOldHeaderLength; + char *pszRecord; + char chFieldFill; + SAOffset nRecordOffset; + +/* -------------------------------------------------------------------- */ +/* Do some checking to ensure we can add records to this file. */ +/* -------------------------------------------------------------------- */ + if( nWidth < 1 ) + return -1; + + if( nWidth > 255 ) + nWidth = 255; + + nOldRecordLength = psDBF->nRecordLength; + nOldHeaderLength = psDBF->nHeaderLength; + +/* -------------------------------------------------------------------- */ +/* SfRealloc all the arrays larger to hold the additional field */ +/* information. */ +/* -------------------------------------------------------------------- */ + psDBF->nFields++; + + psDBF->panFieldOffset = (int *) + SfRealloc( psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); + + psDBF->panFieldSize = (int *) + SfRealloc( psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); + + psDBF->panFieldDecimals = (int *) + SfRealloc( psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); + + psDBF->pachFieldType = (char *) + SfRealloc( psDBF->pachFieldType, sizeof(char) * psDBF->nFields ); + +/* -------------------------------------------------------------------- */ +/* Assign the new field information fields. */ +/* -------------------------------------------------------------------- */ + psDBF->panFieldOffset[psDBF->nFields-1] = psDBF->nRecordLength; + psDBF->nRecordLength += nWidth; + psDBF->panFieldSize[psDBF->nFields-1] = nWidth; + psDBF->panFieldDecimals[psDBF->nFields-1] = nDecimals; + psDBF->pachFieldType[psDBF->nFields-1] = chType; + +/* -------------------------------------------------------------------- */ +/* Extend the required header information. */ +/* -------------------------------------------------------------------- */ + psDBF->nHeaderLength += 32; + psDBF->bUpdated = FALSE; + + psDBF->pszHeader = (char *) SfRealloc(psDBF->pszHeader,psDBF->nFields*32); + + pszFInfo = psDBF->pszHeader + 32 * (psDBF->nFields-1); + + for( i = 0; i < 32; i++ ) + pszFInfo[i] = '\0'; + + if( (int) strlen(pszFieldName) < 10 ) + strncpy( pszFInfo, pszFieldName, strlen(pszFieldName)); + else + strncpy( pszFInfo, pszFieldName, 10); + + pszFInfo[11] = psDBF->pachFieldType[psDBF->nFields-1]; + + if( chType == 'C' ) + { + pszFInfo[16] = (unsigned char) (nWidth % 256); + pszFInfo[17] = (unsigned char) (nWidth / 256); + } + else + { + pszFInfo[16] = (unsigned char) nWidth; + pszFInfo[17] = (unsigned char) nDecimals; + } + +/* -------------------------------------------------------------------- */ +/* Make the current record buffer appropriately larger. */ +/* -------------------------------------------------------------------- */ + psDBF->pszCurrentRecord = (char *) SfRealloc(psDBF->pszCurrentRecord, + psDBF->nRecordLength); + + /* we're done if dealing with new .dbf */ + if( psDBF->bNoHeader ) + return( psDBF->nFields - 1 ); + +/* -------------------------------------------------------------------- */ +/* For existing .dbf file, shift records */ +/* -------------------------------------------------------------------- */ + + /* alloc record */ + pszRecord = (char *) malloc(sizeof(char) * psDBF->nRecordLength); + + switch (chType) + { + case 'N': + case 'F': + chFieldFill = '*'; + break; + case 'D': + chFieldFill = '0'; + break; + case 'L': + chFieldFill = '?'; + break; + default: + chFieldFill = ' '; + break; + } + + for (i = psDBF->nRecords-1; i >= 0; --i) + { + nRecordOffset = nOldRecordLength * (SAOffset) i + nOldHeaderLength; + + /* load record */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FRead( pszRecord, nOldRecordLength, 1, psDBF->fp ); + + /* set new field's value to NULL */ + memset(pszRecord + nOldRecordLength, chFieldFill, nWidth); + + nRecordOffset = psDBF->nRecordLength * (SAOffset) i + psDBF->nHeaderLength; + + /* move record to the new place*/ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FWrite( pszRecord, psDBF->nRecordLength, 1, psDBF->fp ); + } + + /* free record */ + free(pszRecord); + + /* force update of header with new header, record length and new field */ + psDBF->bNoHeader = TRUE; + DBFUpdateHeader( psDBF ); + + return( psDBF->nFields-1 ); +} + +/************************************************************************/ +/* DBFReadAttribute() */ +/* */ +/* Read one of the attribute fields of a record. */ +/************************************************************************/ + +static void *DBFReadAttribute(DBFHandle psDBF, int hEntity, int iField, + char chReqType ) + +{ + unsigned char *pabyRec; + void *pReturnField = NULL; + +/* -------------------------------------------------------------------- */ +/* Verify selection. */ +/* -------------------------------------------------------------------- */ + if( hEntity < 0 || hEntity >= psDBF->nRecords ) + return( NULL ); + + if( iField < 0 || iField >= psDBF->nFields ) + return( NULL ); + +/* -------------------------------------------------------------------- */ +/* Have we read the record? */ +/* -------------------------------------------------------------------- */ + if( !DBFLoadRecord( psDBF, hEntity ) ) + return NULL; + + pabyRec = (unsigned char *) psDBF->pszCurrentRecord; + +/* -------------------------------------------------------------------- */ +/* Ensure we have room to extract the target field. */ +/* -------------------------------------------------------------------- */ + if( psDBF->panFieldSize[iField] >= psDBF->nWorkFieldLength ) + { + psDBF->nWorkFieldLength = psDBF->panFieldSize[iField] + 100; + if( psDBF->pszWorkField == NULL ) + psDBF->pszWorkField = (char *) malloc(psDBF->nWorkFieldLength); + else + psDBF->pszWorkField = (char *) realloc(psDBF->pszWorkField, + psDBF->nWorkFieldLength); + } + +/* -------------------------------------------------------------------- */ +/* Extract the requested field. */ +/* -------------------------------------------------------------------- */ + strncpy( psDBF->pszWorkField, + ((const char *) pabyRec) + psDBF->panFieldOffset[iField], + psDBF->panFieldSize[iField] ); + psDBF->pszWorkField[psDBF->panFieldSize[iField]] = '\0'; + + pReturnField = psDBF->pszWorkField; + +/* -------------------------------------------------------------------- */ +/* Decode the field. */ +/* -------------------------------------------------------------------- */ + if( chReqType == 'N' ) + { + psDBF->dfDoubleField = psDBF->sHooks.Atof(psDBF->pszWorkField); + + pReturnField = &(psDBF->dfDoubleField); + } + +/* -------------------------------------------------------------------- */ +/* Should we trim white space off the string attribute value? */ +/* -------------------------------------------------------------------- */ +#ifdef TRIM_DBF_WHITESPACE + else + { + char *pchSrc, *pchDst; + + pchDst = pchSrc = psDBF->pszWorkField; + while( *pchSrc == ' ' ) + pchSrc++; + + while( *pchSrc != '\0' ) + *(pchDst++) = *(pchSrc++); + *pchDst = '\0'; + + while( pchDst != psDBF->pszWorkField && *(--pchDst) == ' ' ) + *pchDst = '\0'; + } +#endif + + return( pReturnField ); +} + +/************************************************************************/ +/* DBFReadIntAttribute() */ +/* */ +/* Read an integer attribute. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFReadIntegerAttribute( DBFHandle psDBF, int iRecord, int iField ) + +{ + double *pdValue; + + pdValue = (double *) DBFReadAttribute( psDBF, iRecord, iField, 'N' ); + + if( pdValue == NULL ) + return 0; + else + return( (int) *pdValue ); +} + +/************************************************************************/ +/* DBFReadDoubleAttribute() */ +/* */ +/* Read a double attribute. */ +/************************************************************************/ + +double SHPAPI_CALL +DBFReadDoubleAttribute( DBFHandle psDBF, int iRecord, int iField ) + +{ + double *pdValue; + + pdValue = (double *) DBFReadAttribute( psDBF, iRecord, iField, 'N' ); + + if( pdValue == NULL ) + return 0.0; + else + return( *pdValue ); +} + +/************************************************************************/ +/* DBFReadStringAttribute() */ +/* */ +/* Read a string attribute. */ +/************************************************************************/ + +const char SHPAPI_CALL1(*) +DBFReadStringAttribute( DBFHandle psDBF, int iRecord, int iField ) + +{ + return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'C' ) ); +} + +/************************************************************************/ +/* DBFReadLogicalAttribute() */ +/* */ +/* Read a logical attribute. */ +/************************************************************************/ + +const char SHPAPI_CALL1(*) +DBFReadLogicalAttribute( DBFHandle psDBF, int iRecord, int iField ) + +{ + return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'L' ) ); +} + +/************************************************************************/ +/* DBFIsAttributeNULL() */ +/* */ +/* Return TRUE if value for field is NULL. */ +/* */ +/* Contributed by Jim Matthews. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFIsAttributeNULL( DBFHandle psDBF, int iRecord, int iField ) + +{ + const char *pszValue; + int i; + + pszValue = DBFReadStringAttribute( psDBF, iRecord, iField ); + + if( pszValue == NULL ) + return TRUE; + + switch(psDBF->pachFieldType[iField]) + { + case 'N': + case 'F': + /* + ** We accept all asterisks or all blanks as NULL + ** though according to the spec I think it should be all + ** asterisks. + */ + if( pszValue[0] == '*' ) + return TRUE; + + for( i = 0; pszValue[i] != '\0'; i++ ) + { + if( pszValue[i] != ' ' ) + return FALSE; + } + return TRUE; + + case 'D': + /* NULL date fields have value "00000000" */ + return strncmp(pszValue,"00000000",8) == 0; + + case 'L': + /* NULL boolean fields have value "?" */ + return pszValue[0] == '?'; + + default: + /* empty string fields are considered NULL */ + return strlen(pszValue) == 0; + } +} + +/************************************************************************/ +/* DBFGetFieldCount() */ +/* */ +/* Return the number of fields in this table. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFGetFieldCount( DBFHandle psDBF ) + +{ + return( psDBF->nFields ); +} + +/************************************************************************/ +/* DBFGetRecordCount() */ +/* */ +/* Return the number of records in this table. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFGetRecordCount( DBFHandle psDBF ) + +{ + return( psDBF->nRecords ); +} + +/************************************************************************/ +/* DBFGetFieldInfo() */ +/* */ +/* Return any requested information about the field. */ +/************************************************************************/ + +DBFFieldType SHPAPI_CALL +DBFGetFieldInfo( DBFHandle psDBF, int iField, char * pszFieldName, + int * pnWidth, int * pnDecimals ) + +{ + if( iField < 0 || iField >= psDBF->nFields ) + return( FTInvalid ); + + if( pnWidth != NULL ) + *pnWidth = psDBF->panFieldSize[iField]; + + if( pnDecimals != NULL ) + *pnDecimals = psDBF->panFieldDecimals[iField]; + + if( pszFieldName != NULL ) + { + int i; + + strncpy( pszFieldName, (char *) psDBF->pszHeader+iField*32, 11 ); + pszFieldName[11] = '\0'; + for( i = 10; i > 0 && pszFieldName[i] == ' '; i-- ) + pszFieldName[i] = '\0'; + } + + if ( psDBF->pachFieldType[iField] == 'L' ) + return( FTLogical); + + else if( psDBF->pachFieldType[iField] == 'N' + || psDBF->pachFieldType[iField] == 'F' ) + { + if( psDBF->panFieldDecimals[iField] > 0 + || psDBF->panFieldSize[iField] > 10 ) + return( FTDouble ); + else + return( FTInteger ); + } + else + { + return( FTString ); + } +} + +/************************************************************************/ +/* DBFWriteAttribute() */ +/* */ +/* Write an attribute record to the file. */ +/************************************************************************/ + +static int DBFWriteAttribute(DBFHandle psDBF, int hEntity, int iField, + void * pValue ) + +{ + int i, j, nRetResult = TRUE; + unsigned char *pabyRec; + char szSField[400], szFormat[20]; + +/* -------------------------------------------------------------------- */ +/* Is this a valid record? */ +/* -------------------------------------------------------------------- */ + if( hEntity < 0 || hEntity > psDBF->nRecords ) + return( FALSE ); + + if( psDBF->bNoHeader ) + DBFWriteHeader(psDBF); + +/* -------------------------------------------------------------------- */ +/* Is this a brand new record? */ +/* -------------------------------------------------------------------- */ + if( hEntity == psDBF->nRecords ) + { + if( !DBFFlushRecord( psDBF ) ) + return FALSE; + + psDBF->nRecords++; + for( i = 0; i < psDBF->nRecordLength; i++ ) + psDBF->pszCurrentRecord[i] = ' '; + + psDBF->nCurrentRecord = hEntity; + } + +/* -------------------------------------------------------------------- */ +/* Is this an existing record, but different than the last one */ +/* we accessed? */ +/* -------------------------------------------------------------------- */ + if( !DBFLoadRecord( psDBF, hEntity ) ) + return FALSE; + + pabyRec = (unsigned char *) psDBF->pszCurrentRecord; + + psDBF->bCurrentRecordModified = TRUE; + psDBF->bUpdated = TRUE; + +/* -------------------------------------------------------------------- */ +/* Translate NULL value to valid DBF file representation. */ +/* */ +/* Contributed by Jim Matthews. */ +/* -------------------------------------------------------------------- */ + if( pValue == NULL ) + { + switch(psDBF->pachFieldType[iField]) + { + case 'N': + case 'F': + /* NULL numeric fields have value "****************" */ + memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '*', + psDBF->panFieldSize[iField] ); + break; + + case 'D': + /* NULL date fields have value "00000000" */ + memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '0', + psDBF->panFieldSize[iField] ); + break; + + case 'L': + /* NULL boolean fields have value "?" */ + memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '?', + psDBF->panFieldSize[iField] ); + break; + + default: + /* empty string fields are considered NULL */ + memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), ' ', + psDBF->panFieldSize[iField] ); + break; + } + return TRUE; + } + +/* -------------------------------------------------------------------- */ +/* Assign all the record fields. */ +/* -------------------------------------------------------------------- */ + switch( psDBF->pachFieldType[iField] ) + { + case 'D': + case 'N': + case 'F': + if( psDBF->panFieldDecimals[iField] == 0 ) + { + int nWidth = psDBF->panFieldSize[iField]; + + if( (int) sizeof(szSField)-2 < nWidth ) + nWidth = sizeof(szSField)-2; + + sprintf( szFormat, "%%%dd", nWidth ); + sprintf(szSField, szFormat, (int) *((double *) pValue) ); + if( (int)strlen(szSField) > psDBF->panFieldSize[iField] ) + { + szSField[psDBF->panFieldSize[iField]] = '\0'; + nRetResult = FALSE; + } + + strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), + szSField, strlen(szSField) ); + } + else + { + int nWidth = psDBF->panFieldSize[iField]; + + if( (int) sizeof(szSField)-2 < nWidth ) + nWidth = sizeof(szSField)-2; + + sprintf( szFormat, "%%%d.%df", + nWidth, psDBF->panFieldDecimals[iField] ); + sprintf(szSField, szFormat, *((double *) pValue) ); + if( (int) strlen(szSField) > psDBF->panFieldSize[iField] ) + { + szSField[psDBF->panFieldSize[iField]] = '\0'; + nRetResult = FALSE; + } + strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), + szSField, strlen(szSField) ); + } + break; + + case 'L': + if (psDBF->panFieldSize[iField] >= 1 && + (*(char*)pValue == 'F' || *(char*)pValue == 'T')) + *(pabyRec+psDBF->panFieldOffset[iField]) = *(char*)pValue; + break; + + default: + if( (int) strlen((char *) pValue) > psDBF->panFieldSize[iField] ) + { + j = psDBF->panFieldSize[iField]; + nRetResult = FALSE; + } + else + { + memset( pabyRec+psDBF->panFieldOffset[iField], ' ', + psDBF->panFieldSize[iField] ); + j = strlen((char *) pValue); + } + + strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), + (char *) pValue, j ); + break; + } + + return( nRetResult ); +} + +/************************************************************************/ +/* DBFWriteAttributeDirectly() */ +/* */ +/* Write an attribute record to the file, but without any */ +/* reformatting based on type. The provided buffer is written */ +/* as is to the field position in the record. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField, + void * pValue ) + +{ + int i, j; + unsigned char *pabyRec; + +/* -------------------------------------------------------------------- */ +/* Is this a valid record? */ +/* -------------------------------------------------------------------- */ + if( hEntity < 0 || hEntity > psDBF->nRecords ) + return( FALSE ); + + if( psDBF->bNoHeader ) + DBFWriteHeader(psDBF); + +/* -------------------------------------------------------------------- */ +/* Is this a brand new record? */ +/* -------------------------------------------------------------------- */ + if( hEntity == psDBF->nRecords ) + { + if( !DBFFlushRecord( psDBF ) ) + return FALSE; + + psDBF->nRecords++; + for( i = 0; i < psDBF->nRecordLength; i++ ) + psDBF->pszCurrentRecord[i] = ' '; + + psDBF->nCurrentRecord = hEntity; + } + +/* -------------------------------------------------------------------- */ +/* Is this an existing record, but different than the last one */ +/* we accessed? */ +/* -------------------------------------------------------------------- */ + if( !DBFLoadRecord( psDBF, hEntity ) ) + return FALSE; + + pabyRec = (unsigned char *) psDBF->pszCurrentRecord; + +/* -------------------------------------------------------------------- */ +/* Assign all the record fields. */ +/* -------------------------------------------------------------------- */ + if( (int)strlen((char *) pValue) > psDBF->panFieldSize[iField] ) + j = psDBF->panFieldSize[iField]; + else + { + memset( pabyRec+psDBF->panFieldOffset[iField], ' ', + psDBF->panFieldSize[iField] ); + j = strlen((char *) pValue); + } + + strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), + (char *) pValue, j ); + + psDBF->bCurrentRecordModified = TRUE; + psDBF->bUpdated = TRUE; + + return( TRUE ); +} + +/************************************************************************/ +/* DBFWriteDoubleAttribute() */ +/* */ +/* Write a double attribute. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteDoubleAttribute( DBFHandle psDBF, int iRecord, int iField, + double dValue ) + +{ + return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) &dValue ) ); +} + +/************************************************************************/ +/* DBFWriteIntegerAttribute() */ +/* */ +/* Write a integer attribute. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteIntegerAttribute( DBFHandle psDBF, int iRecord, int iField, + int nValue ) + +{ + double dValue = nValue; + + return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) &dValue ) ); +} + +/************************************************************************/ +/* DBFWriteStringAttribute() */ +/* */ +/* Write a string attribute. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteStringAttribute( DBFHandle psDBF, int iRecord, int iField, + const char * pszValue ) + +{ + return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) pszValue ) ); +} + +/************************************************************************/ +/* DBFWriteNULLAttribute() */ +/* */ +/* Write a string attribute. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteNULLAttribute( DBFHandle psDBF, int iRecord, int iField ) + +{ + return( DBFWriteAttribute( psDBF, iRecord, iField, NULL ) ); +} + +/************************************************************************/ +/* DBFWriteLogicalAttribute() */ +/* */ +/* Write a logical attribute. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteLogicalAttribute( DBFHandle psDBF, int iRecord, int iField, + const char lValue) + +{ + return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) (&lValue) ) ); +} + +/************************************************************************/ +/* DBFWriteTuple() */ +/* */ +/* Write an attribute record to the file. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple ) + +{ + int i; + unsigned char *pabyRec; + +/* -------------------------------------------------------------------- */ +/* Is this a valid record? */ +/* -------------------------------------------------------------------- */ + if( hEntity < 0 || hEntity > psDBF->nRecords ) + return( FALSE ); + + if( psDBF->bNoHeader ) + DBFWriteHeader(psDBF); + +/* -------------------------------------------------------------------- */ +/* Is this a brand new record? */ +/* -------------------------------------------------------------------- */ + if( hEntity == psDBF->nRecords ) + { + if( !DBFFlushRecord( psDBF ) ) + return FALSE; + + psDBF->nRecords++; + for( i = 0; i < psDBF->nRecordLength; i++ ) + psDBF->pszCurrentRecord[i] = ' '; + + psDBF->nCurrentRecord = hEntity; + } + +/* -------------------------------------------------------------------- */ +/* Is this an existing record, but different than the last one */ +/* we accessed? */ +/* -------------------------------------------------------------------- */ + if( !DBFLoadRecord( psDBF, hEntity ) ) + return FALSE; + + pabyRec = (unsigned char *) psDBF->pszCurrentRecord; + + memcpy ( pabyRec, pRawTuple, psDBF->nRecordLength ); + + psDBF->bCurrentRecordModified = TRUE; + psDBF->bUpdated = TRUE; + + return( TRUE ); +} + +/************************************************************************/ +/* DBFReadTuple() */ +/* */ +/* Read a complete record. Note that the result is only valid */ +/* till the next record read for any reason. */ +/************************************************************************/ + +const char SHPAPI_CALL1(*) +DBFReadTuple(DBFHandle psDBF, int hEntity ) + +{ + if( hEntity < 0 || hEntity >= psDBF->nRecords ) + return( NULL ); + + if( !DBFLoadRecord( psDBF, hEntity ) ) + return NULL; + + return (const char *) psDBF->pszCurrentRecord; +} + +/************************************************************************/ +/* DBFCloneEmpty() */ +/* */ +/* Read one of the attribute fields of a record. */ +/************************************************************************/ + +DBFHandle SHPAPI_CALL +DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ) +{ + DBFHandle newDBF; + + newDBF = DBFCreateEx ( pszFilename, psDBF->pszCodePage ); + if ( newDBF == NULL ) return ( NULL ); + + newDBF->nFields = psDBF->nFields; + newDBF->nRecordLength = psDBF->nRecordLength; + newDBF->nHeaderLength = psDBF->nHeaderLength; + + newDBF->pszHeader = (char *) malloc ( newDBF->nHeaderLength ); + memcpy ( newDBF->pszHeader, psDBF->pszHeader, newDBF->nHeaderLength ); + + newDBF->panFieldOffset = (int *) malloc ( sizeof(int) * psDBF->nFields ); + memcpy ( newDBF->panFieldOffset, psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); + newDBF->panFieldSize = (int *) malloc ( sizeof(int) * psDBF->nFields ); + memcpy ( newDBF->panFieldSize, psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); + newDBF->panFieldDecimals = (int *) malloc ( sizeof(int) * psDBF->nFields ); + memcpy ( newDBF->panFieldDecimals, psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); + newDBF->pachFieldType = (char *) malloc ( sizeof(char) * psDBF->nFields ); + memcpy ( newDBF->pachFieldType, psDBF->pachFieldType, sizeof(char)*psDBF->nFields ); + + newDBF->bNoHeader = TRUE; + newDBF->bUpdated = TRUE; + + DBFWriteHeader ( newDBF ); + DBFClose ( newDBF ); + + newDBF = DBFOpen ( pszFilename, "rb+" ); + + return ( newDBF ); +} + +/************************************************************************/ +/* DBFGetNativeFieldType() */ +/* */ +/* Return the DBase field type for the specified field. */ +/* */ +/* Value can be one of: 'C' (String), 'D' (Date), 'F' (Float), */ +/* 'N' (Numeric, with or without decimal), */ +/* 'L' (Logical), */ +/* 'M' (Memo: 10 digits .DBT block ptr) */ +/************************************************************************/ + +char SHPAPI_CALL +DBFGetNativeFieldType( DBFHandle psDBF, int iField ) + +{ + if( iField >=0 && iField < psDBF->nFields ) + return psDBF->pachFieldType[iField]; + + return ' '; +} + +/************************************************************************/ +/* str_to_upper() */ +/************************************************************************/ + +static void str_to_upper (char *string) +{ + int len; + short i = -1; + + len = strlen (string); + + while (++i < len) + if (isalpha(string[i]) && islower(string[i])) + string[i] = (char) toupper ((int)string[i]); +} + +/************************************************************************/ +/* DBFGetFieldIndex() */ +/* */ +/* Get the index number for a field in a .dbf file. */ +/* */ +/* Contributed by Jim Matthews. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName) + +{ + char name[12], name1[12], name2[12]; + int i; + + strncpy(name1, pszFieldName,11); + name1[11] = '\0'; + str_to_upper(name1); + + for( i = 0; i < DBFGetFieldCount(psDBF); i++ ) + { + DBFGetFieldInfo( psDBF, i, name, NULL, NULL ); + strncpy(name2,name,11); + str_to_upper(name2); + + if(!strncmp(name1,name2,10)) + return(i); + } + return(-1); +} + +/************************************************************************/ +/* DBFIsRecordDeleted() */ +/* */ +/* Returns TRUE if the indicated record is deleted, otherwise */ +/* it returns FALSE. */ +/************************************************************************/ + +int SHPAPI_CALL DBFIsRecordDeleted( DBFHandle psDBF, int iShape ) + +{ +/* -------------------------------------------------------------------- */ +/* Verify selection. */ +/* -------------------------------------------------------------------- */ + if( iShape < 0 || iShape >= psDBF->nRecords ) + return TRUE; + +/* -------------------------------------------------------------------- */ +/* Have we read the record? */ +/* -------------------------------------------------------------------- */ + if( !DBFLoadRecord( psDBF, iShape ) ) + return FALSE; + +/* -------------------------------------------------------------------- */ +/* '*' means deleted. */ +/* -------------------------------------------------------------------- */ + return psDBF->pszCurrentRecord[0] == '*'; +} + +/************************************************************************/ +/* DBFMarkRecordDeleted() */ +/************************************************************************/ + +int SHPAPI_CALL DBFMarkRecordDeleted( DBFHandle psDBF, int iShape, + int bIsDeleted ) + +{ + char chNewFlag; + +/* -------------------------------------------------------------------- */ +/* Verify selection. */ +/* -------------------------------------------------------------------- */ + if( iShape < 0 || iShape >= psDBF->nRecords ) + return FALSE; + +/* -------------------------------------------------------------------- */ +/* Is this an existing record, but different than the last one */ +/* we accessed? */ +/* -------------------------------------------------------------------- */ + if( !DBFLoadRecord( psDBF, iShape ) ) + return FALSE; + +/* -------------------------------------------------------------------- */ +/* Assign value, marking record as dirty if it changes. */ +/* -------------------------------------------------------------------- */ + if( bIsDeleted ) + chNewFlag = '*'; + else + chNewFlag = ' '; + + if( psDBF->pszCurrentRecord[0] != chNewFlag ) + { + psDBF->bCurrentRecordModified = TRUE; + psDBF->bUpdated = TRUE; + psDBF->pszCurrentRecord[0] = chNewFlag; + } + + return TRUE; +} + +/************************************************************************/ +/* DBFGetCodePage */ +/************************************************************************/ + +const char SHPAPI_CALL1(*) +DBFGetCodePage(DBFHandle psDBF ) +{ + if( psDBF == NULL ) + return NULL; + return psDBF->pszCodePage; +} + +/************************************************************************/ +/* DBFDeleteField() */ +/* */ +/* Remove a field from a .dbf file */ +/************************************************************************/ + +int SHPAPI_CALL +DBFDeleteField(DBFHandle psDBF, int iField) +{ + int nOldRecordLength, nOldHeaderLength; + int nDeletedFieldOffset, nDeletedFieldSize; + SAOffset nRecordOffset; + char* pszRecord; + int i, iRecord; + + if (iField < 0 || iField >= psDBF->nFields) + return FALSE; + + /* make sure that everything is written in .dbf */ + if( !DBFFlushRecord( psDBF ) ) + return FALSE; + + /* get information about field to be deleted */ + nOldRecordLength = psDBF->nRecordLength; + nOldHeaderLength = psDBF->nHeaderLength; + nDeletedFieldOffset = psDBF->panFieldOffset[iField]; + nDeletedFieldSize = psDBF->panFieldSize[iField]; + + /* update fields info */ + for (i = iField + 1; i < psDBF->nFields; i++) + { + psDBF->panFieldOffset[i-1] = psDBF->panFieldOffset[i] - nDeletedFieldSize; + psDBF->panFieldSize[i-1] = psDBF->panFieldSize[i]; + psDBF->panFieldDecimals[i-1] = psDBF->panFieldDecimals[i]; + psDBF->pachFieldType[i-1] = psDBF->pachFieldType[i]; + } + + /* resize fields arrays */ + psDBF->nFields--; + + psDBF->panFieldOffset = (int *) + SfRealloc( psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); + + psDBF->panFieldSize = (int *) + SfRealloc( psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); + + psDBF->panFieldDecimals = (int *) + SfRealloc( psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); + + psDBF->pachFieldType = (char *) + SfRealloc( psDBF->pachFieldType, sizeof(char) * psDBF->nFields ); + + /* update header information */ + psDBF->nHeaderLength -= 32; + psDBF->nRecordLength -= nDeletedFieldSize; + + /* overwrite field information in header */ + memcpy(psDBF->pszHeader + iField*32, + psDBF->pszHeader + (iField+1)*32, + sizeof(char) * (psDBF->nFields - iField)*32); + + psDBF->pszHeader = (char *) SfRealloc(psDBF->pszHeader,psDBF->nFields*32); + + /* update size of current record appropriately */ + psDBF->pszCurrentRecord = (char *) SfRealloc(psDBF->pszCurrentRecord, + psDBF->nRecordLength); + + /* we're done if we're dealing with not yet created .dbf */ + if ( psDBF->bNoHeader && psDBF->nRecords == 0 ) + return TRUE; + + /* force update of header with new header and record length */ + psDBF->bNoHeader = TRUE; + DBFUpdateHeader( psDBF ); + + /* alloc record */ + pszRecord = (char *) malloc(sizeof(char) * nOldRecordLength); + + /* shift records to their new positions */ + for (iRecord = 0; iRecord < psDBF->nRecords; iRecord++) + { + nRecordOffset = + nOldRecordLength * (SAOffset) iRecord + nOldHeaderLength; + + /* load record */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FRead( pszRecord, nOldRecordLength, 1, psDBF->fp ); + + nRecordOffset = + psDBF->nRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; + + /* move record in two steps */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FWrite( pszRecord, nDeletedFieldOffset, 1, psDBF->fp ); + psDBF->sHooks.FWrite( pszRecord + nDeletedFieldOffset + nDeletedFieldSize, + nOldRecordLength - nDeletedFieldOffset - nDeletedFieldSize, + 1, psDBF->fp ); + + } + + /* TODO: truncate file */ + + /* free record */ + free(pszRecord); + + return TRUE; +} diff --git a/navit/support/shapefile/shapefil.h b/navit/support/shapefile/shapefil.h new file mode 100644 index 0000000..059244b --- /dev/null +++ b/navit/support/shapefile/shapefil.h @@ -0,0 +1,609 @@ +#ifndef SHAPEFILE_H_INCLUDED +#define SHAPEFILE_H_INCLUDED + +/****************************************************************************** + * $Id: shapefil.h 15715 2008-11-12 15:15:21Z warmerdam $ + * + * Project: Shapelib + * Purpose: Primary include file for Shapelib. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: shapefil.h,v $ + * Revision 1.46 2008/11/12 14:28:15 fwarmerdam + * DBFCreateField() now works on files with records + * + * Revision 1.45 2008/11/11 17:47:10 fwarmerdam + * added DBFDeleteField() function + * + * Revision 1.44 2008/01/16 20:05:19 bram + * Add file hooks that accept UTF-8 encoded filenames on some platforms. Use SASetupUtf8Hooks + * tosetup the hooks and check SHPAPI_UTF8_HOOKS for its availability. Currently, this + * is only available on the Windows platform that decodes the UTF-8 filenames to wide + * character strings and feeds them to _wfopen and _wremove. + * + * Revision 1.43 2008/01/10 16:35:30 fwarmerdam + * avoid _ prefix on #defined symbols (bug 1840) + * + * Revision 1.42 2007/12/18 18:28:14 bram + * - create hook for client specific atof (bugzilla ticket 1615) + * - check for NULL handle before closing cpCPG file, and close after reading. + * + * Revision 1.41 2007/12/15 20:25:32 bram + * dbfopen.c now reads the Code Page information from the DBF file, and exports + * this information as a string through the DBFGetCodePage function. This is + * either the number from the LDID header field ("LDID/") or as the + * content of an accompanying .CPG file. When creating a DBF file, the code can + * be set using DBFCreateEx. + * + * Revision 1.40 2007/12/06 07:00:25 fwarmerdam + * dbfopen now using SAHooks for fileio + * + * Revision 1.39 2007/12/04 20:37:56 fwarmerdam + * preliminary implementation of hooks api for io and errors + * + * Revision 1.38 2007/11/21 22:39:56 fwarmerdam + * close shx file in readonly mode (GDAL #1956) + * + * Revision 1.37 2007/10/27 03:31:14 fwarmerdam + * limit default depth of tree to 12 levels (gdal ticket #1594) + * + * Revision 1.36 2007/09/10 23:33:15 fwarmerdam + * Upstreamed support for visibility flag in SHPAPI_CALL for the needs + * of GDAL (gdal ticket #1810). + * + * Revision 1.35 2007/09/03 19:48:10 fwarmerdam + * move DBFReadAttribute() static dDoubleField into dbfinfo + * + * Revision 1.34 2006/06/17 15:33:32 fwarmerdam + * added pszWorkField - bug 1202 (rso) + * + * Revision 1.33 2006/02/15 01:14:30 fwarmerdam + * added DBFAddNativeFieldType + * + * Revision 1.32 2006/01/26 15:07:32 fwarmerdam + * add bMeasureIsUsed flag from Craig Bruce: Bug 1249 + * + * Revision 1.31 2006/01/05 01:27:27 fwarmerdam + * added dbf deletion mark/fetch + * + * Revision 1.30 2005/01/03 22:30:13 fwarmerdam + * added support for saved quadtrees + * + * Revision 1.29 2004/09/26 20:09:35 fwarmerdam + * avoid rcsid warnings + * + * Revision 1.28 2003/12/29 06:02:18 fwarmerdam + * added cpl_error.h option + * + * Revision 1.27 2003/04/21 18:30:37 warmerda + * added header write/update public methods + * + * Revision 1.26 2002/09/29 00:00:08 warmerda + * added FTLogical and logical attribute read/write calls + * + * Revision 1.25 2002/05/07 13:46:30 warmerda + * added DBFWriteAttributeDirectly(). + * + * Revision 1.24 2002/04/10 16:59:54 warmerda + * added SHPRewindObject + * + * Revision 1.23 2002/01/15 14:36:07 warmerda + * updated email address + * + * Revision 1.22 2002/01/15 14:32:00 warmerda + * try to improve SHPAPI_CALL docs + */ + +#include + +#ifdef USE_DBMALLOC +#include +#endif + +#ifdef USE_CPL +#include "cpl_error.h" +#include "cpl_vsi.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/************************************************************************/ +/* Configuration options. */ +/************************************************************************/ + +/* -------------------------------------------------------------------- */ +/* Should the DBFReadStringAttribute() strip leading and */ +/* trailing white space? */ +/* -------------------------------------------------------------------- */ +#define TRIM_DBF_WHITESPACE + +/* -------------------------------------------------------------------- */ +/* Should we write measure values to the Multipatch object? */ +/* Reportedly ArcView crashes if we do write it, so for now it */ +/* is disabled. */ +/* -------------------------------------------------------------------- */ +#define DISABLE_MULTIPATCH_MEASURE + +/* -------------------------------------------------------------------- */ +/* SHPAPI_CALL */ +/* */ +/* The following two macros are present to allow forcing */ +/* various calling conventions on the Shapelib API. */ +/* */ +/* To force __stdcall conventions (needed to call Shapelib */ +/* from Visual Basic and/or Dephi I believe) the makefile could */ +/* be modified to define: */ +/* */ +/* /DSHPAPI_CALL=__stdcall */ +/* */ +/* If it is desired to force export of the Shapelib API without */ +/* using the shapelib.def file, use the following definition. */ +/* */ +/* /DSHAPELIB_DLLEXPORT */ +/* */ +/* To get both at once it will be necessary to hack this */ +/* include file to define: */ +/* */ +/* #define SHPAPI_CALL __declspec(dllexport) __stdcall */ +/* #define SHPAPI_CALL1 __declspec(dllexport) * __stdcall */ +/* */ +/* The complexity of the situtation is partly caused by the */ +/* peculiar requirement of Visual C++ that __stdcall appear */ +/* after any "*"'s in the return value of a function while the */ +/* __declspec(dllexport) must appear before them. */ +/* -------------------------------------------------------------------- */ + +#ifdef SHAPELIB_DLLEXPORT +# define SHPAPI_CALL __declspec(dllexport) +# define SHPAPI_CALL1(x) __declspec(dllexport) x +#endif + +#ifndef SHPAPI_CALL +# if defined(USE_GCC_VISIBILITY_FLAG) +# define SHPAPI_CALL __attribute__ ((visibility("default"))) +# define SHPAPI_CALL1(x) __attribute__ ((visibility("default"))) x +# else +# define SHPAPI_CALL +# endif +#endif + +#ifndef SHPAPI_CALL1 +# define SHPAPI_CALL1(x) x SHPAPI_CALL +#endif + +/* -------------------------------------------------------------------- */ +/* Macros for controlling CVSID and ensuring they don't appear */ +/* as unreferenced variables resulting in lots of warnings. */ +/* -------------------------------------------------------------------- */ +#ifndef DISABLE_CVSID +# define SHP_CVSID(string) static char cpl_cvsid[] = string; \ +static char *cvsid_aw() { return( cvsid_aw() ? ((char *) NULL) : cpl_cvsid ); } +#else +# define SHP_CVSID(string) +#endif + +/* -------------------------------------------------------------------- */ +/* On some platforms, additional file IO hooks are defined that */ +/* UTF-8 encoded filenames Unicode filenames */ +/* -------------------------------------------------------------------- */ +#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define SHPAPI_WINDOWS +# define SHPAPI_UTF8_HOOKS +#endif + +/* -------------------------------------------------------------------- */ +/* IO/Error hook functions. */ +/* -------------------------------------------------------------------- */ +typedef int *SAFile; + +#ifndef SAOffset +typedef unsigned long SAOffset; +#endif + +typedef struct { + SAFile (*FOpen) ( const char *filename, const char *access); + SAOffset (*FRead) ( void *p, SAOffset size, SAOffset nmemb, SAFile file); + SAOffset (*FWrite)( void *p, SAOffset size, SAOffset nmemb, SAFile file); + SAOffset (*FSeek) ( SAFile file, SAOffset offset, int whence ); + SAOffset (*FTell) ( SAFile file ); + int (*FFlush)( SAFile file ); + int (*FClose)( SAFile file ); + int (*Remove) ( const char *filename ); + + void (*Error) ( const char *message ); + double (*Atof) ( const char *str ); +} SAHooks; + +void SHPAPI_CALL SASetupDefaultHooks( SAHooks *psHooks ); +#ifdef SHPAPI_UTF8_HOOKS +void SHPAPI_CALL SASetupUtf8Hooks( SAHooks *psHooks ); +#endif + +/************************************************************************/ +/* SHP Support. */ +/************************************************************************/ +typedef struct +{ + SAHooks sHooks; + + SAFile fpSHP; + SAFile fpSHX; + + int nShapeType; /* SHPT_* */ + + int nFileSize; /* SHP file */ + + int nRecords; + int nMaxRecords; + int *panRecOffset; + int *panRecSize; + + double adBoundsMin[4]; + double adBoundsMax[4]; + + int bUpdated; + + unsigned char *pabyRec; + int nBufSize; +} SHPInfo; + +typedef SHPInfo * SHPHandle; + +/* -------------------------------------------------------------------- */ +/* Shape types (nSHPType) */ +/* -------------------------------------------------------------------- */ +#define SHPT_NULL 0 +#define SHPT_POINT 1 +#define SHPT_ARC 3 +#define SHPT_POLYGON 5 +#define SHPT_MULTIPOINT 8 +#define SHPT_POINTZ 11 +#define SHPT_ARCZ 13 +#define SHPT_POLYGONZ 15 +#define SHPT_MULTIPOINTZ 18 +#define SHPT_POINTM 21 +#define SHPT_ARCM 23 +#define SHPT_POLYGONM 25 +#define SHPT_MULTIPOINTM 28 +#define SHPT_MULTIPATCH 31 + + +/* -------------------------------------------------------------------- */ +/* Part types - everything but SHPT_MULTIPATCH just uses */ +/* SHPP_RING. */ +/* -------------------------------------------------------------------- */ + +#define SHPP_TRISTRIP 0 +#define SHPP_TRIFAN 1 +#define SHPP_OUTERRING 2 +#define SHPP_INNERRING 3 +#define SHPP_FIRSTRING 4 +#define SHPP_RING 5 + +/* -------------------------------------------------------------------- */ +/* SHPObject - represents on shape (without attributes) read */ +/* from the .shp file. */ +/* -------------------------------------------------------------------- */ +typedef struct +{ + int nSHPType; + + int nShapeId; /* -1 is unknown/unassigned */ + + int nParts; + int *panPartStart; + int *panPartType; + + int nVertices; + double *padfX; + double *padfY; + double *padfZ; + double *padfM; + + double dfXMin; + double dfYMin; + double dfZMin; + double dfMMin; + + double dfXMax; + double dfYMax; + double dfZMax; + double dfMMax; + + int bMeasureIsUsed; +} SHPObject; + +/* -------------------------------------------------------------------- */ +/* SHP API Prototypes */ +/* -------------------------------------------------------------------- */ + +/* If pszAccess is read-only, the fpSHX field of the returned structure */ +/* will be NULL as it is not necessary to keep the SHX file open */ +SHPHandle SHPAPI_CALL + SHPOpen( const char * pszShapeFile, const char * pszAccess ); +SHPHandle SHPAPI_CALL + SHPOpenLL( const char *pszShapeFile, const char *pszAccess, + SAHooks *psHooks ); +SHPHandle SHPAPI_CALL + SHPCreate( const char * pszShapeFile, int nShapeType ); +SHPHandle SHPAPI_CALL + SHPCreateLL( const char * pszShapeFile, int nShapeType, + SAHooks *psHooks ); +void SHPAPI_CALL + SHPGetInfo( SHPHandle hSHP, int * pnEntities, int * pnShapeType, + double * padfMinBound, double * padfMaxBound ); + +SHPObject SHPAPI_CALL1(*) + SHPReadObject( SHPHandle hSHP, int iShape ); +int SHPAPI_CALL + SHPWriteObject( SHPHandle hSHP, int iShape, SHPObject * psObject ); + +void SHPAPI_CALL + SHPDestroyObject( SHPObject * psObject ); +void SHPAPI_CALL + SHPComputeExtents( SHPObject * psObject ); +SHPObject SHPAPI_CALL1(*) + SHPCreateObject( int nSHPType, int nShapeId, int nParts, + const int * panPartStart, const int * panPartType, + int nVertices, + const double * padfX, const double * padfY, + const double * padfZ, const double * padfM ); +SHPObject SHPAPI_CALL1(*) + SHPCreateSimpleObject( int nSHPType, int nVertices, + const double * padfX, + const double * padfY, + const double * padfZ ); + +int SHPAPI_CALL + SHPRewindObject( SHPHandle hSHP, SHPObject * psObject ); + +void SHPAPI_CALL SHPClose( SHPHandle hSHP ); +void SHPAPI_CALL SHPWriteHeader( SHPHandle hSHP ); + +const char SHPAPI_CALL1(*) + SHPTypeName( int nSHPType ); +const char SHPAPI_CALL1(*) + SHPPartTypeName( int nPartType ); + +/* -------------------------------------------------------------------- */ +/* Shape quadtree indexing API. */ +/* -------------------------------------------------------------------- */ + +/* this can be two or four for binary or quad tree */ +#define MAX_SUBNODE 4 + +/* upper limit of tree levels for automatic estimation */ +#define MAX_DEFAULT_TREE_DEPTH 12 + +typedef struct shape_tree_node +{ + /* region covered by this node */ + double adfBoundsMin[4]; + double adfBoundsMax[4]; + + /* list of shapes stored at this node. The papsShapeObj pointers + or the whole list can be NULL */ + int nShapeCount; + int *panShapeIds; + SHPObject **papsShapeObj; + + int nSubNodes; + struct shape_tree_node *apsSubNode[MAX_SUBNODE]; + +} SHPTreeNode; + +typedef struct +{ + SHPHandle hSHP; + + int nMaxDepth; + int nDimension; + int nTotalCount; + + SHPTreeNode *psRoot; +} SHPTree; + +SHPTree SHPAPI_CALL1(*) + SHPCreateTree( SHPHandle hSHP, int nDimension, int nMaxDepth, + double *padfBoundsMin, double *padfBoundsMax ); +void SHPAPI_CALL + SHPDestroyTree( SHPTree * hTree ); + +int SHPAPI_CALL + SHPWriteTree( SHPTree *hTree, const char * pszFilename ); +SHPTree SHPAPI_CALL + SHPReadTree( const char * pszFilename ); + +int SHPAPI_CALL + SHPTreeAddObject( SHPTree * hTree, SHPObject * psObject ); +int SHPAPI_CALL + SHPTreeAddShapeId( SHPTree * hTree, SHPObject * psObject ); +int SHPAPI_CALL + SHPTreeRemoveShapeId( SHPTree * hTree, int nShapeId ); + +void SHPAPI_CALL + SHPTreeTrimExtraNodes( SHPTree * hTree ); + +int SHPAPI_CALL1(*) + SHPTreeFindLikelyShapes( SHPTree * hTree, + double * padfBoundsMin, + double * padfBoundsMax, + int * ); +int SHPAPI_CALL + SHPCheckBoundsOverlap( double *, double *, double *, double *, int ); + +int SHPAPI_CALL1(*) +SHPSearchDiskTree( FILE *fp, + double *padfBoundsMin, double *padfBoundsMax, + int *pnShapeCount ); + +/************************************************************************/ +/* DBF Support. */ +/************************************************************************/ +typedef struct +{ + SAHooks sHooks; + + SAFile fp; + + int nRecords; + + int nRecordLength; + int nHeaderLength; + int nFields; + int *panFieldOffset; + int *panFieldSize; + int *panFieldDecimals; + char *pachFieldType; + + char *pszHeader; + + int nCurrentRecord; + int bCurrentRecordModified; + char *pszCurrentRecord; + + int nWorkFieldLength; + char *pszWorkField; + + int bNoHeader; + int bUpdated; + + double dfDoubleField; + + int iLanguageDriver; + char *pszCodePage; +} DBFInfo; + +typedef DBFInfo * DBFHandle; + +typedef enum { + FTString, + FTInteger, + FTDouble, + FTLogical, + FTInvalid +} DBFFieldType; + +#define XBASE_FLDHDR_SZ 32 + + +DBFHandle SHPAPI_CALL + DBFOpen( const char * pszDBFFile, const char * pszAccess ); +DBFHandle SHPAPI_CALL + DBFOpenLL( const char * pszDBFFile, const char * pszAccess, + SAHooks *psHooks ); +DBFHandle SHPAPI_CALL + DBFCreate( const char * pszDBFFile ); +DBFHandle SHPAPI_CALL + DBFCreateEx( const char * pszDBFFile, const char * pszCodePage ); +DBFHandle SHPAPI_CALL + DBFCreateLL( const char * pszDBFFile, const char * pszCodePage, SAHooks *psHooks ); + +int SHPAPI_CALL + DBFGetFieldCount( DBFHandle psDBF ); +int SHPAPI_CALL + DBFGetRecordCount( DBFHandle psDBF ); +int SHPAPI_CALL + DBFAddField( DBFHandle hDBF, const char * pszFieldName, + DBFFieldType eType, int nWidth, int nDecimals ); + +int SHPAPI_CALL + DBFAddNativeFieldType( DBFHandle hDBF, const char * pszFieldName, + char chType, int nWidth, int nDecimals ); + +int SHPAPI_CALL + DBFDeleteField( DBFHandle hDBF, int iField ); + +DBFFieldType SHPAPI_CALL + DBFGetFieldInfo( DBFHandle psDBF, int iField, + char * pszFieldName, int * pnWidth, int * pnDecimals ); + +int SHPAPI_CALL + DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName); + +int SHPAPI_CALL + DBFReadIntegerAttribute( DBFHandle hDBF, int iShape, int iField ); +double SHPAPI_CALL + DBFReadDoubleAttribute( DBFHandle hDBF, int iShape, int iField ); +const char SHPAPI_CALL1(*) + DBFReadStringAttribute( DBFHandle hDBF, int iShape, int iField ); +const char SHPAPI_CALL1(*) + DBFReadLogicalAttribute( DBFHandle hDBF, int iShape, int iField ); +int SHPAPI_CALL + DBFIsAttributeNULL( DBFHandle hDBF, int iShape, int iField ); + +int SHPAPI_CALL + DBFWriteIntegerAttribute( DBFHandle hDBF, int iShape, int iField, + int nFieldValue ); +int SHPAPI_CALL + DBFWriteDoubleAttribute( DBFHandle hDBF, int iShape, int iField, + double dFieldValue ); +int SHPAPI_CALL + DBFWriteStringAttribute( DBFHandle hDBF, int iShape, int iField, + const char * pszFieldValue ); +int SHPAPI_CALL + DBFWriteNULLAttribute( DBFHandle hDBF, int iShape, int iField ); + +int SHPAPI_CALL + DBFWriteLogicalAttribute( DBFHandle hDBF, int iShape, int iField, + const char lFieldValue); +int SHPAPI_CALL + DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField, + void * pValue ); +const char SHPAPI_CALL1(*) + DBFReadTuple(DBFHandle psDBF, int hEntity ); +int SHPAPI_CALL + DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple ); + +int SHPAPI_CALL DBFIsRecordDeleted( DBFHandle psDBF, int iShape ); +int SHPAPI_CALL DBFMarkRecordDeleted( DBFHandle psDBF, int iShape, + int bIsDeleted ); + +DBFHandle SHPAPI_CALL + DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ); + +void SHPAPI_CALL + DBFClose( DBFHandle hDBF ); +void SHPAPI_CALL + DBFUpdateHeader( DBFHandle hDBF ); +char SHPAPI_CALL + DBFGetNativeFieldType( DBFHandle hDBF, int iField ); + +const char SHPAPI_CALL1(*) + DBFGetCodePage(DBFHandle psDBF ); + +#ifdef __cplusplus +} +#endif + +#endif /* ndef SHAPEFILE_H_INCLUDED */ diff --git a/navit/support/shapefile/shpopen.c b/navit/support/shapefile/shpopen.c new file mode 100644 index 0000000..da53652 --- /dev/null +++ b/navit/support/shapefile/shpopen.c @@ -0,0 +1,2283 @@ +/****************************************************************************** + * $Id: shpopen.c,v 1.59 2008/03/14 05:25:31 fwarmerdam Exp $ + * + * Project: Shapelib + * Purpose: Implementation of core Shapefile read/write functions. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, 2001, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: shpopen.c,v $ + * Revision 1.59 2008/03/14 05:25:31 fwarmerdam + * Correct crash on buggy geometries (gdal #2218) + * + * Revision 1.58 2008/01/08 23:28:26 bram + * on line 2095, use a float instead of a double to avoid a compiler warning + * + * Revision 1.57 2007/12/06 07:00:25 fwarmerdam + * dbfopen now using SAHooks for fileio + * + * Revision 1.56 2007/12/04 20:37:56 fwarmerdam + * preliminary implementation of hooks api for io and errors + * + * Revision 1.55 2007/11/21 22:39:56 fwarmerdam + * close shx file in readonly mode (GDAL #1956) + * + * Revision 1.54 2007/11/15 00:12:47 mloskot + * Backported recent changes from GDAL (Ticket #1415) to Shapelib. + * + * Revision 1.53 2007/11/14 22:31:08 fwarmerdam + * checks after mallocs to detect for corrupted/voluntary broken shapefiles. + * http://trac.osgeo.org/gdal/ticket/1991 + * + * Revision 1.52 2007/06/21 15:58:33 fwarmerdam + * fix for SHPRewindObject when rings touch at one vertex (gdal #976) + * + * Revision 1.51 2006/09/04 15:24:01 fwarmerdam + * Fixed up log message for 1.49. + * + * Revision 1.50 2006/09/04 15:21:39 fwarmerdam + * fix of last fix + * + * Revision 1.49 2006/09/04 15:21:00 fwarmerdam + * MLoskot: Added stronger test of Shapefile reading failures, e.g. truncated + * files. The problem was discovered by Tim Sutton and reported here + * https://svn.qgis.org/trac/ticket/200 + * + * Revision 1.48 2006/01/26 15:07:32 fwarmerdam + * add bMeasureIsUsed flag from Craig Bruce: Bug 1249 + * + * Revision 1.47 2006/01/04 20:07:23 fwarmerdam + * In SHPWriteObject() make sure that the record length is updated + * when rewriting an existing record. + * + * Revision 1.46 2005/02/11 17:17:46 fwarmerdam + * added panPartStart[0] validation + * + * Revision 1.45 2004/09/26 20:09:48 fwarmerdam + * const correctness changes + * + * Revision 1.44 2003/12/29 00:18:39 fwarmerdam + * added error checking for failed IO and optional CPL error reporting + * + * Revision 1.43 2003/12/01 16:20:08 warmerda + * be careful of zero vertex shapes + * + * Revision 1.42 2003/12/01 14:58:27 warmerda + * added degenerate object check in SHPRewindObject() + * + * Revision 1.41 2003/07/08 15:22:43 warmerda + * avoid warning + * + * Revision 1.40 2003/04/21 18:30:37 warmerda + * added header write/update public methods + * + * Revision 1.39 2002/08/26 06:46:56 warmerda + * avoid c++ comments + * + * Revision 1.38 2002/05/07 16:43:39 warmerda + * Removed debugging printf. + * + * Revision 1.37 2002/04/10 17:35:22 warmerda + * fixed bug in ring reversal code + * + * Revision 1.36 2002/04/10 16:59:54 warmerda + * added SHPRewindObject + * + * Revision 1.35 2001/12/07 15:10:44 warmerda + * fix if .shx fails to open + * + * Revision 1.34 2001/11/01 16:29:55 warmerda + * move pabyRec into SHPInfo for thread safety + * + * Revision 1.33 2001/07/03 12:18:15 warmerda + * Improved cleanup if SHX not found, provied by Riccardo Cohen. + * + * Revision 1.32 2001/06/22 01:58:07 warmerda + * be more careful about establishing initial bounds in face of NULL shapes + * + * Revision 1.31 2001/05/31 19:35:29 warmerda + * added support for writing null shapes + * + * Revision 1.30 2001/05/28 12:46:29 warmerda + * Add some checking on reasonableness of record count when opening. + * + * Revision 1.29 2001/05/23 13:36:52 warmerda + * added use of SHPAPI_CALL + * + * Revision 1.28 2001/02/06 22:25:06 warmerda + * fixed memory leaks when SHPOpen() fails + * + * Revision 1.27 2000/07/18 15:21:33 warmerda + * added better enforcement of -1 for append in SHPWriteObject + * + * Revision 1.26 2000/02/16 16:03:51 warmerda + * added null shape support + * + * Revision 1.25 1999/12/15 13:47:07 warmerda + * Fixed record size settings in .shp file (was 4 words too long) + * Added stdlib.h. + * + * Revision 1.24 1999/11/05 14:12:04 warmerda + * updated license terms + * + * Revision 1.23 1999/07/27 00:53:46 warmerda + * added support for rewriting shapes + * + * Revision 1.22 1999/06/11 19:19:11 warmerda + * Cleanup pabyRec static buffer on SHPClose(). + * + * Revision 1.21 1999/06/02 14:57:56 kshih + * Remove unused variables + * + * Revision 1.20 1999/04/19 21:04:17 warmerda + * Fixed syntax error. + * + * Revision 1.19 1999/04/19 21:01:57 warmerda + * Force access string to binary in SHPOpen(). + * + * Revision 1.18 1999/04/01 18:48:07 warmerda + * Try upper case extensions if lower case doesn't work. + * + * Revision 1.17 1998/12/31 15:29:39 warmerda + * Disable writing measure values to multipatch objects if + * DISABLE_MULTIPATCH_MEASURE is defined. + * + * Revision 1.16 1998/12/16 05:14:33 warmerda + * Added support to write MULTIPATCH. Fixed reading Z coordinate of + * MULTIPATCH. Fixed record size written for all feature types. + * + * Revision 1.15 1998/12/03 16:35:29 warmerda + * r+b is proper binary access string, not rb+. + * + * Revision 1.14 1998/12/03 15:47:56 warmerda + * Fixed setting of nVertices in SHPCreateObject(). + * + * Revision 1.13 1998/12/03 15:33:54 warmerda + * Made SHPCalculateExtents() separately callable. + * + * Revision 1.12 1998/11/11 20:01:50 warmerda + * Fixed bug writing ArcM/Z, and PolygonM/Z for big endian machines. + * + * Revision 1.11 1998/11/09 20:56:44 warmerda + * Fixed up handling of file wide bounds. + * + * Revision 1.10 1998/11/09 20:18:51 warmerda + * Converted to support 3D shapefiles, and use of SHPObject. + * + * Revision 1.9 1998/02/24 15:09:05 warmerda + * Fixed memory leak. + * + * Revision 1.8 1997/12/04 15:40:29 warmerda + * Fixed byte swapping of record number, and record length fields in the + * .shp file. + * + * Revision 1.7 1995/10/21 03:15:58 warmerda + * Added support for binary file access, the magic cookie 9997 + * and tried to improve the int32 selection logic for 16bit systems. + * + * Revision 1.6 1995/09/04 04:19:41 warmerda + * Added fix for file bounds. + * + * Revision 1.5 1995/08/25 15:16:44 warmerda + * Fixed a couple of problems with big endian systems ... one with bounds + * and the other with multipart polygons. + * + * Revision 1.4 1995/08/24 18:10:17 warmerda + * Switch to use SfRealloc() to avoid problems with pre-ANSI realloc() + * functions (such as on the Sun). + * + * Revision 1.3 1995/08/23 02:23:15 warmerda + * Added support for reading bounds, and fixed up problems in setting the + * file wide bounds. + * + * Revision 1.2 1995/08/04 03:16:57 warmerda + * Added header. + * + */ + +#include "shapefil.h" + +#include +#include +#include +#include +#include +#include +#include + +typedef unsigned char uchar; + +#if UINT_MAX == 65535 +typedef long int32; +#else +typedef int int32; +#endif + +#ifndef FALSE +# define FALSE 0 +# define TRUE 1 +#endif + +#define ByteCopy( a, b, c ) memcpy( b, a, c ) +#ifndef MAX +# define MIN(a,b) ((ab) ? a : b) +#endif + +static int bBigEndian; + + +/************************************************************************/ +/* SwapWord() */ +/* */ +/* Swap a 2, 4 or 8 byte word. */ +/************************************************************************/ + +static void SwapWord( int length, void * wordP ) + +{ + int i; + uchar temp; + + for( i=0; i < length/2; i++ ) + { + temp = ((uchar *) wordP)[i]; + ((uchar *)wordP)[i] = ((uchar *) wordP)[length-i-1]; + ((uchar *) wordP)[length-i-1] = temp; + } +} + +/************************************************************************/ +/* SfRealloc() */ +/* */ +/* A realloc cover function that will access a NULL pointer as */ +/* a valid input. */ +/************************************************************************/ + +static void * SfRealloc( void * pMem, int nNewSize ) + +{ + if( pMem == NULL ) + return( (void *) malloc(nNewSize) ); + else + return( (void *) realloc(pMem,nNewSize) ); +} + +/************************************************************************/ +/* SHPWriteHeader() */ +/* */ +/* Write out a header for the .shp and .shx files as well as the */ +/* contents of the index (.shx) file. */ +/************************************************************************/ + +void SHPWriteHeader( SHPHandle psSHP ) + +{ + uchar abyHeader[100]; + int i; + int32 i32; + double dValue; + int32 *panSHX; + + if (psSHP->fpSHX == NULL) + { + psSHP->sHooks.Error( "SHPWriteHeader failed : SHX file is closed"); + return; + } + +/* -------------------------------------------------------------------- */ +/* Prepare header block for .shp file. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < 100; i++ ) + abyHeader[i] = 0; + + abyHeader[2] = 0x27; /* magic cookie */ + abyHeader[3] = 0x0a; + + i32 = psSHP->nFileSize/2; /* file size */ + ByteCopy( &i32, abyHeader+24, 4 ); + if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); + + i32 = 1000; /* version */ + ByteCopy( &i32, abyHeader+28, 4 ); + if( bBigEndian ) SwapWord( 4, abyHeader+28 ); + + i32 = psSHP->nShapeType; /* shape type */ + ByteCopy( &i32, abyHeader+32, 4 ); + if( bBigEndian ) SwapWord( 4, abyHeader+32 ); + + dValue = psSHP->adBoundsMin[0]; /* set bounds */ + ByteCopy( &dValue, abyHeader+36, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+36 ); + + dValue = psSHP->adBoundsMin[1]; + ByteCopy( &dValue, abyHeader+44, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+44 ); + + dValue = psSHP->adBoundsMax[0]; + ByteCopy( &dValue, abyHeader+52, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+52 ); + + dValue = psSHP->adBoundsMax[1]; + ByteCopy( &dValue, abyHeader+60, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+60 ); + + dValue = psSHP->adBoundsMin[2]; /* z */ + ByteCopy( &dValue, abyHeader+68, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+68 ); + + dValue = psSHP->adBoundsMax[2]; + ByteCopy( &dValue, abyHeader+76, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+76 ); + + dValue = psSHP->adBoundsMin[3]; /* m */ + ByteCopy( &dValue, abyHeader+84, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+84 ); + + dValue = psSHP->adBoundsMax[3]; + ByteCopy( &dValue, abyHeader+92, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+92 ); + +/* -------------------------------------------------------------------- */ +/* Write .shp file header. */ +/* -------------------------------------------------------------------- */ + if( psSHP->sHooks.FSeek( psSHP->fpSHP, 0, 0 ) != 0 + || psSHP->sHooks.FWrite( abyHeader, 100, 1, psSHP->fpSHP ) != 1 ) + { + psSHP->sHooks.Error( "Failure writing .shp header" ); + return; + } + +/* -------------------------------------------------------------------- */ +/* Prepare, and write .shx file header. */ +/* -------------------------------------------------------------------- */ + i32 = (psSHP->nRecords * 2 * sizeof(int32) + 100)/2; /* file size */ + ByteCopy( &i32, abyHeader+24, 4 ); + if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); + + if( psSHP->sHooks.FSeek( psSHP->fpSHX, 0, 0 ) != 0 + || psSHP->sHooks.FWrite( abyHeader, 100, 1, psSHP->fpSHX ) != 1 ) + { + psSHP->sHooks.Error( "Failure writing .shx header" ); + return; + } + +/* -------------------------------------------------------------------- */ +/* Write out the .shx contents. */ +/* -------------------------------------------------------------------- */ + panSHX = (int32 *) malloc(sizeof(int32) * 2 * psSHP->nRecords); + + for( i = 0; i < psSHP->nRecords; i++ ) + { + panSHX[i*2 ] = psSHP->panRecOffset[i]/2; + panSHX[i*2+1] = psSHP->panRecSize[i]/2; + if( !bBigEndian ) SwapWord( 4, panSHX+i*2 ); + if( !bBigEndian ) SwapWord( 4, panSHX+i*2+1 ); + } + + if( (int)psSHP->sHooks.FWrite( panSHX, sizeof(int32)*2, psSHP->nRecords, psSHP->fpSHX ) + != psSHP->nRecords ) + { + psSHP->sHooks.Error( "Failure writing .shx contents" ); + } + + free( panSHX ); + +/* -------------------------------------------------------------------- */ +/* Flush to disk. */ +/* -------------------------------------------------------------------- */ + psSHP->sHooks.FFlush( psSHP->fpSHP ); + psSHP->sHooks.FFlush( psSHP->fpSHX ); +} + +/************************************************************************/ +/* SHPOpen() */ +/************************************************************************/ + +SHPHandle SHPAPI_CALL +SHPOpen( const char * pszLayer, const char * pszAccess ) + +{ + SAHooks sHooks; + + SASetupDefaultHooks( &sHooks ); + + return SHPOpenLL( pszLayer, pszAccess, &sHooks ); +} + +/************************************************************************/ +/* SHPOpen() */ +/* */ +/* Open the .shp and .shx files based on the basename of the */ +/* files or either file name. */ +/************************************************************************/ + +SHPHandle SHPAPI_CALL +SHPOpenLL( const char * pszLayer, const char * pszAccess, SAHooks *psHooks ) + +{ + char *pszFullname, *pszBasename; + SHPHandle psSHP; + + uchar *pabyBuf; + int i; + double dValue; + +/* -------------------------------------------------------------------- */ +/* Ensure the access string is one of the legal ones. We */ +/* ensure the result string indicates binary to avoid common */ +/* problems on Windows. */ +/* -------------------------------------------------------------------- */ + if( strcmp(pszAccess,"rb+") == 0 || strcmp(pszAccess,"r+b") == 0 + || strcmp(pszAccess,"r+") == 0 ) + pszAccess = "r+b"; + else + pszAccess = "rb"; + +/* -------------------------------------------------------------------- */ +/* Establish the byte order on this machine. */ +/* -------------------------------------------------------------------- */ + i = 1; + if( *((uchar *) &i) == 1 ) + bBigEndian = FALSE; + else + bBigEndian = TRUE; + +/* -------------------------------------------------------------------- */ +/* Initialize the info structure. */ +/* -------------------------------------------------------------------- */ + psSHP = (SHPHandle) calloc(sizeof(SHPInfo),1); + + psSHP->bUpdated = FALSE; + memcpy( &(psSHP->sHooks), psHooks, sizeof(SAHooks) ); + +/* -------------------------------------------------------------------- */ +/* Compute the base (layer) name. If there is any extension */ +/* on the passed in filename we will strip it off. */ +/* -------------------------------------------------------------------- */ + pszBasename = (char *) malloc(strlen(pszLayer)+5); + strcpy( pszBasename, pszLayer ); + for( i = strlen(pszBasename)-1; + i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' + && pszBasename[i] != '\\'; + i-- ) {} + + if( pszBasename[i] == '.' ) + pszBasename[i] = '\0'; + +/* -------------------------------------------------------------------- */ +/* Open the .shp and .shx files. Note that files pulled from */ +/* a PC to Unix with upper case filenames won't work! */ +/* -------------------------------------------------------------------- */ + pszFullname = (char *) malloc(strlen(pszBasename) + 5); + sprintf( pszFullname, "%s.shp", pszBasename ) ; + psSHP->fpSHP = psSHP->sHooks.FOpen(pszFullname, pszAccess ); + if( psSHP->fpSHP == NULL ) + { + sprintf( pszFullname, "%s.SHP", pszBasename ); + psSHP->fpSHP = psSHP->sHooks.FOpen(pszFullname, pszAccess ); + } + + if( psSHP->fpSHP == NULL ) + { +#ifdef USE_CPL + CPLError( CE_Failure, CPLE_OpenFailed, + "Unable to open %s.shp or %s.SHP.", + pszBasename, pszBasename ); +#endif + free( psSHP ); + free( pszBasename ); + free( pszFullname ); + return( NULL ); + } + + sprintf( pszFullname, "%s.shx", pszBasename ); + psSHP->fpSHX = psSHP->sHooks.FOpen(pszFullname, pszAccess ); + if( psSHP->fpSHX == NULL ) + { + sprintf( pszFullname, "%s.SHX", pszBasename ); + psSHP->fpSHX = psSHP->sHooks.FOpen(pszFullname, pszAccess ); + } + + if( psSHP->fpSHX == NULL ) + { +#ifdef USE_CPL + CPLError( CE_Failure, CPLE_OpenFailed, + "Unable to open %s.shx or %s.SHX.", + pszBasename, pszBasename ); +#endif + psSHP->sHooks.FClose( psSHP->fpSHP ); + free( psSHP ); + free( pszBasename ); + free( pszFullname ); + return( NULL ); + } + + free( pszFullname ); + free( pszBasename ); + +/* -------------------------------------------------------------------- */ +/* Read the file size from the SHP file. */ +/* -------------------------------------------------------------------- */ + pabyBuf = (uchar *) malloc(100); + psSHP->sHooks.FRead( pabyBuf, 100, 1, psSHP->fpSHP ); + + psSHP->nFileSize = (pabyBuf[24] * 256 * 256 * 256 + + pabyBuf[25] * 256 * 256 + + pabyBuf[26] * 256 + + pabyBuf[27]) * 2; + +/* -------------------------------------------------------------------- */ +/* Read SHX file Header info */ +/* -------------------------------------------------------------------- */ + if( psSHP->sHooks.FRead( pabyBuf, 100, 1, psSHP->fpSHX ) != 1 + || pabyBuf[0] != 0 + || pabyBuf[1] != 0 + || pabyBuf[2] != 0x27 + || (pabyBuf[3] != 0x0a && pabyBuf[3] != 0x0d) ) + { + psSHP->sHooks.Error( ".shx file is unreadable, or corrupt." ); + psSHP->sHooks.FClose( psSHP->fpSHP ); + psSHP->sHooks.FClose( psSHP->fpSHX ); + free( psSHP ); + + return( NULL ); + } + + psSHP->nRecords = pabyBuf[27] + pabyBuf[26] * 256 + + pabyBuf[25] * 256 * 256 + pabyBuf[24] * 256 * 256 * 256; + psSHP->nRecords = (psSHP->nRecords*2 - 100) / 8; + + psSHP->nShapeType = pabyBuf[32]; + + if( psSHP->nRecords < 0 || psSHP->nRecords > 256000000 ) + { + char szError[200]; + + sprintf( szError, + "Record count in .shp header is %d, which seems\n" + "unreasonable. Assuming header is corrupt.", + psSHP->nRecords ); + psSHP->sHooks.Error( szError ); + psSHP->sHooks.FClose( psSHP->fpSHP ); + psSHP->sHooks.FClose( psSHP->fpSHX ); + free( psSHP ); + free(pabyBuf); + + return( NULL ); + } + +/* -------------------------------------------------------------------- */ +/* Read the bounds. */ +/* -------------------------------------------------------------------- */ + if( bBigEndian ) SwapWord( 8, pabyBuf+36 ); + memcpy( &dValue, pabyBuf+36, 8 ); + psSHP->adBoundsMin[0] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+44 ); + memcpy( &dValue, pabyBuf+44, 8 ); + psSHP->adBoundsMin[1] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+52 ); + memcpy( &dValue, pabyBuf+52, 8 ); + psSHP->adBoundsMax[0] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+60 ); + memcpy( &dValue, pabyBuf+60, 8 ); + psSHP->adBoundsMax[1] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+68 ); /* z */ + memcpy( &dValue, pabyBuf+68, 8 ); + psSHP->adBoundsMin[2] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+76 ); + memcpy( &dValue, pabyBuf+76, 8 ); + psSHP->adBoundsMax[2] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+84 ); /* z */ + memcpy( &dValue, pabyBuf+84, 8 ); + psSHP->adBoundsMin[3] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+92 ); + memcpy( &dValue, pabyBuf+92, 8 ); + psSHP->adBoundsMax[3] = dValue; + + free( pabyBuf ); + +/* -------------------------------------------------------------------- */ +/* Read the .shx file to get the offsets to each record in */ +/* the .shp file. */ +/* -------------------------------------------------------------------- */ + psSHP->nMaxRecords = psSHP->nRecords; + + psSHP->panRecOffset = + (int *) malloc(sizeof(int) * MAX(1,psSHP->nMaxRecords) ); + psSHP->panRecSize = + (int *) malloc(sizeof(int) * MAX(1,psSHP->nMaxRecords) ); + pabyBuf = (uchar *) malloc(8 * MAX(1,psSHP->nRecords) ); + + if (psSHP->panRecOffset == NULL || + psSHP->panRecSize == NULL || + pabyBuf == NULL) + { + char szError[200]; + + sprintf(szError, + "Not enough memory to allocate requested memory (nRecords=%d).\n" + "Probably broken SHP file", + psSHP->nRecords ); + psSHP->sHooks.Error( szError ); + psSHP->sHooks.FClose( psSHP->fpSHP ); + psSHP->sHooks.FClose( psSHP->fpSHX ); + if (psSHP->panRecOffset) free( psSHP->panRecOffset ); + if (psSHP->panRecSize) free( psSHP->panRecSize ); + if (pabyBuf) free( pabyBuf ); + free( psSHP ); + return( NULL ); + } + + if( (int) psSHP->sHooks.FRead( pabyBuf, 8, psSHP->nRecords, psSHP->fpSHX ) + != psSHP->nRecords ) + { + char szError[200]; + + sprintf( szError, + "Failed to read all values for %d records in .shx file.", + psSHP->nRecords ); + psSHP->sHooks.Error( szError ); + + /* SHX is short or unreadable for some reason. */ + psSHP->sHooks.FClose( psSHP->fpSHP ); + psSHP->sHooks.FClose( psSHP->fpSHX ); + free( psSHP->panRecOffset ); + free( psSHP->panRecSize ); + free( pabyBuf ); + free( psSHP ); + + return( NULL ); + } + + /* In read-only mode, we can close the SHX now */ + if (strcmp(pszAccess, "rb") == 0) + { + psSHP->sHooks.FClose( psSHP->fpSHX ); + psSHP->fpSHX = NULL; + } + + for( i = 0; i < psSHP->nRecords; i++ ) + { + int32 nOffset, nLength; + + memcpy( &nOffset, pabyBuf + i * 8, 4 ); + if( !bBigEndian ) SwapWord( 4, &nOffset ); + + memcpy( &nLength, pabyBuf + i * 8 + 4, 4 ); + if( !bBigEndian ) SwapWord( 4, &nLength ); + + psSHP->panRecOffset[i] = nOffset*2; + psSHP->panRecSize[i] = nLength*2; + } + free( pabyBuf ); + + return( psSHP ); +} + +/************************************************************************/ +/* SHPClose() */ +/* */ +/* Close the .shp and .shx files. */ +/************************************************************************/ + +void SHPAPI_CALL +SHPClose(SHPHandle psSHP ) + +{ + if( psSHP == NULL ) + return; + +/* -------------------------------------------------------------------- */ +/* Update the header if we have modified anything. */ +/* -------------------------------------------------------------------- */ + if( psSHP->bUpdated ) + SHPWriteHeader( psSHP ); + +/* -------------------------------------------------------------------- */ +/* Free all resources, and close files. */ +/* -------------------------------------------------------------------- */ + free( psSHP->panRecOffset ); + free( psSHP->panRecSize ); + + if ( psSHP->fpSHX != NULL) + psSHP->sHooks.FClose( psSHP->fpSHX ); + psSHP->sHooks.FClose( psSHP->fpSHP ); + + if( psSHP->pabyRec != NULL ) + { + free( psSHP->pabyRec ); + } + + free( psSHP ); +} + +/************************************************************************/ +/* SHPGetInfo() */ +/* */ +/* Fetch general information about the shape file. */ +/************************************************************************/ + +void SHPAPI_CALL +SHPGetInfo(SHPHandle psSHP, int * pnEntities, int * pnShapeType, + double * padfMinBound, double * padfMaxBound ) + +{ + int i; + + if( psSHP == NULL ) + return; + + if( pnEntities != NULL ) + *pnEntities = psSHP->nRecords; + + if( pnShapeType != NULL ) + *pnShapeType = psSHP->nShapeType; + + for( i = 0; i < 4; i++ ) + { + if( padfMinBound != NULL ) + padfMinBound[i] = psSHP->adBoundsMin[i]; + if( padfMaxBound != NULL ) + padfMaxBound[i] = psSHP->adBoundsMax[i]; + } +} + +/************************************************************************/ +/* SHPCreate() */ +/* */ +/* Create a new shape file and return a handle to the open */ +/* shape file with read/write access. */ +/************************************************************************/ + +SHPHandle SHPAPI_CALL +SHPCreate( const char * pszLayer, int nShapeType ) + +{ + SAHooks sHooks; + + SASetupDefaultHooks( &sHooks ); + + return SHPCreateLL( pszLayer, nShapeType, &sHooks ); +} + +/************************************************************************/ +/* SHPCreate() */ +/* */ +/* Create a new shape file and return a handle to the open */ +/* shape file with read/write access. */ +/************************************************************************/ + +SHPHandle SHPAPI_CALL +SHPCreateLL( const char * pszLayer, int nShapeType, SAHooks *psHooks ) + +{ + char *pszBasename, *pszFullname; + int i; + SAFile fpSHP, fpSHX; + uchar abyHeader[100]; + int32 i32; + double dValue; + +/* -------------------------------------------------------------------- */ +/* Establish the byte order on this system. */ +/* -------------------------------------------------------------------- */ + i = 1; + if( *((uchar *) &i) == 1 ) + bBigEndian = FALSE; + else + bBigEndian = TRUE; + +/* -------------------------------------------------------------------- */ +/* Compute the base (layer) name. If there is any extension */ +/* on the passed in filename we will strip it off. */ +/* -------------------------------------------------------------------- */ + pszBasename = (char *) malloc(strlen(pszLayer)+5); + strcpy( pszBasename, pszLayer ); + for( i = strlen(pszBasename)-1; + i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' + && pszBasename[i] != '\\'; + i-- ) {} + + if( pszBasename[i] == '.' ) + pszBasename[i] = '\0'; + +/* -------------------------------------------------------------------- */ +/* Open the two files so we can write their headers. */ +/* -------------------------------------------------------------------- */ + pszFullname = (char *) malloc(strlen(pszBasename) + 5); + sprintf( pszFullname, "%s.shp", pszBasename ); + fpSHP = psHooks->FOpen(pszFullname, "wb" ); + if( fpSHP == NULL ) + { + psHooks->Error( "Failed to create file .shp file." ); + return( NULL ); + } + + sprintf( pszFullname, "%s.shx", pszBasename ); + fpSHX = psHooks->FOpen(pszFullname, "wb" ); + if( fpSHX == NULL ) + { + psHooks->Error( "Failed to create file .shx file." ); + return( NULL ); + } + + free( pszFullname ); + free( pszBasename ); + +/* -------------------------------------------------------------------- */ +/* Prepare header block for .shp file. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < 100; i++ ) + abyHeader[i] = 0; + + abyHeader[2] = 0x27; /* magic cookie */ + abyHeader[3] = 0x0a; + + i32 = 50; /* file size */ + ByteCopy( &i32, abyHeader+24, 4 ); + if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); + + i32 = 1000; /* version */ + ByteCopy( &i32, abyHeader+28, 4 ); + if( bBigEndian ) SwapWord( 4, abyHeader+28 ); + + i32 = nShapeType; /* shape type */ + ByteCopy( &i32, abyHeader+32, 4 ); + if( bBigEndian ) SwapWord( 4, abyHeader+32 ); + + dValue = 0.0; /* set bounds */ + ByteCopy( &dValue, abyHeader+36, 8 ); + ByteCopy( &dValue, abyHeader+44, 8 ); + ByteCopy( &dValue, abyHeader+52, 8 ); + ByteCopy( &dValue, abyHeader+60, 8 ); + +/* -------------------------------------------------------------------- */ +/* Write .shp file header. */ +/* -------------------------------------------------------------------- */ + if( psHooks->FWrite( abyHeader, 100, 1, fpSHP ) != 1 ) + { + psHooks->Error( "Failed to write .shp header." ); + return NULL; + } + +/* -------------------------------------------------------------------- */ +/* Prepare, and write .shx file header. */ +/* -------------------------------------------------------------------- */ + i32 = 50; /* file size */ + ByteCopy( &i32, abyHeader+24, 4 ); + if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); + + if( psHooks->FWrite( abyHeader, 100, 1, fpSHX ) != 1 ) + { + psHooks->Error( "Failed to write .shx header." ); + return NULL; + } + +/* -------------------------------------------------------------------- */ +/* Close the files, and then open them as regular existing files. */ +/* -------------------------------------------------------------------- */ + psHooks->FClose( fpSHP ); + psHooks->FClose( fpSHX ); + + return( SHPOpenLL( pszLayer, "r+b", psHooks ) ); +} + +/************************************************************************/ +/* _SHPSetBounds() */ +/* */ +/* Compute a bounds rectangle for a shape, and set it into the */ +/* indicated location in the record. */ +/************************************************************************/ + +static void _SHPSetBounds( uchar * pabyRec, SHPObject * psShape ) + +{ + ByteCopy( &(psShape->dfXMin), pabyRec + 0, 8 ); + ByteCopy( &(psShape->dfYMin), pabyRec + 8, 8 ); + ByteCopy( &(psShape->dfXMax), pabyRec + 16, 8 ); + ByteCopy( &(psShape->dfYMax), pabyRec + 24, 8 ); + + if( bBigEndian ) + { + SwapWord( 8, pabyRec + 0 ); + SwapWord( 8, pabyRec + 8 ); + SwapWord( 8, pabyRec + 16 ); + SwapWord( 8, pabyRec + 24 ); + } +} + +/************************************************************************/ +/* SHPComputeExtents() */ +/* */ +/* Recompute the extents of a shape. Automatically done by */ +/* SHPCreateObject(). */ +/************************************************************************/ + +void SHPAPI_CALL +SHPComputeExtents( SHPObject * psObject ) + +{ + int i; + +/* -------------------------------------------------------------------- */ +/* Build extents for this object. */ +/* -------------------------------------------------------------------- */ + if( psObject->nVertices > 0 ) + { + psObject->dfXMin = psObject->dfXMax = psObject->padfX[0]; + psObject->dfYMin = psObject->dfYMax = psObject->padfY[0]; + psObject->dfZMin = psObject->dfZMax = psObject->padfZ[0]; + psObject->dfMMin = psObject->dfMMax = psObject->padfM[0]; + } + + for( i = 0; i < psObject->nVertices; i++ ) + { + psObject->dfXMin = MIN(psObject->dfXMin, psObject->padfX[i]); + psObject->dfYMin = MIN(psObject->dfYMin, psObject->padfY[i]); + psObject->dfZMin = MIN(psObject->dfZMin, psObject->padfZ[i]); + psObject->dfMMin = MIN(psObject->dfMMin, psObject->padfM[i]); + + psObject->dfXMax = MAX(psObject->dfXMax, psObject->padfX[i]); + psObject->dfYMax = MAX(psObject->dfYMax, psObject->padfY[i]); + psObject->dfZMax = MAX(psObject->dfZMax, psObject->padfZ[i]); + psObject->dfMMax = MAX(psObject->dfMMax, psObject->padfM[i]); + } +} + +/************************************************************************/ +/* SHPCreateObject() */ +/* */ +/* Create a shape object. It should be freed with */ +/* SHPDestroyObject(). */ +/************************************************************************/ + +SHPObject SHPAPI_CALL1(*) +SHPCreateObject( int nSHPType, int nShapeId, int nParts, + const int * panPartStart, const int * panPartType, + int nVertices, const double *padfX, const double *padfY, + const double * padfZ, const double * padfM ) + +{ + SHPObject *psObject; + int i, bHasM, bHasZ; + + psObject = (SHPObject *) calloc(1,sizeof(SHPObject)); + psObject->nSHPType = nSHPType; + psObject->nShapeId = nShapeId; + psObject->bMeasureIsUsed = FALSE; + +/* -------------------------------------------------------------------- */ +/* Establish whether this shape type has M, and Z values. */ +/* -------------------------------------------------------------------- */ + if( nSHPType == SHPT_ARCM + || nSHPType == SHPT_POINTM + || nSHPType == SHPT_POLYGONM + || nSHPType == SHPT_MULTIPOINTM ) + { + bHasM = TRUE; + bHasZ = FALSE; + } + else if( nSHPType == SHPT_ARCZ + || nSHPType == SHPT_POINTZ + || nSHPType == SHPT_POLYGONZ + || nSHPType == SHPT_MULTIPOINTZ + || nSHPType == SHPT_MULTIPATCH ) + { + bHasM = TRUE; + bHasZ = TRUE; + } + else + { + bHasM = FALSE; + bHasZ = FALSE; + } + +/* -------------------------------------------------------------------- */ +/* Capture parts. Note that part type is optional, and */ +/* defaults to ring. */ +/* -------------------------------------------------------------------- */ + if( nSHPType == SHPT_ARC || nSHPType == SHPT_POLYGON + || nSHPType == SHPT_ARCM || nSHPType == SHPT_POLYGONM + || nSHPType == SHPT_ARCZ || nSHPType == SHPT_POLYGONZ + || nSHPType == SHPT_MULTIPATCH ) + { + psObject->nParts = MAX(1,nParts); + + psObject->panPartStart = (int *) + malloc(sizeof(int) * psObject->nParts); + psObject->panPartType = (int *) + malloc(sizeof(int) * psObject->nParts); + + psObject->panPartStart[0] = 0; + psObject->panPartType[0] = SHPP_RING; + + for( i = 0; i < nParts; i++ ) + { + psObject->panPartStart[i] = panPartStart[i]; + + if( panPartType != NULL ) + psObject->panPartType[i] = panPartType[i]; + else + psObject->panPartType[i] = SHPP_RING; + } + + if( psObject->panPartStart[0] != 0 ) + psObject->panPartStart[0] = 0; + } + +/* -------------------------------------------------------------------- */ +/* Capture vertices. Note that Z and M are optional, but X and */ +/* Y are not. */ +/* -------------------------------------------------------------------- */ + if( nVertices > 0 ) + { + psObject->padfX = (double *) calloc(sizeof(double),nVertices); + psObject->padfY = (double *) calloc(sizeof(double),nVertices); + psObject->padfZ = (double *) calloc(sizeof(double),nVertices); + psObject->padfM = (double *) calloc(sizeof(double),nVertices); + + assert( padfX != NULL ); + assert( padfY != NULL ); + + for( i = 0; i < nVertices; i++ ) + { + psObject->padfX[i] = padfX[i]; + psObject->padfY[i] = padfY[i]; + if( padfZ != NULL && bHasZ ) + psObject->padfZ[i] = padfZ[i]; + if( padfM != NULL && bHasM ) + psObject->padfM[i] = padfM[i]; + } + if( padfM != NULL && bHasM ) + psObject->bMeasureIsUsed = TRUE; + } + +/* -------------------------------------------------------------------- */ +/* Compute the extents. */ +/* -------------------------------------------------------------------- */ + psObject->nVertices = nVertices; + SHPComputeExtents( psObject ); + + return( psObject ); +} + +/************************************************************************/ +/* SHPCreateSimpleObject() */ +/* */ +/* Create a simple (common) shape object. Destroy with */ +/* SHPDestroyObject(). */ +/************************************************************************/ + +SHPObject SHPAPI_CALL1(*) +SHPCreateSimpleObject( int nSHPType, int nVertices, + const double * padfX, const double * padfY, + const double * padfZ ) + +{ + return( SHPCreateObject( nSHPType, -1, 0, NULL, NULL, + nVertices, padfX, padfY, padfZ, NULL ) ); +} + +/************************************************************************/ +/* SHPWriteObject() */ +/* */ +/* Write out the vertices of a new structure. Note that it is */ +/* only possible to write vertices at the end of the file. */ +/************************************************************************/ + +int SHPAPI_CALL +SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject * psObject ) + +{ + int nRecordOffset, i, nRecordSize=0; + uchar *pabyRec; + int32 i32; + + psSHP->bUpdated = TRUE; + +/* -------------------------------------------------------------------- */ +/* Ensure that shape object matches the type of the file it is */ +/* being written to. */ +/* -------------------------------------------------------------------- */ + assert( psObject->nSHPType == psSHP->nShapeType + || psObject->nSHPType == SHPT_NULL ); + +/* -------------------------------------------------------------------- */ +/* Ensure that -1 is used for appends. Either blow an */ +/* assertion, or if they are disabled, set the shapeid to -1 */ +/* for appends. */ +/* -------------------------------------------------------------------- */ + assert( nShapeId == -1 + || (nShapeId >= 0 && nShapeId < psSHP->nRecords) ); + + if( nShapeId != -1 && nShapeId >= psSHP->nRecords ) + nShapeId = -1; + +/* -------------------------------------------------------------------- */ +/* Add the new entity to the in memory index. */ +/* -------------------------------------------------------------------- */ + if( nShapeId == -1 && psSHP->nRecords+1 > psSHP->nMaxRecords ) + { + psSHP->nMaxRecords =(int) ( psSHP->nMaxRecords * 1.3 + 100); + + psSHP->panRecOffset = (int *) + SfRealloc(psSHP->panRecOffset,sizeof(int) * psSHP->nMaxRecords ); + psSHP->panRecSize = (int *) + SfRealloc(psSHP->panRecSize,sizeof(int) * psSHP->nMaxRecords ); + } + +/* -------------------------------------------------------------------- */ +/* Initialize record. */ +/* -------------------------------------------------------------------- */ + pabyRec = (uchar *) malloc(psObject->nVertices * 4 * sizeof(double) + + psObject->nParts * 8 + 128); + +/* -------------------------------------------------------------------- */ +/* Extract vertices for a Polygon or Arc. */ +/* -------------------------------------------------------------------- */ + if( psObject->nSHPType == SHPT_POLYGON + || psObject->nSHPType == SHPT_POLYGONZ + || psObject->nSHPType == SHPT_POLYGONM + || psObject->nSHPType == SHPT_ARC + || psObject->nSHPType == SHPT_ARCZ + || psObject->nSHPType == SHPT_ARCM + || psObject->nSHPType == SHPT_MULTIPATCH ) + { + int32 nPoints, nParts; + int i; + + nPoints = psObject->nVertices; + nParts = psObject->nParts; + + _SHPSetBounds( pabyRec + 12, psObject ); + + if( bBigEndian ) SwapWord( 4, &nPoints ); + if( bBigEndian ) SwapWord( 4, &nParts ); + + ByteCopy( &nPoints, pabyRec + 40 + 8, 4 ); + ByteCopy( &nParts, pabyRec + 36 + 8, 4 ); + + nRecordSize = 52; + + /* + * Write part start positions. + */ + ByteCopy( psObject->panPartStart, pabyRec + 44 + 8, + 4 * psObject->nParts ); + for( i = 0; i < psObject->nParts; i++ ) + { + if( bBigEndian ) SwapWord( 4, pabyRec + 44 + 8 + 4*i ); + nRecordSize += 4; + } + + /* + * Write multipatch part types if needed. + */ + if( psObject->nSHPType == SHPT_MULTIPATCH ) + { + memcpy( pabyRec + nRecordSize, psObject->panPartType, + 4*psObject->nParts ); + for( i = 0; i < psObject->nParts; i++ ) + { + if( bBigEndian ) SwapWord( 4, pabyRec + nRecordSize ); + nRecordSize += 4; + } + } + + /* + * Write the (x,y) vertex values. + */ + for( i = 0; i < psObject->nVertices; i++ ) + { + ByteCopy( psObject->padfX + i, pabyRec + nRecordSize, 8 ); + ByteCopy( psObject->padfY + i, pabyRec + nRecordSize + 8, 8 ); + + if( bBigEndian ) + SwapWord( 8, pabyRec + nRecordSize ); + + if( bBigEndian ) + SwapWord( 8, pabyRec + nRecordSize + 8 ); + + nRecordSize += 2 * 8; + } + + /* + * Write the Z coordinates (if any). + */ + if( psObject->nSHPType == SHPT_POLYGONZ + || psObject->nSHPType == SHPT_ARCZ + || psObject->nSHPType == SHPT_MULTIPATCH ) + { + ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + for( i = 0; i < psObject->nVertices; i++ ) + { + ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + } + } + + /* + * Write the M values, if any. + */ + if( psObject->bMeasureIsUsed + && (psObject->nSHPType == SHPT_POLYGONM + || psObject->nSHPType == SHPT_ARCM +#ifndef DISABLE_MULTIPATCH_MEASURE + || psObject->nSHPType == SHPT_MULTIPATCH +#endif + || psObject->nSHPType == SHPT_POLYGONZ + || psObject->nSHPType == SHPT_ARCZ) ) + { + ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + for( i = 0; i < psObject->nVertices; i++ ) + { + ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + } + } + } + +/* -------------------------------------------------------------------- */ +/* Extract vertices for a MultiPoint. */ +/* -------------------------------------------------------------------- */ + else if( psObject->nSHPType == SHPT_MULTIPOINT + || psObject->nSHPType == SHPT_MULTIPOINTZ + || psObject->nSHPType == SHPT_MULTIPOINTM ) + { + int32 nPoints; + int i; + + nPoints = psObject->nVertices; + + _SHPSetBounds( pabyRec + 12, psObject ); + + if( bBigEndian ) SwapWord( 4, &nPoints ); + ByteCopy( &nPoints, pabyRec + 44, 4 ); + + for( i = 0; i < psObject->nVertices; i++ ) + { + ByteCopy( psObject->padfX + i, pabyRec + 48 + i*16, 8 ); + ByteCopy( psObject->padfY + i, pabyRec + 48 + i*16 + 8, 8 ); + + if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 ); + if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 + 8 ); + } + + nRecordSize = 48 + 16 * psObject->nVertices; + + if( psObject->nSHPType == SHPT_MULTIPOINTZ ) + { + ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + for( i = 0; i < psObject->nVertices; i++ ) + { + ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + } + } + + if( psObject->bMeasureIsUsed + && (psObject->nSHPType == SHPT_MULTIPOINTZ + || psObject->nSHPType == SHPT_MULTIPOINTM) ) + { + ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + for( i = 0; i < psObject->nVertices; i++ ) + { + ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + } + } + } + +/* -------------------------------------------------------------------- */ +/* Write point. */ +/* -------------------------------------------------------------------- */ + else if( psObject->nSHPType == SHPT_POINT + || psObject->nSHPType == SHPT_POINTZ + || psObject->nSHPType == SHPT_POINTM ) + { + ByteCopy( psObject->padfX, pabyRec + 12, 8 ); + ByteCopy( psObject->padfY, pabyRec + 20, 8 ); + + if( bBigEndian ) SwapWord( 8, pabyRec + 12 ); + if( bBigEndian ) SwapWord( 8, pabyRec + 20 ); + + nRecordSize = 28; + + if( psObject->nSHPType == SHPT_POINTZ ) + { + ByteCopy( psObject->padfZ, pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + } + + if( psObject->bMeasureIsUsed + && (psObject->nSHPType == SHPT_POINTZ + || psObject->nSHPType == SHPT_POINTM) ) + { + ByteCopy( psObject->padfM, pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + } + } + +/* -------------------------------------------------------------------- */ +/* Not much to do for null geometries. */ +/* -------------------------------------------------------------------- */ + else if( psObject->nSHPType == SHPT_NULL ) + { + nRecordSize = 12; + } + + else + { + /* unknown type */ + assert( FALSE ); + } + +/* -------------------------------------------------------------------- */ +/* Establish where we are going to put this record. If we are */ +/* rewriting and existing record, and it will fit, then put it */ +/* back where the original came from. Otherwise write at the end. */ +/* -------------------------------------------------------------------- */ + if( nShapeId == -1 || psSHP->panRecSize[nShapeId] < nRecordSize-8 ) + { + if( nShapeId == -1 ) + nShapeId = psSHP->nRecords++; + + psSHP->panRecOffset[nShapeId] = nRecordOffset = psSHP->nFileSize; + psSHP->panRecSize[nShapeId] = nRecordSize-8; + psSHP->nFileSize += nRecordSize; + } + else + { + nRecordOffset = psSHP->panRecOffset[nShapeId]; + psSHP->panRecSize[nShapeId] = nRecordSize-8; + } + +/* -------------------------------------------------------------------- */ +/* Set the shape type, record number, and record size. */ +/* -------------------------------------------------------------------- */ + i32 = nShapeId+1; /* record # */ + if( !bBigEndian ) SwapWord( 4, &i32 ); + ByteCopy( &i32, pabyRec, 4 ); + + i32 = (nRecordSize-8)/2; /* record size */ + if( !bBigEndian ) SwapWord( 4, &i32 ); + ByteCopy( &i32, pabyRec + 4, 4 ); + + i32 = psObject->nSHPType; /* shape type */ + if( bBigEndian ) SwapWord( 4, &i32 ); + ByteCopy( &i32, pabyRec + 8, 4 ); + +/* -------------------------------------------------------------------- */ +/* Write out record. */ +/* -------------------------------------------------------------------- */ + if( psSHP->sHooks.FSeek( psSHP->fpSHP, nRecordOffset, 0 ) != 0 + || psSHP->sHooks.FWrite( pabyRec, nRecordSize, 1, psSHP->fpSHP ) < 1 ) + { + psSHP->sHooks.Error( "Error in psSHP->sHooks.FSeek() or fwrite() writing object to .shp file." ); + free( pabyRec ); + return -1; + } + + free( pabyRec ); + +/* -------------------------------------------------------------------- */ +/* Expand file wide bounds based on this shape. */ +/* -------------------------------------------------------------------- */ + if( psSHP->adBoundsMin[0] == 0.0 + && psSHP->adBoundsMax[0] == 0.0 + && psSHP->adBoundsMin[1] == 0.0 + && psSHP->adBoundsMax[1] == 0.0 ) + { + if( psObject->nSHPType == SHPT_NULL || psObject->nVertices == 0 ) + { + psSHP->adBoundsMin[0] = psSHP->adBoundsMax[0] = 0.0; + psSHP->adBoundsMin[1] = psSHP->adBoundsMax[1] = 0.0; + psSHP->adBoundsMin[2] = psSHP->adBoundsMax[2] = 0.0; + psSHP->adBoundsMin[3] = psSHP->adBoundsMax[3] = 0.0; + } + else + { + psSHP->adBoundsMin[0] = psSHP->adBoundsMax[0] = psObject->padfX[0]; + psSHP->adBoundsMin[1] = psSHP->adBoundsMax[1] = psObject->padfY[0]; + psSHP->adBoundsMin[2] = psSHP->adBoundsMax[2] = psObject->padfZ[0]; + psSHP->adBoundsMin[3] = psSHP->adBoundsMax[3] = psObject->padfM[0]; + } + } + + for( i = 0; i < psObject->nVertices; i++ ) + { + psSHP->adBoundsMin[0] = MIN(psSHP->adBoundsMin[0],psObject->padfX[i]); + psSHP->adBoundsMin[1] = MIN(psSHP->adBoundsMin[1],psObject->padfY[i]); + psSHP->adBoundsMin[2] = MIN(psSHP->adBoundsMin[2],psObject->padfZ[i]); + psSHP->adBoundsMin[3] = MIN(psSHP->adBoundsMin[3],psObject->padfM[i]); + psSHP->adBoundsMax[0] = MAX(psSHP->adBoundsMax[0],psObject->padfX[i]); + psSHP->adBoundsMax[1] = MAX(psSHP->adBoundsMax[1],psObject->padfY[i]); + psSHP->adBoundsMax[2] = MAX(psSHP->adBoundsMax[2],psObject->padfZ[i]); + psSHP->adBoundsMax[3] = MAX(psSHP->adBoundsMax[3],psObject->padfM[i]); + } + + return( nShapeId ); +} + +/************************************************************************/ +/* SHPReadObject() */ +/* */ +/* Read the vertices, parts, and other non-attribute information */ +/* for one shape. */ +/************************************************************************/ + +SHPObject SHPAPI_CALL1(*) +SHPReadObject( SHPHandle psSHP, int hEntity ) + +{ + int nEntitySize, nRequiredSize; + SHPObject *psShape; + char pszErrorMsg[128]; + +/* -------------------------------------------------------------------- */ +/* Validate the record/entity number. */ +/* -------------------------------------------------------------------- */ + if( hEntity < 0 || hEntity >= psSHP->nRecords ) + return( NULL ); + +/* -------------------------------------------------------------------- */ +/* Ensure our record buffer is large enough. */ +/* -------------------------------------------------------------------- */ + nEntitySize = psSHP->panRecSize[hEntity]+8; + if( nEntitySize > psSHP->nBufSize ) + { + psSHP->pabyRec = (uchar *) SfRealloc(psSHP->pabyRec,nEntitySize); + if (psSHP->pabyRec == NULL) + { + char szError[200]; + + /* Reallocate previous successfull size for following features */ + psSHP->pabyRec = malloc(psSHP->nBufSize); + + sprintf( szError, + "Not enough memory to allocate requested memory (nBufSize=%d). " + "Probably broken SHP file", psSHP->nBufSize ); + psSHP->sHooks.Error( szError ); + return NULL; + } + + /* Only set new buffer size after successfull alloc */ + psSHP->nBufSize = nEntitySize; + } + + /* In case we were not able to reallocate the buffer on a previous step */ + if (psSHP->pabyRec == NULL) + { + return NULL; + } + +/* -------------------------------------------------------------------- */ +/* Read the record. */ +/* -------------------------------------------------------------------- */ + if( psSHP->sHooks.FSeek( psSHP->fpSHP, psSHP->panRecOffset[hEntity], 0 ) != 0 + || psSHP->sHooks.FRead( psSHP->pabyRec, nEntitySize, 1, + psSHP->fpSHP ) != 1 ) + { + /* + * TODO - mloskot: Consider detailed diagnostics of shape file, + * for example to detect if file is truncated. + */ + + psSHP->sHooks.Error( "Error in fseek() or fread() reading object from .shp file." ); + return NULL; + } + +/* -------------------------------------------------------------------- */ +/* Allocate and minimally initialize the object. */ +/* -------------------------------------------------------------------- */ + psShape = (SHPObject *) calloc(1,sizeof(SHPObject)); + psShape->nShapeId = hEntity; + psShape->bMeasureIsUsed = FALSE; + + if ( 8 + 4 > nEntitySize ) + { + g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : nEntitySize = %d", + hEntity, nEntitySize); + psSHP->sHooks.Error( pszErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + memcpy( &psShape->nSHPType, psSHP->pabyRec + 8, 4 ); + + if( bBigEndian ) SwapWord( 4, &(psShape->nSHPType) ); + +/* ==================================================================== */ +/* Extract vertices for a Polygon or Arc. */ +/* ==================================================================== */ + if( psShape->nSHPType == SHPT_POLYGON || psShape->nSHPType == SHPT_ARC + || psShape->nSHPType == SHPT_POLYGONZ + || psShape->nSHPType == SHPT_POLYGONM + || psShape->nSHPType == SHPT_ARCZ + || psShape->nSHPType == SHPT_ARCM + || psShape->nSHPType == SHPT_MULTIPATCH ) + { + int32 nPoints, nParts; + int i, nOffset; + + if ( 40 + 8 + 4 > nEntitySize ) + { + g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : nEntitySize = %d", + hEntity, nEntitySize); + psSHP->sHooks.Error( pszErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } +/* -------------------------------------------------------------------- */ +/* Get the X/Y bounds. */ +/* -------------------------------------------------------------------- */ + memcpy( &(psShape->dfXMin), psSHP->pabyRec + 8 + 4, 8 ); + memcpy( &(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8 ); + memcpy( &(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8 ); + memcpy( &(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8 ); + + if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) ); + +/* -------------------------------------------------------------------- */ +/* Extract part/point count, and build vertex and part arrays */ +/* to proper size. */ +/* -------------------------------------------------------------------- */ + memcpy( &nPoints, psSHP->pabyRec + 40 + 8, 4 ); + memcpy( &nParts, psSHP->pabyRec + 36 + 8, 4 ); + + if( bBigEndian ) SwapWord( 4, &nPoints ); + if( bBigEndian ) SwapWord( 4, &nParts ); + + if (nPoints < 0 || nParts < 0 || + nPoints > 50 * 1000 * 1000 || nParts > 10 * 1000 * 1000) + { + g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d, nPoints=%d, nParts=%d.", + hEntity, nPoints, nParts); + psSHP->sHooks.Error( pszErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + + /* With the previous checks on nPoints and nParts, */ + /* we should not overflow here and after */ + /* since 50 M * (16 + 8 + 8) = 1 600 MB */ + nRequiredSize = 44 + 8 + 4 * nParts + 16 * nPoints; + if ( psShape->nSHPType == SHPT_POLYGONZ + || psShape->nSHPType == SHPT_ARCZ + || psShape->nSHPType == SHPT_MULTIPATCH ) + { + nRequiredSize += 16 + 8 * nPoints; + } + if( psShape->nSHPType == SHPT_MULTIPATCH ) + { + nRequiredSize += 4 * nParts; + } + if (nRequiredSize > nEntitySize) + { + g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d, nPoints=%d, nParts=%d, nEntitySize=%d.", + hEntity, nPoints, nParts, nEntitySize); + psSHP->sHooks.Error( pszErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + + psShape->nVertices = nPoints; + psShape->padfX = (double *) calloc(nPoints,sizeof(double)); + psShape->padfY = (double *) calloc(nPoints,sizeof(double)); + psShape->padfZ = (double *) calloc(nPoints,sizeof(double)); + psShape->padfM = (double *) calloc(nPoints,sizeof(double)); + + psShape->nParts = nParts; + psShape->panPartStart = (int *) calloc(nParts,sizeof(int)); + psShape->panPartType = (int *) calloc(nParts,sizeof(int)); + + if (psShape->padfX == NULL || + psShape->padfY == NULL || + psShape->padfZ == NULL || + psShape->padfM == NULL || + psShape->panPartStart == NULL || + psShape->panPartType == NULL) + { + g_snprintf(pszErrorMsg, 128, + "Not enough memory to allocate requested memory (nPoints=%d, nParts=%d) for shape %d. " + "Probably broken SHP file", hEntity, nPoints, nParts ); + psSHP->sHooks.Error( pszErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + + for( i = 0; i < nParts; i++ ) + psShape->panPartType[i] = SHPP_RING; + +/* -------------------------------------------------------------------- */ +/* Copy out the part array from the record. */ +/* -------------------------------------------------------------------- */ + memcpy( psShape->panPartStart, psSHP->pabyRec + 44 + 8, 4 * nParts ); + for( i = 0; i < nParts; i++ ) + { + if( bBigEndian ) SwapWord( 4, psShape->panPartStart+i ); + + /* We check that the offset is inside the vertex array */ + if (psShape->panPartStart[i] < 0 || + psShape->panPartStart[i] >= psShape->nVertices) + { + g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : panPartStart[%d] = %d, nVertices = %d", + hEntity, i, psShape->panPartStart[i], psShape->nVertices); + psSHP->sHooks.Error( pszErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + if (i > 0 && psShape->panPartStart[i] <= psShape->panPartStart[i-1]) + { + g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : panPartStart[%d] = %d, panPartStart[%d] = %d", + hEntity, i, psShape->panPartStart[i], i - 1, psShape->panPartStart[i - 1]); + psSHP->sHooks.Error( pszErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + } + + nOffset = 44 + 8 + 4*nParts; + +/* -------------------------------------------------------------------- */ +/* If this is a multipatch, we will also have parts types. */ +/* -------------------------------------------------------------------- */ + if( psShape->nSHPType == SHPT_MULTIPATCH ) + { + memcpy( psShape->panPartType, psSHP->pabyRec + nOffset, 4*nParts ); + for( i = 0; i < nParts; i++ ) + { + if( bBigEndian ) SwapWord( 4, psShape->panPartType+i ); + } + + nOffset += 4*nParts; + } + +/* -------------------------------------------------------------------- */ +/* Copy out the vertices from the record. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < nPoints; i++ ) + { + memcpy(psShape->padfX + i, + psSHP->pabyRec + nOffset + i * 16, + 8 ); + + memcpy(psShape->padfY + i, + psSHP->pabyRec + nOffset + i * 16 + 8, + 8 ); + + if( bBigEndian ) SwapWord( 8, psShape->padfX + i ); + if( bBigEndian ) SwapWord( 8, psShape->padfY + i ); + } + + nOffset += 16*nPoints; + +/* -------------------------------------------------------------------- */ +/* If we have a Z coordinate, collect that now. */ +/* -------------------------------------------------------------------- */ + if( psShape->nSHPType == SHPT_POLYGONZ + || psShape->nSHPType == SHPT_ARCZ + || psShape->nSHPType == SHPT_MULTIPATCH ) + { + memcpy( &(psShape->dfZMin), psSHP->pabyRec + nOffset, 8 ); + memcpy( &(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8 ); + + if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) ); + + for( i = 0; i < nPoints; i++ ) + { + memcpy( psShape->padfZ + i, + psSHP->pabyRec + nOffset + 16 + i*8, 8 ); + if( bBigEndian ) SwapWord( 8, psShape->padfZ + i ); + } + + nOffset += 16 + 8*nPoints; + } + +/* -------------------------------------------------------------------- */ +/* If we have a M measure value, then read it now. We assume */ +/* that the measure can be present for any shape if the size is */ +/* big enough, but really it will only occur for the Z shapes */ +/* (options), and the M shapes. */ +/* -------------------------------------------------------------------- */ + if( nEntitySize >= nOffset + 16 + 8*nPoints ) + { + memcpy( &(psShape->dfMMin), psSHP->pabyRec + nOffset, 8 ); + memcpy( &(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8 ); + + if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) ); + + for( i = 0; i < nPoints; i++ ) + { + memcpy( psShape->padfM + i, + psSHP->pabyRec + nOffset + 16 + i*8, 8 ); + if( bBigEndian ) SwapWord( 8, psShape->padfM + i ); + } + psShape->bMeasureIsUsed = TRUE; + } + } + +/* ==================================================================== */ +/* Extract vertices for a MultiPoint. */ +/* ==================================================================== */ + else if( psShape->nSHPType == SHPT_MULTIPOINT + || psShape->nSHPType == SHPT_MULTIPOINTM + || psShape->nSHPType == SHPT_MULTIPOINTZ ) + { + int32 nPoints; + int i, nOffset; + + if ( 44 + 4 > nEntitySize ) + { + g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : nEntitySize = %d", + hEntity, nEntitySize); + psSHP->sHooks.Error( pszErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + memcpy( &nPoints, psSHP->pabyRec + 44, 4 ); + + if( bBigEndian ) SwapWord( 4, &nPoints ); + + if (nPoints < 0 || nPoints > 50 * 1000 * 1000) + { + g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : nPoints = %d", + hEntity, nPoints); + psSHP->sHooks.Error( pszErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + + nRequiredSize = 48 + nPoints * 16; + if( psShape->nSHPType == SHPT_MULTIPOINTZ ) + { + nRequiredSize += 16 + nPoints * 8; + } + if (nRequiredSize > nEntitySize) + { + g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : nPoints = %d, nEntitySize = %d", + hEntity, nPoints, nEntitySize); + psSHP->sHooks.Error( pszErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + + psShape->nVertices = nPoints; + psShape->padfX = (double *) calloc(nPoints,sizeof(double)); + psShape->padfY = (double *) calloc(nPoints,sizeof(double)); + psShape->padfZ = (double *) calloc(nPoints,sizeof(double)); + psShape->padfM = (double *) calloc(nPoints,sizeof(double)); + + if (psShape->padfX == NULL || + psShape->padfY == NULL || + psShape->padfZ == NULL || + psShape->padfM == NULL) + { + g_snprintf(pszErrorMsg, 128, + "Not enough memory to allocate requested memory (nPoints=%d) for shape %d. " + "Probably broken SHP file", hEntity, nPoints ); + psSHP->sHooks.Error( pszErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + + for( i = 0; i < nPoints; i++ ) + { + memcpy(psShape->padfX+i, psSHP->pabyRec + 48 + 16 * i, 8 ); + memcpy(psShape->padfY+i, psSHP->pabyRec + 48 + 16 * i + 8, 8 ); + + if( bBigEndian ) SwapWord( 8, psShape->padfX + i ); + if( bBigEndian ) SwapWord( 8, psShape->padfY + i ); + } + + nOffset = 48 + 16*nPoints; + +/* -------------------------------------------------------------------- */ +/* Get the X/Y bounds. */ +/* -------------------------------------------------------------------- */ + memcpy( &(psShape->dfXMin), psSHP->pabyRec + 8 + 4, 8 ); + memcpy( &(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8 ); + memcpy( &(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8 ); + memcpy( &(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8 ); + + if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) ); + +/* -------------------------------------------------------------------- */ +/* If we have a Z coordinate, collect that now. */ +/* -------------------------------------------------------------------- */ + if( psShape->nSHPType == SHPT_MULTIPOINTZ ) + { + memcpy( &(psShape->dfZMin), psSHP->pabyRec + nOffset, 8 ); + memcpy( &(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8 ); + + if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) ); + + for( i = 0; i < nPoints; i++ ) + { + memcpy( psShape->padfZ + i, + psSHP->pabyRec + nOffset + 16 + i*8, 8 ); + if( bBigEndian ) SwapWord( 8, psShape->padfZ + i ); + } + + nOffset += 16 + 8*nPoints; + } + +/* -------------------------------------------------------------------- */ +/* If we have a M measure value, then read it now. We assume */ +/* that the measure can be present for any shape if the size is */ +/* big enough, but really it will only occur for the Z shapes */ +/* (options), and the M shapes. */ +/* -------------------------------------------------------------------- */ + if( nEntitySize >= nOffset + 16 + 8*nPoints ) + { + memcpy( &(psShape->dfMMin), psSHP->pabyRec + nOffset, 8 ); + memcpy( &(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8 ); + + if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) ); + + for( i = 0; i < nPoints; i++ ) + { + memcpy( psShape->padfM + i, + psSHP->pabyRec + nOffset + 16 + i*8, 8 ); + if( bBigEndian ) SwapWord( 8, psShape->padfM + i ); + } + psShape->bMeasureIsUsed = TRUE; + } + } + +/* ==================================================================== */ +/* Extract vertices for a point. */ +/* ==================================================================== */ + else if( psShape->nSHPType == SHPT_POINT + || psShape->nSHPType == SHPT_POINTM + || psShape->nSHPType == SHPT_POINTZ ) + { + int nOffset; + + psShape->nVertices = 1; + psShape->padfX = (double *) calloc(1,sizeof(double)); + psShape->padfY = (double *) calloc(1,sizeof(double)); + psShape->padfZ = (double *) calloc(1,sizeof(double)); + psShape->padfM = (double *) calloc(1,sizeof(double)); + + if (20 + 8 + (( psShape->nSHPType == SHPT_POINTZ ) ? 8 : 0)> nEntitySize) + { + g_snprintf(pszErrorMsg, 128, "Corrupted .shp file : shape %d : nEntitySize = %d", + hEntity, nEntitySize); + psSHP->sHooks.Error( pszErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + memcpy( psShape->padfX, psSHP->pabyRec + 12, 8 ); + memcpy( psShape->padfY, psSHP->pabyRec + 20, 8 ); + + if( bBigEndian ) SwapWord( 8, psShape->padfX ); + if( bBigEndian ) SwapWord( 8, psShape->padfY ); + + nOffset = 20 + 8; + +/* -------------------------------------------------------------------- */ +/* If we have a Z coordinate, collect that now. */ +/* -------------------------------------------------------------------- */ + if( psShape->nSHPType == SHPT_POINTZ ) + { + memcpy( psShape->padfZ, psSHP->pabyRec + nOffset, 8 ); + + if( bBigEndian ) SwapWord( 8, psShape->padfZ ); + + nOffset += 8; + } + +/* -------------------------------------------------------------------- */ +/* If we have a M measure value, then read it now. We assume */ +/* that the measure can be present for any shape if the size is */ +/* big enough, but really it will only occur for the Z shapes */ +/* (options), and the M shapes. */ +/* -------------------------------------------------------------------- */ + if( nEntitySize >= nOffset + 8 ) + { + memcpy( psShape->padfM, psSHP->pabyRec + nOffset, 8 ); + + if( bBigEndian ) SwapWord( 8, psShape->padfM ); + psShape->bMeasureIsUsed = TRUE; + } + +/* -------------------------------------------------------------------- */ +/* Since no extents are supplied in the record, we will apply */ +/* them from the single vertex. */ +/* -------------------------------------------------------------------- */ + psShape->dfXMin = psShape->dfXMax = psShape->padfX[0]; + psShape->dfYMin = psShape->dfYMax = psShape->padfY[0]; + psShape->dfZMin = psShape->dfZMax = psShape->padfZ[0]; + psShape->dfMMin = psShape->dfMMax = psShape->padfM[0]; + } + + return( psShape ); +} + +/************************************************************************/ +/* SHPTypeName() */ +/************************************************************************/ + +const char SHPAPI_CALL1(*) +SHPTypeName( int nSHPType ) + +{ + switch( nSHPType ) + { + case SHPT_NULL: + return "NullShape"; + + case SHPT_POINT: + return "Point"; + + case SHPT_ARC: + return "Arc"; + + case SHPT_POLYGON: + return "Polygon"; + + case SHPT_MULTIPOINT: + return "MultiPoint"; + + case SHPT_POINTZ: + return "PointZ"; + + case SHPT_ARCZ: + return "ArcZ"; + + case SHPT_POLYGONZ: + return "PolygonZ"; + + case SHPT_MULTIPOINTZ: + return "MultiPointZ"; + + case SHPT_POINTM: + return "PointM"; + + case SHPT_ARCM: + return "ArcM"; + + case SHPT_POLYGONM: + return "PolygonM"; + + case SHPT_MULTIPOINTM: + return "MultiPointM"; + + case SHPT_MULTIPATCH: + return "MultiPatch"; + + default: + return "UnknownShapeType"; + } +} + +/************************************************************************/ +/* SHPPartTypeName() */ +/************************************************************************/ + +const char SHPAPI_CALL1(*) +SHPPartTypeName( int nPartType ) + +{ + switch( nPartType ) + { + case SHPP_TRISTRIP: + return "TriangleStrip"; + + case SHPP_TRIFAN: + return "TriangleFan"; + + case SHPP_OUTERRING: + return "OuterRing"; + + case SHPP_INNERRING: + return "InnerRing"; + + case SHPP_FIRSTRING: + return "FirstRing"; + + case SHPP_RING: + return "Ring"; + + default: + return "UnknownPartType"; + } +} + +/************************************************************************/ +/* SHPDestroyObject() */ +/************************************************************************/ + +void SHPAPI_CALL +SHPDestroyObject( SHPObject * psShape ) + +{ + if( psShape == NULL ) + return; + + if( psShape->padfX != NULL ) + free( psShape->padfX ); + if( psShape->padfY != NULL ) + free( psShape->padfY ); + if( psShape->padfZ != NULL ) + free( psShape->padfZ ); + if( psShape->padfM != NULL ) + free( psShape->padfM ); + + if( psShape->panPartStart != NULL ) + free( psShape->panPartStart ); + if( psShape->panPartType != NULL ) + free( psShape->panPartType ); + + free( psShape ); +} + +/************************************************************************/ +/* SHPRewindObject() */ +/* */ +/* Reset the winding of polygon objects to adhere to the */ +/* specification. */ +/************************************************************************/ + +int SHPAPI_CALL +SHPRewindObject( SHPHandle hSHP, SHPObject * psObject ) + +{ + int iOpRing, bAltered = 0; + +/* -------------------------------------------------------------------- */ +/* Do nothing if this is not a polygon object. */ +/* -------------------------------------------------------------------- */ + if( psObject->nSHPType != SHPT_POLYGON + && psObject->nSHPType != SHPT_POLYGONZ + && psObject->nSHPType != SHPT_POLYGONM ) + return 0; + + if( psObject->nVertices == 0 || psObject->nParts == 0 ) + return 0; + +/* -------------------------------------------------------------------- */ +/* Process each of the rings. */ +/* -------------------------------------------------------------------- */ + for( iOpRing = 0; iOpRing < psObject->nParts; iOpRing++ ) + { + int bInner, iVert, nVertCount, nVertStart, iCheckRing; + double dfSum, dfTestX, dfTestY; + +/* -------------------------------------------------------------------- */ +/* Determine if this ring is an inner ring or an outer ring */ +/* relative to all the other rings. For now we assume the */ +/* first ring is outer and all others are inner, but eventually */ +/* we need to fix this to handle multiple island polygons and */ +/* unordered sets of rings. */ +/* */ +/* -------------------------------------------------------------------- */ + + /* Use point in the middle of segment to avoid testing + * common points of rings. + */ + dfTestX = ( psObject->padfX[psObject->panPartStart[iOpRing]] + + psObject->padfX[psObject->panPartStart[iOpRing] + 1] ) / 2; + dfTestY = ( psObject->padfY[psObject->panPartStart[iOpRing]] + + psObject->padfY[psObject->panPartStart[iOpRing] + 1] ) / 2; + + bInner = FALSE; + for( iCheckRing = 0; iCheckRing < psObject->nParts; iCheckRing++ ) + { + int iEdge; + + if( iCheckRing == iOpRing ) + continue; + + nVertStart = psObject->panPartStart[iCheckRing]; + + if( iCheckRing == psObject->nParts-1 ) + nVertCount = psObject->nVertices + - psObject->panPartStart[iCheckRing]; + else + nVertCount = psObject->panPartStart[iCheckRing+1] + - psObject->panPartStart[iCheckRing]; + + for( iEdge = 0; iEdge < nVertCount; iEdge++ ) + { + int iNext; + + if( iEdge < nVertCount-1 ) + iNext = iEdge+1; + else + iNext = 0; + + /* Rule #1: + * Test whether the edge 'straddles' the horizontal ray from the test point (dfTestY,dfTestY) + * The rule #1 also excludes edges collinear with the ray. + */ + if ( ( psObject->padfY[iEdge+nVertStart] < dfTestY + && dfTestY <= psObject->padfY[iNext+nVertStart] ) + || ( psObject->padfY[iNext+nVertStart] < dfTestY + && dfTestY <= psObject->padfY[iEdge+nVertStart] ) ) + { + /* Rule #2: + * Test if edge-ray intersection is on the right from the test point (dfTestY,dfTestY) + */ + double const intersect = + ( psObject->padfX[iEdge+nVertStart] + + ( dfTestY - psObject->padfY[iEdge+nVertStart] ) + / ( psObject->padfY[iNext+nVertStart] - psObject->padfY[iEdge+nVertStart] ) + * ( psObject->padfX[iNext+nVertStart] - psObject->padfX[iEdge+nVertStart] ) ); + + if (intersect < dfTestX) + { + bInner = !bInner; + } + } + } + } /* for iCheckRing */ + +/* -------------------------------------------------------------------- */ +/* Determine the current order of this ring so we will know if */ +/* it has to be reversed. */ +/* -------------------------------------------------------------------- */ + nVertStart = psObject->panPartStart[iOpRing]; + + if( iOpRing == psObject->nParts-1 ) + nVertCount = psObject->nVertices - psObject->panPartStart[iOpRing]; + else + nVertCount = psObject->panPartStart[iOpRing+1] + - psObject->panPartStart[iOpRing]; + + dfSum = 0.0; + for( iVert = nVertStart; iVert < nVertStart+nVertCount-1; iVert++ ) + { + dfSum += psObject->padfX[iVert] * psObject->padfY[iVert+1] + - psObject->padfY[iVert] * psObject->padfX[iVert+1]; + } + + dfSum += psObject->padfX[iVert] * psObject->padfY[nVertStart] + - psObject->padfY[iVert] * psObject->padfX[nVertStart]; + +/* -------------------------------------------------------------------- */ +/* Reverse if necessary. */ +/* -------------------------------------------------------------------- */ + if( (dfSum < 0.0 && bInner) || (dfSum > 0.0 && !bInner) ) + { + int i; + + bAltered++; + for( i = 0; i < nVertCount/2; i++ ) + { + double dfSaved; + + /* Swap X */ + dfSaved = psObject->padfX[nVertStart+i]; + psObject->padfX[nVertStart+i] = + psObject->padfX[nVertStart+nVertCount-i-1]; + psObject->padfX[nVertStart+nVertCount-i-1] = dfSaved; + + /* Swap Y */ + dfSaved = psObject->padfY[nVertStart+i]; + psObject->padfY[nVertStart+i] = + psObject->padfY[nVertStart+nVertCount-i-1]; + psObject->padfY[nVertStart+nVertCount-i-1] = dfSaved; + + /* Swap Z */ + if( psObject->padfZ ) + { + dfSaved = psObject->padfZ[nVertStart+i]; + psObject->padfZ[nVertStart+i] = + psObject->padfZ[nVertStart+nVertCount-i-1]; + psObject->padfZ[nVertStart+nVertCount-i-1] = dfSaved; + } + + /* Swap M */ + if( psObject->padfM ) + { + dfSaved = psObject->padfM[nVertStart+i]; + psObject->padfM[nVertStart+i] = + psObject->padfM[nVertStart+nVertCount-i-1]; + psObject->padfM[nVertStart+nVertCount-i-1] = dfSaved; + } + } + } + } + + return bAltered; +} diff --git a/navit/support/shapefile/shptree.c b/navit/support/shapefile/shptree.c new file mode 100644 index 0000000..56d33b2 --- /dev/null +++ b/navit/support/shapefile/shptree.c @@ -0,0 +1,1050 @@ +/****************************************************************************** + * $Id: shptree.c,v 1.12 2008/11/12 15:39:50 fwarmerdam Exp $ + * + * Project: Shapelib + * Purpose: Implementation of quadtree building and searching functions. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: shptree.c,v $ + * Revision 1.12 2008/11/12 15:39:50 fwarmerdam + * improve safety in face of buggy .shp file. + * + * Revision 1.11 2007/10/27 03:31:14 fwarmerdam + * limit default depth of tree to 12 levels (gdal ticket #1594) + * + * Revision 1.10 2005/01/03 22:30:13 fwarmerdam + * added support for saved quadtrees + * + * Revision 1.9 2003/01/28 15:53:41 warmerda + * Avoid build warnings. + * + * Revision 1.8 2002/05/07 13:07:45 warmerda + * use qsort() - patch from Bernhard Herzog + * + * Revision 1.7 2002/01/15 14:36:07 warmerda + * updated email address + * + * Revision 1.6 2001/05/23 13:36:52 warmerda + * added use of SHPAPI_CALL + * + * Revision 1.5 1999/11/05 14:12:05 warmerda + * updated license terms + * + * Revision 1.4 1999/06/02 18:24:21 warmerda + * added trimming code + * + * Revision 1.3 1999/06/02 17:56:12 warmerda + * added quad'' subnode support for trees + * + * Revision 1.2 1999/05/18 19:11:11 warmerda + * Added example searching capability + * + * Revision 1.1 1999/05/18 17:49:20 warmerda + * New + * + */ + +#include "shapefil.h" + +#include +#include +#include +#include +#ifdef USE_CPL +#include +#endif + +#if 0 +SHP_CVSID("$Id: shptree.c,v 1.12 2008/11/12 15:39:50 fwarmerdam Exp $") +#endif + +#ifndef TRUE +# define TRUE 1 +# define FALSE 0 +#endif + +static int bBigEndian = 0; + +void SHPAPI_CALL SHPTreeSplitBounds( double *padfBoundsMinIn, double *padfBoundsMaxIn, double *padfBoundsMin1, double * padfBoundsMax1, double *padfBoundsMin2, double * padfBoundsMax2 ); +void SHPAPI_CALL SHPTreeCollectShapeIds( SHPTree *hTree, SHPTreeNode * psTreeNode, double * padfBoundsMin, double * padfBoundsMax, int * pnShapeCount, int * pnMaxShapes, int ** ppanShapeList ); + + +/* -------------------------------------------------------------------- */ +/* If the following is 0.5, nodes will be split in half. If it */ +/* is 0.6 then each subnode will contain 60% of the parent */ +/* node, with 20% representing overlap. This can be help to */ +/* prevent small objects on a boundary from shifting too high */ +/* up the tree. */ +/* -------------------------------------------------------------------- */ + +#define SHP_SPLIT_RATIO 0.55 + +/************************************************************************/ +/* SfRealloc() */ +/* */ +/* A realloc cover function that will access a NULL pointer as */ +/* a valid input. */ +/************************************************************************/ + +static void * SfRealloc( void * pMem, int nNewSize ) + +{ + if( pMem == NULL ) + return( (void *) malloc(nNewSize) ); + else + return( (void *) realloc(pMem,nNewSize) ); +} + +/************************************************************************/ +/* SHPTreeNodeInit() */ +/* */ +/* Initialize a tree node. */ +/************************************************************************/ + +static SHPTreeNode *SHPTreeNodeCreate( double * padfBoundsMin, + double * padfBoundsMax ) + +{ + SHPTreeNode *psTreeNode; + + psTreeNode = (SHPTreeNode *) malloc(sizeof(SHPTreeNode)); + if( NULL == psTreeNode ) + { +#ifdef USE_CPL + CPLError( CE_Fatal, CPLE_OutOfMemory, "Memory allocation failure"); +#endif + return NULL; + } + + psTreeNode->nShapeCount = 0; + psTreeNode->panShapeIds = NULL; + psTreeNode->papsShapeObj = NULL; + + psTreeNode->nSubNodes = 0; + + if( padfBoundsMin != NULL ) + memcpy( psTreeNode->adfBoundsMin, padfBoundsMin, sizeof(double) * 4 ); + + if( padfBoundsMax != NULL ) + memcpy( psTreeNode->adfBoundsMax, padfBoundsMax, sizeof(double) * 4 ); + + return psTreeNode; +} + + +/************************************************************************/ +/* SHPCreateTree() */ +/************************************************************************/ + +SHPTree SHPAPI_CALL1(*) +SHPCreateTree( SHPHandle hSHP, int nDimension, int nMaxDepth, + double *padfBoundsMin, double *padfBoundsMax ) + +{ + SHPTree *psTree; + + if( padfBoundsMin == NULL && hSHP == NULL ) + return NULL; + +/* -------------------------------------------------------------------- */ +/* Allocate the tree object */ +/* -------------------------------------------------------------------- */ + psTree = (SHPTree *) malloc(sizeof(SHPTree)); + if( NULL == psTree ) + { +#ifdef USE_CPL + CPLError( CE_Fatal, CPLE_OutOfMemory, "Memory allocation failure"); +#endif + return NULL; + } + + psTree->hSHP = hSHP; + psTree->nMaxDepth = nMaxDepth; + psTree->nDimension = nDimension; + psTree->nTotalCount = 0; + +/* -------------------------------------------------------------------- */ +/* If no max depth was defined, try to select a reasonable one */ +/* that implies approximately 8 shapes per node. */ +/* -------------------------------------------------------------------- */ + if( psTree->nMaxDepth == 0 && hSHP != NULL ) + { + int nMaxNodeCount = 1; + int nShapeCount; + + SHPGetInfo( hSHP, &nShapeCount, NULL, NULL, NULL ); + while( nMaxNodeCount*4 < nShapeCount ) + { + psTree->nMaxDepth += 1; + nMaxNodeCount = nMaxNodeCount * 2; + } + +#ifdef USE_CPL + CPLDebug( "Shape", + "Estimated spatial index tree depth: %d", + psTree->nMaxDepth ); +#endif + + /* NOTE: Due to problems with memory allocation for deep trees, + * automatically estimated depth is limited up to 12 levels. + * See Ticket #1594 for detailed discussion. + */ + if( psTree->nMaxDepth > MAX_DEFAULT_TREE_DEPTH ) + { + psTree->nMaxDepth = MAX_DEFAULT_TREE_DEPTH; + +#ifdef USE_CPL + CPLDebug( "Shape", + "Falling back to max number of allowed index tree levels (%d).", + MAX_DEFAULT_TREE_DEPTH ); +#endif + } + } + +/* -------------------------------------------------------------------- */ +/* Allocate the root node. */ +/* -------------------------------------------------------------------- */ + psTree->psRoot = SHPTreeNodeCreate( padfBoundsMin, padfBoundsMax ); + if( NULL == psTree->psRoot ) + { + return NULL; + } + +/* -------------------------------------------------------------------- */ +/* Assign the bounds to the root node. If none are passed in, */ +/* use the bounds of the provided file otherwise the create */ +/* function will have already set the bounds. */ +/* -------------------------------------------------------------------- */ + assert( NULL != psTree ); + assert( NULL != psTree->psRoot ); + + if( padfBoundsMin == NULL ) + { + SHPGetInfo( hSHP, NULL, NULL, + psTree->psRoot->adfBoundsMin, + psTree->psRoot->adfBoundsMax ); + } + +/* -------------------------------------------------------------------- */ +/* If we have a file, insert all it's shapes into the tree. */ +/* -------------------------------------------------------------------- */ + if( hSHP != NULL ) + { + int iShape, nShapeCount; + + SHPGetInfo( hSHP, &nShapeCount, NULL, NULL, NULL ); + + for( iShape = 0; iShape < nShapeCount; iShape++ ) + { + SHPObject *psShape; + + psShape = SHPReadObject( hSHP, iShape ); + if( psShape != NULL ) + { + SHPTreeAddShapeId( psTree, psShape ); + SHPDestroyObject( psShape ); + } + } + } + + return psTree; +} + +/************************************************************************/ +/* SHPDestroyTreeNode() */ +/************************************************************************/ + +static void SHPDestroyTreeNode( SHPTreeNode * psTreeNode ) + +{ + int i; + + assert( NULL != psTreeNode ); + + for( i = 0; i < psTreeNode->nSubNodes; i++ ) + { + if( psTreeNode->apsSubNode[i] != NULL ) + SHPDestroyTreeNode( psTreeNode->apsSubNode[i] ); + } + + if( psTreeNode->panShapeIds != NULL ) + free( psTreeNode->panShapeIds ); + + if( psTreeNode->papsShapeObj != NULL ) + { + for( i = 0; i < psTreeNode->nShapeCount; i++ ) + { + if( psTreeNode->papsShapeObj[i] != NULL ) + SHPDestroyObject( psTreeNode->papsShapeObj[i] ); + } + + free( psTreeNode->papsShapeObj ); + } + + free( psTreeNode ); +} + +/************************************************************************/ +/* SHPDestroyTree() */ +/************************************************************************/ + +void SHPAPI_CALL +SHPDestroyTree( SHPTree * psTree ) + +{ + SHPDestroyTreeNode( psTree->psRoot ); + free( psTree ); +} + +/************************************************************************/ +/* SHPCheckBoundsOverlap() */ +/* */ +/* Do the given boxes overlap at all? */ +/************************************************************************/ + +int SHPAPI_CALL +SHPCheckBoundsOverlap( double * padfBox1Min, double * padfBox1Max, + double * padfBox2Min, double * padfBox2Max, + int nDimension ) + +{ + int iDim; + + for( iDim = 0; iDim < nDimension; iDim++ ) + { + if( padfBox2Max[iDim] < padfBox1Min[iDim] ) + return FALSE; + + if( padfBox1Max[iDim] < padfBox2Min[iDim] ) + return FALSE; + } + + return TRUE; +} + +/************************************************************************/ +/* SHPCheckObjectContained() */ +/* */ +/* Does the given shape fit within the indicated extents? */ +/************************************************************************/ + +static int SHPCheckObjectContained( SHPObject * psObject, int nDimension, + double * padfBoundsMin, double * padfBoundsMax ) + +{ + if( psObject->dfXMin < padfBoundsMin[0] + || psObject->dfXMax > padfBoundsMax[0] ) + return FALSE; + + if( psObject->dfYMin < padfBoundsMin[1] + || psObject->dfYMax > padfBoundsMax[1] ) + return FALSE; + + if( nDimension == 2 ) + return TRUE; + + if( psObject->dfZMin < padfBoundsMin[2] + || psObject->dfZMax < padfBoundsMax[2] ) + return FALSE; + + if( nDimension == 3 ) + return TRUE; + + if( psObject->dfMMin < padfBoundsMin[3] + || psObject->dfMMax < padfBoundsMax[3] ) + return FALSE; + + return TRUE; +} + +/************************************************************************/ +/* SHPTreeSplitBounds() */ +/* */ +/* Split a region into two subregion evenly, cutting along the */ +/* longest dimension. */ +/************************************************************************/ + +void SHPAPI_CALL +SHPTreeSplitBounds( double *padfBoundsMinIn, double *padfBoundsMaxIn, + double *padfBoundsMin1, double * padfBoundsMax1, + double *padfBoundsMin2, double * padfBoundsMax2 ) + +{ +/* -------------------------------------------------------------------- */ +/* The output bounds will be very similar to the input bounds, */ +/* so just copy over to start. */ +/* -------------------------------------------------------------------- */ + memcpy( padfBoundsMin1, padfBoundsMinIn, sizeof(double) * 4 ); + memcpy( padfBoundsMax1, padfBoundsMaxIn, sizeof(double) * 4 ); + memcpy( padfBoundsMin2, padfBoundsMinIn, sizeof(double) * 4 ); + memcpy( padfBoundsMax2, padfBoundsMaxIn, sizeof(double) * 4 ); + +/* -------------------------------------------------------------------- */ +/* Split in X direction. */ +/* -------------------------------------------------------------------- */ + if( (padfBoundsMaxIn[0] - padfBoundsMinIn[0]) + > (padfBoundsMaxIn[1] - padfBoundsMinIn[1]) ) + { + double dfRange = padfBoundsMaxIn[0] - padfBoundsMinIn[0]; + + padfBoundsMax1[0] = padfBoundsMinIn[0] + dfRange * SHP_SPLIT_RATIO; + padfBoundsMin2[0] = padfBoundsMaxIn[0] - dfRange * SHP_SPLIT_RATIO; + } + +/* -------------------------------------------------------------------- */ +/* Otherwise split in Y direction. */ +/* -------------------------------------------------------------------- */ + else + { + double dfRange = padfBoundsMaxIn[1] - padfBoundsMinIn[1]; + + padfBoundsMax1[1] = padfBoundsMinIn[1] + dfRange * SHP_SPLIT_RATIO; + padfBoundsMin2[1] = padfBoundsMaxIn[1] - dfRange * SHP_SPLIT_RATIO; + } +} + +/************************************************************************/ +/* SHPTreeNodeAddShapeId() */ +/************************************************************************/ + +static int +SHPTreeNodeAddShapeId( SHPTreeNode * psTreeNode, SHPObject * psObject, + int nMaxDepth, int nDimension ) + +{ + int i; + +/* -------------------------------------------------------------------- */ +/* If there are subnodes, then consider wiether this object */ +/* will fit in them. */ +/* -------------------------------------------------------------------- */ + if( nMaxDepth > 1 && psTreeNode->nSubNodes > 0 ) + { + for( i = 0; i < psTreeNode->nSubNodes; i++ ) + { + if( SHPCheckObjectContained(psObject, nDimension, + psTreeNode->apsSubNode[i]->adfBoundsMin, + psTreeNode->apsSubNode[i]->adfBoundsMax)) + { + return SHPTreeNodeAddShapeId( psTreeNode->apsSubNode[i], + psObject, nMaxDepth-1, + nDimension ); + } + } + } + +/* -------------------------------------------------------------------- */ +/* Otherwise, consider creating four subnodes if could fit into */ +/* them, and adding to the appropriate subnode. */ +/* -------------------------------------------------------------------- */ +#if MAX_SUBNODE == 4 + else if( nMaxDepth > 1 && psTreeNode->nSubNodes == 0 ) + { + double adfBoundsMinH1[4], adfBoundsMaxH1[4]; + double adfBoundsMinH2[4], adfBoundsMaxH2[4]; + double adfBoundsMin1[4], adfBoundsMax1[4]; + double adfBoundsMin2[4], adfBoundsMax2[4]; + double adfBoundsMin3[4], adfBoundsMax3[4]; + double adfBoundsMin4[4], adfBoundsMax4[4]; + + SHPTreeSplitBounds( psTreeNode->adfBoundsMin, + psTreeNode->adfBoundsMax, + adfBoundsMinH1, adfBoundsMaxH1, + adfBoundsMinH2, adfBoundsMaxH2 ); + + SHPTreeSplitBounds( adfBoundsMinH1, adfBoundsMaxH1, + adfBoundsMin1, adfBoundsMax1, + adfBoundsMin2, adfBoundsMax2 ); + + SHPTreeSplitBounds( adfBoundsMinH2, adfBoundsMaxH2, + adfBoundsMin3, adfBoundsMax3, + adfBoundsMin4, adfBoundsMax4 ); + + if( SHPCheckObjectContained(psObject, nDimension, + adfBoundsMin1, adfBoundsMax1) + || SHPCheckObjectContained(psObject, nDimension, + adfBoundsMin2, adfBoundsMax2) + || SHPCheckObjectContained(psObject, nDimension, + adfBoundsMin3, adfBoundsMax3) + || SHPCheckObjectContained(psObject, nDimension, + adfBoundsMin4, adfBoundsMax4) ) + { + psTreeNode->nSubNodes = 4; + psTreeNode->apsSubNode[0] = SHPTreeNodeCreate( adfBoundsMin1, + adfBoundsMax1 ); + psTreeNode->apsSubNode[1] = SHPTreeNodeCreate( adfBoundsMin2, + adfBoundsMax2 ); + psTreeNode->apsSubNode[2] = SHPTreeNodeCreate( adfBoundsMin3, + adfBoundsMax3 ); + psTreeNode->apsSubNode[3] = SHPTreeNodeCreate( adfBoundsMin4, + adfBoundsMax4 ); + + /* recurse back on this node now that it has subnodes */ + return( SHPTreeNodeAddShapeId( psTreeNode, psObject, + nMaxDepth, nDimension ) ); + } + } +#endif /* MAX_SUBNODE == 4 */ + +/* -------------------------------------------------------------------- */ +/* Otherwise, consider creating two subnodes if could fit into */ +/* them, and adding to the appropriate subnode. */ +/* -------------------------------------------------------------------- */ +#if MAX_SUBNODE == 2 + else if( nMaxDepth > 1 && psTreeNode->nSubNodes == 0 ) + { + double adfBoundsMin1[4], adfBoundsMax1[4]; + double adfBoundsMin2[4], adfBoundsMax2[4]; + + SHPTreeSplitBounds( psTreeNode->adfBoundsMin, psTreeNode->adfBoundsMax, + adfBoundsMin1, adfBoundsMax1, + adfBoundsMin2, adfBoundsMax2 ); + + if( SHPCheckObjectContained(psObject, nDimension, + adfBoundsMin1, adfBoundsMax1)) + { + psTreeNode->nSubNodes = 2; + psTreeNode->apsSubNode[0] = SHPTreeNodeCreate( adfBoundsMin1, + adfBoundsMax1 ); + psTreeNode->apsSubNode[1] = SHPTreeNodeCreate( adfBoundsMin2, + adfBoundsMax2 ); + + return( SHPTreeNodeAddShapeId( psTreeNode->apsSubNode[0], psObject, + nMaxDepth - 1, nDimension ) ); + } + else if( SHPCheckObjectContained(psObject, nDimension, + adfBoundsMin2, adfBoundsMax2) ) + { + psTreeNode->nSubNodes = 2; + psTreeNode->apsSubNode[0] = SHPTreeNodeCreate( adfBoundsMin1, + adfBoundsMax1 ); + psTreeNode->apsSubNode[1] = SHPTreeNodeCreate( adfBoundsMin2, + adfBoundsMax2 ); + + return( SHPTreeNodeAddShapeId( psTreeNode->apsSubNode[1], psObject, + nMaxDepth - 1, nDimension ) ); + } + } +#endif /* MAX_SUBNODE == 2 */ + +/* -------------------------------------------------------------------- */ +/* If none of that worked, just add it to this nodes list. */ +/* -------------------------------------------------------------------- */ + psTreeNode->nShapeCount++; + + psTreeNode->panShapeIds = (int *) + SfRealloc( psTreeNode->panShapeIds, + sizeof(int) * psTreeNode->nShapeCount ); + psTreeNode->panShapeIds[psTreeNode->nShapeCount-1] = psObject->nShapeId; + + if( psTreeNode->papsShapeObj != NULL ) + { + psTreeNode->papsShapeObj = (SHPObject **) + SfRealloc( psTreeNode->papsShapeObj, + sizeof(void *) * psTreeNode->nShapeCount ); + psTreeNode->papsShapeObj[psTreeNode->nShapeCount-1] = NULL; + } + + return TRUE; +} + +/************************************************************************/ +/* SHPTreeAddShapeId() */ +/* */ +/* Add a shape to the tree, but don't keep a pointer to the */ +/* object data, just keep the shapeid. */ +/************************************************************************/ + +int SHPAPI_CALL +SHPTreeAddShapeId( SHPTree * psTree, SHPObject * psObject ) + +{ + psTree->nTotalCount++; + + return( SHPTreeNodeAddShapeId( psTree->psRoot, psObject, + psTree->nMaxDepth, psTree->nDimension ) ); +} + +/************************************************************************/ +/* SHPTreeCollectShapesIds() */ +/* */ +/* Work function implementing SHPTreeFindLikelyShapes() on a */ +/* tree node by tree node basis. */ +/************************************************************************/ + +void SHPAPI_CALL +SHPTreeCollectShapeIds( SHPTree *hTree, SHPTreeNode * psTreeNode, + double * padfBoundsMin, double * padfBoundsMax, + int * pnShapeCount, int * pnMaxShapes, + int ** ppanShapeList ) + +{ + int i; + +/* -------------------------------------------------------------------- */ +/* Does this node overlap the area of interest at all? If not, */ +/* return without adding to the list at all. */ +/* -------------------------------------------------------------------- */ + if( !SHPCheckBoundsOverlap( psTreeNode->adfBoundsMin, + psTreeNode->adfBoundsMax, + padfBoundsMin, + padfBoundsMax, + hTree->nDimension ) ) + return; + +/* -------------------------------------------------------------------- */ +/* Grow the list to hold the shapes on this node. */ +/* -------------------------------------------------------------------- */ + if( *pnShapeCount + psTreeNode->nShapeCount > *pnMaxShapes ) + { + *pnMaxShapes = (*pnShapeCount + psTreeNode->nShapeCount) * 2 + 20; + *ppanShapeList = (int *) + SfRealloc(*ppanShapeList,sizeof(int) * *pnMaxShapes); + } + +/* -------------------------------------------------------------------- */ +/* Add the local nodes shapeids to the list. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < psTreeNode->nShapeCount; i++ ) + { + (*ppanShapeList)[(*pnShapeCount)++] = psTreeNode->panShapeIds[i]; + } + +/* -------------------------------------------------------------------- */ +/* Recurse to subnodes if they exist. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < psTreeNode->nSubNodes; i++ ) + { + if( psTreeNode->apsSubNode[i] != NULL ) + SHPTreeCollectShapeIds( hTree, psTreeNode->apsSubNode[i], + padfBoundsMin, padfBoundsMax, + pnShapeCount, pnMaxShapes, + ppanShapeList ); + } +} + +/************************************************************************/ +/* SHPTreeFindLikelyShapes() */ +/* */ +/* Find all shapes within tree nodes for which the tree node */ +/* bounding box overlaps the search box. The return value is */ +/* an array of shapeids terminated by a -1. The shapeids will */ +/* be in order, as hopefully this will result in faster (more */ +/* sequential) reading from the file. */ +/************************************************************************/ + +/* helper for qsort */ +static int +compare_ints( const void * a, const void * b) +{ + return (*(int*)a) - (*(int*)b); +} + +int SHPAPI_CALL1(*) +SHPTreeFindLikelyShapes( SHPTree * hTree, + double * padfBoundsMin, double * padfBoundsMax, + int * pnShapeCount ) + +{ + int *panShapeList=NULL, nMaxShapes = 0; + +/* -------------------------------------------------------------------- */ +/* Perform the search by recursive descent. */ +/* -------------------------------------------------------------------- */ + *pnShapeCount = 0; + + SHPTreeCollectShapeIds( hTree, hTree->psRoot, + padfBoundsMin, padfBoundsMax, + pnShapeCount, &nMaxShapes, + &panShapeList ); + +/* -------------------------------------------------------------------- */ +/* Sort the id array */ +/* -------------------------------------------------------------------- */ + + qsort(panShapeList, *pnShapeCount, sizeof(int), compare_ints); + + return panShapeList; +} + +/************************************************************************/ +/* SHPTreeNodeTrim() */ +/* */ +/* This is the recurve version of SHPTreeTrimExtraNodes() that */ +/* walks the tree cleaning it up. */ +/************************************************************************/ + +static int SHPTreeNodeTrim( SHPTreeNode * psTreeNode ) + +{ + int i; + +/* -------------------------------------------------------------------- */ +/* Trim subtrees, and free subnodes that come back empty. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < psTreeNode->nSubNodes; i++ ) + { + if( SHPTreeNodeTrim( psTreeNode->apsSubNode[i] ) ) + { + SHPDestroyTreeNode( psTreeNode->apsSubNode[i] ); + + psTreeNode->apsSubNode[i] = + psTreeNode->apsSubNode[psTreeNode->nSubNodes-1]; + + psTreeNode->nSubNodes--; + + i--; /* process the new occupant of this subnode entry */ + } + } + +/* -------------------------------------------------------------------- */ +/* We should be trimmed if we have no subnodes, and no shapes. */ +/* -------------------------------------------------------------------- */ + return( psTreeNode->nSubNodes == 0 && psTreeNode->nShapeCount == 0 ); +} + +/************************************************************************/ +/* SHPTreeTrimExtraNodes() */ +/* */ +/* Trim empty nodes from the tree. Note that we never trim an */ +/* empty root node. */ +/************************************************************************/ + +void SHPAPI_CALL +SHPTreeTrimExtraNodes( SHPTree * hTree ) + +{ + SHPTreeNodeTrim( hTree->psRoot ); +} + +/************************************************************************/ +/* SwapWord() */ +/* */ +/* Swap a 2, 4 or 8 byte word. */ +/************************************************************************/ + +static void SwapWord( int length, void * wordP ) + +{ + int i; + unsigned char temp; + + for( i=0; i < length/2; i++ ) + { + temp = ((unsigned char *) wordP)[i]; + ((unsigned char *)wordP)[i] = ((unsigned char *) wordP)[length-i-1]; + ((unsigned char *) wordP)[length-i-1] = temp; + } +} + +/************************************************************************/ +/* SHPSearchDiskTreeNode() */ +/************************************************************************/ + +static int +SHPSearchDiskTreeNode( FILE *fp, double *padfBoundsMin, double *padfBoundsMax, + int **ppanResultBuffer, int *pnBufferMax, + int *pnResultCount, int bNeedSwap ) + +{ + int i; + int offset; + int numshapes, numsubnodes; + double adfNodeBoundsMin[2], adfNodeBoundsMax[2]; + +/* -------------------------------------------------------------------- */ +/* Read and unswap first part of node info. */ +/* -------------------------------------------------------------------- */ + fread( &offset, 4, 1, fp ); + if ( bNeedSwap ) SwapWord ( 4, &offset ); + + fread( adfNodeBoundsMin, sizeof(double), 2, fp ); + fread( adfNodeBoundsMax, sizeof(double), 2, fp ); + if ( bNeedSwap ) + { + SwapWord( 8, adfNodeBoundsMin + 0 ); + SwapWord( 8, adfNodeBoundsMin + 1 ); + SwapWord( 8, adfNodeBoundsMax + 0 ); + SwapWord( 8, adfNodeBoundsMax + 1 ); + } + + fread( &numshapes, 4, 1, fp ); + if ( bNeedSwap ) SwapWord ( 4, &numshapes ); + +/* -------------------------------------------------------------------- */ +/* If we don't overlap this node at all, we can just fseek() */ +/* pass this node info and all subnodes. */ +/* -------------------------------------------------------------------- */ + if( !SHPCheckBoundsOverlap( adfNodeBoundsMin, adfNodeBoundsMax, + padfBoundsMin, padfBoundsMax, 2 ) ) + { + offset += numshapes*sizeof(int) + sizeof(int); + fseek(fp, offset, SEEK_CUR); + return TRUE; + } + +/* -------------------------------------------------------------------- */ +/* Add all the shapeids at this node to our list. */ +/* -------------------------------------------------------------------- */ + if(numshapes > 0) + { + if( *pnResultCount + numshapes > *pnBufferMax ) + { + *pnBufferMax = (int) ((*pnResultCount + numshapes + 100) * 1.25); + *ppanResultBuffer = (int *) + SfRealloc( *ppanResultBuffer, *pnBufferMax * sizeof(int) ); + } + + fread( *ppanResultBuffer + *pnResultCount, + sizeof(int), numshapes, fp ); + + if (bNeedSwap ) + { + for( i=0; inSubNodes; i++ ) + { + if(node->apsSubNode[i]) + { + offset += 4*sizeof(double) + + (node->apsSubNode[i]->nShapeCount+3)*sizeof(int); + offset += SHPGetSubNodeOffset(node->apsSubNode[i]); + } + } + + return(offset); +} + +/************************************************************************/ +/* SHPWriteTreeNode() */ +/************************************************************************/ + +static void SHPWriteTreeNode( FILE *fp, SHPTreeNode *node) +{ + int i,j; + int offset; + unsigned char *pabyRec = NULL; + assert( NULL != node ); + + offset = SHPGetSubNodeOffset(node); + + pabyRec = (unsigned char *) + malloc(sizeof(double) * 4 + + (3 * sizeof(int)) + (node->nShapeCount * sizeof(int)) ); + if( NULL == pabyRec ) + { +#ifdef USE_CPL + CPLError( CE_Fatal, CPLE_OutOfMemory, "Memory allocation failure"); +#endif + assert( 0 ); + } + assert( NULL != pabyRec ); + + memcpy( pabyRec, &offset, 4); + + /* minx, miny, maxx, maxy */ + memcpy( pabyRec+ 4, node->adfBoundsMin+0, sizeof(double) ); + memcpy( pabyRec+12, node->adfBoundsMin+1, sizeof(double) ); + memcpy( pabyRec+20, node->adfBoundsMax+0, sizeof(double) ); + memcpy( pabyRec+28, node->adfBoundsMax+1, sizeof(double) ); + + memcpy( pabyRec+36, &node->nShapeCount, 4); + j = node->nShapeCount * sizeof(int); + memcpy( pabyRec+40, node->panShapeIds, j); + memcpy( pabyRec+j+40, &node->nSubNodes, 4); + + fwrite( pabyRec, 44+j, 1, fp ); + free (pabyRec); + + for(i=0; inSubNodes; i++ ) + { + if(node->apsSubNode[i]) + SHPWriteTreeNode( fp, node->apsSubNode[i]); + } +} + +/************************************************************************/ +/* SHPWriteTree() */ +/************************************************************************/ + +int SHPWriteTree(SHPTree *tree, const char *filename ) +{ + char signature[4] = "SQT"; + int i; + char abyBuf[32]; + FILE *fp; + +/* -------------------------------------------------------------------- */ +/* Open the output file. */ +/* -------------------------------------------------------------------- */ + fp = fopen(filename, "wb"); + if( fp == NULL ) + { + return FALSE; + } + +/* -------------------------------------------------------------------- */ +/* Establish the byte order on this machine. */ +/* -------------------------------------------------------------------- */ + i = 1; + if( *((unsigned char *) &i) == 1 ) + bBigEndian = FALSE; + else + bBigEndian = TRUE; + +/* -------------------------------------------------------------------- */ +/* Write the header. */ +/* -------------------------------------------------------------------- */ + memcpy( abyBuf+0, signature, 3 ); + + if( bBigEndian ) + abyBuf[3] = 2; /* New MSB */ + else + abyBuf[3] = 1; /* New LSB */ + + abyBuf[4] = 1; /* version */ + abyBuf[5] = 0; /* next 3 reserved */ + abyBuf[6] = 0; + abyBuf[7] = 0; + + fwrite( abyBuf, 8, 1, fp ); + + fwrite( &(tree->nTotalCount), 4, 1, fp ); + + /* write maxdepth */ + + fwrite( &(tree->nMaxDepth), 4, 1, fp ); + +/* -------------------------------------------------------------------- */ +/* Write all the nodes "in order". */ +/* -------------------------------------------------------------------- */ + + SHPWriteTreeNode( fp, tree->psRoot ); + + fclose( fp ); + + return TRUE; +} diff --git a/navit/support/win32/ConvertUTF.c b/navit/support/win32/ConvertUTF.c new file mode 100644 index 0000000..9b3deeb --- /dev/null +++ b/navit/support/win32/ConvertUTF.c @@ -0,0 +1,539 @@ +/* + * Copyright 2001-2004 Unicode, Inc. + * + * Disclaimer + * + * This source code is provided as is by Unicode, Inc. No claims are + * made as to fitness for any particular purpose. No warranties of any + * kind are expressed or implied. The recipient agrees to determine + * applicability of information provided. If this file has been + * purchased on magnetic or optical media from Unicode, Inc., the + * sole remedy for any claim will be exchange of defective media + * within 90 days of receipt. + * + * Limitations on Rights to Redistribute This Code + * + * Unicode, Inc. hereby grants the right to freely use the information + * supplied in this file in the creation of products supporting the + * Unicode Standard, and to make copies of this file in any form + * for internal or external distribution as long as this notice + * remains attached. + */ + +/* --------------------------------------------------------------------- + + Conversions between UTF32, UTF-16, and UTF-8. Source code file. + Author: Mark E. Davis, 1994. + Rev History: Rick McGowan, fixes & updates May 2001. + Sept 2001: fixed const & error conditions per + mods suggested by S. Parent & A. Lillich. + June 2002: Tim Dodd added detection and handling of incomplete + source sequences, enhanced error detection, added casts + to eliminate compiler warnings. + July 2003: slight mods to back out aggressive FFFE detection. + Jan 2004: updated switches in from-UTF8 conversions. + Oct 2004: updated to use UNI_MAX_LEGAL_UTF32 in UTF-32 conversions. + + See the header file "ConvertUTF.h" for complete documentation. + +------------------------------------------------------------------------ */ + + +#include "ConvertUTF.h" +#ifdef CVTUTF_DEBUG +#include +#endif + +static const int halfShift = 10; /* used for shifting by 10 bits */ + +static const UTF32 halfBase = 0x0010000UL; +static const UTF32 halfMask = 0x3FFUL; + +#define UNI_SUR_HIGH_START (UTF32)0xD800 +#define UNI_SUR_HIGH_END (UTF32)0xDBFF +#define UNI_SUR_LOW_START (UTF32)0xDC00 +#define UNI_SUR_LOW_END (UTF32)0xDFFF +#define false 0 +#define true 1 + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF32toUTF16 ( + const UTF32** sourceStart, const UTF32* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF32* source = *sourceStart; + UTF16* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch; + if (target >= targetEnd) { + result = targetExhausted; break; + } + ch = *source++; + if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ + /* UTF-16 surrogate values are illegal in UTF-32; 0xffff or 0xfffe are both reserved values */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + if (flags == strictConversion) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + *target++ = (UTF16)ch; /* normal case */ + } + } else if (ch > UNI_MAX_LEGAL_UTF32) { + if (flags == strictConversion) { + result = sourceIllegal; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + /* target is a character in range 0xFFFF - 0x10FFFF. */ + if (target + 1 >= targetEnd) { + --source; /* Back up source pointer! */ + result = targetExhausted; break; + } + ch -= halfBase; + *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START); + *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START); + } + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF16toUTF32 ( + const UTF16** sourceStart, const UTF16* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF16* source = *sourceStart; + UTF32* target = *targetStart; + UTF32 ch, ch2; + while (source < sourceEnd) { + const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */ + ch = *source++; + /* If we have a surrogate pair, convert to UTF32 first. */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) { + /* If the 16 bits following the high surrogate are in the source buffer... */ + if (source < sourceEnd) { + ch2 = *source; + /* If it's a low surrogate, convert to UTF32. */ + if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { + ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + + (ch2 - UNI_SUR_LOW_START) + halfBase; + ++source; + } else if (flags == strictConversion) { /* it's an unpaired high surrogate */ + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } else { /* We don't have the 16 bits following the high surrogate. */ + --source; /* return to the high surrogate */ + result = sourceExhausted; + break; + } + } else if (flags == strictConversion) { + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } + if (target >= targetEnd) { + source = oldSource; /* Back up source pointer! */ + result = targetExhausted; break; + } + *target++ = ch; + } + *sourceStart = source; + *targetStart = target; +#ifdef CVTUTF_DEBUG +if (result == sourceIllegal) { + fprintf(stderr, "ConvertUTF16toUTF32 illegal seq 0x%04x,%04x\n", ch, ch2); + fflush(stderr); +} +#endif + return result; +} + +/* --------------------------------------------------------------------- */ + +/* + * Index into the table below with the first byte of a UTF-8 sequence to + * get the number of trailing bytes that are supposed to follow it. + * Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is + * left as-is for anyone who may want to do such conversion, which was + * allowed in earlier algorithms. + */ +static const char trailingBytesForUTF8[256] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 +}; + +/* + * Magic values subtracted from a buffer value during UTF8 conversion. + * This table contains as many values as there might be trailing bytes + * in a UTF-8 sequence. + */ +static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, + 0x03C82080UL, 0xFA082080UL, 0x82082080UL }; + +/* + * Once the bits are split out into bytes of UTF-8, this is a mask OR-ed + * into the first byte, depending on how many bytes follow. There are + * as many entries in this table as there are UTF-8 sequence types. + * (I.e., one byte sequence, two byte... etc.). Remember that sequencs + * for *legal* UTF-8 will be 4 or fewer bytes total. + */ +static const UTF8 firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + +/* --------------------------------------------------------------------- */ + +/* The interface converts a whole buffer to avoid function-call overhead. + * Constants have been gathered. Loops & conditionals have been removed as + * much as possible for efficiency, in favor of drop-through switches. + * (See "Note A" at the bottom of the file for equivalent code.) + * If your compiler supports it, the "isLegalUTF8" call can be turned + * into an inline function. + */ + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF16toUTF8 ( + const UTF16** sourceStart, const UTF16* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF16* source = *sourceStart; + UTF8* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch; + unsigned short bytesToWrite = 0; + const UTF32 byteMask = 0xBF; + const UTF32 byteMark = 0x80; + const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */ + ch = *source++; + /* If we have a surrogate pair, convert to UTF32 first. */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) { + /* If the 16 bits following the high surrogate are in the source buffer... */ + if (source < sourceEnd) { + UTF32 ch2 = *source; + /* If it's a low surrogate, convert to UTF32. */ + if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { + ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + + (ch2 - UNI_SUR_LOW_START) + halfBase; + ++source; + } else if (flags == strictConversion) { /* it's an unpaired high surrogate */ + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } else { /* We don't have the 16 bits following the high surrogate. */ + --source; /* return to the high surrogate */ + result = sourceExhausted; + break; + } + } else if (flags == strictConversion) { + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } + /* Figure out how many bytes the result will require */ + if (ch < (UTF32)0x80) { bytesToWrite = 1; + } else if (ch < (UTF32)0x800) { bytesToWrite = 2; + } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; + } else if (ch < (UTF32)0x110000) { bytesToWrite = 4; + } else { bytesToWrite = 3; + ch = UNI_REPLACEMENT_CHAR; + } + + target += bytesToWrite; + if (target > targetEnd) { + source = oldSource; /* Back up source pointer! */ + target -= bytesToWrite; result = targetExhausted; break; + } + switch (bytesToWrite) { /* note: everything falls through. */ + case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 1: *--target = (UTF8)(ch | firstByteMark[bytesToWrite]); + } + target += bytesToWrite; + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- */ + +/* + * Utility routine to tell whether a sequence of bytes is legal UTF-8. + * This must be called with the length pre-determined by the first byte. + * If not calling this from ConvertUTF8to*, then the length can be set by: + * length = trailingBytesForUTF8[*source]+1; + * and the sequence is illegal right away if there aren't that many bytes + * available. + * If presented with a length > 4, this returns false. The Unicode + * definition of UTF-8 goes up to 4-byte sequences. + */ + +static Boolean isLegalUTF8(const UTF8 *source, int length) { + UTF8 a; + const UTF8 *srcptr = source+length; + switch (length) { + default: return false; + /* Everything else falls through when "true"... */ + case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; + case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; + case 2: if ((a = (*--srcptr)) > 0xBF) return false; + + switch (*source) { + /* no fall-through in this inner switch */ + case 0xE0: if (a < 0xA0) return false; break; + case 0xED: if (a > 0x9F) return false; break; + case 0xF0: if (a < 0x90) return false; break; + case 0xF4: if (a > 0x8F) return false; break; + default: if (a < 0x80) return false; + } + + case 1: if (*source >= 0x80 && *source < 0xC2) return false; + } + if (*source > 0xF4) return false; + return true; +} + +/* --------------------------------------------------------------------- */ + +/* + * Exported function to return whether a UTF-8 sequence is legal or not. + * This is not used here; it's just exported. + */ +Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) { + int length = trailingBytesForUTF8[*source]+1; + if (source+length > sourceEnd) { + return false; + } + return isLegalUTF8(source, length); +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF8toUTF16 ( + const UTF8** sourceStart, const UTF8* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF8* source = *sourceStart; + UTF16* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch = 0; + unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; + if (source + extraBytesToRead >= sourceEnd) { + result = sourceExhausted; break; + } + /* Do this check whether lenient or strict */ + if (! isLegalUTF8(source, extraBytesToRead+1)) { + result = sourceIllegal; + break; + } + /* + * The cases all fall through. See "Note A" below. + */ + switch (extraBytesToRead) { + case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ + case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ + case 3: ch += *source++; ch <<= 6; + case 2: ch += *source++; ch <<= 6; + case 1: ch += *source++; ch <<= 6; + case 0: ch += *source++; + } + ch -= offsetsFromUTF8[extraBytesToRead]; + + if (target >= targetEnd) { + source -= (extraBytesToRead+1); /* Back up source pointer! */ + result = targetExhausted; break; + } + if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + if (flags == strictConversion) { + source -= (extraBytesToRead+1); /* return to the illegal value itself */ + result = sourceIllegal; + break; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + *target++ = (UTF16)ch; /* normal case */ + } + } else if (ch > UNI_MAX_UTF16) { + if (flags == strictConversion) { + result = sourceIllegal; + source -= (extraBytesToRead+1); /* return to the start */ + break; /* Bail out; shouldn't continue */ + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + /* target is a character in range 0xFFFF - 0x10FFFF. */ + if (target + 1 >= targetEnd) { + source -= (extraBytesToRead+1); /* Back up source pointer! */ + result = targetExhausted; break; + } + ch -= halfBase; + *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START); + *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START); + } + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF32toUTF8 ( + const UTF32** sourceStart, const UTF32* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF32* source = *sourceStart; + UTF8* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch; + unsigned short bytesToWrite = 0; + const UTF32 byteMask = 0xBF; + const UTF32 byteMark = 0x80; + ch = *source++; + if (flags == strictConversion ) { + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } + /* + * Figure out how many bytes the result will require. Turn any + * illegally large UTF32 things (> Plane 17) into replacement chars. + */ + if (ch < (UTF32)0x80) { bytesToWrite = 1; + } else if (ch < (UTF32)0x800) { bytesToWrite = 2; + } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; + } else if (ch <= UNI_MAX_LEGAL_UTF32) { bytesToWrite = 4; + } else { bytesToWrite = 3; + ch = UNI_REPLACEMENT_CHAR; + result = sourceIllegal; + } + + target += bytesToWrite; + if (target > targetEnd) { + --source; /* Back up source pointer! */ + target -= bytesToWrite; result = targetExhausted; break; + } + switch (bytesToWrite) { /* note: everything falls through. */ + case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 1: *--target = (UTF8) (ch | firstByteMark[bytesToWrite]); + } + target += bytesToWrite; + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF8toUTF32 ( + const UTF8** sourceStart, const UTF8* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF8* source = *sourceStart; + UTF32* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch = 0; + unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; + if (source + extraBytesToRead >= sourceEnd) { + result = sourceExhausted; break; + } + /* Do this check whether lenient or strict */ + if (! isLegalUTF8(source, extraBytesToRead+1)) { + result = sourceIllegal; + break; + } + /* + * The cases all fall through. See "Note A" below. + */ + switch (extraBytesToRead) { + case 5: ch += *source++; ch <<= 6; + case 4: ch += *source++; ch <<= 6; + case 3: ch += *source++; ch <<= 6; + case 2: ch += *source++; ch <<= 6; + case 1: ch += *source++; ch <<= 6; + case 0: ch += *source++; + } + ch -= offsetsFromUTF8[extraBytesToRead]; + + if (target >= targetEnd) { + source -= (extraBytesToRead+1); /* Back up the source pointer! */ + result = targetExhausted; break; + } + if (ch <= UNI_MAX_LEGAL_UTF32) { + /* + * UTF-16 surrogate values are illegal in UTF-32, and anything + * over Plane 17 (> 0x10FFFF) is illegal. + */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + if (flags == strictConversion) { + source -= (extraBytesToRead+1); /* return to the illegal value itself */ + result = sourceIllegal; + break; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + *target++ = ch; + } + } else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */ + result = sourceIllegal; + *target++ = UNI_REPLACEMENT_CHAR; + } + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- + + Note A. + The fall-through switches in UTF-8 reading code save a + temp variable, some decrements & conditionals. The switches + are equivalent to the following loop: + { + int tmpBytesToRead = extraBytesToRead+1; + do { + ch += *source++; + --tmpBytesToRead; + if (tmpBytesToRead) ch <<= 6; + } while (tmpBytesToRead > 0); + } + In UTF-8 writing code, the switches on "bytesToWrite" are + similarly unrolled loops. + + --------------------------------------------------------------------- */ diff --git a/navit/support/win32/ConvertUTF.h b/navit/support/win32/ConvertUTF.h new file mode 100644 index 0000000..e264915 --- /dev/null +++ b/navit/support/win32/ConvertUTF.h @@ -0,0 +1,149 @@ +/* + * Copyright 2001-2004 Unicode, Inc. + * + * Disclaimer + * + * This source code is provided as is by Unicode, Inc. No claims are + * made as to fitness for any particular purpose. No warranties of any + * kind are expressed or implied. The recipient agrees to determine + * applicability of information provided. If this file has been + * purchased on magnetic or optical media from Unicode, Inc., the + * sole remedy for any claim will be exchange of defective media + * within 90 days of receipt. + * + * Limitations on Rights to Redistribute This Code + * + * Unicode, Inc. hereby grants the right to freely use the information + * supplied in this file in the creation of products supporting the + * Unicode Standard, and to make copies of this file in any form + * for internal or external distribution as long as this notice + * remains attached. + */ + +/* --------------------------------------------------------------------- + + Conversions between UTF32, UTF-16, and UTF-8. Header file. + + Several funtions are included here, forming a complete set of + conversions between the three formats. UTF-7 is not included + here, but is handled in a separate source file. + + Each of these routines takes pointers to input buffers and output + buffers. The input buffers are const. + + Each routine converts the text between *sourceStart and sourceEnd, + putting the result into the buffer between *targetStart and + targetEnd. Note: the end pointers are *after* the last item: e.g. + *(sourceEnd - 1) is the last item. + + The return result indicates whether the conversion was successful, + and if not, whether the problem was in the source or target buffers. + (Only the first encountered problem is indicated.) + + After the conversion, *sourceStart and *targetStart are both + updated to point to the end of last text successfully converted in + the respective buffers. + + Input parameters: + sourceStart - pointer to a pointer to the source buffer. + The contents of this are modified on return so that + it points at the next thing to be converted. + targetStart - similarly, pointer to pointer to the target buffer. + sourceEnd, targetEnd - respectively pointers to the ends of the + two buffers, for overflow checking only. + + These conversion functions take a ConversionFlags argument. When this + flag is set to strict, both irregular sequences and isolated surrogates + will cause an error. When the flag is set to lenient, both irregular + sequences and isolated surrogates are converted. + + Whether the flag is strict or lenient, all illegal sequences will cause + an error return. This includes sequences such as: , , + or in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code + must check for illegal sequences. + + When the flag is set to lenient, characters over 0x10FFFF are converted + to the replacement character; otherwise (when the flag is set to strict) + they constitute an error. + + Output parameters: + The value "sourceIllegal" is returned from some routines if the input + sequence is malformed. When "sourceIllegal" is returned, the source + value will point to the illegal value that caused the problem. E.g., + in UTF-8 when a sequence is malformed, it points to the start of the + malformed sequence. + + Author: Mark E. Davis, 1994. + Rev History: Rick McGowan, fixes & updates May 2001. + Fixes & updates, Sept 2001. + +------------------------------------------------------------------------ */ + +/* --------------------------------------------------------------------- + The following 4 definitions are compiler-specific. + The C standard does not guarantee that wchar_t has at least + 16 bits, so wchar_t is no less portable than unsigned short! + All should be unsigned values to avoid sign extension during + bit mask & shift operations. +------------------------------------------------------------------------ */ + +typedef unsigned long UTF32; /* at least 32 bits */ +typedef unsigned short UTF16; /* at least 16 bits */ +typedef unsigned char UTF8; /* typically 8 bits */ +typedef unsigned char Boolean; /* 0 or 1 */ + +/* Some fundamental constants */ +#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD +#define UNI_MAX_BMP (UTF32)0x0000FFFF +#define UNI_MAX_UTF16 (UTF32)0x0010FFFF +#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF +#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF + +typedef enum { + conversionOK, /* conversion successful */ + sourceExhausted, /* partial character in source, but hit end */ + targetExhausted, /* insuff. room in target for conversion */ + sourceIllegal /* source sequence is illegal/malformed */ +} ConversionResult; + +typedef enum { + strictConversion = 0, + lenientConversion +} ConversionFlags; + +/* This is for C++ and does no harm in C */ +#ifdef __cplusplus +extern "C" { +#endif + +ConversionResult ConvertUTF8toUTF16 ( + const UTF8** sourceStart, const UTF8* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF16toUTF8 ( + const UTF16** sourceStart, const UTF16* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF8toUTF32 ( + const UTF8** sourceStart, const UTF8* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF32toUTF8 ( + const UTF32** sourceStart, const UTF32* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF16toUTF32 ( + const UTF16** sourceStart, const UTF16* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF32toUTF16 ( + const UTF32** sourceStart, const UTF32* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); + +Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd); + +#ifdef __cplusplus +} +#endif + +/* --------------------------------------------------------------------- */ diff --git a/navit/support/win32/Makefile.am b/navit/support/win32/Makefile.am new file mode 100644 index 0000000..aee4350 --- /dev/null +++ b/navit/support/win32/Makefile.am @@ -0,0 +1,5 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=support_win32 +noinst_LTLIBRARIES = libsupport_win32.la +libsupport_win32_la_SOURCES = mmap.c win32_init.c sys/mman.h ConvertUTF.c ConvertUTF.h serial_io.c addwinsock.c + diff --git a/navit/support/win32/Makefile.in b/navit/support/win32/Makefile.in new file mode 100644 index 0000000..e33bda6 --- /dev/null +++ b/navit/support/win32/Makefile.in @@ -0,0 +1,643 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/support/win32 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libsupport_win32_la_LIBADD = +am_libsupport_win32_la_OBJECTS = mmap.lo win32_init.lo ConvertUTF.lo \ + serial_io.lo addwinsock.lo +libsupport_win32_la_OBJECTS = $(am_libsupport_win32_la_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libsupport_win32_la_SOURCES) +DIST_SOURCES = $(libsupport_win32_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=support_win32 +noinst_LTLIBRARIES = libsupport_win32.la +libsupport_win32_la_SOURCES = mmap.c win32_init.c sys/mman.h ConvertUTF.c ConvertUTF.h serial_io.c addwinsock.c +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/support/win32/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/support/win32/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libsupport_win32.la: $(libsupport_win32_la_OBJECTS) $(libsupport_win32_la_DEPENDENCIES) + $(LINK) $(libsupport_win32_la_OBJECTS) $(libsupport_win32_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ConvertUTF.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/addwinsock.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mmap.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/serial_io.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/win32_init.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/support/win32/addwinsock.c b/navit/support/win32/addwinsock.c new file mode 100644 index 0000000..63ae968 --- /dev/null +++ b/navit/support/win32/addwinsock.c @@ -0,0 +1,8 @@ +#include "addwinsock.h" + +int inet_aton(const char *cp, struct in_addr *inp) +{ + unsigned long addr = inet_addr(cp); + inp->S_un.S_addr = addr; + return addr != -1; +} diff --git a/navit/support/win32/mmap.c b/navit/support/win32/mmap.c new file mode 100644 index 0000000..008ffa6 --- /dev/null +++ b/navit/support/win32/mmap.c @@ -0,0 +1,43 @@ +#include +#include "sys/mman.h" + +void * mmap_readonly_win32( const char* name, long* map_handle_ptr, long* map_file_ptr ) +{ + void * mapped_ptr = NULL; +#if defined(__CEGCC__) + + wchar_t filename[MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, strlen(name), 0, 0)]; + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, strlen(name), filename, wcslen(filename)) ; + + HANDLE hFile = CreateFile (filename, GENERIC_READ, FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); +#else + HANDLE hFile = CreateFile (name, GENERIC_READ, FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); +#endif + *map_file_ptr = (long)hFile; + *map_handle_ptr = 0; + + if ( hFile != HFILE_ERROR ) + { + HANDLE hMapping = CreateFileMapping( (HANDLE)hFile, NULL, PAGE_READONLY, 0, 0, NULL); + mapped_ptr = MapViewOfFile(hMapping, FILE_MAP_READ, 0 , 0, 0 ); + *map_handle_ptr = (long)hMapping; + } + + return mapped_ptr; +} + +void mmap_unmap_win32( void* mem_ptr, long map_handle, long map_file ) +{ + if ( mem_ptr != NULL ) + { + UnmapViewOfFile( mem_ptr ); + } + if ( map_handle != 0) + { + CloseHandle( (HANDLE)map_handle ); + } + if ( map_file != 0 ) + { + CloseHandle( (HANDLE)map_file ); + } +} diff --git a/navit/support/win32/serial_io.c b/navit/support/win32/serial_io.c new file mode 100644 index 0000000..33ca5fe --- /dev/null +++ b/navit/support/win32/serial_io.c @@ -0,0 +1,166 @@ +#include +#include +#include +#include "serial_io.h" +#include "debug.h" + +//*************************************************************************** +/** @fn int serial_io_init( const char* port, const char* strsettings ) +***************************************************************************** +* @b Description: initialise a serial port communication +***************************************************************************** +* @param port : port name +* example 'COM7' +* @param strsettings : port settings +* example ; 'baud=115200 parity=N data=8 stop=1' +***************************************************************************** +* @return file descriptor +* -1 if error +***************************************************************************** +**/ +int serial_io_init( const char* port, const char* strsettings ) +{ + HANDLE hCom = NULL; + DCB dcb; + COMMTIMEOUTS sCT; + + char strport[16]; + g_snprintf( strport, sizeof( strport ), "\\\\.\\%s", port ); + + hCom = CreateFile( + strport, + GENERIC_WRITE | GENERIC_READ, + 0, + 0, + OPEN_EXISTING, + 0, + NULL); + + if (hCom == INVALID_HANDLE_VALUE) + { + LPVOID lpMsgBuf; + + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &lpMsgBuf, + 0, + NULL + ); + dbg(1, "return (fd) : '-1' : serial_io_init error : '%s'\n", lpMsgBuf); + + LocalFree( lpMsgBuf ); // Free the buffer. + return -1; + } + + ZeroMemory(&dcb, sizeof(DCB)); + + GetCommState(hCom, &dcb); + + BuildCommDCB( strsettings, &dcb); + + SetupComm(hCom, 4096, 4096); + + SetCommState(hCom, &dcb); + + memset(&sCT, 0, sizeof(sCT)); + sCT.ReadTotalTimeoutConstant = 10; + + SetCommTimeouts(hCom, &sCT); + + dbg(1, "serial_io_init return (fd) : '%d'\n", (int)hCom); + + return (int)hCom; +} + +//*************************************************************************** +/** @fn int serial_io_read( int fd, char * buffer, int buffer_size ) +***************************************************************************** +* @b Description: Read bytes on the serial port +***************************************************************************** +* @param fd : file descriptor +* @param buffer : buffer for data +* @param buffer_size : size in byte of the buffer +***************************************************************************** +* @return number of bytes read +***************************************************************************** +* @remarks buffer must be allocated by the caller +***************************************************************************** +**/ +int serial_io_read( int fd, char * buffer, int buffer_size ) +{ + DWORD dwBytesIn = 0; + dbg(1, "serial_io_read fd = %d buffer_size = %d\n", fd, buffer_size); + + + if (fd <= 0) + { + dbg(0, "serial_io_read return (dwBytesIn) : '0'\n"); + *buffer = 0; + return 0; + } + + ReadFile( (HANDLE)fd, buffer, buffer_size - 1, &dwBytesIn, NULL); + + if (dwBytesIn >= 0) + { + buffer[dwBytesIn] = 0; + } + else + { + dwBytesIn = 0; + buffer[0] = 0; + } + if (dwBytesIn > 0) + { + dbg(1,"GPS < %s\n",buffer ); + } + buffer[buffer_size - 1] = 0; + + dbg(2, "serial_io_read return (dwBytesIn) : '%d'\n", dwBytesIn); + return dwBytesIn; +} + +//*************************************************************************** +/** @fn int serial_io_write(int fd, const char * buffer) +***************************************************************************** +* @b Description: Write bytes on the serial port +***************************************************************************** +* @param fd : file descriptor +* @param buffer : data buffer (null terminated) +***************************************************************************** +* @return number of bytes written +***************************************************************************** +**/ +int serial_io_write(int fd, const char * buffer) +{ + DWORD dwBytesOut = 0; + dbg(1, "serial_io_write fd = %d buffer = '%s'\n",fd, buffer); + + + WriteFile((HANDLE)fd, buffer, strlen(buffer), &dwBytesOut, NULL); + + return dwBytesOut; +} + +//*************************************************************************** +/** @fn void serial_io_shutdown(int fd ) +***************************************************************************** +* @b Description: Terminate serial communication +***************************************************************************** +* @param fd : file descriptor +***************************************************************************** +**/ +void serial_io_shutdown(int fd ) +{ + dbg(1, "serial_io_shutdown fd = %d\n",fd); + + if (fd > 0) + { + CloseHandle((HANDLE)fd); + } +} diff --git a/navit/support/win32/sys/mman.h b/navit/support/win32/sys/mman.h new file mode 100644 index 0000000..37e59b9 --- /dev/null +++ b/navit/support/win32/sys/mman.h @@ -0,0 +1,8 @@ +#ifndef _WIN32_MMAN_H_INCLUDED +#define _WIN32_MMAN_H_INCLUDED + +void * mmap_readonly_win32( const char* name, long* map_handle_ptr, long* map_file_ptr ); +void mmap_unmap_win32( void* mem_ptr, long map_handle, long map_file ); + +#endif /* !_WIN32_MMAN_H_INCLUDED */ + diff --git a/navit/support/win32/win32_init.c b/navit/support/win32/win32_init.c new file mode 100644 index 0000000..32be387 --- /dev/null +++ b/navit/support/win32/win32_init.c @@ -0,0 +1,6 @@ +#include "plugin.h" + +void +plugin_init(void) +{ +} diff --git a/navit/support/wordexp/Makefile.am b/navit/support/wordexp/Makefile.am new file mode 100644 index 0000000..44d5ad2 --- /dev/null +++ b/navit/support/wordexp/Makefile.am @@ -0,0 +1,4 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=support_wordexp +noinst_LTLIBRARIES = libsupport_wordexp.la +libsupport_wordexp_la_SOURCES = wordexp.c wordexp_init.c wordexp.h glob.c glob.h diff --git a/navit/support/wordexp/Makefile.in b/navit/support/wordexp/Makefile.in new file mode 100644 index 0000000..309fe28 --- /dev/null +++ b/navit/support/wordexp/Makefile.in @@ -0,0 +1,640 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/support/wordexp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libsupport_wordexp_la_LIBADD = +am_libsupport_wordexp_la_OBJECTS = wordexp.lo wordexp_init.lo glob.lo +libsupport_wordexp_la_OBJECTS = $(am_libsupport_wordexp_la_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libsupport_wordexp_la_SOURCES) +DIST_SOURCES = $(libsupport_wordexp_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=support_wordexp +noinst_LTLIBRARIES = libsupport_wordexp.la +libsupport_wordexp_la_SOURCES = wordexp.c wordexp_init.c wordexp.h glob.c glob.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/support/wordexp/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/support/wordexp/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libsupport_wordexp.la: $(libsupport_wordexp_la_OBJECTS) $(libsupport_wordexp_la_DEPENDENCIES) + $(LINK) $(libsupport_wordexp_la_OBJECTS) $(libsupport_wordexp_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glob.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wordexp.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wordexp_init.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/support/wordexp/glob.c b/navit/support/wordexp/glob.c new file mode 100644 index 0000000..6cbf5e5 --- /dev/null +++ b/navit/support/wordexp/glob.c @@ -0,0 +1,197 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +/* + * @file glob.c + */ + +#include + +#ifndef HAVE_GLOB +#if defined _WIN32 || defined _WIN32_WCE +#include +#include "glob.h" + +/* + * @brief searches for all the pathnames matching pattern according to the rules + * which is similar to the rules used by common shells. + * here: expanding of ´*´ and ´?´ only in filenames + * @param pattern: no tilde expansion or parameter substitution is done. + * @param flags: not supported here + * @param errfunc: not supported here + * @param pglob: struct with array containing the matched files/directories + * @return FALSE on error. + */ +int glob(const char *pattern, int flags, + int (*errfunc)(const char *epath, int eerrno), + glob_t *pglob) +{ + char *pathend, + *filename; + int pathlen; + HANDLE hFiles; +#ifndef UNICODE + WIN32_FIND_DATA xFindData; + hFiles = FindFirstFile (pattern, &xFindData); +#else + int len = strlen(pattern) * sizeof(wchar_t*); + wchar_t *pathname = malloc(len); + WIN32_FIND_DATAW xFindData; + mbstowcs (pathname, pattern, len); + hFiles = FindFirstFile (pathname, &xFindData); +#endif + + if(hFiles == INVALID_HANDLE_VALUE) + { + return 1; + } + /* store the path information */ + if (NULL == (pathend = max (strrchr (pattern, '\\'), strrchr (pattern, '/')))) + pathend = (char *) pattern; + pathlen = pathend - pattern + 1; + + /* glob */ + pglob->gl_pathc = 0; /* number of founded files */ + pglob->gl_offs = 0; /* not needed */ + pglob->gl_pathv = malloc(sizeof(char*)); /* list of file names */ + + do + { + pglob->gl_pathc++; + pglob->gl_pathv = realloc (pglob->gl_pathv, pglob->gl_pathc * sizeof(char*)); +#ifndef UNICODE + filename = xFindData.cFileName; +#else + len = wcslen(xFindData.cFileName) * sizeof(char*); + filename = malloc (len); + wcstombs (filename, xFindData.cFileName, len); +#endif + pglob->gl_pathv[pglob->gl_pathc - 1] = malloc ((pathlen + strlen (filename) + 1) * sizeof(char*)); + strncpy (pglob->gl_pathv[pglob->gl_pathc - 1], pattern, pathlen); + // strcpy (pglob->gl_pathv[pglob->gl_pathc - 1] + pathlen - 1, filename); + // The above line should be uncommented later. Currently, the blow line needs to be in use. + // If not, navit on WinCE / Win32 cannot "find" the maps and bookmarks folder + strcpy (pglob->gl_pathv[pglob->gl_pathc - 1] + pathlen, filename); + } while (FindNextFile (hFiles, &xFindData)); + + FindClose(hFiles); + return 0; +} +#else + +#include +#include +#include +#include "debug.h" +#include "glob.h" + +static int +glob_requires_match(const char *pattern, int flags) +{ + for (;;) { + switch (*pattern++) { + case '\0': + return 0; + case '?': + case '*': + case '[': + return 1; + case '\\': + if (!*pattern++) + return 0; + } + } + return 0; +} + +static int +glob_recursive(const char *path1, const char *path2, const char *pattern, int flags, int (*errfunc) (const char *epath, int eerrno), glob_t *pglob) +{ + const char *next; + char *fname,*path=malloc(strlen(path1)+strlen(path2)+2); + int flen; + strcpy(path, path1); + if (path1[0] && path2[0] && (path1[1] != '\0' || path1[0] != '/')) + strcat(path, "/"); + strcat(path, path2); + if (!strlen(pattern)) { + dbg(0,"found %s\n",path); + pglob->gl_pathv=realloc(pglob->gl_pathv, (pglob->gl_pathc+1)*sizeof(char *)); + if (!pglob->gl_pathv) { + pglob->gl_pathc=0; + return GLOB_NOSPACE; + } + pglob->gl_pathv[pglob->gl_pathc++]=path; + return 0; + } + dbg(0,"searching for %s in %s\n",pattern,path); + flen=strcspn(pattern,"/"); + next=pattern+flen; + if (*next == '/') + next++; + fname=malloc(flen+1); + strncpy(fname, pattern, flen); + fname[flen]='\0'; + if (glob_requires_match(fname, 0)) { + DIR *dh; + struct dirent *de; + dbg(0,"in dir %s search for %s\n",path,fname); + dh=opendir(path); + if (dh) { + while ((de=readdir(dh))) { + if (fnmatch(fname,de->d_name,0) == 0) { + glob_recursive(path, de->d_name, next, flags, errfunc, pglob); + } + } + closedir(dh); + } + } else { + glob_recursive(path, fname, next, flags, errfunc, pglob); + } + free(fname); + free(path); + return 0; +} + +int +glob(const char *pattern, int flags, int (*errfunc) (const char *epath, int eerrno), glob_t *pglob) +{ + pglob->gl_pathc=0; + pglob->gl_pathv=NULL; + if (pattern[0] == '/') + return glob_recursive("/", "", pattern+1, flags, errfunc, pglob); + else + return glob_recursive("", "", pattern, flags, errfunc, pglob); +} + +#endif /* _WIN32 || _WIN32_WCE */ + +void globfree(glob_t *pglob) +{ + int i; + + for (i=0; i < pglob->gl_pathc; i++) + { + free (pglob->gl_pathv[i]); + } + free (pglob->gl_pathv); + pglob->gl_pathc = 0; +} + +#endif /* HAVE_GLOB */ diff --git a/navit/support/wordexp/glob.h b/navit/support/wordexp/glob.h new file mode 100644 index 0000000..d36ac29 --- /dev/null +++ b/navit/support/wordexp/glob.h @@ -0,0 +1,19 @@ +#ifndef _GLOB_H_ +#define _GLOB_H_ + +#ifndef HAVE_GLOB + +typedef struct { + size_t gl_pathc; /* count of file names */ + char **gl_pathv; /* list of file names */ + size_t gl_offs; /* slots to reserve in gl_pathv */ +} glob_t; + +int glob(const char *pattern, int flags, int (*errfunc)(const char *epath, int eerrno), glob_t *pglob); +void globfree(glob_t *pglob); + +#define GLOB_NOSPACE 1 + +#endif + +#endif /* _GLOB_H_ */ diff --git a/navit/support/wordexp/wordexp.c b/navit/support/wordexp/wordexp.c new file mode 100644 index 0000000..d2ed3ff --- /dev/null +++ b/navit/support/wordexp/wordexp.c @@ -0,0 +1,135 @@ + +#include + +#include +#include +#include +#include +#include +#include +#ifndef _MSC_VER +#include +#endif /* _MSC_VER */ +#include "wordexp.h" +#include "glob.h" + + +static int +is_valid_variable_char(char c, int pos) +{ + if ( (pos && c >= '0' && c <= '9') || + c == '_' || + (c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z')) + return 1; + return 0; +} + +/* + * @brief replace all names of $NAME ${NAME} + * with the corresponding environment variable + * @ param in: the string to be checked + * @ return the expanded string or a copy of the existing string + * must be free() by the calling function +*/ +static char * +expand_variables(const char *in) +{ + char *var,*pos,*ret=g_strdup(in); + char *val,*str; + pos=ret; + while ((var=strchr(pos, '$'))) { + char *name,*begin=var+1; + int npos=0,bpos=0,slen,elen; + *var='\0'; + if (var[1] == '{') { + begin++; + while (begin[npos]) { + bpos=npos; + if (begin[npos++] == '}') + break; + } + } else { + while (is_valid_variable_char(begin[npos],npos)) + npos++; + bpos=npos; + } + name=g_strdup(begin); + name[bpos]='\0'; + val=getenv(name); + free(name); + if (! val) + val=""; + slen=strlen(ret)+strlen(val); + elen=strlen(begin+npos); + str=malloc(slen+elen+1); + strcpy(str,ret); + strcat(str,val); + strcat(str,begin+npos); + free(ret); + ret=str; + pos=ret+slen; + } + return ret; +} + +/* + * @brief minimal realization of wordexp according to IEEE standard + * shall perform word expansion as described in the Shell + * expansion of ´$NAME´ or ´${NAME}´ + * expansion of ´*´ and ´?´ + * @param words: pointer to a string containing one or more words to be expanded + * but here only one word supported + */ +int +wordexp(const char *words, wordexp_t *we, int flags) +{ + int i; + int error = 0; + char *words_expanded; + glob_t pglob; + + assert(we != NULL); + assert(words != NULL); + + /* expansion of ´$NAME´ or ´${NAME}´ */ + words_expanded=expand_variables(words); + /* expansion of ´*´, ´?´ */ + error=glob(words_expanded, 0, NULL, &pglob); + if (!error) + { + /* copy the content of struct of glob into struct of wordexp */ + we->we_wordc = pglob.gl_pathc; + we->we_offs = pglob.gl_offs; + we->we_wordv = malloc(we->we_wordc * sizeof(char*)); + for (i=0; iwe_wordc; i++) + { + we->we_wordv[i] = g_strdup(pglob.gl_pathv[i]); + } + globfree(&pglob); + free(words_expanded); + } + else + { + we->we_wordc = 1; + we->we_wordv = malloc(sizeof(char*)); + we->we_wordv[0] = words_expanded; + } + + + return error; +} + + +void wordfree(wordexp_t *we) +{ + int i; + + for (i=0; i < we->we_wordc; i++) + { + free (we->we_wordv[i]); + } + + free (we->we_wordv); + we->we_wordc = 0; +} diff --git a/navit/support/wordexp/wordexp.h b/navit/support/wordexp/wordexp.h new file mode 100644 index 0000000..ad18c78 --- /dev/null +++ b/navit/support/wordexp/wordexp.h @@ -0,0 +1,42 @@ +#ifndef _WORDEXP_H_ +#define _WORDEXP_H_ + + +typedef struct { + size_t we_wordc; /* count of words matched */ + char **we_wordv; /* pointer to list of words */ + size_t we_offs; /* slots to reserve in we_wordv */ + /* following are internals */ + char *we_strings; /* storage for wordv strings */ + size_t we_nbytes; /* size of we_strings */ +} wordexp_t; + +/* + * Flags for wordexp(). + */ +#define WRDE_APPEND 0x1 /* append to previously generated */ +#define WRDE_DOOFFS 0x2 /* we_offs member is valid */ +#define WRDE_NOCMD 0x4 /* disallow command substitution */ +#define WRDE_REUSE 0x8 /* reuse wordexp_t */ +#define WRDE_SHOWERR 0x10 /* don't redirect stderr to /dev/null */ +#define WRDE_UNDEF 0x20 /* disallow undefined shell vars */ + +/* + * Return values from wordexp(). + */ +#define WRDE_BADCHAR 1 /* unquoted special character */ +#define WRDE_BADVAL 2 /* undefined variable */ +#define WRDE_CMDSUB 3 /* command substitution not allowed */ +#define WRDE_NOSPACE 4 /* no memory for result */ +#if (_XOPEN_SOURCE - 0) >= 4 || defined(_NETBSD_SOURCE) +#define WRDE_NOSYS 5 /* obsolete, reserved */ +#endif +#define WRDE_SYNTAX 6 /* shell syntax error */ +#define WRDE_ERRNO 7 /* other errors see errno */ + +void wordfree(wordexp_t *); +int wordexp(const char * words, wordexp_t * we, int flags); + + +#endif /* !_WORDEXP_H_ */ + diff --git a/navit/support/wordexp/wordexp_init.c b/navit/support/wordexp/wordexp_init.c new file mode 100644 index 0000000..32be387 --- /dev/null +++ b/navit/support/wordexp/wordexp_init.c @@ -0,0 +1,6 @@ +#include "plugin.h" + +void +plugin_init(void) +{ +} diff --git a/navit/support/zlib/Makefile.am b/navit/support/zlib/Makefile.am new file mode 100644 index 0000000..a49fe3c --- /dev/null +++ b/navit/support/zlib/Makefile.am @@ -0,0 +1,4 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=support_zlib +noinst_LTLIBRARIES = libsupport_zlib.la +libsupport_zlib_la_SOURCES = adler32.c crc32.c crc32.h infback.c inffast.c inffast.h inffixed.h inflate.c inflate.h inftrees.c inftrees.h zconf.h zlib.h zutil.c zutil.h zlib_init.c diff --git a/navit/support/zlib/Makefile.in b/navit/support/zlib/Makefile.in new file mode 100644 index 0000000..a9158ff --- /dev/null +++ b/navit/support/zlib/Makefile.in @@ -0,0 +1,646 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/support/zlib +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libsupport_zlib_la_LIBADD = +am_libsupport_zlib_la_OBJECTS = adler32.lo crc32.lo infback.lo \ + inffast.lo inflate.lo inftrees.lo zutil.lo zlib_init.lo +libsupport_zlib_la_OBJECTS = $(am_libsupport_zlib_la_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libsupport_zlib_la_SOURCES) +DIST_SOURCES = $(libsupport_zlib_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=support_zlib +noinst_LTLIBRARIES = libsupport_zlib.la +libsupport_zlib_la_SOURCES = adler32.c crc32.c crc32.h infback.c inffast.c inffast.h inffixed.h inflate.c inflate.h inftrees.c inftrees.h zconf.h zlib.h zutil.c zutil.h zlib_init.c +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/support/zlib/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/support/zlib/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libsupport_zlib.la: $(libsupport_zlib_la_OBJECTS) $(libsupport_zlib_la_DEPENDENCIES) + $(LINK) $(libsupport_zlib_la_OBJECTS) $(libsupport_zlib_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adler32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crc32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/infback.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inffast.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inflate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inftrees.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zlib_init.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zutil.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/support/zlib/adler32.c b/navit/support/zlib/adler32.c new file mode 100644 index 0000000..007ba26 --- /dev/null +++ b/navit/support/zlib/adler32.c @@ -0,0 +1,149 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +#define BASE 65521UL /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* use NO_DIVIDE if your processor does not do division in hardware */ +#ifdef NO_DIVIDE +# define MOD(a) \ + do { \ + if (a >= (BASE << 16)) a -= (BASE << 16); \ + if (a >= (BASE << 15)) a -= (BASE << 15); \ + if (a >= (BASE << 14)) a -= (BASE << 14); \ + if (a >= (BASE << 13)) a -= (BASE << 13); \ + if (a >= (BASE << 12)) a -= (BASE << 12); \ + if (a >= (BASE << 11)) a -= (BASE << 11); \ + if (a >= (BASE << 10)) a -= (BASE << 10); \ + if (a >= (BASE << 9)) a -= (BASE << 9); \ + if (a >= (BASE << 8)) a -= (BASE << 8); \ + if (a >= (BASE << 7)) a -= (BASE << 7); \ + if (a >= (BASE << 6)) a -= (BASE << 6); \ + if (a >= (BASE << 5)) a -= (BASE << 5); \ + if (a >= (BASE << 4)) a -= (BASE << 4); \ + if (a >= (BASE << 3)) a -= (BASE << 3); \ + if (a >= (BASE << 2)) a -= (BASE << 2); \ + if (a >= (BASE << 1)) a -= (BASE << 1); \ + if (a >= BASE) a -= BASE; \ + } while (0) +# define MOD4(a) \ + do { \ + if (a >= (BASE << 4)) a -= (BASE << 4); \ + if (a >= (BASE << 3)) a -= (BASE << 3); \ + if (a >= (BASE << 2)) a -= (BASE << 2); \ + if (a >= (BASE << 1)) a -= (BASE << 1); \ + if (a >= BASE) a -= BASE; \ + } while (0) +#else +# define MOD(a) a %= BASE +# define MOD4(a) a %= BASE +#endif + +/* ========================================================================= */ +uLong ZEXPORT adler32(adler, buf, len) + uLong adler; + const Bytef *buf; + uInt len; +{ + unsigned long sum2; + unsigned n; + + /* split Adler-32 into component sums */ + sum2 = (adler >> 16) & 0xffff; + adler &= 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (len == 1) { + adler += buf[0]; + if (adler >= BASE) + adler -= BASE; + sum2 += adler; + if (sum2 >= BASE) + sum2 -= BASE; + return adler | (sum2 << 16); + } + + /* initial Adler-32 value (deferred check for len == 1 speed) */ + if (buf == Z_NULL) + return 1L; + + /* in case short lengths are provided, keep it somewhat fast */ + if (len < 16) { + while (len--) { + adler += *buf++; + sum2 += adler; + } + if (adler >= BASE) + adler -= BASE; + MOD4(sum2); /* only added so many BASE's */ + return adler | (sum2 << 16); + } + + /* do length NMAX blocks -- requires just one modulo operation */ + while (len >= NMAX) { + len -= NMAX; + n = NMAX / 16; /* NMAX is divisible by 16 */ + do { + DO16(buf); /* 16 sums unrolled */ + buf += 16; + } while (--n); + MOD(adler); + MOD(sum2); + } + + /* do remaining bytes (less than NMAX, still just one modulo) */ + if (len) { /* avoid modulos if none remaining */ + while (len >= 16) { + len -= 16; + DO16(buf); + buf += 16; + } + while (len--) { + adler += *buf++; + sum2 += adler; + } + MOD(adler); + MOD(sum2); + } + + /* return recombined sums */ + return adler | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32_combine(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off_t len2; +{ + unsigned long sum1; + unsigned long sum2; + unsigned rem; + + /* the derivation of this formula is left as an exercise for the reader */ + rem = (unsigned)(len2 % BASE); + sum1 = adler1 & 0xffff; + sum2 = rem * sum1; + MOD(sum2); + sum1 += (adler2 & 0xffff) + BASE - 1; + sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; + if (sum1 > BASE) sum1 -= BASE; + if (sum1 > BASE) sum1 -= BASE; + if (sum2 > (BASE << 1)) sum2 -= (BASE << 1); + if (sum2 > BASE) sum2 -= BASE; + return sum1 | (sum2 << 16); +} diff --git a/navit/support/zlib/crc32.c b/navit/support/zlib/crc32.c new file mode 100644 index 0000000..f658a9e --- /dev/null +++ b/navit/support/zlib/crc32.c @@ -0,0 +1,423 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Thanks to Rodney Brown for his contribution of faster + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing + * tables for updating the shift register in one step with three exclusive-ors + * instead of four steps with four exclusive-ors. This results in about a + * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + */ + +/* @(#) $Id$ */ + +/* + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). + */ + +#ifdef MAKECRCH +# include +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "zutil.h" /* for STDC and FAR definitions */ + +#define local static + +/* Find a four-byte integer type for crc32_little() and crc32_big(). */ +#ifndef NOBYFOUR +# ifdef STDC /* need ANSI C limits.h to determine sizes */ +# include +# define BYFOUR +# if (UINT_MAX == 0xffffffffUL) + typedef unsigned int u4; +# else +# if (ULONG_MAX == 0xffffffffUL) + typedef unsigned long u4; +# else +# if (USHRT_MAX == 0xffffffffUL) + typedef unsigned short u4; +# else +# undef BYFOUR /* can't find a four-byte integer type! */ +# endif +# endif +# endif +# endif /* STDC */ +#endif /* !NOBYFOUR */ + +/* Definitions for doing the crc four data bytes at a time. */ +#ifdef BYFOUR +# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ + (((w)&0xff00)<<8)+(((w)&0xff)<<24)) + local unsigned long crc32_little OF((unsigned long, + const unsigned char FAR *, unsigned)); + local unsigned long crc32_big OF((unsigned long, + const unsigned char FAR *, unsigned)); +# define TBLS 8 +#else +# define TBLS 1 +#endif /* BYFOUR */ + +/* Local functions for crc concatenation */ +local unsigned long gf2_matrix_times OF((unsigned long *mat, + unsigned long vec)); +local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); + +#ifdef DYNAMIC_CRC_TABLE + +local volatile int crc_table_empty = 1; +local unsigned long FAR crc_table[TBLS][256]; +local void make_crc_table OF((void)); +#ifdef MAKECRCH + local void write_table OF((FILE *, const unsigned long FAR *)); +#endif /* MAKECRCH */ +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The first table is simply the CRC of all possible eight bit values. This is + all the information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. The remaining tables + allow for word-at-a-time CRC calculation for both big-endian and little- + endian machines, where a word is four bytes. +*/ +local void make_crc_table() +{ + unsigned long c; + int n, k; + unsigned long poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static volatile int first = 1; /* flag to limit concurrent making */ + static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; + + /* See if another task is already doing this (not thread-safe, but better + than nothing -- significantly reduces duration of vulnerability in + case the advice about DYNAMIC_CRC_TABLE is ignored) */ + if (first) { + first = 0; + + /* make exclusive-or pattern from polynomial (0xedb88320UL) */ + poly = 0UL; + for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) + poly |= 1UL << (31 - p[n]); + + /* generate a crc for every 8-bit value */ + for (n = 0; n < 256; n++) { + c = (unsigned long)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[0][n] = c; + } + +#ifdef BYFOUR + /* generate crc for each value followed by one, two, and three zeros, + and then the byte reversal of those as well as the first table */ + for (n = 0; n < 256; n++) { + c = crc_table[0][n]; + crc_table[4][n] = REV(c); + for (k = 1; k < 4; k++) { + c = crc_table[0][c & 0xff] ^ (c >> 8); + crc_table[k][n] = c; + crc_table[k + 4][n] = REV(c); + } + } +#endif /* BYFOUR */ + + crc_table_empty = 0; + } + else { /* not first */ + /* wait for the other guy to finish (not efficient, but rare) */ + while (crc_table_empty) + ; + } + +#ifdef MAKECRCH + /* write out CRC tables to crc32.h */ + { + FILE *out; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); + fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); + fprintf(out, "local const unsigned long FAR "); + fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); + write_table(out, crc_table[0]); +# ifdef BYFOUR + fprintf(out, "#ifdef BYFOUR\n"); + for (k = 1; k < 8; k++) { + fprintf(out, " },\n {\n"); + write_table(out, crc_table[k]); + } + fprintf(out, "#endif\n"); +# endif /* BYFOUR */ + fprintf(out, " }\n};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH +local void write_table(out, table) + FILE *out; + const unsigned long FAR *table; +{ + int n; + + for (n = 0; n < 256; n++) + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], + n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); +} +#endif /* MAKECRCH */ + +#else /* !DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Tables of CRC-32s of all single-byte values, made by make_crc_table(). + */ +#include "crc32.h" +#endif /* DYNAMIC_CRC_TABLE */ + +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const unsigned long FAR * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + return (const unsigned long FAR *)crc_table; +} + +/* ========================================================================= */ +#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) +#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 + +/* ========================================================================= */ +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + if (buf == Z_NULL) return 0UL; + +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + +#ifdef BYFOUR + if (sizeof(void *) == sizeof(ptrdiff_t)) { + u4 endian; + + endian = 1; + if (*((unsigned char *)(&endian))) + return crc32_little(crc, buf, len); + else + return crc32_big(crc, buf, len); + } +#endif /* BYFOUR */ + crc = crc ^ 0xffffffffUL; + while (len >= 8) { + DO8; + len -= 8; + } + if (len) do { + DO1; + } while (--len); + return crc ^ 0xffffffffUL; +} + +#ifdef BYFOUR + +/* ========================================================================= */ +#define DOLIT4 c ^= *buf4++; \ + c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ + crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] +#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 + +/* ========================================================================= */ +local unsigned long crc32_little(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register u4 c; + register const u4 FAR *buf4; + + c = (u4)crc; + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + len--; + } + + buf4 = (const u4 FAR *)(const void FAR *)buf; + while (len >= 32) { + DOLIT32; + len -= 32; + } + while (len >= 4) { + DOLIT4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + } while (--len); + c = ~c; + return (unsigned long)c; +} + +/* ========================================================================= */ +#define DOBIG4 c ^= *++buf4; \ + c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ + crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] +#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 + +/* ========================================================================= */ +local unsigned long crc32_big(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register u4 c; + register const u4 FAR *buf4; + + c = REV((u4)crc); + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + len--; + } + + buf4 = (const u4 FAR *)(const void FAR *)buf; + buf4--; + while (len >= 32) { + DOBIG32; + len -= 32; + } + while (len >= 4) { + DOBIG4; + len -= 4; + } + buf4++; + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + } while (--len); + c = ~c; + return (unsigned long)(REV(c)); +} + +#endif /* BYFOUR */ + +#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ + +/* ========================================================================= */ +local unsigned long gf2_matrix_times(mat, vec) + unsigned long *mat; + unsigned long vec; +{ + unsigned long sum; + + sum = 0; + while (vec) { + if (vec & 1) + sum ^= *mat; + vec >>= 1; + mat++; + } + return sum; +} + +/* ========================================================================= */ +local void gf2_matrix_square(square, mat) + unsigned long *square; + unsigned long *mat; +{ + int n; + + for (n = 0; n < GF2_DIM; n++) + square[n] = gf2_matrix_times(mat, mat[n]); +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + int n; + unsigned long row; + unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ + unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ + + /* degenerate case */ + if (len2 == 0) + return crc1; + + /* put operator for one zero bit in odd */ + odd[0] = 0xedb88320L; /* CRC-32 polynomial */ + row = 1; + for (n = 1; n < GF2_DIM; n++) { + odd[n] = row; + row <<= 1; + } + + /* put operator for two zero bits in even */ + gf2_matrix_square(even, odd); + + /* put operator for four zero bits in odd */ + gf2_matrix_square(odd, even); + + /* apply len2 zeros to crc1 (first square will put the operator for one + zero byte, eight zero bits, in even) */ + do { + /* apply zeros operator for this bit of len2 */ + gf2_matrix_square(even, odd); + if (len2 & 1) + crc1 = gf2_matrix_times(even, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + if (len2 == 0) + break; + + /* another iteration of the loop with odd and even swapped */ + gf2_matrix_square(odd, even); + if (len2 & 1) + crc1 = gf2_matrix_times(odd, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + } while (len2 != 0); + + /* return combined crc */ + crc1 ^= crc2; + return crc1; +} diff --git a/navit/support/zlib/crc32.h b/navit/support/zlib/crc32.h new file mode 100644 index 0000000..8053b61 --- /dev/null +++ b/navit/support/zlib/crc32.h @@ -0,0 +1,441 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const unsigned long FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; diff --git a/navit/support/zlib/infback.c b/navit/support/zlib/infback.c new file mode 100644 index 0000000..455dbc9 --- /dev/null +++ b/navit/support/zlib/infback.c @@ -0,0 +1,623 @@ +/* infback.c -- inflate using a call-back interface + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + This code is largely copied from inflate.c. Normally either infback.o or + inflate.o would be linked into an application--not both. The interface + with inffast.c is retained so that optimized assembler-coded versions of + inflate_fast() can be used with either inflate.c or infback.c. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + windowBits is in the range 8..15, and window is a user-supplied + window and output buffer that is 2**windowBits bytes. + */ +int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) +z_streamp strm; +int windowBits; +unsigned char FAR *window; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL || + windowBits < 8 || windowBits > 15) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->dmax = 32768U; + state->wbits = windowBits; + state->wsize = 1U << windowBits; + state->window = window; + state->write = 0; + state->whave = 0; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +/* Macros for inflateBack(): */ + +/* Load returned state from inflate_fast() */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Set state from registers for inflate_fast() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = state->window; \ + left = state->wsize; \ + state->whave = left; \ + if (out(out_desc, put, left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) +z_streamp strm; +in_func in; +void FAR *in_desc; +out_func out; +void FAR *out_desc; +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code this; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + state->mode = TYPE; + state->last = 0; + state->whave = 0; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = state->window; + left = state->wsize; + + /* Inflate until end of block marked as last */ + for (;;) + switch (state->mode) { + case TYPE: + /* determine and dispatch block type */ + if (state->last) { + BYTEBITS(); + state->mode = DONE; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + + /* copy stored block from input to output */ + while (state->length != 0) { + copy = state->length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.val < 16) { + NEEDBITS(this.bits); + DROPBITS(this.bits); + state->lens[state->have++] = this.val; + } + else { + if (this.val == 16) { + NEEDBITS(this.bits + 2); + DROPBITS(this.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (this.val == 17) { + NEEDBITS(this.bits + 3); + DROPBITS(this.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(this.bits + 7); + DROPBITS(this.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* build code tables */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + + case LEN: + /* use inflate_fast() if we have enough input and output */ + if (have >= 6 && left >= 258) { + RESTORE(); + if (state->whave < state->wsize) + state->whave = state->wsize - left; + inflate_fast(strm, state->wsize); + LOAD(); + break; + } + + /* get a literal, length, or end-of-block code */ + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.op && (this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + state->length = (unsigned)this.val; + + /* process literal */ + if (this.op == 0) { + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + ROOM(); + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + } + + /* process end of block */ + if (this.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + + /* invalid code */ + if (this.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + state->extra = (unsigned)(this.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + + /* get distance code */ + for (;;) { + this = state->distcode[BITS(state->distbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if ((this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + if (this.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)this.val; + + /* get distance extra bits, if any */ + state->extra = (unsigned)(this.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } + if (state->offset > state->wsize - (state->whave < state->wsize ? + left : 0)) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = state->wsize - state->offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - state->offset; + copy = left; + } + if (copy > state->length) copy = state->length; + state->length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (state->length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < state->wsize) { + if (out(out_desc, state->window, state->wsize - left)) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBackEnd(strm) +z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/navit/support/zlib/inffast.c b/navit/support/zlib/inffast.c new file mode 100644 index 0000000..bbee92e --- /dev/null +++ b/navit/support/zlib/inffast.c @@ -0,0 +1,318 @@ +/* inffast.c -- fast decoding + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifndef ASMINF + +/* Allow machine dependent optimization for post-increment or pre-increment. + Based on testing to date, + Pre-increment preferred for: + - PowerPC G3 (Adler) + - MIPS R5000 (Randers-Pehrson) + Post-increment preferred for: + - none + No measurable difference: + - Pentium III (Anderson) + - M68060 (Nikl) + */ +#ifdef POSTINC +# define OFF 0 +# define PUP(a) *(a)++ +#else +# define OFF 1 +# define PUP(a) *++(a) +#endif + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + unsigned char FAR *in; /* local strm->next_in */ + unsigned char FAR *last; /* while in < last, enough input available */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code this; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in - OFF; + last = in + (strm->avail_in - 5); + out = strm->next_out - OFF; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + write = state->write; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + this = lcode[hold & lmask]; + dolen: + op = (unsigned)(this.bits); + hold >>= op; + bits -= op; + op = (unsigned)(this.op); + if (op == 0) { /* literal */ + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + PUP(out) = (unsigned char)(this.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + this = dcode[hold & dmask]; + dodist: + op = (unsigned)(this.bits); + hold >>= op; + bits -= op; + op = (unsigned)(this.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + from = window - OFF; + if (write == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (write < op) { /* wrap around window */ + from += wsize + write - op; + op -= write; + if (op < len) { /* some from end of window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = window - OFF; + if (write < len) { /* some from start of window */ + op = write; + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += write - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } while (len > 2); + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + this = dcode[this.val + (hold & ((1U << op) - 1))]; + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + this = lcode[this.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in + OFF; + strm->next_out = out + OFF; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and write == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/navit/support/zlib/inffast.h b/navit/support/zlib/inffast.h new file mode 100644 index 0000000..1e88d2d --- /dev/null +++ b/navit/support/zlib/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/navit/support/zlib/inffixed.h b/navit/support/zlib/inffixed.h new file mode 100644 index 0000000..75ed4b5 --- /dev/null +++ b/navit/support/zlib/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. It + is part of the implementation of the compression library and + is subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/navit/support/zlib/inflate.c b/navit/support/zlib/inflate.c new file mode 100644 index 0000000..792fdee --- /dev/null +++ b/navit/support/zlib/inflate.c @@ -0,0 +1,1368 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common write == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, unsigned out)); +#ifdef BUILDFIXED + void makefixed OF((void)); +#endif +local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, + unsigned len)); + +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + strm->adler = 1; /* to support ill-conceived Java test suite */ + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->wsize = 0; + state->whave = 0; + state->write = 0; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflatePrime(strm, bits, value) +z_streamp strm; +int bits; +int value; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += value << state->bits; + state->bits += bits; + return Z_OK; +} + +int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) +z_streamp strm; +int windowBits; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + if (windowBits < 0) { + state->wrap = 0; + windowBits = -windowBits; + } + else { + state->wrap = (windowBits >> 4) + 1; +#ifdef GUNZIP + if (windowBits < 48) windowBits &= 15; +#endif + } + if (windowBits < 8 || windowBits > 15) { + ZFREE(strm, state); + strm->state = Z_NULL; + return Z_STREAM_ERROR; + } + state->wbits = (unsigned)windowBits; + state->window = Z_NULL; + return inflateReset(strm); +} + +int ZEXPORT inflateInit_(strm, version, stream_size) +z_streamp strm; +const char *version; +int stream_size; +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed() +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, + state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow(strm, out) +z_streamp strm; +unsigned out; +{ + struct inflate_state FAR *state; + unsigned copy, dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->write = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + copy = out - strm->avail_out; + if (copy >= state->wsize) { + zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); + state->write = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->write; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->write, strm->next_out - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, strm->next_out - copy, copy); + state->write = copy; + state->whave = state->wsize; + } + else { + state->write += dist; + if (state->write == state->wsize) state->write = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Reverse the bytes in a 32-bit value */ +#define REVERSE(q) \ + ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate(strm, flush) +z_streamp strm; +int flush; +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code this; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + state->flags = 0; /* expect zlib header */ + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if (state->flags & 0x0200) CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL) { + len = state->head->extra_len - state->length; + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if (hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = REVERSE(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.val < 16) { + NEEDBITS(this.bits); + DROPBITS(this.bits); + state->lens[state->have++] = this.val; + } + else { + if (this.val == 16) { + NEEDBITS(this.bits + 2); + DROPBITS(this.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (this.val == 17) { + NEEDBITS(this.bits + 3); + DROPBITS(this.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(this.bits + 7); + DROPBITS(this.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* build code tables */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + break; + } + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.op && (this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + state->length = (unsigned)this.val; + if ((int)(this.op) == 0) { + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + state->mode = LIT; + break; + } + if (this.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + if (this.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(this.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->mode = DIST; + case DIST: + for (;;) { + this = state->distcode[BITS(state->distbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if ((this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + if (this.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)this.val; + state->extra = (unsigned)(this.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + if (state->offset > state->whave + out - left) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->write) { + copy -= state->write; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->write - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if (out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if (( +#ifdef GUNZIP + state->flags ? hold : +#endif + REVERSE(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if (hold != (state->total & 0xffffffffUL)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) + if (updatewindow(strm, out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if (state->wrap && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + strm->data_type = state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) +z_streamp strm; +const Bytef *dictionary; +uInt dictLength; +{ + struct inflate_state FAR *state; + unsigned long id; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary id */ + if (state->mode == DICT) { + id = adler32(0L, Z_NULL, 0); + id = adler32(id, dictionary, dictLength); + if (id != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window */ + if (updatewindow(strm, strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + if (dictLength > state->wsize) { + zmemcpy(state->window, dictionary + dictLength - state->wsize, + state->wsize); + state->whave = state->wsize; + } + else { + zmemcpy(state->window + state->wsize - dictLength, dictionary, + dictLength); + state->whave = dictLength; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int ZEXPORT inflateGetHeader(strm, head) +z_streamp strm; +gz_headerp head; +{ + struct inflate_state FAR *state; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch(have, buf, len) +unsigned FAR *have; +unsigned char FAR *buf; +unsigned len; +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync(strm) +z_streamp strm; +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy(dest, source) +z_streamp dest; +z_streamp source; +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || + source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy(dest, source, sizeof(z_stream)); + zmemcpy(copy, state, sizeof(struct inflate_state)); + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} diff --git a/navit/support/zlib/inflate.h b/navit/support/zlib/inflate.h new file mode 100644 index 0000000..07bd3e7 --- /dev/null +++ b/navit/support/zlib/inflate.h @@ -0,0 +1,115 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN, /* i: waiting for length/lit code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to the BAD or MEM mode -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME + NAME -> COMMENT -> HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + Read deflate blocks: + TYPE -> STORED or TABLE or LEN or CHECK + STORED -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN + Read deflate codes: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* state maintained between inflate() calls. Approximately 7K bytes. */ +struct inflate_state { + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ +}; diff --git a/navit/support/zlib/inftrees.c b/navit/support/zlib/inftrees.c new file mode 100644 index 0000000..8a9c13f --- /dev/null +++ b/navit/support/zlib/inftrees.c @@ -0,0 +1,329 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#define MAXBITS 15 + +const char inflate_copyright[] = + " inflate 1.2.3 Copyright 1995-2005 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int inflate_table(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code this; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)1; + this.val = (unsigned short)0; + *(*table)++ = this; /* make a table to force an error */ + *(*table)++ = this; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min <= MAXBITS; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked when a LENS table is being made + against the space in *table, ENOUGH, minus the maximum space needed by + the worst case distance code, MAXD. This should never happen, but the + sufficiency of ENOUGH has not been proven exhaustively, hence the check. + This assumes that when type == LENS, bits == 9. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + this.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + this.op = (unsigned char)0; + this.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + this.op = (unsigned char)(extra[work[sym]]); + this.val = base[work[sym]]; + } + else { + this.op = (unsigned char)(32 + 64); /* end of block */ + this.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = this; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* + Fill in rest of table for incomplete codes. This loop is similar to the + loop above in incrementing huff for table indices. It is assumed that + len is equal to curr + drop, so there is no loop needed to increment + through high index bits. When the current sub-table is filled, the loop + drops back to the root table to fill in any remaining entries there. + */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)(len - drop); + this.val = (unsigned short)0; + while (huff != 0) { + /* when done with sub-table, drop back to root table */ + if (drop != 0 && (huff & mask) != low) { + drop = 0; + len = root; + next = *table; + this.bits = (unsigned char)len; + } + + /* put invalid code marker in table */ + next[huff >> drop] = this; + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/navit/support/zlib/inftrees.h b/navit/support/zlib/inftrees.h new file mode 100644 index 0000000..b1104c8 --- /dev/null +++ b/navit/support/zlib/inftrees.h @@ -0,0 +1,55 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of dynamic tree. The maximum found in a long but non- + exhaustive search was 1444 code structures (852 for length/literals + and 592 for distances, the latter actually the result of an + exhaustive search). The true maximum is not known, but the value + below is more than safe. */ +#define ENOUGH 2048 +#define MAXD 592 + +/* Type of code to build for inftable() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +extern int inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/navit/support/zlib/zconf.h b/navit/support/zlib/zconf.h new file mode 100644 index 0000000..03a9431 --- /dev/null +++ b/navit/support/zlib/zconf.h @@ -0,0 +1,332 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + */ +#ifdef Z_PREFIX +# define deflateInit_ z_deflateInit_ +# define deflate z_deflate +# define deflateEnd z_deflateEnd +# define inflateInit_ z_inflateInit_ +# define inflate z_inflate +# define inflateEnd z_inflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateSetDictionary z_deflateSetDictionary +# define deflateCopy z_deflateCopy +# define deflateReset z_deflateReset +# define deflateParams z_deflateParams +# define deflateBound z_deflateBound +# define deflatePrime z_deflatePrime +# define inflateInit2_ z_inflateInit2_ +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateCopy z_inflateCopy +# define inflateReset z_inflateReset +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# define uncompress z_uncompress +# define adler32 z_adler32 +# define crc32 z_crc32 +# define get_crc_table z_get_crc_table +# define zError z_zError + +# define alloc_func z_alloc_func +# define free_func z_free_func +# define in_func z_in_func +# define out_func z_out_func +# define Byte z_Byte +# define uInt z_uInt +# define uLong z_uLong +# define Bytef z_Bytef +# define charf z_charf +# define intf z_intf +# define uIntf z_uIntf +# define uLongf z_uLongf +# define voidpf z_voidpf +# define voidp z_voidp +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ +# include /* for off_t */ +# include /* for SEEK_* and off_t */ +# ifdef VMS +# include /* for off_t */ +# endif +# define z_off_t off_t +#endif +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif +#ifndef z_off_t +# define z_off_t long +#endif + +#if defined(__OS400__) +# define NO_vsnprintf +#endif + +#if defined(__MVS__) +# define NO_vsnprintf +# ifdef FAR +# undef FAR +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) +# pragma map(deflateInit_,"DEIN") +# pragma map(deflateInit2_,"DEIN2") +# pragma map(deflateEnd,"DEEND") +# pragma map(deflateBound,"DEBND") +# pragma map(inflateInit_,"ININ") +# pragma map(inflateInit2_,"ININ2") +# pragma map(inflateEnd,"INEND") +# pragma map(inflateSync,"INSY") +# pragma map(inflateSetDictionary,"INSEDI") +# pragma map(compressBound,"CMBND") +# pragma map(inflate_table,"INTABL") +# pragma map(inflate_fast,"INFA") +# pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/navit/support/zlib/zlib.h b/navit/support/zlib/zlib.h new file mode 100644 index 0000000..0228179 --- /dev/null +++ b/navit/support/zlib/zlib.h @@ -0,0 +1,1357 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.3, July 18th, 2005 + + Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.3" +#define ZLIB_VERNUM 0x1230 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed + data. This version of the library supports only one compression method + (deflation) but other algorithms will be added later and will have the same + stream interface. + + Compression can be done in a single step if the buffers are large + enough (for example if an input file is mmap'ed), or can be done by + repeated calls of the compression function. In the latter case, the + application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never + crash even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total nb of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total nb of bytes output so far */ + + char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has + dropped to zero. It must update next_out and avail_out when avail_out + has dropped to zero. The application must initialize zalloc, zfree and + opaque before calling the init function. All other fields are set by the + compression library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this + if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, + pointers returned by zalloc for objects of exactly 65536 bytes *must* + have their offset normalized to zero. The default allocation function + provided by this library ensures this (see zutil.c). To reduce memory + requirements and avoid any allocation of 64K objects, at the expense of + compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or + progress reports. After compression, total_in holds the total size of + the uncompressed data and may be saved for use in the decompressor + (particularly if the decompressor wants to decompress everything in + a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative + * values are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is + not compatible with the zlib.h header file used by the application. + This check is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. + If zalloc and zfree are set to Z_NULL, deflateInit updates them to + use default allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at + all (the input data is simply copied a block at a time). + Z_DEFAULT_COMPRESSION requests a default compromise between speed and + compression (currently equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if level is not a valid compression level, + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). + msg is set to null if there is no error message. deflateInit does not + perform any compression: this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce some + output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). + Some output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating avail_in or avail_out accordingly; avail_out + should never be zero before the call. The application can consume the + compressed output when it wants, for example when the output buffer is full + (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK + and with zero avail_out, it must be called again after making room in the + output buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumualte before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In particular + avail_in is zero after the call if enough output space has been provided + before the call.) Flushing may degrade compression for some compression + algorithms and so it should be used only when necessary. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there + was enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the + stream are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least + the value returned by deflateBound (see below). If deflate does not return + Z_STREAM_END, then it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect + the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, + msg may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the exact + value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller. msg is set to null if there is no error + message. inflateInit does not perform any decompression apart from reading + the zlib header if present: this will be done by inflate(). (So next_in and + avail_in may be modified, but next_out and avail_out are unchanged.) +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing + will resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there + is no more input data or no more space in the output buffer (see below + about the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating the next_* and avail_* values accordingly. + The application can consume the uncompressed output when it wants, for + example when the output buffer is full (avail_out == 0), or after each + call of inflate(). If inflate returns Z_OK and with zero avail_out, it + must be called again after making room in the output buffer because there + might be more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, + Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() stop + if and when it gets to the next deflate block boundary. When decoding the + zlib or gzip format, this will cause inflate() to return immediately after + the header and before the first block. When doing a raw inflate, inflate() + will go ahead and process the first block, and will return when it gets to + the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 + if inflate() is currently decoding the last block in the deflate stream, + plus 128 if inflate() returned immediately after decoding an end-of-block + code or decoding the complete header up to just before the first byte of the + deflate stream. The end-of-block will not be indicated until all of the + uncompressed data from that block has been written to strm->next_out. The + number of unused bits may in general be greater than seven, except when + bit 7 of data_type is set, in which case the number of unused bits will be + less than eight. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step + (a single call of inflate), the parameter flush should be set to + Z_FINISH. In this case all pending input is processed and all pending + output is flushed; avail_out must be large enough to hold all the + uncompressed data. (The size of the uncompressed data may have been saved + by the compressor for this purpose.) The next operation on this stream must + be inflateEnd to deallocate the decompression state. The use of Z_FINISH + is never required, but can be used to inform inflate that a faster approach + may be used for the single inflate() call. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the only effect of the flush parameter in this implementation + is on the return value of inflate(), as noted below, or when it returns early + because Z_BLOCK is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the adler32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the adler32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() will decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically. Any information + contained in the gzip header is not retained, so applications that need that + information should instead use raw inflate, see inflateInit2() below, or + inflateBack() and perform their own processing of the gzip header and + trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may then + call inflateSync() to look for a good compression block if a partial recovery + of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by + the caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), + no header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but + is slow and reduces compression ratio; memLevel=9 uses maximum memory + for optimal speed. The default value is 8. See zconf.h for total memory + usage as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as + Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy + parameter only affects the compression ratio but not the correctness of the + compressed output even if it is not set appropriately. Z_FIXED prevents the + use of dynamic Huffman codes, allowing for a simpler decoder for special + applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid + method). msg is set to null if there is no error message. deflateInit2 does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any + call of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size in + deflate or deflate2. Thus the strings most likely to be useful should be + put at the end of the dictionary, not at the front. In addition, the + current implementation of deflate will use at most the window size minus + 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and + can consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. + The stream will keep the same compression level and any other attributes + that may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different + strategy. If the compression level is changed, the input available so far + is compressed with the old level (and may be flushed); the new level will + take effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to + be compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR + if strm->avail_out was zero. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() + or deflateInit2(). This would be used to allocate an output buffer + for deflation in a single pass, and so would be called before deflate(). +*/ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the + bits leftover from a previous deflate stream when appending to it. As such, + this function can only be used for raw deflate, and must be used before the + first deflate() call after a deflateInit2() or deflateReset(). bits must be + less than or equal to 16, and that many of the least significant bits of + value will be inserted in the output. + + deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is + a crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg + is set to null if there is no error message. inflateInit2 does not perform + any decompression apart from reading the zlib header if present: this will + be done by inflate(). (So next_in and avail_in may be modified, but next_out + and avail_out are unchanged.) +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called + immediately after inflateInit2() or inflateReset() and before any call of + inflate() to set the dictionary. The application must insure that the + dictionary that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been found, + or Z_STREAM_ERROR if the stream structure was inconsistent. In the success + case, the application may save the current current value of total_in which + indicates where valid compressed data was found. In the error case, the + application may repeatedly call inflateSync, providing more input each time, + until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. + The stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK can be used to + force inflate() to return immediately after header processing is complete + and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When + any of extra, name, or comment are not Z_NULL and the respective field is + not present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the paramaters are invalid, Z_MEM_ERROR if the internal state could not + be allocated, or Z_VERSION_ERROR if the version of the library does not + match the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is more efficient than inflate() for + file i/o applications in that it avoids copying between the output and the + sliding window by simply making the window itself the output buffer. This + function trusts the application to not change the output buffer passed by + the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free + the allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects + only the raw deflate stream to decompress. This is different from the + normal behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format + error in the deflate stream (in which case strm->msg is set to indicate the + nature of the error), or Z_STREAM_ERROR if the stream was not properly + initialized. In the case of Z_BUF_ERROR, an input or output error can be + distinguished using strm->next_in which will be Z_NULL only if in() returned + an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to + out() returning non-zero. (in() will always be called before out(), so + strm->next_in is assured to be defined if out() returns non-zero.) Note + that inflateBack() cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + + + /* utility functions */ + +/* + The following utility functions are implemented on top of the + basic stream-oriented functions. To simplify the interface, some + default options are assumed (compression level and memory usage, + standard memory allocation functions). The source code of these + utility functions can easily be modified if you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be at least the value returned + by compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + This function can be used to compress a whole file at once if the + input file is mmap'ed. + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before + a compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. +*/ + + +typedef voidp gzFile; + +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); +/* + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb") but can also include a compression level + ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for + Huffman only compression as in "wb1h", or 'R' for run-length encoding + as in "wb1R". (See the description of deflateInit2 for more information + about the strategy parameter.) + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. + + gzopen returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). */ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen() associates a gzFile with the file descriptor fd. File + descriptors are obtained from calls like open, dup, creat, pipe or + fileno (in the file has been previously opened with fopen). + The mode parameter is as in gzopen. + The next call of gzclose on the returned gzFile will also close the + file descriptor fd, just like fclose(fdopen(fd), mode) closes the file + descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). + gzdopen returns NULL if there was insufficient memory to allocate + the (de)compression state. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. + If the input file was not in gzip format, gzread copies the given number + of bytes into the buffer. + gzread returns the number of uncompressed bytes actually read (0 for + end of file, -1 for error). */ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes actually written + (0 in case of error). +*/ + +ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). The number of + uncompressed bytes written is limited to 4095. The caller should assure that + this limit is not exceeded. If it is exceeded, then gzprintf() will return + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or + a newline character is read and transferred to buf, or an end-of-file + condition is encountered. The string is then terminated with a null + character. + gzgets returns buf, or Z_NULL in case of error. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read again later. + Only one character of push-back is allowed. gzungetc() returns the + character pushed, or -1 on failure. gzungetc() will fail if a + character has been pushed but not read yet, or if c is -1. The pushed + character will be discarded if the stream is repositioned with gzseek() + or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. The return value is the zlib + error number (see function gzerror below). gzflush returns Z_OK if + the flush parameter is Z_FINISH and all output could be flushed. + gzflush should be called only when strictly necessary because it can + degrade compression. +*/ + +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); +/* + Sets the starting position for the next gzread or gzwrite on the + given compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); +/* + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns 1 if file is being read directly without decompression, otherwise + zero. +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. The return value is the zlib + error number (see function gzerror below). +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the + compression library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is NULL, this function returns + the required initial value for the checksum. + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); +/* + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is NULL, this function returns the required initial + value for the for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + +/* + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + + +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; /* hack for buggy compilers */ +#endif + +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); +ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/navit/support/zlib/zlib_init.c b/navit/support/zlib/zlib_init.c new file mode 100644 index 0000000..32be387 --- /dev/null +++ b/navit/support/zlib/zlib_init.c @@ -0,0 +1,6 @@ +#include "plugin.h" + +void +plugin_init(void) +{ +} diff --git a/navit/support/zlib/zutil.c b/navit/support/zlib/zutil.c new file mode 100644 index 0000000..d55f594 --- /dev/null +++ b/navit/support/zlib/zutil.c @@ -0,0 +1,318 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" + +#ifndef NO_DUMMY_DECL +struct internal_state {int dummy;}; /* for buggy compilers */ +#endif + +const char * const z_errmsg[10] = { +"need dictionary", /* Z_NEED_DICT 2 */ +"stream end", /* Z_STREAM_END 1 */ +"", /* Z_OK 0 */ +"file error", /* Z_ERRNO (-1) */ +"stream error", /* Z_STREAM_ERROR (-2) */ +"data error", /* Z_DATA_ERROR (-3) */ +"insufficient memory", /* Z_MEM_ERROR (-4) */ +"buffer error", /* Z_BUF_ERROR (-5) */ +"incompatible version",/* Z_VERSION_ERROR (-6) */ +""}; + + +const char * ZEXPORT zlibVersion() +{ + return ZLIB_VERSION; +} + +uLong ZEXPORT zlibCompileFlags() +{ + uLong flags; + + flags = 0; + switch (sizeof(uInt)) { + case 2: break; + case 4: flags += 1; break; + case 8: flags += 2; break; + default: flags += 3; + } + switch (sizeof(uLong)) { + case 2: break; + case 4: flags += 1 << 2; break; + case 8: flags += 2 << 2; break; + default: flags += 3 << 2; + } + switch (sizeof(voidpf)) { + case 2: break; + case 4: flags += 1 << 4; break; + case 8: flags += 2 << 4; break; + default: flags += 3 << 4; + } + switch (sizeof(z_off_t)) { + case 2: break; + case 4: flags += 1 << 6; break; + case 8: flags += 2 << 6; break; + default: flags += 3 << 6; + } +#ifdef DEBUG + flags += 1 << 8; +#endif +#if defined(ASMV) || defined(ASMINF) + flags += 1 << 9; +#endif +#ifdef ZLIB_WINAPI + flags += 1 << 10; +#endif +#ifdef BUILDFIXED + flags += 1 << 12; +#endif +#ifdef DYNAMIC_CRC_TABLE + flags += 1 << 13; +#endif +#ifdef NO_GZCOMPRESS + flags += 1L << 16; +#endif +#ifdef NO_GZIP + flags += 1L << 17; +#endif +#ifdef PKZIP_BUG_WORKAROUND + flags += 1L << 20; +#endif +#ifdef FASTEST + flags += 1L << 21; +#endif +#ifdef STDC +# ifdef NO_vsnprintf + flags += 1L << 25; +# ifdef HAS_vsprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_vsnprintf_void + flags += 1L << 26; +# endif +# endif +#else + flags += 1L << 24; +# ifdef NO_snprintf + flags += 1L << 25; +# ifdef HAS_sprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_snprintf_void + flags += 1L << 26; +# endif +# endif +#endif + return flags; +} + +#ifdef DEBUG + +# ifndef verbose +# define verbose 0 +# endif +int z_verbose = verbose; + +void z_error (m) + char *m; +{ + fprintf(stderr, "%s\n", m); + exit(1); +} +#endif + +/* exported to allow conversion of error code to string for compress() and + * uncompress() + */ +const char * ZEXPORT zError(err) + int err; +{ + return ERR_MSG(err); +} + +#if defined(_WIN32_WCE) + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. + */ + int errno = 0; +#endif + +#ifndef HAVE_MEMCPY + +void zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + + +#ifdef SYS16BIT + +#ifdef __TURBOC__ +/* Turbo C in 16-bit mode */ + +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf = opaque; /* just to make some compilers happy */ + ulg bsize = (ulg)items*size; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + int n; + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + ptr = opaque; /* just to make some compilers happy */ + Assert(0, "zcfree: ptr not found"); +} + +#endif /* __TURBOC__ */ + + +#ifdef M_I86 +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + return _halloc((long)items, size); +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + _hfree(ptr); +} + +#endif /* M_I86 */ + +#endif /* SYS16BIT */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern voidp calloc OF((uInt items, uInt size)); +extern void free OF((voidpf ptr)); +#endif + +voidpf zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + if (opaque) items += size - size; /* make compiler happy */ + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + free(ptr); + if (opaque) return; /* make compiler happy */ +} + +#endif /* MY_ZCALLOC */ diff --git a/navit/support/zlib/zutil.h b/navit/support/zlib/zutil.h new file mode 100644 index 0000000..6cca50b --- /dev/null +++ b/navit/support/zlib/zutil.h @@ -0,0 +1,269 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#define ZLIB_INTERNAL +#include "zlib.h" + +#ifdef STDC +# ifndef _WIN32_WCE +# include +# endif +# include +# include +#endif +#ifdef NO_ERRNO_H +# ifdef _WIN32_WCE + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. We rename it to + * avoid conflict with other libraries that use the same workaround. + */ +# define errno z_errno +# endif + extern int errno; +#else +# ifndef _WIN32_WCE +# include +# endif +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = (char*)ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +# ifdef M_I86 + #include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#ifdef WIN32 +# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ +# define OS_CODE 0x0b +# endif +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0f +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) || defined(__MINGW32__) +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS + /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 + /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# define vsnprintf _vsnprintf +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +#endif +#ifdef VMS +# define NO_vsnprintf +#endif + +#if defined(pyr) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + extern void zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef DEBUG +# include + extern int z_verbose; + extern void z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + + +voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); +void zcfree OF((voidpf opaque, voidpf ptr)); + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +#endif /* ZUTIL_H */ diff --git a/navit/track.c b/navit/track.c new file mode 100644 index 0000000..bfe3a8e --- /dev/null +++ b/navit/track.c @@ -0,0 +1,1157 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include "item.h" +#include "attr.h" +#include "track.h" +#include "debug.h" +#include "transform.h" +#include "coord.h" +#include "route.h" +#include "projection.h" +#include "map.h" +#include "mapset.h" +#include "plugin.h" +#include "vehicleprofile.h" +#include "vehicle.h" +#include "roadprofile.h" +#include "util.h" +#include "config.h" + +struct tracking_line +{ + struct street_data *street; + struct tracking_line *next; + int angle[0]; +}; + + +/** + * @brief Conatins a list of previous speeds + * + * This structure is used to hold a list of previously reported + * speeds. This data is used by the CDF. + */ +struct cdf_speed { + struct cdf_speed *next; + int speed; + time_t time; +}; + +/** + * @brief Contains data for the CDF + * + * This structure holds all data needed by the + * cumulative displacement filter. + */ +struct cdf_data { + int extrapolating; + int available; + int first_pos; + int poscount; + int hist_size; + struct cdf_speed *speed_hist; + struct pcoord *pos_hist; + int *dir_hist; + double last_dist; + struct pcoord last_out; + int last_dir; +}; + +struct tracking { + struct mapset *ms; + struct route *rt; + struct map *map; + struct vehicle *vehicle; + struct vehicleprofile *vehicleprofile; + struct coord last_updated; + struct tracking_line *lines; + struct tracking_line *curr_line; + int pos; + struct coord curr[2], curr_in, curr_out; + int curr_angle; + struct coord last[2], last_in, last_out; + struct cdf_data cdf; + struct attr *attr; + int valid; + int time; + double direction, direction_matched; + double speed; + int coord_geo_valid; + struct coord_geo coord_geo; + enum projection pro; + int street_direction; + int no_gps; + int tunnel; + int angle_pref; + int connected_pref; + int nostop_pref; + int offroad_limit_pref; + int route_pref; + int overspeed_pref; + int overspeed_percent_pref; + int tunnel_extrapolation; +}; + + + + +static void +tracking_init_cdf(struct cdf_data *cdf, int hist_size) +{ + cdf->extrapolating = 0; + cdf->available = 0; + cdf->poscount = 0; + cdf->last_dist = 0; + cdf->hist_size = hist_size; + + cdf->pos_hist = g_new0(struct pcoord, hist_size); + cdf->dir_hist = g_new0(int, hist_size); +} + +// Variables for finetuning the CDF + +// Minimum average speed +#define CDF_MINAVG 1.f +// Maximum average speed +#define CDF_MAXAVG 6.f // only ~ 20 km/h + // We need a low value here because otherwise we would extrapolate whenever we are not accelerating + +// Mininum distance (square of it..), below which we ignore gps updates +#define CDF_MINDIST 49 // 7 meters, I guess this value has to be changed for pedestrians. + +#if 0 +static void +tracking_process_cdf(struct cdf_data *cdf, struct pcoord *pin, struct pcoord *pout, int dirin, int *dirout, int cur_speed, time_t fixtime) +{ + struct cdf_speed *speed,*sc,*sl; + double speed_avg; + int speed_num,i; + + if (cdf->hist_size == 0) { + dbg(1,"No CDF.\n"); + *pout = *pin; + *dirout = dirin; + return; + } + + speed = g_new0(struct cdf_speed, 1); + speed->speed = cur_speed; + speed->time = fixtime; + + speed->next = cdf->speed_hist; + cdf->speed_hist = speed; + + sc = speed; + sl = NULL; + speed_num = 0; + speed_avg = 0; + while (sc && ((fixtime - speed->time) < 4)) { // FIXME static maxtime + speed_num++; + speed_avg += sc->speed; + sl = sc; + sc = sc->next; + } + + speed_avg /= (double)speed_num; + + if (sl) { + sl->next = NULL; + } + + while (sc) { + sl = sc->next; + g_free(sc); + sc = sl; + } + + if (speed_avg < CDF_MINAVG) { + speed_avg = CDF_MINAVG; + } else if (speed_avg > CDF_MAXAVG) { + speed_avg = CDF_MAXAVG; + } + + + if (cur_speed >= speed_avg) { + if (cdf->extrapolating) { + cdf->poscount = 0; + cdf->extrapolating = 0; + } + + cdf->first_pos--; + if (cdf->first_pos < 0) { + cdf->first_pos = cdf->hist_size - 1; + } + + if (cdf->poscount < cdf->hist_size) { + cdf->poscount++; + } + + cdf->pos_hist[cdf->first_pos] = *pin; + cdf->dir_hist[cdf->first_pos] = dirin; + + *pout = *pin; + *dirout = dirin; + } else if (cdf->poscount > 0) { + + double mx,my; // Average position's x and y values + double sx,sy; // Support vector + double dx,dy; // Difference between average and current position + double len; // Length of support vector + double dist; + + mx = my = 0; + sx = sy = 0; + + for (i = 0; i < cdf->poscount; i++) { + mx += (double)cdf->pos_hist[((cdf->first_pos + i) % cdf->hist_size)].x / cdf->poscount; + my += (double)cdf->pos_hist[((cdf->first_pos + i) % cdf->hist_size)].y / cdf->poscount; + + + if (i != 0) { + sx += cdf->pos_hist[((cdf->first_pos + i) % cdf->hist_size)].x - cdf->pos_hist[((cdf->first_pos + i - 1) % cdf->hist_size)].x; + sy += cdf->pos_hist[((cdf->first_pos + i) % cdf->hist_size)].y - cdf->pos_hist[((cdf->first_pos + i - 1) % cdf->hist_size)].y; + } + + } + + if (cdf->poscount > 1) { + // Normalize the support vector + len = sqrt(sx * sx + sy * sy); + sx /= len; + sy /= len; + + // Calculate the new direction + *dirout = (int)rint(atan(sx / sy) / M_PI * 180 + 180); + } else { + // If we only have one position, we can't use differences of positions, but we have to use the reported + // direction of that position + sx = sin((double)cdf->dir_hist[cdf->first_pos] / 180 * M_PI); + sy = cos((double)cdf->dir_hist[cdf->first_pos] / 180 * M_PI); + *dirout = cdf->dir_hist[cdf->first_pos]; + } + + + dx = pin->x - mx; + dy = pin->y - my; + dist = dx * sx + dy * sy; + + if (cdf->extrapolating && (dist < cdf->last_dist)) { + dist = cdf->last_dist; + } + + cdf->last_dist = dist; + cdf->extrapolating = 1; + + pout->x = (int)rint(mx + sx * dist); + pout->y = (int)rint(my + sy * dist); + pout->pro = pin->pro; + + } else { + // We should extrapolate, but don't have an old position available + *pout = *pin; + *dirout = dirin; + } + + if (cdf->available) { + int dx,dy; + + dx = pout->x - cdf->last_out.x; + dy = pout->y - cdf->last_out.y; + + if ((dx*dx + dy*dy) < CDF_MINDIST) { + *pout = cdf->last_out; + *dirout = cdf->last_dir; + } + } + + cdf->last_out = *pout; + cdf->last_dir = *dirout; + + cdf->available = 1; +} +#endif + +int +tracking_get_angle(struct tracking *tr) +{ + return tr->curr_angle; +} + +struct coord * +tracking_get_pos(struct tracking *tr) +{ + return &tr->curr_out; +} + +int +tracking_get_street_direction(struct tracking *tr) +{ + return tr->street_direction; +} + +int +tracking_get_segment_pos(struct tracking *tr) +{ + return tr->pos; +} + +struct street_data * +tracking_get_street_data(struct tracking *tr) +{ + if (tr->curr_line) + return tr->curr_line->street; + return NULL; +} + +int +tracking_get_attr(struct tracking *_this, enum attr_type type, struct attr *attr, struct attr_iter *attr_iter) +{ + struct item *item; + struct map_rect *mr; + struct tracking_line *tl; + + int result=0; + dbg(1,"enter %s\n",attr_to_name(type)); + if (_this->attr) { + attr_free(_this->attr); + _this->attr=NULL; + } + attr->type=type; + switch (type) { + case attr_position_valid: + attr->u.num=_this->valid; + return 1; + case attr_position_direction: + attr->u.numd=&_this->direction; + return 1; + case attr_position_direction_matched: + attr->u.numd=&_this->direction_matched; + return 1; + case attr_position_speed: + attr->u.numd=&_this->speed; + return 1; + case attr_directed: + attr->u.num=_this->street_direction; + return 1; + case attr_position_coord_geo: + if (!_this->coord_geo_valid) { + struct coord c; + c.x=_this->curr_out.x; + c.y=_this->curr_out.y; + transform_to_geo(_this->pro, &c, &_this->coord_geo); + _this->coord_geo_valid=1; + } + attr->u.coord_geo=&_this->coord_geo; + return 1; + case attr_current_item: + if (! _this->curr_line || ! _this->curr_line->street) + return 0; + attr->u.item=&_this->curr_line->street->item; + return 1; + case attr_street_count: + attr->u.num=0; + tl=_this->lines; + while (tl) { + attr->u.num++; + tl=tl->next; + } + return 1; + default: + if (! _this->curr_line || ! _this->curr_line->street) + return 0; + item=&_this->curr_line->street->item; + mr=map_rect_new(item->map,NULL); + item=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); + if (item_attr_get(item, type, attr)) { + _this->attr=attr_dup(attr); + *attr=*_this->attr; + result=1; + } + map_rect_destroy(mr); + return result; + } +} + +struct item * +tracking_get_current_item(struct tracking *_this) +{ + if (! _this->curr_line || ! _this->curr_line->street) + return NULL; + return &_this->curr_line->street->item; +} + +int * +tracking_get_current_flags(struct tracking *_this) +{ + if (! _this->curr_line || ! _this->curr_line->street) + return NULL; + return &_this->curr_line->street->flags; +} + +static void +tracking_get_angles(struct tracking_line *tl) +{ + int i; + struct street_data *sd=tl->street; + for (i = 0 ; i < sd->count-1 ; i++) + tl->angle[i]=transform_get_angle_delta(&sd->c[i], &sd->c[i+1], 0); +} + +static int +street_data_within_selection(struct street_data *sd, struct map_selection *sel) +{ + struct coord_rect r; + struct map_selection *curr; + int i; + + if (!sel) + return 1; + r.lu=sd->c[0]; + r.rl=sd->c[0]; + for (i = 1 ; i < sd->count ; i++) { + if (r.lu.x > sd->c[i].x) + r.lu.x=sd->c[i].x; + if (r.rl.x < sd->c[i].x) + r.rl.x=sd->c[i].x; + if (r.rl.y > sd->c[i].y) + r.rl.y=sd->c[i].y; + if (r.lu.y < sd->c[i].y) + r.lu.y=sd->c[i].y; + } + curr=sel; + while (curr) { + struct coord_rect *sr=&curr->u.c_rect; + if (r.lu.x <= sr->rl.x && r.rl.x >= sr->lu.x && + r.lu.y >= sr->rl.y && r.rl.y <= sr->lu.y) + return 1; + curr=curr->next; + } + return 0; +} + + +static void +tracking_doupdate_lines(struct tracking *tr, struct coord *pc, enum projection pro) +{ + int max_dist=1000; + struct map_selection *sel; + struct mapset_handle *h; + struct map *m; + struct map_rect *mr; + struct item *item; + struct street_data *street; + struct tracking_line *tl; + struct coord_geo g; + struct coord cc; + + dbg(1,"enter\n"); + h=mapset_open(tr->ms); + while ((m=mapset_next(h,2))) { + cc.x = pc->x; + cc.y = pc->y; + if (map_projection(m) != pro) { + transform_to_geo(pro, &cc, &g); + transform_from_geo(map_projection(m), &g, &cc); + } + sel = route_rect(18, &cc, &cc, 0, max_dist); + mr=map_rect_new(m, sel); + if (!mr) + continue; + while ((item=map_rect_get_item(mr))) { + if (item_get_default_flags(item->type)) { + street=street_get_data(item); + if (street_data_within_selection(street, sel)) { + tl=g_malloc(sizeof(struct tracking_line)+(street->count-1)*sizeof(int)); + tl->street=street; + tracking_get_angles(tl); + tl->next=tr->lines; + tr->lines=tl; + } else + street_data_free(street); + } + } + map_selection_destroy(sel); + map_rect_destroy(mr); + } + mapset_close(h); + dbg(1, "exit\n"); +} + + +void +tracking_flush(struct tracking *tr) +{ + struct tracking_line *tl=tr->lines,*next; + dbg(1,"enter(tr=%p)\n", tr); + + while (tl) { + next=tl->next; + street_data_free(tl->street); + g_free(tl); + tl=next; + } + tr->lines=NULL; + tr->curr_line = NULL; +} + +static int +tracking_angle_diff(int a1, int a2, int full) +{ + int ret=(a1-a2)%full; + if (ret > full/2) + ret-=full; + if (ret < -full/2) + ret+=full; + return ret; +} + +static int +tracking_angle_abs_diff(int a1, int a2, int full) +{ + int ret=tracking_angle_diff(a1, a2, full); + if (ret < 0) + ret=-ret; + return ret; +} + +static int +tracking_angle_delta(struct tracking *tr, int vehicle_angle, int street_angle, int flags) +{ + int full=180,ret=360,fwd=0,rev=0; + struct vehicleprofile *profile=tr->vehicleprofile; + + if (profile) { + fwd=((flags & profile->flags_forward_mask) == profile->flags); + rev=((flags & profile->flags_reverse_mask) == profile->flags); + } + if (fwd || rev) { + if (!fwd || !rev) { + full=360; + if (rev) + street_angle=(street_angle+180)%360; + } + ret=tracking_angle_abs_diff(vehicle_angle, street_angle, full); + } + return ret*ret; +} + +static int +tracking_is_connected(struct tracking *tr, struct coord *c1, struct coord *c2) +{ + if (c1[0].x == c2[0].x && c1[0].y == c2[0].y) + return 0; + if (c1[0].x == c2[1].x && c1[0].y == c2[1].y) + return 0; + if (c1[1].x == c2[0].x && c1[1].y == c2[0].y) + return 0; + if (c1[1].x == c2[1].x && c1[1].y == c2[1].y) + return 0; + return tr->connected_pref; +} + +static int +tracking_is_no_stop(struct tracking *tr, struct coord *c1, struct coord *c2) +{ + if (c1->x == c2->x && c1->y == c2->y) + return tr->nostop_pref; + return 0; +} + +static int +tracking_is_on_route(struct tracking *tr, struct route *rt, struct item *item) +{ +#ifdef USE_ROUTING + if (! rt) + return 0; + if (route_contains(rt, item)) + return 0; + return tr->route_pref; +#else + return 0; +#endif +} + +static int +tracking_value(struct tracking *tr, struct tracking_line *t, int offset, struct coord *lpnt, int min, int flags) +{ + int value=0; + struct street_data *sd=t->street; + dbg(2, "%d: (0x%x,0x%x)-(0x%x,0x%x)\n", offset, sd->c[offset].x, sd->c[offset].y, sd->c[offset+1].x, sd->c[offset+1].y); + if (flags & 1) { + struct coord c1, c2, cp; + c1.x = sd->c[offset].x; + c1.y = sd->c[offset].y; + c2.x = sd->c[offset+1].x; + c2.y = sd->c[offset+1].y; + cp.x = tr->curr_in.x; + cp.y = tr->curr_in.y; + value+=transform_distance_line_sq(&c1, &c2, &cp, lpnt); + } + if (value >= min) + return value; + if (flags & 2) + value += tracking_angle_delta(tr, tr->curr_angle, t->angle[offset], sd->flags)*tr->angle_pref>>4; + if (value >= min) + return value; + if ((flags & 4) && tr->connected_pref) + value += tracking_is_connected(tr, tr->last, &sd->c[offset]); + if ((flags & 8) && tr->nostop_pref) + value += tracking_is_no_stop(tr, lpnt, &tr->last_out); + if (value >= min) + return value; + if ((flags & 16) && tr->route_pref) + value += tracking_is_on_route(tr, tr->rt, &sd->item); + if ((flags & 32) && tr->overspeed_percent_pref && tr->overspeed_pref ) { + struct roadprofile *roadprofile=g_hash_table_lookup(tr->vehicleprofile->roadprofile_hash, (void *)t->street->item.type); + if (roadprofile && tr->speed > roadprofile->speed * tr->overspeed_percent_pref/ 100) + value += tr->overspeed_pref; + } + if ((flags & 64) && !!(sd->flags & AF_UNDERGROUND) != tr->no_gps) + value+=200; + return value; +} + + +void +tracking_update(struct tracking *tr, struct vehicle *v, struct vehicleprofile *vehicleprofile, enum projection pro) +{ + struct tracking_line *t; + int i,value,min,time; + struct coord lpnt; + struct coord cin; + struct attr valid,speed_attr,direction_attr,coord_geo,lag,time_attr,static_speed,static_distance; + double speed, direction; + if (v) + tr->vehicle=v; + if (vehicleprofile) + tr->vehicleprofile=vehicleprofile; + + if (! tr->vehicle) + return; + if (!vehicle_get_attr(tr->vehicle, attr_position_valid, &valid, NULL)) + valid.u.num=attr_position_valid_valid; + if (valid.u.num == attr_position_valid_invalid) { + tr->valid=valid.u.num; + return; + } + if (!vehicle_get_attr(tr->vehicle, attr_position_speed, &speed_attr, NULL) || + !vehicle_get_attr(tr->vehicle, attr_position_direction, &direction_attr, NULL) || + !vehicle_get_attr(tr->vehicle, attr_position_coord_geo, &coord_geo, NULL) || + !vehicle_get_attr(tr->vehicle, attr_position_time_iso8601, &time_attr, NULL)) { + dbg(0,"failed to get position data %d %d %d %d\n", + vehicle_get_attr(tr->vehicle, attr_position_speed, &speed_attr, NULL), + vehicle_get_attr(tr->vehicle, attr_position_direction, &direction_attr, NULL), + vehicle_get_attr(tr->vehicle, attr_position_coord_geo, &coord_geo, NULL), + vehicle_get_attr(tr->vehicle, attr_position_time_iso8601, &time_attr, NULL)); + return; + } + if (tr->tunnel_extrapolation) { + struct attr fix_type; + if (!vehicle_get_attr(tr->vehicle, attr_position_fix_type, &fix_type, NULL)) + fix_type.u.num=2; + if (fix_type.u.num) { + tr->no_gps=0; + tr->tunnel=0; + } else + tr->no_gps=1; + } + if (!vehicleprofile_get_attr(vehicleprofile,attr_static_speed,&static_speed,NULL) || !vehicleprofile_get_attr(vehicleprofile,attr_static_distance,&static_distance,NULL)) { + static_speed.u.num=3; + static_distance.u.num=10; + dbg(1,"Using defaults for static position detection\n"); + } + dbg(2,"Static speed: %u, static distance: %u\n",static_speed.u.num, static_distance.u.num); + time=iso8601_to_secs(time_attr.u.str); + speed=*speed_attr.u.numd; + direction=*direction_attr.u.numd; + tr->valid=attr_position_valid_valid; + transform_from_geo(pro, coord_geo.u.coord_geo, &tr->curr_in); + if ((speed < static_speed.u.num && transform_distance(pro, &tr->last_in, &tr->curr_in) < static_distance.u.num )) { + dbg(1,"static speed %f coord 0x%x,0x%x vs 0x%x,0x%x\n",speed,tr->last_in.x,tr->last_in.y, tr->curr_in.x, tr->curr_in.y); + tr->valid=attr_position_valid_static; + tr->speed=0; + return; + } + if (tr->tunnel) { + tr->curr_in=tr->curr_out; + dbg(0,"tunnel extrapolation speed %f dir %f\n",tr->speed,tr->direction); + dbg(0,"old 0x%x,0x%x\n",tr->curr_in.x, tr->curr_in.y); + speed=tr->speed; + direction=tr->curr_line->angle[tr->pos]; + transform_project(pro, &tr->curr_in, tr->speed*tr->tunnel_extrapolation/36, tr->direction, &tr->curr_in); + dbg(0,"new 0x%x,0x%x\n",tr->curr_in.x, tr->curr_in.y); + } else if (vehicle_get_attr(tr->vehicle, attr_lag, &lag, NULL) && lag.u.num > 0) { + double espeed; + int edirection; + if (time-tr->time == 1) { + dbg(1,"extrapolating speed from %f and %f (%f)\n",tr->speed, speed, speed-tr->speed); + espeed=speed+(speed-tr->speed)*lag.u.num/10; + dbg(1,"extrapolating angle from %f and %f (%d)\n",tr->direction, direction, tracking_angle_diff(direction,tr->direction,360)); + edirection=direction+tracking_angle_diff(direction,tr->direction,360)*lag.u.num/10; + } else { + dbg(1,"no speed and direction extrapolation\n"); + espeed=speed; + edirection=direction; + } + dbg(1,"lag %d speed %f direction %d\n",lag.u.num,espeed,edirection); + dbg(1,"old 0x%x,0x%x\n",tr->curr_in.x, tr->curr_in.y); + transform_project(pro, &tr->curr_in, espeed*lag.u.num/36, edirection, &tr->curr_in); + dbg(1,"new 0x%x,0x%x\n",tr->curr_in.x, tr->curr_in.y); + } + tr->time=time; + tr->pro=pro; +#if 0 + + tracking_process_cdf(&tr->cdf, pc, &pcf, angle, &anglef, speed, fixtime); +#endif + tr->curr_angle=tr->direction=direction; + tr->speed=speed; + tr->last_in=tr->curr_in; + tr->last_out=tr->curr_out; + tr->last[0]=tr->curr[0]; + tr->last[1]=tr->curr[1]; + if (!tr->lines || transform_distance(pro, &tr->last_updated, &tr->curr_in) > 500) { + dbg(1, "update\n"); + tracking_flush(tr); + tracking_doupdate_lines(tr, &tr->curr_in, pro); + tr->last_updated=tr->curr_in; + dbg(1,"update end\n"); + } + + tr->street_direction=0; + t=tr->lines; + tr->curr_line=NULL; + min=INT_MAX/2; + while (t) { + struct street_data *sd=t->street; + for (i = 0; i < sd->count-1 ; i++) { + value=tracking_value(tr,t,i,&lpnt,min,-1); + if (value < min) { + struct coord lpnt_tmp; + int angle_delta=tracking_angle_abs_diff(tr->curr_angle, t->angle[i], 360); + tr->curr_line=t; + tr->pos=i; + tr->curr[0]=sd->c[i]; + tr->curr[1]=sd->c[i+1]; + tr->direction_matched=t->angle[i]; + dbg(1,"lpnt.x=0x%x,lpnt.y=0x%x pos=%d %d+%d+%d+%d=%d\n", lpnt.x, lpnt.y, i, + transform_distance_line_sq(&sd->c[i], &sd->c[i+1], &cin, &lpnt_tmp), + tracking_angle_delta(tr, tr->curr_angle, t->angle[i], 0)*tr->angle_pref, + tracking_is_connected(tr, tr->last, &sd->c[i]) ? tr->connected_pref : 0, + lpnt.x == tr->last_out.x && lpnt.y == tr->last_out.y ? tr->nostop_pref : 0, + value + ); + tr->curr_out.x=lpnt.x; + tr->curr_out.y=lpnt.y; + tr->coord_geo_valid=0; + if (angle_delta < 70) + tr->street_direction=1; + else if (angle_delta > 110) + tr->street_direction=-1; + else + tr->street_direction=0; + min=value; + } + } + t=t->next; + } + dbg(1,"tr->curr_line=%p min=%d\n", tr->curr_line, min); + if (!tr->curr_line || min > tr->offroad_limit_pref) { + tr->curr_out=tr->curr_in; + tr->coord_geo_valid=0; + tr->street_direction=0; + } + if (tr->curr_line && (tr->curr_line->street->flags & AF_UNDERGROUND)) { + if (tr->no_gps) + tr->tunnel=1; + } else if (tr->tunnel) { + tr->speed=0; + } + dbg(1,"found 0x%x,0x%x\n", tr->curr_out.x, tr->curr_out.y); +} + +static int +tracking_set_attr_do(struct tracking *tr, struct attr *attr, int initial) +{ + switch (attr->type) { + case attr_angle_pref: + tr->angle_pref=attr->u.num; + return 1; + case attr_connected_pref: + tr->connected_pref=attr->u.num; + return 1; + case attr_nostop_pref: + tr->nostop_pref=attr->u.num; + return 1; + case attr_offroad_limit_pref: + tr->offroad_limit_pref=attr->u.num; + return 1; + case attr_route_pref: + tr->route_pref=attr->u.num; + return 1; + case attr_overspeed_pref: + tr->overspeed_pref=attr->u.num; + return 1; + case attr_overspeed_percent_pref: + tr->overspeed_percent_pref=attr->u.num; + return 1; + case attr_tunnel_extrapolation: + tr->tunnel_extrapolation=attr->u.num; + return 1; + default: + return 0; + } +} + +int +tracking_set_attr(struct tracking *tr, struct attr *attr) +{ + return tracking_set_attr_do(tr, attr, 0); +} + +struct tracking * +tracking_new(struct attr *parent, struct attr **attrs) +{ + struct tracking *this=g_new0(struct tracking, 1); + struct attr hist_size; + this->angle_pref=10; + this->connected_pref=10; + this->nostop_pref=10; + this->offroad_limit_pref=5000; + this->route_pref=300; + + + if (! attr_generic_get_attr(attrs, NULL, attr_cdf_histsize, &hist_size, NULL)) { + hist_size.u.num = 0; + } + if (attrs) { + for (;*attrs; attrs++) + tracking_set_attr_do(this, *attrs, 1); + } + + tracking_init_cdf(&this->cdf, hist_size.u.num); + + return this; +} + +void +tracking_set_mapset(struct tracking *this, struct mapset *ms) +{ + this->ms=ms; +} + +void +tracking_set_route(struct tracking *this, struct route *rt) +{ + this->rt=rt; +} + +void +tracking_destroy(struct tracking *tr) +{ + if (tr->attr) + attr_free(tr->attr); + tracking_flush(tr); + g_free(tr); +} + +struct map * +tracking_get_map(struct tracking *this_) +{ + struct attr *attrs[5]; + struct attr type,navigation,data,description; + type.type=attr_type; + type.u.str="tracking"; + navigation.type=attr_trackingo; + navigation.u.tracking=this_; + data.type=attr_data; + data.u.str=""; + description.type=attr_description; + description.u.str="Tracking"; + + attrs[0]=&type; + attrs[1]=&navigation; + attrs[2]=&data; + attrs[3]=&description; + attrs[4]=NULL; + if (! this_->map) + this_->map=map_new(NULL, attrs); + return this_->map; +} + + +struct map_priv { + struct tracking *tracking; +}; + +struct map_rect_priv { + struct tracking *tracking; + struct item item; + struct tracking_line *curr,*next; + int coord; + enum attr_type attr_next; + int ccount; + int debug_idx; + char *str; +}; + +static int +tracking_map_item_coord_get(void *priv_data, struct coord *c, int count) +{ + struct map_rect_priv *this=priv_data; + enum projection pro; + int ret=0; + dbg(1,"enter\n"); + while (this->ccount < 2 && count > 0) { + pro = map_projection(this->curr->street->item.map); + if (projection_mg != pro) { + transform_from_to(&this->curr->street->c[this->ccount+this->coord], + pro, + c ,projection_mg); + } else + *c=this->curr->street->c[this->ccount+this->coord]; + dbg(1,"coord %d 0x%x,0x%x\n",this->ccount,c->x,c->y); + this->ccount++; + ret++; + c++; + count--; + } + return ret; +} + +static int +tracking_map_item_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) +{ + struct map_rect_priv *this_=priv_data; + struct coord lpnt,*c; + struct tracking *tr=this_->tracking; + int value; + attr->type=attr_type; + + if (this_->str) { + g_free(this_->str); + this_->str=NULL; + } + + switch(attr_type) { + case attr_debug: + switch(this_->debug_idx) { + case 0: + this_->debug_idx++; + this_->str=attr->u.str=g_strdup_printf("overall: %d (limit %d)",tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, -1), tr->offroad_limit_pref); + return 1; + case 1: + this_->debug_idx++; + c=&this_->curr->street->c[this_->coord]; + value=tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 1); + this_->str=attr->u.str=g_strdup_printf("distance: (0x%x,0x%x) from (0x%x,0x%x)-(0x%x,0x%x) at (0x%x,0x%x) %d", + tr->curr_in.x, tr->curr_in.y, + c[0].x, c[0].y, c[1].x, c[1].y, + lpnt.x, lpnt.y, value); + return 1; + case 2: + this_->debug_idx++; + this_->str=attr->u.str=g_strdup_printf("angle: %d to %d (flags %d) %d", + tr->curr_angle, this_->curr->angle[this_->coord], this_->curr->street->flags & 3, + tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 2)); + return 1; + case 3: + this_->debug_idx++; + this_->str=attr->u.str=g_strdup_printf("connected: %d", tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 4)); + return 1; + case 4: + this_->debug_idx++; + this_->str=attr->u.str=g_strdup_printf("no_stop: %d", tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 8)); + return 1; + case 5: + this_->debug_idx++; + this_->str=attr->u.str=g_strdup_printf("route: %d", tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 16)); + return 1; + case 6: + this_->debug_idx++; + this_->str=attr->u.str=g_strdup_printf("overspeed: %d", tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 32)); + return 1; + case 7: + this_->debug_idx++; + this_->str=attr->u.str=g_strdup_printf("tunnel: %d", tracking_value(tr, this_->curr, this_->coord, &lpnt, INT_MAX/2, 64)); + return 1; + case 8: + this_->debug_idx++; + this_->str=attr->u.str=g_strdup_printf("line %p", this_->curr); + return 1; + default: + this_->attr_next=attr_none; + return 0; + } + case attr_any: + while (this_->attr_next != attr_none) { + if (tracking_map_item_attr_get(priv_data, this_->attr_next, attr)) + return 1; + } + return 0; + default: + attr->type=attr_none; + return 0; + } +} + +static struct item_methods tracking_map_item_methods = { + NULL, + tracking_map_item_coord_get, + NULL, + tracking_map_item_attr_get, +}; + + +static void +tracking_map_destroy(struct map_priv *priv) +{ + g_free(priv); +} + +static void +tracking_map_rect_init(struct map_rect_priv *priv) +{ + priv->next=priv->tracking->lines; + priv->curr=NULL; + priv->coord=0; + priv->item.id_lo=0; + priv->item.id_hi=0; +} + +static struct map_rect_priv * +tracking_map_rect_new(struct map_priv *priv, struct map_selection *sel) +{ + struct tracking *tracking=priv->tracking; + struct map_rect_priv *ret=g_new0(struct map_rect_priv, 1); + ret->tracking=tracking; + tracking_map_rect_init(ret); + ret->item.meth=&tracking_map_item_methods; + ret->item.priv_data=ret; + ret->item.type=type_tracking_100; + return ret; +} + +static void +tracking_map_rect_destroy(struct map_rect_priv *priv) +{ + g_free(priv); +} + +static struct item * +tracking_map_get_item(struct map_rect_priv *priv) +{ + struct item *ret=&priv->item; + int value; + struct coord lpnt; + + if (!priv->next) + return NULL; + if (! priv->curr || priv->coord + 2 >= priv->curr->street->count) { + priv->curr=priv->next; + priv->next=priv->curr->next; + priv->coord=0; + priv->item.id_lo=0; + priv->item.id_hi++; + } else { + priv->coord++; + priv->item.id_lo++; + } + value=tracking_value(priv->tracking, priv->curr, priv->coord, &lpnt, INT_MAX/2, -1); + if (value < 64) + priv->item.type=type_tracking_100; + else if (value < 128) + priv->item.type=type_tracking_90; + else if (value < 256) + priv->item.type=type_tracking_80; + else if (value < 512) + priv->item.type=type_tracking_70; + else if (value < 1024) + priv->item.type=type_tracking_60; + else if (value < 2048) + priv->item.type=type_tracking_50; + else if (value < 4096) + priv->item.type=type_tracking_40; + else if (value < 8192) + priv->item.type=type_tracking_30; + else if (value < 16384) + priv->item.type=type_tracking_20; + else if (value < 32768) + priv->item.type=type_tracking_10; + else + priv->item.type=type_tracking_0; + dbg(1,"item %d %d points\n", priv->coord, priv->curr->street->count); + priv->ccount=0; + priv->attr_next=attr_debug; + priv->debug_idx=0; + return ret; +} + +static struct item * +tracking_map_get_item_byid(struct map_rect_priv *priv, int id_hi, int id_lo) +{ + struct item *ret; + tracking_map_rect_init(priv); + while ((ret=tracking_map_get_item(priv))) { + if (ret->id_hi == id_hi && ret->id_lo == id_lo) + return ret; + } + return NULL; +} + +static struct map_methods tracking_map_meth = { + projection_mg, + "utf-8", + tracking_map_destroy, + tracking_map_rect_new, + tracking_map_rect_destroy, + tracking_map_get_item, + tracking_map_get_item_byid, + NULL, + NULL, + NULL, +}; + +static struct map_priv * +tracking_map_new(struct map_methods *meth, struct attr **attrs, struct callback_list *cbl) +{ + struct map_priv *ret; + struct attr *tracking_attr; + + tracking_attr=attr_search(attrs, NULL, attr_trackingo); + if (! tracking_attr) + return NULL; + ret=g_new0(struct map_priv, 1); + *meth=tracking_map_meth; + ret->tracking=tracking_attr->u.tracking; + + return ret; +} + + +void +tracking_init(void) +{ + plugin_register_map_type("tracking", tracking_map_new); +} diff --git a/navit/track.h b/navit/track.h new file mode 100644 index 0000000..ea962cc --- /dev/null +++ b/navit/track.h @@ -0,0 +1,62 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_TRACK_H +#define NAVIT_TRACK_H +#include +#ifdef __cplusplus +extern "C" { +#endif +/* prototypes */ +enum attr_type; +enum projection; +struct attr; +struct attr_iter; +struct coord; +struct item; +struct map; +struct mapset; +struct route; +struct street_data; +struct tracking; +struct vehicle; +struct vehicleprofile; +int tracking_get_angle(struct tracking *tr); +struct coord *tracking_get_pos(struct tracking *tr); +int tracking_get_street_direction(struct tracking *tr); +int tracking_get_segment_pos(struct tracking *tr); +struct street_data *tracking_get_street_data(struct tracking *tr); +int tracking_get_attr(struct tracking *_this, enum attr_type type, struct attr *attr, struct attr_iter *attr_iter); +struct item *tracking_get_current_item(struct tracking *_this); +int *tracking_get_current_flags(struct tracking *_this); +void tracking_flush(struct tracking *tr); +void tracking_update(struct tracking *tr, struct vehicle *v, struct vehicleprofile *vehicleprofile, enum projection pro); +int tracking_set_attr(struct tracking *tr, struct attr *attr); +struct tracking *tracking_new(struct attr *parent, struct attr **attrs); +void tracking_set_mapset(struct tracking *this_, struct mapset *ms); +void tracking_set_route(struct tracking *this_, struct route *rt); +void tracking_destroy(struct tracking *tr); +struct map *tracking_get_map(struct tracking *this_); +void tracking_init(void); +/* end of prototypes */ +#ifdef __cplusplus +} +#endif + +#endif diff --git a/navit/transform.c b/navit/transform.c new file mode 100644 index 0000000..c642fbb --- /dev/null +++ b/navit/transform.c @@ -0,0 +1,1499 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#define _USE_MATH_DEFINES 1 +#include +#include +#include +#include +#include +#include +#include "config.h" +#include "coord.h" +#include "debug.h" +#include "item.h" +#include "map.h" +#include "transform.h" +#include "projection.h" +#include "point.h" + +#define POST_SHIFT 8 + +struct transformation { + int yaw; /* Rotation angle */ + int pitch; + int ddd; + int m00,m01,m02; /* 3d transformation matrix */ + int m10,m11,m12; + int m20,m21,m22; + int xscale,yscale,wscale; + int xscale3d,yscale3d,wscale3d; +#ifdef ENABLE_ROLL + int roll; + int hog; +#endif + navit_float im00,im01,im02; /* inverse 3d transformation matrix */ + navit_float im10,im11,im12; + navit_float im20,im21,im22; + struct map_selection *map_sel; + struct map_selection *screen_sel; + struct point screen_center; + int screen_dist; + int offx,offy,offz; + int znear,zfar; + struct coord map_center; /* Center of source rectangle */ + enum projection pro; + navit_float scale; /* Scale factor */ + int scale_shift; + int order; + int order_base; +}; + +#ifdef ENABLE_ROLL +#define HOG(t) ((t).hog) +#else +#define HOG(t) 0 +#endif + +static void +transform_set_screen_dist(struct transformation *t, int dist) +{ + t->screen_dist=dist; + t->xscale3d=dist; + t->yscale3d=dist; + t->wscale3d=dist << POST_SHIFT; +} + +static void +transform_setup_matrix(struct transformation *t) +{ + navit_float det; + navit_float fac; + navit_float yawc=navit_cos(-M_PI*t->yaw/180); + navit_float yaws=navit_sin(-M_PI*t->yaw/180); + navit_float pitchc=navit_cos(-M_PI*t->pitch/180); + navit_float pitchs=navit_sin(-M_PI*t->pitch/180); +#ifdef ENABLE_ROLL + navit_float rollc=navit_cos(M_PI*t->roll/180); + navit_float rolls=navit_sin(M_PI*t->roll/180); +#else + navit_float rollc=1; + navit_float rolls=0; +#endif + + int scale=t->scale; + int order_dir=-1; + + dbg(1,"yaw=%d pitch=%d center=0x%x,0x%x\n", t->yaw, t->pitch, t->map_center.x, t->map_center.y); + t->znear=1 << POST_SHIFT; + t->zfar=300*t->znear; + t->scale_shift=0; + t->order=t->order_base; + if (t->scale >= 1) { + scale=t->scale; + } else { + scale=1.0/t->scale; + order_dir=1; + } + while (scale > 1) { + if (order_dir < 0) + t->scale_shift++; + t->order+=order_dir; + scale >>= 1; + } + fac=(1 << POST_SHIFT) * (1 << t->scale_shift) / t->scale; + dbg(1,"scale_shift=%d order=%d scale=%f fac=%f\n", t->scale_shift, t->order,t->scale,fac); + + t->m00=rollc*yawc*fac; + t->m01=rollc*yaws*fac; + t->m02=-rolls*fac; + t->m10=(pitchs*rolls*yawc-pitchc*yaws)*(-fac); + t->m11=(pitchs*rolls*yaws+pitchc*yawc)*(-fac); + t->m12=pitchs*rollc*(-fac); + t->m20=(pitchc*rolls*yawc+pitchs*yaws)*fac; + t->m21=(pitchc*rolls*yaws-pitchs*yawc)*fac; + t->m22=pitchc*rollc*fac; + + t->offx=t->screen_center.x; + t->offy=t->screen_center.y; + if (t->pitch) { + t->ddd=1; + t->offz=t->screen_dist; + dbg(1,"near %d far %d\n",t->znear,t->zfar); + t->xscale=t->xscale3d; + t->yscale=t->yscale3d; + t->wscale=t->wscale3d; + } else { + t->ddd=0; + t->offz=0; + t->xscale=1; + t->yscale=1; + t->wscale=1; + } + det=(navit_float)t->m00*(navit_float)t->m11*(navit_float)t->m22+ + (navit_float)t->m01*(navit_float)t->m12*(navit_float)t->m20+ + (navit_float)t->m02*(navit_float)t->m10*(navit_float)t->m21- + (navit_float)t->m02*(navit_float)t->m11*(navit_float)t->m20- + (navit_float)t->m01*(navit_float)t->m10*(navit_float)t->m22- + (navit_float)t->m00*(navit_float)t->m12*(navit_float)t->m21; + + t->im00=(t->m11*t->m22-t->m12*t->m21)/det; + t->im01=(t->m02*t->m21-t->m01*t->m22)/det; + t->im02=(t->m01*t->m12-t->m02*t->m11)/det; + t->im10=(t->m12*t->m20-t->m10*t->m22)/det; + t->im11=(t->m00*t->m22-t->m02*t->m20)/det; + t->im12=(t->m02*t->m10-t->m00*t->m12)/det; + t->im20=(t->m10*t->m21-t->m11*t->m20)/det; + t->im21=(t->m01*t->m20-t->m00*t->m21)/det; + t->im22=(t->m00*t->m11-t->m01*t->m10)/det; +} + +struct transformation * +transform_new(void) +{ + struct transformation *this_; + + this_=g_new0(struct transformation, 1); + transform_set_screen_dist(this_, 100); + this_->order_base=14; +#if 0 + this_->pitch=20; +#endif +#if 0 + this_->roll=30; + this_->hog=1000; +#endif + transform_setup_matrix(this_); + return this_; +} + +int +transform_get_hog(struct transformation *this_) +{ + return HOG(*this_); +} + +void +transform_set_hog(struct transformation *this_, int hog) +{ +#ifdef ENABLE_ROLL + this_->hog=hog; +#else + dbg(0,"not supported\n"); +#endif + +} + +int +transform_get_attr(struct transformation *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + switch (type) { +#ifdef ENABLE_ROLL + case attr_hog: + attr->u.num=this_->hog; + break; +#endif + default: + return 0; + } + attr->type=type; + return 1; +} + +int +transform_set_attr(struct transformation *this_, struct attr *attr) +{ + switch (attr->type) { +#ifdef ENABLE_ROLL + case attr_hog: + this_->hog=attr->u.num; + return 1; +#endif + default: + return 0; + } +} + +int +transformation_get_order_base(struct transformation *this_) +{ + return this_->order_base; +} + +void +transform_set_order_base(struct transformation *this_, int order_base) +{ + this_->order_base=order_base; +} + + +struct transformation * +transform_dup(struct transformation *t) +{ + struct transformation *ret=g_new0(struct transformation, 1); + *ret=*t; + return ret; +} + +static const navit_float gar2geo_units = 360.0/(1<<24); +static const navit_float geo2gar_units = 1/(360.0/(1<<24)); + +void +transform_to_geo(enum projection pro, struct coord *c, struct coord_geo *g) +{ + int x,y,northern,zone; + switch (pro) { + case projection_mg: + g->lng=c->x/6371000.0/M_PI*180; + g->lat=navit_atan(exp(c->y/6371000.0))/M_PI*360-90; + break; + case projection_garmin: + g->lng=c->x*gar2geo_units; + g->lat=c->y*gar2geo_units; + break; + case projection_utm: + x=c->x; + y=c->y; + northern=y >= 0; + if (!northern) { + y+=10000000; + } + zone=(x/1000000); + x=x%1000000; + transform_utm_to_geo(x, y, zone, northern, g); + break; + default: + break; + } +} + +void +transform_from_geo(enum projection pro, struct coord_geo *g, struct coord *c) +{ + switch (pro) { + case projection_mg: + c->x=g->lng*6371000.0*M_PI/180; + c->y=log(navit_tan(M_PI_4+g->lat*M_PI/360))*6371000.0; + break; + case projection_garmin: + c->x=g->lng*geo2gar_units; + c->y=g->lat*geo2gar_units; + break; + default: + break; + } +} + +void +transform_from_to_count(struct coord *cfrom, enum projection from, struct coord *cto, enum projection to, int count) +{ + struct coord_geo g; + int i; + + for (i = 0 ; i < count ; i++) { + transform_to_geo(from, cfrom, &g); + transform_from_geo(to, &g, cto); + cfrom++; + cto++; + } +} + +void +transform_from_to(struct coord *cfrom, enum projection from, struct coord *cto, enum projection to) +{ + struct coord_geo g; + transform_to_geo(from, cfrom, &g); + transform_from_geo(to, &g, cto); +} + +void +transform_geo_to_cart(struct coord_geo *geo, navit_float a, navit_float b, struct coord_geo_cart *cart) +{ + navit_float n,ee=1-b*b/(a*a); + n = a/sqrtf(1-ee*navit_sin(geo->lat)*navit_sin(geo->lat)); + cart->x=n*navit_cos(geo->lat)*navit_cos(geo->lng); + cart->y=n*navit_cos(geo->lat)*navit_sin(geo->lng); + cart->z=n*(1-ee)*navit_sin(geo->lat); +} + +void +transform_cart_to_geo(struct coord_geo_cart *cart, navit_float a, navit_float b, struct coord_geo *geo) +{ + navit_float lat,lati,n,ee=1-b*b/(a*a), lng = navit_tan(cart->y/cart->x); + + lat = navit_tan(cart->z / navit_sqrt((cart->x * cart->x) + (cart->y * cart->y))); + do + { + lati = lat; + + n = a / navit_sqrt(1-ee*navit_sin(lat)*navit_sin(lat)); + lat = navit_atan((cart->z + ee * n * navit_sin(lat)) / navit_sqrt(cart->x * cart->x + cart->y * cart->y)); + } + while (fabs(lat - lati) >= 0.000000000000001); + + geo->lng=lng/M_PI*180; + geo->lat=lat/M_PI*180; +} + + +void +transform_utm_to_geo(const double UTMEasting, const double UTMNorthing, int ZoneNumber, int NorthernHemisphere, struct coord_geo *geo) +{ +//converts UTM coords to lat/long. Equations from USGS Bulletin 1532 +//East Longitudes are positive, West longitudes are negative. +//North latitudes are positive, South latitudes are negative +//Lat and Long are in decimal degrees. + //Written by Chuck Gantz- chuck.gantz@globalstar.com + + double Lat, Long; + double k0 = 0.99960000000000004; + double a = 6378137; + double eccSquared = 0.0066943799999999998; + double eccPrimeSquared; + double e1 = (1-sqrt(1-eccSquared))/(1+sqrt(1-eccSquared)); + double N1, T1, C1, R1, D, M; + double LongOrigin; + double mu, phi1, phi1Rad; + double x, y; + double rad2deg = 180/M_PI; + + x = UTMEasting - 500000.0; //remove 500,000 meter offset for longitude + y = UTMNorthing; + + if (!NorthernHemisphere) { + y -= 10000000.0;//remove 10,000,000 meter offset used for southern hemisphere + } + + LongOrigin = (ZoneNumber - 1)*6 - 180 + 3; //+3 puts origin in middle of zone + + eccPrimeSquared = (eccSquared)/(1-eccSquared); + + M = y / k0; + mu = M/(a*(1-eccSquared/4-3*eccSquared*eccSquared/64-5*eccSquared*eccSquared*eccSquared/256)); + phi1Rad = mu + (3*e1/2-27*e1*e1*e1/32)*sin(2*mu) + + (21*e1*e1/16-55*e1*e1*e1*e1/32)*sin(4*mu) + +(151*e1*e1*e1/96)*sin(6*mu); + phi1 = phi1Rad*rad2deg; + + N1 = a/sqrt(1-eccSquared*sin(phi1Rad)*sin(phi1Rad)); + T1 = tan(phi1Rad)*tan(phi1Rad); + C1 = eccPrimeSquared*cos(phi1Rad)*cos(phi1Rad); + R1 = a*(1-eccSquared)/pow(1-eccSquared*sin(phi1Rad)*sin(phi1Rad), 1.5); + D = x/(N1*k0); + + Lat = phi1Rad - (N1*tan(phi1Rad)/R1)*(D*D/2-(5+3*T1+10*C1-4*C1*C1-9*eccPrimeSquared)*D*D*D*D/24 + +(61+90*T1+298*C1+45*T1*T1-252*eccPrimeSquared-3*C1*C1)*D*D*D*D*D*D/720); + Lat = Lat * rad2deg; + + Long = (D-(1+2*T1+C1)*D*D*D/6+(5-2*C1+28*T1-3*C1*C1+8*eccPrimeSquared+24*T1*T1) + *D*D*D*D*D/120)/cos(phi1Rad); + Long = LongOrigin + Long * rad2deg; + + geo->lat=Lat; + geo->lng=Long; +} + +void +transform_datum(struct coord_geo *from, enum map_datum from_datum, struct coord_geo *to, enum map_datum to_datum) +{ +} + +int +transform(struct transformation *t, enum projection pro, struct coord *c, struct point *p, int count, int mindist, int width, int *width_return) +{ + struct coord c1; + int xcn, ycn; + struct coord_geo g; + int xc, yc, zc=0, xco=0, yco=0, zco=0; + int xm,ym,zct; + int zlimit=t->znear; + int visible, visibleo=-1; + int i,j = 0,k=0; + dbg(1,"count=%d\n", count); + for (i=0; i < count; i++) { + if (pro == t->pro) { + xc=c[i].x; + yc=c[i].y; + } else { + transform_to_geo(pro, &c[i], &g); + transform_from_geo(t->pro, &g, &c1); + xc=c1.x; + yc=c1.y; + } + if (i != 0 && i != count-1 && mindist) { + if (xc > c[k].x-mindist && xc < c[k].x+mindist && yc > c[k].y-mindist && yc < c[k].y+mindist && + (c[i+1].x != c[0].x || c[i+1].y != c[0].y)) + continue; + k=i; + } + xm=xc; + ym=yc; +// dbg(2,"0x%x, 0x%x - 0x%x,0x%x contains 0x%x,0x%x\n", t->r.lu.x, t->r.lu.y, t->r.rl.x, t->r.rl.y, c->x, c->y); +// ret=coord_rect_contains(&t->r, c); + xc-=t->map_center.x; + yc-=t->map_center.y; + xc >>= t->scale_shift; + yc >>= t->scale_shift; + xm=xc; + ym=yc; + + xcn=xc*t->m00+yc*t->m01+HOG(*t)*t->m02; + ycn=xc*t->m10+yc*t->m11+HOG(*t)*t->m12; + + if (t->ddd) { + zc=(xc*t->m20+yc*t->m21+HOG(*t)*t->m22); + zct=zc; + zc+=t->offz << POST_SHIFT; + dbg(1,"zc=%d\n", zc); + dbg(1,"zc(%d)=xc(%d)*m20(%d)+yc(%d)*m21(%d)\n", (xc*t->m20+yc*t->m21), xc, t->m20, yc, t->m21); + /* visibility */ + visible=(zc < zlimit ? 0:1); + dbg(1,"visible=%d old %d\n", visible, visibleo); + if (visible != visibleo && visibleo != -1) { + dbg(1,"clipping (%d,%d,%d)-(%d,%d,%d) (%d,%d,%d)\n", xcn, ycn, zc, xco, yco, zco, xco-xcn, yco-ycn, zco-zc); + if (zco != zc) { + xcn=xcn+(long long)(xco-xcn)*(zlimit-zc)/(zco-zc); + ycn=ycn+(long long)(yco-ycn)*(zlimit-zc)/(zco-zc); + } + dbg(1,"result (%d,%d,%d) * %d / %d\n", xcn,ycn,zc,zlimit-zc,zco-zc); + zc=zlimit; + xco=xcn; + yco=ycn; + zco=zc; + if (visible) + i--; + visibleo=visible; + } else { + xco=xcn; + yco=ycn; + zco=zc; + visibleo=visible; + if (! visible) + continue; + } + dbg(1,"zc=%d\n", zc); + dbg(1,"xcn %d ycn %d\n", xcn, ycn); + dbg(1,"%d,%d %d\n",xc,yc,zc); +#if 0 + dbg(0,"%d/%d=%d %d/%d=%d\n",xcn,xc,xcn/xc,ycn,yc,ycn/yc); +#endif +#if 1 + xc=(long long)xcn*t->xscale/zc; + yc=(long long)ycn*t->yscale/zc; +#else + xc=xcn/(1000+zc); + yc=ycn/(1000+zc); +#endif +#if 0 + dbg(1,"%d,%d %d\n",xc,yc,zc); +#endif + } else { + xc=xcn; + yc=ycn; + xc>>=POST_SHIFT; + yc>>=POST_SHIFT; + } + xc+=t->offx; + yc+=t->offy; + p[j].x=xc; + p[j].y=yc; + if (width_return) { + if (t->ddd) + width_return[j]=width*t->wscale/zc; + else + width_return[j]=width; + } + j++; + } + return j; +} + +static void +transform_apply_inverse_matrix(struct transformation *t, struct coord_geo_cart *in, struct coord_geo_cart *out) +{ + out->x=in->x*t->im00+in->y*t->im01+in->z*t->im02; + out->y=in->x*t->im10+in->y*t->im11+in->z*t->im12; + out->z=in->x*t->im20+in->y*t->im21+in->z*t->im22; +} + +static int +transform_zplane_intersection(struct coord_geo_cart *p1, struct coord_geo_cart *p2, navit_float z, struct coord_geo_cart *result) +{ + navit_float dividend=z-p1->z; + navit_float divisor=p2->z-p1->z; + navit_float q; + if (!divisor) { + if (dividend) + return 0; /* no intersection */ + else + return 3; /* identical planes */ + } + q=dividend/divisor; + result->x=p1->x+q*(p2->x-p1->x); + result->y=p1->y+q*(p2->y-p1->y); + result->z=z; + if (q >= 0 && q <= 1) + return 1; /* intersection within [p1,p2] */ + return 2; /* intersection without [p1,p2] */ +} + +static void +transform_screen_to_3d(struct transformation *t, struct point *p, navit_float z, struct coord_geo_cart *cg) +{ + double xc,yc; + double offz=t->offz << POST_SHIFT; + xc=p->x - t->offx; + yc=p->y - t->offy; + cg->x=xc*z/t->xscale; + cg->y=yc*z/t->yscale; + cg->z=z-offz; +} + +static int +transform_reverse_near_far(struct transformation *t, struct point *p, struct coord *c, int near, int far) +{ + double xc,yc; + dbg(1,"%d,%d\n",p->x,p->y); + if (t->ddd) { + struct coord_geo_cart nearc,farc,nears,fars,intersection; + transform_screen_to_3d(t, p, near, &nearc); + transform_screen_to_3d(t, p, far, &farc); + transform_apply_inverse_matrix(t, &nearc, &nears); + transform_apply_inverse_matrix(t, &farc, &fars); + if (transform_zplane_intersection(&nears, &fars, HOG(*t), &intersection) != 1) + return 0; + xc=intersection.x; + yc=intersection.y; + } else { + double xcn,ycn; + xcn=p->x - t->offx; + ycn=p->y - t->offy; + xc=(xcn*t->im00+ycn*t->im01)*(1 << POST_SHIFT); + yc=(xcn*t->im10+ycn*t->im11)*(1 << POST_SHIFT); + } + c->x=xc*(1 << t->scale_shift)+t->map_center.x; + c->y=yc*(1 << t->scale_shift)+t->map_center.y; + return 1; +} + +int +transform_reverse(struct transformation *t, struct point *p, struct coord *c) +{ + return transform_reverse_near_far(t, p, c, t->znear, t->zfar); +} + +enum projection +transform_get_projection(struct transformation *this_) +{ + return this_->pro; +} + +void +transform_set_projection(struct transformation *this_, enum projection pro) +{ + this_->pro=pro; +} + +static int +min4(int v1,int v2, int v3, int v4) +{ + int res=v1; + if (v2 < res) + res=v2; + if (v3 < res) + res=v3; + if (v4 < res) + res=v4; + return res; +} + +static int +max4(int v1,int v2, int v3, int v4) +{ + int res=v1; + if (v2 > res) + res=v2; + if (v3 > res) + res=v3; + if (v4 > res) + res=v4; + return res; +} + +struct map_selection * +transform_get_selection(struct transformation *this_, enum projection pro, int order) +{ + + struct map_selection *ret,*curri,*curro; + struct coord_geo g; + + ret=map_selection_dup(this_->map_sel); + curri=this_->map_sel; + curro=ret; + while (curri) { + if (this_->pro != pro) { + transform_to_geo(this_->pro, &curri->u.c_rect.lu, &g); + transform_from_geo(pro, &g, &curro->u.c_rect.lu); + dbg(1,"%f,%f", g.lat, g.lng); + transform_to_geo(this_->pro, &curri->u.c_rect.rl, &g); + transform_from_geo(pro, &g, &curro->u.c_rect.rl); + dbg(1,": - %f,%f\n", g.lat, g.lng); + } + dbg(1,"transform rect for %d is %d,%d - %d,%d\n", pro, curro->u.c_rect.lu.x, curro->u.c_rect.lu.y, curro->u.c_rect.rl.x, curro->u.c_rect.rl.y); + curro->order+=order; +#if 0 + curro->u.c_rect.lu.x-=500; + curro->u.c_rect.lu.y+=500; + curro->u.c_rect.rl.x+=500; + curro->u.c_rect.rl.y-=500; +#endif + curro->range=item_range_all; + curri=curri->next; + curro=curro->next; + } + return ret; +} + +struct coord * +transform_center(struct transformation *this_) +{ + return &this_->map_center; +} + +struct coord * +transform_get_center(struct transformation *this_) +{ + return &this_->map_center; +} + +void +transform_set_center(struct transformation *this_, struct coord *c) +{ + this_->map_center=*c; +} + + +void +transform_set_yaw(struct transformation *t,int yaw) +{ + t->yaw=yaw; + transform_setup_matrix(t); +} + +int +transform_get_yaw(struct transformation *this_) +{ + return this_->yaw; +} + +void +transform_set_pitch(struct transformation *this_,int pitch) +{ + this_->pitch=pitch; + transform_setup_matrix(this_); +} +int +transform_get_pitch(struct transformation *this_) +{ + return this_->pitch; +} + +void +transform_set_roll(struct transformation *this_,int roll) +{ +#ifdef ENABLE_ROLL + this_->roll=roll; + transform_setup_matrix(this_); +#else + dbg(0,"not supported\n"); +#endif +} + +int +transform_get_roll(struct transformation *this_) +{ +#ifdef ENABLE_ROLL + return this_->roll; +#else + return 0; +#endif +} + +void +transform_set_distance(struct transformation *this_,int distance) +{ + transform_set_screen_dist(this_, distance); + transform_setup_matrix(this_); +} + +int +transform_get_distance(struct transformation *this_) +{ + return this_->screen_dist; +} + +void +transform_set_scales(struct transformation *this_, int xscale, int yscale, int wscale) +{ + this_->xscale3d=xscale; + this_->yscale3d=yscale; + this_->wscale3d=wscale; +} + +void +transform_set_screen_selection(struct transformation *t, struct map_selection *sel) +{ + map_selection_destroy(t->screen_sel); + t->screen_sel=map_selection_dup(sel); + if (sel) { + t->screen_center.x=(sel->u.p_rect.rl.x-sel->u.p_rect.lu.x)/2; + t->screen_center.y=(sel->u.p_rect.rl.y-sel->u.p_rect.lu.y)/2; + transform_setup_matrix(t); + } +} + +void +transform_set_screen_center(struct transformation *t, struct point *p) +{ + t->screen_center=*p; +} + +#if 0 +void +transform_set_size(struct transformation *t, int width, int height) +{ + t->width=width; + t->height=height; +} +#endif + +void +transform_get_size(struct transformation *t, int *width, int *height) +{ + struct point_rect *r; + if (t->screen_sel) { + r=&t->screen_sel->u.p_rect; + *width=r->rl.x-r->lu.x; + *height=r->rl.y-r->lu.y; + } +} + +void +transform_setup(struct transformation *t, struct pcoord *c, int scale, int yaw) +{ + t->pro=c->pro; + t->map_center.x=c->x; + t->map_center.y=c->y; + t->scale=scale/16.0; + transform_set_yaw(t, yaw); +} + +#if 0 + +void +transform_setup_source_rect_limit(struct transformation *t, struct coord *center, int limit) +{ + t->center=*center; + t->scale=1; + t->angle=0; + t->r.lu.x=center->x-limit; + t->r.rl.x=center->x+limit; + t->r.rl.y=center->y-limit; + t->r.lu.y=center->y+limit; +} +#endif + +void +transform_setup_source_rect(struct transformation *t) +{ + int i; + struct coord screen[4]; + struct point screen_pnt[4]; + struct point_rect *pr; + struct map_selection *ms,*msm,*next,**msm_last; + ms=t->map_sel; + while (ms) { + next=ms->next; + g_free(ms); + ms=next; + } + t->map_sel=NULL; + msm_last=&t->map_sel; + ms=t->screen_sel; + while (ms) { + msm=g_new0(struct map_selection, 1); + *msm=*ms; + pr=&ms->u.p_rect; + screen_pnt[0].x=pr->lu.x; /* left upper */ + screen_pnt[0].y=pr->lu.y; + screen_pnt[1].x=pr->rl.x; /* right upper */ + screen_pnt[1].y=pr->lu.y; + screen_pnt[2].x=pr->rl.x; /* right lower */ + screen_pnt[2].y=pr->rl.y; + screen_pnt[3].x=pr->lu.x; /* left lower */ + screen_pnt[3].y=pr->rl.y; + if (t->ddd) { + struct coord_geo_cart tmp,cg[8]; + struct coord c; + int valid=0; + unsigned char edgenodes[]={ + 0,1, + 1,2, + 2,3, + 3,0, + 4,5, + 5,6, + 6,7, + 7,4, + 0,4, + 1,5, + 2,6, + 3,7}; + for (i = 0 ; i < 8 ; i++) { + transform_screen_to_3d(t, &screen_pnt[i%4], (i >= 4 ? t->zfar:t->znear), &tmp); + transform_apply_inverse_matrix(t, &tmp, &cg[i]); + } + msm->u.c_rect.lu.x=0; + msm->u.c_rect.lu.y=0; + msm->u.c_rect.rl.x=0; + msm->u.c_rect.rl.y=0; + for (i = 0 ; i < 12 ; i++) { + if (transform_zplane_intersection(&cg[edgenodes[i*2]], &cg[edgenodes[i*2+1]], HOG(*t), &tmp) == 1) { + c.x=tmp.x*(1 << t->scale_shift)+t->map_center.x; + c.y=tmp.y*(1 << t->scale_shift)+t->map_center.y; + dbg(1,"intersection with edge %d at 0x%x,0x%x\n",i,c.x,c.y); + if (valid) + coord_rect_extend(&msm->u.c_rect, &c); + else { + msm->u.c_rect.lu=c; + msm->u.c_rect.rl=c; + valid=1; + } + dbg(1,"rect 0x%x,0x%x - 0x%x,0x%x\n",msm->u.c_rect.lu.x,msm->u.c_rect.lu.y,msm->u.c_rect.rl.x,msm->u.c_rect.rl.y); + } + } + } else { + for (i = 0 ; i < 4 ; i++) { + transform_reverse(t, &screen_pnt[i], &screen[i]); + dbg(1,"map(%d) %d,%d=0x%x,0x%x\n", i,screen_pnt[i].x, screen_pnt[i].y, screen[i].x, screen[i].y); + } + msm->u.c_rect.lu.x=min4(screen[0].x,screen[1].x,screen[2].x,screen[3].x); + msm->u.c_rect.rl.x=max4(screen[0].x,screen[1].x,screen[2].x,screen[3].x); + msm->u.c_rect.rl.y=min4(screen[0].y,screen[1].y,screen[2].y,screen[3].y); + msm->u.c_rect.lu.y=max4(screen[0].y,screen[1].y,screen[2].y,screen[3].y); + } + dbg(1,"%dx%d\n", msm->u.c_rect.rl.x-msm->u.c_rect.lu.x, + msm->u.c_rect.lu.y-msm->u.c_rect.rl.y); + *msm_last=msm; + msm_last=&msm->next; + ms=ms->next; + } +} + +long +transform_get_scale(struct transformation *t) +{ + return (int)(t->scale*16); +} + +void +transform_set_scale(struct transformation *t, long scale) +{ + t->scale=scale/16.0; + transform_setup_matrix(t); +} + + +int +transform_get_order(struct transformation *t) +{ + dbg(1,"order %d\n", t->order); + return t->order; +} + + + +#define TWOPI (M_PI*2) +#define GC2RAD(c) ((c) * TWOPI/(1<<24)) +#define minf(a,b) ((a) < (b) ? (a) : (b)) + +static double +transform_distance_garmin(struct coord *c1, struct coord *c2) +{ +#ifdef USE_HALVESINE + static const int earth_radius = 6371*1000; //m change accordingly +// static const int earth_radius = 3960; //miles + +//Point 1 cords + navit_float lat1 = GC2RAD(c1->y); + navit_float long1 = GC2RAD(c1->x); + +//Point 2 cords + navit_float lat2 = GC2RAD(c2->y); + navit_float long2 = GC2RAD(c2->x); + +//Haversine Formula + navit_float dlong = long2-long1; + navit_float dlat = lat2-lat1; + + navit_float sinlat = navit_sin(dlat/2); + navit_float sinlong = navit_sin(dlong/2); + + navit_float a=(sinlat*sinlat)+navit_cos(lat1)*navit_cos(lat2)*(sinlong*sinlong); + navit_float c=2*navit_asin(minf(1,navit_sqrt(a))); +#ifdef AVOID_FLOAT + return round(earth_radius*c); +#else + return earth_radius*c; +#endif +#else +#define GMETER 2.3887499999999999 + navit_float dx,dy; + dx=c1->x-c2->x; + dy=c1->y-c2->y; + return navit_sqrt(dx*dx+dy*dy)*GMETER; +#undef GMETER +#endif +} + +double +transform_scale(int y) +{ + struct coord c; + struct coord_geo g; + c.x=0; + c.y=y; + transform_to_geo(projection_mg, &c, &g); + return 1/navit_cos(g.lat/180*M_PI); +} + +#ifdef AVOID_FLOAT +static int +tab_sqrt[]={14142,13379,12806,12364,12018,11741,11517,11333,11180,11051,10943,10850,10770,10701,10640,10587,10540,10499,10462,10429,10400,10373,10349,10327,10307,10289,10273,10257,10243,10231,10219,10208}; + +static int tab_int_step = 0x20000; +static int tab_int_scale[]={10000,10002,10008,10019,10033,10052,10076,10103,10135,10171,10212,10257,10306,10359,10417,10479,10546,10617,10693,10773,10858,10947,11041,11140,11243,11352,11465,11582,11705,11833,11965,12103,12246,12394,12547,12706,12870,13039,13214,13395,13581,13773,13971,14174,14384,14600,14822,15050,15285,15526,15774,16028,16289,16557,16832,17114,17404,17700,18005,18316,18636,18964,19299,19643,19995,20355,20724,21102,21489,21885,22290,22705,23129,23563,24007,24461,24926,25401,25886,26383,26891}; + +int transform_int_scale(int y) +{ + int i,size = sizeof(tab_int_scale)/sizeof(int); + if (y < 0) + y=-y; + i=y/tab_int_step; + if (i < size-1) + return tab_int_scale[i]+((tab_int_scale[i+1]-tab_int_scale[i])*(y-i*tab_int_step))/tab_int_step; + return tab_int_scale[size-1]; +} +#endif + +double +transform_distance(enum projection pro, struct coord *c1, struct coord *c2) +{ + if (pro == projection_mg) { +#ifndef AVOID_FLOAT + double dx,dy,scale=transform_scale((c1->y+c2->y)/2); + dx=c1->x-c2->x; + dy=c1->y-c2->y; + return sqrt(dx*dx+dy*dy)/scale; +#else + int dx,dy,f,scale=transform_int_scale((c1->y+c2->y)/2); + dx=c1->x-c2->x; + dy=c1->y-c2->y; + if (dx < 0) + dx=-dx; + if (dy < 0) + dy=-dy; + while (dx > 20000 || dy > 20000) { + dx/=10; + dy/=10; + scale/=10; + } + if (! dy) + return dx*10000/scale; + if (! dx) + return dy*10000/scale; + if (dx > dy) { + f=dx*8/dy-8; + if (f >= 32) + return dx*10000/scale; + return dx*tab_sqrt[f]/scale; + } else { + f=dy*8/dx-8; + if (f >= 32) + return dy*10000/scale; + return dy*tab_sqrt[f]/scale; + } +#endif + } else if (pro == projection_garmin) { + return transform_distance_garmin(c1, c2); + } else { + dbg(0,"Unknown projection: %d\n", pro); + return 0; + } +} + +void +transform_project(enum projection pro, struct coord *c, int distance, int angle, struct coord *res) +{ + double scale; + switch (pro) { + case projection_mg: + scale=transform_scale(c->y); + res->x=c->x+distance*sin(angle*M_PI/180)*scale; + res->y=c->y+distance*cos(angle*M_PI/180)*scale; + break; + default: + dbg(0,"Unsupported projection: %d\n", pro); + return; + } + +} + + +double +transform_polyline_length(enum projection pro, struct coord *c, int count) +{ + double ret=0; + int i; + + for (i = 0 ; i < count-1 ; i++) + ret+=transform_distance(pro, &c[i], &c[i+1]); + return ret; +} + +int +transform_distance_sq(struct coord *c1, struct coord *c2) +{ + int dx=c1->x-c2->x; + int dy=c1->y-c2->y; + + if (dx > 32767 || dy > 32767 || dx < -32767 || dy < -32767) + return INT_MAX; + else + return dx*dx+dy*dy; +} + +navit_float +transform_distance_sq_float(struct coord *c1, struct coord *c2) +{ + int dx=c1->x-c2->x; + int dy=c1->y-c2->y; + return (navit_float)dx*dx+dy*dy; +} + +int +transform_distance_sq_pc(struct pcoord *c1, struct pcoord *c2) +{ + struct coord p1,p2; + p1.x = c1->x; p1.y = c1->y; + p2.x = c2->x; p2.y = c2->y; + return transform_distance_sq(&p1, &p2); +} + +int +transform_distance_line_sq(struct coord *l0, struct coord *l1, struct coord *ref, struct coord *lpnt) +{ + int vx,vy,wx,wy; + int c1,c2; + int climit=1000000; + struct coord l; + + vx=l1->x-l0->x; + vy=l1->y-l0->y; + wx=ref->x-l0->x; + wy=ref->y-l0->y; + + c1=vx*wx+vy*wy; + if ( c1 <= 0 ) { + if (lpnt) + *lpnt=*l0; + return transform_distance_sq(l0, ref); + } + c2=vx*vx+vy*vy; + if ( c2 <= c1 ) { + if (lpnt) + *lpnt=*l1; + return transform_distance_sq(l1, ref); + } + while (c1 > climit || c2 > climit) { + c1/=256; + c2/=256; + } + l.x=l0->x+vx*c1/c2; + l.y=l0->y+vy*c1/c2; + if (lpnt) + *lpnt=l; + return transform_distance_sq(&l, ref); +} + +navit_float +transform_distance_line_sq_float(struct coord *l0, struct coord *l1, struct coord *ref, struct coord *lpnt) +{ + navit_float vx,vy,wx,wy; + navit_float c1,c2; + struct coord l; + + vx=l1->x-l0->x; + vy=l1->y-l0->y; + wx=ref->x-l0->x; + wy=ref->y-l0->y; + + c1=vx*wx+vy*wy; + if ( c1 <= 0 ) { + if (lpnt) + *lpnt=*l0; + return transform_distance_sq_float(l0, ref); + } + c2=vx*vx+vy*vy; + if ( c2 <= c1 ) { + if (lpnt) + *lpnt=*l1; + return transform_distance_sq_float(l1, ref); + } + l.x=l0->x+vx*c1/c2; + l.y=l0->y+vy*c1/c2; + if (lpnt) + *lpnt=l; + return transform_distance_sq_float(&l, ref); +} + +int +transform_distance_polyline_sq(struct coord *c, int count, struct coord *ref, struct coord *lpnt, int *pos) +{ + int i,dist,distn; + struct coord lp; + if (count < 2) + return INT_MAX; + if (pos) + *pos=0; + dist=transform_distance_line_sq(&c[0], &c[1], ref, lpnt); + for (i=2 ; i < count ; i++) { + distn=transform_distance_line_sq(&c[i-1], &c[i], ref, &lp); + if (distn < dist) { + dist=distn; + if (lpnt) + *lpnt=lp; + if (pos) + *pos=i-1; + } + } + return dist; +} + +int +transform_douglas_peucker(struct coord *in, int count, int dist_sq, struct coord *out) +{ + int ret=0; + int i,d,dmax=0, idx=0; + for (i = 1; i < count-2 ; i++) { + d=transform_distance_line_sq(&in[0], &in[count-1], &in[i], NULL); + if (d > dmax) { + idx=i; + dmax=d; + } + } + if (dmax > dist_sq) { + ret=transform_douglas_peucker(in, idx, dist_sq, out)-1; + ret+=transform_douglas_peucker(in+idx, count-idx, dist_sq, out+ret); + } else { + if (count > 0) + out[ret++]=in[0]; + if (count > 1) + out[ret++]=in[count-1]; + } + return ret; +} + +int +transform_douglas_peucker_float(struct coord *in, int count, navit_float dist_sq, struct coord *out) +{ + int ret=0; + int i,idx=0; + navit_float d,dmax=0; + for (i = 1; i < count-2 ; i++) { + d=transform_distance_line_sq_float(&in[0], &in[count-1], &in[i], NULL); + if (d > dmax) { + idx=i; + dmax=d; + } + } + if (dmax > dist_sq) { + ret=transform_douglas_peucker_float(in, idx, dist_sq, out)-1; + ret+=transform_douglas_peucker_float(in+idx, count-idx, dist_sq, out+ret); + } else { + if (count > 0) + out[ret++]=in[0]; + if (count > 1) + out[ret++]=in[count-1]; + } + return ret; +} + + +void +transform_print_deg(double deg) +{ + printf("%2.0f:%2.0f:%2.4f", floor(deg), fmod(deg*60,60), fmod(deg*3600,60)); +} + +#ifdef AVOID_FLOAT +static int tab_atan[]={0,262,524,787,1051,1317,1584,1853,2126,2401,2679,2962,3249,3541,3839,4142,4452,4770,5095,5430,5774,6128,6494,6873,7265,7673,8098,8541,9004,9490,10000,10538}; + +static int +atan2_int_lookup(int val) +{ + int len=sizeof(tab_atan)/sizeof(int); + int i=len/2; + int p=i-1; + for (;;) { + i>>=1; + if (val < tab_atan[p]) + p-=i; + else + if (val < tab_atan[p+1]) + return p+(p>>1); + else + p+=i; + } +} + +static int +atan2_int(int dx, int dy) +{ + int mul=1,add=0,ret; + if (! dx) { + return dy < 0 ? 180 : 0; + } + if (! dy) { + return dx < 0 ? -90 : 90; + } + if (dx < 0) { + dx=-dx; + mul=-1; + } + if (dy < 0) { + dy=-dy; + add=180*mul; + mul*=-1; + } + while (dx > 20000 || dy > 20000) { + dx/=10; + dy/=10; + } + if (dx > dy) { + ret=90-atan2_int_lookup(dy*10000/dx); + } else { + ret=atan2_int_lookup(dx*10000/dy); + } + return ret*mul+add; +} +#endif + +int +transform_get_angle_delta(struct coord *c1, struct coord *c2, int dir) +{ + int dx=c2->x-c1->x; + int dy=c2->y-c1->y; +#ifndef AVOID_FLOAT + double angle; + angle=atan2(dx,dy); + angle*=180/M_PI; +#else + int angle; + angle=atan2_int(dx,dy); +#endif + if (dir == -1) + angle=angle-180; + if (angle < 0) + angle+=360; + return angle; +} + +int +transform_within_border(struct transformation *this_, struct point *p, int border) +{ + struct map_selection *ms=this_->screen_sel; + while (ms) { + struct point_rect *r=&ms->u.p_rect; + if (p->x >= r->lu.x+border && p->x <= r->rl.x-border && + p->y >= r->lu.y+border && p->y <= r->rl.y-border) + return 1; + ms=ms->next; + } + return 0; +} + +int +transform_within_dist_point(struct coord *ref, struct coord *c, int dist) +{ + if (c->x-dist > ref->x) + return 0; + if (c->x+dist < ref->x) + return 0; + if (c->y-dist > ref->y) + return 0; + if (c->y+dist < ref->y) + return 0; + if ((c->x-ref->x)*(c->x-ref->x) + (c->y-ref->y)*(c->y-ref->y) <= dist*dist) + return 1; + return 0; +} + +int +transform_within_dist_line(struct coord *ref, struct coord *c0, struct coord *c1, int dist) +{ + int vx,vy,wx,wy; + int n1,n2; + struct coord lc; + + if (c0->x < c1->x) { + if (c0->x-dist > ref->x) + return 0; + if (c1->x+dist < ref->x) + return 0; + } else { + if (c1->x-dist > ref->x) + return 0; + if (c0->x+dist < ref->x) + return 0; + } + if (c0->y < c1->y) { + if (c0->y-dist > ref->y) + return 0; + if (c1->y+dist < ref->y) + return 0; + } else { + if (c1->y-dist > ref->y) + return 0; + if (c0->y+dist < ref->y) + return 0; + } + vx=c1->x-c0->x; + vy=c1->y-c0->y; + wx=ref->x-c0->x; + wy=ref->y-c0->y; + + n1=vx*wx+vy*wy; + if ( n1 <= 0 ) + return transform_within_dist_point(ref, c0, dist); + n2=vx*vx+vy*vy; + if ( n2 <= n1 ) + return transform_within_dist_point(ref, c1, dist); + + lc.x=c0->x+vx*n1/n2; + lc.y=c0->y+vy*n1/n2; + return transform_within_dist_point(ref, &lc, dist); +} + +int +transform_within_dist_polyline(struct coord *ref, struct coord *c, int count, int close, int dist) +{ + int i; + for (i = 0 ; i < count-1 ; i++) { + if (transform_within_dist_line(ref,c+i,c+i+1,dist)) { + return 1; + } + } + if (close) + return (transform_within_dist_line(ref,c,c+count-1,dist)); + return 0; +} + +int +transform_within_dist_polygon(struct coord *ref, struct coord *c, int count, int dist) +{ + int i, j, ci = 0; + for (i = 0, j = count-1; i < count; j = i++) { + if ((((c[i].y <= ref->y) && ( ref->y < c[j].y )) || + ((c[j].y <= ref->y) && ( ref->y < c[i].y))) && + (ref->x < (c[j].x - c[i].x) * (ref->y - c[i].y) / (c[j].y - c[i].y) + c[i].x)) + ci = !ci; + } + if (! ci) { + if (dist) + return transform_within_dist_polyline(ref, c, count, dist, 1); + else + return 0; + } + return 1; +} + +int +transform_within_dist_item(struct coord *ref, enum item_type type, struct coord *c, int count, int dist) +{ + if (type < type_line) + return transform_within_dist_point(ref, c, dist); + if (type < type_area) + return transform_within_dist_polyline(ref, c, count, 0, dist); + return transform_within_dist_polygon(ref, c, count, dist); +} + +void +transform_copy(struct transformation *src, struct transformation *dst) +{ + memcpy(dst, src, sizeof(*src)); +} + +void +transform_destroy(struct transformation *t) +{ + g_free(t); +} + + +/* +Note: there are many mathematically equivalent ways to express these formulas. As usual, not all of them are computationally equivalent. + +L = latitude in radians (positive north) +Lo = longitude in radians (positive east) +E = easting (meters) +N = northing (meters) + +For the sphere + +E = r Lo +N = r ln [ tan (pi/4 + L/2) ] + +where + +r = radius of the sphere (meters) +ln() is the natural logarithm + +For the ellipsoid + +E = a Lo +N = a * ln ( tan (pi/4 + L/2) * ( (1 - e * sin (L)) / (1 + e * sin (L))) ** (e/2) ) + + + e + - + pi L 1 - e sin(L) 2 + = a ln( tan( ---- + ---) (--------------) ) + 4 2 1 + e sin(L) + + +where + +a = the length of the semi-major axis of the ellipsoid (meters) +e = the first eccentricity of the ellipsoid + + +*/ + + diff --git a/navit/transform.h b/navit/transform.h new file mode 100644 index 0000000..e274f92 --- /dev/null +++ b/navit/transform.h @@ -0,0 +1,110 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_TRANSFORM_H +#define NAVIT_TRANSFORM_H + +#ifdef __cplusplus +extern "C" { +#endif +#include "coord.h" + +/* prototypes */ +enum attr_type; +enum item_type; +enum map_datum; +enum projection; +struct attr; +struct attr_iter; +struct coord; +struct coord_geo; +struct coord_geo_cart; +struct map_selection; +struct pcoord; +struct point; +struct transformation; +struct transformation *transform_new(void); +int transform_get_hog(struct transformation *this_); +void transform_set_hog(struct transformation *this_, int hog); +int transform_get_attr(struct transformation *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); +int transform_set_attr(struct transformation *this_, struct attr *attr); +int transformation_get_order_base(struct transformation *this_); +void transform_set_order_base(struct transformation *this_, int order_base); +struct transformation *transform_dup(struct transformation *t); +void transform_to_geo(enum projection pro, struct coord *c, struct coord_geo *g); +void transform_from_geo(enum projection pro, struct coord_geo *g, struct coord *c); +void transform_from_to_count(struct coord *cfrom, enum projection from, struct coord *cto, enum projection to, int count); +void transform_from_to(struct coord *cfrom, enum projection from, struct coord *cto, enum projection to); +void transform_geo_to_cart(struct coord_geo *geo, navit_float a, navit_float b, struct coord_geo_cart *cart); +void transform_cart_to_geo(struct coord_geo_cart *cart, navit_float a, navit_float b, struct coord_geo *geo); +void transform_utm_to_geo(const double UTMEasting, const double UTMNorthing, int ZoneNumber, int NorthernHemisphere, struct coord_geo *geo); +void transform_datum(struct coord_geo *from, enum map_datum from_datum, struct coord_geo *to, enum map_datum to_datum); +int transform(struct transformation *t, enum projection pro, struct coord *c, struct point *p, int count, int mindist, int width, int *width_return); +int transform_reverse(struct transformation *t, struct point *p, struct coord *c); +enum projection transform_get_projection(struct transformation *this_); +void transform_set_projection(struct transformation *this_, enum projection pro); +struct map_selection *transform_get_selection(struct transformation *this_, enum projection pro, int order); +struct coord *transform_center(struct transformation *this_); +struct coord *transform_get_center(struct transformation *this_); +void transform_set_center(struct transformation *this_, struct coord *c); +void transform_set_yaw(struct transformation *t, int yaw); +int transform_get_yaw(struct transformation *this_); +void transform_set_pitch(struct transformation *this_, int pitch); +int transform_get_pitch(struct transformation *this_); +void transform_set_roll(struct transformation *this_, int roll); +int transform_get_roll(struct transformation *this_); +void transform_set_distance(struct transformation *this_, int distance); +int transform_get_distance(struct transformation *this_); +void transform_set_scales(struct transformation *this_, int xscale, int yscale, int wscale); +void transform_set_screen_selection(struct transformation *t, struct map_selection *sel); +void transform_set_screen_center(struct transformation *t, struct point *p); +void transform_get_size(struct transformation *t, int *width, int *height); +void transform_setup(struct transformation *t, struct pcoord *c, int scale, int yaw); +void transform_setup_source_rect(struct transformation *t); +long transform_get_scale(struct transformation *t); +void transform_set_scale(struct transformation *t, long scale); +int transform_get_order(struct transformation *t); +double transform_scale(int y); +double transform_distance(enum projection pro, struct coord *c1, struct coord *c2); +void transform_project(enum projection pro, struct coord *c, int distance, int angle, struct coord *res); +double transform_polyline_length(enum projection pro, struct coord *c, int count); +int transform_distance_sq(struct coord *c1, struct coord *c2); +navit_float transform_distance_sq_float(struct coord *c1, struct coord *c2); +int transform_distance_sq_pc(struct pcoord *c1, struct pcoord *c2); +int transform_distance_line_sq(struct coord *l0, struct coord *l1, struct coord *ref, struct coord *lpnt); +navit_float transform_distance_line_sq_float(struct coord *l0, struct coord *l1, struct coord *ref, struct coord *lpnt); +int transform_distance_polyline_sq(struct coord *c, int count, struct coord *ref, struct coord *lpnt, int *pos); +int transform_douglas_peucker(struct coord *in, int count, int dist_sq, struct coord *out); +int transform_douglas_peucker_float(struct coord *in, int count, navit_float dist_sq, struct coord *out); +void transform_print_deg(double deg); +int transform_get_angle_delta(struct coord *c1, struct coord *c2, int dir); +int transform_within_border(struct transformation *this_, struct point *p, int border); +int transform_within_dist_point(struct coord *ref, struct coord *c, int dist); +int transform_within_dist_line(struct coord *ref, struct coord *c0, struct coord *c1, int dist); +int transform_within_dist_polyline(struct coord *ref, struct coord *c, int count, int close, int dist); +int transform_within_dist_polygon(struct coord *ref, struct coord *c, int count, int dist); +int transform_within_dist_item(struct coord *ref, enum item_type type, struct coord *c, int count, int dist); +void transform_copy(struct transformation *src, struct transformation *dst); +void transform_destroy(struct transformation *t); +/* end of prototypes */ +#ifdef __cplusplus +} +#endif + +#endif diff --git a/navit/types.h b/navit/types.h new file mode 100644 index 0000000..1bba0f6 --- /dev/null +++ b/navit/types.h @@ -0,0 +1,38 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_TYPES_H +#define NAVIT_TYPES_H +#include + +typedef int8_t s8; +typedef uint8_t u8; +typedef int16_t s16; +typedef uint16_t u16; +typedef int32_t s32; +typedef uint32_t u32; + +#ifdef HAVE_API_WIN32_BASE +#define LONGLONG_FMT "%I64d" +#else +#define LONGLONG_FMT "%lld" +#endif + + +#endif diff --git a/navit/util.c b/navit/util.c new file mode 100644 index 0000000..6046747 --- /dev/null +++ b/navit/util.c @@ -0,0 +1,695 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef _POSIX_C_SOURCE +#include +#include +#include +#endif +#include "util.h" +#include "debug.h" +#include "config.h" + +void +strtoupper(char *dest, const char *src) +{ + while (*src) + *dest++=toupper(*src++); + *dest='\0'; +} + +void +strtolower(char *dest, const char *src) +{ + while (*src) + *dest++=tolower(*src++); + *dest='\0'; +} + + +static void +hash_callback(gpointer key, gpointer value, gpointer user_data) +{ + GList **l=user_data; + *l=g_list_prepend(*l, value); +} + +GList * +g_hash_to_list(GHashTable *h) +{ + GList *ret=NULL; + g_hash_table_foreach(h, hash_callback, &ret); + + return ret; +} + +static void +hash_callback_key(gpointer key, gpointer value, gpointer user_data) +{ + GList **l=user_data; + *l=g_list_prepend(*l, key); +} + +GList * +g_hash_to_list_keys(GHashTable *h) +{ + GList *ret=NULL; + g_hash_table_foreach(h, hash_callback_key, &ret); + + return ret; +} + +gchar * +g_strconcat_printf(gchar *buffer, gchar *fmt, ...) +{ + gchar *str,*ret; + va_list ap; + + va_start(ap, fmt); + str=g_strdup_vprintf(fmt, ap); + va_end(ap); + if (! buffer) + return str; + ret=g_strconcat(buffer, str, NULL); + g_free(buffer); + g_free(str); + return ret; +} + +#ifndef HAVE_GLIB +int g_utf8_strlen_force_link(gchar *buffer, int max); +int +g_utf8_strlen_force_link(gchar *buffer, int max) +{ + return g_utf8_strlen(buffer, max); +} +#endif + +#if defined(_WIN32) || defined(__CEGCC__) +#include +#include +#endif + +#if defined(_WIN32) || defined(__CEGCC__) || defined (__APPLE__) || defined(HAVE_API_ANDROID) +#include +char *stristr(const char *String, const char *Pattern) +{ + char *pptr, *sptr, *start; + + for (start = (char *)String; *start != (int)NULL; start++) + { + /* find start of pattern in string */ + for ( ; ((*start!=(int)NULL) && (toupper(*start) != toupper(*Pattern))); start++) + ; + if ((int)NULL == *start) + return NULL; + + pptr = (char *)Pattern; + sptr = (char *)start; + + while (toupper(*sptr) == toupper(*pptr)) + { + sptr++; + pptr++; + + /* if end of pattern then pattern was found */ + + if ((int)NULL == *pptr) + return (start); + } + } + return NULL; +} + +#ifndef SIZE_MAX +# define SIZE_MAX ((size_t) -1) +#endif +#ifndef SSIZE_MAX +# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2)) +#endif +#if !HAVE_FLOCKFILE +# undef flockfile +# define flockfile(x) ((void) 0) +#endif +#if !HAVE_FUNLOCKFILE +# undef funlockfile +# define funlockfile(x) ((void) 0) +#endif + +/* Some systems, like OSF/1 4.0 and Woe32, don't have EOVERFLOW. */ +#ifndef EOVERFLOW +# define EOVERFLOW E2BIG +#endif + + +#ifndef HAVE_GETDELIM +/** + * Read the part of a file up to a delimiter to a string. + *

+ * Read up to (and including) a DELIMITER from FP into *LINEPTR (and + NUL-terminate it). + * @param lineptr Pointer to a pointer returned from malloc (or + NULL), pointing to a buffer. It is realloc'ed as + necessary and will receive the data read. + * @param n Size of the buffer. + * + * @return Number of characters read (not including + the null terminator), or -1 on error or EOF. +*/ +ssize_t +getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) +{ + int result; + size_t cur_len = 0; + + if (lineptr == NULL || n == NULL || fp == NULL) + { + return -1; + } + + flockfile (fp); + + if (*lineptr == NULL || *n == 0) + { + *n = 120; + *lineptr = (char *) realloc (*lineptr, *n); + if (*lineptr == NULL) + { + result = -1; + goto unlock_return; + } + } + + for (;;) + { + int i; + + i = getc (fp); + if (i == EOF) + { + result = -1; + break; + } + + /* Make enough space for len+1 (for final NUL) bytes. */ + if (cur_len + 1 >= *n) + { + size_t needed_max=SIZE_MAX; + size_t needed = 2 * *n + 1; /* Be generous. */ + char *new_lineptr; + if (needed_max < needed) + needed = needed_max; + if (cur_len + 1 >= needed) + { + result = -1; + goto unlock_return; + } + + new_lineptr = (char *) realloc (*lineptr, needed); + if (new_lineptr == NULL) + { + result = -1; + goto unlock_return; + } + + *lineptr = new_lineptr; + *n = needed; + } + + (*lineptr)[cur_len] = i; + cur_len++; + + if (i == delimiter) + break; + } + (*lineptr)[cur_len] = '\0'; + result = cur_len ? cur_len : result; + + unlock_return: + funlockfile (fp); /* doesn't set errno */ + + return result; +} +#endif + +#ifndef HAVE_GETLINE +ssize_t +getline (char **lineptr, size_t *n, FILE *stream) +{ + return getdelim (lineptr, n, '\n', stream); +} +#endif + +#if defined(_UNICODE) +wchar_t* newSysString(const char *toconvert) +{ + int newstrlen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, toconvert, -1, 0, 0); + wchar_t *newstring = g_new(wchar_t,newstrlen); + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, toconvert, -1, newstring, newstrlen) ; + return newstring; +} +#else +char * newSysString(const char *toconvert) +{ + return g_strdup(toconvert); +} +#endif +#endif + +#if defined(_MSC_VER) || (!defined(HAVE_GETTIMEOFDAY) && defined(HAVE_API_WIN32_BASE)) +/** + * Impements a simple incomplete version of gettimeofday. Only usefull for messuring + * time spans, not the real time of day. + */ +int gettimeofday(struct timeval *time, void *local) +{ + int milliseconds = GetTickCount(); + + time->tv_sec = milliseconds/1000; + time->tv_usec = (milliseconds - (time->tv_sec * 1000)) * 1000; + + return 0; +} +#endif +/** + * Convert an ISO 8601-style time string into epoch time. + * + * @param iso8601 Pointer to a string containing the time in ISO 8601 format. + * + * @return An unsigned integer representing the number of seconds elapsed since January 1, 1970, 00:00:00 UTC. + */ +unsigned int +iso8601_to_secs(char *iso8601) +{ + int a,b,d,val[6],i=0; + char *start=iso8601,*pos=iso8601; + while (*pos && i < 6) { + if (*pos < '0' || *pos > '9') { + val[i++]=atoi(start); + pos++; + start=pos; + } + pos++; + } + + a=val[0]/100; + b=2-a+a/4; + + if (val[1] < 2) { + val[0]--; + val[1]+=12; + } + + d=1461*(val[0]+4716)/4+306001*(val[1]+1)/10000+val[2]+b-2442112; + + return ((d*24+val[3])*60+val[4])*60+val[5]; +} + +/** + * Output local system time in ISO 8601 format. + * + * @return Pointer to a string containing the time in ISO 8601 format + */ +char * +current_to_iso8601(void) +{ + char *timep=NULL; +#ifdef HAVE_API_WIN32_BASE + SYSTEMTIME ST; + GetSystemTime(&ST); + timep=g_strdup_printf("%d-%02d-%02dT%02d:%02d:%02dZ",ST.wYear,ST.wMonth,ST.wDay,ST.wHour,ST.wMinute,ST.wSecond); +#else + char buffer[32]; + time_t tnow; + struct tm *tm; + tnow = time(0); + tm = gmtime(&tnow); + if (tm) { + strftime(buffer, sizeof(buffer), "%Y-%m-%dT%TZ", tm); + timep=g_strdup(buffer); + } +#endif + return timep; +} + + +struct spawn_process_info { +#ifdef HAVE_API_WIN32_BASE + PROCESS_INFORMATION pr; +#else + pid_t pid; // = -1 if non-blocking spawn isn't supported + int status; // exit status if non-blocking spawn isn't supported +#endif +}; + + +/** + * Escape and quote string for shell + * + * @param in arg string to escape + * @returns escaped string + */ +char * +shell_escape(char *arg) +{ + char *r; + int arglen=strlen(arg); + int i,j,rlen; +#ifdef HAVE_API_WIN32_BASE + { + int bscount=0; + rlen=arglen+3; + r=g_new(char,rlen); + r[0]='"'; + for(i=0,j=1;i0) { + rlen+=bscount; + r=g_realloc(r,rlen); + memset(r+j,'\\',bscount); + j+=bscount; + bscount=0; + } + r[j++]=arg[i]; + if(i==(arglen-1)) { + r[j++]='"'; + } + } + } + r[j++]=0; + } +#else + { + // Will use hard quoting for the whole string + // and replace each singular quote found with a '\'' sequence. + rlen=arglen+3; + r=g_new(char,rlen); + r[0]='\''; + for(i=0,j=1;i0 - return code, -1 - error + */ +struct spawn_process_info* +spawn_process(char **argv) +{ + struct spawn_process_info*r=g_new(struct spawn_process_info,1); +#ifdef _POSIX_C_SOURCE + { + pid_t pid; + + sigset_t set, old; + sigemptyset(&set); + sigaddset(&set,SIGCHLD); + spawn_process_sigmask(SIG_BLOCK,&set,&old); + pid=fork(); + if(pid==0) { + execvp(argv[0], argv); + /*Shouldn't reach here*/ + exit(1); + } else if(pid>0) { + r->status=-1; + r->pid=pid; + spawn_process_children=g_list_prepend(spawn_process_children,r); + } else { + dbg(0,"fork() returned error."); + g_free(r); + r=NULL; + } + spawn_process_sigmask(SIG_SETMASK,&old,NULL); + return r; + } +#else +#ifdef HAVE_API_WIN32_BASE + { + char *cmdline; + LPCWSTR cmd,args; + DWORD dwRet; + + // For [desktop] Windows it's adviceable not to use + // first CreateProcess parameter because PATH is not used + // if it is defined. + // + // On WinCE 6.0 I was unable to launch anything + // without first CreateProcess parameter, also it seems that + // no WinCE program has support for quoted strings in arguments. + // So... +#ifdef HAVE_API_WIN32_CE + cmdline=g_strjoinv(" ",argv+1); + args=newSysString(cmdline); + cmd = newSysString(argv[0]); + dwRet=CreateProcess(cmd, args, NULL, NULL, 0, 0, NULL, NULL, NULL, &(r->pr)); + dbg(0, "CreateProcess(%s,%s), PID=%i\n",argv[0],cmdline,r->pr.dwProcessId); + g_free(cmd); +#else + STARTUPINFO startupInfo; + memset(&startupInfo, 0, sizeof(startupInfo)); + startupInfo.cb = sizeof(startupInfo); + cmdline=spawn_process_compose_cmdline(argv); + args=newSysString(cmdline); + dwRet=CreateProcess(NULL, args, NULL, NULL, 0, 0, NULL, NULL, &startupInfo, &(r->pr)); + dbg(0, "CreateProcess(%s), PID=%i\n",cmdline,r->pr.dwProcessId); +#endif + g_free(cmdline); + g_free(args); + return r; + } +#else + { + char *cmdline=spawn_process_compose_cmdline(argv); + int status; + dbg(0,"Unblocked spawn_process isn't availiable on this platform.\n"); + status=system(cmdline); + g_free(cmdline); + r->status=status; + r->pid=0; + return r; + } +#endif +#endif +} + +/** + * Check external program status + * + * @param in *pi pointer to spawn_process_info structure + * @param in block =0 do not block =1 block until child terminated + * @returns -1 - still running, >=0 program exited, + * =255 trminated abnormally or wasn't run at all. + * + */ +int spawn_process_check_status(struct spawn_process_info *pi, int block) +{ + if(pi==NULL) { + dbg(0,"Trying to get process status of NULL, assuming process is terminated.\n"); + return 255; + } +#ifdef HAVE_API_WIN32_BASE + {int failcount=0; + while(1){ + DWORD dw; + if(GetExitCodeProcess(pi->pr.hProcess,&dw)) { + if(dw!=STILL_ACTIVE) { + return dw; + break; + } + } else { + dbg(0,"GetExitCodeProcess failed. Assuming the process is terminated."); + return 255; + } + if(!block) + return -1; + + dw=WaitForSingleObject(pi->pr.hProcess,INFINITE); + if(dw==WAIT_FAILED && failcount++==1) { + dbg(0,"WaitForSingleObject failed twice. Assuming the process is terminated."); + return 0; + break; + } + } + } +#else +#ifdef _POSIX_C_SOURCE + if(pi->status!=-1) { + return pi->status; + } + while(1) { + int status; + pid_t w=waitpid(pi->pid,&status,block?0:WNOHANG); + if(w>0) { + if(WIFEXITED(status)) + pi->status=WEXITSTATUS(status); + return pi->status; + if(WIFSTOPPED(status)) { + dbg(0,"child is stopped by %i signal\n",WSTOPSIG(status)); + } else if (WIFSIGNALED(status)) { + dbg(0,"child terminated by signal %i\n",WEXITSTATUS(status)); + pi->status=255; + return 255; + } + if(!block) + return -1; + } else if(w==0) { + if(!block) + return -1; + } else { + if(pi->status!=-1) // Signal handler has changed pi->status while in this function + return pi->status; + dbg(0,"waitpid() indicated error, reporting process termination.\n"); + return 255; + } + } +#else + dbg(0, "Non-blocking spawn_process isn't availiable for this platform, repoting process exit status.\n"); + return pi->status; +#endif +#endif +} + +void spawn_process_info_free(struct spawn_process_info *pi) +{ + if(pi==NULL) + return; +#ifdef HAVE_API_WIN32_BASE + CloseHandle(pi->pr.hProcess); + CloseHandle(pi->pr.hThread); +#endif +#ifdef _POSIX_C_SOURCE + { + sigset_t set, old; + sigemptyset(&set); + sigaddset(&set,SIGCHLD); + spawn_process_sigmask(SIG_BLOCK,&set,&old); + spawn_process_children=g_list_remove(spawn_process_children,pi); + spawn_process_sigmask(SIG_SETMASK,&old,NULL); + } +#endif + g_free(pi); +} + +#ifdef _POSIX_C_SOURCE +static void spawn_process_sigchld(int sig) +{ + int status; + pid_t pid; + while ((pid=waitpid(-1, &status, WNOHANG)) > 0) { + GList *el=g_list_first(spawn_process_children); + while(el) { + struct spawn_process_info *p=el->data; + if(p->pid==pid) { + p->status=status; + } + el=g_list_next(el); + } + } +} +#endif + +void spawn_process_init() +{ +#ifdef _POSIX_C_SOURCE + struct sigaction act; + act.sa_handler=spawn_process_sigchld; + act.sa_flags=0; + sigemptyset(&act.sa_mask); + sigaction(SIGCHLD, &act, NULL); +#endif + return; +} + + diff --git a/navit/util.h b/navit/util.h new file mode 100644 index 0000000..1f8919b --- /dev/null +++ b/navit/util.h @@ -0,0 +1,58 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_types_H +#define NAVIT_types_H + +#include +#include "config.h" + +void strtoupper(char *dest, const char *src); +void strtolower(char *dest, const char *src); +GList * g_hash_to_list(GHashTable *h); +GList * g_hash_to_list_keys(GHashTable *h); +gchar * g_strconcat_printf(gchar *buffer, gchar *fmt, ...); +#if defined(_WIN32) || defined(__CEGCC__) || defined (__APPLE__) || defined(HAVE_API_ANDROID) +#if defined(_UNICODE) +wchar_t* newSysString(const char *toconvert); +#else +char * newSysString(const char *toconvert); +#endif +#endif +unsigned int iso8601_to_secs(char *iso8601); +char * current_to_iso8601(void); + +#if defined(_MSC_VER) || (!defined(HAVE_GETTIMEOFDAY) && defined(HAVE_API_WIN32_BASE)) + +#include + +int gettimeofday(struct timeval *time, void *); + +#endif + +struct spawn_process_info; +char * shell_escape(char *arg); +struct spawn_process_info* spawn_process(char **argv); +int spawn_process_check_status(struct spawn_process_info *pi,int block); + +void spawn_process_info_free(struct spawn_process_info *pi); +void spawn_process_init(void); + +#endif + diff --git a/navit/vehicle.c b/navit/vehicle.c new file mode 100644 index 0000000..4d46be7 --- /dev/null +++ b/navit/vehicle.c @@ -0,0 +1,723 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2009 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include "config.h" +#include "debug.h" +#include "coord.h" +#include "item.h" +#include "log.h" +#include "plugin.h" +#include "transform.h" +#include "util.h" +#include "event.h" +#include "coord.h" +#include "transform.h" +#include "projection.h" +#include "point.h" +#include "graphics.h" +#include "callback.h" +#include "color.h" +#include "layout.h" +#include "vehicle.h" +#include "xmlconfig.h" + +struct vehicle { + struct object_func *func; + int refcount; + struct vehicle_methods meth; + struct vehicle_priv *priv; + struct callback_list *cbl; + struct log *nmea_log, *gpx_log; + char *gpx_desc; + struct attr **attrs; + + // cursor + struct cursor *cursor; + int cursor_fixed; + struct callback *animate_callback; + struct event_timeout *animate_timer; + struct point cursor_pnt; + struct graphics *gra; + struct graphics_gc *bg; + struct transformation *trans; + int angle; + int speed; + int sequence; + GHashTable *log_to_cb; +}; + +struct object_func vehicle_func; + +static void vehicle_draw_do(struct vehicle *this_, int lazy); +static void vehicle_log_nmea(struct vehicle *this_, struct log *log); +static void vehicle_log_gpx(struct vehicle *this_, struct log *log); +static void vehicle_log_textfile(struct vehicle *this_, struct log *log); +static void vehicle_log_binfile(struct vehicle *this_, struct log *log); +static int vehicle_add_log(struct vehicle *this_, struct log *log); + + + +/** + * Creates a new vehicle + */ +struct vehicle * +vehicle_new(struct attr *parent, struct attr **attrs) +{ + struct vehicle *this_; + struct attr *source; + struct vehicle_priv *(*vehicletype_new) (struct vehicle_methods * + meth, + struct callback_list * + cbl, + struct attr ** attrs); + char *type, *colon; + struct pcoord center; + + dbg(1, "enter\n"); + source = attr_search(attrs, NULL, attr_source); + if (!source) { + dbg(0, "no source\n"); + return NULL; + } + + type = g_strdup(source->u.str); + colon = strchr(type, ':'); + if (colon) + *colon = '\0'; + dbg(1, "source='%s' type='%s'\n", source->u.str, type); + + vehicletype_new = plugin_get_vehicle_type(type); + if (!vehicletype_new) { + dbg(0, "invalid type '%s'\n", type); + g_free(type); + return NULL; + } + g_free(type); + this_ = g_new0(struct vehicle, 1); + this_->func=&vehicle_func; + this_->refcount = 1; + this_->cbl = callback_list_new(); + this_->priv = vehicletype_new(&this_->meth, this_->cbl, attrs); + if (!this_->priv) { + dbg(0, "vehicletype_new failed\n"); + callback_list_destroy(this_->cbl); + g_free(this_); + return NULL; + } + this_->attrs=attr_list_dup(attrs); + + this_->trans=transform_new(); + center.pro=projection_screen; + center.x=0; + center.y=0; + transform_setup(this_->trans, ¢er, 16, 0); + + dbg(1, "leave\n"); + this_->log_to_cb=g_hash_table_new(NULL,NULL); + return this_; +} + +/** + * Destroys a vehicle + * + * @param this_ The vehicle to destroy + */ +void +vehicle_destroy(struct vehicle *this_) +{ + if (this_->animate_callback) { + callback_destroy(this_->animate_callback); + event_remove_timeout(this_->animate_timer); + } + transform_destroy(this_->trans); + this_->meth.destroy(this_->priv); + callback_list_destroy(this_->cbl); + attr_list_free(this_->attrs); + if (this_->bg) + graphics_gc_destroy(this_->bg); + if (this_->gra) + graphics_free(this_->gra); + g_free(this_); +} + +struct vehicle * +vehicle_ref(struct vehicle *this_) +{ + this_->refcount++; + dbg(0,"refcount %d\n",this_->refcount); + return this_; +} + +void +vehicle_unref(struct vehicle *this_) +{ + if(!this_) + return; + this_->refcount--; + dbg(0,"refcount %d\n",this_->refcount); + if (this_->refcount <= 0) + vehicle_destroy(this_); +} + +/** + * Creates an attribute iterator to be used with vehicles + */ +struct attr_iter * +vehicle_attr_iter_new(void) +{ + return (struct attr_iter *)g_new0(void *,1); +} + +/** + * Destroys a vehicle attribute iterator + * + * @param iter a vehicle attr_iter + */ +void +vehicle_attr_iter_destroy(struct attr_iter *iter) +{ + g_free(iter); +} + + + +/** + * Generic get function + * + * @param this_ Pointer to a vehicle structure + * @param type The attribute type to look for + * @param attr Pointer to an attr structure to store the attribute + * @param iter A vehicle attr_iter + */ +int +vehicle_get_attr(struct vehicle *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + int ret; + if (this_->meth.position_attr_get) { + ret=this_->meth.position_attr_get(this_->priv, type, attr); + if (ret) + return ret; + } + if (type == attr_log_gpx_desc) { + attr->u.str = this_->gpx_desc; + return 1; + } + return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); +} + +/** + * Generic set function + * + * @param this_ Pointer to a vehicle structure + * @param attr Pointer to an attr structure for the attribute to be set + * @return nonzero on success, zero on failure + */ +int +vehicle_set_attr(struct vehicle *this_, struct attr *attr) +{ + int ret=1; + if (this_->meth.set_attr) + ret=this_->meth.set_attr(this_->priv, attr); + if (ret == 1 && attr->type == attr_log_gpx_desc) { + g_free(this_->gpx_desc); + this_->gpx_desc = attr->u.str; + } + if (ret == 1 && attr->type != attr_navit && attr->type != attr_pdl_gps_update) + this_->attrs=attr_generic_set_attr(this_->attrs, attr); + return ret != 0; +} + +/** + * Generic add function + * + * @param this_ A vehicle + * @param attr A struct attr + */ +int +vehicle_add_attr(struct vehicle *this_, struct attr *attr) +{ + int ret=1; + switch (attr->type) { + case attr_callback: + callback_list_add(this_->cbl, attr->u.callback); + break; + case attr_log: + ret=vehicle_add_log(this_, attr->u.log); + break; + // currently supporting oldstyle cursor config. + case attr_cursor: + this_->cursor_fixed=1; + vehicle_set_cursor(this_, attr->u.cursor, 1); + break; + default: + break; + } + if (ret) + this_->attrs=attr_generic_add_attr(this_->attrs, attr); + return ret; +} + +/** + * @brief Generic remove function. + * + * Used to remove a callback from the vehicle. + * @param this_ A vehicle + * @param attr + */ +int +vehicle_remove_attr(struct vehicle *this_, struct attr *attr) +{ + struct callback *cb; + switch (attr->type) { + case attr_callback: + callback_list_remove(this_->cbl, attr->u.callback); + break; + case attr_log: + cb=g_hash_table_lookup(this_->log_to_cb, attr->u.log); + if (!cb) + return 0; + g_hash_table_remove(this_->log_to_cb, attr->u.log); + callback_list_remove(this_->cbl, cb); + break; + default: + this_->attrs=attr_generic_remove_attr(this_->attrs, attr); + return 0; + } + return 1; +} + + + +/** + * Sets the cursor of a vehicle. + * + * @param this_ A vehicle + * @param cursor A cursor + * @author Ralph Sennhauser (10/2009) + */ +void +vehicle_set_cursor(struct vehicle *this_, struct cursor *cursor, int overwrite) +{ + struct point sc; + if (this_->cursor_fixed && !overwrite) + return; + if (this_->animate_callback) { + event_remove_timeout(this_->animate_timer); + this_->animate_timer=NULL; // dangling pointer! prevent double freeing. + callback_destroy(this_->animate_callback); + this_->animate_callback=NULL; // dangling pointer! prevent double freeing. + } + if (cursor && cursor->interval) { + this_->animate_callback=callback_new_2(callback_cast(vehicle_draw_do), this_, 0); + this_->animate_timer=event_add_timeout(cursor->interval, 1, this_->animate_callback); + } + + if (cursor && this_->gra && this_->cursor) { + this_->cursor_pnt.x+=(this_->cursor->w - cursor->w)/2; + this_->cursor_pnt.y+=(this_->cursor->h - cursor->h)/2; + graphics_overlay_resize(this_->gra, &this_->cursor_pnt, cursor->w, cursor->h, 65535, 0); + } + + if (cursor) { + sc.x=cursor->w/2; + sc.y=cursor->h/2; + if (!this_->cursor && this_->gra) + graphics_overlay_disable(this_->gra, 0); + } else { + sc.x=sc.y=0; + if (this_->cursor && this_->gra) + graphics_overlay_disable(this_->gra, 1); + } + transform_set_screen_center(this_->trans, &sc); + + this_->cursor=cursor; +} + +/** + * Draws a vehicle on top of a graphics. + * + * @param this_ The vehicle + * @param gra The graphics + * @param pnt Screen coordinates of the vehicle. + * @param lazy use lazy draw mode. + * @param angle The angle relative to the map. + * @param speed The speed of the vehicle. + */ +void +vehicle_draw(struct vehicle *this_, struct graphics *gra, struct point *pnt, int lazy, int angle, int speed) +{ + if (angle < 0) + angle+=360; + dbg(1,"enter this=%p gra=%p pnt=%p lazy=%d dir=%d speed=%d\n", this_, gra, pnt, lazy, angle, speed); + dbg(1,"point %d,%d\n", pnt->x, pnt->y); + this_->cursor_pnt=*pnt; + this_->angle=angle; + this_->speed=speed; + if (!this_->cursor) + return; + this_->cursor_pnt.x-=this_->cursor->w/2; + this_->cursor_pnt.y-=this_->cursor->h/2; + if (!this_->gra) { + struct color c; + this_->gra=graphics_overlay_new(gra, &this_->cursor_pnt, this_->cursor->w, this_->cursor->h, 65535, 0); + if (this_->gra) { + this_->bg=graphics_gc_new(this_->gra); + c.r=0; c.g=0; c.b=0; c.a=0; + graphics_gc_set_foreground(this_->bg, &c); + graphics_background_gc(this_->gra, this_->bg); + } + } + vehicle_draw_do(this_, lazy); +} + +int +vehicle_get_cursor_data(struct vehicle *this, struct point *pnt, int *angle, int *speed) +{ + *pnt=this->cursor_pnt; + *angle=this->angle; + *speed=this->speed; + return 1; +} + + +static void +vehicle_draw_do(struct vehicle *this_, int lazy) +{ + struct point p; + struct cursor *cursor=this_->cursor; + int speed=this_->speed; + int angle=this_->angle; + int sequence=this_->sequence; + struct attr **attr; + char *label=NULL; + int match=0; + + if (!this_->cursor || !this_->cursor->attrs || !this_->gra) + return; + + attr=this_->attrs; + while (attr && *attr) { + if ((*attr)->type == attr_name) + label=(*attr)->u.str; + attr++; + } + transform_set_yaw(this_->trans, -this_->angle); + graphics_draw_mode(this_->gra, draw_mode_begin); + p.x=0; + p.y=0; + graphics_draw_rectangle(this_->gra, this_->bg, &p, cursor->w, cursor->h); + attr=cursor->attrs; + while (*attr) { + if ((*attr)->type == attr_itemgra) { + struct itemgra *itm=(*attr)->u.itemgra; + dbg(1,"speed %d-%d %d\n", itm->speed_range.min, itm->speed_range.max, speed); + if (speed >= itm->speed_range.min && speed <= itm->speed_range.max && + angle >= itm->angle_range.min && angle <= itm->angle_range.max && + sequence >= itm->sequence_range.min && sequence <= itm->sequence_range.max) { + graphics_draw_itemgra(this_->gra, itm, this_->trans, label); + } + if (sequence < itm->sequence_range.max) + match=1; + } + ++attr; + } + graphics_draw_drag(this_->gra, &this_->cursor_pnt); + graphics_draw_mode(this_->gra, lazy ? draw_mode_end_lazy : draw_mode_end); + if (this_->animate_callback) { + ++this_->sequence; + if (cursor->sequence_range && cursor->sequence_range->max < this_->sequence) + this_->sequence=cursor->sequence_range->min; + if (! match && ! cursor->sequence_range) + this_->sequence=0; + } +} + +/** + * Writes to an NMEA log. + * + * @param this_ Pointer to the vehicle structure of the data source + * @param log Pointer to a log structure for the log file + */ +static void +vehicle_log_nmea(struct vehicle *this_, struct log *log) +{ + struct attr pos_attr; + if (!this_->meth.position_attr_get) + return; + if (!this_->meth.position_attr_get(this_->priv, attr_position_nmea, &pos_attr)) + return; + log_write(log, pos_attr.u.str, strlen(pos_attr.u.str), 0); +} + +void +vehicle_log_gpx_add_tag(char *tag, char **logstr) +{ + char *ext_start="\t\n"; + char *ext_end="\t\n"; + char *trkpt_end=""; + char *start=NULL,*end=NULL; + if (!*logstr) { + start=g_strdup(ext_start); + end=g_strdup(ext_end); + } else { + char *str=strstr(*logstr, ext_start); + int len; + if (str) { + len=str-*logstr+strlen(ext_start); + start=g_strdup(*logstr); + start[len]='\0'; + end=g_strdup(str+strlen(ext_start)); + } else { + str=strstr(*logstr, trkpt_end); + len=str-*logstr; + end=g_strdup_printf("%s%s",ext_end,str); + str=g_strdup(*logstr); + str[len]='\0'; + start=g_strdup_printf("%s%s",str,ext_start); + g_free(str); + } + } + *logstr=g_strdup_printf("%s%s%s",start,tag,end); + g_free(start); + g_free(end); +} + +/** + * Writes to a GPX log. + * + * @param this_ Pointer to the vehicle structure of the data source + * @param log Pointer to a log structure for the log file + */ +static void +vehicle_log_gpx(struct vehicle *this_, struct log *log) +{ + struct attr attr,*attrp, fix_attr; + enum attr_type *attr_types; + char *logstr; + char *extensions="\t\n"; + + if (!this_->meth.position_attr_get) + return; + if (log_get_attr(log, attr_attr_types, &attr, NULL)) + attr_types=attr.u.attr_types; + else + attr_types=NULL; + if (this_->meth.position_attr_get(this_->priv, attr_position_fix_type, &fix_attr)) { + if ( fix_attr.u.num == 0 ) + return; + } + if (!this_->meth.position_attr_get(this_->priv, attr_position_coord_geo, &attr)) + return; + logstr=g_strdup_printf("\n",attr.u.coord_geo->lat,attr.u.coord_geo->lng); + if (attr_types && attr_types_contains_default(attr_types, attr_position_time_iso8601, 0)) { + if (this_->meth.position_attr_get(this_->priv, attr_position_time_iso8601, &attr)) { + logstr=g_strconcat_printf(logstr,"\t\n",attr.u.str); + } else { + char *timep = current_to_iso8601(); + logstr=g_strconcat_printf(logstr,"\t\n",timep); + g_free(timep); + } + } + if (this_->gpx_desc) { + logstr=g_strconcat_printf(logstr,"\t%s\n",this_->gpx_desc); + g_free(this_->gpx_desc); + this_->gpx_desc = NULL; + } + if (attr_types_contains_default(attr_types, attr_position_height,0) && this_->meth.position_attr_get(this_->priv, attr_position_height, &attr)) + logstr=g_strconcat_printf(logstr,"\t%.6f\n",*attr.u.numd); + // magnetic variation in degrees; we might use position_magnetic_direction and position_direction to figure it out + // Height (in meters) of geoid (mean sea level) above WGS84 earth ellipsoid. As defined in NMEA GGA message (field 11, which vehicle_wince.c ignores) + // GPS name (arbitrary) + // comment + // Source of data + // Link to additional information (URL) + // Text of GPS symbol name + // Type (classification) + // Type of GPS fix {'none'|'2d'|'3d'|'dgps'|'pps'}, leave out if unknown. Similar to position_fix_type but more detailed. + if (attr_types_contains_default(attr_types, attr_position_sats_used,0) && this_->meth.position_attr_get(this_->priv, attr_position_sats_used, &attr)) + logstr=g_strconcat_printf(logstr,"\t%d\n",attr.u.num); + if (attr_types_contains_default(attr_types, attr_position_hdop,0) && this_->meth.position_attr_get(this_->priv, attr_position_hdop, &attr)) + logstr=g_strconcat_printf(logstr,"\t%.6f\n",*attr.u.numd); + // , Vertical and position dilution of precision, no corresponding attribute + if (attr_types_contains_default(attr_types, attr_position_direction,0) && this_->meth.position_attr_get(this_->priv, attr_position_direction, &attr)) + logstr=g_strconcat_printf(logstr,"\t%.1f\n",*attr.u.numd); + if (attr_types_contains_default(attr_types, attr_position_speed, 0) && this_->meth.position_attr_get(this_->priv, attr_position_speed, &attr)) + logstr=g_strconcat_printf(logstr,"\t%.2f\n",(*attr.u.numd / 3.6)); + if (attr_types_contains_default(attr_types, attr_profilename, 0) && (attrp=attr_search(this_->attrs, NULL, attr_profilename))) { + logstr=g_strconcat_printf(logstr,"%s\t\t%s\n",extensions,attrp->u.str); + extensions=""; + } + if (attr_types_contains_default(attr_types, attr_position_radius, 0) && this_->meth.position_attr_get(this_->priv, attr_position_radius, &attr)) { + logstr=g_strconcat_printf(logstr,"%s\t\t%.2f\n",extensions,*attr.u.numd); + extensions=""; + } + if (!strcmp(extensions,"")) { + logstr=g_strconcat_printf(logstr,"\t\n"); + } + logstr=g_strconcat_printf(logstr,"\n"); + callback_list_call_attr_1(this_->cbl, attr_log_gpx, &logstr); + log_write(log, logstr, strlen(logstr), 0); + g_free(logstr); +} + +/** + * Writes to a text log. + * + * @param this_ Pointer to the vehicle structure of the data source + * @param log Pointer to a log structure for the log file + */ +static void +vehicle_log_textfile(struct vehicle *this_, struct log *log) +{ + struct attr pos_attr,fix_attr; + char *logstr; + if (!this_->meth.position_attr_get) + return; + if (this_->meth.position_attr_get(this_->priv, attr_position_fix_type, &fix_attr)) { + if (fix_attr.u.num == 0) + return; + } + if (!this_->meth.position_attr_get(this_->priv, attr_position_coord_geo, &pos_attr)) + return; + logstr=g_strdup_printf("%f %f type=trackpoint\n", pos_attr.u.coord_geo->lng, pos_attr.u.coord_geo->lat); + callback_list_call_attr_1(this_->cbl, attr_log_textfile, &logstr); + log_write(log, logstr, strlen(logstr), 0); +} + +/** + * Writes to a binary log. + * + * @param this_ Pointer to the vehicle structure of the data source + * @param log Pointer to a log structure for the log file + */ +static void +vehicle_log_binfile(struct vehicle *this_, struct log *log) +{ + struct attr pos_attr, fix_attr; + int *buffer; + int *buffer_new; + int len,limit=1024,done=0,radius=25; + struct coord c; + enum log_flags flags; + + if (!this_->meth.position_attr_get) + return; + if (this_->meth.position_attr_get(this_->priv, attr_position_fix_type, &fix_attr)) { + if (fix_attr.u.num == 0) + return; + } + if (!this_->meth.position_attr_get(this_->priv, attr_position_coord_geo, &pos_attr)) + return; + transform_from_geo(projection_mg, pos_attr.u.coord_geo, &c); + if (!c.x || !c.y) + return; + while (!done) { + buffer=log_get_buffer(log, &len); + if (! buffer || !len) { + buffer_new=g_malloc(5*sizeof(int)); + buffer_new[0]=2; + buffer_new[1]=type_track; + buffer_new[2]=0; + } else { + buffer_new=g_malloc((buffer[0]+3)*sizeof(int)); + memcpy(buffer_new, buffer, (buffer[0]+1)*sizeof(int)); + } + dbg(1,"c=0x%x,0x%x\n",c.x,c.y); + buffer_new[buffer_new[0]+1]=c.x; + buffer_new[buffer_new[0]+2]=c.y; + buffer_new[0]+=2; + buffer_new[2]+=2; + if (buffer_new[2] > limit) { + int count=buffer_new[2]/2; + struct coord *out=g_alloca(sizeof(struct coord)*(count)); + struct coord *in=(struct coord *)(buffer_new+3); + int count_out=transform_douglas_peucker(in, count, radius, out); + memcpy(in, out, count_out*2*sizeof(int)); + buffer_new[0]+=(count_out-count)*2; + buffer_new[2]+=(count_out-count)*2; + flags=log_flag_replace_buffer|log_flag_force_flush|log_flag_truncate; + } else { + flags=log_flag_replace_buffer|log_flag_keep_pointer|log_flag_keep_buffer|log_flag_force_flush; + done=1; + } + log_write(log, (char *)buffer_new, (buffer_new[0]+1)*sizeof(int), flags); + } +} + +/** + * Register a new log to receive data. + * + * @param this_ Pointer to the vehicle structure of the data source + * @param log Pointer to a log structure for the log file + */ +static int +vehicle_add_log(struct vehicle *this_, struct log *log) +{ + struct callback *cb; + struct attr type_attr; + if (!log_get_attr(log, attr_type, &type_attr, NULL)) + return 1; + + if (!strcmp(type_attr.u.str, "nmea")) { + cb=callback_new_attr_2(callback_cast(vehicle_log_nmea), attr_position_coord_geo, this_, log); + } else if (!strcmp(type_attr.u.str, "gpx")) { + char *header = "\n" + "\n" + "\n" + "\n"; + char *trailer = "\n\n\n"; + log_set_header(log, header, strlen(header)); + log_set_trailer(log, trailer, strlen(trailer)); + cb=callback_new_attr_2(callback_cast(vehicle_log_gpx), attr_position_coord_geo, this_, log); + } else if (!strcmp(type_attr.u.str, "textfile")) { + char *header = "type=track\n"; + log_set_header(log, header, strlen(header)); + cb=callback_new_attr_2(callback_cast(vehicle_log_textfile), attr_position_coord_geo, this_, log); + } else if (!strcmp(type_attr.u.str, "binfile")) { + cb=callback_new_attr_2(callback_cast(vehicle_log_binfile), attr_position_coord_geo, this_, log); + } else + return 1; + g_hash_table_insert(this_->log_to_cb, log, cb); + callback_list_add(this_->cbl, cb); + return 0; +} + +struct object_func vehicle_func = { + attr_vehicle, + (object_func_new)vehicle_new, + (object_func_get_attr)vehicle_get_attr, + (object_func_iter_new)vehicle_attr_iter_new, + (object_func_iter_destroy)vehicle_attr_iter_destroy, + (object_func_set_attr)vehicle_set_attr, + (object_func_add_attr)vehicle_add_attr, + (object_func_remove_attr)vehicle_remove_attr, + (object_func_init)NULL, + (object_func_destroy)vehicle_destroy, + (object_func_dup)NULL, + (object_func_ref)vehicle_ref, + (object_func_unref)vehicle_unref, +}; diff --git a/navit/vehicle.h b/navit/vehicle.h new file mode 100644 index 0000000..d2a52a4 --- /dev/null +++ b/navit/vehicle.h @@ -0,0 +1,63 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2009 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_VEHICLE_H +#define NAVIT_VEHICLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +struct point; +struct vehicle_priv; + +struct vehicle_methods { + void (*destroy)(struct vehicle_priv *priv); + int (*position_attr_get)(struct vehicle_priv *priv, enum attr_type type, struct attr *attr); + int (*set_attr)(struct vehicle_priv *priv, struct attr *attr); +}; + +/* prototypes */ +enum attr_type; +struct attr; +struct attr_iter; +struct cursor; +struct graphics; +struct point; +struct vehicle; +struct vehicle *vehicle_new(struct attr *parent, struct attr **attrs); +void vehicle_destroy(struct vehicle *this_); +struct attr_iter *vehicle_attr_iter_new(void); +void vehicle_attr_iter_destroy(struct attr_iter *iter); +int vehicle_get_attr(struct vehicle *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); +int vehicle_set_attr(struct vehicle *this_, struct attr *attr); +int vehicle_add_attr(struct vehicle *this_, struct attr *attr); +int vehicle_remove_attr(struct vehicle *this_, struct attr *attr); +void vehicle_set_cursor(struct vehicle *this_, struct cursor *cursor, int overwrite); +void vehicle_draw(struct vehicle *this_, struct graphics *gra, struct point *pnt, int lazy, int angle, int speed); +int vehicle_get_cursor_data(struct vehicle *this_, struct point *pnt, int *angle, int *speed); +void vehicle_log_gpx_add_tag(char *tag, char **logstr); +/* end of prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/navit/vehicle/Makefile.am b/navit/vehicle/Makefile.am new file mode 100644 index 0000000..80fc84d --- /dev/null +++ b/navit/vehicle/Makefile.am @@ -0,0 +1,34 @@ +SUBDIRS= +if VEHICLE_MAEMO + SUBDIRS += maemo +endif +if VEHICLE_ANDROID + SUBDIRS += android +endif +if VEHICLE_IPHONE + SUBDIRS += iphone +endif +if VEHICLE_DEMO + SUBDIRS += demo +endif +if VEHICLE_FILE + SUBDIRS += file +endif +if VEHICLE_GPSD + SUBDIRS += gpsd +endif +if VEHICLE_GPSD_DBUS + SUBDIRS += gpsd_dbus +endif +if VEHICLE_GYPSY + SUBDIRS += gypsy +endif +if VEHICLE_NULL + SUBDIRS += null +endif +if VEHICLE_WINCE + SUBDIRS += wince +endif +if VEHICLE_WEBOS + SUBDIRS += webos +endif diff --git a/navit/vehicle/Makefile.in b/navit/vehicle/Makefile.in new file mode 100644 index 0000000..c6b870e --- /dev/null +++ b/navit/vehicle/Makefile.in @@ -0,0 +1,723 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@VEHICLE_MAEMO_TRUE@am__append_1 = maemo +@VEHICLE_ANDROID_TRUE@am__append_2 = android +@VEHICLE_IPHONE_TRUE@am__append_3 = iphone +@VEHICLE_DEMO_TRUE@am__append_4 = demo +@VEHICLE_FILE_TRUE@am__append_5 = file +@VEHICLE_GPSD_TRUE@am__append_6 = gpsd +@VEHICLE_GPSD_DBUS_TRUE@am__append_7 = gpsd_dbus +@VEHICLE_GYPSY_TRUE@am__append_8 = gypsy +@VEHICLE_NULL_TRUE@am__append_9 = null +@VEHICLE_WINCE_TRUE@am__append_10 = wince +@VEHICLE_WEBOS_TRUE@am__append_11 = webos +subdir = navit/vehicle +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = maemo android iphone demo file gpsd gpsd_dbus gypsy \ + null wince webos +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = $(am__append_1) $(am__append_2) $(am__append_3) \ + $(am__append_4) $(am__append_5) $(am__append_6) \ + $(am__append_7) $(am__append_8) $(am__append_9) \ + $(am__append_10) $(am__append_11) +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/vehicle/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/vehicle/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/vehicle/android/Makefile.am b/navit/vehicle/android/Makefile.am new file mode 100644 index 0000000..7f7799a --- /dev/null +++ b/navit/vehicle/android/Makefile.am @@ -0,0 +1,5 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_android +modulevehicle_LTLIBRARIES = libvehicle_android.la +libvehicle_android_la_SOURCES = vehicle_android.c +libvehicle_android_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ diff --git a/navit/vehicle/android/Makefile.in b/navit/vehicle/android/Makefile.in new file mode 100644 index 0000000..22a7c6b --- /dev/null +++ b/navit/vehicle/android/Makefile.in @@ -0,0 +1,690 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/vehicle/android +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulevehicledir)" +LTLIBRARIES = $(modulevehicle_LTLIBRARIES) +libvehicle_android_la_LIBADD = +am_libvehicle_android_la_OBJECTS = vehicle_android.lo +libvehicle_android_la_OBJECTS = $(am_libvehicle_android_la_OBJECTS) +libvehicle_android_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libvehicle_android_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libvehicle_android_la_SOURCES) +DIST_SOURCES = $(libvehicle_android_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_android +modulevehicle_LTLIBRARIES = libvehicle_android.la +libvehicle_android_la_SOURCES = vehicle_android.c +libvehicle_android_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/vehicle/android/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/vehicle/android/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulevehicleLTLIBRARIES: $(modulevehicle_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulevehicledir)" || $(MKDIR_P) "$(DESTDIR)$(modulevehicledir)" + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulevehicledir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulevehicledir)"; \ + } + +uninstall-modulevehicleLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulevehicledir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulevehicledir)/$$f"; \ + done + +clean-modulevehicleLTLIBRARIES: + -test -z "$(modulevehicle_LTLIBRARIES)" || rm -f $(modulevehicle_LTLIBRARIES) + @list='$(modulevehicle_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libvehicle_android.la: $(libvehicle_android_la_OBJECTS) $(libvehicle_android_la_DEPENDENCIES) + $(libvehicle_android_la_LINK) -rpath $(modulevehicledir) $(libvehicle_android_la_OBJECTS) $(libvehicle_android_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vehicle_android.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulevehicledir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulevehicleLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulevehicleLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulevehicleLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulevehicleLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-modulevehicleLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulevehicleLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/vehicle/android/vehicle_android.c b/navit/vehicle/android/vehicle_android.c new file mode 100644 index 0000000..15f93a8 --- /dev/null +++ b/navit/vehicle/android/vehicle_android.c @@ -0,0 +1,229 @@ +/** @file vehicle_android.c + * @brief android uses dbus signals + * + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + * + * @Author Tim Niemeyer + * @date 2008-2009 + */ + +#include +#include +#include +#include +#include +#include "debug.h" +#include "callback.h" +#include "plugin.h" +#include "coord.h" +#include "item.h" +#include "android.h" +#include "vehicle.h" + +struct vehicle_priv { + struct callback_list *cbl; + struct coord_geo geo; + double speed; + double direction; + double height; + double radius; + int fix_type; + time_t fix_time; + char fixiso8601[128]; + int sats; + int sats_used; + int have_coords; + struct attr ** attrs; + struct callback *cb; + jclass NavitVehicleClass; + jobject NavitVehicle; + jclass LocationClass; + jmethodID Location_getLatitude, Location_getLongitude, Location_getSpeed, Location_getBearing, Location_getAltitude, Location_getTime, Location_getAccuracy; +}; + +/** + * @brief Free the android_vehicle + * + * @param priv + * @returns nothing + */ +static void +vehicle_android_destroy(struct vehicle_priv *priv) +{ + dbg(0,"enter\n"); + g_free(priv); +} + +/** + * @brief Provide the outside with information + * + * @param priv + * @param type TODO: What can this be? + * @param attr + * @returns true/false + */ +static int +vehicle_android_position_attr_get(struct vehicle_priv *priv, + enum attr_type type, struct attr *attr) +{ + dbg(1,"enter %s\n",attr_to_name(type)); + switch (type) { +#if 0 + case attr_position_fix_type: + attr->u.num = priv->fix_type; + break; +#endif + case attr_position_height: + attr->u.numd = &priv->height; + break; + case attr_position_speed: + attr->u.numd = &priv->speed; + break; + case attr_position_direction: + attr->u.numd = &priv->direction; + break; + case attr_position_radius: + attr->u.numd = &priv->radius; + break; + +#if 0 + case attr_position_qual: + attr->u.num = priv->sats; + break; + case attr_position_sats_used: + attr->u.num = priv->sats_used; + break; +#endif + case attr_position_coord_geo: + attr->u.coord_geo = &priv->geo; + if (!priv->have_coords) + return 0; + break; + case attr_position_time_iso8601: + attr->u.str=priv->fixiso8601; + break; + default: + return 0; + } + dbg(1,"ok\n"); + attr->type = type; + return 1; +} + +struct vehicle_methods vehicle_android_methods = { + vehicle_android_destroy, + vehicle_android_position_attr_get, +}; + +static void +vehicle_android_callback(struct vehicle_priv *v, jobject location) +{ + time_t tnow; + struct tm *tm; + dbg(1,"enter\n"); + + v->geo.lat = (*jnienv)->CallDoubleMethod(jnienv, location, v->Location_getLatitude); + v->geo.lng = (*jnienv)->CallDoubleMethod(jnienv, location, v->Location_getLongitude); + v->speed = (*jnienv)->CallFloatMethod(jnienv, location, v->Location_getSpeed)*3.6; + v->direction = (*jnienv)->CallFloatMethod(jnienv, location, v->Location_getBearing); + v->height = (*jnienv)->CallDoubleMethod(jnienv, location, v->Location_getAltitude); + v->radius = (*jnienv)->CallFloatMethod(jnienv, location, v->Location_getAccuracy); + tnow=(*jnienv)->CallLongMethod(jnienv, location, v->Location_getTime)/1000; + tm = gmtime(&tnow); + strftime(v->fixiso8601, sizeof(v->fixiso8601), "%Y-%m-%dT%TZ", tm); + dbg(1,"lat %f lon %f time %s\n",v->geo.lat,v->geo.lng,v->fixiso8601); + v->have_coords=1; + callback_list_call_attr_0(v->cbl, attr_position_coord_geo); +} + +static int +vehicle_android_init(struct vehicle_priv *ret) +{ + jmethodID cid; + + if (!android_find_class_global("android/location/Location", &ret->LocationClass)) + return 0; + if (!android_find_method(ret->LocationClass, "getLatitude", "()D", &ret->Location_getLatitude)) + return 0; + if (!android_find_method(ret->LocationClass, "getLongitude", "()D", &ret->Location_getLongitude)) + return 0; + if (!android_find_method(ret->LocationClass, "getSpeed", "()F", &ret->Location_getSpeed)) + return 0; + if (!android_find_method(ret->LocationClass, "getBearing", "()F", &ret->Location_getBearing)) + return 0; + if (!android_find_method(ret->LocationClass, "getAltitude", "()D", &ret->Location_getAltitude)) + return 0; + if (!android_find_method(ret->LocationClass, "getTime", "()J", &ret->Location_getTime)) + return 0; + if (!android_find_method(ret->LocationClass, "getAccuracy", "()F", &ret->Location_getAccuracy)) + return 0; + if (!android_find_class_global("org/navitproject/navit/NavitVehicle", &ret->NavitVehicleClass)) + return 0; + dbg(0,"at 3\n"); + cid = (*jnienv)->GetMethodID(jnienv, ret->NavitVehicleClass, "", "(Landroid/content/Context;I)V"); + if (cid == NULL) { + dbg(0,"no method found\n"); + return 0; /* exception thrown */ + } + dbg(0,"at 4 android_activity=%p\n",android_activity); + ret->NavitVehicle=(*jnienv)->NewObject(jnienv, ret->NavitVehicleClass, cid, android_activity, (int) ret->cb); + dbg(0,"result=%p\n",ret->NavitVehicle); + if (!ret->NavitVehicle) + return 0; + if (ret->NavitVehicle) + (*jnienv)->NewGlobalRef(jnienv, ret->NavitVehicle); + + return 1; +} + +/** + * @brief Create android_vehicle + * + * @param meth + * @param cbl + * @param attrs + * @returns vehicle_priv + */ +static struct vehicle_priv * +vehicle_android_new_android(struct vehicle_methods *meth, + struct callback_list *cbl, + struct attr **attrs) +{ + struct vehicle_priv *ret; + + dbg(0, "enter\n"); + ret = g_new0(struct vehicle_priv, 1); + ret->cbl = cbl; + ret->cb=callback_new_1(callback_cast(vehicle_android_callback), ret); + *meth = vehicle_android_methods; + vehicle_android_init(ret); + dbg(0, "return\n"); + return ret; +} + +/** + * @brief register vehicle_android + * + * @returns nothing + */ +void +plugin_init(void) +{ + dbg(0, "enter\n"); + plugin_register_vehicle_type("android", vehicle_android_new_android); +} diff --git a/navit/vehicle/demo/Makefile.am b/navit/vehicle/demo/Makefile.am new file mode 100644 index 0000000..5662119 --- /dev/null +++ b/navit/vehicle/demo/Makefile.am @@ -0,0 +1,9 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_demo +if PLUGINS +modulevehicle_LTLIBRARIES = libvehicle_demo.la +else +noinst_LTLIBRARIES = libvehicle_demo.la +endif +libvehicle_demo_la_SOURCES = vehicle_demo.c +libvehicle_demo_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ diff --git a/navit/vehicle/demo/Makefile.in b/navit/vehicle/demo/Makefile.in new file mode 100644 index 0000000..8719304 --- /dev/null +++ b/navit/vehicle/demo/Makefile.in @@ -0,0 +1,703 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/vehicle/demo +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulevehicledir)" +LTLIBRARIES = $(modulevehicle_LTLIBRARIES) $(noinst_LTLIBRARIES) +libvehicle_demo_la_LIBADD = +am_libvehicle_demo_la_OBJECTS = vehicle_demo.lo +libvehicle_demo_la_OBJECTS = $(am_libvehicle_demo_la_OBJECTS) +libvehicle_demo_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libvehicle_demo_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libvehicle_demo_la_rpath = +@PLUGINS_TRUE@am_libvehicle_demo_la_rpath = -rpath $(modulevehicledir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libvehicle_demo_la_SOURCES) +DIST_SOURCES = $(libvehicle_demo_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_demo +@PLUGINS_TRUE@modulevehicle_LTLIBRARIES = libvehicle_demo.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libvehicle_demo.la +libvehicle_demo_la_SOURCES = vehicle_demo.c +libvehicle_demo_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/vehicle/demo/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/vehicle/demo/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulevehicleLTLIBRARIES: $(modulevehicle_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulevehicledir)" || $(MKDIR_P) "$(DESTDIR)$(modulevehicledir)" + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulevehicledir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulevehicledir)"; \ + } + +uninstall-modulevehicleLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulevehicledir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulevehicledir)/$$f"; \ + done + +clean-modulevehicleLTLIBRARIES: + -test -z "$(modulevehicle_LTLIBRARIES)" || rm -f $(modulevehicle_LTLIBRARIES) + @list='$(modulevehicle_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libvehicle_demo.la: $(libvehicle_demo_la_OBJECTS) $(libvehicle_demo_la_DEPENDENCIES) + $(libvehicle_demo_la_LINK) $(am_libvehicle_demo_la_rpath) $(libvehicle_demo_la_OBJECTS) $(libvehicle_demo_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vehicle_demo.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulevehicledir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulevehicleLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulevehicleLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulevehicleLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulevehicleLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-modulevehicleLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulevehicleLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/vehicle/demo/vehicle_demo.c b/navit/vehicle/demo/vehicle_demo.c new file mode 100644 index 0000000..d5551f4 --- /dev/null +++ b/navit/vehicle/demo/vehicle_demo.c @@ -0,0 +1,235 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "config.h" +#include "debug.h" +#include "coord.h" +#include "item.h" +#include "navit.h" +#include "map.h" +#include "route.h" +#include "callback.h" +#include "transform.h" +#include "plugin.h" +#include "vehicle.h" +#include "event.h" +#include "util.h" + +struct vehicle_priv { + int interval; + int position_set; + struct callback_list *cbl; + struct navit *navit; + struct route *route; + struct coord_geo geo; + struct coord last; + double config_speed; + double speed; + double direction; + struct callback *timer_callback; + struct event_timeout *timer; + char *timep; + +}; + +static void +vehicle_demo_destroy(struct vehicle_priv *priv) +{ + if (priv->timer) + event_remove_timeout(priv->timer); + callback_destroy(priv->timer_callback); + g_free(priv->timep); + g_free(priv); +} + +static int +vehicle_demo_position_attr_get(struct vehicle_priv *priv, + enum attr_type type, struct attr *attr) +{ + switch (type) { + case attr_position_speed: + attr->u.numd = &priv->speed; + break; + case attr_position_direction: + attr->u.numd = &priv->direction; + break; + case attr_position_coord_geo: + attr->u.coord_geo = &priv->geo; + break; + case attr_position_time_iso8601: + g_free(priv->timep); + priv->timep=current_to_iso8601(); + attr->u.str=priv->timep; + break; + default: + return 0; + } + attr->type = type; + return 1; +} + +static int +vehicle_demo_set_attr_do(struct vehicle_priv *priv, struct attr *attr) +{ + switch(attr->type) { + case attr_navit: + priv->navit = attr->u.navit; + break; + case attr_route: + priv->route = attr->u.route; + break; + case attr_speed: + priv->config_speed=attr->u.num; + break; + case attr_interval: + priv->interval=attr->u.num; + if (priv->timer) + event_remove_timeout(priv->timer); + priv->timer=event_add_timeout(priv->interval, 1, priv->timer_callback); + break; + case attr_position_coord_geo: + priv->geo=*(attr->u.coord_geo); + priv->position_set=1; + dbg(0,"position_set %f %f\n", priv->geo.lat, priv->geo.lng); + break; + default: + dbg(0,"unsupported attribute %s\n",attr_to_name(attr->type)); + return 0; + } + return 1; +} + +static int +vehicle_demo_set_attr(struct vehicle_priv *priv, struct attr *attr) +{ + return vehicle_demo_set_attr_do(priv, attr); +} + +struct vehicle_methods vehicle_demo_methods = { + vehicle_demo_destroy, + vehicle_demo_position_attr_get, + vehicle_demo_set_attr, +}; + +static void +vehicle_demo_timer(struct vehicle_priv *priv) +{ + struct coord c, c2, pos, ci; + int slen, len, dx, dy; + struct route *route=NULL; + struct map *route_map=NULL; + struct map_rect *mr=NULL; + struct item *item=NULL; + + len = (priv->config_speed * priv->interval / 1000)/ 3.6; + dbg(1, "###### Entering simulation loop\n"); + if (!priv->config_speed) + return; + if (priv->route) + route=priv->route; + else if (priv->navit) + route=navit_get_route(priv->navit); + if (route) + route_map=route_get_map(route); + if (route_map) + mr=map_rect_new(route_map, NULL); + if (mr) + item=map_rect_get_item(mr); + if (item && item->type == type_route_start) + item=map_rect_get_item(mr); + if (item && item_coord_get(item, &pos, 1)) { + priv->position_set=0; + dbg(1, "current pos=0x%x,0x%x\n", pos.x, pos.y); + dbg(1, "last pos=0x%x,0x%x\n", priv->last.x, priv->last.y); + if (priv->last.x == pos.x && priv->last.y == pos.y) { + dbg(1, "endless loop\n"); + } + priv->last = pos; + while (item && priv->config_speed) { + if (!item_coord_get(item, &c, 1)) { + item=map_rect_get_item(mr); + continue; + } + dbg(1, "next pos=0x%x,0x%x\n", c.x, c.y); + slen = transform_distance(projection_mg, &pos, &c); + dbg(1, "len=%d slen=%d\n", len, slen); + if (slen < len) { + len -= slen; + pos = c; + } else { + if (item_coord_get(item, &c2, 1) || map_rect_get_item(mr)) { + dx = c.x - pos.x; + dy = c.y - pos.y; + ci.x = pos.x + dx * len / slen; + ci.y = pos.y + dy * len / slen; + priv->direction = + transform_get_angle_delta(&pos, &c, 0); + priv->speed=priv->config_speed; + } else { + ci.x = pos.x; + ci.y = pos.y; + priv->speed=0; + dbg(0,"destination reached\n"); + } + dbg(1, "ci=0x%x,0x%x\n", ci.x, ci.y); + transform_to_geo(projection_mg, &ci, + &priv->geo); + callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); + break; + } + } + } else { + if (priv->position_set) + callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); + } + if (mr) + map_rect_destroy(mr); +} + + + +static struct vehicle_priv * +vehicle_demo_new(struct vehicle_methods + *meth, struct callback_list + *cbl, struct attr **attrs) +{ + struct vehicle_priv *ret; + + dbg(1, "enter\n"); + ret = g_new0(struct vehicle_priv, 1); + ret->cbl = cbl; + ret->interval=1000; + ret->config_speed=40; + ret->timer_callback=callback_new_1(callback_cast(vehicle_demo_timer), ret); + *meth = vehicle_demo_methods; + while (attrs && *attrs) + vehicle_demo_set_attr_do(ret, *attrs++); + if (!ret->timer) + ret->timer=event_add_timeout(ret->interval, 1, ret->timer_callback); + return ret; +} + +void +plugin_init(void) +{ + dbg(1, "enter\n"); + plugin_register_vehicle_type("demo", vehicle_demo_new); +} diff --git a/navit/vehicle/file/Makefile.am b/navit/vehicle/file/Makefile.am new file mode 100644 index 0000000..ce3a45b --- /dev/null +++ b/navit/vehicle/file/Makefile.am @@ -0,0 +1,15 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit +modulevehicle_LTLIBRARIES = libvehicle_file.la libvehicle_pipe.la libvehicle_socket.la libvehicle_serial.la +libvehicle_file_la_CFLAGS=-DMODULE=vehicle_file +libvehicle_file_la_SOURCES = vehicle_file.c +libvehicle_file_la_LDFLAGS = -module -avoid-version @NAVIT_SOCKET_LDFLAGS@ @NAVIT_MODULE_LDFLAGS@ +libvehicle_pipe_la_CFLAGS=-DMODULE=vehicle_pipe +libvehicle_pipe_la_SOURCES = vehicle_pipe.c +libvehicle_pipe_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +libvehicle_socket_la_CFLAGS=-DMODULE=vehicle_socket +libvehicle_socket_la_SOURCES = vehicle_socket.c +libvehicle_socket_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +libvehicle_serial_la_CFLAGS=-DMODULE=vehicle_serial +libvehicle_serial_la_SOURCES = vehicle_serial.c +libvehicle_serial_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ diff --git a/navit/vehicle/file/Makefile.in b/navit/vehicle/file/Makefile.in new file mode 100644 index 0000000..59c8147 --- /dev/null +++ b/navit/vehicle/file/Makefile.in @@ -0,0 +1,765 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/vehicle/file +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulevehicledir)" +LTLIBRARIES = $(modulevehicle_LTLIBRARIES) +libvehicle_file_la_LIBADD = +am_libvehicle_file_la_OBJECTS = libvehicle_file_la-vehicle_file.lo +libvehicle_file_la_OBJECTS = $(am_libvehicle_file_la_OBJECTS) +libvehicle_file_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libvehicle_file_la_CFLAGS) $(CFLAGS) \ + $(libvehicle_file_la_LDFLAGS) $(LDFLAGS) -o $@ +libvehicle_pipe_la_LIBADD = +am_libvehicle_pipe_la_OBJECTS = libvehicle_pipe_la-vehicle_pipe.lo +libvehicle_pipe_la_OBJECTS = $(am_libvehicle_pipe_la_OBJECTS) +libvehicle_pipe_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libvehicle_pipe_la_CFLAGS) $(CFLAGS) \ + $(libvehicle_pipe_la_LDFLAGS) $(LDFLAGS) -o $@ +libvehicle_serial_la_LIBADD = +am_libvehicle_serial_la_OBJECTS = \ + libvehicle_serial_la-vehicle_serial.lo +libvehicle_serial_la_OBJECTS = $(am_libvehicle_serial_la_OBJECTS) +libvehicle_serial_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libvehicle_serial_la_CFLAGS) $(CFLAGS) \ + $(libvehicle_serial_la_LDFLAGS) $(LDFLAGS) -o $@ +libvehicle_socket_la_LIBADD = +am_libvehicle_socket_la_OBJECTS = \ + libvehicle_socket_la-vehicle_socket.lo +libvehicle_socket_la_OBJECTS = $(am_libvehicle_socket_la_OBJECTS) +libvehicle_socket_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libvehicle_socket_la_CFLAGS) $(CFLAGS) \ + $(libvehicle_socket_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libvehicle_file_la_SOURCES) $(libvehicle_pipe_la_SOURCES) \ + $(libvehicle_serial_la_SOURCES) \ + $(libvehicle_socket_la_SOURCES) +DIST_SOURCES = $(libvehicle_file_la_SOURCES) \ + $(libvehicle_pipe_la_SOURCES) $(libvehicle_serial_la_SOURCES) \ + $(libvehicle_socket_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit +modulevehicle_LTLIBRARIES = libvehicle_file.la libvehicle_pipe.la libvehicle_socket.la libvehicle_serial.la +libvehicle_file_la_CFLAGS = -DMODULE=vehicle_file +libvehicle_file_la_SOURCES = vehicle_file.c +libvehicle_file_la_LDFLAGS = -module -avoid-version @NAVIT_SOCKET_LDFLAGS@ @NAVIT_MODULE_LDFLAGS@ +libvehicle_pipe_la_CFLAGS = -DMODULE=vehicle_pipe +libvehicle_pipe_la_SOURCES = vehicle_pipe.c +libvehicle_pipe_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +libvehicle_socket_la_CFLAGS = -DMODULE=vehicle_socket +libvehicle_socket_la_SOURCES = vehicle_socket.c +libvehicle_socket_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +libvehicle_serial_la_CFLAGS = -DMODULE=vehicle_serial +libvehicle_serial_la_SOURCES = vehicle_serial.c +libvehicle_serial_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/vehicle/file/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/vehicle/file/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulevehicleLTLIBRARIES: $(modulevehicle_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulevehicledir)" || $(MKDIR_P) "$(DESTDIR)$(modulevehicledir)" + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulevehicledir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulevehicledir)"; \ + } + +uninstall-modulevehicleLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulevehicledir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulevehicledir)/$$f"; \ + done + +clean-modulevehicleLTLIBRARIES: + -test -z "$(modulevehicle_LTLIBRARIES)" || rm -f $(modulevehicle_LTLIBRARIES) + @list='$(modulevehicle_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libvehicle_file.la: $(libvehicle_file_la_OBJECTS) $(libvehicle_file_la_DEPENDENCIES) + $(libvehicle_file_la_LINK) -rpath $(modulevehicledir) $(libvehicle_file_la_OBJECTS) $(libvehicle_file_la_LIBADD) $(LIBS) +libvehicle_pipe.la: $(libvehicle_pipe_la_OBJECTS) $(libvehicle_pipe_la_DEPENDENCIES) + $(libvehicle_pipe_la_LINK) -rpath $(modulevehicledir) $(libvehicle_pipe_la_OBJECTS) $(libvehicle_pipe_la_LIBADD) $(LIBS) +libvehicle_serial.la: $(libvehicle_serial_la_OBJECTS) $(libvehicle_serial_la_DEPENDENCIES) + $(libvehicle_serial_la_LINK) -rpath $(modulevehicledir) $(libvehicle_serial_la_OBJECTS) $(libvehicle_serial_la_LIBADD) $(LIBS) +libvehicle_socket.la: $(libvehicle_socket_la_OBJECTS) $(libvehicle_socket_la_DEPENDENCIES) + $(libvehicle_socket_la_LINK) -rpath $(modulevehicledir) $(libvehicle_socket_la_OBJECTS) $(libvehicle_socket_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libvehicle_file_la-vehicle_file.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libvehicle_pipe_la-vehicle_pipe.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libvehicle_serial_la-vehicle_serial.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libvehicle_socket_la-vehicle_socket.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +libvehicle_file_la-vehicle_file.lo: vehicle_file.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libvehicle_file_la_CFLAGS) $(CFLAGS) -MT libvehicle_file_la-vehicle_file.lo -MD -MP -MF $(DEPDIR)/libvehicle_file_la-vehicle_file.Tpo -c -o libvehicle_file_la-vehicle_file.lo `test -f 'vehicle_file.c' || echo '$(srcdir)/'`vehicle_file.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libvehicle_file_la-vehicle_file.Tpo $(DEPDIR)/libvehicle_file_la-vehicle_file.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='vehicle_file.c' object='libvehicle_file_la-vehicle_file.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libvehicle_file_la_CFLAGS) $(CFLAGS) -c -o libvehicle_file_la-vehicle_file.lo `test -f 'vehicle_file.c' || echo '$(srcdir)/'`vehicle_file.c + +libvehicle_pipe_la-vehicle_pipe.lo: vehicle_pipe.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libvehicle_pipe_la_CFLAGS) $(CFLAGS) -MT libvehicle_pipe_la-vehicle_pipe.lo -MD -MP -MF $(DEPDIR)/libvehicle_pipe_la-vehicle_pipe.Tpo -c -o libvehicle_pipe_la-vehicle_pipe.lo `test -f 'vehicle_pipe.c' || echo '$(srcdir)/'`vehicle_pipe.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libvehicle_pipe_la-vehicle_pipe.Tpo $(DEPDIR)/libvehicle_pipe_la-vehicle_pipe.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='vehicle_pipe.c' object='libvehicle_pipe_la-vehicle_pipe.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libvehicle_pipe_la_CFLAGS) $(CFLAGS) -c -o libvehicle_pipe_la-vehicle_pipe.lo `test -f 'vehicle_pipe.c' || echo '$(srcdir)/'`vehicle_pipe.c + +libvehicle_serial_la-vehicle_serial.lo: vehicle_serial.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libvehicle_serial_la_CFLAGS) $(CFLAGS) -MT libvehicle_serial_la-vehicle_serial.lo -MD -MP -MF $(DEPDIR)/libvehicle_serial_la-vehicle_serial.Tpo -c -o libvehicle_serial_la-vehicle_serial.lo `test -f 'vehicle_serial.c' || echo '$(srcdir)/'`vehicle_serial.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libvehicle_serial_la-vehicle_serial.Tpo $(DEPDIR)/libvehicle_serial_la-vehicle_serial.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='vehicle_serial.c' object='libvehicle_serial_la-vehicle_serial.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libvehicle_serial_la_CFLAGS) $(CFLAGS) -c -o libvehicle_serial_la-vehicle_serial.lo `test -f 'vehicle_serial.c' || echo '$(srcdir)/'`vehicle_serial.c + +libvehicle_socket_la-vehicle_socket.lo: vehicle_socket.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libvehicle_socket_la_CFLAGS) $(CFLAGS) -MT libvehicle_socket_la-vehicle_socket.lo -MD -MP -MF $(DEPDIR)/libvehicle_socket_la-vehicle_socket.Tpo -c -o libvehicle_socket_la-vehicle_socket.lo `test -f 'vehicle_socket.c' || echo '$(srcdir)/'`vehicle_socket.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libvehicle_socket_la-vehicle_socket.Tpo $(DEPDIR)/libvehicle_socket_la-vehicle_socket.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='vehicle_socket.c' object='libvehicle_socket_la-vehicle_socket.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libvehicle_socket_la_CFLAGS) $(CFLAGS) -c -o libvehicle_socket_la-vehicle_socket.lo `test -f 'vehicle_socket.c' || echo '$(srcdir)/'`vehicle_socket.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulevehicledir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulevehicleLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulevehicleLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulevehicleLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulevehicleLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-modulevehicleLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulevehicleLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/vehicle/file/vehicle_file.c b/navit/vehicle/file/vehicle_file.c new file mode 100644 index 0000000..5a4be46 --- /dev/null +++ b/navit/vehicle/file/vehicle_file.c @@ -0,0 +1,1047 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include "config.h" +#ifdef HAVE_UNISTD_H +#include +#endif /* HAVE_UNISTD_H */ +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 + #include +#else +#include +#endif +#include +#include "debug.h" +#include "callback.h" +#include "plugin.h" +#include "coord.h" +#include "item.h" +#include "event.h" +#include "vehicle.h" +#include "file.h" +#ifdef HAVE_SOCKET +#include +#include +#include +#include +#endif +#ifdef HAVE_WINSOCK +#include +int inet_aton(const char *cp, struct in_addr *inp); + +int inet_aton(const char *cp, struct in_addr *inp) +{ + unsigned long addr = inet_addr(cp); + inp->S_un.S_addr = addr; + return addr!=-1; +} +#endif + +static void vehicle_file_disable_watch(struct vehicle_priv *priv); +static void vehicle_file_enable_watch(struct vehicle_priv *priv); +static int vehicle_file_parse(struct vehicle_priv *priv, char *buffer); +static int vehicle_file_open(struct vehicle_priv *priv); +static void vehicle_file_close(struct vehicle_priv *priv); + + +enum file_type { + file_type_pipe = 1, file_type_device, file_type_file, file_type_socket, file_type_serial +}; + +static int buffer_size = 1024; + +struct gps_sat { + int prn; + int elevation; + int azimuth; + int snr; +}; + + +struct vehicle_priv { + char *source; + struct callback_list *cbl; + int fd; + struct callback *cb,*cbt; + char *buffer; + int buffer_pos; + char *nmea_data; + char *nmea_data_buf; + + struct coord_geo geo; + double speed; + double direction; + double height; + double hdop; + double vdop; + char fixtime[20]; + int fixyear; + int fixmonth; + int fixday; + int status; + int sats_used; + int sats_visible; + int sats_signal; + int time; + int on_eof; +#ifdef _WIN32 + int no_data_count; + struct event_timeout * timeout; + struct callback *timeout_callback; +#endif + enum file_type file_type; + FILE *file; + struct event_watch *watch; + speed_t baudrate; + struct attr ** attrs; + char fixiso8601[128]; + int checksum_ignore; + int magnetic_direction; + int current_count; + struct gps_sat current[24]; + int next_count; + struct gps_sat next[24]; + struct item sat_item; + int valid; + char *statefile; + int process_statefile; +}; + +//*************************************************************************** +/** @fn static int vehicle_win32_serial_track(struct vehicle_priv *priv) +***************************************************************************** +* @b Description: Callback of the plugin +***************************************************************************** +* @param priv : pointer on the private data of the plugin +***************************************************************************** +* @return always 1 +***************************************************************************** +**/ +#ifdef _WIN32 +static int vehicle_win32_serial_track(struct vehicle_priv *priv) +{ + static char buffer[2048] = {0,}; + static int current_index = 0; + const int chunk_size = 1024; + int rc = 0; + int dwBytes; + + dbg(1, "enter, *priv='%x', priv->source='%s'\n", priv, priv->source); + + if ( priv->no_data_count > 5 ) + { + vehicle_file_close( priv ); + priv->no_data_count = 0; + vehicle_file_open( priv ); + vehicle_file_enable_watch(priv); + } + + //if ( priv->fd <= 0 ) + //{ + // vehicle_file_open( priv ); + //} + + if ( current_index >= ( sizeof( buffer ) - chunk_size ) ) + { + // discard + current_index = 0; + memset( buffer, 0 , sizeof( buffer ) ); + } + + dwBytes = serial_io_read( priv->fd, &buffer[ current_index ], chunk_size ); + if ( dwBytes > 0 ) + { + char* return_pos = NULL; + current_index += dwBytes; + + while ( ( return_pos = strchr( buffer, '\n' ) ) != NULL ) + { + char return_buffer[1024]; + int bytes_to_copy = return_pos - buffer + 1; + memcpy( return_buffer, buffer, bytes_to_copy ); + return_buffer[ bytes_to_copy + 1 ] = '\0'; + return_buffer[ bytes_to_copy ] = '\0'; + + // printf( "received %d : '%s' bytes to copy\n", bytes_to_copy, return_buffer ); + rc += vehicle_file_parse( priv, return_buffer ); + + current_index -= bytes_to_copy; + memmove( buffer, &buffer[ bytes_to_copy ] , sizeof( buffer ) - bytes_to_copy ); + } + if (rc) { + priv->no_data_count = 0; + callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); + if (rc > 1) + dbg(0, "Can not keep with gps data delay is %d seconds\n", rc - 1); + + } + } + else + { + priv->no_data_count++; + } + dbg(2, "leave, return '1', priv->no_data_count='%d'\n", priv->no_data_count); + return 1; +} +#endif + +//*************************************************************************** +/** @fn static int vehicle_file_open(struct vehicle_priv *priv) +***************************************************************************** +* @b Description: open dialogue with the GPS +***************************************************************************** +* @param priv : pointer on the private data of the plugin +***************************************************************************** +* @return 1 if ok +* 0 if error +***************************************************************************** +**/ +static int +vehicle_file_open(struct vehicle_priv *priv) +{ + char *name; +#ifndef _WIN32 + struct termios tio; +#else + #define O_NDELAY 0 +#endif + + name = priv->source + 5; + if (!strncmp(priv->source, "file:", 5)) { + priv->fd = open(name, O_RDONLY | O_NDELAY); + if (priv->fd < 0) + return 0; + if (file_is_reg(name)) { + priv->file_type = file_type_file; + } +#ifndef _WIN32 + else { + tcgetattr(priv->fd, &tio); + cfmakeraw(&tio); + cfsetispeed(&tio, priv->baudrate); + cfsetospeed(&tio, priv->baudrate); + tio.c_cc[VMIN] = 0; + tio.c_cc[VTIME] = 200; + tcsetattr(priv->fd, TCSANOW, &tio); + priv->file_type = file_type_device; + } + } else if (!strncmp(priv->source,"pipe:", 5)) { + priv->file = popen(name, "r"); + if (!priv->file) + return 0; + priv->fd = fileno(priv->file); + priv->file_type = file_type_pipe; +#endif //!_WIN32 +#if defined(HAVE_SOCKET) || defined(HAVE_WINSOCK) + } else if (!strncmp(priv->source,"socket:", 7)) { + #ifdef _WIN32 + WSADATA wsi; + WSAStartup(0x00020002,&wsi); + #endif + char *p,*s=g_strdup(priv->source+7); + struct sockaddr_in sin; + p=strchr(s,':'); + if (!p) { + dbg(0,"port number missing in %s\n",s); + g_free(s); + return 0; + } + *p++='\0'; + sin.sin_family=AF_INET; + sin.sin_port=ntohs(atoi(p)); + if (!inet_aton(s, &sin.sin_addr)) { + dbg(0,"failed to parse %s\n",s); + g_free(s); + return 0; + } + priv->fd = socket(PF_INET, SOCK_STREAM, 0); + if (priv->fd != -1) { + if (connect(priv->fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) { + dbg(0,"failed to connect to %s:%s\n",s,p); + g_free(s); + return 0; + } + } + priv->file_type = file_type_socket; +#endif //HAVE_SOCKET + } else if (!strncmp(priv->source,"serial:",7)) { +#ifdef _WIN32 + char* raw_setting_str = g_strdup( priv->source ); + + char* strport = strchr(raw_setting_str, ':' ); + char* strsettings = strchr(raw_setting_str, ' ' ); + + if ( strport && strsettings ) + { + strport++; + *strsettings = '\0'; + strsettings++; + + priv->fd=serial_io_init( strport, strsettings ); + } + g_free( raw_setting_str ); + priv->file_type = file_type_serial; + // Add the callback + dbg(2, "Add the callback ...\n", priv->source); + priv->timeout_callback=callback_new_1(callback_cast(vehicle_win32_serial_track), priv); +#else + //TODO - add linux serial +#endif //!_WIN32 + } + return(priv->fd != -1); +} + +//*************************************************************************** +/** @fn static void vehicle_file_close(struct vehicle_priv *priv) +***************************************************************************** +* @b Description: close dialogue with the GPS +***************************************************************************** +* @param priv : pointer on the private data of the plugin +***************************************************************************** +**/ +static void +vehicle_file_close(struct vehicle_priv *priv) +{ + dbg(1, "enter, priv->fd='%d'\n", priv->fd); + vehicle_file_disable_watch(priv); +#ifdef _WIN32 + if(priv->file_type == file_type_serial) + { + if (priv->timeout_callback) { + callback_destroy(priv->timeout_callback); + priv->timeout_callback=NULL; // dangling pointer! prevent double freeing. + } + serial_io_shutdown( priv->fd ); + } + else +#endif + { + if (priv->file) { +#ifndef _MSC_VER + pclose(priv->file); +#endif /* _MSC_VER */ + } + else if (priv->fd >= 0) { + close(priv->fd); + } + priv->file = NULL; + priv->fd = -1; + } +} + +//*************************************************************************** +/** @fn static int vehicle_file_enable_watch_timer(struct vehicle_priv *priv) +***************************************************************************** +* @b Description: Enable watch timer to get GPS data +***************************************************************************** +* @param priv : pointer on the private data of the plugin +***************************************************************************** +* @return always 0 +***************************************************************************** +**/ +static int +vehicle_file_enable_watch_timer(struct vehicle_priv *priv) +{ + dbg(1, "enter\n"); + vehicle_file_enable_watch(priv); + + return FALSE; +} + + +//*************************************************************************** +/** @fn static int vehicle_file_parse( struct vehicle_priv *priv, +* char *buffer) +***************************************************************************** +* @b Description: Parse the buffer +***************************************************************************** +* @param priv : pointer on the private data of the plugin +* @param buffer : data buffer (null terminated) +***************************************************************************** +* @return 1 if The GPRMC Sentence is found +* 0 if not found +***************************************************************************** +**/ +static int +vehicle_file_parse(struct vehicle_priv *priv, char *buffer) +{ + char *nmea_data_buf, *p, *item[32]; + double lat, lng; + int i, j, bcsum; + int len = strlen(buffer); + unsigned char csum = 0; + int valid=0; + int ret = 0; + + dbg(2, "enter: buffer='%s'\n", buffer); + for (;;) { + if (len < 4) { + dbg(0, "'%s' too short\n", buffer); + return ret; + } + if (buffer[len - 1] == '\r' || buffer[len - 1] == '\n') { + buffer[--len] = '\0'; + if (buffer[len - 1] == '\r') + buffer[--len] = '\0'; + } else + break; + } + if (buffer[0] != '$') { + dbg(0, "no leading $ in '%s'\n", buffer); + return ret; + } + if (buffer[len - 3] != '*') { + dbg(0, "no *XX in '%s'\n", buffer); + return ret; + } + for (i = 1; i < len - 3; i++) { + csum ^= (unsigned char) (buffer[i]); + } + if (!sscanf(buffer + len - 2, "%x", &bcsum) && priv->checksum_ignore != 2) { + dbg(0, "no checksum in '%s'\n", buffer); + return ret; + } + if (bcsum != csum && priv->checksum_ignore == 0) { + dbg(0, "wrong checksum in '%s was %x should be %x'\n", buffer,bcsum,csum); + return ret; + } + + if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) { + nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, "\n", NULL); + g_free(priv->nmea_data_buf); + priv->nmea_data_buf=nmea_data_buf; + } else { + dbg(0, "nmea buffer overflow, discarding '%s'\n", buffer); + } + i = 0; + p = buffer; + while (i < 31) { + item[i++] = p; + while (*p && *p != ',') + p++; + if (!*p) + break; + *p++ = '\0'; + } + + if (!strncmp(buffer, "$GPGGA", 6)) { + /* 1 1111 + 0 1 2 3 4 5 6 7 8 9 0 1234 + $GPGGA,184424.505,4924.2811,N,01107.8846,E,1,05,2.5,408.6,M,,,,0000*0C + UTC of Fix[1],Latitude[2],N/S[3],Longitude[4],E/W[5],Quality(0=inv,1=gps,2=dgps)[6],Satelites used[7], + HDOP[8],Altitude[9],"M"[10],height of geoid[11], "M"[12], time since dgps update[13], dgps ref station [14] + */ + if (*item[2] && *item[3] && *item[4] && *item[5]) { + lat = g_ascii_strtod(item[2], NULL); + priv->geo.lat = floor(lat / 100); + lat -= priv->geo.lat * 100; + priv->geo.lat += lat / 60; + + if (!g_strcasecmp(item[3],"S")) + priv->geo.lat=-priv->geo.lat; + + lng = g_ascii_strtod(item[4], NULL); + priv->geo.lng = floor(lng / 100); + lng -= priv->geo.lng * 100; + priv->geo.lng += lng / 60; + + if (!g_strcasecmp(item[5],"W")) + priv->geo.lng=-priv->geo.lng; + priv->valid=attr_position_valid_valid; + dbg(2, "latitude '%2.4f' longitude %2.4f\n", priv->geo.lat, priv->geo.lng); + + } else + priv->valid=attr_position_valid_invalid; + if (*item[6]) + sscanf(item[6], "%d", &priv->status); + if (*item[7]) + sscanf(item[7], "%d", &priv->sats_used); + if (*item[8]) + sscanf(item[8], "%lf", &priv->hdop); + if (*item[1]) + strncpy(priv->fixtime, item[1], sizeof(priv->fixtime)); + if (*item[9]) + sscanf(item[9], "%lf", &priv->height); + + g_free(priv->nmea_data); + priv->nmea_data=priv->nmea_data_buf; + priv->nmea_data_buf=NULL; + if (priv->file_type == file_type_file) { + if (priv->watch) { + vehicle_file_disable_watch(priv); + event_add_timeout(priv->time, 0, priv->cbt); + } + } + } + if (!strncmp(buffer, "$GPVTG", 6)) { + /* 0 1 2 34 5 6 7 8 + $GPVTG,143.58,T,,M,0.26,N,0.5,K*6A + Course Over Ground Degrees True[1],"T"[2],Course Over Ground Degrees Magnetic[3],"M"[4], + Speed in Knots[5],"N"[6],"Speed in KM/H"[7],"K"[8] + */ + if (item[1] && item[7]) + valid = 1; + if (i >= 10 && (*item[9] == 'A' || *item[9] == 'D')) + valid = 1; + if (valid) { + priv->direction = g_ascii_strtod( item[1], NULL ); + priv->speed = g_ascii_strtod( item[7], NULL ); + dbg(2,"direction %lf, speed %2.1lf\n", priv->direction, priv->speed); + } + } + if (!strncmp(buffer, "$GPRMC", 6)) { + /* 1 1 + 0 1 2 3 4 5 6 7 8 9 0 1 + $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A + Time[1],Active/Void[2],lat[3],N/S[4],long[5],W/E[6],speed in knots[7],track angle[8],date[9], + magnetic variation[10],magnetic variation direction[11] + */ + if (*item[2] == 'A') + valid = 1; + if (i >= 13 && (*item[12] == 'A' || *item[12] == 'D')) + valid = 1; + if (valid) { + priv->direction = g_ascii_strtod( item[8], NULL ); + priv->speed = g_ascii_strtod( item[7], NULL ); + priv->speed *= 1.852; + sscanf(item[9], "%02d%02d%02d", + &priv->fixday, + &priv->fixmonth, + &priv->fixyear); + priv->fixyear += 2000; + } + ret = 1; + } + if (!strncmp(buffer, "$GPGSV", 6) && i >= 4) { + /* + 0 GSV Satellites in view + 1 2 Number of sentences for full data + 2 1 sentence 1 of 2 + 3 08 Number of satellites in view + + 4 01 Satellite PRN number + 5 40 Elevation, degrees + 6 083 Azimuth, degrees + 7 46 SNR - higher is better + for up to 4 satellites per sentence + *75 the checksum data, always begins with * + */ + if (item[3]) { + sscanf(item[3], "%d", &priv->sats_visible); + } + j=4; + while (j+4 <= i && priv->current_count < 24) { + struct gps_sat *sat=&priv->next[priv->next_count++]; + sat->prn=atoi(item[j]); + sat->elevation=atoi(item[j+1]); + sat->azimuth=atoi(item[j+2]); + sat->snr=atoi(item[j+3]); + j+=4; + } + if (!strcmp(item[1], item[2])) { + priv->sats_signal=0; + for (i = 0 ; i < priv->next_count ; i++) { + priv->current[i]=priv->next[i]; + if (priv->current[i].snr) + priv->sats_signal++; + } + priv->current_count=priv->next_count; + priv->next_count=0; + } + } + if (!strncmp(buffer, "$GPZDA", 6)) { + /* + 0 1 2 3 4 5 6 + $GPZDA,hhmmss.ss,dd,mm,yyyy,xx,yy*CC + hhmmss HrMinSec(UTC) + dd,mm,yyy Day,Month,Year + xx local zone hours -13..13 + yy local zone minutes 0..59 + */ + if (item[1] && item[2] && item[3] && item[4]) { + strncpy(priv->fixtime, item[1], strlen(priv->fixtime)); + priv->fixday = atoi(item[2]); + priv->fixmonth = atoi(item[3]); + priv->fixyear = atoi(item[4]); + } + } + if (!strncmp(buffer, "$IISMD", 6)) { + /* + 0 1 2 3 4 + $IISMD,dir,press,height,temp*CC" + dir Direction (0-359) + press Pressure (hpa, i.e. 1032) + height Barometric height above ground (meter) + temp Temperature (Degree Celsius) + */ + if (item[1]) { + priv->magnetic_direction = g_ascii_strtod( item[1], NULL ); + dbg(1,"magnetic %d\n", priv->magnetic_direction); + } + } + return ret; +} + +//*************************************************************************** +/** @fn static void vehicle_file_io(struct vehicle_priv *priv) +***************************************************************************** +* @b Description: function to get data from GPS +***************************************************************************** +* @param priv : pointer on the private data of the plugin +***************************************************************************** +* @remarks +***************************************************************************** +**/ +static void +vehicle_file_io(struct vehicle_priv *priv) +{ + int size, rc = 0; + char *str, *tok; + dbg(1, "vehicle_file_io : enter\n"); + + if (priv->process_statefile) { + unsigned char *data; + priv->process_statefile=0; + if (file_get_contents(priv->statefile, &data, &size)) { + if (size > buffer_size) + size=buffer_size; + memcpy(priv->buffer, data, size); + priv->buffer_pos=0; + g_free(data); + } else + return; + } else { + size = read(priv->fd, priv->buffer + priv->buffer_pos, buffer_size - priv->buffer_pos - 1); + } + if (size <= 0) { + switch (priv->on_eof) { + case 0: + vehicle_file_close(priv); + vehicle_file_open(priv); + break; + case 1: + vehicle_file_disable_watch(priv); + break; + case 2: + exit(0); + break; + } + return; + } + priv->buffer_pos += size; + priv->buffer[priv->buffer_pos] = '\0'; + dbg(1, "size=%d pos=%d buffer='%s'\n", size, + priv->buffer_pos, priv->buffer); + str = priv->buffer; + while ((tok = strchr(str, '\n'))) { + *tok++ = '\0'; + dbg(1, "line='%s'\n", str); + rc +=vehicle_file_parse(priv, str); + str = tok; + if (priv->file_type == file_type_file && rc) + break; + } + + if (str != priv->buffer) { + size = priv->buffer + priv->buffer_pos - str; + memmove(priv->buffer, str, size + 1); + priv->buffer_pos = size; + dbg(1, "now pos=%d buffer='%s'\n", + priv->buffer_pos, priv->buffer); + } else if (priv->buffer_pos == buffer_size - 1) { + dbg(0, + "Overflow. Most likely wrong baud rate or no nmea protocol\n"); + priv->buffer_pos = 0; + } + if (rc) + callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); +} + +//*************************************************************************** +/** @fn static void vehicle_file_enable_watch(struct vehicle_priv *priv) +***************************************************************************** +* @b Description: Enable watch +***************************************************************************** +* @param priv : pointer on the private data of the plugin +***************************************************************************** +**/ +static void +vehicle_file_enable_watch(struct vehicle_priv *priv) +{ + dbg(1, "enter\n"); +#ifdef _WIN32 + // add an event : don't use glib timers and g_timeout_add + if (priv->file_type == file_type_serial) + { + if (priv->timeout_callback != NULL) + priv->timeout = event_add_timeout(500, 1, priv->timeout_callback); + else + dbg(1, "error : watch not enabled : priv->timeout_callback is null\n"); } + else +#endif + { + if (! priv->watch) + priv->watch = event_add_watch((void *)priv->fd, event_watch_cond_read, priv->cb); + } +} + +//*************************************************************************** +/** @fn static void vehicle_file_disable_watch(struct vehicle_priv *priv) +***************************************************************************** +* @b Description: Disable watch +***************************************************************************** +* @param priv : pointer on the private data of the plugin +***************************************************************************** +**/ +static void +vehicle_file_disable_watch(struct vehicle_priv *priv) +{ + dbg(1, "vehicle_file_disable_watch : enter\n"); +#ifdef _WIN32 + if(priv->file_type == file_type_serial) + { + if (priv->timeout) { + event_remove_timeout(priv->timeout); + priv->timeout=NULL; // dangling pointer! prevent double freeing. + } + } + else +#endif //!_WIN32 + { + if (priv->watch) + event_remove_watch(priv->watch); + priv->watch = NULL; + } +} + +//*************************************************************************** +/** @fn static void vehicle_priv vehicle_file_destroy(struct vehicle_priv *priv) +***************************************************************************** +* @b Description: Function called to uninitialize the plugin +***************************************************************************** +* @param priv : pointer on the private data of the plugin +***************************************************************************** +* @remarks private data is freed by this function (g_free) +***************************************************************************** +**/ +static void +vehicle_file_destroy(struct vehicle_priv *priv) +{ + if (priv->statefile && priv->nmea_data) { + struct attr readwrite={attr_readwrite}; + struct attr create={attr_create}; + struct attr *attrs[]={&readwrite,&create,NULL}; + struct file *f; + readwrite.u.num=1; + create.u.num=1; + f=file_create(priv->statefile, attrs); + if (f) { + file_data_write(f, 0, strlen(priv->nmea_data), priv->nmea_data); + file_destroy(f); + } + } + vehicle_file_close(priv); + callback_destroy(priv->cb); + callback_destroy(priv->cbt); + if (priv->statefile) + g_free(priv->statefile); + if (priv->source) + g_free(priv->source); + if (priv->buffer) + g_free(priv->buffer); + g_free(priv); +} + +//*************************************************************************** +/** @fn static int vehicle_file_position_attr_get(struct vehicle_priv *priv, +* enum attr_type type, +* struct attr *attr) +***************************************************************************** +* @b Description: Function called to get attribute +***************************************************************************** +* @param priv : pointer on the private data of the plugin +* @param type : attribute type called +* @param attr : structure to return the attribute value +***************************************************************************** +* @return 1 if ok +* 0 for unkown or invalid attribute +***************************************************************************** +**/ +static int +vehicle_file_position_attr_get(struct vehicle_priv *priv, + enum attr_type type, struct attr *attr) +{ + switch (type) { + case attr_position_fix_type: + attr->u.num = priv->status; + break; + case attr_position_height: + attr->u.numd = &priv->height; + break; + case attr_position_speed: + attr->u.numd = &priv->speed; + break; + case attr_position_direction: + attr->u.numd = &priv->direction; + break; + case attr_position_magnetic_direction: + attr->u.num = priv->magnetic_direction; + break; + case attr_position_hdop: + attr->u.numd = &priv->hdop; + break; + case attr_position_qual: + attr->u.num = priv->sats_visible; + break; + case attr_position_sats_signal: + attr->u.num = priv->sats_signal; + break; + case attr_position_sats_used: + attr->u.num = priv->sats_used; + break; + case attr_position_coord_geo: + attr->u.coord_geo = &priv->geo; + break; + case attr_position_nmea: + attr->u.str=priv->nmea_data; + if (! attr->u.str) + return 0; + break; + case attr_position_time_iso8601: + if (!priv->fixyear || !priv->fixtime[0]) + return 0; + sprintf(priv->fixiso8601, "%04d-%02d-%02dT%.2s:%.2s:%sZ", + priv->fixyear, priv->fixmonth, priv->fixday, + priv->fixtime, (priv->fixtime+2), (priv->fixtime+4)); + attr->u.str=priv->fixiso8601; + break; + case attr_position_sat_item: + dbg(0,"at here\n"); + priv->sat_item.id_lo++; + if (priv->sat_item.id_lo > priv->current_count) { + priv->sat_item.id_lo=0; + return 0; + } + attr->u.item=&priv->sat_item; + break; + case attr_position_valid: + attr->u.num=priv->valid; + break; + default: + return 0; + } + if (type != attr_position_sat_item) + priv->sat_item.id_lo=0; + attr->type = type; + return 1; +} + +//*************************************************************************** +/** @fn static int vehicle_file_sat_attr_get(struct vehicle_priv *priv, +* enum attr_type type, +* struct attr *attr) +***************************************************************************** +* @b Description: Function called to get satellite attribute +***************************************************************************** +* @param priv : pointer on the private data of the plugin +* @param type : attribute type called +* @param attr : structure to return the attribute value +***************************************************************************** +* @return 1 if ok +* 0 for unkown attribute +***************************************************************************** +**/ +static int +vehicle_file_sat_attr_get(void *priv_data, enum attr_type type, struct attr *attr) +{ + struct gps_sat *sat; + struct vehicle_priv *priv=priv_data; + if (priv->sat_item.id_lo < 1) + return 0; + if (priv->sat_item.id_lo > priv->current_count) + return 0; + sat=&priv->current[priv->sat_item.id_lo-1]; + switch (type) { + case attr_sat_prn: + attr->u.num=sat->prn; + break; + case attr_sat_elevation: + attr->u.num=sat->elevation; + break; + case attr_sat_azimuth: + attr->u.num=sat->azimuth; + break; + case attr_sat_snr: + attr->u.num=sat->snr; + break; + default: + return 0; + } + attr->type = type; + return 1; +} + +static struct item_methods vehicle_file_sat_methods = { + NULL, + NULL, + NULL, + vehicle_file_sat_attr_get, +}; + +static struct vehicle_methods vehicle_file_methods = { + vehicle_file_destroy, + vehicle_file_position_attr_get, +}; + +//*************************************************************************** +/** @fn static struct vehicle_priv * vehicle_file_new_file( +* struct vehicle_methods *meth, +* struct callback_list *cbl, +* struct attr **attrs) +***************************************************************************** +* @b Description: Function called to initialize the plugin +***************************************************************************** +* @param meth : ? +* @param cbl : ? +* @param attrs : ? +***************************************************************************** +* @return pointer on the private data of the plugin +***************************************************************************** +* @remarks private data is allocated by this function (g_new0) +***************************************************************************** +**/ +static struct vehicle_priv * +vehicle_file_new_file(struct vehicle_methods + *meth, struct callback_list + *cbl, struct attr **attrs) +{ + struct vehicle_priv *ret; + struct attr *source; + struct attr *time; + struct attr *on_eof; + struct attr *baudrate; + struct attr *checksum_ignore; + struct attr *state_file; + + dbg(1, "enter\n"); + + source = attr_search(attrs, NULL, attr_source); + if(source == NULL){ + dbg(0,"Missing source attribute"); + return NULL; + } + ret = g_new0(struct vehicle_priv, 1); // allocate and initialize to 0 + ret->fd = -1; + ret->cbl = cbl; + ret->source = g_strdup(source->u.str); + ret->buffer = g_malloc(buffer_size); + ret->time=1000; + ret->baudrate=B4800; + state_file=attr_search(attrs, NULL, attr_state_file); + if (state_file) + ret->statefile=g_strdup(state_file->u.str); + time = attr_search(attrs, NULL, attr_time); + if (time) + ret->time=time->u.num; + baudrate = attr_search(attrs, NULL, attr_baudrate); + if (baudrate) { + switch (baudrate->u.num) { + case 4800: + ret->baudrate=B4800; + break; + case 9600: + ret->baudrate=B9600; + break; + case 19200: + ret->baudrate=B19200; + break; +#ifdef B38400 + case 38400: + ret->baudrate=B38400; + break; +#endif +#ifdef B57600 + case 57600: + ret->baudrate=B57600; + break; +#endif +#ifdef B115200 + case 115200: + ret->baudrate=B115200; + break; +#endif + } + } + checksum_ignore = attr_search(attrs, NULL, attr_checksum_ignore); + if (checksum_ignore) + ret->checksum_ignore=checksum_ignore->u.num; + ret->attrs = attrs; + on_eof = attr_search(attrs, NULL, attr_on_eof); + if (on_eof && !g_strcasecmp(on_eof->u.str, "stop")) + ret->on_eof=1; + if (on_eof && !g_strcasecmp(on_eof->u.str, "exit")) + ret->on_eof=2; + dbg(0,"on_eof=%d\n", ret->on_eof); + *meth = vehicle_file_methods; + ret->cb=callback_new_1(callback_cast(vehicle_file_io), ret); + ret->cbt=callback_new_1(callback_cast(vehicle_file_enable_watch_timer), ret); + if (ret->statefile && file_exists(ret->statefile)) { + ret->process_statefile=1; + event_add_timeout(1000, 0, ret->cb); + } + ret->sat_item.type=type_position_sat; + ret->sat_item.id_hi=ret->sat_item.id_lo=0; + ret->sat_item.priv_data=ret; + ret->sat_item.meth=&vehicle_file_sat_methods; +#ifdef _WIN32 + ret->no_data_count = 0; +#endif + + dbg(1, "vehicle_file_new_file:open\n"); + if (!vehicle_file_open(ret)) { + dbg(0, "Failed to open '%s'\n", ret->source); + } + + vehicle_file_enable_watch(ret); + // vehicle_file_destroy(ret); + // return NULL; + dbg(1, "leave\n"); + return ret; +} + +//*************************************************************************** +/** @fn void plugin_init(void) +***************************************************************************** +* @b Description: Initialisation of vehicle_file plugin +***************************************************************************** +**/ +void plugin_init(void) +{ + dbg(1, "vehicle_file:plugin_init:enter\n"); + plugin_register_vehicle_type("file", vehicle_file_new_file); + plugin_register_vehicle_type("pipe", vehicle_file_new_file); + plugin_register_vehicle_type("socket", vehicle_file_new_file); + plugin_register_vehicle_type("serial", vehicle_file_new_file); +} diff --git a/navit/vehicle/file/vehicle_pipe.c b/navit/vehicle/file/vehicle_pipe.c new file mode 100644 index 0000000..0750ede --- /dev/null +++ b/navit/vehicle/file/vehicle_pipe.c @@ -0,0 +1,27 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include "config.h" +#include "plugin.h" + +void +plugin_init(void) +{ + plugin_get_vehicle_type("file"); +} diff --git a/navit/vehicle/file/vehicle_serial.c b/navit/vehicle/file/vehicle_serial.c new file mode 100644 index 0000000..0750ede --- /dev/null +++ b/navit/vehicle/file/vehicle_serial.c @@ -0,0 +1,27 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include "config.h" +#include "plugin.h" + +void +plugin_init(void) +{ + plugin_get_vehicle_type("file"); +} diff --git a/navit/vehicle/file/vehicle_socket.c b/navit/vehicle/file/vehicle_socket.c new file mode 100644 index 0000000..0750ede --- /dev/null +++ b/navit/vehicle/file/vehicle_socket.c @@ -0,0 +1,27 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include "config.h" +#include "plugin.h" + +void +plugin_init(void) +{ + plugin_get_vehicle_type("file"); +} diff --git a/navit/vehicle/gpsd/Makefile.am b/navit/vehicle/gpsd/Makefile.am new file mode 100644 index 0000000..1c47ccc --- /dev/null +++ b/navit/vehicle/gpsd/Makefile.am @@ -0,0 +1,6 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ @GPSBT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_gpsd +modulevehicle_LTLIBRARIES = libvehicle_gpsd.la +libvehicle_gpsd_la_SOURCES = vehicle_gpsd.c +libvehicle_gpsd_la_LIBADD = @GPSD_LIBS@ @GPSBT_LIBS@ +libvehicle_gpsd_la_LDFLAGS = -module -avoid-version diff --git a/navit/vehicle/gpsd/Makefile.in b/navit/vehicle/gpsd/Makefile.in new file mode 100644 index 0000000..095a374 --- /dev/null +++ b/navit/vehicle/gpsd/Makefile.in @@ -0,0 +1,691 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/vehicle/gpsd +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulevehicledir)" +LTLIBRARIES = $(modulevehicle_LTLIBRARIES) +libvehicle_gpsd_la_DEPENDENCIES = +am_libvehicle_gpsd_la_OBJECTS = vehicle_gpsd.lo +libvehicle_gpsd_la_OBJECTS = $(am_libvehicle_gpsd_la_OBJECTS) +libvehicle_gpsd_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libvehicle_gpsd_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libvehicle_gpsd_la_SOURCES) +DIST_SOURCES = $(libvehicle_gpsd_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ @GPSBT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_gpsd +modulevehicle_LTLIBRARIES = libvehicle_gpsd.la +libvehicle_gpsd_la_SOURCES = vehicle_gpsd.c +libvehicle_gpsd_la_LIBADD = @GPSD_LIBS@ @GPSBT_LIBS@ +libvehicle_gpsd_la_LDFLAGS = -module -avoid-version +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/vehicle/gpsd/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/vehicle/gpsd/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulevehicleLTLIBRARIES: $(modulevehicle_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulevehicledir)" || $(MKDIR_P) "$(DESTDIR)$(modulevehicledir)" + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulevehicledir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulevehicledir)"; \ + } + +uninstall-modulevehicleLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulevehicledir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulevehicledir)/$$f"; \ + done + +clean-modulevehicleLTLIBRARIES: + -test -z "$(modulevehicle_LTLIBRARIES)" || rm -f $(modulevehicle_LTLIBRARIES) + @list='$(modulevehicle_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libvehicle_gpsd.la: $(libvehicle_gpsd_la_OBJECTS) $(libvehicle_gpsd_la_DEPENDENCIES) + $(libvehicle_gpsd_la_LINK) -rpath $(modulevehicledir) $(libvehicle_gpsd_la_OBJECTS) $(libvehicle_gpsd_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vehicle_gpsd.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulevehicledir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulevehicleLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulevehicleLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulevehicleLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulevehicleLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-modulevehicleLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulevehicleLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/vehicle/gpsd/vehicle_gpsd.c b/navit/vehicle/gpsd/vehicle_gpsd.c new file mode 100644 index 0000000..045f55c --- /dev/null +++ b/navit/vehicle/gpsd/vehicle_gpsd.c @@ -0,0 +1,464 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include +#ifdef HAVE_GPSBT +#include +#include +#endif +#include "debug.h" +#include "callback.h" +#include "plugin.h" +#include "coord.h" +#include "item.h" +#include "vehicle.h" +#include "event.h" + +static struct vehicle_priv { + char *source; + char *gpsd_query; + struct callback_list *cbl; + struct callback *cb, *cbt; + struct event_watch *evwatch; + guint retry_interval; + struct gps_data_t *gps; + struct coord_geo geo; + double speed; + double direction; + double height; + double hdop; + int status; + int fix_type; + time_t fix_time; + int sats; + int sats_signal; + int sats_used; + char *nmea_data; + char *nmea_data_buf; + struct event_timeout *retry_timer2; + struct attr ** attrs; + char fixiso8601[128]; +#ifdef HAVE_GPSBT + gpsbt_t context; +#endif +} *vehicle_last; + +#define DEFAULT_RETRY_INTERVAL 10 // seconds +#define MIN_RETRY_INTERVAL 1 // seconds + +static void vehicle_gpsd_io(struct vehicle_priv *priv); + +static void +#ifdef HAVE_LIBGPS19 +vehicle_gpsd_callback(struct gps_data_t *data, char *buf, size_t len) +#else +vehicle_gpsd_callback(struct gps_data_t *data, char *buf, size_t len, + int level) +#endif +{ + char *pos,*nmea_data_buf; + int i=0,sats_signal=0; + + struct vehicle_priv *priv = vehicle_last; + if( len > 0 && buf[0] == '$' ) { + char buffer[len+2]; + buffer[len+1]='\0'; + memcpy(buffer, buf, len); + pos=strchr(buffer,'\n'); + if(!pos) { + pos=strchr(buffer,'\r'); + } + if (pos) { + *pos ='\n'; + *++pos='\0'; + if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) { + nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, NULL); + g_free(priv->nmea_data_buf); + priv->nmea_data_buf=nmea_data_buf; + } else { + dbg(0, "nmea buffer overflow, discarding '%s'\n", buffer); + } + } + } + dbg(1,"data->set=0x%x\n", data->set); + if (data->set & SPEED_SET) { + priv->speed = data->fix.speed * 3.6; + if(!isnan(data->fix.speed)) + callback_list_call_attr_0(priv->cbl, attr_position_speed); + data->set &= ~SPEED_SET; + } + if (data->set & TRACK_SET) { + priv->direction = data->fix.track; + data->set &= ~TRACK_SET; + } + if (data->set & ALTITUDE_SET) { + priv->height = data->fix.altitude; + data->set &= ~ALTITUDE_SET; + } + if (data->set & SATELLITE_SET) { +#ifdef HAVE_LIBGPS19 + if(data->satellites_visible > 0) { +#else + if(data->satellites > 0) { +#endif + sats_signal=0; +#ifdef HAVE_LIBGPS19 + for( i=0;isatellites_visible;i++) { +#else + for( i=0;isatellites;i++) { +#endif + if (data->ss[i] > 0) + sats_signal++; + } + } +#ifdef HAVE_LIBGPS19 + if (priv->sats_used != data->satellites_used || priv->sats != data->satellites_visible || priv->sats_signal != sats_signal ) { +#else + if (priv->sats_used != data->satellites_used || priv->sats != data->satellites || priv->sats_signal != sats_signal ) { +#endif + priv->sats_used = data->satellites_used; +#ifdef HAVE_LIBGPS19 + priv->sats = data->satellites_visible; +#else + priv->sats = data->satellites; +#endif + priv->sats_signal = sats_signal; + callback_list_call_attr_0(priv->cbl, attr_position_sats); + } + data->set &= ~SATELLITE_SET; + } + if (data->set & STATUS_SET) { + priv->status = data->status; + data->set &= ~STATUS_SET; + } + if (data->set & MODE_SET) { + priv->fix_type = data->fix.mode - 1; + data->set &= ~MODE_SET; + } + if (data->set & TIME_SET) { + priv->fix_time = data->fix.time; + data->set &= ~TIME_SET; + } +#ifdef HAVE_LIBGPS19 + if (data->set & DOP_SET) { + dbg(1, "pdop : %g\n", data->dop.pdop); + priv->hdop = data->dop.pdop; + data->set &= ~DOP_SET; +#else + if (data->set & PDOP_SET) { + dbg(1, "pdop : %g\n", data->pdop); + priv->hdop = data->hdop; + data->set &= ~PDOP_SET; +#endif + } + if (data->set & LATLON_SET) { + priv->geo.lat = data->fix.latitude; + priv->geo.lng = data->fix.longitude; + dbg(1,"lat=%f lng=%f\n", priv->geo.lat, priv->geo.lng); + g_free(priv->nmea_data); + priv->nmea_data=priv->nmea_data_buf; + priv->nmea_data_buf=NULL; + data->set &= ~LATLON_SET; + } + // If data->fix.speed is NAN, then the drawing gets jumpy. + if (! isnan(data->fix.speed) && priv->fix_type > 0) { + callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); + } + dbg(2,"speed ok\n"); +} + +/** + * Attempt to open the gps device. + * Return FALSE if retry not required + * Return TRUE to try again + */ +static int +vehicle_gpsd_try_open(struct vehicle_priv *priv) +{ + char *source = g_strdup(priv->source); + char *colon = index(source + 7, ':'); + char *port=NULL; + if (colon) { + *colon = '\0'; + port=colon+1; + } + dbg(0,"Trying to connect to %s:%s\n",source+7,port?port:"default"); + +#if GPSD_API_MAJOR_VERSION >= 5 + /* gps_open returns 0 on success */ + if (gps_open(source + 7, port, priv->gps)) { +#else + priv->gps = gps_open(source + 7, port); + if(!priv->gps) { +#endif + dbg(0,"gps_open failed for '%s'. Retrying in %d seconds. Have you started gpsd?\n", priv->source, priv->retry_interval); + g_free(source); + return TRUE; + } + g_free(source); + +#ifdef HAVE_LIBGPS19 + if (strchr(priv->gpsd_query,'r')) + gps_stream(priv->gps, WATCH_ENABLE|WATCH_NMEA|WATCH_JSON, NULL); + else + gps_stream(priv->gps, WATCH_ENABLE|WATCH_JSON, NULL); +#else + gps_query(priv->gps, priv->gpsd_query); +#endif + +#if GPSD_API_MAJOR_VERSION < 5 + gps_set_raw_hook(priv->gps, vehicle_gpsd_callback); +#endif + priv->cb = callback_new_1(callback_cast(vehicle_gpsd_io), priv); + priv->cbt = callback_new_1(callback_cast(vehicle_gpsd_try_open), priv); + priv->evwatch = event_add_watch((void *)priv->gps->gps_fd, event_watch_cond_read, priv->cb); + if (!priv->gps->gps_fd) { + dbg(0,"Warning: gps_fd is 0, most likely you have used a gps.h incompatible to libgps"); + } + dbg(0,"Connected to gpsd fd=%d evwatch=%p\n", priv->gps->gps_fd, priv->evwatch); + event_remove_timeout(priv->retry_timer2); + priv->retry_timer2=NULL; + return FALSE; +} + +/** + * Open a connection to gpsd. Will re-try the connection if it fails + */ +static void +vehicle_gpsd_open(struct vehicle_priv *priv) +{ +#ifdef HAVE_GPSBT + char errstr[256] = ""; + /* We need to start gpsd (via gpsbt) first. */ + errno = 0; + memset(&priv->context, 0, sizeof(gpsbt_t)); + if(gpsbt_start(NULL, 0, 0, 0, errstr, sizeof(errstr), + 0, &priv->context) < 0) { + dbg(0,"Error connecting to GPS with gpsbt: (%d) %s (%s)\n", + errno, strerror(errno), errstr); + } + sleep(1); /* give gpsd time to start */ + dbg(1,"gpsbt_start: completed\n"); +#endif + priv->retry_timer2=NULL; + if (vehicle_gpsd_try_open(priv)) + priv->retry_timer2=event_add_timeout(priv->retry_interval*1000, 1, priv->cbt); +} + +static void +vehicle_gpsd_close(struct vehicle_priv *priv) +{ +#ifdef HAVE_GPSBT + int err; +#endif + + if (priv->retry_timer2) { + event_remove_timeout(priv->retry_timer2); + priv->retry_timer2=NULL; + } + if (priv->evwatch) { + event_remove_watch(priv->evwatch); + priv->evwatch = NULL; + } + if (priv->cb) { + callback_destroy(priv->cb); + priv->cb = NULL; + } + if (priv->cbt) { + callback_destroy(priv->cbt); + priv->cbt = NULL; + } + if (priv->gps) { + gps_close(priv->gps); +#if GPSD_API_MAJOR_VERSION >= 5 + g_free(priv->gps); +#endif + priv->gps = NULL; + } +#ifdef HAVE_GPSBT + err = gpsbt_stop(&priv->context); + if (err < 0) { + dbg(0,"Error %d while gpsbt_stop", err); + } + dbg(1,"gpsbt_stop: completed, (%d)",err); +#endif +} + +static void +vehicle_gpsd_io(struct vehicle_priv *priv) +{ + dbg(1, "enter\n"); + if (priv->gps) { + vehicle_last = priv; +#if GPSD_API_MAJOR_VERSION >= 5 + if(gps_read(priv->gps)==-1) { + dbg(0,"gps_poll failed\n"); + vehicle_gpsd_close(priv); + vehicle_gpsd_open(priv); + } + else { + char *buf; + buf = gps_data(priv->gps); + vehicle_gpsd_callback(priv->gps,buf,strlen(buf)); + } +#else + if (gps_poll(priv->gps)) { + dbg(0,"gps_poll failed\n"); + vehicle_gpsd_close(priv); + vehicle_gpsd_open(priv); + } +#endif + } +} + +static void +vehicle_gpsd_destroy(struct vehicle_priv *priv) +{ + vehicle_gpsd_close(priv); + if (priv->source) + g_free(priv->source); + if (priv->gpsd_query) + g_free(priv->gpsd_query); +#if GPSD_API_MAJOR_VERSION >= 5 + g_free(priv->gps); +#endif + g_free(priv); +} + +static int +vehicle_gpsd_position_attr_get(struct vehicle_priv *priv, + enum attr_type type, struct attr *attr) +{ + struct attr * active=NULL; + switch (type) { + case attr_position_fix_type: + attr->u.num = priv->fix_type; + break; + case attr_position_height: + attr->u.numd = &priv->height; + break; + case attr_position_speed: + attr->u.numd = &priv->speed; + break; + case attr_position_direction: + attr->u.numd = &priv->direction; + break; + case attr_position_hdop: + attr->u.numd = &priv->hdop; + break; + case attr_position_qual: + attr->u.num = priv->sats; + break; + case attr_position_sats_signal: + attr->u.num = priv->sats_signal; + break; + case attr_position_sats_used: + attr->u.num = priv->sats_used; + break; + case attr_position_coord_geo: + attr->u.coord_geo = &priv->geo; + break; + case attr_position_nmea: + attr->u.str=priv->nmea_data; + if (! attr->u.str) + return 0; + break; + case attr_position_time_iso8601: + { + struct tm tm; + if (!priv->fix_time) + return 0; + if (gmtime_r(&priv->fix_time, &tm)) { + strftime(priv->fixiso8601, sizeof(priv->fixiso8601), + "%Y-%m-%dT%TZ", &tm); + attr->u.str=priv->fixiso8601; + } else + return 0; + } + break; + case attr_active: + active = attr_search(priv->attrs,NULL,attr_active); + if(active != NULL) { + attr->u.num=active->u.num; + return 1; + } else + return 0; + break; + default: + return 0; + } + attr->type = type; + return 1; +} + +static struct vehicle_methods vehicle_gpsd_methods = { + vehicle_gpsd_destroy, + vehicle_gpsd_position_attr_get, +}; + +static struct vehicle_priv * +vehicle_gpsd_new_gpsd(struct vehicle_methods + *meth, struct callback_list + *cbl, struct attr **attrs) +{ + struct vehicle_priv *ret; + struct attr *source, *query, *retry_int; + + dbg(1, "enter\n"); + source = attr_search(attrs, NULL, attr_source); + ret = g_new0(struct vehicle_priv, 1); +#if GPSD_API_MAJOR_VERSION >= 5 + ret->gps = g_new0(struct gps_data_t, 1); +#endif + ret->source = g_strdup(source->u.str); + query = attr_search(attrs, NULL, attr_gpsd_query); + if (query) { + ret->gpsd_query = g_strconcat(query->u.str, "\n", NULL); + } else { + ret->gpsd_query = g_strdup("w+x\n"); + } + dbg(1,"Format string for gpsd_query: %s\n",ret->gpsd_query); + retry_int = attr_search(attrs, NULL, attr_retry_interval); + if (retry_int) { + ret->retry_interval = retry_int->u.num; + if (ret->retry_interval < MIN_RETRY_INTERVAL) { + dbg(0, "Retry interval %d too small, setting to %d\n", ret->retry_interval, MIN_RETRY_INTERVAL); + ret->retry_interval = MIN_RETRY_INTERVAL; + } + } else { + dbg(1, "Retry interval not defined, setting to %d\n", DEFAULT_RETRY_INTERVAL); + ret->retry_interval = DEFAULT_RETRY_INTERVAL; + } + ret->cbl = cbl; + *meth = vehicle_gpsd_methods; + ret->attrs = attrs; + vehicle_gpsd_open(ret); + return ret; +} + +void +plugin_init(void) +{ + dbg(1, "enter\n"); + plugin_register_vehicle_type("gpsd", vehicle_gpsd_new_gpsd); +} diff --git a/navit/vehicle/gpsd_dbus/Makefile.am b/navit/vehicle/gpsd_dbus/Makefile.am new file mode 100644 index 0000000..4685d2e --- /dev/null +++ b/navit/vehicle/gpsd_dbus/Makefile.am @@ -0,0 +1,6 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ @DBUS_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_gpsd_dbus +modulevehicle_LTLIBRARIES = libvehicle_gpsd_dbus.la +libvehicle_gpsd_dbus_la_SOURCES = vehicle_gpsd_dbus.c +libvehicle_gpsd_dbus_la_LIBADD = @DBUS_LIBS@ +libvehicle_gpsd_dbus_la_LDFLAGS = -module -avoid-version diff --git a/navit/vehicle/gpsd_dbus/Makefile.in b/navit/vehicle/gpsd_dbus/Makefile.in new file mode 100644 index 0000000..0511e99 --- /dev/null +++ b/navit/vehicle/gpsd_dbus/Makefile.in @@ -0,0 +1,692 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/vehicle/gpsd_dbus +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulevehicledir)" +LTLIBRARIES = $(modulevehicle_LTLIBRARIES) +libvehicle_gpsd_dbus_la_DEPENDENCIES = +am_libvehicle_gpsd_dbus_la_OBJECTS = vehicle_gpsd_dbus.lo +libvehicle_gpsd_dbus_la_OBJECTS = \ + $(am_libvehicle_gpsd_dbus_la_OBJECTS) +libvehicle_gpsd_dbus_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libvehicle_gpsd_dbus_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libvehicle_gpsd_dbus_la_SOURCES) +DIST_SOURCES = $(libvehicle_gpsd_dbus_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ @DBUS_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_gpsd_dbus +modulevehicle_LTLIBRARIES = libvehicle_gpsd_dbus.la +libvehicle_gpsd_dbus_la_SOURCES = vehicle_gpsd_dbus.c +libvehicle_gpsd_dbus_la_LIBADD = @DBUS_LIBS@ +libvehicle_gpsd_dbus_la_LDFLAGS = -module -avoid-version +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/vehicle/gpsd_dbus/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/vehicle/gpsd_dbus/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulevehicleLTLIBRARIES: $(modulevehicle_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulevehicledir)" || $(MKDIR_P) "$(DESTDIR)$(modulevehicledir)" + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulevehicledir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulevehicledir)"; \ + } + +uninstall-modulevehicleLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulevehicledir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulevehicledir)/$$f"; \ + done + +clean-modulevehicleLTLIBRARIES: + -test -z "$(modulevehicle_LTLIBRARIES)" || rm -f $(modulevehicle_LTLIBRARIES) + @list='$(modulevehicle_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libvehicle_gpsd_dbus.la: $(libvehicle_gpsd_dbus_la_OBJECTS) $(libvehicle_gpsd_dbus_la_DEPENDENCIES) + $(libvehicle_gpsd_dbus_la_LINK) -rpath $(modulevehicledir) $(libvehicle_gpsd_dbus_la_OBJECTS) $(libvehicle_gpsd_dbus_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vehicle_gpsd_dbus.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulevehicledir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulevehicleLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulevehicleLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulevehicleLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulevehicleLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-modulevehicleLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulevehicleLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/vehicle/gpsd_dbus/vehicle_gpsd_dbus.c b/navit/vehicle/gpsd_dbus/vehicle_gpsd_dbus.c new file mode 100644 index 0000000..79ff13b --- /dev/null +++ b/navit/vehicle/gpsd_dbus/vehicle_gpsd_dbus.c @@ -0,0 +1,244 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#define DBUS_API_SUBJECT_TO_CHANGE +#include +#include +#include +#include +#include "debug.h" +#include "callback.h" +#include "plugin.h" +#include "coord.h" +#include "item.h" +#include "vehicle.h" +#include "event.h" + +static char *vehicle_gpsd_dbus_prefix="gpsd_dbus:"; + +struct vehicle_priv { + char *source; + char *address; + struct callback_list *cbl; + DBusConnection *connection; + double time, track, speed, altitude; + time_t fix_time; + struct coord_geo geo; + struct attr ** attrs; + char fixiso8601[128]; +}; + +static void +vehicle_gpsd_dbus_close(struct vehicle_priv *priv) +{ + if (priv->connection) + dbus_connection_unref(priv->connection); + priv->connection=NULL; +} + +static DBusHandlerResult +vehicle_gpsd_dbus_filter(DBusConnection *connection, DBusMessage *message, void *user_data) +{ + struct vehicle_priv *priv=user_data; + double time,ept,latitude,longitude,eph,altitude,epv,track,epd,speed,eps,climb,epc; + int mode; + char *devname; + + if (dbus_message_is_signal(message, "org.gpsd","fix")) { + dbus_message_get_args (message, NULL, + DBUS_TYPE_DOUBLE, &time, + DBUS_TYPE_INT32, &mode, + DBUS_TYPE_DOUBLE, &ept, + DBUS_TYPE_DOUBLE, &latitude, + DBUS_TYPE_DOUBLE, &longitude, + DBUS_TYPE_DOUBLE, &eph, + DBUS_TYPE_DOUBLE, &altitude, + DBUS_TYPE_DOUBLE, &epv, + DBUS_TYPE_DOUBLE, &track, + DBUS_TYPE_DOUBLE, &epd, + DBUS_TYPE_DOUBLE, &speed, + DBUS_TYPE_DOUBLE, &eps, + DBUS_TYPE_DOUBLE, &climb, + DBUS_TYPE_DOUBLE, &epc, + DBUS_TYPE_STRING, &devname, + DBUS_TYPE_INVALID); + if (!isnan(latitude) && !isnan(longitude)) { + priv->geo.lat=latitude; + priv->geo.lng=longitude; + } + if (!isnan(track)) + priv->track=track; + if (!isnan(speed)) + priv->speed=speed; + if (!isnan(altitude)) + priv->altitude=altitude; + if (time != priv->time) { + priv->time=time; + priv->fix_time=time; + callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); + } + } + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +static int +vehicle_gpsd_dbus_open(struct vehicle_priv *priv) +{ + DBusError error; + + dbus_error_init(&error); + if (priv->address) { + priv->connection = dbus_connection_open(priv->address, &error); + } else { + priv->connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error); + } + if (!priv->connection) { + dbg(0,"Failed to open connection to %s message bus: %s\n", priv->address?priv->address:"session",error.message); + dbus_error_free(&error); + return 0; + } + dbus_connection_setup_with_g_main(priv->connection, NULL); + dbus_bus_add_match(priv->connection,"type='signal',interface='org.gpsd'",&error); + dbus_connection_flush(priv->connection); + if (dbus_error_is_set(&error)) { + dbg(0,"Failed to add match to connection: %s\n", error.message); + vehicle_gpsd_dbus_close(priv); + return 0; + } + if (!dbus_connection_add_filter(priv->connection, vehicle_gpsd_dbus_filter, priv, NULL)) { + dbg(0,"Failed to add filter to connection\n"); + vehicle_gpsd_dbus_close(priv); + return 0; + } + return 1; +} + + +static void +vehicle_gpsd_dbus_destroy(struct vehicle_priv *priv) +{ + vehicle_gpsd_dbus_close(priv); + if (priv->source) + g_free(priv->source); + g_free(priv); +} + +static int +vehicle_gpsd_dbus_position_attr_get(struct vehicle_priv *priv, + enum attr_type type, struct attr *attr) +{ + switch (type) { + case attr_position_height: + attr->u.numd = &priv->altitude; + break; + case attr_position_speed: + attr->u.numd = &priv->speed; + break; + case attr_position_direction: + attr->u.numd = &priv->track; + break; + case attr_position_coord_geo: + attr->u.coord_geo = &priv->geo; + break; + case attr_position_time_iso8601: + { + struct tm tm; + if (!priv->fix_time) + return 0; + if (gmtime_r(&priv->fix_time, &tm)) { + strftime(priv->fixiso8601, sizeof(priv->fixiso8601), + "%Y-%m-%dT%TZ", &tm); + attr->u.str=priv->fixiso8601; + } else + return 0; + } + break; + default: + return 0; + } + attr->type = type; + return 1; +} + +static int +vehicle_gpsd_dbus_set_attr_do(struct vehicle_priv *priv, struct attr *attr, int init) +{ + switch (attr->type) { + case attr_source: + if (strncmp(vehicle_gpsd_dbus_prefix,attr->u.str,strlen(vehicle_gpsd_dbus_prefix))) { + dbg(0,"source must start with '%s'\n", vehicle_gpsd_dbus_prefix); + return 0; + } + g_free(priv->source); + priv->source=g_strdup(attr->u.str); + priv->address=priv->source+strlen(vehicle_gpsd_dbus_prefix); + if (!priv->address[0]) + priv->address=NULL; + if (!init) { + vehicle_gpsd_dbus_close(priv); + vehicle_gpsd_dbus_open(priv); + } + return 1; + default: + return 0; + } +} + +static int +vehicle_gpsd_dbus_set_attr(struct vehicle_priv *priv, struct attr *attr) +{ + return vehicle_gpsd_dbus_set_attr_do(priv, attr, 0); +} + +static struct vehicle_methods vehicle_gpsd_methods = { + vehicle_gpsd_dbus_destroy, + vehicle_gpsd_dbus_position_attr_get, + vehicle_gpsd_dbus_set_attr, +}; + +static struct vehicle_priv * +vehicle_gpsd_dbus_new(struct vehicle_methods + *meth, struct callback_list + *cbl, struct attr **attrs) +{ + struct vehicle_priv *ret; + + + ret = g_new0(struct vehicle_priv, 1); + ret->attrs = attrs; + ret->cbl = cbl; + *meth = vehicle_gpsd_methods; + while (*attrs) { + vehicle_gpsd_dbus_set_attr_do(ret, *attrs, 1); + attrs++; + } + vehicle_gpsd_dbus_open(ret); + return ret; +} + +void +plugin_init(void) +{ + dbg(1, "enter\n"); + plugin_register_vehicle_type("gpsd_dbus", vehicle_gpsd_dbus_new); +} diff --git a/navit/vehicle/gypsy/Makefile.am b/navit/vehicle/gypsy/Makefile.am new file mode 100644 index 0000000..1e997f2 --- /dev/null +++ b/navit/vehicle/gypsy/Makefile.am @@ -0,0 +1,6 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ @DBUS_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_gypsy +modulevehicle_LTLIBRARIES = libvehicle_gypsy.la +libvehicle_gypsy_la_SOURCES = vehicle_gypsy.c +libvehicle_gypsy_la_LIBADD = @GYPSY_LIBS@ +libvehicle_gypsy_la_LDFLAGS = -module -avoid-version diff --git a/navit/vehicle/gypsy/Makefile.in b/navit/vehicle/gypsy/Makefile.in new file mode 100644 index 0000000..fa2cc15 --- /dev/null +++ b/navit/vehicle/gypsy/Makefile.in @@ -0,0 +1,691 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/vehicle/gypsy +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulevehicledir)" +LTLIBRARIES = $(modulevehicle_LTLIBRARIES) +libvehicle_gypsy_la_DEPENDENCIES = +am_libvehicle_gypsy_la_OBJECTS = vehicle_gypsy.lo +libvehicle_gypsy_la_OBJECTS = $(am_libvehicle_gypsy_la_OBJECTS) +libvehicle_gypsy_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libvehicle_gypsy_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libvehicle_gypsy_la_SOURCES) +DIST_SOURCES = $(libvehicle_gypsy_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ @DBUS_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_gypsy +modulevehicle_LTLIBRARIES = libvehicle_gypsy.la +libvehicle_gypsy_la_SOURCES = vehicle_gypsy.c +libvehicle_gypsy_la_LIBADD = @GYPSY_LIBS@ +libvehicle_gypsy_la_LDFLAGS = -module -avoid-version +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/vehicle/gypsy/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/vehicle/gypsy/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulevehicleLTLIBRARIES: $(modulevehicle_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulevehicledir)" || $(MKDIR_P) "$(DESTDIR)$(modulevehicledir)" + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulevehicledir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulevehicledir)"; \ + } + +uninstall-modulevehicleLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulevehicledir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulevehicledir)/$$f"; \ + done + +clean-modulevehicleLTLIBRARIES: + -test -z "$(modulevehicle_LTLIBRARIES)" || rm -f $(modulevehicle_LTLIBRARIES) + @list='$(modulevehicle_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libvehicle_gypsy.la: $(libvehicle_gypsy_la_OBJECTS) $(libvehicle_gypsy_la_DEPENDENCIES) + $(libvehicle_gypsy_la_LINK) -rpath $(modulevehicledir) $(libvehicle_gypsy_la_OBJECTS) $(libvehicle_gypsy_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vehicle_gypsy.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulevehicledir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulevehicleLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulevehicleLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulevehicleLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulevehicleLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-modulevehicleLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulevehicleLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/vehicle/gypsy/vehicle_gypsy.c b/navit/vehicle/gypsy/vehicle_gypsy.c new file mode 100644 index 0000000..a49e9bd --- /dev/null +++ b/navit/vehicle/gypsy/vehicle_gypsy.c @@ -0,0 +1,497 @@ +/** @file vehicle_gypsy.c + * @brief gypsy uses dbus signals + * + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + * + * @Author Tim Niemeyer + * @date 2008-2009 + */ + +#include +#include +#include +#include +#include +#include +#ifdef USE_BINDING_DBUS +#include +#include +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#include +#endif +#include +#include +#include +#include "debug.h" +#include "callback.h" +#include "plugin.h" +#include "coord.h" +#include "item.h" +#include "vehicle.h" + +static struct vehicle_priv { + char *source; + GypsyControl *control; + GypsyPosition *position; + GypsyDevice *device; + GypsyCourse *course; + GypsySatellite *satellite; + char *path; + struct callback_list *cbl; + guint retry_interval; + struct coord_geo geo; + double speed; + double direction; + double height; + int fix_type; + time_t fix_time; + char fixiso8601[128]; + int sats; + int sats_used; + guint retry_timer; + struct attr ** attrs; + int have_cords; +} *vehicle_last; + +#define DEFAULT_RETRY_INTERVAL 10 // seconds +#define MIN_RETRY_INTERVAL 1 // seconds + +/** + * @brief When the fixstatus has changed, this function get called + * + * fixstatus can be one of this: + * GYPSY_DEVICE_FIX_STATUS_INVALID = 0 + * GYPSY_DEVICE_FIX_STATUS_NONE = 1 + * GYPSY_DEVICE_FIX_STATUS_2D = 2 + * GYPSY_DEVICE_FIX_STATUS_3D = 3 + * + * Anytime this functions get called, we have to call the global + * callback. + * + * @param device The GypsyDevice + * @param fixstatus The fisstatus 0, 1, 2 or 3 + * @param userdata + * @returns nothing + */ +static void +vehicle_gypsy_fixstatus_changed(GypsyDevice *device, + gint fixstatus, + gpointer userdata) +{ + struct vehicle_priv *priv = vehicle_last; + + if (fixstatus==GYPSY_DEVICE_FIX_STATUS_3D) + priv->fix_type = 3; + else if (fixstatus==GYPSY_DEVICE_FIX_STATUS_2D) + priv->fix_type = 1; + else + priv->fix_type = 0; + + callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); +} + +/** + * @brief When the position has changed, this function get called + * + * The fields_set can hold: + * GYPSY_POSITION_FIELDS_NONE = 1 << 0, + * GYPSY_POSITION_FIELDS_LATITUDE = 1 << 1, + * GYPSY_POSITION_FIELDS_LONGITUDE = 1 << 2, + * GYPSY_POSITION_FIELDS_ALTITUDE = 1 << 3 + * + * If we get any new information, we have to call the global + * callback. + * + * @param position The GypsyPosition + * @param fields_set Bitmask indicating what field was set + * @param timestamp the time since Unix Epoch + * @param latitude + * @param longitude + * @param altitude + * @param userdata + * @returns nothing + */ +static void +vehicle_gypsy_position_changed(GypsyPosition *position, + GypsyPositionFields fields_set, int timestamp, + double latitude, double longitude, double altitude, + gpointer userdata) +{ + struct vehicle_priv *priv = vehicle_last; + int cb = FALSE; + + if (timestamp > 0) + priv->fix_time = timestamp; + + if (fields_set & GYPSY_POSITION_FIELDS_LATITUDE) + { + cb = TRUE; + priv->geo.lat = latitude; + } + if (fields_set & GYPSY_POSITION_FIELDS_LONGITUDE) + { + cb = TRUE; + priv->geo.lng = longitude; + } + if (fields_set & GYPSY_POSITION_FIELDS_ALTITUDE) + { + cb = TRUE; + priv->height = altitude; + } + + if (cb) + { + priv->have_cords = 1; + callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); + } +} + +/** + * @brief Everytime any Sat-Details are changed, this function get called + * + * Going through all Sats, counting those wich are in use. + * + * Anytime this functions get called, we have to call the global + * callback. + * + * @param satellite The GypsySatellite + * @param satellites An GPtrArray wich hold information of all sats + * @param userdata + * @returns nothing + */ +static void +vehicle_gypsy_satellite_changed(GypsySatellite *satellite, + GPtrArray *satellites, + gpointer userdata) +{ + struct vehicle_priv *priv = vehicle_last; + + int i, sats, used=0; + + sats = satellites->len; + for (i = 0; i < sats; i++) { + GypsySatelliteDetails *details = satellites->pdata[i]; + if (details->in_use) + used++; + } + + priv->sats_used = used; + priv->sats = sats; + + callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); +} + +/** + * @brief When the course or speed has changed, this function get called + * + * Only speed and direction are used! + * + * If we get any new information, we have to call the global + * callback. + * + * @param course The GypsyCourse + * @param fields Bitmask indicating what field was set + * @param timestamp the time since Unix Epoch + * @param speed + * @param direction + * @param climb + * @param userdata + * @returns nothing + */ +static void +vehicle_gypsy_course_changed (GypsyCourse *course, + GypsyCourseFields fields, + int timestamp, + double speed, + double direction, + double climb, + gpointer userdata) +{ + struct vehicle_priv *priv = vehicle_last; + int cb = FALSE; + + if (fields & GYPSY_COURSE_FIELDS_SPEED) + { + priv->speed = speed; + cb = TRUE; + } + if (fields & GYPSY_COURSE_FIELDS_DIRECTION) + { + priv->direction = direction; + cb = TRUE; + } + + if (cb) + callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); +} + +/** + * @brief Attempt to open the gypsy device. + * + * Tells gypsy wich functions to call when anything occours. + * + * @param data + * @returns TRUE to try again; FALSE if retry not required + */ +static gboolean +vehicle_gypsy_try_open(gpointer *data) +{ + struct vehicle_priv *priv = (struct vehicle_priv *)data; + char *source = g_strdup(priv->source); + + GError *error = NULL; + + g_type_init(); + priv->control = gypsy_control_get_default(); + priv->path = gypsy_control_create(priv->control, source+8, &error); + if (priv->path == NULL) { + g_warning ("Error creating gypsy conrtol path for %s: %s", source+8, error->message); + return TRUE; + } + + priv->position = gypsy_position_new(priv->path); + g_signal_connect(priv->position, "position-changed", G_CALLBACK (vehicle_gypsy_position_changed), NULL); + + priv->satellite = gypsy_satellite_new(priv->path); + g_signal_connect(priv->satellite, "satellites-changed", G_CALLBACK (vehicle_gypsy_satellite_changed), NULL); + + priv->course = gypsy_course_new(priv->path); + g_signal_connect(priv->course, "course-changed", G_CALLBACK (vehicle_gypsy_course_changed), NULL); + + priv->device = gypsy_device_new(priv->path); + g_signal_connect(priv->device, "fix-status-changed", G_CALLBACK (vehicle_gypsy_fixstatus_changed), NULL); + + gypsy_device_start(priv->device, &error); + if (error != NULL) { + g_warning ("Error starting gypsy for %s: %s", source+8, error->message); + return TRUE; + } + + vehicle_last = priv; + dbg(0,"gypsy connected to %d\n", source+8); + g_free(source); + return FALSE; +} + +/** + * @brief Open a connection to gypsy. Will re-try the connection if it fails + * + * @param priv + * @returns nothing + */ +static void +vehicle_gypsy_open(struct vehicle_priv *priv) +{ + priv->retry_timer=0; + if (vehicle_gypsy_try_open((gpointer *)priv)) { + priv->retry_timer = g_timeout_add(priv->retry_interval*1000, (GSourceFunc)vehicle_gypsy_try_open, (gpointer *)priv); + } +} + +/** + * @brief Stop retry timer; Free alloced memory + * + * @param priv + * @returns nothing + */ +static void +vehicle_gypsy_close(struct vehicle_priv *priv) +{ + if (priv->retry_timer) { + g_source_remove(priv->retry_timer); + priv->retry_timer=0; + } + if (priv->path) + g_free(priv->path); + + if (priv->position) + g_free(priv->position); + + if (priv->satellite) + g_free(priv->satellite); + + if (priv->course) + g_free(priv->course); + + if (priv->device) + g_free(priv->device); + + if (priv->control) + g_object_unref(G_OBJECT (priv->control)); +} + +/** + * @brief Free the gypsy_vehicle + * + * @param priv + * @returns nothing + */ +static void +vehicle_gypsy_destroy(struct vehicle_priv *priv) +{ + vehicle_gypsy_close(priv); + if (priv->source) + g_free(priv->source); + g_free(priv); +} + +/** + * @brief Provide the outside with information + * + * @param priv + * @param type TODO: What can this be? + * @param attr + * @returns true/false + */ +static int +vehicle_gypsy_position_attr_get(struct vehicle_priv *priv, + enum attr_type type, struct attr *attr) +{ + struct attr * active=NULL; + switch (type) { + case attr_position_fix_type: + attr->u.num = priv->fix_type; + break; + case attr_position_height: + attr->u.numd = &priv->height; + break; + case attr_position_speed: + attr->u.numd = &priv->speed; + break; + case attr_position_direction: + attr->u.numd = &priv->direction; + break; + case attr_position_qual: + attr->u.num = priv->sats; + break; + case attr_position_sats_used: + attr->u.num = priv->sats_used; + break; + case attr_position_coord_geo: + attr->u.coord_geo = &priv->geo; + if (!priv->have_cords) + return 0; + break; + case attr_position_time_iso8601: + { + struct tm tm; + if (!priv->fix_time) + return 0; + if (gmtime_r(&priv->fix_time, &tm)) { + strftime(priv->fixiso8601, sizeof(priv->fixiso8601), + "%Y-%m-%dT%TZ", &tm); + attr->u.str=priv->fixiso8601; + } else + return 0; + } + case attr_active: + active = attr_search(priv->attrs,NULL,attr_active); + if(active != NULL && active->u.num == 1) + return 1; + else + return 0; + break; + + default: + return 0; + } + attr->type = type; + return 1; +} + +struct vehicle_methods vehicle_gypsy_methods = { + vehicle_gypsy_destroy, + vehicle_gypsy_position_attr_get, +}; + +/** + * @brief Create gypsy_vehicle + * + * @param meth + * @param cbl + * @param attrs + * @returns vehicle_priv + */ +static struct vehicle_priv * +vehicle_gypsy_new_gypsy(struct vehicle_methods *meth, + struct callback_list *cbl, + struct attr **attrs) +{ + struct vehicle_priv *ret; + struct attr *source, *retry_int; + +#if defined(USE_BINDING_DBUS) && defined(HAVE_UNISTD_H) + DBusConnection *conn; + DBusMessage *message; + dbus_uint32_t serial,pid=getpid(); + struct attr *destination,*path,*interface,*method; + + destination=attr_search(attrs, NULL, attr_dbus_destination); + path=attr_search(attrs, NULL, attr_dbus_path); + interface=attr_search(attrs, NULL, attr_dbus_interface); + method=attr_search(attrs, NULL, attr_dbus_method); + if (destination && path && interface && method) { + conn=dbus_bus_get(DBUS_BUS_SESSION, NULL); + if (conn) { + message=dbus_message_new_method_call(destination->u.str,path->u.str,interface->u.str,method->u.str); + dbus_message_append_args(message, DBUS_TYPE_INT32, &pid, DBUS_TYPE_INVALID); + dbus_connection_send(conn, message, &serial); + dbus_message_unref(message); + dbus_connection_unref(conn); + } else { + dbg(0,"failed to connect to session bus\n"); + } + } +#endif + dbg(1, "enter\n"); + source = attr_search(attrs, NULL, attr_source); + ret = g_new0(struct vehicle_priv, 1); + ret->have_cords = 0; + ret->source = g_strdup(source->u.str); + ret->attrs = attrs; + retry_int = attr_search(attrs, NULL, attr_retry_interval); + if (retry_int) { + ret->retry_interval = retry_int->u.num; + if (ret->retry_interval < MIN_RETRY_INTERVAL) { + dbg(0, "Retry interval %d too small, setting to %d\n", ret->retry_interval, MIN_RETRY_INTERVAL); + ret->retry_interval = MIN_RETRY_INTERVAL; + } + } else { + dbg(0, "Retry interval not defined, setting to %d\n", DEFAULT_RETRY_INTERVAL); + ret->retry_interval = DEFAULT_RETRY_INTERVAL; + } + ret->cbl = cbl; + *meth = vehicle_gypsy_methods; + vehicle_gypsy_open(ret); + return ret; +} + +/** + * @brief register vehicle_gypsy + * + * @returns nothing + */ +void +plugin_init(void) +{ + dbg(1, "enter\n"); + plugin_register_vehicle_type("gypsy", vehicle_gypsy_new_gypsy); +} diff --git a/navit/vehicle/iphone/Makefile.am b/navit/vehicle/iphone/Makefile.am new file mode 100644 index 0000000..7abb872 --- /dev/null +++ b/navit/vehicle/iphone/Makefile.am @@ -0,0 +1,6 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_iphone +modulevehicle_LTLIBRARIES = libvehicle_iphone.la +libvehicle_iphone_la_SOURCES = vehicle_iphone.c corelocation.m +libvehicle_iphone_la_LDFLAGS = -module -Wl,-framework,CoreLocation +libvehicle_iphone_la_LIBADD = @IPHONE_LIBS@ diff --git a/navit/vehicle/iphone/Makefile.in b/navit/vehicle/iphone/Makefile.in new file mode 100644 index 0000000..82fa1ef --- /dev/null +++ b/navit/vehicle/iphone/Makefile.in @@ -0,0 +1,722 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/vehicle/iphone +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulevehicledir)" +LTLIBRARIES = $(modulevehicle_LTLIBRARIES) +libvehicle_iphone_la_DEPENDENCIES = +am_libvehicle_iphone_la_OBJECTS = vehicle_iphone.lo corelocation.lo +libvehicle_iphone_la_OBJECTS = $(am_libvehicle_iphone_la_OBJECTS) +libvehicle_iphone_la_LINK = $(LIBTOOL) $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(OBJCLD) $(AM_OBJCFLAGS) \ + $(OBJCFLAGS) $(libvehicle_iphone_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +OBJCCOMPILE = $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS) +LTOBJCCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS) +OBJCLD = $(OBJC) +OBJCLINK = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(OBJCLD) $(AM_OBJCFLAGS) $(OBJCFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libvehicle_iphone_la_SOURCES) +DIST_SOURCES = $(libvehicle_iphone_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_iphone +modulevehicle_LTLIBRARIES = libvehicle_iphone.la +libvehicle_iphone_la_SOURCES = vehicle_iphone.c corelocation.m +libvehicle_iphone_la_LDFLAGS = -module -Wl,-framework,CoreLocation +libvehicle_iphone_la_LIBADD = @IPHONE_LIBS@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .m .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/vehicle/iphone/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/vehicle/iphone/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulevehicleLTLIBRARIES: $(modulevehicle_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulevehicledir)" || $(MKDIR_P) "$(DESTDIR)$(modulevehicledir)" + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulevehicledir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulevehicledir)"; \ + } + +uninstall-modulevehicleLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulevehicledir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulevehicledir)/$$f"; \ + done + +clean-modulevehicleLTLIBRARIES: + -test -z "$(modulevehicle_LTLIBRARIES)" || rm -f $(modulevehicle_LTLIBRARIES) + @list='$(modulevehicle_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libvehicle_iphone.la: $(libvehicle_iphone_la_OBJECTS) $(libvehicle_iphone_la_DEPENDENCIES) + $(libvehicle_iphone_la_LINK) -rpath $(modulevehicledir) $(libvehicle_iphone_la_OBJECTS) $(libvehicle_iphone_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/corelocation.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vehicle_iphone.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +.m.o: +@am__fastdepOBJC_TRUE@ $(OBJCCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepOBJC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepOBJC_FALSE@ $(OBJCCOMPILE) -c -o $@ $< + +.m.obj: +@am__fastdepOBJC_TRUE@ $(OBJCCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepOBJC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepOBJC_FALSE@ $(OBJCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.m.lo: +@am__fastdepOBJC_TRUE@ $(LTOBJCCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepOBJC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepOBJC_FALSE@ $(LTOBJCCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulevehicledir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulevehicleLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulevehicleLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulevehicleLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulevehicleLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-modulevehicleLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulevehicleLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/vehicle/iphone/corelocation.m b/navit/vehicle/iphone/corelocation.m new file mode 100644 index 0000000..5b13c28 --- /dev/null +++ b/navit/vehicle/iphone/corelocation.m @@ -0,0 +1,114 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#define VEHICLE_IPHONE_OBJC +#import "corelocation.h" + +#import +#import + +/* global location structure */ +corelocation *locationcontroller = NULL; + +/** C update procedure */ +void corelocation_update(double lat, double lng, double dir, double spd, char * str_time, double radius) { + FT_LOCATION_CB pf_cb = locationcontroller->pf_cb; + void * pv_arg = locationcontroller->pv_arg; + if(pf_cb) pf_cb(pv_arg, lat, lng, dir, spd, str_time, radius); +} + +/** C init procedure */ +void corelocation_init(void * pv_arg, FT_LOCATION_CB pf_cb) { + locationcontroller = [[corelocation alloc] init]; + + /** Save callbacks */ + locationcontroller->pv_arg = pv_arg; + locationcontroller->pf_cb = pf_cb; + + /** Start location process */ + [locationcontroller.locationManager startUpdatingLocation]; +} + +/** C exit procedure */ +void corelocation_exit(void) { + [locationcontroller dealloc]; +} + +/** Core location implementation */ +@implementation corelocation + +@synthesize locationManager; +@synthesize dateFormatter; +@synthesize eventDate; +@synthesize pv_arg; +@synthesize pf_cb; + +/** Init corelocation */ +- (id) init { + self = [super init]; + if (self != nil) { + self.locationManager = [[[CLLocationManager alloc] init] autorelease]; + self.locationManager.distanceFilter = kCLDistanceFilterNone; + self.locationManager.delegate = self; // send loc updates to myself + self.pf_cb = NULL; + self.pv_arg = NULL; + self.eventDate = [NSDate date]; + self.dateFormatter = [[NSDateFormatter alloc] init]; + [self.dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"]; + } + return self; +} + +/** New Data EVENT */ +- (void)locationManager:(CLLocationManager *)manager +didUpdateToLocation:(CLLocation *)newLocation +fromLocation:(CLLocation *)oldLocation +{ + NSLog(@"New Location: %@", [newLocation description]); + NSString *newDateString = [self.dateFormatter stringFromDate:newLocation.timestamp]; + const char* cString = [newDateString cStringUsingEncoding:NSASCIIStringEncoding]; + + if(self.pf_cb) { + self.pf_cb( + self.pv_arg, + (double)newLocation.coordinate.latitude, + (double) newLocation.coordinate.longitude, + (double) newLocation.course, + (double) newLocation.speed, + cString, + (double) newLocation.horizontalAccuracy + ); + } +} + +/** Error EVENT */ +- (void)locationManager:(CLLocationManager *)manager +didFailWithError:(NSError *)error +{ + NSLog(@"Error: %@", [error description]); +} + +/** Destructor */ +- (void)dealloc { + [self.locationManager release]; + [super dealloc]; +} + +@end + diff --git a/navit/vehicle/iphone/vehicle_iphone.c b/navit/vehicle/iphone/vehicle_iphone.c new file mode 100644 index 0000000..e69747a --- /dev/null +++ b/navit/vehicle/iphone/vehicle_iphone.c @@ -0,0 +1,165 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include "config.h" +#include "debug.h" +#include "coord.h" +#include "item.h" +#include "navit.h" +#include "map.h" +#include "route.h" +#include "callback.h" +#include "transform.h" +#include "plugin.h" +#include "vehicle.h" +#include "event.h" +#include "corelocation.h" + +struct vehicle_priv { + int interval; + int position_set; + struct callback_list *cbl; + struct navit *navit; + struct coord_geo geo; + struct coord last; + double config_speed; + double speed; + double direction; + double radius; + struct callback *timer_callback; + struct event_timeout *timer; + char str_time[200]; +}; + +static void +vehicle_iphone_destroy(struct vehicle_priv *priv) +{ + corelocation_exit(); + g_free(priv); +} + +static int +vehicle_iphone_position_attr_get(struct vehicle_priv *priv, + enum attr_type type, struct attr *attr) +{ + switch (type) { + case attr_position_speed: + attr->u.numd = &priv->speed; + break; + case attr_position_direction: + attr->u.numd = &priv->direction; + break; + case attr_position_coord_geo: + attr->u.coord_geo = &priv->geo; + break; + case attr_position_time_iso8601: + attr->u.str = priv->str_time; + break; + case attr_position_radius: + attr->u.numd = &priv->radius; + break; + case attr_position_nmea: + return 0; + default: + return 0; + } + attr->type = type; + return 1; +} + +static int +vehicle_iphone_set_attr(struct vehicle_priv *priv, struct attr *attr) +{ + if (attr->type == attr_navit) { + priv->navit = attr->u.navit; + return 1; + } + return 0; +} + +struct vehicle_methods vehicle_iphone_methods = { + vehicle_iphone_destroy, + vehicle_iphone_position_attr_get, + vehicle_iphone_set_attr, +}; + +void +vehicle_iphone_update(void *arg, + double lat, + double lng, + double dir, + double spd, + char * str_time, + double radius + ) +{ + struct vehicle_priv * priv = arg; + priv->geo.lat = lat; + priv->geo.lng = lng; + if(dir > 0) priv->direction = dir; + if(spd > 0) priv->speed = spd*3.6; + strcpy(priv->str_time, str_time); + priv->radius = radius; + + dbg(0,"position_get lat:%f lng:%f (spd:%f dir:%f time:%s)\n", priv->geo.lat, priv->geo.lng, priv->speed, priv->direction, priv->str_time); + callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); +} + + + +static struct vehicle_priv * +vehicle_iphone_new(struct vehicle_methods + *meth, struct callback_list + *cbl, struct attr **attrs) +{ + struct vehicle_priv *ret; + struct attr *interval,*speed,*position_coord_geo; + + dbg(1, "enter\n"); + ret = g_new0(struct vehicle_priv, 1); + ret->cbl = cbl; + ret->interval=1000; + ret->config_speed=40; + if ((speed=attr_search(attrs, NULL, attr_speed))) { + ret->config_speed=speed->u.num; + } + if ((interval=attr_search(attrs, NULL, attr_interval))) + ret->interval=interval->u.num; + if ((position_coord_geo=attr_search(attrs, NULL, attr_position_coord_geo))) { + ret->geo=*(position_coord_geo->u.coord_geo); + ret->position_set=1; + dbg(0,"position_set %f %f\n", ret->geo.lat, ret->geo.lng); + } + *meth = vehicle_iphone_methods; + ret->str_time[0] = '\0'; + + /** Initialize corelocation */ + corelocation_init(ret, vehicle_iphone_update); + + return ret; +} + +void +plugin_init(void) +{ + dbg(1, "enter\n"); + plugin_register_vehicle_type("iphone", vehicle_iphone_new); +} diff --git a/navit/vehicle/maemo/Makefile.am b/navit/vehicle/maemo/Makefile.am new file mode 100644 index 0000000..d82bdb6 --- /dev/null +++ b/navit/vehicle/maemo/Makefile.am @@ -0,0 +1,6 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ @LIBLOCATION_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_maemo +modulevehicle_LTLIBRARIES = libvehicle_maemo.la +libvehicle_maemo_la_SOURCES = vehicle_maemo.c +libvehicle_maemo_la_LIBADD = @LIBLOCATION_LIBS@ +libvehicle_maemo_la_LDFLAGS = -module -avoid-version diff --git a/navit/vehicle/maemo/Makefile.in b/navit/vehicle/maemo/Makefile.in new file mode 100644 index 0000000..f96b2a1 --- /dev/null +++ b/navit/vehicle/maemo/Makefile.in @@ -0,0 +1,691 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/vehicle/maemo +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulevehicledir)" +LTLIBRARIES = $(modulevehicle_LTLIBRARIES) +libvehicle_maemo_la_DEPENDENCIES = +am_libvehicle_maemo_la_OBJECTS = vehicle_maemo.lo +libvehicle_maemo_la_OBJECTS = $(am_libvehicle_maemo_la_OBJECTS) +libvehicle_maemo_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libvehicle_maemo_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libvehicle_maemo_la_SOURCES) +DIST_SOURCES = $(libvehicle_maemo_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ @LIBLOCATION_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_maemo +modulevehicle_LTLIBRARIES = libvehicle_maemo.la +libvehicle_maemo_la_SOURCES = vehicle_maemo.c +libvehicle_maemo_la_LIBADD = @LIBLOCATION_LIBS@ +libvehicle_maemo_la_LDFLAGS = -module -avoid-version +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/vehicle/maemo/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/vehicle/maemo/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulevehicleLTLIBRARIES: $(modulevehicle_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulevehicledir)" || $(MKDIR_P) "$(DESTDIR)$(modulevehicledir)" + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulevehicledir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulevehicledir)"; \ + } + +uninstall-modulevehicleLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulevehicledir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulevehicledir)/$$f"; \ + done + +clean-modulevehicleLTLIBRARIES: + -test -z "$(modulevehicle_LTLIBRARIES)" || rm -f $(modulevehicle_LTLIBRARIES) + @list='$(modulevehicle_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libvehicle_maemo.la: $(libvehicle_maemo_la_OBJECTS) $(libvehicle_maemo_la_DEPENDENCIES) + $(libvehicle_maemo_la_LINK) -rpath $(modulevehicledir) $(libvehicle_maemo_la_OBJECTS) $(libvehicle_maemo_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vehicle_maemo.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulevehicledir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulevehicleLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulevehicleLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulevehicleLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulevehicleLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-modulevehicleLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulevehicleLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/vehicle/maemo/vehicle_maemo.c b/navit/vehicle/maemo/vehicle_maemo.c new file mode 100644 index 0000000..024c975 --- /dev/null +++ b/navit/vehicle/maemo/vehicle_maemo.c @@ -0,0 +1,329 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + + +/* + Plugin for new Maemo's liblocation API. + + + source cound be on of "any","cwp","acwp","gnss","agnss" + retry_interval could be one of "1","2","5","10","20","30","60","120" measured in seconds +*/ + +#include +#include +#include +#include +#include +#include +#include "debug.h" +#include "callback.h" +#include "plugin.h" +#include "coord.h" +#include "item.h" +#include "vehicle.h" +#include "event.h" + +static struct vehicle_priv { + LocationGPSDControl *control; + LocationGPSDevice *device; + char *source; + guint retry_interval; + struct callback_list *cbl; + struct attr ** attrs; + int sats; // satellites_in_view + int sats_used; //satellites_in_user + int fix_type; //mode + struct coord_geo geo; //lattigute&longittude + double speed; //speed:) + double direction; //track + double height; //altitude + double hdop; //eph + time_t fix_time; //time + char fixiso8601[128]; +}; + + +static void vehicle_maemo_callback(LocationGPSDevice *device, gpointer user_data) { + struct vehicle_priv *priv=(struct vehicle_priv*)user_data; + + priv->sats=device->satellites_in_view; + priv->sats_used=device->satellites_in_use; + callback_list_call_attr_0(priv->cbl, attr_position_sats); + + dbg(1,"Got update with %u/%u satellites\n",priv->sats_used,priv->sats); + + if (device->fix) { + switch(device->fix->mode) { + case LOCATION_GPS_DEVICE_MODE_NOT_SEEN: + case LOCATION_GPS_DEVICE_MODE_NO_FIX: + priv->fix_type=0; + break; + case LOCATION_GPS_DEVICE_MODE_2D: + case LOCATION_GPS_DEVICE_MODE_3D: + priv->fix_type=1; + break; + } + + if (device->fix->fields & LOCATION_GPS_DEVICE_LATLONG_SET) { + priv->geo.lat=device->fix->latitude; + priv->geo.lng=device->fix->longitude; + priv->hdop=device->fix->eph/100; + callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); + dbg(1,"Position: %f %f with error %f meters\n",priv->geo.lat,priv->geo.lng,priv->hdop); + } + + if (device->fix->fields & LOCATION_GPS_DEVICE_SPEED_SET) { + priv->speed=device->fix->speed; + callback_list_call_attr_0(priv->cbl, attr_position_speed); + dbg(1,"Speed: %f\n ",priv->speed); + } + + if (device->fix->fields & LOCATION_GPS_DEVICE_TRACK_SET) { + priv->direction=device->fix->track; + dbg(1,"Direction: %f\n",priv->direction); + } + + if (device->fix->fields & LOCATION_GPS_DEVICE_TIME_SET) { + priv->fix_time=device->fix->time; + dbg(1,"Time: %f\n",priv->fix_time); + } + + if (device->fix->fields & LOCATION_GPS_DEVICE_ALTITUDE_SET) { + priv->height=device->fix->altitude; + dbg(1,"Elevation: %f\n",priv->height); + } + + } + + return; +} + +static void vehicle_maemo_error(LocationGPSDControl *control, LocationGPSDControlError error, gpointer user_data) +{ + switch (error) { + case LOCATION_ERROR_USER_REJECTED_DIALOG: + dbg(0,"User didn't enable requested methods\n"); + break; + case LOCATION_ERROR_USER_REJECTED_SETTINGS: + dbg(0,"User changed settings, which disabled location\n"); + break; + case LOCATION_ERROR_BT_GPS_NOT_AVAILABLE: + dbg(0,"Problems with BT GPS\n"); + break; + case LOCATION_ERROR_METHOD_NOT_ALLOWED_IN_OFFLINE_MODE: + dbg(0,"Requested method is not allowed in offline mode\n"); + break; + case LOCATION_ERROR_SYSTEM: + dbg(0,"System error\n"); + break; + } +} + +/** + * Instantiate liblocation objects + */ +static void +vehicle_maemo_open(struct vehicle_priv *priv) +{ + + priv->control = location_gpsd_control_get_default(); + priv->device = g_object_new(LOCATION_TYPE_GPS_DEVICE, NULL); + + if (!strcasecmp(priv->source+8,"cwp")) { + g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_CWP, NULL); + dbg(1,"Method set: CWP\n"); + } else if (!strcasecmp(priv->source+8,"acwp")) { + g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_ACWP, NULL); + dbg(1,"Method set: ACWP\n"); + } else if (!strcasecmp(priv->source+8,"gnss")) { + g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_GNSS, NULL); + dbg(1,"Method set: GNSS\n"); + } else if (!strcasecmp(priv->source+8,"agnss")) { + g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_AGNSS, NULL); + dbg(1,"Method set: AGNSS\n"); + } else { + g_object_set(G_OBJECT(priv->control), "preferred-method", LOCATION_METHOD_USER_SELECTED, NULL); + dbg(1,"Method set: ANY\n"); + } + + switch (priv->retry_interval) { + case 2: + g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_2S, NULL); + dbg(1,"Interval set: 2s\n"); + break; + case 5: + g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_5S, NULL); + dbg(1,"Interval set: 5s\n"); + break; + case 10: + g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_10S, NULL); + dbg(1,"Interval set: 10s\n"); + break; + case 20: + g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_20S, NULL); + dbg(1,"Interval set: 20s\n"); + break; + case 30: + g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_30S, NULL); + dbg(1,"Interval set: 30s\n"); + break; + case 60: + g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_60S, NULL); + dbg(1,"Interval set: 60s\n"); + break; + case 120: + g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_120S, NULL); + dbg(1,"Interval set: 120s\n"); + break; + case 1: + default: + g_object_set(G_OBJECT(priv->control), "preferred-interval", LOCATION_INTERVAL_1S, NULL); + dbg(1,"Interval set: 1s\n"); + break; + } + + g_signal_connect(priv->device, "changed", G_CALLBACK(vehicle_maemo_callback), priv); + g_signal_connect(priv->control, "error-verbose", G_CALLBACK(vehicle_maemo_error), priv); + + location_gpsd_control_start(priv->control); + + return; +} + +static void +vehicle_maemo_destroy(struct vehicle_priv *priv) +{ + location_gpsd_control_stop(priv->control); + + g_object_unref(priv->device); + g_object_unref(priv->control); + + return; +} + +static int +vehicle_maemo_position_attr_get(struct vehicle_priv *priv, + enum attr_type type, struct attr *attr) +{ + struct attr * active=NULL; + switch (type) { + case attr_position_fix_type: + dbg(1,"Attr requested: position_fix_type\n"); + attr->u.num = priv->fix_type; + break; + case attr_position_height: + dbg(1,"Attr requested: position_height\n"); + attr->u.numd = &priv->height; + break; + case attr_position_speed: + dbg(1,"Attr requested: position_speed\n"); + attr->u.numd = &priv->speed; + break; + case attr_position_direction: + dbg(1,"Attr requested: position_direction\n"); + attr->u.numd = &priv->direction; + break; + case attr_position_hdop: + dbg(1,"Attr requested: position_hdop\n"); + attr->u.numd = &priv->hdop; + break; + case attr_position_sats: + dbg(1,"Attr requested: position_sats_signal\n"); + attr->u.num = priv->sats; + break; + case attr_position_sats_used: + dbg(1,"Attr requested: position_sats_used\n"); + attr->u.num = priv->sats_used; + break; + case attr_position_coord_geo: + dbg(1,"Attr requested: position_coord_geo\n"); + attr->u.coord_geo = &priv->geo; + break; + case attr_position_time_iso8601: + { + struct tm tm; + dbg(1,"Attr requested: position_time_iso8601\n"); + if (!priv->fix_time) + return 0; + if (gmtime_r(&priv->fix_time, &tm)) { + strftime(priv->fixiso8601, sizeof(priv->fixiso8601), + "%Y-%m-%dT%TZ", &tm); + attr->u.str=priv->fixiso8601; + } else + return 0; + } + break; + case attr_active: + dbg(1,"Attr requested: position_active\n"); + active = attr_search(priv->attrs,NULL,attr_active); + if(active != NULL) { + attr->u.num=active->u.num; + return 1; + } else + return 0; + break; + default: + return 0; + } + attr->type = type; + return 1; +} + +struct vehicle_methods vehicle_maemo_methods = { + vehicle_maemo_destroy, + vehicle_maemo_position_attr_get, +}; + +static struct vehicle_priv * +vehicle_maemo_new_maemo(struct vehicle_methods + *meth, struct callback_list + *cbl, struct attr **attrs) +{ + struct vehicle_priv *ret; + struct attr *source, *retry_int; + + dbg(1, "enter\n"); + source = attr_search(attrs, NULL, attr_source); + ret = g_new0(struct vehicle_priv, 1); + ret->source = g_strdup(source->u.str); + retry_int = attr_search(attrs, NULL, attr_retry_interval); + if (retry_int) { + ret->retry_interval = retry_int->u.num; + if (ret->retry_interval !=1 && ret->retry_interval !=2 && ret->retry_interval !=5 && ret->retry_interval !=10 && ret->retry_interval !=20 && ret->retry_interval !=30 && ret->retry_interval !=60 && ret->retry_interval !=120 ) { + dbg(0, "Retry interval %d invalid, setting to 1\n", ret->retry_interval,1); + ret->retry_interval = 1; + } + } else { + ret->retry_interval = 1; + } + dbg(1,"source: %s, interval: %u\n",ret->source,ret->retry_interval); + ret->cbl = cbl; + *meth = vehicle_maemo_methods; + ret->attrs = attrs; + vehicle_maemo_open(ret); + return ret; +} + +void +plugin_init(void) +{ + dbg(1, "enter\n"); + plugin_register_vehicle_type("maemo", vehicle_maemo_new_maemo); +} diff --git a/navit/vehicle/null/Makefile.am b/navit/vehicle/null/Makefile.am new file mode 100644 index 0000000..83387eb --- /dev/null +++ b/navit/vehicle/null/Makefile.am @@ -0,0 +1,9 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_null +if PLUGINS + modulevehicle_LTLIBRARIES = libvehicle_null.la +else + noinst_LTLIBRARIES = libvehicle_null.la +endif +libvehicle_null_la_SOURCES = vehicle_null.c +libvehicle_null_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ diff --git a/navit/vehicle/null/Makefile.in b/navit/vehicle/null/Makefile.in new file mode 100644 index 0000000..aa592dc --- /dev/null +++ b/navit/vehicle/null/Makefile.in @@ -0,0 +1,703 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/vehicle/null +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulevehicledir)" +LTLIBRARIES = $(modulevehicle_LTLIBRARIES) $(noinst_LTLIBRARIES) +libvehicle_null_la_LIBADD = +am_libvehicle_null_la_OBJECTS = vehicle_null.lo +libvehicle_null_la_OBJECTS = $(am_libvehicle_null_la_OBJECTS) +libvehicle_null_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libvehicle_null_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libvehicle_null_la_rpath = +@PLUGINS_TRUE@am_libvehicle_null_la_rpath = -rpath $(modulevehicledir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libvehicle_null_la_SOURCES) +DIST_SOURCES = $(libvehicle_null_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_null +@PLUGINS_TRUE@modulevehicle_LTLIBRARIES = libvehicle_null.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libvehicle_null.la +libvehicle_null_la_SOURCES = vehicle_null.c +libvehicle_null_la_LDFLAGS = -module -avoid-version @NAVIT_MODULE_LDFLAGS@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/vehicle/null/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/vehicle/null/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulevehicleLTLIBRARIES: $(modulevehicle_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulevehicledir)" || $(MKDIR_P) "$(DESTDIR)$(modulevehicledir)" + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulevehicledir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulevehicledir)"; \ + } + +uninstall-modulevehicleLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulevehicledir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulevehicledir)/$$f"; \ + done + +clean-modulevehicleLTLIBRARIES: + -test -z "$(modulevehicle_LTLIBRARIES)" || rm -f $(modulevehicle_LTLIBRARIES) + @list='$(modulevehicle_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libvehicle_null.la: $(libvehicle_null_la_OBJECTS) $(libvehicle_null_la_DEPENDENCIES) + $(libvehicle_null_la_LINK) $(am_libvehicle_null_la_rpath) $(libvehicle_null_la_OBJECTS) $(libvehicle_null_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vehicle_null.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulevehicledir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulevehicleLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulevehicleLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulevehicleLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulevehicleLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-modulevehicleLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulevehicleLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/vehicle/null/vehicle_null.c b/navit/vehicle/null/vehicle_null.c new file mode 100644 index 0000000..79d15bc --- /dev/null +++ b/navit/vehicle/null/vehicle_null.c @@ -0,0 +1,183 @@ +/** @file vehicle_null.c + * @brief null uses dbus signals + * + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + * + * @Author Tim Niemeyer + * @date 2008-2009 + */ + +#include +#include +#include +#include +#include +#include "debug.h" +#include "callback.h" +#include "plugin.h" +#include "coord.h" +#include "item.h" +#include "vehicle.h" + +struct vehicle_priv { + struct callback_list *cbl; + struct coord_geo geo; + double speed; + double direction; + double height; + double radius; + int fix_type; + time_t fix_time; + char fixiso8601[128]; + int sats; + int sats_used; + int have_coords; + struct attr ** attrs; +}; + +/** + * @brief Free the null_vehicle + * + * @param priv + * @returns nothing + */ +static void +vehicle_null_destroy(struct vehicle_priv *priv) +{ + dbg(1,"enter\n"); + g_free(priv); +} + +/** + * @brief Provide the outside with information + * + * @param priv + * @param type TODO: What can this be? + * @param attr + * @returns true/false + */ +static int +vehicle_null_position_attr_get(struct vehicle_priv *priv, + enum attr_type type, struct attr *attr) +{ + dbg(1,"enter %s\n",attr_to_name(type)); + switch (type) { +#if 0 + case attr_position_fix_type: + attr->u.num = priv->fix_type; + break; +#endif + case attr_position_height: + attr->u.numd = &priv->height; + break; + case attr_position_speed: + attr->u.numd = &priv->speed; + break; + case attr_position_direction: + attr->u.numd = &priv->direction; + break; + case attr_position_radius: + attr->u.numd = &priv->radius; + break; + +#if 0 + case attr_position_qual: + attr->u.num = priv->sats; + break; + case attr_position_sats_used: + attr->u.num = priv->sats_used; + break; +#endif + case attr_position_coord_geo: + attr->u.coord_geo = &priv->geo; + if (!priv->have_coords) + return 0; + break; + case attr_position_time_iso8601: + attr->u.str=priv->fixiso8601; + break; + default: + return 0; + } + dbg(1,"ok\n"); + attr->type = type; + return 1; +} + +static int +vehicle_null_set_attr(struct vehicle_priv *priv, struct attr *attr) +{ + switch (attr->type) { + case attr_position_speed: + priv->speed=*attr->u.numd; + break; + case attr_position_direction: + priv->direction=*attr->u.numd; + break; + case attr_position_coord_geo: + priv->geo=*attr->u.coord_geo; + priv->have_coords=1; + break; + default: + break; + } + callback_list_call_attr_0(priv->cbl, attr->type); + return 1; +} + + +struct vehicle_methods vehicle_null_methods = { + vehicle_null_destroy, + vehicle_null_position_attr_get, + vehicle_null_set_attr, +}; + +/** + * @brief Create null_vehicle + * + * @param meth + * @param cbl + * @param attrs + * @returns vehicle_priv + */ +static struct vehicle_priv * +vehicle_null_new_null(struct vehicle_methods *meth, + struct callback_list *cbl, + struct attr **attrs) +{ + struct vehicle_priv *ret; + + dbg(1, "enter\n"); + ret = g_new0(struct vehicle_priv, 1); + ret->cbl = cbl; + *meth = vehicle_null_methods; + dbg(1, "return\n"); + return ret; +} + +/** + * @brief register vehicle_null + * + * @returns nothing + */ +void +plugin_init(void) +{ + dbg(1, "enter\n"); + plugin_register_vehicle_type("null", vehicle_null_new_null); +} diff --git a/navit/vehicle/webos/Makefile.am b/navit/vehicle/webos/Makefile.am new file mode 100644 index 0000000..73021ee --- /dev/null +++ b/navit/vehicle/webos/Makefile.am @@ -0,0 +1,5 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ @SDL_CFLAGS@ @LIBPDL_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_webos +modulevehicle_LTLIBRARIES = libvehicle_webos.la +libvehicle_webos_la_SOURCES = vehicle_webos.c +libvehicle_webos_la_LDFLAGS = @SDL_LIBS@ @LIBPDL_LIBS@ -module -avoid-version diff --git a/navit/vehicle/webos/Makefile.in b/navit/vehicle/webos/Makefile.in new file mode 100644 index 0000000..30ca840 --- /dev/null +++ b/navit/vehicle/webos/Makefile.in @@ -0,0 +1,690 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/vehicle/webos +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulevehicledir)" +LTLIBRARIES = $(modulevehicle_LTLIBRARIES) +libvehicle_webos_la_LIBADD = +am_libvehicle_webos_la_OBJECTS = vehicle_webos.lo +libvehicle_webos_la_OBJECTS = $(am_libvehicle_webos_la_OBJECTS) +libvehicle_webos_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libvehicle_webos_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libvehicle_webos_la_SOURCES) +DIST_SOURCES = $(libvehicle_webos_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ @SDL_CFLAGS@ @LIBPDL_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_webos +modulevehicle_LTLIBRARIES = libvehicle_webos.la +libvehicle_webos_la_SOURCES = vehicle_webos.c +libvehicle_webos_la_LDFLAGS = @SDL_LIBS@ @LIBPDL_LIBS@ -module -avoid-version +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/vehicle/webos/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/vehicle/webos/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulevehicleLTLIBRARIES: $(modulevehicle_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulevehicledir)" || $(MKDIR_P) "$(DESTDIR)$(modulevehicledir)" + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulevehicledir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulevehicledir)"; \ + } + +uninstall-modulevehicleLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulevehicledir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulevehicledir)/$$f"; \ + done + +clean-modulevehicleLTLIBRARIES: + -test -z "$(modulevehicle_LTLIBRARIES)" || rm -f $(modulevehicle_LTLIBRARIES) + @list='$(modulevehicle_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libvehicle_webos.la: $(libvehicle_webos_la_OBJECTS) $(libvehicle_webos_la_DEPENDENCIES) + $(libvehicle_webos_la_LINK) -rpath $(modulevehicledir) $(libvehicle_webos_la_OBJECTS) $(libvehicle_webos_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vehicle_webos.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulevehicledir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulevehicleLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulevehicleLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulevehicleLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulevehicleLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-modulevehicleLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulevehicleLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/vehicle/webos/vehicle_webos.c b/navit/vehicle/webos/vehicle_webos.c new file mode 100644 index 0000000..127fa2a --- /dev/null +++ b/navit/vehicle/webos/vehicle_webos.c @@ -0,0 +1,349 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "debug.h" +#include "callback.h" +#include "plugin.h" +#include "coord.h" +#include "item.h" +#include "vehicle.h" +#include "event.h" + +static char *vehicle_webos_prefix="webos:"; + +struct vehicle_priv { + char *source; + char *address; + struct callback_list *cbl; + struct callback *event_cb; + double track, speed, altitude, radius; + time_t fix_time; + struct coord_geo geo; + struct attr ** attrs; + char fixiso8601[128]; + int pdk_version; + struct event_timeout *ev_timeout; + struct callback *timeout_cb; + unsigned int delta; +}; + +static void +vehicle_webos_callback(PDL_ServiceParameters *params, void *user) +{ + PDL_Location *location; + SDL_Event event; + SDL_UserEvent userevent; + int err; + + err = PDL_GetParamInt(params, "errorCode"); + if (err != 0) { + dbg(0,"Location Callback errorCode %d\n", err); + return /*PDL_EOTHER*/; + } + + location = g_new0 (PDL_Location, 1); + + location->altitude = PDL_GetParamDouble(params, "altitude"); + location->velocity = PDL_GetParamDouble(params, "velocity"); + location->heading = PDL_GetParamDouble(params, "heading"); + location->horizontalAccuracy = PDL_GetParamDouble(params, "horizAccuracy"); + location->latitude = PDL_GetParamDouble(params, "latitude"); + location->longitude = PDL_GetParamDouble(params, "longitude"); + + userevent.type = SDL_USEREVENT; + userevent.code = PDL_GPS_UPDATE; + userevent.data1 = location; + userevent.data2 = NULL; + + event.type = SDL_USEREVENT; + event.user = userevent; + + SDL_PushEvent(&event); + + return /*PDL_NOERROR*/; +} + +static void +vehicle_webos_gps_update(struct vehicle_priv *priv, PDL_Location *location) +{ + struct timeval tv; + gettimeofday(&tv,NULL); + + priv->delta = (unsigned int)difftime(tv.tv_sec, priv->fix_time); + dbg(1,"delta(%i)\n",priv->delta); + priv->fix_time = tv.tv_sec; + priv->geo.lat = location->latitude; + /* workaround for webOS GPS bug following */ + priv->geo.lng = (priv->pdk_version >= 200 && location->longitude >= -1 && location->longitude <= 1) ? + -location->longitude : location->longitude; + + dbg(2,"Location: %f %f %f %.12g %.12g +-%fm\n", + location->altitude, + location->velocity, + location->heading, + priv->geo.lat, + priv->geo.lng, + location->horizontalAccuracy); + + if (location->altitude != -1) + priv->altitude = location->altitude; + if (location->velocity != -1) + priv->speed = location->velocity * 3.6; + if (location->heading != -1) + priv->track = location->heading; + if (location->horizontalAccuracy != -1) + priv->radius = location->horizontalAccuracy; + + if (priv->pdk_version <= 100) + g_free(location); + + callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); +} + +static void +vehicle_webos_timeout_callback(struct vehicle_priv *priv) +{ + struct timeval tv; + gettimeofday(&tv,NULL); + + if (priv->fix_time) { + int delta = (int)difftime(tv.tv_sec, priv->fix_time); + + if (delta >= priv->delta*2) { + dbg(1, "GPS timeout triggered cb(%p)\n", priv->timeout_cb); + + priv->delta = 0; + + callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); + } + } +} + +static void +vehicle_webos_close(struct vehicle_priv *priv) +{ + event_remove_timeout(priv->ev_timeout); + priv->ev_timeout = NULL; + + callback_destroy(priv->timeout_cb); + + if (priv->pdk_version <= 100) + PDL_UnregisterServiceCallback((PDL_ServiceCallbackFunc)vehicle_webos_callback); + else + PDL_EnableLocationTracking(PDL_FALSE); +} + +static int +vehicle_webos_open(struct vehicle_priv *priv) +{ + PDL_Err err; + + priv->pdk_version = PDL_GetPDKVersion(); + dbg(1,"pdk_version(%d)\n", priv->pdk_version); + + if (priv->pdk_version <= 100) { + err = PDL_ServiceCallWithCallback("palm://com.palm.location/startTracking", + "{subscribe:true}", + (PDL_ServiceCallbackFunc)vehicle_webos_callback, + priv, + PDL_FALSE); + if (err != PDL_NOERROR) { + dbg(0,"PDL_ServiceCallWithCallback failed with (%d): (%s)\n", err, PDL_GetError()); + vehicle_webos_close(priv); + return 0; + } + } + else { + dbg(1,"Calling PDL_EnableLocationTracking(PDL_TRUE)\n"); + err = PDL_EnableLocationTracking(PDL_TRUE); + if (err != PDL_NOERROR) { + dbg(0,"PDL_EnableLocationTracking failed with (%d): (%s)\n", err, PDL_GetError()); + vehicle_webos_close(priv); + return 0; + } + } + + priv->ev_timeout = event_add_timeout(1000, 1, priv->timeout_cb); + + return 1; +} + +static void +vehicle_webos_destroy(struct vehicle_priv *priv) +{ + vehicle_webos_close(priv); + if (priv->source) + g_free(priv->source); + g_free(priv); +} + +static int +vehicle_webos_position_attr_get(struct vehicle_priv *priv, + enum attr_type type, struct attr *attr) +{ + switch (type) { + case attr_position_height: + dbg(2,"Altitude: %f\n", priv->altitude); + attr->u.numd = &priv->altitude; + break; + case attr_position_speed: + dbg(2,"Speed: %f\n", priv->speed); + attr->u.numd = &priv->speed; + break; + case attr_position_direction: + dbg(2,"Direction: %f\n", priv->track); + attr->u.numd = &priv->track; + break; + case attr_position_coord_geo: + dbg(2,"Coord: %.12g %.12g\n", priv->geo.lat, priv->geo.lng); + attr->u.coord_geo = &priv->geo; + break; + case attr_position_radius: + dbg(2,"Radius: %f\n", priv->radius); + attr->u.numd = &priv->radius; + break; + case attr_position_time_iso8601: + if (priv->fix_time) { + struct tm tm; + if (gmtime_r(&priv->fix_time, &tm)) { + strftime(priv->fixiso8601, sizeof(priv->fixiso8601), + "%Y-%m-%dT%TZ", &tm); + attr->u.str=priv->fixiso8601; + } + else { + priv->fix_time = 0; + return 0; + } + dbg(2,"Fix Time: %d %s\n", priv->fix_time, priv->fixiso8601); + } + else { + dbg(2,"Fix Time: %d\n", priv->fix_time); + return 0; + } + + break; + case attr_position_fix_type: + if (priv->delta == 0 || priv->radius == 0.0) + attr->u.num = 0; // strength = 1 + else if (priv->radius > 20.0) + attr->u.num = 1; // strength >= 2 + else + attr->u.num = 2; // strength >= 2 + + break; + case attr_position_sats_used: + if (priv->delta == 0) + attr->u.num = 0; + else if (priv->radius <= 6.0 ) + attr->u.num = 6; // strength = 5 + else if (priv->radius <= 10.0 ) + attr->u.num = 5; // strength = 4 + else if (priv->radius <= 15.0 ) + attr->u.num = 4; // strength = 3 + else + return 0; + + break; + default: + return 0; + } + attr->type = type; + return 1; +} + +static int +vehicle_webos_set_attr_do(struct vehicle_priv *priv, struct attr *attr, int init) +{ + switch (attr->type) { + case attr_source: + if (strncmp(vehicle_webos_prefix,attr->u.str,strlen(vehicle_webos_prefix))) { + dbg(1,"source must start with '%s'\n", vehicle_webos_prefix); + return 0; + } + g_free(priv->source); + priv->source=g_strdup(attr->u.str); + priv->address=priv->source+strlen(vehicle_webos_prefix); + if (!priv->address[0]) + priv->address=NULL; + if (!init) { + vehicle_webos_close(priv); + vehicle_webos_open(priv); + } + return 1; + case attr_profilename: + return 1; + case attr_pdl_gps_update: + vehicle_webos_gps_update(priv, (PDL_Location *)attr->u.data); + return 1; + default: + return 0; + } +} + +static int +vehicle_webos_set_attr(struct vehicle_priv *priv, struct attr *attr) +{ + return vehicle_webos_set_attr_do(priv, attr, 0); +} + +struct vehicle_methods vehicle_webos_methods = { + vehicle_webos_destroy, + vehicle_webos_position_attr_get, + vehicle_webos_set_attr, +}; + +static struct vehicle_priv * +vehicle_webos_new(struct vehicle_methods + *meth, struct callback_list + *cbl, struct attr **attrs) +{ + struct vehicle_priv *priv; + + priv = g_new0(struct vehicle_priv, 1); + priv->attrs = attrs; + priv->cbl = cbl; + + priv->timeout_cb = callback_new_1(callback_cast(vehicle_webos_timeout_callback), priv); + + *meth = vehicle_webos_methods; + while (*attrs) { + vehicle_webos_set_attr_do(priv, *attrs, 1); + attrs++; + } + + vehicle_webos_open(priv); + + return priv; +} + +void +plugin_init(void) +{ + dbg(1, "enter\n"); + plugin_register_vehicle_type("webos", vehicle_webos_new); +} + diff --git a/navit/vehicle/wince/Makefile.am b/navit/vehicle/wince/Makefile.am new file mode 100644 index 0000000..af6fcb1 --- /dev/null +++ b/navit/vehicle/wince/Makefile.am @@ -0,0 +1,9 @@ +include $(top_srcdir)/Makefile.inc +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_wince +if PLUGINS +modulevehicle_LTLIBRARIES = libvehicle_wince.la +else +noinst_LTLIBRARIES = libvehicle_wince.la +endif +libvehicle_wince_la_SOURCES = vehicle_wince.c +libvehicle_wince_la_LDFLAGS = -module -avoid-version diff --git a/navit/vehicle/wince/Makefile.in b/navit/vehicle/wince/Makefile.in new file mode 100644 index 0000000..69290d4 --- /dev/null +++ b/navit/vehicle/wince/Makefile.in @@ -0,0 +1,704 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +subdir = navit/vehicle/wince +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(modulevehicledir)" +LTLIBRARIES = $(modulevehicle_LTLIBRARIES) $(noinst_LTLIBRARIES) +libvehicle_wince_la_LIBADD = +am_libvehicle_wince_la_OBJECTS = vehicle_wince.lo +libvehicle_wince_la_OBJECTS = $(am_libvehicle_wince_la_OBJECTS) +libvehicle_wince_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libvehicle_wince_la_LDFLAGS) $(LDFLAGS) -o $@ +@PLUGINS_FALSE@am_libvehicle_wince_la_rpath = +@PLUGINS_TRUE@am_libvehicle_wince_la_rpath = -rpath \ +@PLUGINS_TRUE@ $(modulevehicledir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libvehicle_wince_la_SOURCES) +DIST_SOURCES = $(libvehicle_wince_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +AM_CPPFLAGS = @NAVIT_CFLAGS@ -I$(top_srcdir)/navit -DMODULE=vehicle_wince +@PLUGINS_TRUE@modulevehicle_LTLIBRARIES = libvehicle_wince.la +@PLUGINS_FALSE@noinst_LTLIBRARIES = libvehicle_wince.la +libvehicle_wince_la_SOURCES = vehicle_wince.c +libvehicle_wince_la_LDFLAGS = -module -avoid-version +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/vehicle/wince/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/vehicle/wince/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-modulevehicleLTLIBRARIES: $(modulevehicle_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(modulevehicledir)" || $(MKDIR_P) "$(DESTDIR)$(modulevehicledir)" + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modulevehicledir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modulevehicledir)"; \ + } + +uninstall-modulevehicleLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modulevehicle_LTLIBRARIES)'; test -n "$(modulevehicledir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modulevehicledir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modulevehicledir)/$$f"; \ + done + +clean-modulevehicleLTLIBRARIES: + -test -z "$(modulevehicle_LTLIBRARIES)" || rm -f $(modulevehicle_LTLIBRARIES) + @list='$(modulevehicle_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libvehicle_wince.la: $(libvehicle_wince_la_OBJECTS) $(libvehicle_wince_la_DEPENDENCIES) + $(libvehicle_wince_la_LINK) $(am_libvehicle_wince_la_rpath) $(libvehicle_wince_la_OBJECTS) $(libvehicle_wince_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vehicle_wince.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(modulevehicledir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-modulevehicleLTLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-modulevehicleLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-modulevehicleLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-modulevehicleLTLIBRARIES \ + clean-noinstLTLIBRARIES ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-modulevehicleLTLIBRARIES install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-modulevehicleLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/vehicle/wince/vehicle_wince.c b/navit/vehicle/wince/vehicle_wince.c new file mode 100644 index 0000000..41b8c8a --- /dev/null +++ b/navit/vehicle/wince/vehicle_wince.c @@ -0,0 +1,925 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include +#include +#include +#include +#include "config.h" +#include "debug.h" +#include "callback.h" +#include "plugin.h" +#include "coord.h" +#include "item.h" +#include "event.h" +#include "vehicle.h" +#include +#include +#include +#include +#include +#include +#include "support/win32/ConvertUTF.h" + +#define SwitchToThread() Sleep(0) + +typedef int (WINAPI *PFN_BthSetMode)(DWORD pBthMode); +typedef int (WINAPI *PFN_BthGetMode)(DWORD* pBthMode); + +char *_convert = NULL; +wchar_t *_wconvert = NULL; +#define W2A(lpw) (\ + ((LPCSTR)lpw == NULL) ? NULL : (\ + _convert = alloca(wcslen(lpw)+1), wcstombs(_convert, lpw, wcslen(lpw) + 1), _convert) ) + +#define A2W(lpa) (\ + ((LPCSTR)lpa == NULL) ? NULL : (\ + _wconvert = alloca(strlen(lpa)*2+1), mbstowcs(_wconvert, lpa, strlen(lpa) * 2 + 1), _wconvert) ) + +static void vehicle_wince_disable_watch(struct vehicle_priv *priv); +static void vehicle_wince_enable_watch(struct vehicle_priv *priv); +static int vehicle_wince_parse(struct vehicle_priv *priv, char *buffer); +static int vehicle_wince_open(struct vehicle_priv *priv); +static void vehicle_wince_close(struct vehicle_priv *priv); + +enum file_type { + file_type_pipe = 1, file_type_device, file_type_file, file_type_socket +}; + +static int buffer_size = 1024; + +struct gps_sat { + int prn; + int elevation; + int azimuth; + int snr; +}; + + +struct vehicle_priv { + char *source; + struct callback_list *cbl; + struct callback_list *priv_cbl; + int is_running; + int thread_up; + int fd; + HANDLE m_hGPSDevice; // Handle to the device + HANDLE m_hGPSThread; // Handle to the thread + DWORD m_dwGPSThread; // Thread id + + char *buffer; + int buffer_pos; + char *read_buffer; + int read_buffer_pos; + char *nmea_data; + char *nmea_data_buf; + + struct coord_geo geo; + double speed; + double direction; + double height; + double hdop; + double vdop; + char fixtime[20]; + int fixyear; + int fixmonth; + int fixday; + int status; + int sats_used; + int sats_visible; + int sats_signal; + int time; + int on_eof; + int baudrate; + enum file_type file_type; + struct attr ** attrs; + char fixiso8601[128]; + int checksum_ignore; + HMODULE hBthDll; + PFN_BthSetMode BthSetMode; + int magnetic_direction; + int current_count; + struct gps_sat current[24]; + int next_count; + struct gps_sat next[24]; + struct item sat_item; + int valid; + int has_data; + GMutex lock; +}; + +static void initBth(struct vehicle_priv *priv) +{ + + BOOL succeeded = FALSE; + priv->hBthDll = LoadLibrary(TEXT("bthutil.dll")); + if ( priv->hBthDll ) + { + DWORD bthMode; + PFN_BthGetMode BthGetMode = (PFN_BthGetMode)GetProcAddress(priv->hBthDll, TEXT("BthGetMode") ); + + if ( BthGetMode && BthGetMode(&bthMode) == ERROR_SUCCESS && bthMode == 0 ) + { + priv->BthSetMode = (PFN_BthSetMode)GetProcAddress(priv->hBthDll, TEXT("BthSetMode") ); + if( priv->BthSetMode && priv->BthSetMode(1) == ERROR_SUCCESS ) + { + dbg(1, "bluetooth activated\n"); + succeeded = TRUE; + } + } + + } + else + { + dbg(0, "Bluetooth library notfound\n"); + } + + if ( !succeeded ) + { + + dbg(1, "Bluetooth already enabled or failed to enable it.\n"); + priv->BthSetMode = NULL; + if ( priv->hBthDll ) + { + FreeLibrary(priv->hBthDll); + } + } +} + +static int initDevice(struct vehicle_priv *priv) +{ + COMMTIMEOUTS commTiming; + HANDLE hGPS; + if ( priv->m_hGPSDevice ) + CloseHandle(priv->m_hGPSDevice); + + if ( priv->file_type == file_type_device ) + { + dbg(0, "Init Device\n"); + /* GPD0 is the control port for the GPS driver */ + hGPS = CreateFile(L"GPD0:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + if (hGPS != INVALID_HANDLE_VALUE) { +#ifndef IOCTL_SERVICE_REFRESH +#define IOCTL_SERVICE_REFRESH 0x4100000C +#endif + DeviceIoControl(hGPS,IOCTL_SERVICE_REFRESH,0,0,0,0,0,0); +#ifndef IOCTL_SERVICE_START +#define IOCTL_SERVICE_START 0x41000004 +#endif + DeviceIoControl(hGPS,IOCTL_SERVICE_START,0,0,0,0,0,0); + CloseHandle(hGPS); + } + + while (priv->is_running && + (priv->m_hGPSDevice = CreateFile(A2W(priv->source), + GENERIC_READ, 0, + NULL, OPEN_EXISTING, 0, 0)) == INVALID_HANDLE_VALUE) { + Sleep(1000); + dbg(0, "Waiting to connect to %s\n", priv->source); + } + GetCommTimeouts (priv->m_hGPSDevice, &commTiming); + commTiming.ReadIntervalTimeout = 20; + commTiming.ReadTotalTimeoutMultiplier = 0; + commTiming.ReadTotalTimeoutConstant = 200; + + commTiming.WriteTotalTimeoutMultiplier=5; + commTiming.WriteTotalTimeoutConstant=5; + SetCommTimeouts (priv->m_hGPSDevice, &commTiming); + + if (priv->baudrate) { + DCB portState; + if (!GetCommState(priv->m_hGPSDevice, &portState)) { + MessageBox (NULL, TEXT ("GetCommState Error"), TEXT (""), + MB_APPLMODAL|MB_OK); + priv->thread_up = 0; + return 0; + } + portState.BaudRate = priv->baudrate; + if (!SetCommState(priv->m_hGPSDevice, &portState)) { + MessageBox (NULL, TEXT ("SetCommState Error"), TEXT (""), + MB_APPLMODAL|MB_OK); + priv->thread_up = 0; + return 0; + } + } + + } + else + { + dbg(0, "Open File\n"); + priv->m_hGPSDevice = CreateFileW( A2W(priv->source), + GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0); + if ( priv->m_hGPSDevice == INVALID_HANDLE_VALUE) { + dbg(0, "Could not open %s\n", priv->source); + return 0; + } + } + return 1; + +} + +static int read_win32(struct vehicle_priv *priv, char *buffer, size_t size) +{ + int ret_size; + + g_mutex_lock(&priv->lock); + ret_size = MIN(size,priv->read_buffer_pos); + priv->has_data = 0; + memcpy(buffer, priv->read_buffer, ret_size); + + memmove(priv->read_buffer, priv->read_buffer + ret_size, buffer_size - ret_size); + priv->read_buffer_pos -= ret_size; + g_mutex_unlock(&priv->lock); + return ret_size; +} + +static DWORD WINAPI wince_reader_thread (LPVOID lParam) +{ + struct vehicle_priv *priv = lParam; + char chunk_buffer[3*82]; + BOOL status; + DWORD bytes_read; + int waitcounter; + + dbg(0, "GPS Port:[%s]\n", priv->source); + priv->thread_up = 1; + + if ( !initDevice(priv) ) { + return -1; + } + while (priv->is_running) + { + dbg(1,"readfile\n"); + waitcounter = 0; + status = ReadFile(priv->m_hGPSDevice, + chunk_buffer, sizeof(chunk_buffer), + &bytes_read, NULL); + + if ( !status ) + { + dbg(0,"Error reading file/device. Try again.\n"); + initDevice(priv); + continue; + } + + while ( priv->read_buffer_pos + bytes_read > buffer_size ) + { +/* TODO (rikky#1#): should use blocking */ + if ( priv->file_type != file_type_file ) + { + dbg(0, "GPS data comes too fast. Have to wait here\n"); + } + + Sleep(50); + waitcounter++; + if ( waitcounter % 8 == 0 ) + { + dbg(0, "Remind them of the data\n"); + event_call_callback(priv->priv_cbl); + } + + } + + g_mutex_lock(&priv->lock); + memcpy(priv->read_buffer + priv->read_buffer_pos , chunk_buffer, bytes_read ); + + priv->read_buffer_pos += bytes_read; + + if ( !priv->has_data ) + { + event_call_callback(priv->priv_cbl); + priv->has_data = 1; + } + + g_mutex_unlock(&priv->lock); + + } + return TRUE; +} + +static int +vehicle_wince_available_ports(void) +{ + HKEY hkResult; + HKEY hkSubResult; + wchar_t keyname[20]; + wchar_t devicename[100]; + wchar_t devicetype[100]; + int index = 0; + DWORD regkey_length = sizeof(keyname); + DWORD regdevtype_length = sizeof(devicetype); + + RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("Drivers\\Active"), 0, 0, &hkResult); + while (RegEnumKeyEx( hkResult, index++, keyname, ®key_length, NULL, NULL, NULL, NULL) == ERROR_SUCCESS ) + { + if (RegOpenKeyEx( hkResult, keyname, 0, 0, &hkSubResult) == ERROR_SUCCESS ) + { + regkey_length = sizeof(keyname); + if ( RegQueryValueEx( hkSubResult, L"Name", NULL, NULL, (LPBYTE)devicename, ®key_length) == ERROR_SUCCESS ) + { + regdevtype_length = sizeof(devicetype); + if ( RegQueryValueEx( hkSubResult, L"Key", NULL, NULL, (LPBYTE)devicetype, ®devtype_length) == ERROR_SUCCESS ) + { + dbg(0, "Found device '%s' (%s)\n", W2A(devicename), W2A(devicetype)); + } + else + { + dbg(0, "Found device '%s'\n", W2A(devicename)); + } + } + RegCloseKey(hkSubResult); + } + regkey_length = sizeof(keyname); + } + + RegCloseKey(hkResult); + return 0; +} + + +static int +vehicle_wince_open(struct vehicle_priv *priv) +{ + char* raw_setting_str; + char* strport; + char* strsettings; + + dbg(1, "enter vehicle_wince_open, priv->source='%s'\n", priv->source); + + if (priv->source ) { + + if ( strcmp(priv->source, "list") == 0 ) + { + vehicle_wince_available_ports(); + return 0; + } + + raw_setting_str = g_strdup( priv->source ); + strport = strchr(raw_setting_str, ':' ); + strsettings = strchr(raw_setting_str, ' ' ); + + if (raw_setting_str && strport&&strsettings ) { + strport++; + *strsettings = '\0'; + strsettings++; + + dbg(0, "serial('%s', '%s')\n", strport, strsettings ); + } + if (raw_setting_str) + g_free( raw_setting_str ); + } + return 1; +} + +static void +vehicle_wince_close(struct vehicle_priv *priv) +{ + dbg(1,"enter"); +} + +static int +vehicle_wince_parse(struct vehicle_priv *priv, char *buffer) +{ + char *nmea_data_buf, *p, *item[32]; + double lat, lng; + int i, j, bcsum; + int len = strlen(buffer); + unsigned char csum = 0; + int valid=0; + int ret = 0; + + dbg(2, "enter: buffer='%s'\n", buffer); + for (;;) { + if (len < 4) { + dbg(0, "'%s' too short\n", buffer); + return ret; + } + if (buffer[len - 1] == '\r' || buffer[len - 1] == '\n') { + buffer[--len] = '\0'; + if (buffer[len - 1] == '\r') + buffer[--len] = '\0'; + } else + break; + } + if (buffer[0] != '$') { + dbg(0, "no leading $ in '%s'\n", buffer); + return ret; + } + if (buffer[len - 3] != '*') { + dbg(0, "no *XX in '%s'\n", buffer); + return ret; + } + for (i = 1; i < len - 3; i++) { + csum ^= (unsigned char) (buffer[i]); + } + if (!sscanf(buffer + len - 2, "%x", &bcsum) && priv->checksum_ignore != 2) { + dbg(0, "no checksum in '%s'\n", buffer); + return ret; + } + if (bcsum != csum && priv->checksum_ignore == 0) { + dbg(0, "wrong checksum in '%s'\n", buffer); + return ret; + } + + if (!priv->nmea_data_buf || strlen(priv->nmea_data_buf) < 65536) { + nmea_data_buf=g_strconcat(priv->nmea_data_buf ? priv->nmea_data_buf : "", buffer, "\n", NULL); + g_free(priv->nmea_data_buf); + priv->nmea_data_buf=nmea_data_buf; + } else { + dbg(0, "nmea buffer overflow, discarding '%s'\n", buffer); + } + i = 0; + p = buffer; + while (i < 31) { + item[i++] = p; + while (*p && *p != ',') + p++; + if (!*p) + break; + *p++ = '\0'; + } + + if (!strncmp(buffer, "$GPGGA", 6)) { + /* 1 1111 + 0 1 2 3 4 5 6 7 8 9 0 1234 + $GPGGA,184424.505,4924.2811,N,01107.8846,E,1,05,2.5,408.6,M,,,,0000*0C + UTC of Fix[1],Latitude[2],N/S[3],Longitude[4],E/W[5],Quality(0=inv,1=gps,2=dgps)[6],Satelites used[7], + HDOP[8],Altitude[9],"M"[10],height of geoid[11], "M"[12], time since dgps update[13], dgps ref station [14] + */ + if (*item[2] && *item[3] && *item[4] && *item[5]) { + lat = g_ascii_strtod(item[2], NULL); + priv->geo.lat = floor(lat / 100); + lat -= priv->geo.lat * 100; + priv->geo.lat += lat / 60; + + if (!g_strcasecmp(item[3],"S")) + priv->geo.lat=-priv->geo.lat; + + lng = g_ascii_strtod(item[4], NULL); + priv->geo.lng = floor(lng / 100); + lng -= priv->geo.lng * 100; + priv->geo.lng += lng / 60; + + if (!g_strcasecmp(item[5],"W")) + priv->geo.lng=-priv->geo.lng; + priv->valid=attr_position_valid_valid; + dbg(2, "latitude '%2.4f' longitude %2.4f\n", priv->geo.lat, priv->geo.lng); + + } else + priv->valid=attr_position_valid_invalid; + if (*item[6]) + sscanf(item[6], "%d", &priv->status); + if (*item[7]) + sscanf(item[7], "%d", &priv->sats_used); + if (*item[8]) + sscanf(item[8], "%lf", &priv->hdop); + if (*item[1]) + strncpy(priv->fixtime, item[1], sizeof(priv->fixtime)); + if (*item[9]) + sscanf(item[9], "%lf", &priv->height); + + g_free(priv->nmea_data); + priv->nmea_data=priv->nmea_data_buf; + priv->nmea_data_buf=NULL; + } + if (!strncmp(buffer, "$GPVTG", 6)) { + /* 0 1 2 34 5 6 7 8 + $GPVTG,143.58,T,,M,0.26,N,0.5,K*6A + Course Over Ground Degrees True[1],"T"[2],Course Over Ground Degrees Magnetic[3],"M"[4], + Speed in Knots[5],"N"[6],"Speed in KM/H"[7],"K"[8] + */ + if (item[1] && item[7]) + valid = 1; + if (i >= 10 && (*item[9] == 'A' || *item[9] == 'D')) + valid = 1; + if (valid) { + priv->direction = g_ascii_strtod( item[1], NULL ); + priv->speed = g_ascii_strtod( item[7], NULL ); + dbg(2,"direction %lf, speed %2.1lf\n", priv->direction, priv->speed); + } + } + if (!strncmp(buffer, "$GPRMC", 6)) { + /* 1 1 + 0 1 2 3 4 5 6 7 8 9 0 1 + $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A + Time[1],Active/Void[2],lat[3],N/S[4],long[5],W/E[6],speed in knots[7],track angle[8],date[9], + magnetic variation[10],magnetic variation direction[11] + */ + if (*item[2] == 'A') + valid = 1; + if (i >= 13 && (*item[12] == 'A' || *item[12] == 'D')) + valid = 1; + if (valid) { + priv->direction = g_ascii_strtod( item[8], NULL ); + priv->speed = g_ascii_strtod( item[7], NULL ); + priv->speed *= 1.852; + sscanf(item[9], "%02d%02d%02d", + &priv->fixday, + &priv->fixmonth, + &priv->fixyear); + priv->fixyear += 2000; + } + ret = 1; + } + if (!strncmp(buffer, "$GPGSV", 6) && i >= 4) { + /* + 0 GSV Satellites in view + 1 2 Number of sentences for full data + 2 1 sentence 1 of 2 + 3 08 Number of satellites in view + + 4 01 Satellite PRN number + 5 40 Elevation, degrees + 6 083 Azimuth, degrees + 7 46 SNR - higher is better + for up to 4 satellites per sentence + *75 the checksum data, always begins with * + */ + if (item[3]) { + sscanf(item[3], "%d", &priv->sats_visible); + } + j=4; + while (j+4 <= i && priv->current_count < 24) { + struct gps_sat *sat=&priv->next[priv->next_count++]; + sat->prn=atoi(item[j]); + sat->elevation=atoi(item[j+1]); + sat->azimuth=atoi(item[j+2]); + sat->snr=atoi(item[j+3]); + j+=4; + } + if (!strcmp(item[1], item[2])) { + priv->sats_signal=0; + for (i = 0 ; i < priv->next_count ; i++) { + priv->current[i]=priv->next[i]; + if (priv->current[i].snr) + priv->sats_signal++; + } + priv->current_count=priv->next_count; + priv->next_count=0; + } + } + if (!strncmp(buffer, "$GPZDA", 6)) { + /* + 0 1 2 3 4 5 6 + $GPZDA,hhmmss.ss,dd,mm,yyyy,xx,yy*CC + hhmmss HrMinSec(UTC) + dd,mm,yyy Day,Month,Year + xx local zone hours -13..13 + yy local zone minutes 0..59 + */ + if (item[1] && item[2] && item[3] && item[4]) { + strncpy(priv->fixtime, item[1], strlen(priv->fixtime)); + priv->fixday = atoi(item[2]); + priv->fixmonth = atoi(item[3]); + priv->fixyear = atoi(item[4]); + } + } + if (!strncmp(buffer, "$IISMD", 6)) { + /* + 0 1 2 3 4 + $IISMD,dir,press,height,temp*CC" + dir Direction (0-359) + press Pressure (hpa, i.e. 1032) + height Barometric height above ground (meter) + temp Temperature (Degree Celsius) + */ + if (item[1]) { + priv->magnetic_direction = g_ascii_strtod( item[1], NULL ); + dbg(1,"magnetic %d\n", priv->magnetic_direction); + } + } + return ret; +} + +static void +vehicle_wince_io(struct vehicle_priv *priv) +{ + int size, rc = 0; + char *str, *tok; + + dbg(1, "vehicle_file_io : enter\n"); + + size = read_win32(priv, priv->buffer + priv->buffer_pos, buffer_size - priv->buffer_pos - 1); + + if (size <= 0) { + switch (priv->on_eof) { + case 0: + vehicle_wince_close(priv); + vehicle_wince_open(priv); + break; + case 1: + vehicle_wince_disable_watch(priv); + break; + case 2: + exit(0); + break; + } + return; + } + priv->buffer_pos += size; + priv->buffer[priv->buffer_pos] = '\0'; + dbg(1, "size=%d pos=%d buffer='%s'\n", size, + priv->buffer_pos, priv->buffer); + str = priv->buffer; + while ((tok = strchr(str, '\n'))) { + *tok++ = '\0'; + dbg(1, "line='%s'\n", str); + rc +=vehicle_wince_parse(priv, str); + str = tok; + if (priv->file_type == file_type_file && rc) + break; + } + + if (str != priv->buffer) { + size = priv->buffer + priv->buffer_pos - str; + memmove(priv->buffer, str, size + 1); + priv->buffer_pos = size; + dbg(2, "now pos=%d buffer='%s'\n", + priv->buffer_pos, priv->buffer); + } else if (priv->buffer_pos == buffer_size - 1) { + dbg(0, + "Overflow. Most likely wrong baud rate or no nmea protocol\n"); + priv->buffer_pos = 0; + } + if (rc) + callback_list_call_attr_0(priv->cbl, attr_position_coord_geo); +} + +static void +vehicle_wince_enable_watch(struct vehicle_priv *priv) +{ + dbg(1, "enter"); + vehicle_wince_disable_watch(priv); + priv->is_running = 1; + + InitializeCriticalSection(&priv->lock); + priv->m_hGPSThread = CreateThread(NULL, 0, wince_reader_thread, + priv, 0, &priv->m_dwGPSThread); + + if (!priv->m_hGPSThread) { + priv->is_running = 0; + // error creating thread + MessageBox (NULL, TEXT ("Can not create GPS reader thread"), TEXT (""), + MB_APPLMODAL|MB_OK); + } +} + +static void +vehicle_wince_disable_watch(struct vehicle_priv *priv) +{ + int wait = 5000; + + dbg(1, "enter"); + + priv->is_running = 0; + while (wait-- > 0 && priv->thread_up) { + SwitchToThread(); + } + if (priv->m_hGPSThread) { + // Terminate reader, sorry + TerminateThread(priv->m_hGPSThread, -1); + } +} + + +static void +vehicle_wince_destroy(struct vehicle_priv *priv) +{ + vehicle_wince_disable_watch(priv); + vehicle_wince_close(priv); + if (priv->BthSetMode) + { + (void)priv->BthSetMode(0); + FreeLibrary(priv->hBthDll); + } + if (priv->source) + g_free(priv->source); + if (priv->buffer) + g_free(priv->buffer); + if (priv->read_buffer) + g_free(priv->read_buffer); + g_free(priv); +} + +static int +vehicle_wince_position_attr_get(struct vehicle_priv *priv, + enum attr_type type, struct attr *attr) +{ + switch (type) { + case attr_position_fix_type: + attr->u.num = priv->status; + break; + case attr_position_height: + attr->u.numd = &priv->height; + break; + case attr_position_speed: + attr->u.numd = &priv->speed; + break; + case attr_position_direction: + attr->u.numd = &priv->direction; + break; + case attr_position_magnetic_direction: + attr->u.num = priv->magnetic_direction; + break; + case attr_position_hdop: + attr->u.numd = &priv->hdop; + break; + case attr_position_qual: + attr->u.num = priv->sats_visible; + break; + case attr_position_sats_signal: + attr->u.num = priv->sats_signal; + break; + case attr_position_sats_used: + attr->u.num = priv->sats_used; + break; + case attr_position_coord_geo: + attr->u.coord_geo = &priv->geo; + break; + case attr_position_nmea: + attr->u.str=priv->nmea_data; + if (! attr->u.str) + return 0; + break; + case attr_position_time_iso8601: + if (!priv->fixyear || !priv->fixtime[0]) + return 0; + sprintf(priv->fixiso8601, "%04d-%02d-%02dT%.2s:%.2s:%sZ", + priv->fixyear, priv->fixmonth, priv->fixday, + priv->fixtime, (priv->fixtime+2), (priv->fixtime+4)); + attr->u.str=priv->fixiso8601; + break; + case attr_position_sat_item: + dbg(0,"at here\n"); + priv->sat_item.id_lo++; + if (priv->sat_item.id_lo > priv->current_count) { + priv->sat_item.id_lo=0; + return 0; + } + attr->u.item=&priv->sat_item; + break; + case attr_position_valid: + attr->u.num=priv->valid; + break; + default: + return 0; + } + if (type != attr_position_sat_item) + priv->sat_item.id_lo=0; + attr->type = type; + return 1; +} + +static int +vehicle_wince_sat_attr_get(void *priv_data, enum attr_type type, struct attr *attr) +{ + struct vehicle_priv *priv=priv_data; + struct gps_sat *sat; + + if (priv->sat_item.id_lo < 1) + return 0; + if (priv->sat_item.id_lo > priv->current_count) + return 0; + sat=&priv->current[priv->sat_item.id_lo-1]; + switch (type) { + case attr_sat_prn: + attr->u.num=sat->prn; + break; + case attr_sat_elevation: + attr->u.num=sat->elevation; + break; + case attr_sat_azimuth: + attr->u.num=sat->azimuth; + break; + case attr_sat_snr: + attr->u.num=sat->snr; + break; + default: + return 0; + } + attr->type = type; + return 1; +} + +static struct item_methods vehicle_wince_sat_methods = { + NULL, + NULL, + NULL, + vehicle_wince_sat_attr_get, + NULL, + NULL, + NULL, + NULL, +}; + +struct vehicle_methods vehicle_wince_methods = { + vehicle_wince_destroy, + vehicle_wince_position_attr_get, + NULL, +}; + +static struct vehicle_priv * +vehicle_wince_new(struct vehicle_methods + *meth, struct callback_list + *cbl, struct attr **attrs) +{ + struct vehicle_priv *ret; + struct attr *source; + struct attr *time; + struct attr *on_eof; + struct attr *baudrate; + struct attr *checksum_ignore; + struct attr *handle_bluetooth; + char *cp; + + dbg(1, "enter\n"); + source = attr_search(attrs, NULL, attr_source); + ret = g_new0(struct vehicle_priv, 1); + ret->fd = -1; + ret->cbl = cbl; + + ret->file_type = file_type_device; + cp = strchr(source->u.str,':'); + if (cp) + { + if ( strncmp(source->u.str, "file", 4) == 0 ) + ret->file_type = file_type_file; + cp++; + } + else + cp = source->u.str; + ret->source = g_strdup(cp); + ret->buffer = g_malloc(buffer_size); + ret->time=1000; + ret->baudrate=0; // do not change the rate if not configured + + time = attr_search(attrs, NULL, attr_time); + if (time) + ret->time=time->u.num; + baudrate = attr_search(attrs, NULL, attr_baudrate); + if (baudrate) { + ret->baudrate = baudrate->u.num; + } + checksum_ignore = attr_search(attrs, NULL, attr_checksum_ignore); + if (checksum_ignore) + ret->checksum_ignore=checksum_ignore->u.num; + ret->attrs = attrs; + on_eof = attr_search(attrs, NULL, attr_on_eof); + if (on_eof && !g_strcasecmp(on_eof->u.str, "stop")) + ret->on_eof=1; + if (on_eof && !g_strcasecmp(on_eof->u.str, "exit")) + ret->on_eof=2; + dbg(0,"on_eof=%d\n", ret->on_eof); + *meth = vehicle_wince_methods; + ret->priv_cbl = callback_list_new(); + callback_list_add(ret->priv_cbl, callback_new_1(callback_cast(vehicle_wince_io), ret)); + ret->sat_item.type=type_position_sat; + ret->sat_item.id_hi=ret->sat_item.id_lo=0; + ret->sat_item.priv_data=ret; + ret->sat_item.meth=&vehicle_wince_sat_methods; + + ret->read_buffer = g_malloc(buffer_size); + + handle_bluetooth = attr_search(attrs, NULL, attr_bluetooth); + if ( handle_bluetooth && handle_bluetooth->u.num == 1 ) + initBth(ret); + + if (vehicle_wince_open(ret)) { + vehicle_wince_enable_watch(ret); + return ret; + } + dbg(0, "Failed to open '%s'\n", ret->source); + vehicle_wince_destroy(ret); + return NULL; +} + +void +plugin_init(void) +{ + dbg(1, "enter\n"); + plugin_register_vehicle_type("wince", vehicle_wince_new); + plugin_register_vehicle_type("file", vehicle_wince_new); +} diff --git a/navit/vehicleprofile.c b/navit/vehicleprofile.c new file mode 100644 index 0000000..63eb40d --- /dev/null +++ b/navit/vehicleprofile.c @@ -0,0 +1,157 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include +#include +#include +#include "debug.h" +#include "item.h" +#include "roadprofile.h" +#include "vehicleprofile.h" + +static void +vehicleprofile_set_attr_do(struct vehicleprofile *this_, struct attr *attr) +{ + dbg(1,"%s:%d\n", attr_to_name(attr->type), attr->u.num); + switch (attr->type) { + case attr_flags: + this_->flags=attr->u.num; + break; + case attr_flags_forward_mask: + this_->flags_forward_mask=attr->u.num; + break; + case attr_flags_reverse_mask: + this_->flags_reverse_mask=attr->u.num; + break; + case attr_maxspeed_handling: + this_->maxspeed_handling=attr->u.num; + break; + case attr_route_mode: + this_->mode=attr->u.num; + break; + case attr_name: + if(this_->name) + g_free(this_->name); + /* previously used strdupn not available on win32 */ + this_->name = g_strdup(attr->u.str); + break; + case attr_vehicle_axle_weight: + this_->axle_weight=attr->u.num; + break; + case attr_vehicle_height: + this_->height=attr->u.num; + break; + case attr_vehicle_length: + this_->length=attr->u.num; + break; + case attr_vehicle_weight: + this_->weight=attr->u.num; + break; + case attr_vehicle_width: + this_->width=attr->u.num; + break; + case attr_static_speed: + this_->static_speed=attr->u.num; + break; + case attr_static_distance: + this_->static_distance=attr->u.num; + break; + case attr_through_traffic_penalty: + this_->through_traffic_penalty=attr->u.num; + break; + default: + break; + } +} + +struct vehicleprofile * +vehicleprofile_new(struct attr *parent, struct attr **attrs) +{ + struct vehicleprofile *this_; + struct attr **attr, *type_attr; + if (! (type_attr=attr_search(attrs, NULL, attr_name))) { + return NULL; + } + this_=g_new0(struct vehicleprofile, 1); + this_->attrs=attr_list_dup(attrs); + this_->roadprofile_hash=g_hash_table_new(NULL, NULL); + this_->length=-1; + this_->width=-1; + this_->height=-1; + this_->weight=-1; + this_->axle_weight=-1; + this_->through_traffic_penalty=9000; + for (attr=attrs;*attr; attr++) + vehicleprofile_set_attr_do(this_, *attr); + return this_; +} + +int +vehicleprofile_get_attr(struct vehicleprofile *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter) +{ + return attr_generic_get_attr(this_->attrs, NULL, type, attr, iter); +} + +int +vehicleprofile_set_attr(struct vehicleprofile *this_, struct attr *attr) +{ + vehicleprofile_set_attr_do(this_, attr); + this_->attrs=attr_generic_set_attr(this_->attrs, attr); + return 1; +} + +int +vehicleprofile_add_attr(struct vehicleprofile *this_, struct attr *attr) +{ + struct attr item_types_attr; + this_->attrs=attr_generic_add_attr(this_->attrs, attr); + switch (attr->type) { + case attr_roadprofile: + if (roadprofile_get_attr(attr->u.roadprofile, attr_item_types, &item_types_attr, NULL)) { + enum item_type *types=item_types_attr.u.item_types; + while (*types != type_none) { + g_hash_table_insert(this_->roadprofile_hash, (void *)(long)(*types), attr->u.roadprofile); + types++; + } + } + break; + default: + break; + } + return 1; +} + +int +vehicleprofile_remove_attr(struct vehicleprofile *this_, struct attr *attr) +{ + this_->attrs=attr_generic_remove_attr(this_->attrs, attr); + return 1; +} + +struct roadprofile * +vehicleprofile_get_roadprofile(struct vehicleprofile *this_, enum item_type type) +{ + return g_hash_table_lookup(this_->roadprofile_hash, (void *)(long)type); +} + +char * +vehicleprofile_get_name(struct vehicleprofile *this_) +{ + return this_->name; +} diff --git a/navit/vehicleprofile.h b/navit/vehicleprofile.h new file mode 100644 index 0000000..41bd268 --- /dev/null +++ b/navit/vehicleprofile.h @@ -0,0 +1,55 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + + +#ifdef __cplusplus +extern "C" { +#endif +struct vehicleprofile { + int mode; /**< 0 = Auto, 1 = On-Road, 2 = Off-Road */ + int flags_forward_mask; /**< Flags mask for moving in positive direction */ + int flags_reverse_mask; /**< Flags mask for moving in reverse direction */ + int flags; /**< Required flags to move through a segment */ + int maxspeed_handling; /**< 0 = Always, 1 = Only if lower, 2 = Never */ + int static_speed; /**< Maximum speed of vehicle to consider it stationary */ + int static_distance; /**< Maximum distance of previous position of vehicle to consider it stationary */ + char *name; /**< the vehicle profile name */ + int width; /**< Width of the vehicle in cm */ + int height; /**< Height of the vehicle in cm */ + int length; /**< Length of the vehicle in cm */ + int weight; /**< Weight of the vehicle in kg */ + int axle_weight; /**< Axle Weight of the vehicle in kg */ + int dangerous_goods; /**< Flags of dangerous goods present */ + int through_traffic_penalty; /**< Penalty when driving on a through traffic limited road */ + struct attr **attrs; + GHashTable *roadprofile_hash; +}; + +struct vehicleprofile * vehicleprofile_new(struct attr *parent, struct attr **attrs); +int vehicleprofile_get_attr(struct vehicleprofile *this_, enum attr_type type, struct attr *attr, struct attr_iter *iter); +int vehicleprofile_set_attr(struct vehicleprofile *this_, struct attr *attr); +int vehicleprofile_add_attr(struct vehicleprofile *this_, struct attr *attr); +int vehicleprofile_remove_attr(struct vehicleprofile *this_, struct attr *attr); +struct roadprofile * vehicleprofile_get_roadprofile(struct vehicleprofile *this_, enum item_type type); + +//! Returns the vehicle profile's name. +char * vehicleprofile_get_name(struct vehicleprofile *this_); +#ifdef __cplusplus +} +#endif diff --git a/navit/window.h b/navit/window.h new file mode 100644 index 0000000..b2e2acb --- /dev/null +++ b/navit/window.h @@ -0,0 +1,24 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2009 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +struct window { + void *priv; + int (*fullscreen)(struct window *win, int on); + void (*disable_suspend)(struct window *win); +}; diff --git a/navit/xmlconfig.c b/navit/xmlconfig.c new file mode 100644 index 0000000..86df7e8 --- /dev/null +++ b/navit/xmlconfig.c @@ -0,0 +1,1201 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2009 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +/* see http://library.gnome.org/devel/glib/stable/glib-Simple-XML-Subset-Parser.html + * for details on how the xml file parser works. + */ + +#include +#include +#include +#include +#include +#include "debug.h" +#include "config.h" +#include "file.h" +#include "coord.h" +#include "layout.h" +#include "mapset.h" +#include "projection.h" +#include "map.h" +#include "navigation.h" +#include "navit.h" +#include "plugin.h" +#include "route.h" +#include "speech.h" +#include "track.h" +#include "vehicle.h" +#include "point.h" +#include "graphics.h" +#include "gui.h" +#include "osd.h" +#include "log.h" +#include "announcement.h" +#include "vehicleprofile.h" +#include "roadprofile.h" +#include "config_.h" +#include "xmlconfig.h" + +#ifdef HAVE_GLIB +#define ATTR_DISTANCE 1 +const int xml_attr_distance=1; +#else +#include "ezxml.h" +const int xml_attr_distance=2; +#define ATTR_DISTANCE 2 +#define G_MARKUP_ERROR 0 +#define G_MARKUP_ERROR_INVALID_CONTENT 0 +#define G_MARKUP_ERROR_PARSE 0 +#define G_MARKUP_ERROR_UNKNOWN_ELEMENT 0 +typedef void * GMarkupParseContext; +#endif + +struct xistate { + struct xistate *parent; + struct xistate *child; + const gchar *element; + const gchar **attribute_names; + const gchar **attribute_values; +}; + +struct xmldocument { + const gchar *href; + const gchar *xpointer; + gpointer user_data; + struct xistate *first; + struct xistate *last; + int active; + int level; +}; + + +struct xmlstate { + const gchar **attribute_names; + const gchar **attribute_values; + struct xmlstate *parent; + struct attr element_attr; + const gchar *element; + xmlerror **error; + struct element_func *func; + struct object_func *object_func; + struct xmldocument *document; +}; + + +struct attr_fixme { + char *element; + char **attr_fixme; +}; + +static struct attr ** convert_to_attrs(struct xmlstate *state, struct attr_fixme *fixme) +{ + const gchar **attribute_name=state->attribute_names; + const gchar **attribute_value=state->attribute_values; + const gchar *name; + int count=0; + struct attr **ret; + static int fixme_count; + + while (*attribute_name) { + count++; + attribute_name++; + } + ret=g_new(struct attr *, count+1); + attribute_name=state->attribute_names; + count=0; + while (*attribute_name) { + name=*attribute_name; + if (fixme) { + char **attr_fixme=fixme->attr_fixme; + while (attr_fixme[0]) { + if (! strcmp(name, attr_fixme[0])) { + name=attr_fixme[1]; + if (fixme_count++ < 10) + dbg(0,"Please change attribute '%s' to '%s' in <%s />\n", attr_fixme[0], attr_fixme[1], fixme->element); + break; + } + attr_fixme+=2; + } + } + ret[count]=attr_new_from_text(name,*attribute_value); + if (ret[count]) + count++; + else if (strcmp(*attribute_name,"enabled") && strcmp(*attribute_name,"xmlns:xi")) + dbg(0,"failed to create attribute '%s' with value '%s'\n", *attribute_name,*attribute_value); + attribute_name++; + attribute_value++; + } + ret[count]=NULL; + dbg(1,"ret=%p\n", ret); + return ret; +} + + +static const char * find_attribute(struct xmlstate *state, const char *attribute, int required) +{ + const gchar **attribute_name=state->attribute_names; + const gchar **attribute_value=state->attribute_values; + while(*attribute_name) { + if(! g_ascii_strcasecmp(attribute,*attribute_name)) + return *attribute_value; + attribute_name++; + attribute_value++; + } + if (required) + g_set_error(state->error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "element '%s' is missing attribute '%s'", state->element, attribute); + return NULL; +} + +static int +find_boolean(struct xmlstate *state, const char *attribute, int deflt, int required) +{ + const char *value; + + value=find_attribute(state, attribute, required); + if (! value) + return deflt; + if (g_ascii_strcasecmp(value,"no") && g_ascii_strcasecmp(value,"0") && g_ascii_strcasecmp(value,"false")) + return 1; + return 0; +} + +/** + * * Convert a string number to int + * * + * * @param val the string value to convert + * * @returns int value of converted string + * */ +static int +convert_number(const char *val) +{ + if (val) + return g_ascii_strtoull(val,NULL,0); + else + return 0; +} + +static int +xmlconfig_announce(struct xmlstate *state) +{ + const char *type,*value; + char key[32]; + int level[3]; + int i; + enum item_type itype; + char *tok, *type_str, *str; + + type=find_attribute(state, "type", 1); + if (! type) + return 0; + for (i = 0 ; i < 3 ; i++) { + sprintf(key,"level%d", i); + value=find_attribute(state, key, 0); + if (value) + level[i]=convert_number(value); + else + level[i]=-1; + } + type_str=g_strdup(type); + str=type_str; + while ((tok=strtok(str, ","))) { + itype=item_from_name(tok); + navigation_set_announce(state->parent->element_attr.u.data, itype, level); + str=NULL; + } + g_free(type_str); + return 1; +} +/** + * * Define the elements in our config + * * + * */ + +#define NEW(x) (void *(*)(struct attr *, struct attr **))(x) +#define GET(x) (int (*)(void *, enum attr_type type, struct attr *attr, struct attr_iter *iter))(x) +#define ITERN(x) (struct attr_iter * (*)(void *))(x) +#define ITERD(x) (void (*)(struct attr_iter *iter))(x) +#define SET(x) (int (*)(void *, struct attr *attr))(x) +#define ADD(x) (int (*)(void *, struct attr *attr))(x) +#define REMOVE(x) (int (*)(void *, struct attr *attr))(x) +#define INIT(x) (int (*)(void *))(x) +#define DESTROY(x) (void (*)(void *))(x) + +static struct object_func object_funcs[] = { + { attr_announcement,NEW(announcement_new), GET(announcement_get_attr), NULL, NULL, SET(announcement_set_attr), ADD(announcement_add_attr) }, + { attr_arrows, NEW(arrows_new)}, + { attr_circle, NEW(circle_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, + { attr_config, NEW(config_new), GET(config_get_attr), ITERN(config_attr_iter_new), ITERD(config_attr_iter_destroy), SET(config_set_attr), ADD(config_add_attr), REMOVE(config_remove_attr), NULL, DESTROY(config_destroy)}, + { attr_coord, NEW(coord_new_from_attrs)}, + { attr_cursor, NEW(cursor_new), NULL, NULL, NULL, NULL, ADD(cursor_add_attr)}, + { attr_debug, NEW(debug_new)}, + { attr_graphics, NEW(graphics_new)}, + { attr_gui, NEW(gui_new), GET(gui_get_attr), NULL, NULL, SET(gui_set_attr), ADD(gui_add_attr)}, + { attr_icon, NEW(icon_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, + { attr_image, NEW(image_new)}, + { attr_itemgra, NEW(itemgra_new), NULL, NULL, NULL, NULL, ADD(itemgra_add_attr)}, + { attr_layer, NEW(layer_new), NULL, NULL, NULL, NULL, ADD(layer_add_attr)}, + { attr_layout, NEW(layout_new), NULL, NULL, NULL, NULL, ADD(layout_add_attr)}, + { attr_log, NEW(log_new)}, + { attr_map, NEW(map_new)}, + { attr_mapset, NEW(mapset_new), NULL, NULL, NULL, NULL, ADD(mapset_add_attr)}, + { attr_navigation, NEW(navigation_new), GET(navigation_get_attr)}, + { attr_osd, NEW(osd_new), GET(osd_get_attr), NULL, NULL, SET(osd_set_attr) }, + { attr_plugins, NEW(plugins_new), NULL, NULL, NULL, NULL, NULL, NULL, INIT(plugins_init)}, + { attr_plugin, NEW(plugin_new)}, + { attr_polygon, NEW(polygon_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, + { attr_polyline, NEW(polyline_new), NULL, NULL, NULL, NULL, ADD(element_add_attr)}, + { attr_roadprofile,NEW(roadprofile_new), GET(roadprofile_get_attr), NULL, NULL, SET(roadprofile_set_attr), ADD(roadprofile_add_attr) }, + { attr_route, NEW(route_new), GET(route_get_attr), NULL, NULL, SET(route_set_attr), ADD(route_add_attr), REMOVE(route_remove_attr)}, + { attr_speech, NEW(speech_new), GET(speech_get_attr), NULL, NULL, SET(speech_set_attr)}, + { attr_text, NEW(text_new)}, + { attr_tracking, NEW(tracking_new)}, + { attr_vehicleprofile, NEW(vehicleprofile_new), GET(vehicleprofile_get_attr), NULL, NULL, SET(vehicleprofile_set_attr), ADD(vehicleprofile_add_attr) }, +}; + +extern struct object_func navit_func, vehicle_func; + +struct object_func * +object_func_lookup(enum attr_type type) +{ + int i; + switch (type) { + case attr_navit: + return &navit_func; + case attr_vehicle: + return &vehicle_func; + default: + for (i = 0 ; i < sizeof(object_funcs)/sizeof(struct object_func); i++) { + if (object_funcs[i].type == type) + return &object_funcs[i]; + } + return NULL; + } +} + +struct element_func { + char *name; + char *parent; + int (*func)(struct xmlstate *state); + enum attr_type type; +}; +struct element_func *elements; + +static char *attr_fixme_itemgra[]={ + "type","item_types", + NULL,NULL, +}; + +static char *attr_fixme_text[]={ + "label_size","text_size", + NULL,NULL, +}; + +static char *attr_fixme_circle[]={ + "label_size","text_size", + NULL,NULL, +}; + +static struct attr_fixme attr_fixmes[]={ + {"item",attr_fixme_itemgra}, + {"itemgra",attr_fixme_itemgra}, + {"text",attr_fixme_text}, + {"label",attr_fixme_text}, + {"circle",attr_fixme_circle}, + {NULL,NULL}, +}; + + +static char *element_fixmes[]={ + "item","itemgra", + "label","text", + NULL,NULL, +}; + +static void initStatic(void) { + elements=g_new0(struct element_func,40); //39 is a number of elements + ending NULL element + + elements[0].name="config"; + elements[0].parent=NULL; + elements[0].func=NULL; + elements[0].type=attr_config; + + elements[1].name="announce"; + elements[1].parent="navigation"; + elements[1].func=xmlconfig_announce; + + elements[2].name="speech"; + elements[2].parent="navit"; + elements[2].func=NULL; + elements[2].type=attr_speech; + + elements[3].name="tracking"; + elements[3].parent="navit"; + elements[3].func=NULL; + elements[3].type=attr_tracking; + + elements[4].name="route"; + elements[4].parent="navit"; + elements[4].func=NULL; + elements[4].type=attr_route; + + elements[5].name="mapset"; + elements[5].parent="navit"; + elements[5].func=NULL; + elements[5].type=attr_mapset; + + elements[6].name="map"; + elements[6].parent="mapset"; + elements[6].func=NULL; + elements[6].type=attr_map; + + elements[7].name="debug"; + elements[7].parent="config"; + elements[7].func=NULL; + elements[7].type=attr_debug; + + elements[8].name="osd"; + elements[8].parent="navit"; + elements[8].func=NULL; + elements[8].type=attr_osd; + + elements[9].name="navigation"; + elements[9].parent="navit"; + elements[9].func=NULL; + elements[9].type=attr_navigation; + + elements[10].name="navit"; + elements[10].parent="config"; + elements[10].func=NULL; + elements[10].type=attr_navit; + + elements[11].name="graphics"; + elements[11].parent="navit"; + elements[11].func=NULL; + elements[11].type=attr_graphics; + + elements[12].name="gui"; + elements[12].parent="navit"; + elements[12].func=NULL; + elements[12].type=attr_gui; + + elements[13].name="layout"; + elements[13].parent="navit"; + elements[13].func=NULL; + elements[13].type=attr_layout; + + elements[14].name="cursor"; + elements[14].parent="layout"; + elements[14].func=NULL; + elements[14].type=attr_cursor; + + elements[15].name="layer"; + elements[15].parent="layout"; + elements[15].func=NULL; + elements[15].type=attr_layer; + + elements[16].name="itemgra"; + elements[16].parent="layer"; + elements[16].func=NULL; + elements[16].type=attr_itemgra; + + elements[17].name="circle"; + elements[17].parent="itemgra"; + elements[17].func=NULL; + elements[17].type=attr_circle; + + elements[18].name="coord"; + elements[18].parent="circle"; + elements[18].func=NULL; + elements[18].type=attr_coord; + + elements[19].name="icon"; + elements[19].parent="itemgra"; + elements[19].func=NULL; + elements[19].type=attr_icon; + + elements[20].name="coord"; + elements[20].parent="icon"; + elements[20].func=NULL; + elements[20].type=attr_coord; + + elements[21].name="image"; + elements[21].parent="itemgra"; + elements[21].func=NULL; + elements[21].type=attr_image; + + elements[22].name="text"; + elements[22].parent="itemgra"; + elements[22].func=NULL; + elements[22].type=attr_text; + + elements[23].name="polygon"; + elements[23].parent="itemgra"; + elements[23].func=NULL; + elements[23].type=attr_polygon; + + elements[24].name="coord"; + elements[24].parent="polygon"; + elements[24].func=NULL; + elements[24].type=attr_coord; + + elements[25].name="polyline"; + elements[25].parent="itemgra"; + elements[25].func=NULL; + elements[25].type=attr_polyline; + + elements[26].name="coord"; + elements[26].parent="polyline"; + elements[26].func=NULL; + elements[26].type=attr_coord; + + elements[27].name="arrows"; + elements[27].parent="itemgra"; + elements[27].func=NULL; + elements[27].type=attr_arrows; + + elements[28].name="vehicle"; + elements[28].parent="navit"; + elements[28].func=NULL; + elements[28].type=attr_vehicle; + + elements[29].name="vehicleprofile"; + elements[29].parent="navit"; + elements[29].func=NULL; + elements[29].type=attr_vehicleprofile; + + elements[30].name="roadprofile"; + elements[30].parent="vehicleprofile"; + elements[30].func=NULL; + elements[30].type=attr_roadprofile; + + elements[31].name="announcement"; + elements[31].parent="roadprofile"; + elements[31].func=NULL; + elements[31].type=attr_announcement; + + elements[32].name="cursor"; + elements[32].parent="vehicle"; + elements[32].func=NULL; + elements[32].type=attr_cursor; + + elements[33].name="itemgra"; + elements[33].parent="cursor"; + elements[33].func=NULL; + elements[33].type=attr_itemgra; + + elements[34].name="log"; + elements[34].parent="vehicle"; + elements[34].func=NULL; + elements[34].type=attr_log; + + elements[35].name="log"; + elements[35].parent="navit"; + elements[35].func=NULL; + elements[35].type=attr_log; + + elements[36].name="plugins"; + elements[36].parent="config"; + elements[36].func=NULL; + elements[36].type=attr_plugins; + + elements[37].name="plugin"; + elements[37].parent="plugins"; + elements[37].func=NULL; + elements[37].type=attr_plugin; +} + +/** + * * Parse the opening tag of a config element + * * + * * @param context document parse context + * * @param element_name the current tag name + * * @param attribute_names ptr to return the set of attribute names + * * @param attribute_values ptr return the set of attribute values + * * @param user_data ptr to xmlstate structure + * * @param error ptr return error context + * * @returns nothing + * */ + +static void +start_element(GMarkupParseContext *context, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + xmlerror **error) +{ + struct xmlstate *new=NULL, **parent = user_data; + struct element_func *e=elements,*func=NULL; + struct attr_fixme *attr_fixme=attr_fixmes; + char **element_fixme=element_fixmes; + int found=0; + static int fixme_count; + const char *parent_name=NULL; + char *s,*sep="",*possible_parents; + struct attr *parent_attr; + dbg(2,"name='%s' parent='%s'\n", element_name, *parent ? (*parent)->element:NULL); + + if (!strcmp(element_name,"xml")) + return; + /* determine if we have to fix any attributes */ + while (attr_fixme[0].element) { + if (!strcmp(element_name,attr_fixme[0].element)) + break; + attr_fixme++; + } + if (!attr_fixme[0].element) + attr_fixme=NULL; + + /* tell user to fix deprecated element names */ + while (element_fixme[0]) { + if (!strcmp(element_name,element_fixme[0])) { + element_name=element_fixme[1]; + if (fixme_count++ < 10) + dbg(0,"Please change <%s /> to <%s /> in config file\n", element_fixme[0], element_fixme[1]); + } + element_fixme+=2; + } + /* validate that this element is valid + * and that the element has a valid parent */ + possible_parents=g_strdup(""); + if (*parent) + parent_name=(*parent)->element; + while (e->name) { + if (!g_ascii_strcasecmp(element_name, e->name)) { + found=1; + s=g_strconcat(possible_parents,sep,e->parent,NULL); + g_free(possible_parents); + possible_parents=s; + sep=","; + if ((parent_name && e->parent && !g_ascii_strcasecmp(parent_name, e->parent)) || + (!parent_name && !e->parent)) + func=e; + } + e++; + } + if (! found) { + g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_UNKNOWN_ELEMENT, + "Unknown element '%s'", element_name); + g_free(possible_parents); + return; + } + if (! func) { + g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, + "Element '%s' within unexpected context '%s'. Expected '%s'%s", + element_name, parent_name, possible_parents, ! strcmp(possible_parents, "config") ? "\nPlease add tags at the beginning/end of your navit.xml": ""); + g_free(possible_parents); + return; + } + g_free(possible_parents); + + new=g_new(struct xmlstate, 1); + new->attribute_names=attribute_names; + new->attribute_values=attribute_values; + new->parent=*parent; + new->element_attr.u.data=NULL; + new->element=element_name; + new->error=error; + new->func=func; + new->object_func=NULL; + *parent=new; + if (!find_boolean(new, "enabled", 1, 0)) + return; + if (new->parent && !new->parent->element_attr.u.data) + return; + if (func->func) { + if (!func->func(new)) { + return; + } + } else { + struct attr **attrs; + + new->object_func=object_func_lookup(func->type); + if (! new->object_func) + return; + attrs=convert_to_attrs(new,attr_fixme); + new->element_attr.type=attr_none; + if (!new->parent || new->parent->element_attr.type == attr_none) + parent_attr=NULL; + else + parent_attr=&new->parent->element_attr; + new->element_attr.u.data = new->object_func->create(parent_attr, attrs); + if (! new->element_attr.u.data) + return; + new->element_attr.type=attr_from_name(element_name); + if (new->element_attr.type == attr_none) + dbg(0,"failed to create object of type '%s'\n", element_name); + if (new->parent && new->parent->object_func && new->parent->object_func->add_attr) + new->parent->object_func->add_attr(new->parent->element_attr.u.data, &new->element_attr); + } + return; +} + + +/* Called for close tags */ +static void +end_element (GMarkupParseContext *context, + const gchar *element_name, + gpointer user_data, + xmlerror **error) +{ + struct xmlstate *curr, **state = user_data; + + if (!strcmp(element_name,"xml")) + return; + dbg(2,"name='%s'\n", element_name); + curr=*state; + if (curr->object_func && curr->object_func->init) + curr->object_func->init(curr->element_attr.u.data); + if (curr->object_func && curr->object_func->unref) + curr->object_func->unref(curr->element_attr.u.data); + *state=curr->parent; + g_free(curr); +} + +static gboolean parse_file(struct xmldocument *document, xmlerror **error); + +static void +xinclude(GMarkupParseContext *context, const gchar **attribute_names, const gchar **attribute_values, struct xmldocument *doc_old, xmlerror **error) +{ + struct xmldocument doc_new; + struct file_wordexp *we; + int i,count; + const char *href=NULL; + char **we_files; + + if (doc_old->level >= 16) { + g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include recursion too deep"); + return; + } + memset(&doc_new, 0, sizeof(doc_new)); + i=0; + while (attribute_names[i]) { + if(!g_ascii_strcasecmp("href", attribute_names[i])) { + if (!href) + href=attribute_values[i]; + else { + g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has more than one href"); + return; + } + } else if(!g_ascii_strcasecmp("xpointer", attribute_names[i])) { + if (!doc_new.xpointer) + doc_new.xpointer=attribute_values[i]; + else { + g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has more than one xpointer"); + return; + } + } else { + g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has invalid attributes"); + return; + } + i++; + } + if (!doc_new.xpointer && !href) { + g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_INVALID_CONTENT, "xi:include has neither href nor xpointer"); + return; + } + doc_new.level=doc_old->level+1; + doc_new.user_data=doc_old->user_data; + if (! href) { + dbg(1,"no href, using '%s'\n", doc_old->href); + doc_new.href=doc_old->href; + if (file_exists(doc_new.href)) { + parse_file(&doc_new, error); + } else { + dbg(0,"Unable to include %s\n",doc_new.href); + } + } else { + dbg(1,"expanding '%s'\n", href); + we=file_wordexp_new(href); + we_files=file_wordexp_get_array(we); + count=file_wordexp_get_count(we); + dbg(1,"%d results\n", count); + if (file_exists(we_files[0])) { + for (i = 0 ; i < count ; i++) { + dbg(1,"result[%d]='%s'\n", i, we_files[i]); + doc_new.href=we_files[i]; + parse_file(&doc_new, error); + } + } else { + dbg(0,"Unable to include %s\n",we_files[0]); + } + file_wordexp_destroy(we); + + } + +} +static int +strncmp_len(const char *s1, int s1len, const char *s2) +{ + int ret; +#if 0 + char c[s1len+1]; + strncpy(c, s1, s1len); + c[s1len]='\0'; + dbg(0,"'%s' vs '%s'\n", c, s2); +#endif + + ret=strncmp(s1, s2, s1len); + if (ret) + return ret; + return strlen(s2)-s1len; +} + +static int +xpointer_value(const char *test, int len, struct xistate *elem, const char **out, int out_len) +{ + int i,ret=0; + if (len <= 0 || out_len <= 0) { + return 0; + } + if (!(strncmp_len(test,len,"name(.)"))) { + out[0]=elem->element; + return 1; + } + if (test[0] == '@') { + i=0; + while (elem->attribute_names[i] && out_len > 0) { + if (!strncmp_len(test+1,len-1,elem->attribute_names[i])) { + out[ret++]=elem->attribute_values[i]; + out_len--; + } + i++; + } + return ret; + } + return 0; +} + +static int +xpointer_test(const char *test, int len, struct xistate *elem) +{ + int eq,i,count,vlen,cond_req=1,cond=0; + char c; + const char *tmp[16]; +#if 0 + char test2[len+1]; + + strncpy(test2, test, len); + test2[len]='\0'; + dbg(0,"%s\n", test2); +#endif + if (!len) + return 0; + c=test[len-1]; + if (c != '\'' && c != '"') + return 0; + eq=strcspn(test, "="); + if (eq >= len || test[eq+1] != c) + return 0; + vlen=eq; + if (eq > 0 && test[eq-1] == '!') { + cond_req=0; + vlen--; + } + count=xpointer_value(test,vlen,elem,tmp,16); + for (i = 0 ; i < count ; i++) { + if (!strncmp_len(test+eq+2,len-eq-3, tmp[i])) + cond=1; + } + if (cond == cond_req) + return 1; + return 0; +} + +static int +xpointer_element_match(const char *xpointer, int len, struct xistate *elem) +{ + int start,tlen,tlen2; +#if 0 + char test2[len+1]; + + strncpy(test2, xpointer, len); + test2[len]='\0'; + dbg(0,"%s\n", test2); +#endif + start=strcspn(xpointer, "["); + if (start > len) + start=len; + if (strncmp_len(xpointer, start, elem->element) && (start != 1 || xpointer[0] != '*')) + return 0; + if (start == len) + return 1; + if (xpointer[len-1] != ']') + return 0; + tlen=len-start-2; + for (;;) { + start++; + tlen2=strcspn(xpointer+start,"]"); + if (start + tlen2 > len) + return 1; + if (!xpointer_test(xpointer+start, tlen2, elem)) + return 0; + start+=tlen2+1; + } +} + +static int +xpointer_xpointer_match(const char *xpointer, int len, struct xistate *first) +{ + const char *c; + int s; + dbg(2,"%s\n", xpointer); + if (xpointer[0] != '/') + return 0; + c=xpointer+1; + len--; + do { + s=strcspn(c, "/"); + if (s > len) + s=len; + if (! xpointer_element_match(c, s, first)) + return 0; + first=first->child; + c+=s+1; + len-=s+1; + } while (len > 0 && first); + if (len > 0) + return 0; + return 1; +} + +static int +xpointer_match(const char *xpointer, struct xistate *first) +{ + char *prefix="xpointer("; + int len; + if (! xpointer) + return 1; + len=strlen(xpointer); + if (strncmp(xpointer,prefix,strlen(prefix))) + return 0; + if (xpointer[len-1] != ')') + return 0; + return xpointer_xpointer_match(xpointer+strlen(prefix), len-strlen(prefix)-1, first); + +} + +static void +xi_start_element(GMarkupParseContext *context, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + xmlerror **error) +{ + struct xmldocument *doc=user_data; + struct xistate *xistate; + int i,count=0; + while (attribute_names[count++*ATTR_DISTANCE]); + xistate=g_new0(struct xistate, 1); + xistate->element=element_name; + xistate->attribute_names=g_new0(const char *, count); + xistate->attribute_values=g_new0(const char *, count); + for (i = 0 ; i < count ; i++) { + if (attribute_names[i*ATTR_DISTANCE] && attribute_values[i*ATTR_DISTANCE]) { + xistate->attribute_names[i]=g_strdup(attribute_names[i*ATTR_DISTANCE]); + xistate->attribute_values[i]=g_strdup(attribute_values[i*ATTR_DISTANCE]); + } + } + xistate->parent=doc->last; + + if (doc->last) { + doc->last->child=xistate; + } else + doc->first=xistate; + doc->last=xistate; + if (doc->active > 0 || xpointer_match(doc->xpointer, doc->first)) { + if(!g_ascii_strcasecmp("xi:include", element_name)) { + xinclude(context, xistate->attribute_names, xistate->attribute_values, doc, error); + return; + } + start_element(context, element_name, xistate->attribute_names, xistate->attribute_values, doc->user_data, error); + doc->active++; + } + +} +/** + * * Reached closing tag of a config element + * * + * * @param context + * * @param element name + * * @param user_data ptr to xmldocument + * * @param error ptr to struct for error information + * * @returns nothing + * */ + +static void +xi_end_element (GMarkupParseContext *context, + const gchar *element_name, + gpointer user_data, + xmlerror **error) +{ + struct xmldocument *doc=user_data; + struct xistate *xistate=doc->last; + int i=0; + doc->last=doc->last->parent; + if (! doc->last) + doc->first=NULL; + else + doc->last->child=NULL; + if (doc->active > 0) { + if(!g_ascii_strcasecmp("xi:include", element_name)) { + return; + } + end_element(context, element_name, doc->user_data, error); + doc->active--; + } + while (xistate->attribute_names[i]) { + g_free((char *)(xistate->attribute_names[i])); + g_free((char *)(xistate->attribute_values[i])); + i++; + } + g_free(xistate->attribute_names); + g_free(xistate->attribute_values); + g_free(xistate); +} + +/* Called for character data */ +/* text is not nul-terminated */ +static void +xi_text (GMarkupParseContext *context, + const gchar *text, + gsize text_len, + gpointer user_data, + xmlerror **error) +{ + struct xmldocument *doc=user_data; + int i; + if (doc->active) { + for (i = 0 ; i < text_len ; i++) { + if (!isspace(text[i])) { + struct xmldocument *doc=user_data; + struct xmlstate *curr, **state = doc->user_data; + struct attr attr; + char *text_dup = malloc(text_len+1); + + curr=*state; + strncpy(text_dup, text, text_len); + text_dup[text_len]='\0'; + attr.type=attr_xml_text; + attr.u.str=text_dup; + if (curr->object_func && curr->object_func->add_attr && curr->element_attr.u.data) + curr->object_func->add_attr(curr->element_attr.u.data, &attr); + free(text_dup); + return; + } + } + } +} + +#ifndef HAVE_GLIB +static void +parse_node_text(ezxml_t node, void *data, void (*start)(void *, const char *, const char **, const char **, void *, void *), + void (*end)(void *, const char *, void *, void *), + void (*text)(void *, const char *, int, void *, void *)) +{ + while (node) { + if (start) + start(NULL, node->name, (const char **)node->attr, (const char **)(node->attr+1), data, NULL); + if (text && node->txt) + text(NULL, node->txt, strlen(node->txt), data, NULL); + if (node->child) + parse_node_text(node->child, data, start, end, text); + if (end) + end(NULL, node->name, data, NULL); + node=node->ordered; + } +} +#endif + +void +xml_parse_text(const char *document, void *data, void (*start)(void *, const char *, const char **, const char **, void *, void *), + void (*end)(void *, const char *, void *, void *), + void (*text)(void *, const char *, int, void *, void *)) +{ +#ifdef HAVE_GLIB + GMarkupParser parser = { start, end, text, NULL, NULL}; + GMarkupParseContext *context; + gboolean result; + + context = g_markup_parse_context_new (&parser, 0, data, NULL); + result = g_markup_parse_context_parse (context, document, strlen(document), NULL); + g_markup_parse_context_free (context); +#else + char *str=g_strdup(document); + ezxml_t root = ezxml_parse_str(str, strlen(str)); + if (!root) + return; + parse_node_text(root, data, start, end, text); + ezxml_free(root); + g_free(str); +#endif +} + + +#ifdef HAVE_GLIB + +static const GMarkupParser parser = { + xi_start_element, + xi_end_element, + xi_text, + NULL, + NULL +}; +/** + * * Parse the contents of the configuration file + * * + * * @param document struct holding info about the config file + * * @param error info on any errors detected + * * @returns boolean TRUE or FALSE + * */ + +static gboolean +parse_file(struct xmldocument *document, xmlerror **error) +{ + GMarkupParseContext *context; + gchar *contents, *message; + gsize len; + gint line, chr; + gboolean result; + char *xmldir,*newxmldir,*xmlfile,*newxmlfile,*sep; + + dbg(1,"enter filename='%s'\n", document->href); +#if GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 12 +#define G_MARKUP_TREAT_CDATA_AS_TEXT 0 +#endif + context = g_markup_parse_context_new (&parser, G_MARKUP_TREAT_CDATA_AS_TEXT, document, NULL); + + if (!g_file_get_contents (document->href, &contents, &len, error)) { + g_markup_parse_context_free (context); + return FALSE; + } + xmldir=getenv("XMLDIR"); + xmlfile=getenv("XMLFILE"); + newxmlfile=g_strdup(document->href); + newxmldir=g_strdup(document->href); + if ((sep=strrchr(newxmldir,'/'))) + *sep='\0'; + else { + g_free(newxmldir); + newxmldir=g_strdup("."); + } + setenv("XMLDIR",newxmldir,1); + setenv("XMLFILE",newxmlfile,1); + document->active=document->xpointer ? 0:1; + document->first=NULL; + document->last=NULL; + result = g_markup_parse_context_parse (context, contents, len, error); + if (!result && error && *error) { + g_markup_parse_context_get_position(context, &line, &chr); + message=g_strdup_printf("%s at line %d, char %d\n", (*error)->message, line, chr); + g_free((*error)->message); + (*error)->message=message; + } + g_markup_parse_context_free (context); + g_free (contents); + if (xmldir) + setenv("XMLDIR",xmldir,1); + else +#ifndef __MINGW32__ + unsetenv("XMLDIR"); +#else + putenv("XMLDIR="); +#endif /* __MINGW32__ */ + if (xmlfile) + setenv("XMLFILE",xmlfile,1); + else +#ifndef __MINGW32__ + unsetenv("XMLFILE"); +#else + putenv("XMLFILE="); +#endif /* __MINGW32__ */ + g_free(newxmldir); + g_free(newxmlfile); + dbg(1,"return %d\n", result); + + return result; +} +#else +static void +parse_node(struct xmldocument *document, ezxml_t node) +{ + while (node) { + xi_start_element(NULL,node->name, node->attr, node->attr+1, document, NULL); + if (node->txt) + xi_text(NULL,node->txt,strlen(node->txt),document,NULL); + if (node->child) + parse_node(document, node->child); + xi_end_element (NULL,node->name,document,NULL); + node=node->ordered; + } +} + +static gboolean +parse_file(struct xmldocument *document, xmlerror **error) +{ + FILE *f; + ezxml_t root; + + f=fopen(document->href,"rb"); + if (!f) + return FALSE; + root = ezxml_parse_fp(f); + fclose(f); + if (!root) + return FALSE; + document->active=document->xpointer ? 0:1; + document->first=NULL; + document->last=NULL; + + parse_node(document, root); + + return TRUE; +} +#endif + +/** + * * Load and parse the master config file + * * + * * @param filename FQFN of the file + * * @param error ptr to error details, if any + * * @returns boolean TRUE or FALSE (if error detected) + * */ + +gboolean config_load(const char *filename, xmlerror **error) +{ + struct xmldocument document; + struct xmlstate *curr=NULL; + gboolean result; + + initStatic(); + + dbg(1,"enter filename='%s'\n", filename); + memset(&document, 0, sizeof(document)); + document.href=filename; + document.user_data=&curr; + result=parse_file(&document, error); + if (result && curr) { + g_set_error(error,G_MARKUP_ERROR,G_MARKUP_ERROR_PARSE, "element '%s' not closed", curr->element); + result=FALSE; + } + dbg(1,"return %d\n", result); + return result; +} + diff --git a/navit/xmlconfig.h b/navit/xmlconfig.h new file mode 100644 index 0000000..5465d91 --- /dev/null +++ b/navit/xmlconfig.h @@ -0,0 +1,80 @@ +/** + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License + * version 2 as published by the Free Software Foundation. + * + * 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +#ifndef NAVIT_XMLCONFIG_H +#define NAVIT_XMLCONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void *(*object_func_new)(struct attr *parent, struct attr **attrs); +typedef int (*object_func_get_attr)(void *, enum attr_type type, struct attr *attr, struct attr_iter *iter); +typedef struct attr_iter *(*object_func_iter_new)(void *); +typedef void (*object_func_iter_destroy)(struct attr_iter *); +typedef int (*object_func_set_attr)(void *, struct attr *attr); +typedef int (*object_func_add_attr)(void *, struct attr *attr); +typedef int (*object_func_remove_attr)(void *, struct attr *attr); +typedef int (*object_func_init)(void *); +typedef void (*object_func_destroy)(void *); +typedef void *(*object_func_dup)(void *); +typedef void *(*object_func_ref)(void *); +typedef void *(*object_func_unref)(void *); + + +struct object_func { + enum attr_type type; + void *(*create)(struct attr *parent, struct attr **attrs); + int (*get_attr)(void *, enum attr_type type, struct attr *attr, struct attr_iter *iter); + struct attr_iter *(*iter_new)(void *); + void (*iter_destroy)(struct attr_iter *); + int (*set_attr)(void *, struct attr *attr); + int (*add_attr)(void *, struct attr *attr); + int (*remove_attr)(void *, struct attr *attr); + int (*init)(void *); + void (*destroy)(void *); + void *(*dup)(void *); + void *(*ref)(void *); + void *(*unref)(void *); +}; + +struct navit_object { + struct object_func *func; + int refcount; +}; + + +typedef GError xmlerror; + +extern const int xml_attr_distance; + +/* prototypes */ +enum attr_type; +struct object_func *object_func_lookup(enum attr_type type); +void xml_parse_text(const char *document, void *data, void (*start)(void *, const char *, const char **, const char **, void *, void *), void (*end)(void *, const char *, void *, void *), void (*text)(void *, const char *, int, void *, void *)); +gboolean config_load(const char *filename, xmlerror **error); +//static void xinclude(GMarkupParseContext *context, const gchar **attribute_names, const gchar **attribute_values, struct xmldocument *doc_old, xmlerror **error); + +/* end of prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/navit/xpm/Makefile.am b/navit/xpm/Makefile.am new file mode 100644 index 0000000..c4fd73a --- /dev/null +++ b/navit/xpm/Makefile.am @@ -0,0 +1,258 @@ +include $(top_srcdir)/Makefile.inc + +xpm_DATA = bus_halt.xpm +xpm_DATA += car_dealer.xpm +xpm_DATA += castle.xpm +xpm_DATA += cemetery.xpm +xpm_DATA += dumping_station.xpm +xpm_DATA += highway_exit.xpm +xpm_DATA += hunting_stand.xpm +xpm_DATA += level_crossing.xpm +xpm_DATA += library.xpm +xpm_DATA += memorial.xpm +xpm_DATA += picnic.xpm +xpm_DATA += potable_water.xpm +xpm_DATA += shelter.xpm +xpm_DATA += sport.xpm +xpm_DATA += theater.xpm +xpm_DATA += tower.xpm +xpm_DATA += townhall.xpm +xpm_DATA += trailerpark.xpm +xpm_DATA += public_office.xpm + + +## Obsolete. Should be removed eventually... + +xpm_DATA += biergarten.xpm +xpm_DATA += restroom.xpm + +## Obsolete end + + +xpm_DATA += flag_bk_tr.xpm +xpm_DATA += flag_bk_wh.xpm +xpm_DATA += flag_bl_wh.xpm +xpm_DATA += flag_wh_bk.xpm + +xpm_DATA += gc_tradi.xpm +xpm_DATA += gc_multi.xpm +xpm_DATA += gc_mystery.xpm +xpm_DATA += gc_event.xpm +xpm_DATA += gc_reference.xpm +xpm_DATA += gc_webcam.xpm +xpm_DATA += gc_question.xpm +xpm_DATA += gc_stages.xpm + +xpm_DATA += nav_left_1.xpm +xpm_DATA += nav_left_2.xpm +xpm_DATA += nav_right_1.xpm +xpm_DATA += nav_right_2.xpm +xpm_DATA += nav_straight.xpm +xpm_DATA += nav_straight_32.xpm +xpm_DATA += nav_left_1_32.xpm +xpm_DATA += nav_left_2_32.xpm +xpm_DATA += nav_right_1_32.xpm +xpm_DATA += nav_right_2_32.xpm + +xpm_DATA += menu.xpm +xpm_DATA += toggle_fullscreen.xpm + +svgs = gui_about.svg +svgs += gui_actions.svg +svgs += gui_active.svg +svgs += gui_bookmark.svg +svgs += gui_formerdests.svg +svgs += gui_display.svg +svgs += gui_help.svg +svgs += gui_home.svg +svgs += gui_inactive.svg +svgs += gui_map.svg +svgs += gui_maps.svg +svgs += gui_rules.svg +svgs += gui_settings.svg +svgs += gui_sound.svg +svgs += gui_sound_off.svg +svgs += gui_tools.svg +svgs += gui_fullscreen.svg +svgs += gui_leave_fullscreen.svg +svgs += gui_quit.svg +svgs += gui_stop.svg +svgs += gui_town.svg +svgs += gui_vehicle.svg +svgs += gui_vehicle_pedestrian.svg +svgs += gui_zoom_in.svg +svgs += gui_zoom_out.svg +svgs += zoom_in.svg +svgs += zoom_out.svg +svgs += gui_select_street.svg +svgs += gui_select_town.svg +svgs += gui_select_country.svg +svgs += gui_arrow_left.svg +svgs += gui_arrow_right.svg +svgs += gui_arrow_up.svg +svgs += gui_arrow_down.svg +svgs += gui_menu.svg +svgs += gui_strength_0.svg +svgs += gui_strength_1.svg +svgs += gui_strength_2.svg +svgs += gui_strength_3.svg +svgs += gui_strength_4.svg +svgs += gui_strength_5.svg +svgs += gui_minus.svg +svgs += gui_plus.svg +svgs += gui_log.svg +svgs += gui_search.svg + +svgs += airport.svg +svgs += attraction.svg +svgs += bank.svg +svgs += bar.svg +svgs += beer.svg +svgs += bench.svg +svgs += boat_ramp.svg +svgs += boundary_stone.svg +svgs += bus.svg +svgs += cafe.svg +svgs += camping.svg +svgs += cinema.svg +svgs += cursor.svg +svgs += danger.svg +svgs += exit.svg +svgs += fastfood.svg +svgs += firebrigade.svg +svgs += fountain.svg +svgs += fuel.svg +svgs += golf.svg +svgs += hospital.svg +svgs += hotel.svg +svgs += information.svg +svgs += justice.svg +svgs += mark.svg +svgs += military.svg +svgs += mini_roundabout.svg +svgs += museum.svg +svgs += parking.svg +svgs += peak.svg +svgs += pharmacy.svg +svgs += police.svg +svgs += post.svg +svgs += repair_service.svg +svgs += resort.svg +svgs += restaurant.svg +svgs += ruins.svg +svgs += school.svg +svgs += shopping.svg +svgs += shop_grocery.svg +svgs += skiing.svg +svgs += stadium.svg +svgs += swimming.svg +svgs += tec_common.svg +svgs += telephone.svg +svgs += toilets.svg +svgs += traffic_signals.svg +svgs += church.svg +svgs += zoo.svg +svgs += heliport.svg +svgs += wifi.svg +svgs += viewpoint.svg +svgs += unknown.svg + + +nav_svgs = nav_left_1_bk.svg nav_left_1_wh.svg nav_left_2_bk.svg nav_left_2_wh.svg nav_left_3_bk.svg nav_left_3_wh.svg +nav_svgs += nav_right_1_bk.svg nav_right_1_wh.svg nav_right_2_bk.svg nav_right_2_wh.svg nav_right_3_bk.svg nav_right_3_wh.svg +nav_svgs += nav_roundabout_l1_bk.svg nav_roundabout_l1_wh.svg nav_roundabout_l2_bk.svg nav_roundabout_l2_wh.svg +nav_svgs += nav_roundabout_l3_bk.svg nav_roundabout_l3_wh.svg nav_roundabout_l4_bk.svg nav_roundabout_l4_wh.svg +nav_svgs += nav_roundabout_l5_bk.svg nav_roundabout_l5_wh.svg nav_roundabout_l6_bk.svg nav_roundabout_l6_wh.svg +nav_svgs += nav_roundabout_l7_bk.svg nav_roundabout_l7_wh.svg nav_roundabout_l8_bk.svg nav_roundabout_l8_wh.svg +nav_svgs += nav_roundabout_r1_bk.svg nav_roundabout_r1_wh.svg nav_roundabout_r2_bk.svg nav_roundabout_r2_wh.svg +nav_svgs += nav_roundabout_r3_bk.svg nav_roundabout_r3_wh.svg nav_roundabout_r4_bk.svg nav_roundabout_r4_wh.svg +nav_svgs += nav_roundabout_r5_bk.svg nav_roundabout_r5_wh.svg nav_roundabout_r6_bk.svg nav_roundabout_r6_wh.svg +nav_svgs += nav_roundabout_r7_bk.svg nav_roundabout_r7_wh.svg nav_roundabout_r8_bk.svg nav_roundabout_r8_wh.svg +nav_svgs += nav_straight_bk.svg nav_straight_wh.svg nav_turnaround_left_bk.svg nav_turnaround_left_wh.svg +nav_svgs += nav_turnaround_right_bk.svg nav_turnaround_right_wh.svg nav_destination_bk.svg nav_destination_wh.svg + +flag_svgs = country_.svgz country_AD.svgz country_AE.svgz country_AF.svgz country_AG.svgz country_AI.svgz country_AL.svgz country_AM.svgz +flag_svgs += country_AN.svgz country_AO.svgz country_AQ.svgz country_AR.svgz country_AS.svgz country_AT.svgz country_AU.svgz country_AW.svgz +flag_svgs += country_AX.svgz country_AZ.svgz country_BA.svgz country_BB.svgz country_BD.svgz country_BE.svgz country_BF.svgz +flag_svgs += country_BG.svgz country_BH.svgz country_BI.svgz country_BJ.svgz country_BL.svgz country_BM.svgz country_BN.svgz +flag_svgs += country_BO.svgz country_BR.svgz country_BS.svgz country_BT.svgz country_BV.svgz country_BW.svgz country_BY.svgz +flag_svgs += country_BZ.svgz country_CA.svgz country_CC.svgz country_CD.svgz country_CF.svgz country_CG.svgz country_CH.svgz +flag_svgs += country_CI.svgz country_CK.svgz country_CL.svgz country_CM.svgz country_CN.svgz country_CO.svgz country_CR.svgz +flag_svgs += country_CU.svgz country_CV.svgz country_CX.svgz country_CY.svgz country_CZ.svgz country_DE.svgz country_DJ.svgz +flag_svgs += country_DK.svgz country_DM.svgz country_DO.svgz country_DZ.svgz country_EC.svgz country_EE.svgz country_EG.svgz +flag_svgs += country_EH.svgz country_ER.svgz country_ES.svgz country_ET.svgz country_FI.svgz country_FJ.svgz country_FK.svgz +flag_svgs += country_FM.svgz country_FO.svgz country_FR.svgz country_GA.svgz country_GB.svgz country_GD.svgz country_GE.svgz +flag_svgs += country_GF.svgz country_GG.svgz country_GH.svgz country_GI.svgz country_GL.svgz country_GM.svgz country_GN.svgz +flag_svgs += country_GP.svgz country_GQ.svgz country_GR.svgz country_GS.svgz country_GT.svgz country_GU.svgz country_GW.svgz +flag_svgs += country_GY.svgz country_HK.svgz country_HM.svgz country_HN.svgz country_HR.svgz country_HT.svgz country_HU.svgz +flag_svgs += country_ID.svgz country_IE.svgz country_IL.svgz country_IM.svgz country_IN.svgz country_IO.svgz country_IQ.svgz +flag_svgs += country_IR.svgz country_IS.svgz country_IT.svgz country_JE.svgz country_JM.svgz country_JO.svgz country_JP.svgz +flag_svgs += country_KE.svgz country_KG.svgz country_KH.svgz country_KI.svgz country_KM.svgz country_KN.svgz country_KP.svgz +flag_svgs += country_KR.svgz country_KW.svgz country_KY.svgz country_KZ.svgz country_LA.svgz country_LB.svgz country_LC.svgz +flag_svgs += country_LI.svgz country_LK.svgz country_LR.svgz country_LS.svgz country_LT.svgz country_LU.svgz country_LV.svgz +flag_svgs += country_LY.svgz country_MA.svgz country_MC.svgz country_MD.svgz country_ME.svgz country_MF.svgz country_MG.svgz +flag_svgs += country_MH.svgz country_MK.svgz country_ML.svgz country_MM.svgz country_MN.svgz country_MO.svgz country_MP.svgz +flag_svgs += country_MQ.svgz country_MR.svgz country_MS.svgz country_MT.svgz country_MU.svgz country_MV.svgz country_MW.svgz +flag_svgs += country_MX.svgz country_MY.svgz country_MZ.svgz country_NA.svgz country_NC.svgz country_NE.svgz country_NF.svgz +flag_svgs += country_NG.svgz country_NI.svgz country_NL.svgz country_NO.svgz country_NP.svgz country_NR.svgz country_NU.svgz +flag_svgs += country_NZ.svgz country_OM.svgz country_PA.svgz country_PE.svgz country_PF.svgz country_PG.svgz country_PH.svgz +flag_svgs += country_PK.svgz country_PL.svgz country_PM.svgz country_PN.svgz country_PR.svgz country_PS.svgz country_PT.svgz +flag_svgs += country_PW.svgz country_PY.svgz country_QA.svgz country_RE.svgz country_RO.svgz country_RS.svgz country_RU.svgz +flag_svgs += country_RW.svgz country_SA.svgz country_SB.svgz country_SC.svgz country_SD.svgz country_SE.svgz country_SG.svgz +flag_svgs += country_SH.svgz country_SI.svgz country_SJ.svgz country_SK.svgz country_SL.svgz country_SM.svgz country_SN.svgz +flag_svgs += country_SO.svgz country_SR.svgz country_ST.svgz country_SV.svgz country_SY.svgz country_SZ.svgz country_TC.svgz +flag_svgs += country_TD.svgz country_TF.svgz country_TG.svgz country_TH.svgz country_TJ.svgz country_TK.svgz country_TL.svgz +flag_svgs += country_TM.svgz country_TN.svgz country_TO.svgz country_TR.svgz country_TT.svgz country_TV.svgz country_TW.svgz +flag_svgs += country_TZ.svgz country_UA.svgz country_UG.svgz country_UM.svgz country_US.svgz country_UY.svgz country_UZ.svgz +flag_svgs += country_VA.svgz country_VC.svgz country_VE.svgz country_VG.svgz country_VI.svgz country_VN.svgz country_VU.svgz +flag_svgs += country_WF.svgz country_WS.svgz country_YE.svgz country_YT.svgz country_ZA.svgz country_ZM.svgz country_ZW.svgz + +if USE_SVG + xpm_DATA += $(svgs) $(nav_svgs) $(flag_svgs) +endif + +if USE_SVG2PNG +%.png: $(srcdir)/*.svgz + SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) $(srcdir)/navit_svg2png "@SVG2PNG@" "$@" +%.png: $(srcdir)/*.svg + SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) $(srcdir)/navit_svg2png "@SVG2PNG@" "$@" + +pngs = $(addsuffix .png,$(basename $(svgs))) +xsize = $(word 1,$(subst x, ,$(scale))) +ysize = $(word $(words $(scale)),$(subst x, ,$(scale))) +comma =, + +# png images of the user interface and other, sizes e.g. "8,16,32,48,96" +if USE_SVG2PNG_SCALES +pngs += $(foreach scale, $(subst $(comma), ,@SVG2PNG_SCALES@), $(addsuffix _$(xsize)_$(ysize).png,$(basename $(svgs)))) +endif +# png state flags +if USE_SVG2PNG_SCALES_FLAG +pngs += $(foreach scale, $(subst $(comma), ,@SVG2PNG_SCALES_FLAG@), $(addsuffix _$(xsize)_$(ysize).png,$(basename $(flag_svgs)))) +endif +# png symbols for navigation +if USE_SVG2PNG_SCALES_NAV +pngs += $(foreach scale, $(subst $(comma), ,@SVG2PNG_SCALES_NAV@), $(addsuffix _$(xsize)_$(ysize).png,$(basename $(nav_svgs)))) +endif +xpm_DATA += $(pngs) +endif + +if !SUPPORT_WIN32 + DESKTOPFILEdir=$(datadir)/applications + DESKTOPFILE_DATA = desktop_icons/navit.desktop + + ICON128dir=$(datadir)/icons/hicolor/128x128/apps + ICON128_DATA = desktop_icons/128x128/navit.png + + ICON22dir=$(datadir)/icons/hicolor/22x22/apps + ICON22_DATA = desktop_icons/22x22/navit.png +endif + +EXTRA_DIST = $(xpm_DATA) $(DESKTOPFILE_DATA) $(ICON128_DATA) $(ICON22_DATA) navit_svg2png +#burgerking.ico: +# wget http://www.burgerking.de/favicon.ico -O burgerking.ico + +if USE_SVG2PNG +distclean-local: + rm -f $(pngs) +endif diff --git a/navit/xpm/Makefile.in b/navit/xpm/Makefile.in new file mode 100644 index 0000000..b9b8e17 --- /dev/null +++ b/navit/xpm/Makefile.in @@ -0,0 +1,814 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.inc +@USE_SVG_TRUE@am__append_1 = $(svgs) $(nav_svgs) $(flag_svgs) + +# png images of the user interface and other, sizes e.g. "8,16,32,48,96" +@USE_SVG2PNG_SCALES_TRUE@@USE_SVG2PNG_TRUE@am__append_2 = $(foreach scale, $(subst $(comma), ,@SVG2PNG_SCALES@), $(addsuffix _$(xsize)_$(ysize).png,$(basename $(svgs)))) +# png state flags +@USE_SVG2PNG_SCALES_FLAG_TRUE@@USE_SVG2PNG_TRUE@am__append_3 = $(foreach scale, $(subst $(comma), ,@SVG2PNG_SCALES_FLAG@), $(addsuffix _$(xsize)_$(ysize).png,$(basename $(flag_svgs)))) +# png symbols for navigation +@USE_SVG2PNG_SCALES_NAV_TRUE@@USE_SVG2PNG_TRUE@am__append_4 = $(foreach scale, $(subst $(comma), ,@SVG2PNG_SCALES_NAV@), $(addsuffix _$(xsize)_$(ysize).png,$(basename $(nav_svgs)))) +@USE_SVG2PNG_TRUE@am__append_5 = $(pngs) +subdir = navit/xpm +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(DESKTOPFILEdir)" \ + "$(DESTDIR)$(ICON128dir)" "$(DESTDIR)$(ICON22dir)" \ + "$(DESTDIR)$(xpmdir)" +DATA = $(DESKTOPFILE_DATA) $(ICON128_DATA) $(ICON22_DATA) $(xpm_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +modulebindingdir = $(pkglibdir)/binding +modulemapdir = $(pkglibdir)/map +modulefontdir = $(pkglibdir)/font +modulegraphicsdir = $(pkglibdir)/graphics +moduleguidir = $(pkglibdir)/gui +modulespeechdir = $(pkglibdir)/speech +moduleosddir = $(pkglibdir)/osd +modulevehicledir = $(pkglibdir)/vehicle +moduleplugindir = $(pkglibdir)/plugin +moduleautoloaddir = $(pkglibdir)/autoload +pkgdocdir = $(pkgdatadir) +xpmdir = $(pkgdatadir)/xpm +skinsdir = $(pkgdatadir)/skins +fontsdir = $(pkgdatadir)/fonts +mapsdir = $(pkgdatadir)/maps +xpm_DATA = bus_halt.xpm car_dealer.xpm castle.xpm cemetery.xpm \ + dumping_station.xpm highway_exit.xpm hunting_stand.xpm \ + level_crossing.xpm library.xpm memorial.xpm picnic.xpm \ + potable_water.xpm shelter.xpm sport.xpm theater.xpm tower.xpm \ + townhall.xpm trailerpark.xpm public_office.xpm biergarten.xpm \ + restroom.xpm flag_bk_tr.xpm flag_bk_wh.xpm flag_bl_wh.xpm \ + flag_wh_bk.xpm gc_tradi.xpm gc_multi.xpm gc_mystery.xpm \ + gc_event.xpm gc_reference.xpm gc_webcam.xpm gc_question.xpm \ + gc_stages.xpm nav_left_1.xpm nav_left_2.xpm nav_right_1.xpm \ + nav_right_2.xpm nav_straight.xpm nav_straight_32.xpm \ + nav_left_1_32.xpm nav_left_2_32.xpm nav_right_1_32.xpm \ + nav_right_2_32.xpm menu.xpm toggle_fullscreen.xpm \ + $(am__append_1) $(am__append_5) +svgs = gui_about.svg gui_actions.svg gui_active.svg gui_bookmark.svg \ + gui_formerdests.svg gui_display.svg gui_help.svg gui_home.svg \ + gui_inactive.svg gui_map.svg gui_maps.svg gui_rules.svg \ + gui_settings.svg gui_sound.svg gui_sound_off.svg gui_tools.svg \ + gui_fullscreen.svg gui_leave_fullscreen.svg gui_quit.svg \ + gui_stop.svg gui_town.svg gui_vehicle.svg \ + gui_vehicle_pedestrian.svg gui_zoom_in.svg gui_zoom_out.svg \ + zoom_in.svg zoom_out.svg gui_select_street.svg \ + gui_select_town.svg gui_select_country.svg gui_arrow_left.svg \ + gui_arrow_right.svg gui_arrow_up.svg gui_arrow_down.svg \ + gui_menu.svg gui_strength_0.svg gui_strength_1.svg \ + gui_strength_2.svg gui_strength_3.svg gui_strength_4.svg \ + gui_strength_5.svg gui_minus.svg gui_plus.svg gui_log.svg \ + gui_search.svg airport.svg attraction.svg bank.svg bar.svg \ + beer.svg bench.svg boat_ramp.svg boundary_stone.svg bus.svg \ + cafe.svg camping.svg cinema.svg cursor.svg danger.svg exit.svg \ + fastfood.svg firebrigade.svg fountain.svg fuel.svg golf.svg \ + hospital.svg hotel.svg information.svg justice.svg mark.svg \ + military.svg mini_roundabout.svg museum.svg parking.svg \ + peak.svg pharmacy.svg police.svg post.svg repair_service.svg \ + resort.svg restaurant.svg ruins.svg school.svg shopping.svg \ + shop_grocery.svg skiing.svg stadium.svg swimming.svg \ + tec_common.svg telephone.svg toilets.svg traffic_signals.svg \ + church.svg zoo.svg heliport.svg wifi.svg viewpoint.svg \ + unknown.svg +nav_svgs = nav_left_1_bk.svg nav_left_1_wh.svg nav_left_2_bk.svg \ + nav_left_2_wh.svg nav_left_3_bk.svg nav_left_3_wh.svg \ + nav_right_1_bk.svg nav_right_1_wh.svg nav_right_2_bk.svg \ + nav_right_2_wh.svg nav_right_3_bk.svg nav_right_3_wh.svg \ + nav_roundabout_l1_bk.svg nav_roundabout_l1_wh.svg \ + nav_roundabout_l2_bk.svg nav_roundabout_l2_wh.svg \ + nav_roundabout_l3_bk.svg nav_roundabout_l3_wh.svg \ + nav_roundabout_l4_bk.svg nav_roundabout_l4_wh.svg \ + nav_roundabout_l5_bk.svg nav_roundabout_l5_wh.svg \ + nav_roundabout_l6_bk.svg nav_roundabout_l6_wh.svg \ + nav_roundabout_l7_bk.svg nav_roundabout_l7_wh.svg \ + nav_roundabout_l8_bk.svg nav_roundabout_l8_wh.svg \ + nav_roundabout_r1_bk.svg nav_roundabout_r1_wh.svg \ + nav_roundabout_r2_bk.svg nav_roundabout_r2_wh.svg \ + nav_roundabout_r3_bk.svg nav_roundabout_r3_wh.svg \ + nav_roundabout_r4_bk.svg nav_roundabout_r4_wh.svg \ + nav_roundabout_r5_bk.svg nav_roundabout_r5_wh.svg \ + nav_roundabout_r6_bk.svg nav_roundabout_r6_wh.svg \ + nav_roundabout_r7_bk.svg nav_roundabout_r7_wh.svg \ + nav_roundabout_r8_bk.svg nav_roundabout_r8_wh.svg \ + nav_straight_bk.svg nav_straight_wh.svg \ + nav_turnaround_left_bk.svg nav_turnaround_left_wh.svg \ + nav_turnaround_right_bk.svg nav_turnaround_right_wh.svg \ + nav_destination_bk.svg nav_destination_wh.svg +flag_svgs = country_.svgz country_AD.svgz country_AE.svgz \ + country_AF.svgz country_AG.svgz country_AI.svgz \ + country_AL.svgz country_AM.svgz country_AN.svgz \ + country_AO.svgz country_AQ.svgz country_AR.svgz \ + country_AS.svgz country_AT.svgz country_AU.svgz \ + country_AW.svgz country_AX.svgz country_AZ.svgz \ + country_BA.svgz country_BB.svgz country_BD.svgz \ + country_BE.svgz country_BF.svgz country_BG.svgz \ + country_BH.svgz country_BI.svgz country_BJ.svgz \ + country_BL.svgz country_BM.svgz country_BN.svgz \ + country_BO.svgz country_BR.svgz country_BS.svgz \ + country_BT.svgz country_BV.svgz country_BW.svgz \ + country_BY.svgz country_BZ.svgz country_CA.svgz \ + country_CC.svgz country_CD.svgz country_CF.svgz \ + country_CG.svgz country_CH.svgz country_CI.svgz \ + country_CK.svgz country_CL.svgz country_CM.svgz \ + country_CN.svgz country_CO.svgz country_CR.svgz \ + country_CU.svgz country_CV.svgz country_CX.svgz \ + country_CY.svgz country_CZ.svgz country_DE.svgz \ + country_DJ.svgz country_DK.svgz country_DM.svgz \ + country_DO.svgz country_DZ.svgz country_EC.svgz \ + country_EE.svgz country_EG.svgz country_EH.svgz \ + country_ER.svgz country_ES.svgz country_ET.svgz \ + country_FI.svgz country_FJ.svgz country_FK.svgz \ + country_FM.svgz country_FO.svgz country_FR.svgz \ + country_GA.svgz country_GB.svgz country_GD.svgz \ + country_GE.svgz country_GF.svgz country_GG.svgz \ + country_GH.svgz country_GI.svgz country_GL.svgz \ + country_GM.svgz country_GN.svgz country_GP.svgz \ + country_GQ.svgz country_GR.svgz country_GS.svgz \ + country_GT.svgz country_GU.svgz country_GW.svgz \ + country_GY.svgz country_HK.svgz country_HM.svgz \ + country_HN.svgz country_HR.svgz country_HT.svgz \ + country_HU.svgz country_ID.svgz country_IE.svgz \ + country_IL.svgz country_IM.svgz country_IN.svgz \ + country_IO.svgz country_IQ.svgz country_IR.svgz \ + country_IS.svgz country_IT.svgz country_JE.svgz \ + country_JM.svgz country_JO.svgz country_JP.svgz \ + country_KE.svgz country_KG.svgz country_KH.svgz \ + country_KI.svgz country_KM.svgz country_KN.svgz \ + country_KP.svgz country_KR.svgz country_KW.svgz \ + country_KY.svgz country_KZ.svgz country_LA.svgz \ + country_LB.svgz country_LC.svgz country_LI.svgz \ + country_LK.svgz country_LR.svgz country_LS.svgz \ + country_LT.svgz country_LU.svgz country_LV.svgz \ + country_LY.svgz country_MA.svgz country_MC.svgz \ + country_MD.svgz country_ME.svgz country_MF.svgz \ + country_MG.svgz country_MH.svgz country_MK.svgz \ + country_ML.svgz country_MM.svgz country_MN.svgz \ + country_MO.svgz country_MP.svgz country_MQ.svgz \ + country_MR.svgz country_MS.svgz country_MT.svgz \ + country_MU.svgz country_MV.svgz country_MW.svgz \ + country_MX.svgz country_MY.svgz country_MZ.svgz \ + country_NA.svgz country_NC.svgz country_NE.svgz \ + country_NF.svgz country_NG.svgz country_NI.svgz \ + country_NL.svgz country_NO.svgz country_NP.svgz \ + country_NR.svgz country_NU.svgz country_NZ.svgz \ + country_OM.svgz country_PA.svgz country_PE.svgz \ + country_PF.svgz country_PG.svgz country_PH.svgz \ + country_PK.svgz country_PL.svgz country_PM.svgz \ + country_PN.svgz country_PR.svgz country_PS.svgz \ + country_PT.svgz country_PW.svgz country_PY.svgz \ + country_QA.svgz country_RE.svgz country_RO.svgz \ + country_RS.svgz country_RU.svgz country_RW.svgz \ + country_SA.svgz country_SB.svgz country_SC.svgz \ + country_SD.svgz country_SE.svgz country_SG.svgz \ + country_SH.svgz country_SI.svgz country_SJ.svgz \ + country_SK.svgz country_SL.svgz country_SM.svgz \ + country_SN.svgz country_SO.svgz country_SR.svgz \ + country_ST.svgz country_SV.svgz country_SY.svgz \ + country_SZ.svgz country_TC.svgz country_TD.svgz \ + country_TF.svgz country_TG.svgz country_TH.svgz \ + country_TJ.svgz country_TK.svgz country_TL.svgz \ + country_TM.svgz country_TN.svgz country_TO.svgz \ + country_TR.svgz country_TT.svgz country_TV.svgz \ + country_TW.svgz country_TZ.svgz country_UA.svgz \ + country_UG.svgz country_UM.svgz country_US.svgz \ + country_UY.svgz country_UZ.svgz country_VA.svgz \ + country_VC.svgz country_VE.svgz country_VG.svgz \ + country_VI.svgz country_VN.svgz country_VU.svgz \ + country_WF.svgz country_WS.svgz country_YE.svgz \ + country_YT.svgz country_ZA.svgz country_ZM.svgz \ + country_ZW.svgz +@USE_SVG2PNG_TRUE@pngs = $(addsuffix .png,$(basename $(svgs))) \ +@USE_SVG2PNG_TRUE@ $(am__append_2) $(am__append_3) \ +@USE_SVG2PNG_TRUE@ $(am__append_4) +@USE_SVG2PNG_TRUE@xsize = $(word 1,$(subst x, ,$(scale))) +@USE_SVG2PNG_TRUE@ysize = $(word $(words $(scale)),$(subst x, ,$(scale))) +@USE_SVG2PNG_TRUE@comma = , +@SUPPORT_WIN32_FALSE@DESKTOPFILEdir = $(datadir)/applications +@SUPPORT_WIN32_FALSE@DESKTOPFILE_DATA = desktop_icons/navit.desktop +@SUPPORT_WIN32_FALSE@ICON128dir = $(datadir)/icons/hicolor/128x128/apps +@SUPPORT_WIN32_FALSE@ICON128_DATA = desktop_icons/128x128/navit.png +@SUPPORT_WIN32_FALSE@ICON22dir = $(datadir)/icons/hicolor/22x22/apps +@SUPPORT_WIN32_FALSE@ICON22_DATA = desktop_icons/22x22/navit.png +EXTRA_DIST = $(xpm_DATA) $(DESKTOPFILE_DATA) $(ICON128_DATA) $(ICON22_DATA) navit_svg2png +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu navit/xpm/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu navit/xpm/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-DESKTOPFILEDATA: $(DESKTOPFILE_DATA) + @$(NORMAL_INSTALL) + test -z "$(DESKTOPFILEdir)" || $(MKDIR_P) "$(DESTDIR)$(DESKTOPFILEdir)" + @list='$(DESKTOPFILE_DATA)'; test -n "$(DESKTOPFILEdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(DESKTOPFILEdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(DESKTOPFILEdir)" || exit $$?; \ + done + +uninstall-DESKTOPFILEDATA: + @$(NORMAL_UNINSTALL) + @list='$(DESKTOPFILE_DATA)'; test -n "$(DESKTOPFILEdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(DESKTOPFILEdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(DESKTOPFILEdir)" && rm -f $$files +install-ICON128DATA: $(ICON128_DATA) + @$(NORMAL_INSTALL) + test -z "$(ICON128dir)" || $(MKDIR_P) "$(DESTDIR)$(ICON128dir)" + @list='$(ICON128_DATA)'; test -n "$(ICON128dir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(ICON128dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(ICON128dir)" || exit $$?; \ + done + +uninstall-ICON128DATA: + @$(NORMAL_UNINSTALL) + @list='$(ICON128_DATA)'; test -n "$(ICON128dir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(ICON128dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(ICON128dir)" && rm -f $$files +install-ICON22DATA: $(ICON22_DATA) + @$(NORMAL_INSTALL) + test -z "$(ICON22dir)" || $(MKDIR_P) "$(DESTDIR)$(ICON22dir)" + @list='$(ICON22_DATA)'; test -n "$(ICON22dir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(ICON22dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(ICON22dir)" || exit $$?; \ + done + +uninstall-ICON22DATA: + @$(NORMAL_UNINSTALL) + @list='$(ICON22_DATA)'; test -n "$(ICON22dir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(ICON22dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(ICON22dir)" && rm -f $$files +install-xpmDATA: $(xpm_DATA) + @$(NORMAL_INSTALL) + test -z "$(xpmdir)" || $(MKDIR_P) "$(DESTDIR)$(xpmdir)" + @list='$(xpm_DATA)'; test -n "$(xpmdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(xpmdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(xpmdir)" || exit $$?; \ + done + +uninstall-xpmDATA: + @$(NORMAL_UNINSTALL) + @list='$(xpm_DATA)'; test -n "$(xpmdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(xpmdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(xpmdir)" && rm -f $$files +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(DESKTOPFILEdir)" "$(DESTDIR)$(ICON128dir)" "$(DESTDIR)$(ICON22dir)" "$(DESTDIR)$(xpmdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +@USE_SVG2PNG_FALSE@distclean-local: +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-local + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-DESKTOPFILEDATA install-ICON128DATA \ + install-ICON22DATA install-xpmDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-DESKTOPFILEDATA uninstall-ICON128DATA \ + uninstall-ICON22DATA uninstall-xpmDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distclean-local \ + distdir dvi dvi-am html html-am info info-am install \ + install-DESKTOPFILEDATA install-ICON128DATA install-ICON22DATA \ + install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip install-xpmDATA installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am uninstall uninstall-DESKTOPFILEDATA \ + uninstall-ICON128DATA uninstall-ICON22DATA uninstall-am \ + uninstall-xpmDATA + + +@USE_SVG2PNG_TRUE@%.png: $(srcdir)/*.svgz +@USE_SVG2PNG_TRUE@ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) $(srcdir)/navit_svg2png "@SVG2PNG@" "$@" +@USE_SVG2PNG_TRUE@%.png: $(srcdir)/*.svg +@USE_SVG2PNG_TRUE@ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) $(srcdir)/navit_svg2png "@SVG2PNG@" "$@" +#burgerking.ico: +# wget http://www.burgerking.de/favicon.ico -O burgerking.ico + +@USE_SVG2PNG_TRUE@distclean-local: +@USE_SVG2PNG_TRUE@ rm -f $(pngs) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/navit/xpm/airport.png b/navit/xpm/airport.png new file mode 100644 index 0000000000000000000000000000000000000000..e62a51d11c5e03acbafeba0e18abfe004256e2b8 GIT binary patch literal 807 zcmV+?1K9kDP)g7%z;zPh z+Cn}w5K(GEu*bZ6#6`=E9xqUT+X=o;Pd*2QVZx~@)2?11M*=<^ltdSP0yA@Lc!b+N zW)RzZBb)c2PfZFOul2Y~187+7 zQ-@cZPRNHH57I$wzdfM}SobD6}NxrVj2SU3x2iaguHJAf0@{S>rZR05tK z0AdA(v!_(H*DNw@fGUC#(Vih~b@XYo^Nq@jhQD5$1mJC5EMM0wG9E>ObQi#50MGoA zGNb*k2T(cg%U8@k=AurMM}9u-gwBnC8khcvdwB+hO&?SMf|`F=W@6L`?l@rV7Y zJQ^0MrL#rIV9~fG_FNLv@IvFtN4%*fB>EV=pv%zk9B5_ l09fg1l#{?GNpx;J;|nR-LHcn$M)?2$002ovPDHLkV1n@JX>$Mo literal 0 HcmV?d00001 diff --git a/navit/xpm/airport.svg b/navit/xpm/airport.svg new file mode 100644 index 0000000..c21edce --- /dev/null +++ b/navit/xpm/airport.svg @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/navit/xpm/airport_16_16.png b/navit/xpm/airport_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b0a6c87426dc7291374adfc4dde560d749df04f8 GIT binary patch literal 605 zcmV-j0;2tiP)PMKW0 zSp-GF(Z5>3;-r(hI0_1i4vGW}nu>xBLL`w_N;74rs&!di|b3A zEyBJ@iqaO(ncnxarau0*=^5Fog;ZUm znfPh#qfMo$V84h1_)J9kZzXdYKokJV%lv((PZ?t7;HikRJHH@DT5aB^Yc!({x|Pv? zy?NEeiShvQ0G@WZp8w0tno}j`%00-=%sr3WWl*Z~v20nUFDF`q9d07o+L$$Xy2gB< zE7h9KkxZFCTuC%N(E(98xJ6VY18?%uot~Hd6T^06Qy)c$s9PAr|abHAdtOR00000NkvXXu0mjfh`t>2 literal 0 HcmV?d00001 diff --git a/navit/xpm/airport_32_32.png b/navit/xpm/airport_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..720515605742825fd5bf7780cb49b228664c8f51 GIT binary patch literal 1079 zcmV-71jze|P){I_N-VlAl3|M^|oxe5(}<0pR0jk!O5)r2bui2fpwjEPURGU zMb`p=d_X}L+>`TY=o!NdFr4}y;EDhw8IY z#r5kt^X{##9A^rZfg56YbzYL!9!P}97>FFJfi^Q6lzLDAN%sZuzB6XFA1LU#j=UW_ z5h^=hq&seOY-~+v@tv^+@q;r~nAvv~0VLf7yaOyhbV`0@do~`b+|_F7l!#4B>I#!? zu!upH#Y)CCmAhJ%m*w^Oi4Yklo$&^+(aeHLYVzWf$arwa?>?+(&$)d^udLkFYT9_m zrp3uH|K`Yfu{|;#Gf4}9j^{gaZ0ycowxK5+Odjp{<@kk=ca3rM^at{nVK?B}bb<}7 zNr2Y4{9s$}rKd?`aQ8UJ?382nM8}+z3o|A}^q-YYc=z-L`)B(T^%`Ao`tgY8`@_NQ z`ZKWWaNy@-0e@a%mAuM22Vhowi?Z3=rl`=|XjUIv1Q0~OGrECskz?BVa{(fUPe$xb zr=nvm6Qi^LPZR%yuUt>m98=94PP=fLiGZ@z?SmZf9p8@*8wD@fcqUiydraoiVG?F>8V&A0X4`*>fcD zcfOeL@#!(^AFeBmZNSW!YGwy(1$YG5^7Q9f#$9JLH#*WyQU11(mM{Z>N0=Ed2<<-} zeD~oHXZivSF|2(k2{6OV_FNSJKoB`Eeo8pHflTSzOR<^F0Gfg3TtRaZu}w87|EyL7 xs3=MIN_tY#bV-+NybAN`C8Z^;l+;)$_8&^N^gZ9mLo@&Y002ovPDHLkV1ge52NM7Q literal 0 HcmV?d00001 diff --git a/navit/xpm/airport_48_48.png b/navit/xpm/airport_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..ae8a32059c2f74ee945566b2cda6c4a85d747833 GIT binary patch literal 1477 zcmV;$1v>hPP)^g9*@TBqSn6iN&BH80Dgo7fkSi5Tk+@Ku{ryhzzL+B7s&6+9CxC4Yt#n&iQ?q zOQ)SqJ2Rcym;T9lIA`y5_W!TFX0Nr*zyM+)DO=JrlJ-g3A?cC+=9Dlb6-hdwSbQca zv%mRui;(A!NK%VmdhL);@BZSKZAV0WEXnF`o^c_mDoEbe-CJ5j)pb#IT~B=KRiItO z;&iT=Hg8B82`mFx`K_Nre+43ATYqh1-C=+Dc8#Rsbgi4t?Q{d#4b5W1&;FRfRR?`s zZV^BZP@1kq(;kmat-^1|K5zEJRj<;$T>1t4-xv_k-xv_k-xv@Og-Lxhw_EgDfTW3% z_5)P_|HkI92%^TSB<+_pvA64|EI`s=No#>>pxhR0KGsJ0R&QLJ@~vJrA8W%7=Cg93 zTGCocgHz>Uk~IiblNG>=Kt8~}KLS+j_VN4WE>dt8m@w30!~HJq9qkA|x&pimY%s!sGjWItZ`i_JINE!yb z4m=K6z5uNG!Oz+seci@B&B6yt|lY?$NXzA?##Ra^m*?gBQFrf^9VU4)efSQ0O+VgyJk0M^k5;gTr239Dts zn1<-N5do4Mz*3^ZWp8bO%038}L@|D-#rioeX2*urMq^9>LINaBAs8O@$;-#}5ohIfwndEq-hjeXEP^#*xahSjs2 zJT=XUBba{cj4?NdGqDA*aAzw^cKcE$KYWm3=151}@tGqX3?Gzq?gXIGE0*l`v2bT= z_>l#W5k0A)IdS4Q4Klb#Shx!<+=UL@g%-s*hMGp3l1(jL+H9HcVr-tp`6l71xAD{m z@YLHJt+x|iyYsw^IP)Sfz{G+uQ49A7i%A6*L$XryBtUVFp*Y9EgX7zG>#A3rY_RcM zutVZ(PB!#>c*F=8nr$d8vO0KoRBl|djRenW50C{souGy{0WZNE;|B7EWEske9h4Qf zi~94LI_#3CK2}f%0Us{NBtJVY*{e}xJ%Gm;QxhJPv>*uq2aGYFMA?pw5);0LjLJ2P z%FW=R3GIegTDl3LDDu}jlLcywF@170g&a`>YzL5JfM`*rz%(GYvxCC|z6Z`lkv-d2 zWD`MX?X#ilBZ!D9pCWDZuGofo+`1wFn-`^Mz(BDXl07=toiG;2sBIJrc6d2{(e6ODy@ItU$+sfj2?$PIvN>88 zE|&vTU$8lQ#b(|%FZ0GZ*#2-9*%{;jBY-{=00g_E*<&26D02qM=2@7o_wqX6bQm%x z7g$U#uvj!TIM8OpZ&9LJ+eCIo@;}LBL+E+nl{mu}fg^M*x9dW7MRY8c%YeK%@0nwa z*_$Y*ly-oiXRGO0Zl4Z+>gbG+kUC%&fFu_%h4xa}9lGz;k=i39-4^;kAb#hb`nxkF fO_wx08N2@g+>emr%h)&)00000NkvXXu0mjfL$s^Z literal 0 HcmV?d00001 diff --git a/navit/xpm/airport_8_8.png b/navit/xpm/airport_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..0d2860c7c481fabcd6b9bdd2c32043ac86b60856 GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`FJzX3_ zB&H@OI526i|CbkC{kNQXlLWWX^E038=LM+62nzQUzPVZ7A0Gdod+)Db@h@&{{x4@x zcx<};KkfIsKc{=0|9Jmfdi^#J%_`sSfAPY0KLfI>FVdQ&MBb@0G*xI&K#YF_9&^Y=gKMkv&Oz60dx?JJCVQp>-I{G)tDKGLsAlOAq(<{#Riq}d)!cQzp4bkb^~<8xrrdB?tV zprsP`VIx~@Pi~sb$qGJXRLX6TPb}axwl*H*QelqM0ZE!S8{-zx*oB)a0`jo?5V2X9sRY zkhNZR!g&?gFnUf?W?J*dsuR?$$QQnw;EQY4+mkyrziPkIB!E-flxLUib9q20u%ut( zy}FvB(a|LVk@%JhLgtw&P9qiSw&JlCU+H}8N#5bR^Cd$iGTZKL8nF1ij^nb-n4;i6 zYYN{H0g#@ycF}2r^-%QT4AcKVjJa+v``qH=JVH=hqw7nd>tMT+2(Yn|xV+#0C)Jfu z`{^eD5==d9v_){nS=I>K=4XI_SZR{J3P>?-gao z666taf1+c+j}S&m?^mMc18Dz5aY7BTGoxy8_ecHPZv&Iei#;M4FNvtCc+ zh&=xv_#2E&4+HvyquBK`ex5uM@-|&}2z(yy2n6T;%j6B7_NF3PKARN+78O>A(&-<1 z96IOMUfxvu^F)Z-fG!cbvbSnF30-zI3@>^fwFEO=)&yPg_5Md3I$6PR!v}cO_LqA zsI}?eKJSGk7Pv~Q8|d>AA)7%~Gt|$OP1BW4eeQFY0&k>#>LDO$l@2b$4Ys{6ZKbBp z38|X%8fv3eks~GIzUxG)8ZrMlL+z?BVcO}bp+*BDNkE=9velu{6?@-d`BKNS;#C-7 zjL@{)O)ZU3tYPauo^_f#perh0j~AQw<8Sj&OpK`G$u;Op#N!QuDyVxqF*des+ErlVf!c#FtTVH~u31KkFckY~uGTw8zRHsLo zIJA&*NIO}FNAYALCWOj?YhPZ2j>K|gv=*=ZE&eQ^5MuM)(T%$`jM(u0^y-uoY(beO ztToi`b5+{OoFmTmrMc7@q5SeaD;9m-jZu&z{G7q`cGEg^$|pVI0{l esz0UQ3Bf zc@9eEKR7%8ncl*7JU1yiH>Q4Vr|#81DrJ!VSQU=xozv`sa2Zm1o-*BQ`Lh$vh1lVC zSA_S0B)F3#m&<(I$`;LOxNk0eA(UNvdiA7THf|c+yxh@%2HWvOf^7X-L+5XarLVu; zQJ4h9-GI6|)#C*R*Hm<94}T2=2ySX`LS2RvOiZ)*T-PdWt1Et?nhgZXffwMizLm2S z3CAHa+}&%+z4V6PsqfVz6V}Ujd+l)li^yBzomQI57Jaw&NUgE@lN zL8_tQkF4>ptk(*!R0x&>cQ6#;dxGtAVP(m()J4VObe)*^yG#3~6%qg!tS3m2_A|Qm zN4qAnL$)Eg@vDWE-^jP!^H{fU>y3#6J+c1d5La2_IfMU1bYW3Euxt*OIfZ@ z^Q2{)vdX9>^kZfcMwr{Zu!O&uyN3frE;xTo?yl3wIVBr)Aun*Zsii^-h1drztN2RmB6ppzVBV2TxN^=KXB7 zbkz*pE{cGJQCo`j8G{?}69cH>5*?ZMS1yOE!$~RR|uzJAlH_Ej^ZO!M3~PVvEgP3r1|)mBvl@)`ULq#o-A}KB z?5AOM#iOAP$VzCKk-tP6$dgv&b|q{`efGeDa6CtWMaZRfin$i;eB3RFX;Q8R4d7Ay z7ZzMi-AQv!pE(V&7}=B^Y_5H*)p$XL8p)CI3Z(z0eO6a=s?&^_7yPUA;ej4Y)ePEq Z1f~Yk6H~L`7r8$r$kNQtw80pA|G#v^5tsk~ literal 0 HcmV?d00001 diff --git a/navit/xpm/attraction.png b/navit/xpm/attraction.png new file mode 100644 index 0000000000000000000000000000000000000000..5b349581c8a9f1d693f2e2a7a8f0a82e58b013c9 GIT binary patch literal 806 zcmV+>1KIqEP)2_Bttq?>@Qhp>w4T(0OhQtRX z8X!Kvlg306V*DTc6O4oqc!7sLC_WhtAv_QyAx7mvebD%;m5QY?v|9Gwxp(H?J3cHc zYrC}9c#@NuOwRe_d(NE6KyfSI_d+HM2TJ+6l=6-LAf%9a{$Ma)s;N7GS4c=Ptaof^ zqFEi9Xbs?T{QoHIHR0ETUk-e9)a{!-n zW7#k@f>3f?mc6rioP7oS2>bxt?u7`TB0YIZ)%@peWHt*aMSWW%ZtfZ>HFmZt&8bla z#s|@DO%!T$s9F4afyK`k&_6G0GZ&@VU0cTCgfHe?l3yq1WcL#Gd%kz&!1=@e_G7yN z$g&I_>KOKvc}wPA1uk_j@3YKgFJ67?N!r+%el_pzW(N? z(JGZTCGAlgo}Z7L%}wH&h;!pR)YrA0&yvJ+2;rNBsfHa*{YN1{TVjEN`h{ zjAi-zMdnU@7sfO9+JNxJf@P5iM;>izyZ3SYV kKyVS*TLfJAA6zTvZ(m}E9Vu9I`~Uy|07*qoM6N<$f?|1s{r~^~ literal 0 HcmV?d00001 diff --git a/navit/xpm/attraction.svg b/navit/xpm/attraction.svg new file mode 100644 index 0000000..86ed5a4 --- /dev/null +++ b/navit/xpm/attraction.svg @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + diff --git a/navit/xpm/attraction_16_16.png b/navit/xpm/attraction_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..cebae9f9f58e83d74ed7e5048b896bfa13538d51 GIT binary patch literal 591 zcmV-V0iaKkw&E=XtHx%mg$2A)-=26A`si5)vA$2(j#@ ze}F_H?Ac4$T3TYm9xI#arXo?Q<}Gxh^Sn1R@7?=;S#(-aGhOtXoZQ9ve$Ku3oC7;+ zs2jVJRka^k2kpnZ<@3Wwi}j%+BXuC(&!qKB6e{+;6L-(f4W1mae$^T>=|t~(`P4qV zq3864%GE<=`SO^ln#uxT?DPTyI1J2KCF`a+Jn(RGetL4x@nJLQgalrwcUJsabfuEX z)CLs52T}zX*G#Q;;M_!1y)aQ2nJQViN&#(uj+WoXcYXY($NEwOZ@G!A2krPvrxPy+ z21z!p1K*QOJ>On+-yEAiWtqi1zT3igeMBgbLLg;CR@6{)1DI9Ak{>+}HM>N@>P8Qu zXtDXtn|pcjx#Ky%k)h~@L^j+44_j)=v7n;1nk?`!k++v_jZ!cK?? z|AHbE#4@J!)LBbiaf^sr&nd(~{61<$O)0u?Ahu2v$Yi=sz=xg2sA>hx+Pr=9D@mLH zpyX9+JELzaFflN0>oOF$i;b-QWa(#|rb^*PxvY)n6|H0#$&YXhSn0JBpmA;V&ZHPT zU39cT^A%79MipCotxs7_Zgy`7T zOAF6X;z>@<+_`h+|DQSM%$*DWb9n@K^p2s6Ctrvsr|uN~{eTwqfdxkwkz=X0I-6>% zvm$bQq4C!M?!Gr4*1^{|E8q%!w=AYg0xu_u<2k73@PrNDVFubx*1eS}))BP_F z#w0FiTD;plFKGbw-);hF@nm1$GwVH5AIAn3 zYeS^YqhrSkPmH_-q;D62Wx%T-$=(;%6Ix3chJ{@SY1`QYLNXe|vYVYWHsiS-=q+eJ z&?hljjboKMtp(`W)vw9+TKt@k4J=_`32jI$oup+;hm4=f8~_erm;%n>7y*6;MuA@n zI#~pig557h4yx0R($>U`Hgq?Ki`FcOwe&8gVMQ}_-A&Z@H{(1dpY!o^`N-xYo4b0Q ziIH)#7beL6p2g2x$7XWYjav_=MJy05p}YmWQ|wG2GKA{m1JB>X;K2uJ>}kQoq6j(X z@N+)-Tt2e-$VTl7A|*oQvC#yIyAqH)^*8>v*FZRlvJ3EwIpCwZ1CbLWM}E-1PG?Hs z0HF=B))s77verf+ut8J}#e68XOJW3jF^~VG2IY3(TWk>7NQ-^8G;#3LBvT(=cED#SyMdtiu95&ih%zLG zP3MmeFK-=ODs??g*b;#XA_Y)e0a$AL7FCVFhqGjlTym&>j{7XaX3ATvh7CT^AP~JqE=5z+&IORGT&N@4Z|5#5uJ6u(8aF! z+IpATmNup}5$!-*qH>Pv3B(!_)@zK%CVsoh*t=)A`t@Z+WE^-65;Asd*xeX^J5=#%j(D%!4t92ty64Tf(k=Yt*DXi{Jxq1B+%Eodyme1d=pCYHO={ zOOqD(sCxXkIZyfL<2bPLCfs@vJ}LRdWTaaB1Q3WP-vgVf@P7#5G|~A#U#Mr5Hefg9 kTT?Y6z#eY#qPn2+55>UpDSlX?g8%>k07*qoM6N<$g5uLb761SM literal 0 HcmV?d00001 diff --git a/navit/xpm/attraction_48_48.png b/navit/xpm/attraction_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..fac332fa7b0d1a008dadb533521677da08cfbfb3 GIT binary patch literal 1841 zcmV-12hRA3P)RQ9qO1e5&78n$rg7lQ zZo4cc4om`PfW#%nazXM%z;WAUw+d0<1XThj-M-64?gN}?s?}-D#0-i1FEOT7iv=73 zocHXz!P)Z79frUWny_g!V;9;D3`g3c41abjgL}8o(iQ<22JQ@cvStw22Qakf8X_H0 zT9Q$EKb14zJq(0`oGfSp9|qoMMZ@GCd@oWdl#~qYy&5ZG0c>@30+XN#d>f$u?i{V% z36xYQrD$CrXXD5Ejn2LxCk&Fn^}x*`D@6WF+cbD7ky0UrqW9BzLRJXiW>+^536j7= z0Gn>mLr6)f$w)=paEgv=v!HjPZv-)M%Nq4tfg$vsJ`9Yw?OK4`gV$BS zYVdj$ykxrX?qlKK(*XAZd0-rU$c?-0O`!B{33LNF;3^lW`P>VH8x6>ecCq1un-M~w zln$Y4_{d5~b!^KL>uqQ0SfK^j?l!MT;27`*Fy@jnpC@bQHHS(Xcm%k{1)5%obu618 zGm<4e)JbwMO|m~tDxW3N6+_rI!WP)JK$uqc_bpBoD2&gsc%ne*WRdczB4VP1Du|V) z1(4{!i?Rjf#uRDXu_NS4fSmh^BZnUO9s!=1!B6F828T^1F<8la6R z3lCTqc-ce7w(H25XM3)Mm@J{D%E&2O|D7zOW^9m-!Ku)N;Zxubq2IVGasUW#-Z{w5 z-+q#Cv|+>`JqcP(+Qz$&4k=kV7piB3)Vi)d35%A#IP}G<6DcS@H9`5%InYJn7Yul) zkLTBbSAo0c-k7nbUi>eE_l#n-_%|!16jEpaLP(?#`q|s0@O-bEFrbCMUkZT`vffL| z;rtU5*e@51=l24?_Np{;@0i=}oIg5i&AvLtz+HJl;VKCOq6)U2jPQV~*Z21cA#ohX zk3zxuCr^99e-3!O7Hs4AfY*Wl0Jon#G98+I%_U)l{N9%}-uHOe+b3!~?bp}ied0jz znbX)WRl?>0;FpbnE=K_1F#1}!>+INc=bmiqA|^ z{^x?}`5N%EnSu+-e8_yZ|f!ADuZoNpYe;&xd;5t*~YXlJ!aJC+64pf&c4S^Y{bcd#eGq zS^@wE(XU2snms&)v?ZN8dg{Z*Jg@4|4Ez{iZ2!L~ zpDTF|Dph|_3FSMer0-x;060sEr9Vy^`@aCbg5G(WLIB`dfOt$)OBVC|^0@Ukwi#-zvz8_bVW}qdwcsCXfSYA4u!^ zMk#m8^wc*EiTFduE8(7~&vvs32yDCZ_XgBVKZYHGa3N`~`eTBeAAhi}iYrPZa0ix?-gp(13 zZP(QQ)vzfXnq}tc;}C+x?)6xMv1N@~9W8_sVVt4_y$T1LMZitq)UpY>c=Q~Tj~}J@ zN~I)Ve*bYIxi(_AX9;g;ZD=^$9Ywso2--yL2i!!~1lE)XYb7uWkmyZTyl&4gapG6wOh0=PM^uvZ z@90bS3-0p{;87Geln>5ResO`;8&kw?%@T_1H1s5LATPX@lT(1R_2(aOuK&x&olT$5 zIW5VE`2oWL-U4n1^?$^jRbfsA^@ps%nF@WUq9=P_Up&HeWT3;pirr_C~c fvE*XTb!p{)1$o$8j#1Y300000NkvXXu0mjfayE(2 literal 0 HcmV?d00001 diff --git a/navit/xpm/attraction_8_8.png b/navit/xpm/attraction_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..5e1ec2af213b4b3d4258d5680dbf47bbc92bcbd9 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^nJzX3_ zB&H^(IWRdzIo+D`XHL@n`?dAF!pV+d3Q0=Q-~WCtZ!0gq*LwKKjD=fv%$T>NJ*UCz zS$rMaPyg?Bc0Yc9yl&0L*0%mkO;?lQuA6DEeXQqBn(^djW!;BA&wgs27WmfxGXBhe z{`z>M|9?I_7LrzfZC<7tw>sa)-s1kAiqjuHKD+&W|M{9#zd!#tZj;6aG>gCd{@kYl zk9>bBAJh2q?P+w|`{(v{|0;htGi_2%-M8}_mpWMudl8?>e)Xaf__!wjCTelF{r5}E*`4vx0~ literal 0 HcmV?d00001 diff --git a/navit/xpm/attraction_96_96.png b/navit/xpm/attraction_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..1fdf31513ac3a6c278fa4f969483de30c95c0a05 GIT binary patch literal 3983 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 + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + $ + + + diff --git a/navit/xpm/bank_16_16.png b/navit/xpm/bank_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..a92c1a2364f691599adcb1651209ced39508b162 GIT binary patch literal 632 zcmV-;0*C#HP)5lW`QsKhMjaXH%bT>U3jm1bHEuvMeaq43>FehP^-p zA#`6*e?vDBbXga5C*9^n7a~Lm+FId7BX1P)4PT}Wv)o#?>7M8Lb+OQ?b3r$`47e|-_*b%6|M3+|0qZ)%?V*|R^jamYc&9hw;NOBE^dW0(34_*}(|L|0R z`s>{H_<7KIg<8K+E|^ckfSCmNT)-L#v;1yuLS~fQ%n-@q20axf3SfB( zJCPz2UZUo#)YJ-D18%iwmy$XhI3 zqhwi>WQCEw(^L(mKmqy-)7*_6<$3HZedl8Y3k5XGhV}^5*TGU6BCW`?bEvm(p?f^E zFMQ$Z^dcKO9+)-*sR<&M!0>qB^DJBG71TfgM>vGCu#6TCAz2n|{=^b8`SJqGpXo9{ zG>Xe<(*ht|Opc9F?C#*WC8*LJ7#=shC^(A+#?u=Nrc%6=fUm&B!RPW%M1BJ!9=Za2 S51bE-IlTidZFcFD7{e8fV72D6p^yr4QgWy z5lrwwjYf&apd`LPOnks-ygZpG#V7`eQSpI9E~TcW)X)N!B9!|jg+ifp+irKeyJyCS zvn?$xEhv`n<@_@<-~9jceczn#903>}pt+*YZNR=^<}L!(fD?hYhMAlwxseZmxQ`91 zfRSEaN$}$L6!UiXm}@YH`(=s6WNOK07@ih@k)#2w@IObuQ_L*S0=8*MgNk8k_F}MN ziS%AGWCX@8VnnCSG$WWOV3aVpjUldk-hfXC0>;pZKuJNmff+*ZgwbRuH+Iqt)cAZD z84u^n`|dxmfDOomN}f~jX29lgz!Ij15X7ye-B8>bGwwtp3FEL5a=>~B<#vJV4zcbh zAaOqVRI*tcrg_FfzgWVcAAV%!1A^bQv%)h_Hnf)DYAV z9O5jb}i489f!_~7Uch#3im?|_PuhV|g2y{%{4 z5nj9kwvU;Foc}7W^z1u3)$D{7?>TtkI?(q(ct-&eywZZ{B}iB7;7$`ChVoJeTW%;` zcOL`*NP$t-&`xVMfhX0$rK_M}_k9v@w|4y!%w6T+XFh_8FYnUPfa!CG{-uB)Hb6M& zU}Zr}{Lnt34yfCXj&z~WocK=ymc9;K-*<4?=P-BeAd3yOHb8wT5#L4p!ti2y8C$xi z@2wYTXgUV2>oD_CNQ=O@e2{(!w*aFYLemZep#3^rsYM5`Ab|re!Rni3T3-s46=LP{h?L~M>kDQ;#Q~^24B46BeF|bMX!FCV)3~bt zq{Oz#E1pAfSrr$0`}V7W8)sqPSJ+2(p@VJwswLjXg3MC}Dp(*n1;RXM0_Rg#1C{T5!32F{Isp)NP z?Xb7pxnEOr2MDR@c}8xZ>Pdmo1P}<|6JLb&i&}`aXR}HO3aTwKT{gnj=&EYu!9$Ri z3h{Ap(+5pgAwGH)_a6Xv3}jA%re-*K3hL_7LUKyO#(vR@>Rans%vPb9?AuMvf37TL%I?(AN$63D{H3 zaqnzqbp`o;+fU?;9!+Oz62bt@*D*I+iC2n4;Sk?xi}lx!VpB#VGNJNSUhWM#%Y^arSMD1g-DpM3A1@mEk2?}2oLzztUCpBfUaQ{Pz1M9 b@WAXJf2-E4_3NFv00000NkvXXu0mjfT8yL{ literal 0 HcmV?d00001 diff --git a/navit/xpm/bank_48_48.png b/navit/xpm/bank_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..620b6921614a58d167c3bceafe8190c6bfb4a615 GIT binary patch literal 2258 zcmV;@2rc)CP)lQve=s!4H(3^9}h5D)V*7-(Yr#x}7H zeyqKB_f9{|?t0hu8ZWp4|D`LkhdCIPQu`= z(OvGn0p;kf9#$cFLP)j(SqSwiwHR{OfXf3dr^fCczX2s!JQ|CDxhBlfG_oZmB5?{a zdRrnT-2&RBq(3ARfA|vq=QwAPiJBVl%u=9U?cDy1Z5JE z0E8kKNp?)gP~*sY1cVOmY;es5=RB|_fNg^L@pc9XR~b7+7tbKb4GRUhk|8w>l9Rz| z0f$Y!3jn56kKcs;ei#@4zoCemsJOO!z~%u*2H2;AX$3=qFV3xHOaqeElV=8a6DS4H zb;v1(yaJd#2V99@6KaTU+VD{OBp4?6OnCVlu=8E;p~x9h$w!ub5==8b;^P|NE@QPB z;NO5-2*_Us#Vf(>8YUeJ-d_0db-3^`^xlBiHp9G9cw`4)zcZ5KVN|5K*Rl%O2e=cb z!Kx?W!7^|pj_y1b{`wrW*Ta@yt9tovXuANP?3p~$k%$@rX9?Lz_5m(;IxPJbBqU5+ zS^rJAavYwm1Y44lO`ij+e+c`3JBh3#5H$i8!6LwIalpduV0Ff)Ot+{BezQGVK64>_ z_uac>8Utg_0o@)yc~D{Y@K@naKY+!Xlx(OUL>!|SFD89ATK*ht_z5(eQT5k0!TuM( z+cVi;QkZlDbSo^~0z3Dr`ud+kdmZfCHQ8TMm{bFX2H@g_KPrh^Un0% zYy#gvu%Z#QVoa(5LW93N3&voyT(hVr-gzY@v>b=Ce*@D1pxF_iI!gE55FQDe1HQBj zD)+!Z(Az`(Q2h$zJqo&Q;<|>q;qp7sco?Med9?{kI;-i6Y&ZFn_?KYx!`|8ej}U-KS7r1O7;lnfy1~#~eU&CBn9?U>|3a z=HqX#JLJHQ`8OWaSh2!06jhM-oK!$J2s*A4ygEt3K4)Mi@<7) z-Tvz55f#CSSnbC1S%-w}eN}uM5|plFwlG-*6d|z!2tk{K%+@w|>mA5UhnZO_6hNJa zn_GrGAHvDgs%=hAw7jn$J~;|ku7=4U^xJuRLI(H+r!0bQB(;9YcJD!2%FEHeXkv#D z{1}ts2(JLcHxV8;IGoVY32h^m8(o9!EGU=<7Ax$p0-pizy|3nu!wH&DcC@fGi2^+gSJQJxi<|H=38M4k6 z<2ppwVDsbf(E<3Z9!{TCsV^^AgeWKHB*bExS>fAoIA!vx5Ew_zoydUp(D_G9qO*ACyIwqBUxCW z7OBvh(bPPgaojGLHFNYgypiV%8NHp3X+T84&C06*gB?hI1WXI{aX68h0IwGj2&g^+ zaC>0!LdeNhVJT5zcdZdFUJ8fR5RzXUIL<3XWTD#{5WDOrL>5i)osu7>oI z5S+A1sw$5Y{tfZ<#Uu>aD3y|BK#@@YcLBUWJ(3(DST12ktnUgzACd}9@X|*|sSAqZ zH{kz;=RrHXf+YeT#AL1z;mp_~1Q+|@)1whvm>|Liz!d+{9XVx^fRuZ~CvGH#3Xvf+ gB{3y_bdQJs0Rqa`z1+OsV*mgE07*qoM6N<$f)qXnlmGw# literal 0 HcmV?d00001 diff --git a/navit/xpm/bank_8_8.png b/navit/xpm/bank_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..ed8cebe1f277ec47c4ace5f8c0d3e03247e22119 GIT binary patch literal 300 zcmV+{0n`48P)}Xx?PyEVl1Q-VL=a)aiiM=!!rIf= zdjnP^_M#za(gl%5tc0d&qht(oJBjfE&T)Vvpw0ibG|&M~s@wRfgT^H=Q_L1>9NGuQ zI$xpGJm4Z+V%c-iZz=vrm{1jRk58QH;s(2`En4#~+@FD2gvlDjKah?2)d2RJtkNHe}DSVN63Gv-6H_G-Y?}zNIg>1gOqJt8- yC_>g(sEvr~-oFZcGU++$ki#0OlGc5dw1OL+g3C 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/bar.svg b/navit/xpm/bar.svg new file mode 100644 index 0000000..44c6083 --- /dev/null +++ b/navit/xpm/bar.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/bar_16_16.png b/navit/xpm/bar_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b6425873c4b2d67a77edacfbaa32f9d9b9d87957 GIT binary patch literal 535 zcmV+y0_gpTP)?&rnvt&sSF)QjpBBK5Qy{`~a@Tf;Y zeBed!>QOu?20Td!i18NCTmFEerwt(yG?+v1v12qM?#y(xhskUv>k`(wbUnJhqN=(* zdSq^nAu${+mxF0#RKtmMB#{SG&E#?KT>vjvW?wP9PX*8YA#)1l)r_z8q2mocuYDz2 zkE~evD6zeI{#?4y4^WwT7Q8re^5EG@yB z+Lt>3VV(Q?4|umn$9AgQzXsxs{9okAUldQ$?Bxq)7&` zHnWo$(lpb+$U=0}E0T@KI z!2?3z1hD+yfZv<=z&ua_o)iHC&A<5^SvzvKe?DC=J?x^0HT^4JehxDpf4m z`WEv%Qz*bln4R_UZC@qa*0*M$i#Z0s39>Lxr}Ylmt%dh3g5IL}XPN*G@0MJU*TB!* Z_zR*OmA>^on;`%I002ovPDHLkV1njk?S}vW literal 0 HcmV?d00001 diff --git a/navit/xpm/bar_32_32.png b/navit/xpm/bar_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..13165209c3e1b2ec1c5f1b40490f3cd8c38b5edd GIT binary patch literal 962 zcmV;z13mnSP)F)_(}Wo9z--gWV2 z`rdrzYbJjf=Dd5(-1B?q-gDnP!4h@3pB^RoLLznpt-vHo-82>Fj(y0VOPxfuJIJ+*yuY32BUlzcn0rp5G2Bjv08#b@k zLhT`h6r>YrqW?W36-%+{<&CV}(8j$#9*|C?(KLzf^^nWtuq+E9#i*56$B%x*oh1SE z{Y+RFVkpoO2yW}ysu@0`#IF=Qy8DRn(FueU_+RqV`D&P!_7FnY{@7HEvB*O+ot#rB z-ap*S^~D0bcIG?2SrgJe=-RbS^LX{DKhmVd$Zx|0LjktF^$Jpx6)~o1F*fv%l})A+ zx>DiZUS{i6!ln^q0oBOQj~9h`xu36U}Bu%rwFPx7v9I4%oB><`{ z{gZLHKT>Jmy9?0?+a8I)R1{1T{vLwa=~95J0~t=8RGWYSU~OH1a%JWq5wq=d3X*Z# zPQ)OSw(a-~WHW{Kn}PYl-jG_wbO(Sdlr4KHfIyX3VYw=H=8hg70P}_6oxo?c0U9V- zxX;O_d<=Zza(#)b3QYqjR$y$5d7uv%F1R)VUCjq@R=Q~2cDc7#1rU{uuxv?Z=HhmI z=yG>d1!$x+rwfV|Xm`0Mn-AbDK@nxU%RSz70M`=eKsWGi;W`8S-gE$01r7q&T)8d+ zaW|b?s!>k^R|P(I4L=4>mc%tCU8S_jqxdi29pKrj0Jxq7H-IC+o4{y!T=oB44Unq> z-vd9@imO`z-2+~)ZF>wb3bx^MHksECdeQbdiDl(EP(4Tafcq%y*j(N2>UQkccQ|(U zPRFit5LMM`Y{JUzxEcV9U4oML0x6mE2k-`3FjoqoOvF?a9XJ78s1;X2XIcD^O5#l= kSDOBR<$y@TW^0CC0AR-$eZx~^t^fc407*qoM6N<$g6Cbq_W%F@ literal 0 HcmV?d00001 diff --git a/navit/xpm/bar_48_48.png b/navit/xpm/bar_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..e4bb4a8b22ec65ccca4998fb47563cc398b204c9 GIT binary patch literal 1400 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/beer.png b/navit/xpm/beer.png new file mode 100644 index 0000000000000000000000000000000000000000..e7847374ec1295aaf47f9768be8f09215b12fb9e GIT binary patch literal 658 zcmV;D0&V??P)0;B#7 z7Mj>Rn(?u!raNjA^!GdsU| z=iSK)TjLCwr3)z>oA#vdbBIQaz+Ue^Q7wLqcg)w=Lhdh=534=Qugi=8l{$+&z2BzqT%H zaMxgF8j1y&eg)RnyH@b=LxI~j{e8eQAY2Ew8+PfstF+7F~E7C8(0A5S_Ufx`5Z@phe33U;4GV_v$i3v!CE3f5x4`~Umx2DwmUr* zN`n(+A(!Pi@VjcP(S&FWL_wPaBH%>Jd97;=T2rcp)>d56;iF|w4U~Q0SYy|wIiux| s2k1>-GKOW!|HU0$5r?;}6t`pj11R^&&33iSU;qFB07*qoM6N<$f=!4j!~g&Q literal 0 HcmV?d00001 diff --git a/navit/xpm/beer.svg b/navit/xpm/beer.svg new file mode 100644 index 0000000..44c6083 --- /dev/null +++ b/navit/xpm/beer.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/beer_16_16.png b/navit/xpm/beer_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b6425873c4b2d67a77edacfbaa32f9d9b9d87957 GIT binary patch literal 535 zcmV+y0_gpTP)?&rnvt&sSF)QjpBBK5Qy{`~a@Tf;Y zeBed!>QOu?20Td!i18NCTmFEerwt(yG?+v1v12qM?#y(xhskUv>k`(wbUnJhqN=(* zdSq^nAu${+mxF0#RKtmMB#{SG&E#?KT>vjvW?wP9PX*8YA#)1l)r_z8q2mocuYDz2 zkE~evD6zeI{#?4y4^WwT7Q8re^5EG@yB z+Lt>3VV(Q?4|umn$9AgQzXsxs{9okAUldQ$?Bxq)7&` zHnWo$(lpb+$U=0}E0T@KI z!2?3z1hD+yfZv<=z&ua_o)iHC&A<5^SvzvKe?DC=J?x^0HT^4JehxDpf4m z`WEv%Qz*bln4R_UZC@qa*0*M$i#Z0s39>Lxr}Ylmt%dh3g5IL}XPN*G@0MJU*TB!* Z_zR*OmA>^on;`%I002ovPDHLkV1njk?S}vW literal 0 HcmV?d00001 diff --git a/navit/xpm/beer_32_32.png b/navit/xpm/beer_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..13165209c3e1b2ec1c5f1b40490f3cd8c38b5edd GIT binary patch literal 962 zcmV;z13mnSP)F)_(}Wo9z--gWV2 z`rdrzYbJjf=Dd5(-1B?q-gDnP!4h@3pB^RoLLznpt-vHo-82>Fj(y0VOPxfuJIJ+*yuY32BUlzcn0rp5G2Bjv08#b@k zLhT`h6r>YrqW?W36-%+{<&CV}(8j$#9*|C?(KLzf^^nWtuq+E9#i*56$B%x*oh1SE z{Y+RFVkpoO2yW}ysu@0`#IF=Qy8DRn(FueU_+RqV`D&P!_7FnY{@7HEvB*O+ot#rB z-ap*S^~D0bcIG?2SrgJe=-RbS^LX{DKhmVd$Zx|0LjktF^$Jpx6)~o1F*fv%l})A+ zx>DiZUS{i6!ln^q0oBOQj~9h`xu36U}Bu%rwFPx7v9I4%oB><`{ z{gZLHKT>Jmy9?0?+a8I)R1{1T{vLwa=~95J0~t=8RGWYSU~OH1a%JWq5wq=d3X*Z# zPQ)OSw(a-~WHW{Kn}PYl-jG_wbO(Sdlr4KHfIyX3VYw=H=8hg70P}_6oxo?c0U9V- zxX;O_d<=Zza(#)b3QYqjR$y$5d7uv%F1R)VUCjq@R=Q~2cDc7#1rU{uuxv?Z=HhmI z=yG>d1!$x+rwfV|Xm`0Mn-AbDK@nxU%RSz70M`=eKsWGi;W`8S-gE$01r7q&T)8d+ zaW|b?s!>k^R|P(I4L=4>mc%tCU8S_jqxdi29pKrj0Jxq7H-IC+o4{y!T=oB44Unq> z-vd9@imO`z-2+~)ZF>wb3bx^MHksECdeQbdiDl(EP(4Tafcq%y*j(N2>UQkccQ|(U zPRFit5LMM`Y{JUzxEcV9U4oML0x6mE2k-`3FjoqoOvF?a9XJ78s1;X2XIcD^O5#l= kSDOBR<$y@TW^0CC0AR-$eZx~^t^fc407*qoM6N<$g6Cbq_W%F@ literal 0 HcmV?d00001 diff --git a/navit/xpm/beer_48_48.png b/navit/xpm/beer_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..e4bb4a8b22ec65ccca4998fb47563cc398b204c9 GIT binary patch literal 1400 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/bench.png b/navit/xpm/bench.png new file mode 100644 index 0000000000000000000000000000000000000000..7a0a78d233bdcdca7f2c1a318bc7d2afadff132e GIT binary patch literal 653 zcmV;80&@L{P)9XPh3jC1`DW((|KImmxWu5aQ=U4D_nh-SoAZPJ z{Ih6iV_#d#yx>|YyxS$K_UhcGlQ(<+R9qO^2+gEsx9UhU@HsH7y1tp@xJ% z74|^zAZ4j*eaEfmza@64NNJd$L;@8-FvigcM;MgBCxRARQKJs7X&slP)D(i95p-uU zd%WSuonv3c?QOFsSgpP}Sw1Ve0?ufMw*mFz8bpr3k`rY}$qSh3+?nD@eKHzdG$$`s zfKTH6ZLQm*t2u_e5odPp-k1`Fg7M1HROAsLk_IKBgCUi0uSYZ_I&$JpwQQ zlArSA*RfO?$l?^7o){yJ-*qShlR;%+!^}0-oU+{e5pRrY9Q?cfA01>{>qKboc98bylVPFywK*%N9Al5Lat8%T+YqyXa5J ztQzB>JJ))P#S1^ALKdn)-23w0a^mjQZ^jot7kgK=oan3NscCrWQ7!YeAF_C9^YPo; zei^rQhi;q)&i^cz-x9?5S0D2Bt)1Pw_pF?G`PsW{+R&XJa{N1FF^!h|7Qn`%cRGHy nV}B>s&iZ2E`rrKh&p*INqk9Z*c*7;N00000NkvXXu0mjfSywtZ literal 0 HcmV?d00001 diff --git a/navit/xpm/bench.svg b/navit/xpm/bench.svg new file mode 100644 index 0000000..032b41a --- /dev/null +++ b/navit/xpm/bench.svg @@ -0,0 +1,469 @@ + + + +image/svg+xmlbench g.aoi +bench g.aoi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/navit/xpm/bench_16_16.png b/navit/xpm/bench_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..48da721e35502a82f84f74d961466d0973b1f616 GIT binary patch literal 455 zcmV;&0XY7NP)>(=NyuqHR6<=jHG|z`un6 z{;l(iFn=|@6QLm=Q0g;QXo!T~M4^7bqkj3x>z%y^l06%W2KE~<0&)!0mLg9RD0UKP zZu-pkJP+p!iM~HUTw6W zRU3;J)1&X3o&3w8eeQm{8z&3qYJkjOMG#Ji6M4k2ku3>q{yj302`u70agwom{7002ovPDHLkV1lO$(+2zw^#J{aD@64J*p}$doCerCr(+9Fbsm zv36V8MXYQDvEfJ@RDuJ^E}Kn+5@{=~;Go1(d(dnT2zwx;?PyJ>@2aVfc8W36ciyl6 zdtVMJQnoJ|B%7Gu;e9{%{anwL`?+D7X{Pyq#h^!ST-5hN-=l7cwO21VEi$cxn1S^^ zqE#=#y;=6K=lC)xcH3Tabow)puUAZe-%y2J@V-2SR1D~I%g0ogT#!IFAAwjjT9dG~knV|#U=zv2dCHLDto6tff@+?%y+7OD- zl(L2#Jz>uS44j9P9sI@zW#9C-Sw^D2$f#N|=w%5v7J0F}V~39>+=$g?}9UMZ!P&0^5` zKoj_n?O}*C!K@%N2BfIDtQV-wb_oj;NenF8dK=#B$|dccn;Q2 zg*%2xi#>v>tz2TEU`ZHByb0{UdQXmK&GGR~Pi=n?AUjmRhAsOKJhyFZ_*Z8fGd@;p z9eeWB*HE^9y2rvlEkd|8v&}Fao^%=+%Sw4DYM|dhX2pjyZkhWzuENrV5UJ7bG~15NN|i^y_8TU2QiSV=#{Trw&|UXke9GUq zkIouj_4?~=U=_gQ%g;C|5z7!uWnCYTBc>{u_SV`l6X{*-qdsXAn`%+|>s`-n8$Gmd zw>^+y>R%1sxp8FdtFi0XZ><7VVC|X}gT+Uat;@?jrN?HKvlA+%v?7_M6U}1vUpBmb z+uTg_nw09>$n zb8(~s5ChSnw(|M+rvR>9KeV=gR^@g%-so1+brl~e2CXr_=*T+`jsN+{t*-*FcB|{^ sz>%`*#zhC0OvIk=tLHS+O!MR5GrAM`&je$v)c^nh07*qoM6N<$f|<}kZ~y=R literal 0 HcmV?d00001 diff --git a/navit/xpm/bench_48_48.png b/navit/xpm/bench_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..6e2cf354f72fad30122a9119b1e1f1d5638cd891 GIT binary patch literal 1930 zcmV;52X**~P)0X%K?G{V9EL#|s z-I?8aFX!)voh2g@*o2lQW`4worA6bB%8=Kdev8VDFVRV5G z;;dI8RLK;8UO}(NdIcTe+CvR@fA!ZrXFl8j8=7vz zYo2$05Cs{`77A7YpEn4qM8-^ZfZ7cTGVi?$Ls`0n(O~l{ziO((6=j+-6#2i@PfoW# z@MM1Qk^}76(6kNowaQ}(_BJRFeBs1UbaHBA=9{5+Iq-{xnyQSB5dl4dc8~Qsbj)y( zvoz<$wV*}7BH&}^be#b28gvWwfOSdg9!l)c=BL^^0mAVFkhwf&4*&&|rXa2ZyAi~d z4cTdUc7r9LcYzMWT9FO~rjsd56t)srYT{;@S_}Y>mjI3d?O-oBbMJVuwH(K1VozH` zUDz+rBE&6Vw*#0NQ53%hd}>?)47AhPgBXhd2UZ5!goa{o1O3Hv@2rOGkECE;W&N)b zx&y;`3{{W5u}x-qP%1RlWJ@cvwF2~6uhD3^OgJM8t1-F|2b{DgF@_{dWUj#lLHF6g ztv0)LEAE>7vV}qqB0n3L>Cj{^OXc-CF8!BBflSSqzJhGlXeg>ik`9^gkb+YtKfz4b zGy1+<2UMRU1C?MMhW1PTl=tq_lHFg7d|_f%M?njKY_-QI^=AqL;SJw;;XwYs0zBT* zbcF)l63Dh7Ee75O`avP)uL4~OWF-p?dBLPooEB2-*-6>pO*1X37+nR_RbnT!)=eh<#?HMvBl=1QPV zva}vSfMTFqun+i|nLA-h&7t`w`v#_2xlj{;hrnaz03w+>O|&_}N2|l0O}?#V)#Pj@ zS_8I5W;Y{!0;m&Mlrmh5;(8!IAsf6WwAzU&&gmpZUf3CPG~$^n$%7pDEK=DSM-i_p z@%w#7fq5;fgt{K6ukvyXG$l^cpfHj?KeIlw%Lg`H=2n2M0G0!dg;M(3l`>G+^Tu~SPd15YT0PZrQ4unA;@T!MihepiNAmfvx*9;8-1Hy9N zsP|?Qoishg;>P;yoWSudkClWvF#Dl%yq9{_#olflA^Tjly>T35Hh(zwr-kdTZoO}J zXZQAvP3szS!4D1(jC@YUy>qX<;*Q)gI);G`0h~xParM@T$n;&_(>-`JWUkn57 zTDNSo1@@C-In8A=vW#>u7Hq_PS)IT(s#BCQd4;Og{?r+`S z56phFrKy3@50*>j>6VtDL}&AGlpe%v?>)cjJO;Er-O}<*Dbx9Ce=!Qmk)Ja-%wNZ& zcflDLV{>c!&?UL9qL^u$59Er8FJam@*1op2HB}gVdB%k7&`6RVaT)*1@#u}~I{iT+ zA1uT{ocNH@UFj_M?t1eGaO-31n`a*BFXhIgcliT2%`=QRwMkz3_xWlz{idyNyn5qW zLLVrj*K`uI#@?yDM=n+Fvd@4w{X?SD;rd!zNiTQ*HEPtTQKLqU8vjrH2Y^;?cec;n QXaE2J07*qoM6N<$f?A}Xa{vGU literal 0 HcmV?d00001 diff --git a/navit/xpm/bench_8_8.png b/navit/xpm/bench_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..85f1e74ac303bff205978967e235e9f3125dac6a GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_WJY5_^ zB&H@OD6suWPe?eTdi=zJ0|yNBy{?u({$#{e^E&Z3CVwd|DQi|;79bE|MJiJ&%D;#SM_3v+Nb``#-A+4 z#)p&L+|>5P|Nm!gWU%2*;^UMX9f{u;ap-=YZeMTs_s{qLo@bBk?(h7>634*sH`8Qo TJ9m*6&~*%+u6{1-oD!Mk8M94P)h4!B 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/biergarten.xpm b/navit/xpm/biergarten.xpm new file mode 100644 index 0000000..91d2e49 --- /dev/null +++ b/navit/xpm/biergarten.xpm @@ -0,0 +1,111 @@ +/* XPM */ +static char *dummy[]={ +"16 16 92 2", +"Qt c None", +"#p c #745f2b", +"#q c #775713", +"#h c #776741", +"#i c #785309", +"#a c #7d653c", +"#o c #7f795f", +"#b c #804d02", +"#r c #805f10", +".3 c #806238", +"#j c #815401", +".V c #846031", +".U c #868884", +"#s c #876d1c", +".4 c #884e02", +".N c #885f2a", +"#t c #897a3c", +"#c c #8a5400", +"#k c #8a5f01", +"#z c #8f876b", +".F c #916825", +".W c #925101", +".M c #92928d", +".5 c #935600", +"#l c #947207", +"#d c #956300", +"#m c #957b18", +".# c #95948f", +".w c #967327", +"#w c #998a6d", +".E c #999790", +".O c #9a5700", +"#y c #9b8d6b", +".u c #9c9b93", +"#x c #9d8d69", +".X c #9e5c00", +".6 c #9f6701", +"#e c #9f7406", +"#g c #9f8d52", +"#v c #9f9a8a", +"#u c #9f9b7e", +"#n c #a19663", +".2 c #a2a3a0", +".n c #a3915f", +"#f c #a47f15", +".v c #a5a5a1", +".P c #a66200", +".G c #a66400", +".g c #a6a49b", +".D c #a8a6a0", +".Y c #a96d00", +".7 c #aa7604", +".9 c #ab975c", +".x c #af7404", +".8 c #b08515", +".Q c #b26f00", +"#. c #b3b3ac", +".H c #b46f00", +".Z c #b57d07", +".1 c #b7a062", +".y c #ba7e05", +".T c #baa059", +".f c #babab6", +".0 c #bb8916", +".R c #bf8205", +".L c #bfa457", +"## c #bfc0be", +".I c #c07b00", +".a c #c0beba", +".S c #c18c0f", +".C c #c1aa60", +".t c #c1b382", +".m c #c2c1b8", +".o c #c5a660", +".e c #c5c4c0", +".z c #c68a08", +".J c #c98c08", +".K c #c9930d", +".c c #cdcbc7", +".d c #ceccc9", +".b c #cfcdca", +".p c #d0b067", +".A c #d39e22", +".B c #d4a72f", +".q c #d6b86c", +".r c #dec077", +".s c #dec37a", +".h c #e1dcd4", +".j c #e8e2d8", +".i c #e9e4db", +".l c #ece7df", +".k c #ede7df", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQt.#.a.b.c.d.e.fQtQtQtQtQt", +"QtQtQtQt.g.h.i.j.k.l.mQtQtQtQtQt", +"QtQtQtQt.n.o.p.q.r.s.t.u.vQtQtQt", +"QtQtQtQt.w.x.y.z.A.B.CQt.D.EQtQt", +"QtQtQtQt.F.G.H.I.J.K.LQtQt.MQtQt", +"QtQtQtQt.N.O.P.Q.R.S.TQtQt.UQtQt", +"QtQtQtQt.V.W.X.Y.Z.0.1QtQt.2QtQt", +"QtQtQtQt.3.4.5.6.7.8.9#.##QtQtQt", +"QtQtQtQt#a#b#c#d#e#f#gQtQtQtQtQt", +"QtQtQtQt#h#i#j#k#l#m#nQtQtQtQtQt", +"QtQtQtQt#o#p#q#r#s#t#uQtQtQtQtQt", +"QtQtQtQtQt#v#w#x#y#zQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", +"QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt"}; diff --git a/navit/xpm/boat_ramp.png b/navit/xpm/boat_ramp.png new file mode 100644 index 0000000000000000000000000000000000000000..1d2ab2428ac602d7fa5a27ef9db196fb1dda1dae GIT binary patch literal 729 zcmV;~0w(>5P)B9J1L#x|{b zn6(LlHU-h51{XaPm6o+~*TQ8HE+S~%gMuhiN_;U)p~1)b4Nj3 zLIMOFsECX^JS7Q-rzEkF=08te8Vv60`1rYggMh1MH0ZLsqDGn(J9E+r0An8~tcg$G z1^~p0I(F&oVtHjb8HRfYP;T~C<_$Cy_A`)d>$p4=u?5HDag8~&Tal<~sGLffeap>` z=?rFL(CK9Cfi3vWv=K85x2LS)po$BkjP30TH24^#Xp40ZHY>rL^LY5MS*oN0kTTl> zQLt{h&d?AIamLxb9pKKM{#K?je|1fj9k=NA`b{4L;aF$SKuZCbJNWHzQ@~ABq*~GA zeAnS<$jNnfe+%4op)Vk%JX#;D+p*JyhBM?`OSZfAG9o&Xb*&S3Ua#|3JFK*Xl}_0k zmbvjImsgZIb-vn?smbZP06KIbt=QD$Y-(z9)}9JL3TXjSV@ylDeEy2tq8a{k=_{kIq@1BN##F#@8J2lRV%fY z0|Qtf(uU{WzgXW7I5|JN4&Vz=_f0H*%{_zB>DgzON<00000 LNkvXXu0mjfKUi3D literal 0 HcmV?d00001 diff --git a/navit/xpm/boat_ramp.svg b/navit/xpm/boat_ramp.svg new file mode 100644 index 0000000..1ccc88b --- /dev/null +++ b/navit/xpm/boat_ramp.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/navit/xpm/boat_ramp_16_16.png b/navit/xpm/boat_ramp_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..4ed590415f2a6d113c533dd3fe71af386281dea5 GIT binary patch literal 573 zcmV-D0>b@?P)U1|BP6LwGA|dIJsDQ7#J8BSpNR|m;e09 ztIsc=y}^j@kMBQoGcf#rb^rFmKd)ZCeu*si>*p^`?}RQ}mPdCl`#!ph!}kmf3_reo zYB_&sLlB1J{{LhA_x`EP8S6@VkG1f0Lr0;m4=fe;F7U9y2j8F#P@V``470 zH;(@x#el!Re|~2`iYG2MPTt#GLX!W8(ft4aKgRDLUtj(8^`kogc&w#x8py|t00000 LNkvXXu0mjf%Lx%k literal 0 HcmV?d00001 diff --git a/navit/xpm/boat_ramp_32_32.png b/navit/xpm/boat_ramp_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..a1a89f4b80108c8b6e3ca3cbf17b29a1f12ab610 GIT binary patch literal 1042 zcmV+t1nv8YP))m-A90%LkU9UsKlSZ1E_h!D|yxD!bgc_C{pG|>z!Os8LhbR7GR;K~HS!*vV)12K* zg62;IngS{q>J;UkyLVS{b?Nu5Xu1bTrss|*#eMzz64>3m5d0_rRlrhtgj#U{-`EaqP@Tul>9w02AW4 zu6vA7BxoJO|8_l^Z-KpYOMH~Wa`ub*8nDr31;|v_e7k)t8|&!f+HLYLHGMi z5Z-bHFg7;rB_WS@bhV=~(BLdzrl)LTq?AbX$20&*yDU@yKVtRbRRUC> z*zzKPo>(_@-DiS$x&{D~0KeYcveRs7ZLXzXVPq@6o`r{F5}@Icm*xg-0g~f0PcoxF zHV~CAMXM(4lNOGJpzFFR*nHa-fLKgE)aW-ly4;oB>LXXzg$fZNkk}iO%=GkVdS+-7 zz;Np1eg+Q5_e3>vIEg)hgZjFKd%L0gbyE@E*#sa-9P@ZRMyNOFPJ9zU*{8wAgb?W4 z8<${uDmi}Yv5ooB^lT7>7o+hWP0AX-2M#cbRL#`&M7!Z{&<$cSRhrWj)C5?_wvJs` z{X6Gcb8T&{0znx}E18v=>vpxZYFB^zu8Y!CCvZ_=$X8z<>=GX6)!YlP}z(fFQ75!Rv2EZbK_v=_AP%I_C0KhdA zpXvX*eGC-;h~@yyb{`l)L-X#sk6*7TW#aPL4*=j&3E({<@kTzI*%=xfaao17Znqg4?bb)$0ssI`6KM6?k7u_XAeYSmLfPmw->Uno zceWKEe|s53;tGI5IRF66f>q)Ag>%~qko)t7$;$kxG%g2NX6A((7rr!&d+tke-2laB z;8JN^{q>nsM&am{^NVQej6ZO3)3^__a8ClbY#$}Wr`Y}?bg(4%55p&Oc`#k5V*mgE M07*qoM6N<$g5WRi&Hw-a literal 0 HcmV?d00001 diff --git a/navit/xpm/boat_ramp_48_48.png b/navit/xpm/boat_ramp_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..0e308f3d9c0f8b4d0c1542327a1ccd05793c19b3 GIT binary patch literal 1534 zcmV-%<8H+S|4@Wt_e_RA0UylvL6l7LOm9IW@l;{Xlr)k=;< zMCs(@6?O_Jk9&a>zV3m8$G-aTFD&((dognZcXqawr(6a(xyBK3IhC=tnEO4-ikb`>#CF;i|At+3^EF5m4ni3fwYA&G#82KMJl#0vnf=DP4_yLo~ciIWfDj>w-J1s*e;tOkOYc_^`z5RzgD$~Rj z&@<@m0$PO-G&a|(_*%>oHZn)0jgs;b03oeHDGP~8Xg5G*wUZSEd8UJrk-da8Bqdhn z4z2|xPjnA@+mp=`Q$X)FZwHbM08ML>w+(6-i#V~BW0j54U>1a~?@Q)2rU0qyy8y~< zWfYgLG#O~>xIMwOAjD(IvJfSpr~g0=h$jIW-L54EAtOpf278Oh^RciyD=4>>0SF=G z>xpcmGhngo1hR^X3UE|9)FX~0#cs5@HB`ErA00TjHlE!g0e#yKtOW5qKz)k~k;1+e z0||*9qKmORZJ{h!H0_Oec8dheE@V9i6z1gSP~%c>8)6|No;gM@&8&th*x9TgaphL6m9`3EmjMzCiSi}9zsMl z)Qf(pV)RHLV`d>JKnf}39)OzFRpjJko0}yD>H0`%bCerd072BgpaEO(NxffQj+*@2{%y44V%&Hh%PlboolgIDuzR*K#?zR*d1qzxT z?#J$4e_xqT=HDMe^WdPs+pif=B$mG~L?lxv` zP9Sw10((kS1_++~9D-}%E@NggR6gUtlyMOGR^lyy$xCOseRVW5kts4AV*x|7fRn&? z0GCds{Y&+f2+Kf10T5UVT>I+`)7O`;J2gvK28P1V#}aS?_ys8$J9A>W<5DKp9su#b zx_49N6ZINp`&+f0UnSGXl)rSWNoHhwvwQ8GnDru6^8n>`I z&C1+ty=piAN6A2q2}K?m4+I1SKP9B3q$K<}|6~5t=3dYHF4698o*Sk%0)eNin`L-h zWLP(d^YFiY+yDRn|E4D;B~6$j^qKR_Jf$rfLEJxX56C4Ie;=KFZ(sk<$adfV zC#uTI%HsOg)y9i=th&kL#~8>rW3k=-`jcl5Du3t$8FzfQczEQ$zyD9`WWN$Vf8fN4 z2EM#^^Q@;%Y@Qz<=yI|~efk0m<4sTM+1T2|!~6VL84e}6hfbWRyAJ4o22WQ%mvv4F FO#s&Sh#dd` literal 0 HcmV?d00001 diff --git a/navit/xpm/boat_ramp_96_96.png b/navit/xpm/boat_ramp_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..af7efd99f5d09c938dc7e58a6b1fc22c9ab89eb6 GIT binary patch literal 3027 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 VBl|VR?ezcv002ovPDHLkV1lM_p}PP8 literal 0 HcmV?d00001 diff --git a/navit/xpm/boundary_stone.png b/navit/xpm/boundary_stone.png new file mode 100644 index 0000000000000000000000000000000000000000..8ac6d0791f414ec7d6ac2f81ae46a65a6d98ba11 GIT binary patch literal 841 zcmV-P1GfB$P)z0af}Ixat*vt( zH=9jwP=*WxUYHHODP~biC4yYW^k*06j4R)MS^567%urxWWtUYEedN2nZcM}@E+_gk z#mr~_34HZx*49b_l zT01-4gJF$30Fck7tT%0-gdqx#i7ECW#XiEo#h59?xigdR{TYLd4*$S0xiA_!dU{(0Qr_hug2g%xX*R!o#irEwtyG)*I8W7iV* zetUEn9wzYg<@~;xsqnKGmlB3yd>AELlfaMP0dU_2&;ek*TrS_3pPx^0&LM=rv@;_o z({s}K#g*jv_>{~TlK>!{PFtN$=key|=I_I_;>G&cXxlS*XzHWwn0XzB!*lJ|7*PhQ6TO} TTihd500000NkvXXu0mjfMH7o8 literal 0 HcmV?d00001 diff --git a/navit/xpm/boundary_stone.svg b/navit/xpm/boundary_stone.svg new file mode 100644 index 0000000..15a3def --- /dev/null +++ b/navit/xpm/boundary_stone.svg @@ -0,0 +1,320 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/boundary_stone_16_16.png b/navit/xpm/boundary_stone_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..7cd7689f69bd822b32de4e804c853a02a18aee3e GIT binary patch literal 559 zcmV+~0?_@5P)$HiJRaeL~s#wu!}B2;DksvDW?ry&q#8)J9BYyC@D#-&-U`Z z{CMC6X5`7Et&O+O?^Y-6`ALggmBr-4dzII^5T$i zDEyd+OFPE`6h*8=B0N!2Ia!J&F2-53yuE!R_Rj!~a+fF-(euTa9W246XN46#dSMno z02C6kaGQy2jR+D3p&Z}+>is13<21>o=g!cfsiPMgRg=ZMi2%B82Pzb z0C=8v9WPBeUieD}T;RLld4gf!9s!Pg!7z+fW8{Q^Juir~K9Nza`F8l7^rtXh_divWl{|dmV z{_fNJ;=7KRmI(A7NhB4;B|Xkth3_uh{_yj!E}pGbht*@=*SmZFYu&yxexKroWf?6^ za>%kw*f`;#kb2DFbX^|1IWt#_7Ow}Or^Ek->f}wPw(`g{L{7`QGz<7u6HKV8D-mt> zegxp!GXrQ)?FRvXQlctODdA9~n%k{(mBxd9WnZmYv<`nF%k&Tc5XztnN}VpJQaQon zw(qG`d)ok?o$7eeDYIrm7$}zjDi;`iQf5yg7<~QJw(e&F5cWBa0|b}0o?j|3WI}#P!t901rCpDuL+=92D|{e03-m!13pK4D4+%? zlTd_^U|O0XNfKmPhS%%G`uaNj{vb3R&p!=-1b`1powleaD9g6u&bb7}BoLwrfT5?S z2UAm17#kZyI2?v<*qQ-I0Q8*zELC<|o74u%I2f18HK6Gxvn)WU;%gl0L>va5^HUg z7?q0VTmm5!x}g&S4MONJg;5bYJRVzBfLhLh2LM`H!fLS5=SH~(Nby4|jG`eS6qaR{ zGe9f~hmAEo4S-buu-jb?l(8ZJ{cD+N2?(KsZkkpCND>KE6R+hUD#)_z>N<4Nf9_H~ zXPDHg92AB@O`$^w9YPr8Fogk55PTW{T4!hHbFo;=e&D5}o}qD`pIz7xr9smar1H6! zLI@ps+c005RCrfFpT8W;#F&aa~_SwVt&p!D5YSGp`|ryD-=S~g)8Z0eZ#O_y<=Ok9Bq0a zywBNjtW&Yu?L8&n-rnAK&YwR&ST}&GswvJn;hcjpR)¥Y?oJWW%*A| zJpBFg^74FL008ofi;L%k5K=H0Jm~lPd1<%VY}RzU-CR+WEf;6A*^L`FZv2$ZW`C&{ z001yOJ$-3)b#Golc(vuv|^E-ajL9 z`0(K`Ip-grIB~*SSXdaHo0}WSWHM*3U%x(Er{?xsFc?e$*t!7zZ#A?(0RuU+HV@m_ Qw*UYD07*qoM6N<$g41DQ<^TWy literal 0 HcmV?d00001 diff --git a/navit/xpm/boundary_stone_48_48.png b/navit/xpm/boundary_stone_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc97f51dfaedd5a4990d47964e5ad622b599ba9 GIT binary patch literal 2392 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 sTAj7(<8do2;&` zA|ihct<`GudL5L+MDzPHaICae*tX5`^7665X^%CVO%4tsVr|iG=lftmDQl5}@1V8D z7&8lygjq1z5eqi|i9Y}z{F z_D>^m9EVb=gw~q5xj9m)6t-=nv4B0?d^Q1#LHV9XCT*Pv9K_bv7Q4H<0PO7Su)V#V zv~Bl*J-VGJ0UJ=h?~zH{Cqf6`Q4|epK@i~kKE@ct>HyGnGJUW?eBURXnsj{JBjd~U zyyS1!5(1Fxw1>+hHWsm&zBmA-)UX!E8cl-f#iP0aT)$PWig12{ddjecMK%4}DdB_U z(Sy6>oD9Z5<@p<0t&nFg-<~MmSi43(mt|w^DtRXhz|A}NF>yQshf%UoWhq)gL=d&7 zx(dVOPO}ve1W7*F$p1Iv@d!w|F~Gu%ny-g6r9pAr@w@){3D}%Zv!X_b)kV;Z~y=R07*qoM6N<$g7y|bu>b%7 literal 0 HcmV?d00001 diff --git a/navit/xpm/bus.svg b/navit/xpm/bus.svg new file mode 100644 index 0000000..8ef93e6 --- /dev/null +++ b/navit/xpm/bus.svg @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/bus_16_16.png b/navit/xpm/bus_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..76c9b5442b372b0b6c65bd5391f2bf0a81f75c3f GIT binary patch literal 616 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 B;5+~T literal 0 HcmV?d00001 diff --git a/navit/xpm/bus_8_8.png b/navit/xpm/bus_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..33779a296d6d9a5b66a2ec53f315146b784aa74f GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_yJY5_^ zB&NC^-0OANf#JZ%|FL>f)o0r$IV5v0QmSPrk3Vqo>`~X)8uoB`ry8ESTv{A_e#fp} z*N_3XT1{BkG9zq+LVKfYwtK7Q#E)s*(`2M3Fo_FSv_%GdEL9QwcAdH=6WLYG;g zg&`qIY_7+CxfAo3WiQe=8k!q(_1Hw+b$aX>vc_x8yd~QjeJ)Q?@$7gkk<1f0?O~;y z?%K6Nm*$%G^=}o+*4-MhX!EVZ5&S8(!KY%^h}+Dc{oCEnO_-sqjQ{1@Ttl6CtyS{R zetwO$loyW|4Pfq3UuwLg_JekC{io+VFFxh7TCo3M72yf|c=^VY13+Ihc)I$ztaD0e F0surme69ch literal 0 HcmV?d00001 diff --git a/navit/xpm/bus_96_96.png b/navit/xpm/bus_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..92c400f4394ae43dd122e80dbb656cf9237cb7b9 GIT binary patch literal 2732 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 HB{Ts5qn&CF literal 0 HcmV?d00001 diff --git a/navit/xpm/cafe.svg b/navit/xpm/cafe.svg new file mode 100644 index 0000000..7f2c152 --- /dev/null +++ b/navit/xpm/cafe.svg @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/navit/xpm/cafe_16_16.png b/navit/xpm/cafe_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..65f7b04aef183acc631845f200f7ea94efe0e8d7 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^rJY5_^ zEPCHwFyvzl6k)yKETZDFa1%qPY((Q3y*CHbu7oLMh-7(R=!o+6K9ZqkSUI!ia`EKp zfByfg{eJKJ&&7i8jCq{bHZZ$ji{5#BCB9X{{r#6C~Q<%(H`@m~x zqXV=vs)Mfr^@*d<0Q&_cztthuv5jY}h6LEEFu-z8-z)5d1W52+f&3BUn8h(#X#7aV z1_XG)X-Lu>&e6mzX0V2*(9J8#pFkJa*eLo3Cne-<>|vs)9O}3)Aiu#}8F4R*co;(7 z!hA^MVJ6{%bci%^zUyKamqi04(r1%JUH0p#VS2#cj`TtfUs7 zX{_QpUSO|o(mT3qp(~2wE@QL2w}H93;whHFtq#O*;9f=ec4=gkZaJ0*9T?avkG~Xa z|9lg|kGP=tpxZXl$F(MfSGk4#mV|%6?Y4whS!+T3Gt6`$o?_qAZ&3V8>Ag@Z%;Mdc z!jJmBv&s*139tSkFg4znIck%;olbEQS8L|l#LhS`PrYd_fQdK@bE% bFaZt$U(0TvZT#s^00000NkvXXu0mjfzuC+-^khEAi{h>eOF`aj(+aQj%p6R2ONG6WXhVDBW|xayZ>1fvtkR2(~oYYEr(~M zYHv%4x>M22&vqqML`z2S-HZ(nyo7CM1N)g94A$u0nKOdboFyt=akR{ E01w(YO8@`> literal 0 HcmV?d00001 diff --git a/navit/xpm/cafe_96_96.png b/navit/xpm/cafe_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..665ab61c0c378c11ddfa127922c3777809757f27 GIT binary patch literal 915 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlJ8Jv?0; zLn`LHy?r*HH&EjE$Nbfy>vNT_PUuoNdd+*qRF9k~9veRJdwApsaBKU%@yJoxCU)t_ zq39$>C82|DM{YN)6j`uR^h^WR$s&c+fc89l5)J7E* z_Ivsd1)iNbIsL8SgVv{CQ+>rBKE9KD{&m&@!xfv}%3k375)qd^?M`>V^29^`4?9lH zea}#E;r-GVc^;Lj%ea3nXDDgcO}PD*<=RY9M|TI-0;wBsD&GsG>3Ce_y2C%k)5YCk z_H@Q@wJY*6=Uas<_bAzgE}7eVK=MKP#9!=5splp=b~Vdb)&8AnvzP@VkI2gJtT)2_ zKILQ_>iM^Ba+>zNq+dUz9&lWUUUJT$KrA9bu|6#3Xzin%qn-~WKHOaXM`^<)zgur^ zHvK+wv&(M&ck70`(>_h@klx`RCv=hfje7KXrLHLUo=0|x+mcv{uT7p=XV+DBNBx|e z4MUX9b2ZV@1J!rb4f0Butk&6<3LcZ^wy;9``71D~DrZY07 z*G-ldyZ&*0mC;kv$Mt@5TPvDozM7ORtx?B+v~*9(r^8e3+;ZLaPE@qvYUehK=BUQ_ z9sd6qHrPGfmUhkTP9JA|gKg(_qsOxv)0fQu6Zjy3>n-<`sW&ffZrJ;{{_-W(J3b#j zyQECAhz*ckcAqcUbxZdwt_60F(yt5W&Tg&?ejxfKnPW_0=J;vn&k%dDZy@tiZiTJwrFJU!4KB-T~T!o&PLS!a5AyN2P< zrx^_Q9{e+N5=&ySh>Ej%9N99Hf9CS`cT11>Kakq6Y>vvU9YS%eIY;OGYL#T(_jE~| j`7?0?C2U|4Ydxb^(C=5fo&7EWa~XrDtDnm{r-UW|V)LKL literal 0 HcmV?d00001 diff --git a/navit/xpm/camping.png b/navit/xpm/camping.png new file mode 100644 index 0000000000000000000000000000000000000000..b91fe06bfd100a2e0ac2952b292d217bb5094559 GIT binary patch literal 316 zcmV-C0mJ@@P)L;+N%_J*`eh8~YFbE91G;1^Yl6=8UqGOmDxExlNamKa}oG|x)&cnT2?l9!P8LiOU!8BHI)8r=Ba97A1 z + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + diff --git a/navit/xpm/camping_16_16.png b/navit/xpm/camping_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..4f3d29f191e2c9ba75e06e7f2a1c5bc9e029dd8a GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt@!JY5_^ zEPAhAH1u+I6gc*Aex>h(kZn;cPF(&8Q=K{F6kWAEC9U-ZJmx!BFmL2n^gUpl!PTrV zOUb6&oL}tXo*5#F@;ax_y!k(SZY*aqm$&epio; zpYi#R16S)Gt-{ae-RcKY^Mn#w%oNvCw&V^H{?5d+sE*R$+?Lyqz!CzPe)6?KMV8= NgQu&X%Q~loCIH0FXx9J$ literal 0 HcmV?d00001 diff --git a/navit/xpm/camping_32_32.png b/navit/xpm/camping_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..3756fca71b2df91b6044c958aa3685e78f06f857 GIT binary patch literal 432 zcmV;h0Z;ykP){4%Tj>?-z(F8yL-Y%)(tM!l zPYlI!M{yO%e^(7WgUdj}4}qG+K>j%f{s-PJdSGsA_VpiiPp}uL+r;Cf2C{)Br|7Lv zo54k(em0)mRyKZy*M(KQ2{b>(`veO(5nWty%_tq*1^g*LoiFe;z3kk1cZ0Bh_~3Tg`R4z9 zx5LdGB_$;#B_-`)8J5>vFHI%V42v+1k;?ThJj0$;Ld|d)GdPE*c#IWEjT)pI_wW^; zaWJh;bDTtm(bOW%unLnx0W&zB)TRkW1o>*b#)hOu4R93G<`$6QR!XT@*5j4G_T$e9jjd$3T%&vd|q093Xkl_xx5;@joBi<^O&+rpx(`e??h1=rftMLKbQpo0U zM(AoI1!TC3g$aD;um$fmE?~5>D5R2sA zh+7|nos{npx>h9h2|I-?MA5TTI(Xn2j1bCjsq*|f^|u$b@esZ3mftOOt4L-{Smad( zFdH#$sGah?n23<5x8J!LG4=}%w5x!j2!UCgt}}iuUPk12g1%PE?-jaJH2IB!JSXIz z75TTo6)+qz;Wr$L%(n(FB63a&XX}5WU+6~BWLFx@ zdqmu;G*T}?47L9(%oh__+(iDX5xJ*vxL$(poO|1`vhw*DHWx_D;(_?rruz1-^=S7z`**T|A}imZ@}z>TwUgkw;Zlr*w3o7@KUs+$@U$B{*R_SH*cT5;^Hxv zD#H?q|4XIcSbW%PeCEc7!(B>Z?GxSvwl3oonv!VE&Gh6)LS+?;-*aW|&#d$2fSkeL M>FVdQ&MBb@0J@<)qyPW_ literal 0 HcmV?d00001 diff --git a/navit/xpm/camping_96_96.png b/navit/xpm/camping_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..c26e30b275f0327176eeb0b09ba3787f70208bb8 GIT binary patch literal 1225 zcmV;)1UCDLP)%)K+` zp0m#0=bp2Euwd>z%-;XC_L(*N?7j8@!!QiPFbu;m48t%C!!QiPFbu<}!mGfWHLkq| zjCQD{aJ&cn37iL-2V83bt^#L(@s4#Bf)?N!5R`0N#kCQ@4;9ybbgr%-d<6W51i2Gf zSo;1e;Q!M1H-R}`)D?tXl<)Kl$ROM-Y^BpZQ8^iM&Zz#^Zbio#sV zvz~!=5qRF8wEXiFaE|K14{eV(bp>EMLkB-V9@O6VB{0vl0sk`m00h8gV6q>X`Q#bk zH=+eUwEbR`=9C@O7yJNt04(z%Hg7Bj?os~$1jzEVJsl^Y1^AtK!4K^SvRrM%;5(89 zKU}8x!nN=`@FCDe@&O2d4&W8H@*A6}NdDFcerP9vkuIHRR7L;?&<%coY}TxH=tsk{ z9Oy=W00Q7IY}Ir~USjY@i?*FXmamNgG$B*QG=m=ieZU4sJ~b38DOWb6Z8w40Zro}N zUPlV9Tm(O~pMWtgoXa{Rktw3f;0MT#+ExetWu7%iUUoeI0q_qnKYbUo%SyGfB0|248juSdgx}+2So~S2p;v3&6NEoz4o)z|Z&(cs1Ld zqTiWe3wo*NA#fU5Xwzsf_r+apNWRs&WA~QYJ*?Q~WnfY&-g_oaWy4T*37Al7TYLXt zUm5}M%}(?J)XCsk%QEzqvAckeRlWDjQsP%ORI^(1cFm2PtH3l3=Y2DgO8v$CNNSf8TS=a8*OtwA_P?R6<9Xje9zCi>HET;4_g!E0&W zp0eH{(X4FfKuQ!{@U4>O06Dwd=16xxG%FjrfzKUke-`*vNqYeNg6#M?Bg#7)>al~k zUw40p=qK-^*p7MyL~*#4{_o`pnG3ufv5n#A0*)fVh{Ko!I^F0UcBW5_Z+$e(#uX(DF&F$}{n48t%C n!!QiPFbu;m48t%C!$`nmqpuY|sWPVy00000NkvXXu0mjf%u_b7 literal 0 HcmV?d00001 diff --git a/navit/xpm/car_dealer.xpm b/navit/xpm/car_dealer.xpm new file mode 100644 index 0000000..2705e83 --- /dev/null +++ b/navit/xpm/car_dealer.xpm @@ -0,0 +1,23 @@ +/* XPM */ +static char *dummy[]={ +"16 16 4 1", +". c None", +"a c #000000", +"# c #7f7f7f", +"b c #bfbfbf", +"................", +"................", +"................", +"......#aa#......", +"....baaaaaab....", +".......aa.......", +"....baaaaaab....", +"......#aa#......", +".......aa.......", +".......aa.......", +".......aa.......", +".......aa.......", +".......aa.......", +"................", +"................", +"................"}; diff --git a/navit/xpm/castle.xpm b/navit/xpm/castle.xpm new file mode 100644 index 0000000..e311e83 --- /dev/null +++ b/navit/xpm/castle.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static char *dummy[]={ +"16 16 3 1", +"# c None", +". c #000000", +"a c #010101", +".#.#.######.#.#.", +".....######.....", +".....######.....", +"#...########...#", +"#...#.a..a.#...#", +"#..............#", +"#..............#", +"#..#........#..#", +"#.###......###.#", +"#.###......###.#", +"#......##......#", +"#.....a##a.....#", +"#.....####.....#", +"#.....####.....#", +"#.....####.....#", +"################"}; diff --git a/navit/xpm/cemetery.xpm b/navit/xpm/cemetery.xpm new file mode 100644 index 0000000..5722e8f --- /dev/null +++ b/navit/xpm/cemetery.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static char * cemetery_xpm[] = { +"14 16 8 1", +" c None", +". c #8E8E8E", +"+ c #8D8D8D", +"@ c #404040", +"# c #8E8D8E", +"$ c #8C8C8C", +"% c #8F8F8F", +"& c #898989", +" ", +" ", +" ", +" .++. ", +" .++++++ ", +" +.++++++. ", +" ++++++++. ", +" .+@@+++++ ", +" .+++@@+++ ", +" #+@@++++. ", +" #.++@@+++ ", +" .+++++++ ", +" $%.... ", +" $%.& ", +" ", +" "}; diff --git a/navit/xpm/church.png b/navit/xpm/church.png new file mode 100644 index 0000000000000000000000000000000000000000..2bcc1dd75a122106286d5b6c88845a5e45635172 GIT binary patch literal 730 zcmV<00ww*4P)~tgK`pI< z2SHH;sr96SrwWQ!!Gi~XKxn;q5R0JDo8Yy0sI3sI6j4x`+U(A3XXf*;N!hf?CN212 zV0rU>ZyxWP-36KeGaIf(SEC-Q8DRi8TfBkM;y8R3UNiM|g%zvE6?*_^org{U_`%F< z*vNYQRBvNdm!3_^>GSV{4>k7_aPTB|PdQ{Kw&eJ~AsPiU^XT$8k1Sv36|)*txVR|l zI(EppNM!)vbsqK_fNmlpi!67`!T`X`#LRg_W?{e!((PkLk|lM?*B5s z+b6|zdREN=0QzYkPNxR_U3QlwSa(yF`-q52vBJ!pG%!~r2e;;QAu%PUbBlTjT4`vl zVU&he23l+M+TFISk5n~uRSkHuhR>%uvu(_Tce_UctFn1 z;#_ZDUf4TAHd!460MZ02mww*P{#h$-Xo?rB<_(O}_;hAQCT+LNDW^-q6A*#FEwS*e zuZ9z53`kExNKsSlQ0@Tsx9>&*2^3bo;qBrK44b&y777y)gy%yFv0*?O18x0yI54pc zqA6pv0C0R~OZ%Ru^Dpf1!wZ zhE`+kMxqEa_Cm+e%m#KG^etE)BRyYwT03LiRz(r`0%}cdD#$pk08orjUeb0OeibVP z#MnGp07%*{0f_!Jgkw1k9RmQAR)0AjeU(~fPHCfMgZj3n4&Dy_0q9{hRP!5Png9R* M07*qoM6N<$g4WGJjsO4v literal 0 HcmV?d00001 diff --git a/navit/xpm/church.svg b/navit/xpm/church.svg new file mode 100644 index 0000000..12441b1 --- /dev/null +++ b/navit/xpm/church.svg @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/navit/xpm/church_16_16.png b/navit/xpm/church_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..6fc7be67dc40d9d51fb52cb8c19ccda6726b0656 GIT binary patch literal 643 zcmV-}0(||6P)VmW zaMh+w5VR0lw24+xK~WJTNKm+l7D`|gM2o;SSwYakWYn2P9evI`XWo1F-qXSvb9AOI zT=+Ts=ez&8_X0JR&4r(C5SO|qQK6}TlvR4l)J+@ZBHkY{w(~0a!XB~ zENS%@R@$b~jGNupto}&fMFAiH}pJrS^RoFI|E+&Qqa>{z;7>ovOs01z{W0rXXYr-7VQa daG;83>JLifP?_iWuZREu002ovPDHLkV1lgiGhYAz literal 0 HcmV?d00001 diff --git a/navit/xpm/church_32_32.png b/navit/xpm/church_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..102eac68b8b1c83205be1638de9565be81e4dbc6 GIT binary patch literal 1119 zcmV-l1fctgP)h$iLj@6OQ4~Z3k)ooMKKRlK;)@TO2SJI{fY6jE))0kC6|sKQVjEJDG^r&`vNLz? zIX<{EnN4Rlv#~ueEa&5%^P6+e%-kicLs;arKsuu~0+>KuM6}dMuFQG>1l)GkPHy{u(fDM8U2M`^c8zpLotDd0K82^zpV>EL`nc&wBQ#AXc_aq$FMs}Gdvd- zWfrjI|1M^TWwg)@=x^@D?oz)ksGI^YLZCN^Xd)FrwSBKJct1l5$Gq>ctc7kJ#31i?$-;n&=$>M~O(T0uYf-0Iyo%XBnIuHRI|_cMLOT?yBTT zMOW-AkQy2fwC=#(&3o)7r&F`=&x+I`0G|+%Pu1c(8T^?*oa5ev8eTevY5!uFm~CT4 zYwXouEea3abU*fP*<&|1b!h;HiD+K{@H~LS`z{^81#dRFXpLQxVWP3CbOVXRlPAhGCb$T~$=>;e&iv2HkXHE%-WdhmR&WlRG}Fs@nEf%u{WU43}6d$+yW>A<30X5Shbn;Or&b@Dy< zT=xXF20+DKnSs@JT7|i{d>0OEe;FYBK%f)N*`{Uy#lhPi9lT-|^}$m|)(_xDW}s%D zBLn#OEd$~U|D7e>6FqQ>2p-$AYw+NyBS{~sSP4Ex1OQ&eg>gNYiU-d%@G1tLYhYXh z-!ov};?D9mKdbatF{j;c+6pDznlG)Z0{{Te^y06Lr- zamoFsVSs7}JXp4g!3CWMfe64tjC&aX@;VpeN|u@}VCK5PP9{8W#QpuM{BHn3{b$$F zDF9SH#+58JTk!3`u&EcUNmF%ABEb7S@3IwJ_fCo#Cwx)@fS&+-&{=FxhYg&KvCRN@ l!^sqiDRcaow%B!*e*vZzY(mPfA>04}002ovPDHLkV1k`n1cU$p literal 0 HcmV?d00001 diff --git a/navit/xpm/church_48_48.png b/navit/xpm/church_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..2f832957b8747fb55630f580b9af1643f3d17ecb GIT binary patch literal 1501 zcmV<31tR*1P)=S<)!Qlr~n$W_*9iLV5tQF za8eKQ*6@ce+ueaKZYggod8`o;5S9r0%!4jlr~kH*2vwK>5%B@fr>L5oL-Uy;@?r}6 z38mDl`En_A27JKN1-6|Qzml;ZxMBhl=rexcq71uiL;9S@?^o*&bX0rn&1Fs8Tt2Db z_(co&DEv9c^ogu~JED8o!5)vj(|>DG0?G<*`7gm$FQDip)L2%JiRH4HSPbejE?YBcr#1$wZJne>{bd}RusGklu|>v zk9->0%3GM9*+|r z1rQa3ZAKp(BVTb!4`m=7Cz^${y|lEWtOPnjQ+cH2er^ih=%n-=um*TvDdl?Lxdezv z9k3i&1~dUgB+3`juh|soWym_~CG8-PH|Y#B)*fnO(b#TgHBLuerujSY8n9L=6?O>_ zk#691pxGYr?M5H#hkH0>4qXw_+EI>edd-wj8;i$3K-Z{F%2a~x0i{%1vVgaNC1HuM zC9;zZ!`tH{?j)Iobi$`N(y7Exs2<0%w#6(MGY8;;QnB}N=ev*s=n3!Qz4M>^D@Z$2 z@NYwhc=x~uwtxgY0xYdD4J#>kyNS98IQ=}!tT@uigQP9*p@2t#))uB==1tl)LurU+ zoUt^dv%xFC(pZL>a@10d?ms~~od9A>$ew{5NvFv?X=lty+R;y;@XUZ{!7|LENHx~x;z8g#jnZ4-l=x`%ls^w z)Ljztka7uW#}e|6bh^DUucgcGXOmLu%j7^xsdFN-8d!Jdm{}tzz?FqElXh;zw)%;7 zachQneE{`=IvOh*I2|tjaKe*D-Oqt!(y{wgm=J2Uiw82q>j#E`s`0hsN-iKx7D`Xr zMx`%6eMQK=J)F)@DWyf^B+%;cFA6E11DD^0az$N*>wq@fhxu86T7NL-{xiXwg|yC# zJV3}jnrG7a#c>WG=uMml%|h~)o-tnwv}%_B-FBa3?!puDU!e~@|w6wrx-Og8cm zKg9K^(i{qU_Q2TSwagqnJ+Dq2DKuvRQ=6u6apG_`Ul*1NDIS|EAn=sff1!qonv79A*~{auTis00000NkvXXu0mjf DxskqU literal 0 HcmV?d00001 diff --git a/navit/xpm/church_8_8.png b/navit/xpm/church_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..0e1c6d50f6aaa7a7aec864fb724313318eba184c GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_?JzX3_ zB&H^(G&IfLFMsP#!jF4j-~W$K;|p77WuaIkxQhj{!eY*J9{qw|se|)XpHvfK|(VsuRnjaqDF3-bb|KIS+Yq9*4 z%AZd~A3tvIm#nM#eQ<(~bY0uTxew$2PrjK3a#Mc&zW-;xyuDoBcD+B|u%`NZ>p>rn z`n5}2J__lH`R%wJ;c~O}oapOi#zuyQhMSBx&wr5g^k3Mr`Ig_m@84fP^`~ea6N4{b V{(lRDt)TE>@O1TaS?83{1OQK(o`3)V literal 0 HcmV?d00001 diff --git a/navit/xpm/church_96_96.png b/navit/xpm/church_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..17549ed6756455836b03ca3b656cc11dc9d37a7b GIT binary patch literal 2730 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 QXaE2J07*qoM6N<$f + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/navit/xpm/cinema_16_16.png b/navit/xpm/cinema_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..1a53a0d43124c602fbc968766748c4fceda09070 GIT binary patch literal 676 zcmV;V0$crwP)x7ZiL{bqFEM71ueChtEf#vW8&O9Gk0dXsFnuXf**Vg%sJ=d%sJnrcsK%} z24sN4)L(*+fT>I-^SD~AJ`+Mb3B#~9H8nMw&*$@D7-rVj*VFs^``^ya&Q<_kq*AG` zLWt(d%E|?BIXO9by|uOF>h-!`TwL^0O7Fe*OG`^Wolg7f>uaCO-AV(UQUjVj*QmY&dkgtl}e>&t^ELy0$z@fkH3*p zwyd=m*4lID+&ORwoZqs0%X`QI%~GlKbYWp(L~D&P2CcPGO2t}h6UVXDT03J5&bh>U zpE&2Nwf4P~@^u#YVvM<|R;wc$8yf^cfKqBGilQMYB}yscI3|u`q?BA;UD0Z_*xA{6 ze%Ha3l+pt1?(Px<0YV6b5DX6wlh5ZVm&*ttC=?1D930SUwFaJmwKf81x7!akMHaw0 z*D=OWtJPRtUHxyt-rgR^$H#*L>2&(2-|sJXyImTM#z4W?*cioPkuVGa=yW>wJJ4Ex z?DzYxqA23zjK_jCb0f`BNB&|1@Ow`n$;BuPRX#{(OHUrq!Ng+k$cc6N5i7^9U^ zR%>mIF+NEW@4dITCb~O~bM9Rn$8Z1qjcb4gdcY6h2I$}NpZE!O$y6VEuI$SI0000< KMNUMnLSTaYfI%++ literal 0 HcmV?d00001 diff --git a/navit/xpm/cinema_32_32.png b/navit/xpm/cinema_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..f85784d000351aa9d783898401606dc84d0ec3ea GIT binary patch literal 1260 zcmVE6Gs%sf3xwfcWneouu+Ze&`<=b03j}L1ohBEIaCOx z2P&cV3vlcQ$dR6^@BzvlsRtrdgnH-!i4!7H6)A!^P|+wsPVBYU_Uz8?P7kpc$4MMV zLGYy2?!MXizu!E~&b)!oY~mBdFn}+B5^xfj0{#XT08)n(x4NRGfdIv^v9Xd6;>$1$ z^T60Zzn?|{$aKYa3vk-9tU?e3lLLKpu~>|zrlyQjr%oA<9zCK|D&ct^^YioMayibN zIRlXGb?5AVF{9&5r_l9AJYuB#Do12?atyYUy zR#pTs7RT}6B-&;|h)@X8h~u~p)POqR4!QmTmihty0=_m)vmS%LU%+GXbK@*t#w^%z0nO+?;G9VCD#@w!Noj|4Sd(j_2&dK2Jk#D0XT8u1h#D>rKHp8;QKy75F`MmX=0itnM{Te z&8XMw#^cA2w>gsx^Z;_X8~}Ij+~M-&%R5wBtrkHL;QKzEP6sI^zVGAvKJ9ipX=}IJ z_`XlITII!y7kg6m0R9s~D9`iEUc&1SJI3(K;S%q%P{j06x1A^!C|@2g(Jn>TOv>@=zknNNu&6DyA6SIuTK zK6KPRlTsq391Q??{jmW?v3`IRDP<~(qE8CYUk_AZYnC59dK7@$w{LUf#*IS-c>er3 zb8~Ye0VHcd58&m?mo%HreS;i7ew^{~ah8{tceJgpt`6-xm;vp1UQ#D6E-tdTxVSIC z*|TSvo}T8(lPCLrJ81oLpe2OZ^gQptB8RcTP384x1<+c*ZZsO=`$zYl$mSthvHmOu9@%5JEnVA_J$Jr*hw6w(R?Cj_O zQ4|?c%48Y6aNz;_Gxegkeah)7j>0G#UrWzzS^Nmha!c zKUCl#w%a1NBLh8v-nJY?5n&i6qv}2H=Tk~WN-5p-3#HVqh3(+k&=5jM(=-jOHDMSU zTI+q!k3xtJTfcErYwc>SH-To~)nKb;^t$hVvQ>xfdN}s6rqi9T*`of+7Fm z`~znEjWc6}kYEN#%#e8T4I?@hRw}Q&Ye5Q z`Sa)5*x2Cy{ri+kC92gbj^m)~I(vJ20GOu9{QP`WK!~V-%Rr6qLmAAuRi@~$@DY)&F~=FAz^*4B9c{ymZ;p{gpfEYs<9Xf~UC{`{G8xg3@+7K^N|u2QK~*xlX5 zFbvx5_DG$QBvGkUSXfw~)9J9cw>Lr_KoA5nnGF4Yf1-dQfGCQns!A@G!*Lwi?KW@T zykTW!1yxl6SX^9WX=w>nRnc`F%d&7BXQa{j`T3Ao(4*hJeH$qwiXux(ODrrb(ChU= z^1WV9*`(EKQ7jf|x7&e$k>Q9gqkBNPR;y7g7SVMbUDpp0(=?4rr9!z}=Iht5 z=(G)?Z@ zxieDcL}l!E`#7 zu|x&@2iUAutEj3&}F7WT@$I*RY3)s{&jZ2p8kPXp-2Z zcg)Vz;j@-P>|YFyFJlEvT7N@`qKGJpD2npKvPtOmdWpivb%<@-G#bg~78OuWE8w^g z1OY)1kfe0yznz^OUcP*pn3rkTN5>vp@iu1lxW2}O6iT`bEQ5&P`fv(z&oD&P;m z19GNmqG?)~@#@tp>h(I3B%vq@`FtKplE~-tD2jq4Nnu=;lT#}?iaoe_!Bmf4}sAd?( z)MS&;@At7R3(K-*QeP70V(~5DL>rtn;sUnebe7UtAugZ}Fsmta8c3W%wr!upo!~?e zH{v>cH@^6Cck9+IipA*;tVh|vo<4p0<3dBk1+;)~fEM$`0C3~R4c6AuoVkvUe!qV# z0Wg?GT9P5ZefyT3ot+~QE0s#*aybmcpwsD$EjR6GjT3M=Nx;L052va;ifh-dQ7V;q z_wF5^K7BfJJ#oa17*6q2ItwHT_@(xOBmt=}HvbD4JB2*Y!*$(LrZYW~1pLXsOZQ8R zLeeVKV{okg%{0vsZ}X2JiXypO4oQ*_1OY`+!mH!@`Z~p8k$gT+tyV*pWduQ>P$-bg z{UkY!!1w)$-oS|?5FD%L=8_hx@#y#ap<~MPypTlHX%(dT zzCYr~ikJNnCJN~H`)qA(k+$@UQ1Jh!A$TctZ|u4ZT3KxcUqZJ%pP+MoaLA zAR2v+$Qx=F8U&-oL;iZ+@37&&^qD^%F0KG1ob!x`?(;mqRZ87RDPO@Dd#kEyOp@fM zuIt~XX}+bDUv1mI`@a9^#c}*3gt!Bs0nCiCnTXET+Viq3FFXvxtt`ujEXx1@LDvNYcz{$e3ojL>9O=?TBM2Qqhu?xIfc8r#7aZfniu z(1HIYT|CPK?BHu?n)Y5kwbH$So_29t3E0IKLr5I*<>#z0FeS6%{i{01#fsN(!oh1+a4k!2ZG zRZ&$H&-0kgX4tlkX_}13V;sjx%}3L;h2VK!AoOsELjnPXE#UXSEquX>#;l7!(AYR6 zNutx~aCmsgwQJWnI5^LriT*3!Xl-Qv_VFLaL{5iF>C85!1pePEGBvGsRV?xJqm`)j8jVJ*@I5baP)n^=3#z&h3KQ^BYH4#qQItSqh4y~- z*=NCz-PzgUrI-9yg*Dc)EKJi(&AZubE(lE1G$xbDg21NJX=XX2c}bEqCwy@}o6S=5 z(liazG@}F*ZUZv=&XOciuh*&9>$t9q<2c;8b0=uby4~)AIfknW(Z~rCk7`;P8jVJ* z@WTzH$j`E@)VyR_rrmDO<)f-9qtR%ANY`~!^Ac6qbUKX^wVDOUvdr%8F70-kot+(A z*PZK%8HSNrxH3&VDlkpcux)!GpDZg9Rai8yxGF5#eoUuR`u#qG!GM0h&+D(hPOH^Q zvXH_A%vpe@X>>XrbX~_Z%>^?r!^B0%W8!&wDREsy0n4(`bsbezX*Qd9o`-3g*tX4+ zCr>aC#s9dWP)j$eDu*rfo6(hI6Qs&H1$1e zz~6w|Nf+Y?7~s#d0C3~R4fgl<7X+53W$?npqXhK({eVDGRebTq7lDSwh3~)r9w4=P z+G6}2_*2rwC;@fA38x<&9W7|>y?gg!wQMjL(ChX1^wUpiHk;Jz^`Lt>o6T?>C$pM4 z2QcuJcmVW)e*hmR-5e$0GSCYr$g+&*dAP275rpURLU8@i`G9$$hU2|RTKb?Pf@mYW z&;`wEWVZ+w@C;udabW_O8P_+CC;_Dm!j^=?yjEptUq5p1;3SVTg-i>`i7f5Q(!f*E zzHLC1fCJz;enVmaLtbdxQ~ag1pMb|F;Sn!1F?}>vAr{d__zEfOmnlfATeB?UF)3~v z=N*~jfDIsAr$>7qN%3&c<4jv#90C6XezWOVYj*R+S@2)G}P2rq$VvzfR$l?Sft24uOeI~UIi;@&NVb`rWV*Z##41Uw8!X0sXN z@i=M0IX4=OMzCPM46>{&%QClhA}@}Be@7FB!{N#VtO{9{k!5+Ma->;ZmQ`AowU)WC zI0Ame?-evef?*h?zxXt;iWSagvrH>{{P;1?o;@p+ZyW(r{1NW2M8a@5EL`C8hI+k@ zq9{qOCxA~2p1y(P&gC(+c^K_=AY#A)sEb^WlddGM!E_O*2?Owk#{~ zSTId0Y2jZHzSM+{FK3VQJ%ODp4;9J4o-d1l*4%WD#K7Hs5^n4VtFWYPD#!T0xhu)oP_$ z&sjj0m)){RB0$U(1}^7W?ZD4J|IFu~f1de5F__YI9Z8ZB<7wAKTzD{V0_*B1qXUC7?`*UeLOP9fzcmFhmG24C5j=W^Ej~2@w723gsd<0dO&@p-m%= zfJa3994i9KM;ZYRJ_!LT0?J1k0dN6(LYqb*0;+|X@=;m9DWebpwr#I%QtF~2Yp;md zu4taQ|5mF-v$@({AY!rmJR?g&vD4C5u3X8?`1bAFyz#~x%a*G&i0_(Lf#-R=|Ni?W zm1rJW1Pt&$ya*No^0ot;nkLSI__BT#tkbD0s||pN6$`n8>niRpo!2wsVUJc@wW%0ugKde-ats+3|>5#N?ByfCu%<=K@ zDrH*=FTecqTvvHG9P-syUv0b`c~Q6u@;vX{_=;`=3KIYqvmss=@(}PNk9rvb0Z@$v)`q+URI{RMLS6#qz8k9uC=W|jLDjT$d046nf@*cFEG%UKP*p=^ zAuj<#BD<(m1eAj!OI8nnUx>(gAwbvlU=M3qmIJqU@ky(g5d8MrZy5{*rN6%j0r!F5 ziO9MLsMTs{nidEn>VBS2R76~3jbAn>c9ot^aE&DP;oB0L?U-wVfmL!9SY z(*2u25dx0!x2FtjF;6>SnkEk)KE!dH;0qMTae{5(!@HG>YEAs>h4{W#XrU0ixc@w$ z2mv$voz;IW67mpWSr#9EoVa!Jg-4M#0IFHh(oxiRu$mQ(K>Ssf_`9s4C`!P&SeOa# zLzlK=R?;q7BE5{gBZ?9*R|SbibW;N-&+`^`V-!b`7ETxUhVR=phu@Vf0DLRR+C|E; ztlV0al(vqYO11$jwE+Nk@7_gK)l{wA)*TDC0m}^UeggK(F36U_#Gis6;%{0q#NT1J zNScVJVwo=}9Zgg^aUoLZYX8`S4ZExGi5&oWE!O~x1R9x;0$t4xZ zha$lh2c#&_OVE!8np{b2C{iFPOUkeB?DA!o5^c+FbH$}`?qG6ec4l_wnVDUB@zZge zTMweDv$9y)1Yz3}MN+0&v0mDrKmF{4wpBNAk;Zvhh^1YW_D^?j7JqUa>wP8SMx@pu zYc|#|#g{sXcfxwRX`0>Kbq|LF$~qz{tF?P;IS#C>AJ%Uy%L21SJx`OR-O2CvRj%aH z#1*;NilV7qf{1Ht@kEOs#67A+UGA%-Ri7lLWRJVSk(pNb|v zIz@eBECmOrmQswd3p_1(oz(o8Ll_=)MsZE+5c(bbKP>18sNL%dRti*z#{KZ=!@zVf zN}JSB(?@<}ca)AI-imq`C!%(Hx>|q8(q^-?y>NF_?;DY=H;qBa(xnYMWRzm{-uo~g zP=pbqt!Ss%WO+U!<8^77+{ZPz>NeZm1xxz5wAcIWx2%YhCVLR5kME$q+&8;@^P4y} zqG;{F4vp<9wp=#Q>^o4fNX4p_irP)dH`opi+*o=LMJz)DwY{icrKN<`FF`sT_q2{)Gc|-P!qEWDP)TUyJHjnV!EFpKCEl zNk7MaaZIpQEzvaJR07a{b1sLq+z`2>%yW@IdgJ^MpK9B3pWOVE`D@hPbrOrZDR;ee z2PL3@5^8I5xmwi%7Gr}}H>X^*(hg`ZtNG1J{k&785<-F8axIY-5ESANkAcP_>J_Mr{78iNkM8kRsQgsLMGbRiyR^4)Q)S1u1aUtM zDf4F-{^_>>VFth1@DSa;u%AhcGw7x)^a45pIl!6ve&~B6kjusk$dADO2<9GQJn$&- zpMZG~dHyvpS9rW0=5ke>zplie2)PP1Ml$3P1Y8HUf`|<-tCNb9-q-55v>hFr*qnFR$DwYtPSg_DyC*n(1OXFkcRugRS=#Uug^eu%EQ+}_|c?Zg$_S_ z0%X3qx&OFS#z!;(as9q>VoOz6o zi|RsjH7P2q6ZsMM8ShUR3s+ua)YEW_l2@qoArl9E*O3>lPR%Y}3zblaYkSD;824qB zimGP?>Sx62a^8M6cr#9;)H?9-G{4@&X?cK+oio3dB}AN`lVuR8cR@W(QukE_33T%K zB*1<3tA}&FDG%#PhM}qU;(Vp#IQRGEaheTR(!KmR;p|%kb+=+e;*b@vEvLIkhxlUe zoj`xH4!r0Q32?#V7t!gMa@$c~+l#Ge;xukzo#LJXS6aWn(pKqe{*Mno58WV1=Kn0K zFS^R5Kzt7u=A}I}MtMqFVcwFwcO6pzOfklSh)R0)!SMJV3hMAdU<>=@}>PzGOY{lx+?d(ZJCO0 zc^|lSzniWNrdhoMfq7QQR&+Uy`GlF(5|Wqa&Fof zTpI0CMoI<-g5}wh(K$OAjd|zCs1dh1nn$uROSR(hI`HIg7O|v0>n|3wfNx<*uq?-) zO_4j{uOl^=IHNG`U_xQi;fzLbgX7_hc*ui$8}?@ohodCq7V>A*@_zv{^iiGuQ6AGoswj{)Ml1q&>G5-baMJv@$4qoc;m z5^Hzhp^ye}YzNnTIUqypqa~kbJ%<26evMLJx~K;`=meOD2nV9%_gdt)St%gp+Hp(a zM$J1l-3mI0so$oeUb;8b3Ye}8I!uSPx!zOLDJ}Wcx}5pCJ}$qPU0)wJ!HSdM{#7M1 zqQ0g?3=oVnKY6?YP~A?!0LGa-9Kpbnktakw%?MMR76efca(^aoV!rj>qHul*qKGI; zPAQ5iu-!Xyg=QhycAyvUHpUC}N5t zRlztcW`PTrzfiD5mIwxt6IL^5Ok@5Oo5?bd>A-{9ZROW+s+G2}Q>9%%? zarI<44oFwx-QK`j*y%F@0JPSw87Pz1E!2cQ z?O9RV;&tcY`?e60}qZQ7#tVN|?SAy0v35V$BLi-pMR3Q4wL39d0X z3<=qt<}weH&=7nA_c?QNpPi9(#MF1a tAKmgtxBP$ameA6|Z`Lgd{?RSJzi!!GFVwGv`~rIS=HF*CR#ZMG003&DK92wZ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AD.svgz b/navit/xpm/country_AD.svgz new file mode 100644 index 0000000000000000000000000000000000000000..38eaf0b96f4f875c8f6b035edd3c92ae17d012a1 GIT binary patch literal 16542 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AD_16_16.png b/navit/xpm/country_AD_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..85e2d1fac10f5965abe0aeaa097999d89ae5f7cf GIT binary patch literal 351 zcmV-l0igbgP)uE0}+DlG#^7C;eoz^WrlBT~hOi+>JaRi7t$52AmE@uEQ5;c(b6 z1DbLGk=rz(%XnmCux%g?9Oz38&62I4*FsKQ1>D}lxK~z|U?bgq35>XV#@$U>U!wdz4QYdXfMM~q}8WX!SapA(m7~jPQ z@CjV`48DMgPoS<$txb)lNsDceQc$2kfnjEtJ8n#ki3@HMbi-NBJ@d;acTVmdC4S|( z&jj`5^|PILba-o$UjJQm$9;NnqF!~9rfJp;Fayj0!SlY@@6Izg$siP$#6p9x+50zu zYPpEjOAt*soHm{yJP%!a#ldHt)JmO&?9uc9_CTjyeax^w#2M9ats!FUVejYZcXD{P zNi6vSZCZd(*g*}{$-fy8R!zL@dqUwZL0{k+ZEDFZy6!R2+5W4fhH%i$;y5;DZN&WA z2F9_9(QILSZ=wHa;n*Ih?YvB+9H3Tyh(FGwng)KejcCUIShuYljjxZU2S8|`s_6I9 zC=nfP{pKIb!B7a{J5rHSGob39pm&!e^BB!3W0^YI>Jnzy!Bgk(`Yww05p0P}89=tM zjb)t@>mRbXzei%Qho&{)WtVWFf*3nozP2qBDF^7(OBm+w@2&v8Pzc=~;tK_HF3#a@ zX?lRMt6@eAgwW5Pg-d-f1goK|~ z9gMgu1(4c-NV12f1=)CTA8)CMrKH&2taDsZutzS5Q|6xTlhu)B2?tCwTYA5ggQmdvGZXMHk9@wu<# z)%9Ik^&U&AM>11CZ_N1tfq+kXS?=onTmAPxq8VTYm;rtQWWd>K+d{B^00000NkvXX Hu0mjf=h!)I literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AD_48_48.png b/navit/xpm/country_AD_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..a6323a8dfeea3e8ee2d9ababd19629383897359f GIT binary patch literal 1183 zcmV;Q1YrA#P)xe_<*YCf&@$!kWl?OouLVAJ}%&S0;eZa-^dROgEEYw?UqKf`Ux8kR*_{H-6&&CeS={J ziL(+DcyxD$osHM%xmDhJcY)9k$Y$mMaJn{<6!P0o=diMAj?XSqIJ%PvH<1={x+<;u zC3N*9LAS#0W(7(1ktB&A2$53}wI?&Uoids_&(nLCaa}nHbTT{Oxf-&hq9`iU`4Ug> zzmKL%I8K|s>ka;Wj`}F%B#X#f82bVZ<@e2BS8dZQQ1d1=A zI0``o_I{I|ttEkuFW`1Go-BP#r*#1U<()J5zb_*8OoH0rBBLJQ)`sUqA>IfS~VT7|u0y$w=q_WwZXo6-3A83cJ-FNQ zYKnf}MKo!mnm&(o>mD(DW^(PeCn`GoV%`Xe2zK|&vA0x>g ze%PThx0nPvnfE}xRA=M9hVShUoRjhaCq7*wsHsFf0U|;c3P$ERc@IPpEL^*SkaRRd z9XKEEC{(YWLfoD}m?26^Ml&Z_xON`j7jf}POd-&%4*5bJ5e;srocFO#ZxZSOfvup( z7GdBsJv~d{#TQ7Vg>)syR<%YtbBtA`Oscg`|j;)e=A&1@EM?ZHFky4R_prk7Jo=>~c$MZbQ2?IUt5dmF0l>|DODP&Bv zkt9L+M45VRn_kbM+v%bx3P#!>ZJ9h=d4$t-2*Z%2n|DxByGfvv*@0uH{$%A=9(%t{ zu8;!(^{pM2?>!(_$l*FJrK3gmn>JAta&qoC$LD@b0-cONuC#`lx=LfKgx!?z{45gl zy!z%m)#@f$Bh6&-F1o&lkh@sZ>tv?wB+$uyQf6{3GPxE2yIW~)U!SF3tE0*adyOh@ zy!SIA{?Hl7P(JF-$sR^#1#9v}RM|qeszX^k3`s!OL*Bk{9jCi+aBOraWSZjPU4@aO-hmWThX?TBR< zpTEM`p!iRMK++EOa0c_n?#|h>U$5g~K7RN+&;6e)I}JqsB>wpN+WLEG+xbUxc>dS@ z`_Z0wbp8JQ|BYsBFf7=#$)MoR&%cu!8)ZWe*0=rtza-?Fv#9pJc1?vB+zh3BMvQkg SGOqv~$KdJe=d#Wzp$Pz_BVw-r literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AD_96_96.png b/navit/xpm/country_AD_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..d02474a1094509b1f1d1e480c777db106d5880f2 GIT binary patch literal 3406 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 GU;Yn)TxqQU literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AE.svgz b/navit/xpm/country_AE.svgz new file mode 100644 index 0000000000000000000000000000000000000000..67dcd1e9dc0969fd5e2a3e956d12e0baefba48aa GIT binary patch literal 321 zcmV-H0lxkpiwFopD0)Z&17mM>Zgg^aUqMAKb9QF{jgVb$f-n?@ujN;qon6amaWTVK zP5hWyvP_fVmR&Na(8$0*L)pJy0W*`u3(r+g`#w)kJDoS*8Pu|@RFMnhE<=!cRKzMz z1nz^U;Umsx&h&1zT?U`KHB@y1yZz$jc?mcq`WP*VR>2D1-Z#KqPPBeSz*Otggvc1< znvq+S32n;ol&YvA8>BX9A+j>g-B`zHudvO)4wF~n3hpt++BiCWX3}ITKVD06-}k9I zwOONLo!Vzv+;*u{NvZ{oyRKH!EQ&@T0|wlKaXUmQBMoP2gz!fo3^OAQJ4~vyyxH-9mpR(%9bZ`( T9eYRn%`@j0Gt{*u83F(RFtwEm literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AE_16_16.png b/navit/xpm/country_AE_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..9ef482719670aef97760aea45f97cc5166b570ea GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_Ro-U3d z7QM+f>MOp@XXKP9y_clGYA|t0RfW`nCcOgdKi@dJcmf^^)Wu90!~{9M_e-3Y4^W&YG z?pygE8WN=kRxrB(l`%BAZd|oW%eOnJiEl^o^FCHxS%U|GQ0)m<7#W`B@~--@sNg)% OLIzJ)KbLh*2~7YZH$FfB literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AE_48_48.png b/navit/xpm/country_AE_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..a79ee4da91f180603296f879b3912728e4f54f77 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HbI)ykFk7Jnfs(JZjNN?|J>k7 zjz<)d1PnVQTzHh&CMp|W@tS@2qHeija|e>d%6bi@wDOYEu_q8}1)EQ>f0)Ob!vAA- QH_&zlPgg&ebxsLQ0HQ@c!~g&Q literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AE_8_8.png b/navit/xpm/country_AE_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..8ec0e7be868e20ebc0bac2e2d5cbdd9d6e570779 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^Oo-U3d z5>u0H)K`3)-`LoAaK&daX0rn=p(30c4oK|0wNrhAWgTe~DWM4faGWi| literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AE_96_96.png b/navit/xpm/country_AE_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..ba7e1fca9fde81678db690595269eafe824e6928 GIT binary patch literal 323 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AF_16_16.png b/navit/xpm/country_AF_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..9be0a51e06dc12c8b61eebfaebe90a54678d76d7 GIT binary patch literal 341 zcmV-b0jmCqP)z~}HO zocaV61UDa}V_Fdvaj+0+HPo7vdtEh6G~(hv{^#f8Kj&D0A)!;?FyWmY!1+ls31Zp$ zo&GaG2-ezdRI~XlKxPeG&qEXntT!60)@v}n$`6oA;qF!_?zhl!%=GRB<+?zWZv|1_ zWV?HeT`A#KxA2ZSY{>Mosen?wO8gMu)QUuM#v+U;@9gCV1pX~=_apS nz|wUzSO%=mo-r8AR}bI=U(ZM}z5Rc400000NkvXXu0mjfX2X_H literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AF_32_32.png b/navit/xpm/country_AF_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc1d1956bd79fd0363b76e2d9beba977d99513c GIT binary patch literal 704 zcmV;x0zdtUP)J)VV>X3mVu5mXJ}PhNWPHMOauD zF(@h&x`-$ws37RJ3!}@f1aFcqx(FirfUqEMV6m-G|PdZRd2?^?A3XoBgk! z_xJvI-uHc82{15`R^W!2Lg2)C2=6vmE1P7lTM7aNfr3E(0&;!`Yc7i>`YBG2AX zcj+3bnJM&i279fKnR|CBZQqZ&#RL2{%@pc@va61grdEoSB9dRmsp>k3`)D`Gv2Peg z7Ds&}w#Ka@NU;tSZ}uWtbSeX<$*v|Cz0i$pk#Th%#(nM#vR%REuY>uQrkO$=P)loA z`tY9E>$k*%6V%?miCS7geCj7l&tH%jdxyi}5kZOxq-H}@9O%S|rZE&d*?5%lz$qlF z9ktv;S=$lTRw6tbnPv mWPqFjiyyOjW6x4a`hB~}Ip=deIlpsq?oogodE{6=oq@+b%CEo3lV9)@1qz*_K%r9h~iY4#?#g>FXmKkBR4z~IXn@(+h@vPYLm@`5U&pgz1&XF&@%iv?+=x+ECzU5vK&$rPYHdXr2K^l! zBrad(_R*vCcXTjv5h$tm zlj!Ls8%q;Cau%DX8t0rR$VQW-!UI%1x)j6h;m-c!D8eA#bD5G_uMD&t0ZT&-u7?*P z9A)UfaTrq?usGbzknuCvN>*@{s!ml z1(ZJ0LMnI*)oSO)+wUQSpmx_L%$WhaE7vmo{dposzebP+O#s=v@cEZeI*YKC5x;bi zTsleLD;pTO7D5v?re8Ql>4O21SFVwW4AT4J1~RD_qc{4n7;Z@CH+eY%fTL+1o`vlQ zs}1L(CsDGHsj5O42DMvWC+>A%vFfw)LeA|}$_m^){tJ%w$4L*xa6Y>j?{jO> zaweWR?f2T0KF|a%4YDb0we<{q_>~N_oD~@Qwi8uXaZg%6VC!yzJGOJm@26|Y5`JxK zgPM~EL%?MNJJJE1zFGQn!x|@YpBT_YSlzyr!SE>b^>7-Sm(~fHe(W*SP&(i=Fb;4 z-#bG8KhNvwEO);+gyM2iK5;tZpI^!3J)cqk{<|2uNm)$*#bVO`>6cQ@|Gy*kmooa@ z8Afj>v2AH2oyn3LNs!B?aV%L#MpFoF{)A*#k4&V*68c9}pATW0KD=x9J9p8-a}$ZH0v byn6E&JLY9nhY~G>00000NkvXXu0mjf=k-87 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AF_8_8.png b/navit/xpm/country_AF_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..bffe39becb51e077320b7b2d459dd5d82ded2e94 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`jo-U3d z5>s2x`EoTeh_F2H-+XC`*xdz7Z~I*kymdv?#!Xy%QLQY&Id)N7JGTucWFp-PEz!Y7wg~6SsJQs xUR~8&6!rIB!M%4;fi?X(HY*evwm+Y4z3+kKqs!vg?SW2V@O1TaS?83{1OWA-O!_XKQnG*t1k^LaSy`QN*m%ikfN6 zQZp@T1XU4~f6x8@>O9}`e(%NmJ>SK9_e(-qnsI=HKmY)M1Brm!{BiWZVqyBTS6)2S z_+w1&7G`k3`M*=vRrT!8VKDpE}z0vjnM}p+oR6LWF%Zzyw}I z=`JzwwsdocZZ@Gp?OT65zv*jNU*)73U0h$gS>ug&a&qDIt_Sj_qf%s=%VZQ;Ga2b0 z>qzHg7BV6!^S>p1GbJ77bq~}3qO6r_w)gnQ^ej?iMjysdsfB`c<4Tz$rktEt!oJMx znRq0qD***kWqZ-r>6kn~R|Rgy^}V2H{|G@}eFb>*-y)g~TV`@fR+L^v)n2TTas+)T zzb1DXrjLHY6Jimlgq6zD3INFG8AF96_&JUB{12{;6)4^SLU1jp@G;%tvn7W4k&!Sb zM;WjC;=wD7?R|#Mq$<+x(JEs@w~)O@1(Brd-3_7Fd3$d;Usrf=_0I0MJY>wNQu9~> zzB=jiON*>WhM3Zf`Ch;w>xI|%eP6D>XG<$NyluTpPd12yI|*lxC6o+hZSTBVk7qN0 z5VMgvh{yX*{vWjcML&&mPt{zuIiarlc}Yxs0r8~}Wuqg z?cGeqFsOtC&Al0qqA)Tz#Ke%3ks$pHgU1I>OqQpoaz~y=e|oN1^$It+eogPf-}GnE zaaHYtQml(ulNo7Cc$(?P*ZQE*fw{9h35#MK&;w|#9 zwU;9m+R3RNFM7B%7^XDEv!MwxCts!m)K$ST-*`FSI6mRwTrJSb?Nyyd2jZI`yw-sy z+cTR#*27m=BSfQf=9k1;3xuwSawSks)LJ+0npOpyf|}_o9bwNFg20@dLkrbC~h8109y06xzh-eF@R=4fDj`oJ{|=J2 zdE7c~^@T%PgIA&&e~^jnj{rWLKc?<$19-NJHSP!Hoy4siF(wgP{T5JM*4IMrlp=uC zL#RXy`D*r}nO?EMc%NQ-Yp=3G<3<~Q$s-wahq@2sgjE*7{N=nD?FEJK_^{12u?U}; z+SjRq;uB*q{x%i5c$EW@P0d41N%vbvXqUX&K$3njAly z2y}ci0IunGQY*xU^N+tfTa%);C>^CNF6WaF`&}9Nup}`pkJ+PBX^B`S@ zBR@Qd+J3`Ufu?;tt&_1LVhRP3A{S>khu6~_`fTIg#_)uznl06Aa$n(VA!?YrF?u&8 zta$VB#Cl8P`9}J2yX4zFwoXrjH0O~-m<9B2saG=AfAGbly z6`4xZQ`0O4IuRA=;8SUR1AAo_KkfYf0Yqph_JAW}F)Hq0LGpFdwT%V_&w-PG)@#c$ z)#CdJ>Vd;`W}J*DN$a}FZwOAV?61k|IN=w2NRUyST9Ls}l>v!30d|M^O23gw^wZ8- zQxDqR;gx#Wa%WE?Glco?p}g_7ZB-%HaQ9BG!F$HzTd$MNy{5&rx?}kVb{x}eo!L7q zYq~gYrBq0*c;;WBIehF*wQ{HH{)^1meKs&%fTx%R5Xhec55h#cq&f7!eXP~dP)sXs zwJU-%$V4y*DOe)7CIPt}I8xk4kSio?f=Xy3p61B}Hh=8lp=8IF#&=5-q}d<`%q+)O zqxMHYdzI4ed@S8=tsI91RHjU|SNo+PBb{!pG4Uz5%XR*Oux!_U#Nlw406%}13`h1WHG zvn7>c3-R1bM+K$v440gvnag?45lc0-0!OoN*ZIJ@^>mq<$_7$8EG!5$u7c+uoKy-w zYx|k9L%^`K%#2ju#)HSnJ>Nhp+6z??v+rJa)8-iY6(uQz&-i71j_ZfEAmcbrGLWhD z>}lAEC4kXd>Y$hEiQnqjYmB1E1drt>h&dueeI+Mj1yV-Re9bRz)H7@LY#1q@;0IRm zqGt+cKnw25CL^m~Q1K3LHoj^!sKedoF1y2Zgh4PIBcL(1(XO4S1aLE516A8)|%RFQ!$*!k4tQ-0zum z4Qq^k|MJ~(e&BwES8_YagUICxuLhosCr}&b!BGM3hEs#_IPM=94F`k2BB2Q>8 z^zmX0{{qY4*piqMRK-+uG3Gg&-J^;ZUA&ptxyLMW7ng|43Za0V*DPTalIBAmt=qQp zX%+JsuT{LIC z(?HggT@CCuForAJ0xoDSo@5u4ZyiC2iPD+UNj+igKi~JRIitBwc(SVsiI-ZS>t(CR z*+AQ^g1V*+y4>TBGP~BDIks^N;ZE zOdG4)4%;tn=bPgThIY!MznL?YMEdDWt?Z#Wm?zM#>4CLz(VRE(2w)8RJx3)||^@-s*gKyy{H zWou!t=dG@8YA0S)H4h$Qo}#T7d)Bm(7tOq8~R}r#dQ)v)Kgcb_Uc8C(KuW!76 zi4f&#*dPVoC>>pWW9$xQZSLTdtQ7yyIiHt zce5b>6xM@{ox4|;o13HPW;vUt?#}T<;B;44sN`61Y85(IYuz}$QOs>{jX_^d;QSF=0{8Q>ezwi)YI>w z=KeI{>?uhC?b@sltljuGe7e&&MC-3gF*yK$x0xdH;npHTOV8*RRv57}n;bGFz zHRt-tQK5hP&81(&7$(=SzmJ$AVPx{#o7& z1Y{18LP_;fcJwX z0_jzGv4)|ZC=9QFBuq}qxVU)eTTHgR-TAy8-J6G{|7e}ll*hnq+0{_vp$^lV9#Lcj zQDxW9S^qP|{6F?FrI(0R`@tqfchNN6>eD!p2CE>849qJvIQ=0#0Mf(~-e81|{~s$i B#%urp literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AG.svgz b/navit/xpm/country_AG.svgz new file mode 100644 index 0000000000000000000000000000000000000000..f0d9e58e29837c9cab011e20fc3d699b25fc337e GIT binary patch literal 613 zcmV-r0-F6FiwFqsCwfQ%17mM>Zgg^aUqMGMb9QF{m6UC7+At8uUpG>}!_8GCkdoLA z0}4v02DH_rJs^#4+RKob#H#C{#1OhqKRXWt4LWtN;yd5}cmF#j@o)Ff0(LAfcqRix zU4nqgD2usF0`$1NcW%(_#PZ+Gzs{CF7k5zX5?DM=KYg45axnhUn_)a(&f(kl2cRy+ z`0fh=lq$6uV_cS{TlU;6Pw+z?Zc-iLx23Q(U^;f}L%n(YJR3`XF*9{}y$z{t~1 zE_}t6V3T_hCXlV+gH$}(h7igareVI?#-Wev5=$57EKNKbY^7WN1*GH^o<~~R6(K_}8l3RL=;;jbb%(t{ORTgt zZxgDt;^iz>IS*wbSb;z%KI=u=W|6y*2dUZS&e11f()#)9kG+Ud>NWNv!8eN*X@X)a z(d5#)Xq>;%s=2{N=Hr%FMM=dq%(nSDiYe8DsXUa$I?JB}R2@aASclkpzg;MzP_Ryq zbP*VuV`dJ}HW!_%#$vbeSo3>PCiN1kRGTxYCZm^@iI*gk)kV8B1e=UYrQdd96CgGP z*X!H#AI`dvXUYWnoALVHdSHX!77VIaew^lPt%p4HID*wvIn<_lu14$Qq&b{0ssWDm zO>@t4553W_abk`~(01Kbk3) literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AG_16_16.png b/navit/xpm/country_AG_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..e7cb0b98d80cbd828b58c79f1ac38a36977ffba9 GIT binary patch literal 416 zcmV;R0bl-!P)-qEH3+NQE$WVxl&a8kF`kb}x(67T8RuPa zc=?6z&O1q!XU|G^ErTdSxY6Nvmncr-`YIg)*MYk=E2R#Toet;_pWZ#{la5o1{e8qdTQ+m~5OHkWIxjo&n7dXa-{%k6i-;1H+5n=~%@X7#IM5Cv8ySsLn0`0000< KMNUMnLSTY literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AG_32_32.png b/navit/xpm/country_AG_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..2eb743f865bbc9795e8cd970f27c2cc5f188b00e GIT binary patch literal 757 zcmV<$&6hZV*)|1d%6bQbE|G2>R2F}HiSvvUj2({|7I z{63%G+5HV6rsB|6h^f-3>Nz~XsOpiz%ob)g!2@n5X><_5aIvxkU|4n6O`i{00Cb*Y zohMl7D}NQsN+lFOeId+_c%_a2J$;o)BHkX6=eKg>s zPCFSHR3@i#grL7m_PC_-Q@T18d%9m@V>90qlow_^7bCKwK(P=;!6;OPs8(`0B7d6k zb_eB+%{-?Fjg}3XPm<@f+**FG^yJNlz1>|By{@VXDS!WEMp|3w-HGidFDh;|%xuxh z$*t(X$hXL3Wqp4xrRib?;B``4NNX0kV(yG@BYEG{p?fqD=~;9)0q{CcWnRvvwVa6H;En9&vVg08c7;%evao7vW^G@x($Z$qCfFqTJG%I)H3E zk&P$*ZC3~Yu47$&AwVrn5q%*5YM6@XivoiwO#sT3#q~`9P-ZQz5B?O*-00000NkvXXu0mjfU1el; literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AG_48_48.png b/navit/xpm/country_AG_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..50ac156727a69107a1251e91b2b578323170dd3a GIT binary patch literal 1107 zcmV-Z1g!gsP)8V$cxqh*VmXNI_o| zr556ww9%57#&_|BA}Ht!pFmJllp;d^fgYSJ<~yJH%&z1@flLVpfxm!h>kmGWAJ15|pH=boNxW*+N#Iemcw)bayE|oeEPhJ*F*W%ax}uOlX?wzMmS# zy`_VQr2K|?pjUbA`3QiOH6zH#6QiN-4yC(OdGgUvkYQ!b1n~MyWPi7k-!R?s8V9{) zy(_S3ecL(W?N7Hap4+=!j?YVjET`4{8G)7r#w^~iYMm8N-F z8aLpSnn-WD0A2glSXeH z4>mU1ykRM+y^a1=s4l^w;lQ__wNXm8w#|q}DFFb}#LXQus!_w_k33Vjv{-KLSYIio zosHeyaMNPb+3h3(e*XRV7azvQkA;_h(leL!a+${>lz{)+0I>)ym65ruXIJ&{W8p79 zil2WkUTYvSkcA=GOKOXei{}!(T{ILVtLu7y()yLNd`&;l%XW77TFy9fDqq;N0J78r zOG9?-01BJ@;fcSmt{VifqXE#LWZcBn8@4nKLs$bjyp!@9{ODw1X;rtQsnp`KK6=`g z#v$MK#bq~x!9Mov@o=%kt%m{taKJG6HTp z*cs?4GleS(4+r>N2_wk3LIF|*F*qre@JB%@mZ)w(H^`4`feRV!`=yX!R?jE*7LAvG zzbONh?i`qU>?OOW(slOhw^F$)c2AwYHL2Vchn{lfn(6ZKn_B$5r9AF|EgB=H2%UlyN|#Jh_E`H|$QuZLfjPyYO-{N@P> zpupq@;*C83(RAj%^=$O;h$ot@x%riJ#=|I{(sS>4n5$eDZ$Mjf^ILQC|6O~}K=3$Y z38S8Y#3wDGM+OMO^On#9IUtd#%juB>g23$M^gtTOS%9=2c_27Ckk$h~Kz17Z=BsP4oc zE&qo}2`M)!9;iQeHWL=pJ67D3HC=V;?3$pSBkzs=q*{D;+nIM-=I-GSY#bn3hN)mj#D9ZGPR j26R-#MeDhYoD2*LJM>J>=b9@49nRqC>gTe~DWM4fLmplP literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AG_96_96.png b/navit/xpm/country_AG_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c4dadaaa0fefde66498e6c4f0b637bb30b4e2e GIT binary patch literal 2171 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AI.svgz b/navit/xpm/country_AI.svgz new file mode 100644 index 0000000000000000000000000000000000000000..595d72df72bb527e031a5c759f3730eed12b9527 GIT binary patch literal 1952 zcmV;R2VeLfiwFqsCwfQ%17mM>Zgg^aUqMMOb9QF{jaU6|8#faD`3m%Z*zWzhr1;HY z5M6P0oHW2)FTkZKio+pr)*D->DjAYuyZ6`Md)!@r2nLb>u}G1edGqGYkb3#!-5=}b zX4vgl+s(4I+O*BE>9-fF&E>NFa`>#I{qb+#fA{hSrJ6UxX4st{w!0V2-!HbGhUV>h z{bhfsUp3ZiqfOWR`@@^&?CyHIJ2dasUoO?#P17hHFW_oi+QL%jVrLC;xbR z+O%r1_|=~-7O&pFsz+S9S-q2>R&xu<1+dmesxda<#(E{3k z36H2A5n)?cYrxKCzkCLZGse(&J8pS#w_a_2e{Q2Kr7Y^|y!CwfETl>)BKxo!Zin63 z-C@`e%YNaBvVvK*=K8K}{+vE+^nCw%5C1KkRM>A|Oo{!{LJtI(dTZ39fd*6W81IpO@RseCT!k*EZMN)#d=QLn#`hb*2d+Xj23uSFBDc zcR6WiGP0hSxp5wH0 z+Tb`w(afefoSoY2bryd=uWJ)Xj^THn&Rgf;xIBmaWIXxwQnd5o9?iUdJfFgtw@*_z zzBf2h@N5oFU)$hLp3OmWI(u7lkhFOq4q?_%r|CDD9Wmzz%9$D~I(gq%SG0eKxXCa}~`EO63ZZn`nM=Io7F)=7YuD++f7T59WW5%pX+`t>p+dZO}gFUU|?OphSmq z$V!a%)U4H^L}g9VUSj8UvZXg&%1A-zcp9S1b%gUaS?CArA!~6^a?ut>tbvt~y4ead z7gFjo@*q|@(REW@R07reazCB-8s(rSK?y4`7##->E>Fdec&(3Gvg@)i8o2aH#}c|n zkv_wTG1;HI8aYYPX%W}Kn#PG9_mrd#8MdxN1=`Xjn6c88jCG;>qA5L274MZT+=1_0 z6l4J*l)BMbHE#TAvJcSD06ELqyD|b1*eY;fGx@PSsL;WS!tE8ZSEx=CM4@@*GUhHQ z3(k!16%I;JEE7>K;KQn#Cv1#5b0h96>uaubcCd;3z>`kJDMac~96CS+K}Siw0%W!~ zr(-NC3O1vRU5(0`n$m*1y!f8l_9{c^h#o9ePvSEsF=n!3q`HO33Y4sa*e>W2kvScr z?GhSkfOBMA5gMaFcZSK565^7QFwU+h2amC*1;=qj%K?^RlJaCfQGA)RfbL1UdqIX| zv`SqY06;1nVhzxYbTt&|$pxgV3xN3$07=B-Z?w4s{ulw?(EjunA^~_0|KzNI%b3bY zZ9?P;G+~3S1c;Vc=+A>_$7oIk1;@h{!Vgd|=Ya*l3Pe(lWbhTyAV2n^qrm12;qu0UZ zs#A0Xs4pk#%_FVUYz!*kaC9(Sm|xU$z@O;oq+kqlz+JzJ)OYk{(n_+_fk7>?%BgH1 zhfq@-g&mPKG>2*#cRO+dWg?_88`QUV(km7sH%W+a=}eVx##b;E5PoE9rpvk?-@4@0 zC^7DEii%(tL=E-izyu)51x3Nq?5J-@3GPfne*@h}h=HzZ+c|6BXqa=Lpg7`9y>+ z5?$kA*dr~dk5q3hFc-6ojdtv7ku`{dM{aY@wQJRT+)-Qt#jyP%BlAUyA}CZZIAkqB zv@`-r`B376`iWvDef6tdzaEaC7(ISWWVSEwF~P48baJ#HXm5uxx`}+{d4e~RiR0VJ zxkPe31*dox&n-MI;xu;SBcZF0tZ{|k;U#dtp50X0iO-elo*6P}8rLnSIUzexoAYB^ z&WY9OXAIpDrmsD)gw+bDxF7K(sS!{T)tRk0?KFNIL8vQv1lB#Q%N&87B8WADFpcY$ m(=3o8Z*%;95GXcFV!xU(bVrz`2>9C+pZ^E(5UHBr4*&pR8^|dD literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AI_16_16.png b/navit/xpm/country_AI_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..306cf03ace5ef7b6f2dbfe63ad5d9d9dc4ba7258 GIT binary patch literal 482 zcmV<80UiE{P)Se~(RUuEWL^pbyl{5!+nzlI`$=VjHt zo;`+DH3I_!;|-@!2FJFKB{Pl-{fq?~= zNf0orHO9kA`9A~W&SQ7tOBXOOFt8LU*rtZt+Pu8;`Q0Z*HdbLhjYHR-PCN0K;rUGl z1_mB(4yLm!Sws|gxul?eFw&8?ymh|w#%Fi#KMV{EZBH26wYY8wG4F$f$?tEBEX;r3 zJ!W8nYGBIa{W9ah&nf$ELHLW;pJ;pVH&&Go>c#(mSj3bW{{LhC^#y8!Tpu(*d^g{N zFs3a%I1T29?~Gi(pPXZnQvddx3#tLXr_Vh6_}e6y`N!8Y4;~YxVgI@NEjRu$Ffdqs zeF*gfehudioz)U%(-CGncjzopHvIqh|Miw_3=9km{~3tVz`(%p`TZwkE&(TD0+KZV Y02M)xBkBc29RL6T07*qoM6N<$f?y%rX8-^I literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AI_32_32.png b/navit/xpm/country_AI_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..741342e177ed3827a56b7430b5dd206042b88f88 GIT binary patch literal 1111 zcmV-d1gQIoP)OUtEL?za>~w5_a|IoT$15e!V6x4CA+ z86A#ca3Y#GKP=gnxyd#&FQ~hSW@@ULE+Op0)FQ^91;!-<3N2*_n_XI@P-qLZ=k#*U zK6FDkN0*&+AALSO@ALfM=Xc)!$$4{-Msb~ed*{IDrAce?PWC`0MH6| zg7cwyvgXu}XDc=qDwv8bYvrHY`@?dw1ZAZg-Z{e-z%hH$v=MRZ(P^Un*BwVIbwi^l zisX(B13+_3np6^b#L^R%|FU4$n_KpLqv?9U8h}NuGMcAG5+v(j%GKJn{j*Bk?M>`x z0|3G1^>4MS!wa%Q%SubD&)@xJknMB;K<=~}{FyW*I^?%O;YtN62p%j@0zm53vu>kV z_<~~8VjmcOD~KFtnbJn#{-YXA8T0ECwmFk9)jCfEVGBjv0%ycCr;m&eD5MlE)V zqKb3mBuO=D^az5)MTeWmY;zin)pS~vb&Dap=WJpd#f|JY}9 z%(Qe)$TNBeP5%Hc&_<9hhwaKCo-|jGwJk`pf)3bz-~s>?=g3R)Gt5U$5Jt16c(3Lz zxE(j{{m%fxiAVje<6$TtL&d{=Zk(VA0(uAjFm&`~uHljt+1IIKb`idm^{)=A2-Koy dfM)=JzW^V3jBg;@r!fEk002ovPDHLkV1g7k6gB_= literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AI_48_48.png b/navit/xpm/country_AI_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..cb099ff6f73d4951a8b38d2983dd8344c331b06d GIT binary patch literal 1499 zcmV<11tj{3P)NSRlN!Gdlg;^qbl(M>LK z>M~3PCP?RoW}92g)J>Ea#Ma4xAu~g;22I>zjLtyfv}6lZhMR5^b!bbu_I6s@(z6dG zr7P_znwIPX|MbI~_xV5P{pCI9yw7ur^psbH7v*a8rVTq!{nGIm{;U4_f(Pp|0U-K% zV_1&NEgHXcZo@lqnq439^R`9R{|){SsyZswoUGcRK~`bjTK^1?7WGjiDKt{yD?gozfVvsjwmTG5W{{0+H$s4 zaHdRivRYj#3*xYTtSMaMYoC%6gpFB?HM{paXmkd1TJ9;o0V&$Mvd;Y~s2pX&SUe=(ToB)m~y^v z7gQeWDX$u3lIFQFrL2spO&11~W()`b?zBC8_rht)jKyfE5W8BdH!OITU*e!4 z%$Cf;O25+p078-^MVL_DbDl%^vV{~*Y~gOd0MYyFE>MIm-73dG`@?mUvePe1QVVID zzQ`{ZO60Hc%XLuSmKRlU5I%p_^wDKdf=2n*pz-dpE7vwZQK<%{P~ zq|j%TeNGX!bgOz!R04oNB4*B+Mv?fO2>`a%jPiY?sj{H@MDuGO0WKy$KMIb)f+@rtX}XtDsn zvoB8Eow;0f<;LplQY%xd6nSn((HPrTMbvVccqJ^I)gc)q(D$CR^{)j%MkkPRqQ$q zsnq~U()n}AVdH>wJ83Z?EDjaW+C-sTw#$viW1VtmD%f{6LrBr90Dx_v+cu;E03hus zCzKqq>YI*G_|cS=F>l39{AT~C(H<{=kIlYA1$*Hh)H%^oFbD zG%lYW8ADo3UV$7m5obzs&fk5m{^m~G!*sDsZ!||9knr=id9%?%UNYXSA#KCN?Ru0G zhD^h0JON{FoHswhdini{Lp+xv_`I&>!=%;RdnmPfN8v;mEKKw^$_d3+ZDp_8YA3WP&T|+BwZ`#T0W7ZOVXM((VPi~gs)U;= z0f3>pVwB70yio)IdZT&RVjG_oz#RgB{y~FtJTlOYFmZ0G1jV=j&^KW4m=ai^N8SC- zF)ef^FZ&2GZL}$S^t9h&N?`k;gEyZ1)cB9bP;#i}au(Pf(m(Wij(7_N7U=iZjxe@| zn=l<`{L$+98z!(oHtR?n)5D=0%Oq?z53g9jfdHWM+O1#~&2=UOqjy|u@#YUW&|vR? z$lm8V6L0I)_PHO>lLrI<&6jQ_g^zAhQaG*U@=Xdejm}>&2~6sa`>S7BG#^J=ziXoY zHz9z<^~E$9x9qtz1>{RpK)y5u&V9i6q)cj@nQzPE z741w-M-3wS7$ifpXB%t{`Zi0{qUs|nx5Dqux|WGCmns^bTu)iAz}9kK?m7GQQpV&n e{|`%i?leE(VBxailBqDzr3{{~elF{r5}E+$tY6Ro literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AI_96_96.png b/navit/xpm/country_AI_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..8cc69c7ebfa7f18b9a042008a73e7dc06efed19b GIT binary patch literal 2788 zcma)8`8U)J7yru67-V8>V~p}7+h{~&H}-6q*IqnSV_#|>J58a+*s@GWBkNdVCL-Ae zrA*lkP1Xuon^$Cs!t41D-gD2rpC9hI=iDDYpU=H14t5qo0#X7100>!GqOTmI_rJ+^ z;SEG;s896n9kS0DwS&71|gR^@Lp*?Er}s@AcZ<@@+o zmr^T2rUl*wiDc&9pM4T9-roKL^)^=c5Za=a^`=H=6?YDO4u92=V%q3(n8QXew zJf9R>f4wf}Og3OO9B{@C2;PY|RKX_WHm8E_D=&c15s-)*U>M`+iirxB@pUbWP^Lg0S~|?j8Wr0M=z*gszAK>jCk&= z59~e##(yAK-~b@~_i7{3ogV-P4p^l9GUEk?fAbKOb*xZQtskuo4mwQKwjZIAJ!8JQ z(gk&o4mRqW!JMYb=}B?bySrv3)h)re7aU@s4v_)EYNcGlRj$8GItv-->n z)jl_6B4X2s-^L=2I~O9o{hs=bZ;oM!5QoLBr$^rMnypXxdT3aeOGpOGif~Q*?q%ip zl)388DZ_!NOW5vY-#w<2;;@;#VpRM{>XA+xN<9{K^~KlbpP`4oOPel~zfVjB4_cBP z_9xz@KfC6$&i!*03-iCxPtMhd%%-r0E8monx)CK^C8pM|^E=mvE_g6@s73GsO|8Vn_u=piJiTCSI$dGr@?LFq^`I^BEf6aH$9l3@g9070k+G}MS&c%*oZ-jj? zhj$8VFy{QMe6;*6k87?O79O{MeDAF}#j44q$`@&^QXyRZ?;mxvo)W!CXH1X!dH77G z%8A)abKuX2~BMd}sIEIa@)iUq){%a7TUPZf_V9E6h**DWQ7@yO;}& zwPlrv1;_4i0^(9Kv4=^TI$0yeQ$+_j_avmXq{|gdMa8EjxfW$7_9-|&@Q|YJR6EVd z7ZB}Prsf(P^P?_q%sMcE(#uo!{nWu_&14w65HMrA1q;|nOI?4za zk;6$oRxSWfOFLGlTV17R&&aXFaFwki*U~0Q_9#T_xKQ71Cc5XFlSg}@wn-!FE=g1S z002r~xm9U0W+4yhn4Qh_-1P%#K0)5TH$bU^*0E)LzhJuZDg(mYNT^JERA*Zp7P|P+ z0diwBN1wg5f3o)|o2unZDv%CIox5p;rEy{4#HRz@FBRar;;a0!?o?>C=Ijl0z~tG~ z0!-6nh|=lD^ygABV^66o`pvOll5V*q0u#%pGn!aoWu~cvDOFYe4J=R}!@8&w!PoaWY(2{7dCK$Ia|3pYJ*zIeWoDj8kmVHz+AYBu0iwvrGn zVb}IfPH~%5S9~j4=@#;3p9*;wjEAm_LE*|YylG=*LDu*ed4*>b+w&W$FiO#ndMGWQIK<*oNZaWKlPFaQyev~AoZl;8>~9v zb@xSUrq#Bjta}hNJOL(u0wl^?Y;3J^?i%D0bMzLiGrjaQGZ;&w?0d+hl~p9~sV$F* z<~PqRk$u2(P8H^R=f^IbO13x~b z#(U8-y%9l|ON~VNf%2N?4L!0_DzIYK4TVa+=B+X5Iz7NF>t&&vH|BObScx%Tqa4$7xekgh!>@{^;s_f zh+2tU1_6E!TmV6A=@v30Lr>OS?c?LNlNmPM%GO)j_8vm|ix!a>3um{c831m#PpW%h z#0PNPb_qvjSSkiDAip0`w;EHl>7R_f#K?w`>wPklf5pXWh?Dt%ed)?AmHg0NjySeB8M&<mAsB>8N$~bh*MPj`bLK^*Igj8fVwk6SyV>yE`Y@Kua(AJOG zyNL6+dC3Qr!a!q$-`S5#*f?%3K$R_pwcQU)&Q_u&b=-!f5+eh@IBfir!eL~3n`QIj z`bA9hHqEXq0NnAP)=TIy_N+((XN@{d{Nm6f*g25d zYTvWzTiu~X?xdUMNz(k+Q6!VPR+g&7A095?U90X6d3#sxRp8TI{A$R5&LlNhe|#dN zR;^5nU>U4)a5!Ym)S6IA$OHZ4`+gAM9+4KRn2gj*$u>2M>|BJnecQ?^LOB{uD@h1E zp%3;z15}Q{cpIMnDu8R){j;9Os^&?QQ~90It~0d)WjrDP=1E&_DReR7$|=9Mc}H_W z5nI3s0a#wHT`EMlwvdvm`LvS}96lmth6nmzRX6>5wt$o_%MA;+39p{$IWrfO2c+h& zqz~=1GlDedg|=5-DB9UOawV0V^{*G}XlW-v0n#946oZ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AL.svgz b/navit/xpm/country_AL.svgz new file mode 100644 index 0000000000000000000000000000000000000000..5d2ab91ecff088e1a711ec077121f3ea2db9e610 GIT binary patch literal 5624 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 Sf%vyip8P+!ac}R`E&u=&MHW^7 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AL_16_16.png b/navit/xpm/country_AL_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b275fdd1f672f3c807070544f05c73389a1b7ae9 GIT binary patch literal 320 zcmV-G0l)r4w-zCgy?o#~-Q&$LGw<=GI!6~sC-#2?c72$|@D}PPKQBlC-!WeI%2Sh7 zG}{F^_~^f0!{U&J;4C&Z;=OS@9RM6qp8b3%HUd*^u57t4k^wECz`Hi9H7&T#X_ua8 zldTvTI8h%{LLxAPBS&sfP)f?k4IITJ1{;wsZSkRDY6E}^lOKyQdm?$nvHBCS3+NAY zD0ZygBMFr_WZf0LU4F#P09yr1oTbm&+2JqfEcgY^szXQk SeB6`(0000b25!@@Hy^_EP4%tT#LuT^mhatD`?Y?!ZJ{K(_qg{+^g93)ct20utY7hpHW3S!uvvBs9?>X*N3`q~5;hYi zm?5_&90lnS4VWK7CDE*qHQ~&VbsH?$eWSM0R)@8DSR4SrXtUl*TMvwy&|uE-woCPx zOqh^Ji#9&s)2x2ps>al4X{c*pOF$4H0 z?Q8~9tA3?G;zyNO)W;YASo5pHNoF7u%a!PTOabk_=2Dn_4K(#apR7;aUwKU;?X!Ov6YMFgD% zA8a7JM6tdJO6}BGsV1Yl#F(-X$upQfpw@llj}Gu){9p!BMfepnlfslDWTB|vJVu6w zMDSc`XsvT*nPS&`3`Mx>eA4Vs6qcv#podbxFA>p;Z4rj0q*B7&Ds@Jk4P)g z-nN@dQe<$94Jt-xPw4KbT=YObt|j{`{`kQXV5w?7RT|O&tus=0N8UPO0JT!Bjp`kW z{R{I7sdgXpHk+AKJec=Cl}rHSBv=RSnpGskx!8DBt0rVRWc6r&HWFoppEFcE*y-M!;(A{n|H)FcVND)9ip}SH` z&ZYW1sz0hFzYEI>pcjpFGp5_^=HAfV?d2HA=q~X}c20x_!u5y%KzHbDcFqF8{$$JZ zrPCNtS7Pczh2H^So87!ju>l}2c}0pFu@c=P-XZ@-R@vYT7bNE(PcRPv7E)73=$r`8 ziois8AvFQu1oJq^g5(>V;p5DUWf3DoN5b-le!i8c$C+1$@NzXVi|9qkkA`lSmj!?| zM$;YCtVg7edtV2of)w+q-p_-lwT4AX)KhG{Bkavs%}PF->KGvo(5YI3Jb0^eF$4(! zzjD7*vFB3#aOmm?FQ5hn^st&-s2C9~Al6C^0R7w#K|Z0?3xM9RJivqZz1(d?J;^)( zXd&uuFV}==8`17mEDX@)W&625H_q6{1L{z$CQJbU11wT33DBWf`-5WjQ&)-y)w-EP zLqx0IS)(^q50KFnuc@2H?AxvsFB_Ta^-D&kEH7Vl#y&E>;*I@SjR>~h8BSq}04@r) z)1I1&NpP92_P2clCR?p39Haob)tb_HbuMM>l@NRHe@%{h*d;fkqajhsq_U(ff?%U@r;fA79;&)K{B z{`2sZ|Nobgknp2DZHj{OW?^almPRGTgGZ8%9b!#%aFKYp?$^iv_RP%8?8?erd?|`R Zm!zzc&T8hhV+C5u;OXk;vd$@?2>=J>LXiLf literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AL_96_96.png b/navit/xpm/country_AL_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..f861201dd75f192b1b037bef87dbbce3da8ccd7e GIT binary patch literal 3869 zcmb7HXIGO;7kv^sND~OsyMTly9d4vZ38FNmBO(M;I#LZSDkv>fDViu?kX{Xf(o5)w zUU~^qL?CqOg!bnCgm=w4v)6n&v)1gr&z?AQQzK?ZUPb@_n2q83mK1dUujs*)-J3k; zO95IJ6C-`#;=h&KRG1C`EJMcny7xk{8*=aGDqE=^uS1{^H3C6ERs>hZT92O(pqR|3L1z;N@PpqDxC zKH3Hupl5mN(-8q7D>pLl2s-PgSpeps`^BBzCidK7O#9KV*nm*1_ND}1)eigq_(?IK z4v1GN)0QSA67(mD0`<#1?s-dskWKoTNsrt5H={3Ai{lQz!7kPhIJpJ$5#`#UDQOI8 z9}qPlnL55v&34bTHag;mziF9w>43m!)ASL_>C1WU^KBPgJxIpbP!diC-TH7yH!USy zaU5B<+qR42L{9@Q}TMe=IeL zoyj4AP>?cJA-TVPBC^*ncQ{FdugE;XyxbEm)Vdi`;_`N7Sf1Tr$iM^9m|sjERGk9+ z$S|`^tn}piHhZ;QD{i{&hJX>IeR#Ad9QIchW?_XGA=`dcAO6eEtk9ZV_R8Iu=in7e z_&JbkY{@I`#@8E&_q&@?(Z0hizG0(_G;xkH9=os{D=hx^t;c%E$l5~@phjtjZq@9r z7^m~w;eCukdg(HBGE{jgJO&~p|3t3J$|*{S)hw$9txKLZeIz5sm>X73W*Uu+wMKol zgLc!6IHZz}srEs+JTh|I;!LjadgIDQ)5?2*26pCgUF2;lAiLCx=r#s!rSjRbk75HT z&nJnKWshdqet@JZZHmO;J)mo-DIO4tA+45JqJ49SprU(^6{!eUd+5e#T`_dc(8S{% zUfXi^&m|yyPD}4FXu&bpmH}!b@`TABn7g@zp}$bw`>;dzbZo^3zj?`S%^A@=b8yRf zc_}PQ={4T?^RrTmGXZ=pZ9mH+d5*9bSKdbN3A6b9ntQ$6w{$bLs~uXEOdc;}-TBz> zURoVij$}M-Z#&a)I5#j}j*Vg?18fGNo}HnWs{R>nQiOAFwgW#1hTKSID%$8u?BAMDhOO4W6!Xd4+yuj#$STJx9ku?ScUpGp)b zuT`H?;e8tOL8u?c-lp9Zxabt%ApkzL4MKrqK|gWlVM$&UiONgib;(67?HeT5`K2Ru z&<5Ms%gb=2{9c7govHPJCUi^6o`?J9e5l;gBZfMqz~y|_+tvdVvk>;7Kb04c$aXq~ z>+k0V8~TK3viuZ2e8g`&zQV~1cEqn^02&Kx{QqCM|XA8YkR%(F)S~^JK z7{sejwYywvc|B78A34SPMvs!co<^ipbUtOy40*MA-*jBdpgK=vsH-PK}q~^q9WGX8#`a^E6XT zlmuUbPEQu(i+Q6{>425DNaIM69fxP6+5pRa0g91C$?tuLSCLoofJTD=Do0GR1hW>{ z`{#|-x__NNdR?swOrf2va@gn?CrIAmoG)~hm9@Qdyck zqxN}!mcZlU%`KhkEj}zIoox87B)P#&85)ah#Z4|&{Dj>cv(mx5*aL9dNr_We@?SaO zqkp#O^EPh;e#bjJDpnLaqRR`ZaFH8{nGm)BZ{W^16)@AIDFDn_C9$h-%(-ZW4sc>! zcR;TS+3(MO53D>O2gLX*CS8eD8sc7lNr1G=h@mNTY;ikz)d^Na2{kkgkFIp2T3AQQ zJJ<6HB-JNBFA`L~i&lB~<#no(8;+&lAr6m5D75}mX$O2$2P)%s>uw?Ldky$@cnMe! zzPTWVSG&|-dFxyE4f}mqCMq(N@LT-I2!}+E`-(JbP7#H>F0L7lu<1Pg0#-3Y4OVW%U=ww)WNDu1H?6Y!R}R9zA7clq>LEP0<5i-;()8jL5gS0=O!4CN*Qoq+$MS_|QGRCG_r315@TiwIo>xApmN5K&uM;Wj*9={I zz>$6eUO=*ezdE94+{Ql0Vu0;X)ydADFGvG1>oK}w%9L{5A17#-RVNYGq(m1L3>51w z7xI+eu{}1^9*xcL+>2*1w01iI&GAp3R@iBopyQar!v&>7p8!Z)0?%ElRO2VzyV?~)3$r7o;6X9^2dU@O z>Sb|X0u?_KNCbex4S(5$3tm53lq4!5le+K(*3qz;RJVd)RyRk`xKd(tMO=MIvKYJ#iY0UUPU zA{;rv{?*)ZtI+z{8Ew1TN=BBDo4$5ITX=))cWEFot7h2+m$O5*ac2d!y5PvPO&&gE z9l15JqU-q;VrUNkuc8CVQXZi^~7`h9}5>?r*@d9M&wIQ(`n>fjkt zf)>7X!9T}IMa;GOwR`~R#1CWEYhR1v2K#*Hm$S>es3m+LVn5-B)qW<Ph_1r{92ekIW-mR5=o0Q^P_GOqNds?ga3%WM_8-#Y#&ag@8BRDhr z#PpFf zqL)Y+QQf}*Km3PSQOB2m>^!`zSJTBdBgBVlMBoy3*$F47KRv2g4r`ZIx$K^_W1qrEt(`u#R++(_&N13h7<0UzTHmc5@oE$3} zx`vj*Koy&yOtC!OK}&rTv#lbV9>6mw7WH z9wB~iugX|_vyyJ`+vjKaRJJU<|3YG;4$ZZz`bZgg^aUqMYSb9QF{ZO~0`!Y~X5;4}OR&s>)}Sp`~A z0~(*2v=5|}O*>XJq!A@WZAAI`OFf+h^g zO4G7R54qXYw$)? zDGG_Uv5_+Nh1_#D~=7kV$-J;Ug1}53WvPr81;{h~JnV=jk1E8`RrI{ETAK Ses}F^{CIyZbT2#30RRB+#FkM2 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AM_16_16.png b/navit/xpm/country_AM_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..fc7797e74fc3213bf25da6b4893e0a9e77e5c76e GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^8o-U3d z7QM-T&L8+Nzme&HOXsu1B!EKh8Y|>SyqD^>bP0l+XkKktZ$S literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AM_32_32.png b/navit/xpm/country_AM_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..1924027d9b961c415869bfc09d71d1844b39f2b0 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v}|+PZ!6K zh}O5)3CBI$|LU?n`6S9MpzxsJ0ROJfTmk<*yh4CxGkCiCxvX%kZ0>-Ie|q<>CF_nNk_e9y|FRRz^Y72ttpT)!!PC{xWt~$(697WcH<|zd literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AM_8_8.png b/navit/xpm/country_AM_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..1f45971c7f1af1b63fb7c4925a653e921dc80db9 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_Jo-U3d z5>u1^oImhkJ|lm^A@!37fZ)>M2iw`_Gr6&~g-(e)_+vxt6NNa||LH+5xEU_Ca4DSD Szxy4inZeW5&t;ucLK6V#Nh^o| literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AM_96_96.png b/navit/xpm/country_AM_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..dfe3db4b9a642d07250549ac1a0a818e6cc0e339 GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt@+JY5_^ zD(1YsZgg^aUqMbTb9QF{t(41doG=uI_m%n%C+=pDFus7f zjD|$&ZQCr;MVAyjV3ptzxWnY_>j5SNkzO?F%09Nw_y5Po^6u{RSi@1aozhK;m`4%F zCf9{($`pNl_>5z8cl-9u?&jl{4-en&KS6ga&#@h#SB0rklu(;gNmW)RMd3L(D%ro+ zrxalx0cHV+0Q?Yv)oQvFRmL2)g!Fyy^}eUul5k2XvB>Gj_Ef9p$7=^!k|bo{^){*sHouQC}$|En?6`@MK38po>ir%r31Nvd({3%3Hj$le03%Zf@?Jwsm}#Z-QwpycQ2ZFgE7P;*WKn`k=Ox@ z|DZWOlC>u1_GQ4_!PpB$!u%+t-1ieESR|;Q2oW(Ji#X)mrxB+~WaH;X;{k%m74l*9 kALIuJT3y@9#B_tddu-%(bZ`GCGX7P+0CoV``s4%v0GTNF6#xJL literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AN_16_16.png b/navit/xpm/country_AN_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..182f096c044d983beb275b561fe129e2819d008d GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_$JzX3_ zG$tnh=x3Z)@$wf&bik5hlMGipHD&|g{xN+;%)&}01nm6<9{vJ7+ znvjs-X#C*v^7(vxU5ggY@$vD|kE^k)_`tY}cgDPb_3zHy@0XX9keu=Jhh(qM1zSU* b$!rX(luRotX`%JzClmlWj8V?Vf zqM{&#t*k7>!^1{p3l=U6S+ODl!d|v4e8GYcA~h15Oq-kcF)%>WQhNFZVrp^-U|hB8 zGC@V3SFQQBdoP+Gm#Z^x7-4^~gof%6RP^@Bx(|mRq6rFUF$oi)cjy<_qZW)>Fa#_B Y0MJBN0uA=$?f?J)07*qoM6N<$f-KdcA^-pY literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AN_48_48.png b/navit/xpm/country_AN_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..0fecd2b7f6a8a2ac1973f50e131619c141260865 GIT binary patch literal 458 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@Hpfi@ zLn2z=&alls{T#@(~tg-7=fYpvI3bEEDZ?oJFZojnEIeo4S)6(d6 zCwu2`M{{=1wq;H#d-^USkxDxDp-CoDG*D_c`vTi1n051ma5^;-F!{o&kw@&R7PlBGLKlx>wh1#G`P z*}m*sm4D!2&miZy3f1MM9Gr$~(bGO|O^R$=#q@dJv00!9vlr>mdKI;Vst0O$kBG5`Po literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AN_8_8.png b/navit/xpm/country_AN_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..04610f62e7058c0d0783014efa1de24601a1fc80 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}~8PZ!4! zj+x1S{{OdU27$xQ&c=d#L>2%5 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AN_96_96.png b/navit/xpm/country_AN_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..e0cf5de07bee82861039d9f573ea8de5ee0da620 GIT binary patch literal 1030 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 M07*qoM6N<$g8Z_$5&!@I literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AO_8_8.png b/navit/xpm/country_AO_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..be78ba2701e9a716fef48989e7566aeaacc6ca78 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_bwPZ!4! zj+x0e>MM>l@ERnFx=u_;Nfqe*eeyt$;=zTVp5Jy&i(7sFMb%!}8=;~zYUkd#Q0mcT v==!rz&aQc3b7yB`XQyM_EXi0VUIvD3jNCVxxmV8yn#gTe~DWM4finBC0 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AO_96_96.png b/navit/xpm/country_AO_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..2b413c2eef76c785a73b7848fa9d1b2535a8b37e GIT binary patch literal 2126 zcmbuB={wX77sr2LM1^7us$mpGvdg{=LY4`oF!n52hmf0zER$j?OOq@yVluWdmJwsm za#OZMmZHf%=E3w}(pc`f_2&5pp6h(i_j6t6I`7VT@lCZuSO^?DeGC8qfoqm#4u|yo z(|lZq9YYQ`g^QVg1h%W$ukNcV#{N`V;*YnU}U>3Bqqa$v1ef|61DUlNw zFoZ0E&}R+Pms})h2*rftnBx^(a8AHcz8s`iQksyf1|h0BmD@xGS0)Lv(o5|WLBc8G z;POl!s*@eeor^zRpIO(4-lI!3zIYYwT(h>G*fFx09yc7fHO-8FNWMz?F5F3YT%(&1 zeDt^)@c#)`3DRl5yfV&*F|AkOtxI7ce{ac$$1BWvoI58xB`mw0K&RTK;R(Y2RWaE( z*$&++zjD)1nTtr7fN%iNwb;68UE4i@$$Lf?Umd5(`%I>r3Ay}&)jMRM?~Q&aPgNfi z1z=R0$&z5O4CRJN9|rekYrM<e%{P=AVDpG_rAKr#Sb)`F&F?o1Odiu4M&sn zArci<)2y`Gx5tnbPmR=?(*M~$<(_KWFZLBrwZi!(ee`)}Qy8goACsp4F(7TjQq*n) zqIpN!_Z6(qUrp}X8eh}~2zf8x^U9>F{NXqgmNga(N^7&bHl6J;6Dp-+exZ?j2P<)W zX1-9PprrO~>Z0ZgvMeWrIa>@K1@U?5j$#4h8$~-h?|!o7fGI4v-NCO^Ar3V)`23SM zd=s?zPiR*IO!Xg6gsnbRm4cTv?0hOI6+ranylJwM07^;e_N|)ZmIHCi%UQkToKoYR z7p`l`;1T)zISiM+01<`Hy&bFarc@1B0$!b3>=9l?hF9=qdPH>Za zHN7Ranjbn|E{cfg{wN6#Eu43i7ZwbyE(GX?`Sz%Ow=#KpO*Y~ zL0m!X(cn^HV2ik5R2wu*PZ<>(wouY4E-1@!|4kYo{LFI7h3g#Q0+I~9S!x?~q1(-U zT@bSf^?oaOS_KDHDHS%jXWneC0CI0E3{O8WY$i#^FP%U0_+=6=Zxo#8$U|4={FHUv z=mSZEH8fV?n#Z884H%qy`R5V};8v z;f4tiniqZ-0_0>~-<{zBB3W|XwL#4nNfk8*Qn4UuKJ9Rq_~1t+bu&fcj<{8^6Bh5i zwBn)$=imH2F=z1Pg*1y$#+U>!)vQ z%B~HYuPzbYz`47zc}Xp(Gx?7VcWKIzZs-b@TERP-t^YMqKv9pBp)Xdm_G1=_ z&m$fu)mx8M{|6$L0c|<(*4CJT><@Lj1|^d{Pg9wq2cqA$n^v(Bx8@^644AyVVf4ZG zolqL0rAc!8)DRin8&=kF#cAi{WL@{GGq7L#UldYIg=j1NKApLK>sFzZyeD&?CSq3v z#vC+C5rS-ko?o`1s%Leh<(lrxPVP5rDVy#4mSBf}h=C+_Kcn>7RG$Tf!qu2N4q(uC zUD$>ZPJ65pF#cpQa}!RB!ID;5oA35^D#y<|#Ve!Rug8V>?^kL$L>p*}i>PT01t!A& zJdS1?qfP0qYY^w)9i_(aM|99{#~nSyRov`Q77ZKU>SsALPOP4Y1n)hjV7VDx$fq3} zb54}ik@IL5!YTNkeM3P*$=EDI2-UD23~qQz$n;(JWj&aEj*D-VR|s>YV4qO&kd=wuQIq0RCEpUZ5rGf28!Csu;Nbl|#6hDJgrL&3wAf@E%cSyj1=G=kM z65G+H+r75Z0+f(UN-f-Cj6mv2*EFtn-T4$JK}hk66Iz626L&f zxCqSyAH_bKHG8F;ZVGer@Tvw(9_644P6e?&n;FU<*~r5PV#_NnK<`ErsOy|%6Gri` zB1k(GMp9bCMa@XAkd_Cib~=1Qqt|()^^*B-6`2%MYq311ntE?T`qt<)3G9A-Q}Cv} zdB=82M(!=nrIM^$lx}cYk}T jh@aq1e*Zskj&iuS7JGog_b$-GfB;;(iZH7-@l5&`V$Jq^ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AQ.svgz b/navit/xpm/country_AQ.svgz new file mode 100644 index 0000000000000000000000000000000000000000..cf1308c54aeceb980351b67b82b6dcb7e442c7d1 GIT binary patch literal 680 zcmV;Z0$2SXiwFpS>nceA17mM>Zgg^aUqMkWb9QF{jZ|H4n=ll8@2^1a;{*nhv<-q( zld4L4+}3H2m18@JSFn-ogk-;d*MNb1R2otuU7vIAx1B#9t1>unZG@5qN}?DATvEk^ z+!pB9+iUoQ0%M6}q*Rg@NGkNay35UBdlv)&h^5IGEzr)|I>Wf$>oQV$iy6hd5txo&k@KPk}D8e4aYg7 z8H}(Zb|osZc<{RarrN_1^@t*`%7T} literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AQ_16_16.png b/navit/xpm/country_AQ_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..7f5ea0c2c493c2e9e6e5b4d4b7d960d0d76908de GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_Vo-U3d t8WWTM{Qqyytl7}1a&@tkn<VE^+(rhOp}mpxx?uH4HEQ~?GJhsBP6WVZFvoT&@qd%F6$taD0e F0szm4Au0d> literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AQ_48_48.png b/navit/xpm/country_AQ_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..a213e5ce03cf6cf294b423a364a76c07d67b96ac GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HmdKI;Vst0KeZbdjJ3c literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AQ_8_8.png b/navit/xpm/country_AQ_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..82d645f3065b2613b22a14edd7361e5e5f9e7f62 GIT binary patch literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_cNPZ!4! pj+x1S{{OdUHapM~T5`dQfg$V)Gq1_&v`U}?22WQ%mvv4FO#mrn8btsA literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AQ_96_96.png b/navit/xpm/country_AQ_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..6d278aae910df5f068ef70ed3375be2201350f59 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt^vJY5_^ zD(1YsaFF+ag1~_dm;RR9sX0_0Iy_I|)U28PoBx*`c+JDb#@gKEcyK{NfPsdD$e`!m Z_%(}pFN4w^F`)k#JYD@<);T3K0RSuSSBL-r literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AR.svgz b/navit/xpm/country_AR.svgz new file mode 100644 index 0000000000000000000000000000000000000000..59f4b10774d54faf64892c8872d610fa30c0cdc8 GIT binary patch literal 1170 zcmV;D1a12tiwFqtCwfQ%17mM>Zgg^aUqMnXb9QF{jaFT6+eQ$4PJYFfMS%n$#rxoq zN5gX9$VpnjZ3Eb8(WiixD2WI|3M6IO|30%vQkE;Z=!1C2z1`WlyV<4A-#vUU={|4T zqOPW%oCuHdYF;mjYBlw~+b*M#iCnJy~IYF2ancyv08Ui&j|N=U*x;@ z^~2N)QYk1f){wMHkd%o4omb~w(Utkd$1+<{y`;-#l~-L+W#?hP@ER^nKJTblOuf5u zn|rh@%5v)coR}nx+mK3PUnbYL27>d^M; ze3Nx+g86p}tS{)A0_97SP7KXSz#x203cnW5K=+Spf~(ul5k}-Ngf9g{Toc~+JAJ;f zsaMriet@!~uF0x)SvTLOUQ>5jm%o7y&D%ZM=b0wPHyTN16d;$MKq(k3=LHQZEG9P; zNMA+*Q*esd6c}H|ke0@P0K%)WWDqK&1nxZ1a-!Uduq6E?!G2BrMD-aD=_7o`DU+09 zKOJ(36h`Z(h7Z(A(!NRm?@5HK@yecN+cqaxKxgYFUjn1Q$5Ur!#oG~V4{#hGy%eAB z!^i03VEa;VWQO1&_BeDGcD{I02YU#q%B8M~{Dq#wu#*QQucfr?1-0BKNy6-$={DftH7NVwXttT(4X>&C=~ z0$^haUXp!sm8b)B2RJ%JOIlz^hm7NC@40O^o2=Y`Up6pP8h#0fGdxcjM=~>sij*2c zPuz-hRE3j1X3Wa^L5epihXol85lRdg4&JzpXf;eVN0YWa#trG7LeJy`W1Q!_uDW{L z44gF=XwV;zvLo9Vlh|>w^ece|_GF!nk3=fYESc~<$uY~I1>QIohsL7`f}B ztRNF)J7QJVyCYhC>X~E0-9shZ(Voa&5BWiQ@L+zBg66n;)cdJ4|GF;?u-HKWR`eLc zLGZZ)FQJql{jJ3AHY2_fR!1Lwl;uFEe2tLWC7OyR;6h)VNGha^(Y>HH9H`*O8ic82 z7k3dDp%Y%`A!d(D;=M=QwXiG(@Dn#&7Mn3YXVZf5l&>I0;dAYxVY*=kd^f=&`1vR# zM}xl$s+XDSCx#ukiWEx>!bD9B;70_$7mEW1Lw>{QHHQg)?02gi35|2{QEl=h;OQOl zhX6>auZ?TuZrIb;t_UTMF~h$^cD^pE0Xp@gm@*9D=(Bx*bh=q?6NS3j3^ HP6FfmxDA5Yz)o;Gkq6Sz5}xyUYp5H;FCZr>nm-MJY~o4;9f6=$w?6n0vkd zp^yHwYg5hG|G)e9dil(YJs%%GFOE=;xX<)osI|sLQ9kg5yT~U&D3e_%@IK%A2M-1P zytnRQ-taTy*rh$`id*+wKD$?xn_*cSO5^uM)b+x(c_D5b-(E3>*IY}}^aoU1kwc29oYb;%zS{?kRZgvbvdp_Nd zyH811>)O8=@48OLoj!ZMWXD+viK}IOyekAOH6yEk?>%wl=Sv|5wf3cPXDhcJ-tb$C zGb_?bchW(Y*X7O(6WF#0SeDMu;K-U;tfT$;t@)$;ys2AHd4=+QyZ?!0&TG9Zd!6>& zm=N(|xhPM67{4xK^TUOved*GBUf5kv)IH69_08Tr`=^`}+Hi2kIkV;GSne)b5bbu( z?)?52Ph}*Onv_qumzI7|Ofh5&<%pb=cXh&)ZLtgvQSUyT_3YsNGd=r#Pf)*kho{*r wqj{{$*53dA`0__rV8BJ}mQO|mCOlmAPk-JLb)uc83mB^mp00i_>zopr052x&GXMYp literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AR_8_8.png b/navit/xpm/country_AR_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9346b8eca8a7bb66509d113fe795216572ca324b GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_cDPZ!4! zj+x0iv8A&ar4tTmojP#fz#{d-&7n;n|Ns9laP2s^_RNTzm0OuF^d_Y|{`LDif79+C kH;Uhs#Z-N2H3?^ASpQETA#OwWGoWD%p00i_>zopr0Q&Vb^#A|> literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AR_96_96.png b/navit/xpm/country_AR_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..0dc480d3f76aae658e08220668cfd67e8bc422bd GIT binary patch literal 1497 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AS_8_8.png b/navit/xpm/country_AS_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..74a41270831d44475be641ae57bb391b9d39cffb GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}=o-U3d z95a(s52@ps#M@5RoX0ube4fwRymu}C bM0SSXiYB>_3;k4pu4M3Z^>bP0l+XkKp>twI literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AS_96_96.png b/navit/xpm/country_AS_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..75df35da1284586daac85c2ccd7110e6f2d8ddf4 GIT binary patch literal 4083 zcmVx_&AHR8?-^@b*_v32D${fmdkGPAT?!$=16w~&96`w4i zodB)^os~0b_*?}#ozXOWt^$oq!{>?ynwUnElwka~2d_||iD{%+>FJL@Y`F7QLO@?} zKo?HKuepMNE|!MR6#;Z#+rlf zAYo068c?Y*~-z4ON*Q(u8}xY-3c4XyN>9cLI&6njl~SLcgAf7qauiko*R*nlmF z<^Xb4uri>usUyv13{bRa{0t+ONDfr){9?nuYfY^QQUoH{V?{|ELL81ckgb3|#W>QQ zi2XU~DE1nQssFS0-gG;Le0w*=bFOwbLJ<%IlmhhoU=Sl&iu!=&rGx!qiG<%Jrh8D- zuWLSe<=1VMALfyEIe}0FJ{Ai!7!ISshFldKL3DaBHz#RC2Qdp2T^f$#K78xdmR%pk z_a0CNLX;HkZrB1a%5mHYioh}h_FFMu4R;73UFMnl#vD-8drj5npX_?$_woIQ(kLzz zfg=c$4|z&tD^N3pMLIBHG&vxrVPcRbL-M?$Gk1@nF(~RZ9LK%!+|TVhUWtd7Uvts} z09gu{8Cd;L3J{8bBA^hU%Zn5#PO|EaHKv&R7n_WGC;+ejVmKG=g0QiuR^7GHm+4yGMwl4t<5HPnXoyea!y$Hc%D1QSN10}JC2 zWN~N^IuRNj$Wg)`0279rz)g$)>6|*#1~hpzd`>kTk|Dsqw)o)*Azy{VHWa9E+z9~J z=yA}BTorn}NR+}If|sRom#sdh&NKi`HVvQ9u#0~&=!YkSJSD#JB2R$|6K+m|H;mdL zlD46~WA)P=hWnXaWo4 zP-{bq6y7kz6b2Y9DO)kR&J+PnB@G{1sUr!LY60N53wjYeAtXr9>4AiTT8I`W7HP5D z3=Uv980MG#@aY%Fs1vON8ZT2%!>7IKlYSqJGDJ9NMF??F2w-B6E=RKi5f15coNyyo z2__6iV|?W0%|fAYbe%~Anl2guyFPv=a9}gX0RTzBAjY5{_8`;(^bR9g1}gŠVa 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AT.svgz b/navit/xpm/country_AT.svgz new file mode 100644 index 0000000000000000000000000000000000000000..76d3c70b414715173ce83491e1d7f0b9c96074ee GIT binary patch literal 258 zcmV+d0sa0TiwFquCwfQ%17mM>Zgg^aUqMtZb9QF{eUCv)!$1&)?}GnfI-Zl6v?{H1 zTQG?tNG&zB^jNx^WFhWKvUK&|yDJ_%sHfo#?|buRzI=b};H3INTO%+_89|w&mD)4{ zx7A%TMHt+{$U|q15@;+g7w2d5QSp>l`*jJ!se$$O_VFPHOo(=qoT#V@cz(Hu5Jyz5 z5U_Rb?S{yEpZZB^`-Z9wjhQprlz9@oNfbQe%Lr2l%{Y}#V!Rbkgqmg$zvKjtqaVR* z=~{s^4nMR?H?0$R9Yl=i)zSTFfLeE*zzaFe6kj3Gzr^?lQP(xX$M^0Fi&et>1lwp) I!B_zR0LFoOtN;K2 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AT_16_16.png b/navit/xpm/country_AT_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ddab4ab79143d43268df8d982f377012900cd60a GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`oo-U3d z8WWTEC>}rMz?Gon`Srn-13xlfM_n@c^Z);R72f6xmv!cEU#slN{Mf@siXqX3b1!EJ R^LwCH22WQ%mvv4FO#nznD2V_7 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AT_32_32.png b/navit/xpm/country_AT_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..d2eb01fa09847bf6e87b654f58572d90c3761109 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&*?JzX3_ zJUWy2C>}rM;C;X)__DjM#MXo>Ol%+^7WY13R@8wX|Nqy|iZb}}IN?fDAa`2>YmdLN kaz^&SjMYhCfksw_NLTjez?iT5fkrZTy85}Sb4q9e0DdwtY5)KL literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AT_48_48.png b/navit/xpm/country_AT_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..14bc3d34e2d6e88ad8dfba68085bd3bf45c71ba8 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HWsf+1i^viRIp vUisU)Dl0g&nz|M!fv8g-_*oGu1ViFZEn*FvXeH?cw1vUb)z4*}Q$iB}4sJA% literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AT_8_8.png b/navit/xpm/country_AT_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..16de4c122dbbc7823d844a92f353c39eaec87c90 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_cpPZ!4! zj+x1O6px>3;5A4TO-)Ehc=(m?nAX7`|Nqxt>Pf1ZCD|C;loHO!;OfpE{6jj|5vYy9 M)78&qol`;+06JSFtN;K2 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AT_96_96.png b/navit/xpm/country_AT_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..8c64b2fa5f797f01d0ef57c126ee3c551d04ee99 GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt_SJzX3_ zD(1Ysvyr#KK!C-u$3^-}ywKelTnWzBGgdy>y6eaB;&}G^=dQB9@mrt}AfUk^!otPG z+SugaNG!M2@Oez_;cGf%Xoc8g@Q43bx+Br{p*gNq-2D>kMuoe55kT)Uc)I$ztaD0e F0sx{}QBVK? literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AU.svgz b/navit/xpm/country_AU.svgz new file mode 100644 index 0000000000000000000000000000000000000000..84a3882d9dd484e0da5375bfe6e08d816b72f8d1 GIT binary patch literal 1449 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 IM6N<$f@+KI@Bjb+ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AU_48_48.png b/navit/xpm/country_AU_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..d7d701f343fddfdf2e58e34c1b8c4df1b4c533f7 GIT binary patch literal 1357 zcmV-T1+w~yP)(3XL8{=q+uxHx54M@KPjXXsxRMXWXLlvPY(4DqTV zcMsP^jmf!*#>|I(pME*N-@WIM8Z_r!_h;jiL^<)v`#8qz00Bt$?>4e0d}32%6~G&eUT^d}Vx*#oVZp#hyPA~XO% zP+bPNc@s!dD2(atEzZeF4&||&oMht_6#LmZ&}u=abGcR{29#H4ceizeUJoQ0AJ4mg zzf_@+;h#|`WDmZK6?}dXs;hw{?RF|RwM@)DW}S)4CAeII9S8u{m|D9SCV?O*(^i_IqV7kJ{Exy`aX2VFU6Pg- z&*30;pf#ojr@OTabh=O6c{0swE{F5)8*P188P+3d?haQry#MW_Me)o3!> z+CBk*va)`IVFDA$h2~})kkz_o7z|)G<07##7$$Dte!&>{NQ7OVFofV6e89<*$p|6V zU5*}5h+~e34R_+SjMy^SPkc!;KqDcUt)Jk9=OIb44uP2U;yOHZHe!s=ud(hNi=U*r@vY zkMr|W5rVsS|J*pf{vTSWAxWsIakuy6Z{EzaXS7uKx={sZ0$vA8RS4 zC{J2i{M6Kf-#8I~MyGTC)T#W|<(D%?MrPKSND`{6_myAhzk&iXv6j*U2L#8CedzIc z)#~&BK%vlVWLjMOm+4YjKql5wIydKTX!zsd!@soJ-~E9K3jApbz6(s_V=5|QVPZ;Y zMn(drl#Y+vD=G&0e6HU(VK5Z?XqMYM)jv=pBP`i{WMrnexYzAo^)dZ?dDGTtG#OH< zNGcU+G#SBOVzJD>d9$#zBJ6X2f)whAG@*Wa*Yvr#r1 zg$ZC^p_CMHN=jVBh}guwLRndfG|m3`5-H(U=+L2f0LaWt%*;&m{oHNg@=$ek4v)u` zN<}mcv$L+HB~M-5KkhaS;J0jS%=Y~G96=z0K+m4N zA0M~<$3Pqoa=BI*+vQqiZCva+P*YRksZ&zMK7Cr+)Ks{WnZoD~1=NuvNpg9TFNxV~ zlw6)9mv6JP8G3(+rP`}hY5o150)R@@GcYiB&jQ%8GXec+acWf=a=wD&++H>ug|AE-F=YakJ&eAt_zi;ko P00000NkvXXu0mjf9MO*i literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AU_8_8.png b/navit/xpm/country_AU_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..1c5e290c62aa7500d731b1cbb7e2d10504520cd5 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}so-U3d z95a2-7;+slkZ61O-v9C~r{j+%G&S#@t+1uLLXBU+qU;-2++o*(PYic+1$gw>ycEv9 zSJ1WleA;{Zi2T5eSZ7UlZD~Tgrke^>g!bA-&d8eEaV)|+O-cX6rU?-NZB;3 z+pM@@ic{UGr!S}Nvbej}XsL`bKXdy57L&{0muna$S1~SFcY2kUq0usS1;!(VN0Qfv j@Hu3AJ2cy0{>D9VqSM-$`(JwjUCZF<>gTe~DWM4fAt+w? literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AU_96_96.png b/navit/xpm/country_AU_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..cb3cc3210734c6446abc1184e11865efed74d28b GIT binary patch literal 2564 zcmV+f3j6hmP)+b>08Rqx5&jh5U!NddrKtaLkHnHXtwcW&UdWl5C8e_3fg>zqjd50PZ5=sw z?2f@;L^+EyAOXP2QFu52W=D*6+S|u6GgWSA2h5jwXF6hIN2#o4d27lNkw}1R>Le{& zW=B(j7#+F94gkc*Q}OW>mQdvC0$xWhvE%R02Y|RZaak2*a(LX!PpoS6#;8L1?L?T3qX=9S!x@a_WIXN{7MPzI1IRMDbt^Mx1$A~d~KrTlLpw(Ix zuU>_+GNgczgH|1ag9UAEqXa<&2X8|R1ptHzJqA_?_$Ok7^XK=Bj~fVrkVyPK`>Yo+ znnw*Wn!!PROUp0-q@+ZmNAtiQL=a#yS#6-;QCBe6i6DGvD-qzv;lz4~_t1Nl(#U0Jf!)%WH zgATE*tQeMWLjG`q6pBayNJ^4MLc>dIj*uIh|x}megk%B@H#@znm&F!t5Ws%^-bw?i_6QVTeo`d z-=AF1x9u0#faq9U`ShK7cQvuSC}*M3}CQ?Yp4OE3NV z#tkK#2M!Vd!ovJpThBSe4h^n;gezgS&|R_C&IR9k!6L4@^L zQ*JF88kzxs*;(V%)B@wdq+A|q)neY@C zNr~AGMZq`UU>RBK(d!qL%5`In{$~-529!#B73r+$g$s3bF*mn1C#OcEL0!DT$nS!z zpR+m^w>!fQjZU}Dk>zKk+mM%jusZ6#8EB0SyMI;fSk$POt@uD4;VI&lkkw5e9>i$K&|q=79^S)({%%pOR9kRPN$deT!Y@Il$+W zM&mO5lS6gSA7Zo@Zgv2dARdq4JjmS~Jc6Ek?wP145tdNy2A)YeKAtj}OalWtEYaKw zJUvJzqpV&_dJuSekW41VvZT}v!6k@7U5Mqba2#TpnbDRpMGz1hD~^p7TYf8(QJI<1 z7+U8Ba1_+jqwVT?_44IJ0EmnX3<~lUi3E|6fdFv%a$;B4tKHpNrWjiTjzes4P~Y1- z`Qe9$4;~Er^2>gDXHrsFadFDaFUx-XQT^+$dVGy^CEVvAmFkgP9{S2F@mX0h^q$W@ zKPD9N0YIhd$J07Dfcs^>qT(SvFVj*i8zvJ}RzAehHn)Jgpus_XSC@@EUuUO!aL_}> z7a-m!+FV>yUHu3prn`Y8sH4M1p3f>Hxb@*KNFov5ylEp-Twb2x!bPmu;V8)0mv`sR zUu{0YM@5NLs*}FHJhXzjV`Xd1nV8^Yh8Z!|6+J^E}&i14SMCg>tcK-8D^AAFGd_S;FTiXC}*ttbHz z$<5u%=abRV&zMZ6!9o4f(sFruH%dU%*Bxut>1^7v9eZrj_k-9Y7HvK)JAYN4Xyp|3A*Y3V6qvrxeN{UDScL{WZ1q0jK}ZZgg^aUqM$cb9QF{tyIfS+%Oc~^A)byfaD~8Kf(kS zl`2(gckKs+i6@B&$tW=l^y_OUo*5{N+Ddqpd+#~-`W!o6-8|iQ;L(m#JM;x4DTcuI z>!E7nEuF2vu5}Ig+TTsmS zvfXZ%wlSFwW1U@sB=OAYu|5L;__6(z`=Ed?2s<`IDaJVSHF!Y&8!CV5{K)sP#2Ay! z)fxRta7gUh$~6V#VhJ1D){QG5!%N&&1@x0By!O$mvYRPnmwbpg1le4wkNKKtt!9GH zk9O^r(#u(?SAY%N7hX)AEAmizDj+@t&jn0GYUZVFg0VQ1CimR=L)x@mm!Au*$?fe` z2$Er2u3Pt6$&%5C0CNOcfIn6GWoR9DD;?11VvVa`ng1C6iGO? zeY4wN;KZTN>jMuxc;}DmZ*Edfh?kA^awCI9GR2BZV~|oQ)k+KDvy{(&qF(Hz9E&}c z3oaRotl4Cbkl0WuP-M}74c&y6nxloqj1G3j$p%GML~3OyiWFj^nSXBfl$mxzZ)x?x bW-@N}FTyIT{R72O1_RK0XLv@y` zYf>#<{eSuA_y74C>a{<+mL;OXk;vd$@?2>^ulP!<3H literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AW_32_32.png b/navit/xpm/country_AW_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c3e1c271bcb82df4dea5439606ca9306f095b5bc GIT binary patch literal 345 zcmV-f0jB3us zM0r_+zr6kb`V9jE1HcLtpz`?iP6*omVzylXleoNBY^eq4YuCz}2SfA=Tq3#4lRVq=oaFgVce&v{`Q7u}9qOM9 zgP9Uo1B~H8qJStn{=$IlB?V31a{3f445-0nZ9yse6fF#>`RBzKKc`R8!hpPqE63HD zB(hoW#=BZ1q3rTBAB}okC8hwi_$u}IxH6|~Z5u8NZuk52>`de>m6qv%#6VXlud2rn zpGEC$bK`9gWjQr5wfOG3d;XwC z(b6sIR9ap>_z;6ZWV5X+HS{$AAQ{dxUrM&2(JBb%PiguZ3$0000c&=bpy-t}yY>1@|Ifb=@~Qv-*Z#vyZf9m@ s;bj6>H2AmXMyM9NzEOCZdo>HgsdVAv?~Jvgfo3vzy85}Sb4q9e0D9&%J^%m! literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AW_96_96.png b/navit/xpm/country_AW_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..0e369c2fbfa688096efb902b6af9b38ffc801e8e GIT binary patch literal 1097 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlJ8|9QGN zhE&XXd+V-uaG}ickN5MRSHy(PmYR7p$IWVM%@PkL#ilNeML9DXQ*YG9mIw;QUa1cd zzj(Md{O*^AFCKz{k%4EI=q_J7r&xFLEcNNd*3Z{)AKkR3n5SC3S@$Sr zUGR}3QYW5nnBLo>u{7p7M~7)ZYS@`iAND1`bXu3qazw;qnoggGL;dGtPd9v)Q;}Nc za4xkw<9qbmx!d;`w0~E)Xuw(|`aEl%-lEK>ixclPyBro-VH1DtZ=F-e-)8;tiH9mD zMa*EDx>7MoqDA2BW6iT0mMdCZ5Sndz{QcY=Yb$NmiArQxg>Q^~|7zBbxxeIMvn8L} zc=T;6eNmB*a+PN!A3?o9jExK*{%eb%b7-mj^1?NVKo zg1^7^pSLD*!i}5zY7_VA3WQDGWf&fO*71Ms>C)1PYg0eJ>e?6nv3vTLd-uMyN3QL< zy;jzu!d&3}3!c8->_5wAB}XZwKYVmeH&yiDyB|+a|B|16wTC?#sBUhK?Tw4SKY#n2 z;555E{qlQno%+IW8*5Ehx7q)*sXO%J%K4Hl%U;H&(R zTv@K0o2jE$^G%`d;UYs5liLfsCf&W0vt`@87rpmuEd~5v+&Ml=@ocfc(k%-&CB#2I zrP}{~>3J2;Q}@(X{{1kQ@$IwA|1NHPBGYT?Jj-D+f55GP$P1eaE8nes{c-d2W$&iH ze!bam-j2_?j_&CJy{gZ$mS;YhDd({?Xzo4z^;P?}y}z+<-IH5aHV3U*`}WD!wmwx_t z^m_aaCSI4Nx1zE(|J0HEeo-P=!E{=H_jQk}q5pVx@8kIWJgIKBbKL%Y>Jm?PxjC$9 zyvKj^s&BNr(S!Ks`!}$?lI-|(-1zn99?mt5Z2OPJ{chjsCn%h~Ktxf$X7j$^hW>w# zi?1kAKAPXY;e&Ps0}smq2XYCkce)1E%@;oKFeNB3umOpNntwL~H=A?#)(K{TWrUc) zGAE>E&Y!)fU{bS^@qjlEI70!6PYYLvp8<;6Gy^jjOb{n)KSPzY{8{Z8Dhj}|fx*+& K&t;ucLK6ViO$0aq literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AX.svgz b/navit/xpm/country_AX.svgz new file mode 100644 index 0000000000000000000000000000000000000000..c56d47c9ab5e1737ae80a02be323f3bba491f11c GIT binary patch literal 319 zcmV-F0l@wriwFqqCwfQ%17mM>Zgg^aUqM(db9QF{g^=G$!!Q)a?*-rCc)VUu(ylmU zap3+Thz{HoFH6&=ftrpstn&eUGGEMOuJ~s|?~;@6`+ncaaI}3XVUyL3u8cq)Foevc zmDENFTrFq40YYOFBa^Z+nLtzF=<4)jcs98oFP|4vXf_HKtLxjFF<_7ADH;<^mJ@h* zoC6Oy(ew@h3v1VxL~Yv!Z4^|sqIsRH3!OIPgye zx2R5^=V|7qZU&z@$BdyrZw2-{|1WKL0C^So1tawXDMQYp{y#|0_Q;F)D026Hfb7J3 Rr2jQ%{Q$Q4l2Ic90004%m>K{8 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AX_16_16.png b/navit/xpm/country_AX_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..a67a21555d322c0b8b14eb0e5a40e11cd48be853 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^Fo-U3d z8WWRKIO0w*Fe}ZOKfgufj@N~YG4+k5r<~Yw8aP*L$Qf{$Zg6=i(_CC}bKl{cCmx+> z`1s#ayiJvsN) zv-F!cOgtKBqO&`R^?64@U0b$;m^)ju!7|Tl3=H+M+N)%j)@lLW!{F)a=d#Wzp$P!h Cq)v_i literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AX_32_32.png b/navit/xpm/country_AX_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..315e6b7e62f745b38b62c49b94efb2293fa887e0 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&+Hd%8G= zcyuPGaKxQzU|zv(zkg!jrRD@0N@&96$kOfyWmP9%HR=8DmoMF0* z`ECE|ov$;RDy}4NKTw^jsb}f2v|p{m-8RhN3-|6oZZ}0-^j=4DB_x)y1`7ytI27KiB;$MfXtGA2lzEqxTa2udL&%a5Tz>=I7wpy$28uq z+?m$W$~Pa)%QE_W@2uy<~+1l9j%!5D)tt7S6G8ep=b$J^Lf2^yZ$508o>?q^#v4`hJ;E67dl{`ndIc{al6z(var*I=fv!X#{TNT?zv7FqZ1`)Au zY~0eW!7Uuh9m>iZwvIX~;} z^xntUZ%(~%+Q@%X>nipY*366)z{VXre@%OQCnZgg^aUqMCJchFB!}X+k(!>|2hp_O>T5n{OFnG}k5e*Z` zw0B%V6v0s3NKiA~NM$13#!%kaQQR2~0A`T@#}O1xFegzsPW1GgDQA_KVsl|!gh5CY z1aIdd0faIW8*s7+qr32^3X`_t0^&Rdk07jtDT!7>MN5ZzNLO=iq4DC()*k1X#_RXHLI~?Zf=-XBdy?T2&tCe)I6Z*Y f7pFJ#^wz{30b%60Gwb+mygd5}JuAf9;spQzfKNH- literal 0 HcmV?d00001 diff --git a/navit/xpm/country_AZ_16_16.png b/navit/xpm/country_AZ_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..40070b5dca10ecaf499cace6d8ad2384543e95f8 GIT binary patch literal 187 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 b+<$!ov(WoEk^=$600000NkvXXu0mjf?brz= literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BA_8_8.png b/navit/xpm/country_BA_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..25658729b16bc123c218b3116ba07d41a809e534 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}DPZ!4! zj+x0K!t>KoRi{2NIe7gQ12YIT7doAu9PZ@9!^2~qzwdsL-oNwlYHTV8jvP4f;oIBq z=JQ+3WQ$#MvK2TUIn9o~NqXfK1OtDnm{r-UW|@IXe1 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BA_96_96.png b/navit/xpm/country_BA_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..c69a94fc363541bd59f673fc9b253a7ed945f754 GIT binary patch literal 1140 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BB_16_16.png b/navit/xpm/country_BB_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d84dea79bb06364f3e4041b71f357741d3c33f GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`VJY5_^ zEP9hu0#^S&-@ukvo@=*I>EBVN$T#P_=LxS$-6!@UYvu)357y>84eIOv8Q9eRWna&z zbAv^G?~kKppU;K2-S)3DG%z$W((v4DRPcGjM!~mCmYmz-SAVZf3z(3SI$?4`V#Mb6 z#?5P3ZtE|KJpcp?mYz6v;3%JAe01kr6MX|9@aWuNQ1j>4^oRfJ+1Mlv=bZW=J>mZU zS&cxDShP{&C7Z>}0>dxQ98Ihw3Jvd6dM;w*0fHEro*zp%r4tsP_q@>HIB!ZPBg5~d Wx|(Oi!xVu&WAJqKb6Mw<&;$U6sd9Dz literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BB_32_32.png b/navit/xpm/country_BB_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0475cec5453a12f56ca8df3ecabb4aabad4f1d21 GIT binary patch literal 489 zcmVZ3M8YKTW8n{=HWN09 zO=7j-KQOZxNQg8s5S0=J@hhb9tFDPAv~khHKy0d3PsH+Og6_70+yN>T38hpd zPx_d7x646!nWa+J0Fwa^lK~GC^BMp%ql%@&;lKZezY*3h?lZhq);j;!03!n>KL-5y f71#h9U<2L(h&yqw!M{!?00000NkvXXu0mjf*L&T@ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BB_48_48.png b/navit/xpm/country_BB_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..40c79adbe197259889483d7a5e3b105a5906a34d GIT binary patch literal 653 zcmV;80&@L{P)5j5>%AppJt+ef{_O+drxpMI8t2J@akfnQv4viaHM3ed^op(*x(An~#2>iR?c0 zb@wS02mSw#MH#Ie)Vu7xb=u?m&wfL=M=yQ9^W^ufN576=`2i8R_w=`Q+N1vE@9E^A zG=KhMm%rPjKYsB1Hvg;rK5Ca24xC`&!e++Lv{$*ojG*V}0 zV`YRh-hBM~?;k_BGcS22lj$HoTOI}mhLcx+U`jy*{cO4E>L5)8HWeAxi?@GbN?o}1 zQ&pBtO^%JO4q{+na5Uz^>Y$5vemWU*l5H&c4l+<>zxV9-&)@%%1;79N|KRy=12v8T zaFD(#`~Uw8Phb5(7JT~p&;S1n2CC%bFG?Mxqr}e0$nf+vx`P-Q8MKwiOh6Plh@Xc^ zfQR`pY6v}f^;?LKnU{-vV_C@7331be74LhNzPozwCj$e6al%7pCPsc9iYjc193;rg zbox4?C^~oZCj$cmc?C3e9Hghht|ZNBq0KpE%?AbshMW+A6IZ|Ua1LAuEvS`%Fc$Cl z#K6E%5-rHUAV`UU48yifO+_&3AVPqmL=6YQjyzN`hk;rSs!I~4ia88}Fv><9L6q literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BB_8_8.png b/navit/xpm/country_BB_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..0baaba1029df4b5d1ddf59aae311de381604af9e GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`Ho-U3d z5>t~?0#^S&f8fA@39pNOA6at4Sd0e0Q_`bLP+gM{nCd%;8}Lsg~dWr`bS4Fi9hiqx@ki5FdTV1_G{{VLa|aUsxG9#iUaW Tc0d0Jw3fls)z4*}Q$iB}JE1~) literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BB_96_96.png b/navit/xpm/country_BB_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..189b5d69b8bb54258f55cbf005574cf9441aab77 GIT binary patch literal 1408 zcmb7^eKZq#7{`By$(FoaG`o_R$>HwW5Xx&CVv)w(WEgUruoa>g%xgud6xvh>Ifd`&?q#>oi(iI zKj>bOfSGRY0@+(9V`OY(L|}Lo925nOhN#|Gf&7rTjnfAqP{_fQ3lo_Mr)2wc z5|p!tH83}(d1I&-mITzCWuf&?!6ED3vM@EAbysy=>AJkScNDs*MFECSKiuT^r@|k&KtL-sD|sI+p-ch){Z=KNc1aa z7f=v1-je$0=hLz7W=v+pxN2JC#uzTm96>IEi*{^^7p`_nn_Un8(V@`Aod=xC;fda=R#}9$jABnwJ{6@vCG* ziwDNHWT$u7F~|V%-kd#9wnSLyT$!QM(*@l(4>@y|jEcn?i1`gH>q0zRBJk>(ThL_r zeD~|NM=dTyTo%bKheHc=LYfvc@&~gzLxs_8o}5Z8^3Pv>*LXf#3$LWlpG*yqsbD+S zb&VYgg!QytyUa#u6%GW*kXEX%We1vj#RE_5i0OTGCCCf|Yjnj5%pH-s)mlEQ4}c27 zQ5Y8kh(2krb<+(#X)%v-GiKlb3VE2z>i(Eiby=Lu8nzvj#2_ctY&@zE2#HeV5V~)& z51qe_nk&bb6g075wK{oX4@?-R8TL98YBqq!$%uWZ~!o_ zd>S#Ds&GIva%akadF|TQ&3GlI5w6*RXi;*8O22m-rIq_27jD|5rMDNCgBdd&^S1 GXUsn{=6Iq2 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BD.svgz b/navit/xpm/country_BD.svgz new file mode 100644 index 0000000000000000000000000000000000000000..9bf453dc268a00ffa4cdceb81f469f82869406ad GIT binary patch literal 294 zcmV+>0onc^iwFqvCwfQ%17mM>Zgg^aUqVDKb9QF{ZBRi@!!QuMSLz>D+cUM3hKfXS zDuGn)2p(YBj$_r>$T3a&dz^#{5IuQ4J3BMG^#akmH@&8VHHfS3^#3& s^CCkK$+5UkcNfWSm!u#t%%^t}dr=ae=D9_to^INF0cj(~VYdMQ0J!;%fdBvi literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BD_16_16.png b/navit/xpm/country_BD_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..77eabd7d8e82b75b05e820bf7859509c9d52c98d GIT binary patch literal 296 zcmV+@0oVSCP)^}Tu{r?}U1{O4a>BC=j_kS`n zFr4RQ_SWb8#KMTCfSJKm9nR7I@^{ho9}r6=fBon9|9_7Vx``-GN`3yD3CSTb&;M}! z!|MmD4}X!l{D1!IeEEy29#wW1v+0Sut4e;VGE>w;SEIm z7V!QdteKw(H3L`JePSkD;Cx^qtOlnA&)Erk?l~I;7F^^ZY{5ky!bKiVQ%>>`w%~*S z1r}@;W&MLU0Pb)xUEwC|2%IY3vNEm~$5$Oqmu4eqIz9^+7#Mox*ni>h#8Y;r#geR) zT5yAlsalyGQ~Wn0V}cgPH{!AoGlQu*9_cfD%-@(8?LPd4oA!m7FaBTq>L1^@s607*qoM6N<$f_v%7cK`qY literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BD_48_48.png b/navit/xpm/country_BD_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..e96272beb04872c5fd6ecc4fa6de2fefc18c3832 GIT binary patch literal 673 zcmV;S0$%-zP)xK~z|U?btnN6hRaR@V7hrap!q^>nY?+zz~B*4T^;pYN03=HWqeT z2!1stot2~sT1en(D+O&t!BVV@U}3-@2pSN<6Ggq8f|tbOZg+2Yb}X*Dpfm3+8&mAR z+?$#E?ab`%%xG}+G_0rS{~OSs3?xeik|hJlV$iA$`|-6e-Q&yL4TZ;G-eJ{k)|(VNaSKDa@f_0FD!-wUGc1J#9AT{ddP0nf|;6ciT>*vz~y@Q zV8JuRs^2id_0ZWybn8>_j{-ZqxWHkyOq>aT>Y>3vR6qLCViVuHN0#|ofTlhNrAR&; zx`3IQPo7Aspb=l3Yeb5L_qXCxzf=noLFX5{sM&h49+EuDpff*lcYLDBU4`*o9VO6M zhmU$Os$ElvlTFIhRstPf!D)IqM0(bgKzmyh(7twRpz#i+>GAYHm4GrmixCv?BqfkT zdR_oPTH4tBCptXz==r<#NnpO;SMKut<-CoiHHEar~Wk4Ihrd0yH-AGw1(`qS! z-W4cwKSj{15(PBxqz3x1fxSm|lE<{Cn^OY;z>_Vwb^8mKwMj1vRnXl*Gr;uG?IDYx z0d>$fTfbjX{g1g4dtN5)Vi9*;9k!MfUUXc8>FqX6g9FuV?b4pS^lN!@#GWhBH~F}o zYb~#H4UYbOZTfh?ygq7+1lxP`VZ%$;Xqx)5rKqnH1i+mkb8=^nCp&DQoPNA^*u#pM z=dg)`!^ICvpDnX1yL0!pT1on*7cD!dmLvnol7VE&K(hP+)PA;aj3=i#00000NkvXX Hu0mjfPzpI} literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BD_8_8.png b/navit/xpm/country_BD_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..f3a3a50eb029e2345d349541923fa2511d999e5e GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}DmdKI;Vst06H!{W&i*H literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BD_96_96.png b/navit/xpm/country_BD_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..8f00e036607847541f61e006e716e4dbf3cba433 GIT binary patch literal 1321 zcmZ{kdo&XY0LJIBxtlSu=9prsJnD)_x1reD*m7(mq%R0MH;3aPFH7{Ndk} zH9c`VB?4Q?YHs(0M#iX4&xDDEHCy8-{uKVmHs#XWaxBJG__&iAg{)( zX*3^+2a31Wqf84}*kp=ZxtNVww`WhMk3B@OVG!o{5rHXQW`YlB$zb2W?yqh1i}ZPW zGeUcKSL@vAlsZ_iyY_{J(B(<%?ai+j=Zo!LA6^doJlPIuvsAv;C!p(2CptskqJZ=q z<{<)RTO~@r`Rk zt^@A}Hk78erwr-0PlsVgXA9lE7;&P6r2C3;VtQ-SFb;WLy<`1V!WZ}O1NkZdif<6v zbuFRnuRB!!o&zCK%6P*{t3&7dzJG<8e6%?qH>gk(uER|B#n63P{7rj+bI|PKbN(e? zM~k5M8)wI21}647V>6yx^#HGWP9|Gp7@dQRc@g-Qlxxj>0I~H}lokDJd+(@>(@_xn zWaSwl(B!ZO%wcs{W>>qO^7rPNqR(=t5?wDpc)lWUZ$xF`rI2T>7xzE7_ri9|?%7pg zXPllmNC2IxZl-Qa&eg)8x$X3(irO&qql(zCOfEy}rDZf*MZEji_a4pPZXvkw8td!U_``21<94jgl}@(rVM~#FT#w$yIVr4$urhCac%H7n3Bc3x|#(B#a%u+Xk<3 zOmJRZ)EuBZW?5W*-k@aBTxqA{PD@}l)G74xiG?cw18;s*NCESVh;_h%2OCtE4vPXI z;|z`K$o}x>GF_zgEFepxU<2Zv86WkuGGG;<9qV>t%E0lA`b^dmI^kPtv-HS< zLceo*&?^a#j&-rkdS}s5u8N1WC0SE5<1e~I8tF()?9w^JextrM7gD1ad&W{%S4g5>o0o(%*xGR}bfSSiq14}CN1FJQi|uCz zhNC0TCOMmlu4xUp&N5 a^}0%*gmyB&y3Ta-`v62d30I2^Wd0BFQejj8 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BE.svgz b/navit/xpm/country_BE.svgz new file mode 100644 index 0000000000000000000000000000000000000000..be47fcbc294ae6854f3e30a96270e45ad79c89d7 GIT binary patch literal 304 zcmV-00nh#)iwFqwCwfQ%17mM>Zgg^aUqVGLb9QF{ZIE9}!!Q&_pB?NwT(8gTO`LeRMTo_1@eR;C|f$IZ6$EM zx)}@+T3=XM7-yA0>u@~k_ww`E!*unsoI|^-V7Z>$-A(}qM9BDtx@@VNQk-@ebvn)y=_ST1QQigGR{X=KjIp>!2wM7D z;1%oYYo)8&3%rbvomOGu_5v9&$RLeU0LU9vdeBnfn<>io*VZ?Bs}MHY7=afoqCd{; zU`&yY@lR!p3&;FsBMVmkD$>6S=wkS(s8RC7lJQ}72;s+;@0>jTz~~F+N&maY0RR9Z C@|lMK literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BE_16_16.png b/navit/xpm/country_BE_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..7747a441759d05e1e4e746c0864bd8cf6419094d GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`Yo-U3d z8WWRK99UPY7q(PvIIy$++vh(kraOckIO3oran)c|;)@IhhEBY>NM;c+Z$b+N3; QGoV2Xp00i_>zopr0CCkTlmGw# literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BE_48_48.png b/navit/xpm/country_BE_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..19ff3741edf1ea8efe3572350d192afe9dc3320c GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HZgg^aUqVJMb9QF{ol?n8!!QuNBk>QzAf#5xVu!Xg zRZJzeD;&y!V@RCD!nLc!H0AHfN?NrC)RX6p=PhG7Snk#mwmdI{Rt%{_5V(qTEL6(y zef46`ae04v5nMgJKCV9Ao}t*LHLeaQMQk#LKB-6<7ine~&T6m~ynN6*hPDs(4CoxF zhfq1Gf?;ONX5qSJSvuvdqx01D2qA7I*o`c9QmC&}gVgtZx4FeC0{{d$j||jCQ*wjw z(-&PbN@~zYYf&PkWO&UJ@6(IXJ*jh&KHXyz;`53B$4>ix62+9x5KJDbBGLJpVG)Ir zkGyf0xE&WU!$>PWG^_ST%b!%M=F;RMRH@_$8!eQno{d-ph(*DfTJ*r6DP?H*h*&lq zL#|B?=zQGgYvsQS4$a#wvYaPX*umo{u1zgEMi}^kn-2AnQnSjwN|)izI~4gh(LS3= YCzEqM52)?Jf!lufUyr+2P$vTb09{hFOaK4? literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BF_16_16.png b/navit/xpm/country_BF_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..8a1ccbf44a72867c822ca4e25d03b1d454388a62 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^-o-U3d z8WWRi)~`M7z?Gon`8D9uffL{7PyBArDHTytx9P>dLwc>QC%&<}-%@8|Yx{qurk<~O z!D%kB(+RICKmTW9K3p$oEXroAl#`HQh&0HKJ7Zx&>l@-G7IW*l@64NfGqM_vsZ*xb=?Rbk39t{q1Z<|{ zLn2z=PTTFp>?q;3f2QxINi(_`g}EI)6?!=|-{>-Rwf6R!O|xt2-MjKDYt9?pFS1)c zFmCbWQfysvB6ag>&$Q>;CrQk1oY~lM=4DwTfBOHMlGDC!+xBt#gKoYbz1%?$n?iOd zi0XN?!kA@EdrS|W-Y7bC>4IMtf%4ITH#r}f9?TBbUezMny`oSZQI14l!>Si*suLKBbtFk5YId{?2V;@f3$+ltNAEAR3%bO^?ZZ4D3j zzql_xC~&h!(!X^MS7JKjC*O){o6Y>Tol!=Nt^BGOGo!+W#bI9;&NmmFmG^sjU|X#| zKeKJ$G~U)_j@B~^-Wk~%iOgbq`?QT=-L9vvzY8_|jY-fjv2B;S`CwnXMSV2;hL`?Q zI~Ojzkm1Dh!e{dFw_J=YbGB&D^}O^U#pG71r2n#+Z@O;I2p3kGWHaU0`^+sViDwS~ zl>Faw`SJXJ3nGuOt}JlWikZMAzT^;;*`+VKB02MYgSQAUei%Gm{an^LB{Ts5wSLC7 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BF_8_8.png b/navit/xpm/country_BF_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..b2bfc65a4d687fde3f67f144cbd05043972c1722 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_bYPZ!4! zj+x0d>(`!c;5A4Tb)A~<>->Qp-zMFE#?^1!Ev8RQoTuJ$RqgK=duHda!I>qT9rx-D iWOWMm7AP{UV`30o!gD3xe8O#@Sqz@8elF{r5}E+(G%fr9 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BF_96_96.png b/navit/xpm/country_BF_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..d286895e38b3761484fa76a3ce37356ee2dc8177 GIT binary patch literal 876 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlJ86+K-X zLn`LHy?xeCI8o%-N8|TC*$Z1mRJz(6erVMlVG&!TchDut$!QPcwR_FpqVJsa4tf_f zdY5YmsvL1qZF6AgHf}w4=5C2P(Gs~A(x9Wy1 z$qEgP3~Wpi90_DI8cJA;s-251FU?!zc#5f4zVfmAtzZ+6aD`wl-<7LuU77u>8`$1C zXoOXFxMgystl25j8DSWf_y8XPMl)hAD@e@ z3w-P!w;@8L_po0&@1}hp=a;!g*I(7R_32M~?6vEXp}7;cr3Oc89J5Yns5l-X*0pVo z*>Yulxvah0JMNqajqBaJ|Apy(_AS!8g0ruOY42=VZsq;cWPjAjvw2gJZl}ELU2D8M z@X}i4SB)-DVkcx*1xj@9`8xHrhZK|Vmf!O(KT(_T{6=S){m;s}h4L@_{{6PMnJV$u zVe<3v89D|0LOW;MugTYc`%UNVw=4hmgj?i%>vGY&U$l4D%5SOJ=H_wl#O3SXh)-N3 zZKw6F+avzj4)fr@QMo^hPu4Hl!+zJ!cHgwqvY%%+Pqdh50i@RRbF26Nf5_m|Rj@z3nQJK~`n?&;3?|q5V%svwOch#AxI|J8#-#2fyj=b2tA3s0; zOVs~#tzU0P-y0L{89YzZgg^aUqVMNb9QF{osv;c!Y~lW-%0om=lPI#R0b}KpaJh(F?EM?G0Tf#$SX)ZGGyj}X@adZhIN@?~+ z27>D=2pQ{v2h&%PmM{?}BRz#}MZGB6EdX%y=$d0`?Y!^%P1AImZl^MZ?~0l4T)4OO zmrCmQ-^@WA$Nnb!W&d`=jnc@>mK=L*doD>9rRCV&2{Pk&`=JV9q=2y!1rFAFVkos6 z1GvSkl-o%zmFl18d5&9s$&u~i)j|A|xu*tuY0Yg)Y00%Wa!v^T-(be#D7rtwK4^S0 ny)Z-?o=&5WqA&`=BlPeebmM;1Av;+=x|`t>!josIs{#N3&+es6 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BG_16_16.png b/navit/xpm/country_BG_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..00fcf7ded7c7d8884fd510dfbab921a2b3e37dd2 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_Zo-U3d z7QM-T{{R19&&I_dtU9Z`lTl~Y=_tQ|lmm17*XwE+COkOY@X4WPUq$mGhm<|b)J$eg b(PUxhxWUKByQ;7fXb6L+tDnm{r-UW|@f$0( literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BG_32_32.png b/navit/xpm/country_BG_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c977e3657c370f66ebfd93803aa814dd421424f2 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v}}{PZ!6K zh}Psk|NsB5Z)0TfVb1)yg4s>h;8jB)y8#ev@Yz@M;)sJ)!^Fg>dl`W?An_ingcR$B y!sRRfd}J&=U~0PX;-ZQxjEngsN)MbUV_@jH!^__?$(9FbJcFmJpUXO@geCw}eK$k^ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BG_48_48.png b/navit/xpm/country_BG_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..41b5df6ceff0492ef27eb654c8f5cc277a536b1e GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HLV#(}2QKvsPRHk7c3o`yLhyyiOiQboR~hTs1e-e?k0>Mw7*1w$6W{_oN^BD?&acYbvBf$CtO6(i((r`YdmC$RdS8nd&@u*3S3j3^P6u1^{Qv*Ip3SC#bG`~Q5S)H;y4~+V@PQKsy8TAl66Lc_$sb?+VAd>w)G!8yix+tA UtBSGz25M*UboFyt=akR{0I?A$(f|Me literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BG_96_96.png b/navit/xpm/country_BG_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..8fcb9d2c6f9c678caba1ba040e37cd7cc50b42e0 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt`7JzX3_ zD(1YsD(%ADU@b@-YMvFb4lH~4ow|7+XYO5&|VGvXmD_a4@>^Iz?$1A3Xk)78&q Iol`;+0C{ax7XSbN literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BH.svgz b/navit/xpm/country_BH.svgz new file mode 100644 index 0000000000000000000000000000000000000000..5b0cce6622349e48ecf979a4953046a9f87c6f86 GIT binary patch literal 346 zcmV-g0j2&QiwFqvCwfQ%17mM>Zgg^aUqVPOb9QF{g^*uQ!Y~xY-%0om*Xt{;?HCIX z1_^&8CPqm_jgNI3Tf=OZt}^`gwkr=lkl2Tt{BBRrJ-4&P`Ky9ct{b6bf-Im2jo~um zm6CaaQsH9W@6B%3&#V2%ZUfD!fZglz@nHpcN67ndMaX);hL^W3uz(S=c|yR_n0iV` z+qOYF43sX&R`a?PX+x}#IH7$+tQliLW-@d$oV86Oo8-#-kW%XO=q1y0CFJp%kWD5N z(%s_Uy%_d;U{5PDQ`&~LLnw1mlqSL0fyffPuXq9K083tKE@T%==c$2%sHy~S)10v| z#(!LNp1~(ikA+s>GD9HFrdHKYq2$G>ErrPuY9*wx`_ci0aO7%4=^*yNLXT|hIgC6H sspnzrISQ%W&2^%&?~Ed^u!*3nK36vsYOc*Cll##5FQvKu?E?Y;0G`| z+T2ZdwfR@`{ohf@-k+u8_p9pHpT9qBlIDJS{`PnHWw8klmZbacl{b5*aMlw@R)j=! ztEbGo@ZmdKI;Vst02BUtVgLXD literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BH_32_32.png b/navit/xpm/country_BH_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..91baa0109ea7aed1507ec2d415f25c215912981e GIT binary patch literal 520 zcmV+j0{8uiP)fi~ zP+~d*o;VQjaplz2qR?~({Hf^w-@mV>%zM!>`QOi1_p+| zA3i0p*QG2mk;s?dCCRSB4q@0000< KMNUMnLSTYkrTg*# literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BH_48_48.png b/navit/xpm/country_BH_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..f2906caced7dd04cc662a3cde8f8a5a0a3aa2a9b GIT binary patch literal 663 zcmV;I0%-k-P)lh&A?VP5Q0HU~Dal4njLcdI zjNP@98{);qi%Sp+g%F8ovVw%r2V@a{72*MZtMbg}(Y77zf?AgpF{#^ih2Y)JuPad-FCN6*}y zU0FZ?KwCj|=A-d?nzn+DgQ6T^0f2a3XC3VbH#K$z2!P`0MqW^C-N*$p-+eGs8H^?T zZ@3oqjeB>l-Ri}ru<&ks8iv(O&U}+5zApuc#oIen`<`DEcVqzp{-~ro!bWN8v(I0T z9`;Ld*$~){{$vdG9!&t`d|J_;z6?$*JPmMyV!L1j&NXCAOvj@E{#_Qsb*C5z;`-x+ zdkA|}QHl|DR8fkt>t@gOySEcpyF0Fd2uIlFv7z;koUeYz(10k&n#=zgn+j{^NE+Y= xwTz1Pc%=5_8y8vdpzUujAvM+nq^hV z_g?#*=Lei49i7G8GajFCU6(;ny#C`s=*xy$22pDtPCy037_*h4+&`+u6HtQf0AxVN zsPTl{KWZyQSlLzq9}x3bl~4jY#vfHe42b!nO1J?XBXpH00%9Upi723BM642NK#Vaf zolSo5iIvGwnl{5pN;6|)YxmR71xkl8c8bQvty`I~3;9b|UCX9%gn}X<{m~}x3>uqB z0xxiI1A0-M=^58(U7?8gHga?Ag);6960Vn~vW<3+VD0Fc=-~-avA4?s<+S46y z<(2>$ke`a<0Tz({a6{?{){@Vl1lt6#2gUNeKh3>;D7E$h^3E$}8AL zNFW9zba6be0#a`-$bF-BLDb@Szz1X>9?5+X(Tn2&9FY3cuX6vWT{wi5Z6RO*iTnGF zmjm{om_GlV|I%Twr-m9&$bAv}@CZt<9RR+??82ek7g2960BW`tlw;LTRl>UF?Sdlr zM%15w!w{zgckWQ*3AuN~E~_9;eNYLVVU|aXhdB61_Mc2m$$`I3Bv^NjX2L6Z;#R9Rf+ zU7@<1rm+JAJs_v5rv{_K6~_ZNAnpE&6bRON3e^P_tbjx>jt5FW+R~~N2-c+o3~^$B z19EgD6&~|JaXcUc(jNTH10nM{2h?miU;$;ny_}tx66<5RR{`uv`i+myy!Ou9P-^W1 z=q=_r%C#G*@R+0f=fwv6v1&f&ygRHdt-{K-3Y=@+b(OjK)L_)9>hR*UAkH1;zRbJB z+Wi$IeHxJWAn~h2F__hPig$-Ai_6$X7*H*W$5k2{ceE;n9UP>SYh6zBu5e}X0hwd- zkpJ0jCYOBwV}bt8m2i`GU1c`*-@9i7N{5k6uJu%gcMVqVEz#Hkf*+9UDs%Jc;fY2? zL-#@eHy|sW=pSRoqJi$`L^*>00000NkvXX Hu0mjft*3t; literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BI.svgz b/navit/xpm/country_BI.svgz new file mode 100644 index 0000000000000000000000000000000000000000..7750db3cc19217e84ce03fdb9cea84e383ca230f GIT binary patch literal 632 zcmV-;0*Cz{iwFq#CwfQ%17mM>Zgg^aUqVSPb9QF{tyN8Ln?Mk~SL%P5ZWPIujM>Gd zwJk`bwz;)x4!QJ5U<|9Q!CE%P$*=D$U<0hjxWd0Dc%$Uv6b*rkHRji-YukoQ z6&W1yi6i(JbYZMFH-9`t8W zU?X+FsU!Oi10;d>{wz9=w6*KfN7_f(WRw92GG*1AqR+8#}aomR(o4B4Yr zqluvmu@|u} zAxBI~Fa_KrZ0PoqC8{Twdzbr1`(>#{%$q{Gty=6OaoY)gi@4C-4%7L2>ikwv=e4Mf S`hnYg%l-mrcG=DY2LJ$R1w>T< literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BI_16_16.png b/navit/xpm/country_BI_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..8799a46b4ef7e82ff576eaf4613b0b9dfaf5af9e GIT binary patch literal 567 zcmV-70?7S|P)YN%?v9EJ zCo{6K5>&nS)lufdPPY`f<@61mxlQyxY~1<(&mT0^OdK4_%ct|X*lm2aJNtYsGhdX< zu9t@tx#je99k`A4K5X2{z{Dt$5W!`r^Zn{gCRR43Wz%>atT#T}U3jtS@Be=+3=9l^ z|Nkqv*vP=Z;OF3?v~1en&tF;Htr!>>cumfip7#NUMGcYhP%5AlRJC~V}X{YUCRUU=&*A6l;F&b*v-Trdl{cs#yHNpnC zJvTq!Rpn7I)Ut<&-28kGSv3O#0~1=9Ff%ew%lE(b=-kx@XQvkiFfpPlK;d&Rv+MG! ztL(V*`uV*#&+n>izpcx!!NJUq5+`s!a4@saG48Y#G5z)L4;vE;0|Ntuarn*Yl(XeO z{{BR<0j~P}+AZI_->upF|Ns9(uTQD%aAe&3 z@~D%T75)T^ocI|3|Njqh$^XB9v8smZVP=+}(Ipt{0|3Y6?JsMCmIwd<002ovPDHLk FV1jlACQ<+Z literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BI_32_32.png b/navit/xpm/country_BI_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..778b6bb4785bcd6e936753c48cbb0ce995283e14 GIT binary patch literal 820 zcmV-41Izr0P)O9ZyoX_X?{GN01BTA(bfZTF4=)RDPFxZWtEVT3GQ>v{M0J&MRnq9t0joqr8uCZHP zzDb@AfQ)Xi{F9nCI-WnKEVL3jWuYA}#?`cuPa|oT?0a`PlnQSyE9*nD_h2gA_x=(Y z&;IV8zalu)w9z>=u>*(3Zgoyg2zw8v!u|7}M0Sk?pxjZ74q?bj95VDRK}`o`q3zGc zI@mx58?ZllK((5-LkB>#O?Qj8vrn_vd;GpbZ{t&ri3Qz*r5xv)nG`4ha#3dS%mAs? z$kQtbDmu8tn(puc01L721VOl3_5(VPJ98I6GXF=BAXCTyP}Qk*X%tuDe6hgB8`hzw zbO1K;nVk!4I`gfA*8vzTPJd66{cIm!Z+D;bpJ+1Db^x~z-L&bl<^ZeaLZM(MS^ zXVcSq+rm4=ge@=n7-V`06Wu%%2Cg<>@YCyTm ztTq|ZfNI-YXELY(0FpUYqHIscXHBhfWTTjd`uwAZbN1B|&aM2!J&^FGH2{E0d-iPn zgLdateN*$flYB&(#H+$Y>-)<+y>f>3c}qS!V=pb1Gkj?3{)cCjzdxoluyKTvVPu@# zM-F|&H8qk|EIrQd^WN5kBdHGZLsAIL~ z#_i&j>WaN<{pQk$T(^adXh5~?HAC}Rpp25@os}b8SM~k#U&y;jj^9QvBShBid|8zju=wWf z_l#=*fXZB=i2m^KBL85UBVU!@_tYy0(8l@&E^JBz#-}V96e1sU-LTa7v;1PWU_YvplvQw_2xjT7+lm?ADT(yVGa~ojV3>^LTo7f*R|6p zLhQ7%AjD2zJAGn!>2FqusV=bu6ctzu7yxFth56d%{g>u`Xl+s!{Mg#G|I*w{?U4m; z2>>K4MFrMEkbuQ`E(`$W&QjNkh%kt5T3I0FIuQnX89(7H27ozkQN)skAb){3x$Q?H z|HND*ARw0_$^!Hth7m+_(CErI02FL_)L-DW3gj>Fp07Te-1g)U{q4M2wP2z5Fvh{;V@AYJJ z6DExlqY+K&dXl95by<8}PILylCwf1S)G#>U3h zRvj;I=u@$2%4QXVsf|Fe@b$Z#b3j330|NsG5g=huu&KZ(N5?lYA?e5I15@Aflyh@4 zGcz|gHi$Xza=B36I4#4Ejm@o%|Ns74`@ipmo*(VME*ZhYvPB{-+pMPg?W_}DKYbQ& z`~P23V#d!(%ja+A{MLOMWh?%;yWD@@-tT809C_w@5a?)ThWIPNXHFKingYGg;OXk; Jvd$@?2>?0cgSG$w literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BI_96_96.png b/navit/xpm/country_BI_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..8dbda2cb9fb12a90fed429a798647aec9be66313 GIT binary patch literal 2339 zcmV+;3EcLHP)eIyxR2n9Tu*bNTD(9jZ?$v9=EhJ=Y>LcqpP z*%)VR`6XmYchcSUk0Z8TC+*$ss_6LsW$AW*D}T7xN-IoBk_0i~28MbYw(=vRv6~DT z)=}g<(QH{<7Q2ax3j_fC$Y^iFR&HR3@N4`3$FjK0d7_zh6vf?2D|JhNYNRCAfdoKs z2N)&Qfy6*yXd@IIND2f7HA2(@6d*915xNcl&_li(DD7BBQDxgf#G?~*7LE8iOg+G}B9nb&-`iz)Gg%vIP=uDg1LFuf_iq`$i!UFkWYIHyw5a=)} zef76YpY{g#{&ld;wCZ0|2I+CrY*T^a=idecryduKoo&aw9h{O{3BqZ zUwq-c1Z^Zyq!JdHi+&x@4+LtB;>G0~xj20#AaLB4T|k5N?UyYkOHJ;*HtO{&}S6nIZFIuDVGF6KA@op zb{)VA1Uig{4;%`AI28F1B_wnJI}m6xx;%5u6ZD>Z*cviH$OI?rt)7tgs;3vd0wEp1 zbrp+^x_Q6I`vop229GtYl>i<)@c~0K872!$vnbuk=>UM4L{a!+KSDHOX;!wl{;m6f zqU@G@^nr-#fS##F(#Ug>#*#-eOjg7$(?vGNmul`=;6!Xc!B0K<-|ggdfZQG=$IVTC z>gir>e-N?#HyrC!)xR`-m8cGo1_FT63>AygSej8)yu?O)#T)*sSVVP-Rt2Os2$ zR+EKjeX>AmuSyzXLA%@59I`+OGR=DkHO3pVK)e`K+O(_lC7*!wp2n=;-_`k&(pFC7 zwY)OqkOks|_^&=7a8<9IJ~PseQsm5Vd(|ta0|KX1O7qJ@3E4a8Nq#!&nZeoXH$$@> zV;AZ={6~-NuXt*)APF_O_r~phar%mhGMzoXZ__z{bAQ{a!WG%(%)2v7B8CXgkb3n1 zKzuI7M^BXgG5k+k)7}hDvIeB}Z*+b5e&Z+Wi~s(!Q*pch?Qqkw_eaqL!6y=gD&6k7|Up6~U#{6e5(?85zD``x?0xaY|q{vjv^m*w3b zx5y_`ml>KleDGI~{ps4}_T8%rzhX04E3?X@n%xMDZ8^8YDln4`^~pzPJN(xL;#q6?~MCUOHacOQf8zPNP|vj+zkM(AOD&g9M(1{*Y6tI`5OQT zjk{B3qyd0K%mshwF27 z*KZ!*-z*7&QX45GjO{(rUB8*@cPX_YZG<{m#j6t@EMMw17uc I-AzTDzxePKyLY zPA5FHEyH|Q9sq&U@n6b)ny9XVKxB7lsfBS*i{Jdp8pN$Bk6$3V=Xz5 z!F1%H8zliUq>da!qeMUk){%o^qzGhq9XUyj;sf0wI&u;l{SSWeQjJkPtv~<(002ov JPDHLkV1j;Za}fXl literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BJ.svgz b/navit/xpm/country_BJ.svgz new file mode 100644 index 0000000000000000000000000000000000000000..86bcd5d3a5531e18699009a5ae0fb17975e742c3 GIT binary patch literal 299 zcmV+`0o48Zgg^aUqVVQb9QF{ozT%r!!Q&E;QPVe;ds2ZC)wDX z(r&PJ4ngM7sqC^eX&Z>?Xu~?+-o#cI%q#D5$oaqgBwU<6H5_H#sLDjh1BTGp)QD79 zMn-5VT+D}q@G5zZcl+%MnqvXmx8>7g40uEIF^-9nT>`J~Yv2JVT5S-90{|?oJ=_zu zZ5y=XpsEX6*Xf~DSwn7_{IUy@133?b73kmbylZ5d=#Tt}G3NL2yf8;-m9V8dPnc_8 zN>!BBP0UY9MEIc70;(LA(kSC!fv}dD{f$j8Q@PSQ!fVE6w-eqW>sm_VE~FL+bb;KR xBR@S(z1&-QCODsV)?R8|wg17s`ngBtjPsG`&=)Dr#n6A${2MxE7J1(R008p=mVp2O literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BJ_16_16.png b/navit/xpm/country_BJ_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d77ff6fa8f49e779374c6f85dd599923be2a83cc GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`Uo-U3d z7QM+S8T^0FH?Ypxu&d&R%Y$xRGs~0%E*=M0FghP(5Q`C#H)@f*x97pKz1(iR5h;8jB)`vmR?kE89?(HJYD@<);T3K0RRe!G_C*u literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BJ_48_48.png b/navit/xpm/country_BJ_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..2ae7f63b55808d2dd3c5c8313b098bb5fe4376d0 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}}hPZ!6K zjK;S&HgYyN@HkuyUbnf7U47$*Vy*CEmgyTdSP8gDByZU0?&NsYl7kCy(Iv6*kF`Q+X#c0Bu0TDPo@$k2m{!e+TjYEI_WyPw*xZxWE YOA%Lt;lfx~pi3A$UHx3vIVCg!0KU6LjQ{`u literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BJ_8_8.png b/navit/xpm/country_BJ_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..a38013674261eb6dedf51b045ee3063ec1f2ff32 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt@zo-U3d z5>t~?GWh?TXJD1T>v!it+RxPo8(3yYa4?(_-Jno>ud36i=KoiDS4P=83=I1MxeT=D SUi=Ew%i!ti=d#Wzp$Py3b|%mO literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BJ_96_96.png b/navit/xpm/country_BJ_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..9f77117d702c0a178059ad5c666fee96d0ea6d33 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlHo#XMac zLn`LHy}XgvF_EG5;`|pTLaSG(R#$|p_1{c~pG7MBj1T(myK{BNoM#`K z^N#=ix}n;?>iDH=RR{KKGlVg$VTfSdz?8sxfU7~2f$9QgRR_%1f3CBUkG4%Nw57iJ c7>>3()5`hokgMxSV3;v@y85}Sb4q9e094s*00000 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BL.svgz b/navit/xpm/country_BL.svgz new file mode 100644 index 0000000000000000000000000000000000000000..46b7fff94db400b3d08b9a6ca4728d394164b8c8 GIT binary patch literal 273 zcmV+s0q*`EiwFoTD0)Z&17mM>Zgg^aUqVbSb9QF{b&pYN!Y~wtpVwcJ-94L|v?5cQ z%GRn3h7+caJ(f0Y0$nOiX7%4MeH*KLyzqVJ+!HS^Uky3S&g#|(;FJN8rf5rTY60J_ znmhurE;nV~v_=ZJN(;**i0`wvbpN?q5qqx5?(qEjk`kC8encr^w$I4>aYH!eh^s9S zP|lqeh<)GFKB8?`QmDk1(taQ^X9vBPRd=24m)78&qol`;+0BOfBKmY&$ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BL_48_48.png b/navit/xpm/country_BL_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..9e58d71e8caa5c581447351d90319a0061ac6a9d GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@He#gTe~DWM4f#GpQ# literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BL_8_8.png b/navit/xpm/country_BL_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0d7704f2c7883e60aa96b1a6b724a15a82810d GIT binary patch literal 115 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BM_16_16.png b/navit/xpm/country_BM_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..7c26c9a6158e6681665e1ebd88bd7720eb9ba98e GIT binary patch literal 463 zcmV;=0WkiFP)z<^yMns53`%N}g>Ir1XSmHSY{064(4FdxMi--t>`|aF01_p+AA|ij-*%=rZn1B8hhA6;g5(H?> znsw*Rn>V*^S=!jV3!PBFL(e`R3!+I{y?ht;1uH{L;{U%YvH>BX)8tSomPJ?3R# zU|?Wis#1G1F19>P(R?;aOC}A?q~denVFBuzceC7gVL^RD_tcS ze*OvC`kE*k>>hl5bMYnf&;QPMzd}R^cp4Khk*J<@4FLRLmKFvQ8-)M>002ovPDHLk FV1fxT-Shwe literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BM_32_32.png b/navit/xpm/country_BM_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..82f0540fcac06c698868f77efacf17e5adbe614b GIT binary patch literal 1054 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BN_16_16.png b/navit/xpm/country_BN_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b5cf162a8a22aa4e609a0d059d801aec9e925848 GIT binary patch literal 505 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BN_8_8.png b/navit/xpm/country_BN_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..f97f5d06a5a89f62d0f070cddafdfd08ee6a07f6 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}~{o-U3d z95a*u{Jit~{&`~_iH48=fuR2W-`}Y}*KhZ(tN(rA9RJjWuxY;+EPQNML%%{O>ec=W<)YmxV($`;z2`q7DIu|L{@?m-)1RLFyMOY${epo>-u@pOy$lQt_S`!3 vY4*$iC;!Jk*ZaTk{R#aR79)$wcjgQm5BM8!g(#*19nRqC>gTe~DWM4f7T0&D literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BN_96_96.png b/navit/xpm/country_BN_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..461fe06db43de688dca5adf0b5d81cb8546bba5a GIT binary patch literal 4103 zcmV+i5cuzjP)<<0RHbLd%YgY)XJ25OxCzB!MJkUut>vmV58~ zQK6DZLY7*Rfqed|dhg!*e)X;UzVCN`?^PkSJQ;@R89dkl40VPD>V;u}dSO_gUKkdr z7ck;d2Rnu#4PuN?|98aw3Grub2yuTxyk7uQqa4$aqDO(+p>4#w%4}QC%!+7*G_>eVpmyk0 zYvg?tsGY0O$onTyJ6DsD4@jVkTn$DZl0fZT(MBE)f!et;jXaD3wG)bwZ+w$k6X50r zD7+zsLiktnh|lC5uSl+9A#pjDruM6^{gf!262cx*C`7E>fke)7x0v#knEEwmdlZn; zmrgBdhBwuSR7e9N;`JabUMIxABfAa@&c%q&ynJIvCOdta`2Ar%>q8-01v4DO*`Jis z_lU`>ILqAtT(_-s1E%eDYLtzLB^g+R0;*pb>!!SMfk&iNlNJc&+z9j%Sx%0cYBPZR&@au+k z&zT0_D?J%`l;M!EFK^WK_L!u>jiY@1=HwkkS)AzNgm{KL`QuW@O~Xn7AM-fk(wSKW zv|&&J!@qrVvnyl#?3+{8e)&7b2F)62LsPj`D7OgZicoG9X?Rhm8-UY`al2WZQDP3%oK|?+7r9->+RJx`MlBRVg8%?R$o4N*OJ~nhtAaCKGw=CnUwTEM zM&5h2nwY>p{>Y6_|J&QwWZxK}Aj*y$+wq&1#vUv=mK-ZF$Y^LSE6AVw-a9ESSD*Sv zvPRz5bRJ`vH6!`iXa4o>2VO=fY{>y*Y}3*Y^gsP2tG4AwyG~`Lq%Qi^%zx^~X h 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 FV1n5j*LDB^ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BO.svgz b/navit/xpm/country_BO.svgz new file mode 100644 index 0000000000000000000000000000000000000000..2a814f56e283ad17396a70a1a8b36328482a4b78 GIT binary patch literal 848 zcmV-W1F!raiwFqzCwfQ%17mM>Zgg^aUqVkVb9QF{l~i4e<2Dq1-uwzz^H^-zPBNLe zaTeMz(AVykLKzqo={ixzmW-v0C;RJr7C)j9Y3NW0H(Mee;qWu#UqiGq-L zptu%Nol^4m*GK<>c*Zg%SgsYML}~JQzu1}A)57ySbXF!2JSAsq%Y@SMQssfJPE>FT zITWC*p-~V~GSc}-ui+R}VDzQp(716vWmX~^sdXLH%Z3zfw_6&&~__~xoCd-IjK zo48_ubFOh1h7_@p`D3ia;7CgR4fOsXXsgfA4*~_29=;w1&<_J)#UzYWFNU)c-ev6% zo7{>OU`ocp(EhyfKZ87-ZAv!lu(4|?>=`!}g{?i=VbmN*krM17j-%G@Yf1)Y7%bzK z+9jGot95YWCp34(rQ|VZr)Ql#|E_cSDp}A^Y6zn*w!GM9c(b6|c-Yyb%?5UE!Mhfx znU2h0razLWgXWh;MjndL`vTUYG|kh$x?<|-0OrN&lI+oaSAb=LS>{5u?e`~f9IqM< zvQRO}Ux&xmLYwpCA6>n4CVq~Ae1&+-+orN8Kx<~<5=YV^4 z6N)BKg_&j%ef$r&oyU&45>O49q8otgTvsW%yKlY@a<%n9)_i1~q?6=rGvBl>To>yw zc40QRIDf+luEP(2p{)fe1GvNt90RYGUd7`v@$_0UnGhKue{T&vuLB!WadR!e6nY0 zyiDfc;lEU#J%d+Xj=AKX&;^rf;rn}cBXNaoc}UK2^5P+aupdsZ!+4nD?aSA;<)UC) zy_>Pu9QEKLCU+d7D8B#A8Ga{-WSGu}^w|dDX!R56uTywZ%Vw^YY%A`gAFd?~H*6_> au9o%OT((V$oqM+Si~j+=nyfDN2LJ%zK(TEA literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BO_16_16.png b/navit/xpm/country_BO_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..32377f3177492f35eaeeb41b8959512afcfe11e3 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^;o-U3d z7QM+f>MOp@Z)7^)()lbgiQ)0{yF$k`jUGHV-8fN>TPHZ5bIyVz3~p^&wFVdQ&MBb@03>54{r~^~ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BO_32_32.png b/navit/xpm/country_BO_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..2ddc365b73ab083be05a2ec0a35ca28ffe6a0ef9 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v}~CPZ!6K zh}L8q^%dXdCo(Wzc8Icj)ey+uW0i1)kp~ELoDSOi^DJSOsE-qt*6nhaH2_QJuy4r7 w4UxI9XvWib>1N%HB?lVZ53XQ#gGe(lXusiBZAnoz0$Rb~>FVdQ&MBb@0BCD5`Tzg` literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BO_48_48.png b/navit/xpm/country_BO_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..5500e9ff187132c1121e5c2495c022673fb04de7 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HA5z~thm|BvqF)C<4=S!?E&7Y+8!9gas7k^~Gp zBwTouzRp(Ol{op`1SBE0iHq&aOAf2uRYXzAy+M;j*7(jwU!a8yp00i_>zopr09e*L A+5i9m literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BO_8_8.png b/navit/xpm/country_BO_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..2c45a0c041ce6595949416da3046559207dd2884 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^eo-U3d z5>u0H)K`3)&&Z!}Nd4piAW#zd^O?ntwa0#aXJAI_H8um{=Q|92|+|wtoC;lb#Zgg^aUqVtYb9QF{#aUZV+ej3CF4F#oSyw9+$&Tmd zTa~mbfkL&gAfT-F3Au@rc-OHb#{tT(-!n6|laLumSfqV%=5o$=E_2T3F?2saOfz(s zl=HO6dluV($kPkY^856}D8e_b4*`P~>@d_Oq-)<>4(x_`31 z>mFVoqN|%@L^{NEkN&WbHL0rEN7uc-zwg|$PEn5C<1(I2(!tyXL01TZk_%vjbcWT? z0uurmoXO`sjXK2`3vo+{e0<2#{2!eliK57ryB4}nht;HK1r*O7EHp{d@uccm9_C_t zmnQcI#Y4|>D8U#xga;ULu!CsCF*x+DTcuT&eEOQjV^oaLK^Z@$S=Uvod$2!DMstvR z*PX@H1f|2Cb#5Veo*`^w6eC7Dp3OXj-~iitDTnK(hyJw(g$giQAmd; zevV zF^-H~Bxi!a6Uaqm!>>|+v2YKt{3kn3y>+4h(Bm@+YrQ{OIlT$;nRJo?2BC5o!YWs; z%goec4iY|Yg|RSJm2o~F73H*N$zc{($p;zL{!^=G8#zC3 z#?!kxxv~rb<&W?$fT_%c%&dz4vFRzdF<@vu;0Gb$2y;DaQDz_B3orH?{W2L;2sp{J z&`)3{=CvdS`Sq3@M(|S&N;;cLAl9nDvc6}pnj<1!CxC3jY4qC(@sJ}rNyJL(-#%1h zvjkF5YJ`I@YE&Xo3H@fu7|20V0hr4XmdiYnNMZ`JfItgNeq{0q+EflG825ds6s077 z&?(eVr=9idnI{X-m%|ABuLod4_){-(3F8Gqv7KS%iDWzpDJ#I?fK?A6xzduFiGZX{ zRf$4Xm5eMMp{XM7sAN8_RpPvg%eolV!l1~LwhD{v=eWq_dR3-zKF$&g&5AUy;H{|2 zo*=*_28Iz`v5(545)%?Ob)~7qCHxA|d=O_qQ^Y21MXGAi07$=Am20a3ZFRTSabBZD zIDdturB>4jLbo{?$m<%6JgvLV_ z6>tU}aVmO(z*_}qVY%YSCDnS}L0S$n6{{Myh%_X=4?dP~ORNcU{T(4DwN9I}^+Hpd zDkV$yUk&3&oDY@LKnEC_SKKsX5`-{>2U12c_9CUEhUe(hT;Ty=hVcyy-k*L}%*)*mbKANi-i|0&T9oiDP~gq-1}8-M%SA4qd#ksi`8s>8y`sKkvq^m0 zkMneXdzR)!na(vYEYq#X@v;2Art5uC!^M9~xMhGF25X5O40=p(d$5)_0eg^CFQYPJ z7;ulJoNb^U$J6P{u-wS~KC_p}S;8JB*%sbXd1TPKQQmDDLawdXZcWigK0~+VW6)=?*qL_{gAMsILn%oT(yw64=!Dj43uF znv&~rZzZ=&#OulP9-8o&AKF~g2;YiV1y#|kSVsjF0;GM?PAH&zg z>jBe1;coz*EnXF^XLJ1Ya-iz+mAx~-6ng%>iL8|(N#K@*<>Pta#y zIsLdyb8V*>uL(2)wvF)95Av&Y3=W?UsyMH-hwB+j&kNe`bMUb%{$=v%m%V=h10ON; H<{1D0_(NHH literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BR_16_16.png b/navit/xpm/country_BR_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..7c34c5ed3495f80d2ec1da699c58710b269c6baf GIT binary patch literal 511 zcmVG(IQOzr_mI zeE8ooFfa(P{E2;__5B};p(q@FrazmNFL7QM^hi(g%t+$CDX>ZTGC$KF>>8xle(qDd zAoG!_tk3hs8{X%yc}sh}W4F5d9806-TJ}Bz`!7{{DFz-KRY|y-@pGqz5U7X;XDHa!>u1& z);EpLeC0)W`r$7QhuelHzVZcI9cN_x^X}b878X_=Lmm&EEhoP6IovjU_=^KQl-~Ve z@xG&Xlb5k3Wv!U-cXpPSVU~-oaWQ${(R=p?5nYUEX^DmL|5Vvq@xm_{7#J43mB@Ll z_UAt%zL@^=pE2{XIwW?Bo~r)CNF3-k5CkNrRscE*pi2>NhbsU8002ovPDHLkV1gQp B`(Xe8 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BR_32_32.png b/navit/xpm/country_BR_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..60a6863e8122e428439f23f4dac97a37d4ecbf46 GIT binary patch literal 1177 zcmV;K1ZMk*P)|Hc_Qy{E0YDB;K!C7g8snJ8C_vc#7Z792 zIA!RSczPwC@3aOn#_Xp6i6?GRb1w?%l-Vw#Z&7n3p4cA&EkANcH+zf-Wey%ALU(kt zT7IP9ayy=)v!V{_$v!XC&QB6NOlcTpVV`cnwMfpx3Bo! zk*-X30N9A~&VADDr3opP{E?dPlX@OaVBnB_w8q3oSOEC!^7DbPV5d(YB>4PtD**5j zcC^McaLAsM3WHAdwxRQi#OZ~ zM_k9@;->!@a#e;UPc0ozaOq8^b3mZ%n8vt`9RR#EzR3;%HmiH| z!sJH-KOh)$?owx|QsSqHZAvLm|zU&Ow|*zx9=t7sa0>!kMl{i^8$df&l7r&;X#)kfmiJpJyEa%rg#U zIa${LwbI`*mwfFhf6G=E<2JYc5DXw^mUP1oRi<~n#)Yu#MmSQbk^{hcFlJv%_l(-Q z@}IAoDzU#Z{f8Z@!DStj(bTi*fCCt|tIw`b?89g^*R8qj_RTZEJaSFOqPSQE7Y)Ey)Do=>R@I=Y>g3JVlRe35s$IE#edFFLD}2X8b`E^F+G z>vEc!pPJO1xs$q9?T zAp4#K0DxxjE=$ujnoOD3XtLYVL^B0m!xZ-91OPD(J-JxtSK=JN&~h!a=l@aR9AtX~ r0OadgJFwRiz@t;A@R(Z&~I&IUYwOaa-s%io>BY`SmjnXwG24WLz2Z9p} z*x+wt`}+Fc{V+4wzP5ppW~%!9y5~9XdCzmtJ@0$oa}oI6e)xX^dang!;u}GQ@HG{L zBP@=v+u~{)1WB<(pLV=YJ1)f%_g+v59zUlY>yY?5B)(5-$4c<{y%bbI#D?ljyG6ld zvrQZvsxws(v3nz^MHn8@jn)fR)|2&ul@ZFr;srV#)Dn3~z~(rX82oy8e8)#ct- ze>6~Ey#xR(z)zetzg?`@_!Jl%tlo$n0`MEP{pB)8QqA<7{D(j7ad{-!mcF3y{AHbS z&vcP2iU4#;y#kc^G?=OTe-eZv?4PQpj+e|Qn=4V?@mG4>UU4q_7=?dksyf_h;o%Gb z?3DzniReH;!2q%if`lmZ4~^w$u{*`Q`EL8gt2OyY1wsOZg+2P)$);Wu)(b;t{UtP8 zKvRJzBT@QH?L;@ZoML=I;i-N@{!vN1)4wYa;-{M3 zkURXdrlt1(MZj#}cTL-u0tI}dd=4E9Z=NDN2Y+G~tQ znu_)aD)jP~m4{#d#lT891^^U|P2ZL`XxtfolsxK!&h+GT^Ke!=$c(ZhMeb8I77@w- z7bd4m1}@bv%=@X>+TLUtcFy7X*FUGOpL4cUYWRDZw#PNj37^*$27r#X=}MI^+ZBPZ zM~mIosAw{pmOj!p_3@JVw>6V|gj)>&1Vj8pf(ZpOH&zl0PTzZfy?p*>Q-lyZ@#n|e zj2Zy&hXuL3@e$^2&15RQC6V^YcnFKIY@Y1Jre~3dI-5p@Cs}r_c)dR6008Uc{10A# z;OSpKh@3znZ)J_RQ@37A zC2L?wcV=go zcW|rK+cs!x5TzhrP_#M~0KM+_eXFEEZRBCy>#*br}CAKvxGFlCmDEHZ%bGtYw zL5FSE=UFdd+&!9nkdk8bzf02ER@Hic<$ANBb7oC#No(bWjNzY$WgWI%4k~Bp}JYaAPTxy`=tBcR)^KcwXBpBCX z005K<`s9yK?I;cd01NPnv*zdX8=7Skf&k!hm~>ErL!<{qpjZ|;_?@Y7>wT_e2>>J# zOd_#*;I!x#PQG+XUFHV>nnj+w-SC!MmCx^%1p&Z#L^2T(f0tb5A*@tPb$8rQDTB*C zQD}wF!k;;>BQhei-VGC-uC^jbvHX*0~`PQ-Un5CFL1#3NS2g}`bVdOj$B#AV$(kxG7w_0 zBQq_3shk9W(vB$`^l1ohaTlXVbMitFASDuQ1n&f0q33^pPL`?Uj`ezh6IJU$(aH=Z9i3zd|-P zwqyVQ&$RoO{BhUf?+*W(XZ;Z_y(w<)DqnT~>hB-@t%8rV)ZE(aUf$;6;c@j3{r@*T f0SJyfjbTu}W%@F9({2@@OBp;}{an^LB{Ts5L8WS5 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BR_96_96.png b/navit/xpm/country_BR_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..58e27e5581dbecbd536a242bfd73ec613c8e1702 GIT binary patch literal 3996 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BS.svgz b/navit/xpm/country_BS.svgz new file mode 100644 index 0000000000000000000000000000000000000000..dbb64ce7a7a4544781c9ffc32c47a9f8ce8c10da GIT binary patch literal 404 zcmV;F0c-vriwFqvCwfQ%17mM>Zgg^aUqVwZb9QF{jgnnY!Y~wu@A(zSdZP*3y7A#C z3=&ODO!Q8FK-mtgGTLP;4E*)B`v8n2defZuJ*R#0HfOdtY%|znQ3@p^;=7ap%2*{r zt|RjC{_KPVO3h`$GbJ%1Qjx{HH@k5hcq))Ry4dZh9?eOd8p72CcS)wmhE8 zQXez(nJbZH?3Pl#j3?xbvXA@WB=|SXzY6oO!B!mUF!&7{cCei5wCS4W8_+(5S91=` z8MvcKNFT;Q-*-o~OW_NyP?i~wH&a_WD(A7#N9H%O*k#CYk5VPcwA6*#Ad_aX+S;iD yGCx0bMkXYh6=KVs)|cL=5|V9&#-ejiq>FGij0rcc!_Dln%zNKom9~-d0ssJAhs3@B literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BS_16_16.png b/navit/xpm/country_BS_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f59bee26cbb323354530148034782f31fb0fd267 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^PJzX3_ zG$tmec&tt+;7w7GGBBQFeN18fA%(RLTiDwE^Q7|`znEpj(Ji>LvGL*i_%`Eq$uqJN z6+b#IA2@K}!)NxxOM`i~$?@d8`C)3HRJ^5UsrGWV4Vw%f2lcLNY;07#<6m>pCD*Ma z(MSE@fvdCQB_$=_=&}@MCL9v^_4Tzpr(YNM#5s4@b{_ZCFxn+nBs%%ejK~cU-M-Cp zjGRyBu=(ZLtdbO{6A(yS@j`Wl)Uw98lNWC4cMO@dAd8KSO^r=Wt!+^ln<{Toh_Qiz mfuT#fu|%Zs%2|z#j12o5lw0Hz*Qx+L$>8bg=d#Wzp$Pykact@U literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BS_32_32.png b/navit/xpm/country_BS_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..d82c314d98f1ebacf235b3a307494337869f7cbd GIT binary patch literal 494 zcmVH!m$tikMwy<~P@w`F`s6JTnr5lXyE2c9{rl zpe&S%4##St`VgTUro|8iwS}>W^pVtEb zcQ@Q#Q`?Lri2;DiGh~?(w=e)W3SiH~RUixi_O~c3Cp}9)pnBG3tKwOhOw7@1L>i_u zJ8pBmDm~Sr2aqG&ySRF4?>z{H!g_!xD}QtQa(EoI{PO`V>Hf}uBWlT8!= z>;xWc$>y30Eq|&=Gx&PFyuN9u{}mYNcZ?1=v;oma*WQ}8x?HMx$WdOab0=-AR4Q?Q zJ<0z8c`n7jR+VZqYpzEEED2W6qA$Ubp{K46m@P~#QCy+3&hJ|!NeoXLQda@G2dMWN zQvVI`w9(mTRQ(4~Uc->j!1{NGCjk%>jl+;4|y0-nHS`6-v9sr07*qoM6N<$f<&*>bpQYW literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BS_48_48.png b/navit/xpm/country_BS_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..942e9f3cf0a63fb1d0b5e346be706fa03871e722 GIT binary patch literal 747 zcmVlq98jY zR1jGpcBm+~L)0M%%1#}E4xNICNIG{25hcV7u@tNhN@8E2l$GDx!O0SLx0zwzy#D85 z-jA6#Z{CbTYX=Pn`ESw~>?0>1Pp)ixSwYU;xdsacf z{2W95`1cYUC)KkC0=~^K_KKQDG%ft`!dpM~=P5o;Qdx(hNb<1ZVobb4RVnhxz(5EP zFfvGb7P$qsV<0pLc+tyNFPl8}VjwIixI%w7J8MWvvDXt01S~D`vX7cZ;+-~nB7lG& zv%DU}zXwN*U7pAwVEPN=Z`s{o+d^Pq4V;=_?kA;H;xS+d1dI*iPNHDDU<`oK8=i{M6E8>usHTpd`n0g`_|VMPB|#d@ zf`HLC-iSOx*z&!_XUo!)J( zC~B}Uht>)PSy~Q8k+Pa~(3Nv}$C@*vNLkGysI|p&sXaHU54!IJv$9KI#H5dmu9LoLM#bw2Ap&Crw zvQq)-4~UfL8M{JFN9@sH2vk|e(RT3?y?=qWlyK%MiuDEEY!OGw*i6SwoBtSv2PL@a z=)@iU4Mya`fMQ~~a6`(U&`=;nq3tq7Wwv7=H0bb2svB&V=xqSiHgV{L42j-)khg-< z0Z9_Qzd$+poWG7HYF}Zn-=O4FE_UKfkct5v6z3#xi?j^c7yuPj z&gltIBhx8EngS1z=vvvc8|_Jb#+eA$JaOU#yOFf%hVXiw%|H|xkdkWCDp Lu6{1-oD!MfHW8Q+6*sd* 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

O_@o@G3IS8?CUop8hkR9p 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 Eg88P=R{#J2 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BT_32_32.png b/navit/xpm/country_BT_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..79aaeb9572705ef0cc3ddf0925b119c3da45e1e8 GIT binary patch literal 1082 zcmV-A1jYM_P)TtyVe&&<7Z@7=w-3%g)pp==9O`T?T0q>T}4QnaR; zkYJ37?URYoXJa4q(Z2P?#F&`)W=vm*CXM(JTCLJhppBH0+Vz{hy04R%Kg}wy=!jwewxl(f; z9RN0!fn1$td!S{zKo4fRb7+$GFrc2I>ip(AqB9n{lST0Cks_ zYIY_c2r#=PfhFy7P&8E6Aq5&lIUvh&DwWb>JJqE{M3;oU?QSkhY;&c5V;OKc3Q~lI zJBhE#azWR1P16V=4NpD?mSSD_9xnE;rf+x$%$oDN=fv0>f>Isih6geLLgU}1XB==n zJUz8`WMexJ5I3cLN~i&2tfj8=^e9?R=4h=+Id>g+?<9{lY)JqBa-_w~PFt46xx9S! zO73_!9*-MDK?tFVdr$HbcIGe&MASWP@bRZ)ZdPb))+TOAEv=f*FPO&a!IF-M`FBA5 zap{>)%;-D1+-^(&NoNQl*8D@25asFp_O(&}&L(#A_dGfPprY4xmK;R&ulu$gkYyPF ztjwGnzlQ4?l-;e~*d_15G)gVd{%>4?5bCZSFMdQm2~gEOYG*uc-l1VBQXhJ?$1n`X zacF9uo$I5ytO!t$UXp-@4@pFI=Pr2h%edl&Tud`;TZnEKLltf!j*_#FM-&lgVhfVD zFE1vQ^Iy9^-UqmZF~$cwy_dRaO&yF46cRq{e7QxJWt+yTk7npY;9l6 zWQ56^8y2{rX6Z4;{2ryANL1iFTtx?eLWT|xXM|sWFz-%=kG#TCNg@jF$i;$?0vYK1 ziBRmtWfRfh(V$cbzg;$?JCtwF%(w0j-nqTf#$8v5kLb4&Rb9uZ8eDIc1q2M_B?GbO z30V!$>tk+TFZtk~_NW{4`?J8a(fN zt%oLOaXOjT&J%Gx5nqp9Kwt$9iP8~zw$~o|g*gt+WdI;M1&07*qoM6N<$f{By( ATL1t6 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BT_48_48.png b/navit/xpm/country_BT_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..131b22af116c06a6055f499905c43f1d4800cb1c GIT binary patch literal 1986 zcmV;z2R-3zYT%xL^02s?24)GA^%jhWzF>37kG|xwkwCD%nx^)kjMqG_ zZVMzI@^Q>>{F(vrTN*IhN@Vs|)6^amgiAzBULI$aaARR~z*+KKss0&T+hDQtuC<75 za!&e{-dMGSnjMUm*isH{Q$z7&v_5e8cqrMSCD&k#E0qKqisuJ>&Hicgvs`;2ct#R9!eRBaYD zZ**}J9}4Q+a5$={p+q7<&5Y-oq9{6!WA_~PfAaj$>%aFIhGD=_g0l{~T3BvC2q}s} z2yu*j1ZPas6j)>k^ZoUoR_7+{Q^)j;j|oqH#o?;WSnWVgctfONg)GZg*D{^B?3j77 zdq?p{J7mw4Ha|wL44b2wKsd^!y8Ja8W*ubZx+hG(RLaY;?0FsvE-D<{r*|W^`?S9E zhf!IXFsw*RtGs@bec}jrXn(aF_6OTJgZ(5iqV;MA%sy&EOponL{2LMVLurm@FcEn{kxL6b=UJiJQDz>k7b6FS~ zKtO0~2N#>m@Vx8!i zL9O!ix1!OgZQDH0d#Nsn)Jtt2p9sfbeDafe<{&e&wQK~G#%Bm3gb=%Yh6UG$wb*7b z#*|XKqJto6n&x>PA;jqGiM6ffIBs;$E~bhGW;SI+n(x#-!Zv(HowLeg!-6)Sa-j*l z#ON;J1832aW&GR*K@c25iZ6VhCK{1xn16p0z4CLbRLCFdq`Q8{kjbxln864+1T*1v zH2k1RLn;8Jlv0YYlvuhkCpG2kPXz_R({)*vWks3j?NS|EKYWmX=Pv+2-rjY`{-zD$ zk!M!YuBK?3W|}4tn*p9u>ifQ09~U0n2mpp*c%D}o9T6R?u=g!`p@*Gv{!G@87k)^K zEvS@>U=6b@Pi(e4nymn6^A~a)CkO(|vH)PE2LV9%;Lx<%ll>UwP z?aQ4G@LRUVKlkO)3q91aLy4p#2RM$S$Nn?j@M(iev_Wgy;o6dEnmjEE`}R49NdU_5 zx7TueUiaoNMyuC*k{qa?!_yF&29)4=fnz*3?N zUSN-RI{p7Gm&^Kry}WH*dt1|Tx@B9{eRVe=0I2v8QJn(-bg&|9-fCqt6_&dZCn>mj zmFv1@G;W1sK7;&7o%-yHR&Uo7dz#)k5i2IGXE_;W|c?#{T?k?$OWJ1p?_K?=h1lFr`AFr#rH&rBbP|OIO@2 zhzFg|zN$lm(zcU`^F~HSM9UD*pE38mq3n28FPEhwoyNJ-BS0CwGFz&F1$4VbjafkP&5qozU{1xXpS_|#|6R6JK%!)1v$(Yb<+IGC{yX%L&oO6DID6ls z(bp-&jfT3KtCd2RTgf3=GR%`xf0cdj>ZfBC0SU7gwA=e_bGx-v4A&Zbh6 zPnqe<6e60s!p|1RU;ZA>q_HT|3H^El{v`#y)o{`Q%eZ zu}~Cvru$6oJd=UQaaXw0MUC@0!!SI=I_FMf->V_$)|2`+zir)I&dH-9&(Wa)COcX~ z4cxNJrl`4Ebm3Bed<;+FzMNLwn6hbU0D!renvMS@(9ATmR|xJW4FI6~N&^7@0|cbB U^12+k(f|Me07*qoM6N<$f^_T7UjP6A literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BT_8_8.png b/navit/xpm/country_BT_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9e33b3e6ff12195cf74779d4e1ca404cbe12d628 GIT binary patch literal 228 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BV_16_16.png b/navit/xpm/country_BV_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f41c60918bd036fac4dee42b92a47bb1439fd7e1 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`fo-U3d z8WWRi)~`Lyz#Jo+yGgb^>F*iocW?d`zmZ@zJJ1p;!Y{!m6~VGD#!2vn#gPLC4j5;% z>GAgPNJ(xf6*^oWqL3CFb!X=@`@9369NqcX&0M{h_t1|?(+s69doVEk>v2@O)NwW( PXcdE}tDnm{r-UW|HH$kl literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BV_32_32.png b/navit/xpm/country_BV_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..24e15b1fd94609304dd1911deef40764cf9613bd GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&*AJzX3_ zJUWwW)~`L?z`G$L^5dCV3*|2qy?hqT#?~h8ZpCW0{{Owp-JynZ2V7RQ1#-LTN^DI~ zi8`QE@Kk7`*G=I^K;*f#;h9}R%7qgPR)_zW2{7k8{SK$vqJ>!P{+jy?KqncEu)bLCC~X;)1~JrVnypK n|7Ohp{Oe;eizYIB)|7Qiz literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BV_8_8.png b/navit/xpm/country_BV_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9becd94bd5877d02f2345a700c2284a07102b6eb GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_b^PZ!4! zj+x0d>(`z>aKJ!&n^XJO=~wsIu}LH(9bhc*GPve{@63S%1#kY?77E&>MhYsG1e`Bo Y=!)S_oV|PH51zopr08+^-p8x;= literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BV_96_96.png b/navit/xpm/country_BV_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..da065743971cae85f71094eda539db6223291d88 GIT binary patch literal 405 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlHoy*ynU zLn`LHy|dS|IZ&kGp^LNCLCvN|=b65RNgg@nClG!?@Cc_$s8k_$A^%#PoTQ1zoN9ty zgdSF|imr*_(_jAg-G{d?Qa0FCZ$5taWJ=|}>WY24=KlS0^YY)PKW{$#^v803ea!te zg>7GN-TcCE+i!tFfPe;v2n!bzYh#mxBdJ`8xBK_ylr?=Uv6|;+Zhcrk2WDF9!v_zN zE*s~VN@Fp*^n+a literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BW.svgz b/navit/xpm/country_BW.svgz new file mode 100644 index 0000000000000000000000000000000000000000..5c686505551bf76512d67a466f9f1cb8c154c35a GIT binary patch literal 309 zcmV-50m}X#iwFqzCwfQ%17mM>Zgg^aUqV+db9QF{osdmS!$1&*&kFvBaXcrpo75_j zZJ{3&L9}31JmzDYER9J?w%O$0yKAYvc=EK&@;=YJOf>DkO6X+Ms=5-$eTE>bw9ZtO z3q0tpcaPJ_)n#;p%0Gm5FF=LH}y_>r&^~Efu>Me{@*k@o02k4cSlp?jxhNKBI=Z) H!T|sP9LbhJ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BW_16_16.png b/navit/xpm/country_BW_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..8604063179a53ccf6e33bfd1145c879cac93ea2e GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt@zo-U3d z8WWRsVoPT?iX3p6^eS;tYW1A%i!ti=d#Wzp$PyC_9q$u literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BW_32_32.png b/navit/xpm/country_BW_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..300bcdd9ef0a930e66a3b8527a6d3c04e7740cfb GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&*iJY5_^ zJUWwgVoPT?PHX5~wyZzOAnV`?*271bj{X1t|ME2^adGikQ3hOWat3W}ZI`YwMX3i* t+jO-&BkSM=eJwX#iLD7&n5-fg80Kqpe+oMIAO~nFgQu&X%Q~loCIE5zGjad` literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BW_48_48.png b/navit/xpm/country_BW_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..7cebab65a7a38a035ae3370413773f5b359a1a9c GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@Hp4GqrkO2;R}Xs~Vo)fPtNgKNV@PSu?aSJI37_* z5-{x8(s3g1#*}D}Nt=FNS+f80X%OcGSVjV-@Co~~I4;MDvC3b7HZgd*`njxgN@xNA D2n9Tp literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BW_8_8.png b/navit/xpm/country_BW_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..4b09f20a4d6f82dba8794b9c4a0d2b6badfc8666 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_b`PZ!4! zj+x0iv8A&ar4tTmb@?}4JbILMHB0w`1qx-HtryI+BKa7+x3I96B`mlO)WP8C>gTe~ HDWM4f5rQBM literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BW_96_96.png b/navit/xpm/country_BW_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c2b70048da7679c2afc813191d32bf6be28693 GIT binary patch literal 285 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BY_16_16.png b/navit/xpm/country_BY_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..6b121ce83226232d302b02c20abc9475c6534e20 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`ZJY5_^ zEP9t-vgK=X5O8?7-Ja9!u7lFlsl4n9HYrr(NnI~=S)y(sT5=WR=P9catNQ! zXPJK%2Ort)dwryVjpLC_$p^W|b0jt-hZ^RaUw(NYlx0nK)9hN8PhI4_`%d6V7$Mkm_G{Wat2RVKbLh*2~7akfnpB; literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BY_32_32.png b/navit/xpm/country_BY_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..8d20fac1d51b18b4c548df70095c1b72bbc5f817 GIT binary patch literal 553 zcmV+^0@nSBP)bX}3a!B3PjmdJ??&0{a3!&7OQ9 z?;aM`i{LegHXw?uZQM&KY}+K0G&6f}_Z22{ndAS%Z{|P4UlfalNuvlMCEL3@lB+9h zE}6$Mc^so&UhsN7tHl9iwb@|G60hG!xUO}8Lse0}za#s7j8gUiLP~~_`xPGd5`+1tbIbii@!1Ii?!OcMUw z++eE8J|LgXSl`}~&t^DM+6U-7M|d9oa9B$M(jN|Ko}J;g+Zbc41DxRG1dO3E9)s5Q z0eKwbG@Gohuj}ao@9+?l=Y-QKLJ0c+^DlOz)aPSl8?ak05n+gWeZ|yq2g1n&lVx-+ zFA;TgLH6)~&N8<5_n114pja%(9v?}g$a--ADGv?+DCcv2eCsCPeSTR51fvn{iwo5A zGrz0lVE&bXRe*PNgf|%AA0MOrjm_GhfGmp8>ovw0oT7%`Q1<)iG{tE&*oB^TfOMKo z+-?`W+2E~fm<#lFi@U#%QHtGOXdhsTf_yfkF&-n=xqX0;l3+BVn9nJ{)R2JFYJt{N rs}=6n{$L`*=@g8ib$$-+PwRlc8N0{-sO5mj00000NkvXXu0mjf$n*y9 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BY_48_48.png b/navit/xpm/country_BY_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..f1cf2212e7a1a7a4c68cc61230f866d4cc349d46 GIT binary patch literal 916 zcmV;F18e+=P)ib zU49l{&gC2yd!B1q+Vu2s-&t7buB-rEp=((O%gg=OuiFnFx|T&q`2*4_m1HnTgoq9f zGQ-2v9>Caf^x4_NXU__E?hLlKsXc(+$B)wJXxM6T(+pZIY7ZcCe*8*=V3`c91^|$o zW?9*6T?Wh3z)A2T-k4gzJvozmJ>`U%yW6 z0UT^^JL~IGq0o8yRCpe>2ar!qIq%*@zkhdESE(@o04VzXu-!gbUPjJS@s~N4#Z5EZ z-_O-*?#2eS2ar!q`CqirNFnBq{NICd)}2GsdVrfT(FlFJ25?yB4+EK?*XI`DbQEI8NN{ zie4}3bmC6OZ#D@*n91iymX`W&-)b{6L$w+qj_hEQW*+lpZXww(k)@a-G52PEzC<-w;3<_*JH$R^pAJ5;siMmeh0aOe_zk1c*-7Va`n?w<{ z2hiQzWUBh_qet=KVgJn=Y7a=jm{ctC$w}lq71s}CVj{3@>EubKD5z=F9>63B{AP3H z-o5VHnqI9^djJ6-K00zYHp2aVe|MMK11J@X+Vr&7Xyk9*O2uyPZEeY=lE1T~RVu;W z9<>LM8u0%@_2R{_)lv+@-Q3KMk5hX9nJl}OHGJd7(evm0{CR2*px0<*@_ClY$fZ); q>rs0^I-WgxwTil~SF1pMhy4!}24yBhnU^B~0000u0FHYXhX&(6uovxDLC{`K*NUPcB$@VD}((0(SjxVS%DA5H;9Hq`w6`_$io`>^C3 ru79508*P3bOlZ8#d*@EYS_X!x(!zb|Dt{&cO=a+O^>bP0l+XkK0|hh} literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BY_96_96.png b/navit/xpm/country_BY_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..c0fcc00208fc9bab3f20e508244e49be9c9897fd GIT binary patch literal 2717 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 BL6HCe literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BZ_16_16.png b/navit/xpm/country_BZ_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..46160c542ebe4e03960e1f5f811b33e3b962fe55 GIT binary patch literal 495 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 X_lJR|Mh2H500000NkvXXu0mjf+_Ns1 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BZ_8_8.png b/navit/xpm/country_BZ_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..85edd5bafe1d067c09079848ce8458adfff82a52 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v~00o-U3d z95a)3LU|J);Au*FLc))~f7M$~pGdfW?!bYB)!JdRH2%E5e}7-=e7@Mag9i>AV3~NH zf70)&$A8W?@8&-AL{UkHhlgj*8=Y58J^%N6efpOunD+nh$#b9nK9?6;!I~7*^G7SI zeqPbX(*_1HEw6t3`+RYspvth3gJI bjbVscV7ABj?h#p_Lm50>{an^LB{Ts5M+R!n literal 0 HcmV?d00001 diff --git a/navit/xpm/country_BZ_96_96.png b/navit/xpm/country_BZ_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..daa15ed0a37bbfc5ae813c1505cd60c96a04ba34 GIT binary patch literal 8060 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 N{2v(`eZedS004B+oOA#H literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CA_16_16.png b/navit/xpm/country_CA_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..40ce9539dda43b7547f264903ed47fb7e4742f64 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_qJzX3_ zG$ytN849^L2)qdupCA;tPeJr&)Bef{E)ypQ*f}UgigX55H|~90*8cidLiMiYS(fxi`v#7P?tUG*XT{9QTS`6bcmrLeyJU!)d$?-T&ki^ke@bm=N#p^3x zUf{ZTe%`l&$>f)HI^DN|v$M3J9C`_SAC7}eCK?_c!ExaGTE2=UYPUI`^XiK4@4UE( zO!++D-gte@`JA0j`Vy%U+}+W(X<2NwSgAy&YL(3Y^2k2m%1`yr=_U zv4H0x3=xJX7SjW$5)=wi=iy;HxmY9+Bv5T~Hme{wj)I`rgIY~W*tA-0w|h{pD+sr@ zyD10)mdjF3xy&Hg?U<76^(aIFK?wHy%2J_Mi*9Zb2=%&7Ez(O6t8|+dt9Oz(g3`_T zVOgzkauO%3RyaQ14kf<|y(e=vL$!*_OPrr04DtAg!2q)vN+qSMo`P>ory!H#?xf%w z>$NP942F;X#|J(?jXVxb!Fp|~;Lj5no}#o!|Ma{50uvPvlT;+Us{jB107*qoM6N<$ Eg2*xEF8}}l literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CA_48_48.png b/navit/xpm/country_CA_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..8701710d19fd68762d50997226fa071f5f43ce60 GIT binary patch literal 709 zcmV;$0y_PPP)BJ(O;A(L%S1 zf=l;SsTS$JU8uMde+iUQ2#M3{qUEdcv(8L15s@BdGk5OK>7CBZory*e010XFp=n$d zT}>o)7!%?_5ur{8osJSuiU^&Z;rv{QCq;y+RaC1=JQ+&7;Pg~vNsB;Jun)byVrB-K zhNmYu&bQIh-iPk*0iad`5qdpbTnvSAk!;G2kHHw4%|Z9%1h=;^O>Aw&_emmc6b=u+ zP(C^usV@*K*_6%BiVB4>Cd5NrLai16|0h}<-h%MBHNj?n%-8V%?=TsI=`Z%B;> z4i0{VP_c-e9kkoHzDBtW{5L`UZmEQu8?@Wl-bS$~7ea2?@9q*nwoQgXmPIcww7eYA zTv?&#XR<6Z461mXCjv&&m+f?NRQ)?=SgKqk`NJO~u5D{%`a7;EgzpzS?(8I&$BjRJrX6f-U z9-+AP(A*pfg^{C$LhQORK?&Qh3}uISNI>ZBF3u1S2`-AhkM(sdE@Ej3o(IO@x~SDq zuMg^>SWt1d2XJ)-A}lQMqVdZQMXw)WsOt4Y9U)!KQPoW!@;#MF%)f#qS3}5Uy|b;#vMfXT^uw@00000NkvXXu0mjf-Htsq literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CA_8_8.png b/navit/xpm/country_CA_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..cc02382275dc6713528f464c7be96703b58c0df3 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}zPZ!4! zj+wr_hI|bM9IoC3Q8LwO zZLM_Fe!Xw9g3opeevS$cHVwUPrvBd5OU7NAVS;{5q<~^N|9{Eno*X`trQd5O$jI)L Yi@L1zwr*|fd!VHZp00i_>zopr0H5kRasU7T literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CA_96_96.png b/navit/xpm/country_CA_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..0db3ae6a542febc3ae97a2c5a6f39838c0571d0c GIT binary patch literal 1415 zcmV;21$g?2P)3YRf(_`xf6x`m zKqvSEU;wE@GeN}w3#cq07=Y3W`XRL`Ls6v)S{Psmh%{08NaDEe%a8~+DD9<*&pt=@ zD1&34-}n0H_1S0FQ3w`6mPN7#MX@BzE=!`cFj5c$DTsj-#6SvSAO$gyf*1%U$S`0S zPIsaT!353E8_ZFBxroRvLMn?CX%3kUPKZk%ovoeB$> zFgX01u>9<7)U`3q#y>i z3;O=uTn>fUb8bb!-o3SVw*}h;UB7NFt7_#Q>ox>~P}SPI+k>rF(uP4kAI;91YmOXY zggtuHY&<(lem`w&wCMvC?Pi1CUJ3*%%LfmVt`ia6xWNc}^Cl6I zuG4`7l{J9?_4b+#fmX>O# z-~eYqJw01)8X5uspN|ot{A{D#c&90>fU}@Ohql}_HHG)@*%1^43k#T@ZX|^jaK7cb zef?j$gkX>nVRRJVzBQhrdH4>}uU=Uef2+^fSgQ=u?o7e?(ewH`{C=#jTb1O0R2BI= zJhcW2cRYIbc+l0wF@9H9Z9CS%e=fFfAIISP_j3#mzz#v1@8-BGH~{W~GMUQMi4&<5 zR#!R32iMblI!)0i_tShdO6fGe(>zZ>@i=!oTTmcQ@tp+a7a&!6ugi$#Bz6ED>1I{f|}zrf@1pitPsEqZr6 z)u@T8Hu5OKu+M4~H73RJ9GRY(~4TFOggmUp| zej7?9(SBe_u-^~Tb!==n-H9s16C@bo3ECyrQ7=|+6C~atCYT^u zK@6lI22v0MIR-J16~sUaVjvGO2C{+}h$l#}JBk+4ns*e%LkeOb1u>9<7)U`3{sM&s VIvYJ#t^5E0002ovPDHLkV1kUYkPiR= literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CC.svgz b/navit/xpm/country_CC.svgz new file mode 100644 index 0000000000000000000000000000000000000000..ec8e914a0bb68eab255e5e7106c74b4c308978e6 GIT binary patch literal 5345 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CC_16_16.png b/navit/xpm/country_CC_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c0ffb9fd10738bb4c2c8144fe2426640370770 GIT binary patch literal 395 zcmV;60d)R}P)&o zq;_Cujrr0q{}r{n+t literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CC_32_32.png b/navit/xpm/country_CC_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..5db03a6c3d394eabd653c2d72a57ca90db8dc15d GIT binary patch literal 810 zcmV+_1J(SAP)0osHfe3yCi zzvY|%&3pfhz*QnDrpTrTkv&T{N3uCzi~wJLMgUM?1fkhs%DvW0`0p=K8aTpMsX z5CsFPdGS)7#ju-)y^OfYj^)E7% zRz!ggNf&uMm+uSQXkS_>NuVSl5RhqOe4aSJ@@jy_A?<$nGw~?^&-@z05zWqIUJfDq z758irHHCqIc8N=^wEhSJy!ysR2|$+d%+fMJ^Z1femK~G8d%rMIASs3t<8 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CC_48_48.png b/navit/xpm/country_CC_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..887283e50ff91cc61358708549f6889b222513ec GIT binary patch literal 1179 zcmV;M1Z4Y(P)f2SXCTHCTwMkz%IY|PDMY%(UqWyz-KjO>Ob zN;F=G8nfMap%*Hd#w^**G*P_qLbEtA(<{9&OcNKGN?=(8aZVApc8-;ATGkcp2mSDZ zV@li8o_;{L#Qm?H^FGh}_IJ*C&-*-m1m5P3lInH?B(#Q;{I9N$(F+WT*zI3~R zEFxzgrO^!F3v*ce9bZSoRWq-vQ(5MAA8>lm&7P0|) zZVP+LB-qH3GmvEn8V?vYnZEE8aDE{EnlGVCAJu; zH*w>ijDdESQEvix=Q78JnegEb;12^lQ^U+_DkzTPU^k5ml`DsQy%=qyvW7G5Oj|fr9MQRLr-~e#O z!RHR;uozH%2|$g3)=C0lM%-MSM~L#pHGr+Ae1R^^F*uhEkVRxU$_xFxauK7JNEDqK zSCFnD0E^Psu~v%hA%m80owV2RUNgQBM+T?}@lMe0B$YI zFZy8%T@6@ul7h$VT!%7X&04tt_}mdA==Ji_X5oL zB^r%N%BHF04^wC4+G65(Y|_v3u~AWtXBv$tT~7I!NUB4&m(a2a;DbMK#(Nc0>84^D z&4eNxs!9#?-DI4@b%P?kWS^UqIi{cZZ>>{T5?zX^bS}WVm+7D7^`X>2LoO~Y#2n5s z%vQ<%M6M)ys2t!=4-RjlE0a_@=ApA6ojNrT@c!?T;hth)7S}Yuh?~ACnHBFVk-W*u zB$bYO_iE_A)VV892 z3)A@%7g8i3gBIXcP~MwiDos{mO+D|Yxi_OCUl1U5O_J(1fCozXMeaqfNam~vMd)?X zV^{dg;SB44m8=wp|}EFxl3Hpoh9_UAs?;l-wBw;79$quc4I#i&h8(gg(qzL_8tVcP~m5k9`c z@sYe%1BAOBGzAq7NU^A0QGtMR><_JTT002ovPDHLkV1ht;A}9a= literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CC_8_8.png b/navit/xpm/country_CC_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..8d28556050bb7df482db87e54e4c843d8bf09c56 GIT binary patch literal 214 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 NyMI1XRH3>B000N`LNEXT literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CD_16_16.png b/navit/xpm/country_CD_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..9043d0c4b685f056474f086c70786bed349b1eef GIT binary patch literal 538 zcmV+#0_FXQP)FhPVo_>Y-zU&pH2oaf4+e~E%Q558YvVqjok;${A}LAAJ4eDO-<$_|++ zj12#gRVRyXT6;J5Yr&5{Zy6aF7=%LqFfuH@E6w`)mTu6kpK@l`7Q$V{!tl3CVq)OZ z&F?obGcYhPaWIHg|7lgrW?^7p5MlkW;e&%X>)U?}j3|z7y#M|RGXnzyoAiHdqnR^?r30%o(EY$=^zYpyMZ3TA394pbU|{0+{JXcx)%Dd3 cT#iNq0I=-3NQ(XAw*UYD07*qoM6N<$g4It1ivR!s literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CD_32_32.png b/navit/xpm/country_CD_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c892195722b76b1281596dcdf4773cff503a33a2 GIT binary patch literal 925 zcmV;O17iG%P)YTjXWQA# z=kEOf+w<`L&a-z2?zv#4g#+7ZyxypNJbewvSKOT>y!Xu)D&{{-o|ex!F-&k>oaO!> zcT2W&r07K1w~y{)ia93+0K$L<-BXhAF3-I|H}rD7Rq?_&^uWmU<^H*^J8a!C4bZyQsfF!&x*ISRG=aW{2|EWxHivvJO)`X25 zM8K)>Aci7)HLr6C9{`Nao7#UgaDY;{Te6)G%&lu&zHc@K?Gb)bRUSdnn(o)U8Yr~m zz%Jc6LdCnrdjo7v3ik%xP_OaI-)EesFAfU;00Qk{Mt724sOdxBP9>sln!03&1%T1e zx;RIRNLX~)EWLAJPB;&7Ds&Zr)q{-oy?siyu%wBPhpP} zLYM0~)2(o*M!n-dU8J1Ik%h$W37ftk1loGWcsYDGTvt2Z|C825kNH(GA5k1|b%Y|y zSHCSs+-)1PzK+b6@q;6#*LdalnxUl7TPWpr)HHQ|z*`reySVIRh-Eqco3W2e>*afk zT#SXt=M0@xz@#}iaWRS|R{R99?y-;2rmz0&bK68%09IA8`ZmfTD?Rk7eF;n4aN?s_ zrGgHit!IqA)F2fHJ?R7jNkCTs*+MIKfEapO0sKz4Cg>uO&lx+y{?(W#*)oj@A8jaKf2rm1tOp(hTIfKGD8jy2W zZqX3BPso+82%bfmv$8-ZEB|m9O7D9O5gI+%;7;zIaos(aK7I#nuaO37q$U8Mp<=Rx zG&$0o%St1P^jp?oo&GJ9+mRI_^?a6eS)B{AnPsXNYtpxzAibv^AU5Q11+TZS^ zd~&7XRON}8&!=Js3Zlt$n$2;H?j+bXrH5^FaJ4E^2h7cqhyvRE&;(_GBT<( z%ZLDLD^u0XrT}vX-bJFt)ufBxJ<|Lrwvicm*+206#xv?^vddEt1w8tMU+KZ%d-&R3 z#^~VgC#&C>>-I(+V#OZAB0?Gfs3&RlG?`AbIfmVH<)JY;xcYAsMhEAOI*$Hz*&B7h z_CE9+bvu2K;E43WQS-D)njC3b)k-rIYI?~(7))By<6@v==34-8JGTFj@9LHCYXESJ zn#hYHT%PEU3DNQ-3L?PP!Pq*OB#xh1IDcm0Ji}+(p|~+NnkUC%hfn(Z*I4u0|F}0f z!#kF%c5*quSmkbzBaK_1m?=yeae?r|9(+B<8cxmjt+8eR-~qiCI7>k4d1^ZF;6=$B zWIN3mMt73zx&q8rr@^avZ`5&m?$gXP36t}d?bRH6ZO$pf_e(#Qg7C5<$YhSEp?X)BEwNONgKLI3_~gKq_g+mcl*gKr)N)H{@Fr&PwMA1@6T^7emT#7 zdfeX3`r78pVWI!+{ydNFn=$>_lIQj=k`fXTT>o|b-o<@*&wO}k*yfOR&*Jw-Doits z3kgXO{l8zqeB0}IC1#<7M6+aH-c0*nhbJ(KGBC6-x?OGRO3VSepTX1B&t;ucLK6U( CD{bEZ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CD_96_96.png b/navit/xpm/country_CD_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..dcad44de1b3bbb080a89ba3a83bd06fffcbd0006 GIT binary patch literal 2030 zcmVt=;>+@m7Z1ANtr2AXm_95ssW7sdDu$VhNU@(!=byzH$J-KgcLvGXG3-z-i8l8_E)8B9P7>2wGdO#=)o z($WFIz+|Bae(j(iGz~DUtjWB5t)SRHoz9C?W3eev6s&Bsev41+wYO>)YlWaOjZ9pU;*sWCvp(5tC+EIoJwbB8oyTnGB8`7z6gwS-R zO4Wv8LE%hC8g&5`St~ssrZRsS362#bcN!J6bO7pF+h3kINo4Q1Xz<`3A=}4nOBA)w~mubu$ir{%sh48SVmvjIs zHnuaB{>2pP`4~&BmVN7pj?w`T{!6Y!*2=TPcAH2xU{i+bp%L$2;}9%dKR2?Qjxnq1 zOF}c-?z^Vbb(Ly9XcPh;hYAKP;|Q=OJ)Nogarl>3sz*z|zjRMtR#z5+baa{N1cWrB z!Mj-NOdg(rHymRZ)gI~QlY{R1r>8|rYs*8BPL84VT0yaYI$RskSZvasjxkplddg*; z$)kV{`rR>lZq4ydJ|&2*FLlmXRlhF;6G(j0VWtYhDqQB*1y3<>ca=RO=hYl*=TcR5 zeZFJP%7&5&$QA21s0J*Po5UePzkMy$TWnWvt>d*SZP6;a9XS-1KO(*QD|R zWzb!tEDaJ3?AF_7+UIKE!HSQ)c<3!;18#N1H2J7y37o4`@15MIce4fgRi8 zSy-e4TFURqe~BX?ubKYMGqwaVN@>C+9f17KrX}A2H7)K8*hcS@2jYDaY8P2i~F}lIt6{jJOFhr`r~F@yz=*U;p-OytkQNi)T0=uf(C>xcrse z>>fC~<|I&ZUt|LE9yy1o4bO3Sz zS*s92F2S(8?!bkPS^huj5zI^K%75-E@)V~rP*tkHE1kova_Io10__hdb^$^V6tjs`ee3(g8?4%@3fvJ2<7w zW)#6Qq_c}>6t>6pc!f~LYMI9?RY+~4JRO7(FH#EA!T5M(LODC-AFosq>X+-0FC9Qg z15)+JfvQNJ%;)Z5DZeG+TaLmN_4^dw%Owb1K+z%{Kqvx=F6jWU2NZSE0pJY?qjV>>!q;1JEHLjMB*w^U6Xk9e~z=FiK}4pIZ_J=>RkZgjqUVSfm38a(^)_9Y8Pv z#kO<+ssq9+oxN@<&6iGCqytbF5Ps?S(g~Mz07`d{S329>DYGL*Isioh;gwFQ%Ty3S z(gDZ^6mQZ2$OIIJ(gE~48qCsRQ)XjaNY;_S0mZX)009ERD4hv>Zb_s|2LJ;~NC)5> zTtYelc@Yps>12y}Wzi%Z0F4sTk%Uf2M;gL;FWXzdCmqjsuTDPsKx5CL$M?(BQ98C# zmw9BgN(b;FAiboMG(oVHuu&}?0F4sTk%VqJYUsG2^#BN39JGNOurxx~bhJSHnKn#g z7cnLsfYx&-X@X$e%TnpFBOQRIfMQZQfFO^AG@+!230bs31TqV0g&GWwN&Z4sZ+0njKR9ZBf4MSS+Agmn7le`EeLTt@_D4FCWD M07*qoM6N<$g4fu^{Qv*} literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CF.svgz b/navit/xpm/country_CF.svgz new file mode 100644 index 0000000000000000000000000000000000000000..eb794a0a4f3746b21e7461aef4cfa18e8a403fd0 GIT binary patch literal 609 zcmV-n0-pUJiwFq%CwfQ%17mM>Zgg^aUqePNb9QF{wUpm$+b|Hv-v|32H0`B@*uFdc zE^!M>nlcz$VeQ5qv&2mdt{rTzY5x12oU(^?Eo2Zq2%U8Ixvx%Vk1rnYEAddYUD?#R z#1y0`>P53G>s2mqZ)S;?7w2!^jNeVaOm2Q$UyANwC9ZEjeEK*MGRd;9SwSm?NTDPTl4I zh$jGu{!(nqWxr;vyd%ZBC|Bz~m!1t~2qDI8vFJtD@2Vn~cV$(by$4X>Ns4lr%b(S+ zf=}CWQ@ns0jK^H^yc_21MeyA)_TcTh><=Oj*2`@2!I9syS8Y+$hp_eQ?AdH`89gF< zS5#HAJp^uFhffJX={>wHmVc9i zCyW~*_|ybV=2Ucxc~zVQIF%x*$>pEBZkn?0xwT-Fpcqm>N~8^{;C(E1AnPp=aM_JB zK6q!93d;Fl!HyD06$C&Vf>urk?KEiwqM$T7WC8{--djLpp76mS7;DfHuZ%K|5Upk= z4;Pdt)Jn5Q2>*pwR*^%p{MalVv?dO7k?o!4mS^qS10UECq=+6=yeh+e&|Z52ZM^kL zD{HLsh|W=rdZHWeoHt}x0%@m^0$T6D1f#7A;K*5Tg0qI0?hn+?A)GN--a<0KWkQ3F v(Wo%0VNJ-dLN3^VLr8L5Magl?nH;$plH>LA{)-&PfA9HkSc~3JF9rYreAO)B literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CF_16_16.png b/navit/xpm/country_CF_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2debadc294ccdb938c551d371c3ba3ea1ef53791 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`ZJY5_^ zG$tme7-S?RBnUkI{p*#mIWq_}-@cx1yZ*d^fx(oHS#KUqOLAcK;o;%oQj)JaTyBwh zFIj=fz|g?Jrs{b9st;d2^Oq%=Yyc|$^Z)z4E`KvkiYhRpGrcJ=Yc1O zf8Cw2$;V}8*E9B8SqT^CEbLTEshqiVLSu7dG4K$kOky85}Sb4q9e0B{jzssI20 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CF_32_32.png b/navit/xpm/country_CF_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..1d12b8180f1ce9d17ad3e035c6b14be41633ede6 GIT binary patch literal 321 zcmV-H0lxl;P)etib#?&g*%7B#_Ch6&Kk z3NpD)j5gu{iUoq)-xI9Q)5?Nc-vdV~=QwHIJ6$)^O63vtE$H5E^Z5rm2g{!g=QNJp zk)yr^KmM@1{>=UQGxwvn0@N}c#R5jg|Htpjs#fH4vHzl?1uRGwFm!IU`TL(~-eDsu zTEO`K|9@iCJxZwfxN$F>%kS?jx1fUAJ2QeCleh`gXFaj)Kxo&=g73szPA5FKY^71z7 zFIaHm#5R+&3;)k(>nxJybGgyT-d9jkvG1}a`?Pf7Y%ji#_3S{`ncxr!$!^ zUGBU%t9;2in=P}SEbv$$!a2nx*rjN~Q~l_Fo6@>Y{Map7TtD-%Jj0@ci*l0_S1~>K zclC3a^ef&K|K3{NvFT;wPO9EG*={%Q8kKEZGB12QC8e8eD!9LDhRE&Hi}G!EUd*wq zW@8G-bUaj%Yi4ztHG|1H)3 z8e`n5zgv_Ae`C6F`bdmh^k?%coLSrE-2Ag8;=f+Wvkke?Ka0+7*07ylYac#O^MCMn z1GYfJjxNU#o<&IlQw6=+r|8QkMpWH9duCs?6G%+7d4+__Q3WmK{JWa*=M;5p->0SB fw^c;ab(P<+Gfa-@o%|7CTrhaL`njxgN@xNAk;TE^ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CF_8_8.png b/navit/xpm/country_CF_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..0a056f49bab1bab40b1aed958cf30fea52f251bb GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}rPZ!4! zj+x0%OxBtPS5h`ta0x>1=LyewVd+>14GM8iALtA2791o N44$rjF6*2UngCG+K6C&8 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CF_96_96.png b/navit/xpm/country_CF_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..e053d9c7f152f0db14bc1fc8c4cd6325bd586c10 GIT binary patch literal 830 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlJ8K6|=2 zhE&XXd&}EjI8fr)M@g#~rNz?}8;@vBiSseYQdzl8=Zo-y84+88%HI5uSQpdP$Wg~^ z8u+NKrB&}rs4{o=r5mgg$GkmV*qzulQe#XsB;H*1w3(S)QMdZ#$;@BR=FiNm3Y=QJ zT~vQhY{j#z|2H3qI!+D=e|~cHKleMVS()4ZwqIlIRZ=f+d=#5zlfotC>i3RG^-!A9 z9*qnU%gl9U#}6-i%rVO)NRMgds$#{AFg_V~QL{-gF)>LOzoj~F=e^svMYmhp!%UA! z)v4Q>o&AMf>|3GTB}EJWzPPo%{d&^-a=v?O^Z(X83iq!6xiI)b&AioOFS<*Ad|ca} z>wfKD#QXOrzkYwBb)40Ee?@x4l@g&9Wt~sC*VZaKuP%Fh-)zmT-s$g`er^q8Y(B|! zr`hOp&=SsRIJ@vNkJ3F6G=WS)h9)$!6$*Uq77d90g+EBK>MBe->4THAgZ<0bt%>+BdBwsMpy0g^ixz1F-^|FWd2sCS>)@L!7HRCA z$oz5RzGV&{C;Zg9KU2ng>ZyG}H>b;Z?>$$3WH;Xtc0L)8)wlC5oT@FqeDv(EQ(lFe z_vNRoaMb>NCHLUtN`7{ulIjAb%$vTu#p^|8U*ezCmd7paBlhF>f~8ZR)n2!+`~3fP zV#<+tQ--S_UszwsIb9k4`+UuLj#*2r<~cGjGxD$)2pn)Anvrq$@x4ERZze9Zgg^aUqeSOb9QF{ZI97P!!Q(vuQ%8`9FNy)lD3M< zvfXQ_z zl!jw`h@BF4+Uz(|pb$a0S8K5`pbCzq7NUO3wa5{Unh4=X5hA>+s^WM~>Gee%A@T4w zH*ybuimGbtk#_msT?k?6hJpkJo!h>C74vC2i*NrZv?xyb$dR6sFg!)mB#hbofcj65 NzX9@2eg&uj004#vmiGVv literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CG_16_16.png b/navit/xpm/country_CG_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..298d8c2b19e3cc45bf289c11a049f08e4d4aa926 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^rJzX3_ zG$tme%y@OCL0acZdhev9rsDmwf6uhImv*oiZ+f-={r^3$>)V2xEvz4>$fl)CEEk^t z_wN_>CY#PyCC!QG8@sm{ERP;IyG)dc63nNsGu-8;)}xJh$9N0 z!FY!EIE7Vz=026FC1UrZf9g*;GnuJb92WABao)QOT+~P)qI>62+e47 iP*uw?TrA1N$Z&bPftH5x%l|;z89ZJ6T-G@yGywn?r${^i literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CG_96_96.png b/navit/xpm/country_CG_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..da0361132c6a6955a41a097cd30354f2deb771a5 GIT binary patch literal 687 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlJ8QaoK8 zLn`LHo$Tw!P=t#{Jman^VRE@RxS9r!d~v{-@p3HJ|8WK6KVBy1gbyX>u$X|E7JD-4K>!*&hA|Q zfDJni%vdm?u+h*_@iCKk6Vq|lG?vzW?lT-*^5QoHRD{GO1XM&JM25JEg!l?E6=?|Z zLR3XgTtjq;qF#WOhjYw=zzLIfILuYBEo`)Mta`*0+Z1w?wTmUQn_GnQl9+gg;1UD9 z07Z}Vm<3J~&h2oBn{aD~L&St{f1^*60K&ML>gJxq*`=>n zpsaCf$AQKL5s#VJo059D&xwi@#uQ9ju;X#lW|pI};&b#ge(iYR;;4CqRh`RAQP09P zK&j9%-SOoS*14=pg~dyRr-Z~@a16*QbYyp2d6e}ymzRN_g;&6=!h?ZLmwLGQxV_Bu zEEF`J?s(9!V9MhrGsn*3ti4S|F&8v6jQr0-W_2jw*GS~T{fr7tt zI8PP6{j9HXJoI!_K;P=ltqWwrg;OU!&RTk=aBJ|h9k+h6>irIMI^HQV9hd?cJYD@< J);T3K0RUQtBMkrm literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CH.svgz b/navit/xpm/country_CH.svgz new file mode 100644 index 0000000000000000000000000000000000000000..c27e64412053a2e4dd29438811a0affef0714805 GIT binary patch literal 375 zcmV--0f_z|iwFohD0)Z&17mM>Zgg^aUqeVPb9QF{jge7L!Y~lWpC$1-9QAo^H-sqJ zAYp(ZF-l-+d?J&Tt+8v#Rw?@FZ3hX&XkuTkz25Kt?_I;;z7()yRn3)*kdG;XTBkBg zg_0~nQla7CvK6++k8$!kpFq9KVg59_pT&SYLS8yCA>(8W%jY|=G$E4*1gOw@+b6^r zgG~pkDksT;1eE$@F^N4}>$wBHrPmH7R@A3B(;0GJ&Z1yEFLZ=D)IP}YOc%%fjx#e- z`v_5>U^CEUZ4mt-#3pSXFGzYbTrQ!OERl+tKlEYOCniaM^52lqW z;V8IPWvOJ14S(k)%Xr#oyAzp}Y0mmibEP(`GfnK;zyL|XYuIqXz(y`X7Yw!^Z-TEO zQ)S8}2G4V^tJqq*LJ^^>?8axbi~bw~`3Y>Abpm>)`k)z5gt|6-+Aj|Nfd^-Py#wwz V$9Ee%bVIeD^$jxgrQARQ000&ju6Y0e literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CH_16_16.png b/navit/xpm/country_CH_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b899f466b7808b533ecec39f233278aee03841fa GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_uJzX3_ zG$tnRQ9ORifh$4D)0CN+nR}T)`#QnZbCj5w55IT+ULRxUeuJ&?Maas`(@U4>ig)-e zZJO+H?EnX-DqpPf4rYt9IX9+Um6VXEySw-2-z$P0589V*R{YmkH7nF_qP>yiSp&1w z(hfg1wzl={-yKXQNUzy1fA{~68a+AnzjY<@NBK`UEK0UIQYkGGvsSB5NR*WoWjvQ;b7y@qbHp!;`k08Ikcd;dAh)%ggcz;=dU!}^YDN4Z1;Ur zmgJUMzcHKFvX%LnhzkgAJ2^S@@;m?MN0)AVKkvHtt@OKZCp2|H;O+%yst$$uO3y#j zU#fBH=+f^WX32g3v7>bRjPjYK{?sh@W2j$fv*2ndtrIVaygs$Op+q5I6U_sfa+ pPN*p!zpj2%e^=(==mLaKm>Cx-o!lZY3;59fHxkz*^5Jjl$$cY6afvCI_8~4q<_Vw?lo%`?a`}g?qL?=+(f|x|XT&1#dtMOYb8#nT6&noW3iC&S~Ic;p@%{I?DOr^cI#` zALh+F>$C67th@D}iYlv)T<`n;i=o|bfkJ?Q28Rd>7ZYn^lY=9I+dBFF{UWRQm^*jh ze|T{G)62gfA09vd+14DZVl=(1jfYZ7PL*24zuEcp=h?S6zvi^FZ(slV?B}fWcisPY z^RUm_o7;X(e%9BkH!oDJkHGE#n3)oCD*q$w-tK&QzphBuR3_tp1JT{d{W4 u--Ck0xTp1@zXYh3Ob6Mw<&;$Ui%$TA8 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CI.svgz b/navit/xpm/country_CI.svgz new file mode 100644 index 0000000000000000000000000000000000000000..d58271fdf956cdb9b7ebff77aa87dc2550ef3e07 GIT binary patch literal 274 zcmV+t0qy=DiwFq*CwfQ%17mM>Zgg^aUqeYQb9QF{jgLV~!$1&)?}h${aXffxX4hzo zl5N4HmO{~jRq+%;cato{Y)O`Ef4;loLD7P9d+@&Z-Xx3Tdjo^&dTm;PJYopFEm~PL zrd0x4gNylil$>Rc>F#a2gnp=C`+T=qr+^cp*El80b{Raqtbj+HX!(FJ9syu&?ctWl zITyJ&GF?Tht~k_s-;*~}Fnf@EAm@>^5<^dj_lw$I{J~!`#)2Qe59SC?OIr)Py7uF1 zrK{QsjF}f&3cPQMDmP`G8mn@7u^x=>ROo`FQ+s Uq3in+fJQNRy85}Sb4q9e05-}k literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CI_8_8.png b/navit/xpm/country_CI_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..813afad130e136a3f504e9e210eb99594de6a8ff GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_bePZ!4! zj+x1S;?5rcf;FOtq_)j!Y*Z}yf5nvloB2&~|cv$f90xu3AbWWa%f8L2sb7GeW$<+Mb6Mw<&;$VG3|ln- literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CK.svgz b/navit/xpm/country_CK.svgz new file mode 100644 index 0000000000000000000000000000000000000000..254e25a16d6f52cd417b27ed5161bcf4d64a591d GIT binary patch literal 882 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 oA;bpQYW07*qoM6N<$f}#-l@Bjb+ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CL.svgz b/navit/xpm/country_CL.svgz new file mode 100644 index 0000000000000000000000000000000000000000..e0436f1031f131e0f9eea48d68d75b69756328d5 GIT binary patch literal 430 zcmV;f0a5-RiwFq&CwfQ%17mM>Zgg^aUqehTb9QF{rIhV%f-n?@|9cfp_eTVi zKPr!$iLW6oUMv=&jaqfX3SF6|V}z_-5k@O*9LPCXk-{y{D3B$1s~9KN+nW}{mGLBs ziG|d@9QlhQs-PNk?cJzixgb40O&Mi1dxwG5c{|n9_$hM6YK#c_1VC44}$Po_q!%tw!It6N|DlRWT1GD z-i|xLKK9^k(}rjkc`1>E)E#=2ZtB=QjP5JAeqW-lzy&|+@c*PvhOo~MWASWukDWi> Y?GQIYj%!z(oPPqVA6EN&_mBht0B&Kz&;S4c literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CL_16_16.png b/navit/xpm/country_CL_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ac74985a27d46dac3d7b2540292d49288dc591c9 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`1o-U3d z8WWRK3}R0=u!L=$-EQS={D94;;>m~1g3SWTj?L{$f4t)R{LjfY$@GoIzeykM4`1}o z@4R^6(18O7PM*t|STmuub7BPV{rZ1<%iaqcu97^#p?XZa%1I?t!CcPG^Z_e_*)x&1 U4zGL;0(tXGwqdiOsN1Tb>r7%CM~@zSlcuMp zd@OUN`jaHJZ~y=Q-@80M_$bo~{(XOcNWams-54={{_N7=^{VRD#-Tpx4t$Gl>@v=` z|Cf}I@FKD%`}9QdE880y8y{YuUqAhQ&6SWxi>JNR5If;naQ5zx0~UGzFNfb>nZd|C z=j*4p{l6lwOG-$bQjcG_h?PVB&!4~iy^g8e87yu4SbM_1v}9x*yuiOGklRgHVr#;c dCc#8ThL~NZQ&vZp=L3Dl;OXk;vd$@?2>{zfc!U4| literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CL_48_48.png b/navit/xpm/country_CL_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..e2f5fddc8c6ecb10073d7df7530c0bfe38cd862a GIT binary patch literal 422 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H>zUBV|iG{23fBr2@$T=u=YiBmjsv}RP5_p^niU=eLlWs zew%mp?V9C#=Na+(YF1dp_PQLoSortCK4s>wvNs!RtK;%!wy`ldHDqR_`*jByb1*gZ z?(GVm`tR2&E%Wc%Q)V$t2vWGe>tEEqGSQ!|TsyA(TvJ#1S%>AxW-HTl36rJn@~P>m zyIB~nfBTf8^y|x|g)F>sky%!0qTYG8i*L^h-Q#iACm<`K!pYCKZk@F6_KPK%w*Q|# zw>l)za#TSlFk0f^^B=SS-Dv@H*%A#ox*a2U4kZbQHE)0l)iN9s2v(lWvN#eL@C=@= KelF{r5}E*NDy{ec literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CL_8_8.png b/navit/xpm/country_CL_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..4b4798bc176c8eed9b2c55b3ce135b02e853b8cf GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_c%PZ!4! zj+w~`2C=6Tc9|`CbfiAyfXbosW=linGcp_O{r%_leS4omwq^DIB|cT@CwUpfT@*gF iXkKF@=W2~eAqKVmve}xk^-@5i7(8A5T-G@yGywqMeJ#cS literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CL_96_96.png b/navit/xpm/country_CL_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..c9e2f0e1b99565b8e102539768f174e82400c547 GIT binary patch literal 814 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlJ89(%et zhE&XXd-J^a+J{e!%} zcA){wI}|i7&E54h>Ggss_oF$v9F?A>(}3NAD^B4 zems4)FQPCH@U(**1)Z%;a?7*ISACn; z;C{zp(?)?6`&Vz>b5SWxLNb!`%H5!Q8KTBLJ*)0D`|*?>IbT-)JFn(%;*@VZZD#Z0 zH+I~Af7R=Do^NU9tEIE69=W=GSyLKldLhQh_|kLRdbJH-CwLe4e5o}5zo+KE@8WBL z+x8#Pi>a)Ae)80}|MkB=o_cb1>D)OUMi1mn%r+O~mux6y5IJ+B#42B;l~=8MmfYvM^~@IqJ^s%sKZKZE~T(_S}@z10Um)E{6`qM7> znw$OA`z%wgXDe5RM4g}ZZONB6FIP?pG%&ZHYic0#;>m}`liA+I^?I#o&yB_NUo1Xs zm)Lxg>3*}EUG?;uubHp^z2?8iXL|7Z`X4;2BG~1!B>u$mBq%gAGO#g8a9}bvyj-~K nN7m2zA9=7!V``vSZgg^aUqekUb9QF{m6Ba=(=Zr?ubH&}@bYrANNsHQ zBWtU;lh$q%(tt^HATF)MNi0&ka!gb4>v2A&6(}FeRo?hK$LH9IuMXQ1_R?0$XpStT z2vR2|RXXSRxVat95Gp5hDoUdzM{V$Gd43kZUVm6^zC7GOwa?+<@%sMl3UEls=kbb= z^=1tpKivTf86h|C5daJ4b_+u4x(@4cXlzdItk@MQsfbsSM(HWy-53i~mtwO?I#k#^{or3^1^YPG{auW`q~^gQlK!W z5YaYIDyw99TZ$Y^1}m|Z))*a=_VfAKtJuoKLI3pL<0EVD0+}jHj&CTv6jO;np1DIO z{yUdQ#zxVvT=Y*aOH#&qF3v%v9R01@-`1TKy2^~*a%^8q;pD|+IvCRcszj9XViq(< z(KPIR5^S^Vge%(FStWE{`f`4FM+X%430rnLu*Nk5^BZ*SzEu+1Yg-gn zWPO531p5rl*Y5n+FvS*uv2+MLmVa85M?XU;tE%@}U`1tsd@`E7Lb@OoON_wa5p zs~DEZuoetu02Z>K^7aDgM>!M(dal11_@~_OH&4z28^%5pZ)kUB%8`&5I@3N%i&Uk zO`zU((lPQ!81*bK*AbY4-Lss4002ovPDHLkV1nAVjrafn literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CM_48_48.png b/navit/xpm/country_CM_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..78d24d9d07daa8ceb2a1c838b6dc3dd5acedc594 GIT binary patch literal 403 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H94mIJ@~~l>x)HQ#umG|>!j9R?+yF!$h1gEU~0n( z78g|oEyh63jx2viEf>*6(*x@qP9B(frBd=KdkR}>QPSR?tjd`}-~Z-Dg?mahl<~hUftw;8zzMpLNC+E~N)f;=*qNiWpXfIp# tI`#9nFYnur!+qoB5CZbx)&0!1%!ZQT$ub{xz5qj+!PC{xWt~$(69C7PuO9#a literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CM_8_8.png b/navit/xpm/country_CM_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..b273944da3c81b85fed5e632abe3c67be3118fb4 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_^o-U3d z5>t~?R&@P7f8f9Yfx@RpJ2xHX*O34MlWBEU2i5+bZ)yaB&PE1>6%DL2l^^}?e)zxM z?GD$!zo`icKYq(^7k$5Nqv4+0C*5XAb7(Ozlx2#}`@ML}0-*5>p00i_>zopr01L7_ A8~^|S literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CM_96_96.png b/navit/xpm/country_CM_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..6a335a3513694554c36673bdb3a9b6d90d05d238 GIT binary patch literal 777 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlJ8_IbKE zhE&XXd)qr(I8fr)$8x=$XMB`2x}iD0pR?p_*}V%#Df5{A%u~ymy@UU(4svhfl99)twjg-Px}=`OV?Y zUpw#Be|$T=^WOcrFYf+t=3r40=x|VAYNVL4iF-xGIg#^HZ#CV3%&OXmon{y2C8_Lg zXwp7hV0aP8jIVB(cxY!xb<5}h2G0*4lasK6AUP@ zJQpXRvA)0#Old@01a6y>;bx;1BSE*>CBQfKRnW~B#QDxS4n z`|sL~#$R5?Jq}ZSx$>l>&YL2W^{T^aLI=<8ci*ypJpcOk zYQc@G^8WQqf*<{#|2ZKk{ujGvnw4@XDb0QU^n8Ao(xdsF=kLFZgg^aUqenVb9QF{tyWua;y4t3@2`m5hi$cx_!8%W zfRT2pN+az^qnTOlOQk9}2C@@k6q^G5^?Mw0EihVbCsJvAZr?ff_Zg-i4x8M0k)_U5 zF+;?~$dQFmX;!Re=&$dO;|Mw0Bt@F!s*p2ODD+`|Gu1Dv8^>`VxzLkT%+T7H?Zor8 zyE1oGx$;us$y{z^VYEkF;-M~Fbm4osa7(Gxt`xFL6QUnkrpqpLzjybn3LKkA+DN<3iu|QlY_1sT5=Efv=1FZ&8y&o)tf?HdA@~=&*rX_-hjygL|5F37OI@ zr12iUKeWy@e)mleuYl(!yYu(GyPHMc?K7!>m*Z z+xHAT+E&!^*{tRB7pbm%mv;6{#L_>j(lcxtIb`{MWAgS|B z8UxhTPkNobt`qh2`RKF}cJU<>W(Sl*bEr7oNRyq-E6aaIjOaa}0vbaVxu`r?QPY zE-EY)o6IJ8-%OV0pDYM+ytYrTZnPf5>&-Fsnn9~oyR-IOQhVz4jx?va&x%y-#|=Mt z7^BM(HK8KL-v(@QE_OEtXDvioznG|*pNY7OQ(nXJ2{3C_A z>|3ZZm1T=W-Z+HHRXIbqLG{!w+gsyURuAgm{+AXc8Y*T%sy}Z0tDrAd}fA* z7{*sN7IFypuQ(x-;&Yr`Spx6Jd2*EHnfy;gnWj>UZXCNJvCq)lYSU3m2ej!l+H@Li zT1TZ#;4);?g_gQsXsMwPZ#1-Oh;5y^RY_;Buc*F$wuxEy^RZ6@*})_1{0X1L ze!BehA8fDAAl3jIw3Qu*JTYZ^Hpd)TwFJpc zfDoyKGwW0beed)@#?_a@WL--5GP^a`dV(X%<=vQ!-k{l`p&*Gl9%y^jz7F69V4_#4 z2URMQ7N}M+S3`3PQ{20VY&eMnQk(2|cKv$nUI)}oC5=f#s&0&nL-d-i zUUS2 z&%yb7!0E{Ez$2G1OfY5KC!EJ&6k-PaU{UD%a8(4sIe7R!@UR6Z+=VNY#T$v5Ew%yYL-aiNJC4ivLaL?RRXP13xZ(uuk zL;lZ0dzIb$4K^A5`F-}l^Pk-fZT#965;G+B%}x6Ie|Fe+JgJN=ZvOm=kmMTx@ WYh2#gRK5-9P6kg`KbLh*2~7YP=3A!# literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CN_32_32.png b/navit/xpm/country_CN_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..d2d0a77de15da80a7057f8edc2a9038894dd59df GIT binary patch literal 436 zcmV;l0ZaagP)sEB zdp=*+%)#12W;@^|VN5GFD+|XSO{@BCN>nKTY9W8%f8Sf)i_UX*61Y#My%O@Z7J%%o zFFr}z9e@l_z2skawqAmci}K0)Nd^)Cf>&0*;k}!@XH$A)EI?Nya-J47`f<&Tg6x)M6MQvfMLFQ~2qL5OB36`2Ago9A zl|dSIhMJf;Y7hgWO7+|$08${k({i=~J?pmEFu0A{mE%5+)lP>dXktwF2tX`K00|%g eB!C1EhkgMkH*JF1qdXS?0000lW;hYH1V8?ETgKW&YI;qYF0uDADIdkX$8?$%0*o=u16LxL< z$iJakV!{osrbgBy?$S}F3so|ue!shyyujp2X@Ty|+}1xm%dPJ(-u?aY8M}Gw9x5FC z9o6|Q=-D5q92Ddxd8W-9q`yM#3Fk0t_%^the zZtqkzrM48^_r1=>aC_C2JxP6b?;?`bro`_$DxM!+`hI<2->Wt8dzG%w6Z^fMJCc)8 zfY<8NitMXx4;Np*@#yZVdxA$>lW%FPSk}7b=C;XMAD8Z2HF0)(qRO;qN;wQC)`y9i zB`PwkI@xbq|a{qAJ@xXG|fk~7Zi+K&@k#J+AZwhLNevbN{gC)@I;joeMe zZm#;Dd&+H3IBCSRpEBNL`#wj9gJEsu@|w7B^KL&hEuB?!LztJ#?&JMZBj<(pym$Z4 zGM;RGzH61Npz|ws`90$2ENAZGb;{gdJ!f;!|0h*bU+10bHQQDCr}>b|NwxbC9y{go zCO&C=cJasDy4-rXjKF~Q-P4y=J5F1+C|F-qC}yUG%RlQxCbNp!KNgkyKU$#YyZYd4 vo>rmqHlN%N_J5|Q`s#_e<3`6Dg@3UI3!XO)5PE0^Ol=IFu6{1-oD!MyR>L?~SOF5SbkqM?(KT_Ki{^vPGIV3A3b_ndFgLP28@j(e*5b+B{NI zNzvyLZdhJ-UU_GfJm#@dGt49XaQ}t-IiGXR=W~8MpYu71PL6gOsykEx0MM{MfhTRa z-%mm|Z76klgtlSIWTG7&SpSLq>Y`Kt02$ijaW2t0v-eL0?Q+$rt&xoj|D{B}aJcVU zUT_e;#g^}O>aJ=W5{_q~cH`^aplDWuvj*1QO66=l(TV4(Wn=#pwY839dKRy36Hg8~ zX|Zn6?+_UkC~A$}UFOh9!H8NvhD3gsb28ehVrUHcu-_&~f`ulH^y)5}f4dT!QG5$=qpB292)CSr+FEt8h4Rzg@RaGoH- z_p=#|(DG(d0U$PX+gtu=aWhNPxV%&RR7y-{c!@226?94N9Gk-r;z%-(;ZS-*i`zjU z&_GU!yJUsmO8E|knw)W|Q2(e8 zfDVnk6YLy1z0q3v)znCs7j!W9NKcBEI+Aj9kV((%E@OEbdid9o%`{;XaJ0SU|A9}wmh>7&=B%C z{&a!-GbB3XWL7(yB7wqi3rr>7{rSs6qYdYC%HHS}l&$G~n(=e>nAR+W}Ir zFUI46e8ge8*}*zwc$4sD0)0@~R1mTrmnZ4d)1`=?pJC_4198xEaA!Amv=f9{P%vY$AqH-#>Jmx@G_yxAxOi zO35KWHrF4~S!KeEe;0QLij!TlJLb7;nBM}}IKrCln8^K9U}@Jfu1UKQc1OKqJN$8; zXL^&eH-BTYi$jsQ#R-xS>0f$2%D_jONvM9ny}jVT&%u90ai>z#N_nmAhaf;*+mT&yzY)#Dl(~{4clD zrd6Qb?7j2e(;lrX>STr2^MetKZGlaR#^7pwwy)hjUNTZgg^aUqeqWb9QF{g^xiBgD?<9_nu;yu4^VLVvAAe zq9MPu$r8CwuGJKrJd~qJFVdQ&MBb@0NC>_(*OVf literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CO_48_48.png b/navit/xpm/country_CO_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..14d5a8987826032797c429c00a25c08033e080f5 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@Hf@hP6lVMAG#nW{)RwaJoz26qNF9_aq{;Jl?n~e2rg3TR{M--9- z3_B!Tc$C0gm0K}4dE1NHq1+=1Le+Or1wJv#on{fdwu$ot&_V`JS3j3^P6%cGrGuxXLNQ!o|ee z*yP~2Kp{XtgM&I;gKeK@?M=*-Bi=NL{pSs<4_~q&-UT1nZ=Yf*RB?AT1A3dm)78&q Iol`;+0Kd&v(f|Me literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CR.svgz b/navit/xpm/country_CR.svgz new file mode 100644 index 0000000000000000000000000000000000000000..877f779c1b31afbed062b0f65709407debde9332 GIT binary patch literal 296 zcmV+@0oVQ?iwFq*CwfQ%17mM>Zgg^aUqezZb9QF{jgVhU!!Q)Z-v|2+*Xy&rNhcGe z-N1GZL3GTi_}DdR6Nv3-;;P@?WL4OMsBibrIlp_7Wd8nYU@tqX+a^UGF$C+1Mii!P zWQt9T^VxWmoaFb}=4G`2yRTvOcy)V|0iF>(Pcou>lf%Q)5_rUk7Iz5a5dbRZc9%qb z-$(rp3VuwH2=2h^ebH!J>P#Ye$P$$2~-Xq^-TYd|I8lV+dQ6A9qk0RR9^?2-ro literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CR_16_16.png b/navit/xpm/country_CR_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..1b16cfdb90100f3f2a2830ff851f8b08ee8f8646 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^0o-U3d z8WWRKF04yeU^SSyWL9Hiqw1B|*($s}|NsA2_hdflm$XNGzW1!Q;-)N>Oof}CTdp5a rdhpzD5}VZ#=ZuS5mrO3$Y-M6N&CBz{LeS(3&`btTS3j3^P6XV+;5l-^g2!o*w_{tP#?Inh8C%$ES*o_*G`wePHS;QCJ)2;2hog$o=3Ngj zFCqn%5SXBajr_7ns7+#)PVyBe$*WPgg&ebxsLQ0Ikw5UH||9 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CR_96_96.png b/navit/xpm/country_CR_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..541a763c9502f6d1ad4d1de83d86b1f67684af81 GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt^{JzX3_ zD(1YsV<>poK!nxtG>?yxufwc`nkP9XX)jF@KRAE(b+5-i?y>KmyPE&TTnEPm3IPHd z93m`SOstJfNZjOeJAbvUjl?bqR-0&ZJ^d?h^k!Tppc#mT`#tGk6SAFXN)Fdw`j5{6 a4_Wst<>a?o%D@QpID@CFpUXO@geCyic~?&W literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CU.svgz b/navit/xpm/country_CU.svgz new file mode 100644 index 0000000000000000000000000000000000000000..fde7996aedbc63e886856ba7dd07904c34aab75e GIT binary patch literal 639 zcmV-_0)YJ=iwFq+CwfQ%17mM>Zgg^aUqe+cb9QF{om5?Kn=ll8UZwtrJNG4-0NaE# zBnqk2&rRyKN^3Xmsd9+}RtZMN4e7t1Z6Ix>Y?}In@5ed!_*`IqvRxOj;i?w0Ob`tS z0$!$aDatHCcej^*j7}DZ2lJ2T-_LG;-&{bw$>8Sh^!m#gARpsjqce=pZ_nY!&nut- z#rWbI0+efA%`k47CTK>1R2jZftja}NW7CLjqXA(h0 z=t>Qs)VZ39(VmMV9LXMQykdyg8NI1Q8$*5}?E>NefZk zFr9-~CWyI|;;Dv?D>N?kL62D15N@0BAL|GYEV(*1?iv?CPTB=ZraWnJF<7Av;LKIcPy;>Fo@&h$(W9! z@idBQ7*D+M5bBf_d_aTou(PoxO=Zd3g!M=k&zUS;;bjMv6s0!bhPB(62f^5*e;G|Y zpAMmOk;c9GhWe>CSGS+WELVJGR{FyKim4UpQ;+WU=FHzm;FRxK-Xz>%{~P1K2SlUj Z9g}vb-D~BZbNi23`~i^-#-A4j008^0Gi?9> literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CU_16_16.png b/navit/xpm/country_CU_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..59f99cc6842c53e1d1d6e56bb4f7181cc84cf46c GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lNlHo1w36G zLo_BP^91@tA6|LV!6YH>%%{(M-5+Yj7?n&73=RL}|K8#M{kt}hGf(_tT0%mCh{%ID zi^-m0Z4taYJUlX4UaO*~8*qORED)OVDB*YE>wABH?D@aHPB67Opya~trLQFVbX>Pu;@_X2W#5ck zJRbb_xA99#1lpL8R1JDTf?czKr_I+nC0gk7UBCW0yMIKiHYHV+sA#nzhBYH z0tN;Kc80$bKkSnE`-xT-FfcF({{J!Q<1W5`KWSwF0|SHNpAUT>ce644rLF}m$Q?p|#iSG1J3Ho4ezzgfrv!Y533l zm=E*+&wqYHEO%_UZpg)`33Y{L+vwyDI!SHGKu8k&k^X!6q3>!-20{YRA#$Rx!5;ag zHUu6P0H{sIROu_&_Aburv&^48 zT0j7N&tFqEE8{9q03%BudlyRvgcLFTzLNV6$+l;gTK?)ANRqXNk2$~WeV z^pISD?I_jo9=S=2U*7M|9{Hf5lo`%__70yyGrBe>1b4=iap`i-w{@xue zH?~-phKK}P#{VVymg%z{hJrj@ragJxD%xsh+dB1=vbX@tdAu<-=@CyV=e@7Xlmis~ zmeDD;+@?C}pXD6-`u)9Y5g!VRR-Q2xUoaMpI4Jtq!#{p@?>Z1Y!*TAitwU)5Z1%h? z3AD)w0?=36@cYqI;kf5QjsI`6!zSr-hE6SO|82^T#sjQ2~_W#fwAN!p*FZTYbdZ;xku;;l;>9*?Swo|SM d>+_t6;X<_CtN&-KzW}Xe@O1TaS?83{1OP9CNs9mg literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CU_96_96.png b/navit/xpm/country_CU_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..645a2e3719c8d93c6650808e375289025f42f643 GIT binary patch literal 1956 zcmV;V2V3}wP)0)VNtSKqSU4SW1p$D8x2IPg4dX0eI0us(hw;K0BX)< zYhq(`37zl;A`LO8*fV&(aPG>QGZ*oNArT3J0CD$_wq1>ArVP}0KipYzCUh? zv-Am;Gz2155CGT<9_7A2owHb_mm&}hf&ifI+O2}=p905WsYVpyN3jN2b8HRT1fAl}90Pg`oac?WM<84)}m zq}2#~Cs$jS``&c>!(y?K$U>+fcJ!OVAKx7%rMcs$y3EyLQxSwvK|y_bFs3-+b*+Ej ze=u>KrAUd)o(r6e{tcVT}@B@zju;+4lwkAqMbJ-De zifKEw0{}Xz6;g@0Z=!i_bJejpmsvzx*%2nFg9!i-t=6=S7S|2S*}kec)Phsq6Tcuq zOviRle|h?^B#t&*b%yz{R%v@h++Twt7fs_GPX77yMevYk&*)(j$1%?@)s&X8-OsPs z_lxk(5*(%Ls(xF-4&eYv$Q)4IuZx9EcqitIRe(JG8NA(br_U&RVUe$0X6n182le)~ zm0Y-=?yy|HtxM?ad0a1;y`uK~6%kz~IZ7&#_7>ezMBBjA=ryQt{%U7gqk9z12TxS& z{aJLci)+pgwB?I#9!MG$PwFb*bfAC{&C4)fv^JHidugL`>K36d9%0(YN$fIH-)+BEF)R9B1id=a z>$-N7(%-Mz_8CFFq*MqnUIZ~6o(Zzt&f#k70Dv;+>4Q4j4)GLkul}N+bI^`w(iP}(rr5c0C>J&&PvW|Gba0X5wU}6LCDaDs$kJ6 zWyI5rBBj^y4#$H@^XhjcIEo)XT)aMF)+FH_@QBJDGii9|p2H>OlnqaU486OTZq0HO zmArVceD{81O0w_{S}&V5WA0>;=?K8nHee>ctu3$c)yFY9rnR%ARLGiF_($WSKVK;| zqpXP8CoK@;;AGRzZ;)DH!&U<@Z(gWJm(VHx`&6ad0Y3?%+eDgne@g`!{82o>;1@(0 z^royWbR@QYS@MEe5K^n+wtp#Nk(yXA3yR*nDmbM--kS1)Q&7Z=iD4g%#aNI8un7ts zJF4~S1-Pn_10F$!UP&?OYdx={DHIHX7*lNgjx7|!NH0YoQU$5QLQQ+NHkg)eN=Oof zG@AI#G$t+vR~iD5APAw@uQwR_^u!m2M8pej5>%)Po)a?MrnLPScxhBn6~)YEM^qx^?Z?22dqH+k&0~k=so4Oh zArLo$ctESzfq&47{CF33+z8rg=zf?H^WnlKNkc&gv>mq@ddL!mOkNUnLDOcPv7cN~ z$mBmkchxNxvMEmFul*hh<(ZBrlx_|?ycP-l{)y%T1ppSLo)t2pSk+vC**Gn|}c_Mh5XZJ#?-B0000Zgg^aUqe0tcB*>97JzdoF!`gVps zeERAAy9o-yDEbp7QFL~3hJOF!XXL#_(fO~zAecM17)8-?xx`DrWi^W~K1PfX8ht#U zgx)r68pIIZ434~0N^t7Zpa~U*Xj0k4*%U1^H%IS^t9qI&EIQe9n{C9_`70ELex!FZ zKnVE^i#mQ{4n8JnVg);^(OvExJ!MOcF;UywS|6-fJ3I~uChMyeRu6?`mb!Ty2)dD5 zac;BO+{FQqeKkwtpjiW-K0@QvUe=Ae)|(atC~CWA_j;bJY_%TYJ1RSM>%LuJ2?~o{ z2(%wuiM`-xoegCV#Z@y+hCwo_ccQD3qP{Gv>o~YhT$SCO5UksA!)^NeH=C}IZt@+5 zj8m+&QLlC`Yq!chX_r}^kA5Tsw1L-6BPU6zRVBcbOH3>UHL9m1q8A#CNebeUB!!%cH4EQwK^U z-4yKKR>lBU;#rm9+F<=nD|6Xi-*;uChW}U@pqM?cGJ;V|>9?%R)cSbxyRHlaBJL}* zNZfpD;SGL4ps_YgDm?_!a4$ik_Xs%l1=T_gfibM9QQE71`H2M0$bkwB6V0S#Ljb?T zOmN=VDxWcE@E*8-^pw`E-}`7Fyb6qXl^bj*71SKqa&JJGG~&RokXSJ)KpxD&52J+o z1wNeF6S;js{}Uc638o;lr$`VC2Kd*W>S;>pGuW}WwkXr|>+F!t^FheMJ;dkpjdPFa zX@PkjAq@}Afa(c(K|-j+M6`r}zf&C`#9uujFGq;>PKnTb7#fX*0?-{Gq~B$ZLWp3P z(QXi;dqR$~%W$l^K?u;EkYk)w*XLA8IzR~T33)j}7~y_%>DYHj|1R^AgaE}{HiUHN zq{>N8$T0}%&PkO+PsmYrna=zk!sR_7vnQ6Pz0DJ6PeOn6!cs~z3>j6JD)#ut<}|Ap md9oUP&dcf5L9`iFYWre6j%KHWaq~CZ>EIuZy)`y&8~^~DG{8y# literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CV_16_16.png b/navit/xpm/country_CV_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..4a217ee9907488722b6771055681c24f4d74f3ed GIT binary patch literal 286 zcmV+(0pb3MP)ti~w0#9s zFqqy9kE_9{5ycjdEiNoQp-M@%R=K#ETu8Q7I?-;iEJ(91vZw|H03evQ$j-HQJ19v+ zvZ#rqlJqH3=qs6)CY7PDk97Y_{T4s4I)GmD9E1(+fQPes!@bkyPMdqfy*>{>Pv6>Y kMgWe?eg&9M{!MG43qkpj_r`Xu^Z)<=07*qoM6N<$f<+T~p8x;= literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CV_32_32.png b/navit/xpm/country_CV_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..b352cfc6737130d5b5bc6b22ae6d588ce593f399 GIT binary patch literal 484 zcmVQsJ;y>zZ` zQ1?ED9=dfZf`o!LPl1Bu){>Rm)|OhBJ3G^%vV&voigWXSo990~KW3h1p5eg!9$+cR zGnWF~-x2^9dKRfWfz&|G#6urZt8NglZ%PRWs!9C1Os zn><{f$vXw`U~G+QAPg@{BL!{9!qCDH6Yl=CKmRcN{N{56;8>4qKxo3XGiv;Aiz-?T z%raIbV3sIW;})wDK$`snaK`>YYt$V$YE+hKEr8vD<3=U!0FWIB+27rPn2!qD6>%2t z%~|y+KwK>r;=OsRJ`D(Omp~~zGEgo`OpRihWt58&WZ3VbHf?I82}U#nVIyrnJ0XPm zLu*@PzsF33ix86UeUK!=MZd@F8el1Oy|t1d6?6Hye0&$*q}v9-VuN-1KaK#;C{ZG7x>W7Jp^mblP= zz(0VvfITD_7c6}w?omTDaf2Zd-Bd{$p@ftKLhAI9YGKF-(|cS@(vTYGUfSVh`YrGM zW$t&Ub7#&e!sVxMm|zDjP)$QfL_r?tvc0B+93gcIMR$UbGK-Vo{ z=xn&~_|8m!B>y?xWpTD$_N0EarE{9qMO#bBwUD{3 z0KkXu-S)V-tuUmh_G>Atxnd(LR3`T3TVJLW{CjG(*!*^`uS~AJK2WmjP#6aQi&roF zuko6ZxT{0$v z;FQ@52$zwJ$#4YgA#bZx=_45vLr!qAid-M3vf&sbDjQrMC#y)r1xXQtW6v`qTpuHI zL9i=xp6g>gGgAMt7d+G$ybk6(`Y#G%{!4f~hQS+k+JN}ev9$u|1Em$v=M@P_e4}@gVOB731eps@K|Ap-A(_@ZFCSgHwnA zJNhz2n7BVR9G{N3cax+FwB>xubn5h%^hvuMi*@FRFuB%larQphTQK~~`4+c?WFP7? zZ9i?ZaFg-w(JKJB`D8G=9;l4FB_vzIR+hB;G9tA5G8a{LC$y8vuY!859%>P)^ksX& g5iCFUnL{V^2fPe=)4)@gvj6}907*qoM6N<$f>EPdGXMYp literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CV_8_8.png b/navit/xpm/country_CV_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..8ff0f369b953f19e458a058892d2e89400d6484f GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}|^PZ!4! zj+x0R8)lqo;5A4Tb@eFN@b6*5-)2`QzZa9|Tu@KpJoa6BoAJgyf4{p=Xl!ikeEN64 z{UHyle}{8^^>3IY_()6i<9D9_lJE8iwRmrESmB=k^I{AugYs!HqmQ%HCIIbV@O1Ta JS?83{1OQxaKR5sY literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CV_96_96.png b/navit/xpm/country_CV_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..d9dd77cf75166a3d86447c91ff5b6c49b23c371d GIT binary patch literal 1688 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CX_16_16.png b/navit/xpm/country_CX_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..cd46afb52ad5ff4ee6182d86aa38ff7364df97ab GIT binary patch literal 497 zcmV1ylUYcZWQ&-v*OG^vYf>20fJ$Vo+dZ-}2 z;5QJj=?C!aK|B@u1q4xV{SIOi1nEhXiZ<5ZOK1X{Y<4p{9(HRA%J#X;Ff+gB`9Jgg zh5cZoxcrXP7&GW8G@vmCUJb~&2Pr__U~NKu=t)2V-A1)rUr7NvLvBo}cyGo_w^0R3 zEA@Y0mo4UU(Y`NFoBA*mGCsX9UkrAy{I|~UkVof+m6Ebe5=p?-%ai$>@mJfE`S9sN zD2|xgM{72xtF{^eThBkY4})0S+}FiBjslj8I=*d(qTZ1Y-JvCQ0%#3z_ofRhcuwt; z`E1|3SV$Tz82k#wt@oKQlIE0?J!Q!+-+F+Q0tiI3W=Ca{ek9Ikbp)%W=<%KvXaG6m z=4aeIaAqR&V!H|K?oHi0tCkAU+nps}iLBJGei%Wb4x{O>$LTLE+RauUXm!TQ1%L3< z*?f7;Q+UqzV}B+Dv#(P|29zp0qxooIFn&KB7#z5aymJKHzCPXV1YS>_#E8Ti%~szZ nL@9L=?^GHm_i#My)i-|t%q^UR;gfdz00000NkvXXu0mjf=RMuZ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CX_32_32.png b/navit/xpm/country_CX_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..94e6c36a21de1959da64b808f29f8973494518e0 GIT binary patch literal 1000 zcmV>P)2Y1C_c27(hJ1|YrNpJCZ^FiI7uZsV>0JV&e^*U zGo8sfXA7}#(XFGhkh$(T9_K#L|89vgA<^s<<>L)~rtwm2+hf3Mf50UTTi|a;Ae(r-~D+W1}48FC(Sc7_Yr+EN3ZZF^!3tHyFV0RZYW4q%4Uv3p9w zU~pGaLE)gXes!o|u8`#mNqO)o>l;?NKvXMn3;;R;VpON@8|r5XIX5yVptq;x;NF!5 zGZLQqdV+1grd^(7uZ4KChr2&%^YfKH-gQm;BV7#307w$~ypqFP)0iw3{e}$QRn2pa ztT$@9!#8OBqh_-=uBJ`f*~kEPzS9&AD#tz@nmuvq{0LFe)jJ(L(*9_Fqq*a{y3EHD z1_5}h${NqoW0N)p_=W)Ab6eG2WCmc%rs~bFR68aTN&UgYOu@W$zXm`+7Ii9W6>;^uE-I-_FNJ)Z|aSoY=oOL(S&o36~6 zhbWc7^J@M)76C9n!wH}g9c&>CSF_vIy|kguQy!z_8)XA9Mn~UoT^9?XT)7!GfTpte za60*qQ8vKMaF%IhNXh72H%hnr|F3-Q3fGIK8{D)?_xk5j{>&Txdlp`VQUjeNTmJ$K W;&|nD1BlQ70000oQh+qLv}{6EAro|nU~0+1?t?=}nofN>mv z;Mw|MTV2i``dqo1&oe78r+?*=DaP=H@QvlFUosC8mw1vJrmhGP2wtl; z4-#iM&jFJLT#k~BKDFAO6ePlU6m2mW<=zTpx$Y_@)E7|7$jPy(5n;p_Azj&y)9En+ zV1rjBNiK7sY%~29;QM6awXv$CtXTqOoN1$1TUAK)W0m2{0RcdL@k`_!i|NUgy%Os{u|54fnlOwUd#d-IeH-B6r) z!aMI@N_HjYjt36b$dxy@Nr7O6n|;dk;9|K^mKq@AYjBC zC=iN$d#n#2%xvgeOpklCXUnIg_1riSK+dO2+?6P|qfE==!4b@Luw@0TEy!J$Im@j> ziBVN!lv@5$z3$d|r_g*o$iMQBw64^$*GZJ)X2E-HtUW|p0=#~jejQ4|w8F_9ADtZG z(>@_gQCC2vbfcDvaK-`fYk+(6O1%0BnKsaZc`k#+Ul{f{Vr>C_Kp_CW7!cY+97mW+ z$vqBZ?HJVH)&Qssd#{SyE=Zk`NsMU$ty<>U`$p}y^;L<+>XIM;nPPRjefve*o=y>f zLParrYEz#(*D*%p-^5YtQ8Rhlav}bnA zXJalQ70^z{->z%5uXeR$~KldZ$=?(a-Ah9*Rpzz)~Shia4^ zeoY`~aMJ=F0752>7XYkq(;elpr_M{~#w{}=0ALKw`x=T1#f6U@1I(kn>4g@9+R z{Z0m;HlNn!D?!z!&^X6c833N~t5Hh2qa;e<5!nW>CUMwx$rjZt;}-`K1I6^8Xwx4`rt6IHpZ69mAa0e+2#ZtcJ>Je~nKaH{4` z`ltBhYW}hJ@b^6ipH1Xm-Z?Kt^_}RbYU%Rp$M4;ztS!<0?(rOHyBBxR)5U=(HQBj( z`lCmF>Kz$VtZrtEG=8vVIFtuKAfPeZ_I*z(YCK1`$3!rv*~-WBgi^+HMAcHwMSo#< z*CT(50{!U3qV6HL!CSDbHMys=6eX#EGNlkvzk#qo(mw%gegZrm^M@HfG|BK zOCX*%Z>Y1)WWMW)0{6s2K2f;+1~-LLuTSO?+OoE?>8-`GLR-&`W`ik3oXlfD8LKQa zz9nW>7ICt84T?lH0O5#c>dh*XdCK~SWLcr#{M?(|24z-BxwF_hIF3-t^v|pU>6+YI ztX`${g3m_Tn<^nrIoZpmqc~G}ule6GcSXUo^+eGA1D^SfzH|ZfwEzGB07*qoM6N<$ Eg7SIv*Z=?k literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CX_8_8.png b/navit/xpm/country_CX_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..47b407b8945bb2e1e0b396796f03093022f4de19 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}Uo-U3d z95a2-ZS*?qz|ipUzut9|X%&L(+)iu{53F=P*i!c5%31Rdw!fnGwKh+<5xL~3C7;>e zB^^t47Ek{3*!-_j<*k@=+j(ZS?fW(L(~n(ST)(Yn)Dc?FBDBMHP42{*-1%zj+Fc)A zI^p@C_P)#f)$XF}h4}Ye`4pv?{@qH7{hn~m{g$<6!rOD7L@TqFpSO~`xy|^p)DJKF zlCTG@OeJe_Zogfn-Jr$(#d&4J<@1$0vQNjX_{U#2%`)~F`{}tr_cM69`njxgN@xNA D;qq<6 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CX_96_96.png b/navit/xpm/country_CX_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..1a169958842d8a8ffe911696f7ec09c03229aa4c GIT binary patch literal 3372 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CY_16_16.png b/navit/xpm/country_CY_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..8415e83d5bbfeff8c55d724690ade09e25524669 GIT binary patch literal 283 zcmV+$0p$LPP)-N^4Cno-Vb(w*Ifk{xAk)0Q>21cf@Ya;*u z`3~W5S{48Q@qv+37`LYxnONj)AuM*2baso~UwC})-~WIA8U8i>TXj0o@keSPi6sVRRRALCCw#lXmnM<1~k{Jyv6 z$FUw}F&!p;*}rdZ{kpu2k&Tx-U;zU&8-9&M`{3X2-}iR^zPB4Lz+q9ys^mgYA7KlA z-`@7;`8kF^-_a%h{vyU4)tLe-V28^77f9~(cZ#n~kAYx``WM;$kAR{{;fBL!qzrQoGauKwEKt^NL2*lzj zc{>IMMq*4SYyq2Q5Ca1vl5!Syqg0;I)x;PL0r(;r0)F4!`QvE!{~sUNv_ja;vKiTU zi8q}n3n1Xn(^HHb0?fi{B$-Z>1z&&u`2PEs2oE2c_?s`EI9S6={NsmXcW-3cdvLI_Qo#od3=EvCY*A*mXCB`E`t#@4pFhq%x)Wt)ON{9Z l#3xg-!BA*bj9Ne;006*h7$y%W{f+2higGXo8aOjZLWp{FQ}h=`Tw zQ!h$yK_Nj;K~G5;J!Dyg7KS>q%*fKf{!G&?#2HjtY-+mHx!rr+y}P@o2Q4JqpL^D3 z;J%ON_dVb9;deOa{=p!G;C~Xn)&PGh4irjppiqhfh0;0&g4}2;WEaA*Mjr?YR9gi` zC@@)4IQHlQ32p~%s={Pya@)Z$rx4Mjfj)+6H9~4CsoEC)tY`s2#_4H31fZa*dIfMY zRzQMp^{yqfJAQ@Z0Pv2tK;Q$J zS!<&}Pe&IBPuS$XWuQB2!ZAayi#1 zki(`?Pb*Rgh&j5gz|8$H8r(c z`dy23Aj3REnXLV_rluGH={BZ~PT8;Zbn=3Kb(I(V^)H{=Cha+?niv7)X|(0L^aO_A zdDAmTQ!7hzGvFeiG9G;xFzQQ531P91Esa|p<0LLI>Pt+P{`~Z;qU@~*;poTy zZ0lW(I{El+gNI!#&~5<$*e2~tnf$?E-z-I4K3ahm8__*fgH3-7)T*b}_Vzp~sxx>$*GE@}`c4*6IHt5sCwaQXD9h;y|JF Y6F&q$oHG#E)&Kwi07*qoM6N<$g6%Jt=l}o! literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CY_8_8.png b/navit/xpm/country_CY_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..0b860c729b2adc56341e89f9b91b8a2d6003a05b GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}jPZ!4! zj+x1S{{OdUHapOA?Em+#qPvc~XJ@aId71FztK_Nw5Ktc%{d?Wq|A$TH{;#ihbXg!& zKX3l;J!Y@Y-;VyD*dUnn^Zow%|Nnj;KXBl{nIlI|o$1-oJay*J-|OS=*Z*zmFfuSO dcvPgv@cyUg#NSat2|$|}JYD@<);T3K0RTpkS5N=| literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CY_96_96.png b/navit/xpm/country_CY_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..b8bd486799ee377b1cea5049e2649932db2cc33e GIT binary patch literal 2198 zcmai0cQo4z8~$l)uc&#owyISv6?=skF%nc0n^ue1y*1+6siR6u(Av~i)DB9i)u>I) z+Hzx5(2G!%q@Vlmcg}ad^PcB@-gBP!&*weQ`@#}#%+4an0ssIz%miwE!LI*;>C#2_ z{k7_UK@1PgjG@5qf2*LQJPiPt%wSN64JLOt2W`pYAsF4MQ>f zz9IS=J^qtWwf1PG!Rc-9pe5g314MV3_HM9wR3?+j;&F&7ab0mo%H;qBdgb5)uC-;a(B|ka}9hvHU!P{^{2t>xhJu zAvV}rf{=zhS~Vo%mNw*sYU*(0kM7|pR9dIi zevM~?e{?X#N>gyf_2bi#UK>?DlqWU2zytpY{NxoFm2YAqxD`;%EoNpch|hAtb=|Mj z4Fs5o4SGOq2P`KjYjj2_yYBK;M&;8+-*;P#qv_VDZDah<`DYFQFdJC!<^W;hyW^<` zV#d7=$`79N3Mz+d7s2)PXT>W`vIB5w5wZK?e(i_45KtL(iuv0h|4D_F2?Qih2aLnH zfoLU8VxGaUV%_KCCY8^+`P=ifNilzIDjR4GeMPW72BE2E3&AgJq2mz;ItsE`j1YSD za&7h)o)||PB~C1J(GthtK|kq^bG~CE5e5Q-T~B?^rov>6N%dLf;IBb+0)JEcQ)eq^1-#noo`VV00#(ZS|_WivC|R%l>Ey3V!3PeE(6Pa}>geMl7o z>$;9NWp1#K31u)$r3wL&Hi*Ni`pmh1qOalRWNy|Yhd5;tu&xq{p z+m{lVH=kE^zr1o|L18VmSO^mWe&sM{@xv3tYBo&QMG7tB4+!QgTD(W_nqS{H_lS`` zju5lU8nHT<3;3xPZS_qx_qqoJhZv0Xu@HVN+#GdkEU#$XT+y#Ru|beu)cg?cJX-&Z z$b}nr$#;dS@b#!mP+bpCW)ts(#`*&2>`IeGQ!N7`t{Kg zF%cKORFkztM1z1DPi*ykuRb5NM?clDt5kHCLq7B$@wAf?THGu9_U8)(S;1U#ko?um z5{*Z%_nMkC_!nz_fh-a-V#rWJt&Y(p{LT!C{yHm5Bm*+eI-M)INV0xR?syuwLV72g zyc!NhBn6qHO6UeVaDARrM#^h;p-9DO`cJC5F&Vo_L_UwnfmUQDNcN5YZ379Ve#K|d z9QHz`n(cii8XW1%PjQTE1OQuJ`YQ2(uOF5D=qJ ziB-HE3YZC2$s$K9cqXCo#>hzhWq-4tm&h2Q08 zIt^x2pEFAec{nem&szsd-_uMu?>Yv3oNIaatlBUxj1GZKvLPFprvcH$_seDcYwZ%s zl971~fR>VlaK%);-OA#gWdBZ}kBkhyEmtLD^3HkQfFDJ<_w~}ej7K+e`UuLZB>%^bkmN3f$#3p)O-R7VRX@TnWlnzwjHjY&&eRzbpu6=JzRs+Ez`@6_^@ zaUI_wH#+&6r{%W`!k?MMO%`ZHHd${bO_X))&S(N6AGOBzLxo-}**@`C2B|4~s7z4FF~cht}x3V*dl- Cw;b#M literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CZ.svgz b/navit/xpm/country_CZ.svgz new file mode 100644 index 0000000000000000000000000000000000000000..89398403797b4c73548ff8c9452803ff434583fe GIT binary patch literal 422 zcmV;X0a^YZiwFn+D0)Z&17mM>Zgg^aUqf0hb9QF{ZIMw=+b|S`pUJN{crTlj#Bo!~ zHYG(R1vIH+Xp~KRG`5K?rE!#)1o-u{%cgbH-fa1N_d8cE&YpG+M%53-wk2U{Mxa_@ zrD^Mu+-)zD_XLCEt>leuRY_V)&X!Sey#7*cf81PP7;D_zoo_x>APJ@4^NP~-c8%L_ zS70fl^x~R;Xy>|*lupx>PI+qknqKw1(?$%`2Wbd;i27lSrP4{_6=AY3*AC@>@L85+ zAx;jvGlI!Tr%Uo7^LuDzYVAt02$#{Q>D)e*BtwP;=D~2BB+=1I2-}Bs;Vhh1s9u!N zsBHJ#2OcZoV*g+Um>sVb!lB(KyT|*+2uQo*rcLp7!zWzZ6l})!1!JswXGEir$GBC( z`JUkKq9pNhsRpsUY0VWY Q&sau30ieybLr($#01O(`MgRZ+ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CZ_16_16.png b/navit/xpm/country_CZ_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..599db147c6cba6ba8471dab6ddfa70670910d9ac GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^#o-U3d z7QM+CvvxoKSkJ}qx%E9)Ee{Zw{p#X*!jR^d`nzrMbUA|w*&N2pH`OwOz|OVOzd!t}pr(dbe4hPf*#k*-hm#UT)Nj5lI?g5NRyc_}Ahbs)XI@}u6 z7KtuseZi8UP{nwOL%l)ekfcKE2PO}NJ&ei9|Co9@XYg3sZ?DdKJ(X9X_W6?aH32dT z8+!h;N*KT6m9T!tI-$dwdC4O`hLaWg4p#R#FLZ2Y+VZHE;cNx(0@?KpI*(KjXz>Z? gbY~}uvj1S5@Zb+;YwUV!p!XO&UHx3vIVCg!07fTjPyhe` literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CZ_48_48.png b/navit/xpm/country_CZ_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..e016d97e5669c652f535b50735d49bfba6a611c5 GIT binary patch literal 383 zcmV-_0f7FAP)KrX~a0C^Bw0pvjJ1P~vw7eH)8B>-^|l>x*=)B+F>Q5!%kL?Zxk z5RC!EK(qodJfby#VG%_D42LKNU>HPE0R1D11Lzmg34s0(2VIW8US4}TKkM>EcYyi( z()?}N)%^NKU5xe>PX~ZL<0%a2JD!4oA>t_n7%H9ufFa{)2^cz_7JvxxGz3J6rvV^R zJT(E);;8|M7*9n&)OacYBFD1_5Ivq9fDG|$0c44110Yj8e*oFy`2oln&o>}zJd93P dkE^Wl@C7{ReE4#ck&FNU002ovPDHLkV1oHCk52#q literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CZ_8_8.png b/navit/xpm/country_CZ_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..b57f907b5223ea26148c0414d368cc8c703777ee GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`fo-U3d z5>t~iX6=6dvEHWP=b`deJ2oJYu61S0X_y&&bKk=kOWApLh!_@Y-8MG>f(JoIn$A?- zGM@O*Es&>-^`!neLlt}b_C!`;J5P|#WfRP=-+M4AB_Sb!fx-BO)lRP7i|RnD7(8A5 KT-G@yGywoT$vD6O literal 0 HcmV?d00001 diff --git a/navit/xpm/country_CZ_96_96.png b/navit/xpm/country_CZ_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..ce0431890dd415b693454fb5ff67b7b1689a014e GIT binary patch literal 674 zcmWksZAg=06us}eIiIxID2r;+e1GIeHmxbkl=5kAm_J!LR8n zSfUe0WR>{WH1{crsp_6-rJPA?MwXRa-7~}U`q^6VXq)@-mv264v|3$YRR#^Ehw*CU(J)DIA=xq)yjs|rR`{}XU_526@rm;9azC(BL&O@br5LpKGi{}HdE|Jbm>7r zOm#Vh(b1n=klo6<1Ol0%hGGS>4?@riB;iE&b&@;thX&@~JRf9BkqFS(U?GHZ+Zt(B zu(l@zwD#TzQrfTJ08<%x2vAY}6bU^_qd}H)UIK#go_oZ)(MGIG$955|DIxhIJYd>6 z_!CkAeu12TJCKUPwa7`~Jfxy=B68ALh*TWBj+`7kgA{;AkOi;_DJWczEELX13L2k4 z9S%-i&B*Zl;>yRGrfdssm<>0~hB;z~g*iJa9=5u>F>AEy$Du4y6hQYa*F|v64tF=O zMw@<;DoYYcc%^f76T#*dH;jpbX|BI}{=AR6v&6aJf zbyIwtwRVXk3B>GUtpyi$f@yTv1qnB+(y7XgwI0glQ!6ODXC^Sn?Dp;s#tW-4ds(X{ z3K6gg@q+iepV_^BooDwHU8C)uxgUJ9`;{XQFX#tiS?isQa4?Am1|cCy9Ys|(_*!X~ zFHX$0dlroxyXSHTsb2IFkn-_Do;2QgQd#vfzw7q9ri_&??|brekg8D1`(=fV{{e66 B3!eZ0 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DE.svgz b/navit/xpm/country_DE.svgz new file mode 100644 index 0000000000000000000000000000000000000000..107982c3104d753bdd6df7812242ba79c8e09fbd GIT binary patch literal 325 zcmV-L0lNMliwFn_D0)Z&17mM>Zgg^aUqnSNb9QF{eb8TP!Y~j3@Mi_T!|nEL(^wp1 zGzzv>24f1-jXjO7iEUU+qzzWT{gN^^=7ui`xj(-<5>Jmi1qV?#(rAV>2oZ!X441lO zxLIezTZG2un&--B!B88VP6qw>DqSY)*VP=FLkX+R?BPBE91`*pC4{8w6rP?JKm$t1 z{1FHJ9#+=w?+9tzHfW>3)FoNe`M#1xLtH8GrLK)Qj?#czj(&>A-GaJd|MZW-F!c2Z zt>m_H+q(clC1hDyhBy9kkfNQLBf}6v7(?XMUd%;POfr?1V79Oj^)A<^m~>H}u0>%% za)$3JFFxKHTg$!po-+O!5h0u$jd1MFtyGHPwcmpLhHAktFr$v4XH5E+DUG`1(9Rj1 XIa!v>zo^)Mm%Bd!#^zaS_5lC@d-$5j literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DE_16_16.png b/navit/xpm/country_DE_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..caa0092e4241958edcb7d6058d10452b51c15d7c GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^yo-U3d z8WWQfBpMqExmHTOo3x^_)8%W)g#(A)dd*@x_W!xZWdjad-%V@`9RHb@On4^42h_#j M>FVdQ&MBb@05U`+K>z>% literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DE_32_32.png b/navit/xpm/country_DE_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..b754909272d372c68f6de8d9dbc5aee12cabf8c3 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&)nJY5_^ zJUWvTBv=|`-Dqa8p literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DE_48_48.png b/navit/xpm/country_DE_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..68fa24b65e4b500d5a0c87940a81151b894e95f4 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HZgg^aUqnhSb9QF{rB&H(>oyR5&sPw-FI{4Zq;_2^ z7j2CI1=>C|x9CfNfEH<6i7dJ#ZO8fg4z+tJ(4qnoYi7<2XE_|rzr1fNbP!6Hvd$gi zVh4%3ki4wdx%0=@$64YaZCK4&C2Ns8wRFBb+|Bi2eTNVN=UQjH$eoQbyUg=;dsVqo ztvz0Nq7qwC8|@L7c+LnfM)*-IT_v>Kt3otxMKMJxz8ay&qkHrl5J}V2!_=d628fwH z)rP&#YW->A3JKnFr5IxmY$NjDp)w6E*}>lc?-g#F{R;eqTMOeYzAgsi47=R$Ntm*J z(*@g!vr~Izb9T+PLho21wAbq!|6|F`CU+u?8*wAb^~U5*(8-5V9DkJWxq}f#Bt)cD zmppf%kSO-UM(z{KhLK~}r!BNQZE6aFb1yCnn_uocR&4zuS1*g#aw+!)y3loN3SBY{ z(4VsBg)H_B6%Y^!JqcrgUix{#4kbswiAu}*`3F^O%7f6)PY~$=Le00rFwP9KVcSZ2 zO%%tt!2k*vko~@RY$cG3BKuRSw@!q|0+>xQcbtboJ?BLRGutxrP;S{;*l~XkGn#v& z;S6j}J23`r!}ip@Nq=5!OY7u4nX;;Wwud;#8}jtJM7uJ)NgZ>qFSL=kSn06`R*K>% z>0-@?hTFk#OM?#EkMmg8TpnjVVZzvVZX-H|CE*od2f6DF15obJTSf_lg<>sbaA#ld zOD>G8gkrVr5Sf@1oOIJ7m#?BQw{1(QxKP7My z=%z*bG>7?i@(M_2+rgGp#M7#)y?D_^l{@j@gPyM96UsPUPU5eX5cS0Yh1}ZfKY}_% z6o=G#FdJb%F$$F$+JLNBfKezUSHKlm66R!ItpUQadR>WoSTv2|eYTUj@l=W#SX-<@ z--O6Rx~zSSzO%m({uZuVdt{T(j+srHj5enVXl9Gaj+@em&-QiJu`DC4sP>h}#6i@O z^UqM4d=ps>pTq9Gy*U}#z4wZ$tOZOnTkegS>Rx48XRsE8>b1j3T??T(zao5((J$~n zZ2l7~1g`I6LgV|`wc5muB22@efebe4wjLOLpvg#VxlxLH8jc%7!VQHD1>eA;efoh- z8q|X=5a7$VF&+N zvyp-rp38l)s+h4AK!Gb(U2ilc_jO~v+EB1!x!jf?Q)5HFq3HVn=;XVE5E=p30vA}6 zCVrz#{5XM(&y_U9m;w<)@JX=Wx(9I(`cVYR1gDt9pd3#KyUsL9nkMi{&XFPYg9MXl pOyZ_~7^T74=@hO6rG6ZoE5}mcPFQ-+?Wg|X?r#cX+JE{A001SOJtqJF literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DJ_16_16.png b/navit/xpm/country_DJ_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..6ea7b5f19f3c728e03de9e4f1caa573d68f86bf0 GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lNlHoWjtLR zLo_BP->Lk4dfDsw|BVH>CI0{aU;p;%`JL(Ze||Vm(K`m@8ygtd{P|FQY~}a)b^nyZ zn36sxFv0%#vgXTFh%)-Jk zk3RlyUi~lR@1Nho?UU>NBmlvK2SDP-`49Vl|N64-_2vJ@356oNme>FN9b2%j?&)IR z9X4m1&iwrGyZBD$ALaG_4}*FaJ^cAST=2Nj`kFnR?xs$MfxJb1&-eWL$hJR=&0|Ae z{l4?x1DFg~NlHk}5PiIL^ZAhfzrN3wxXQ!B!*JTYkFOx-p$ahM7(8A5T-G@yGywoO CysSC^ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DJ_32_32.png b/navit/xpm/country_DJ_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..ab8b5a6025a3e8ccb337731143e4c8518ae2f1e2 GIT binary patch literal 618 zcmV-w0+s!VP)GgpYiIP z@4NThb9JfYL6@m?2!aZV5K`uq)q*JNfmkR)2!Oh%EpG{uVg@AuAj(EOC$N$plmLLN zlhuM)=9QoX08E0!uC!6_2PGIpy4HVJl6<*zdjWuLPJUHvYo=GrNCALqOIyhcUDeZQ zohAU#>>2S~i|-jh2>|p|b2%?oTWU}O0Gdf&7uy9+_DMhpD9XA9tnGK-?{(b@#;gm9 zf@IQWBf#ye7b4d$j#<@i1v@*)WJYD*ynKH4#--4>3(3hAEiNJ!0|1%^!(d{D1>Mfwc4nH^`lR8I^vKH>j`un zJddd|9YOoq_&;!G5P2&d$_(?AhqBnWBGUqq%h}ecucHG(n=l+}(U6YLXW^Y+FP? zUR0JADoX@De418)YHG3VXNd;m9c?3MYn|xV*ym=>FZu~VqtAx3vwPB^kMzHSqEL!_ zdCbed{H0?sMQcYN?_?eXK?iW|O7z;?w|Ujnf}jKV14e}*kKLGlzW@LL07*qoM6N<$ Ef*KMM{r~^~ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DJ_48_48.png b/navit/xpm/country_DJ_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..c7f8f994f0bf654c98863ebc8431f139a0d261ee GIT binary patch literal 861 zcmV-j1ETziP)A|aTo%|g9he= zaN(fQc*XkwBZjC%Atne$(F2bNd$E_1$6&(DrW?towCf&pZP&ktMWe|c-PVqNk8AeJ zC++XwZ#5skrso4G0<}a#2-%M3CcHE&s6wS7ga8QB{Mb6h=VO zrqf(Qk6t+tfJ7#5bsfetd9{E5WH@omO@|ISwSWNdB6;pldSk3wKmZ7^5KO<@O{)b| zh%J(R^@UONncob~nszCsvj9_(9G^@zbs|5srX7i&i`Uk_S1q6T<$Wt%9 zC3h3o4gw$&%xo~LvNo}{+{Iw9!k;xTT{3iDG-xyp08tbsC#8(IVmy7L`RqxpJgCwj zw;K+J#3{|^Pu;nE?u@?d{g#$uJ2X2BmkVAmoKBd{(CIKdjHafFvl5xS)kVcKb$tXE z12GKR+Tim6fL4pCDVR(W$7MKi+)eM-(ZsqUzZnden}g8^L4d^~T?2qaYB@h-=RLB5 z0Ps8n0eU^yDjGhR3YqME;Y_q<4N5Mx!vTv09uIbQBo4AA-0dsfb!t%Z#kjbL)>i0r zSXx3$3-tQ(Q)VJ>2YmNAQHCa|>rD-SfIJF}js!*ti{-wd*g*2!Z z^mu=&$2pJ{jug^B`XdvGcyD85eD8&FltLtdj`HkH_wf7JqS6{j0VQ(3y6k2@wb=j- zDuRNk&{bPsBwKGoNl&?@UQ4XEuXHz3gEFA$$b6^m7R@t_)S&1ilf5tN0&yZg=zB07 znQuI$kpDnQKGowKSWB!Qmj?fWBH5_P-oMN2AEO3;L4IoUn&Y-|4JAEV01F389iJ5J n%c^q1*n7e3xhu=(uq^ov&I7bdlIc9;00000NkvXXu0mjfN3w_0 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DJ_8_8.png b/navit/xpm/country_DJ_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..e0f9e9bb0930a0892e9d225bff8ad20ba6b15672 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}|?PZ!4! zj+x1KDu16|_Imz*;|0ve{{R0UU;VZC-A#V`e}CMkCnO|P{CN1iC-}Yn-#_fr6Ow=e zH#R!Yo4@pqU&O3_R=tCV4jee3pmOBEi64Le-=14 z8qqD_8)b+A=eD?IGmEd5vG+xsm~Bj*O0os?H z0ra!NaVNt?CE9rm$D|+tEFZTvGk#8_8^~x(3j)B4a+RCy3`8jgG8!`k0gz;zyTdj1 zM`#5y8czyJP~R7+>ENE7wDB}S09uFmUp*l~N_R_76$GGnG*;lkLm;D(lpp{yaOM8^rF-LA z2QnJT3QExAi~N3@ORLGIOb`HXFnY2jjhd}uK>+-mXl-U#J}pL@8bJV9K3>tx4srtV zKt@BQAOO55pK`NzQ@z=$7X(0(asCe1kkZX|L4p$0_eE;%atmI@pb!v*ly0_U1OezB z6)Ig!>NQ(pf-u=^nLs$D-n1nt2tYU{Rl3-o6l%7F1p$bP@~Kv~<8g|NfAWHmTFq7y zK?!WWiLt3PMUWTWtja@N;5?lVK*z+H5r!1R%sq6;5U#WXfi%hadn^QLZv) zv(-ru63w=QYj|j~W~-l|1g2}YdJ6*J8RmcSgoL;`BvB9qppOxbJI&E-=?DTa5{_G) z%;RyRH(P3g0E7kUgp++>>}E?-5CBnE+ z?j{@M^}OuQ-(9(4Q6|}C7l~V+jJV^!bd>-dVBk zg&ZvwSApRK0m#X+6urIt{g)SOw7w#e6J)m|Hy0MmV zcCK4uu@GEU4M|V28#l0J3;5Yy(dFji`gLsBKsH%|wqgEfs?Ao(n6ItH_U#a7wx^sN zT)vEr8;K{IqK^?OUCbDzFWM-49aLS7!a__vBr6LSE@0a>Es{;)VLJBM4+i)VO}Fwi z6bh1MEMJaLX!6fBYcMdNMXV`m1}>Glk47bGg;wDd>*|`e17L6vem~hj|EJt*{nYgp zMLSR|$mN>6k(W1l!|5a$=RX8VENwmdgV!p9a`R9q$ZiLK9XsIjVe@7Ha5#u(;)L;C zw&K$d{~*4y3KX7$)~`oi9xh%)b~YjrY}$m(Ox(OlFwkIRINx@_%MmVms!_5BMIy+_ zK}`*^vjJf7V${_^6rUXY3!t6t+*H5EICh|H4;maqW+qmzo^fY?KNc;*s#Ob*a_!O0 zea|5OBdK@)Ml$aUn>&~@S~Q-QD`CKf7il-WjF$Sz9}l7jA!_2%1(`@+z1hx8{nL$t~$khE)5o!drF?V;{OK5#yM`sjIv8%&3wl?fd6FX2U z=tR%y0!NwI`==t3J;YL}e<~s=K@)L)zw5~5ROz3Jm|svZ`p<4#iHGUXA&mi-Pesgil5Pw-KdApCo$X)_LFat6JDZA9vVSUKmP0J%`==tF6cm$$L#^MP z^VL#GV?bsI3JGHcj{5r4kzz&);qVj2T7DTwYDMvP1bfGfj)Z@ra9 r{ZkQ{uN1yf((+AAGUdOA(t&>gUMXs+RsLxR00000NkvXXu0mjf>?;eK literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DK.svgz b/navit/xpm/country_DK.svgz new file mode 100644 index 0000000000000000000000000000000000000000..f9d51c74fc1b6667e3b84fbfb5cddd88d5438962 GIT binary patch literal 308 zcmV-40n7d$iwFn+D0)Z&17mM>Zgg^aUqnkTb9QF{jgV1G!!Q(u-}@`B*VnZ-SqF~M zY+yS@P&a0$_&Ao>6l*%#(E9UDtPF+&eLUx$^X1+oi_eb=I@PpgZ3Oa&At2%%!A}2Tc!EydI@b;zLS4IMMPE z0|3<49%e*+-$#8M)lEV9hQ^G=v{|O1OLHE2$vB^Q068${k+c%sb51x2xLr*zLZuAjIRc%Ras~&a6Dyh3xK3id+P_klBe0hc`K_*;H6}2AIC`F zfWyw}VJZba@Ch3+=zPU}a#O#n@P|7&Is$uLT7_^9z(x)M+HdhsK#=(B=fM}AyO|UD G0RRBV@{Z>K literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DK_16_16.png b/navit/xpm/country_DK_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b7613f7f110390eb0bfafe1c0c9c92678ea22cf3 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^Jo-U3d z8WWTE97sOXz;dNeCv~dW?o}^NH82}IoFs8hD#C)-G?3@PlZ2E+H(?jHp8x;il0Tpzi#&8xWB3U@Y2So*PEB0`15~%-T(i;`F$rSsq?b)GARBPKW+S_W--tn N22WQ%mvv4FO#mi7K>Ppz literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DK_32_32.png b/navit/xpm/country_DK_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..34cd27dafd30ec4fbe89b83abe2fe50bdcad6716 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&(~JzX3_ zJUWy297sOXAbrAby>QpZteA0=?xq#yB@YAU`FN6kE@TcO8o!--@os02b;4!Uq&9|l5G#(zF{c`&&Cf#*u zW7V1eef}Y3U4dteiGO~7lilwXlknm=*ifM9GCB+l`zOnY3BFwa2k0mUPgg&ebxsLQ E0O*EPKL7v# literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DK_48_48.png b/navit/xpm/country_DK_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..71bf8b077b938df25e2439644d88f7f9a1581e7a GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HGRODg`6md&*cN3hGAi%qey_s#c?;Ek%z8g52vJGy;G#-7Ux8@PkmJY{&#f}2= za%X(IpBOizU|-q8d&e8a=Pb@UxW;b&7PHkAe`NfpUp!Nn7x?9OOc{$NI!sKq+?pT$ zd+w8nEc4*G(JbdI_v@!k*{!eaq3FT+zI$t}wbYla$B8y|>$g8IdvEz-ul0@X&0dz0 nU#j;6&5eHY?leabI{X(RBD4GL%V}?b-eK@`^>bP0l+XkKrn+Y& literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DK_8_8.png b/navit/xpm/country_DK_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..d76439133204a1c2ccfac46b1193f13565d18368 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_czPZ!4! zj+x1O4kVvBa6n;>%$YN%|7IOhVv|TnI>1=qWw3AN_Gyicjn1*16MLWjei~iCIc>kZ row0$zpWpwQKk93@@LqMaJ&nT-^B%tYP?K)5{JZ(($2WJqJpJ_RpGR4H-b!!W{g(SrITLGRlY`>|g#ZB!4iOeE z^0{s6k1zk|cYn4l@8pxaUKV}a7_+B;d#!TY)vT>=t^Z`ti@;)m+WhVOkLT7Elo`G8 zzwW#LdA|Mm^^bG!cO2aQVSi;3HCzSu(INfP9A#tQ+Y_yTLCfIj>gTe~DWM4fWmt#X literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DM.svgz b/navit/xpm/country_DM.svgz new file mode 100644 index 0000000000000000000000000000000000000000..ff8215f42b8b062c311bb1adad09af6ab76f97a1 GIT binary patch literal 7038 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DM_16_16.png b/navit/xpm/country_DM_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f2945124040f8f72a4bf798c686c7bb0d611462a GIT binary patch literal 291 zcmV+;0o?wHP)~ z^B+wp;vEYwm((oYn+eaEFlAXzToXli(r*TaKkpy$|NZui2~(Ek@tLb=LZ_Vk-@Un_ z{GUxnPVMpTHRyi8jOnba-%Vft`p?dAT7Yf3CMTLKmQY%(#v#f4ONCo>56^ pGVXML_p-GBGZL_Czz=Az0RZz3O2WnxL#qG)002ovPDHLkV1lxOgXjPN literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DM_32_32.png b/navit/xpm/country_DM_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..313b570da9d84b754f8ab32cdd53507125f8569a GIT binary patch literal 631 zcmV--0*L*IP)78KDJ5oT1HI;4>^n&{lgoEfIM&h^}L`V;P3t)h9? z&yVMvhjZSCz?pWy4L_OGd#s&%kKVa)lbqd$q$pDN$5Sz=82tS(yfpvRJD3Z*9)HT+ z9mZ1%wCEV!{w3Zvq|8;ZAHcm2o==2m+OJ?hR76z5=}GgWPujL%lDr7YixVc57!+sF zp5e7+I~8EM~V?_RpDB=#5_!xBCgb`)g>f-4Vw7M0(2ZC_rjPkg<{B&k01v+h*h zkwx7gJFU%nKojJVkxhG4CdsRSOwFhmmJN-&97Qs(CTo=Ff}K!z+*Uty0TkRyZb@QT zcC2UKQ8ZFt-9#h+akJ2S&ny6R8lo)8HUx``$R&s>2mol@5(+b^KU=#YkiKQ zxm&~2n%$8V%d4Mjq%!4~Gd?v|R(j7lvqVbggS;|Dl`memKLw)1lFaUtyfzpZ4e1Atgbfgnc{riK~z|U?U+w!99100zrQ#CUS>C&KXpwu+cbYlVvL7CYooPdCAS`W z5sC`xA%Y$hym(L$^y0;<6a-Q5ApXOH3jV89QLGe7b+KtmB;Cq3*<{-$-ObLQoxFL^ zLyCACe1oZn`5Xt{mk-~WdG9wvcZ^@V0O;zMgu)sz5S#R`%EIGvB@YMq(Q z_%;YVb-5EToSfnS9=aAEX~Y2Dp5ltplgpjm7Rn3E)wg|8L#;>wf|t9Ahot7NMs3Ks zx^RWkOD0jdQ)AiI8NTv*KY$j=JjeOjC+IpqxbUtAnF9l`_mz$O;ZP%4v!URk6GH(g zC>HmMmicR)_eEsv*fdG{3$|XerjS=Pz9_^kk^ro_{qcs{BCk;x22gS0clNTdX6~v` zyl#FnonLndKm_Ax?};zjX%WW&II(NpmRQvkGIu^0{w+Tb4Llb3t^h#7>gtK8LQ8H0 z06hZpOJO6zq*k(KLoTu7H(6OQ01D*tL6GtOJ`=#8pb25*$k0pH6#D1U&?UAMq;1i6 zz4GsinlHWnL#^axOI|l50H$DjtL4aPb(sKGEPUG|J*Bx>Go?jwY~}-_= zDEGi2y=2V+EidrXSIvfj&j&ESqHK=kd&0A;Zq1Y@8W@h)gU7mkQ)f)mY^ZJGo3hQN z`eo2|6y4}x&w1z3x~%ovuE5u2Q_n_U2*3xUHUZBrh5&vnvhRzAspy4^9Yd;*#vJWf zeW6Ofai(M+@fZL>@MH{NGGb@TPNh$Cn?}kZpT}6Z(g-d%Z32M2f_vYA>Ed#z?~`uG z4-E{zw$XRIy&a3~SnQd9eB`}1)7T(oL&*Ly-Uc$EBr>5SGNB|gp(OryLVp3a5VU0& SU}_2g0000k=?` z2I!qWnSN4W+VlN$uiyM0ZT~mth)GWKpYC|Vl@QY+yW97_TJ(iw2?mMcJ4|p(NE$H=*=!dw>3h9BJa)f^ZTYd zf6_;f1d2iBHu6DK3LlzaIiLBBG08>u^sc5*{hcZ}&eS4%st*-|%?2v6%Z`<+8Tb?@ zqH%4k`STU_UD6l69V`1y;KF|?s5kKg zz+eg|HO7IM@$oc_q(7c{d-jJU?}sgg8&=<1AXr-M`%%QWNG+`jvt5c&DeZ;7zp^$- ziQ1aUA89rZcz(;-X6xuK1A!%Anj3r!Z_Z6sWZ&qyq{=S*+)x^S^Wx5qqZADSuld&YScQpppWP6fSETnq^VJSzY~L5+6rALa z#++~wU+;P!659BcNS9O3cU|HwEWG=>uxJexcV#O5Sx$gdxIk4_?Um`kOaq`N{G!P7 zdacwC3+|rY$3LD-W=b(Mm(^U(+gpv(j6zL^V)D;O-bQ$ZQa5XC5jZ*2HQ(MIwH=xi zowk66mou38FJ#b@q8Q32ktdme@55jpbM>wf=Xu$m%cL4!TvoMRN3|S%&|y%T6d%WG zk-+&-9>)vCZf;0p0KJrix6sRxx_n@{Uf0fz_NSoQT5m5+u~m5HZ5Q-) z#r--o+Ao*e7yt+2V6=K<(e-Y#BpuSrf*gg8t$Jb;e*dTI?a>P$KR&&=IY zsX_wg;Y$+=-)T-KN}w76|)*_RWDKp1R^ERSAJxT&4h%W^$q*#Ce@WPv%A3g`_Q~t zj;_fxOTJv`VB0zYE<+hH`#zr`YHeDpn&TE?RvX z6PJ=Kv(7pUuZE=b4vpcH$Qv23sx;6;^XW zd6cW;e51}a2&_j!vCeGZ^@{*U?+RGYUAxmRuT}U(y|f?CGY9Sf1D030+QY;#uH)NMQ`{70M#WoOPdeB2cQm$hi9tj6O65 z3fR!7@r?q+*AutI6Wzo_y*m@WMT+D*-L%+fy@5^qFb37Q^QG)~|0_ zS_Kl_)(gNrEBBpX5Ko{{;wj=(y2apHzC_Ij``1XjquU|xB@`X6TnlM{8iMpREr|i- ztZUp?r)EU_{*n)$u(f{Z@u*v^KC=9>PVmjnxvAlH`AtglP=)RfQ6HSr9d_1o6O6f% zBXl?-0a5^WJJoGyZ=k4s9V7iCey7unSPKFUzb}fjx83?8hELf=bT8iEIWj*@Q&Hnb zdi^5%SoT17jtSNCkpmC+<$ZkJHQ@R2-j>3#l_okbhg(Tcmv-DdF+kI}?xKXf2AU}i zUc%TZ6kgw)me?==6>JdMkG1?^t3Hi{2iqaVU;Uu4u(hm1f(nbp@~W45aVNaapR>C8 zm&!*&wYr`+TJ6JP^BH-UDi8incdJWMCi-b#Eer1oKKArH(PdHh93y?~Xtnl|6o{0J z?$G$aHsYG!O0a7QGC}AJdDsH(Ld*w;w822?Cy``!M}+Gc7g5c!R73-u6ySO(^sF2r zY5Z!Byi9#@vJ+C=I@@##yuHp|REetb$kz>oyh4Ciof72yhv5Z4Lc#?4w*w=p$tt?~QQrQ!MG1b;4F9k1 zwku9OdF8cV_RTj-*vreQ$AZKA8U$fV{VR$Kv?JHO8nuig=ld8z+1^H2yhC|NN*QnU^$%GQuuVcB8zT zmm??!E<05wKF%$(%|Tiz#2fHq%bR+Zt}P{;(P!`Sj&e)+T@DK{=xm=ItY$F2tj|Km z;D|v;Hix|`8=$+*u6kD0Iw46vT->sM70r#j_dEeLIB#>%7|uwkNp>q`D5Jx literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DO.svgz b/navit/xpm/country_DO.svgz new file mode 100644 index 0000000000000000000000000000000000000000..a16fba7dfd5e1ffed91b7f9e86e61dd164e7d94f GIT binary patch literal 26339 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DO_16_16.png b/navit/xpm/country_DO_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..40af1158346dc3cfdd73da9cea8a1c45048d147d GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`3JY5_^ zG$tmeY{*Y{VAZYw~E-Rs|<+f!=!@1OhjgO_7CeP0}1{=ItpT>Br-x6dnUm@z{nQGKJ~=088b zf0jF}&lje%sYkwC-bMJ==|eTY@12eR|L^~$?f-xB+lEM-=UlarbEEdj?726O9yqW- o%J%cQ%il9LH5)w2SkK7N5oEf+Xa02?po@V3WIa+hNgVldzcuFOvEUn1dLiRYQd-l zbg+Phc%?7jzMsGGFeB5S^bmLAbus2n+(nE!Ed`O?hmT|gIr9AbK6&k)NxBL@Zr&xz zg8%>j6Ql0YlV=O|o!Gqla^+5F^{{8qzv_@jp$qI^ne)CD_+n0ZT*`I#>^!(j3A~h15 zinuvBZ+w4yg!AuPX|^}7pWA5|Q`rJxCf2^!j4ysZ`p@{!gHcG9OMpm?jE~EkiBb1Q zPD&yo@GBcL2OAsn*B{fiUwZK7CovjXUe8)gj5Vz)oX1L6IN;C00000NkvXXu0mjf?&Lnbn#QwwWLjFQ%!4v z)gd5JDxhfaO2H}Nf@Mdm)8F~~YHrs&xYOjj```cH^MxNiNy>Cw*&MQj_2e}jwG(eA zUCUajJ^Ri3gGbKnd4J{QzN5RtUY^>deR6WH+T;KK|DU|}=i}$?ca~M|m-xT>bXRpv z<)5F&zD{jgb+`AX(;u6Z*`9$?RiD1B+&THr+~eo{?pOT!`DyCxa`_Vx9P+zs+JuZX zy`1+X{aI};^Gs~gCE*x3ToMC>ZP%q2jujgchAe`|N9rGd-71}?>B~aGjHG7|L_05#X3q> z34E6XCkrJ$uR3+KZr=O(i;n$Qub2N&wCQH{?BFCd*PT9L9yyB|o^5abEdQC~|E}`d ztH00BKhhg|G(`jC-d&ZSzAP6`-x`%(bKN-g!Zx$lGZcS*x%*Z5I8gfID#KqHj2|29 z&-kx0nLTl$VC06(hYyeLUNEOl?>6@mrWFQHS3j3^P65 zopW-BQYZfY$$6;i{c8x4L0ZS-n;kLoQ`QxXM7gvx-&DJsFt_Mc{@cJ PXcvR0tDnm{r-UW|3>idq literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DO_96_96.png b/navit/xpm/country_DO_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..84f89ba1b85ca1af0a5eb0ae66b1422dd4a0bbf4 GIT binary patch literal 1532 zcmcJP`#Tc~9L8O`%PXSU>?%V^@P|KXhH`@Em`*Y|n8@AIZQppjDIO5#F7LQ<&92#mlze+eKW zVDOL6cLa9K%MOVUI{bCT9pywJp`$bu!qO?aXk|7gh!}CIe`9WQ%b#D>-&W&Yx~kGX zGvlf19YjzDdP2lgy8qaJNlbwQkcRgWFp*&edJCbq7;Wv1Pc;Q7NJ%EsLuR_2n`p$4 zj;!h>CU;#rlek54v`*BwauSn3*UxJ#eOJ0AQq7BV z$Gi4^?$*%B7{V z+~9hGv;hHQ?sE-56h`v$`7T+QO`1gp_*MExdxoal>H1PRq#%fOZvn1k*CV#n{W~Oy z04rq$cU&BdNs>Rg^T^Nk%loNzn==ivZTR&v4>e?llg)}uZNzMkh zQVqObF{Go55})K&;k{2b*kDAJHccx>CkrLt4tW^AYc^KVHCha-hvq`|Y-8Us{pQ{+ zBy>!fSSYJz8?vK}d68pGl#~{n`YqHlg^9ga7(IS_Uk)mz^y_t51^p!x_4)>GGA zcXy@x=Pl9sO~1mp3G#2xbfVBs38FnoczhN;yMldgTG$c@AlFtJUU7JOcJz=loyD0{Fc8*=na-{T z-!N^DxS?W(zBwZXLeGyjIW?SKK;uxw1uZ*JK>+res==CNOtfb${7B2MxarU_D%ax@B-;NcZcAbnc($ZztjAOXhccafE&g``B{EAhQLkgP z3%Zgg^aUqo6ib9QF{rBh9hn=lZ)SL%P5buWn&V2q71 z5$sC+x>eo7_Ru3r9I(pb6x^`;?>ix+Nt&%xX)kzYp6AVb*v{{s9vj%1uD7l&7!Q$w zX;*G-+p1vS9zF+}-QB)@liz&&`r+aG{U_*m)jp>M2D|ok!7`+#+Ssc01ylQEXU*{5 zJryhv2tkaX5G2)UR@)b>_I|sJqG1@qL4>ZWq8Je)qMWuYpBmf#cxfZgvMd@=Mk)Xx zUz<%oh0$5unU#l)ZJL4&we^OWM>!0hX^m-})T=Y`q%pege}|}*(Enr*FEdofcC#jT zIO*LZH$edX&(6=%WDY@an{P{B!@6K!K!-|UoJbU@mQrXXRjNc93!Y+{#F3> z$s&OgI4(E>0$*^zML=;0dZEV()d@W6ISyXAes*u8X>tX=E8BkKy2pa`tFkdOLdIHC zdNadNV}@L1nG~taWGZ9HF(x6Br(DOHXP9WMkSEFfWbxqNlBJbv%|)G%t!thu*N(XF zY}r-~ozK?U*3<1k5+3mB6DI6j;Yk=_bLgBOV?94}d6@C5H!$9lW!;$#ox*9*m19mn zZqDF>B9E$z^onmZcFr}4N#iT3|LzT5)6AuO#pJ)c|M))yd31R9zX9M9CoV7q00569 B`vL#} literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DZ_16_16.png b/navit/xpm/country_DZ_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..be7d774189866a1bfa6bef2a54fdf42df4a5b7d5 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^fJY5_^ zG$tmeWNc12!1ga(?zq;umQWFX2?5@+a(lV?1s}Wj|DW&N&XFzf`%m@5OVPq_mR6YM zr33{h|M)w*q3wZp{=2S%btWRIKR!Nw|MWD^nl%|*5f^?)>F=LE>2YF0!jC5pKKy^` zy>E56mdKI;Vst0D-W3@Bjb+ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DZ_32_32.png b/navit/xpm/country_DZ_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..2b747513892781bf6ad2bebd117144c22f2c4d5d GIT binary patch literal 589 zcmV-T0^TM_W+lczhHRV}LWz1!Wd9%lj2a@m=mm*R0K zN~0UxSvyD=Hh}v#;;*~gStzu$1V=~7{yw*z54gK#0MO%+mzU4fLRZ%ziefC*D4?z4 zUCo;SUR=>w;_dDNuqP(CqnS8&aN*DqDFCd*!Yr}J#z>*yZEW}ia5gw!sxb345@4ov zdfL@>YMP}~%FX2(1qk%m&{{;uu~8Ii+gt$Wh`zK3nK@T-4pkYz&+&0(Xvke&j_5jf zI=CBrJ{@pH0YK`L$r5#Hsx6z9`}+J$=L4*Ol)DrGaC7q;OQfzY0BR<4G5`S2do%#) zz0&o!-)o_qPJ<9XFA^WH*rV-qr~n==?)ASvVj(S;D|2&VXD7E^@bjxk81~YmcbZit z0)qVmLO4teBebx=HDJNu*BdSpq-WN3C)^6^gi-QagM|3yu} be+c*mDc7$SP@S_&00000NkvXXu0mjf)CU)b literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DZ_48_48.png b/navit/xpm/country_DZ_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..6fd2235a067c303d80c531441af08970165ef26c GIT binary patch literal 865 zcmV-n1D^beP)zP|$)}(kgGyUG3GZRlHw(iC} z9)4_$Zf?eK#_3S;eBkC+ndXNjt?GW^idmmnpf4*U?Dn|VOFA6Mn&Z6G4?ip-5dc6$ z@Zk389W;_ihl8+MG0c+&virG;X`d7iI5Nib%)4vilal~|GBecxs_^;TO zeOXzN)>h#8LkHSN2%*GFF&YJqOV%Xm4`U#mv<7(qV8Z_#qQc5bq^C!UshS#-+YJQH z(0|)>*uh>Nd0Dwez&d%5ZvE4OsuUAkF=yR_5 z)kS$iJ?@LXd-3hu&tPIf%;Vu$mdww`Fvpx2>6q~T**1qX!jeuW0Pv%uVkl%D97G0# zdO)zxkY8D8Vp(Ld;MtN;o`bhCOc89+(PcVrXl_>y0G*4(*Wk rk5MgYKuXepl%xSENdr>Se+Tpj*wh8@M>R#k00000NkvXXu0mjfZJmy? literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DZ_8_8.png b/navit/xpm/country_DZ_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..f0ce34029701ef9b00c42cc17457249af95f5be7 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}|^PZ!4! zj+x0R8JiOt8vjo{{xC<4O@=}1;J5Gp?>yaJ|Nidj5AWr>TJCLLzuSbRZe8^811CC^ z4u1LnzuwKQ?f-wtx_>SccPN~FT=AND_kMe3X=#_1i7DZX4DUb4O*Gn~q5-sn!PC{x JWt~$(697kGK}-Mu literal 0 HcmV?d00001 diff --git a/navit/xpm/country_DZ_96_96.png b/navit/xpm/country_DZ_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..f95a2df2c920fa8b86bab78e41c3d839fe261156 GIT binary patch literal 1859 zcmbW2XEYm%8^%M`NNwsGMJ`Ivs=Zf8XpA&eTct#)E!4b2F0;kQ6tx; zrR28gpkh}mwfBh8zkd6Fyyu?xyzg_)^X)n3J-;UjiLm4WiUR=v01x~s)c#c6elI8M z=|wYVf=-3q-P#fg`1O0pZRMG##y%Vhafr-c$&a?Ve(OTthc?V)Bhu%^rl2q}okfYj zc>5HV`A`&>Bp@w-w7IJFeoPz? z!CC?waT=#{tQZ}Z?9UbMPI&E2=|>pHW})bz9WlCl6VdN|i#lhUI;+@@nq@}>Tybe( zaknI8IL`;?O9q@EQ8CFkq3Y5*4ElB zb21vcrKGN2oJTq@CZ_&kPKc=H<5^d;GDtF81^|wl0>9>5-YPUu2v?F5;CC4FK>IDH zZj!H60fc*oe0{_01>dLw0E{qwD{BQ6*JsM#Lgz)EY0OH~J0PP>W7e?#K#L`*~lv^7ely=5nPjtrVzPsNq=i`lkjG70( ztcz@XUe=9HMc8Jc^Rvy7)q_o|OmGKQ+o0CKj&T7;aY7wssB?)@dQEvD%FzKdHl0#V z#rpxU`gMy5EiHF1LBb_mRL#-cXU!g$%%P8LPBl~6B6j9nun-84x3>B45y~V}NTF5W zFBi!@Mn+^&w`mB3DDs7|xv`Y<;|(x?B`y7LL_TM<+#g);&U!jJVmBgM1INe~?NfI4 zbG3CG?F$H_ot@5~Y!3H?;VM2Si7BXMt0drVlDzbZo&58JR zQgM;<>!Ke$U#~V#e4j0N8YD1s&TPd|_fzh-%H(9mCkL!#8llc3BbJk0jeI4Df{}oU{W&dHiU)_MCW0;%rUAiE@X|UwgvMCk zsM>gbZz!l{`c`6C+|kw58iey^UTdyO#;&c%yP&@3rI?}&6iq5b<%F*I^6c*L8O}xBDma>umumohF=aLpc1IXg!-Dl=qL?=wjIEXHBQlACs0WVdZvS}j7MAkXSUu9_ZwJyL$0?xLl&ygE4)m>!5O z$p3o)#%6rg^%P?PR3YXZOpQA$m(x&6SDSq@5CA|{l{h=!I5OWV$EK}bAl=^VRc#Wv&03b@OiOQ?Zzs2BTw4{oe@PlJPi`;v8v&;bFmVd+sHfiufWr{bS~EA?{{V|! BY<~a% literal 0 HcmV?d00001 diff --git a/navit/xpm/country_EC.svgz b/navit/xpm/country_EC.svgz new file mode 100644 index 0000000000000000000000000000000000000000..fb2f4f0e99bc8aefb03b375dbee50fefc3d9cf06 GIT binary patch literal 61120 zcmV)`Kz_d;iwFn;D0)Z&17mM>Zgg^aUqwSMb9QF{ zIB_B~^yE+P?^YM@+U;(+SwFqhjk>&O*YnL{xxRgR`QLy0_9|Uo?Dn(uVz%0>+ozZ7 z&E=n-eevYquC6X7+jh2Z7Z;Dq{hN#L(B&TgzxeX<&3=D>bAA2z_}J_U+RQh1*Oy;i zTwS5>?%nMd7Z(@!@OpQ%m_O}0+&^qr&1QRhy_jFOtM;y4?|0X_(bt#9=JR9o$M#jT zZFif8?Y!k~^LgEJyLkPyp30-;Mmpzwt<1GCS7>py`>@{6-e0YEf2g`*f@58cQtBGN zJGT6Jt!}zqI5c0b-|ptK`?itUzec~dS-1P^=YM;C-L<|_&0@c(hUt3szIqsnzP+B^ zwY&S-yxko>!TsN~%iA~mr?+;_Yn?G!~IMb`u z>_fZlSq9GH&F1m;VYz5w?ECG*$&T>vu3o*`yf44MxaOT*w6Ax^y`-OPQr$1_+Wl-X z+s}>-I>c%l`DoAz{(1A)=ikat_<26R`TJ)3w)}`c)L`~%^MKvBe0G4JEao@+<$l#Z zEB5u|`hfHrVNLVx@_rASka-<{wR?E=Lp$Fe!7`oynBCS`L08LXtJ!|JehDMmF6Xl+ z*99GI3ZLJ<`I$|Zx9iqXR~Jgk?X>6hynt#tSDuDyHJZa@Cv z*YMEYPtWb+Ek3eD!Fs#Nr*yLKbQt#!uU5<5n|9k90oL&Epq_p2)3r%dB)PdqOj|AQ zXWKpT1MNS$Bc$1*?o2}@sT;wuyYELn_oEbf5P-m=0SsQiAZ+8 z`rL-oVAn)E82TilI$eLa zU#?bvp^selW`NnRmh*PK`{{AVl*xaQfy|$8?qiDwC~#WX0iAqHf8g+6=iXw z@AsF-s7n*lQ5U3Ei6v0?W^DW?&siy(vi;;aJ7ouRrn!yH*+&1VbDpjUw*x+LZhS|AjJg|%&Ia=!NGojQnLXfBA(A$S5=wOrdj)LXJIOjAl z*950y={x|TxUuq}35t#N9&>cwHbMDhfd$MvTEm?U(BKSr#%6lg!wk(Kr(SQ`)er;s zK1H2ZjZR4uW}9RfbC_a^Ch~~c1kbB>SXb)4qm0#_F^tE1rZA#+o_oin0(Klr)k<6b z_6X`+Y_N_Tctm`UR^xnQys?qzm|?!$+2W9tW=v`PmLZSz8y?SQuMIHlqfZ%UfLz5T zr+LptQ0H*2*72&l6*`-+{th$7V14LqVLw_>-FO{oe{5`miIzW|l<~Rl?6FOm4q-Bi zI_nyh6QBR_)0hs-G53#a1a$_V_Sh&fXILq=%!CF9;rIltK^j7xjc>G5v7R>Cfo!s1 zMpMHvY;vZh!+_dk{tR3qU@Zp6W?fkewkdOGd=N)ioglT#R z!@wb7;%2>B*8=k_7pGr=izB!Et#Gl)!Tesh7~$Fd>Rb#bu%CmAgDZ>faq$3UF2;$Q z+Q*2CZD8IVkg-W@kUciW8HOPn53tFZmX1cuamdCX?R3J%U~M;GV->^QApNnyn=9G(Z7-`7G&TBv9;sN&JBj}Jef4n$D-9*kEQ6p!eKYe+x znvf#IH*%SRBe`t1t0n$(<2r0H+r61>x3dpFm+g}}VS8e;fLPAk8(qwW8K?Q?yw&Izoa7D7@u;A&0mGE(+KaRxG;rhmhoN+wX!a;0sl}S2l z$R&#-i4#wmL6pyI8m{p^OK7kjLd&ulz{Gq2=aVC*q_jAgQ6M_T;G3!P_bGo!Yt2!< z9ug@KGACW8sT_F|dU*^dQ&LQb@VelVuKak)6cQp74?Bc{x3QOiPNVXS1@zG3iZ&FN zEm2?un{t%2Dw5OI=8vh7(L^~P5txporn06se@AW-dU0UNFqRA z8Dr}iVY)WMM!CCjA_iRJvZGBuh=D0DF=G$p(h~eXn2f=gbe+;2GKr34D5H4wh5i`PYH!X4s#qtIM#3}Yk{1sd1 zQ*W9_X@oEr9G@9>$b#ZnSEZJ|1eT zPcRcOoiJ67yelKv%ec5n!+xpimq#wImZs#P1}yFeOZf z0y7Lz2DH`|X&HU?*jq3f6I7Wcf>_Xg<`|3oED5GO`V~nI_3cHJA$4<- z4Zw!Ah`b1X%cB@s3tb}WEJ-sKmLo?coUiNmKE)!$NK8 zoQ(1!ZIVwyx85gJ#3@vy9>pa4%E)MCC&|bqs2HTF(h^t*qu4~kPtwuVJ5De2ip4To z1}9v5ib+6%6DNuJ;C=cIF*QhAGgn~1Xht!S)rjuwBb1AK3SAVQVHUbldDITQvnXhP z>4uFAwUY(r#)k`P6qo1#G9!AM(KxpnCx zDXD7Zy-T%ok6`j`Xd0e5$Tl(UR^K@|d=G<`;~2tM8J0y2C{$$?dKWS9$=rQ9MhOGRsW(I$pm zRF}%GY#F72+&d9iw#?!@WK0NDGRR1ql32Ll{Bx!N1S~68E{Q;&hV3j;-pQH^f+T<- zu;_?cSh*5{`)H%bvB{a1l&L$q@`zM@6G&V|%nagPGv=WU__!i$4h=1%kV4!$Q5r&W zgRZy02UvFm9S|SN9N~MsM3H6IPkr@;u%1RSQDjJEl7t(Wb;`d@MF!#GPZe1dKl+_1G7pRY zyoyYhhLs@eLq(7A%S~U7Ik`gV$*}=ej*ex3e1nE*yK#hABCLX*^1?&Mf>d{;>BqgXvrd{E_$*CtjgB*#2I zrwrv7y(r1kQp&-KQo^^xK#ujHBFE$nsi(%uMNm(UC7s-<94jOC5jt?a2BOVQ_{981c%p&ZMW7-=ZS;A#0(j=>(>QI35a?Te(}-kZT`wN9c- zaK-8%B2vX5%IOrPUB_NgN_V)64gqI>|AN=cnY# z0O`&?@?~$&#~`W>@7P0>tUAKG1ACda{7xGwowRhz1x#6bvJ{bq_?Au62i#zJUdvUA|)&u2yK7gr7WRImI_(3HEQCs~_8BOqG}+dh~mW zlK&)cim{o*ccO`&4s&?|k-Mtt*+7*@#HcCd6`QUzq=J1v(i;t0$e~kkBkS5Ic}&!2$X5 z0)q8fxm7hB{3oL*RWzu`w^bODXina4d{mSc9v)(+{MLe&<)#+QDJ(jIQmuitkrb|@ zTPnU2>B%}Ub>cB;&W@8S>>KD*=c3n!DB=zl?2<@DL@vq-`zqB~@fG?#y}5C3Iz7pA zPSNURkmP6fBsEBN+nhx!!uvuh?~+!s2nbQ1RjIQ$Md@iUA_J3CkA@$JEx&rQuXJ89 z=aPO!S2fHk!Ax{8AQc_=l-;(&(qKLhvbkkCn zR2T=r1M!OX7AWkLg;zlO!}0~ap`5+vc7|+|v243noP+p5+HbA1a=Bo*I*Hi9@#_p2 z8IhB2e=$YqY9$Xy;QlPMXzA^ck^^9*^vD+w10p|uA5{*eZ?Sk{f_W%bNmMNq<=u?l zb~$PR!&XotID$!UB`Op%%8_$9x)q6hxrMEWXc~Ac5QmIqOfl6;6wZjVp6^crvk*yi zYci24)dVQ+O&n!q8xslPl7cD~D3UmO1rI?p1CTp<-ZPS~@-_osWk#h~>dG5XqT2_$ zDIpU`o-_{KvtT+x=SuEx$y8L=4jM=0b60Y&`Oh!BgUjYrlTqmms{^PnEI(RSsG439 z_@WeIDI}o-oO05dSO;w*zl6SE-3zToyKop`+8ZG?I??UNi=M8FR6Zm%8W;iTuiVPI zOxG+gIQqiaLp{K>j>(a($88yw?vFJ;?q@O^DOVtY6^#=)kCZFRxPd$;%k3yQoUT8+m%ZqlOnSY{c=f9CY;!q59N|I)|IZ;y^r;GW2h$? z!mr_ndJj+6CB8kARC>yFrX~HmNN`DXKlGGVVwC|Toj-j63mI55VS|SJ-@;_4uugWDorTAIU z?(v&2m4dIUX{z2;z2q3`1CgSOsrPNF;P5{5&uawrAXkN*t83Ri(s2xDUSAyU>+|qb|LwD*}`A zoQ*2>%GZhGB4}S%R?&;x1E8i=QX7a#kxL)x(^;Rr(4z=r^GN0hR zuT0c)XhB}st6e8X0d=Q-p}A*y<(;c)*NFh=#YtDS>*TCf@jsrZiq}2=!?R%RU`(#D z=l9~Sc%59%+T`ovbsxDrw6I|*UMEgb2yeMAUMCP^^G$MBz0S_*jS6*O7{R6-HX%f# z?z_YPvG=dbmK?{KCVVR}_Med%$cgho^Ks0^_TR!qfFMM%O-;%`s7>P4fBw84xmM&_ zxvO@e3Pp%bu+=DdW#-BZ_wexJ>xC-$I_g%vjvlu&dGA6o-AKAUl{0?|$>G`_7E@u% zn95ehi)<8AooQ249Dbfx+RCkE2H2K}r{Z;fXx32LuBvS7n`7Je>U9p@WUCcV)$6*u zsl0CA%Y{UucYz+SMEll=A#K&`Rl)E)#;JOpo6S8hr{eWm61lFHwyN-2sFsK!ZpG`+ zOyWj86|ZymDpJ~t*SGucXR6}T$8qlGXO+ryTW4R*MnN%o`g`#@y3&5Ljniuq5%*U* zir2M3w)w`Xc%8e+hvrl9IvUw5t+^Mk@5_EvukW-kSiW9D_^E|bCUtD?wwJ2cz@{l< zoXXctEY1HbA?

+2$kdMd??xmshT&jIj5udL2?V2_2{Eb*N@zt8#voO7Xl9JdJSF zq+iiqUb&J}J43rwuh%$9uAPh5?JVS2K1!ujye<)OQ}@iR=zET)PHO5@p|KUOo3bH|p3`osQbjh?*t>n}AUHU4e6U^$(XDZ|UWf{N&)N}N zzoNZJ!R9i0-Kr;0?KOE3(v5!?v=>=-_C9JtI*Qk&??aLIcO)OKXfHaJOgFT>cpb~B z4L^X6vZyQCi)`Z2Vr*Nf6o=nDO7FZX>Vo9=64u_!cDT^=MlD;RR8<#uoToY|4sC4Y zy>h)O$C_i_>X)u)FERvL^t+EbDa6NwCzSo}3);&oSF&+cTzxB)f@XrD*z>(m3M%C) z{az@=X%2(Yp6=cydelW-(Oz^AS1)(D)k^7bHd|zGP=r>RvLRco6jalTsc*GX1Oi&gqispM zE1I8Bv(>$HotGqw6Sq<+xdFAV%GBHTA}Le-#5~SXbK~sD%i*-OFKB+Z@hj)8SZe>B z+jc+Ej?#4nHtfvITkX26e$!fGt3JP?y}WWI@D5>Fwg;^onb)m$owME)>AKr%*I`3w zaXGeLyUyYcGZ)UqQc#oajIq_OS7mPFy)NpB;J<20JdCYUN>)elL;k3gsyZD~j;Bhg z`vZ?UDb}E*yl7r0B@an07+aYXx8~ep-^!#ai6S!@(^e)`>4CO)&8IRcsLO~ss-$Y7 z_TM`Kj@qXy+RH0f;#FHp2@%l?^cF%_uG7E|-W zRPR@jkV*SAoQ^mRrG1Kb( zRIx5Y%$)gpt60YjGs#>bEw5O|45O^Qo+{R5h7GSzIx5y>a&_;dI;zvJXv++<%{%u{ zCnlF!DQ#!o1#OvO#Q_eEiglS>N$oYa>hvp`n_(j>qkXGb$K>j6TkTfZ18EsycCzG0 zBW$$vXoQ_f%Lp6Z)qXO zf3U&KBU&Y5cN^@H<~CSNYNtQjV6(;cXoEe_mJK$Q@ITpLBjiyZY%qc%<;ez1F@*GJ zgN@kxqYd^zb5kY+DZJeV!&Q2;!HCk-2ODfEu2&yzu#qJ{CmZa6wrsGeGwx)A9lx{N zV0YS4urA9is&?gO9m%q4V}-E2`GCDy{JC-8#wa(x~7c0s6|%`htWpUto_ za(**)U|uHI`&y>e5Q) z1fHwa(MzWDLfxv>wQyeZc@(SHC}o|`#p+VM9x6Yn-e)T7E+np7sXFr8yBB-kOJ#MA z*e0wG=LlR&HE*Trd}N7kv>&DF+9^{lC0nUFJd0DH7h9?N6;;a91K_t(^(`vBm8$DZ zZgT!^rRv)GQQcWb9ry+58_yJ)O`T4)>Q_`E-KFk@<%-hu5>KV-N?aP3=c!cvic0<_ z59K@VPc+-aJ>#uZow&UTRG6ny^(!g`4XE6_m8#2z@*??rr8;>P6l^|Ks$Ws@FU;*x zCF@bCuDF_MmvO38C;yYPQ}31PS5z}TFpg&1D%EA8ny#IvN_BqS#Hp53rTP_BdB7;3 zwp*pT4DPI6;H^@fU&>KxeXCTzqLPK2E#$FPsy~EbSEV{ud~Z3GQ~B~06+f&G&mta` z>U(l<+kSRDEuVKQRllO*`Gj?(9JT5XKGG^y$IHn{=>Q~e{Xu_K-Lg&Tm_>s0JYx^w4>LK;eM*Y0U-g8}4gs%sH)szb42q#it}*kb^{<<_E!WmDM0_}W%EQJ$`z?Cwfqo-Ah?=c>#N^0}?mdmR*)(#|M2v0KFq zmlm^9RxWxZQ!o#gb_y?AUr#l)I(G=IZxne+Gp-g?vnW+e%nI0fyO4&IYvt0RkTpviPnlO=pQy!0Oj%DG1wjc24=e@U)MtI);9{S+@1I` z>axzLE?JhnpS9m8HUl7~?~k!`>NAmdvR$6?UIIfShglwVJCxl3wc};fErN{gVEd=J z|1ebUA_KXlmB6x7#Zx2IUr^zD=>kBx=g+oh9?9?XGdBftL4_Hk z-TJF-CETsaLAJw9Jp7py;(36Q% zaOqFfGn5t38Rmp}An}qf9?-QVzx4yaN=P$hls~45hxxy37Je$1VwG|1A`dFm3_fM=I|# zVX%IMu9RJE0u&rp{`G@+|@DTu6u|Hgxj-PqY!A!I?j6SMkTUsn(}C) zQ@hR1#H!})^~jb56GV^FxPRg!Rl)MCFC>5&c*)!OQ|PR(>8$F2R_XOtFY!p_eX=?0 zQMaciJ3La*CD-Y8-8cJB>%?4Y>50e_O^dF(l}htnXReBOnN1aTot{XHHRp#X9z?!y zR8KPF`^;2#J#{mr{fWbtH>o|!PW9VMK2jyTRoztx9o=K7DYN~Qjs{gWj$4{@skcPa|q_{loJUA^=UoRM7%oQjTy~r*FIDAJ4HKr`<*Vlo9!}> z6PTml#@Xb)pl(NN0eMue0d93{WfLn`Yv!MalSr%AE=zog?5}$6IF-LSNGpJx+)W|| z5N1@pqMhXO=59ZHL3?@S%BeotxH)bre>HP7Zik}RD`v3N&IPa+R7zz{$A-KM8%JSv z-GKWSywa>E1rnPNv(L(NC&A52xxb2jyA%vjrPrEhZp>hvef<)k&o#i zExq9FuY652Ij*NhS&qe$glfm}(zU#l#Wq#w+?rym+DrvONUup>GC{b*jQp(M9y0St zsG0tmWj}Egm7kJ43I%BK{YGZE9U9T^Hgjir5YJRu6Xu%u_t3EH*3B4k_;(L`-4!J= zf4=+8Wn`>-la$)@NA@OznGEg_`s;gX{yFyD3!fpc zj)G_6W{#?o^=6%vEQ!ouR)kxGv>w#86!!ogksAk<~Vp!=dz>>$CwKgfP8-Xe+@v~OIuB;oPzmdpk9{OaB^&x>c0 zF&phg3Y9dn+g2GX%j22BL!<$yw^ez59Nx#Te52oqZe5d4%}d!m5&7)_9=h%>N+t4? zS=L*xbSKGuQ5_DEGa*=)*_op!H8KVIF-(`~Evy;}F3q$Rm$xmLp) z4XQ(3k(ZVy{>~4@(RKm)#yjd9?dSGI??fHJkBCElzmaCcxp7tm0OYt9$2_m7wo9vr zma9XyV*D0t?04FIKur2hv;PWlg^U@nlD9qePR10yXs$Z!RH`1brWeCaxh+_KL4{_D zJDoz#gkQ|c?wf-9#ud_3E%}~NxS&Ft!)J7`N9*WblQB!&4zF*#87{RH&-(R(D&3y? zI{c2~i#`xPPAeG)w;8cmhsS)?R#ytk1WfGk->2SeDKDkm@-han6}hw#6;im6b2J2x zIROvm7Mb|4%GocdRXMx9?9QxU-_{?5EgJf8^H#8kt4j42%ekOdO@}&Oe^tJ#Cn7Hh zn~^+N3VK`JeFy&_`%`sHo?>>euf45a3SkwSK$bWWUM$NHYLl#pi)mP=+Yv|ijbi$| zySI_;(D%gC4X>c0JJzPUX8<)~E39k{2u7=frlqx0g?^&)9W1%PR{Q1@##wRImn)*Q z-jJzr4JS)QD*P$eXd*Dm&&)G^s>1g&99{6wFUpiQl;LMn;{Lo z>JH4q^t-d!;ocl!Uf%i|J5&{VAUB_f12`CmJR}-0DSb`>WjkYt>v#Y3*4N?DbTcug zN3G2>h}ueEt)>>eHpe8TwRNqjgzo)JF`2QhYnlJjRxx8AN2vD}L||Zt>8`lmp%*U$ zH#^KFAD64eRmkmI@tv2mfO) zr-ok-)7NzLV!Bv(nBIicF~&=nF3-1c!qM;K7ou$awd{;qp}~9A0iiz|J(I zlc0Iu6_aZmksaT(654;a+e^*CZR?8cMh>E_`r+LkG(B3;zD)1cbEhbkG(*M7r}QT{ zrM+z6O&D*X2$A{*-lXas6nKkitBEvWY|vkGRvF^m0Xvs#UP_?Q71fd3#zHd@DU%$FB;NQCW6c;&t7=X6uC? zNvHKcwsA78aUKHy)0uoJ*@}QQ+a={AN=5!Qk`h?x&nzkJN>bXhq>N`t8CQ}ro+M?& zXGs}Xl2V@~rRHnWySEVayQk9GlUU84TdX3bXD0~3o3IGBnB|!#VPSxeEhB>vd@VHl z5Yl}a2^k<6L~3*u&+GDk?Rk9(70;_=<{^$HS99=E{y6!;Uok1f>>J}cqXmwqVK7jV zlt_l&`dl!)=DhoYZ6im(mESr>VzzeL`B#x8sF%qjJJOYV@UjiR@{4X(*4p zEKwMJ6S$goXxm%Rn|*(aP*oM*>4scy5eW;qfCmZWq%vP@0RmJ{QTX zm{Ar*12?iI=kd_@fcl~Dp+!cU$5+-Ico+7(?WiV>-iQ-q(CB+C`CA-1A=6Xyy5^m6 zKkWbSKYYOAYPG$`;_CGDH?PvYpl&rnoe95Ps02jcnkM!Tq**RHS@zb18#c(+=T#lh zBE80fJT*tvoMud94R#)gn*$<*q`^Q&OZ4B=q!Ku?fPQb9mHxjA+RH0f()b}frvbP> zv@)4fB>5N$_$0xpnotgNW~<(3(&?rFJRw#}Rc}u;m7(q&t^@gMIPAL#@Cc2HI-?Tm zOoA#mSA$RoI8}1W8IEIaN?Q|+jtQX`)SX8B%*0${bdv40s3#7S%ej8rev3FeD5F_0 z>GqbxHUZranpDaJ1{1a7mOl-6w%>%@dqFjqoE`_lCxeLH+`1mR0OV>q^@-kygjk~Y zY;;DH@-+BDo-ewb*vG}itw$;{F{hl)&Zz9ri|P+cP+4=QX)Qa7#08bWh8fy$izz}u zcSqYp!JkOJaN&hqP*ug2ngUY{Een3LJ+!#%QEKr{qYLWxK-CAFUi$|1@^VStX!phe zbY?ASP4CUe-Op4lWA$Fjfj^7ac;gGDjA>O9J`>pp_7rbrF-IEUY&&vH-b+5+dqvgW z2m(Gi(adel=ZUS)L?kxPaZH{Thz~TA?U1$*){7**&AOoJJhaA@lc1-qgcral}D zzqHO<+X&AHD^*QyQ<~jW-Lih4sqoPBuJk<(;$zMet^>wFR*Gg=U;w}jPcW57?)st7dT<}7Hwrn_vuQ|mfG4h zb`B`2@=SZ@5uFs5PVjesxuoKQPVil{9x3=&(xxE*W?;>xk6XhSkD3M!!>P*i0B8=r z4{bBMJKeL&Aop8=qKtlL5B}QkBhlBCe6ru2c=yh4BxZ6?MkGIz-noRT*KW}2)W_#N z4cpJUpOWpU=lzrtAg9+cCcw+X03Af#@x#DaQ&8z2ub$?d$9{UCYCi?}jqIl=8v7}@+HcgpEy=h? znGTL?LxBmf@q6=aPj?pp1o3QMBcLD0~Shhv8lP}uuUeeai%16x1CH=kB zhh6cdj=b?axsJ-C)V*4kKICIE^CNYiMYn+5eca)cTYsCB_Hs$pROo&TjC0=_n*CC7 z6jKwE?o)ng`V`LEEl#CTi=%ai&ob4X>*?;SYUH`@exz=L?Y6rcK0?)xr0!qM5S9_v z7f#f;kBIDZRsPPR`NHSbf%dv0?caa2BJJU`ammNV|M%gNslE1bTkpJ4{6N9 zw0oo~E0Kg@s(i&#)=!&Rp(q2n&qy6TTP_c8*tno7GhsWi zduAf%>}liN8T);3jXJyD}}sxMCu4U*y8Akob?MB=Yp!#gn(V|qeLQl zNTQCDA~#`Igp=0U6i$keky?(ht!cAT7P zb5=(RyTgBNc9gV5(HOcL6-=?V1_a(9N(0)UuDviB*Z0*aM9;0Vgwvk^Jn4Sn1?lCr>%c2s<^ZC58Gs< zHlMf2APIAp{q8^gOnZ6d%D}Q{$aPbqJ3R(9#xkETsM;k{;S)LvLC$)J4%zw(NAZfP zeUiG&jg!Az=8Cx8r1o{{gM_~xeEI$Ff0w`QfBWD|8_!)0+eFQyi~F4qekcy+x*5zu zuV|}v|2{>$s*`-|qg?@csdXWmGP1!zlFZet`3&7Gh|xID!@hEF{O;TQpQ=&b zVc}+Ge_#i}zARLV^*{oZL2C03y^jNBUP0bQ?x-Q!uhVqov7U$&`Sb7p`0w_A|NP^B{ky%ww?BOMf#dMw_H8s? z%{C7Dzy0w~-+%Y*zyI^^{^Q3VciR8_^B@28&%gWre}DgPZ~vx)dT$th-s82NBJsD6 z{q8@1`ztC9!GdX*7yQ?6f0e*OoVK^FF8INoK<#_!eVqEN?pOR5S1_y`G^Q(j@fsMh zod7qE(@yOF@2mS0zrNr4Rro4?75$E!%)i$ipVvFaQ0Y>>cpL zrmX+>HFif@*K&+%?7scSugQZm1@-G+EB0dB;GeF3=+FQD{hxmOs~>;(kGllk+Rg4w z=4vtTrh9(%nvgCz{PUlF{Pkb{_}B0MIi`RA&;Q58^1JV2OzlxD^`Afd$G?65&n8rV z`t$F9{{cbm)KbkiiK!&>ePVhgkhc}Fcln;J_LtxO>O20q65940L>ihx6u-_wLm3|B z2Aaye{Orv{$!#ZddNVYDAW~g5@hy&gzxUlv1pg%_p$goecq4k4(JVAOKyr>gAZn+f za)+H?7q4h0!0T$~JsgEUV|)&dju6r>gr_GrV+95|gk~*kxl2eZ{l2K0)B$?RT3Yjq zGG|=^oNJ?Ly=QVKNC?bfZq&uqX>6?mN=a$|6^T9833}s65bY)?fjhT-h6pD*) z`KdzjFaPqpVod%&K`81)rc;jZm}?;ybM91T#F?kk4ha~>Msr+DX`=(~G~pcuccA;g z_HT2e>WPIW>|B7B!6U!_NRi7JkK@P8bEM_|)2c}9c}gzm)9Cwkw->jbY#twKTgVpxK@^jo-YTZk(BDu1Yj}Qvwi* zxPAYbjjun01YCU1PnCebM;kC*HN9q%SAMo1(_tAyQJ8S&W+3?flnivxg_jjr=Cc*( z2H%4j2t?$&{gF4SSLvJi5f3}C)46!36$NLhM89~=e^`P$XY+H*$zYaHs%ycSA^NgY zIe1gbx5drXEkSa?JIxn-9OHUAFqU`X!PmG9!8y|YBb@o=D3b-TB((jPgP;m~^&`L4 zJh#hkul?@wWB&GL;4g{)7b7+)qK>ni`R{G&JuQQ;O-ErTV7?4KpUwbmL>w`kTbs+?b6nipkLb8>{b=hgrs2!>)65(SVB_nwuerwkvfF#VyZoAe z*n7JGJSQWPCbrkJy(eVe9MJYRdrzZPsm{NfdzxfL&&tVS(>MXM5q5iT`U5Ynrve&z>S_r~Rb=%3-bqX|jYD$`vG^?G8KOq43zz!$xnzB~;;>X^% z%C{GPer=|YYut5Cpffbz#?;!(C{Y`{b}uUl@<;^^K2k0y5i(UYon|swqiEgS76*=} zqLz~dEdN33vMT3F|5pZ9cvQN92CX!p@9=45R5yQdVFMMaxll}*C^zbwMwy1LG{=Cm zidyMRo=1|OnlfwnPAy0uGL^*Cpb|BS+1xJVGbf)L)dSe!S>w>DBzxy8q^zk{X!h4I zSpSD@SNq>5f#9U}Rt7Ql9oXM9gPy6cGRX9OdSXx}F!aD7PLlk{p=pQhGly_b&-|fq z|B*k9acGbHnbcUF`NI&c^vE9|NuK%B=xaUr^Iqb^QhrK1PaXE=t<1kO?H2oUVgfx@ z81H3E*MD;iV>P$Z&V=X(Qp!_v4;n{B?9n$cTFO-(r6i3|BIDnuBd-h5iy03Y(0afV zm(G0nt+(j5@(iqDa)lk_Csgm%G4BV?azW_;9UmN|=!#lt+75;7q@k+nLFDBM^LC-- z1vE4Wuw_YGlF4K?6TNsLh$bV9v0^kL^e6$=Bu`KLtM}FT=wewl$%dZPE{{9;II*Ph z%3z%*t(HligXYjJHyM=2l_j*naApvhTC94XQAYN`(lgLnmCfNOIXh1N^Ai1x+O4Et z3X6*H)c?D(=%X0-f36}kGwnIPo&?e??PPkW4Nc-Gk#3BZFw^KlK{=V#Ov5TpIG|3U zX#P`*S0pFq$t3_IWb`pvKWtX!#Gr}xElf7ZQdaY{bmNR3brp( z+01~VF&d@D-3;Kxqeima&47Z-Qz>}6n*oK<3AGUR-pl|kkv*t?2{Y{?Z}Vk2)LW_l z{W7X1vmngoM`_1Im<}eJ5i>Qk%{?tsdb7*l%x2Ve z3fB~l%rkk{eAL(r9h4z5O6=X`PrXIG^>n3_yJpGnM_h?M0Ej?$zpQDVtbi*j>bq5- z|L#^m@!FPDcPpR}v*`Mvo1s?dA!MTOW(7#gk38GS3Mh(wB=q^s3SbfPU>NP)3g8tJ zUj4}m;L6tN=(t+}h1f4iw3`jUQq)@5wVMrau|PkgcI)MD%OLX->Sm^WQ3jb4GCvQ4 zK8kIhMTs5!8_z(x%pU-+_Ui;dBejRJAvGf2F=2;&o}A>aYJ1wXhQ@$tuk!!~F=l&! zP$qpS+3B$(v{Zi@PR$SBfA{12suO>Wc~yF3&zFJjlWlF{p%um^J#W=Gg<A^znAs>IM3USwa1x_*`I>z$MSa=UJP@ zl^K2kP`l5k#nZ)|uxo!qce6fh>&aT4wnHJTi7 zD=s?(Ophcx*5Z1{WFq(~G)a?=|Cn|C@SGkZKozf${Zzx$wr>yB!?YgNOno7KOef@{V2B?c#zWK(u07cz)YyA1LmT${j?or|1pC=({gsUBywl#p4G?zg->4IA2gwE!hC`Q!~ zF^0DXHcr8h{U4yaW73t;rI;I%{)@knp7O5sPXXYam z(-0XjY}2~h`jJ*6lNf1Y4NmnhF?-0qq^Y4PUVh!l@A;cZjM>Iuao1mz#LNqcAvYcK zbRfLJ;I<=U{XnJp&HiNeDg3ar6krF2F}EV!K7I218h1I&w=#|}7TdX`&c2SkHFeyB z-+w`SdF9GrPn5KBK1ZF(m0nOlML4}j@1d;|2u$ECwOKP$P?OFEFbhC5sDpU##RvWZ zgvOM9sA>L^gl5DGq0vzIFdXmQ%p*?-Tu?PKet_bD>6D9#7b-A*Vv!=U=7_CM#wL5B zWaDORo?slYaH`Yf43gF*?d6p#i)MS7e3U`66bMfCBMdG|`f0O3n(nTQeC}% zafN2#xd3lWkxnwv3 zyS*i*KP2W>GsQ`qqx6dT?HpNVX_Dur^3sIJ^c2U>6h!w0?d8=ggA&~dTedaq_ewUD zVX#Tfi^;Lc?F4OIKwG1_ROu`-k~*0ubs_*gUwq*&Kx*ujSmIxl)YJ>9VOpWNNsjG8 z)tjW|f{LNiGR@VA@=BjYhEg#XY{(xmU%(;6n;N9MpC)xCAkv!YgOHE~OqE!{fV-f* zymBS&-lj)n)nul2>bjWSyVRf+pF~58xe7J$nN8JzLQPAyIjs(AGrhv=;tPKPQd4Y? znIr#;lA0?!IH~1s2)r*AQ`s_Vo`~#W^S=w$0&|THW*AqDYeKCUeOWXmk-RY{@;9B) zGYC$QgRQd{gb>SwH z1P~6`^OyY+EZ~}%^!baDl~*j_Fr&sLP}(^hpzwkUHyFRX&Vh!slqoykeL)U4CcbAa6x;yzS7PalMf881kO;DD9f|^2(J= z(k=4BG>&@oWkZGPzip0k8cWA9!mcU$olP)?qwplMKL8RXQ0gzg@R#B4qt4DBn^uppW}V9-Wj7-vLo&%mwmA)}&v4+}~bc!0jZT z_KOmjE5nzegGzB@3eGjG^optkR0j1bsfJDlP78t+$#R#>9QCaZ@|3CBp>W=4;ovz) z#Zn$-b1=;Fg7)&tm7o-koD@^GgD5*BR0bzY7L8pokKeYN6+emz3(qA}2Wrx*Nj^IRpIbzRK(*J%qwEojXQEQ&RY<%O{1_o6 zZ#2`FrL8@5P%#N=%z{uOd;qot;f?_^w9&c%8@n_wIa$})JGD$5)s11pv#*r&$csk3 zphyh8DeLAkqb!dA+@Nd>yCrG+CW>+c%gg4rx8+9wfR3I#>U6<2+#{nF!X}Q%W@mus z5t!uLPBh|gWyNWZrV~_DFHKN%_H=W9T>x8)4)WGJ5G_i%*W11RJ}j=;vq`T#>uq{c zZt;rr^4fKM`1EN2kV#I9qxQOsqxOpN^^9f+-<3})YKWozV&yEhT%P63j`}A#vwb`t zeU`I46#F~LStzYO%2`~l+gZ+Xjrmc|s@H6s z1g&Jp2R}<%Z2eKxK!m#@y}WkaCTd-Ny!$Sp!oys8w2~E9 zZJ+s6&82n>TL2XSnqyMa`L{I(BoU`HYB=C7*8@$w?eAy>+-Q-PEr$}eM<*B19$NAj z52?G5)qF{LdF3j{{$*ZSbN>)P^d5Z>C1@o1164L3r}$#{#fg=Cou5anmg4(lvC7m# z{47$H)^eYus$uB5ynyKM0+WPgdqI17^~%=j8VXB{%*zQ)%w)+OOnvu0>Vp9MRVcS4 z5mkUjL9+2At^?a;0wEi7*4MR_ zY4JM!BhKHu{gaFc&|F%V+7B?TaEfW(v3xl*X&{4;MuAH4VOMxhF@)qqbFyq`r z&1N{|({tfUNJqfunacgPlEwLFA_OK06%qDRO;O}wYdTNgFN>+wo34GNa(}TW714Ss z>zQ|&U-!867^Xa)ww_aW-bU`l`mo&#pkl^`ywz7Gx&6=Z4(StOfnOIpneeg zHhA-)4KKGd-KAmF_^@pqflVW-Ju(tNS>9<3l$%qAY*kr>NGKvV{sB1xl}t0sut7bu zP>be^>2;guy6t7xT(y#JS}LWf8Lb)$5XZ@qW$b7P>5}&H>XiY2juTDOwTfStfKFU5 zKAP~`2T9Z>^PPzf4MW9Vyg^iii8(&mC(JRZc$J$`kLt5)dIcGsC#DEWG_*3NEFXsQ zgzmIDmV;|=)OrYO7LVIz;q+fwh1us(dt&1HNbyV3j>U zV)pbZ6}5#(QB$l5GAF>e7=$s4G{-)H>ajW>8Qlt~gQ}&BI>FKEZ#a+D1Fd;qwT=d0;y>*DdZP$xfx8 zdOScty04f?R6Cuph*NCLBe}c0&$Q3$j*m;BW*XwNRNG?2N2#tLKS`>y48M(;XQ@6k z?+2y2XtLy^SSL;TIg2&;sAs8WvclV>`t~h%sXmiluCGI?M}Ly)IW?{Q!%{tjApRiL z6-)m~tVhxQK8dv-X^1rjw9EBO@j|Yp9Db@;o59^&th-(6V%VrUjp%`cySB-L}Vrg9fmB~yyHSmr}Ycz)>Q^kx8b3rYou8EkF92Kzw zZ)2;qHg99AF*_{N`MEWv@za`pUl~lZrxXAB-CzImSNnf|`74P<`}cQ${p)uh*I@gT z(HK5q3QfsR+-MOudn6ZsU{ui;jrpXeSlrGV$+VDYK~uhmYFTX28M^PMoEr;`39Db!>(uIEf9 zI8n@t^FA(2e@)U;C8d%2Xv9H@EQUrsLSW!i_V9t%!j`B|huMl$Gbpkhvd6AM4MfRU zsh+Zb4CQQnEw~w&oFa38`_iWFHklY+BN?fd)UR+|cG{Yg3PzRr5JN=MR&l{r<{Bt89LI1?DK|Ry@2eT0r&t3w9lm7>la`-X1e;_YNJL0CHBr+l`-$pPeM(PYMzTV+y1hrV`C&*6L`mFmP^wX%B{$MPi(-NwEaRTtD36OaidL11S83G zr^TbY&YC?>C)pjg|E`qaTaaR6zKCK`4~9}pR9ct?J`VfKOnH-F-Xp8-l@XGe(c6hy zuN54oh78oS1RQHf;c!z;=h4`=MxV^h9H$5|Cx%I?!J?6=k&}7qAgT+{~ z^h~`2*iq^~*nFZ@gj{b_7{|9Hu@t74CZF2gTx3lZ7W+h;he~2wW+Y$8?9e{e{$YeO zt&5o%+GYi12j{FD8Gx1m@RU47)7y0PJ9F_@Gvr~(3Mt5lQDv6qG#7^is=cWE@0sRB z?8*F$xB)k5o*C2iz6N;1b~DQ0g7$KKrLEM&Kr|XqQY7!I0~6^BHGa9vWzVG182_nn ztlsD%nNE(s(sE5t0u)C78KEI!ehyA?RFeh!Ix~-aOh+SNe+`CDLLIhrea%oeaW$Jb zlVcf*6-NB?Dqb=H7mf5xdZ#*k80nbJk>22=!J`R1jG77CpTnDK?a?$d+HqVsJ)qS@ z!l!mhmfXcE3>QJItIswGZLuJrVS0II@CgKk@u2{%Qd(y};aJG0?K5X}1c%c`V~R!F zTmd$u`Kq%#Y+X82%DVf$$!AszC?afzLXk3{zqLGYeX2v)`!HLf{3J&X@kU7^VpJX2 z9xP#Dbesgv%z{=HM7LMFZg`X@5eD?}iu7)cN=HlP047L$9Y5xS2pn&b!f_>q!C#(? zT#0M=M`x-mD6OdR$eAkPid5HTWiUG4)&*@zTq%Gzp?S&z238YmnJ#fAhrtD8;G0U~ zIH$a|+gx>^JTzH!c=!^LGc(LB+FqoMzoE165R|6>518_c07A`9UYMmITVrM7HvwO%H+pP;; z0Kbe;wxXpN5f^1ja9d;?$Fh`>nT4)fIkjbPbG~;?Ko`zyP)GzjU<$V+A)KX0lQWCiUVoiYh-Bb6=r3s_sRJ>sl4#m=ayWSe=o=}+{ZiM#&V z=7&1#)1&As2d602)}c z8Z=_Ot`<(S+VH7w_`dS`%=5@sv^Vj6d@A4D)r=_|rlh4Z?OUbAE~xN*I0BxjI|_Nk zVAGmRqM`fT?8KwpqL}}aM6LEuJ~95L2RNrqpF892CmGd4}awoN`k#~2^bJUYgw0*B;x9Bw=eIfq?*FS8R@po3`D``>r6PiBv<8_b5H z#+%ntI0R8BDw+ZycxEqHzu%mQFv`oqCYJ(&$$1j*yr6v<#*Zt;r;#;{&AtfRcrpHw zTGf!zTnU$~IxiSs1bqnT)u{2yPOdW^nOg7|cAO-K3uUbNVtnQZ zcPK{9Os7Dt91xHklH$9Gad1q@kdn6{_O5;+=X)%SL}EBWFAQr4Jb3zcw?lKF=>hoZ z%S*a3^zJbZ^#oCZYi|`w-X(#$|CrMg*FnAW$cU-6<{Y+jEYvI78@b*-iR(37aUE36 zCjOdb91pHPQt88tb^xaR>;(ZQ3D46kw6a=2!AWb04Mv+L8PwBuKjcH;I`sNDsHPo` zb#Xlo4gN@)I~(IxjfYO3HLb#@!I(;Uf8@aD;=7#nU4U!!4>;S~cU zOBf#+0J0qOuGuSzwEI-u6VAHb(S^%Vr<#85*J-?cNyjl^YAm>_2Ncd#ebPu|1>ew{ zSF|_r{&z8c8t*U134)25#AQ3WycXhu3h#5RDQ}wjeweF4w=LYA&H)e|v$>M-+08q! z0eFn(&uYlNw<~O3yf+_1^HkWiaV59FE@|RD!LusfS05ijmru){`{|rfgs<^x?U~wq zxL-O_6t$IUX}qr{VKAS}k?Ex)D&veM$CT+}zbj{$A9Gz+n~4w|MwQNj+;8DQLW|n> zA+2NHXl}_hlb0*f8#zBdjq~M-^Mk}2EH1f(x)}dJgzx4r0e+tZez;Co9nJ zj5iZX!x4Z(Re!|Bc%IX6<&5#1uR|>Ewk^|2+YNKgk^}z6xk{dsY%COera?lCxA)Ru zDIxEy&K_D0g0OUH!s|K~=sBl}Ju|m1DgVjD8oSJ_wlRh4)EDDj7vrF{Nm;5Gl?%as z=4bX6muWtQ;Zzw8L3VI)J}Y`~=DhBP&tM48E85$5pFZuJuNMa15V*4Qxus>JT~Oh^ zc`D7h-)D0J&$jJ41V&g^F8;3K$55FMeKPRwUcoJR1Dj_V<486)3evR0%M457drdal zy_o-(wo+HZFT)htF(GJ;b)wEW4^DbA$4#aw$)Bm&hr~V$RV*+cEF8~9(4gE%Wl)m^ zGS^O1?cL(&QUukGom}eKPDrvnm;WY-SLJD~?V0i>w*Nl;?$g*luGnsFMR)JlnBbhd zpbBuoJe4W7lhkRu34i0T^Sw0^Z(M2o=qG0$m0>2DN6eY)<91uL9oZJ&OU2t_gWKlp z-rP0{Yma7c##s0AM$I$o9ap%~xE?X^!0o5Pg}}BgHDF@xY}YBY6b4SGD|?V$+ZHoWuB$R!_k#8|-kXW^ zDZFptiuc(k*TCgTk^9Rf)e(J4TV8f*Y3=zT^?Kv7^PblJChN^C=Mqo62ZTyv!YJoJ zscLtdRTlbz#@U7@hf)w%vX>rGS}>&CJCok_;0}gpuih2et8z~s`z}FS^gag8xNjz_ zd-!=U*b?T)qepJwr7>*|=7$!$`+v2U?#$0%t?XeS&_Tl*pm}0`&T48zVU)Uh4JZ;H zSF|@We|{SC(-re8*illOrm@T7{R0u!Cm%g>bHe1n4UHXwp{;oZWMMVKLc=##Qt6bt zy1&tG6>4no(!=en4|6m(-punqnhI?jR=v&)CH1Z1J_|8oS=rrBC->rPO|qx3%sWuP zn$8Ca)8McW-UMmwk?OJW&9oby&ak6~yYc-4ePpzEk1V8+ArwX=r<(FfWgM0QW&P86 zZ&q&Gu7uC#*w%bSdlT>f#SW8C;(fW|eX9`{+SZlc*tD4cNY%7Z6W1#4$I@v@7h+US z&i%~Hq{V$7v`5HF!LV)H!>OEAp)#t{+&Jg5eerMr5t9F9 zKL)DDs*aRxr-C2GlYI0GO~|`%a61D+zM{R6@t=0uw@V{$EUU-?l8#;fNQLpuc-FQp zE)TwHj3bekK3s7Y6|#r4neIF5fg%ji;l<1wkA8-al*&;>iN)=vyDhk;HWJ@0GTh;9 z3vT&gV7Uk11eFT!QM&`X;7E%3q*Jr?%@d=BWhx7C8xacg8H-dF^INSX9gX>UhQ;V$ zdjJ!ky!Hq#5Oy; zqLfn96%NAV8%#S+0BxwYfyfWTiN*KQMytC?P$o!1w>phxW{Br(JQ;Xb58^VDNv~*c z;rzek`u!(yzK1K$r=T%4AdsYG?Osqp8wtk<={j54F#ch284L4~!Y!H9n7ZVfo$ryd zAPhR=SIAqYp3NP*A2at9-rc3V)#9SrTOh4>AKd}pL+)O)(ThO5qa65Rn>%mOy(BPR z%H`|U)wo|N@pj-4%X3^gpsOve+F#;FijV^(h|8-lvGe`pEI;2R~zV#QI=X&f(NE5vpkhj=gT) zoIZkF(UGbhl-BT)8^kL%tF&F&Z-IPbPCee2!uAK-nc z3I^Rmduht~&#v!HccYxui@0Fn?w&sB|B{Mt`((dOj-IOi4(9$X?PCX9i)12RwwepE zzQ*Mg*3pvJN1G`!+7<1My#K^={?fujjj!X@w#>o%N2);JbD|Ez%sEV)?4f#FnYm?D zocDG*ViMr65gj`*U$LU*p!6ljRTyV`Jsr%ingR*v$N~-#nA0jYWx9%kO@MdV<-HF^ z1uWh>A_)FFHALA5zk9e=rQSeDXg0lBfl+m?Ew7@IAy~dx#rw$C7N3Lq3E(~H6Q?mC zaLr&a7qdSxe+cJ;fWYuHjk<4hyP~~~_v6z}`|)h!p@BVDZd}eS`x0JI;k^ng#Cx-+ z!CxZe%dFcVQ)M9WzXnn%-V=;Yr{gnW8BT%&-YS7PqyDH zwF1@l03@EC42qt1Cd zx~SoS^G&Mq<_N%MCPI!Y+M8HE=BMRrN4jEt_H+H<$jcRxDG$*UvCpssPVGLI4+fi1 z+$I+gTXApAgeIJ~d^7VaE`9H9s@mOVEgeVwO6GuaVF&lzV|yTvG^%^C{ESJSeOF}F zxn4shSFV||9Lu-B9wj(6X$m_znc(HR44hn5B}1SZS*YaZb>fQ>=5GMeC(XQzab^2v zU*(wH?3lxuXHG&9*KHr?2L{i&f&*vL8(IEo!P`-;SYDA2<(%bm{?WZMaN4w&CtFDn*jO>elL51%H{Lwx5dKS)XXCA9Yx5=jnRE5sj_L?pF z;o!qU24j?n*dB?vitQ#70H{uQ?4_Gj`UM5=0`sE}wg)`N1G86_`BAzF+jE}T%{>ZJ zv)CS5kH>ajiF{RqmNXui4B}9{qP>ap^V?60++NJ%rFyZ<>F4gG*>7?FkqYOTS)9dr zN{Za4BdzAi6*HZ~vE}>pu=}mYXH)c4rL^Qo$}K3%d)wTrks@JssnaBk?x-{z%-yxR z*;?-62THOw&)s=%{|Ay6&3!|OxlTPF$p&)qvjqimK&BHqC(t2wYO8%m(sX2U9lbwq__(i)_ggH8)OD31epm1t?=iy^3j(;ujD&rUJMYcj zUm3SmIe9PACN5j^8o0SCc+@5AenHo)F$HTY79cK3N7Z1Nl95kT;fVL9Zj0AnmAFbv z?lB&)8tm)Fme{Mz=hfKfyWvO2K^v=L|46>Wd+L==5kE481c0t+Z{q!T-+fx5_F{xF zwGm9H-aPG>ODep#w^ai6mW3-_J)=v%_vIKbc4a|a=pGh04 z7{kntcy#K_*{fGub9ltf>aXg(i+&K8oKTca%V`V_s6|ZBzG*u1jj5iZ38v(d7+sT+ zoX@m3GXJ|zV}840K0QjFFs*eBIlrK)+Yn?cPq&Wgyq_G;((dLW`>9*iiCxp4XW4jv zE0bi(LQk`AJA93>WcbcrJb8=o*cR_GFE9V__9&z+j$nOj%DJ~5!+J9;=mce6&!m<^ zUcULrL#$6=YcJNT<(YgzRYT#ed>hUO($agpuc&mq9@~E9?pZriDQ%DTf}I`uO5#1x z-p2Xgf6{Sp9?b_@E$Qz&IzTbxw^qOxZyGdP$BP=x(62rP)GRgS_p_?hW!y`$0)j*+Q&8B z_sL&Xu+PTxc$E2?iXfAt@{uyv=$1@lJg`H}-ac#crfC<91ZIiVF}?)WQoX9XyT7rj zr-w@uX>9@{_RfI{i0q?C5I}Vj*~vwHiF!ww27(}uhv)yC-|_5{V1@Uosga=ZHBUD1 zbzS-d10aCq!43!v%Tbw)?bNvHz)WdP`Si1u_=Om9Q2|X2k-EpQKS2NKC#ZHM8q|bK zR}U=?a)Ze!l1Rbb2;Cdl?GVrX3w=j>&v(#DK!3(Ex54hqIvz~;m4Z1oh#~|!CM&pI zDN#Fnbnt$m4=Jxp7B+?12hI?pKrO29Lyg62{@^MzxI>RH%4c}9&`NK7i4RE^qa|*D zE(#ymnO06PFL$b{hns-X0ulEy=ZU7Cm0P@WQ7PXTIgG7ISOrOQtYFq^R-lQFpx9vp z3vx(<9jm6*++8I?hURFMJ!nQ3F22xF9`8ib>tVD#e415Ill=s(2~C?d2XOV!HHMHf zEQyA0+brz_ZbK=#pcXe8C3!s_eN+qbhU&9b#Vt4)U>>3>va2`Qn|~mPEfwx~b?N<$ z$S%&Ye%m{fhqF7(m?_%_>~FlLP5uw zvm|47|7k{iN9_)(RZEEb6A|!G>p0PH6Wgj}q*tq?xKE9_!BoJ58FMd}w3k<}T*^4m z*A~*&6>($g=LGpp7Z~mzCtR(}N8$3L<1Ac#Y6`_!xctJiaNSO=lW?t5>m*!$_gT2s ziTNO1Ip_Q+UB1j`>AE;?J1uCfJc^f@X!3IM~8;?<^ds%P=?C!WP?(EvlPtLlmv zP3k^pB=ojG>o%bY0z15*y}WwmCSD#hKFe3D9z1xR`XB=uyK_3X0#F}EnD~LJSV3yj zdD(kQ@lvIHvnwPDreg^Gtfp?%O*7vC18?|zNvMxeBT}{t$#8}-&PV%=x}gA4vzF!h z3SF{IFK98Ra;!(10HA8rj8PoM_x?rnU~*R>pEvH~c#NbA}|@ir1St*);(S5PCM z=m==52J@M!*9ro_ib}Gs*v-S-=wDb{HoOYx7;3H z^`LUUSyL&AM*FO5r$NZf$Bvmrlh4n@bTTEH&du0s-%;*J63Z}Tl4o6o$R#;Uu<5CxxQc-Hg)6SG z#aJ2{fcjW`@-|rX^F)h4>ou>Jnj;1W$gNC2SdmU3GaVq8Oo7*2+Md+RCC1y1;s{Fi zmjbIgputy+mT;Zk-0m0)CMyO_*RpT4eNrxIFRxr#C|ZiH<4s8oZ`lYlWuJT5?5I1w zo3yyES{`G1HAxFyHC(!90Rtq!;itYJ9pz+mIL>t7tEcA|O05p}I{@K!=Y?8-ht}?S zRUm3;MJ^jv>|$W)1FdI`HaY#Yi6w)u^omSqUicz*4m-v%9gBXb22e3w0OoARlC?aA zu5H3EIBRYAFvnWPSx38~{j47A_-`laT}SH2NqS4cXNDCtz=QL4m)}R)%d1x=x(Oa7 zeS|TdC7mAA2T2D9w>?U_`qbYe>%FYEa4CII3&KjBB z-y-bByzwmT^58#O*w=}7MSYgbFXS<&i?9x@k&T5sIW>phDnR$TkOiWe;G&wLhS$F3 ztkFj|fm{tSQA2FhI-{xQ8psg^5Km@TQ0p3kWMZ??ya2=4TGQ#uLDHkUdvW~bh}wKO(2X}|lK_VUV=cherslDbqwL*5sDep^lc_tj9Fkyn&PA|l&` z>LN8G$QLaEcfIn@$)vRDv+elEeZv<(a+@hFZ$Hb*XhTc1zph0yO;xgk(GLN;4gu6_ zcS=81U$lZ%tGn&qe6%S$FqLK_boIL4!ef$qQu-$VaWe309v9ei*}?Je=P!1A8Rfwz zexQ9;e?6tYp=ghg=08MRqFqazPokZdwQ&+{(B>aSJLYw?oyN+v6_q=c=_=dbi3Pv?6|i%Gv1X_nTKx6PV|KYjn*xBvdnzx$6Lf81&R^Ur_$(?4sd z(EBC~-De5CL7bjk%Tk5kPdJl4e;IGk%nhDfTnZ9l0M7+YP49(f+B9k2OE#$?22(P4 zicP)`NUe&QUJy$LgJrIHHnxky&}DRe`NZx*H6u?vy`dSwW&Dhz7MQ?$wMG;05q|@| zUaOSBKwJS{fDy82Cdx|1Qp_{$SSpo#s6geJPd#fPR91@0;N-+ofaX=`qSl(`nv9g} zT8VhiYa+Y7i)~_Py|-1d3_{99_sOvWX2<_OZyW;fzWG#_Bev|Hw}{=vk}`-QDy>lk zhd#8VB+aI(^61B*`>r(LCuS~N01gdiZb*GsQYo%wGz1AuCPnryh>&8P%^f|aLpjYHdsz=^6;}D~oyyL_ zv&{azG@$w5b7I^^OPb8nPh;25)G|Tvv9sS!eVW?{c88HgBUvJVFTk*v47={OJ*k$^ zps83ydbkEzZvwMtX*-{(`cmz4ah#W>kB+B7&H9$l8rsI(DUGt!PvTvPQMLWNl30 zk05I)D6lSBD{50j*3>f3Z>x#XWlb&8;%%koUa}S$tl=D|o@2PIWzZ@mYoU)NYoX}7 zPqG%%Y|pZmfzf@CHQMkVg>3;SK1f?^{Yl&c3Dhgv%PUu&#I5s|4~z|rEqwPjDnjtN zP5D2ZMf4BlT=ej45l5g!?AXWd{rdJFzs>@y2jfZuGJ5}~U;V$g$LzmydZzyPZ{Pm- z{r}Yj;uXxmPDA4ncbocnH=ttv-;MmR$If;l?Inth_UeLJ6vuP#&s<*g5d9?uBmsrw zvYG5g!#-LQ8*Qt&F5$vdr$-{m`k7#XA!T1*e5z!u2`e*d$YoI+k_>fS#+Qk@2FVSf zg%}9{N}nRvGsKpErYT;%U9=Z+!p1zqhCV{zGF*d(1PN zVf>L^#QWu;2+n_e_3H@wHmI&&{eNEp`)3BO8MC<0#+ER@3SUM0pY1#f)S0jG<~y!_ zGSSYr*&0fkE?FN z!Ic7GP_auyO&8EytLN%j1|vmPg;y^M2(`NE#)hHy8=Iif-YZ%gLc#;iqnf><2Lb^- zRie{Yk1-o@6d$)sz=yHEDE`8@Q;)EjvurjBpsJHLKG_b_vFeIuzOC`LnaGbw$@~36 z6kbKS{OHrH&}$*OiBV_|V)Tk2{nE7IStM${`0F=m#kXt5H*3c?Ysfcg$uFTP300+T zwoLzdHRY??G6G-t^{kIn-v#>E~bY*Oct#rJIpaFE3b{79FU1z^O1oUdj^Sp&@Ey8m2aXZ5k03 zbtn=Lr5TcN=%7Dsgnq%rYd+pMS;hq?U%TgaS4x+6y+;OKKivz>oF=b{vF!+{jE$UK zatjF}kqiBVsQXk@w=@6gSFioh&%Md1dYhCV<}V?0Z`N%esV_fL4}YwJ|HzZ$=^P5L zUi7y}`!>zmHhIqR%C>pmy|=r2fA#JUY`iaMzM4_>X_EeNrtB+bZF}#9E8GVN zebfXEA&aVAh-3=AvMZU=fP|BZZnJtNK}v4A7Ih*yNH5CR?T#{Amh+a!pCpG^3&df&{#tdB{RT_0d^8&0Ev;TH3z*_4{ z(yl>i0(u47@M^nMON}mpEk_S@_C9l5chejj6*n`fB|K-p!*l~LSG5<@6Q95PL!$ME z4=uaty;$F)_ue3$x4alZ!LUBKw!Sj5gQDCxd})R@9dW&0lGm6padjx92na-yVqmPR zJWB?`*QRnw8WIEBv(ixj8k!0onem|{Wu_}1OD)&~wXQ&1CjiZ&P$QWnQb4usRatMc zi)_!*l+0C-68)l)A%*#{jG;ARWHI-eRA>AbFc_l(*`r7puc{&SmC-?mm@q)y&8ezjD`xnQ^M(VaSV) z{Mw`P_`n5qx76&)7==1acGSczDzcix9BE~RfsvAPKgeVv8{LlBxQbJNS?H?R=roX% z#9BoFq*gWjf&<64z+CpJNncq>ECBh2qMljs{TyK!rP&3u0cLmg*>4fIKfHwlrYJ}I zfTDcMv+hreAAH&yx5Af9t%c8|em`wXJZy{frW@`BZUyY9NKJbx`6vTK6=&Hmu@(aL z0E8AGCRI*UFcpiu6)J9rpu_7Cr*F7F)M*2z>lDUkyXh0n#L?r*L>EQ|ERHh042)uG z0D~exStJwu6@jtDc{gwER#+D(0dM$nwcawrn1CHrX2yp?VK$wadz$dWsFtfQe#5T# zMM_`ozd-5BA0vGMNI1H?C^0X~8W%JmtxpuP6S)yBjFCN?pMWiu@R=jl<88LJrpotiSlv}A{VR258C>l_o%Ou)Ll z*b<|DnlGrzu0DPAo8<5R_kaK4GamPOe4*q1Gv=nom&z0T#9Y;TA^`0pHbs%=vMP_! zmURWb0^@K*EzIhW8jL|&d4duO&JGV!26&i4--=y3A@YXN-L+&+yPT}#d?#I*w zEDxFvbRe{;vI0L42prmW25P!Rx{uhA84v>kKC{-f_Zql>E4niZFdDt9#dvdSG01{AcMuEp`BBG_fUHoy-EHC1Gq)2<^&YUpS@wc z`s9z7zWDbeea3^one=sfWT<=xaNE4Rxny8yP&Fa}aF4q%YF1S_Gr2rcuUpry;#0^`<9M*6jnU&{hQ;A{UKV`ci5%r$H(@m(YIp zJP8$$2iXfRbc@=vCD342^T0Z&NaJU^DcpMX(H}2=>F-GUz15z7ll;BGTztbNZeDCzq=Hq;i-YTS`~K?v8~T^Kk++(r_p$P$H}1!8*pJ?*AH6|8YGeNWmFazYjUyI19mPeR zT<_h8e-9fX{bNJ?V?(@mLo{L!NrQMyUS8i1ubdpOkze0Czs!BJ?U~o)^P~35$L*Dm z+9w~iN8Y?Y{+=2)KDBv+%2etC$Pty&t~bSnU~jVNEn%^b$WpOb$d5Y;z`{2R8< zTlV4`Hue@FIlsa$r%_~+$5#3C}O0XH3amW3+vNTmvK428%6Mi@QU6S@X@ zqU3clnF+*mbX6B7if8T@-p4q67(^yf6{E7q8?Z+NuRlM)*Q6Hu0qfzfC_s`tLOI<# znNQdr@4f?)jAO!MVwz^B{yk9%pBxW|LbE`v+j%d1!Fqa|9kXGh1QVQFXSyZ2Ea*w1haZwk>E3ugMZ z)z5!H>Ys!rg2~>%>ibX2Iv9n z{LSe~27b(1P5@4Ks@`+XRo+?)c}r+u2n^987@6ytMO+VHxs3%^7>@ZTOjTvN_gDL# z5@cTy3aGxQY6vY;^K#UP0jULZ#C7^0rFQDlppXnG5#_xbt}M zbVpcn>Us5dY_n(TUHNSsJxep0+x5%?--$sW!_nFn=y&%jX9k$urUSu3V-TC$FplEB`2cB%J%+dR~djrfNiU5r~Q5a zTaqH`Na@4=t}3`rHJsn|PUZe$pS}jcg*sh1B|D;47 zJmo}Foz7gvd(Bb31yop7)6A%e*#y-#fB>*SPrnyL82fZZskTuwJaNuTW0ho1V*H^&8j{*kq@Mo>+9|& zeKAg@>{6!EQx&P3jqO!a+d?q+`S#te zEW_*6!H)O6m5YQPpUp?FZ>wlj2F-Z?WfNusb7s z>Xgc7k!sB9j}_~pexkR?wV6@Qgx>Aa56iWk?=3ycbye;8S%%F=sF$>N@1s6QR&qQUs!R9m7FHBaT3vE?Z3sZNc6t{5ts*u--c@A2nW zWb3F5JG!qXijio9!7d~{j#Zvc?|k1oG@9#Y)1B}Nk*DcH?u42nou|^C?8z8 zX5ug)7dRHajv>DaAH?F*F8I8-#$woN>N18RC&oP!k_h(y8;yi-TfN$O1Zifw#g1u( zqs+RTsr&bu`xAZab;y{K;HM?2DQ+I-<4ZRO?Aa`gap~tc#HeV<)I0Kv_SI2yhvJ%W5R0!Fok+8TjvknK zn{Zqsh2{2Tx;t0d_+%kX+k31nnFh)0?w+T=VeM_^)@Y!HA*tYwPFNQ ziYEXF+&1vZgYf)^OBgDw>$*<2UiIA!iUl9R-zU)-jtqN`6vLx|zB=yiDL9}vt%@#H1n0&Y zCt7GyF?k$>@4T;E9^Kj@F&Fn7ZL1SkHXhrX1wZ9%8%m#m?%tXoy5tm+wkCrT$8ayY zYOr8trCX=T05f2=d8G$W&5^I3ZWqBVL=6Ne^SJ>HDP!3aAeKN4jH@E-X|y!J8ENGf zF|Op&>A|aoy&Deyl@Q+735?s=`m$O|ZF!p-4b41A^b0j6f}wb)jbQ>beJYq4$quxC zK~-klfmjlQMG(7${%BC9ZN|ps+EJpxnCY>3-ycdDUKaspa z#5BB#jR_v5(gYj`GYFq4^HnL+G;%?ExxUi;f3pK^qi0QFW_$y^GE9z1M(dg+>Mez) z)H^-C`a(Qd0f*SC4DP1MCD-&MKVkHrarjZ{&p|7V4mF--DgNoRc8E+Dq8m_$EuB`x z&dgzkg1tX!m!SwEra&|_np8D&8Y09Ii(qA73C0^U9BA13M^ zJNLfROk(8zY#VY84J|tDTzj$Qglt=U8hhu1CTO9`v)FmgeCoIWyKS>K_5_YV15)E8 zMKyzdaF(}b?wx*`wW=JQIZ+=I`0bMfo7>s1NY3rdNJHZ*hExpw^}y)|228y{21odZ z4E{p~KP-dqr=G>-?cVKo4^=FGa6kJ!e+;YMcL4!7zu8ts3Q zQM3IC8(h$q;108#{0J>I9{^Fw4r4z~Oq_$`P%$yGOK^)FHq}MX3>_ETGKWX#5!}&} z3vS3AXyic_%oA;ovM^dL&$3|V@S`jk-}8ek)Yjt@ z*UeAK&x7@1THgLy7Rm@uve5C*&ayCadJ+Zmz3^Vnq7XWff|Dq;+1hv(g*d!A;4M^f zO|>=XE!%wM*-U((%JA&8O3UyxUG9@3&50fHY@%LJW%A~hmdR_jdfIB`PR22l!J;(b z-HgWECZn{Q+Zg7NXwKO%zcS(V4gGBD7x0;8e{u>IH7N|sv5A{u&T~4s8BesgsOnQ} z{-*>Y$Fr-3?-=km;S_~7WAX2i3jb^^;Y#W_D%Ih12H^@A6_$q&F_6Z~nOZSGc7O>s z*0cUu=0@{Kd#!RCsLC+GA1l&M|9aA|5R3Bcg*gl6)#gM5sB`oSLb_zGOXM!SAk8e8 zY3kixo4TgVR*JU3-41mVTnD5oT7KK^cG#v#BCW?GC=zPM!oYc+QWyGs`&qG`iJk5v z)|eTBSiu!uUHh;;m*}2j@2R@)R{+0uHqR=-d7^z8);~Krq>)qAMxidWIDYsARp2Wz zW9=|oISPste7RX!SCS*6dakz;tfCPYs?UPlc%PVjle~ze7jQgy;8fk=nimLahf%?M zQa+j@pkfa*T2axOqm!EJD5p4rQdJl4i!nF(d&d@?_qE0**4v?hEfAYPK#cQ=V!B7( zksE4Law9X0L!qHOl>P7(A<8LqJr8T39SD~=Mg%t^MKY*c;6 zw&~+o%G%#{2zyd**jg5;b|RcnjBkuXhVLek-I0sY7rjLB z-OM|}NpVv9I;QN%rR~9JQE8+g&KGR@oul_?qI zy2`;-(s5QSi-0{J@=Cni8C}txSF|@V|93Hd8uQx~^P@)A!)6WNUCe)^3VEpK&^P6* z;qI|?H`}K%V=m@*!WyEQ=D;Mo?|CLc)v7{wdv@%rHs$7?nb2hkbpq9O|0Ig7(oW001wf#t;jqLtS_6!m|P;_bA5oo8z^gPVX@`m|# zBIQ$vzLCVN%XG7!u0_nZMLBeaX`vW>1F2{6vlH0B#%xTxmk2~*89?a*i;(Y=2TU-W1 zKCQYC^4zZ7ZC9@n*Jc6|rQS1Bn8o`dIAlfBN?jww$wpIaf+J@tKnYTC*of}sK=F<$ zZ0sI0Mi|V<2n#a@`(nQ77pla8pPh6=$QQ6j8lzif#7tZ^x*3Gxy(1sK?8e`T`F^u9 zyR9wBd7!flK!ZueDpVkD4`^Njug}y^+uXk26-jqS`$O}Ee@x*y*8bf&gITq?JJA|1ee6sj zLai&Iv&VO^Lwog_2kb&W=FNpGLHqL_+cV~y#p*sjr6*Cmk0pD#KqP>mpsM3HcK846 zXR>F32>3>4U&z&&pQxZcm{0mg%m;zGZrVbPP?eg73)&l*KR=E6?TY!iDc3IvcNofN zBCM|*rkfMC`)`!RG_Sj_@|BvinWFyk!1_hYAYAt4ngNV@obo+;G-lxXPj8g4r$)UE z4GQk#<70Zv!A{&2%3+uk^WpH}Kv2zlXpefQELn=g4b}8Tt;|UE*!C@9pA+Dpft!&A z75Uh?N7k>n_BV4Bxv6#rr7{i+Z+iF_&L@@W+^+O_W(sXQ)854Se<}6TI6tm9&z2cl z*4S(f7waFX@ILp9)n~jnlfHWZJ}}5n95s45wtWQ**Mn|R@vysVmta*`)i%c2?x(l8 zjrnL6u}!Lq4nVR?^)g?opZrV@Lt*uMfG6T(ta3j51jcdW#-ZJdhxP!YH=2o9tkeDc zK>ttzl)h#kOcT8v3*H-l%!!*W4rcF9@jj1UR}iqpHXWP8{z+%QFbQmW9S(Os+aVD0 z7440@|Fn}nUKn^m9+?)EthVp^CnB7u@~>|@e0Sdq*179V4I$}r{|}pe-}Mka&ytYDnRJ)oJ zM}w#m5fSfF(}D)_w~8@ovF}NaolpBqv%x?x>kGRG@)_vBE)-I$fqe*p@YMS&SlqN?34r^ZoI|rM-6$rHtWfsq|u{?;Su>3$nB|P zwE#H{O ze0R1-L9}cEyUimv#y8Ct+L&yNH%-`O&zZt)e$LO*%RC=6B=K5Eb*o|`s#~QlDCX3z zBS~bgoBQo%z~r{r-c1bMbMH~rTuFoBD374~0F158!?#^;`?z?wKR!NLL*u*MZ8r|l zGDd{)U6W?BTm1IyFvWOKmyR8u>fz5{GJcfVuV`;%{O>=F@#Bi|=8?s+na(elR1MT< zHMxaub}V)`1NWxK)rq*peC&DqB58KEV`%NndWN8NACsFJ`;*v6EQ|hn z3#m!t2F*Ksxuh1Mc9j-)-;78tX0UJXV?xTUW>e8t%EH8W(~xe+N3)cMV~EX~ydsgX z_gr=OQ3DvaV#uui0vQBH3F*DXF>BuE@U3@)8-n$rDi)Ne6(SLlro4Y5@?>|J{?m^6^lakMifN+f0r03^pqEQ3tPl1{o@ALEk-(#$#kMZ7YvF2&Fv~a4ZPg^C$3H84D`GFZgu^*f_BSAhry|gk9 zlZt4GvCX2V^v%zw{;K6wR)VLWndJrNV<7LZLm-mdYuNERy6!#zlj|sJUW{KsUAzgQ zO6eFA^1&3|LvB~Jw{d=a+Bu)f73VwNhAc?p)iUEADzSRaOoi@1mO76cn(On6I)Ll{9t-cv(sr>FbqliP~HpLpM-DQ~es z7(LhpSF|@Vf6Vx4%x_oBubOIqXUfYZ73OzyV!bq~4fpHpi)D%fHI~-+GPZiJo<%jm z3Fl3ZjTD!{=e>(>Z!?$b(Rih{Np`rMaB1$*J;1Jf(j*mtq&#un6m?R_9e#Lc-sf+}(_*TQMJuPwFX@_h&rz!dTlO?QrPLc2h7X zs-n|*Ts2o`3Wuazklx7kPmABCam96WkMnrw9eAd~b%ud^!AuR>c4XyJoxZu#h{sG$ zYEH_2^Uc7!Cj*S@qc&Z3Y;EWIP}?Y*+k9_%f48_EO|E4g9=@4bO@4cBOW9DZV@_m} z>pqKs8i*v$CK~WQQ|&Y z!m*q8?r@;Vb8fW54`t^PZ8SI$WaG`EB$k7pUwiNpoMwl2U1j^h1S^aA=A*5=u2*rY zyKJgD;GW+v)b*`0!h0SM=FhtFeVzyk0y-J-g7h}l|L)V`xB0@vqmjT3@r`*GRJzKh zosF*VgE#VRtk>b^5%2;adCzqZ#BHo6v)_k{qh+G(6N?|q@rMn%=le>aPOR(2u~1dzo00GJ7^pC*(;tPkz54+F>y_;vJG1R)BL zHXJjpo}41Yom&?NtOv8=*!P}+7wdzjv)+?FAR*YI#4Fkxng3~reQsCGS38#2Z1#)? zqA#eLq8g|zCt5qq+D>A=snC|s!5}={HWmK8Dfqk2$0blK$ar4^_#5{f?!2dz>QpS-4i@<3Ujtnz?rI_196Zng!d*ny`IZ@5-H1k1pVCPCtGOJmak}U;{A8u zeOkIUk1O8Scr(W3ZNFSnHJUWlKKE1{^%&I)_Zod+?j7Uo0tzACCtRr0#uwIb^aH;s zy#`uI90%*o52N%hD5KKi9^(l}P?_oE?V0~xT0W4g?Oid!COvXWwv%G4WqMXVgW=$IT+)n-;rL=hKFI#KQy@3u_KY23@jhf)e?5@5s zKc&^WNYr@_LOM)uu4?qX)o{an`p-`FJw@f??v>u^xCk1UG1ngWj3-jAXm8{F??3Ip zFYPT|ukS8fbYC7jII~jO=ceB%^v@5q2k(8v&+W#~jmfV!F<j?P?4eC+*f zM<>^*OH>`@syGY1?1&}jwo?<*8@%9SgX+1FwW*@yg7$LV9D8n}r2zAi_U?hIXyzjz zKp&1U_kbS}Li_0mc=pU{&q^QO5Ht`xBSc2dH}){)KVg9mqVK5H(#(Wp+iiNbX;wkq zb=h!aDcSetF5JQy>UafB=7FR`UB^db5ALxK)=CDF{o97h%A`nuMHaTc`!fWK-gwXuB~>xQsF z`H|TZUy2{``7?w9N91qFk%%{}ul?bUFyvb|C?(hO%<~#Cy z&v(#AU`qF}w$0ck*8?J;DYCTf4@C!bL>85}wwCT~ykF=;`m1tU6f-;pn78ATaJ-9v_^v&L~=JyKOZY#YUAM#!^0(J0C}f|WNa zmJ0cEKLN*Bm1tl9x~ZE7&ald5`mLMgPPM()+-;5-;7JA{Q*Pq{a^P!{Xy!t$0C{sr zbYWTW%d1b7k@3RlAqL>5XVyShvb^DFq03~J@Vf{F*%>fA#R^X+?Iv>3iUw-z6_3W zz8GT?y%1JQW zh*R^_@Ki=SemRY)0-vg)(YW6XG(j%e;YE7|AT+5FIeA~?{T=1;3ds;jG50v@${7V& zzTLe`DYk=oSfU!Y)LI(t`&0KTlX-ek;G}jur}XgKu$Ur_q?Y&+;{HTrJXFES+-a2~ zeibvS@UGW=P#JCN!$Da|B;;N$X)mu_nN|Jg=)FO6f1cU;IZ@>E#qf|%7cX0s_9R|8 zru-;ge&I>Hk|~<`BwyKEh0pTkcc0~}C1T%?@?~D$c$6<+=d*mRyC39B>ggrKmK1U9tR|T^~^~9Yg46Ep?-An)wb$8&x^u zwWc6R#IH_=d!p+)jB!5PZ&b$JXzd`h6A z)2|I_f?uJ=C<@`2vuWI6N4~u_L5mIxh$C;sInWJBp6F@=V>P*`}Pg+#-)=3JUZlh5Ce=|mOR`TK9w{h1_u z`+`kgwA*!$`;KnR^tA7sy0f0Y?P}M!(=yZk<`?mQ^Tm9h+bW=|;wX1032g$+HB5Dt zBBRubK>2O^N6%<<(y2mQPj#dtQfa$XW@RQ5I_8NM8F{Le?P~0pqE!=_qnfhP1-5X< zQ(ASGwFt6;cF<8AL@5(#-Ud&+-2GEtywpA%D{JJj@Z?S39B#=2?d6p#t7nWwqaMgx zHioGchn{bBjN`L=t$9rZG;hKyNle@6?hMkZ2Cl0HNzlO`2LU zoeGMNisDKCWZIkr}+RH0fnyj0!_eWXJMtzp`Qeu9T^$e2LgRBp_R-a_O zfY>Klw+FS?W!;S6@+|AA#`Y-do!-I+Sr2Wk?n&0O4>j3k-M)CO?dvI%*9@@aB6Cj0n}TE=NRz>ndTZ%qAYn?Syt^fb*g zL-i6M9uiB{&~FBWczs>3d2BS#!kcXn>V74qlQSn@u#w%EQt60mY2c@iB)prQdTsL( zcAIs-`I+|e>Xr7b)nO9l5qm$5v28&oGKlnO`&^4Lw1c!kH23;`o!Us-F~g*{RdIxh zC_cg@Fg?b#g1Hw>Qrlvm-hEb+#yuJ>(f)drDUK#-0)a$W%Ve(2VlFp$O{{y7$UMk3Ju{Dj-CL=jSFrP_`B|`qxAq{|C4?uzUK#$T1l%o35H!>d z5hxnZN7y&ylsDi1iuUe3)JKv0GHSm(_i$F6v0haf4Z^_S4I$D~UL2D2t+h#?nvO3Q zjfQG_$tWvLG6LS&hZkgXqQ*v5eMuL1hMH@9ki(6}c%I;bd?#wCu7>;E9;m8>pjzKOp^KojjTy*t4 z{NloZe^}=j^5Z(IUhlllr;4BZLN`^wo)+4U7IHnOg?8HGLObKL15dzItv2HuITG`(tim*2^;YB)()7+aMnO9Nx$y!m;=}#+d|u~a8|TL{;dh6%-96fR#nKa0Y_cbOjS7z&FXeMj6PyxLx6atR?C(( zFf)n9$j>BcgtfKzB@Id=*chkna;MRI%|V`F!~M!mC=lFK%AIWmsJ{UI zwGD4uw7>GvHjNTSz_OqQP-Y-f(AdK~eNv~Z*;*&EZT8BgC#l_O@)w44N+6pMKk}~TMcDs>0@qSF`C{; z4JNeOK#!$(&SX0Hb!uGG%~(53xdeLv^do(V`4U17Hs0kVX%cE`S{-c3tKT{Gb5ny0 zUGkZzvnGLdHMb5qtLa4Z-Y1`*qgj-^cLj9SUdTSWXv*l+mG+(-n?zb&;44VYz@)qr z)sz;g3H4IW-b6LIRFecsZ^r&wIokgywl`i?$ZtI#+q2fyIncfSJ5LY9K&?$Jfl!HD zR2suv^;MM-aKuw6Zb~kRM*cOEm*`zG&EVOzJrS9vHMnfoE#au4=dErUQO((#C>Y&orabd6rV98A z?cS>$0a*?HK0-nRdU0ws&ft~^`d6wEN5&%HPF#I^fBFbozF$2tQABQKHD@swZly)%m`E#@;SfVgwaRg zWzqNp{dB`~60hQ+uhDlVw9!kzv%u9U>hyuSMG4EQ!AVB76>W8+`kcnBM@G5hWcR?G z2*AZ?H1$x*jRUZi70Phhi%bZxU+YG#S;MNMXD1cH-)R``iuGQj_jZO%(6eerh}su7wFRzJA*WTrN16S# z&b0rLjSs*3RHge|W`PA#Yj(rJJ~rPhknFQ>rXwJ`1=98Um>`*qCKgB$L=z@RNj^;k z6GUM=nIP3srWrBZWggP+lo4}mkRegM(UuVs^+IfoDYOubkg9AZMo0^DnIUGvlnuGv z&5#JVkEkU8?8URQ# zLdt3&I8nj;Usj0OM9J|dqnjXE3Ir3R1UD-&K~e~Aw%c-2U55=4Ls>S+RH+I!NC+~| z5_fy^0XB%)u~SA!5{4Z%i0z$agH*K<-}O2+NLj6e3O!U|;BuxSL0;9KGgXob? zw9eockJ2gN5~tr?K^t=;#MaZVG%3*ODjdS(j#C1WP{%99@v4ui7;rR;5frgAvn@*r zL`a>@=D%>%+}>w-M8QoR)61dC0x%6JlZaElhvX(juFIsLR-qgw#ck7N2JgB}0f2-y zXR}kQxlNH<^{t)kv?zy7k%{7>7G?mt2Ajf++UO?54Ekv>_5@x6{u*DsY>L9HacQ}P zc_Ev^to^Vs>X<4e^MM3;I(yt06-lC82qoK}-KY?+u?h;6JhCZ>uE{E(A@62WmsNVoT9GTGj5cG zvd(twiWF8Qn4QYlKG+p>ugHc-fiM7eMQF@BkX>=y%mAFC;=>5wD(&;Y;Fuj+Wmd$J z7tkXP({!_9uK6xZFREji6{b1P@;e&fr=)W4>uIO38;HKg3 zLeR|ADrFfEeQIP5284NfZa_R!OT#=X(E-`)-qmga=C*HP(Bqc%k@UmN1SfFdeluuw z@|$B(`tX9boarGK6x5g=)8~!oT_AXz-S_?Qyu0uB!}I38-_FjP_nzGuJv;9uQEhkf z-fK|j(C)oE>B)N^IoC(;y(k~c!C6yY2WRpqk^J`*mRD~Ur#$8$)L1__&8&-laE=~5 zBm?Nk?c|(gI^WE5(^*FnRzB7F=%nz;k4|5$6V1E_IZA{YqGNV5H7NPfX(GFh&NTeE z=jbfL`RC{~bKc_yBWuzJN9WK$7!@Dnx{yJW@37r_Pf-Pw>SmRd&B`GsgOKY%bcDJ2r!QG2U=&=D6yW{|=7Lrp@*@JvLtf)+60FX@yJEf6 zeqTPVAhSH|(xYCOp@t8H34zp|uoEeX~DzgVlt=ga%XVj7!=Z@#S$jmeIER4;LO0iof5&o7&}0>kt(lV0cMU0fDj)QCTL!v#lJ_8I#VH934gD5RDd^ z&JutnftQynkURyl*IPA#oGvUncX#x}5EZNCRMbRBxRt$Ht7; zdu{Q@!R}H81`WD*D@!m43uIks4!SC2m^KnAu!3fvbBMTYh3NWxU_I~Z1HYZ`l$Hzh(#-f>jfyZ;u`@Gd)1S1>k=(1>B&>^mZO~1jUOJ z8*RtUB}@10=0l_GI4(5pN|D>Zc8$A!C+hW_Hon= z5;SlKBEET*7Z5>lezfn!OFLx@(iSp;g*$)6_K>vU^{74ZfY zSNTW2zJ=^MP1FBGtL7m#vAP2h>|m2^^;{!Tb5w^PWh#Q#j4(*VgY9;utUm_Ut}J!P z%g#$QTKBnmQ3{xOti1txr!Fb1#1L1KIwTkGp_fp^n|?}-7&R-g+{)*USUatZW0hW3 z4zLvw3<}FJ#t5PPN~~L;VXGwDO65of%R_EiT?cjD zO`zNJ&t?d8{fe0g<>nl1Nj;M1=rc!6sz7~Oq(;!w_@VvFaxI_a3IEqH5yszxS zDyidlJ4s>Pt*9f;pHKm5i|fp*m6vCnZ^tjYHwhq(z<{SF)0GtmvF$YWC_RE*`$|nP zR>s|3#t;l~8ABtiCpuIbxfA2(D%qvWBCm{!Ss!(7RA|Mv`&1;KBg0T@iExn^HyHXnzkgowEL+pJUC2%V1t#e^Z7mb(n^Oq<(x&e}z zOa0-!fks-v03SU9$?WjyXnORsjQuhh)ec|1W#SI1UeR`vU)d71640`};e5K=)N}Ee zgYET^w{JeZjcJLo0vHQGcaT6-WSPi>?I`z$@st(^`s`kKQz#%2&5i@_Zbj31jGcf5 z_{00#R83vRedVK>%Iq%f2=Q34z6!9ILoAfp(Ns?5*&@&e%C0-HpEQrxIXyEY2RZ$i zDx?d0RjthJLe&A~Abakp)OtAy6cs)KS-&SfYu1ZB(o7GII{>ucGcS zvzw_kDy|4^;!$n3$BpKut1VV>W1bxC&{_xEZ0=f^WrM)qW(DjehdZY-5nG)t#5BDU zj6pjBhswjHT$fAict`GqLgTHJLDQ^R6ON}8|i z1~xU^P3vP8d70e7m+u^#-pb|;T;VVkrL19UNP_AK%VtKKJ`py1%cDos6lh2^+YBuBh$j zFrPZ-Tu*y}znC9e_c?MVFZEz_^C*W0bbuQK$=$58@e z?TjuS38E!LLF(!!hHe`4h(DK9)p9??!Ok!hk6fQa&-%p6?SkiA#e$Jk#+ z|LGk41e%IaN53#;p#kD*HE%1*gkF-@L}?b(W;Cs0m9Bs*AlGICXXmS(=fjn0(>(3% zZW40qql*tE5z!uk6-U#Gk^E;&{o_Ibi4s;zKx+$TW-3|6c~8zNDVj)AfAiWY5)mjg zdg$$Zt)8?QwcYBkt7CK17D-fA6=>DVsl12Jn*z&1_k6ujwhkKB&*;HOGj+(M(bb<+5$vOYUiU+*Rp30#F-oqv_6 zv@Wt!do?Xkrgika<)Bdkx6UX&#dyBBYQo=EDPB>*5LSg9Q^!Y}?LE_WL~>M$S&%tymiX4Ff#0>@BcaYA4-}oNh%>a< zJt1^oGqTrZ?cqa(>y1oNr)@BVIBWmeHfIAG$7p)k*?_X<;d{;u?->1kg2tb2(ue=% zg(Jsxt3Jh4QSuWqOZ^PN%`B0ORc%c7%V^oDW!-C@Sm~RG1#OT$5RE>2r}e1hCGEwJ`2mUz0To8s7JcYL*-%%uDcKFt)nm~B)m+sRZ_)L%y?Ab44=Wx-6fqOS|^gZ z2CzCR?7VshNpKy%+~?sYnfeG(A2`BX#h^g>L=}P)Dat29TIJ!@dl?x~6A(xMrD`j6 z@2tMn4c=bIE5=JzkLvc4I}JUXAMQ2<>}6j<_3GKfb7oYryMzVVSJAgAP*q0VuS3%^ zj_l=uY9fU;ymwn225F6MhWj=`8vUzDy0`=!y`riH8%H$k_-PWx!rZupB)tL)kZo5! zZ8DXQPb2}cW|YM&!6nc!M%hB2zTz{7RrfywM~x7{e1M)RYOCJg`Spsp;_6CtkNxHV04s?O`^q05W~cN>0Iw;(B-o2%*L=n_PK zrs*C)GR3v}{7gE3*7C;kT>r}?8X!(it`n7qE8}@MKNP-Aa}MUdW$!p3Sh^v($&ghS zP|6m2g*Lsk{%#ZJcmVkxkykI9^Ww%^3$ZHcN?50<|B5kC(Dm_r?q*`SeHE(8lCN37 zpJ};W=9YBPTANGL(CtuHNoR^9?PrZ9ch8XbGl?-h97-GQ;pVkq6v@YNUPN9yhIMlW zTVuU;8l#?nMm$0VA#=ys8^inR%DGFKPWR<@ z`;~}jTUiZauCF5;{iJ@haxq#~J*Q|Qp(L1Du|jqWwt&$4$iYKPfdSwG<)y5+4qiTd1dzv9nmiFjcoa$SfvKd!96TmA?G*d5B!XQ;qSo%hbp~oXJ zMwe(7mB3#2WLeL_c|Vv_B>|IBAWm*lYYI5wr3A}|J>|Xg2gavx1twN(I-~V*wDi35s1kDkAroD~|J!fkltAZ{D z94C_B&3AV)C2>UVK~GwHzAEv$sUW(kJll24e~>PXDIWp!)|o>N6b(I6E%?&<%DiSTWe{}@DkA+B)#Czwb*ls35< zQp~HgfKuup92Z2Y&Q(i0yvTLil25eHyDgpz9Z?}oNPo8turl+b5U#s#0dnCEg?1NB zWX9p~ZZsE=)|A`ZuDq2;aO(A_BAkKU6P#w=qNhj3l;L+e3{kSu&>M+{HATH{w57F^ zB3Ij$H`ugEaILL#pnIjz#Lusu_(U-5*mCI8kOT=71RTlk10`G)y~K3rl^dcl$aSoU z$%=%K|1hf{%ZmylFL@=@(@r$1uEsdx7LU}bff4HQnX1btJ{D#0CKpdI;M^rtegvI= zJ9+WyOsilcp5CV?6`6DL&s6%uo6DE29?b%SxciP~Hob=~i@KWevSL|p&I+o_dMYJx z#<{}+@vc$UJgWoec7nNKQENK**oAzL7BH951qkp-HtOj0IO%-E_@r61l{*cAnq{ud zCjcO?!0HN5up#3@6GMlY-|QNhc`RO4P@Cjrs7on(?NM>hi{dH5$V+`L^a5$fG(5AP zd?@MtBzdNN*6my`vXy25&x#bWnqxIw<7Ma4(?*3ht0PWM%15(jMU2N-Eh_sAy`1q` zhN^zMTWe9wURPWk<;?5vXNo!?eO!dt$V-P8xe-oL9mmUEoZ&lZIeS%F6oPXda^Jc6jyE zm8vBY?KlLkXfLl^Ne+0jj@#GVFb__j&B>@)TicanF*LkaazBEj67_c2iJhS;M@Y>P z7tnVamB>PxWq?N@RZ6qhwzvn$qj@o@Yw~_!5PF_0{X31#Do_uEf)4SeNT}F!D$NLv zdN75zz#-WWL&mo;4T)@6|Rq!$yzAR3)=H95= zQr&i%BB?=nfuY)MhfE?aoCG#_-+w1s;y4gD&7SIMqq&5bo{sf&C3yg->aafx=L-=*3I4H8^GNU73d;}Q4m*&Ox7sAQM-ck z&!m^@>x3v7mb7*%KB1NFemujcx@U1Ns65biRM|(27>3hA91m7Dn&c{5F4E~(H=G-M4N-%O+Us!qQ7 zfG(>k2yO0W0z(7IF5m1GfiXs9rZ)q4|2}{N=5#nlX2^`qvJtvXQCHe#d`qaS8Y*vI z<(XA2q$|?r6_*PT-Ej;*yIEW(j0i$o^fl^R!9(5*HuaY`xt#l_GFgJ+SD&h`Le72R z4sr#|x1VY66hfUg1@>slfD?#&biBG+99`-)BqDr?eha4Ol5pl z&ewEtdeT&$iGDC$tmKl9Bvw;_`i;8bwmi$_cc(nG6azD zzS%^02#MT>#{r;{ZSl#f#twmE;KL{m%0V%uEG}ryq~egQ_*_gek=C0rtx31$oz+!! zH7Wm{O^;pZ}nnA z!rwyJw3zP^HnY?E-;1y%S#Q5oVM8;&PJNJzPl1Sf`(T^;3@A?|()16J_uF9TcV2Tl zyT(N`=7SEacOErqLJ$u?tIRyt=iu;84O|bDcfH$-{!W*|@s8uTJ+^9qHp3tHSHOMA zEfa_hnHh%NpL;8`qTd)0hvV7zP9uVDg5pRlSHkW?P7 zr56ep`}EwXCY}<{?+{hX5aaoMIrlp_45x34Y8cDsWk{qQtHX2Omka}P0(|^#uMXw# zX4KS~6Wg^L*S6=H_l|$tKlaYgzjr=*NBv7EA2V<2 zV~~_;e%}PPDX5S*PfbU6DkvVseX%GoT7fOxXxjv~JCU}cCJ-PVNXd8BhAbhS=7Jrx zHNAkj6B|{t7^Fti5jIMwJ=( zNUM7f$(^bsDp0thfgkJ84`!>?H6WVMyrjFTI#IKE^XLvqgk!AU%loBjEKW&Nu&I2l zWwrY^O;2R#R82>E#(dZ{kugufPG}6WkJ=uBATO7+cN_4*o%(V~W&coByXIo1oc8vP zJ8c!B%&AF~_bZQF#Qlj^G}o6Q`0w1`=!$wzxLa)_chS%iQ6zMy{iHE>Z#&4_b3w*um12bJ zZ9?qmC;yP)&nv^^fxf6jv4yPB zz2R0hPZeYdK3%;IO*@U6hu3_IQLR2#KB*<2UY|g3S;glwlzIA^XWDBz=Xd#cOmh1; zCG(sQ|37f03zMp^Xz$)beO!$%v^Abnt#?$Ioncp0m4DQ+XwER{;n>$i>w{reRB3h~ zt~Q1()S{hRs@ZG=+wR=DBeCAObw|h9xphZ!y>sjGQ=Vy`cVCqM)0bJIenortHtHAL z6nTticHL$$n6GMQ=Pl-8hiIFx5Q9*yTU!q8y8oJbJmA$&{7Ibv_9+*!&(HtXA6|<^ z{1Sk~JzORwylFq1Wi!Jl{V;XaPJgFj>XybV&8z^=%#OU&Yzz6~v`q5zog2Vr&lFM9 z!cSoz0p%>BSz-q;*(4^EX;4jqP8dRg&Dm&-3Oib?4l6cOWN%wagDHNMTn_?g#uxn$SG^E!MP zi`4Yjv;VL_BR4)h(==imP-iU`gYCUPHD#;B`rd7ymWtx!J83Rm^|{ah=Y?b2;4eB=rPpz%=)ysU+{ zEc#~__h+Z2stn)OgurH_0onGWAeew%eT_;rcTci1?hiNum2 zPr1KvPK$Ri4w2+TaO(xNfLKzyzj)3CVA86Q$vloCL-1bT?ZovdKV#XJ84ka+1qKsn ze7Obgb;S1)&r9)TX4&<0F-Ml><%yX`<4mlcQK>2`HA6a+%+CU~uBxxE?v;bgoQ+1Q zGOb-%6|3HQ`b;dq4i>O|cwX*6k`w?83i197R?4Uj4_(#Xhr+^@N;1pAN$_Kl`~)>( zy1UV{w28yZB~^EqamE;UinTpez{dAEu1sBi2 zz?$ZFUr6 zmiSD(|8CUK5-fRgVtRB#bB9%eksHzU^`CAlxO;tT4dd^6qRLBP{$M?VXA^l7B82zX{X zv1GX}4Dt)=NyOXqSxRIlS?{3ta)^B-d?-wVglFGcCgGrrxP-S3LI={^NN7r$YrEb3 zNYyVV=|;u^_c$(P?A;ah%V_y$Qc~?}UQGVB-8Lb&JVvPq?NYPk7y- zpR@cfj*s2Y&p|6*aBBBGzV@O%ydbrHuTrm{@LuYdVdAp|#f+QgF7Xfui+sjgufuCp zhOA6Q=C%i15|8^oGYg-q&h9nyPcOZw=lAP?%DqCozW=?{FT%i_t{7-GN$`WUcBa<6 z+qw!~p$4hwc6|4G!Zr2wgwM^wa>c^W|JrX@j)VGTn0PUIk_bOji*XTRwu4abS3us) zuMzKGvfqDAJs$A6S@<09{25;Q!%MM#Z?%p!bx?L~cf!3=)SYt-u}yqEfAnD{<(#tiis<9ffF;c`ul zqy@8=df%ULO}#zgb2IUM=FIjg8+H4b&2YJ-!8EUL};&&!z{j!W7T5@$w4w`U&r)ei0_t_nI{4_d8DOYw8v@+n#Vu zJ)ZEnnfP9l=Kd06s!+Y4uo0)20%nzO~!-8*+3W+XFN5z9KJ|)H|5%ww^b9$aA4v_|0sfgWPJ`Uap9m2Fl3DeLcO#axaE^ zewSbJ3SUfQ23j^!cC@Vq)8mtE&plq+1$$RLj=_krzQK~71=ij>r!&iraoc`#AWO=4 z-CnX=!6hnldYjaJT4F}Ih7Z>p{nYGyV z-_{UZaN9Rj4&K&~>p-{(_xrD@A1>wo1?czj>?0+g z);>>mil({DQR>M~xuR;~#0Y8ZHI5r?7erVX9t@Q$DnLtS50UV{oveCKMh5@4uvEsy z#s(r_^!Bg~pQ(b^n&DhEigbmLAB3-w$r}BnE1rpW+`4T!=~FBt^z(jwdYjLx?w-36 z{+q7KN3GRQ)NFrv6&*}Zcuzk5e&dfneEX-r{L7zz_+P*M)&KhT#~=RqpZ`}>_kM}r z|2lmg?0>)B3AA{WwtyvS?DL;~b>`w9Y?t(3{l7Qj1Eb&aroY-Rmkf;1zMkr2GV|%{ zG16BcQ;Z(J>UJ0pVe2#Rc$DxJwmO)bfNBis4_o=K$q9Bl_CQ?azndn5_Y}Ui)5reZ zzOHqA1>%0KfxpT9Ycl0_etu2ctp45fH)cFk-k_wfnV;Ux%<`d-#vi|S7^SqY%q;x6 z3a7WX{52CHz^Z1zhAAoiuKkS(7h@dy9A7uyp8wV)i*AzG_?`9dVY;qK_8H>J>@4~m z`M0gi`kPtpxx*;Mo-)f+kyMGi`p;Jzx81csgumOkX8ioMGD)@b96ab_|t+ zlXP~BI=?c7yST*gD_exG@EB}yzM`3yf7{;-|5HI4R7g^FuOfV3)BQ+Aqw!CW=HNUc zA&jpA;f7H@{tLCClFXCi?Q9d|5x(}})3gYSVyX$29bfY5^7Z&LEMGUi3mZKb<9ttF zQ3Kqoy^d*zuErsvK#Z#;P!E4`aa;m&ExIN*-`D!LaE|q-WXopK(gw?z^zRofs3>Ly zHZMXmZQ<}V{`?||(*bM$UYOqcQ)Pn#_h--O+L{%OA`o8to34pG_C49Fxun+%?1GV8 z>9Yoss|yOQP#4Dn1v|Mrg&g;z1pP$*qys$P_*_SD8KFW>)lUD{gdcP9V2wP}6YPNj2j&(?wHDiZ_ z?}(qLy#Cqs1E2lp-~aL7?f=YB`Th4l z{@1^M|CitX>bt+#KY#s;|MQ*x$A5lj|NQDxmkjwT3lP%&RO^Do!?!4z(XnO~cx&qf zo3-4>hUl8C*%P`3Xhqf16Rgc%L^*w~lF{s;c0l!GJ{Dl?U+2#70rZN>^M#_w-Q0q$ znZGWp37assvxOp7;=ys{!-g9LXDD1=5SpqIUN-XQQZK@Ey_b7QQ% z-RPGwoz`en80vSchG~7B8Mnw_u&)~a;EcMHDT&NeYT%mjWA?Lw>RT0(H$ow5`~`?6 zCQ}bB36_@#8|97~>}&5!jEt}a;8R9JC~Pq_xZH#UzlCC4kp`~#;`X6OdrXtbo={^w+?P;GOH#x*jG*d zo0g*CE;Y51nv!W+GST|{O&5)y&IgrAL+eT~=Iuo1OA95}+^eEmBk>d;(AkNn@F^yL zk?9cF;C40?CbF1SUe^xojPT~qP+NsDX4$fF%rV3~B(GuTdyyR587GLQ&b+s*D+R)* zD+%n!XlF=40w<=28KoKeVY9$u24dWYCqeFQ9wj8V}QBpl)V>+mgj94se}3*?WT}lKSBEE zKRAIDbT!$Ua)`EZ38qGL2bo5xLIuyiV&a23dW#}j>*VmUz97SA9fCd|v@o+q{n2(s z7rMUvTk!_XJF^90P={UHn8VV1sq)uIlm;lWn1GgdNv97#kd!C0Yq};Egyl!_J8D_B zYw_KZ4h_HnQ*Uye_?;1tck^LZLH=s8BO9hA*-yamn?`2qf1TOcYjs{{$ zd9y7@0<0v6HBnw*s{-r!N+U`$&N%lZ-~RR|!T`RQw1;>(y(Xxbv8$nGAVveETzo1j zf12x;$L$SX{p@iH^!?v|cqO{^9Ao)4qg)35r~VXTPG8^taQ{n9WYc7APHfY9d$i?d zDE;~0zyH&3fA!-J|MC6R-+uomd)>&e!Em0pdtC6BAHV(KM=q(6frR-n00$~P0~PDn z(e`&A?ArhDt1P5WW~tu(^i{C`#jnt~W#Cfy_4yR(y#4GC|MlBn-EO_S;6Fcb!FTqA z7?>tH&yn8S1@?r<@C`GD=C7Wkjo|#hFCzC!c=)^Defw>kPvK!EC7P9R(Esg^fBOEr zZ~y(DfA=3h{M2Ma=4Y)j;W=NjR2J%!@gtc8cnlGMPv36cLzq+ESQKuKQJ)o zBy!V&WymR_yNpx{s{Krhjro2rJC!W>$QtAp=|tzqAqPwYjef*-9J9I_)8va|?DIm2 z_=KoY*sOP4dZRTIASCrkiezS^Pg~h;CdXK#gI4C8n5+T~a7M=*j+%@m8@t3~uDHD; zkm2^sn#zVn!E4)=nLeDhI0QT^7W0~D&MKGUA2_E^FAqF>I%iU2V953MBvk9>lTfYKISEzJ(Ar0# zGGaOll|XqOgerjt@g!6}r0y(KU1OlmLbXKlEL4L);Z3OCPkmtbYYMETpFx4mrb+jV z3bxbuc>P6fcxvzXt`GULZ3w`NFeSiDx9K8*S zWG4VDu@Ik*2wyLeb2vAHG-90SY)7Mp*n*sAe9XZ$_xGegzP3 z=CrHuVeVl)L8M7hm`0xdHd%vTQ7Ck!?le?SiTU>4H);u^Hhw=NJ6HjuK9J1CWtuA!H_h_QZkCjh z4|RQO!_Q!V)R{Fe6@l<-2knzo8k6uMYn^scWwLq8bL<;}j6lujO|ob_ zte8YcJ*tVIMa2Jp)J252sAp5Lya(=F_4v zAh(ox<|9jKKF=#WY+rsyd@^rm&-t0RlGQUG6|=jfJ@IxVrXQdAXx?bNq&@L=?b{P? z8&1jYe6Tzz9YC&TgXs_@r0uNu4>ZDm&SXCNiuoJgC7=E>@Ea?^@MpBNyF$ciBOqEH`sz zvAi>3I@WTsXKV#)9P=bF$A*0OAVz__$-4(BiZQfj*>b8Rru#5jvW#hs(O5L(+H9zK z$kw8gQ%uWFIqWkv&n`Q~=OXdpoxse4#Ro1*UV3BMs+~bsHTklIQsgp#f|O@lcOO)y zY`5BW>$d}QRFjLQNpl~frBaR+I*960D6eRp5&i~R=fg5sgC+p~JThpOa($M;ltX@$ z!Cua0@lA1j2^nl@^k*5&D~h&>p!U>*2ch3$;_ZWTug<7loD6>zw zuDAiUxi4cr`OWVIS)Vb!dAw7n@jst(6Nkp!X^h^jGp~Siuum_pI6_I~l$>CAa4q?g=C5g@KHYyc?=_S| zK|N3<1+DA;WcM?od=L91MP_bc&~q^86{#+N12y~)Y5#O-U+?oE?KkR4+SePMrM*rW zn!B*CoXJVp7mW%;X4MM$GWuman9|l_DEa8o~m=KhfxoHKM*AXwJk2z9G2sB z*tay?h45$#p9Slh`Y432>if?f-Y2D%J?}P1ja8ZF8x>~u+WUDBEUrLW(_!zIUJ-e! z>7G{tALC2KUO)OfhbBFI+;=`d^`KsV{S2R-n?zg^CxHqt>F9Z<;S+=Ty022nv}0Jl zJ3Zl=dOYDZ5uNFau~g$MnE(FpSqJs}0mJp(E7a>JyqEgQ_m`i6sdq>J$Ox(xxXkf7 zb$|E!6RxSp6JBL%`(jKzI-H+AYf&FQ!0nz_sMk+;FZGr0AD^A6Oir1^{7;(WMm_1H z&Oqt*pnC3?UJ>7`ckQVCV*LC9-}(I1_v&5K&p!h<1O0_(K|H#6U!(4t==Ok1;s=zj z$?+HC=SO~2jBUP3{g}mipVF=2^V>z&`U0%#PL}!=>i+K6I_vqluQGLfL8gBG&w9&p z9n^2O;id|E2YccgaMNS)$hCQ2eI6r=HEs1CU-uzd!~6$-Y|eS=si?ueOtD6;Lr=X^ z1rJ_z=`ld)q*FHP5l{a{Q-I808{^^HI~D)dJS48YO_9}mnRj-4!=mCz=eS;WRQJRS zKs;+qG1%mz?$py$2{LusJYO!U;0q9;-;#TGXb@hBNnQ0?0%Q32^7;>imngV2XXl|l zH~+@oI+Rzbd(!a!glp;ts&r-9OR%V~eE&xosNenGboIvpmgGozN~>=} zEV=3>T@zjJ8^$NPW=;Fn=9-G~G6j}?JfmqyU=i|J$^@uJ`%UgtRK8ph)mNG6FM(#e zD*MR7Iq9Q1-`vPnR1u4<>MCoEgkwh6S(e@Bixb<$Xr;$hZkm~(5T~e`ENcY&T8V??MJ2W6u@Q?FW$NDin_M-_x3Zjd zvAMQaZ0{OBe@SCwRJ~VM1!k%pF0Pk{pQxzxK(w|Q4_0XOR1|y@IQb1t4eIUw|HJMz3y*+Mc-yimuvFpKmGXYzx?s9-~V$= z|Nfu<&-+e^k6oe|QjLAgk3Tn%0KVOfr}KCI>-T^B!@sJ@tdtz)sUz&FKMo|#$ox7x zFig{#lK%DWPxrt3I{ecc)}0ozS<=CH3Bk#lbiaHWHR{V3wZUT>PiaJr4HbstQTKi8NM+$#VoAAayeh z7OmmQ^EM?9J+M%<5wzZk{a|0F6*B{$X=-+5V(^)kwrdEgeIDq2RX5vfPyI4jc7WeR zb*+Jx8wrllycHQ?mOy#}V4_d4&y2BVO3@h|7!a7a8T&qyc4x9N^(LYbRu#yQhFj*1 zCI}*cOw2;tubjV$!>Iagvxz7exDYb4GSy)A8LLFGYpQ7;q7kSk zm$b!5SuA7pB9-URjFOu3(H;SVri@Y->7tRf&W+yaNB{?e&IXA_3YrebWoE_}?GgO% zH#cbiBy%tXpxHwDJm%ns)XCqiRy1F@J^^`8%Ff2my-T&F!dy=7PTAC$q_T(U<<=l9 zCA-2^mdO~uO`A!NT}sfDFC8pHQ*67mT{QPe%_``#n$T?an4TCgTe}99RKK#&$x*2m z3B|XA`RxKE!cvOS6tP6#ylkh?-Xh7j*Q4o|A~XFgnu*dR-O9!QXC`vXZ2FC6kIS)% zmNa#eRWN&NCfz-<*NIYmVn;#Ja+M-Ti%xE)N|BJpQO7W)zcXvk72evxrZ{;_g->b4 z(W@3#lOchEP?MBKtP>P5N3}{V&g|eO#(P`gIYb0?Dho*}gI*{_X|~i5iSFgP(HwGW zn5r+QD*?NS$#rxXowlMU0XwV2XY7OWUS!hm{_Wep{6$+U+cx{*!iNQ^KhH||1U#%6 z9Y>Be4S|@GQEBrTj_FVRi_t*6E{rbbI-QQtk{u<-Bm%02hEeU5wng>3O)Jq`2Q8?2 zT#QxNhpD8cd5t?oN3jK`rl8IGgy?+ z`UETp+89yqJpg|=embN~ScIWFDQGDYQ7k=h0Lw<3gKD>uK5&nA+ul?3UU#K35UhU3xPY2DPQ?RNY&dT0_*oS@wKCQTTHHH}tdD4ubS{SXz(J z2i3mYRMhl;!rQ%^5eX=!!4EM(LPh9ZE}}x ze9chSd8VoBQ+@HFOum2A%40n0*UIgpfgmgz2M?Zoz-DOVqta{V^tu)QV@TNw zMhH$bqaL{$6C+cA120e!-YUwlR-rN_cSp9y3Bm5jn3jGXh;%hPEa_^xO*&MRnT1Zu zPUe)BJE5ycy0{>hO|uL?{3?d68SNr698nHiO;>6f!Bckfc2=a`kLX~uUq|8j#UTq8OFK5sH;Jvvw*9A(9)YNSRKRoEtg@J8Cwi{4y>adWtqx;YL^4@Lcq|{f6s*SQ2LB77~F1{J{!q7 zg_eT^PtHxSKm>vtmoye8T(FF#Np^JgLInHv_^=S_irC}$Ze@ED%22uxfC;H{-Bn4| tgWV0rgnX`tWn%*8sa+1pOH5cloe7siKj6>zZ@+#k{0FZ)A{p6t0|0V}6NCT& literal 0 HcmV?d00001 diff --git a/navit/xpm/country_EC_16_16.png b/navit/xpm/country_EC_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..e8730f1ae5fe75e64d736f645ce479f027054b12 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^@JzX3_ zG$tnhDGuyu6gl8BDQj0o!aQ< zKkI633Y@hHoFx+NJvjeVRDFN?zkdJH)(toMT@UXKPYPP!zxm()>bZ{7G~HnrUK_Nt#Zag!xGB_!H(J?Ly31zt4H^ zd(S;w(p^0YhgsaAcJCYX4GyGur0)4U`O#A1_Lc6>iu?9`ckYh&V77+=Q3>o0Ean6b zyyBMnaUCK7ynG|H+NhHe%qH8O?)YNK*e$o`I^9x|z0PDuqOubg_d;1zf`)VI(+1Q7 z=kd}j4GL8EK5x=}_cVq@&7hXASE0UH8pxi#UicL>e>}M$>?+=o7npD#4hy9fg-`WmFjNA94 zj=(X(5NHbJBq5G$M>&T{c?xUZ*isg5kTFhrDh2@nHygt~i7o3|MD?S}9 z{IGH^m&a698F#h=@H!e9RfyS^hlHDE-MTU&V-aU7M76rQpXrVG2sM&%FTI0CMt_GC z5mp9?6MX8IEo=e50!@_zQeym>J9|{HUj#r!!=k@KNnSRA8RM8YPkW}qbRP>=RW9R; zi!w;@GBOrjDBx3Z0;&|FINI-DNFEPqCh2y2TqaHge2Civ0D$oF2WZXT&wO%sHvxcy zY1Z=OgPHI;*(t9)_N$)yMuUr9zJe%(Rs#SGHQ=E&y=s;>wlNW3$_bpaZFFcZYDgL~ zbsr;x1i`?*THG1ciB-I0rO8%La*E?iZq$*w^k z^^=N#jzwRJJb<&|vN}1D7R|dx^jD3a=;#}yHxpe~y2Jqpt+zbShBnhL&p5L;Uz3}2 zO4EI9e%a+a#?^{l?f``H{jgHggG^y<+}&@qM?Lv|+V|0=)j`$B_hbLJ5QdqHy+m(~ zd|~+c$><~55HzFqB42u)`mtXm=UX8hb)^J|zk*Q9q#P9~*bqk27S&8fTOAkUC##1h zww68L)TTvY&gj#^rX|r7y869WNPW;v=IVc9gps`e&!S!L76)}gm z-bJ}Q literal 0 HcmV?d00001 diff --git a/navit/xpm/country_EC_8_8.png b/navit/xpm/country_EC_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..424d604eb5b3987e3903bb47c67b187dc0994adc GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_b=PZ!4! zj+x1SiUWHXr4tTmbt!F3X}@!c_fUjN%TwE#PnjOZxUqGg6bRdXe6{}ndh>Tv+6p2c tc%6%{`_SIl*vP1Lu);5(*Cd>g;a0Dp_I9gdbAhHZc)I$ztaD0e0st5IGzI_w literal 0 HcmV?d00001 diff --git a/navit/xpm/country_EC_96_96.png b/navit/xpm/country_EC_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ed2ea618c96e8431254a42779f9505fb0c6e9b GIT binary patch literal 3066 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 J_%AU5000ShV%q=! literal 0 HcmV?d00001 diff --git a/navit/xpm/country_EE_16_16.png b/navit/xpm/country_EE_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e1750bd2533d7666a3a5bdc395f97e9d61d22c GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`oo-U3d z8WWSZXxSce;7U;P{QBU^0gW~9JXXz9b5w%z>u6>24ydk4F@cf6=PIWX&)Fzjpm_|Qu6{1-oD!Me< literal 0 HcmV?d00001 diff --git a/navit/xpm/country_EE_48_48.png b/navit/xpm/country_EE_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..8e43a7c75113371c2362b95c4a5a6d2ff012f5fa GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H;+0IIJBC&Kok?hgWEHT l*X33GxNFD-6$4R4%ufYb*0bcFUJW#t!PC{xWt~$(696QLHMjr( literal 0 HcmV?d00001 diff --git a/navit/xpm/country_EE_8_8.png b/navit/xpm/country_EE_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..d40fd58418cfc8069aac883cc9b8c2f3b7ce4fa8 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_buPZ!4! zj+x0@v}_MG@ERnFrY0mLR8|+;>sbmhK7Ms|^+xYM|NqOcX7LMWWY`_b$y8<%`v9nq N!PC{xWt~$(69D@?BRK#7 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_EE_96_96.png b/navit/xpm/country_EE_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..0e253e4ca65eded42cbfa7aea4b75fb427ecf9ab GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt^@JzX3_ zD(1Ys<;dG$z`)|zrBm}zAl{YnX8LS{#Sb>Um%jd2rp7v)|HfPg#{~)j0va45EL=>i wjZMUILAHZIUG^Ev@cbLI+9OFf1Y+YuR<}tk@8{n;;s!F%)78&qol`;+00JIDW&i*H literal 0 HcmV?d00001 diff --git a/navit/xpm/country_EG.svgz b/navit/xpm/country_EG.svgz new file mode 100644 index 0000000000000000000000000000000000000000..317ce47b8da9f63e244087131385aad024b140d6 GIT binary patch literal 5583 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 dvCJ|v&4+ovA0Jka|1Agj{eMAGnz literal 0 HcmV?d00001 diff --git a/navit/xpm/country_EG_16_16.png b/navit/xpm/country_EG_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..9ce29c14cdc880a0a31cc3faa77bcfffaa4a9ee6 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^TJzX3_ zEP9Vl+Rb&yLBREVO8AFHCxNw}D*tu$-cS3*@vm{cQ_r!KavdhKn=GBKewO{G3nVQ4 zG#Q-j=dkJseC3(2uRFetf5Pj$*^9ImF7rLJ$7*7*h4?)&(a_R^-m9cD_|~-)I=$W1 z$REb|rPM*b`h)+XuWUXtbF%qA=%HG9T>o3%CJ z>#O{t?k3;V%-qayHNa2N{%5)Vef4XR`JkAGRItALUM&bAFG6dc^Vq!|lFLkM$W; W@)H*EFFg$mO$JX_KbLh*2~7Z>JDXhq literal 0 HcmV?d00001 diff --git a/navit/xpm/country_EG_48_48.png b/navit/xpm/country_EG_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..4b46db6e741d98f5afd0daebf551c3ab622b51fc GIT binary patch literal 577 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$qWpP-#lF$ zLoyoQ&M?dtaTGaTpI=sF`F)RoYiEbTt*%K4iehEc>O41oVvgucP<$l5;j$Aan^3QN zQTfSx=g!?v+PcB_nS|K0@Vt-ret*1oZcps*sA8TRBOfXLD^e>O9G@167e;nD^F_e5B+}f@PE)+ zU8BX;0kN^sKkAo=XYezy=kc5s|6skKVVC8$%IR0u$9xK2VO`a^i#2QC;ylNgx6Qp5 z*I&O-<2^TzSN26;hkbnFRgTs2hyU0X{u4C)T`MlM+`FFth*(KqT7F`3`;XteCCC3h zS>ZWPZ)bxhL(|2#{~GuE@h}=(&??Iqu;$)dVIR3hZVm;$1RUE( zTEs8ed?bIDTkfA74ySNi&A15M@>H?Z&Ty~_VvR9V*dQ@2lD*Ust- z=M3!M`kyyAd`F}7BSS<_VP@Lm6v4+rb8F2G6qtTVR{rDrb$5W3%Gy1ztLN0s{Wrg~ y)@0|y`k-fe4>pN3-a$hZ35+dwT4N?WspY47r*eL|pFQU&E1^xh+jwH^#E2bP>={AFV>-SOsI(e|p#EKz;ZiY@6z-*=sO-ugps k-)BCCM^1LNmM6b5|GcSWwEn}Z0-*H_p00i_>zopr0PIso#Q*>R literal 0 HcmV?d00001 diff --git a/navit/xpm/country_EG_96_96.png b/navit/xpm/country_EG_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..afe03c1356267b230175d945e498767ad6264913 GIT binary patch literal 1424 zcmb`H=~L1P7{`BtC>|u3DTW77Ewz@ZnPrmt0}o7ci7dw>bkK^*UAJ{IgH*gJF>u7B zyil>)O)-tJE%TU`JkkvFS~YV@SEVvfVAZ6x7yB3N&Ue1Yo9Ep#pKG)re}wT?V*mgU z0TdtlMn`=!++ZW$i!UGCC1Jy7%#&_?7sn?-g1=ee85^LN??vU99zO{iglU&iGCs_hEO!PWN!#)*+) zF9~VJCG=G0&UH2v?);G( z`z7I3WA14Hcu`bCKwn=#%=6Ic(cFrcmBN9%4>H{l{`OwU3PjSO(0D|~*=5tn=UXw9P4L;{iZ;PLjZl@OS}61+dz`KDx9{kP1KCR!lO~F;NMyrR zUVlP< z(r91|iBUL2LUE^X7k={4a{ZD`NbxkJ(YeOQ%kIz1;vg{kxY>O#TJe>__al#xaa<9y zlh~?MY~tM!YzYo$t<`#r57~_n4V?WuDLIFvWf*9sJ=Z4q*p5v2aqU%6M%W=oiWj$* zi@WB|($@>d1?$$ti>vaZD6GDZey&~AK{?dCFJFMC2Wq*W@%bEKVpR&~5cCU{NOaCd z2N-hUO@ST#r72!_>eH7MhWg;)R^)RVDS)SWCqix|P4sBV1+nX3us2eu9G7jJZMRi2 z*y_#YE@d)UeJCJpz`Xb&wIAH>OM9HO?)1UW%exz=3E^5|^#t&|}9LTdOcnmPScJp;AQ z8RzGOwBY+0c*`y&anrDCST#3T$VAjz1J9Nj%(<=f5gv7JUnv_KJzsQjB-4rf$??v^ zVyEm3)ANnkmg1m5LS%*}l!x$%m&c!pfbeye8KOL=RMAxL;2f)&ck=)^LAV!tWLj4< zu}dT}+E)vH%ux43F*$oEqj!6!P&`}dstr;Y>o%sgP?e!za*p2iZQV^tYm8pr1xoEu zxDk%u-cq~qcsep~kCY|tVi>W+$LcRp)S>%J=bIJi@GAPR7F^ELmy>pBnwdyL;`{%J oE&tM~&isKXzrD=DlO6UI_&ob}`&8Zgg^aUqwhRb9QF{y;Mza+b|5h_g84zr3D;CBxQYM zaeEjrV8C|Uet_XPiLulUY@uoP>nF)h(-rA@DJEaYM~d%>B)q(Pyx*~hx*wXZEjS3t zS>0CMs%bX`|M}y~%yKsPvR#$CuB{8+cKq)4YWZO{W1suF^!17z8oy;<+h0Rf?rV0v z^?tvY&ku)#XeLl}{bqi{X0vc}c-UMq#sY0SEP_+;XBQ5XQc+4d4>A6f`DWH%Pl&*w zS@~_jjdQ{|XKezvb+g&}f-5;DHLHS$3R)U|8~o*}UJnr;Bhk~+aW+rEzOMWjoNC*t z%DFBO2_ix};g1DBr5w-Z;E%h|%5}5bEk4S0_?b1*Xn=QPMXiMnhc2_*OYHb=>{Ik2 z`8u7Kcz;SP!0J>ch&UOt{%fxXb0daxjH`g`hx3|?fbGF z)?I&J@cYvD&EvHc)@oElnT+3)hmM5KrJ-yztfZUQRep-jtlO7W^VhD<0zyKEe?l2)j2DQpO6AxYb~A&R7M)@hY; z({4l*gPrFt58IT72N;T=$^{~Y0$`oU(GW%yj6m%)B$NPAO=JebkTTFHw6iK!h|6dV zVoF6YR!7i)aA1^9D4^4rQk76rlT8W?skG0RUiPmQeZ7gXWub*OwQw2#qPJIn06GOi I%nSwq09p(%2LJ#7 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_EH_16_16.png b/navit/xpm/country_EH_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ba8eb64ff815f5c63a10443c2fbc92c52c336402 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`7JzX3_ zEP9ttSlD;SLB#d^nTAXOUdIO;RDKJJ?oMINu-R58ti!Z1jaRI0!G4A`+xmuRMO8jkIBK9 z!|z_v&eQ1|!xnB0JN8FRYMa9L&cz-@-!{)wdA|8iYn{ly7R7G`4r^Q|wLDI0T=Me2 ztc6R=6hn#o=btf2^|SB2+Lg9_HgBd^x{;$~u*MGkkERxtfjfofD&!rsXz32GxEUP7 z{yFexs(Qr!1Lgbw7&Y`of3RG$jc39Bd#i12pL2x-PEs~p#^D9@GJ~h9pUXO@geCwc CuzTwO literal 0 HcmV?d00001 diff --git a/navit/xpm/country_EH_32_32.png b/navit/xpm/country_EH_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..96f49322452e1b34a97cc02e6de64dca9f5296f6 GIT binary patch literal 546 zcmV+-0^R+IP)cz@DGbB@!zVQj3HXs97K%Hn|KmQG=Z{b&2mQ-NEO|KF@vM z>%&Kos9bfBNreFV4Dc0o(gBu!FJ%A#B_OF1Kvfj_pARac&|emUj=}{HbQCTC2sR4s z`}06>sT+wnXY1>Yhgi&>CV&{V5$<%v*8Tlr?&xUb%l6e3nh=Og#y5ax1btbx8dk05 zxz}nm_*p6;(rIM3>l(!Z5I#O&%?a_{s{>aX_E=EdK@&%4C>3I2bN!8qs{7NTERP_!w#X z9~FNE$X2Te!*JDScXntV9-@WAyotws1C0F*6Q)US%q@S7K{R?4$D;P>w=a!W;+^CB z>;D5#GNHaO&DPKIyaV-xV48aZ{CW?&pMz=c2~hq7cW)H|1ZlksAZY7d06|+n1fatD k0e~v&2LSuaYOL?;2^8DO5k_=@bpQYW07*qoM6N<$f)jo3SO5S3 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_EH_48_48.png b/navit/xpm/country_EH_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..298eb61fd3edbad92a99a50edb2f297aaaddb5f2 GIT binary patch literal 663 zcmV;I0%-k-P) z@^IZkpbqCFL>taW2&Ccsg+Ldsrw~=RocyfuH#ZcafMgs&IQ#7EBA0uAc^Oj_rmEqEf>#K_ zaNmo?w64cfsh>wj;cfaALho?*hlk_&JOFEdKT;t8SA~Lecjq2y+4f_t)_Qob45M*; z+&DS;ZJN;uJq_pF-U4_rHC0(%{nKb%9bQQ3b6#54 z)4J|6zPxN59ApcHWAI5kp72XDYCVLvI!|3AT#L7x_ zV*{<$P=tb4D6Q*n_x8kd>~fhUlj{8ZvkM7gJre;!+d4|K5vg!Q&roSLY8wcIevIPF zrzlO@^c4E~5%)v*dowWpLL{*`K0;KnI6gvDu{hmAgt0gtA=+3Rj}UDv&VM2DSe&+y x46!(EAsJ$E7^I2CVe-V{#A|t&uc$3t`~#E)w1;COWViqT002ovPDHLkV1hjJE@=P& literal 0 HcmV?d00001 diff --git a/navit/xpm/country_EH_8_8.png b/navit/xpm/country_EH_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..d6d392b2b63d91cc7e7405379b2b87832bf8bc3a GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`no-U3d z5>t~mq$m71-@yMqG2w@Pi#y|ENw&8C{!gFWd-w7C{<96N2J;$Mqy$85?RxlseLRoO zp+h`1a&iT%J_g7B$M2VrkdTy|VPRq5Tal&nz0BX3PrK}+!5{w9NeMp=wEE6!Y+QL> ecDo8Q5HK9RsI!O5FK`0TY6eeNKbLh*2~7YMJVcTJ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_EH_96_96.png b/navit/xpm/country_EH_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..efd6b2a9c1d0d7e108efa89100cfd81428ecd3dc GIT binary patch literal 1586 zcmV-22F>}2P)OPM&rXi93v(gjEN7dkV8TbBPIK4f${PWBC=k%UpI}Bpd4mc8>fo516@J*sa&+EXO1AFXz#;@y*7##Mz|mtMVm_mK}OL+ zi698TPT4M7>GF7Ah9CeX`YW0|LC{~( zWD82u*$kiR5T@mpr@iK6r`V`DHH^t6!?T-5L!_#2>K|RNzKhmf!_}t$Zl&R zm4-r8tsnry*RPM=xuHSO^bOr;W%f&jQ{YGy`9rO)?ucTe2E4`5kU)$En7F0ac)HkBF( z3knPldgSbAqc?9t5IDO%b;l0zinpuF*WFDvl^O^Og3O|gx3>dG-M*dSIPr>a!3%=) zq6xy}uHxV6>hblS?w zV$AXP^@#&^$r5*UwIB!p{Qdpl`GMM6#%u<#^zh-NoE(ipNPweQ>FHV}lZ=LfIJ-Uj>eX2PJ2h1t z%#4o%ux{OIEiM+Xq!bm|oKEesNk>CLD;pclD^|pqz%8CVu$_7HMjT8J42Xk&hK95Y zCJU_u*__U_Lx*C|Ny^O?2mTi?0PtS#bbmismf^T*kB6U{(kPoOG!bNSI97#hNzwQq zGn2Jg0Ej1KzMdXoW@dR^-SWCR@Vu|5M~iH7(L_*IW1~4EBmO*wv2NJ{V6w9lfUm2| zvT4(blP5DyoJiTYals0*Ih|<-4@#W8c-Jlf(&L|@;-f1ZAB+FRNUktZZts?cF=|!nmD!%J#i$XzflkxrMWRp;eLP2MA zP%aTAf;#f?lMc!yB3sa?1*i9Dk%UrY3;JOEI6%? zohuX>g7j7{5vhVY3h;~0$|WL6kUq;LB1w=w%Ow(DkZ#K*5=W4p%Ow&=(Ag6GmP;g- zpx+8`_oI1BLMc%Njp*!|D;iM+oh`vw%6ulFl*odNas`PX$S7AR5d<0K3ME{SQLZrN z2r|m`K63<}DK*L!&VPd13-N1V0+Ue6te_DqzSH+JS2Sh?H5fZr6j%W5g=ja*6$REP kS8TYUFW|~bbP9_37cZQfscp0eF#rGn07*qoM6N<$f;61nu>b%7 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ER.svgz b/navit/xpm/country_ER.svgz new file mode 100644 index 0000000000000000000000000000000000000000..d00a4c6a887b2fa3b164001fe3e5b4d71e385a2a GIT binary patch literal 5002 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 UUg-be^y-`c0+af*TQ4gB09;AWmH+?% literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ER_16_16.png b/navit/xpm/country_ER_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b951302be66eee11240e0f113ef0e378d5b7db83 GIT binary patch literal 403 zcmV;E0c`$>P)t)>?aQDy^>-^7dsyW3*61WdNKn z>O$T=U2#SgIvGX#6;xcCCo(U>UF!xNeune#+BLv0YXhSF#?$W5j$5VFQAg;P#n^e9$$CHubL2 z(b5m18f6850xUwzn#4HE8AAd*=($tPrPbS<0>B>-lSalgzY+xv|2a=3kt$~MH}gpV z3V?I3f_ts^W4{a=eiLlbK(u>(0AN@L0sqb?TWFp5hM|4`0Kl{C=(;e^Vi?*p0RUiM xt4bnO%nwET1oy6e!d+~kl+9fv)BmEKd;w-snh(6Rdwl=^002ovPDHLkV1l<;r#=7x literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ER_32_32.png b/navit/xpm/country_ER_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..4f124ea0fb63ee1ad2d5479cd7ba49e65bfbd038 GIT binary patch literal 799 zcmV+)1K|9LP)zjrR3`(Y4jmGqASn_g%QA~dP18h5ciowH-X9${cHMDZR~?_*J2TJs zGxNUh%wX?{hVBmk{XqfSP^bXs=t%$=suSHE{@`K0T|lxzXM#ZJOm-kdCKnJ2lM_Gy z08m?EvH=K26Qk8~`H^Y1aBo0Qo!JC~3bgBFPkLOSj0i8dmSBTMQP;9oCcOb8`49k5 zIZrOUq>Uf6nKGE#CG!Fx6R@Jb+3Jg*n)pHZM`|4B#8%=rQE^ONvmqu3m}i)n)ZC}0 zbJdOAv%y1BA(4Rit_3>tWHJC+Ev+`@^&5ObBgImW_=(4s+2YeG!Co0z``2XP0|0Q*Xjo@e8$N3fx~zvc?8Xtg`Yc&FU~hG~KuEc=+E{Yl6MZHY zs?}}zGig9^Ol}xbBE<|@yyXCZm?q*EqMZ+sok_2Ob(*0C?2XPxsD6~A4Sba9hd4bT z#Uzn)WbN2sCD$hMjZExT={B?#t>yrLMT(Rvqsa#i&;e2^S8mh%t75+X$oS3le2Hnz zXyyRmbSC^^>b)>PfLugUrj)-iV5siclT+r$W~(2+Z<|p@c1nLV%l=z8ItZ}W1|MTqySH@5 z*>T0ys)bf5t+Q*6153hOqxucVn`MK7i zq-Rks5dR%T2kgtP+h@k^+OXH~5#}?dKVt0)qW2 zhVC=dY-Ro@8c5$zblS-MPu@y2WPO6LqEoe{9kNLvtmrI2xX~HFc0~UN#`o6rMlTN6 dMnaEH);~Hxf^7DYJ@x-C9a5PWb0*7~O=C}I zN}a1NEJhG7@Q$LRywzAeI`xEa-4@X})BV!f8ptJvDFokGqMgi0@!A1cJi>Q;E!X`b zhFWlWp{WssB#?R_ghA?Y&->IK-`k`%hS_~7|1;aVJ>oYK&rtMh!ot;sRRYu(%5Lp{ zWqZd|dbek<5A*Li0Gur$OA%8DPFdy8TQe&G#F|L;1BRu*;0)QdjV&n?V6vYG0 zC=X8AnDGS7fHkd~8vLfh1jw5W1j4gobWbKcSNOBZGBd_dVd86N6_?uG9LN}_kx&ql@iPaZ#4jz3q&N^jJe9yeTCwfQ7&&WW{lMl6lc-MidE-d zDei(9;#POSTa6wN*6NT6=poKqNM9|`MY{o~YHp0x=SR)fDp9Vt^st^rY&@n!;natweO<<=v9aN2UV z`DU00-&g)KUb>I?moHUMy%Jm`8SEN5!~ zj@%IymVQ8+4J8>w5u-eqB(**e?T#K0=8DL@?EtXv4M7m?1cs^mWF0BVAQ*VZ6-!go zGx^L*`SHCeGt6XHlzz&y*M?@4=MJfgn%XFFO1yPQG(DShxB28VJ;+6eVHWwH+mi=e z{dc)K&xQhk5tVyU6pM{|C`dn<&mD5}AKT{298#u01 z50!t?HWSI3`ckR_6&@WMLa7SWNJ^YJyv5a)sz8mQ#Hj#kBqdHsP~$0a5OXc7HjZf7tXZdTn?l-$<)73eLf2$vkKPG?s=DDmt zbA>)hE1mr@>vqrK&)5Ig^VpkhHvW^IkdR=J@*~~rM824tADi2`|2*{)k~1VE{uvn< z7bN{EOl!jY7v???_-L~eH i)ba=1SydV5SQ&z4tlv!jd@~&ASO!m5KbLh*2~7YDWo4uQ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ER_96_96.png b/navit/xpm/country_ER_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..a17240819d55c7bac1ae38923506025ebd148de2 GIT binary patch literal 3214 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 A>Hq)$ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ES.svgz b/navit/xpm/country_ES.svgz new file mode 100644 index 0000000000000000000000000000000000000000..f0abc567da7f370c5a4765c4d15b7b72a8b61ece GIT binary patch literal 52198 zcmZ6yV~{4n@;&^_Gq&y7F?YO!9oyWoZQHhO+qP}n-m$I!-g|%Xet5rRbaX^lcb`+4 zSy_3CFaipSmC{`d2x?&CWbJ70rX#FK@8E0#xX{vwF&MG)ey-6i#l&6XSa_Z=6%`Q> z4h>k6G#r2?BHE4L+zK-u0~uSo7$5bKRaSY75;TK~O>Yv#TaBM~d3z`-Z!d3eZ-2du zA>7%C_SURqXRkPVR7KF|R;M+oc%8bte0*W>`8p;u`%>MWZ%)27|@BgvfrTo;eG3_%D`5Ec#f^i zo6$tJa?jpG`EaORBEU54O0`&|fGM}He{a^7<=v@j-EGPfgmCq)1Wio8r$y(cT2=v% zbdT_*6KqmzDs1H- zx~?*eQ2%Y+ovwFMGh$<1Vk26?UT}R?%sxT9P)GOd-tK3gP;uR(J;g&xjO}L|-K}BS zLR6n|{cZ4eFs1+b*}|SNmnm5Zb@|@#R@?Pn`C2CB4-r;MN04Ua;8q3PnmTmpxyA=tEr)OKm=IZhqh}Kx9P{0K6pNAHd`{VSxA%Z=UCpC~aF6VqdR8l$79{5q8Jz+U|!9JXQg zUb1xdo9(R1QRcckt1od*8(v{(m#{NXhUx&)DCvVEzV{iE_xWm}+ob{VoK@^?=<;C! z2yy#I!zi_e;Ut1RgA>QIp4^zrF52 zjB?@lXv^`vS_X&*O0qm|Ck*o8OsX9^NAvd^7WNy3p-}7_r65Pd2*Ee8mK!|ifj)>dE|iiqP3SJgtZ~h|U8|8)!k4Mt8Jl(b(G_<5$-a3_u4ldjq@6~@ zr$9!>i(lke(w%h3w&*)XqPwjvsi3Ei*QO?UH%v*15k}|yC90G`$om%l1KK?fP3?^6 zlqD14v}b#nN}z$l;%>-t0|6nYs3t$@3^>r_zt+cS(WXPzoqW@Q$kO z#Nl^wFiiaZZv`O$L-~0GdZ@FQ=F>GX(VbLc)f6H#GI-{30HAaB-FK{;$@)fyqPKN1 zmM~Br>~P!7mfXmnr3nq9N*X9+>)|{0#Uw)lFjVsMMREcP92?;kx z+>d^Mur(P%T#379lMZsOVSpg~!trG+GlEo#LQf?f-Drlo5mG#Hj08*7eY5#MYO>_Q zj5QSEG=UBcKE0�(&sN8}=mxC(}SFm%ax%Jg3% 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

}bq++)#Up8&@0HJ}MzS+K@(eJGyAPY~= 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 E08fufumAu6 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ES_16_16.png b/navit/xpm/country_ES_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..441bc6e13943b645e272275b1936f6bc05014bbe GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_=o-U3d z8WWRkj_DqE;7U;PG>tVe_-F6b$eVAsDRzhEm+$(sHg7h` z)X3P!8`$nVbnfr`4Q;#s-`l|P$zx^r{|CSR%9UqKmRZwtSV5PO;l_7;PPJEGj{zOV N;OXk;vd$@?2>@e)SwjE- literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ES_32_32.png b/navit/xpm/country_ES_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..fbcb415a9fe00274e0b07db764de5c8b39c4743c GIT binary patch literal 459 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 HnE1Z|#*9P) literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ET.svgz b/navit/xpm/country_ET.svgz new file mode 100644 index 0000000000000000000000000000000000000000..2e660450824b959ac0a9dc9f6af92506f96b0473 GIT binary patch literal 931 zcmV;U16=$ciwFn=D0)Z&17mM>Zgg^aUqw_db9QF{omE|L+eQ$4_pi9JF9|>$Z$Iv< zuoASkQxve1Aaz>wQHf+rs4N8%5e516ougUHl!d}51PJ1AZ+B*A_jLOD+uhQ9oo%*@ z^=e#^b(NW|KCh>X)$O?Yc>QLSDzj}TtLbF9Ud_hUYF)j4b#nT{`Mb00zusS%?bloL z{^Ku~znz(C)HHv}S<{?fpPS$R_|+g=(_Fl*PO5p^e)*|scDtS3iCu4Qo9hn^J4elj zi?b18N9Dm~r{!>iq~z?homMD?hZAEAc&@hNBbjj0l@nEo+AXH-d|U6j;kMMEK^QZ^V|e{nBXQ)rxc!_fDRKl7e2{N zpWw@+o!`Hmj;kxfIasEUo$)~|Ys}gFY&crx>;siwIYU!0&JaF^m2C7e#`?Jjj#T*G z6Kpq=)%Iq+xf@q^lXkQC_JWaICAhkL*oK%Vtje1apI?+j%$74+{a>IBdU=+RFkMSQ3`p89^nfWDcdOEQ~T)A7;He77d>@&2M&rpQ&$b; zt>ml@dBG;!tAH+W@R$px(yZcgIDmJ`zwt1xKA?fy03` z7iR8(*)hIXMuW2)BB!AW_7;mt=%jZRZF1V>1qTcjVnYH4-zz4YSVe(4@YURTA=$!} zfUXPlgg!6ECTrq?raj8JI14wu23rcmg8FEKqyUG|e~&Tk@*d#}6^X42;=^!ukS*q* ze&B_AbjNclD%7IlJ*wzV>}Ch^{D2C4(dc>Tkajwg9H8D(q=afk&%f0o<_I?UA+sZV zuO4+>p%`Ae)Nw$kA~_mnfU_7$IzX|}n!4F}G`~v7CgSw~g@-=T!M?#QCW-D~3)u?B zjIf0s?=$7AuzxEk9+mt%IHgRu?H&}n9`m=K~t9! zC>Ap(n>2Jo<`L`2@0YmPu4V0nyTO6Tge#$}HtZu@H~Uqg&|NwSUUv52rlo+(a1h%M zq@-c2M=UPRA&1`f5FT;3JR19d+PG~u>%V9FM)ts{|6^k7OK(rhzwN7&e*ji}ZN57Q F004-L+VB7X literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ET_16_16.png b/navit/xpm/country_ET_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ee650c7043e43c9dc26cf29e986206f0e1c5e662 GIT binary patch literal 260 zcmV+f0sH=mP)^6$7cnsW|9`cQ;qP}eNycT{ zRnUZ1d`rCa--ea(uQtPxFs?=D8h+jtLlZK*xP*=IHzVW!-~U<8>ctUu5*y=hBc7Z8 z7#Od9Qzps}@BZ??{lmw>^y~F+K}=aJp~TJfotNp`|Njg;%wMtC@Z&Tanvlo8W2^qU zF*5v*_`MTTmhq9T2Aa?(Htul$Hpc(|S8b}|`Sp#k2K-K88a`bW{G^Zo0000< KMNUMnLSTab#duTz literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ET_32_32.png b/navit/xpm/country_ET_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..ff279f2eef03b79dac7ca7f9ebd48a5e129a296c GIT binary patch literal 588 zcmV-S0<-;zP){?(XNHAk61=k}71}k!VU-$MLhlA*nz!Ct2Uu99 zCVz9XH?og(KecFp;XsAHHyesV&kb^HUqIc zb2OG^Iza@q{EQt49X~|?H_|tKSs)$@%On_~W>NY~d4F2`BJuW?Cm+w$KKv}OuuM(f zmuyrzr7c(HNN9(`rYBcArM&RHZ-Sz<7=aXq>pxtz>5h&I>k&v%TI!o%E>i=r>}0Fv z!3A@=9i#!AR2EoRvT=QXY$zanY3gA;smXi~fD!D_ceYB{VuY4nCZp;b^ZHa=0NZt a2z~)sK(MW##&@Lv0000B4p+zySI7=m$PQP?4z|_+ zhC}mr@OJ}1>K>FoU}*17h!yeCj}XJvW^fba2*!Sfo+pm1ZOPh(EE|E=c)A1tVi;|M zwM5n+Bz=g+SXGRhjR;D$zi|VkcH&f4+c!=&bNi$1zo)1k@xh(^Di5tk`I-OnE3M|h z#@Mlrvt+S^UnpycXVQHDWF`-wN1SNzWL`E;r~7gh!BL@$nRO+T1u&_FR`Lm+E>bW% zcx6%x0nkj(#mss~g|07tVigH35av_>Ca4fMpU?s?26T}n6CV5fg*Go!AL}-V$#D;c1;#TjtVUp za$H;S=R#~W6N?DSjm55tNqs8aSG1;Yd{=MgI{j>xESYc*=kHBeOpMSTwwj3Yh=^&Gh`59Exz&U*hKaTffW>S*MSx4tZk;mrP;`Xi3Te`0I@bTRm9=X5bhndY`57gUunmi)%JR(-Jb@nx$nRJcNg zv+8djUFuOMh+}KIQ}4fgFg7;^U_qA_bO}IgZtSNkhib`W_O>(GLAv;_lJ6s_N3ID%^Lu=!m=b9}~t3oHu{CK~}T4Orv zy6@u5(%gsbTLR^me{_h5;`%=0-~Zng45w0SQdT?8TFtQFh3KKC?}9==8yGxY{an^L HB{Ts5Qw2O8 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ET_96_96.png b/navit/xpm/country_ET_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..f898e9b18172565cb971d746617238c14c91840b GIT binary patch literal 2234 zcmbtW_fyk}6a7#^LhnjZLBN9xO{GVXB8V{uQX@SGB1Hte&^)TZfk>5pKn_sp0mO*Z z08&E}K_EdOfT4&Xgib>9xcdvfGvC>H`)1zkFK=dd-X@rvnecK+Z~*|o3%_k-dCD&T z0>XOQA0N#7of3yD!o&#p`EM2B%Q64};s-Y}unsApdPMg4ep^rY%OLNg=w|QD3>LCC~*jfpUP|IprsVXi! z7L{Ur@76iyOy^DBmeuP!>cv<>ivqyr4N^TKZ0^@SdiLaI#y=BRno!xv#lo?uqa|ol6e1w74IO*Br_@x1)-4uHu0MfJX19 z$h)=3%IhEB?81qil8U_Q;#sr#x=c<%EtjN(E(mP>4+XjKC$j_HBRa{b3aC2Y_(gGRo`xc&V1qn zyd-MnbFtn>C_f#kI~^I-JV=Ati0xL9rT(f!tsL|*@_7Di^iB#_4ZXSc^1Bjguh64X zl1DRuG{7IdDBql{sGs0)$evWYQ3$(Hm{*O#YLe{BCdsA3SSxQV)d1hh33x&uj1N^- zs+it;JlL8xFa&gDdV1zN_j`r#g*0XJuiAapQ2mR4bM=~>^+DC-vhQN_VJo$ab>uX*n8EQB#xt| zT5{O+Eu~rl%^|{jSAJN?9JqXr(D|P;vb4OEc5FeA-%{dJQ+`rPV@yA=VgHdzH>-Ub z{39QDtFoG5@3!)6p$w45{MB@@+b4Oh<-B1^*m_d#b2SgF)EMp}Qm1X+j<|w)^8Wj! zCQo--A#-S}?k2(Ff?Ylrf5d$CLB^v63vx>)Ncm(sXu8nJjp5_43<7LxB-@`*$xVU; z`_guog|)_-6E(krYl>ER{VoS={{Oq48uV%=rqwZo17+ zrqOd@v?Ue<7ksIfvENFuizMtEa1w7WZ2FSJddK`DypN~gyPdM4CHZ2}HsIPILY(e7c=t>BitLc`B@_HU>rQPC9cmBg@E%yQxaKouuU8%MewA|_4m_G3_R@aHVH)` z+o}h5QZC$(0$?lH_~CeyWwk|(*UmTEGXtIT6mBSD7tfP(vZZFDazda>O! z?fn8;oSXW6c^G)BM}GkM?lroxJ)_0av8?9MwMS@`k-vR9kFSqQ24iK*lLBvX&|PU5 zbT)7Q&*`k~22*0HrF4B3-6!A9ox+`|TiAn9niaH8pSKXDZ76 zWQT2Zeok>S2FJ5aO+I&;WcO|pqeD8O3KkSp{!RtdHrJn0H-t2CvCE*|*BMj)(DUn} z&*1gigk1LOyKTK=tSOFu&qD9H;WqDtSeSq=6;<*&?H(r&l)Bu0MLm>^OgkYjO>s?3 zU#|ReCCbVCj!8(Jt=^)@yGXr*@RjPN3*u#IU*<{2Ukbj!cV5|zjGeXa*&UdUy^8#F zQc=sOPB@ft&`c#dVQ}MOdX_SSffP|ky%eRc4&~c76Q*%<$QS(*a|Fes^E>*dC1 zJow=neD@?6TdZGs9OO~O^kr~Wp$4F|;8;6 z{oeMtC}95Mi7$;wbo+n|7oeiOtk)q1!B-d0#{VDD{9lkW^n#0~{09+H!l%y&05>)> Jsxfql{s;CHK8pYV literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FI.svgz b/navit/xpm/country_FI.svgz new file mode 100644 index 0000000000000000000000000000000000000000..85927b63bb6cfa4a0019da5b53961671adcf7a78 GIT binary patch literal 319 zcmV-F0l@wriwFn?D0)Z&17mM>Zgg^aUq(qTb9QF{m61(ugD?<<_ng9=ZW0NDfixh5 z$)ZxF?%M+(Fklr-WLt4^`x;0~8zpKgZ|1%E`Nnp(JN6wqFsb+;C#6&q%Tr?Ek z-(GM6Na;dUMK=gWK@70Vo$LW)^ekDSS%nPOEqWCnsx0;lty-=3sqY(OJbpI4K{oyx zVQf3qp>YsG7AsV01%)3CCYnk^LWpm3@Ll<5)vqgzhT)ZNtxU+QTgIDKTO&9dyrN*c zL&&YlDpsq}o&8Zofcz;XS*hpL<;*Kn?YBzj871v8Ad007qWk?Q~e literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FI_16_16.png b/navit/xpm/country_FI_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..c358d4503f72f830dc5da936c9d4b2b1703a2128 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_+o-U3d z8WWR$^s{jNE;pEA21GV>KR?>@9XR5kB+()jp?9y2^ZA~CA9xS#DEoi*cK`j2SqUiy zxeL}#&RF00@z7fF0>AT@lD)UZCM6`?u(S+|>5yK{CRQ6-XyG2xz+MaBRC literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FI_32_32.png b/navit/xpm/country_FI_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3709ddaf08fa1c0d4e996a52ea599dedc08c27 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&*wJzX3_ zJUWyA{QqyyZ1&;FRrSdEbtw~*izn-rrf$$W#yrF0szKJl6|9TJc$~N+#PWBygg&~v z{C$R!b>ID+pMS`%6f-cIVK(8R-lKyT`kMo}-5OYXy0^t0(fauA^7p2FvL}>EHNR;Y mIjKY&M7`{f0-M#s$Z(!XRpCPQ>QKB4=E8)Zq8&D?OiOxvr9u7 zn`WJ(7pEOral7WnwYBc~hDU32uU>i5vhwAEc{S!qS8QuO3a)NW+WW=5J^2NLMfXogwB)yB&j$HepZ z8yFZ=i0c?%oRs5J>~cd<@5tE$2M(M%bmZtku0&x2E{6UM>RIMbqo)8ZVeoYIb6Mw< G&;$S-=szp~ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FI_96_96.png b/navit/xpm/country_FI_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..9e1a4e3f561e61266e0bd110153b32661de3a095 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlHoJw06< zLn`LHy=k)TiwFn?D0)Z&17mM>Zgg^aUq(tUb9QF{yjyE;TSt=pKEHyie3@XStA0N; zb_NS)vk2h90Q0~CivR{qUdf!uqL!p1C%=B{oa#$n(y}EpSQ<#gV!x{EajL4j`QpzX z-``Gt=~wH;^6urC?abMvznd-Ri@TebXaD@i4;STZvffPZ=F{8dUH|gzZh7|S@BZ-O z-!3jDuU7qZ)6XXli_N>qk9R+>XVd$B^2c|Z&HdHo<-@~6w`gB>%hk>0x08zt8M*%D z<`0v}M3%i>f^15@3YLXb-cQ$>|Xxc4j8`Z zbg$PkvhVKt&E@z1_NdKAL9G*xtH(YP_4i@7MR!S--v1sQX>AcgPZJlvbh@IUZH($=c+sm^bZl^bI zme+57So}+N-(f|5>i4cRzjKuYcYw@6W!I;V<6zo9TSInPMv4`tXelwXl!$65G1^ z+xI^xCG>1|_20|Y&yAFS=rDaNJia_T`)>R7i}~zI^!t9g`EK!kdeg&@{$2F>;&Rup z*Lm~neZQMjryZQ)QOBCk-Y+od^6#6)?d^|PPdFCus8U^2|NfxD@l1?ZAvoYrpxh znD?9IZ7-UG4D6_BB`ZDJvV8lmeztkM?d@_k?^oNE>_Nk9dAnS_Jo_f`UuyzyL&G)y zo$c%eMt8WG-;ho@boF1W>3ks*4CaWA`z@u$t*yUUi%0D&cfI-bR>Y1k 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FJ_32_32.png b/navit/xpm/country_FJ_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..dea3ec30744c684f1490ef198a68433182e4a0e5 GIT binary patch literal 1035 zcmV+m1oZofP)2d8{ zE!W#0w_v%(AGPj3zkj{=Jm2^G$@{+dAd}Vgs*-n&Wfp6v0{{RZ|Bcs<+-L)U&tJ`M zwss4}+{~m}ZbBCSVrlxD5Q%5v+n+8S z0FY+uHDMJUrA%|rD%YnX3VFXi4*(K=wD?9RWNVYVt`FXurUY9frwI)(^3i9(Ro6uu z0H|{}2e8;&%zKiJIka*tbNU~z&+kcCfaNa-TU=VlL-7Vt^51W*ix zN!qXRW5+8lFl6KdfM)0R;GK`SA~9ndwsh;g(StAHiA-XqcdAh#GDxpv8-6-;gD#|dNAB*G#9II<}QtBKCiPCnuhy2J`f5 z0=ozTztJ}@d;6SfR86S5nIUv35%32A0HEJjzBgk!%l6)?P{y@(E=m{F_J?D~!FtUn zdlV~|S21@)T^)y~xMd_KUBaWqs`T|ro%o6mLQc%tVr3IqmSLXA9bAUc|`V%Uw zN#+%DuA@#Dl`vgx0fyC-=Xl2c@q6$#Up@6R~r&U(gxL0r?(`WLt;KgV3P#|#ls zB12e@Ea+QuRW5zSk3_b`WCVA^nu90N|2_xL0nY*9>tFM3avvI;2ebeH002ovPDHLk FV1m%i>%ss4 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FJ_48_48.png b/navit/xpm/country_FJ_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..0deda2d1855d38cb867d614c89c37f137129cb31 GIT binary patch literal 1516 zcmV6jvO_e>2P;vp2E>YXw0fpdwz0F4i7k#0w7=dxW$p zYRf7|Q?#0rXuG!cz_b)9#AB(3O|)p*YE@`esHQd%r7COVQoIl>0=r9HcG>&vAA=i( zVHeX~^bfv&&Ai|7KKZ?Q@An4LlvWXi*}Z+1MIY>G{HqO~mZ`en*8EHWNH~9-omDZw zI%itU$#=y)Ia`FeS$VUULm-5zi{;ufg@B8nuPRKL6F>aORB?Pwb}~sLk`)Am1^`e| z)o#u1N_DZEjWd3(STCM7VK`ypX%oI*mZ)A`L=nKpFtRyiX0vRtdm~${pIAEdUTvB(2$>4=s1R4o6o`4K@t`ARdp$huN%D zdCwu%j6@%vnZL9L1PJR<9P?pzbaasq`r114jhntQ5y=4oLav8C!(r${UmiXekUW@w zm;WJ_zL##ZP@3!v+{_n@G*IfX%2^ldfaOMn4z~@#T&T^0uoErzcKWr1^jhiWkp=>A zhfFu&B9}AL!qhNO7piZ^tk>AQG(DK91F)#lFMQ;4baZu>>;nMN$GNn~vCoPlhy|KM zFh&hE0`1*EyRnZXsgbbqoe7x=7seeHSC2nzhQ z8cHB^Fpauct}d1n2X|$jdg|a=A}u!bTnD?)*c4 zK-69kZKxv9NSjW@K%59~rB3sJ`UAiQ(`d^SgnYZC`s#qraH*+viM0Gz`G*ljQUK_d zZmmABJqzH;It@@l#$s*UTWF4Z41;IP-ekWo>N&8<>2%&j?VNkmS14?lG*2>}seH_| z&JWW=uDRZB=-6EuFlU_NCCn)dSK0W_IMscF1Si*w5ROxB1Z zDY0=)_qwgs%ZFS$KE`$%26ggFCa1D=#(q z>EV}}S~Cjvo2_;)(~t^Jm)lQ91sP5w4YH!h9!X6TIZ2J`z!7EXBEBU2Cc zIfO`R+lCMEtV)-EHS1y>rRn->X_UPT9X#}W^}+!Kx7$Z8NM^5IgoV&Tun^sbZ2%DV z^=D4E#n^R!f-9UdB)Ap&hv(cTXbgQt%$S)Jf-^&KX4JAp?AWv1IAFX)-8zB`gkaI3 zEFP1|WV6}ih})@0?ag81TK=|BPaWJPJByDkB_tSzVOak}mPePd5X5W>tz(U&3<++9 z91L8odT274ygyrRYlq#J%iiJo|?(y0RRtz_;wqi3c)Z?NWE~qY!t|!MuGfk6v&@Of&A%(1NskIO?jc# Sg|fZ?0000zopr0263fZvX%Q literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FJ_96_96.png b/navit/xpm/country_FJ_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..19b6fbfdae76d24ea4721c0958d2ef788c83cb68 GIT binary patch literal 3114 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FK.svgz b/navit/xpm/country_FK.svgz new file mode 100644 index 0000000000000000000000000000000000000000..b2ff812e8ba74b6337511a006a4d58c1d6381490 GIT binary patch literal 24773 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FK_16_16.png b/navit/xpm/country_FK_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..099902d3905ce37ff3f9e5f64fd3d52a0e1eff25 GIT binary patch literal 461 zcmV;;0W$uHP)z<^yMns53`%N}g>Ir1XSgq1c#Ks8%Ts27Z4a3`;#HsSdBO1KkCCO=s;>%P zzuv^Ent_3V@tTnlg!Sjm8wLgj77-B$SL>V!0|SF$w7t5G`l)BXn6BQwv+gJZ0|N^# zlORAuh^@kw>)w0Tv@?I9PO4W<_wv&9{(a@`(>DxkY?7A7+YUWkfAuHBxw8xm4Cn8B zVrOO5lj1=5K}t%%md-;d?IIJkL! z?w&-HhBwb%@G{3~`p00000NkvXXu0mjf D$lTSE literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FK_32_32.png b/navit/xpm/country_FK_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..94764ec88f0dd1bc28a02d81188164e6c21917fb GIT binary patch literal 1174 zcmV;H1Zn$;P)O6YEs$u!R6b%9>(+#2 zA#qD|gG9GsmMI|Y16SuXZpoYylIa$*C6KKnqI8g|A>bBCN5SzC36zSZtt-^_($Y`v zel#mw8ZvA5XUWd5H|IR}dCqyx`{p8pT+V&>q*QuEsT>0U0FcS@Kbmd@faZ+1Iy=?= zZ(0-=*3{fs|UAV0wr6rGq%3zz=5wq6`)Peq)qa2Dj0g_K>r)9rye}e(`ZUHqsc3v7_Gbx%u;XHOBEu&yT$!dioZJS`7dxS6fNzQ`?<8lY%_G zf%scsb;$@rgc}@AS6XVS*XyOz=_F}H)Ddw1t*ELJx3|A(s6V}|o$bi0_IG~noU*QN z@ABv0Sqx#!2O(IATe01Q?aJ~c%U1d3#mfDne(Vz2(z~a- zdnB0MADx}*r6rd_(PD0H1hA|M0Q&BAp;c8(phc&J;1} z07;S!+iVz_25ufgm^g*$Wg!_A6P5q~Ja+QM5&Edq91>_x`oGr+nCk%H3Sjt3yEZCL z-Am9p$q{@S&RP!$hdn8YD{|a-aWl%8GgT44&kA;LbKXyg=d8uh0P;8b{vV_1Oi5w_ zJ)Ir7qr5U!R1(J*SVmNF0?y#@QUDW{MdBQW&*!#}4RzC!J>C_bxmU007sh1)aQ_{F zM>BH~o_P-rvD%-^`bQ6^M!1Q>MJMH#6P86rE53JEiZ?ow$0WTTA3eP!B`fReu9bPC oBY+9(B|l4qb&LKN_-_dO1)(0c?u?)$KmY&$07*qoM6N<$g5q>0;{X5v literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FK_48_48.png b/navit/xpm/country_FK_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..981e227f53beedf4f8550d07b127830126538eb9 GIT binary patch literal 1784 zcmVnM!XI%vmA)hY3V)5NhVcC4dytZhZCwneR@PDkm(7ElwlDqu8G5|R*U$@{TMNVXqh z5y>XtG&}v`|5Ik~`QQBZ+;FEMCa3t4oo|oKA1dfaZR3EBWa0hjO`5 zDrK{27cZ_WDiTNc6cve2ts8H8XDNTvCV^CHvA89YPh$qu)^>mX_KxJH6CoxBgL3A~ znkY;~MdGF!p`ofWL}RxjvuA&%RBB@e1ORx%)c9?PiB2a+VhX1zFK=jXzaJ}_M?jC5 zc622-eruA+A~DUHH8Gr~tu2-`kAWgF4Gle7orX6J002T!G|I4BsT@3q=y`e3CW2~W z0z~@z!0_X4sC+tI=!3Pn*{xJQ?d&yM7jQC?F^8=8d-vCWj{&5u8P%KhZre6eNOkz5 z4wJjhW?ep&^~E*Eu%VeAH|8t^%%?Hb@?47iHDRd;9%VcUR~i7o+84P9g1ny_q=A6N z3;BaUWrfUM2tfY}5CqP5S?6R0b29{Wv|ciqj37vd8Le)KSV^Sx{rjU#=+o&!yC-?` zX0lKi?YnERxBQ2f5J?(Q#N~>`VhV-ga=FF^0?^Ouh(KeiF*f6%+)8B#h%;|q^s)!o z#Q~uxAdp}fhFL5Y0DwZFm`o-D01=mL==o7xoO$~6Y8nkT$>qi^TlfbLb8;pQj@s=A zi$yim)%7(rq%<90vR8BALRU0I000C50J?M!6)#rn)33eWYX^1_gk*7=Q{A)+KfDp*9DjbfISm4meAb1YLF(i>G+b* z@3*#UqP%X1Y3|&8ZnsY$mGU=j(pOb}vs@4<_<137>NtLfsxdEvJZ(aP%W-pxkdc=u zi4;#_FeoOu+_Y^Q|KQp**1oVtn^)0G5S^iTH7!uE_SfWLvh| zKAKXBr0@>7zufZiS41-FgNEOK$C{ZiSmAFRFpQEWq|n+q97u{xmQ-7d8B>~{lE{QP zc5|I5m6Ggb1Ptru=Cg@VQXE{CkDXKqvrETH2T!iGaX3W8UgrDG*!O^%$fnr?e^AQ( z36tY2)|K=2gj?|KWj|lm9YgvH<5WwEf9+ILv_WQ-xbwsBX8Xw9Z^AZA3lV^*4dK6u zD@wGp8FZr0Wpt=r{BASjhBi)(W{{~2s#f29t0&xo?|q2saeh5bzhh2rpWZ1+k6$!B zhiEe&smeb4CYNBxzM$coAt(@7Qzhn6Ng3Su#Kcr#Mh?qif&V;}l*rq;uhVYxgj?|4 zLz;VkDLiRobeE~N-Uq=fFJj>NJ(eJ>*ADdP`Y|o|0&%(Y+d9|r2V?g_ExS9I1`lbw zKzAW9f$LA@av5f`E8K$b9@?-$@*-8`CNO&){%WSOeoQ+rV7^SqnGvsFy=*+D1z(`4 z*-XN{cKIvxUBsg5j~=d?d(ZN;QGq+du>VOnrpGB%q=p$7k=#tRJXD_5=%^ym0} z-Z}hNIKDp3-JnOSWU=z>c4U|f#|*8nodLVe!t8v<&EIP{okWwmx* zjpuP{Dn;Qg95a+5q6YfaCcp?Lq+j|`L1R+UAbR=ybwbjO?yDChm8%}!Hio-!Jcqbk z8q2AqCJ4MiRLJS4yLJ9<1>1V5=e7bO!K{p|i`NLZ?hY?B9D%etXW^t^Lcj*`()x@# z9^_Rht`hxjCSN$E@FkV%?xC|Vg7}BIaNI*?vuoV+*A29Sori4Vg7P@w#203jJy*KC z>G~8MoFkh2s>OoQJ@CDL3>BMALs2xmtcD5q-}ZyDVRf!>;r{Q()9M+}NO}e|lAZyL aq<;WBTOkKH<-T96=Yo9sr;oFg~+Vzq% zBqbyw?r8fv_{RR8(b(uX`JwXT`e(j8JU%=t8k)oBga^!NY;0upef0jadH(*|^n`?j flmw6D18fWm0p`)X{mU7FPG#_P^>bP0l+XkK8Yf@m literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FK_96_96.png b/navit/xpm/country_FK_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..16bc806a49ccdc5a9d69badb5ad4d8cfe354777a GIT binary patch literal 4280 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 QUlD+groKk0`U}ke0WLQ+#{d8T literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FM.svgz b/navit/xpm/country_FM.svgz new file mode 100644 index 0000000000000000000000000000000000000000..32361a5b4ecfa4b3925e1ad3c6b2b663d0437e4a GIT binary patch literal 435 zcmV;k0ZjfMiwFoFD0)Z&17mM>Zgg^aUq($Xb9QF{os&^-+At8u-}w}`+e?uWYzJBh zid%K<9;a2)Ui#<}lUQ@?$o2^I)7K;Ei(K4o8x0%jyt0NPn@|KF zgeir#MshS3?`}uMm&czEzn`DJgWps!jBn^v8ETI6n@H4BRdwJvqcPYh*?qHHjw#C_ zWfZ0h$l`u9GJd($%KYV6htMtw>AG&xO()h>gynfo`qM+|M@bo_ltg!g)=4kjM&A2Y zuEH-7l;ybnp~~m@KqF;9c(Jy*H|3Lvoi(B|YQ4kT5dah}GBA{gu-kuQfrpN!i&I1U zy4Ol;j$h~3f3mVfAcH~$s^l0)<&GI$t%5`dP8h$ouHo1(wFvTxCh5%>{7Ptfm5qlY z-b7Y$(#Ng1*;>7;tm%(}Q^Hg_%C=US5NARY3N&FbxlY*s&Da>64f}vC#z;=$|Gb2L z$jjQvb!_Y8aHcgBnzDqQ;DS`g)jN^CgL8p{`8+%0KTV~VVQe3 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FM_16_16.png b/navit/xpm/country_FM_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..338feca8ba6a301477d48dc34f1a02e770299f2c GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`pJY5_^ zG$tnN+%1{jC~}}Bbjr-m#+egEc+I+M%)0(WEREREb&9*t@X!C_1^pSk(t7*Te)Qk< zykT1N>!bMYA|LyLO^Z4THZIh5c({3^L0W|8Mk7b&j;S*>?*?^=n(hfO*$@~8PYG1=}xAVj*NePJyA;}jR7;D~~sgXGo zv2;T=#|7bU*98x1wc5(P+xPS5d;4!Q4zGK7mdKI;Vst0LU0|r~m)} literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FM_32_32.png b/navit/xpm/country_FM_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..ab477b195ff4d5d6c6b469879763a2f9cc31ff20 GIT binary patch literal 445 zcmV;u0Yd(XP)d5K!7s#RbL9IR$e7M_c-NF>PpUI%TNrY~MI8=wb)a6cv*3 zgPb~^!1ZHqI%|9W$?lpYVLlnR`omc!q7D=$aYPWzJqP4mWg-(%2aWEaVmY?^VW`aZ z{2y6EV|UN}j2dfn2MYoK;J)e9JHP8~*T1Rv_SVB)@+|jn1zspX`1o&tazQWWHIjt3 zu20Pr5SKOqz+}v=G5};U`s1LV8sUh{tkQA)jx#c|N^ljSgIe1|01i-V&zb!N0RZsQ n8;Vv_cz`n+)9jb-9V`%^Dza$E_w)@K00000NkvXXu0mjfnK{5D literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FM_48_48.png b/navit/xpm/country_FM_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..d17a7fba2d0a6e3a2cb71d55c134b7357a688eeb GIT binary patch literal 708 zcmV;#0z3VQP)VWlt7gVb>l*X>;&ED zFYp)mWBdc+RyQt05d`DPx)6mXZEZD_)O=^+WHQ{jE<%flCUd=~CWO4JS=@Qg!#nrm z+#wI2ZNoH4nl!-gngfj!4iG_c0RSwZq@gAa6~!um;*vIlj6tscp#XQXhPNQ;8nRr2oOSEZZ*Zf8p0=gyW3^}j6rd)BkqO( zlnASqLoJ6UbVb|^VU=ZL+T-_!1Rxs=RV{b&K%WkJ9ftx;&9WcT06_QXK}0ipmLX~m zG){a#x+?P)2nYFI;R9MfV;CAo0Yj6oEQh&D@a;pA1lP|kY}ajQIk; zYdQgm6jsc_r6}>;w#a3(orEPGD$^L zm$DaI&DZ6YUmWg9P2kN=YrpAaOszC>QfH#tlg-1kQO#$Z{|GdotoWs4yWZH5rSCQX z>^J&r%LZ2ozE!qavHZ{+tLJ(jD%J@C_4peMYjBeL(0|YzXq;vd$T(^+BAlJZABAx1 zSWW4}BVAYJcfxl?goH{p`))pdCm$c(koXirLiL^-Qe+@d{~>xy1eAns=1f9>0Nlu# zlLt!Z%6i(M9-|(+nl|FX*L#BUpZfM{3;>>ftczRW{L-tm5pMNE;Q;M59blZz^IwDm qRI>&+I9Nvq77fhiS%#~r1NsRkdCe|UYTv&A0000FVdQ&MBb@0R7-T#Q*>R literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FM_96_96.png b/navit/xpm/country_FM_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..5e001d165be00bb7ba4c5273de6476047ec4a15f GIT binary patch literal 1436 zcmZWpX*8P&0Q?-E5>$|At3@JhHa#>}9d8}cc*zn+h)Tsx%PMQ@IqG=o*e{f*tFF3A zMBQ3dR~?OAx^CJnZ5^wuBUDtSbybPgKl}E0^JeD%yqRIyP)%iF$}j)`WGQAO+XHw1 zN=eZJ{b^^$|G*@!SeTN4{jXp@EzbY|kVYX9?ZOJ)7YtY*H$D1G$GD5}nwT-$T?~6F zH63nNTBe@m*ojWgyl=aIXhJn&sr0*bxuw%@s)o>SaOJ8m3Y2Do~#( zj4FMU6$xmA4ox^CRtNidq(HjQX8f@Zh!zLdUM)~>!#m0d zt{Ou9w%_!OgitqcW2>!G5Yrr0rm+IXa9BM`!BOGwJEQYz-2)@knfI>3Cg(RvWzc6i zZ6O4pezc1!43H@;`a!q;`#5_-vLsp(P$l3;{Rip!mWI>3d}|e&c(@MvQixlZcC29@ zj>SqhjTjRHVgYmvydjT2>KRlo3rs(Bhh9E|Fj17NaG|ug&=m<=PuTX^!d(DEytBckt z3F>By|KteL(*6-|6C{yNEE7y$RP+N~EaQ;bd?grkyHc}Df+6iIb81x)}%J;@q<3XHuriOC-nB~d5Eei#qbAKE1W;@!B zGj5=jlb}<~C;uGY}ZM%l30-ZBkWkE?R0N-J-K@u2T zFdxIJ3~?{(nJYLl3q9+POnRQT7X>l|Ot=%V3VLLxqqws)mw(X z8+T)7VXE>3mgKebxMzn*yX5Xu@BDCLp=xi+t#(J@e7mnU{|4zAIf*eRLe=h`)R!$Y5m_UvpPCksc!Wxsh$^!+eLt zimR5&W@~6F+2vo$(HeLn)q=J9I=O#W%hDz{Kg!I?)YZ@`_ot7DrfHZHsgJDI3ekRwugMzmrU+tJdC8ZexU&@j zA2RVKlKS$W-1y0Qg)JevA?m!vENjdz7*5yL%DFhaM~i*Y>ki!r81T~| aq;1P}k?S)tl?#G{y9Fp@D(Rt#JMD0)Z&17mM>Zgg^aUq(+Zb9QF{mD0g(0wE9v;QKzsWO}ZP)VRhh zn)G1OdwVwPGA^VP42xp>^hK?9yBd>T$Pk7vKNHIN{=>kIe5;)mI2w>N; z11qzoG*7QLbW80<8y!`4RL3_}<-GoKHvG@!9k;l+wB{==uUt>^9(y%}qBn#tdl^Cx SEf1eymVE=z@FGr&0ssJb+>=oN literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FO_16_16.png b/navit/xpm/country_FO_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..170eb7ad9875783f516cc3b554c3beb9bfada4ab GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`Xo-U3d z8WWR$^s^*QySFbjkDD zN`;i2FB+!&Tl-g4d#O&=Rp)}tgrE1bIiDZV+kJS${Km${#PnIqX76Gsonsi>QpY<@kw;`J)CG)v?lWRXJIxrw$kJ8!gFd; zA{>6#eAs_oX!VhGv*quk$GVGYmQ8r|ajN>&riJn+7mM{o8Dufa>M$^PUCUltsqFax P=r#sVS3j3^P6qrwq{3O{YI z*z)sVN#(XVACBH_yTjUAUH{>I8~-~qmkCZ2gf{)WSGW78_FS72Ai1Z7w%hKkj<=un ld{5mU8AmQ8*tL6sxn!xzi6<$BXMz4;@O1TaS?83{1ORNPXQKcB literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FO_8_8.png b/navit/xpm/country_FO_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..14829ab116a83ce1e1ac3ccef5895b8a6e113965 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_cPPZ!4! zj+x0n{)547p{VHSu>bB%K0Fo-ew@d+{%f(Zv2ErrkKg?9?sFm4HO-Ax)0i1vYU!uH T4PTZHG=Ra=)z4*}Q$iB}DZDC2 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FO_96_96.png b/navit/xpm/country_FO_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..f596b5ebd333c983b468184b71e66e3fd0ce972e GIT binary patch literal 407 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlHoeLP(p zLn`LHy`$*o>?q=Jaasv`i|hgg7RI*H2OQA~DjS$h)-*+#H8?b_VrW0Cs8w)7DNCRw zI`Gn@Ig8!?_{8PS`)fSsY+CcvoBQkPD*w-!fBxRP^>Od({=E6|;ZI_5dYzr^ja{}k z;~w#x-n#J>&_Bl3~wGwCZ`leOf{l48=?8)1{|GpGCOd;S0Q@yY1 UH}SANprB{)boFyt=akR{04GX|$^ZZW literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FR.svgz b/navit/xpm/country_FR.svgz new file mode 100644 index 0000000000000000000000000000000000000000..58c9e0fc3491643daec2a9305ac91ec5cc4e63db GIT binary patch literal 273 zcmV+s0q*`EiwFn?D0)Z&17mM>Zgg^aUq(_cb9QF{b&pYN!Y~wtpVwcJ-94L|v?5cQ z%GRn3h7+caJ(f0Y0$nOiX7%4MeH*KLyzqVJ+!HS^Uky3S&g#|(;FJN8rf5rTY60J_ znmhurE;nV~v_=ZJN(;**i0`wvbpN?q5qqx5?(qEjk`kC8encr^w$I4>aYH!eh^s9S zP|lqeh<)GFKB8?`QmDk1(taQ^X9vBPRd=24m)78&qol`;+0BOfBKmY&$ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FR_48_48.png b/navit/xpm/country_FR_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..9e58d71e8caa5c581447351d90319a0061ac6a9d GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@He#gTe~DWM4f#GpQ# literal 0 HcmV?d00001 diff --git a/navit/xpm/country_FR_8_8.png b/navit/xpm/country_FR_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0d7704f2c7883e60aa96b1a6b724a15a82810d GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_bePZ!4! zj+x0R0W;1YI3Vz9>4vOT%*@P(&mTHwznjmss+CCw` qKtn==hl`E1xykY1fZgg^aUq?YMb9QF{osq##!!Qhn@00cpmO0a;>ln0Z zI*G&f0KkD`Y27v=BvTuf?d?g+pc`Un;^zGMoX=L$cRj5+557X_xR*^G0}JcT2c?3C26 zzrkS~$85O$#7_nq5+_UB2%Pi7xgl9MR$%lM$Wq`+;<8a+7gx^bc$w@!9`#oPr)7~EE0QdYJV&@^LU ZSfj=>@%tHx7eEsjJYD@<);T3K0RU>wDp3Fc literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GA_32_32.png b/navit/xpm/country_GA_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..693dc687afae2354531b52bca4effecab25a70d5 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v}~CPZ!6K zh}Ptk8Ph+^Ph?=c>=0%5sv(fQ$133pBM%VhSU%$S<5|Ki@jpgHTDQwx)&MM>!@j{K vcZSgdSHshj^@GHiUp6rIH$k;6=3`)ZWy*a&z(Fq?Xa$3(tDnm{r-UW|U1c#3 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GA_48_48.png b/navit/xpm/country_GA_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..4861c35a7c0e64f90c6cd42231939f67c5e9fdef GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HXWH5I7LPC)lxa)~o}3Sq1_2vR0Q>AK#s@UP1rjwYyp`Z!*@i2{v~)9#KdV zFzk?Uc~t9Gc6i|(MI<2}rNXmw?-pp3pMa|2Q37f?!Je$jvdN>J=RVLv22WQ%mvv4F FO#t=LI^_TW literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GA_8_8.png b/navit/xpm/country_GA_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..603052773284a2ba6864ce6ad4ccc950909b351d GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^eo-U3d z5>t~?W=#JupOHV|kow63Krl)9-vbsq)}DI3uD}e}D{Yz;YZEFzxt?lL(q{O7o_l@o SEU{{!ZU#?RKbLh*2~7a20x7Tn literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GA_96_96.png b/navit/xpm/country_GA_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..725e702a4bba941f29241fa1e70eebcca87f7fea GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt_yJzX3_ zD(1Ys8;7BaD_2ZrSH>IaNb0k^^n(?h4ZRzr*S!BSKs>K~@C3b9|Yu?2dY N!PC{xWt~$(698a|Q@{WK literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GB.svgz b/navit/xpm/country_GB.svgz new file mode 100644 index 0000000000000000000000000000000000000000..07500c719d29536930ec535df390f4ca5cbfceb0 GIT binary patch literal 628 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 RX`qJ~JYD@<);T3K0RVg?dGG)L literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GB_96_96.png b/navit/xpm/country_GB_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..cfd71596544a666c37f7e987d470d6f3e93aca7e GIT binary patch literal 1354 zcmah}dpy$#0RLq&*Ug%oG;4)@T(3(=Vw7bw+mRG`%Wf8vi&kElXi9C4Gw(-=v6x3> z6U|b&TZKFdS=?qs5AVn$vF-Hd{dJ%3=ll5U```D=a&>Xk+N8e;001o_0e5QMN#Cid zwyx*D4TrCr2HD9G2dKWIxVbzN0Mu1P+%fl%1LF(*GFtPg!{9lD>B#RBd3 zYVk~TaL=i^gs5_P-sDl&|IF;3YsIT#`@>!*IdrpsgvBIU=x^?m&kI3&ATKn6O4x?X z;zYrojxh4H(n67I@i+#b<3BSa6iHRKa?g;9xuUq3nfWX~#7O&a@FAJ@?)v-eAwGR! zYIAPZR#U&FG{wU6S%i<9oocVh`F&uTZQKW^Sl<|G?f5Dz%x}4~{J?1s^*Vk=T*W*_0W9$;AZ0}!OESoJHeQLaZ1(qC@6e|K?-!2j1A(CTIP2)hW z6L^E-RKB! zB%q$?x;#SX<2`TQ$hL(4)W-68E4mG@kx6T>x)x8^dUXu> z`ah(}-a6i!_;`Ep@s7K1^tSeLgh%AzX^1OdZ)L@jDkXT7{a!WdNUx(!J5Go!8bVloIItu4JXDxhFUyzh08+EIBq( zt3PyzZx2qwd@f6OK(jX{N>ZwO8CzhF0x1g+b z>~$N@ALx4)Ft7J;MR5XlL6VvFGCV`m#?nsTKus|xPoI0gPt|GyhsY8FUO;2%t7RIi zktCA(>*Sq|v5lXYPzZ=aMKxQOfH18=f*YQe#;Fppb@rULyAjO*zn!TKCW{%{e#nh# zo}StvwMsBNNcUgjJS}(=Z6~9CQ4+S8cpSD8flbnOl2fc;D5#hTGJA*l|0tH;l)FSu zFXS(DB=9%0PA?A$BCmC>qF4$1cIJP(#AM}x6HX76Uq_;{Up_0_EG`3cC9bERERkj4 zS$h~HJXgp%)NQx=bQdUbo0m`5?+KTt76#-HyC-wnV;V?+GgRa19-A~UCDF;Obrg&{ zdz)TZyKpi=9uDIXZciT8TMVOx#S_O3ol;W(-CBXQd1Z7d!p3pCS&tSa`A;=fIBlfwW2 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GD.svgz b/navit/xpm/country_GD.svgz new file mode 100644 index 0000000000000000000000000000000000000000..5ee64135ac4bd7fc1627df1070cc8b012c533acf GIT binary patch literal 1375 zcmV-l1)%yLiwFn`D0)Z&17mM>Zgg^aUq?hPb9QF{?O9t>+eR3D=T~gimoSx9d%rlC zP76sVGijSiNHcv@EMeRj+arq*^6PtcB^!$f%H*jqFfg+^`(1X=cXs8^9Q^#{d`>=B z^?J5kj1x{-LaN1NSU*-rjWXrwxd7O>bJ;tK@IAN5vKM}aP30%&~=4_m3 z*1-`xt7g-)W}L_#IxELX0zw_36iHu2$8}C;{V4vSfE6tgx=u%ZqwaZ40-$sOPb4 ze-iPjJjC6 zbW`x%K{u80uEJ?16sOL4yPsSaY$}D5+e%fFErXqEjLubo!SW&-D?!s#4+yl8sZKg-!-gz{AN2K_d3va8rY4J5#~6&xZ<3w8@x!m_?>L`o*L0@n7k%RZcyd?7Bzmzb|}JE zGR)fPq~!enF0sIo)ZE{TwXIC6vP=p81nzBaR!J2g4o(Tsh@g^d_5F=WU5xu!J z2`um@HdE>S?1$oi-7a$I+P31>YumR2!DNh?N-n5C%>4&^d3H6Dch$&ys=2co8rIOI zl_Drxc&a>CqK`^PZ6rtOmTwbK<&fQJ+qZ?@y~As%k7`M+G*YD+JS&HC1QaFq9{Ex& zIlOEecbiRfMWq$W2NYw?H1mC1fw)E*(~CQ_x1BS$Bak?p;}hqzj8oBSFl*Cuv;V+P zseq>MQh;PsFwJ#pm8Ht)SSg9I=h}!qiuy@s6iY3<3}`kHbrkjIu5W7%)yA3|aZzi0 z9x^Jm(2%pr#Y!1VEeD=jtKum&{cHvb;7kVvNa-mvO!~g9f-WQq(vLf^xBpat!e_Xc zHB-W10m46Y1sME1Dd64;aEfv+&7%^46;A@Vw*Un5Q2~!i0QyM)-}4SY^NHc3P=I?< zz<0a@9*+PVe-glVyaOJQ0Ms1<2pcv|8<#52(A{}-R!2l|4a&8XY4{%7X(u=lcqs~$ z6j*4It+18|i4F_IJ7Ab~QuyEv)H|($x26USnFj_RW`swc(7`ziOjydKbHE%2?TT}h zZD>WeeP{Au`f)U&{LU&c$`uRjXo%gThYmb4M|13@9 z(a9imEjW5#!Bp_Z*fFa@CoNGM>jdhGgDtpI;MP;i9M`}+GIATbejH`gDCQQZf)XNF z3LH;q84-9tDij$JS-2=&h=`+SL+q#uho)WxZyZByfuzb9s+f}!d1Boe`f}rO4KQs6 h_x<3%A47H6=6^Q%^lKOn literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GD_16_16.png b/navit/xpm/country_GD_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..c7d51159b74c511a2b10b6dfbf9bb513a6b1a9fc GIT binary patch literal 540 zcmV+%0^|LOP)CQzjZtTKniVZkmLo2ikscqVVfy625B+VJ;a=I9ex!8Ag&Uc>g{k|6t zDe2?5Qs0!vze(OHiH`XY;NK;ti|CkN-)Al6`UF7g3m_x_gaJeVfPkb1?F=dDieWbn!%Qr;8_gHlIGK$2&qROpHXG3XfQhJXg5)V)`KS>I}e# zrNO7>9ml8b78F2C@$(N%Mg#!v(`VZgvJuEeu)00bMPD{JF8x`KtIP{a0pM1sTcLp< zy^$yY?$VWC$un05Fu=UExdR9Qc$xb=aOKjG0YIf00Wccp8`+OZ&BiJK7-+tKWIoxQ z{QWoDF(Fh+KQGSiB{jRgB3_ egEW71F#iA|s;asHu(FZ>0000T literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GD_32_32.png b/navit/xpm/country_GD_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..05de829408c7de7b6dfd9be9495dff88b39985c6 GIT binary patch literal 1070 zcmV+}1kwA6P)|Tk27&TEa7b%iHYyq!*E%)Wtt@mFM|vb5Ie-iDVVwG6$+zJinQF@-oIxL zU3z>(L%}n*lIB+)&fyN#MeY{IS<7O9#hWmaMRC`yMDV+ zaqae4$x*!%;ZxK~5b{vkgPFAZz)1IehW>6SMwW<#>fnztjo{Rb^Fc?!oLH)7Nz{7T2UCS|sPw(&U zkA(yUm1m950md-!pxtau`EI_Lf7xs|=H~!lhzTS($B#YtJXX<=kP@sP+zL;nycI-D zPjUgjmGn*8K+I*DxlBvX5db{iqI*WVE30b^+UVRzJ6FmX#mP&2NsH@9OrgY}b1LOM z_-o{^th2JZzJhC!_$PaxmXlU;)Q7*kmSYH4SaOA>+!ONTaA!);4~!wy9=L5H01UkH z=U0EXrpp#Lt_!|*1b<&10FVuu*7@ZYsu}~e0utf1v@L$$-R|NHsmX8b{4&8W5y>HY zHPU*6`OP}sPW&|7w80yUR=U9o1Xi+0*+M|zbc3y&V+d7?lgTr&{ZIEf7q|2q3_A1I z-<|a&lxLsOfWR9SZydk-{;k&+x$R5QGbb2$B(dm#U+kBRzcFEK(x%q4^ zm1=|FMYi=K zTlzL_IKc-madgP^ZEAXw**`4#C*;BvIOjrRlZ`17W7SG!x`@mGk^b;W)AOK{= oGOK=HlEwg_i(nC9t!pX%1?yUj&W)$YBme*a07*qoM6N<$f^4b+YybcN literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GD_48_48.png b/navit/xpm/country_GD_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..6f4f0ff719e016f0a830bf39e22fcf19a297ff46 GIT binary patch literal 1706 zcmV;b237fqP)_cE(iz}QLM@mp>)n#K)JN*_4M4{eW+7< zIJBo#{C{ZL^E~f4zw@5=xtzD?u5}sc6H|bNXGqgT8Zlsy!`fCR9}Ca5O>;%)^aB9v z2mE{{u0m!jpQ@5*rxOyN2`vMMlYy{U)|dW1%1l zPn=|9U$CUUFjmmWeiK(I>AVn{9cAwK4UADq;JpwMLPYVES92RTL*K0^|GjCj!W4RI zG>-ztJ)NsgUwQcQNZdkm1u_~sYI`QFZ-=I5(%R5b>k4GdKB!*#GXlN+#=5gliWZvY z?31GHH`dJv>cG?p#i&f|wO1b*DqA?3BSU3-?bT6PK6 zwcf5e@~{kJZHGk3>XggY(zV7f=}iqu<(H_It~IAzwgf&&vS<55ZsYZur(yQ>Y20D9 z@p?`BL~dfY^?qiLgz7uD?2-mmba4@w~?C zHDeK7)2z4s2#D0~?$tk!7N<({(`fPT?$tqwOzxTz5CBLReKk;dXmI&_0iu$E(V@ZR z2L~!s3e}V&=!fBV#v+DaYVNb-i>k*v$>*n8K#>0#&z8QZzPwC)e(Sw+?!r{hub!c7 zMx;=Z893)I+}62%N}vINcahGvOn#K)ousoZGx|3P08;|Jt#f@EG#Wq_Mm)3OUM4kf zKN?ftl%>9-ZX{@&ILRpy#4eNAa#;zZ@l)(b&{*G5*EeNJgGK|0CGdx~XFbh!TSk&b z*cr%Zxvx86rG8|d2nzt75c@}W4q-?V zZsS>oxZfB7z?jLP?X6Gh8@lVwas@L6>rB19*3nRsr4X=DKmuDP&s=6^t{B)d2`C8K z^d@CpKr%)j_pam%(Ycbs``$#gu-f9kv}?dzFDN0xbCmNOWt9+NsTVHo8mPAT-xv@8 z-1BA~8eHx-B)ZWZMU$Od`WJD0!M^CsWd_R#OK9dQQ?M_(h~qoA^zSH|d}BaK)mrL4 z-*DGNO8~$wl}nEWEt^Hl7P0hL(6B@X023{pZ@Al9>Q3Y2sns$9;iIb_wUs}feUL4a zOTJgfBZcsfYlq%7hrSuCP*N$bDa;T@Drf2(Dw@PynN~f$}rjLpz+MD|G40^MrE}#lisHfRpo9j!JCZ^h4Ur)1rnZ6g|dU2` ziw$?ow8lzM1C<#0uC2G43#S*3CZ^`X=^I=7ON{EiG!AH0w*O{xU!^&?&@?esnFBYQ z`&MPgRpPiUz0pk^ZJf6Uq8Ka*+C_jM0RWVF-V7291OPFFO1mPjoM+o+8|Er|r!aGc z(KK-t5?~Y=)@~3I44f-n#g(#RW3`ymBFF*o_cE%j>WoU+vPA?8h-Sh=>W%ZPIw7Y; zkb@9%(31BJZJbL!WNwnU3W;5;%-uMb{b1cLSa%5WoVE-Lz%Ev}3d!6gNj_aQUte*> z5V%EQ5qw?hEkOW?x=G$e@-8y!)_7$9cGFmdfSm$;I|3=RAHxSsOo2w$Mg;ge7+(j2 zv`$9nE5ip&pt~bNdjFmx0F?hfHBFGvs%g^Ff3x&@0P%mhjQ{`u07*qoM6N<$g1n73 AG5`Po literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GD_8_8.png b/navit/xpm/country_GD_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..d150c5af686cc83e431e7a5050a1f42819895635 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v~0go-U3d z95YSNZOl3pAkzNv|HpX}+*w(ZoxI!il484Lm)y0oN)cg+{iGrL%SZPKW0XkG(q#7Z zl>#l?oNoE+jywL5dvM&{el1@^_d4C+riS&Yzn3$7__Oe4-RXDDGSBNSAN#a7?qb{F zO#8Us^RjKOAIY|#^KENlntPmHsmW_rPtTSUU)BgPY*VdJXL{1gbkXr5XNsU#*R$iV zlL{s?{rKa5?7lz4l@IUAjG}C}8SO3qa*uP>vz_bSPG596Z*A_|Hii}2n$x%r2%0K+ Vte;}NS{vvk22WQ%mvv4FO#riLb94Xz literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GD_96_96.png b/navit/xpm/country_GD_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..dfea6d2ffcb098bb8a7fb5938dec0a013b0c762d GIT binary patch literal 3546 zcmV<04JGo4P)ACN)tT)0w7eV`@64Nk?sBZ9x=Y2!d~Xp|A)lpo_cg z^X`50k6n2MxQ{(|A^H8a?4H;C-E+S4{m%K$0kzI>0B#T_N%SKP84(2_ffSBwr8320 zFA)F|E5nG=l99>fnOt5&Mnpkkr6ykGpbJ540ng-Uc}`QlXmW@eGBUY5TcD*zS?EHL z$sw}&nx50aGY+lHYN}Bd28?Afd4eHP0t9ppZ!JdLbpil_?IiD(F%49@NM(osU|A?g z5?Ge-0KoMS+zpxcXRt|(T>t<}QJBu3>FOzs42>@X<(oB|^w`GttNkiXw zju<*$v4GsGB@-n3dtUl3Vd$GsH`)HQSs0Y--~?p9;Y}zV?sS3=U0!VsIe zGsaYPR@0CY9h-(^Y4Vg~YrIpDF$KS!#%ZJh00?06gx-%BTX~qt6Xes60BaZA`>4nV zRT-IFA$XZ|A2Oz{3IPF12DNfvCWx6W4%8ZZ|H8O-Q0dPEROBQ;3d7YmO#qPnJFlwe zG$xB3FPXzG!k8p7vqii%2DH?0f{!~hesyVXEwqgL>xA}<6VcC(-o5UuT~asaew`pmulH=k-4&A$?Y&^4|QsBJ8WFJzv!cmOxcu* zy2jq#H%N9e!rUhDDwzAsNHjhPN zdKJdyMu1*XU%aa)O;f|B1$OnMt*9@)5ulZ4QD=R9Jo)gU#hWi>schJ^z@|&t4>|1zReov?~NC;RvljK7jUW`o!}S9 zRfiXEyr{9)Yj<#Vbf;DAE$$6!+TV#6dV|!8y~R7awcE{@Jium`t-QAMoW~qXA^PE* z$6Q`pdMvh?H&z$9!^c+CmF(|VPk9%Y>ee#&=3Qh@w@wqKJLtjy(nDR z+L`&_{-Oa6gZGa|WN{*TylGk}+lc;rqG{12`coCKsnCeBeX*Pp7O?^>!L zp%+@`y?DGpgG!VwS+o9B1>9TD<6+~)ET^B{T5{4vPPV7)ZzKKZ4FF&&;7tXSrWD9W zj@%Q6@eA=G2mp3;r>)pqyklw0OosdFuYw14tv3xe83_siK;*z$5}xx)fV7UY{d^-p zKXkA#Munvu@cYodwzBb*t>8!P&sheWi~zvo33RRi0E3Oj%g>v?8a>nIF_+hs z#El(LLePWh{o}rN4e0c-6?G;1Mtdtg8`w}s)XK6B-sFf5uHa>|=iO1x)V{u?irSJm zdsy-Wg+yX|+3{2w4@U!>@xlE?TRWrvuJ4rL_Wy=gl-PWM$sdlV8`wkn&qR$tM1RKL zN0%pv7g1Ttz|n6XE={?OrAkgjPc$uxDBJ$+qx=`vE)Mme2>Q3vk_2l{IWX!^Rgfph zY!CoojyYJr;^;5!U07<3DBIQh77R8H&l1QWF}XaGBOt?wFwnz>)%zB_buM?R)(PYZ zvKgZh>;@!lUefkbK?kn7yAQDvKinzkY!Oj_D4?^3CohRdU58D$YSaMvX+CYVgFCi|JO3E~O)A(lvuJtR_);44cRh`sLQ zKzLv`)&J>)IbI3LuSOEE;dezdR)j8bk-dWrRkna0|0YD{OgrWFOD^;i^;K_mYhnJoU0CusNe)Sy5B05MzYwlOn(+*{{!ui;qYJfC_;*&|@`L;!GoNx62@ z0Knu4fQFJO4R+E4@&vg!F0ASIK!8fXMXkNVHHGS;Fu#al5^hJ)g(itLY6}_#7 zp10Yaw;A7Y1DPPv=^_9S6yz`W#a@?YC|Yu@IpsLepTv+NwNO}FZASpDF-8O+X+z=p z4dv&o#bE$o?0l%3aQ?0IbRH z+*W#$C8uE8S2{s(BC0vE9^jZe zN24B|ed8`R_=AIm{h_!jL{IRCE>hxe1vH%ad{U1fvU#xR18W` zA>!nN{W$CTpNme@6BrRPLCSf{r*PXRnGWw+*8F7CqJMOy>($&5hzCJ63)^3v-!8j5 zVwx|Q<|{gkNt5E%l9P@E-?}q)4DFi~`VwR$#P{xPdpxHbd&vkv&4Tv3*uXO_3v@ke zqhrxFV|drn7CqP*!V|eYyOy>LEeh)ay$G6P4mMOBt)6vDr}BqTJ?qx~s-`*SpibrM zLQr9n`%v|f1vY$ZMw4QpZSYX_k-{Xm9);s4=zAIc^~;;mnGp7pCqX(B+Pl1IWkx^t zk}(tXOuqB8@>a7!-OT`4U@-`vm$$CY$Fp-c1bnxoAZbJ4`F9J?kyE590f0o(#zM@> z77sxtQrKR0BBDR19BcABx0jumJQhhgFc378;p$d2J(SrSdr`RXP-buK@+K@nDX|h% zkl;I5eWXaA86*}IC%X?;A1O$PRoTWw(6UrlLsesrd756(kYf%sR5dP3b;VMMc7h(s zzP7uvdB#`vU8fahP~qK`&5vYjzdu3?K?p(3!uAh~Pf^5FpIuP^ijY1mK2@_&UM-Ic z)dW$5^g+?-ngtr`n-WBn?FU7tHM~)E1SJ~7Uo2~WET>0pHPZo)<@9{9tT|DovQC*}#s?11k9pRda?DTg9jt1+SFvBBh@c_Ju|zq6v{o661*ex7%AXGM$EIAOTcggt02 z*TG#N|9xSmJ`I~*c$u3pwpo{J0+~EP+l9r(BvFzOKcK}2)m-W1&}B{9RvtDcX}fS+ zVCQNH?lUHdwz99$mF;$cQF$M01SW^Zi^Z9IfyvipomUrv7>B@WyPDq4k38+8943dz z>O&At8#+sK;_N~027@6{v@PQR0i7Y*D!IX9MkN+EaGvBn zV5{Uvt4LZ!TP4SPK$aZ<;0KVm#b~SK=nN4M*p_jIMA3Z!=YBd)f+QX}e{1G?qm11A zoF3S%G}!6dM%H&c`e44}hHD#@9xHTxN!|QB8c`a$MmS$Hk32yXJ22ZIegF-f5p*}G z=;soTJdM%xo+Cz859vM-%@{Z*{~s9C0>6=F=ZfK*1c+lppXD<;c)^bZKVnt>YYkJr z03w8M5!z;k$$>fig|tYdS!{pWYO4&h^LPLi;na*>aK35=1Q~18oquBI@z?*vy7wFH zTLww9B=~T4BJvk3&a-N)L+~7-0vAdDSp$Zgg^aUq?kQb9QF{ty5iZ+AtJ-roZCOymS)5Hjs{> zxRnYmo3sz4(N25Jh?7_|336OQ`|Ecd(~42{GW8*eeLv1QKG%t_c54k=X=+uKg77{g zAj?&isxlYkZh0Gw$<^gq{BHJby8OAgfqI+6;_mwMrzwzt(jUVqrL*M>zTeM*_c^6E zUkQ-H+RcR0rfK@kuwR*+&P}o@)T*XfNL?W|Q3T_>pW2ilg+oR$Wi3v$4;W*vocNN- zPOI|wsX`t_5pA;s8kO2Ykci=-3aRqK3Uc8#TP2(8Y9~m*Lk0n742Jk12@2`NR#`1C zZ*`JGmBCyhu1aF+!)I8K%B;r1PMm{E1*zAG)+Aqu+NE|b1>>+6T%c7)%IW{X by)Bv(_omuTgT?O0#+&g6O%68mj06AxCbkD{ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GE_16_16.png b/navit/xpm/country_GE_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2addabff7dfd5bedb18773fd46d0c7e60ce2d738 GIT binary patch literal 323 zcmV-J0lfZ+P)2wzMmk?d)hlNcGlG)}Ppz002ovPDHLkV1j?lkE#Fw literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GE_32_32.png b/navit/xpm/country_GE_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..8c315d38c1a69b43e1b04cdbc1e4d5f08ae22d1b GIT binary patch literal 670 zcmV;P0%84$P){rZ@|x(4U+4SpNJW)q=mzUjBXf1XCQv2Y(+v{an%U@7;$#_a1#J zXk_^FmngIU{QXqe^!NUwe{bJ^uITvt=ozvkst;J0zs*_(VKTC@@=d5G$^sVV@5?qY z{Qkqh!0_kdb*{WboE9)LGxN{t_`Yxrv!pnyz4`xNzZuzB37Y@^*KfYQx?cy5|9km{ zGcK5s2_;leITE5AAzloOj0{{HoY4Wqn9jh!z{tkR86CjL$;rUX#1Z1fBq55^2N1yS z@5aQ(LyXbLfX&9_{}(MxaV!>aC5Mx0Is*d(N0<**ahhi|mfshy5u@(kvscL6KiBU3 z`|ybvjf^h@b;)rU(O_5>cB2-c0>)qGuM(r~-?LXAV)EczfhCieq{N8P$iixXC4Xar zzXE(H+O$*#ah?2a?#dslw~}hmk5yZ~&s#;51wS|K{&nmusTTY?dgjOGJp?TH`|RcS z<(nA(|7ZC2{rmh?|9|}^#_0dQet%!En&JC*hJXLQFW>a`q0gg@{%yk3eML8?p!1_qHUyP2iL;Zmse!JofeS#iIPoMsXdU{R50`2B~06-$MI z=>x9#kUw`G{CoG2&Bm1BFG^DZC5V{irFmOQm<0Kmm1KFls)#Wi;#c0TDrN;)CSgI| zmJ()JDP&nJMzCloGl>clV>F86q$Lpk_O z_d^32qsQ%EenmH6KG4UKNt!dG0MVSul1V<01;BgLETuLyBtN+mkEmAD zkAA0Ra`xpvgk`(=$@;MBjXPQI}$&T32>L@$pr7svF#=R2tlD-(V0)X0+LKKweReL-IKs@)WpbgDmqN?#$l5?bY6AtS4HTq!;?4D;lb7Vh*d8_ns0|b(*%za8^(HuH zN@slix|S4k?>->Q22tYeh8kv@7{%jE1!V?-n@E6T9JOSdmx(K0#xtM3;|)T_Z$mWTroGqV81Oc?-6CZp_- zmoAEB05nrxC{eHAVS{`&(3Iw<7n;ma*6qb~iKkPdJnK!a>eXzw7sV3qkr_hXI{3;o o07-JQnjgtY4VPVWZ36}ADK!x7W76eLMHH z@vhI+Dn0F)Y0dS^cdp^Fd)B%ty7~HfLwyIAgtEmK izVWkt@6Quy`pLdMFyL;3dWad&xeT7JelF{r5}E)hhg_8a literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GE_96_96.png b/navit/xpm/country_GE_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..a8179abb7ff4d961a872542ba54adeec62e546c7 GIT binary patch literal 1747 zcmZWqdo&Y@AJ_7j`LSt>gkSL6h2AHi3=f z5>A3Js17?SP*OQ5gQ|~+N>T^kf2@cak|HK048hOHCn21nQ3xfAB1v&WEm_SDDc#38 zC#lvXv}-kfp8k%&epPFFdTtYCTKis7lxNa+o87ZzmX{s3o=4mZ|J8n0iO0=FYW2Gm?6Wy~`Zb3iFQ)?zVB*C}&|)rXVkaT@VL&uUTumEtlxyP8q(Mr5 z`Y@%M`P`-K<+RQS6v67}K6oTc9I?!hW-1#Wa`gTJ>xHV316HC{j%c}AoXNU)x7loM z1FDV}4<npr7CnktaHyObPfs_xgIY!11T+ucI$N}3D` z{jim3)YeE!tm6TEb(<6=B;E`G)2wx-m?isUM8CsFu`Yk(N|2TS9N4b0Y^9PiO2Qa2 zD>d3-$WE!-Bw9qUw9OKz*!RwGgQ|i4v1Pw&U3yzprtNmBE{dnr=J8aY8_m&;?9K7P z*_j){p&xc?YP0h{Z-xu)F+CG6E_p^32)q3PKiaQ{5ChFPqhKj~q|=J9HntAAx_g6V zIQW%0U2wF^zmDxab`L#vueI50>=R?@*Z*(^oIRCM)^OURTwPU@c`pYkf*g^5DK*(< z%QeQhGgl*0UESAM3lo*x@fZl7nw(LuYHfQmEaXv&G1YKoJw<$#cvt4+6CZ(g29m?+ zEw*;H03s;l<@^*^>{OpQJ%G!;rSg$|T0Pe%T~=sO+uDYM6n1^qT%f6RVmst-yZ=$>QTKp|Gu} zS131a(Cc*hyQ;(H_xre+b$Up;=Jj&Q5v`+en4P+II`5NrRWX|&QLcbbRyY|W-Z&ec za`{Sw6{E-sG(qUzn4MO{{nH@+Hc3tnVe8z#XQlE0t2{A^W|pQa`L%15lwQ?MEkrM5 zQ1;tz%<&K?>2=e$Z|{eBgc|ez(X|9%U+&~v#8~%=#?)}LAALKUj|%5slYW@pYrWeq z6Jq#VCOY5mzpU^l<^LV>9n2W9s|Ybd~iJm&@acQLt z*3P*LAUsxDOFq{F;doCUdj_Z_4Zo?FIHfOeI|R;|KjD}q7xCPq#h}8!!3T$WGM<(E zdE4D$PQvYD%IDpHNbh=uJW$@+yBs@o=J{La3VD-XP*2k{GmTL~|`L@mX! z&)$bDbS5Q^qztalZ78a^*-UJa55KT=tqCpfuwEk}Kbkr;JG`o2z4J>{V?WL&8Jl|V z)p$jJK5{_+^uTfdwKkSEGGrr$?p0%y!YX1G7<;C!{t`FY6Meu)w^g7d(-FASx@w`) zXu7^ef50ghR0 z3Ywg1IDp#^S@#RkMS6Y0=Tt~<`S4Zgg^aUq?nRb9QF{b&pYN!Y~wtpVwcJ-94L|v?5cQ z%GRn3h7+caJ(f0Y0$nOiX7%4MeH*KLyzqVJ+!HS^Uky3S&g#|(;FJN8rf5rTY60J_ znmhurE;nV~v_=ZJN(;**i0`wvbpN?q5qqx5?(qEjk`kC8encr^w$I4>aYH!eh^s9S zP|lqeh<)GFKB8?`QmDk1(taQ^X9vBPRd=24m)78&qol`;+0BOfBKmY&$ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GF_48_48.png b/navit/xpm/country_GF_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..9e58d71e8caa5c581447351d90319a0061ac6a9d GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@He#gTe~DWM4f#GpQ# literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GF_8_8.png b/navit/xpm/country_GF_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0d7704f2c7883e60aa96b1a6b724a15a82810d GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_bePZ!4! zj+x0R0W;1YI3Vz9>4vOT%*@P(&mTHwznjmss+CCw` qKtn==hl`E1xykY1fZgg^aUq?qSb9QF{osv6G!!Q(ucO?G9<#qw7ZtN6A zaTQaE*H*z$2F9pyVymfLIVLImdYm=^39-Or-^cmRvE*!d*wxTV*Jx`5vKd8?W@8I& zDuFNSN0Q?5=KL(XxPQ7^zdk=e(^h>Q4(N2@l|W8|NJ(8OFEHtgR?F_z9t0AW0%0-C z6Ns-7f|qFoD)0A;DC)Xy*3Da z{)}-O8qtrR$sDPwUl zHpt+Tj9_EU53Ua2-0kpWK=?F<8d&fNWFD+Y94>^1COLLLM%1L_MZuCU+FK*x`0Ryp svJCSh)w|p@rFA=j&idTTOHQx;tRepqv2+k+(dkEg0v`%A$w~qM0OkpxBLDyZ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GG_16_16.png b/navit/xpm/country_GG_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..7122ab61934bb80f1936bf7a54c5f330e2aef959 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt@|JY5_^ zG$yW{WXRX#AmDmmk3~qxRGL4*G4&v)P3K20nS-~oCAh1j{G7d$Jv1C#B%~J`>ab2+ znfC1b{GTV~Qv^yUJySd78>0SF;HnSL^;^7sPbCi4Ej)ckZ}ah@e@`5rB+}y@-Zyn>5m#6>U@|&>xl{fE;Fy%d;9sW&fx%yIx xuiIkI@s~5>4&Ss9)HZTj;pd%DI?wqM_otecJ>SG<3jy8E;OXk;vd$@?2>|RWVx<58 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GG_32_32.png b/navit/xpm/country_GG_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..d87bbc4272acee9fac2db64fc10b9ce092e5e962 GIT binary patch literal 373 zcmV-*0gC>KP)v*E=SK$jQsx@82_`m z{6G_DkNWmGNr*HHSoD9h=zqj2#od8j94i>O!tT!nw(qmJ(FA#WKm2E4{8G%1CeE4m zm1GOPHS_*`h%Wo@GZO;?!=F=Z=!#$A3<;bPn5N?ae;?qEOYwJ?h%sWcP9C)YHz1`> zW@2Du`43^x!~*unZ;V3!7#JAXBfc@<%()a;@N+5G&!y1vmBXJ{T|+;TX>I`kj}24> Tq8~Kw00000NkvXXu0mjfT5YGX literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GG_48_48.png b/navit/xpm/country_GG_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..2e304c1b17dce54f87f11876d359686cefb74ef8 GIT binary patch literal 393 zcmV;40e1e0P)D=gRvs+J%&JD95_l?mO ni5&;X0-jTxp|FS$Msz~o3&2c{=z0rF00000NkvXXu0mjf5FD?k literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GG_8_8.png b/navit/xpm/country_GG_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..95f04f6a4afe1b895992545e0add2893f17ebb76 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}@PZ!4! zj+x1S{{OdU27$xJj|j1`vHkmLE1<{C%wwRrC&7Vc@u<>!gVsgITi zzR~USJ<@~4I!p%uMYL9*Q2_8?0tm=+FPR}&n~{QwsWr5$@2@A?DzP^eUP>LO=7)b_2%30ucMW?*T%#1(7Z8Yna%-L!GPn+u7{4qXgZQE5WXABD86&bd|&FA0!P(TZ6tbPZnQRs45C%nq~=BJ6T{HA?R*laH5 zy5Lu0R<%A`dG7h^{72K~p1#08#oR{baKOeu{*>MO>`utqujkLZy8Qdp`HLmg@~-_~ ovb+8I%lkVZefEuUq_3xdd`PTU;Zgg^aUq?tTb9QF{l~PS_+#nFWN6LRd^wLV+F$3ny z4b82m_SXIY$7a_gUc9ntyy>qmjy4B(D^&rB86J-}12cE`=i@-0{WOO$I*Pz3@v$Ad z5D$+2{PA^XD4A0eyJi@pcQlUl{>$yn-TZtY`D&c&>^a(}bgIj8Sr%9XjMJgyjIlDG z(c7C>-hVjT6qeAX-qA{CzxUzLCr1Tibd5auHvN-;nLy5t=Jmx3)(mDE_3l3TtEeoj?a3PH(-?-FZG_zs@ zDhY~bp5!1DN0T8fKxoVKhGz{_2KiP|8$hj?Eu>{&jggo^Bf$!Ws!&*gxoBR(D8>Mp zl_Eox1cBC68=e%vw6M5QynfAZO48KCc|T4^M~_XK!ucbDDp;PY-Q}VcJ8cALZRMw{ z`mN*hoTl-~*D<%_#oxVFpvF^r1BMWN+nnl$UulCqjv>~^ko%z3;+1RP6u!IDh8EfddE5AN(OcUFw*<_|bx6hwcgQ zmynQ@l$dkoX2EWT=||p}-j_^U|MwhF-GK>WhfYoqI@1{{d(NQa%cF!JA70uYK7Rhc zq>_!LM>!+ExN>t3i}0LYZi9O^I>j=xk6d5>e`egizo&owmuGHn(fFL7mv^i_f;ZvB fHhJGuB1{aNPc^@?q{)FDOtu7`JijDQLd3r}(-XBLr0ZoH4*W5;zZ|%z#Wa5QGsy7-yM6 ze+O=QF@xt6fYZzO9XM`}0C49e>#KTGYS%!2kWk%v;o&LyHeOzIIB6E}Tt^F_eFUEC z&^jzoDt?8QijvlmesUuKfM0f~*YcnJdM(e|vVL;Na0{+(Bb*O@r)yq_MgXNC2xFRi zvjFVu4^aw)_#?nwKVi2q!{){`0Ix&E{bRz4r+*BhaZowa4T?sooS2m9Ph-CVuwAvk gVhgYU3;5rFH>L+ytLR}OC;$Ke07*qoM6N<$f;^(1$N&HU literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GH_48_48.png b/navit/xpm/country_GH_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..decb4e5dec8dfe39cf4d81dc159f7bfd51a5ff8d GIT binary patch literal 489 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@Hed{<(#EUH8TfMN^~(Y+w+dd&3$~nd|Hpy9pLd_HJa<@eI`iZgsxkj{FZ2pM zTG&#dp(y9o(GFuCF={&!oaL{}aM6)-zxs0LpW3UWL%gQQEL`N-y-Y^2e~QRnAI^!B zRGe3M-aOjt%8+$Xdye|U6KA^q-b={mO$*ccXwtsj$NWXnvU^K-7`A@+bc*52_lf8E ze(rfI*`QMM@z{$*H)!^-K-t9Wx+ni%D^~#*1R`#1hf^OgDD?MwZc;h~&tsVXHLDnh#Nt#wyIwOuRP+2zjjIZ?~r`B_|5dv}ji=38bb00XgCg1KI zb3tC$y_$ut$0RmdKI;Vst05P!KP5=M^ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GH_8_8.png b/navit/xpm/country_GH_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..38e49325ef2bd90113f341b17ba943178c840acd GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^ho-U3d z5>u0H)K`3)&&Z!}Nd4piAULG=_d83^=jZ?H-PGKU{Xelw;(v@tbM(fP)BJ31ZftEC z`Ft&$Cyv$r{5HRFqTp4oV{=~aI-WS^{{DZ4h6V-(8#WpKZPrdWv2FPoafXApBr>yG S52yicWAJqKb6Mw<&;$TII7DRt literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GH_96_96.png b/navit/xpm/country_GH_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..5f51b2048ab3a970862a7b7f5b2bb05150240e31 GIT binary patch literal 944 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlJ8Q$1ZA zLn`LHy}93CI8o;K$LH@}@Jqeg>Y*j7)5*e~a>1qPVk3*VM63pL=P}Ml2eb;A%LR`% zE^+zK;At|$z+k5Xx6p!yu8-^j+?;^|Qxo3ZDqb-~W=l=VhkfTi)cUIC7RBG&`+Udq zfMw0kS+sqY$~lzDa6E8eU}v%rIMB$z$5Nosz|2UFkjAr|j;glWmAyTSItpgG#LsqF z%%ONJz2~E3a}}5LPA1h!Zc3Wr3zS|l<~;Ir4qVZ`VY0@AnPQi_)4sV*bhAAx*Eubs z=;WQ7Tg%GU{`{`?Rp++~mx*DzOobwIC(~2C^Fgu8Ed><37v$eJ_CEdc&Fk{{muKG= zduwC4iDlLt^R;``rm3nuPqpk!;S|}fzj}ws>N6Mj-guY)`q zEXqxB(7)PWduK9ZX^KPnjy{E*Y*)j?_tvbL{-bZBk5|p96Af|Ez8ee|?ew^QedoNp z*KOa`XFVy@K3rQ>JNI?H|5Wjt@f)+J-*w(wCn_5sdNg4D{*?#co(TBKw!mtGfYPlu zZ{L5D|2y+vUj3Gvug}<23f^Zg-6B@L^*7hv+gIPc&d@C@ns@j`zKAy0|HM@~%jNs) znv}OK{J0aFun@$bpqm$cKbw&99TN@VKY<=xKo~ad%COtoS})7G&^r^>bP0l+XkKFkYN@ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GI.svgz b/navit/xpm/country_GI.svgz new file mode 100644 index 0000000000000000000000000000000000000000..0446a7e14655604dfa5e4dcb7f665a92a1bf88c8 GIT binary patch literal 6046 zcmV;P7h&ihiwFn_D0)Z&17mM>Zgg^aUq?wUb9QF{>|9%uTSsnw-(SJdFLp(9rtg$cdO0z^2z+a{{GWhn9mN!#dfv0+HKcQ=G)!;FF*e2 z@xPp%&7SVpi{pAVyWJdL&HlRm^{`xAuV>%CIv%et&d+aeZ@UeH-EMz*{=@9-3@8t8 zF8?%}&7j%s;bOIXGUxKwH~T9pw_2XBuhy^E+vDL}cJh2)i!W>O+x3fXzdr14_RCcL za@m&LuU^)o(34wDg=CEJT&Q!U&Y;BE;obJQczd=zeAkdd2d7At5aJwut0nJO>f!** zyoUdm;)N@z_b-8N-EG&$^Jjm5cAiV0iEedVHPvLQUaLI@Zx^rEhwH_1eJD*3{q1IT zd&@k>IqPRkVsU_8 zKfU!9zn_uzdT#K*{o*&vA#O&w!i$_e)($iW_|eOXJ%qs6OQo7 z{HLqM zIe)!AE>?@FaX9tgFR~_0^O4bDZ1RXmT(2yPNCRyVaU!e_naV(!ecV=F#9! zms+?u&&YAV*dCAx!0*Lzzj^z;?4s3D*+&BY*L#*UMvN7A~22 z{e0X1%u=R`9L}oFvr;u6_7tmDLFxuR9N%5RaCv=R$UnaXhF|dNr;oG#Z)f|PtM$cp zxBU%P{htrV{q9%#T=T!v(tyJJd9~TDfw>niZjQ$m`=8xrdjYe&-e;6Pt~T)3g~`}z z0h(dIU%cxzf#~k#%ftG3A-b6Ug#2UaZYwb(rb;h6P#!}4K68WV?7g`g%{{ogT0qOo z56Rub|K2S2>(9sE%RVbERdk`%7}tyAt5yRrV_4Y2Dv0&H+3}sAKVP1_wF3ku{B5SR z?R>!1u9WYrQ+D>e1>s*dYEP&U-Cdw8Xn|9uK<$gS?gX>hVj8T@V5>%I=%sHkzB z3xhhRuu9wXaso3d{i`?dNpPw+jQuw2O+#6i-k3&SM;c)ukt|^kTm4P)!TQkqA=}3? zbOC;gy&tm%G#Z*w!S;Uzbt$9kte3*|en9mqU8jZCq0jU?)xdjd#rvs&|Bqt)rC>oQ0wdp*@kcFGQ**hML*VC{T^wweb!6yMFur3j0ni5NI2PF+19`a26S;^O=%iq@nJHii81qD}XzWPr9EhR|hP0NA z!a2Zn=Y@Mp!dAQg0>4@nMfGyve+BIxMjd1ciWmSIyghnoN5@UA48IyrWrUYfrLp-y3^dSDD-AKrCQbvU z3abHCsn3LRL8C>56k{Y_Lt-Da&8SY)&IsihgN`OFiPwPId6=J!%8;<=r7u{TWiQe! z_o)L6jH$hJp0Eh}w`)qGEQyJpI}~^o2PI)4Sl6r36=wITVcbe3G}@R-f_=>W(FW`` z!lKIK&eIH76e>*(EEd6wz-Y~*HX#_oq$q+DnAmq31j3VqMenpD%-E<5VL?S=qlfjC zWLxv8S?jfMVQ zm_||#%q*y(Xc3SRm$t6Z!KMLhaUPbkh%qUQ2=fgXw3(zIg^G1oFd*}QfD8+PYZkPe zlZvfCCp=PmQ#2neO2L|aLLUxP^m`tl@3RGhf$GA?Jhe<4Op`lCJ2 z4s5@>*{(kP$fkBTkTH+|lu}#)QEHsx3ZkMHTFp=FnclhK%>TZ@G|kj$x>N0XF+CdC zCuG`zLEQyQHeQROjTe-hf8-f0mZ|wfQ~Mc&wo9l~pHq4*SQ=VK(qz)dkmkFhpcu7} z{-qkP^&9c=9I&rc=4A$$h;eSCg-uOq9m^M`fp!o!qL zN)^m2rSmz7j3vfC?dkJjIISdDACAtFcsR^9my8`)acHp>R4Lu1f*RNwG@3*eid{Bg z3WiQ2!=7g?lQnY!jlO{FFB>C0N})S74dtFZO^AtTutATl2zZDQU}D00m+inNSa8ah z44ck3Uo!cU&7?0G_y@a#2$Q~Km<2d=n4u?G34$kByIi*XVJRjTt!gKn44zcsZX zD4c-v85V+bkTlYqLV10wUVl!Yr3P4*58OK_K$ns04ufAj!x?HAKRN9c^y~m6Etf$! zi`o#4K`j?MZ8fmjflVXfd@s$c50Ogrh$k zP&8u(T?tC0s2}vhcm-gEN`IeMtR0xLV}Y#T1gjW2;l9*D`fqBQ)U=vX(+b2x1?%Oc znzp!+8Y}fkQDYQV0CR_$S_cp}3A^V*U!5=z5H1`J8z}T0*jI{i=um}s0D;*1ye10< z%g@E2&=o1rV=Uw&$F6Gh&AY~JEju`2fw5A4M_(B)*j!10a$CYiNZ`s$mkF7+J}P88V^G11@DF zZeF|za?F3aV5u~j>Jkr-nA;F^bBy4!lbA0_NDXlXn=ZNHO2%W3quh_Cq*oJlHehMI zp{@s&Iw0GP`=jqPYA{b2W(85!k+FBDa!$Ow49#IoHG!VmoQ%FT^E`Jb;WRd}@jY!lUm}Y@nDo8UZQuptW5ta(LP#UYSwgOvDk%&@0X74IL;x-j zW`vZfVc`S!xt%KEHFw*fD=J}DF%t|X`y`Chs;V=S0@+rl@d0OKOrjZ6LY>1zCClO( z@=TQlg{aeln+b}XJ%9mw614>_n=+$vdQzKj2#eHspW3z|GBs>%lo#sA@};aQlWASa z=87_MyN)x#yrxh#)&*4s!d&6Bt)$jQnHqpOj)~Yr6%1pZI^s&AV%ue8Qc7R}6#C{8 zCKR*K3a|otNocOilo~XS&#WT00H#PE5u?3JlzBNevxIWSgEJr$T+R!@<)n~`)8VWe z$_Jt<*C+ChY~yZA2YL>Cu92 zoa$b0F_Tzlej3!~$@i>^GWXHQ9@b?0HYjx7Dom5bL~7ujqs`t)QeoIMm(xTiP%HbC zpA6dFryNdiqD}c3J{Xnsb5^mk*$gpPRAUPm6NZf~rS=-wQx)YQStnfLdd>&;UE_;) zl9Uc6WE#rNHE^tem8B?|+`HH3oc}@cK0kEwny}MsbzRUh-LHX7UK&2lL>Fl{0D%@EsBc_7!PV*OCzvuW3@Q;! z32;3hYS@9(2@y=7m|17x0K*q*ME|9MkHflgX#E~MJC#uUi4uS1iB;}9=M0%V=n?{h z`+2^95|SMxH5`_{K52X}_JUm{Pi;-s1(B?F4;FLe2)~GyP!L|Q$K#hSvY$T9|C8Tj zn3_HVhb}k;L`sW~c+7d;108wb&FNbz;`1zar>3P*pgV?cWTBr6Q{SHVP*4G|`Pfgj z+SRvPDj!#TeHRotEG>oLW#FepGK#La(WRtDjLiFs@7Ft$8ISqWgGW5I=>`3=?h9& zkd{j->DdD~CIt~P!(yNobr@8a2HqnMod%WD?_kPe$LNy5d(I)5$7x)qrnvC+h#-4T zZ6|at>a0&!WStP+P_PQyRc&8%*N!8?CR{;+OjJ5UioLI?-9D+1qJWw`tzbiij5%Go z*P~Qg(fAPzA-hEtx?i}}JQw2*ODmdk**WQr>koqGyCH>z4`(;o<4L*=0_=<;YF_~o zuIJ^u$lucnVGJzlSSlX4Je{&5SF3PV^^3t^s#n#AX3#_TFsz$W&Sxh2>@tR`3#$i| zFd>CfyE1X5Bfgp6J}Jn7Q-jXws7>gPftPlV6y(A8hKgxiG)Lrvw|p@?J?xYM5xN9Q zoMk5?I#E+h#09HMLE{+nV_NT`WMUua>N@Cns~lriMGo7P32K8ZurX*3jDV!*9Ly1k zfyReGv86$12d{ox#jykjqMa}}r7>nS2jN6vb1$l7q%R;70}E8fG!wfCTIWjuq=c?Q zaBdjlig}V+y&;9r9Gr;JrwAto0a#w}sR+jGFa~E*Xq1G6!*?#b^My$rDT3UK{DBy7 z+|Vc2Jz!dQn0I)VD3BWi*W7HWBj!z7&`L^LvE6wUIZr!gX^ zr1~UCQh=~@yzD&_;y4R!L~W%gy)&M}vq5KS5g423Gbz>5wsJ|82dFUDs5w-Zp9|_! zI~xZNir|S{MmcyUWWrLzfNb<;P*6)U6B5=KO2el}0`1qmV$!6vgWf|X;~~Sc)5&E} z3*vPj!NOKwM)7jYZp_e6OSLiwFi^{VCg!a0(d#dvJk^rs1+#)e^u77xH9zt0jMjCg z(=#!!>zVR$48J=wA~d{BCUzMPVFi(!Rs3F%nd)+VXC(>0r6{Fr76_}E5v2~vok*+- zsafrmV9W<&CJp&?V?uWMfvT)_@mUpbNU#G1)nk5YC8UB-x#H-f%P&`z_@Tg^I;1zQ zB4#Tj3)w=ADRc>3@Px5-R_?hlIs+!1%pddjexgtNiPKg|bnac%j&x-X*;j8ghrEH* ztJ)Q+SG5b)-lGm>-X_uJVm7}HI7V7ZEyD2jc82Oz?Su%l#>!P~FgCytCJ$mA*aQm( z-2P*~Dfsb6_d#7Z|NK*$YVZgEBXGK@hi2FN3`swXkhT&a8P{2mlaJvUcXyt5@3Q(J zh51Yi59bSc|10r#-lcD@cDni3bECC+TK%wGT&=%916A?E-D`#4HI41ncd$e;hY~i# zX|P^D)-qeB(_llcEN>puU_*`%V!FXq?+Uhe?4jGu9s62a?>2qJ%v=k*=?S#CP2bco zjkb5}AIhcOx?dW7-<@^vunh@`mXhzHm8(V-YNu*aPzu=G%CBI(l@FFg=ioTy+FSWC zmYc%aMuI&qQd(VeD<3ehbAzh4@&QSvaZ73N!~%w5b1Of}a%DK*%Fj@HD?elH1^nQ~ zB3!`G$)d&Ln2pf;!ss}X{0j_jR!{V5JaptA$W`p004AYMUg(~2bWM}?02Q~OZN zS2<%|J7Xp1B{D-{sFoxP^j<|EZVcI0KxZIsj8}Np$8VS%NnAR0tNj6!w&vO;k+jN` zo>c^t|L}KGf_{=7Q<}a_wkY+-=uLVvgm$4MNBx7@@#Q;HVQRxyRq<(`&hvBLPUiFP z>P@4wSWAEU!UMa@r{oN*bD5P4aaJ|vObOFbrNFFvzh>AYGZJ13q}!#l^t95FgwNAs z^|+WeY-}Un#^klg%o{LqA5z~fEejz_Ue`I20X651W z+q8zT4N7l6y!-R_^S}Q}Z$A*_q@BON{S+4dEh@C@&v(KaUY|HA{OPOGlV{Qop9p{a z{QAU60vg!m<>a2d;QIB869a?#*YB+C>;yD0 zFfhy$2BG&%Oy97|;7ChM r%nS_7q-c1p{13ZwTpD;k;&c)Kgso;;z65Z000000NkvXXu0mjfq28jx literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GI_32_32.png b/navit/xpm/country_GI_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..ff53374ce805e51feac0dc28bd6f5022eba8150f GIT binary patch literal 707 zcmV;!0zCbRP)eRu5mrfo+B_hZ?Xm3#LF1C^i>u$O;+v@J*zBn_#4pDS!o&h)L zIXw)|XFl_LnTH=SGite%n!f#C2vqr_ug33W<`)1opYOkT|E?rOGBtQPHm;;I)Oe)w zbQ*;4l_54wueIgUgL}TLREl!(#M08RDiq4vdkCo1kh<&ZPK7r1Q}hs zjuL<=I8$%{Ttn$=IJ9qqv{CmCE`VKd5zN4QxGAGfhLwuc13Lf+iUI=2gUeu&K_wzc z&djE5djk5pz}0?z=v;VBU;=vDwv)57zPNt`#&+?-;9!0ut;Z5siwlS7q(hbV(+#aH zM!x8aQ}*_l?;!xyYV~`$yv`{G9i!HIUDxF9B1*!LIS0TIh+X!)UG91=g!Cv9;6HFR zG%!(w90kIyfgoIhnu20;*p+LbpaKAqgXBto`_J|N4_*NT#WptEy&4Lt0LJAnMnWu002ovPDHLkV1gCTmC{y$ zsuw;)xl}^^1CY3I0C7NExFB($5)ud@Bq#!j12lx9=1`QhX<7)ONz`*c+IF*% z85gzDeK4zQIaQHU$+l3KSQfFYN25_WmCUJ1R@aQ~gX=1^@5J$AvUW_?+Io%vn1DS2 z8$esn5vP6MiQ{Z!w~N||2;vC`UJ0Fq&nqML2jfW4fA#+DoP+*8bm#Ms4jP140&zG+MRJIMtrloxTPPOXH z)~%(b?fHDorqnjZ`@UN&JA5=aGz_2=40P1ZRlTD@U%ajZsCRWfGdQqTILipd&Yqbl zsn&T^7YO$n=p_&*1u=ng41~`jQa({dLZU%q~jI?Zt%IZoN4fwm~iy;6& zXn*@U39TdqJR&wEX0j_Siw~tjD7#_0-7)H#_78^)aVs>xumC^>>VGf_nP555MA|zERm%~CUxHLEkv?Wf20E7S%EkpuMgKGtMIV?z( z3Im*_mVNwGZ_~h!05o6>mJ&s{2Z{`O4Pq7T;GOlnbhP{BOZ{twv#g=ijj<*W0F$tu z0FNr>W~i3Nt||c_!+sb%fXIz81~`k*uAc{;aZQ~6QX3i$2m!-Cu28w**#o+!N4h#= zr(XaNCoKDHGPCY2vZ{A$}Ae6m){Usi~+ee9^ctUzG zYT1992T|zu<5neRyXQFZ;yHAP@U8AK%ke-+>4TE-><<$Ugj!xCk)6DIjuQ`rYF|_3 t7n@4%NdQ3Zpus(*8m7EO!gco~{0`)?d^s7cZ`l9<002ovPDHLkV1le5`2qj{ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GI_8_8.png b/navit/xpm/country_GI_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..5f01018623f1c01d9fec5cbf48e8ff7e25fa96ad GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}~APZ!4! zj+vpowp@oCBwX%)-{>MB9UR%QvuEv%8GAzY>q1 z7HjS$|Fn#~MPS}p-;igIokAIR8h9?&Q?J_8cF7>I)*jkW7mY-02_QsjErkz zNj8?ey6m3QAG%mF(B((Gdpg}`^ket@v&#YsNyu;8?`Z|!|>#LkS?`s1= z0JRhE-{0w`bnwV67HQ0cf+avsK;Hc5+!?+;2e4<^%7@+8^%kt>m-#~>yT?1-K90SatFEJqya=|mEeHrgfywptj8+1Qrjs~O-Y2^W&D>4M^`aE z(aE5;wl+mkJRVPHceh84L>t{y>GJsibaZ#uL+y_T_XG7%JG#38boqR48ms0WHPYGD z zdja$`Hp%f(^NUP%@2)=c%B$B}TX)Z0ppSB$`avZT6^xCvSRc9>bYwaI0str$qzO4W z0Lmn5Arorj-JEQY`3hPkD}V_(IsHORxhxL%`WFxJ8#_UA2oIDGTHgs(oRq7nq$gL@#3T3t2~Q z_6uFthDmKQI@O>#CyxasDU-5H$}$c*&qopdLX)0m8r`M4GtCBLfVQfi;kyg6vNko<9jC z(OC=v$1yl3)Ccw?x&`4xV@K*-#`Y!3ndx_{(RAg?N7?BQ7*2LT8G5qJ%u?ChM$SFX&^OSVq)V(#Xa3y&`@ zX>A|U{yvn?z$jSDeQeSOb*t#5Xhv#empWvH<8YyqLHBL_gQ}#=?Wle~ zDxQau;#$DQ`n)V4knH4ENmO@LsZM9g2TD4vS2XOI)o?ic_HTcO)Nil(^v_{6@Nn^S z8SzJe0DzF?Kl-87YQO?T0HkBd3hgMpIDqrH>6S^}i6d;hj3|;TaB4^CMfLQ^JrbE( zE9P+XGy*R@X#j2;qhJ#Gr>5(1_7kR`*4Qif5AKW6ISQg0=i7b*H7yaG=>#5mFiP!kwPy7Ll zxqK#bL%}6g6-vm&vw|%G=l98}YPH~!kf9o1s=3G@0Npm+*ho7*quFCgun*I!MLQQ~ z7#}qVz^D*xzemx0fjUsSPvFEI@M92wqJE+6eX9P8nB%Dez@b zX_*-Kf|ptOC>)()d}11;foYHira>B*25Dd#q=9LW2Btw8mEYC z=q@Y@7a25Tp%}_V;T%DfOoQ&g*nNbaGg`#$;KHD~ZK~5pzBox)h?{YsI9wPMav>RSdv_eNu*#)YtGe7z9oXI`@_;z6$__k8_dH z$#7xNx6a38{ByJ-^%$#VC|nqnK&V4Tkgqbt%e)x3{0HhuU<`UMnWg{$002ovPDHLk FV1i<#VukZgg^aUq?(Xb9QF{g^*iI!$1&)pDpx1jN@yX-EB&# zl5L?^1TO_!#itOmn`9wwLb5jMuXndlZNcK>%$)O`nF%K!Zw2gR-KbJ?WIjcZIw^(H z8OQBr*&87=Ce|V@N-a6+5+~zsC%l|L&Ni>>1vI-1*4ydb?F_I-$V)IIWWJfh)AI_L z&j?vOAYg7xbwfzowtgG z+cSh#36pcYruLFtsw_7ghpyNu*-pz3jua@c5wJdj5**Va&Z4ZAQWy5j$RS<0kWDgP z+8LB7tPbOl?EBr$MOe$k{3iSaGyAa5eZ#?vvXymIOA)0?76KtvMZxh(P?`h*0{IW+ zAn#RWA#JXVJjLu=2S^p09IW~t0&fWMz#G^*smEaCQTRHOe8xmiO-DJQ`}z1AzD*d; HHv#|vK)Tr@}h_?(U`03UBWF$J_R-Px`Ukd0PMg literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GL_32_32.png b/navit/xpm/country_GL_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..599977691bf2b6282f404a6fd69ab69ce040b8c4 GIT binary patch literal 484 zcmV zgMo?Iu*I(KX;}|e(-{~TK5p9gs(&GorZZsm!T0mmZ`sE&;LdFe_y{5)b{KClV1;> zl4Ze#>qI*3+j*i?qFeC$$x9+F`2F|=ITrl=_?bux{(ksGj53ysye7zex!Fx}vzmy} z`Ko6gnqI5`!v`OT^}(O_MEQX3aq#Wz6(TM8cJ?Y+7M#0AY(9AOoE!^io|73E7+&_y z|NrMN9zB0QeR(r;75NtYy!GJS;*EIpyy{!{=j{jbEnuK(eSqD9|37}+_02}9FBupZ z{{4G1Yt_SqDu#dmh_`_80*^5sX)Yrzem_T6S;=2_AH83*>*uWp#2ZbN1(buK-|!mx a761VIXvIB&@aL`o0000v&U@?d%ZxmDsPP1FFxAcCwZp-J!J3Lx%*M09yk9hOv6Nzp69MfcU2#aok&F zmzEXcy@L$|5k*b*->a!kc=1mDG~Xx?|MGo>g-lC&=#dFeMG!ag3ehOKCbg`9_0U0D zhRaRNA{vQW62~U$50brKh^FI8b06lg9y%!RTR@lQeT(Q>DyZ-^fG#bDW4a{cW~rc3 z{3q4}U>KzYa-6=Xc@fJ20MK~}H%JBP0{8{(Tu z#9+fN8TJ>VUovwbjYE#pcUdBh#Q+$FmPC#>CdtmKmJ)Z z<->X^KJ6t>weN~+V-$+Q^SAW}0RaERjcAnIUi1P22I!eb2`tyvXBeqF_t6>#h-mtc zfuWk}xW}%7f2mO*01#e(6vwBk?9wt^^472!4I2c6L@wS`7DCJ-QdC#Y^)&o{82}h^ zK778X7>rcXC~CC3PoDLg)Kmom0CgoEJbFoTm-*5F0Hs(ebm9tcVymwW_4T7{+75PY zzjk5sfxV7hJ9HtZEQYcV$GA}!QA>5v)C_7u*4-C03&e^AV#NZn@*6)-FEWY=Hj@AV N002ovPDHLkV1hbYQeFT6 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GL_8_8.png b/navit/xpm/country_GL_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..7c028556d2ba2787e0d52744e01ac45dba0bc48c GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}3PZ!4! zj+x1S{{OdUHaozw@ZOoIuY2-7{g>Y_VDujdHYC1hm3z!>bL@PU+P`*2H8!@k^VNOM zBDJ?_c@{oq>i;JhK#*=QxsP?zs)Zsg}!1hk*Q)78&qol`;+049S?jsO4v literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GL_96_96.png b/navit/xpm/country_GL_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..bfdf0eb69d5bdb09ab22ec6ce2da3e57a3216a70 GIT binary patch literal 1496 zcmZ{kdo&XY9LE+Di&-VL*5y^zNmt<0i?v1F~5$2_xCBg&Da zq3A)iO=XfLEInMW?&LY7)Y`6g^>^o<-}(N&=Y0SCe$V-21qb;;4b~a}005}JpBHJ_ zBYz64v;67m5yrCVMdN+F0NS5d@#uOn0083odtpOT1WG|fKq%QnO8DNFL=}JNa%{hk z;N>_3$zuLK;5?WM@9R34#hCKTO+a3|2oDuxwWwk}J^ARV(``Uv)+!e+<=^L=%m!$O z-tjz`s_O1t4J>&82)ydu%9{mU_83V5t_iadNQM9 zyM7B;cQq%|uuTk#8e!WV#jd$;Y7~ah`z5}8NZ(6eifcv}!hGW*10ZLbIYm+Ts6!=; zjDosYmCeRC%;JZZl*QU+O}S`%e!8Env3_mJ$*!0X z*Gvym3T+2(@Ec-=m)c)^JGu9K)V<6LX21gl^-au$4hT7Wl68$vk?0O*+*LPnqcjK| zYd<_nc+dTl_P8YFGPxg0z4B4iWLS&D9A!JwKgjZR$g3gJy>;)_+2oChR7PG_0P)F> z;rjW-16VLEF+E+Y8GTWvxaM(crJ}y>Q^}IvHUk;P#toVLpi-|0FmGIJ;`yZ2pt;nD zbZCQy9|(8i@2h*)Kv~48A-%}#&$sd=N>k3$X;yi0$;fhQ(~(w7N;Jw0*_W$PB{z;H z?0m9|;}@LHY+o9q)!5|pC{zl4t4SFFv=LjrwNu^zCR6=!Nw;p)chDlk3f%0+ZmQNd zbSB=IXL;;Ek*1VJ$ibEHIKwmhD-`)~x(3 zevoJ#hmrYH@+;?#_qr+bB&6FQZwT1)gbTDZ{tZ- z_`0nL#|?X6^9=rH4{`KNnnIs5bO_K`QBIgNoz_}lU;PZ>zbTit#v4e(z zn6589iS1gg(ccD|nkJ`1$KdAzm z2Vy$=bH}P(wJ3Yo>#c_(F7hoUJT0q3#B|BsT;I zq!ZsO-t$%FtrpE%seA8CdI3LJhur*gOYNxJojO;$$1W2~)!8z$(%|qT>N27i*uw3k zc-(>S-B<0dR|$u0O!iF67y0^1WO$E4P9(qH0`4l81Nh*g*F z)ZZ@X((TuDT=&bvR-ulZ*x|jyz^n@BxhW0Su_>s4#u0;YVDI;>clvKNGg#-3=Gpj2 zBQWMChJZA0Sg9$e;MH4UmqBVb-S_vLMhK)n;~;~mI1CT5NHhhRah?iAW5hkPvvj?3 zrxFuSie|_@q35CbycD4$l0%g#fp5OnSV|v7EV(^wwR7IKVu*{tcV9xE_Ze5dYy2_t zLqN~BO6A!+W5=!=d`4X;%^^W?D1%E+?lzjvohic*7kL(A%i(a9N# w!`*R#cedFEqdmY$*h!cc9`b)Q`vr0;I0&()KQ|_mxQuFmzju(A5Ese*5B@vD>Hq)$ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GM.svgz b/navit/xpm/country_GM.svgz new file mode 100644 index 0000000000000000000000000000000000000000..a9334e79ccbb3023aea03706e5ef3fbb080115d7 GIT binary patch literal 809 zcmV+^1J?W>iwFn^D0)Z&17mM>Zgg^aUq?+Yb9QF{wNy=S+b|5h_g5I|afoF*X_9(z zdRWk5*R{idp+KQXOybp+3`wrr{rXXkznZ3N(QN_(gyJLl_(*GU@sMZUJ!q3EnUK&A zhzF7@k;-jCzFl9A=EO6WNx?EDAt6$ci{;6}+;2}j&%Z}dg50OXUIvZTZWrc1 zX=+$(%?uX%6yK~AFYCqeaP7P+uojom-270Q$(t3JJF5z^#PCH9mI-E=OSM;^y@{f5 zUSkl2I}(3gUG6QkIgh_9eb<;=sv5N$bv7H5j8EkJjb!UG3anbHY4oz|yuIc}|EQyFzBcbs$ctKc<3C|`kI59E`o{fZ;TH{AD%Ge|5{?l(}u2H0Y zfU%Dm%Cx}^i%&U(VKn{dj8UUg9DX!bt2>A#KJd-|-Z@Z1gTQP$Em}+?>2Wl@0ks$FW~tvp|#>FEENXuv~0=kFxC&dN7445u$poc~uXGgbW~ nEhn#PIcBq2G=C@2tp<>PyOxti%!Pa7mnXjghg+il6$tMOp@Z)7^)()lbgiQ)12YW}|9B!=!q=hNc4cz%3&x!g>ZEkK4%r*GS*a7`lx pv**Xty?7F~XkC}^Jte}#!2OH=_KWIQuYe{pc)I$ztaD0e0su~WF{A(h literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GM_32_32.png b/navit/xpm/country_GM_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..ed2fd44f47d994ea14f54b1e5e442792ba88a359 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v}~8PZ!6K zh}L8q^%dXdCo(Wzc8Icj)ey+uW0i1)kp~EL7OmW<&UT5h=l}oz@)s7(xM*H<^&n#@ zL%+}Yj8v0X4HMro9JA~`&!1x^^Px#&&FQy49IP6ip1kcY#{9B@(Z6LepG4__70hn3 a3=BCE;w}r~Hx>h}W$<+Mb6Mw<&;$VFYC!J* literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GM_48_48.png b/navit/xpm/country_GM_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab9170e656fa9ec528cf3c560247e695904a626 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}|?PZ!6K zjK;Uu4S5?3MA#DL5>pb>)iMr9s0kcslbLaVfs=2;2Z4(Zor>l+{lCPQJLm3%tNmBM zGz76-;8`H)VBC<#aF$^fF k-;e@UZo-@a(f^y_=6(?+A@-@;fo@^&boFyt=akR{08yw&bN~PV literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GM_8_8.png b/navit/xpm/country_GM_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..30e2564f6a2e2d63f30fa13983e125bacd840a06 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^uo-U3d z5>u0H)K`3)&&Z!}Nd4piAW)hmRn4@XY3|e*t_o2P?+*{QJE>Q^W!}RzZ%=JXqd%i# bJOjflFV0UFcO}LEO=0kK^>bP0l+XkKr~WFp literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GM_96_96.png b/navit/xpm/country_GM_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..4bafa37f7dcfebf58b7a96030ba62ce458a48602 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlHorvLb^QE~EY_Vltn+jsBe z+I)>!Czf#oQv&M&t_D#CZH6$0H4G7?379>b^OwKj7EI&gf=ZjO0^Zwx*3_%p9+_0i zl1QA{xp~(gd-HEhvGqM-)dY1>@8{b4sytg6Npum0C%&;u<_dF7&wZ2)3_Au-S3j3^ HP6Zgg^aUq?(~JU@bB`lq-uu|6u^l>=5D^OmejnxtUbjvO%yuE7r0$dxm{J%f zE&a*P0tpCGNH7!z*|?9vS3W_w>An}ZX(Z=Kj_fBpFN?QvYg*3#FxCdqAz>% literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GN_16_16.png b/navit/xpm/country_GN_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..1ac8b1338fb392c28df5b37d75adb65aac4986b5 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_}o-U3d z7QM+f>MOp@XXMS$`CHQD`)fYyrW;q5bE$uNpBcGeb*huNf@qJFLDqp4jLkc|zLy^%c$EvNHC-d_#B^C#!G$)g?j7S`=OzpzenReiz= i39YuSg-L{{Q|xavSwa-uRV08GF?hQAxvXu0H)K`3)-`LpbsPf`D=gK|r#dv@~YWZ9LJ3kNR9y|a9M;sV<_*oe?E$3q1yjUd; PsF%Uh)z4*}Q$iB}D|{zg literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GN_96_96.png b/navit/xpm/country_GN_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..63440f0232d7344acdbd85958e5b242fc12dca9b GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt`7JY5_^ zD(1YsV949xz;M7pLE-?5vQvQXp*}Gcg@u>(pZGbnpF6+JUs?9L^_Knjo?rN9wB;W& q8*6iuZgg^aUq?_bb9QF{b&pYN!Y~wtpVwcJ-94L|v?5cQ z%GRn3h7+caJ(f0Y0$nOiX7%4MeH*KLyzqVJ+!HS^Uky3S&g#|(;FJN8rf5rTY60J_ znmhurE;nV~v_=ZJN(;**i0`wvbpN?q5qqx5?(qEjk`kC8encr^w$I4>aYH!eh^s9S zP|lqeh<)GFKB8?`QmDk1(taQ^X9vBPRd=24m)78&qol`;+0BOfBKmY&$ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GP_48_48.png b/navit/xpm/country_GP_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..9e58d71e8caa5c581447351d90319a0061ac6a9d GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@He#gTe~DWM4f#GpQ# literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GP_8_8.png b/navit/xpm/country_GP_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0d7704f2c7883e60aa96b1a6b724a15a82810d GIT binary patch literal 115 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GQ_32_32.png b/navit/xpm/country_GQ_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..013b5c5b911abae3fa0c6ad3abfc315bf26f42f2 GIT binary patch literal 607 zcmV-l0-*hgP)J(5YjWYz`ubL+Q}9 z5IP8ggVj>nu^_d@!P!AU+=U`2sbKtwQ!24?NJun+e4I7S;b`vvZtwdJ z&yVMMc^%5;U~d$>+2Sn!jzk~#rMkolVFK{GF7nyZ+|a_yfu{Rv(or4(y0P*w$;^~Rw z&cX!IeteGI=2E3%0bW%ir3XB!ME*U&n@SZ0cvGpO0Kk_@RSN+8sH9tf7nO7i0DP!a zvjEWiDj61Nc9jeZ0L`tEQ168?@qxN}?Ofc~DX51T$SidiNM>bnU^TId;K?9!$Xb}50gc&}2x4hjcYN;c9EP%IFtp!~Xg13F7(}E0kg~|8lf~m)E(c0Yt=fh#7kG5J2OfL57L-zi!(piE?~k<@+eT{pYuQ*+6qpXU zs;)qU5EKdpSglq70HrGAKN}B05FpDk2>HKCnSQgpP61D@=&$GLbQ*5A86vc+ZR>O3GYU-3SFff2nCi29Cj8a3=4SjDcpPi_$ab4VOU_{!&7t>_KqS86EzDovpO2O1)5zQ4c!9G zu8v040z9arQBi;wbu=mp@S=`JSplBZ(I^(+O&yJ50p8TnAON50Xb@i2(I9uXo^z>= Z#xH%sTFRh?!)*Wn002ovPDHLkV1gX)oaz7o literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GQ_8_8.png b/navit/xpm/country_GQ_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..03d2d3915ff87289126c65410c88834b21a4d411 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_$JzX3_ zB&H@`c~|^H|4eZMqjoIB5&$Nt~n6oa6xX%2x0fZ)UH_w{UfYKm;%_U{i^3)GcR z@T=nK++xRHbN~08>B-^Y;nDy1|1W>I!l%!+&i@~ZEwtZnH#708>))l8JWl)V9)4kE Y2w^f&w+~Z30(2&Wr>mdKI;Vst0BEjZiU0rr literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GQ_96_96.png b/navit/xpm/country_GQ_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..7d8abf35dc094b7377adbbb69b4e49d363009a6b GIT binary patch literal 1797 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GR_8_8.png b/navit/xpm/country_GR_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..7fe110ff8cba590063be4a57dd830bbf4f179fe2 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`BJY5_^ zB&H^(BxL;9U$F51@*h8XYmAI)crqT?cTb)ACf?4D&n`OJvTdDSxJaa#*|Yeb*=Bct ztXivktn}5D;I`7&>lSMyBqjYhd*Z-_5B0}*;M1ToOI&Q8jI?0H~ZuF|J#%teBjuzKa&I9mc5r}W@c74W98xD`Ohdf W%h)1zhg>Vrg$$mqelF{r5}E*8K3}^4 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GR_96_96.png b/navit/xpm/country_GR_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..22bc5f46ac9463ff885bc5852564e88dfbfc9e11 GIT binary patch literal 595 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlJ8I6Pe( zLn`LHy{qUiohZ}r@qcwDtEkTEs1rV{GiNv&b1hFuSq(Q-ZFLqUl_%D&+xa|Q|NYbX)kXQ2o~`p0Jf3=`p#1yW?+G93vTtrY ze0Y9;diwSEujXve-L#AQ{rmaT;{J4WEQ+Z3_&@M1LzOgJgCs*5!wkj*2qU6h?!nf# zZ|mN?sabG5Vy2F_>td!i@9VoJPhS5;V)d0$?j{uFV0}xwyZ?Orx%0-FT?P610)PJ< zyOezSrB2%B%BP8W`SOomz4Cur`daIB(8N=l)_e^)^1qqO zVK87m0B2Zf{#~*4!>3OgW##sIwq*qdeII`;`()|9SU+&u{p_=w*X?13Iu`C~Afva+ z#`e7Yqd$9oslO<_`nvRaFPFj0Cx$bh0G++%r5FpkEj$d_SAH|*UIwYGvR}}9rwNOp zE8qQRf00|kj&K~pm4_cbPui%l`-?*El^ybLvz50iAUg*dno@kn>;GysO-x<+VI{|m hXaQ88f((1Z%ITDLF4}2Z6)=@Bc)I$ztaD0e0sxG6`*r{T literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GS.svgz b/navit/xpm/country_GS.svgz new file mode 100644 index 0000000000000000000000000000000000000000..2f824fde38cea82fcb5379c82a3537998eb812be GIT binary patch literal 27699 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 n_G}IJkKsMpq{aaN5v_U* literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GS_16_16.png b/navit/xpm/country_GS_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..c0968d25788ca0c3fcdd38f2cfbc9238b786e0dc GIT binary patch literal 551 zcmV+?0@(eDP)z<^yMns53`%N}g>Ir1XSgq1cnnctXZHHZ3(o)l86jMjr_2J|9x`>rt3KWH zg5l2}BTKPWUlqQ7y$Lt+%cGC%jC|i1*dbiTYeq&8)}J?T7#J8>L_{E5t#c*}3=G`d z%<}BF7@7V*_^$Ew>mLRN1{SOig@e#g{iin=Ik@?FzVMtp`G|pmfiX06rk9tl_wOrj zpT1#WW0SNr-gfBW`l~-zuRhDbz`()5r>D*K?FY}*YcKx)|G~h(z$7Il;PLuM$F2{L zUVMG@=zYJQ|G%Up4>UaS1?&I+44XuA@@MD1(hGyD9kf~TFYAgk`5KCJM1*G)LmfO-x zyB|$TOY1i1e(e2q&v~EsdCq&@^PY2&$>wI>XP?*9oKq-<0002$>WYqNF95(H$%k!i z4+E2%%kzHV{)uO#uWp`&v!q1zBEd2WlUN1w}aa%Q$IbutT6rgYDJRcm`0Bmio05Cr` z1^|GX!e7mF+s@#OM!=Z$VGJwv~}4gj+6 zKk(aaj-DQkP&zRgy~q-Y7(sZsxuY%@y{|8mB#jFTQ(+kd0(R`!(9-h3WK$!l)3-`@ z23CIjxMJ_#H%PTw(BE>(UwXMi9hr|-%S2J>#-ctZ4RJc(0(iOvKnt=@?QbG=`cLhz zs?-w!pGsw{sX530YCn5jK{L|*PF2B@U<`vD?><|-x}VPC;sjTaVEm}!Oj(&GOd!ba z)*JRXO0NGN)=dhh)`i$B~U1jHEr$qq>)6-KEjGHW)o5}T`o(Q zfc5lANAI1z-qK$#_eZh^tgY=~W#w7Hk#F!cap*jUz>x?-JM@1J~gXlrYqkf0LT*PNNOIV`5!o@A0>@sJ5s1* z86f-twJrE;#3W#`GbQ}zeZ#3!V|Djh<)^9r z2-Oc7Ip5_Q$ex0PASR{yh;MEJwOa7NkU?J<`4wa1VSfcN71Z13`Jy;Z;b})Cd6~NJbG$ zT9vfv#FyGkYn*9x)Qp$uSno2nm?mx1NjhyJv0@{ZFl}b4WN<2A3KYYOfN&@r#{tKk z9Nf$9-re>O+RJ$^3r#%#>UVDDc6Ptd{yz8op8Y+)J!Dd+lN~<%;DNKW^zARcxCal* z(XsbVULF9Xb#xGU=Yy{1=O;A$Jl(we#khk9ReBpd4xy$KC(L?%M1;7x`Ov0KYgZmw zSeVjyBx8|Asnb0c8UR35m#<8|`KC#$B?$cL)dK|ui7N>!C`i2UifZD;9kL@wlsetQ z0=a@9W<@~TPW8w?uAkEDODl)t=|Z2sYH+0mm4t=499Zrb!K z4!<(ajv&lanHG_dS{|sa&9MEgKKaGVi%bN8H#NP=!Bkk7a&ce$M9t1c8oS+HUj9yJ z=Y5Vb^48gN(k9cB+){~mc_0Az4^!QxMJBOWuoTmyG-YLPx3?R($Dlpp>oxS6iE5`)RmRcgeJ~8UPepZBx^$6&3FWT8oNOKi;bjqG@Yeh6Vus*@Zr>9x^&q zJ_cFVjQWq-+6>!I-;vi{GV65yJOx_69t{B4ox*5jc4#tsC1!+SxQgG|+38=0#JRa# zH$wJtTrJhKM+&TVT6lf@Y0}FzaXicU;N>n*)Y#bK!GnedXJ;pelUsA7U`v9L0qC

M&!0ymyt*^~vyeEUst-VVEWA31vO|ScG8=0PNY51pt&6 z@3p8uyO$vqIHRKQty|Y96!?<{ijEf7)|OUQW@l!`N`-SWv2AUn(Z@hdP41R0>kk~* z_@sfRrd$yb(xRg54I31ELYR~yh))jl;o_{URTzfW*4|)^;%UyE$~`T(;w>st#-Q`049zc`IksE zef86lk~4v^OMx~uCD?2cE@uzo?Tv{V$;r7pHHA}@Vk!SuHB?-j*4X$Hk%({7YE36j z$S+>ran2ZMeg661*zInmP8WChu(7(TZjZXSIBlu>251@}qo+?zFk&9VZ*R{5hyfS@ z@NoeJ(wKER`Gr4K{dzE{GqkpjEHWvyTG`Q~#@*kqdqu^~q>ATPRu2=zO(9MoQl1;= z{CqnC)}7@ap8xHotjt+pX6W2k_9UXN|Yf&nIhY0?I{spIOLJfm%##zfZv)~(OFXSe}CJUO6Qi(r0! zK_nLAJ|FF{PWS(P7|B?03V&Lbh#vO#c621B%2_iMsv2S#z z3W^G0hHMKF;rxXSsbqai_T32uH52AFxF)-io7e2C(9W{tYmIFzZw(>L5CA04S~sij z{Y|dSTQek&8nxKzIfuCa{^p-;?V9{Oi6bP*1TRG)%n$(V5_Zus*v4l@7{;{!1%5&t zvF+Oqb#277|_DO?6LYtv~kg9adSean&7|Kq4Ig|1TR?Dr&cm4J3r|z?^ zXDy!aM?*r`%K)GSP2XK?4a0e7oAM}+000b=Q8tINC|j_xpr2#}Pa5dCtlNDf#PFyz zM!MiXnHcB#?9b89W#2~-mhDGqr_5|q*xM)E!iRqLf(y;>pQv|bu>K0WzHI8QiumFW{3+tDJKQ~W*^)z7!?Pd5&nL}GciwdLx01g^>GC=>6 d{tvXA{tb|#m?o66h^GJm002ovPDHLkV1k_x2VnpJ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GS_8_8.png b/navit/xpm/country_GS_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..e7f930905bdd42af1957f204effa93970b4df77d GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}|}o-U3d z95X{t?&dofAjAIPzNM|`bjQb+mSl<=mQLviH>l+3F5lp3(|$6+sFL0A0|#3sua-xw zQm+4R^N3f`_S@#2HUB+%Lg4;%{^h$@iQQ+K%CYE$tlP8MOTOsIG|bwwrRLo~%|edW zMFMl2k1<5`C7W0??AUVabaC#(*PRy`7Q9@Tx|`uh!lt9=Po?%uea(0}yg}WaP0+UQ x-}6(99Dj_1{qMvsINeZa#?>`Nv)l70Q^`Er8m4V!TYzq7@O1TaS?83{1OV#NWAgw2 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GS_96_96.png b/navit/xpm/country_GS_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..ff7d5b24cf73fcbd85e9ec3a30be3b2dd2e068cf GIT binary patch literal 5233 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GT.svgz b/navit/xpm/country_GT.svgz new file mode 100644 index 0000000000000000000000000000000000000000..2a060b6b2baaa125c70b4d72508c90b72559616e GIT binary patch literal 37657 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

o#`$^o4(90LRT;2`n1$LKDxF~MI-jw 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GT_16_16.png b/navit/xpm/country_GT_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..abf1b1e1e89ded7fe78ae8381aedec56efdfd9e2 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^TJzX3_ zEPC%=+RN3HAad;Eezm6}9)b57qqn%6i*>kuacYUBuWzs7lL^7*3anp+JQC&iX{Ba! zu)P<$C^`T62WdX{+3U(!m(Ki>d*6unyDj&TtMM)A+xM)V&V2P}x`L;0QRTz3h{;c9 zT0O|Meb<>FeD>p^rB)M`PWn@_WM%Y;kT52<(1oTYPJ+T$^D@@H3JzsT`*J|s_)*Py z2df7fOv>dx`qH0txU6_*JH%XNXeitJdnH@luZjEE_Aoq|X0KDJqxc`_2?kGBKbLh* G2~7a7zi9FR literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GT_32_32.png b/navit/xpm/country_GT_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..64acb13f346ee86a2bf88c097ea853fed9c5f8ce GIT binary patch literal 477 zcmV<30V4j1P)>EFSZ#M^ER!kmVizNEucy5;I*LzdgHA8cAH4pAveyEcS}ufh6H0(Zc$4P-BZ5H5v+h3vSfA3mW7 z1=9}RfxrMw(YUd0I6d0MQ(JNRyKr@n+vi(UMQuDFrp9n1E|=F?wC*H1-NvxWh=@x} zjWr%1BctgOTl*W_-yQH+w#fWCrlVLxuH#b$euMy8&Lc5VVkduu5GCS+HsZpn=cxJs zi%YAlAB-_I@|8-p%;CpTX6I*{2au4Mo1FW*9v_^j>vDMS!zcuVfDjM@{zv`*+U%4F T$N*iq00000NkvXXu0mjfn^n_p literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GT_48_48.png b/navit/xpm/country_GT_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..00b0eb1ba1689b1aba0eab52305cd90f35ea427a GIT binary patch literal 674 zcmV;T0$u%yP){@#k`vyS!XtQf+flF{QCee4|RKg$^R(AQY@l zC9BxKz!y3=35qzm36hF}NQ~%U7HI}4E!9DcUP8bm^wK7^&0CZ7QtvKzc^nF^4IfKU+-Dgr{) z6-ZUp-9u_Q8ht#wdv3K_*g&C$khm%W0Guoz*?3x(OUXhq91r6GK?tMyXm&lTX^IdS z3+U#Xk+EDc7f!r{5MltuGO+`^FgZH8-H6k+)a|=(X$O01$nSM}W0@ERP`vO((sB&L z*zGo`>AI|5a36jWzqO)B;*W0_KvtHUI&u{Nz;gREsid!#FOT2Yl%=WRE1a3d0LnM= zf<*uT0N|p`rnY8KHA8P31J;2;qq9Ga-hiM2Aq63XpFb_CE(dMnWL9-?ZU8`A!SSel z!k}0ZDT-3%jM-|j92N4#g4fcQC?$M?4+E&eY>69UI+ZAVU*B%-&r1CJ#dj{vn%oep zbPWT@Z}UT4pP!Em9-k;zcUacp8S+$%h5>cI-H!njJQg$>%BvTlx)bm`&oI>r`}4!I zukB5FIxvj^1OV81o%N2;<;-=D+uo#Frt*^IkY0PU(#=k$o68et&T^+0mW;lUhO|~q zCl%)6xq8|d#Rj_b@cCSFu2f7hO--Qt`Tk3k_r!zXHEbZp#LS$W0RU{(E4u0NtpEM6XJ%$@?qvDS8P4j+&Bn&oCiy&mPR0Mv{j5LwBK+^NCKgRMB#2mX$A(T XPI=>VUso^#EoJa@^>bP0l+XkK&R##p literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GT_96_96.png b/navit/xpm/country_GT_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..4adab24cc4f8fbea748a228f2d335446d096f5ac GIT binary patch literal 1966 zcmb_d_dnYS82(ZfO%WYdX;6DrIn*l7c4lj|wzEPdC^1gVDq0j3qbN~QDui0S7Ku}> zC^gRvv0|^-D~Hqj8}5BS@B2KzyyNpeKfEt2%?;VWH^2Y@uo)ZaJvc|#pTWX-o)O2> z{^!8#W@4xZoc;77LKzwWK<>tRzgmaASs#xyl9;Gm7N{veDe{koe5~lEd=Y(D*<3AAeVk4X`k`tkaHu~T zQ%H*p|4U?PO zugIXSl!Jm>{L_cN!?kGK`_KFqkw~QOkqpr#w%Haemt?GXWn3B>S{lgKxpUa0j3m48 z5ClTGppdF!YZKgqfqGLXX^lJM*{#VN3ZbppPyMHGO25E;qgQJh-N!IVi|i|G`|Khh zNEo{W?t%5WdBAvX0205|jXe@JStcFyX9jxirzPPgXoP4%`O&7qWKSvPqAKm2N_38} zH0%WClf(?9x=XH9h!($3(A`o?KAQF5GwWZ+)F(d7<}4WCTZq5lNy+6DR zA#Tp+zABXjEZuax-2bhX;yKi#n^$UDof-?3;U&sVgnn8J*dK8N?9K4Db|C_I zb+RS-L)4c$s&W)St3IlMD;aqB1&|LTVikrSf^8Lu! zo*-x6^1}WLF*w|HeV;s~d(d?tJL>B7uNZ41{0 zOR2o=t?};Wz2uy7Yl-Wf4cm<0=8GPUbcSH(+WPn~R_gnn#EaB1VZ0VY|2x9lO;Maku^>OvN?l;^^_{WDe& z%zv^WbP>H9>YALn%|zr)z{75%B`S-t)77=*)JNE=M6m-(+-{prye3W6s!-jxoyPyC z8q($OG))z$Plv4nxUJS^(;$AqIwRH)&M zF7EN+UX}~qNE+odbegVJ;?ei;%q5Ybqh}0t1I6{lBts@LYOi)^;lrjF@cMOOh$=rP zwD-sCEXf2Tu*((bSUxRq?cJ`9cX?BddRkZ4sl7&;Iv5|%tiIY82&#@44#B-EUWm1p z;!HIlh>G%)#$-5*ErSwfvJTLcMfEkc!Un#}_He{}&{&AD0J4)3Fz+jw=>~=%^-v5p#Gib_%Lu24Xcg4;-@RDkT@Z z^%BR}pY=U@{OSsmm=bjhce_p`+RK}M2>BG^c0s|3y$YM6Dw<^6!#|O?!Ksh#W&?2i zL;Vp7JDpJTybS!2I`;Kf@M7YV^{>oxw{TXG4T5?x5q?xDB3gXjozA;^0&~vBB4JyjQ|@TI$*|K$f_qz(niS>bR7d5LBh&s~ zZs8WWmNB@oDEENU~t;yVhO-_3b=^Qum0B?e_?u zjA4S*U|K+8ej%#iFQ-&r@sH{(z?;_AFdBn?qXB%alsq ygJ)-b_mCh;{uMzzCYCDZgg^aUq@9gb9QF{&0AY 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GU_16_16.png b/navit/xpm/country_GU_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f38687d159e07ed29e5dc44dd602c3312ea930a5 GIT binary patch literal 272 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 Mp>3q~S_2jJZ}>VnPyhe` literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GW.svgz b/navit/xpm/country_GW.svgz new file mode 100644 index 0000000000000000000000000000000000000000..dc6aea01c00f3f1c3787afbd003d28579d3e0675 GIT binary patch literal 410 zcmV;L0cHLliwFn|D0)Z&17mM>Zgg^aUq@Fib9QF{os!Q^!!QiS?|TZ%T$t3ZNjJti zEg*4#7l1PgZJI`eWJU#I0VJnah2n;lUB1Ra!GVs|BTHl*O0i#UXi$uuJrSv~@%2iO6d@ z4fGiS4Xn=Y8i#eMMi(ALb9BW!P)RG=wgh;;Jony(%zPx6K$O2 zV1H!v(O*t8I*_YErq4G#b$yHuH80COc`}m!gQ2t8-|Ot5G}P+-m%kdl0gq${gMR}6 E0C14b00000 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GW_16_16.png b/navit/xpm/country_GW_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..88602401f67d1876575e877634092e8b22ebf285 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`jo-U3d z7QM+f>MOp@XXMS$`CHQD`)fYyE(@~*ELh&WL5>M`HsZSP_3QvEonD)C%!G2|vyUoKQXVq4%MDrCvgE tLP|%1xQes&6;_`UGDSQKSa_J38NSKNvz*$XIuYm;22WQ%mvv4FO#o4kN(cY| literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GW_32_32.png b/navit/xpm/country_GW_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0df31f7bf04abe0b68d5aeaa282e1949e46f2d64 GIT binary patch literal 343 zcmV-d0jU0oP)fC5Hwfq-`v^O8iy0Nzhyj^aLiW3CmmB%&9-a_UO% zg5$jcwizfRIQIf3>m>>p#|y6I;a)d~oeTi<{2GJh7ok?%_(!xwX*<^cZ16a)=MMOF z2BhO4058)wC1-#J0t62SO{U4p2q0C0SrX9=YFw5od}uS*Q3}v>Jx<&T03E+-1du9$ p-04a~&&2eom|UYVV?; z!;~n<(d`hya!5%)tZ~De1^!dNg}jv(-y}03|L$)k;bSu1 zpWZAmH`P07%)6^|zx|a6gZ0|(QV+6zh-U9S_E$JioBayUs^iV;SmyGse{9EIwtK@n zALe6=@(K#$V&~l{4vftFaY*$k|$!!3AJzTU#-xeaeYB_>Yg>e7XnsKsGMHBnxVj;LN+Tj(a-+C zv$Ii|HDcG4k0~GXKU{VDC;O2(3w`xwIhx+SC*EDFD%*TUa#eLr(GC;ak_+}f9kmTn eea+GGmHWY@=nntIYWsn4!QkoY=d#Wzp$P!>*S}l< literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GW_8_8.png b/navit/xpm/country_GW_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..a935a6f4fea534c15554c51129b5b12c517861d7 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`so-U3d z5>u0H)K`3)-`LpbsPf`D=gK|r#dtCrIAa-BH`)IX+4Jjr`@$!$i|24fw9Jf-Ya y>{F?F>_TZ6%Vm}{HnujoJk39O3NJir7#QR?34C7M_@NqTG=rzBpUXO@geCw--!-TJ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GW_96_96.png b/navit/xpm/country_GW_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..ddd2f9a70d8e68de1eeedac8396403847f1c2c3c GIT binary patch literal 797 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlJ8E_u2* zhE&XXdvkBz>cY zXD@%?1g{BA8nPVR8e1k@iRW3$cuA$dH|gjPoBt=buKw~wUH!%9KFP8h&|176H|L@cLD@^WPQwisGc{k7E{= zthTxQ?z?IX}urb7`T?^lqb#7oY?pF+|1gYn%5pb?#c9>6L{J0*`^4G-3K2Y zDbf(Rc{O>b1b4=(OOcbquSGZn>sD3m*>sHQmE8Wh>!PQYt}ZJ1C-3?yBm+f&getnoG&vuL3Ms-za ziJtgs_w;olt94Hc23AYiv>99|Gtkk#y6vvL|2FNs$d%Wn{s;>)@BLC=lC%BScj?Sf z$+=y>otPE=OxTxlQ~KJJ-i5rUIhVaz_EfiqJvZuVa{cES literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GY.svgz b/navit/xpm/country_GY.svgz new file mode 100644 index 0000000000000000000000000000000000000000..5925c884e9773530cff0803633853ee218455f63 GIT binary patch literal 636 zcmV-?0)zb@iwFn}D0)Z&17mM>Zgg^aUq@Lkb9QF{)s|at+AtKy-}w}0-b*Xhu^s1L z(n1FI08}~jn;Y^Eksd!sDnZbWPNrZF&s<|bv4YicSKbYcU^-!Ci5Cm7Ex9X z^I{UBYMH7&o#2)88D4srr;SG`7pWSgVUni7M@oHR`R96r^Jz3lP1H(TgZOQk)eT8UaJSV7zX6dq@ z@44f?)n;-dgc#Wv1;fuW`&C`q$%N@GRtCl&zy70(GO{o;GO{o-v7m|1{qasX{(D^} z56sEDj3ViWf1A}@+;Ze)I|Bm)3pUlMb- z`tepQ{zqMoB%?^$;XmdzXE$RiMQE7$fcN}-NQladh#|B$FP_zv zD13p|q=Qzlo6EY8+U6$r@^_R!jHMqX{Mofn)uLk9PhR{}uRSWl{H zxw$T`CZmG$lDGb`$9<l0C#U4tMV!nMh6Owh6|99OK0)`0|Ow-NHM{29;Og5 zHUJ=fm}Okm-WxuT`!*$G0GJvYbGWEVQF_K0urhQeCb$G5V+s%qYQ_p68x#xypfYr3 zu9zVMv<3jA4~iL%Sl4C;1OUhXRJwBvpkl07TlO(^>rT5>3b-)@*jSE cW1iM_0+p4|*^u@g!~g&Q07*qoM6N<$f+TDbEdT%j literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GY_48_48.png b/navit/xpm/country_GY_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..889b67af8bee6a5944d523838c146ad0a7783010 GIT binary patch literal 709 zcmV;$0y_PPP){@!xZIURt7_(Dm8bp2nE4E!KEVT;NVN`AZdeLDiyO>aLJ&k2|z8t|@360D#wD z-)HiV)=D1$fDy#5(J9^25b3v2^jJWzaOF0G#*4xTV$qOMSU^iyOV^4N8YH5Qt3vlA z$Ok+r)F3(yl2FGLDheHlLc>a-0Fi21qmY7#GzMh~im6<6g?yW)BzMlQB{>MMNiT-Cr2-x rTAJZY(L>iKljRG0mcP8?Eiw8Fs^$i6dbaXX00000NkvXXu0mjfjN3Q> literal 0 HcmV?d00001 diff --git a/navit/xpm/country_GY_8_8.png b/navit/xpm/country_GY_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..95d99f5add9f9157f601cbe3b59914c36aa1279b GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v~00o-U3d z95a*Gco*M#yt??!*Ic%c12N^(JwJSZ`qGoJypH?szdu5Xfd@2C)pu9^f4p~c&HZDm zcO6_Rd7g8Xp@G4kzu&(%eV=`(sEjRaW&0e*o!j>r9o+Ko|Igp{EeB5=IC2Pt4t#iX z|GjqId#zPl*KcNh7FS>R;AtQm8{4$>|8?=4e_lu4e^K)H<3jP@52tOG`8IK@on9%jK2%=DV#o z_pjKRF*!2mQZAPPoH%s!#M*rsQ+!QH3=tJ<>poAv7<#(TBg z1{i8FO#{MgMnKCp17khb-~-i|oIq$`w0$m6RgK972p&dIipd=a-bPS_X;vWkGD7N^ z8UdkZ^rABIw~-N2%;W(CGMba`_BKK)nY@7jH0l10kTND;KnQGv)G+x4LKq`VXW9s( z$=*l`Qve`@G(w`8f&n4C5faK27zmM!kT|9=KmeL_V^?@1B#0>_5EvLC5lrEMz{UtM zXNm*_W=4oDQ&b?-jC}lG^Hc1Y7yyB>5n{!}1_DO|bVJxsWSTS(~f*>ORRg8YJ z2JiA<;tK?EM&QK69SAj}uFA+LcOx)o5&?wTJ2p{9V8|p02oj9Igh?C_-_X?!&{ZprxBDy)f_-x`{3YPu@@GXOb2l6CyiP!fP- z>I9*oL<33F2~I-^1(Kr^mWC1sBta({4J8Ojv(tZ68|K!SAm z&`=zKMCkCOp?Cpt*Wph?aRK71BZ`J%55!SNEDgmNh?mYJO&d(-+be!F6iXm3I`U{J zWm;9s@&y!3CoMFTH&6hb zbkR^AKz?=7NJBLO@}-kr8fsP`Z=JN$Q0_n;I%?2RERimLy7oAe6 zv$M1QkeW1OXt!&{3I&(&`uWIvEW$1!U`FH1$makxoW4GZR3mRN8s^$gXEs qGMbrb$1k)F9A5ss@4f6vV%mTEK`P3?Y0H)X0000Zgg^aUr0+Xb9QF{wNzcN+%ynIe1k!IxiLe|7up=EZN%AHnoy56@qI`}F%8P(@k(YH!N& z_Qfsy{L2#{O=bD$Ck3Dm^L)H2%hTzkPgW1(zI-xP$3wfFNsn=0d(f#Ee&G$kp4f?O$C2Qc9^@R@M6lBL(eF@UMPvx=L71?QTA7R6;rNp>Fqw zd852cav{5V+CF$JFc=#6Zs_;$gACW@5?|JvDZlqHk5xZ4!}xlm#$m4J`Wv#Es*g#N0FAJyi?G$UAIwRH%+6;vnu~YWe`4hSrJ&Ht7piV9;>Bt-Ta@GYy zD-@@y7+90C@4QLwI*at*)*hC>}68+k`397j!ibHTnodP zjVI{jDY7^$YO=^q3~iIPQY(wYV$einyoIMwaCV;YX$dE9$#SL^Z*oKz#J$qAJlP-z zW(kTlDep%*MM>mE1`!aYjNJ3`4S57eJqKba{FI1sz07@tXz!0J)`oH~;_u literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HK_16_16.png b/navit/xpm/country_HK_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..8e4e4cd63911068391ce05c60f531b72165aef6c GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt@!JY5_^ zG$wAHw3n+XL8NW|q6@A;&ocy%9K1NY;EPnzccDG)3g+(*IqqR$7c427cx)C+`?2+B z5Bh5@V)Pc} zrj}-UKR4cW&S1f+O&VtltS*)wF-+}ztTQD#BlFW?M?Np-`c41s?{i-a_4?i4_h}K( OFAScpelF{r5}E)9(s2<0 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HK_32_32.png b/navit/xpm/country_HK_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..b44329167b4b70d68902c09f50676965bbdb782b GIT binary patch literal 549 zcmV+=0^0qFP)9@+~(-y;?B*% zZE6v>rCi+QrYNG-V>2mop+#Ek*|X>MJN%S`vS&Oi%BRoa+qduM{p$0tuLo7vyj9l! z1N=%rFsP1>3f@zZudML+h~Mu#q!RUL6d;$w>#Yu8cb80tVv*in=TVjPARLxq$g)&d z=Uxwj!S{2a!0j#hJoWX=&a$*bYwNd5luWX>$M!ajja*#t`pWb)$t3^n{+__V1S7U0)h9Nj3`%ZvG<8K3GWu00000NkvXXu0mjfu;K?Y literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HK_48_48.png b/navit/xpm/country_HK_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..8c7abdeec5dfea0986f2d037a99f45785e568dce GIT binary patch literal 953 zcmV;q14jIbP)oxSwS+7c6hZ{95Ju5K zgpLUw>(C|e5Y(YUqEmFqio*UF(jJVc#4L!A#EdmE6p8H*Ev;_5eLFN{MzqX~yGiVq zcbNCyyzhMG_kJ_)%@|^C$@8xPepeAFmx@5SR0PVU{~O5Xqol;8$1DM@TSqKLEQZIm zq1=~HNFP2(QggF=H`h00nq0a>X(_T7I=_EL)ijmKXktRiq$E9fQ1GPQyO+w!>8i(rY4YwJJ|Dof zYxsP$wsP+tU0u}I=RZPiZR+dO(W5$jS}RrvluT-PSdw~rR8gU)PxY%#oUj`qn?R>d zOcpU)}#^a&uF<=Z#P%V}+;yBpyAd8(=i zg}8s8(NW@Y4jizCw6)oLecOxBzI~E3F`+|;BsPC~eS6*_)YC&Y%c4cp)d8$u&-?dubl~^n@lapSwrwO5c)je|LrDqe&QVoGCX=@a zfv#Saq*O|;UrW-lV=_%eA_|8U3duCJb*nyqmZa`(dA)f~YS8M{`tn7R-n`MHM@px4 z=8WpAL-Mdv$p|xvmJ3E;&U}%VFl#d@-x|B_u7#d>10{Z(|zMPvkNu{`P zgPIx!2W>k8V943HB}-^-#^eq`S-FzQNhi+E0&A63tF&{c z8XFal>*7VNStCh z2aw5N7>tgxaU(!5h-4iX4yd-4K!A}E-oB-`m+ETz`w0dCjvQfRgvE<7i~<7H)Bv=% zGdxTrLORWzJB*DX5seZEU>L~J1LGw13`4!W)*A9d?d<|>*)qNKj*mM_YWrjSe#K%l z_82c-C=jrEPoA_I@7^sG5NN{&J$oie*{rT#S7qgl-U}Bb>G0tK0{tk#pvubr(7t)I z5{c=U*(@%;e8QE7#q@#!P<00000NkvXXu0mjfc+kl> literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HK_8_8.png b/navit/xpm/country_HK_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..f064a24063a88b6b4bf5f4364b80a9a5eb7efc29 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}~CPZ!4! zj+x1S&Ns*!D9*^q;ra7NLg>sHo{bxMo;@qz6w`S7{``VPhaNmTcHr>g4SBMY`qoBE z*8NGS_`;#orSkE;d~*}i;pP4XizNbMj-EO5;k&*WrwRi@x2Nz^RpCdcfmSehy85}S Ib4q9e0PycU8vp>2y@w7(GXi>99ty;BGLIruuJVsS(&l(XswyKpVN~>-}B-CoD?J-MK z&0GgXi`uI^NQ>Asw>{_n1NWZy`Mh7}b3Q+PetN$#Ru;zWm#<$20Dv8CV))lDy8Iqi zhF>0Vx)}Hi%xJU9giMZ}u`wsDFV)h#`W-3!Z4O#AztI z$)Zp%;?rj0lX`XmSrG9SXEQHjde8o^e^h`s z13-y5<8v$<^w$5h6u)8dISE!%?_T@xy~}+b^8Ou2GpumJrt|1V|H0zZQ@mO-FztW7 zXA19MA`O;w*;@NxcNVguso7&Mr1k&t&X|}08Y5M=!(o4ll3vK(H#t%^!)GXhB_^id zbh!fMOr)6^6K%W`HGbwEX0?4j<`-#ADaHQYcJ3!%Cx&nrN*y0&S=s!{9hnWOIDS7GS(W@LHMwXl@DTdhI;yeUTsRpUk6h`)i zISRjhyULm`?i@vUPx>PFXz$1E9@oReKc!=771SHrhZd)uXHt|VdzS_b%3B(ccajgW zEPRH0KsSKb1$34%JI5wl$wVPPBoX^P5(gz;OFB4s&{70zqty8o3~r~5=n<=i>5g^6 z#qsCe?1I(#_yTz^Yf*A0N3VEAlkLmFk#EK#%0hOlhX=b$sZBVyI{&+}n4+t5$oViZ zsH~*6A`OSDPZ%`pB1&2k*H8BA=}3)`kUxIx_QRf3`1+8hAq3DcP9ln%V|>#?6q-|X z6^~!Lvs_Lz*=raDO@GF+>R znMEsJ7v$v$o9;H6EHfYHx3c@}AsoGVlOg73WX}02Pj*WHz9Ra#R(>;h_dIeb1#*M= zDKX%wK~ zHDcHJijcuBh&q~UK_jvY3p3UI+$Nq1FrHF%u2HFdsUo+6^W;GZ_fl_bvUZ8+iU70G zN;6;UJk#B-X_Y-=gB%JJMk{g)B{ccby(x6NXP~gq0hH5?p`oiBl<{Lck|Cj6f8sL( zIqVCFtk5i~0oI8qE@4_*+t@^?q0e@(mm;iruvjYuSC3%h)TwAX3~3CH+cz&claZGs zCoy%>b)Dl0fOAZCrQINZP7Zp*DpZ5s%~C)0A=wO$fq~uFSQq_jWTOr!N|0CwBSAq} zU85RxcJMq#_teMZimKO-ts05VM;!xNA#TVH{sex-mzAr^J70~7mPy7&Ey1NSxcnhl zdW#E4PVRxDc{@SX8(X#QA9wc7f2n!F{!tZ3*c<@OHW-6s1XihYG_>KwmS>oHLp}Oy zfV|9N&du4j+`x`*>v93M`Xc=*#$m5&M~bkHz3t6crn`&-zP1HP8SDkk^ULkuhu9q= zG$MAEx2Iz^#2Bh-ydUDH648*3eT(6=4G^nKc=*dL;b#2zj-KX)_0HJs?bUiuHC&4~ zCuqi>hCbdbKVM?Wp`Fm&N|q?W!BgWr7tyPzADKF=DC(oXn=qb1v3KEj)Y4Qe%0uD1 zf3T9K|6NWj>k%8%B+S;`L-P9iPR%PaQ~EL_rx!-56%j3+y7Qn6z0J)6Jt7WgX7U^( zE4#hp=_mK4Mw-kg$CM{wT=H#bUG!>UIYb-nyi8pi=YikEBo^HVgbGSpp zimKRv?Qs7&tc#VZY8XQ!QaC@qc$T0|sHjR>-~^JB#mD^nHY!+03NU2L+(PPyJMN`vO zf825Us9xmX0XzxSH0vPN4LwK}#K8CB;(9dgr^JcgM5!q&Q>|zEVPK(D!rq>hBYWz- zGYx#jg%15GzdY2LsQCLp8&|`*oeutgdHdgtKD}}bew$3;Wxw{TQ2=n5g<-XUOX7b3 DX;cdD literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HM.svgz b/navit/xpm/country_HM.svgz new file mode 100644 index 0000000000000000000000000000000000000000..36a363f8ca6dc65acd3b456456f2f8b082755fbf GIT binary patch literal 1449 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 IM6N<$f@+KI@Bjb+ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HM_48_48.png b/navit/xpm/country_HM_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..d7d701f343fddfdf2e58e34c1b8c4df1b4c533f7 GIT binary patch literal 1357 zcmV-T1+w~yP)(3XL8{=q+uxHx54M@KPjXXsxRMXWXLlvPY(4DqTV zcMsP^jmf!*#>|I(pME*N-@WIM8Z_r!_h;jiL^<)v`#8qz00Bt$?>4e0d}32%6~G&eUT^d}Vx*#oVZp#hyPA~XO% zP+bPNc@s!dD2(atEzZeF4&||&oMht_6#LmZ&}u=abGcR{29#H4ceizeUJoQ0AJ4mg zzf_@+;h#|`WDmZK6?}dXs;hw{?RF|RwM@)DW}S)4CAeII9S8u{m|D9SCV?O*(^i_IqV7kJ{Exy`aX2VFU6Pg- z&*30;pf#ojr@OTabh=O6c{0swE{F5)8*P188P+3d?haQry#MW_Me)o3!> z+CBk*va)`IVFDA$h2~})kkz_o7z|)G<07##7$$Dte!&>{NQ7OVFofV6e89<*$p|6V zU5*}5h+~e34R_+SjMy^SPkc!;KqDcUt)Jk9=OIb44uP2U;yOHZHe!s=ud(hNi=U*r@vY zkMr|W5rVsS|J*pf{vTSWAxWsIakuy6Z{EzaXS7uKx={sZ0$vA8RS4 zC{J2i{M6Kf-#8I~MyGTC)T#W|<(D%?MrPKSND`{6_myAhzk&iXv6j*U2L#8CedzIc z)#~&BK%vlVWLjMOm+4YjKql5wIydKTX!zsd!@soJ-~E9K3jApbz6(s_V=5|QVPZ;Y zMn(drl#Y+vD=G&0e6HU(VK5Z?XqMYM)jv=pBP`i{WMrnexYzAo^)dZ?dDGTtG#OH< zNGcU+G#SBOVzJD>d9$#zBJ6X2f)whAG@*Wa*Yvr#r1 zg$ZC^p_CMHN=jVBh}guwLRndfG|m3`5-H(U=+L2f0LaWt%*;&m{oHNg@=$ek4v)u` zN<}mcv$L+HB~M-5KkhaS;J0jS%=Y~G96=z0K+m4N zA0M~<$3Pqoa=BI*+vQqiZCva+P*YRksZ&zMK7Cr+)Ks{WnZoD~1=NuvNpg9TFNxV~ zlw6)9mv6JP8G3(+rP`}hY5o150)R@@GcYiB&jQ%8GXec+acWf=a=wD&++H>ug|AE-F=YakJ&eAt_zi;ko P00000NkvXXu0mjf9MO*i literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HM_8_8.png b/navit/xpm/country_HM_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..1c5e290c62aa7500d731b1cbb7e2d10504520cd5 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}so-U3d z95a2-7;+slkZ61O-v9C~r{j+%G&S#@t+1uLLXBU+qU;-2++o*(PYic+1$gw>ycEv9 zSJ1WleA;{Zi2T5eSZ7UlZD~Tgrke^>g!bA-&d8eEaV)|+O-cX6rU?-NZB;3 z+pM@@ic{UGr!S}Nvbej}XsL`bKXdy57L&{0muna$S1~SFcY2kUq0usS1;!(VN0Qfv j@Hu3AJ2cy0{>D9VqSM-$`(JwjUCZF<>gTe~DWM4fAt+w? literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HM_96_96.png b/navit/xpm/country_HM_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..cb3cc3210734c6446abc1184e11865efed74d28b GIT binary patch literal 2564 zcmV+f3j6hmP)+b>08Rqx5&jh5U!NddrKtaLkHnHXtwcW&UdWl5C8e_3fg>zqjd50PZ5=sw z?2f@;L^+EyAOXP2QFu52W=D*6+S|u6GgWSA2h5jwXF6hIN2#o4d27lNkw}1R>Le{& zW=B(j7#+F94gkc*Q}OW>mQdvC0$xWhvE%R02Y|RZaak2*a(LX!PpoS6#;8L1?L?T3qX=9S!x@a_WIXN{7MPzI1IRMDbt^Mx1$A~d~KrTlLpw(Ix zuU>_+GNgczgH|1ag9UAEqXa<&2X8|R1ptHzJqA_?_$Ok7^XK=Bj~fVrkVyPK`>Yo+ znnw*Wn!!PROUp0-q@+ZmNAtiQL=a#yS#6-;QCBe6i6DGvD-qzv;lz4~_t1Nl(#U0Jf!)%WH zgATE*tQeMWLjG`q6pBayNJ^4MLc>dIj*uIh|x}megk%B@H#@znm&F!t5Ws%^-bw?i_6QVTeo`d z-=AF1x9u0#faq9U`ShK7cQvuSC}*M3}CQ?Yp4OE3NV z#tkK#2M!Vd!ovJpThBSe4h^n;gezgS&|R_C&IR9k!6L4@^L zQ*JF88kzxs*;(V%)B@wdq+A|q)neY@C zNr~AGMZq`UU>RBK(d!qL%5`In{$~-529!#B73r+$g$s3bF*mn1C#OcEL0!DT$nS!z zpR+m^w>!fQjZU}Dk>zKk+mM%jusZ6#8EB0SyMI;fSk$POt@uD4;VI&lkkw5e9>i$K&|q=79^S)({%%pOR9kRPN$deT!Y@Il$+W zM&mO5lS6gSA7Zo@Zgv2dARdq4JjmS~Jc6Ek?wP145tdNy2A)YeKAtj}OalWtEYaKw zJUvJzqpV&_dJuSekW41VvZT}v!6k@7U5Mqba2#TpnbDRpMGz1hD~^p7TYf8(QJI<1 z7+U8Ba1_+jqwVT?_44IJ0EmnX3<~lUi3E|6fdFv%a$;B4tKHpNrWjiTjzes4P~Y1- z`Qe9$4;~Er^2>gDXHrsFadFDaFUx-XQT^+$dVGy^CEVvAmFkgP9{S2F@mX0h^q$W@ zKPD9N0YIhd$J07Dfcs^>qT(SvFVj*i8zvJ}RzAehHn)Jgpus_XSC@@EUuUO!aL_}> z7a-m!+FV>yUHu3prn`Y8sH4M1p3f>Hxb@*KNFov5ylEp-Twb2x!bPmu;V8)0mv`sR zUu{0YM@5NLs*}FHJhXzjV`Xd1nV8^Yh8Z!|6+J^E}&i14SMCg>tcK-8D^AAFGd_S;FTiXC}*ttbHz z$<5u%=abRV&zMZ6!9o4f(sFruH%dU%*Bxut>1^7v9eZrj_k-9Y7HvK)JAYN4Xyp|3A*Y3V6qvrxeN{UDScL{WZ1q0jK}ZZgg^aUr0_ab9QF{rBumo!Y~lM^A%H9NJNT>9hL-? zfYj~U9_XRR6ii|@*vN4S{C%B3NlGfz!o~6|@4cC^#=&&EN@2rP#-#`m?Ggk`%;kcM zI7F|rC+wr?q!rveJm1gWULGOa#Ktry3i?do_ZhPix6cxQV6t)M7ES_WgPP; zWgXW#CRVv~DOlZY0&AJ>Vkye7Ry-1M$`Gt27upPi*aV18p*yhY50UbkMw)eqjj07n z>cXJDbtwBN@R>0vXEII{Tbed1l}6E++SEc&X9%3QZZ+7-mg-E0N<8v zm+PK@Yppj)8qZ$62qku}_6+~U;)}uf8fDy&K5kF3oyGD{|F}DzTiYD>49J{t7F13- QaLS+K3%5xVXmA7o0O}6J2mk;8 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HN_16_16.png b/navit/xpm/country_HN_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..e5e0540de4e87dc730e2d6669b8bc0087a509511 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^_o-U3d z8WWRK3hp0u;7U;P{QBU^fgP_daHssc|Ns9?Ny)-ONeKywe~X*WoV;#d|C>3n{@*wC z>{F#CtS_YI?fv`l{r&&7;&JbH|9EzP|Nry%{y796XnN*SW|rpW#wN#Srsl>5WB|D( z{tF~0SbhApe0_j=?XO?zxlFqzU$FJHnBtaniGjiA#?%kr60<>$X7F_Nb6Mw<&;$TR CFjm|E literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HN_32_32.png b/navit/xpm/country_HN_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..87af54976e530abd28ced63559a5d46c15910834 GIT binary patch literal 335 zcmV-V0kHmwP)f_CEjh=P!i)=F`u2pP-ig`tx_m-sc3h6OIF9;9qy1 ziHUK2g8}hc2t*MY5EW!+Vj?kR6ZGTu)34#|x1WB!{qzf~6fQu(f@g1j@CNL=aPKpw z)P;MW`2zMnd-DUo2?YErDa;;ZBdRUOjVYxq#~o-bE-B28-vrVknGC=Z+Ioqm7BG&s hDn>0BwO|-n004}unux;BS&aYy002ovPDHLkV1gP_nfm|$ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HN_48_48.png b/navit/xpm/country_HN_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..2df57777c1676793781163db747d2ce12ed0a86a GIT binary patch literal 399 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 FV1kh=o67(I literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HR_32_32.png b/navit/xpm/country_HR_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..2736a9b50eb70f3d3586cac9ccf62c946abbdb1a GIT binary patch literal 707 zcmV;!0zCbRP)=gafHV$SWBWHBt+EWQr_pqWiHic3fr96%%zXhsU6YkLE*?7c*Bc$qt;H#qKf zfd!`gF`h2IVZ&X{p^@Q#3-IB}SuA5)+M>PFV z_q1|G_3}KEQe)}jb3UM6QW7CR z(?lxAmb1MY4%@zcSyv*EilGOCa?b6RdMG3#9UU^#*(vqe+05DWw5pu^KNpdsxtZ9| z5F#%RfbGFS9L>!jgu0mW2xexalu|A*rL>9xK3g`1c zfwQ%h_IvMn5lE{_nfnty49tc|Fl z2vw@ZwJvP_VIb(nK~3fxS+;x2cfG!yL|*>&b&ZH1(y^p=7>$6mv5FPX7rCii%Z5ISW$~i@Tw#Zf zi<(_cT~e)6_jIK1pZ=-x$)v)w1cBoS!hZ**|xDL5&3oA z#+Ne#%h?KVPba_`*s}gS!@=?ck(j!VS=MN)S!jA(ViN0XF1v7O7$v@Uox7J0DLevK zNS!eMJg{0Snp+llw0z{o$?zIFM=2&E2U;&(yZ`ksk9H+h7Um4BkV}fRgk7@?%9pV_ zxf3#{mrREE@M!McKc+|ae6#gd?|N2)IRh&+|IdLR>%MBa7h1w?RY-$l#EuDUX}Q^Y zvG~yD!du6WES&~y83Eh&+NTAduWOudHEjw$Uif#nacl%3q!rk@3m0E-mR1$e6+i4C z#b+N52qE;>rfnr1my_e;Z=I7Y`=r8KeEKlVHm67wVVRcZ=D5RQ_IN0(RXTeXktADN zn;0IJuUv6`qUWHt@S8d=2y%P7uB3$Vcoe@s=J(T;l{&j!Zf}nZ0@yZ<)qycQ_ub04 zZBJn6kB%QbO4792-;XfXI~*9HiH8p{K^PV+&|)#O&j%#JP|00g7~?^&SK#^N=x8Du z6?lHIx_UAMQ^vI{hJY1qOuISwZh|3Am7N?EO7 zTLL-v!!m6Q?yrnYn=?l@W5&x9ClErWhK58a6blARTeye{d@jN(B+A5q!szXG+U-{R z`qV&xcDr@6X9pw(Op_K6Lg?EEX6=>y=7}ardw*xr@k|TozL;n_^F-u1+s4IS)&&Z$P^z2Q?>7*NRbNUuFw1zr9Wa&vhdphyJkJtLbtD6p4&X9Qg|NsAo zVSC=cOG`*eND$D_b)C_WbnpIto)>&cA%(MxWsco^_wV!rd*;LS>*wZ(Kje}yseUl) uMx=zK#Q*>4KR$||oOt5c-#^VSlNmbYR803@VBQCG27{-opUXO@geCxNVN;#} literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HR_96_96.png b/navit/xpm/country_HR_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..552785d265bae72e5ea08087e05a97d86a434159 GIT binary patch literal 2283 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HT.svgz b/navit/xpm/country_HT.svgz new file mode 100644 index 0000000000000000000000000000000000000000..c5ff2e40874fe72760126037d005d4acdb45e8b3 GIT binary patch literal 31729 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HT_16_16.png b/navit/xpm/country_HT_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..10723c0ea78ed984c9c554fc22b6ca6c71dbe1f9 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`5o-U3d z8WWRK0%n|d;7U;P{AzIVK$B+3?A7^c9~&pne*GYB+q0A6oVO30J9XgmclPhw|G!yt zBWK5#M6Fp9Ui5FNtbX^|;E(Uq(9gdOnm0`DGu~67QPbVo`0+(~o+wY`F>fZd45$4& zZ`Oa@U~FKpq4wv=UtiS|r6cwy1+ud@8$9y3#=ubGpz>h9fv+^sISihzelF{r5}E)O CVOM7W literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HT_32_32.png b/navit/xpm/country_HT_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0900d08d7909515bddaf239033c0c76727b8af9c GIT binary patch literal 364 zcmV-y0h9iTP)A5k zdR0Iq4=2xu7dM2ZwTaY4Y#jXm`)$^|^WUGnxOem3@)ei<|NTy+MwUw-rV@4q2m9CW z{`X)0Q@n8T?H88YALJOAI8J|<`R~V1!WIze5RU&0a$FO>zmef)Vi9HE{_k4^ks67$ z;Ogu9Kc)Xa`tpE*fq_v{;@RhC)U@Ca6GOwknan))-?;xXGq5oI{&8{BgnA|hV$u;+HIMZf2BE?rR9eM52M6laS1Oe3yRC_{R_ulp4Lvy*c(PrCSy}Wm?s~o5bB*X*jyI^ej zoqO{<`%b4eqdWUR{0ym?sdci`%62lmBlOzj@~~7^M$qMo#Eha)apv&@*w)K$v?v{` z>Vygz>yaPQM8td-G@o4M>);v7K&a{sDSy?6O)b!zml{x9PK+!$0<1R#stN=jFT>b7L%pqVYp`Fg zO#x`)<2Yfko2zQ=G8yOiOj0L^d_+pP1JTLYQTP9YIujE`Z(V>M1=gW}D9 xQQG}}U=S({LWM!7FbEX}p~4_k7=$YAKwtFlq7vCk`9uH!002ovPDHLkV1k;20T2KH literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HT_8_8.png b/navit/xpm/country_HT_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..b92e1cfd55404ecc6d561248c327fd51dd36ea41 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_boPZ!4! zj+x0R0W;1w@ERnFs`@3p^?A&@S@%KAG;jH3P7%xHeis=0+y5m|yXAC+=K+>eNy(`R m2|xb7HV0$T*<3gXVPl! z<{2@RN9MJ#6%s9ZtgPv{9wTYj{U18N^L^ic@S}U8UDWsK?gIb->Ta$`@12JJ4^Vl> zG2cGK?qpB6y9*Ma_EB9g5l@wuS8gwYM2S^{?tI5c>WAXu+`D|KQap3xTHLb%|#cw6&}SR@3Qi5v|KRFoZlvcg%4 z!u@*U)W)0V!@EmbOXRo&&t6=zXF z2Rrc%J`K1|J2R+Zjy4bp1V4Q2b(Ri@v??Cdg}{3pvYEsYY1CIp#0|j9I~l(7*2#y9 zBXW1+MfGpgOv+HENs~Nasp{?P2<@_2qCbx~&m%N7uzN|(vHlb5Lj~F|Q{X1I8pj2H znz-`uE+oc8N4y^YYG)nS6C?5oX1L<#;*xz=K$FrdSo_U6^)XNRN}W;>&dDn%Bv#zo zXmL-l0GU0?znqz$!p>T97_d_se%h^{HabmM*`hIFnh<;hq8u&H%iKc>=-8g?W-=>z z`Q{^^LSqJe$fT4pD;5baoav7^tpO^WACkzH5bl-Ze!4k+!eCb|*u3qNx+`-1JX37` znRuwBF~tqc6lHTeE7ZnMSD(8cHt}~!T>lIMmKPDLhDEO!Thpw;?|@)LUDuoG@}k9t zw@etjBIE)NhZ@vvn^%j;e z?OB3e1^xtU@2W=#hym04b&>rnE+fFkNxYs^W6$^$Nde#Zq+vojrJ_0xb86c4mN&O&;Z4a#f0(iPr4y^U9o`5^ zm6cGz`a-Pr3UY=0@GJ~h?e(WTjgqCo% zWagljGdt}ijJ@S1j}OvWHZ@wDek0BSBzf|Fq_)Db>A1nF`+`QN-j<+=&3+W|#`Z_Tp7m95-n2U~8 z7mt~UH&eIzXmyn|d1Q{wcC5@8fb$QBw6=42sV(F3bOoEuCZG3}Mh6C>qGfosu*T0R z3n35+nDW~c!~9BO>^MiC%HPL#%@)*E`wtUF z$UE=}I`7gdn}GqgpEDI`>WwTrJD^JDPgR;yxj?xkQkb}~^S%H#Cp41l5SsBHLvosT literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HU.svgz b/navit/xpm/country_HU.svgz new file mode 100644 index 0000000000000000000000000000000000000000..138e5e6ee0e3a0a57a92c08d433939a043a3ddcc GIT binary patch literal 229 zcmVZgg^aUr1Fhb9QF{g^xWCf-n$qoD;FYippf`tPmipot&L<=));ymy!8m!m>w(RR{k24O$|30)d4bdv*7z9Ju_I|hxlrvzi?T;L{wX=_XgA=o?MVM#7Z z>cb~v7{@X0r|^E#z)5Z!-}@*)jgWO?8BD$KyIWCO^woeWsT6||r*uL~z(0ZLF0Ksd f3s_avABsMy=!GI=#-nKu-e1pdP5NL(XaN8K-D+rE literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HU_16_16.png b/navit/xpm/country_HU_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..456fdb76d255b5a043f68e50fa97524fa079536f GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`Uo-U3d z8WWTEELn5dfh$4D^Xr2v2Yw{}_Pb>A=l}otD!k1XF6*q$msRp)R(4)5?J32!aJlC- a28JzjIJd{XlbsGUg2B_(&t;ucLK6V0wkyQ| literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HU_32_32.png b/navit/xpm/country_HU_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..323a192a23c150c1ea8e9a541ad6d309cd902c62 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&+NJY5_^ zJUWy2ELn5d!TW$q@MU*hiLD7&nAku-tj^zjR@8wX|Nqy|iZb}}IN?fDAa`2>tIopc vsEq7`v!dHGvkqS9Zw};k)0JQnV_*oo$#H!t-}Eg&lNmf+{an^LB{Ts5?hiA& literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HU_48_48.png b/navit/xpm/country_HU_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..70e2d00559e5a24ea027f0b2bbe6b00372c5130b GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HB4m@8`_0xEj-AE3GPbbWGR=LoCcVUHHS<3nB{sq44#y)3Ndkr) yE@@%rF}GxmIwV}+;zG&$ukubWYljPf6xL+uvif^{J81&6i^0>?&t;ucLK6TOeKv*w literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HU_8_8.png b/navit/xpm/country_HU_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..f3afdf1520d8edc5067276023154731bc43536c8 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_cZPZ!4! zj+x1OmaIA4z-y2wnwpT1@bG)dVXcEd{{OER>gBq7sVO$;?ApUiBv~0IMRF|X;9@oe PYGm+q^>bP0l+XkKxHKj@ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_HU_96_96.png b/navit/xpm/country_HU_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..28fb5413ee17b4a42f5c5852bbff3bb1994a0ed5 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt`7JzX3_ zD(1YszNZgg^aUr9tRb9QF{eU42E!Y~ws_XY0|o@<-5N)hR6 zcb-5GP}=-K`XWte^!BE>6LC4rd>_;H&)Kn6F2Q<2s7e7$(k8sUDs9?rl*9B3Mx zCy78F`fgXWVbv_76c9{|j|=B1r7|5$zi3_yA$VQ@OLmF|p%K|@q}3)OoO0L{iyR|U m);WazD66V&e($pl_&1=G0`~fp|EcXrSG)lz9?16T0002tPf(Wt literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ID_16_16.png b/navit/xpm/country_ID_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..96cc679409c67fe36d29679fad5332478ea19206 GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_No-U3d z8WWRk)K?sH;7U;P{JMfoiShCO|Nk?y53gWLVqm!E%c7|9yHE+Jn8DN4&t;ucLK6U! CoF5|q literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ID_32_32.png b/navit/xpm/country_ID_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..dc4de34f15e6d91030d45e3c359b744cbb2cc9e5 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&*yJY5_^ zJUWwY)K?sH@IK%YeA!)BVr#;cra*2t-33AkfByfs_tlm7DSFHPeGK>HK literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ID_8_8.png b/navit/xpm/country_ID_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..062f28471265b3065a38a00d8d2ae58d7d5142b5 GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_clPZ!4! wj+x0e>MM>l@ERnFs(Lql{Qv*|mTk-o--KBN;}Rds0+lg%y85}Sb4q9e0M1|>=l}o! literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ID_96_96.png b/navit/xpm/country_ID_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..fd693026b2119d936e4cf8907d9fb64704e2d396 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt`lJzX3_ zD(1Ys#qO)j&ZrL28Rd>7ZYn^lY`>| rg#ZESa1+m1mgif{VyCjPFc*piRI?lmTirYh=v4+!S3j3^P6Zgg^aUr9wSb9QF{jgZj_!XOle?+3kuoUWTTW7L>M z5IsRXKy0RhX-vs_``lJRv?6Z~=Re>1I9RT(Cyg$=ampG7)06<>rn0p%g28^boy-9_ ze=zkyTf-R`3#;WQDcwbk5`<7(H;#ey{#;-jLP!HmZ6k0-2*Htp4hyRGl0i;L-%GB9 z^bBYWmTgityz<@X1!qtA9e+g5-*mj^sI)G|ge=xM1%y9b*Ei2^Ga6EFyZ1#s`&T_| Wo@aE^o6GjAV!Z?HN&0n=0RRA;XJWem literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IE_16_16.png b/navit/xpm/country_IE_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..86e41a6ca80695e90bd9965d862d5d291d7815fc GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^eo-U3d z7QM+SGp7ET&&Yd+FW-9MA@#IIrHZV#oNaT3buU~sTF5hFOx!T;?TI{GXz+)yGBB!`a|fLm+#PRl*g<#e5Q_ g2Uak<$zljGXa#coeLhLE6lgGmr>mdKI;Vst0Eihf3jhEB literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IE_48_48.png b/navit/xpm/country_IE_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..a69683db2aa2ba4d74c2161f5cb3cf5dcd5bab34 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H-F+y>ot~?W=#Dvzp=4VG5q$+BPy#kxY>Z9O>?5U#6A112_TT9z|hvt#L#TUaaO$}E)J-d N!PC{xWt~$(69BmrBfZgg^aUr9_Zb9QF{rBzXH+cpq>&#$<0FHT@dq-@!8 zW~V@%rY+F50pf1hBQ4PqVOi8j+KT`Ej+9j=oiS{vpJ?*FkKY~dJI&ud?%5JtA`*ZZ||<=Z|=V?SARaf2XiRk@!Px4pO!#^DEecxjH3J1Jv{yX z0a(bQ==~RR1wcw`o7*UA+cs=Rq0&Y4LGz}RnTaqoa-j%|kdCo1w>iN}95>3T&Ef() zrj)vH@=`5xcX`O|b0zETB_Ny4W|2R2!L7_~xge7XCRz$vly*VJDgHS~(Y{m93qpZH z98+Kza)*d{E=+d!Q1JrP20j_hMKzE7W_P+VZh^};K>$yU$mB+5+@eGSTnn&#D{9zi zwF9y$1w3kXkS+sW!BXw(OjeHh$#N?^5x9`7;yX{`&Md-u1#azQ&vJ$Y;sjRGlv+qg zrgR2_I6ZNF&8%7r4Qw_}ul?SG((oHEP}Ds?$b9H2Nk;`wnZyPV!0Q}VA}ecEsp1G9 z)lM{sA;9g4_(iEr2MRM4$|~xZf(;4|xoN<3H4z2`&q^>dM|uMj3fV5~Rqicn)I67a z1JXE2HH;`kkSQ}5(Q8-$KFST4zqB2U&WZR3b)`tcWC(jBdXksX5V&I)v`TLcY!Ei0 z!Gs1g3RcUoV_PbvvG1|6UC6#^xz2+|$=aeFTqLiH3NH{9zRUq%RzW6eC)~d?O1?d% zGk|~j(P1!%>CG!`*XQHwp5s!~O<#{8Ts$?hcBkJt;3qgB2u_{dsOnf?E6RL9`Z5sk zl|i#&KJhGMV@BD8C2TaECgYf0{g`$TCt*CAq!SuXXDm&Ul#PeL#vwLrLQ^_TCTTjI zGWriB{8uD7L52f0PQ7ffE3wOSuD4*e$6#IU#n9OvC9JjLXk&$w(R;Zq6}D+5>cU&Y7sZ}3 z8KQxKLoSWw&gaOq(>g*U$b&)Jz3&mVTb|1T*aqGGZ9$?Ae)17+<5N8^Us%`;nPZq$!{`oF$Sa`ya% zD~~N|1cKhykH62?1C>Y2+-M;Yd$>RT|371cD`$3}KX71y-s!K8uiNvPiR9jJ&U|=o zdQT5eVcw$|K`QLpZF}>;K~P=?|r>; z|0@kGn6m!ql=V+Z(!xT#(hpz$9J=%o!VusgRwLm!xcB_W>I1JC7#I#+{0LFX$jD%) z$IrmP5auAND9M3eJK-Rb5Mt|E{^;ucug9)_6y;|TQqHU%OX4mJnj2f)5xN z7%FGq|MuhW=kI^#m8ml@FeG-~e`V8ToyY-ph z`^dwWKZwywR4V%M>mLgf6M&{xUN${`mEe7`;RVQPH%!Y%GkAUj1BFqshR) z5ZQcPUYz~+pZ~pC%2cr6+s}Wpp~tOt`43(EV5cwe|Ns9Zmp|F+@gKYL>G3KHPIdxe zK-hw(Z+>n)@s5FkVc+==-+%o5&&a^d#_VV$z`(%ZZ6PEr!cM6LaPZ;FAIt3X3=9m% zry3HU(MZV20z52sdi;!x48)txKx%1v`QBGXMg|>4ZdzGD1{kgMM}P%`tkNHh761Uj WPxXRU&o`z30000onkq)IP{ouf>z^?)GQ_)! zQ*IO$Lg>V`PiJp^K6CT)$?KmeH;oF3IpU#T|V<39~bk_U;kzotBDG*GB7X%+K9-7pWx$SzW(rAcZL#qCX<<{zy16t8+u$s zfX!T!cTuGVTs*ez#;F^h-hBA|c(o-LJ2_dH%xura&g5kweCzSIEPp9v@hpF-TaUkc zTMCos8uA^)z`*eD|9=JshF^bB0{GXTe+&!^|NfC*l#uD5k6-_6I{H>uk!R}qr^w<{ zH$2l-;@)`l?Z>Zw=<1+FJ703KGc_d2uRHwa$!lnt^yKx=^@rayCMa;RGcDfrl01{i z%w;n-KbIC|zxCuh9~W~%$4yrgK?Vkf-DlqOaWUU~@?A=VedgxpIf2q-m^|nTMsghV z{_~&rU!Y0k!jhB&;!CaG%a?_~OV$2DY zVq|2bic!?*b^Q4CkCBmqos|mh&q3D>8Xb-y1V$Z12#h+25Eyh0VyTapA80qAfI(L< g4!S5Cbr2x{06m3z|Jp)z0{{R307*qoM6N<$f)&DQGynhq literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IL_8_8.png b/navit/xpm/country_IL_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..74ef3194a8b211beac673405d9b5173f9d6f715b GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$sh?&7sn8e znaOwR|JgE|9XRozfMNHM|Ns9hu1U|YH#9Qv;M(lC!$;uN`TPIBewM#-w*JF&{SaC1 t5M^a%V_{`xW@cewWyZw?(S4_PGDPXf{EV~O@eyb&gQu&X%Q~loCIEDlGZ6p) literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IL_96_96.png b/navit/xpm/country_IL_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..3db5a8a8696463637807ba5b549b7bf7b02514d5 GIT binary patch literal 1594 zcmZ{ldpOez7{`B`OMBcJaYDoqayoOrBt^sAl3Q2NB#kpRqm5Xs$T62(LWWV6%h5mQ={e6i&-=XZ_w(2L=jWU3?dc*fqb>sgfV`V4;>czO z{#Xcj^M;EB5t|_$)lx-U@|tD<6skapf> z*3y|!_WN`bFQJTXI}v-H7mhOIw#Rbu^Xn!3re`nwkG@R#T@~uAJpRSC#LGP)R)QTkO-yFO3I{0<^NS9Sx%btSbYZ6`UGyH>chPhbSCJ znj9tRoV9oZ6rCBqY&8@;q$O>#pL;I|OsK7&>?{CtMoaw+?+o43IL;EI0Iz5CN;5-1 zSw$R$%@{aQ)zAvVqUBb~O16Cppy0jm5;?S`txoUxNaw1Gi&qCk3>}&H6XqOVOSA;xvM!y&bTrcS%KaZkC)D*(#+5FpRSM(U6iFH8O#3c5 z=o4g%*8o^ZDE~%2zlOzt$HWZ#9VB#1Wv7hW_&V97fy_f~WrJ=>Q)xY)I$rA!bUzF) zHoD}2ZL>=Vyh$Yo?~5;#X3}%AG}vF8Dk-TJQ4L3y@=f9CPtjqQ#YQf@%@GIYt!V{} zr|Lp<2!UEX&hbTke23U>sz#b_W~JmQ_NJdG0wpRuoRSVKcLh3-Q`15{t+RkZ;~-=cLCz;DO;Xk3o|lpjnkpSt}rzn$*Mo*Jx4grR|c5Tg|8}2 zJn9_v{3p6jUIS(djbKKH{a@+I!jX$fe}QPlzO=-&z2Z-OW2xh_<#E~3=9$Xd*~fx| zvxedfx6b3-bQzD(qF1Te$i~AyI6Cbt++!Z6B_!7j})BI zOL-IqrZQADl0gO+2Kwua&c64Qe0Rm$(Y+40MYXP{kmyVy;+;^I3+U^gh1YlZi}x0_ zT~V_4Bn?6z)Qb;wJPLt2J09+h9A8Kx(yOoRz9>ZPCK$dL}NL%&`5KzKaD?ET!7ZI;qz0)ipj0knm^9P!{ zzsX}hEUKkUyu=mjCvCUS>h>9QFIPL&;FQ4|UUbPlt?Z!rptlT@aO9{BRT zF_ZWq&MHqLn`msW(cojYn7paS^_?U*>ffUL$(cW)%`Hitr2n$!H?3t?P%%p!L)|O` Nz|F}MQQ{Do_&4SN?_>Y~ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IM.svgz b/navit/xpm/country_IM.svgz new file mode 100644 index 0000000000000000000000000000000000000000..63cfd31a2df564c78a76561c05867853bc87fd19 GIT binary patch literal 7644 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 KZmH#H2LS-_lG(Wc literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IM_16_16.png b/navit/xpm/country_IM_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..7ddcfb1ea5f3a3b220389597ccdd4bc2e9e939e2 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^zJzX3_ zG$tn3D6Tl|z?Gon`L!YA$MGXa4jlO4>ebQM_|V=^>fY-Ud-}isH`D#E&wY6@$7cOY zPAn!L;%ooBJ?-6ixL-o#$q)OY4>q;#4$P4@p`hWZVZEcQmSs_r`z(8nQigP)rBb4#5(@hPP^c6H6^&NmvM!5V-m$xOmNB!Vm=E9_nQdhM)yd>M&oAf6oEh?1 z+<;t$%W3yKkOzJXkg@URLjL2s9c(n$8Zj&bu1DH6j>OyQl%-kwSdaNIGAx`AwLG-e zS^&5c@#y@dYh^L>5i4!#QrraqNK6uj`ZPUl0Z?*yqn7*9t6|67hRfsUssjK-DdY?9 zSDZyG0PL!o-d*s9ccdpdlS~PrDgfEmdc3B-t)&74gH-R?0f3OZi=#;3*&sv+1q?Ys z0|+#moGK3>+1>p9dhF@_tIPynK9$PYi)DZrar&QZyAISeJbNYA#kM0$^`_EZv{bON zu(L(H#KZDhA?L`%c*;UT`A55-8WsA3o{3dwN=fq2L|2LYMpH;TB8L!98)Zct0U+uC zU3burs9^oXrufy70m}W%K+(siZF5WS?MOJaoB#m42d75#DLU?_{m!uh1jrtpxRqLx zBLILQ>EhloQwbZ8ywb$~3R4N~Jusug;K4K@#uKo1X9j+dJn(J40Pt3f+ZKC+r2qf` M07*qoM6N<$f_$g)#Q*>R literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IM_48_48.png b/navit/xpm/country_IM_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..afce6b8e98f46bbe44417ce0eb037ecaccec9f01 GIT binary patch literal 854 zcmV-c1F8IpP)FpWEI3vCaK)YjfTbU23T%4i&;hs0l$56h*J1 zppxp1z9do!;_jcRe^w5pL^*VhFfSA4xsCaiiyMx4E`Vf2cWq!0iluaTIzm#AVX(5W=#3 zLCpeVUGv(l36`@y>1DN=xzE?Njh7kVP(T16VM^*-J5~#Rq4Axuj@!yCi|yBCSc9rm@O0csU9H zKF4k;MN3(pea)vrjD)k>pC#l>YRN_^0Km#@sinMrpNi!t!&gYkB9b1RA-MkYMtsfe)#94{tG5;@+CmwXH?E#*fjsE`$& zI!X|P(OgS-W^FcGont>4v#V7q-kE|v8FjEhq1Petxb*%T-`wNHGsg@q&H`;o=T|EOIB}B433sQ7)b3zFv&b_s-9owohhh73Bv^adr;R;q<2(FR)`G<>>3oL38~7h)`+ton glnGHN6WdPc4>Pj`7fh+bLjV8(07*qoM6N<$g1?i8ga7~l literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IM_8_8.png b/navit/xpm/country_IM_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..7eb082970b74d9f37ef593708547e1a2c85bcf02 GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}XPZ!4! zj+x0diYrbx@ERnFx_bP1lK5Zp-LJ@L|Ml6myI5XdkB_gb{hOY0;Ll_8E|$yx|L553 ziK+j8pf{;;^9?<_KmUKoiE%#r{e9;CKgW~~e)_4tX*GkBs!V~xd;1SS8yGxY{an^L HB{Ts5{Odqv literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IM_96_96.png b/navit/xpm/country_IM_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..0910e637ae88f69370e4965913b9d5d4058b3f3d GIT binary patch literal 2194 zcmbW2`9IT-1IORyHpg;&qG-#<$1N#|6ei}#oue^XORe0JyD`@ajdD$Hk@MruC?QI& z@L?p!+?sQR=G^%B{0ZOh7#r9e6aAlgK*#C1 zKjVE2F3b%h1K{XCX;C~G}4+$woTs#A9$SxzP*8fx-Po%w;}i66PNCS)djIhWx4?-jRn&g!)uy_wthb7z7OvtQ zXIptA@emQ72q1zv)18P7pAn7RrP9f?1Jn+VC6?pe(s^)ufVOuSlp{B6YOP_ZCYDZ znWM@W)l=sg-=ny^(84wNkA*AqUyey{WHbzk35y zI;TUs7`raf#mMJw9zq0UXa_veJPPh38K|3M5*X8UMc(|q}+6lHYI*woF~r_XGav5!9gz}xO!V)nTIiVY@Z?yQz2 z<->)qoTm#njl?XW+OH|gZtm{c7T70Gt{PgqAwjsFnz_U(cD%6+#(p7!dWwQ$-NHm6 zoNa9%7p{zzy%*#(WbdGqE_&z7H!q4qp_UdFl@%4#55ay&B+|}K?DEowmYr1QGV+z# zkDUWHd^bgfu6;d1#$h!0U4Hv`#mtR9Nv4V@X-A0r)64O3$MBcku zm-C;?$@e5ABycz!S5!pz0CKWn;KfU*5do^1CFeNMcEGQPJzes`@+ySxkRpEv?#UQKVD7sovNOMkRg37fs zGYsM6Kx67iELWy*!(QO+&xDh@V6=@RcfiISac zA5-7YXMj4H*%ijQh7@(CE|2i1sL_@JjG{3se=KCTXdPNdFNl3r#V_@JRd|}UX`bM( zDG5L}&3=&>ECw;-JxPiccOW=+ha9i1@&`>d0yw+o%U z4(n!H7spi-oeq+rI=2r|35(Asq>x8_*Zuwdf$G)1T(Yi z41RO*w7-%AfVXIMOSAiJONuT zfGwAr0!wuI@%%Quyo!CIO~XlmPp7;!=pokU(<#H)?#4=kN;8R#w9XOS^S|UY;C)J@ z-p}elwX#yGsb$McT8KvqPrgqU%FB@Z~J8Wi>I@igP9kGV!AWEt29>ud31)#26=i)9w9PxlWN(H0j+Mn`G%;72JW?D~rq#sp!sNSdHic%m+7_V zy4tu2vgg#;Om+l(-Ls8okZzf=rvGW-d-^Tq`{D@e8bka|iTiM^5c46U!6FUgbOjxUhf$h9=6TwOS5w12Lif1TnBHQZ~Uk#f0wWx%yLe<2j=6Oi*smt z^-C&hAV)J^d(`mHqwQ z-QB`0S?}v>V8KSn3z$GJ<1JZ@|E})Q2w~$dm#Z`hHqR4LqBL*}(^D#q5CHkObnz)( zvFlBWx5_mA=)jIsPE;FK!naBLvf~`yz7&ts;!*{bp*u;-rt< z>ISm}Yr-KTUuY}J6M4G+OZ3t9SI$WVOxyN%tQuKU9`c>R8CeEn8)t*_3d{Zv bKYYlm)Hpe0^&XXd{JMaNp@l)EK05MWf`BOr literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IN.svgz b/navit/xpm/country_IN.svgz new file mode 100644 index 0000000000000000000000000000000000000000..d207dcdeef321a193f89e3dc0286daa1c0b2bc7d GIT binary patch literal 3420 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IN_16_16.png b/navit/xpm/country_IN_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b91a3ed439742db96b0020a1e57d43d9b8587678 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`jo-U3d z8WWTM*k7K}D00AM(yN0j8$bTPdw0g7^7s4F5)uN!#Evd|_`lv{p>ew0zUuE&Cr%9X z=(v3&g3osv>*XHr>GSUF{@&Ku=;-P?MT57ehv)ylzv(GQ-m&XQefgTIs>&)MDS70` yj|~#rAO4E+39OkX_U^%fJaaw+j^tS>ybOI46cV#qSMLQng~8L+&t;ucLK6Vs2vTkU literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IN_32_32.png b/navit/xpm/country_IN_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..f1b9f367bfe31ed6f9b960b6bbe62a8da3e056a4 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Co?cG>Ug?1 zhIn))|FOS3qj6e8=dxw}Q3hEDSFrMcfDVt>Ig_moAOHXV@1kW}_2u1{m+X=f5}P)? zS-WOR=hlbzg%3VGT|RTB_xt|`8Z}s<3H@6FSW4jw09mB$2+}ODL%$Xyq0+S}aY-YcZQuXzf zv6AVeX&0CI*&aA>V8Z0b4mEDcJ~8s1OM*TzEG}SY_tlm7b@b~B*2Q8xjNA;nR2W;! Ty>=u6Lz2PM)z4*}Q$iB}Agrj& literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IN_48_48.png b/navit/xpm/country_IN_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..9e73a9638c9d9f85242ba271df4f1334a709c7bd GIT binary patch literal 606 zcmV-k0-^nhP)#{thy)EHL4!!pAQCi)1Pvkq7-RPqRW%Vp$t3Gu<#YMIUhnVh zoap*JLWt)>$H(uo*`zBYcEQ!vAfG=dm8#wD@aE=wsZ`D953a9uH%?b0lcW!Od#^>2 zzr8g8Ae|1kTH4{^mtyg~W2f_xRVqp(5{yQfySs6(X8-^Iip7{vC{V5Ta=ElKt@ACD z<(eer{C;1#+&w>Uo}D$y<*wiFlcX22Tyv~-9@K8@g1{@vNL5Wuvvl23RZ~$$qR6+~ znq#f=k&VZ8I2>#?2c6FF;-Uip^Ye3?o2xAQbTqO(2>N#!F#fx(2q6G)>~s~xanDTi z2g3x`)}oWiujv%8ug4fBFdo|+7xW+~lZiJP-?G_cD#aRxjWJH8*p(IT^0J@FBs>V( z-hNpqd=`Y**4An~z6b!z%aMnNi7eOl_uqIBw6T#e40|}d7e#(L#Q?Ch6mGRN%lat@ zykqSnoQ~7euYXQQu~_l=bRdN4_5SYer@_EN2qhAWM@Mg69@m-se!%m>f_uv&GIKvh s8bpEyk)S~&Xb=e+M1ls9pg|;l1E!6^n2aiJwg3PC07*qoM6N<$f?&KG7ytkO literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IN_8_8.png b/navit/xpm/country_IN_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..309d737f5ce33d0ead6e1e2601948a187f44acca GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_b=PZ!4! zj+x1S>@Uw?lukILb?U%@1BVto;Ys}a^K*Y=V`D4pswp4;|Nk#=ZH}e8grwx;$!jn6 rCZzy@i^S0xJM4sZ2Og4@S+bLh!RMKPub1i_kfjWsu6{1-oD!M-M7#<37$I?Rt~A?GekE!^a18p3GCnItii z)2tn%{K}7pjI_D743SMHxBiEF-sgSa&+|Ud`+T0~^SnQ@y^(MgC9o0z04i<>XOt|5 zesz$XEXIDGkC!FIFb}vhu=~}jyQxL80>jPO(Kn@Hc{b1+bq(lS+uc)uhv-&o)I@^O z`wO$%qp;Xm(t;i4H|>xoBB*DprKjyUuI18`7f4SZk%$>r)MkNwHHm+76K6U>Yw|S0 zIn?XD&xFVssVSx4TMvk!w&PN+1lGE{QeM+UT z`gF`3y(j2lsA#Ucu|38RK9nWV*Hm^D2u&Zi*|G=JK?;T*ci!y*&cZ_W;tMh|LOqFs zfs**KF>8=kjY1CVEp{?(SIixzpd7;&rzn)fGDU?wkzibM&s_I*+05~v&PU$OTy|(R zEH4tb%;m~GYp;dJ?~_|V8zX<-K~lLqC2!yB#+u@7COmIeE_8`$*Z(MEubs|Ttf%%(Om1ckFRiBB=X@B8 z<|T{JJ6~2Mk`0NZn0sPUXcEvg8L6)$4_{_HI=bW3gbkQpE~7?pj;qRi!%D8Qz`19G^-yUh_G4%n^@| z5AFsl0yOl`^;3bVsX@7#>`Vs2e@ZwP>=oZkZ4_RGs0BZ@?u$ukZx3kvs~GAzvusxt z4_(6^1hk2&4ZaV<`=~(r%kn{@Yv25Q`R1mb70mGDNlS~O;Y$W>baCe!$DG8tX~ zb!V%)(cvS+yywj>mm4n94`j1!%IeC?&N`9*U8>UBS?lx3gk&=6U%fW~>B3<5Ah(K( z-%T`XRl<@>hYe)hx(BD?PPj`06dW=fo`-4ACvpPmekt8#i(kKd5TrJt+`77sE8^t= znP>q`(rL?D<^s2M$s#*z<rzU{|@)?M?Q@WC)8{~EV1}=?HKpTIV%T3WU2vTrx z`j+0%fMd{afyxfN=$UNAly24M+fBG9=nZsKPIiKQzhpI zUg-9w6n+UwSK7a%eBkyd^!4A}>cGhBl;mh5MPPoN-P`*kR0VC!@9#(JnQzTIa%Hm$ zq?ei!;I6$lZd_6C(PVg>Yb@z{!}#Z)E+E~bROe1{|I(0WBdx;zhaZ;LiJ#NRZ1($s zfh|-+b%*tKX^4&-FjTpNy}U~FJMAS?4xW#GF*tarmE$HBeG=fJ3o&n=M)?`(M?`e4 z1V`KaF&h#Xc;6c#;?fKBPTSj`w6)b=!;S{gCZ|f<>0*;WzkCvDdRAIbc3fH~7V2TQ z5?LR4N~#7Np^7DR-0F;dAwt6AZ7nYk3xys9=Un6;CoGPM;s{7_?Mr@B{i$2d-%SW; zDHTIQn*4X5@RkmDeWI(uX(Oddd$9m#e?)obs8!mZ7$Y#`h7;;Sx0yyx9+8NJn&TNQ zNlosj-W6ih-5zB*JwQ^ejvNCMV{kYd4RCYQFIpNHT~f}6C*lY8d2?cc+H$yBeTj3pOpc*2tgbHsVipwUvO8Bf16q@-T DFOyx4 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IO.svgz b/navit/xpm/country_IO.svgz new file mode 100644 index 0000000000000000000000000000000000000000..c2e20767f49eff514dbd85579b911ad03a1aee53 GIT binary patch literal 13180 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 ZYkr?w^gl04e!ee1jw+)On}tBX{tuGx-OvC4 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IO_16_16.png b/navit/xpm/country_IO_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..070028705062d5049f82683658b912f7851fed39 GIT binary patch literal 870 zcmXAmX-pGQ5XX17yS3NS0yZe5iYG`Dq#i`-ffb}62tvf562aRh9%#ht10=>95D|=L zKu|#hQ89o}5fHUrm0}TX5yBZ-deKsPFZhu6=FPlG{xg~U=IWMMAx`tAK@fyTMTRGU z$eMZ-1o#_yhk`*M?}-+MLz7eYVPjc71d)8A!UbFX^I#Uq;DR-eDo_3<6~B_zM>Bz1 zSYte~-Y0zt#un}B?AAQ3?Z^;?sHc6Fk~qw zR^WHAAcwUqfgec z1aCGD{}F7NR=9L}@IgI2rqcjzP{0CqVyt)5P>J2?2$;z$e?%R(I?)W?j<^l}F%0vd zv=f4%Ig#rcehihiX(TCpoJKBfFQl4mAwJ6^=I%YU8CUDf@R?k38mae+0*<1aK<}an z&dosRq1`aEHlmCC3ET*R`XL8?yIpMb7!!!y80MGQG zIUI!DL4YIa-9D%`ok$6(YweON zM-J}@29(}Q`;JD>){Z%!v}h8ATmTw*b2qs%ciZjqZ|4rIeP6u0tX95F$d$hoi6z}j r{k;0bY3+k9gyuQYnm%f>y>3=CzC3%3m%?tET3gh{*zl?isptOz{-KYm literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IO_32_32.png b/navit/xpm/country_IO_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..9d1195d836ed29b647c1022d5a4342398cfab74a GIT binary patch literal 2649 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IO_96_96.png b/navit/xpm/country_IO_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..2b5f1c512546fd6f7244a332dc5c970cd955d5cd GIT binary patch literal 10532 zcmXY118^N}+uqn_<2JT!qm6AeY}6!;oiw&>Hn!DRC$^n5w(*_!pMMT^XJ=>6oae@c z=MGa+kVZiyKm-5)MOH>a1$;F6?*k7B{tQ( zaDZI1!@LEkq4}cE@8fXP=5HxHDz&>2*B_Ale_Rm{D!YpaVB{Izd*#y-x)rg)%?6A1 z5Y1le#vTmR03Z=Q{;n?n<91iGF5JTgRZ@BBWI~c?78l69s|~T}(X?aWyXHn82->MS z(upp*p{vnfH2NVL^or&er@?>8w^WN3)sZ zU;Z+%%{4G_BeXa)BkK19B@InTIC7?U{-+SLih5m|G)c4o zfJj-l9Yf8p(801HVTIyp)Efqq!6vNP^hd6YfT!RvtK4o6A5S1NeU|@yxVAyhztozk z+-h%-N!I%+4;29X{q6vO5J~QSgo0U1kAz*d^XNxcPkG04>C<7OR7;pgY&bD#KN&yF zekFM~@7OWA7koOYL4SW^YAX3W zk@S_v;{l9dGI*fp7(M!tstEbB$2wm~eLV!Cls+vyC3?b?6QbO6r%KK92usH?#>&!R zrfuqdAO3n9q?;1M;;j+H$-KhTyX`cAEpsWw)8<4m9T~}8bWF1BuDOKI%DrE{^l569 z^=0m~3*sJ?t08q;$ezjPn3$>EU+DS5V`o_gkn)s#ex! z-XRN>%eA6}xYGDu3BZeyaQjPj8K5y!lCnHhyy%7cr*Q^0(4QR@lsjXF7D3A8%=H=Z zw^UwQLYo%VPA&T&ELY>zjhxP}lV7zZo5Dg!TpVTmF!A8j7KX1iXrA~-EG;gM;%NUn zYcc0|Xk54?g&3TI5MTM8&ZqmaGE6%48Rz#M;<|k8LRsfB5n21Zh4c;4G1kicHQ@kw zwA0KV=_k%iX+&mZa8}?%xh-PBqbwT@;niqIQ>-1h3n|@^aj3!YZ3?C7G#x!%ALUWr2 z4;uWM{m1AYty+kbUQTk&+F_xTqspI@08b>sbZ|KK7WX$_ycDZqrJto$e!6&(h&9bs zVgdl9fGzmlfcVi0{i%0@y;|eUvs5A$-M5@qRsVYkoJyD)57)37pIqckQF~MM#|Lv$BTW%_x4}rEa(hW-us}Dgnpdy+rVz_lf#4y zYPc(Do7el~#$xhfQw*{b^-jC|(3da)7pouQ^cSSkQ>;I>!0mqQA^ay#WIK7FME_OL zOwPR!Phxt(U1254!icQSB=c_Q66B|9QMKqp_w1He-a@o9lL=l!enUK`YNS>R2Z=S2 zgVI~VwM)?kj5vwZQMMu0z_$^5A(ygaS{jR@wO0yFvh!%OW!p(bhE;fdPq#B^9E}nzg@3r=V6NyeCkUZqb>ucCel}1+J*b%g&e-@M#Kz0vojQ16y1DOt*KI%s*ZJg zpDJVZQRq5Wp@j8{Qz6{rW$lDfY@PRI-!+PLaw)Xy(w6pbsqF_(%X`y-0%a$ytxq@$ z_?~_NR4(G=&nuhr2mo1fSgQ$Bxae2yeMh) z^y$sB^JxisSeTFj9(It$0CXJuwX&uN?`33)l9n z=VOR$zs4p;8HBy_I0N&U;)W@q8Mg1+7tsvo^XINrw#zFNwec~{YsSa~;*{o9_{o2r zFPzScAOaY_`9da61=;y%RucXp0O()$RlB+!U((+7sW{tsM?N5L`OZERf&wuWyWR^8 zT|uwp#$GMW&vm7>@Bw+5qePTSb$m}mOu|cj+~uz>8loD$i#}ehJtJ$3oEMpT6maN0 zeUHM$Zy1C`*0y$)RiadyR8?&*ckdSBS)T}wuVd;5&Pj9b&e|f!9uONxQz&j1O-sV{ zDb-~(H?*u|>lo~4nSL;`k*C2l-+F6b+1N~JQMc8j%$pB&5<9jMZT&6mk@YM&bvEJo ztJKVk7t>dGo_#v*b-B9C-3B$V2s&PQ|MSrzyAm1M-C%Lu_%{1|_q-FELri$PT1EpJ zB054XpV8=K^7X!(ozH*%;s@!kb=h%>kS}8A+X9MnoDnJvGc!S)x6xf|S`IXipfq80 zQR^|;>J*N4cl4MjWkHkQbkQrkC{UGMKt@a^YMWP*2+e@n9ZBPz7-xR}4W`K%T;~vg z5#v!dw~9=sm#5cuag?W;F$NDmVYTj|j?8UnD{U~>&9Fo!iz^CXv?J3UM*apScj|XU z#f@oIcwfL#9%_qGQIqSNc4I*kBZG(f%mS$dP~^5$@$?AgCaSNje)$>N7t4~v!Z5hh zjJdJ6@3W~b&)_4=Nhqp>=jp_p!sOJSo65uw;`g;*c83T2>KpIdoSDiEaIHn|we2cb z7OlH|C?zNwP6a6Jjgz9jUbe+uKmLlxi00TnAO7iTdX(HvGf_*yMtzroeN6OR_MDUv zv}$zm_l5N0;rnyZVPQ-R{v_GVWG8>O{dJcE#I8VvfSL+h>-F0q6>QYrzDb^=k@eq= z;2-wl^K^3?^GbQrF6Z3C#T7E_w5p#YbWzULXNeZ%{b3Qv0{+r1peVU4Rb$F-GvMc5~_%!#TD1EKfQ3I>G?_kfCx=; zl%d-+x-^ayFI%*JiNQJV+wl&_F|*frx{W(*EazKl4lTAw^e<_|I1|a{QM!pbu4W(A zE2;%o20+9Qkw7wv0fXP&)pBl6Of64dDdtqbGLg_i8s2 zpeH(ne~=_XPQkHow(GPwpQi0uD9mIG%(z zfDBv$iyqckvU~NKB`1wKV?S0FNj>s<@&P!hTLRV|D?sG$a%Q5WIPP-BDirk3fy@(1 z+UYAE#b!Iz@hVm36r0ZPGFan`KUSQc=Tk7iN@{X-igwdbxxM0>zY;@)!L2h<t>r<=zt_;AE>V|s}dviywAS>l=(c0k| zU~b=Fe%CW@S> z#GZhY9Ok{t$+IV3iLb8{^^TiI;^p^(G-XDg;pr0Sb2`cqa=hDG%1{6x?QZo4C|5uz zYtKZHyMJQL1-<7wM32gNn5h8T#2V*O<1 z-7@!8)YcHtJ}AP!_TVQ+<5`SN`l9i=VU|(;jFIpQkL1<7Nt*W|_yKfje50Rz{G4yw zyeU=EWU*jQ4|-T8CdyIYPQ7r{c8?qs8r%ANc=8FW#0zFw3K5NsR?xjXouWI|V9;6S z1h4Oqdd_3Hnq~Ioi2+#0RBqOE7sfzI%=6mOrIUOo{5QzI$8 zY-YK()icRo1W0rZ7&{!wzek=#wisLiaMxo(v5W*J`h~g&}H`qdF%F@ z2&zB({5BkILeM~FLl%E0SwOf-4m!2Lhnhq+$V?y9sFu#=z(XR^N1&}d4Z7!&fELYS zT;rCukG#OTFu4ebFGQm1|B>D$b!k>;ReO_+B+cBm^gZ%^QH)u-%oGEry}(hW4ny0b z_~{R$L%N4-sdQ<5R$sqC!l%)m%vUaFUV7^4ZdKo0Xl)#AWWFmfvx~&v+Bf-E_hYZD z@%w@TO4@5T+rgF|68<&GSX_S6pq5n14|f-}sr_M}H@SJ9`1+-SUV&Rz?BEHT zERhmSP9#Ep!b8;5m$TTt+B|WN?@-D?<2eUW;y>nz=`T>ez7aX3#D5`xqFz1vJ?40akC#$m!8!M1Sqg~gn(J{R}gvm+OXdkAE? z6ghwYZLosjW{&DNxgB5r>oY#Lp1^V=o1A`%O)sN-GwJ01yzAOfV?6z{6GDyf!)>OZ zLeGEAO^vOhx}484lFt;Ni(`{Q4kI}rCOMwz#Z}|{sotDCNz~#rK%=jU3-#TSf&f7g z5@4zPGjjD;4Kc5!tdg{-cXS$#>jD30b#--cd3i-!H9Yi#4f!)X;>8Ij;db9Y?39Iu zau+2s_;mKX$)KzRe2$sLR=teXM|oQ>Zn#0s{jao%GFF^~lKwd%N&imh0lz*hP0pXG z8Xg_!QhxbIyJsUTplAV?d?l)*!` zUrqSfr>4&t!#Ja!%yeKg$WKICa~As(&T%?FxU6fNi&0S>W{^P~sMwOEot1XxNMf(4 z;H>n>aj&;085x~+-(iE6WcZ`MNt{7G>Y@ENHx3qt-wI?V<)_~K+;{%+L!5PL?0yo3 zwOC^6GHB*#08d>TTMJph-tj1#R5~F{u=}hN4@Xs_@K63nR@yZ9}RPfBSt z>({`jzK|I38;rTk2PiQFLIACj^46%9(*81L;c4Ynh8_Aw67T(uXga3=u;FV*a3vp3 z*C@ighq!+_|1TYU5gl5;@#61-aLy+yrWg77cPIM>L~DXp3@24N>!tLdEFu-^l;SSE zmVZsS{D5D9RqJNeBujS9EUxi`62W9gkvUaeAbS=H zO7xKpuZr9RWlw9wIGGCivG~7CF6RlG`|9sL=d{pMsM$V&wA~eV4hqhuzTAA3?TDj0 z1B|Wx+hMGwcP!$SWpS!gZghf*RGK=e2|u-3YBD*!_vc-Mq6UkgzbrrLK7svWWm-4B zBpU27X48X7eb0L75K{;B)!K#!;w%#+zA%X%jd`c8)t@H^mgn+IHucxKxkp4DKFOuR=x&}($ai=$5hEZ(3zZlkLww*;N z(?WB@d8k84Tf?4V+;ge1VQ9|xu(HbP!XP8RwCQrzJ_gUoqx_9mXsXRkTx=>YiOD&H z-SG5cZSUc42RrhP-j2qAMmDO_IwjUuA6W&hw!_Yta>@|uY3CY(zjy&)gnGL=abssA z5uHM6zVTgo=}Fx4#t%k)6>yOi^94kZbZhRn3KABDQ)g8QF@VntlxNT&ZTkPU}y_ zzpv1)*E+Ity7{`*ikA1WIhZyb9zfKA?CDf2J?1nvgV^v#le?o!wAYQ8h3tqsQQxs*LlmgsP>_3D@QZd6{!WWC!!zZN&VB9Yf? zaCPpQ-hzR=Gk*)!mnmi-@Gk%m*;vUsh%(x2hfF@>soDk**;;A)PRyzJT4DD#lo~AC zm!+@VRxbd4amMG;K2ZyGp98&4Jv>(pe6?(T7eusESy3WkUM|sohrAxs`HB)lZpdAJ z8#v2}rwU$0^6zfG4|vsVeHWXk2~F<9?f~FbK^zUJRKL1=M^XpIPSVU&V%)t#&3JPuo>p3g3v&msOq$;;#zc7L zezzEc9gsSzrMu)A2m7GZ(YLeoLH^t9y3|LU%g=X?sRYDlpi^jISg-~FU~rSf<*q zFZT=V@%K)CMzk8KW=F z#?RV5czkG)PN*b&i^z^ojzi&y*rPlh&N&pAX~mjNzPWwi1u%6qv*Oe(Dp02Vo#X^d zyoxUVdAoaplmdH9XEo@4K}|d-<}*j_BaH~L&8_P+I{0>R`pI-rF3Nd6`)206dIXfe zBW#phUrWS!q=st04=V|52kJ?cc)ro+h@Ae#DUgVLHYW+lPiJ0=%7v?@M;g@v*WY(o zPjqB2m^LsU)V%P;mEAKIjTRMhp^}3DgfyE3-Sn;O<%tEC`qswP;G!@^XGoJdnybN$|DaS3ytP8Hn2CApwHM%)>pSG#KwGIgxMCRL_23CLIC`hYmA`)qql8pxXEty z6vwCdIsTxgWbDds3XEj%1oeA6?Sj}b2_)x_t;!1=W zl1H)0;o1l<&I9DrQZBrCA4=NdGCWFt_5<9~{2mq?1TNYcrNaKan{Nt@F9{yasf>Gc z74TM~4t6_7AWLbBlrAPs8q%&mbd^>y5x1=8Jp0#_EWj36+gFiGuhYI79ChmiF3=D4u#>-Kdf=HQG>z3V<){SeWMpQ^7a07 zXvbW+eAp-5Iyv;V4OT1lbJH&eS@Huh!DZHw&OfmO2bP`;OzVu9SG%0M$v5Hp+NmR9 z5mePOvl+dpK+8=95tR6L9#dNZYj=h7V2tJ+pDK^Q)%;7&5c2)hiRP=1#X{EMzDI^< zmgeTvC@J1~(aDjuG14Go3mNvwl}>0;_*d76L0>PKn?QX%xRn`;*wDW&ksB@x+kb!g z;c+@N%@tz6lEu0_i#n+5Dv0j>mND$aItOzz@ShnXa+mnW(FSwRQ&L=$Z+mNm21<$; zONmT(jh?rgvK_{fn>6=wG)}k90v!I?+{38DzS+4Dn<7IO=;bgpVZkzU-p`mgmAfq zM{Q5hdjLQH73l8 z&EH?zWAlKm_fy`7Vs=U&+PKf5ua^yG-a08#nLxWshEDhu4=|^g9ZvFgsbtQ#O~-XQp0xJ4}v`PCE=;hFMBq`-jFa`V>BC`jtv@3aLD5A zKKPAx#*>7&ETG7rK0^|nArNt4Enw+@at6Puo%V?@j?&R@^=%gx?OHFH$H+95B{mL*ZuqgR>6F^}9bRo~!%} zVGI;w@$uBZuviU@|Mq@g`MXmxmJM&?ud*Qo_%0nBn<#cW zQN)R{x#7;`3MqJdoz)p=$Q7=nd(WXyCfZ)5>hm`dU}``FtDzFuXN%~p_Jenr7m(#f zn;spuSA_W16(-ZBhSIDIHhZmi;UWB_g534qY=6WAdv+V3&gMhzAr_YTlPA-aV)vdW z72HXwTLp;qPDY*+Z&}T*QNfFDhAE4+t1p2zEqGY(h;)h&z)T6eXURiUT-RmIKQxft z<>K@BuCDAxba3)2DhIudP>z)(9{8DG^j5=( z*WJ{r;13<)&ndlzcLE_fP5&T_m)PjRr`sQMIqMlq0vqgXfy-nV@5ru5k&K4uLa?x? zZr|r|cnTg_a5Yq0(pCLV?sZym+y2QpBVi6%6i-Verek)I3qh5&MD5Ziq59}LwM z^nA37P_}APab%5kQ>4=|DHiVfV>~acNr-!o(G|2E%nnCLq7~I?;vV-?IK>s!q&cl& z3XXQH>_7ogX+NAb$l@7SeO&(*kCSkY?=^DI|G)a=+5K%Ui#KIA<^?uZ6LAcqvy$l( z`4ziDwbz`E5z58kp#V0L6cUB``ZyM9T1CkxX$m!4>xLipE$mH0H>R}?~4>T2KAuIsW5 z(x#@ccFP;vP8F}bU*K62d(#vzS~2Cz3+@%4*PvrPL;W>hb>8FE`nE0(9I$vb^wo-# zb(h3DDFxEqZvJem8@vtspQr00Rh|V*2T!)Z{-;-+ny>$~7l;KN6K-K%z^ zDjDq1;5ZXgz3b8SuyB;dV5Nn=D6QEXc`hK)!}2l={|OuTP+KvfQBq&65K$FOB8%QTkh_Ja^8fLsRiPZ9^=|ga0F3(f$%ijoI5h! z0Dv&H+KbZ@l#m>JK5+vqaj{H$qD(tkYA7I_PAj5$ZTdL|=@v2|_rJ*uWF5+YOoho8 zW7p(!L>N)vmvCtB(ERblw8T6s3`%7OPJ7+ACwp?g719Q;gPya^7`4gbiElUBtewJ1 zjmeAm=rsv-j0Tm8CbgGSN-24HOx&bNGLZ-G;Bpt>OENXyz&W@7E}Hgfw!KmRvWq%r zd2j%O{t#8=4MkijRG8hRW%A5oKWp99EdR`!pOp(OqdkBPY^}{EwjPTUS(^U_%Q$$R z@q$c(T@VD0D7Zy3U8Gf*U7&*nUI7$1!lOS>U{5I`(bj4#TQu^@p#<~0Pm(GogRcu% zSu!0ggI!(CNQ3jht722NBx7R<4%fd*2OSH^B`u|$FWxitUpXGkP2l*Ou-0>uUA>!z zxCf6{M8w7Q!9NWi*g)ol19x=z?jXlCuU}= z-4-HTr;nw``w^yq-=FW0T+C5(Nsz#A7+&6$>2m>kZtUa^yKNTa@;$EE(Jcib*x+61 z$8=@*m`x4q1+kv*7eumZlK96#SxL*_1O$)ZG-ftoysazPMYHcAgN3}KUq(#1*}|9{ zXkQyAnuDT$3j%at-k-+W3Fatjt!sA-dEvzNnq!fD?8rgn5CGUg-1gQ71JKcXGQutt z+B+L=z4I8Ac<=E9%JFU@KCw*CcYc@|g|5Psl(PZ-gt<7JV37j!_?-Z;w=+sMm=tDZ zy6M6ep_1lrWOs?jm`7$AM5N=n82nEvsEViK9Kvlv9>=M`u8M?!%MZ1lOP?x4%9)Xr zP>OKyJd)Zgg^aUrA9eb9QF{l~-$T+eQ}s>;nA{T=h!}kkq^% zM!ZF%xZM;@8#LK276=f?6m4sxh$=#sin0){DufKZox1z{?s@HWp@0#{B`(e>s)Y{#2UAH-%PH%2* z${Sra?bY=4?^7j&oc?}3DR$Gyz9`#z+w9t^PG_p> zAl5D}&pr`>j4@7ynkrR5qS)T8yZLRg-hMNjgWsPzhe!n@JcuEK8~i)S4jX0f&Ls}j z<+|>AX!b9Q9-qCA<@(*Wns4eOd&6e3x}LwUx0`uYZ>PilBpX(z2Y5wkY$+$%VCHnu zR6KeNcA4BC%UsO2keQvndDc|BgmgAvFS1v4*MXkfH$OMq>)pKk`L|d9csYCX;x0SL zjr5GX&}!sev+Fjy?rnYB)$3jW5sku2uj$iaFHs~x^CcO$UE$nkQ=HyH6mD&9C)wTp z`)0Z5uFob>q^Ik8d3D{LO^_uy|eH zWJfY^>NKV5Y_b6->-Iz4*TH}j6SAQGER_MVAE8yjLoIY^w4G$l#eeFm>zWn1!I~OT zS1@tWw2QiJU}V|d?R!bTS2e4qJ)3;v(%&Sz+ASCLqw|~jRXs>vroWK`ADiYqbLfSa z!ubFtEx>xH5eoL#C|P zk6*$Q6CQ6<*Vy4*+k(2qYJOL@584nCb@F8TI8{twi&UhHaRKX>%hd`1&d#M&Zp^5A zK7p!}>7%o@r(p>>?iiEt-(&jK* ziQJY}=|Y!Mn_P;*<6~R+!j#5)eB&v-!y@O?t8~%@zRverKK5W-G1d70RcO^&`8 z9e11>ET2>op&-CgX@_h$z>3~wz_!u}TEZM!!IGrHpu-Bc7_A_0gsepA6xT{gz@t3Z z+Q3}^=eQs4?cjt-?m!B%PQhn1U96M)!Am+WVq_H5Lr;yO*Us=04IN6XrFvmxPGP_Z zK?V+nVC|j0w@5{bax#)bLQ$;}Dp})kr7G@ghO89#mEan)7i;JG(ELnEBw5&$1t(*! zWB|hbb3ix`vUKoZPqqJ*;)txFBWTM?PhL9$uLBFi+X5jXw^&Alb@VO)#e7&zl!YZ! zjL4)=ytQN4U1EWVj2?$miXu~lKuT%cOrg~AojlMsdExL_F*+F z4&TH6=i=8WCh1_+!GEVKCQ6}KI#@JiMC#E2L(Dzdo=eoU0|59os6R?F2fYP#Q$53+cfU)r-4ITH*qTgv)iR6mmnv+?djZRC9a$ zB~n6y={%Ov*+N1A7y~LegC|plX!h3Ag$N;`bm^pUnvsFL_%(!v(tjyLu97yTY)`^m z=`tAC8%6&j?W@9IQ|Me2!J|Zxb~GVmQ-bM3v;aaOKzNRFhGP^1XBoUQC2>pcRR(QS zLNz2k>J6YvyLXDmbcmHAn1sw3h1n&XE69E{ZI2&lp->1*3@}5RiI6fz=dO$(aA3jh z11wNI8U(jEP7iEMITO+I%c3Ut&N0W94MV}dzykIGnxYQSZNdDc=wQ<+goVy!VAH`R z4{Xg~GoUhM8oq%&BPSX`agp*~fi0RG2e$B;O)51*Bqy>bvS@-I;=>3)vqF_b_DX@C zh;&=!Qk|-z&pk2(@}^d2eCjC<6qZ&c=j{+)f#f=i##R^)x*^QMqd?tJ8Zl&;2*uDm z?Evi%hS_beb2Omy2A~+> zi`Ks9knZcUN{!uMXlTVGxzMjopRhb}Wgpf6J#vsJ4Jzjt)fT2urDO~8=UE3flAkOP za4{xT><`*eq4(q%Yl%6C^ooNC!`}OW8$D52A<*VoGe|d(5wku-O)A6HeZT?j+aI33 z6fGMFg#9wS%spNnTtL{k@}Q|}z=gZU94Thq!Cz=@F-ReKE#TS94!Z#w6>rU75h#(1cPb{slRJ>Fkt8kZ4&bk zgGPmF4o3xqB8ESzS`a`C4NMERL!=NY+2o}G*2EWUW+!0Il5~zq6=(_Lgr%!ko=T1t zOkM$ez|J0#CqQ}W>L;;AdGgYe*69k2n=Ul4@p?rCfeA%lW7kWy&zk0ZaXty|By{ zIDvqW1473`0E%}4q7*6fTpIFK0-uN&`^Oi_=E~A`}ZDNzSnK3!0jr=qj=|TXE^uAx!j|ij!X(%l+Vq} zJpd2D1MmO<)Wllp2%n<31)vBaI)LgHfa_1tH-Pv$-?D|nhv@cX)K~Rq&1+1%MN*4$ z*Lq}OY?`*y;qs}*)r&!1pI~M*E0xuA1GaD|KUA1c7P|alRpa8hO7q?9DNniqTR0e2 zorBsj>2Qp#^F1{G5VP?d0K1h#468vx(|ZDt{srqNI~Z1jh#I8%W)k!Vn9|1y_*Axw zE2Q>Iq(U)PGmBVuo6W+q6o7OC=}-(k5Jn%0{CLG^hMU$s02}!w0OsO3DzCS)v2qOv z1XZ(6Qi~E+gVNyx1Ncp;*=)9~C@xMh^tc=Y*593C55NQP0R9cYCy88ZM^ubBBme*a M07*qoM6N<$f{}u`@c;k- literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IQ_48_48.png b/navit/xpm/country_IQ_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..085da5d21b384a217fbebcaa180d099211641d18 GIT binary patch literal 587 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$qWok44y8I zAsLNtXYS7yPLw!qKmC}=tOcCBu4}GcQtYx1;L<(k_vk_WgC~z3DDlm8`M#z};nGt3 z7YWN&MX#3C>X6D*xW?w2>~$n5`I3p+-qY3JttusMFWq_I_JQ9s`@UDcpZEUxymAW* zWzk;mT@v$OF~nVDT7`)WmrN;L5MDZ=>?5;n$w!r4Wp~PFh%Qr#pmMI-S6jDynFurPfLBlk|!5m$#hPP zemAQi>VDC>Z_To|m15%-zm(a)X>-o*`Lhq9eLt%2CV#O{-e_?-d%e}Q&B{!riJww` zTfg+0r@e7=%4*kh=kG2{35)(Vb*&Wt^yQg1($sG;$@O12{m6P9f6pfc+oLZ7?B{E- zt~-1G`Su$R?`(AJ`YNPYf8nnEyjco0FAR7ScV-K9HeM`a^B49Io3`W6BfiZ)UDb-Y zBl;HPT-_jZ@OXUu%a1=L{CziMh6!F$i;PGzGCzOlm=VML?Lhxcic_kXeckp00i_ I>zopr0ADKu0H)K`3)&&Z!}Nd4piAW)hmRNK@jxZUd5|Ns9FudVq0*_fGGnfdVj`u`FxmOm8L z4ydfJt2j~c>TNEYq+TLhs+{KzCO1*hsgHl$IdI~@0f(9T47=Wo9zP-8wg_kogQu&X J%Q~loCID>AJ^26t literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IQ_96_96.png b/navit/xpm/country_IQ_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..b39201ba12f17cee57e62854c91e4ac515d3e7bc GIT binary patch literal 1309 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlITE_u2* zhE&XXdpkNOxK!rA$M>1#jL*yx1ZMPY)D++8vZuk#c@N8@W&CPv6WPCT=6CWRVV4t0 zO7dvwu;E$EsUoFnsMaC%kx^7kSfXcx@9_lTvSew4<6bYXm6q(CyPyB=Dps!6wST<6 z{oa#f{rdlt`d@c{e*a>!`QIF)^9znxEKxVOm&uSQRczwV0_rh0K+ggeBJ- zHJo|4-m5{+@sLS_0k47&Gsk5H2=mQ4P6G+KU1_%+PSjs6RR3+2@iA`4+KuIhVg(Zv zo;<(m9BpvqfAIfx)BfgIZf)<_DBKr2#a`O~g8Ko!M1whBzcOric_goFd-$@Fdnb2j zGv%!L-=-C=%sX#$;cew(&psRPj}d+ADjxvR&A207*d}Uw2!8?0?ulxD8=}(f8PWqvb_shdBzOg;uHPidWm#>#zz3uz^ z?%|2wr+`QGBd9^ zKIe{8+`O+>R(#+3>_eE01;@>YhBI#7@VssOAS9lB{@k1Hr9Z#zc)QK8#kWPry(pOf zhN6y+6?^r}DHDBvu<73ry7Y;M<5uFe(C`i0zF3O+>viUqv$JWezH=n{c-fr~r_x)r zFPuNcEPvtUZjOfBoI_<*x{jH}Y&@<_b3V>XKRM<1&lL}&quBI5eBLa7%r>q1a=%Qe zso<8wYjkR!Ec?CZ#rJ|Ymon${y|_QqUdZR<9d~Dw1NZ+vk1(iF-L$VveW|5!gw4*D zxo3Z$Jb&il-dnK}JhcZM6?W;Y)vTOlRj!@OeAlNWP5sVyPJiq8?XoNfENiBkh;UAN z=uvZ2#W9C-RiXLkcOUhW?4^bGPTSsl_EOW%Gv~Dr34b{{ucqPXWbcYS3I9Gk{nXZHGb_vPn2E!JgUIQmn2`iA!VHCuoGOFY{6{pRm8Zp%{L?QfY$_laez7HM&J-v1u6p(@@$wCCpTx<{iaIs>^Qre=OpbKUVFaeitL=7ahZlv4Joj0? zCqwh7}nN`7y60s=EDwUcZvLNgvP4{mZgg^aUrACfb9QF{t(Hr3n=lZ^@15y)*s7Og28k4n>jq!YveN!`wfqGHS1*q_%;TcWX48gm#P>bf4)Vl*ofhf_)&1h-2rU-E4F z(6^8&r5rO$uoeIa#_^&5V~?wyWKu@pp@vFsmDe#=Bi& z4RAY$Aj!<)ytU6>8 ztP`2*{TtXYdmDmUVB9}nrC2_Pw%?pXjwBQXR|uU7yYTz3ITk(v^-8h!wQMGmd_05^y?_mbtb_ z?b6%u_EPOWY8%*3ZBrhkf|M4QJGJV*Fr}NuD7Kr5Hk-}$))n1fWgoAJ+vPQRws?V) zbVnpvYI6IHb;lUlFDj3oLwO(N@!7?ix`O922J>pXOpADe65o6W_8(eC>Bf8FRS^FK z4DSRC_XG_7Ka7FN`0#p9u;mkU{saP87vlEOFyE}hXF{ms&P4n9d*xv`80`-U_J#zz zLxTBH!LP;h0i_Mu){uS-cr!Ojif^UXA0H|Fp zXtJsCflqJG0w6g$0VeZw>dz1vXC@;-xFT~TKuY>FYAN;WHOY3daP#@^4C8idDV5V{ z+-xp_W{h??*zw31FA6kWm-qX;+cjPHP2G95k_3s~!%SwZD(iblE=H9Ck{_rf`MO+6 zav>;ZnbCWY%9$kF)>2|!GXxC-NX}+_`MUa}{^6J20b@mTBD#!@vH$=807*qoM6N<$ Eg2I}E?EnA( literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IR_32_32.png b/navit/xpm/country_IR_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..b26a48190c2ad2270e4c6ad6524a7bfbfc23d5d8 GIT binary patch literal 725 zcmV;`0xJE9P)-+;u% ze1IWx0_e&Cfv@FR4Evbb>1Ppu5aEDKfN-gUQcI_fs=B1c!{IN!LAQB9Nb|L$@>n-9U*;0n$Zsn2Geb9TF^ z-+ekeC~AeYHk(2h0OF!Yz*$;d^lg<)2#Fum|BA#QQtGU8I}w;9dGB^UhAN%*uHVn* z`}u5ZI}_|wPXJ(Lw>hViq{viK>Y~v3vj1G@tkBujZk2IT=zKq$B`RT5C?ewrx_k8s z5c8v>@yJg+@^Eq@F-nZX$;o(%$5*$fr&Lvd=+DjoF?;lA3^=xfZn2=*43q+;Xg=>3 zi;>`10WycSMIs~$Z3{|Wvj70Xv1{r-d>CH8 z?iLFKD36cR$B+5`{p%C}Kxo_Z<6}TbS7YvXoH(^e+SWRAmtT8ndd`Ro~06>2Sg4>PW7K@^FD}%4F2;!W$c$wf+7`9e zhlj(PH{3K-mj3*lstWTwUR?n*-@E7DzNNaR$prtaDrA-zzqLdJUvnZ5`FfC9LI4pU z0ssgBltLmg2GbM(z9-Qb`r$@m#P=g-`K$5gf0;Lezd-N>;N(!&N_v`{00000NkvXX Hu0mjf%6?V~ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IR_48_48.png b/navit/xpm/country_IR_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..82cb319e2b62d6e3a689f4f7b45b2e78a2fac44f GIT binary patch literal 1234 zcmV;@1TFiCP)F z&^w$Fr+xw&se&_SE(8vo!l9=SKy8T%NlfhZ+TQiP@6JpQPRomeEM+St2mcR`9?diJ zpPzPTc4qP1Z{Nd75;<;wuQdT0rwPzFO@PK}0yIt&pm92JKooUmW z2>|>xqy~M{~e*e`_r@}0%D5XK-0YFW+qC5rw z1hk{x%JdQdymQ~1s-aS)%=De%N0lly-HP*sOKxfAj=yiJQ?up9pM$?uqD<>mL#e#( z{iQR_(##UmyHT&ERb!rdsXtS0bRq`= zCv;Mt_7iVPDGy>-ND<`mFbj01_2Pj_l|8?0sfHc(q?EnHWrQU>iSsxYIi@@V000Sq zpGOH2KefQOO8@2uI;`}$^C1&`8VU#iD5WgE5}mtufsp#Wd&R9-!SVUt9<5f@%a;K_ zc%B#z+5CJF!$R9$Mv?dEQM$dIy?K+peVc4M zZ)^aiNNK#Wp)4 zC|$o!Evukm(X$M79S|G$?~lGcsOv=yMUnvGXuEz9g#bbha)57^{)+&I`+Oe1@;NMG z_s$(O4AJk4D1szmi;Kc_AdFcr3dfP0Lz>csg@bPGwtDH3@I0h6Z?}mQ zLO71hGFq$Q)D&;GK}sx_+3C|Vj(NLHEQ_5z3wh2v9pIeJ&!eUtbgNY8+#C|ZTP>iJ zEi3>bqY_(MLP~kN4V=?@oi-Xk2=8`fmeFPtbbZu~&dd0F1_sha|6OmH+?%07*qoM6N<$f)(*OVE_OC literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IR_8_8.png b/navit/xpm/country_IR_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..ffa5447f0b670db830d680181fc9941cd841e6a0 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}9PZ!4! zj+v!?s|6bjM7-rVz9n>enZ4%IVYnUg=q6)$ zfp}~Bf{6?onmXm03d^T7^~GPy7X29>Yss$O&@ubs-1PK4zhANb{V22RRp?o7pgjzp Lu6{1-oD!M<%OE)u literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IR_96_96.png b/navit/xpm/country_IR_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..92223395a01741b8e4bd38b61cf93a7a8eee397a GIT binary patch literal 3854 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IS_16_16.png b/navit/xpm/country_IS_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..08288115c15222e5f35199b7d7ab31337c936bc0 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^to-U3d z8WWRKHq1E3z`Ry6?IE{!i?Pv?<@LY5J?3XNJJ1p;!Y{!m714K|ucbKUXl0#FN|sYM7=%|!x#>!5O}NrD zF@w=NexGO=XIjbb*_Y4k`~Syz6Kktrm5bI{jw?!6OW4@hjuLFe%}wD9!?h~HLY2$q6V)N zoD!}$wj5Z|%+VOgF37Z)Pl?4%)`g?TszX4cR6y~7(5odrJyxNSjB6g<3oBZ0|7XFn z=CG~1f)>?ht<>E*hl#OS@07&+C(nh~|N8y(bp1Tr<_$Y_bZ7qjvEu!L*HTg;=2L_W zUM$K1+QGoRez*0rAf7n*3O#v!=@2@YSQeSNE=cVsLcxZvNn% zuOjxo*E4*z=F1UDi47JRuQ$3cUM&BG72RDW`}3Y^C*Sa{mrQ8rWMn^}d9Wh?lMfpk+p}!(87irD++6|-o2#ZV ZGpOto*w%A$izm1IQr`60XHR}U_OSH-N8JaEO{bUEHdLl7Bv1hg#LmfMmkB@NULRFow85%Ip4G;o z;NrV$MP0Y^*Xbf9DbP0l+XkKKUKw4 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IT.svgz b/navit/xpm/country_IT.svgz new file mode 100644 index 0000000000000000000000000000000000000000..7b2490ea1aa17d6c507e5aa86538dbf91868cf8b GIT binary patch literal 209 zcmV;?051O@iwFo3D0)Z&17mM>Zgg^aUrAIhb9QF{g^x`Rf-n$;_ncxfuBAiqKNJ!d zoB+4yK-kX^5g78r$uAa!9%rE7t=>t%gF=xwgc zyfs=1)CRLONcy1$PwHM^W9{?Am~$?4acH`laUxd_QpCj1<@WUgRBE97@LnWFcjVA V@=ve`_yyF?;OXk;vd$@?2>|<4DV+cS literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IT_32_32.png b/navit/xpm/country_IT_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c87c9514321bd7145409cd502b18c1698c7bdcab GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_cbPZ!6K zh}Ptk8Be~=Z{(P;`gwiQq}pk$hFR+?Tj%`v`GPYrYi38Fi?_k6hCucntAs0zi}@r< g53FEzlf@8X_&SFx|Cx2&GN8c>p00i_>zopr05%ad1poj5 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IT_48_48.png b/navit/xpm/country_IT_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..ab322a77dd9aaabbb10160674c45f8544bcae39a GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H-lZ|Utfp(Wp+Lq fU>L$9N|3TMa%7qCnfrk~&>jX)S3j3^P6t~?W<2>ezp=4VG5q}hBPzdjxY^j)+Op#m)$8o4k`5jKf+G$LJp8N-ceiobf4I8b Q9jKSV)78&qol`;+03*dGO8@`> literal 0 HcmV?d00001 diff --git a/navit/xpm/country_IT_96_96.png b/navit/xpm/country_IT_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..3cd53375e7b42402c85ed385d65c9212073acab7 GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt`7JY5_^ zD(1Ys;3(?gz`$@(wVy#KV{wmJP=`y4<=dmb?GMPLNnSTht2$qu_5bF#m48dK{<8CM qv9UHcIUZb)5MZDoAu{N>KNy^&SUvZgg^aUrI$Tb9QF{)qQJkokw!!_xuX3=1YQ=sJ>qm zdjhNn10?W%*<`W6B0xZkw5%Oj^iuR_oL|57JWus|-b3zrMYG`~J<>&;IAX{PD$jcJbl<>izZAyW96S zUq5?)`|KZn|2JR#mlrQCzPY=(y1%);`1tnzhl_uF|ECYHuYS6@_}d@u?|*vr^5w^m zA1~i};^pn#o0org@#2M*{P5>De{*qhVa>k(@ap>Y*UvovPe0$iW4`OxFK^!6{CM;J z{=>_78DBm-WPg3g{_*C!%e$Kow?E&#R`su6?{nT=e}BkoJ^7fKDb6`xhV(L}7nbA2 zhhN^`U;X99`wzd{6}1jNRWyYVUfQ=q&dVqNkC;NZPz7j6g`|qvX&E@->`*SD{~yZT`L`sUTY{^9oZ&z!jnTQL{^d~<(q>*&M3{_oqntM~u< zhno+7y1)JDQEBx1>t}y_clGAqZomJxf3k*dez{yY{P_0z{s(K-@JjfHo40R%xc~ZD zbNJ71Z$AFF+rL;}FTzC*7jYbq<@V?MpMJjox0}D*-@MlV3{^Y4@iSW6(w_a^D){R9 z=KBw*NazDpo?X1;r>*bk_%%9k$Oue46Zq5Bo153S?{4qDe)hZX`OiOmcYAkzbGJS< z{yX|~Ym@l){+9!;FD~BP86Ixm-54HU-v}Msr=Q|9*S>BTCIwTT12O=hrqVWsJ*SQml_YT6=l6%aD40RPnX1 zq8C5Ee|vA+?5DpxD*p4`9WuPT`sK!u$Uo6D`HIP5E4J259FJ@I`1ZYx?!{VWX@nCw zRwZ+e6FF?WFUpB;zwnzcpdWAUudc7|uMW#*rF1Sn%VN~&)&Kaz9|alw`t_^-b$jfRe!nGub^ZF4(UTvq?tlOGN1Hp4qW^02I_ zc@ZC?@y*@s&p-Wmdwt`R{p^4{pZtY5Tk>l_AMSs7X9d2uj=uW%!`u6{GgS^bZS}P+ zaa%ZB%3%aeSe|P(*n^*7c$o1b^p|9d)33(;Gd;9*zu=DD}|NZ&uZp&!%b949Zt^Ijb zR@(KI?c%$;t6z?)+B~IQ%`-Vm~K-P5-hL&g#lmM^N?sP|_P#hr`9cUpz6zX*Wl2_Mdgs zTzq$R{pPSV?u}S}z*ezcd3AsH_Ah^1E<;aowwo8}d9eTXa7>r8gcP6KkZVmd{@u14 zkJiIe^=8(VpTEdqT#j1X^B1Yk%O2DGyJv@joRgT-WozkqN|!08e({Z^)XNdabNdrw zm1@l&1Lli}m3Uvr2Vi3#XzttTMZ5E}B>QmkK>Gt}qF z4*nVn5!^ec#8!Octmn&|`|~(1Z3}d+f}HE~Sg=K~3i@T63CppEIDMTYTL+fXYG_<1 zG24Q*y;HluU~_8q#ls$jQ=s_v5^Yg3~i=_rUW>I%mS%j=02a>wr>+XO3g-TC2T>@EV#Ca8jUpb1ZSN9V~v?`nG<8Eqa-g7GE+kAku9dsiKQHpFMWQ`Gi-C$NdZP> zj$&<9w9!VI{9Z~!pHlVwbrQCz%!K=xfNL9-@SL4vGPcP}q%?q+iN%nxUx_y3QfywZ zDuAYjZL2QXlreuRwGp%rY;m$j4%_^;k-Y#@!sQ4hvxyeCRx&rZjVX71x81`MmSW^? z@<7OH(n{E5Tc>~pTV^@g_h?HodK=B=26G;{9;`$yMn$JBjkxWKd})WVCeIdk=y8|B z;5ZL87(8d*w_z!UjzcdD1=&d1)=Pu!?|vM>n#i_BYBki6513f+0aq(!VH3S7^?+@w zv4dD1ro%q<-VPIHMKfmD=MyU>9Zk5UjNA@O0=pUuU@aN@5&JwWDHP4~u;fs%?v^B% zf88%yjK>a*ZCP^%)Wfp3AGYlF8w1kB!_GusLOkqTvJz## zx7pjn<~J|_t&2EVdl5_WKt7C?w|<~6!KlTo2l^AHp?goCEPur!U-ZigL=dn=-*7I* zxu<}ZQfA&rWWc-F93$M;96M+fWo^ZGir(+B6tLn>pG`MI4uaZa5FwnyxcvXsFjqXMZg!B{vAI~H4s#t((0E=E*fdt@EwRw5Rpq~x`2%ROfYE-W+Q#+l$%r1Sk3&2XMr2H=;pPC_ zmTO{LSBepR+sdq=8BM~`Rr6pQIO}m>`_XJv(bx-|*t10*VzvfYLFGZ}uvIWJXL_Y% zBONL7EC!QfaGoFlI7p2s;d>Wat?;n*XDLR6nvVa#8jMj9OEZnm862=yoK0$~GhlAP zf<%_cjfgO!W2c2RZ5Y#03sRbqQb)+7BBi!tI5mu;L=o$0{cXfu>5bhEm<&VEaL&vq zBO7kTCnI2P?R+g*90ucr0dHg2KfqSbh=rH%ls3ucfK^L?CpIdY3KL)-qdTH{H zsO*y+(S*e(MY26sk9EKJWYocwGSMke&DpmcIH_?WpyfI_eRg=*FP7*{{K3p~%Kwo6A!gyjS8a#A)3N1notQlmkVKxlY}=F;YDy6 zeGQ|rih@P~W*jgEXYiyLB|qr zncjGYW!ptw!cHEh)UFaqhg=>>6|jZYbM^eKGC$E0LA3gFom+y9Sm84mTFLu<_6Ke~ z6fnAoW6goF9m<|Pd-fuBGgoFGElg)N3y;)1))Fs+tUxei2=3)@jAK(Y!Y$Y8C0Zma zQIa^~t|8>&8`aMD4FzJlV`NJ2qbo<#pl1=MH7em~6xvIqDE@{@EO7Kw!-}k-k?Xb^ z)9k~A2Z%+O%LqzraM9e46jdT?AKFgsUINq~DO^rapK;I`MG8g6|x2_#? zgRt@7{63x3CLn>-pi&SQjY6Fgo9)1>B62M{HLu#dT(LOyD#r~CR3ayj!ntg$CP_m{ zU7Y4Li#t>Vm%gl$3>BlWOHpFqpIoA2*0Zm#amftn(H;SM!b zjLSleF*-ZMfCp_yh^dg8cZe|@q#a&BDvvRPlpSJ>`i6Qy%yEA{ftWj3Th4_UD00YN zj}TYSLv34%bVTfW)!9@fIbp0~ubBcK&;}pH6Hcs%f1OC6shm}V01~`w)YXtz&IL2B+cDM32u7suyBm0 zPt4d4H&@qZn5=-~r8z?%ox7UEL#m}Yb4E;-BxbB8BC@oW7H?I^(6P+d>S$hU(wmm;tFW42r(u9({ zRFD%Pz9o{AIO3yi_ldoKb@$^Lwtk|PkQ_$dSkBnnK{*H(v`V=cYT207oy=f4y5th3 zfGLgQT8hjlRScBzc*WH}SyD$zQ(BNDDMji>EmWy9!zux}duc?WvM6MutVU^SAXP6Z zMW&pQqyw#0melEN)ts(qaZ#zdhRHTu+!UBgXSIYuGSY2IymSQ9yQ_;zb|JWJ zpZDBO%qWhvq(R&&}1D*t?gO>lWv`rFp!JG zGB1U=7jSXxkXyGiNYX@*PBzc9YcWFHaseg|)=H|*42b=Db z{Og-@Z2Sr4sz6H?H_^q=hLkbm0mf!7lHD*73zqCsOJ#~3X>Lu=sKL-9!?o=rz_sdt zMUJLc1H@D02+T2OlE7)p0yTy@m%v#k>l_^_RjlO-u*4wUcWV)_$ydn>bd%r;Xa#mY zWXsGZbDL7Hr^4^qSDeeVsAJGV?e-Rv(bRSyd_uki(_rx4j{!2Q}fNjRROWX%oTJ@USE=My` z9(S-&W?Li~WKeo_{QXP`AVbIRd1T6CcVA!YKtnMidJ6G-pHZSnBX^obAXsrgm z$G*|l4$9bE4+|=Tkv5oj4qydI*$5d@iY;-s?N8_e3usA`V#cNi-|I&0vB#kv1LKb~ zYXUU+p$ZL9ClzoP(GQ>m;tO?r7P0OiboQsYt)Sr4gs4~NQVy{Tp%ryH!rHZmGY8S5 zxGJQeN-$SN9u1J7GL&Pbx&uT87W$OF2aX_}DYa%`#_~8t$ zw+`3s@f@=f>{FEM$I3xLlbwpieGiHb9oQ>eZHn~-lN?>W?BtDvN35GseQ=eVSf~taUdt;3fLIH;Y|dRklgdq#FEIQ7F-gwjRbh~r4vCDD3OX}su4+K5?3Syhn7fE z41vq$Z44Ml~+2LOpmf|)R<3<2CkR;+^ za;}W@E=++XKuU4UnCu1E_)&>{;2r^|TwLC@&BT-@iF#I^bhf3`1O^2bSWE|8YYI=w zkfV%Kqw%QZWJBeKxg(ddbaFiPY=%91B|KuB4)^V7_5vxXgztg|Jj0Kp3GRsv8Uwui zYx-1)(PXgb>Vpn*?21YLA?8(JaS+Lk2T-S?fQeSxsNyJygl{%aBQ#o)=ZJ(`@)8jG z0nf6`4<;qB&ZT36*ATfBH$T8054;CA6vDi~nP`=h_clT4~ME%@HMD;nW)(6kqejIfit-?o#u zSh)3YUxm1=w&EX3=*}0jym4BBvxr4re05w~GtyXu<3?Mv&@xHynl2jG^Agh)(bx9_7XbB39FmdBK*=XWy!4g5L*|Ad{g6y!_5|l7z)Av}lhjMQlGXl7V#nZ;X zMI1s@54t9z<*wrkhNJ>(LRn4#Q9E~tbvKz`3}&1T=Rw#O{ahs?+b|wVZA5L<9@In{ zVyoSnB`q2k;N(nnik4iEO;(E_rr6}Z?Mw~aMYqb3OSylW0%IHjjMXt zp-&^`yyl2m<`HtLxTy^}mHNm7a-dWkN65jz@(wu_u1-4yfqaf51XXG@4;Ydn|A3+6 zUVR!vXSPdFk5j=bmvw@KyrpnBn$VHmS0#4}7sipyHDIi;4(&%0w>ZQ`_uz&Ks4(D- z=xxA>l|s%K!yQXAbIh3Ap;r#OihdcFc zBTe*eKVae*SD&7^Gnpr#`R^L5n_0ob1v2mnu2|wT#o(tP?uuq;&@_2op@e3jQq2zb z35HtufCOiEpv{}qY%SjmO1ef;3t@Pzf_W}U{1TOx;P}Jx=IEJK_MT*4fWH{d&+fK? zG^3d7Wo{T^rz2$}8Z63oKGGa9bR?&qHYca91Cmu{%8WRYmo$V!^2lauD5;GqnBf)LXo8 zj}%;I5AH`ZD7d!a96h8`2+VakEVWEwd5oDh4`a&K!NrnBc|SQ7bA}v^mgG*#jU|lJ zPrg93$wys+NywyH)OMlC;Jpsn%?Bj=PBwzvBthj`k$oW(3!!y4flQLgFl*j7K*FjT zd(z2cLc``x(|UhDC5z#`}FodlZC?8VznAcd(fW3RwjOl<|kU{<0i?tgX$b& zxT5quQ^FBBENDt%J*YZmaj>b|l$}ehwPZ%tSc;@jH-q3LqFh>XQ;u55-G({x;rmWX z$aL+1I!^kU0Bv$zWj*1O}daRX{Sqa3~iQ8X+&*F_FFJX5_;8kh@k8&kg}@) zvqa6&WVvvzJ+`)dk|{y)oYe(Dm#|}@&+5FC09{kv{Kcd$Z$YTdnWCvNT2lg=%bw4eVFml z=KCD(_AJJV#=Bb;uJCRqYE*7l_BZX}nTmYQOFO`R-yi)2OH;1voxm-7Z|3vG31X22=BNETT*(Q|;l z69ng2BHiToP%0@>rXgt0^{&| zhoA#+X|9{G01`bo0H1emA{eV^t!^^KIPCWV)r99LbOYGKxbaz_9Cn||Dq)#iMsZWI z)!AXW=zG}6Ro{%smV!lCWj)4)n^KpfXQt1+eNVNojR-nh$ep{{6XdADiaZW*g){zG z773*!id{JMP(y{*QfC~`4~l+molziZ)|ucJ93hnydY9=mpf&~w>6@=eK%FX(q{PBe3Fff5hAOgwFgFDi>nqwQ2G+wVEst89;xn$DfV+)ok5^By?Iv?H zdFVBAg2KQzzE24!SrZ#seY7XP!$!AMuo2a-fl-;p8mYL3y&w%|J(BDNCPD+}(fx#> zMdn0?DuY7iJXiV#@ay#5x$;ANMGBo-U|%S#G3)Bcpfe>FV-T|wVP@k79lDY=c-aJt zkHQA-KXiUKBDDy2jafUeI7>YXbCfRrmOc;IQ`;@R+?mpfUtaHl@F)}=Y`{%BxaZ|b zlM++P?8W(0?b}Kb2$L?l;c`4J``pPk8S;{x`1f8^H$f8i` zk%vuIiXs^lak6xO^Ag&WS-v`z*RQzbrfSH7Z3k@LYf9-cbiW>{MNSvrM2)a&$cqbV zRXO~SEoxHYQN`-!ChQy6gsT>ol6V0aHDcevauS8ukO+r7SJVl3yQ5FE^b(QkL-rUE zdnw=vVdT5p`}^A;&u)V#^u#DI9Omsb3{0sh%CJf46F1%69e|Q~gCTj{vw}-)A$!{8 z4v?9{(5=`7(B6WlX>(nPj9naI^DFGBl#P>m*sD)t=bVO!CiCSELrqrJ4MVnxTH9f$ z$pE^;5N12>Fw}4!>@Wl(8jmn!DWUB!)E2ku7&`9Nr!jO^Lqz2TM=;-6KJ@5r$Xg1B zqwddy?m7v$91Wwub7wcu!b?~OL>!~))AM#NI|N*yhqL(0 z=7P`+h2d`8dWbzZV3-xN6vXt~pf(MDU=D4ABm*?A$C6KlXAzn9nfr<$LSYAnpR^1= zl9{QB1gk9(dAKvb-<2*5LEyI*nmFm;6Of8?)^oW#H3e<363!Cb&}-1h5=b$CfOAu7%+ z!Mm#5O9 zo1H^#x>l6t2Et)o8HjBYWu#fJ-FYr4LUP|YEIIV_O@(=I*K{rBQe-W8k=5lU3DhsR zW?pgu|D0U)m8B|3)l1;}UP_2p1_37^BX3=p_`jFghcrXP}u#66BB zHS|!ILa#|G44f=lAjojXtbyaMK0v=hCue#lROPRlEaT{w-NB312!C*pG|uIlA9?)RjY{zZ-Xl7&8_8 zcG?_)Ab-=L`cPxad47rcZ_l0-k*j*OjTCp%$8My!Iy#R=`e>lTk)?s=ON9*Zac=c} zsc}BFJ)i0|LImIHHm-h16-rm?@3%^XaT?s9da!Ows0;X2CPsjUw=5=r}3L1LhQT?>gu zszV8$Uu(!F@SjF-6$bC#vK-p@pN>O9v_n5hhT@~ugy0CeV!#Q@c1n1I?B_V zF?0_YVVuIZlCz59t%cP7|5x{e(f(S;+OKx3;*!F*lC=^$X4^J>k&c}pU%`XL!GBN~ z!;MTVvi2V#tDoPo8J_MK6sG&BEQ~Px1*dYRU+vg7m4(4Kzu;8P6N?|=$M;iN6bSM+ zp31ZERP(bqGCXFDY!-JAINUS(t7eg7_$(?O!wDw24?5hZF_sf^NW86ELU*pX%DGneIWwX* z=mx@80yfwTDMOy@Y0|m2hs8E|g*BBgvII_W$vvl|krqWQ+(wERs&hBeLPg?!q>3lM zjkM5UdKl@U!Y?(_@$^U^_8Shenloqrr>@y#`9EbU7I0f(=H<>3bWu3nGXgEgHUnjF{!~QHf8&7Zy z3~Pc5LTRzfjATN;*Du1#*qQdLJ!^>g@U6R#aY?ll$Cv5Z35FRiz~~2}hkWbt_lFkR zEMKH&DLhSKd6989n^hN1zTj-8^s7DFX0y_C@+D_8l@mP+>1Z|!qrm>wvw0pSD}5Hz z9McJ|`Jv-f)ZJ*@lnSyg720LuaJSqrt3LmB3ff=mcYbo2BV;&D$tk53+`~II((q8f z?q)e2y2kx=GtK$)hZr zC%WzKPjSdor}zbdIMr>xJ}@?a?m>_BSc`l52+rN3ZsW4=g1>Q(?{<_UJg7kq1-mBb zPqphpibp*>EU^C!>~eX6U54usy>-TnTfpABrEsxLf!TwJ$Y+0)Ey6FNgctI*a>#ekZF1S#yjhT=sep(0)lGwz{Kme((nH#=-|xN`-aUn!qlK997P^7Kv&Lnz0!nQz_wi7rTShA+dvl=kaA%bS+e zuOgM4z6>{7PEfBfxy;MrM)6)0S6M%L`0sojtKkG$o$Y8coBXK0;AGbH>pfeO*=U6N zl9O3aY=AoE(PZKQoA{g0<~i7^@811genJoW@|(#( zsJy}lxI~4o7GoWnqJrb{WFB4v4bU_v1JgNrbnD_xFd8~|no#{AA%D-x7v;WFXGTmr zg_s%iB9q_RMz1mh%a5A$nBefZ@pPiZ0@14|eZ;kuqMleX!mKx$TG0ba)#InbWtnl~ zH_S}MiLWUung_y)!LN&PnI81&%$OOcFf)dt-~0P|L2*<$^4c8}jQ3m=!ld)29zxTW zvI5D&Pl6Hh*Vafy?>3d;cu)-~EF!}wBfR9;9A=KN$ke`9=fzAvNq&po!Kw8SYlQ>P zV=e65{P8Ivrt2Lj=b?!Qy+&32J*=#^r;_k87?^{vRc&}_!sJ+Z!Sxqna-@fSIx||H zCcX^jt*4)2-a=e>IPWs#lIoG%Jx1x|JHU)3-m0{K}x7o9Z5Igu&Jrlx@8| zM@2ASv`P-M#jZzskNb3Hyp&UT8G7Ys-33mH&B*}Z#ocBLBZ!aUj=26zP}%}{_~Tzg zp|yiT)~%4^FbNZD-ET`lJ?F25bq^IXrylGKtAbsh&Wx9K3NKmV;%C`HqD(#0rAI;$ z9Y6u;b$ej0ZDpUAcX8AEQ#q%;k0)Qb5!r-Cte*>$H829bAwr0$MS=Vkis86ZXGYA^ zloxLR=#i_j1+<29BL=R!1YOam86eDKg=7YlAJv1}58kTcg9jeHy(_4FRXmT;{28}! zi1zL;OI44ZnWDc<7aw-%yjU6GBvwQdqdPz1eXpeF!;-&c%D7($4Nw$obLu&<>2I_p zJ$1s@1HyW~OXOiXBD>ZTpHEhap(R*D_9x3C>ooo`KkC()F>`|OPTtAG!GsV{NXY#nCWpnrk>gb#o`TPa4uQ& z#$Scqcj?S%d7AFRI5+A4m`h#WuU&qiOwm1Ey}07B2^^d)#qA<5U*HSF-DQWK%B&1D zNS}eY!EQ!g5AMYk?|>y@jO74BKUP=xf;j!{(iJOQaLevV8r7@T%koR`lsvN=x8>Nm z4QoH}|0wczV)#=6?i=IzK3kw2;}l0VJ461BL-;zx0zi2C?lJyCR`h#+zK0wabkKc! z#k3Sfbz@so@6zfqS?04 z5An}6uAclsScNvMyg(JGxCK1>#;!Y{~5DCC#*2x zwbbp6s=*L|Mp8WFKSOZWRJ+ILSAfy5Uh*1x$s{8RjiN}({ZfHdk9%}xthAF@sT^gS zeS6rT_8xl;;c24Fo0g1%nEXyD1XYFFjJYZv|C}D2)5Ei+ z5EXKC$+4*_Vkk!mNm#E6j1j9pTQxjpspJxW7a{ts%ArRLcwzmxKWE0tN#Qo^>x!eNd&wigN%*1lH%UWT5esO?dg z&Wx6FYN<>`H?1=)v^2#c&3teQfs!T{^cenNS;|!pQkAt_%{_q#}=&2IlVb;OF{a!_2Q&WKc44*pCJ1_r+#P+aLXGY98iI_xc*LzM| z#7a$<2Q^wG7U6Lf14sQzZt zzDwstOAM#b!k~^>?<0AzRW18j+Io0{A)D*0ik?c#cD|fjfYYq+d`m{+6sb=d>%|MU zP}Vb*gDNtvIDa)`iX4UJ0buuiIx}9YjtbjXuDW!mVqsTklq6hhd5e{&fOA_~# zynN}~ZcxX=KDPjC0^zgIo~Wk@UZe(zF=FZ#e$peKju8|rB`9`k=$J-}-&kGgc`^*c_X#bZ{j7vvZ?vnw>t zdbTVx6i#QTI>3qUc45Z#j=~h;M$i62a;Ga?)LVUg5QuQvUZ!HO9Ndy=D$ycqm|Jww zU9ZlInG{Z8rUbdqwYa7~D!^HZNTe9K)j!;i)`@ z(pdp~N}>cS~ zRs{eXq`pnQ>ZzRV?|jy=IUVOo)L~A%!ToQ0>*@a5uukwT669PQicH zvzpMIR~p}3Oc@^UDsI-hnmn+s2M4Mi2)E~lojNaGayV(C&I)`Q+a|?&Q2*?m#HZ84oluFjEbTKUHuK;sj2JT-^<0#Ca#^ig5JiY2yHEU zg~S`<<1;2MXTG<*#nkn9YyMENhwRGSrAHk)GfLWNlyF+cnn*<4(L~X2432UwDnL*hk)q$lR^-Gc?uV@y?+=4j#RHu$vJgHD|pG2;|sx}u7Y zB?)go8!e% zKWdDR`gC5rloNa|#-w)+Qr&K%)VZbb3WXw=hB4|MF1@WQ5KO_#5WLb=SJdye0>0-l zHuxLAQP_`ifFA-67yV99RIlJ8yh2orlj8FktT?x+ZN2goBV4-p5XU$g*M8)` bp%APdVEQ9%SL>Y;cL+A6iw z{;w!)Q%k)G`a&L6T){&Rnq-YowWJ*niQ8mT=d?TXeKR}11xBb@XksviPJifpNlEjp z!3YKO^g{AD1K#gt`@O6)_>k0Q?h+8uDz_P-My4vtPbX`S=~ZzxGF3*XRk=b$a8r`! zb$#J}YaS7CH1gEtwp#+x#wzK;^RT=8yuCD5mvkXh5E1@@mvnx99pBshjJ-tE*!1_D z-MQ6{5?cB|XvP!#&wWc(-cuDusFA5j0@;9wW}(RloroI|BM=HjRlP$r8m`JIUT*Vx zcP6<5h`ibXL@l)+Py`pK`3ZWgkL#0n@YFtnKGrqa;PEcD!dqI!mfr*7cP29Nb94Vx zO)8qL-^3Fev$;c1lrR2I8ipJjXJmgj_cj1+ z;YsQ5RO5$xK?t17YW7j7m}=lQyNrQhq`M{c>u=eY|I=tp`{gl!;^I?7UE$u}WjjmP zk|piW;>trqU-J6`lxn_!U^9-=%-}`!t8dsBA8z%J|9l^m79K1B&=wX;%m3KMLHt4O zMcgPng8m2eXAQzZLVUGrmm`vT&7=#_6XHNu0Dutd0Fb>f13Q(VptQD6Y}_2Mr{9`4>1W!7=m`MkDuh^vaQZl_t2e)sBN8aJ5VG?xEmU3l>mUy z-wD9U5m*lDk2!@~+w#ViDtbg(r+@OX(08(uX-%cj-$^OWeg38CAS5&~$Q*PVS#8m_ zQo~r%9qIj@7GTXz0K|bVzPF9l)f@NZo;dqG-fY;;eZMjF!$vB+Q%mQ2+iK}H5tJRE zG&eEJ8~{QSgAKb{Qsj1!l-}C&fhF&JZ<{#KWs8E#fzL<@cHEOP_v3xRxCtWc8;9EGz(g^awF7u6PVD9ndj ztLWj@dg%2EY>MlxUNz7=MU=|DBkJ|Lmgc7RLz_m=c$&N;P^3he&WBt1Q%6`mKQpJq zr#+{;odaqZ>4;R`@5vT8>EcDS!wL_HAOZ7PH z1l9D+$h6byG9%NTjv9f5?t0HqN;C0MzDg>`ZHyy)MPL5Xs3w?O1 ze!A&6H)-pD4gK8Yf2A`>`MFr>fQ2r{>UyL)I-+A1hd)e&{M9*js)L93hc5KP_xd*= z_ujkua;mua6o9tygla{S6q{LZQ`<+I#$)wglP;H!934|<@31fPbsao*F!Wj9|3C*o kNaMcUrA)T?>u&)51x_yz*A%SE?*IS*07*qoM6N<$f>U1bl>h($ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_JE_48_48.png b/navit/xpm/country_JE_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..d287833b098f5322f35bb58efd790e85e4404679 GIT binary patch literal 1427 zcmV;E1#J3>P)fN#KPM6aQg&K|&x% zvavBu*kBtkfRSiM$ISjA`vWBM=Y>v@8{KKVV*bIt9^$ZDdagWo9k2mw zt!g5TE$L2`X7lc;P?@6dya!n}^TgQ16;TMM#95L5MdW`@iL;^*j!j%K#gXOc+s9NI zZ*8T$@3$Z2SX{VzO^MF^IV%2j%f0n=l50LmDLy%VU{0iNZoRYkshR2D=OW#%B|C~- ze&ZWyN{TeJ@Lzt*2A4F|`MR4OAjEgP85FVpLFJmsv2$~4lH&qNTuLRz07|izQnA>( zI=3ckq`3VxrEN`^pF@QBx|@M46G7m^944o88UDRF_3Ps#l`7pdDLqz}pT>8*8H8YA zl@a3WZsrPexn)h`f(99@OfyfRVZbO) zE_wX!tGxF{k)uqy_k3dYZC$;trh7pH_C2JSxQ5+q%s5YpySAdGu9XLpsdCY8cTD@P z7NUXbJv49XIRYT|(FN87U|D}J?CN#L-62U{n*2PF+$a{^bh@5#6{3MULyRdqPvOQO zB=!3#>XA}0B9#aeG2Rvx+{slMn*C-q(8v&Df{8r&-QIsz;_0n3&n0PM?JSaR4NWLh z)394l1MLhkrkr^amOr|b6DEFoWIO@>wo?c!bfc^3Iijb5ZiW~WD2;u5ku`zIQ()ct z|5}$ioDz54TRiUcyzyconp~i?sW%8f&*XSv!|Xa?W{u4G1?P91W8;QGG%y;nOcPgM z&BhX;;mDyj$g-#W3A((@H$j9^=j5|1O3GG2k~K8-)n+sR>>V8)W=zGKUy>)Mg+E4= z*xbli>dv@(%WItbN!zjSxiQzWcY9rBtHO;z4NY&*j0U-fj4@@89e?3#0D-fe@vWN( z2)Fr_0yS1Z_f3@2_$ObeOr@vWK~cEIA_xE>{@x&+nN2$s6LGmfsY>Ii*BNy9Hc#2jyRXXM*J4!zQ>!ey5#sM_@$RcybWOe>LsKD|0zhe%U86{{dSX%E zp3fYD`gEsio;P;}PUm^%%qv5N8UXx2C~~;V(vH5BXATB3ckH`84<;1Mjv9kg)&=3M3`;3rIq$QJSyQW4}`)QpK z_<>NQsnh&?G6&MrWbX`GbtXSJWZq-~q^U8eZ_=jB`pLX07f4TIyoYPmbS6!PAT5n| zUzMqff)HPCP_?(1G3l=|S&lSy@Pn6C8VmarA^yG=02%eu;1GbonRdN(r;{N~&E8#> zcg^%3ymuEHGtQG1NKbR(Xg+&5A^sCbwM-qFrYz9nYK%;mHBFfyO-)^8K^oRnSDDkq zOlnz<9BOBa<$2A?)0~Q__@|dx6M(>(4rPwt&yc33cJVZf$y;lbC!3Mx)S_w> z(}q4u=Np{?0d@jx_;36#b^`)a{-|IBGW7Flv26?Ks hJyZ>As@kRm{s&h1Lm{Jb)?oku002ovPDHLkV1l!ByxRZ( literal 0 HcmV?d00001 diff --git a/navit/xpm/country_JE_8_8.png b/navit/xpm/country_JE_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..7a0dd2f4df9dce183090a9eb8e87c872483f240d GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v~0io-U3d z95a1;t@)Z9L|o;Y=Cel3*unDMkoN(X0;AOR2V8Hql(8N=wf9D5noyeok6KvSo{2Hs zLXXz^`4#Hj+)*%<@j`k3zG|j|sT&I&&uuX~75Vb~*B`s)L}W@oJ-0=!VSVQP-L)I; z9{B$Ic5S5{%WF|ah66#;6Qw3@y3)+q(b2KzXUV1+yap0X24%a9n>Mw0#|wzH!4D}|5WR~Z zj2t{NYak)80fu1jeeJ6sw#{)gbP1qcX4ggS&`L*g5!r^1SyB@`&sNcQ;0AP#*eQkqZ z@i)J~J3iqZhx{#`!LJAU+AzjCZ(S69cRrF*$5CHL|Ms&(QfpiEKmSvylTNpaO`qFu znTf0xy><~HM-%~jGgEw(KR_IKdGtFr$-?vhzLZZz?(eE67pnRD^HOE;_mgeU;WmXXy}W4HA( z_G|3Ul3rml0LZasId&ERdc-LXmz%Ly*lm3_SB+j0J;M$6adw3;?>ql`h-KXu&(E?{O@L`SE*o z*;X1la2^n7Fmk{BBC>Ot?Jxj9Z}VgJ_;!_oFnxDH`7@bsC_Nn*dYC6%YfYbfm#)Nu z4#zdhcJ;uY{cZW)|GK?j@!jqD=L*=0%(sHW5%0nkY3Kj|Gqj4LiahH81-LBH+G2>sR@g&I3v=)VYn*V@srT$`fdP_ z+d9)5Iid66Vf8ZSqPaz$^&{y(ifb|Bjks=q;ivKZs@Tc5TzU1PuQHeyVfYGsMHS8~ z1ptV*`_dRzn+~mpkm6!BVYHCID6Qj~90-VCx+3Gn_Oa#edC~En@TIGR;p-y#*Gn9a z`yTAUfq>RAb<}~>Kmb5fMVkqX4m71>6c+wH!zR9CpJF}P-3n))=T5J2I1u&Kvo>j$ zJ?fT(K#!*J^wj|(ATZEK4o52X#qjKqV{EKvi(T4Pe0;1u_!Z4ZEMJxt#wjd^HH@Yl zvr_9UB-Mc==RqTdriwPN2Y}#Ps^>=sn!HO_7Vr2SvJsshAp~Rma(s2MOk-D^l0m%k zUAt8PE=u#4fpc#WcR%TQRzl}MlX{tR;oPFlq&h%4gOrfZqa`Z|?;jzH^^BW|S!AIk z7G>mEo)nqX(ROXH-4Pwv8ga%bWVMovgGEDhKpPNzZ`3$Py(+QRNQ`XO@5W(qLNxSb zSI^{7+$FOtI9v!%6+)w9000C)SQNcW4ABA2Kmb5fMO&UoZM2`v$jM!OHUiZ`?*WTg zE=e-ZKVx$gp!^b$%3=V39Vsq}4b_2kfIv?px^xuNX#r0DI{(TEtD@z*dt4j)xqCyl zIT7mwNhpibV@gzhopfb2&Ph)P(gXr6Mz^g}F``RLKE2WzYo@QEPIaGzGwbZWEv(c^ zi7&XMeh8LDnb9KxC3N-^=xli+Jsn6N2#AgLeWGGyy=>HVCt^Yb3dh8IpL2EXzwFy` zD)b%t_GC%NRWaN{S<6Nz{Y7(hVCW6AG!mEnE7k_zeowuMtGT}T56>q(_BT(N$9{cg z;II7@vmY9i2?v|OU13Caf!pPAuTfJ%|Bj(x)t3`lHv1MG)(oZpADllH~ zUmpU1;Xo$qfDTJ+AaU8Zd`;+`zo}PoH{DSD=5vGBTBxJbJF%|+feydZHU5e|Tp)8! z)Zt;-0|g~bd+hGwflBjrK%W_;gr@ixpG-ZE_I~WW{b4Ld2VQZMxKGTih<8wBWBdKP z+3)^r_3pAF4hN=>&AJZg2?UyqRt+|qG;_Xuh6!x9$$u$o?zLGzjAgTw(*!u-2YOHY)(glGHlAkv)EL;HR;Qt48nNNihrnU@_{weN|-d z$La$*8fNn^KB=z`=sbgzDD!ARis!|H=Mlv))<^F>Z?{(6oeMf(2oM0!6#vpwL`HWc z-j7OtQ5(9UQh7aeLuJV=wU7fkV8{|1NL=*m`4 zpzwn?T~}P53p!vd5NI~?A36duE~=i2#i;j=ha-DZwBtDz%;H~q$~YY`90-VwW>yt% z-=w@}=Z+4T0R#YX*?0fy(7W%eSJ~&(@UK4$vYb0QU=k1jj>ddQMy3L#t)nC>M&d6Ce&@8f99oa36|Gf0~b_5J79QuQ92w$_XVBGnnv>rVDr z2y=`K1k$22tk<2aKidQ&qku?tR626WdPa>lG6YD2j(TStSJat~lJy@M zXQVTb1|9M)gRC0q31o%(>}82Yq}Vvztb9YjCdwN_IxdK zqcm^Ylj_W`SdYS^G^qeP)BKJG5VH`(MFp8ZF5Qo0FZ^@ zUw_sqa?A`W=&Tw z(`rNnM5;4ux|u6$c#ze?Z{47;QEDI!I$JlG(>JJ+gi+lz^)hm!6hNdpb<=V|M+vf8 z_%}A{WuykALC36~Q^M$IG$PQ2tD_`gR9mfHmeMFW5UEaWb#Ce?K~@XDZBvFuNq{uy zY}=HxI!Y2oH>Ynj6o^#k<_kba39?%F?dcnx2c$t~`-P#SBom`^Ko_fy5@faT+ct7D ztJKSe8zq1Ub-0;T{I=YES5^X49UR#BP0tVkxuoL z;+>w0*r^kXcX}v2{`=ot2x1uf+#2!7G3ji(N?GjdQ_|@cH2j-c zhU8+JJA;D-v2*bQ!oj2JWhpLJ+3Lv`r49ff*5=;fVXG&rm#G1<)sx*jE>0aKh-2M5 zJZ#k@m6{QO*s4kH9UjE72JBc41#zr<=Vle7Zgg^aUrJ3bb9QF{g^)jQ!Y~lUXOQ>~*JEj=gj|9Y z(JBV1|0WO&bm)ZA#3UAOj2t(n-@Z14ZdDiC@9g(`=gStSPYE5@txyfactQxgDO4$% zis9S#HJssMJ{o2>&+Dh{`{o7OuJYP#17~eohP5%rhbXevPV97|bQL8;6uB2T8V;-| zP0cVR@~Y;dstv>GMRtPQM|EOIKoBR8qGuOU95=bCL6i)&FAXxy3j;kXP7to36eDkm zt{yM`ehYgcCByNQW_gn1IiS*4zQ!Qg-*LJNbx=`Qc{+}(S531{fM(frM7_cI9p zEYJ50-Hj_E;JDBfVQjY4x&BPrZXvL90P7x_BF?v)v5=UgVk!LWM>0zeI; zbb-tUo<5{}CGqf1M`=TMBMZF-!~QY4&me<>r!z_ai5kZ3H8?}NF6D};Trt(IOPry0 z1vTu`Tx{Gs8geyp;1CKGUf9|96vfRwx<%P^u3lTWI8VV<4H*kb{U+(s><0y zI$KEJRb|d#myy(dF*2mhOK4FzukuMH@xp@umgN4a?yfEJ&Lj4Y(CqvOp7bD-4w*uG rI>a)uo|rMP!{KvW5YBwh_Ppl{D?Pa5F#Oxs00000NkvXXu0mjfwwAK{ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_JM_32_32.png b/navit/xpm/country_JM_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..e3ab67ac33cc0b8d66bf61a5cd996e9d9578d913 GIT binary patch literal 507 zcmV|{mI3&c_r zVf;t(spk6R6CKM|bz|yrMb*XW1y#4`E&*Lz9)A|0=Tl8jm!$QIrA0{6?|gRT9YC$w zAA?>{^|c9`Zko_`K&sbhwOx+1V#IJ1RNdJ-r5_%H01$Ts(E$)z5^*r-wjj2HO?L@m zI6~=OK_mwc-ABOb;H3KtLLL0{Kmo&%Rt$bROF$i+Pvqw9N?I{y6vO$<);`J=27@U8 zaDEBTzr+gdolOrHz;7Qkp}o_{;g0}`UcX`=&#N3eC~4T%eCpW@0Gw6D1e>eaEe5V; zGx+G>q83+B(p+>C*t;65>H~AhH|vw<769fx0tKFvq4d-H!TL+0{Y9J(_F4H0g6MP_ z$>Ael)1x}P0v>uKhfBau=XcnGsB}&T5ux)qh#)=GLB#27hh$xTX#}sp&TB7Ck2Q+j xyEB!B(*2f;(+}1@Dxk(;x69Qddu*k$nIF002ovPDHLkV1f{4=4b!_ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_JM_48_48.png b/navit/xpm/country_JM_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..319b0ab3e7847d3129e9c5eb3bbbc818dc696cc1 GIT binary patch literal 679 zcmV;Y0$BZtP)|tq|>`o@{%6TEU%uLXuo>AD%`DnMat7Z~-m>7H3*GPZ>xDJ{}Sob+Y-Ju0wR!6b@5xraLQzSqTt`j#>Yoh{^GAU?OKtz+8 zMiB&IJwd*1Cc|m+DX}fsmT1&c?VVIsXw^gW2%amtr`yB(4+w6|gD4sulN^YyQ8r1` zkn7-QgRkiht@z!Ti09(hcesuL(5i=%WB%W&J+Svr{rywFJ+RZG>po77;jd6Zq%9Nd zRC{0_o>%X~B7m3n=<7yj?M0ZrjlOsDK}1a)ebXF}lqM6C2&ACVH_ZeoYcx%Kkfuh* z!~tcZQ8pz(8EVu_Q=rT>3a0-cLmF8V%RwV$V)4)O}#^@1D|FJl$e@cQ()D1WHVe#<1nl?>=a?=P*e*unHHwN1AYNY@G N002ovPDHLkV1ji;JD&gm literal 0 HcmV?d00001 diff --git a/navit/xpm/country_JM_8_8.png b/navit/xpm/country_JM_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..53438afef0a1b9b6726e903da35ec6876b25a8ac GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v~00o-U3d z95a(^%KBD*TlD7U^*cNU2}+-~o_t{VdE@2(>C0;Ce)RsmC|<_K#unXq{%e(gQ}91S z0|SEyDMK6k<5MzBXOy?*-rn(6jMzJ32o{$8s;_Wb#bEQ2|> cb3RBgEV^!^=yx{uEYP70p00i_>zopr0EeezH2?qr literal 0 HcmV?d00001 diff --git a/navit/xpm/country_JM_96_96.png b/navit/xpm/country_JM_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..0c0ad9b457408f610c224914730dacd018253792 GIT binary patch literal 1054 zcmV+(1mXLMP)D~SrZ;e?U5XS6B3Stqv@-?-V__$# zg;ipyU}a}4to#rPibaybfT%^vBxk@v53SDPY1EkAo!Oc9c4q$F-ST$#e(WxLu-uLP z_&`+;-yMJUX`*s*DP5V~Svb8_we&#E!-H8Mn)rU+@rU$&gQ_|Xl8Pl zk&*9phu=C+p3?)$HVV-Jdh%AOMu9r)0#Tw-xDI~n~{bN^+4ofq@+V55IGp>>EHrH+D586I0BKXk+u%*K%{46 zpo13>DH+-5;0r_=MrJy+0HSLnOC8z)(Vda84y}Rc!pL5S5Fl)gI?*8z2rHwmbO;AR z->5?!q5z?3)U6J&fY34OT!)B2#5PJnhqyq*GfG5<=s?6UN=F9`Ai|7hCWqGn2!a$)WGIZa?7hQ{N%iw19xuE3|mF#w$5?^mI@KqV2innCh9en=TM) zMm9Pa0HI)Hrh^R-QH?BhFasizk+BYzKm;4v>tGB-+xsI)^?s)+@8_h$J2Y-R7?Sl7 zbZ3FP3oU2Q&oUbE@@>=|YRVKSL`SkWvI7d&k&KOufMV%LmPQspadjj!BXuAR9m&Q> z7f4S>GB8pEx;4lBTY9Vi)%jVz4SBPwwSFz2I}6@ABUoCSdbN4v?1`^lUqvpSQ#_7T zfLfecqVrq;!m80>#pi5;2Mf6jw(|!6*)p zhK|&^Q3N189jRNRP#|p`sY9b6AR8U2E2H*6mO4@=MlFHtbtHSEHb7nJNXACqK;7y{ zmPUR+DdqvS=bwIi3NJ>VP zKzZp%8bEB7T`?+NA=cF^$0hT{bJX$~QJLLg1g2lC|Om(E?j}wb) zQzM@dSD@^!J5{~dIJ)FxOV literal 0 HcmV?d00001 diff --git a/navit/xpm/country_JO.svgz b/navit/xpm/country_JO.svgz new file mode 100644 index 0000000000000000000000000000000000000000..515bf8a746cc803d3eae2ba4b8b974737d41f8e3 GIT binary patch literal 752 zcmVZgg^aUrJ9db9QF{)mCk9(=ZVJ-d|zNmmxKd-|ckG zCeaNvX}~l(5FbP1wqadTCEmL6>$xO-9c2<9m`0?k_H*aw?w&h2=^x+U%+Q@HtE|Xl z%m~HE<)b3a@=1)ZhVKH4QRS07O=d;zVw@NF_^8u=b@FL2{C07Qs=EogxO#hjHb6KC z!>?ixh9|=l^!dws1Z-h=`Vn{V)cbia3>S+9SqM^;lW=$$a!Ofvc{&KdH>fu>qOv|5 z0x6>;^(n4H1pykAF7Yl!i_A~aS$0 zIu>4g_3mdtw9l7CQ4}`T#(PJx=6H-Lq3zQE508OGmilRoHC@6DICa@%>SHW+&@7EH zT zkS~+G8W-hFjBgTOX7>k-Fv+bl-BpE~#o83WKY<172GU5vxMgpagq44o!6=Qh*{t`v zJ$G1df?}SGGXKzHE8$wWyq&q8yK{MwriYa;i)+`*VH%g~ps9LuXzo`AXqSVb=zYKS zJJ^pR%X>GOcjXHGEi&H7UCRq{+rO6EnpW+nvWq$ zq%U4>8}XIg^TbbED;PhZwSwLCwSdl%SZUo=QWM5nbmOayX=i!|-7x$_&!YawL2CLX zt6!^am{5OGe|2GZ8N48*HLaqO5=)f@R4F2%88vDp5llz5udoDutuGVAD4_v`!55k} zsIFUL;QiO-oD(A=-gZh5Nv#A_FrqcnEkgtyX28HBN)(tIbe$Pjo6I;>#M*{o%a>C| zRMaqR@p2WB2m>NJvOrvTV6*+3I=0VUnDhMYo4-&vTZm6Mnw0 znS1ZI)#Hl?m@c0<@!`KcGjsEWXSGpLQInqT++kwiJV$Zf^iN-(Saw{PzIZv%l#1Ll zg})m+J3G6%BftFbpMT_6V`HP^A{+Mp$rnsxicEJr$!hR6Wj=J72Lz0Lcc!nhN#F5b zrk_nsK+0<4Df_rzp4+ZztUG4|w!36L8WfYz`Bgob$cPZM50HIAPfHAVnHt$%mYzt0TF z)H%#w#sJjiIRPMCiEmA7!~p-QE0u~SGeX1N-c)X`!_Ud$^~3t0b3{SA6toWWq>})ux*Z^_TL9X+36R%g07rcTFx7tnzB&L|yr@5P c6jL3*4|z*k$6G==`v3p{07*qoM6N<$f^Kr4(EtDd literal 0 HcmV?d00001 diff --git a/navit/xpm/country_JO_48_48.png b/navit/xpm/country_JO_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..aefdff2b51ad0264a648047dffa2c1f6007bcfb7 GIT binary patch literal 507 zcmVcNmEO@F@L9ziS>>&F|q!E4kk7*CN~X&KyBiHKx*QHKxYaBfygup z1PW6K2+B?2AgDD7fuPVN3W6$A1Q39Nm3}?D@MLC2z3FE47J$9E9%+_%kwK7b8V3ZK zCO(K+mghJmCJxA$o=Wa)wH|A5UG*joXz~0smCKrTyji^qoj-9C=e2h}K4VLn_H$kE z67S`!xALVdkZC7Uxh#O${XCfHSITR(Wq~@4X1#dqe*e7e9fqzUzqwLz;p9jb2tenn z@wA->GXypBrGrUn02mL+<)L#1Jg>V|s{#LC<~t}f0U&`SX)qp0o(5xpq-wxl)WKC& zL<1kBj|PAl+sIt6+0=~x{s6iH@syE)(VV}ZWqq4I&RHPE%zQXe^`o+vkcQE7maFSt+?X#MQhm+v zrM*x>QbI~fLQ+aX!jJ!t)x{Q1d;MAey0F8vgv5k|8JVYSFSj%|K4kA&ePeCP@|ho# bti&0V)D+)a^4}5%+REVR>gTe~DWM4f6hK2u literal 0 HcmV?d00001 diff --git a/navit/xpm/country_JO_96_96.png b/navit/xpm/country_JO_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..efa737ffe49b4c146141c86ea1ab58d94f359efc GIT binary patch literal 930 zcmV;T16}-yP)rnXhHmmbP$&gPU@mK zC^!_c-3nC~1r_Y56`_lR|A-D|@VB#q#VXZ7L}`OfoAew~W0K~_b9dk8a?g+V(tF@| z?#ru}qfH1d+1p`iTHxtQRa74c#^_%SfnbaPGzWq)Y6%4GjamaiZzC=sXl%p_1YM0h z06|M5Z$Qw`$TJW$Gx7rjos4_}K^r6gK+wY|5D+vl3JL_(jR=6Cv=I#u)HNalf}%#0 zKv2<$7zoN4(E~v(BOyRg$Ve0rR520=1Yp9>EZuwH%3MtJFL@>V59wy* z8!I`gYfE9o^{+;(y9yBO7qqkQS_3)z zhFQufFWo}1^VmTvnIIpfXJ)eZ<}~@X0khtwhj`BGyL)5Dm5TsAjGxQBdPhD-&&=em znJMyZgXiHb*VT`o-1P!nmwbrG>Hz5AJdZia#jDrTXHT(|O*=u9b-)j_{4|?;{XW0& z*&f%hY^sEneM4n%)0)+kwY&=w$xbPzs}TsjCDNID&a z2_&NqLIaXi2jKw8tAh}Lq}G9lzodONf4Fo0&^B@VhmgQKNC6#)15!f=f`F9Kfe0X# zbU+TIm=0)x)YAbWkdiu}0#a26BtQ!5AUKfPItU1)ybgi@>7WDOK$_^lACNve@ByTi z4!i>CrUOqv8tQ-_NKYMb0%@xQ9w41{&=N><9W)0rI%oo9bV}6+GCJkz02!UiYJrSS zO;tcfXKVj~j85G)fs9V07>rKSV#(wEkB*Ri2UWfP0>M4M<*eUKcK`qY07*qoM6N<$ Eg7@&7s{jB1 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_JP.svgz b/navit/xpm/country_JP.svgz new file mode 100644 index 0000000000000000000000000000000000000000..896888544aa50e8d49714dfecbe0fc4160e316b1 GIT binary patch literal 271 zcmV+q0r37GiwFo3D0)Z&17mM>Zgg^aUrJCeb9QF{b&%0Y!!Q(v?*-o>9`QXFGHHOftZ#gEc5M6=7l$!o5MML|Hn_t#qm>Kh{%8TZ?-hFIa;toC8zAiTpHGwO{_o7B@b`5!XTa!G?5!)vqFnB-RBZd&NP-LU+ zac%iDDB&=In7|mqD9iJ#^Bq*@XJt|c)%k(J9gQspsrtb)n5QL{G>-ito>5AZ2&%G^ zPE;$+dou3HBcHe_@pOxFD~12xzE@f^xLlncU5)M0_zQ5^Lip-Tr2l VEv2*hPbT$<^BW}dl#f#Z001i6d)fd1 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_JP_16_16.png b/navit/xpm/country_JP_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..27c9137a51aabd03c86ee14dd646390f3143f8f7 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^fJY5_^ zG$tnh`TyUZS+k*2K45gaZ>%;Tr8}k19{#c!vnb}x; z`Nx%4@7!ATBWFjrHRGaLjg1fAZ-4*&wc5kY5C6ZnXW#kd-~XT86Vg&Q{x9pC*ebc3 z*Iv%nIgHov(ecIUKjydyEXa5;VR~9hs^i48^v4sXA6nTsu{BcXjBuoj&YkXwGbNX^ z0m09%5;eXuj@dK2gV))J-u3-&c%WT5UB7Bs%om@Z1z%*A=~NvNWZB|h!*I$i+i&I; SbvdAa7(8A5T-G@yGywp;est0R literal 0 HcmV?d00001 diff --git a/navit/xpm/country_JP_32_32.png b/navit/xpm/country_JP_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..e866701d79027450c63b3cb0452861def1858612 GIT binary patch literal 412 zcmV;N0b~A&P)^et0%I{NKnCo-)}#hF$wzd;3=9or;@Dk z>9wpv{P?vKj)R*Sb(p3zFfe?-_xM&;13~QsEckf*{OdJ4aml_~wH-O!$g$w*)TQ{O z|NkeT0KWzQ|NVQr?3m0tQA#(O`G{7Knv-;4fAQM6yI;5PlaBP(aWEeoI5q5S*S63-jbN)5CAVASkX` zg#`=`E3V|1w}=& zR0z_+!NCqL6&+laf>2PzML|RYDpsqAg9QgMppqcL$hB4cliIYJnn;`8=TH<8?cH-R zHpsnW^1N?;_uYm2?u3*Ql~j(E2K-t!$f#_PQQ07)syL9d#D1ykg_Kr!H3`7ot}1>X zgjgYvly5Iwdwu$1KBfKmOxe`t9f+=r?zPMk)@~ie+0V(y(d_8hZ@+EWv90UM8E0+v zKLW|c#b@C|Gxr}Ylc^8)1V_#b2YroNxu~_lq2)CIvZG_;C(c?JPOnfdo{V?zle%s^ z+TjR2iFvkmQS<2)(vAXg>e(=7TSZmt_QfxO9Wc19*R# zYvDkd*j*|QU@CTx$`hdZcT-=rH>3xJ^u&B-x-6hvJi%(dHzv)82~a*g$zuSZke)Cf zCP2lRPdo+yidmwO0nO%k3;--JN5cHeEI+|9eFVr^UrSQ}04}DH0j;UwF#vfa1ZZ{V z1|9wISSNKHs=&ySrVbeuCb@=2P0^K(AaV8jp54yAvZyM=Ld--oh$= zpLZZ?CaE6lXEpdw9)mR8^=#=Z@nu8Fpub%e_kPF*8I=t(DjQ@}6$knTqx!}c TvC7E_00000NkvXXu0mjfFh)8y literal 0 HcmV?d00001 diff --git a/navit/xpm/country_JP_8_8.png b/navit/xpm/country_JP_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..c9fc59b91053801e863d6af7507b5e016cf8cea8 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}~KPZ!4! zj+x1S{{OdUHaozQUTanQ^72Y=j+y@<;BhDS@0q6GjkD`)Dg~98u70e#yY7Ge|9}5~ ze?R-{?g}?UqonQ5CO76zoH=vi%t(_Pva5vNX?2{fNvnDxl)=Ejc*%h6?4kEYK&u!$ MUHx3vIVCg!0GSm=jsO4v literal 0 HcmV?d00001 diff --git a/navit/xpm/country_JP_96_96.png b/navit/xpm/country_JP_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..1d767d4c87c153e2764471730f5a4255aca11ee3 GIT binary patch literal 1317 zcma)6`BM@I7-f+_A$8kz%e*2pX64$gs%A(!!EGa1r(Gp1wK_fGrG_^^i zko8OgkK76`ypnWrB2h^5NM)5Q%VUyNF_->>=9}+(@6CKO@BQ>{kcj@~P#Y)!05A_Y zKsai|h_7o3G~Sq%w{#4OS97 ze#6IjberILFBsUSu@LrfTS2livAM%RaGET9Rf5IV+oE1Y=Wn`^d+y42 z>&#u>L!g};Afp&(_brrCzNOVMY)s*X2w6+`^n6^Y-FN0tOt zRkv|8Z^^sM{?n`g^Pg{`+FoxGSkktjP~ZOb2{qG&t4X-00A=#pchF~T*XC3xcIs-R zlpJgrTBOirF2TD&k771$HMO#C^m(lwUzr@Xx2Mn~)yr1|Z*1@`tKI*`4 z%5ASbf8k4&gy@@+trZ1wmAKKH9p^My`v;6N8maK`=alewq8_J^<8hrSy%0qC2eDge z@O6*PMF|h+BX@?(?%HsHejT}OOBS*-n3Mu`6s=Oc!{$b5^+_lfi1IJ z-Dps0-A?~bFP-||pDRw#3t>E`OFaWsU9ixVo}*^>=OIFfdlxU99X^E4s+C6QdL+$# z=t-cZ*3isu5J4gzpp!dUhK=o*ZHdLABs3#V-iTvuq`~!r!h2Z#gh4eT$1KTWuktMR zjj~K<&Shn@4LkcS4V&-5K&w#owNQr~EUzzLg<YB>!7 zH_We9BbVFpvT^O}y{3q8cilxynqfTzmK6%=-ty9BD=dqcs;$I5My!JhCnwMpNZ}C< zX4)-H!C(j)L7pW*7GxbYVnErZORr18^xhP3i0}R5{k`iAG`m z%CWSH@_YI(sKCc&!fT+T)^%1qmvq#oz+j7L(N8muu89KZMZ4WOFU+l#j7r>}mdCh? zdHKL!UE@HpG4$=wQyYvq3mvFNaXMrS;MuXKPw%QJ*pjBbsT9{gbY;O&b3x|82Y)2` z2!`)mMxxwF_&3h{5R=xtj*Q@Ic))Obh0r6(yVOAJ1i_gRW4wpG+V z^@cJr&!arw0tz3+%JXnobWTeZZLsSsf2`?U12PW-Wr#QSA36gO>+P7n2Dz6N@Y&zd`0T@i{Uei=z0N}fzr&x{JD=obnG>l;>6YtV=0;%gtxWI}@2B2i6Q!n2mTdf~cln|`++ z7TGV}_3-_&O9i#}zC$!k60Ta5)|}e)w7WI$_~G2LFR$@$B(n#Tlbto^X^l*^{n~y5 zOq3M{o4(zR^U!UB4UZ^4T3A?Rm~5E9agZeVx6lq5@a0uAG>Jk4TX0kKq0f DZgg^aUrR+Ub9QF{om5S8(=ZUdGsAz_ic7;-vA*oc zow%K$z;I#UP?+JwIEi9=>e@jzb?L8XWjRR$fkH1U?OOYGweQLEi@Tc&ZjEirrcMc; zG6JSvHmkDEQ}XHRE!E`W{Q0x_$?Ff7S6@E9f%Z0cJ}%IgtFA~%!Z4{YWnOeCiJfy> zn*LRDmlDba1F9Ja#em273Cq=ON{X)AoP}ZE_tRcZ8=HrMF%}}~c;xJ^D(mZG2YHet z;qaAUBLFa8nRV;8&f8>N0p%(s?Z#xbEwYUvfbM&sJcy#H5>YH7t%P8T&7@3(o@t>4 zu3XO&9?g{Cagsm*0zLzk8ZJQw6mQ_H9Be$sw6jqRETFNP#<3KVag_+EnRaEEP#9D^ z794{SlOmEl!er|6s0X22OzKNeUk@90K0l!pq$0j+(ihkdmiu1_rMC!+DqCLv89|E20A4T_JI!q&@;&uruZi!ifk857g*9u;dZ-OQ z+h2P5=d8M^&GC7J`M5cbbHHA^%qnw=eDldJe-QF`%f$kp2ixgbpx%T+b)tEPegaDr zq6RJljPS(S79U(ddF)&|oO6#61?~4P#mNlChgmL2$Ac~I;s6t=2f9D($jx_Umd#gt zNTTn}r?_qqIU4FmTU0T))cZqq?K~eFj)-75FVwE&Z?oH$eq?z00VR7*O;wc}#Iz_g zMZluS;)k3cUU6Z!*9xMkj<9JKFi_aH3Ium|8dh)b|EirG-jT*9PtFXUoQuDf2jd#F RIuHHN{U-o94KMM+d5)t9y=KlTf zuk|b@F=b`tlIZ{c&xeNp|Nj4f*Z=>9sgm>0%;{A7^5|P`Tk!IKK)H-Oy@ji~)+L&^ zZU1Iq@FP3R=+FQCFOTu2^F)@|8yFbeNlN$uw5ET)eSYF8LxT+o!YK(UDMz&WVw=^N znWd$r5C8u!6>+v|W0vTw3(cRONA}76{r~^Jy|r~^ZEXp!o9+un^-rEVUVM4}pXdK? zpP%BQ$5PYn}!e=trzopr0B#?U`~Uy| literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KE_32_32.png b/navit/xpm/country_KE_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c87c554977ea3fdea5b9f787aaad773b0b2dee74 GIT binary patch literal 648 zcmV;30(bq1P)7WJ?f`+z35egYB9rRBS zb#dwxI&~BM2LuJD4mBVyh2ml@MTJ(RIH?c?Ge~_zn?y}xUhX=GZK1pPH!EYPM~6cXzkKbYI_eBGCfzc-%BiA%yyTN&=`>s{;cA4^~&7q*C=QEv2ok zhZ7Ua%gZ}EJ4&xPIy$O^eBT%4@-xe_qEUo+Zrh(OE}EK}biC&5?5xfu-lfxZmzP1u zky2WfN@Dt?rS>D)KtK>rIdg(GSWXesTDBx zdQ684S=Q70cJ2IJ3US$R??YYbt)9`G`#7hBB7UU9?kKibUU(itEVh5&&41Z@zvr2r z(yR5WlA+{=zwxFQ?_l@%U^mmtdUZV+PU?8Ix+qu5NmHKLylnU^4bCh;=88ETw}DnA iZ?3<5D((XQ$ABMJILCIuM z4Fp3@u`GPCKR~~PAtxudP!k-C+Cwm7AE(e>}{*J2MMywbfQz4Hb*UBuRSn9GA-#i^T-YT>>?JzdxN$zj;n3 zlj-W}5-=B$s;X;iYaWls$%JG%D9g@JQIvAItSE|rxyTCXx?V1q$HvC&VF0cr64&DK zp8AAzI<0A%VHiyU0X0u|>f(nH~rfH^9sgL0Y z&@NvtO;3Lh128f&Vwz?!7!-3BT%l5_G(SHdiA25tptG;9v#(ErFCiQb&&|zgnkMEf z&& z&re*vD(ori%ge&W>b-lG9a)wQ1bFY>J&31#JCP8pv|tI608|abs@3fL?WH9vk!Wy` zzg~h(4XnYPdTi>tsq1!p2c8I+yCj=K$@` zHx=j^=uibWY~H$M_mBw&JUal8cn|4dfqh*mCr^4$odOK7KyMWgunEBXqoaY*Q773N zAZ!1i{$8{GYvx-?yoZhg-~-@~*;)Hw^zBPF8%PBgr~quOtk_NM1*ug)M?nR9tJKq{ zsnv}8_uZh@7q8hsA3>xZdj#S_Qrf@BR4u zZ2#l_g{=iKTk)%7xOaHPwQ@5Cuv0AV6pI$zjPXEva3XL**jDf>>v_?$v9*E3YBxVe z=+EV>TJ5I+9{B+(+m-GY-IdOYfV2CbZ})9~GcQ<;PzQt#2I$ z$Un`W51(H)M4tMBK;~1k)KRiyqk~_R%D4WFC(5g%Xjk5?{#9L<*9Dv<#DB})iNu@w n9jOh}NNu1-Y6CUW{|@LSyty^{SQSyn00000NkvXXu0mjfK4r`H literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KE_8_8.png b/navit/xpm/country_KE_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..d7bc50b7beaaedaa422a6ebf2a35ac5d5de599bc GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}@PZ!4! zj+w~`2N)$3MTCVX@9E%RW~6o&nM9uXC?@ffdK#@h{d37_Z5H8Q1Cuq z|1}x7FT7XG&Cmenpr~~($p8RZ#-fewiP_7~-2KHIC0aQ0-Fn0D=o~FG6+S$fX{uP7 zmyh}d2$v;2MJXM3C>$(n^xCZ&@!t|uba0_*p+0-78pC0!3VPFOHb4qa;)2{SFHIK-c=v36r~jpuRw22*-thUntgLLr!CauJqobq1R^{Djj!pyk z_o&xyv+vv4#ml4B*B3+d;ZUSNO;!}bFqbrcH@7>ZE|Dt@d`!L@9w`DsV=PQSFe%@ETRE>V!}$>J0Hvg2GJ*k z8hYqx)8Unpn5#FJNOHKt^;lXx}kyO zE0*|(#VX7}Lxl`LOlV|o8#Ws`UB-awKp1z_NhYr|ggSNmyp z2Ho)i>=c|QZpp?ua_leO2iQsT#I>y-oU)m_-UfsV8Z~h4Jt^n=9cH zcu)NpMt1HbS`r2>d&n}?4!g!;YS~(wQ!w3e}-#T_XHyQ z<1F3I5Rp%kPYtb`+*z1uITOQC2UF%MKuXcZ1176H3{UEf1WIz8;?n7IA77VBKgTXS zxk%7aAZ^!ccEXBSxz2rP!CZ4Hfj%=+9Uw>{6yPRUvINF8&_D?K8`h@~2xHF0ac zDuk9brcoEJl`M|fnNIH6Sr4+RUy}ru%gRoz)SDx8l>G^=&u-g;5N}2U=R`2K5Khh5=n=h`NE~v^MY2X_%}RE= z!=ColQ}>weMnl`>8W9s$s_fnm<5w)k73o7;=4^V%&pyn?vnc)FxAbP*N|EGL1rPUd z&nfm?x#nr{QyaLSkF6+7#dNe;aLa0W8kbb5nZ*b1jPN~!s|hRX%}xR}z~uJ8jGTs? zeTgIjI-8=`sn+o#-3EAcG+g6SZMQdt?lzu~zz2MPwo+bI8ge0R8+)@)U{{$n^gDw z7@sXF@reK~z9;eoWEIGBs`98LrMHrq#(Q z><&|kQHOL6X}(-?S##Mes!WxlO*fqm>|)pcoKW2x`*OJR50;}Q>!FgX_$#Cd8oku) zxay0Ls+DL{w0_En7|aX*9WfDi+-O|dwRPu1TFf#{LtpG(<2jX(5>ejYsl)Y=;+aTt zbkZsl8(&Yhjc$47mdaF!--;~MOTFaP=)qKcXi;`IY`%w7{qW(X_;D9vG W-ti6AoNU^E1purm4*ib_KKehJoA68k literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KG.svgz b/navit/xpm/country_KG.svgz new file mode 100644 index 0000000000000000000000000000000000000000..adb3a3708ab686906a710ccec227472193df3949 GIT binary patch literal 3063 zcmVZgg^aUrR?Wb9QF{?ObVZ+g29+-e18{z9bltdi&y9 zDFz8T=!^##Ogoq_0S2^0%W7m%py=4nub*=t#m$zo4C4YV=%O(B?py9X?`|h4d;Y`y z%_jPg75jC*olkheCQ-IsU8b9So6RTNeDcHV@6P`e$I+W2 zOUrB--L1>(=%?-b{UY6E(aY9QebG+8%Px~5+vm5%qS}73=*}#bSM5}2awo$i z?!BKeF%u%jjClXBEz|pWyMNJH3I&fX6^yYNWbMo^n{~Dam^=L2Os@x$O8YCU%aUzY z&ffm=wh_iGS(eMrHZ_*LQ+oh!)0=F+OBdOGR*#4Eck5+&jk|?v;r%*Wudd7a#2nt& z%lQNg)PI!OaGGAP#d#L&5?A_aZaT_i&f&)cAXJrYu+Q0i- zc6IgcZMJ`3=DR10$%^^p?|+T1Ht8z*Ad(u*=J@=!+})P{&F;%=Tj>GoJ5U5MElYYZ z^ql-PM$VVn)t)331oWnY0HVcaz58ccURUC30*xKyG-F*XHd!q{%m`y{(vBAMi87t{ z#lw6OOWz&22acWh28+{zCwnxa;{MTjt>hs{qS?W~S#9BG45l%ml=~9Hh4jBa+s|io z@!_diKt8zqu+HvU?;xK(?7d4@*&^TMuDttVp+utP0Xbbh}<=J=sB!U;dgc%43oyMo7ozG?pBd@2}Hkem9?p$HI?!eiMS* zD{qz6kL7ebTAM_0$DaxbY%LNdn0>PI@{kbX+wHnU0^Qv|S$-??)ay}`G+wAe$yY&_Z#ZA5w>cosX16nRl%z%aQsnri18L1TRX@6X$Ad4?A^ZSFm za>DbQtW1|_nYIpAkJvf|p+KGe>+O$i+%3-jlNawh@r4QLCDPq|(nKd^wZ$1q%1v6n zUf^?j~Pm2d|j4*!8@mL{RL>P(mD!8#E~|jkk&O zO!KL9B2hwn@u~)T)y;V;%Wa!pI(q@PVtxNoOd0+W(|W^cEVxayRm{F>b7X<|>}No$;=V?mC6$3s-lit@``9YBV#=|gP*{_usf^LA*dZ9(Y zN(#qtTev}i7-F~<=?Hk^>{0bk<7b`$Kd7Ru^)703=es z)BymFj*J_+L8J~PIGqm#ak`PTo>^2sxGOH$X(pvQs{Tp*Jp1)jJbO`ABlrx3q`7yfReJ*gQ2Sk# zae_BS7O)}x8-kS(umWb)eiwYTaz?BN*a$mAL8vJCp_dormkO1LxiILA=WwjraRLIB zH&F;6Pa5SUhLKUx8cC!~=@Tn7r!2y0E97H++rpkzs zwTLXID2OpAm?H$5sMu`e#6}Zo#H;)0kCJSoMHVtnLgWwENOKNx2QH(BMfL ztee1KYtwY!1|oO#uW4dppW+exLLN zMvU}iAU)B{j`U;zJwbIG>B%s9g3f%TCj;n-=5nMbgXjs${76rR(G$(>NKb~)6V3fd zPX^HwE%-=JhSC!upNF0Z{YiQfs0ky6@<-w)!jAl8C_fQ?XQMDdZI4C5zCj{IaOKT-O5_=&Qg`Rfx4WV8CV?(Vz@o6D_miG0Z8nRO#8urfWeQ4O1eELJ2zI#2T zT&PdR8U$DPo1yj%cZ*gQNt)U-N-)UHvI|piycl;Wz7cMw*!pBp!$5KgSCVh7|pQOd2>qeglteU$g4w*vB%8~F!nTMM5UbGp3#`9#jS^4PO zUj5|T-f!?}@5wKF^~o=L_1ArecKk!Q!=HiJo>80iE+*fZPi~9N%NO+iYBCUK&QQ?M zTJ-4~P=s zOm`3g2f~NpEJh6ve+E;_+WGCq&AvFgdA^`V6CP-&c3ILyQN@!;cI_Z_=9ZqONKz<# z2F$e`126SR9m+LoG@`hj-)`-Y?2*NZ+VsB+zg;4>&YehlS+Cu$j*6KXzDS3#ha zG@ViE4Z{<(wdkG&)4f47&q&K?uUqqKSv$YoxY?Hwub(f75veI!S46oYl+k0*hok5* z+R?yu=xIs>JxDuaxLRf4y^R`;B<@acwvC&8!`bcYMIV)~gjpViSq7r51tXdX$7CAh zg&d$BjX_fAA@uToE;O?Z;+t;n4o@x1m*ddpuSy#Y90>{;nz9+e=S~r_djHYsVl%r F004%(?yzWw?Ds#_<|3vN7K|(&LEqOliCzVIlfl!~&t;ucLK6VV$9UTS literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KG_32_32.png b/navit/xpm/country_KG_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..5a495abad637acc7152050a536b75ee78f2a9686 GIT binary patch literal 680 zcmV;Z0$2TsP)kz3C1i!+;st6KwM^Ldb+B;dSZsGB$`n7uYTWGovv=&Yp%dW7F}rf zOTd2!z(}aU=aT5MMjEUZ9oAS~&;6$f|2Yb2DRZR&)be&U!B}v{)3gtaH0|?`v3xI< zmjb8-M>jIP;Hc#R0pq}XIwa(d6nGpLVD2XRR;K22dv8ch4*}#@xz{yB@L!_B5Jdn2 z&_OSycJ0)?tZ~->0nOxg{WKgYn$4vsM8QF!5t?CaFfjN|q!yf-&$wqpLU@Iv^<$`t$^PO|%ep4r}HL24~;3d%NsfWmtgnTHm zf+QjgQlg0PA*cu`go1>UiYOAahYAXNFeuHiM)Q&m;W#$q=*)O#&h5MI%j!XW@n!nX zsD;e`dGG)F?X@>+EjGDW-wppK(f=CYTFn4Wr5T{9Gy^o1Zb={t062g(i7A2oK}X6p1@e)6V{o~X2CiH5YXdX4O+6_F?vHaXsI)nF0q>dWUi{lKW5EkzOmfr zOCr`Pfg%8a1~nG3({cDkgR^e3@>Y8d=CxcI#>BWgFz>JOMKNm^qR%bAJiGkT?Bt-w z+614Qcw0w<&l}y1g_{9nEb~DTqc>24ChZX6?goEXlk-HueX0=dsSiGEVzZN^&&}@` zioVa$CV9hw#P1nr{bcfM#(t!v&RWU-tkE0LCP|y6u_P47TyflS)|C96&F;nmUlgbH zC+S95j_%V1aWIqHF~nMA`PJEMRstI2UlzuccL#)n{L{&Qa84IldFvc;!Uj#yPjT#& z8ImO0Q=fg~ygX?GN5YXW4%M)!C%6uX8nD>>n6?TGs2Z@c+eW+>M=?wnBHe1%nYho4 z2fLb#-cat-RT;&YAz-KV2Q-U6H$?kR0@g zt96AD8}%hlOdy`7mc$YRMZnZpWO~#HzHEs0)azop+L-Rj0Fb!yZsT1U@g$ZW}Rrf>a^WWr*fg=DBgcBxG%pG$?u8CXNP0L9gk9~U6bS`2&Usg) zN6ct%eP+`oK0jS4N(oeE&icvR+rxl__k^1HUgmJpDD19BeEx|IY`}C|l z;@ayb#WAP&?A*)4A+dD+{ULKzHTot`vpV>=5f~(gGB*|o05UI(#rtyk9Ya{9#$BN< z@aXG2Dq=rWVjV&anySF#eL2zRilc5?^ICvtgLI!Ph+|G>^BB!5+9XLv0|16pU*z(P zogB`{KO8VI`PsV}K*U7zzKYQkszK9O;nN01JVlVGOAIHt8ZqRs$rr@_do5|5p|%kg z6~y~P#>OfiP!fXBN-;wdaMHEaS$HYbs%>>A$kbb&5Q4pab@h)~>uKZRx1jGxiTCL`)#*!D$xZ|nych;ZA(yCt* S=3EBa#^CAd=d#Wzp$Py12Rw}c literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KG_96_96.png b/navit/xpm/country_KG_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..8ed85bc6c7d76d164c10b578b385aac225a33b50 GIT binary patch literal 4212 zcmbW5`9IWO^vB;rc9SKMMAFz(SsGjR5r!}rKFUOPlI0^i(U3JJ%S1!jw=88TJ1wGy zk+F>I`KZBYP-B~6_|Eqq`2O&H+{eA=hx0g(`#AUB$2rf}O|!K&1M{Bc1pokSVGgrn zS-1b4+-$7%KI2Ca%W%3|n!$kM{~aYg)wuv5sAvH*a)>OV7DeT`AYTmj?JczR&2+xf z99!EKK9y@ItqvD-=ICcfOY`1Eq$WmNdwx`SQhrfND9h~ElmECIKgsYLiHL)|LbL?) zEI6%zL__&U730q4^7E*e9%gUM3dZ04>GFi@Yn%av=7bFE>FnFnjyRZ)am{5%4H1`u zOjdLfB6K8;R93nDjm&KMbkMg(g(lEhC87^bye+v{!|{K+BCEM&Z~?s~^M_k)p(E$` zbRfnCb-Z$*Gd@U=!jN808p!auhkdBZ7m>Mg6n8Y_fJ!QY9Rhm7ZjB!g9wd@xrWtDi1G>r}~I|hTzka*RIrT zIo+I*Xj&2!hR9A_?12vIa^1WXsg}#gX9xO0$e4JO&OC4mMDmpV8=|2`LAd)1%sOjd za5AyZn?kc+N)`c@yPF@(N(M^|dE|g$z(=tFW*#Sj7THD;so;MMkxiAwW*b6l!n;q| ztddPDSG{t{9rUJu_YX7(q3gM_y_Q@vI=gKMTdVp>b%tLUH!NN)lcp4FJe3tuVe{RV zbtau!RE%_5bgS6r)OJhV(s}B{H7a-6@^#gvKVDYf(YE5?JlWpniK%Zj*$?V_+KfU&4wL<3+bPGLL*1=4#kV3h ze{&j<85X@}_ihj0KMjGy+f}_>^-k;O+vUe3!LQaf1RIqcy|8q!aIoM98OFWld#}~T zt5lv(*mjcdaV0PJ++wUBR3_Coz56^TXGEg7Q*epWTgP=nw~#qfSnw;Ub^Oy+AJP#C zIRiHvR@j|U6x1^KZQ-iv*Qj)@cbv;m9BeovqA(4`>=Qg6% zg(s%~FhuPgU01zjC6z;2jth~!h9c45Bw zbaxnsJMS-rE76k`+AsU!&n0M;kb1AX#den!J3oeCZ3G@m*r%DjY?a#2#|J< zbIB7vmoZE1Z#^Z^F)QD1^fr9nkYUM{cTvxLxabYcpbgKs7=d~TPG(qGFW-*CXX`7% zmej@9L+#y-Gw!@048f(x=nq}LRW(3ParF(sZeNOqX>>iiVcY9l$}e1`_O4c7%)s{B zQKTk9cCkVElTqtuCDfZY2enh*%>nDPZQI%g6sQw6amR1%>Vdj_=H_0Z78BF_U}kvBM{_0dqOWXHiSuUE)EphWBIJf*2JMPOl}c zW=`gadZJwLOwWkDcTA|p3!6LKmc22;X#>-XsK`DsV0uQG*e^9V!z1q&S?A{b+BBeNt&#o?e);6 zaDP1})&i*H6Qxv>=+-YPOt-sb;puOq<^CyFy`reSxUO8kXsxlffb^Z4SUkXgzwOcw zi|+4f8*Q&O=-A5rM%MP5n{(=n)L1ANx~*Yvud1%=mLg&I=Q2w7D-X%%2?o1tfmN_` zCJzSH)C-!35#TVsCjOcl1R(fhIeP1$HO8hldIt@oO8@c18b-C*IEZf|GkmTzzs5CB zS(zAXDBR=&Hs(2KV>vMq3*GHM=k4D(icNQaVOn6A&z}!8=8Rrl&y1i1T+Q=(e05Ymu*hDPf2^FCAt&(!_E-oB&lj>h zf$?e>${>`3rEPDp(+<<4?mFuY@M%^F%1t^!oD<#I3`qqsP9J)@N?weP+SEDMWx#S_ zVr3&`D$iJ1Y(+X6w2+yd%FJJ1$zcQ2lVgv|pG)j&2Cltz6k~M*LWU)P0~30BW;Ge3DVv?G-f*y zaP`T66~eB>JST0r2N&KQy1&sC?*HQWtHZOXe{WT4OZB-E+2m`d7g<&Mv03;;Ur17f zt3Gi*`$03F(Lu|V+H|6Ctyyh1e;u^)(ttes;o;qWfj~~d%eXq6If39bp|C-4541%Ig+Yw}z%Vs-0C%s|`O z4~z%fIko&L1cy7$WRnCHZaUN+MW!`WHE*lLJYs=K(6xz5{YCFlsml^pC^EbBtKo(2 zlpsx3QM`9mHHmbx-}!~!Qf$%J~H+rux<$HnrU1h_ChnHcN^(0i@dX!4v*wzTg?@VS#;`-PhHRS@ZQDwLC-uhxaLBi6OJ2H9cGHKsvT+QS!#iL@2OOQ+V{v7(1!=eocDBu06@zT)|Fv1JSeB&E+8D5 z7w0XlgaXZ@`Y7-R&r)}}@pG-1&55D9lxmyUHU*`DlsW?P!g{(mHHj1Q-~25vg6($B z<5X$6!?5z*N_y-tAdml85;X(w%sVsYf>etCH^~#m===(WWkKt?njV>JmJ995pkd)w2N zSv7b6dgINmvuo>ei3Sy)z=~my3;W`Wf;77iy2dnr=Y#w5R>Ik(vMxLK*4JgieK>GFd%eqj}U|bIyVK)}ETyeG~n0B>*6uHeDnB{dJLr(_VL3 z4T42Je45jO`|G`qYzce8Cr=O^*&UjN7Ew-D_3ezT{Eu~h%#F>y{4yJT1EJe-r#BX+ zQPUHSkH4;b@>OdgmyNgKl3o$JAZDFARY8g9eLETUOk@q=Ke!}!TX!TRXr1J!(~^-+ zEsI0@KI&@QOBMfoy^l?9eF}U=3`=(`?`VXx< z7253@(L}uZ{b`xvhrzHlyJ@#ScQXHxiG_YnHd(V{@j$p8yWuukmI-w{e21M#`suzY z76mZY-VPArSaPgaAyQ)~8SR^U^S9Q^QCv#WG7l?y#$8C6Gna)~1LEu*{K*{n7jRhrNXEG~f_ZN=N;Z57~f<}8yM?_W{O<4cETZ*+}V^kx1? z;|JU`f<4m7QTu3c$@A$`x>X!m1^xC)3BDQEQZTzC(-)r;G?W-EigCPYktrt)lO0&x z*>)1e#x3;?T3nL;vTa3aMEfB{J64XvFb_+BuZgg^aUrR_Xb9QF{>|I-P8#l6k-(SI_yd<^M2tcEO zhSttLFqNvU(s?<%r_RfHp-EcSMix~R9ozZ!`!$9a%nTUIvP3&6DHmyaFc|dxf|;Hd zfB*3Idi3jJb$7MAd3jPvvBEx1Qe2r`OAy#mkeM<;mZF z{L72~Iz1gtR*UI+F(19ZTE7|ntLYt9J~{vY*Vog_yTNH)`pc7_ac;DHJ(^74zQT!VqlEksV_(b{ukZAl zcCC7Z#fFp7Sw6d)NvE0rdbN1JAFDS$X%BCwmy6l*dbxUe^4;tFvpMl&|DT_JZjW$0o1OpPa`nsR5I;I#`fB+Oi#qvn2YxZ1 zokO?ZPS-zPy#?FUEc_L^{NikXqBD5?@piGFw4HWq;;LqHK6`tm7oGiceRX~P5536- zvpnV5W}zE2&I&wUoNW=!N0&WXT~A*vu3w&9C__iKPsz*G^4;y*<$SSW`N^Jq8xhzN z4${6wXkc`a*2sK~i(4_EK5 z7w3y#7dOlK{BL*b)$*4`D@W({cD@px_YQdqnaLuC{Vl?3NvFK zd(C7HtQzMyNh2{zEU#uO4M&?o|28qWMmW-aFnRyxYP~p!N{eU*Elf>Dyep>P63-gi z3&37ds3CSRV>{$-r|UOQv$W_EdmE**G`(FQw}S!n-y82MJ_vxRRdaG(XjB{PjPFiRnYKiIV7(*UjkCUMz4QHS z8d&eBlS{NuWWHe{$pl|`r>*@?F$~PNOO0``_J#Sr{M~hRX1%oR_C9Nkc==94CIo2H z_3G-w_mDuF3^-x%&+foC##69yaq7o5HlEppA9f*Ghq{@*r`AFVquJZQOkoc<7!!i% z0=%Iy&UlDWa>c1)b@|V0WX0c`F|lumO#Go3x<&j!95ApKL@5*uC|#&2m%9s+p_Iu% zT*|<3NQZ>5CPa49B?Oz;urX94MB_jR1Pot?5O7?<8&@GjC<3uU8bgzyqa5!;hvZ{V zAjDKDz{ZlZUylOm00q*$DDdL!@??s^btF zib9V@UE45whgiQ)-PToomu z@*qdUL>t_VJR=9PluR{fIEF&naQXxE?3KruCNxSRO0hx$3j>3=*WE(+>(YfjI6a$G6Ym87; zj36~Hjg&|+v~nMLFx=M*0o?x4^um9kULfD5zC~I&aRf~L5 z_z6e>vh37wQCQuGfX^j98~sxi`Phgr+;manqhXDYo${tgPwrK~v{phBT%ta54oNps zV16pxd_w+JWCsOu{vdMl&)-c78Kx2y0PY|_{RGf!Y0~e`-n!tI_E<-dEG~w zeC$x0p+%;LKFq8zX!;b`2MUPZ4W?u|Q}^K5%ekCOjTXD)P(URyeZArbcT%f; z@q@px{KH*!R64*VN3C`pC;}P#?NLF#Akk>`f_uflyp0jb(U1zzm}mog{wiUm#acUi zvPEIKns7ml6TGG4``L$Hc5P0OIz)lC*69!r(*c(D(;;R^h<=>! z?jvuuL+oHDLh=SPKh;JuITNC>RN0D%?p|9FJ@ld{B}I{<<*F|=0%sz9^u+0gUIVwsE)U1#VpQ z{;AM|ze`Xhs-j1qi{1f~w|~Cp;7W3-C?;}l3%|a)SQD=x!kcWcA68!DBiG38*dOs2v&LdX0^R)5rxY z-5j@tM+LV96!W@A{kyiRtdFZDjt8FT*<|}ZKAkim!%Q_(6>KHnC({I&H~)FqN%k{Q zYUw^sJdK;N4OjsyXi^n9|4`)mZbr?aJ}O|pCEgWY;fvAB+~aSEckUsAnF~>&wBSHa z#KVVLH^7dxV&aiNJrVDc;XujT3UZbBCxQcHf_rEost5&+w&R;{IlFExS2sOvvPY`u zN++*tOAxs>kjBoL#-*Ue1`CUCXlxNIlGxE?0CD=vPv9}=(tsc%1kw1d$527z^ood( zHh@lfV~=qhaD~ngfH@9h!-CV|bhlA&iUG{+G7!G!Wpo$Tt$kd6A|27^*4Rf6_Bn5< zQ{u@YAjy?aHg~yqVAIwCwO0mPfo5QJg7M&H5VB9Axv#K0cQ9^M^cxhH#>l8Ir% zUg&(HFlJKu3?LV7Ky1?^^4CFUeBy3;Tk_XG^Y>o--KF>k?ZR#^z&L{>G4mL9*Cqjv z)tUvPkF7?1P$Z>+t%xpuuB{+A))Y6wL`){Z6oFvLf)1yezC)V)qgo3Ra=mSbVlS`r zAlycpj24w)Wz@#!r|MvNcOX#QA`BQ4fl1C`FcGQ9V({tyB%%Tn^GwJSO(^Dkhz^oY z+7it|N}S3aHz7zI2gD_gI6flHkgEizm9}(%X6ac2AJf9xu+zRBf1QQoLG;E!BZNqg z=|QC-Ob>j0oxfy0&ELrY^7Z-oRQw?aGqv3+v=ViVPLl{82Wlb=<>P9f0a7qnbbved znLGF8j_4DW(H@gK?wLCWJQu~nZFxB65FXWSkv?(bP6xKrfqPNFo?Q>4> zbT-w8j#2foaoj5%d@*}<6O2+iWK{Xts2Ar_sXn!5g19mMV#gBG;*^I)LrH(|qG5b?Ab;wjVSFxGe16gJ zVOuwrm1g9Qws&Lx)O$C-TcbU7Sc5~beYi*)4E@oIv@G;or2WhyEsJ}$cz@y|Ez5Hm z@Y^lYvOJg2zuh7&-zOS;F4BIDA}z<~YQmqiNZWns=$W;DvLY=st>m z($?C8l5MmBGz}liO+^yB(ni8yI!4;?RL=(osJ;x}k8j`DDz>AwS8j?(U8v}5lwbJr z$dMtB^}c*?S`?@Z8(MW0hvWkp;8sd7-)#E@5VG2m(~ zMMW2?u#1s+2FGG5fRh?f^sQDlJ{5Nn>l>Cxp|c*b+IZ1BSFBt}jjvGLBUk}lWMHt` z-m6cuJ|znQ+c!L4&KKGN`tIe)Y<8FbogGak;I%3;(QBlseK39SP$~vaY!NMNx??7i z1gO4a4)i6f`49?C3ystAC_9KuU``6tHjKfI*#?-pV6=jll4ws`aDib4v;n$p#VjQc zIyz}gfKFFoEgzhL3o4+KDikKCA*?DE_fZq7qS9SaOw>e^l()OJYX?vhT!w9Ntijq| zp-e1cK)F6W4>nJ&ib?x(@>GIhlVKb0|EAqgglw-3EtuaxLn4hyU$^m;{k1|}Fm6l% zGy|EF%7A*56xkNgq@G7S_^t0;Gnm$adAJNCl;sb4oU9}UR4c^E!75oqxX^u!B;`9J zxJcRs+$moPd?iY)34uj032}BF32F4;wgwzFKqhrY?YaZIqHYF8g7Uq=b*uXb3QeBj z_;i)g1k#cEHX&?cfsJS>nspO*54*_F5GD8liTZ>)Qlni6uQ$C;->rR+9&u$)fMQ=XWA(dFry|j0!G;!lkNs2M3>G-_G1qv z(2N`-pB`C+(|Ku1MeXgd0PG zwqLt2HI!gP3LI;&iwq4>H}ku6>k;!?^BQoDsUj7rClyGFIBK6{hORjiV@8j2v#gA> zRbBHfV~0=>6;8u2NE>2rXrN%e5!o^n6{BW_)S+1D)5Ls?xF1_DO}lvt)Oppz<8V3!aisJQL! zgWRGKw$^o4Bn;bNER}1Q+-*Yw6*$&lx}xlgICd#FBT!?d8Ju(9R8|s;?cQt5I?{1abs%!|RT2)TkP!2GsZOv>>DPX@H=|G#?T`{+U zhQDxc#C`#MqblrT!x|S0;G_oB#u_n@k>W0DE#Mf4JIfL6Brgnl>>`qsi~+=SF$l?z!|uvzF4pCJuPW9_RD_45|W*a|c` z?dRm+P)RIev4BKBIqhM@2$f<~P@AQ?pe9&@vZ#&XBfNuVg`&H=lppCx8ckMU8k0HQ z(;{C$Csim8wWGi6?;=rO&rhkl9E3CwQsm70Wed`QfD|_t=+$5s85)DpDYc(SL9{+8 zzd4}@z7j}U>I(%o&>mGdgzT`VAt%y+2FGx+gkT!cV&-ZehKNc#-XNtzoP|_OJcL9| zXC$Qh+HV=Km=g@ru60IvrQv=+63~hmBb2~Mm>_Gj{}{q9Hk=726wpZ(3V+fh{ggy; z9|=KstSNO?BuE1hTWZ>|Tf2HBibf@6gW(X;dNX!jgOVP_`gHu3B!buyeukxo7<%O> z5siVf8`RG{1ZcvB2f0-WB;G3}C|he$-%A2RY7i(Q?@sx8ld^GzzYZ;5DzM3ck zRnJ@{&G_2H(U_oIfE*#baGSK#MMT^&6~=Opu~1N0olQ;_A*fj-!=~39 zq8Dvzj<9(XWWiwNm`}Hij8o$WZ|pPCa+V~@unKHaAE}?`g5lNJ+31t;6t}F^%?r)W z;C*w*sGsfftRen>q<+YDWHLZQIBb=!gcCZF8Vs6x3T zayM4h*7v!KsE1s_%ArKbBQMXHbl!r}+JDTgv3*-!(GN{UtC_Sm+Dt6@dPMmeFGuZ< z6k;7VIWRIJ##U`)t=Dk!JH1r`!w-j)O@^`uDT?#uNQ8(8wrw$A1vIISL)wWclwUhc zQrq7t=kQycFY?9uDIV(5r$V*kakd(jm!JM=IUDjLz+<-gS?QdJ!r&pGVcq5daSdE_ z+9dWVs7!ap4z538n10!>zy>EYo}dEliyR(%F{w+TA=!=@OxT*wF@4S=;9-4kpMe%EFNclv z8gCVvn}0!zGmihM?%H-624UzQbphL4q`l>nCQaJk&xd9SIP{^STZZ~jiCU>R27@p0 z(JK>&Y-Br6_`@BVBz9)$>@0OrI*)9Y+FLa^6t<`#P8ce=Mpd|%Edt?6jzh3p7u3s_ zXak&S-OUKXsrtKPYhN-VM}b!ekRt<6UD%DU{x{NmsnqQwdPVA&gjx{6oq)skcwldA z?MpI91oZxQ%mqIzMs6&+&p$=|W>z2bq-QL$K8{O*NKwT6vx{V-3Bx-bv z8xZNIJGS;E58aCXj{@B2w%GpYTiqUlhsO2?_Quw}-M>K zF)KEgU*jw+P0Di)*|eojfixr621dPl$sogE%;j zrg=a7ZuL!?;{N}SgCAWFFq@Niv!9y(roKt)K0Q2=Da{eX+9ie z7zeWUfoH@ajM_=x)PCdKMAU-)ROES_M$NyL_pV+;cvjC~+q&_6cWt;`^^hyBT voJ+p?p#qFzsGE!zz)Fm{VxI?KjAjQEe;SOJh4%jT@u^?mlNvcRVvGO)-{Yt9 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KH_16_16.png b/navit/xpm/country_KH_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..9ae5feef2ee236f3fd9e97e941f535b28b2009fb GIT binary patch literal 328 zcmV-O0k{5%P))yY~OjpP#pGK?7zO aq$L2pXiy{pw^!o;0000MC=b4+4rOCrXGyt=8*iZx3@hU4~hq%~=6q*PHvT7xlZuOrfjc3>3>$^AV7^o2||3z-Zs21!D%ud>x5#t?vrEZ^5J zF9UUkTr%R-!-6FUQCJ)|L^1 z*|uynC`pVEMhHq0Bc+L=)YR>^H8rK4o>)F_;yAv!`KJ+ON~Pf7Ks`RDgEGyg$!60d z<~YE)X}5c!NkXNPYBT^K*xzs0>+<2@eSnUl=J|QLcUM-#)m6WDmd_(&`uVv(Nq2c! mTweAQ|5n4vyJ!NK0N^*S0rzuQlT>N|0000>P)#>C4)QjlU8R2SRKGln+`E1rihp5c~^> zk|I(X3K|M}+G}X&X^{9A(wu}MAsrt^1f4*-$gvV znZ>$%89?Xt>;FI1m_S4Tz#N{%Fu30p&p$CBV|kf~x^Le6E2*YwOG_jK={kE}q<^%= zdx!KhXSBJwaIjui%jHy|px0_~{F4MSYBl5h`B2bYS<#9`tyHouTnPKmp4FF@#!4~9 zk|{GY>9sWmlzcvDHvdj}?wq-}NR|a=qgFE(7u`mq-z6-|SYC#d!Zc;KJ9!{JI#TE6 zAOt(kFj#u{&|F{VPKN>e_HAu;cIW>6!2s4578qbD<7XLT$;yu(a}Y?+t2}u!3~JRX zj*qp41-)7&&(o^ae^?(qf?<%Z7dAHHXNg;(RHb6AtfZ!=0jSrnrw7NNux(-6?uQQm zQu(}8lwnu)?p?Sp0Q<_7z30#UuV3RNihFewH#Tzj?)kgB08-`hFfQBepxagRc>uj; zQ!!0p+k?5O51|wat!K~veEKv_qPP|6HJfUsqS!V7ZGPVS^eL6i0`M)%n3?fgEfPYT zpZ8m>R3-z!KRD2zL&{;001krC zz&MJ14ly5p{HUBd1;A}IjvEcqbue=fq--0-A}LC+yX)`old6Jfckcig^}2TYv`D7`1P2GCC

Ga*H*a?V5T~QwGi^gd3rFQ;*T^V`LL9B?`t%7 zY8n;f3+I4Jf_c9&)-1!4mCtU+1K@^jMG-01i$Jj@H-Jo&xN{LU0F&xkC^9Z{jnbV8 zJ)@)8SOI?;H;hrz{{!(#F4R@6&e){#a#*Yuy0WKg;(qexz?S+^M3qWFt}1C@9;onF zrf`C~m!)qse7Cn`9)(?puj;j$F%^0gxhwTSZNqNU~X(ckGQDF``W~g-DU) zqEd@RPi=#3H(PGo_nbWD2He4IE_-tv@7s6XV5UhIQr?ST5Z*B_%Nq7jwHEP>m-u16To@qUC!sm8#PPZ-t7z38;#j zILY)-h*@e_D?vMP$1a6amG!~BP)cV$jStP zOoa;XgeSAipJiCs9L%JZ0pEy7pv~i0tV@zp>Ltz-Q}*1RbTp0&ws{3DvN~`vOc(}% z30aN+3pv&+%}fPDeA-Ym};$m=8mvrKt>n_0c0& z!sd6I6Ks|<^PCG-fw>uJt=n2hLRmGL`+=}cLGUP4TPTqhVNALp1vSfOAd-eiuaOfk z9FR$SGlh%wq=o99*d7e#Mb6uz=j#D}L87>3e1R##W1H|MW1CzLJSly^;`b(R&DJQa zuK+`&rGvSSG{&I0=g94+_;Fz&FNLVrgIL&Y#&vb6STZ#8bQVGxd6Z}DzNl2pGGLr) zEt&4#rH^6ZitLjhOGE((Cdly{1Ga_Yl%45}I;V(z-j0wmsM-=%0-NY0f@FP?2ts!B6~ODX;d(U&ZB8{$cRNL-ut zYqoh&r>&wwAtE0%SybF>7hu297G0i0A^ z42D^?12uuwKqNjLu-#TNCcbK9r*nCd>8MKIrkN9@kIWlLZQaYK$4hMMEw=R<+j@@+ zc$@Ja^EGB>=A#Nc1|SpoXcod3OczUyq|VY^tA~^;YP5Lq$`DEx5{I+76vyLig3EV# z!Ws*^R2~jyrefGNopz6>>sh&-6nCuej#0z9B`>Ml?947?Ip+O&p26kzMe0}J9 zHkJFbY`5#O9T#T2#J1jIyED6|sfF*ebUBw0B`#jfrI8h#))CvS9VQ|{X0~eP3dENb zrdF9FEAmi=2c=V?)|shMkY2M-Rd|!RGsBnZbY7Xpg#Q_Eai*b8bL(k&?FL}qqcST) zZIR}T2X#WPyxIKNFkKfkwd57Xv<~W}}Z}GG|WLED%BEXAT@qw>} zsYSex9wn06ldV_cj0N<19Mouq{e~eWa6Y=F{BR+_NO5%#HFIr-)vi@?Dk)S38uPBZ za0_sur3Q_s&WGBY`&qd1=v3_9%RX^VIte|0t{Xf8Ggjlu+23wfOn?(+kg;q}iH)+WU&gYJt28(S-v^vY{*=v6+lAEH-1{gPh2 zzo1u{!x!|LEG79!v%^b%pxHn;u52_51H<6S{w$hxOmDuRS$paw&Dw6CG6 zVa|y!Qmja3yP32L9?Mz(r=(cytZK%tZJ2{#nj7YN@_&e8iGEuyDAp>FNwLBl8C-VC zIybgADb~#x2W&ZSx3T2zYm$}qcqCaja0CxDYma@}Aq3|8-x94A>Q36(m4ss)<*VrS zaR2g`r={@d5YumAYXi^q>2KkDB{ z{{Kh*?-%~jiTlyj@x@Q}JJ0y|Xm_>;9Pe{=^~dqsxNN-Hoo8IW#1Fjlzwkfy{vX#D zf4rK@tKV(bY+(KVaZKh~qr?C06FF|ZPsqo^|6d+`d0;V57T?1ZD2L0jpy!1VfovlsOW)?~K^J)2u!u)>J1H4FNg?AH&EH8Ck6sXHZnR z5@t2YzfLF9_3;y34-_6WyI65rtzMJb(%R!&Ac&QB{*NDpR3Y!_mr2Q1c*jf8IIj@VyWHU0bUJLtLsw?Fc}|U|5zk!&2v)fgz*1{M8DG z5RjV18y4JeF1u*8M=hE&stGd1;2V?iwWJcgtAVd(HvKMGsbg|thw?&SeHtX6n74ag zZ7pPJQP!&GixYO8H+XvJ0JIk?QF4@8=a>g{GvG!`5bk}VlT=lhrx{QB$-;gMHnFO!{bQ(z=~x{UreQIqLr3r(MP48FtC{o&Jxp_ zgtKBGLUb5oHEssJp5p6WiYEqSJcY`DSDP>HnBA;2@n)V8PplQl%ILk&L%=oEKgPw{ z+k#V@Xi?Y43P}^7P5Do*1w(%I13*=~;daCr6wOX%prv4lbBSpSd=p3<#j^vMPhh;o z6XcbNqQW>$lu*~lBPMS3W6HL6ya^HhB}j3${Ai(cp_PqNXvOWDuoTGDyvgjVkui75 zo>{{!tJFIvaYA23$}yyk5i++MZ}ZNSmQ?^2MD%i&LUK9s zm2;8q%|&O$SO8^E)6J6|Sf7cYY-h1CbHHL&=#Akjr&xp!#9Ue-4^a}G2?|w|r*U~a zz(?7H!yx9ok{~R*k%YmdF_EO*cbhkssH$SAjexRNuo6qQ8or#qaxThUx@ZDq$G#=y zKMs9KiaX=gu4xY_j!gxUMIe}>DBPn&tjkIu9bpjCVJg5TZSg;!UsNJvXr6$}+ zs~+FRZMSh>K^Fw8;Tmw=*CSs!5AE(eknMv@GRe;6F%OZ5n@l5;K~6SI-ayZW<*y_{ zJg7>6B{xLou_QQ1!g75$sEn28hM&N+83n+-5W2`qlVR@IZMWHEhY13Qy-|vqGBFXQDPx?*JheZ6b7+%m z*j(gwJ_wv`01K9f1?n*FN~#IjP$Hm12W^eYQj^<}ubhi;cP4N2umR=J~&Vj9*4)EvdhQH zp03mk46KjN2c=UB^;_{80uw>LS1OMK>*MBl`jui-0(Dlvf@N#9St3=pqPtAg=WX4V z2Co%Rk>vY86S^4rN^-j=qUo67Ga}u@vu2MPEGxE{)k6$5`tz6^!L4Neqltzg2xvw} z`DSd#sIDU+-W)HbunOvGw1`wjhTx?J2)^(cQnR{xmbIw6SWE^nOmN+g)(_LF? zGrX4AmFPlv5SGx~8Tv}%yQd4#6Pp|MA&YLON|Xss$r>W>P4^2;*jv_GWTLN<_ciN; z>c+BCu3J+2&4|fXL2qj(#$d(C%#RYROo*e#lrBVW&H-Y`x?<(O$I+SLYG86ap&?Q- zrebQOHJeo$W41!db0Pp>K<4u$EGZTuPp0UzB`%JW(~HB?VZ_`842(wGm;f#M8X(Ht)-tB2_D? z)sxRR17AmUG2Z2PG7L}Az)^-*uCbG$qViyUnd!KxM+4FdvQNnqy^@j)|~py3JXrtk)x7IUD)zY>?yO^VryD zn5$I7Nr{Oe0aeU^azz%!8*qPR{7HqitUM%OGke~Ra+90mq0d3h8tQkJ5>?3yt?DS9i@vTv7vn!-xxg5K3fim2oaZEzJ`4lT{@bVcK#eQh{YTVf0b}qAK+w_nM+_Y{?PpDqGmp+oY** z8OGs=Ua%}$zLU}5gP45=ho*Ba8KoQV>U~u95`0uC%!FaL`i5e>oeN-DOLD=TW(v>+ zfLw3hS~o?5tR5~GC!d0oX;qWHnke0ddwntRtdr5A_0KOnk|h4rfr;l zUN;z!R|mktZGW%RMeku948+VGIqRZh)8)DQO?F_<+LC1|%}<(dNsXb#U|up;g-2y) zpVtje^NS9hRL9BZ!v|eY@}YV1o}6@V_-T9Q(j&Ee_|rEpgr=N3Rr!7VkN3wPaeg5% zM}iu39LM=!u1pCG{xD8T{N}~04_{&y^%-VCffp+~!!)H+X9GUZ6}&C=6*L-*lbfKZ+c6|a@b$g>j;xx%?O8O<^;qX)cTtH)#kNTHZ8G0 zE`5H~h|_4C)_XOyPpd}R=Go_Y{b|)Gs;HJhjnj@*%g&Zok%>2Vc{BrVYNSoaiJ_G< z@*s2z?+p*s2~d&%UD-^@U4ZzP zoBYRY|KrE~z#Yc-UERRGa9f|a&2QY+NA8a0^_lDZ^Zd+p`gz>ow9Y;sKl4i~aLYD6 z-`%}GywjiK49{_rOV0Bw#TEZdwgUrOF|q0@OO|6E zg*AP+t4Sp1gd4SM5?MuPgf%ghRb7w;xtID6X%cK-EKOo0YaTU;HY)zVph@JOepr(b z{?2UPbfHNU<%J$K2?jYYRf*%sSM!Dv@A3vZnzT?^sDl5Ds)W_X98?Kso|Jeyb5D4R=k8Qw@+J?URM{67U>Yu1>e3@_jD0Sm6fuZDQ z7z*_CujZ&F5vm3;c4S?0F+qzQR2o3r2#DI73$4SNIk_2P`#{HJOZt^m{Jz}GXCdXK4i zHIq2S%o?5W6BLg7<71DlEvD`|ZDDpzGh^!Xmzzs0g{L~J<_HFja@>%9M2fzG1Gqnf zaqLz~p3*=u`SG&PFugm5m!{!7dJY+nm2I;#o1elc?rVPkf3a5T{cK})SZ7(cx-(wr zBh$0-Pos~pcKfUK5i6YkYJJ37L>ycjo_vAdT9P3O5IOLNJR3tFDXy4D>Yq&?sp&53 z$n1o!m4eRv`0UpDu{`CjP9o|213HOiwBGe@Jg1WUppW85u#>M)U4D?U{Ai6toaM+h ze}qc%RlI%h6!#abht%>+*+O9JAK%&Y{z4CFwO{HXabPA-Jwz$*riTcfk9aQaSv>?w z%cUYhq}hK#MT9(LC?ZWbE5>cTD{}XWi|iQDu`3j=|Kg#V5xT+ z)%<{W)cpl38Fx#XK5KpLpS;{wS}$8yBjpruV0LK<|(KROiRn#!=$zy5oL=iSjQVJ^31c#!rc!{G~C7beBO`0}9fe z7b4CbCq@!^+&VE1%ELc}6T@)f{t}!R$r4=eIWg|&4*x7pjLW*QwCCxnB*F=#_3_V9 zbT8RMGEDI4!f@(MvAZyqGI711zNAZ7Pxe342YQUT{u4PzuXxE_{o*o2eAoCos25l9 z=wgi*ezJq(IBcK%7iNDX_l$Ym2uBec>kl7=ha2T%$ea-+)c9ysQe8ErL=h)|uWu+CEF+L49&rgKy2w3C7CIC4O0M<^CM8zqP=DNoEE~ESN;5-YFBE z} zpE8J``wV zxa+iliRNBas5&f~YJiy$& z(W&JC3;VSiR@Q3+&u-$9 z?e537S#gs-Zhq_wi3|3CUoV*#abjqNO$dW>K69Okv(Y?UK35XrkJCE%v3~CAzD%nZhG?IDN z?a=-n&A=0nFLE3@aFaVcCNkzUPKmS$1G>!{n%L*Ji@V#7A%MGqm(h7hywle#dmJcymN`F6xK_r zu})+KPG2ttF@@QW>!nI$<+j&DVNjfSeP>g8I^;me;NlPE@N;I}lg&wi+~d!p*fA$x zdgtPvn`hjduEmhJH9L4Mo0Q6%dVdytuKOqEb=NOXT6k`u38~EP1>6>m0?A2$@urb46^P)AtX*@&ch(#=77}nyAP-s1SDSK=IcJ2^=kMAKohT4p zzdI5?8|{Em@po;8#`?9O`zK;R)JjBDoljpJ3{Ns69AnO~RXVjCynLrFx1WuVB}^;K zTUN#4V+oA2ZzZk>v7Xj(Ri_tiy+R6Ufe8D!U$M8L>8NA870X+3%$-_U*@DM)mfNRA zV9}|?iU^9$2clywUKGK3d~Af8Qwg@-x+Y7?MzYCZyBaDREJov;@+dJa9f!{DMhN-P z7P-gFsUK$g^qu*2gnL?-^; zK(5gXZVVJdRu%O-k?+6w(DLk-rXayeIATzNZ+L+U>!xao;aP*x^-x?~s!_8Irs#SlPo8P$vLWxHzQ`@;b<7@d zF|a7(%P(1T zEpOo-@q!xr@=HF;krSiw_NA$L5kDs)(821(fblnunG#*rPMY7qW8uC;BD`}qC=_;P z?PsmLz7m8%`xsi1j%!LfU&k?y$K#uO`SLeBOZTNvN!P@5*c@b>Y?GldYNyUabs}q` z0vRhsps1y3bu)Mp6>(l4lKt*jA3x@VI#l9E1vY>OC(ZOM?(3MHosM-X?C6#m5y>*6 z9C#H~q(0_|$sc?iTkG-n?)Z2LxgcT;RX+zAW$Y`HB^FpYOe2lGXme3Xqoy>|=qqXk zpvy%j5HswpAS1DuMwe69F>!TZA`sye=kqxfVl0v^+8cz$p-^MVEI)^PgL1`_EZKc> zTo3bEv%&7)JfE%>k_?+~O)y^3H-OQd^`ss5~~ zMstldg0w|p^qrKmujRxysk2#NQTlmeZmj`IA20KZ1=2zN;-b0<(fg6qj>yi;+?kPW zAz|Bb+RP24x--_RQqd>W4d<7=4(Bnr4|Yuv;-PPBZqLdEPq@m}z-gXK)E?_==>(=U zpRKlUYRo;3=gX)~tKlQg28_ZvlwG_&a+_Z%cUcV9-~(!08#8A`p{|W)T4Q8RrW#~7 z1}g<^>spvq|tanSRY#Y>w%|j_D~)aq*@Tz9oFNLL}s3l zL5Xyus%&iyOj>n%udFx?8wM&^5%`M4tq{c%EW$`$a2$jnC=9DW*ITVug{)WCF*ufb z`8fH$65ViWv*GjJ*Y#$A?J20*sT5a@s?HNrl&Bxg3s!p!&_I(9PeqD~OAa^~6_huY zV{D^w?qNi*V8M@$P(B!Lc%*-_qq*XdkkhSRMUiqFQvZN?X{i)P6b(sfnvx2&MqrqsV())mV-V zQ9?DeNi3be9nj0uE10YqV`@!}TIPA|G~BGWaaJixVW%EKuGz!cQAv=I^IdfK`Rztz zS62o7uK6L*YnEH5tE6dNzl|F(aA3vtLMEK=z&nmtxE|n*q3;o+l}r~rqMqhC^ZVG0 zxLKTn7=i1dbIPs_m1_1M8~lSXhxITeladPSEyW0h~1z)LQrJ z!Fo>D$J^nG$a3V1TYA9=Tt0MNIS1ym<^}7P+kVf{AN=y#Vp+`__>5W~TcRsONnqTV%A%^Toz-5bOh2sjJJMB#k3Rs~j_| zL%SMy5-re84wY;5Z-!o|MvFaqfie##B{WbW7>A~ML5O{Vle1K zNCK6S`b3nIB~jQ3klMGPHM2E+>;%7{e>pU9qHzXA`QZX~ii%R3wh2t9hQyxIckC^p z`ON!+n$%zr6wwWHn!pu8k0PL0J&eq&oM>EV5QEkXf(cZjuMI+^w6Dc@wfEFm)EVfn|rNm<|XUWb+em`Z|`=zNbi2Q>%fQ~ zEi%XFgU3g?LLmo&TEjn5$4a5DI%=|vDBz(ctdYyZvHuIR6==1Dtm6LA zM&r>ZtsD8CnE*R<;%#yPlVMrBCkb|8|=+n1Ov>Zl7pFYGh%@8Fds#f3_LUT<<;y& z)=7d``24mOi4JH{ls}wI8Y7jOoZ*+A$Ei2RdihFpw?;MwF0Ss#UYPa=EAi01>^whd z|4Z8(>e%QjjE$$#$%(;jNG{5yT+_Gr5Z8jqVme@-Hz~%40uoNy|8DY=+^otl5(w)o~JXBon1jLwB;%|oeV?v zSUw$(kN@57|A9+Bzl~%t(7fD_yB)`G?sB-@Ht$F5c~5j|0V2;{@djIJ0|T}6=8waG zt~tKre$Kkxy^Ahyw+6=Twy1WOMRcC1C3cEqHG-vs;WPoAV17vBpT`8Tw|FjfEN^LI zqsh21N$w2T+7hl<38d^55!p~73G8=T;f~FcO&)o{va)At5)4|BD7FqcYUSyRfKqKE zHRfNmytneb8Ii>XyU|aJM<+;MJzjAfU_v1^R<@O9=SDd^I^?-0lC9xjS-YP3F0z16PhR{h3KZ`JV(z%W3kYvz*aZT5dMXhn6Y@@}->nwf`w zfSmHKc|uG&v-^`mSZazUZK8PC&AUao5@$j+SEm2P>CzE_oyLp zWwmdjC!-2FWwZ#>^1%iY_EyVEu`*77rpiGc&8$GzX~V}-ODtW&_dZJ#d17-wLBm?sxNxQTPJe*%G9?{o#Ba| zEl8~9tub~?Q8~JNpRR_c)@f1n23uKMcH(MtMj*Tf*V7wpqsHejvcD7? z95Jm@ePohwd)XDclzix?v%Yqp!|h@ct^CghC}|i$@LgDj6-or_l9=ouHB#+Q2%5^i z2h6|q)^6T+>lyBiW|nFRLz>u4PEyFJoS{hZUSPcEu`EZsgRDLb_U;9isxm1nyj;AA z$#dBZ7H|ad2(m|0pBOB)^0vX8)EK9Sb{ryjA@6P4tx2;Og;hKBKH~YLZk2D*%__hE ze&emXvcWs?4_95k?5@0Ti~z1~ZTTYDvn9hrLXmMMmXdW zxmaJDVx7SZNPc}BCpZK_dKYHuW|AK)>d~ECD#d)aeZb(=^ts)Sslv^1iH{IEn?YizVj#$AcI0@kv2lx8H3;v)OIMfFHJh%Cd1KF{7fa^)!> zej5(K(+;4__Y2nDmQ8xBTPgUEW%m{VyYHE_EQ)G1kJ?;o)47*4gAr2eBYu9g{V=v9 z1)u3Vgqfsl#%8p(xUin7)y;l4rjyn7`R!cd$tuAZL(cLkg8?%5cV3aG!sKrOh0@Qb zrY(+cP8N5XHtUs7DG9?E_3kI2=TEIfX%z&+eTLp+m0JX0wT58DM1oqt9=sl8L_S%c zhuAo?QL3-(jw}ws&ROj4T7P(5qP&Wk0V#JH(_Q(Mf2=BW--2kmch z@0riba<^C?%I5C8^d{0Q)M{b8yY6#bB+FI--b@%B6UUvM`J8myYVK$#m5G5x zf_ucht@PlDqW0+yAuPS=PY@p@M|$A1QjGVGyd#lYn=6{YVutp3QS*Nt5{FF{K2L#X zV2Gmv4pv1r4+7Xnvh->i5W65}(vcXkoqC>7il+%SFt6PO_qZ0Eny7{<7Q;9u<1q-h z*<0Ks77N?3e108Mzp64($GIi|87~;8=w;`*Hn87z{Wh;UjLg&Bd0udux8CMsk0)~g zJBkqTp6L*cT!-zGVUHMG3mfH$3lhQF>{pqP%w=S%<}^U5ulqLg^i{IRYasK~5;%_R zfwjJ7U#Wpw>Z&cs+-wY1(=257og{r_7_&5=oE(fqh*Wj9t~_nyR4NFLjsp7di;ACl zqB-)wbcR|I17RsmRVk|Nqa0&>fCM2#TpH~orH0GNL0nJ9%R1&kFol76Rj9{-&3$`b945xiI{p*qZ zVI41J#w}}DPGXojQbn!R$1)HO%Abr9V(4*w#obtUAqlj!$g$*75J6F6>q_QptQR#q zpTc!WDPS+HP^9N*o5ruC2(*1OI# z=P_r5$op=6m9+Fu*1twB-X3#eybqJo^5N~*>GSpPq}ZunuWxq&TO)zMG22Y=D`_CK z<7B7)te(;5dCYzq(2btlsWBeJQcWg3(f{^H4$j7LYB^WEf$bWk`E-{E@!ku!7pkff z1t3h79>#DJ!@nxfW6~&%=FD-}w~aL3lqbhRv_Q`p8+v(lC_AybkOl!gl?+O0TX6G51ydGVu)Tq|<)s{uh5`R`|>gdN5xNHB>b|nFB)@?{qi7b=LPD{!*o| zmkR>|jMB2J@8Pzx99T*~ClAx+uvoMPeOCxij>$xI7n?1ryEZ1K(+g4sHKPt|QSIA6 zGK$^GH&<-s6-iIJOj~Xqk29Yx@ZEn*={?Jynh*J^^4@nU+}Jf& zmG{)SFHUCJ{TO_9&cnSj*+O3#rkozVKFegGRakfBRICkDGu27QTxHA0RGiI_$GubU zchMw=vBAWZi+A!eeU$yRB6Vc|?qL z!OY+h1M=f?+1HTz;DzBL7%^sMst==n zji`g8{AxqAQ}|@L;~0CM?dzfMP$89^xgL1-E5G!ORc+J=2pc zQx57i+o^VgRD!M+4VtMle55=pYKxX+Bd&2XVx`E{n`40PMs@(C`p8cQF+uBmzK!kS z!@kp3eW$h(&owx8_h9d;xB4XL*I?yOa;Z^4C&olDv=Zr=vkT>AqszHYry0OF4>ow( zYX|70E%FJQn}A8c^q$@s7%D4P(_8ztte_Z+F`a@+vwhp%&xmf#Wafi8R@pqdd29VQ zvLjduG)x63rA(-$Ycg6^5G-U_yA4Ds4c}SQAM;AdshDpHqIo26a^ zmS9>NJ7Y7A&@pL9{>AX=$SaOv!$G~P~SEr%^0+0*unt6?7(5dX5dCFmg;Hom=*>6pN zNr^S)#rl#*%l(Yp&*zmIMsEzut>|iPr&<5PRi28FDr3nRwzmsvD_W;9G)g-TmeTXvVdWPJ=yZo6Pf5t;FGso*QpJ3M9rh_k?l z@dfcRdFAd5%^uRp{C$~V`OJxQa$+(SBU)omcCi&?U9U1i?{*@WKEq_?GJ zAOBRJ-p)Y0MUrW<5(Xf2GZwY2=$f7ZQo^9*BcwuL;- z@@+j)FystkwwS_hP|y`T2T7;}@o;Qe4z-fFt4bzd@j0# z<-D+EXk0{fALVN@l5NaTGn8x}hTKO=Va7UG)M1YokNlk5q0!S5e8wC|%2d$po4LY9 zjSn}1wc#Rnamls89}8UpY7%dah-ns^#^;&OTbV0Yyfxyc47bPRZIZPfZFwcoi#=5|!+@V&@NyKP;8XcoakpiA&e!NVYo)s#y91crj zX-cRD6_pXPG=NL8U`RD{%QWZ?ZFOx<&Ae!(S{`m29aqMCN@a=`w6cJYl`25)wTr*p zUc$qrV9v39pr+Wov?TaOceSFbZuq!OxXl3YossnlijI1NvI}uk7lD#hD5fH^%g|G( zZaC-?+h1}v=vF#U9oQNTj`rP3)Ug0&PlgsAN8KH(WSeDjj)>GsM4MT!&jUe)a1T)o z+lN@2YEdq`Y^HzjdCjJ6@1EmztW=$2`qH#&-;zt0+E@045*&zWrdUzxZ6Je^^C_jZ z3_)Ggka5nPxG)tpjs!oFR7Y?zs0Gw%X2%fptEeHgC*M)%sAO?2#rk)snBfRHuOR$s zJ!aE$f`XVchB=5jfH5SA2?5KIZ8iv|Iu-GWIf4w-$S3eQTE5>!QFP&x1{A3;2?REvdfJ*4i^xw$_40 zXgfkd>hnr+rA#5^a<9`JZbqCObqB}o<-o9)6$6|S==#`=fIwr5U7<@7>tnIJ85v?@ z+hjTc%pyziQgcaYv)ET7DX%j}a0nwg)stj3w;{8-PJ_PBGje@9FbwQag6%$Ei&F4u z`{Wq*00n((rnXJ_@^}rj%HrUrC9F_RumQDa-^WaV4_}4H(pJeX94yS z4NMKp_~}LM)xtEu)Jd9w{KEK_=9*GgDIGiuo z07Ok8@yG{j2@j<8Zltaj4!hAuw$#mMX+^h2Ck|yQD(?ZpYNUi4c}Zseo^0%#H6>Nx|s0YQ61bD$prGY3b;G-m=`739b($_& zk;7>uoJD!wz#D@Vm{F0kTFK75ky(UsGceZ5(mJ>~yOMapz*WdLVA80@M8$`_xjRNm z`pEvc9WdVwm{UY z+Vi#&?TjFA+KQvI)wZ!hTrhHG+lYzJTs6A)v*ntKE1dVLgvphxpYa@n3@O%Ph+z0; zxDNB{Amn^t*H^`2C?6knGph}!HbH)G$=>4Yynh_oNRt2OnaE>_x**rIHy)&xNxVFg z4G{{KR2g#Po+1!ee?Fyo58LKY7_%O8=>A7{3o$&m`JioPh;H*y%BRV}QYI~{&ioMF zQjWl~#~jfj9jS$oDV(BVz_4NzwwIJ{$ZV55ju7uw`;b}ms|u*eKb10cUI-ZrOnI;B zoKT);Rf?s08qXi*jjCOlphmLqoMuMI3`t{QE=R0$Jc8qm$&*z#ibvOTw)vp-rSnnJ zKw1N#maE`vAcinF3~^&-i-7LP3@js2 zI4x%)5?NZEO*(5FojMq>`@9G_bmoH*Lx2!pT3nj(vdi0f6+3xlD;f?av|`H>vD88G z!%{6D&r2~U$}yYCF^x?QB;oHBRZcpE82GWd_uB!}ks!egxDyK%kHsYuKXX+8Sb|p_ zc|OoAWMt4TH<7tA(GEH#t9f7vKupjzSBxdZfgZl#xkn)2Jd>ezbM=t#jCYEHG$lsw zNm-kg8-XA8+;4`BlTBg?wqa!EO6O38J6&M>hE;cbD1)$Pked4N37csw5t0ok*?ih7 zK5Z)R$bPnsVa#CUjPB0x;pLe@0MkTZBDPbA>J9ODG=FAc&9=Ne@&S)()sYl4bD<7e zHhn2-?7jpdr>15T_`MzEKdnNg$$F-YNwimsK$UKte23Ap8))k>3RbvglN6oc-PHiM z?V6G(h{ay!02>Vy%qeElS$RZUkst$X$)cfE%J$YOP4V_*^{l+9ZJU*l_c)cF-iP)n zmSoAz@|!ImK0V0<^jwVgG_9~h4bJV*eZ1wX_?o|$0>dUM@iNjq403u<4WOHoB!WHU_?KJ%-4sf^5(^F#h|6<{pF literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MD_16_16.png b/navit/xpm/country_MD_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..4cc39d52e30f795b4a47d7c695b534de31ff6319 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_;JzX3_ zG$tmeB-}XDz%tG64bLYFrsw~x&iqlzjW^0xBDj@(r^3y z;@qJ{j(*S9&$#4Y_U(U>QGMOrbk#MDjg1G7K4cFoY;&ABjbU!PMUGb(j}_1x44$rj JF6*2UngCT5bH)Gw literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MD_32_32.png b/navit/xpm/country_MD_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0140b88ae51444373cbe367574861f483a771502 GIT binary patch literal 497 zcmV2`82Vw=f>CVznq6)M^Y?$3W1p8VDAC;qV+Hy z7fV!*l2CLic_sLe9QqV-=C52AMzcOK^2nZx%|H+dVplLdT+gatKUUf28>>*}H$4`t zuj=7xqfiuX?%3F}v9_ooL2Qc@2_jLVsJiVqA(bmK_gDY`<72J-(?>k!4y0W?^$P(2 ntSn$(h@bqYAFV6s3fklw_q&dy6r_PE00000NkvXXu0mjfh$!7j literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MD_48_48.png b/navit/xpm/country_MD_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..bd121f3d7d15dc289bcbcd1b087f8a60721f9b37 GIT binary patch literal 813 zcmV+|1JeA7P)}3W7}8v(~-G3r&KI6(CZ_q$IA4WY}}KBF(l_jw$j z@0$nv?EBfiBfuM!k{r2R()vWNyQKA8Nvr=uCa72@s8}YbSSF}g#}TCK>@$w40OGTGtcmdlYJBzL9_F`rbDt*r%T*TN&q&t$l3+j$;H8vy$IQK5p3?u}QuRf3=l=2N@; zyX@(Z6#xNt5^&s2OAmI|=XekbVCshvAcvr4a_W@iUkccLy;{m!9qAB%^IiZ;>qdZl zwKTk?BqZ;nSpSR9Z7(Ao0~-VTfx=-M3J@190J!3tjBQ&}X~D(C0YJ=MI%fpv ze3Kp%K#}Wl5AsB_<~C2)tbk~;Qm|Q!08yZjp%+gs%;xR{yctK08yisLDa(dF->2p+N9;GX# r!SQ^yuWTl$SSF}gCa72@s91jhhXMsHEv(^l00000NkvXXu0mjfk1BoP literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MD_8_8.png b/navit/xpm/country_MD_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..089dd8a840871790810df479a257d9ac91dafc87 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}|=PZ!4! zj+w~`2{+Ch*kE~K@1x(oZSTz`Chly0I(Kv9VfqBD$$oBq%Pn>_kk4&kk^827_ z+^lriy`)oH>Czva{Sx<*Jy=%6r6vDAUeGNXd+5j)c4p?o%Y6el=d5F5SS2i#lDpUL QCD1MgPgg&ebxsLQ00A#QUjP6A literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MD_96_96.png b/navit/xpm/country_MD_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..48ed59124dea0b7c4f647ea69e0d7a79f3ee948f GIT binary patch literal 2237 zcmb7``9Bkk1II^mpXDelxsTzA$618AW~7uEYglA7OeyUdlVk2ElTaI?B)8n=F;;sh zxoQZxbByFlLdL#5zkh%DeqW#0=kxyI^9OuBsje5GV#4ym002M?=4f~MH?RI{LEhhq z`!#dpH~9UWp>_c7zbd4^%mM%eZ^7&!a6;ZH6&V5_Ihh>8UaKcs`0y))2v8@BPdJW3 z^z6c5N8^g!rR=>+9d*j#%Owu(!%4XgxQFH160ih{gI@M~l_5zMrLU+&48;gA96b^5 z(bl^-wl+bRFyX)a;cnePDQ$YZvH#rG7MqJ)qg~^TN=dZ~9oH{9fPNLxXov~0A#$x4 zNB!ef-|<7qVh@xQKoAo%Qpio<*o;JWwPb-8c;YrEl<0M@X=!MsH*VzQg2<0X8 z(`Uhwr;IaoRuk|!18+Wx0|3sa>{U{`_%qUk1bX<he>g<90JPmo8T7wQfr-a-Y&8e3ww@O z8xC&<#7wl|?6VQ9xqt_{@#D^;RlAet8@>-M4qoC_IpLWdjziaSg zNrnGxgU@d%c@VyXj$93p31>QCwu|iWQz5v9zF_lz_+&6{ZT2yf7pqd11m#aSc;p6a zRqxt)5ZSw|3%^uu#lU|O)_Tt-Y3T$Ql|41nzSJ#rrH9jrFey-C*7`G;r?b0&7(-n^ zYM_*=mNqY-S>){i)TQS;p=>o{2~O6{8k1>{$hMr+-vO!7K!6`V3}vrA?j6SSFlcGL zhtF?$yIl3j?$Ec!q3y6CQh794)dV2DEnDPZ*W-z4(@SxX;XMlnqq01l?E5!eE9Shz z>QT;Y#|y?X=b)OJo%!KK=vclCY8iMgj^q);%mt3!BlW9@57m65N1PL=vf0uEvdlUU7VB`^eUZyhV{*E z^2vw8vG~rguxRbSj0-5^>(t9jpI;4KLn`^nr(Eua1=8jLyEi)gx->q-*K5ex9k6%P?2!N) zB70t`;>okbuAM|m0x-VVsHgYDOrQ3D!YNe} zw*5AW{5cuFlfU~&%*lp^FI9;&AY0Bmmj-9irUW<(5ArFMDLd9hq|4X_QDXZ{$9~on znYCp)(ln{G^sH!D>54(>(wilS!02z!g$h&L7(yU}i_HZ5$;jeX-RyujvNZEd zg%WoU^F0_3n8X|1TlFX102f7_GmezAO`W$nR~y^iLR4)Zm{9q3yZ*g~Ia@0n&#JM= z$~0SXis?1d15nv_IbO?Dbmc0!o~(cD$AY5Uv~S})fr!utTX~QGL;bVVV|kVGB}F4- zDV=~j{_f3X3cN4>X02YVT4Fc0gasC5K&=9y)xceUN3f2uoQ)bx;XJ>8;%a+eD(R@) zrzp!?yT9u4{(k6t3vi19Sz0Yy7Oc}1Ez6mxpfa)=J(9Y6RYzpEMfX0{JkYCfHk~dY zR-h^9sd~caJAgb*5tqV;QbXXBnPop;;cKE8se#^5AIoX8M|*3}C~;KNKC>T2^<^<|h)(3wcdhHv&hW7(`fq zlx)nvJBKJ&{%I*iSA*BM_Ao#7DTFrN(TZe+a3r{25R)4#xe9!?rj5FdJN<Hk0SST=8_tj#{9=wRR zaJiVF{}1moSoTuEO7n)}eYs6=r_bWf_^@+6Y+PJZ@Jhww?O`#ePB^^!QlxjeZ(+^F zCB^rV>Ug#10(R3=M|fi~E8DF#^JcOuh)cwJC#b7;RbzM&-^~8_?OE_jFW(oxsFBEr zkf*M2MmRLx=Pc6G~A zbnJ5II9NG0_7yv^4-IYmC3XLcEywH!9}i(G_jB6mQe3`9Y+jHT-8Z@og>KT9n5tMz zRRU}W7iNYBkGvCj8QFet2P6Mti^)|-0}Vv+bPNc){Pc`%w6B}bP`_5h#zLaGbn?b` z+1p#WSa!=(i(|l<7dPVisN5|%b#&6G)?R?Xo`#l0*#9@l|7FCvd}lCv0{T%+D!=~- N0A_!|uG;1*=|7SQH6j22 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ME.svgz b/navit/xpm/country_ME.svgz new file mode 100644 index 0000000000000000000000000000000000000000..ddb9acb4356baea0877f66978138ccb4d89570a1 GIT binary patch literal 48825 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⪻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 R{Pp_({|ESnzgQUl0RXe6Qjq`v literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ME_16_16.png b/navit/xpm/country_ME_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..a82e228d8e4e058fdb96c7b463ee4197fc9e8375 GIT binary patch literal 312 zcmV-80muG{P)(vY?=&ohD8W7GE$_mxVk))j@MJg*VD^3c7b|?sYVpduf*EcU$ zV`T&!j#Nu9@Rr%r@N(@d#^#)Xe#C#cJo_g7>)!su4I^h|;EP9Ohl%?eT-15wtmrFQ zIsv+$d*QPQ0KHl%J(n!+u1;eK7HS%i9!)r1I(^E`W7bej9XbFh=vcj%RZ&_10000< KMNUMnLSTZJ?12XW literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ME_32_32.png b/navit/xpm/country_ME_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..1052a6e1c85046e09aa5e3f7dd85c09559207ab0 GIT binary patch literal 638 zcmV-^0)hRBP)1QvcCe16Zh|3ISO&%9f+b01ol}sP@3Xoi;$*3;-+akG&iL zD+YkJf?|UXnT-g54#jjVcZ?1_0KOJfs{lZquxhl+=5bvIxqO=0&AN7(Rt@Uq4Y%ch zh|wVQ3}xV+B?U5|$EZUs6a0TWXcIZ&zALsS_JTD%>$g(Vk11wqmq(Wal%S%E{TP<> zw8$o2BUPm1C&Ph9-4H`r)w zkI*QNa#A3bQ*fXiLxA_1H=NUPzk6s|e69pwSPlqi@`=iRAvwmg=+(~U<0ML_Msmnr zQ8qzg4)9%cDCo%A(gDXm7LD&3K_T)!54rXNdN5UtrFb(tmrQr8|3X-v%!=1D4cM|E z007++eD&_Uy`$56l*X&ZXEeIr3W*IU5r7W!n#~S;vujk49eCV`*(f4HuKx}VyRH`r zmsp=B*-u|2UY{iP#CLbcrP&ecVBc%v=}KgrD2Uf1eHpL<;Q;#VWrfH=jfJRulkjIV z%mKh71$_QtN($NynE!bJzeR8Jxz5iI2rT?xI&1%;`DLla3y&HVWv3QfuCu#Ys|Wz# Y7ceE|8#xd3_y7O^07*qoM6N<$f}M37;s5{u literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ME_48_48.png b/navit/xpm/country_ME_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..dab4a1234f598cc4b9b51fda2d68b96bfc3d9987 GIT binary patch literal 1114 zcmV-g1f~0lP)K~z|U?U-F}RYeqr-?e7;$JzZlJw0t{Er_9@Da2q@G!SZHNc5gR z;(zfk=$#)I7)=Zp7>x!lxG)exQAnXu#MU0LXLs*CGi!NKj0P_V)037E-rJr1=9zca z%&Zx@^5sc9OX9r-cw81heZG`GWv@xV9nQ`a7J&P?2`hfDd0^&jcBXjdrtAgKlk}Vd zX+apGfmjU)XwvAk9f;K+fGjnKvSxn@JAjY|F|5U8=zuCzD8+?(hi35!Y5Si%hRF9M zY$y%WFaTv>IizDIA7fe$$^bwG z@sT9XIjV+oq7K1BM~Kh1IA`}`4Zxl)q=A06g;8dsAtzM&wBAt(b&0wL<1Ae!L+Nxv zmmOVp=}gK*VFG9qI*e|Nc~nAykWn&W+{Tt)Zt?>u-b{#zNZsuQJxyj3-w)bIL~TbU zG|dXNBgX7EeBQZLXAdW4-nzSi&o}(CwIieeW@APh1wK8PU-*K^tn7uOHGH+^fRXA4K05gAdR27NDl<-+;2t6y zGxALp2NbmrmB6H_&uyBNROx0CZgi@P!?IW=HAMD zDw2wv81in(`Oi!F75Z9a`w=+~xf=k`UC9>G=?PjywWw8hjPr#It8($={Mt*San6xF zH5p)-MgSm9-fmHg!zU$gQM2Z@{&3vDf7%Zl{=~w@$jYXcPoGcplxZOM zR|x0&+*g`1#IS&yGJMJ5>-ynO4Xtb3%_FwSUkP&0^Cq-ovZGn3CDfW8OSNMlp!Jw+ zwiR2{3ccjiDV4!*I@2;B_=kadAsS^{@fSt96Q~9R^@T=C31w)$Yp~;&!2w*Q%~kKG zSpjp^?c8lJPZsopgT&X(e>E5&G?8oS|9Vbe&<3a%Ku?kdki4FnxdB!84#XYCHc)n^ g*lU=7^~_D#-wHX?Phd@cOaK4?07*qoM6N<$g7i-dp8x;= literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ME_8_8.png b/navit/xpm/country_ME_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..3beb1e1e436b7f21734ef1dfbedf3a4eb087995a GIT binary patch literal 194 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MF_48_48.png b/navit/xpm/country_MF_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..9e58d71e8caa5c581447351d90319a0061ac6a9d GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@He#gTe~DWM4f#GpQ# literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MF_8_8.png b/navit/xpm/country_MF_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0d7704f2c7883e60aa96b1a6b724a15a82810d GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_bePZ!4! zj+x0R0W;1YI3Vz9>4vOT%*@P(&mTHwznjmss+CCw` qKtn==hl`E1xykY1fiwFoAD0)Z&17mM>Zgg^aUrk3Yb9QF{eb7w`!Y~j8;Jx4-hH-5Z8>l}t zb>|6mEz*ohpr$1arrzGD3#F)UH}LovUb!7E4P43hwsjI08Al*jx5_##@vz^`SGcXF zld`{RNLANMG$C{w#$t?F6j|#v%Q@#PH4vgz!AM;5<=gXwX9e`W1ZW>*#C h`KurWmlPCZVBk8#wIeekvm9t5gQu&X%Q~loCIGKWFf;%F literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MG_48_48.png b/navit/xpm/country_MG_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..31399e5930183bccbd8a08b01d6ebfba8e3ef1b7 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HqQK z#3tC>;dn$LNx%@yP2Xd%UQ~AeTe}pf0E&E^-d|R!V^J(ZK>HXxUHx3vIVCg!0O;B| AIsgCw literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MG_8_8.png b/navit/xpm/country_MG_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..5a240d92402646207c4d4ad0142287a498a0cd82 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_b;PZ!4! zj+x1S{{OdUWc(~T7v)!1YjN;t(hw*LBhwZNTE>Lw$@?s~3{xm%vN0(CKX My85}Sb4q9e04CTZ+W-In literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MG_96_96.png b/navit/xpm/country_MG_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..29303e24c06c3a611ef6d6319b636d40a373d0fd GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt_yJY5_^ zD(1Ysw2`+tfXCsWK;Q;`+n{grHGlOKOl3W~n=$A0$=gw{jbGN!UHo}@?R>ijZ@E}l zo0uFM7dQkcXb6aKP>FlvxcHyGm!gY*QPWT)_dQ@^eaBi=_uA|N(ANx}u6{1-oD!M< DY8+Sd literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MH.svgz b/navit/xpm/country_MH.svgz new file mode 100644 index 0000000000000000000000000000000000000000..b9bc96f7a0c03154a33867aebfbdb080727be68b GIT binary patch literal 1001 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 M07*qoM6N<$g2m<94FCWD literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MH_8_8.png b/navit/xpm/country_MH_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..48f29ddf0b39927a408dc89c4c99e5b60ea2621e GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v~0yo-U3d z95a(sHq1D4=E#rl_v_hI49@>H6BZU;yl|I>v9NMXN%9HPKEk??&_gS>cvn?^>7UnjcXUQ(d^9`|&^j xT@N=Goa?Oj$V=|r@Q5?+#D`aZW7$F&7-VYQcHjGcz#Qmw22WQ%mvv4FO#mQoZ^Qrq literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MH_96_96.png b/navit/xpm/country_MH_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..608d9251f9a1c54d8614532f254bb6768918232b GIT binary patch literal 4201 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 M07*qoM6N<$f>ECh2><{9 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MK_32_32.png b/navit/xpm/country_MK_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..53e370e60745ca913a0687036671d072ab500594 GIT binary patch literal 1144 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MK_8_8.png b/navit/xpm/country_MK_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..0d4e8c5573bb1f5a4ab99947df62459a09c78920 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}Eo-U3d z95Y>y+xjs%N;EwD{yVMwgimtIhs_%Uq>~P5YFMxwY}s5P!u(LkY~F#sHaBU{78mD( zd^s~DwI5%${q(cM`_b#0vAxnp?culQvx|KG5%}|>Yef==(m2%3-(4D*vVf{z3JzwE`NRL$DQWf`|~zAyD*$wvI^)222WQ%mvv4F FO#uHLYd8P^ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MK_96_96.png b/navit/xpm/country_MK_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..d33b6d95d4cb0ce6666d774fcb5071f97f369969 GIT binary patch literal 2998 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ML.svgz b/navit/xpm/country_ML.svgz new file mode 100644 index 0000000000000000000000000000000000000000..86f210717279a797996eb98785e00e5d5cb7f8ad GIT binary patch literal 194 zcmV;z06qU7iwFoCD0)Z&17mM>Zgg^aUrkIdb9QF{jgLzX!XOxg_nw0Mt}W1qF{ZRT zPoM{=K!F6o6jFM8G1kPm(e2E9GnuwuZWhgQ3dTDIv>I2f;NmuUmJhT1yS<^T$Yi38Fi?_k6hCucntAs0zi}@r< g53FEzlf@8XsCVRYIsS>^F3?~GPgg&ebxsLQ04k_7WdHyG literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ML_48_48.png b/navit/xpm/country_ML_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..38986a265b45cf915536600ff74af61b96b6238b GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@Hq_68w5 hqRvMH3<*(BnYYYkNfrI<&Iz=L!PC{xWt~$(695it~!Zf1R*-`LowIP>}8&ag&vF&-c=UtH<`r{+}7!2>{W#DRf_pOxY8LM{m q+~jz0K|+9mhJ*+Y7aQxK=h~SXvmDiBo~s1(F@vY8pUXO@geCx}<602_ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MM.svgz b/navit/xpm/country_MM.svgz new file mode 100644 index 0000000000000000000000000000000000000000..71fc23901274c141c657145c30e4857b8329340f GIT binary patch literal 4619 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MM_16_16.png b/navit/xpm/country_MM_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..5215d9d7bb145b280ec3e3e823e24c0a40f94c10 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^fJzX3_ zG$y`1f0m0eQG)fs=W{hjdg_gw7V5Zog_)VXJ9Y1t?G6U^(hKvTk4LSFwFA3==xCMBmob?r6Cq|9*ey{fP`5jw@Sk zZn9-J<#Bs~tBaqBJf@zquBD zSdN3?yn4TQ`$M1Us!3%(6hh1xecWajTqrj3nHrgRneD=!Ib}Eg{Q1Cc&#uq8&YCx_ SQG7elLkym-elF{r5}E*02y74l literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MM_32_32.png b/navit/xpm/country_MM_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..730aa0f1106168158fb82295882eaf20268583e0 GIT binary patch literal 542 zcmV+(0^$9MP);`ulFdyIx{cq5&o}J_`$zhLWI=00#>Tx)gZ; z#S~^H#;SBG#_GN zVfypuA0-wbe2^QXCnv?r!0>dIsGAv*b|N9T0mm}0O_fa+rF9$=Kufz07*qoM6N<$f+CXlvj6}9 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MM_48_48.png b/navit/xpm/country_MM_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..e7fced3579a8041062f3100ed41ab0d47006c488 GIT binary patch literal 929 zcmV;S177@zP)`f{OYg;)8;M`Xu_Gh^VL=IMkLp)-l|?%(_jpxb%|7rb&|%9|Upr z5}9rHlK)%jNzae3C!r-O>aK#ZR+Sz)AG&q@7q>mrO?jCnTUk@clbPR$GCw=NYE5nF{LmrDu>TKk0<2X8dp+M#|LC* zEbHn#d`voa;iaZwx2u38iM_|$Aq2C$#p3{?5Ioc}Ur3}^EOZ}e_BGXe549{HAst-1~xR(l~NeAQ+5+r!;`e9zlR9zdBBsw{Whe)xW8!;HOK z=VBdW4SyU?9N$-KL9ipp+UT6$Zlges0_yycWxndt7hP<4NO&F`e)udbC9#Gze~8<@ zvAVfoMqWXJsC2wy8OE}wX$~J(5F%(A=~#D8uw6g1Dk{iPLC!TO^D8)UG2kj=*pXyX z)~1!)M`DVYQV;_D1H#=W{kooO&*%wRX|jHKg{)vcDizugNg!R*RSic3d4LtAlvd>_ z$~9=zgfIpNntfRBTwmwueiKQjRp$h{fU!UbH?8pwvf`>G<=a~y<#bMDk!RzN7aG<% zUJ7(`gRHoASp^@JoDNEsF=c^!jy~mhX@C{`KE!^kFTshmDSviBnP=!;TiDK6CY3M{ z62-+flF& z)m?`l6Zzr%350bW05CKxp1slu01!kaUmk!e)z4$TxLnKrV~OaSbfZ7sE00000NkvXXu0mjf Da6Y!% literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MM_8_8.png b/navit/xpm/country_MM_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..1a190736d865da58f7891d449d95b36e28987f36 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}nPZ!4! zj+x0JC2<=1M}L1i+`l0_`p|yaqy|Pczp`l=@ukJJo@^lpjvP61;@r7U@9)=}a88>a zU#}Ba{qpYb`C2^xC#Xu~zdU7-!0Z#@dU6s2Lnyb{>DZt+WuV~zopr0Qq1y AcK`qY literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MM_96_96.png b/navit/xpm/country_MM_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..9f91355344e71d3d66100f3c0fa14560cd75798b GIT binary patch literal 2537 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 Qz2UF@54Y!@d+h}P049`8#{d8T literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MN_16_16.png b/navit/xpm/country_MN_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..7ea84db82397d3490592e617b52acfb5f6cc8e49 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`pJzX3_ zG$tnRQPw-$!18QK=p6GcZN14R+U%CRHgK5Ex|Ej*sn*}DmdT18$ zKQUPGl#m)58=Kp;|7RZkk9gYoiA|W9`SAbyJ^R-g|KD@eWewZHSMz!5B`OZrZT1k@ z*3#P8*y#D<{{Q|SolXBGA~>=ejx#@=|NG1lt4^Ry?0^2r7wm;hYHl9*^_@3xURvX= zgm2S3U)wV?YX?fz%}MzAy=~&ezyJU1_qb&K*feXy!2*XVyC*U-^!FJ0EH-`Q3iJwt Mr>mdKI;Vst0Ltlc#Q*>R literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MN_32_32.png b/navit/xpm/country_MN_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..74be1e96f3937d03d130a6d58fb1281344b1cb5a GIT binary patch literal 481 zcmV<70UrK|P) zqthxx!oQ%@C`3UbA%sK}C(*b>{7CNP;@-P`yQ84ECvlBkg=zM^yvclazB6xj@vf}{ zezwb@@!h4>Iu46F8-o|ebsSioZ&vKj0lb+U0?;FWB60}udPw#ehX9tQ)RfB%!b|qL zCLIEjW2Skf%3Exz#A+W?b5*Zf`=iS+j zwNvWY9#fN1c*X6GBT@U}br{k%TL`{o@O~(OpmHF7^8PI#vm6ppa@w6lU1Z*jZgKS| zgUU0ni=blj9F4^au6cOFf-{?dm_((mgzVShHP1Q%be@y}AUNgr;>Q6mD?X+{7tkN6 z*aF1lj-FULr_{ZJ42qi)JkrnXaUn?>3$qRS*-ojy0J?|(2mquI0HOzLjr9NSrq=BP Xmi&aVIaQYB00000NkvXXu0mjfZ)w|H literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MN_48_48.png b/navit/xpm/country_MN_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..2c86661bf070e2319dbdec2c8a1a14e768c8130e GIT binary patch literal 724 zcmV;_0xSKAP)JN6G0Tm-<#RZ?lggfR$DBJMNfJu80wFTKMr2R*0Wx{ zNd*srU=RHpiXdX~;KhS@u+Vcw!Gj&I(DJrLqY7(z#@dM z8GITU1H~y}$j{A^A#qjtmtrvLIr~*t{h-D3?>NR?XXQ?m0MM$pK zw?(coBo}H8wGL3NF&zRJPz7cJ>N9H zYy(!IV{gJnU4BcQYm3nKBLM(L0dnv!QukL&w-4Vt;&RM$=GUTqTKcD0UYWTo-7^XY zj7egww(L;mrqp`~6%f}G2(?AX8PWa)g#!F@-64b?lowq0ghsDBjx1hf&aehy)K&t& zA}pZ}KRWEFRwdLWhECEGBLI}=9p{J<=T-13(Qe-$UT52n1#qMH$VYsu(8+K6jk+sZ z2faiymJF$FhFODIqlyXKGFzzMx&D~)$5eSf(NOChtgi5Q1LFdgrhPCF7ckzy>I&C8 zbm=}23KyO5Z+rj!sa^zgUNA={1MvU+7EX?yP&;};?f3(hd)Tl5P5Fud0000 zJ$vFv)4I;i*w^x#-_(nJ+b`i}Xkf7M-|?g?_x*eR*Bk!%f4oEO;HSqdpZkT+?C*`Z apu*6+TV|SHA+ImcS_V&7KbLh*2~7YM#zhnW literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MN_96_96.png b/navit/xpm/country_MN_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c4bf0210d51066965af8416ad7462b1fb014fe GIT binary patch literal 1538 zcmV+d2L1VoP)h&&WCr%)TB5pM0~YyvTi zXpb(jW*GN{!59v%Vq=X$B^Dur%nczeZ~(wvy2P5n%81^>03aAcvBi@(B9xeWx?$5D ziJM+u zX&)PZ)pkzM+IM7pr){j}_S1fNHT^4R5+&v%Za6RF~xe z6!&GqQlp^4DOB8NgBpuMvRU9?Bx75%xotiGR0e5SO#k>bON25BCQ#|18DA*Lq`9E{ zhmJXS4rpSJy=#4C^36ph?Jn*i_P~iymRR4~|T+dY44x2|-5bfd1k5=1u zxrM=M?m3U-6}`|7m7gG)HLjLrVAZHE_YSjj=E2hmk5`(ywBrGpk=-u8;e zrV(AKL=s75PUgo(}*+Fpfw!w;l1AE- zxB!6ESe}*=#2kckyz;4;A8>G6Bb&IB&NbF0$O*cE0CU>Q=j{N1B0E2FFRK?Yb--E| zP9HH5hSrxo0Prp-kwH>fP#-4YB*vY*eu_G$8cyp!>#gTGs$Ut{=Bx~~kI_B`0K5*h zuayua*MrK)86k8z>v+SRy;2!8)4CD11ldMgK4R5RQe*+n@%k^MbjXS|tmGhDCcF;S zZwzOcTI)k+n1T|MM1W}9J`C72a(+^x^~@vnX;+@DG`+5OH8fg~2&odg`b_g>dfb}+ zllD@Aa1H?9;({qL50YC^d^qTQ+g)<;=KGckUxJqEL6t$Xa@73iD``cxNl)#!>cfqE zalWTF_p36KmKDSUD86n7m#}}4+;}si$RTOCT@R{#OXko1u&KEp%4lM*4Zzt9n*Y*XmkN_=6fEFY`3lg9O o3DANBXh8zBAOTvC04+$sUtxLT{j6`TyZ`_I07*qoM6N<$g1p4bl>h($ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MO.svgz b/navit/xpm/country_MO.svgz new file mode 100644 index 0000000000000000000000000000000000000000..ffa6964610bfa1ce58dd9432ae95e890f9a7e9e9 GIT binary patch literal 2739 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 LNkvXXu0mjfA%aE` literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MO_8_8.png b/navit/xpm/country_MO_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..8b09c23a314d04793b1f187b4f3207bc6365406e GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}||PZ!4! zj+x0RD>{-7u+4a&H@B24w=^n!eE55NaQ}NJ2@N409-e;tea>Zi Z48<>%oV6oPDg*6g@O1TaS?83{1OS4SLw*1N literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MO_96_96.png b/navit/xpm/country_MO_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..e26c1b701940352742ce95a8c9d571e92593db0c GIT binary patch literal 2715 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MP.svgz b/navit/xpm/country_MP.svgz new file mode 100644 index 0000000000000000000000000000000000000000..67574ca9b050705b6256af12fb90be904f6d0a11 GIT binary patch literal 20896 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 H%UJ;c-oOcN literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MP_16_16.png b/navit/xpm/country_MP_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..06d3fcf864ebf5e96527bd530e041e57eda68d9c GIT binary patch literal 510 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 YfwHNF*OciefsSPGboFyt=akR{01Wb9aR2}S literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MP_96_96.png b/navit/xpm/country_MP_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..4b19d0d56c682b9467639c8b89c319bccacd69e0 GIT binary patch literal 6664 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MQ_48_48.png b/navit/xpm/country_MQ_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..9e58d71e8caa5c581447351d90319a0061ac6a9d GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@He#gTe~DWM4f#GpQ# literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MQ_8_8.png b/navit/xpm/country_MQ_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0d7704f2c7883e60aa96b1a6b724a15a82810d GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_bePZ!4! zj+x0R0W;1YI3Vz9>4vOT%*@P(&mTHwznjmss+CCw` qKtn==hl`E1xykY1fZgg^aUrkajb9QF{ol{+l+b|G(FZ4fbw-hd5$C91g z#UbjEen4N29;FoSQMF}TRFQ(L#z}vD*N&45y%x%0jCNN$J2R5Ky4`OK?38b{vjX{) zA+$l-QW|HKKm~@i?vtHX-8;7z z7~iB2rwib-8RXXp#AVy%-e~(nU=zZ2nIv7;O}lLBe4X$-&y!(yZ2enP${0(C9%1WM ztNc!_+pQ|X7a6n@xWCio1HG_ODj@uFZnL)Ky(DuRSzBElkn{t<$`c5Bk#qJ2;XpyU zz>_J?`r^seF{`vO0$+3WeV$27#xaHVg;C%IX8hb!6(#3nxS+9%bL&=y21}rI z30_NE8%3w-v<-CPy$Tj_n9d{eb3rwPMh11oqL@#>yU-_mF*!-2**{wa!woJQuPT!B zNbp2;%p*>^Prj0R44%vwYMZe{@L7?@1kGbCg={E`jyeiW@j*33ua*5)S^*vqF>Q3 zO=BD59_^)%Ll;-RzkDXEeV6(16`G2S2I1?Xm)+xXo%^S)(QOOkg_a$Q?*DpoeCg`s z41pJ>VGKdjYRc!l?+q4X*z5MS`Uk&k(btX&rJCq>0tSL?1u0?vp>NoAxP@H|b-u-_ zH$_FUhgXRfZ!%>L(3QFaP;sd(VD|fKi{2>leOtz zrYU%C(xa-2WsCnXG<5f`kq$ll#daNYc2vL|r)f{*nF%%?~P VF8bpm>I@7822WQ%mvv4FO#tQ|g82Xd literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MR_32_32.png b/navit/xpm/country_MR_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..a350f04661b3859a4ff9eee514531238fd586810 GIT binary patch literal 592 zcmV-W00-tmYpBWJ!Or z%U0_K?FVE|$)ct^MYBfW$W8{!l)ox`pC$nUtlEvIKQDX|R#)cAfr;uW$djP^{86w{ zb&h}nP^F`}ZuCA`vI+{sk1h|rl&4T3lzlV$ezsSZ08lh~JXdY^Wo??Ex@)_yom@mV zY6VwJ5nXQciEo|>0GCX!SJu`9(S3u3lyBn6GK>xY2i{4GD5`lw*CHLDCdn<<&y)3~U84MXzOpOWzE4L40Kj^EDvj#xO!-l!#;`MG(x@J1e!ZC~GgRyKygmZPj?9h1 z;ceCg07sDnK>^@06&aKO@V+(iXE?Rui;$ie%!Pct9Soe59 zT^bK6^IL9?tImOHDcp3=J^XRe9b$sUx2S8ABnbcEeL;sG&IyKoT^gU;#_;;k{;`>S e1~>!!6~J#!46IMB`xia{0000*!!(fCvH!#t>r!K`+FZcqGAa)R+)r zG#)gO1dJ#D3eXD&6XVf802Qy`!HbB|Ba#>-OxOlnw|4FNo(B{SE4JNAG-jVu)BO5- zpT6I(udgLN^B3_iLI1YELFz(Y)P=mL3waTaP_Jb5GAoo+QYcw2t3?5<=}PUX!kM89 zig{i!LrE3R44sKsLWGj3HlaI>+1rgfjzBAO0KDy3V+2p~&2#xg)j4Y_*<8MP$&9u! zhX4dW3fA&qi{xKw32bNs!f?j0{%>itZ6WsFLMMtI0VowS@FPUU$4WI5YA z&T{73ND1n6NG{j9;p&<$&yGAipydr@TwDE6=x5 zXNyY{TPG&Ay3(ArNG{4flAQ>>WB>*uE)&o#**CX44M7Y+Zf$pV5tsG)T#zNouh0%> z1G39t%a*!P{!#b!vb18Wl`#WKX-D`S$ZuSZ)8R<5iTdr$eUj7}R*JhkY@rP<$q=K_ zLQtX6s7?vlEc<U;@k}Qzs>Bm$TP~ zb|gY2L0%dffRU&^-IV@=69FE?(<4zGz>A_*5}y852?3bRB~3v9+-u6twrpzDW&PDC zf1KRB+n5Dl2=XYO3^W9bk9Yfz)&)&6XGkdl=##B+Ef=FaCs>X%iQu$i-H7F8lc}>x zX)pd+A@RzH1rj1be>SK@Ja7Bj@8fN-VnwcRbp@&ys@R~Jf=p)GGe5T+hmq!NGTjl> zrWzptU&``Ws{4}_IV|9#rH-Y#*PUwi$H97NA6?LSBSt{_Wc&AJX_vF7dg5XBnCBE8 zM&KSgfJXQwwb(1$06yEw8#C(vE#XS7pFssd7mOH;8q@sZKmE23k-CrI#@y`i;2Y*os+~Z;`aR2}S07*qoM6N<$f@fZZ0ssI2 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MR_8_8.png b/navit/xpm/country_MR_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..c10e00360e38a890b667bf78a92e73e5e29e790b GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}BPZ!4! zj+v#shFnaBA};su%PWd)6i#&Iee zit&I?_rbLpYkhlnp60AnTzk5-&@}37w!D4XbCGp7za}kwA3KLBx_-aGJJ-hEex{Qt t9||j4CeG-RouBxD@y%{ddy_v8xt-Q16&}d4djNC?gQu&X%Q~loCIA|>NNxZC literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MR_96_96.png b/navit/xpm/country_MR_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..0a12fab9bf6075f2ce712b219d7c9a92b2fc02f2 GIT binary patch literal 1732 zcma)-c`(}v6vuy#MBL}Lj#RN(8b_$qQM#?5#UgQ*u64KKOw+WMU{$mf(bm-}O^BoF zD(YCo8I4jZt~O{;Y#eLVu}F(z_1~S@nVmQ9eP=%Zyg%N2zc1MVZ6z+EC;|Y0xQ(@? z(~)jNybmw{4lK z?Tl}VJKi-g50XiO$%yMFGMR#oh73!XYOr~s3dRriG!QoJB{yU#ATlkZ2L{EMi^=4{ z2#!Op5kW02pKzQ%Cm%?1KH(atenhrl1L$vd@=QiqIiuBB*4M=g*uMIFFQKeAzWY^X zMHV1mTD+bEO1@M@%tZ>U2@&}2E=i=z?BCeJUzmPx?AQ(Z$A;4Q&n^6}p;@Ak86N)K zT1x7$yUvoTqv!YKv15fPuY*ya$%^K&ZiTsE8Kyw+qJf~8WH0b~Z8h^V`yX++T>6*LzO zJEWmd>}6K>;PE@{??#PKiz$q4r<#hO8r}5vmu+%`!4@% z-b3iy*R5q3&zRLayloBif=2k(#q+hdRc5dK7Obj!iup5i{60^rvz_!r6XHEp_;^p&#E4W_IBjmr&dcOu*w(~&0mU0 zs(bUsyRIu1?UGK?9MvUh_S-8I>R>+nE+T~VVZSFa3(c8w$ZA;qZcA&sFGrQ@k(MGa zk+vW0;AuMF_|vZ)>xz!o02j-HztVJX$iD=J;KbamWjU+WJ6zcYE@;Z&EO4|_R+lJZ zD6|Qr)%Jdt=YqC#&H>u94HAqZc;~bD-=Bl*xbsPdX>{E$8MlkGojfJ%j^h@dk!{pt*UBk27tkD+j>$ zNc|LOcxwc}+h?{Z%gz4^@l8Tp;m%&C#!>Kj_$uk+Wd|UraDP6b%n;LXgVu+k>cWpCcq3`WIt$5s$-`Y}JXoABB<#J>r@@Ag! zqB8Wvz(L4*<1NPhx+XOUUyOHXd1$+oLg4pQF=~%Obl3i)fwdHS#FXw-F7K=dREerp zxf8o`fi#(*uD6b=G}1@h{$kNalvZo{VaX4^{`@q1!42{(`;lB(m$$1^e~)q<#I9dAM{#^s?8m0(q}E;B0`KGtXgjD(+P>5`gGmj=1UV7S7>| zE3)XL&CfOBBX9@3_?JZjbu3uzuV`4q7=shCw}Xen4yR8C9n;SCvv5M#5@XbW(H^q&k1L3E%CP z?`)-#!?FI48!_<6wxm&Wys^<@nF~ipLt*48y+-Ff4_7s@r{US!G%%JRP;YRi9(k^* z*h|oTHp263;E|oqhwg4glCQ^W-b(2fC-}Z7MsT-{vHWHqxHzS*`HYwXIl6xCG*9&K ya literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MS.svgz b/navit/xpm/country_MS.svgz new file mode 100644 index 0000000000000000000000000000000000000000..8403556515878579a0432ed38b205a09db65668f GIT binary patch literal 7097 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MS_48_48.png b/navit/xpm/country_MS_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..c04c2070d0dc8ae4e2b06dd34de6945da8c10e96 GIT binary patch literal 1463 zcmV;o1xWgdP)wHSb#oi)HUn|V7D1*gg3KBJm}uNA#!+Q){+5ae?I8lSE&biz z{>s|lKkm)@JkR^dbMN~+cZUolDXOhC8m(*B?!SC_0G`!kZ`Dny6aeyi zdkJatwAodw7I%F70##9-Qd1*QPe3Gu>Fet$wK_48-`%~VuyE<@J!P_-F6AMG)N1&JPO;GH2sfP>|VDDH$#=6DgHxBx$iYA_lbn^K0Ux$4As^ zy-Jmkz&m?(yG)kD?jw`soZOyGZK)8|)upOb6BE|L!mlC*)YGHe@Wpj;TRX!<5ZqIz zK4M{#$#UAN(}y>2VrWbz`?_@pwb};}0|EdaQ|mE?iO-J>#Wa&fq1b=vk}gs-J|G{{ zzMJCKV-!h-Vk#=iok`Qv6G@tJ36ddZA6x27wU~rASqNuBn~GcQG$vfxVgC^7K6UNhaQi2?tt?1 zMV2kk1C9rsO~*0*wh^=0K6gL>aGeuJ<6Ph1%rB6W51GDFLUX3)#s`$q)Wj0eIXGx& zXaE55u3fR|>1>Nvhu-q$ConbwqXr-ZfDlMBffGD!0KiGAV%v;Xt(E~wEG=a}_D~)A z*k9Ga;e8tvMW#z9Z6`-A?mP&>)KIn6DE^oBiTmV3+)mLy_|5IzAsmWvqfMKQb zDv$T5^H;gNG0-Ez8dx(a^)^p>{Kqx%ZKNZeY3$z;L}Q7T%6a{wT;Ka^(vLV zzFyqcUe+`eXj)Qoz+|$gkz`73?a-SWTi;()T$~p&D*y;httUuWn3WBJ_yH{TM(HNz zd7)4lnn^>Eq`2khjbGoM))_RKeugPkr4rTE4OP6|S}9>?@++Mi6B~nF89j5${Rg`x zHcOg7CbM~pY4fI8GClElFrYP~_g2KmhXInyr_+>ubBCpCYBc={#eZhfIkEPC1_Uu& zX>vvwppK3Y{4|ob_3IB=txiAFk*y(44GP>Us4U}Uoz>zW2W{&Z zL2xOxnrdheHT_V!@7B36u!+CPTAz z1>ms&pm5zyx^}LG{{R;7Veu{i$j809%C5=D>7OfDkVsKbs_mL*>@Ls%E{feUia<0C zh^7G`(QWih7+qX$4Dy0!l9@$-yxt)FHHtuXn|GnZOgJnR6YVFQ%O6;H0?ZBw2)mhZ zSOgxs!{MIk6~)&Ni^cKDZ^|UIA>&0_+}rv0xZ5a6F>^T0N8SQ}``K$QdY8=fieiQ+ z%4Cff0>HoxB$m)F54bVFr%t;kE;*=I6oJfUyIq(C0LTkM0bl?&05r9290^%-4Fmwr z1mEuzD}`Qr1&woX2gmmg@Ys^{KLFi-m~6*+0N}Dgri9}}G~q_$Tx>|V^zwO2P?zWe zoj!4A=%o_oeniJxYQtI-LVt37KKv@FVk*>hA7)q3omB%lwLq<9_+Ag8K72cY+WSU;pgW z-&uYr%moktAcV@xrFy;b!iBqGEawJj_L`$^KYPssh0{DxIL!lv(>zc({R>ZXatceW RN-h8Z002ovPDHLkV1n2ow5k9A literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MS_8_8.png b/navit/xpm/country_MS_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..a5170c06e12cec9ebb9ab72ac27aaa5d917c9015 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}Ao-U3d z95a*e+_Cw7nHU&T_vgQSSebQfB3s+`Id@{}CF6lI z21W);3>6w*WIbz_sqepHWMH^}>1nwC75kbai<)P*w>D1v`1<*MoeZmebw8OC85rCJ WjK4F#`eOrhBZH@_pUXO@geCw*Y+afF literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MS_96_96.png b/navit/xpm/country_MS_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..2aede5366a3ae3b64d111bc91a90e94ae10cc026 GIT binary patch literal 2821 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 S7X05|3mEE}>Qvo!j`|<8L4D8w literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MT.svgz b/navit/xpm/country_MT.svgz new file mode 100644 index 0000000000000000000000000000000000000000..7737ee80d22f9c56d8b413a431503da5b4258c1f GIT binary patch literal 16688 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

GSE#FL@gR>Y_K9*(U#&}=8{9q{SJ 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MT_32_32.png b/navit/xpm/country_MT_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..773ccd6fa4d2c77c54f33feb92801af3c0788336 GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&)pdAc}; zcyuQJ`TyUZS@S{D3O>(QGZn7*mBpP71a_iJ;> znG*GzHwWEiIyS#teooZ(f4kTGxIN$g$IqV?@9ji?onI0REYH$Us;?KwI+42=wGE$b&f|7@-mb%4Wj*>&@r zI(4NFudn4EU!w9y>V(fSDLp@*o}M@F?Iu3=IV5IaVEA{(|Ax=k?N>z~@K`>_$J!w4 l;0o5oVm(n%1`i)M!;yCH6Itzh)q%cb@O1TaS?83{1OU!YgPi~X literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MT_48_48.png b/navit/xpm/country_MT_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..939fa9b5b7e2efc9bbdced9f65a8b04415cdbb54 GIT binary patch literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H>`nl8DzD=igF*a#vD!p6(va_4y3CPJ(?qR!b$9zRuzf%JygkTh zD&KPRvuhnz$C%Bqd7|GNFS%>ot_9j&FD@7U+WYU0>U~d!hHY;nN(~iSMMAHYM1~ev z6s-AmVAC^xA%Tl)_a!f{F0TvZS}1UZW0%)g-OZC(ojjE69xH@dt1va}kWuwi-nw17 z(j>gM<IAl_0^xxAPCaV{{f7(8A5T-G@y GGywpWhRDVM literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MT_8_8.png b/navit/xpm/country_MT_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..fe1707317e2d20451adfd77e081d8c77bac1d977 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_cnPZ!4! zj+x1O_9u2XH0^2F$H&Zkm^DzAO(J2}_c!l)Yj;Z;Fm%sbD7t-%$TF74|NsAgC?m4i c;A&7T6T^8Q-XA|r!3HyUy85}Sb4q9e0Q-q8LjV8( literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MT_96_96.png b/navit/xpm/country_MT_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..068db82db571f15eb8f19bbba32248c79db25c0d GIT binary patch literal 912 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlJ8T|HeK zLn`LHy>&MGa)He8kN5R+CoP>-c6Dp%iVkZJ_N2L1{Fj^g6`IulGk@K*`ycZ^&aM>| z7iWv>cWJ!%q9DgIQ{(dCId^yQnw93fzVmC!vy;x*t{LBVdPsfwY-O6s6@O1<|Ac^- zzxQ!W=3n{uuG~X@ukGv{)@)3R=I;BDJm*M+qd#>u`~Sn<7|Y#(aT+Z$=6#2y3^b4$L^PXle6%`zdaTIUoB1T2wEBw9lbd> zJvx6;)U6qv?tE8sSFU92zY)9X}2q_;qiI*EpkBA8l}U$K##a-uD*^My?EDlGT;D#a<-q ze)-D5!^(%kLlkXq3k9tVTg}KX&i0mB)9Z-I+18zs$5*PBzlqXYH|<*ektDYRhg%(g z@17ANa@fEnUTam>=T=Q;^Iw-8b=zOd(8=}K#5_SKcMx2vbW`Pjd9@A|h_Q`3`=-&?cnW$EcnvdiP5 zieFuOc}pzx`t1Ea$9jv^|NnAO+-9eH(CYSXPZ?D!Nr z#k=!jckHaq*|+pB?Y!vy`_!fN*UwZuI`Lt{s+W@9^Q5fgJ`^Ngu$yq@3Um7TTT`R5 z`z`;i{Qe>!Ah?wyzMO#v9Zgg^aUrkjmb9QF{ea}G-f-n#T(7mUajBDu>6wz2n zTzCRK075BEur<(7y}i|h7&a^?|G$~csdzm)7-c_bYXtI$5TvPWt&I|RyIwXK!r)3% zmz_0Ips`rwtJ5$l2+|A!Tj!of#=Q5DPa@kZ784N*4TMokf3`1y1OzE;5xlNlEAT+! zP%E`+oxn5tXcu!1Y~(lxeQ*$IC>&zir@?1G})l4-jyfJ7J=HmI{)kd#lG Q2-M5q>FVdQ&MBb@0Nmy#m;e9( literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MU_32_32.png b/navit/xpm/country_MU_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..243f5f9dd8a5ad021adc126d3753d4985f016243 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&*?JY5_^ zJUWy2C@UU!@IK%YeA!)BVrzp|gKMb9t`0?D--d9)Rm!nD6L5>X# gu30;|5nKia2M(4G$6~qW0!?J_boFyt=akR{0J{7wtN;K2 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MU_48_48.png b/navit/xpm/country_MU_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..e22a0497e942cf2bb64a448ba05b1a26e0dd6ba7 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HN%{dhU6 UfEK6EYoOH(p00i_>zopr0BmeOz5oCK literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MU_8_8.png b/navit/xpm/country_MU_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..ed49c236641389a7482249cae74577e4f042c568 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_cxPZ!4! zj+x1OlogLR@ERnFrY0mL1d5(g@nwHJ|N0-5TZ&unw3^5=Xp6HP`1^pp9jJxD)78&q Iol`;+06PRBIRF3v literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MU_96_96.png b/navit/xpm/country_MU_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..a78c82d372a88e2a8620727b6ec2348a55c560c1 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt^%JzX3_ zD(1Ysw2}9a0|Sd=&m3hzMW*x;C*yTzd@nNU3IsH6eOPZ0d@!^0^z)6e7UiZgg^aUrkmnb9QF{b3=lCVr5J8ZT#Cy2jd(t}^)dwgZAjyy@EHJDnl`eVuacih8Mar zf}*K#H0*W;C;8)e{x+LHy^=6{zP`I11D+A`nvDs`=Q%vROd*L9LM9Ig-3|bj&Mhwq zX__W#vZ%6>Ol`3&6|0F4lMwcU#Dhr^amO+23A}G)YIJX-)AoPm?(7Z51mxycg_4+Um=2 z1QHavPsVY7l3fKE;FsNUdpqs<$J)0J3pcxOz@-(!cuVM=>=mXg(*l^!XBR%lHaoyl uJalYI<-`_gufVLRnJ^9t%Z^#S^oVun@OOMbWPAD_Kl}!c(Ja3&0ssIb_o7Vz literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MV_16_16.png b/navit/xpm/country_MV_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..a9e0e4bc30df12508be1293578bf9f1d6c310a3a GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`ro-U3d z8WWTEs3aV6;7U;PG>tXc;IJZgm5=H?or)`8bN)Xr`z`M$o$~W&(HUnT*-?6l<@}$S z>1HKHk@IC);X~#|9qW3?WvU6OUh-^#SNK N22WQ%mvv4FO#l!lTr>ax literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MV_32_32.png b/navit/xpm/country_MV_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..9a6c7e83c45ab9ab4b6c721b1102f8bd4fe57560 GIT binary patch literal 335 zcmV-V0kHmwP)s<3th5n%T-#;@j zF#KouPmC@Sd{Ay1Gxyx)H{U)IuZ08)I9b`PWp(%5J57@5Bv>HNFTu#jc>n!#T3Nuz z$jCr+xRYbS{rAuQ{r{&TBtt6;e*F1$?C}*RMPpi7z`(%Jd3Z^(k*^3BKdmg-a_i{i zldD&RHVJa_GB7YuKcg`)FjVfDp&=r#C#HJ##q}>gzf<1=1_p*3Zyw%w^N@J;G%rmV hN83fC7K~cJ004!0Nk-&6CzSvI002ovPDHLkV1fewkZk|} literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MV_48_48.png b/navit/xpm/country_MV_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..fbc505a09a1805e3f533b55510c79b4ee0a1079a GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H<|{ zLn2y}_oyTsGMK?|*}98 z9{ibmrGST-xs^}o!2`qT*M5C?eEQ__>ujyfTUe;cewQav| z7kJW;hv)Fxgq9Xwl{qU|HHt1QonHR$-|yw>>zq6<`uMWf{`~s)$>r5HIdh&}y48Hh zk%xz8^ZC4_gai-MZ;RWKB_uS;FFfkD*4w*Bc=h{*Kxb*leEEKV|Ax@5`TOf*M6c-_ z)3x}(2UNe~=d+0~&pf&8zy7`N43TAz&m28 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MV_8_8.png b/navit/xpm/country_MV_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..c85c8c7ff28444c89eaa8a503fe2987763f5b683 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}nPZ!4! zj+x1OR1yv~@ERnFrY0mLBqk(id`r2x_SBJ+r`Bm`RKC5+eEs(Ss_p+BUvyk3-1+a9 zqQ15GuD~9io&q7)q@Ppo&RX?S6 BI>-P3 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MV_96_96.png b/navit/xpm/country_MV_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..4bc11248fe4e03102ff047ed6ff0375be35a445d GIT binary patch literal 979 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlJ8J3L(+ zLn`LHy%XyZTqtq;!9qFZHAcia+< zH?19dZw~2gdgH61(xaiRlckv`zHiM$*9WZ{PrD+Ei|3u4d--VN}`T6eznow|O7E{*CC5s$?e=WKYpZre@EwSFQ; zH}}mp?PII6Y1!?i+i0o;}O!d2eDqi^3n?IV7VZa=z8#yOT{jOfQ{4eLv z@ri6&9?=T-=f>M9>UA<22ejQ(y3ZVE{%Def0rOIo8BeM$44QVRu$^)E^jR_4C-;22 z(HRG+WfSu!KCHRJe2C`>XT?)%(}O)=C5Myu*S}jL;bR!r$zgn9!S~rU%V(!6gN(hf z`yl_Py(+beU~_lgsr~n0MoF}8q}yJ`LLZYEjfa{(ls(v6a{TyF-Lnxb7HU#Y?mx@_ zZZrA)+?}rlr@J)Etk`*7v7T*<>TR`pvn6sT8u#q^@8v$ZWVYqwgNKZO0r9Y2E%tGS z#HY$7yKkkZk zsyl`4lE&Zvj$g_zJ>f@7x?S^||CwVZMzpkvllzD1oY~bkcW#;d2j)@+Pgg&ebxsLQ E0QK&)lmGw# literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MW.svgz b/navit/xpm/country_MW.svgz new file mode 100644 index 0000000000000000000000000000000000000000..7f63bff7c8a3e8e46f80af17e2bb1d710ed0a4f2 GIT binary patch literal 4352 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MW_16_16.png b/navit/xpm/country_MW_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0f4e98ead16c1b8f3de0673bdf4b047f67c4c408 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt@|JY5_^ zG$tk|9AI;q8R0S`VuP3AqK`KvB%N=t?2w!(AtABv-~a8;uD8ek|Nr>%gQLg3fBb)c zKF|OE#s&oj2A_C&Ah{`5ivI^JTDz^ ynUu9FBf)ZYyRBOxqub-kWh$8xE%VeOnHl!p)B3%mX1P1i?F^o-elF{r5}E)t-sO&X`4BCmNCL4D6a>Lm1Pcp08$lG` zz{WT62?SrkM@S4p#2|<$Mnww~L2}vL?w*}ZaFLi4ftzywyYri60LEPS$9oK5g?j-b z0QfZeQgzJ;fjJU8BA6%fp!)z&B=Mm8=d#l>(FlMA61z@LLEO}`8yf)dkX6Vbz%$vt z*M0kQvd00^fm?Vps;at8CGWIsndrmlPON>TwUmFQdJ^K{flZO|kTrC#rou(;?z{Q* zl>Z*!~zw$WK+F5>gRjA>*6vUaTV%+>@qM8*>Tzp$Pwj}@@(AOR8}0Y+5(bk7?v mP+Llk6`1@TBtQa80PqdRU4jl0){u+<0000&R;W literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MW_48_48.png b/navit/xpm/country_MW_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..0ed5afec755393b26b4d3a31ffc6b3afad15e47c GIT binary patch literal 719 zcmV;=0x-u@6>R9=VA^V}wYeCW46tJ_=(jXe{j1 zKxt!d<$r?zfw3bo7B+?kF;NkT@wKv$xMU;j!p`2AImbd9Vs!2$28g*|Ihi@XZ_Ydb z{!0)5|6QrQ;{l$Nh0`(`6p{fNWL_J!XgU`70EEV6;fi05g9trrR$} zXa9r(#2dkp30VYy1{(n|AS3{+lNNx3LK5?W={!z06VBW!Zx2G(gUSWJ=pkz0?`&UL zwMkSb{fTrHy%Gu!F&0t+zPH`1#bwq7C%j-PsI=JDY*Hhwm|mI=0uV3&N`M;aVc{PW z{!~y|w(6rzGS$!4p#dRpN4*Moi|GR;^Ll&9blXf8I00@keX)9jO+|P`6kXs^FI=(R z9j5dV**Y{N{No~Muvs!{!R$21Tnl=pqw0tk0>FyxK2*)8No!tjYvu{RI4pu8;Wx;n zkI2v=5Ac3*@GI%hlq?ywO6EZ+zFX+;6Tf!VFXYvrC-(fgWD5Zz6a;X|FF#4z>F;(1 zp^JX$l#CGYx!!(b)xE;N&G6{&(?-28M4U@nA&9fG5F)nN)<~yJ5$S~{{c@f38tFCC zXJp}4)cdEIccSW;jMhl6lU^k~>6g-{q!sEDQZdCsE*sTkI~`U3@`EA3OjK>MeQQ)K zq+;$9X^$eUPzWdyEkm7j4+`g|FZ<;piaKcm@DYR5L1|xEEaXWqoK?*YwqstnVwH2r zs29Go-ACQcnW!2Ixt{tO9WHROcjTZQc9G$g?GL$-i(JS>F61H?a*+$U$c0?wLN0K8 z_WVIR?BdXMC>L^(3%SUJT;xJ7av>MFkc(W%#Sh?c1!A8LgDL<3002ovPDHLkV1h8( BLOcKf literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MW_8_8.png b/navit/xpm/country_MW_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..23349607d8e4a97ecdafb603bb6f1b43960a1b41 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}LPZ!4! zj+s->SaTf;5Mj9ZIWO-IiwH~i1Ex1kz0n2I?@rsYiYKiP?Gf9yzVMXf3?`Q6Zw&m_ zOPcIAc#?JEtKFx!pJ%8)N!@sG+Yv>f^JzETyNmA2UhP=rdT(8%?Ne&aJ( T@OkA6pluAEu6{1-oD!M<7aT)i literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MW_96_96.png b/navit/xpm/country_MW_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..a4e60120136ec43213828a176603c0c0737a2d7c GIT binary patch literal 2124 zcmb`J`#;l*AICqNX(%G~6`Dy)od4lG-jDbD_5AVu%j@-cJ;K>yL`7so000oRyo4g`tH-}9 z1m3@aThqb&a=^p__)gQ@l2t5~wb9Xb=X1sT`r#PFLdl#V1TJ$~H6GBkr z0Cz)K+fepEtD<)v$3S6jymS>JBG`v5RUj|=li+b`5`RL{-$?(JR)6y`64(eMx|?uo zLfhO(8nb+d!HkQGvQNjmUOaqFFyXp)|NVH~-B5vqV2ZYaS0?S(7ai*_ZI~}qNjM_Z zFG~w#0b!l-G#_E!y)ebj)GJ??a_cn^Yc@Zq{4MLUJ7WvThWq|$9GG2;0t##qeY6>h zG8GXAiI_5&_$TT$++*y+1^Tufq3$}9v!m6wptR*zEPLF#w4cnpbleHlc{Lvda7H=TjY}q zNwl-#p>u(Q3q}zrQBhMlmcV?>KgG1w;txnefi&NC6-(_f(H2#JTM>E^eZ z|J1A|V3M5!@+aeA^G7P%)L>F?Ty1~i2)}hMHzf}S&GKh*Er54yJteTYhbirvsTR0cjPxDF2y8=Pky1u2y?&&dqPuxxEt4v0>^c0;k zcQ|=B%03Of`LY#$6dxUG4w1WJ(NiMAEjDdJrRNg7!OK#djdveV$r{d4o0`i@!50d5IN5S{8;m zUW~p7eAu}vcgbB#X^CiL=W!fJCHi;;JsC)6_Xo5rgiy3R5I&6hJ1eD_ebKuTCPcBs}(#cU_fQ+BHn`Xwe4sYD(qRG_)y+q zDUg@6A{3c4droa6S=)(%kgui-(KRai@ITFusmk!#zob^UyRt3%P~1->r12Z$iEryB;q8j39ItAviMq zKe^ipKcnI5@LvT6cZimKgd}CK;JBu`F^Smm?t@8uS&dXhgr!dJgDf_`t z&8#GZw{#@zF*#`&d5#N}2Mm)3<;oJp0l|uXjT6{!C7kNs(YoM|?}zmlIqdSH*W)yb z&Z4V2$mR3GLAKEhBci`!@9M^T8eG9DS~O@^PC2ShpvUKq=%DP$SJ8(`aub}_^%fa} zm~&wdE;|=Z&a`IHpS@(}pLj{J<%28V!rj{^utDSqiXVttQh21qhdaF3@i%9BS8nUA~N=3xrw6o@f_QZg^VI z=xBh6z6qAXMba;f6JSor4HweBy?b(MV=sVa`F{Ss^;8gbJ$9h?0Sj#U^?j{j;*=TH zpziJBj$F2EiSI*)?HhO2$TOMAXMqfKWN7ka!&56?A?-_+^ndviBX+O?NcBfH}^Jl*RB@!%3w33nV7r`CH-9N{~V%g0VP zWX%UU*5jS7dgVpIoZ{JM5o%op!81h|0*70qo84-SuY1|_r|xbX#jcUBp=SzAJCQd< zml=#PB99OrlR+)O8_U|bZ2z|SSy~wah=Yvbwn=LJOzYzoG0eHm@1#G(;McX+#<%xG zBrm;%{H1kI#|9z#A0guW-h4`0##_v@Q8O7OW~^|oC;0kP)Bg&Wse>?LeY7=Nd%qq4 NmS|g4nYqXPe*o2c-yQ$} literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MX.svgz b/navit/xpm/country_MX.svgz new file mode 100644 index 0000000000000000000000000000000000000000..63dff365c1b2abceaef9d06c75a3639452ebba31 GIT binary patch literal 191629 zcmV)KK)SyliwFoED0)Z&17mM>Zgg^aUrkspb9QF{)LUC`8%LIY&#&lJUSh1+s{2J_ zd61EjnE>|gV3J@KivUK8Y)PC@q|l@+IsaxK_j!Lp{@8xssU}5IO}b9? z`s1t5UjEByRGoKivuY>R{d9F*eLeqSIc{#->Wk~u>h|>HH|_Ga z8Mn)mHC@K<*a8Xn)5+=@O{Yrxx}9EKug;EA-+n)B@Bg%TI6G36s<-~WjcstOFr_M!|EN`Y%g@tEV0n}>G!V} z<2$j|3SLru)2>$Vo#ppmPHv|2>2lRIlSTLa+v&2J^c@#VX-;o``md{Y-Y&oY`}BwD zZ9ADZN3UMqw5w*)teUml*6o-SzQSlv|MvQ;S1-ro)4wmeAJ~h3NN+B{_Sq47O~$7% zlbdGsYI@ULwY0~7h0I@`JbqxG)rZ@5Jwcgb?NEbGIT_zfIppM<)pR!dnlm3&CuOGT zYSzA@(5uB|RfJxB@h8Zm?V4)RR&Rg$Z_-`}3#B*5VPoy9Z`#{Rhsr3e)pj{I<8(XZkp-* zBh#&?z|UI_SzfopEN*dkT>Yi#ChfWdwz_CsX!-NirJ@v4~1pPH-kV>W$tNe$f;^;{I~ygcc@l^@dkWP1*3q+O1? z>Fo-RvQhHtx~;yOPZ|G3-_5-GW(CbH!ImuWqOQIIOGpjZ@Pb8$F0)D)fJ5AJ+{FiM z2-;~YokOaN^0$@}8(7R&-Spz_kR6bn(`w%uYBZV^+5ED*S)Nw^*^IB7?nAGI8V&)F);C*lirJE-Z#7RZh7=`r<7@K+YWBJ`~~d&t-b9Qle;lx zFYNuQ*Y;8Av->jzZTgq#>kzOyf-gqT4o~$G0tCyQ_&7?44p4v$Q_tW`g zaX(t;v#9q{P5*tJ|CDjN-)|8Cm)Ef7`?DkS^wR;z>vGm3VMe;Ud$HV+0o}g{>TUNvnF54pG{(B9@}O9$Hn3XbM6wy zNbs@G_>V-a?F^XGPKQC^VN^;jNg($zUAx%R;cC3;(hplg?nv_pz$+uGQGwyT3P9D!dkYfx+*yhj@& zGkfSdN6rvxW8$&H%-K5`5$dEZC=sic9#$o^Z5@M`8H3?>RR`&BfiS_P1Gg@q4LZ6L z4mvHH@W!L&m*JBDy6+@5?CSwARy;4e;Fl8%yR@uuErtlQFxECIcHX=t$sqJcFN7?`J z_RZI?-#P!TXq);(be&Ca|GLrVV>fT#LDP4Sd4-?QjNWf1eb_eU58I8k)AgYKk&lh< z3Ca)o(LJP|Ilb;$)L)u4%Ns0~@6o_9tX&Yyby+#yd z;gO(s!!|@4l8kULH4TcbZPaMPz^s#YOabj!=j5gB6BU}Ws*R6j1dIsEtCh{NMuG*T z>}wArCl64njEGQi6h2J?R~hD=FhW70!Bz+^P$;-k8eGv)GJjdvDSA3%q)iLJL=k4l z0oK6Ea)4*aHrNpxcUashBTHub9@@&0No*^7X&b9$1chgW;zO2gMdxJ=XDGT<3>z~C z@x_#UodZOnpm0-!X&i-(HH_a^$B

=h>w`V3*eZes-y!W0xup*=5wB&Wg&gVs+=B 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 Wwg3M1|NQI!@&5s$xGaJcF9-k>Rryc= literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MX_16_16.png b/navit/xpm/country_MX_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..607173e77abe2a4b7c13dbecd4b3337e38485cb1 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`ZJY5_^ zG$tmeoc;Fi?{|J?9v$yh9VVp>#r8S(D(&t1895CMCvdQN9o`>rZ@;g`X-%7beO>IG zYxawEetn)j-6iwK|Ie?F^Ut@h`%_c$mT8g6p32()M;}jTl8V}YV@JoOf`3n6&!44M zFEPW^XKUxB1)6#vrba)SyY8_)U)UlO504en9mVchUZ*`@CY;)oz*Shp5h1zj&)@&^ tXLi06H0}kM;XR#@>0hcTT1H*%qqW9~z;!(haM~*6B z)Phk9hMfgp-aWs(YsH^mzi48?mv>L^99X`4+0?}~Nz}LC{fB4IFD-k1>%xB~wiBmL zpWnNQ$`){O3NWxR@<~d4{P>H7@&BoWoZ=sq6e4I>M zAAkGKENy6L!Op?AXVpSeXD?n(W@7ZR5Toe(AEw_@A`5SP5|NemiqL%hSy76E@zK|x zRI`AEnLXJ^dKE9<+VdAre^LC&$gIW5&Bnw{QDFZnXw?TrY0 z_xQNBx&={=BSsM;Gq0?ahV;*qH-rr&`F{R*c2-74jfIt{ghXsIRadwF^PgQ%KuDEa zl$(u5L(P#$jYRnX0(7-q{{8y({r^91b`IiokzfG>0|OHq8#hTB23>tHYQd-l17ZOH XzOIKNQ}Fsj00000NkvXXu0mjf1&in| literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MX_48_48.png b/navit/xpm/country_MX_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..2c742462c52ff5a7f628199a13dfb1e4842664f5 GIT binary patch literal 847 zcmV-V1F-ywP)26LA2?@w>U(?%Z~}{hn^~2ReUdrR7%GC@kqgB}5Pu zr4M{y&@-th>~U0&f}luHh#s3(DinlHhc%674gH)Q#`< zc0VV>p{#*oB#{U^6SSY%@=`P_6N6hgG1&DuYamQ%{6*oKvI-Guh*2U4k$^P)eR3o_ zpk#u9B`~YC1tTcSB#C%J0Yjw)+9XYFEYD{F#O`f+-9rK25*>*WKV6|63X>*CDh}j; zql0g=021e#8Ho`^l&~f*!~o@b$Xs_8RvC6#m?Ei6gEj)o?0%SG7=#Mw)c(x?rPj(; z0x^4YYe7{#mS>K|h>U`!ru*r+Ic$p(Av<`$qc13$b;l#V)rzC_nj))2sqG(ll2H(* zz{IBFi8-H_P{W5B8!(Jq$t90;N<_Xei3#}$g zFdFwLEw!-f4(e}r?cK81F56%`fH57 zedgr5fv2oQ!+VxLNQoLzg}NA6xMqS}1cHd=r}b!J+moBCw3w=S&+@!7002M`ywG@K zc)WMrw^G^EQjmm(CSRfzCoY|9%aQ!W|C+Rc004kw7Kfv)(CdugaR%SC9dEXl*m7Y0 z_jOPZ000QAD7QN3JTjc1OHkDT*U|v`6C{@#(lYeles!cV0mPL6;z|H-%*$f7TC}s)Q1GkM*fR-?Ly85}S Ib4q9e0InlEg#Z8m literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MX_96_96.png b/navit/xpm/country_MX_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..613d01c90fbb8c5fb71918dcae18cfb3fd2676ce GIT binary patch literal 2495 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 XLjT@=wp4>;00000NkvXXu0mjfHVQ~; literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MY_48_48.png b/navit/xpm/country_MY_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..7a8bc7f098c09d8ad95e2e50ef21d4ecbd8659a3 GIT binary patch literal 1108 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MZ_16_16.png b/navit/xpm/country_MZ_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..e2bace6735e6b1b53f327b3a0146caf921aeb8bc GIT binary patch literal 364 zcmV-y0h9iTP)O;7{lB>@u#1_lo8uV1cmev%M69BlEI zl?9)UO9CeGT;lsG_$P9!ToN#u%&p4Az=%gZbA&VVe>aY!?hxdIxh(mi1JgO-JY=-VnnK+gXvNR?DNov}~x52IPG%f%DP+6_Lk6S+@ z;Q{~vD=D3?hRuSE3jhH2l+@A3(Ta)-005q;xyx^Yq=pRu0QKQyYkwFc008`hG5=r; zBLDze`y&lM6GZ_KUs>5F^TRn$|+Rd;JE#pL4#>c3Gl-awV*+i1C%!Xnt5)S zcQM|S9HFwarOs!!>Fu?JsKY>%>XQYk!*bo!+7c;>`qBW4KW6b`n+K~K z66L3{O*FbLy{;{kZ_WM>Ksm&!c8;X*Y!y1QQh93xu}X2(a{!W7t8R`M?07ai0%^8O oL8E65hdKa|WhbJ=`tnQKZ;;UbU%zU27XSbN07*qoM6N<$f?vv3Y5)KL literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MZ_48_48.png b/navit/xpm/country_MZ_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..a44a6afa3fc882fea9a3ea13592c27080a2fb977 GIT binary patch literal 1182 zcmV;P1Y!G$P)wK~z|U&6saY8)Y2FfA`$A*XzHPmckfEp>&Ah&tSpCy^>_ZB^sm2 zOpHq#4KZ0#g17+AEJ|i#vSk=!ge{ASiGSkWXf%%K9Im=mkrzXw;usD}H%Hl|fNi1I z*xqB|(-*ZPi^Z3)B)Y@UoK%QMR1}sd_!l-SM1tCc~ z@qMs499P>U3jzQ-Ee-erl`%nW8Gwus09XX^%*81ypHkNb)`S3nT@grzikS_!Po{4$S#C+jZGRO!4K<`+n?PjFFDjDR3 zR17D1Ay6-z?kNN+h130nK#g$PKnMyRPSo8cjXfnvATDawDy_585K~ijyt@EG#JJ_5 zypm~O1OQgPEy}Bpx7G)CJCzoac|uGhmn-zM7_TGs41pT_6Ca!(@}-o`r+>Xelj+2# z$pw8Qr*Gr{fS1z#R4gT7hCrE9Pw1V^l(9fUUnQ5k+|)b#oaEwk^;{ICJn=t%5m)wT z%xmY+1R5~xtVBA+g)qQJ!aM~;M@8{_pX0zCe2}}=Oc}eF^1J~Sf;wZYu@W+Ky*WaN z##&amYz|MR6Hi(#T?eS^Gw}Rj@U-Y(bCu}Wq?Q%5tbpkCC}I(P%2<<`$4!Tl(!};x zZe95-R?5Tc=NH1uu4_k45+S|tmV>oVXf+rBmVHHYN2+s&HIRmWz3U||fMJsZiu7vB zSH3H%d@AOsPnA|5{&?uYJ7K)L<}dZ((Enf7gE3_0kCo^u ztDGYvBXxCkZnvA`xQEXUG1sHABYmkzFE_L4O>X@bFN&C76}(>W=;)~1?QU;x_xt@q zdA01YU&Z**#0@1{F6q_n0DyDJ#rOHYUhaEU5Cod0Z8qEN&EHDxW#=wk+Ow3u{P+{E z9*R$KQd$8Ypa5VF3n%&6=S=J)RsEW6VtAp7)}qE5{{tlR#qZ`IRa}kMKeYdrL~ndL zDv3(iWQEEQy-#B~RAH>Gn~;(OI;JNGAWsw43cizdjL)sE3Gou{j8BKKg3HKklX^q% zENV&shTDD4#F&Y@V!GYu1Prd0)Lu=t%VLm@B!XAdoN_jh+wGZM-2B@Wu?yDBZtQ}U zDorxG;<2x@mC3zL`&$m|S5zlgh`(xxeQC=*w)EllZBHy^wu`+7pH*vtb~om>2>a%Y z0x2lN#us6l;yaGtD2xqkC`4DSItBu{tzK#FCq!Ariqq4iMXAV<<(@)_!H&UcExR?o zTnSPtKN-|DC>uGl$P1NphfJ;VO%@ZWkYZv}oH2dh!=1_pD*YRTeVaZ`YB(8R*LL+{-1#R*15}>f(%z7sL^8f$< literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MZ_96_96.png b/navit/xpm/country_MZ_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..5f302086f457123df4d457ecc3ce6df6b47cff58 GIT binary patch literal 2576 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NA_16_16.png b/navit/xpm/country_NA_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..fd999fc05462ff032edd2a654bd9d6a32e496158 GIT binary patch literal 379 zcmV->0fhdEP)48k7R{D!dE~m`{(TkaMfqJLjw+VFflMNJbBOe z;4S}xqXxHMia=CvuJ(|v>p)W-eZ2qg|9{L3(hgsLvAy`j!^-k+%{eVLRyI7U85kHC zk%JY#*(jkzq-ul)B2_~*5U-knfq{u6)eH;_j9WLIQfcl&R(*X!Oz`2ZU;qAKs%Btd zU~YW+?Z@@IP@foR-sq1BKH7~-H3I_!)Avg^;i}K}gasVMX*R;s5SN_okBmMw39Gx2 Z0RX6+yzU-_p1}YB002ovPDHLkV1i7RsHXq` literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NA_32_32.png b/navit/xpm/country_NA_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..b5fca08b27bd835c7f293ea731a4e27160ddc185 GIT binary patch literal 628 zcmV-)0*n2LP)F5?1$iCp^ z_*v+DTuuC~INuk7ri%)4?U)!NarG)%xWfS>8!L(h-0Z*R#BGuh`m`u<{l{+{1l^7+ z+@WsgU{_e)hp-^X@Oqf>)pL&|wIp9JI-x%?V!N*NOZ;xf748tz<(Kx{*B57j3vIis zsxSMZHDDhz<3CCMFLMtYU4AN#%k6k#6>j=<9YMDZg-{=`F#T)t+t1GWhnevo0|SG! zz$Y%wUum{yDKdR?`G=ohpcef3$F%&6&hJ0WaCPs#aBaJyN}=ft$f@Y>UnV7y4^Q6n zF)%RfxT@l#d-L-THVRE=U|?WDR z&cMLHL{rll7#J8Y-+3u>{v5%Y&v{eH>+c^)HJyQhfrX&ykeZJSw?hEqWl@X&zyDy7 zU}KeA*!j>@hHSS(01F<|ZyJeF;&!M7m_iiBD!OSjH67gos+-QhzyJV7B=+o;9t2td O0000$=nM_fN})1ENrPC>iasbM z_D4uR6k%DA%*+V<5(O5b1x3+^KB$Of|Flv|BCt{{v@mtk{Ii&w^UrR&T^}4v&vQG) zd$;G~b1!#4-sgRvdwDTPDg}fQ7Zu!mFE=Pqq{}Nd)i*C6;Db_=6dU%sB1htj4`vsd zo7y?Y;2zMNC|XH_4#ZOfXiDbL_>;Q4V%HjQJww~W#@9{biw|ZOa;{?cAd;|c3;hcK zR}Z#f7(@Bd3Ylqbnz*Ro=eLjZsgx_woQ-&TrZ!A!Rwwkt%g1W+pW!&O22E0ISZmd( zpg@uCYza?|M4iFChDgG8?NG~=+RS4+f22nb{4oZuLF0CZvqF}o3cp)|u^Quz!*7Qs zD4CenoBdDj{r0YRt9F8#vWSu+wU=u$XXi*huXc1lu@C=BEok)CNp{KFenpfYY0?>} z`#BB!qO=-Si(FzZI`DDWNb%G-Dz$peh-D(B?g9bfX^Wrr={MpSle4E&A)8#tBq&C2 zy-BWa+cjq+_-J_co8_AH`inn}LrZ2zCY~)n+QcxhLq6(EO2rnN9UkV^M{YIX9ldLTuq6zE*^O~!1tei-7+`I*b=Sc18Jebj0U$DXVumI= zimT;Pvs7#e+Aw3CClF|W^Z4O|+e;hLUVe}I+#g=|C8l353!$d<<^Tj50AM#p0AK*R zhC%_rWbx}74jD31`YAC0hClVgFLQT0`dmUe~_1G93bz}008b) z8UVn?4byA871&>YsoOBHz8V0)>=xQf=4K&?(^~7~i&j2ECF%@$<@FKTD4YfWur6sL zpK(H0${DF?puFi(VKbKbpFh-f6`*F z)v+ghQc%>7m#4lrtKV#%^G7z`s9wC(_J2gvbocy&%U2g%l%7A&z|g>egFEB={|=>7 z2M!!aS*qBV!{johv9U4p;Q8qL{PR-2Z{aJhVir$LNJ!YDl5pr*rs#{G4}U#h&f~$r Y@QvM1-(^x;IMA64p00i_>zopr0K*zyng9R* literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NA_96_96.png b/navit/xpm/country_NA_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..6c4401d6a70f08d786266b76a12af711cd12a3b3 GIT binary patch literal 2059 zcmV+m2=w=fP)&efi_)3LSo&DQ?W)6-U3b?9hqMJz%&K&AG4K?8;W^3o#} zf;8EXxBDYZ4nx>%k_{%CeE;GZp6veSGrQ03KKsJK!k576gz$-)9qY=9GOSIbdZc^x zR`O~W&7bqUR+vvjDBvA?eZz`}QmswH&~W!tzt(s4(q97CJB9f~Jl6q>ff&&NTY;F; z0V{zR)B*c|nAHKxfEd>Sn}EEb1J(f9=@```s*2xut^-eiVk2&QzIsM7ecMs4+)V#m znL2I)-5Wk$S$L6=3OtOL_AFcI0txvB0pDnAE>7z$O7EH4K`PQQRTKSqTL<)k%;4;= zJj&r%tj(nvs>P|je8OaHuAJAoVc}&4%c7GIKJm#bYrU!i`apUEuPD9e52el4=A-E< zv0x%EaS%Y-oLdJr9U0JsF?ogCi*Ly31+2SbT)lu0NQC?2Ui4R|N!_}n`ikB@3Y&nS{F z_s@Cxc+rc?TmDggn&6nN9nN;j%imjHnyoBM?JdbtX2z)7dt(>w*kU$wn62Ax=5%&+ zYE{in2I;*Gd6)a=M2g6=`PXYMWUtS^@@mB?n+|}Y^q#}NsyTci=YfQw%osI*7e0NQ zaUHv3*6ipU?5r>U@+BugCJVRfXeoeGS5x{&!*{R$a(bU-8Qqly-|en{7{IZMnT=g? zX6wEyd)C3u`d`%TG+E5f5A!E3rJuT*`mfgeHx+&tC3bwe{QDKnU;JmTdR$y}q?F03 z@3sz{4${^r{u_O%|K2~YY?Mc99CnaNwEJ7;|1c&werYaqW#4@r&^eP{mv?2)hLeM% zl6?69MYlys{W7t3XL((Oko3H0_=XOsfgVZiYp(j}@RpiLkxnWmMIi=?&IwVPQBqL# zSksMH-l}@6Y3h}&8}ShxPyorJM-OZ|QjpRIKs&*w)&U?2F=+LC0MTOY%d5{+7Pvnd z;yXH^xU<^xV`Ro(pRau6;`Y_`5kgX<6Hu>DqYI4`k`@c+K~OO(VWvJ73#X+!K3+P;G9AzX67Y>X%j=eBDQnK>%+#mpMxx$8Y$|MDm8)>0X!xoQ z=m2e7+LkOE`T0Ya4xO8KZAj*@&);f`pUJ-x!ZW?T_G{ZTBmMZS4x9qXB--kgX946T z4m_Ew*u1~YU?S}L>^+;`ri!b6q7gu5jC%9pc9-h*WgR#@lit3%eo@ju{q^L1O%Fzg z=}ulwYwVPlW+^3t2>>Pw_w6%_UOfEx*5dQE-)D^Kgi;Z?EK{|&F@M5n@8~c-t^=pj z9Sf8CFZRV)x0*ja(O8nHta$$!(!eXpQbvl%rmnT2q3yrEIZ$GUxIXu&O-c42lRo$L-pHF6xCl(wl*6S@`2GX#ShT{bOwIK`|Igk zzWbdHXik^`Fqygko^q+dBP{oXX+OI#d2X%Ig?0?yW42In`=bu%57NdvCuhIyN{GL6 zpPGIGIW>N&1NvK#U5sYp+MvuxV@ezTtOHLTpt2swoW`$p;O$57{9OlL1!92?ya&V% z9e4?dH9GJH5Sw(sI1tNpz$_5^big1GD|NsW5LJZo>viA>P$1~Q zZJ+?rfqOuKqXRd90!jz20tK25TmlL}9k}quVL%b{cfa`!7D5wJp zprDR5j)8(Ywm1L^>P(G2P*BG%cK`)-rsw}aK^=#g1PbcR6fS}~l;H+-sKco}d;O^; zlW*eA+S~f;PX2wu?9n@$vlfoUGWkiM;I`v1lY?|nXQprw)S(PFs6!p%+2&roLdEPt zL$lM8KHtNOntbuue{}$G$&MS$E^+e9R14e-CMrAhXz;htB?pd~Y1jKqBcmfm%I&d2(Ky=_9P~hmm p4WNM1fvZ4)rURFN0#FCQ{{Z5?j;AkBv)upy002ovPDHLkV1oZ!1Zn^P literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NC.svgz b/navit/xpm/country_NC.svgz new file mode 100644 index 0000000000000000000000000000000000000000..5de7938e03744032524c6eb88fca6a34a279459b GIT binary patch literal 273 zcmV+s0q*`EiwFoJD0)Z&17mM>Zgg^aUrs|Vb9QF{b&pYN!Y~wtpVwcJ-94L|v?5cQ z%GRn3h7+caJ(f0Y0$nOiX7%4MeH*KLyzqVJ+!HS^Uky3S&g#|(;FJN8rf5rTY60J_ znmhurE;nV~v_=ZJN(;**i0`wvbpN?q5qqx5?(qEjk`kC8encr^w$I4>aYH!eh^s9S zP|lqeh<)GFKB8?`QmDk1(taQ^X9vBPRd=24m)78&qol`;+0BOfBKmY&$ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NC_48_48.png b/navit/xpm/country_NC_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..9e58d71e8caa5c581447351d90319a0061ac6a9d GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@He#gTe~DWM4f#GpQ# literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NC_8_8.png b/navit/xpm/country_NC_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0d7704f2c7883e60aa96b1a6b724a15a82810d GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_bePZ!4! zj+x0R0W;1YI3Vz9>4vOT%*@P(&mTHwznjmss+CCw` qKtn==hl`E1xykY1fZgg^aUrt3Xb9QF{omFjb+cp^dK4AahiGl!eA?r0# z5;tD4*hx{WO@h|lmXEYV%R(s9An7>nuisHp92XsyVgX`HGc zIricp^2k^wOD2@$V^1pY-EY7Ca&a)doy_j|HBX4Q#Y7~Z>%_i8Sfznl&L{SuCvFFen2NrY`Mr?43q>V{RE@Nl=Di@KnxYFI64zNOk4 zVr#opI_PF|S_oE=TF^~haZO8R$YOLY*JjNGosM!^X|+uL0&GC;r3=E4J-g!y0_l-*`aRN_RgIrc$ArmEacW3W~TUK+LUZJMux_ zb+tCUB=DTG;-S)NEz4cmf=jDGdr=F4Nky#-(JH|#3C@hAEIN7yZFpHT*^(s4gO>)i zbwFp?(XP${1n1mhoHUmu*R`x1nrWC2Z4;)g?i$g2!7-_D{Dsm`%Rq!{2yC8fZj=@! zo`6vDMJ+kqF=-LNeo3ducVqaJeLj3wY2_N>jvd|Je7x@z{rvv2pA9q6J*Q)ocp+4= zreQRuBuGd}ntYy-DPWQGkt^h3ZTl&O(wY~}OP3d;7Iwole9*4+yz{TpY_+Tl1If%v zuq~Ck21DPO(sk7e`r&Fqd3>Jd!z76P)?inQj8H31qHbU(WQoHx@qr7)yD_#{I0n#J zNwIZx+X%?AF1VqXtfKhD6>!66!#S3;t=F(mBa$vfP*1|76+`clTajehVC1mgv_bLa zYmEs?Gg)!3m#&AjYSo3JjpQyuy(!0Wo(~Yk0O^J5$4PSHpCx`ifVziQQIt>`FX$oaXVqX>sbur@4QUwz$#sGDw_gQ5Qf*vr*b@hX=mL_Iz;A75=~ar@j8eVRt`N?XBYO6l1pn z_nom?J@Ao4y|?bT94c&<+HOa2_o~-|k6boXS-$Nq8Nj%+p+(ZTh1|Tc*W2=QmsR*9 zP_hH+cF*fT$v)8Y1_e|R{Qy+}E6p%o04{YPdhDHL|HdQUE$;HL$Kxb=mB~d|x%=K- P=lK2yFym_5Z3qAWJe)IF literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NE_16_16.png b/navit/xpm/country_NE_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..19cbad21569a4b0c884fe74d5d3e5f8e6063e920 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt@)o-U3d z8WWRi1dbeY;7U;P{QBU^fgfLANcmjcFCTAcU}W^UGwI?-dFGm1hMye`em5t4JHIa07&%a-Ufc?}~&(l)o_ulLly2fBs9)78&qol`;+07<%8oB#j- literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NE_32_32.png b/navit/xpm/country_NE_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..08d1806301409aac73e32d5344ca3ec2853abbc5 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&*UdAc}; zcyuP$2pl=);C;X)__DjM#MXo>Ol%+^rgvIlR@8wX|Nqx3P5oC__4#%uFHcWTj2PpZ zpsbK>4=yj`d@mku_~-ZO13+*_N#gdg=d=Ayx$A8A{MmCvCd(>BezD8zy0TL5rmD`a zC;qQ@1^T2XBmm9(+!uM|h3cuM`0wYEg>BqTxiuJFA`dJ}>F~YKktO!w*AoMSMXOR$ z9(_KyY!>UARcTFyZ+U#q1lSpOC)B9V?&378%A9{O$zN1xxP3f1ezi{H9uD2eed!HcYr}*0hfA*Z04lFY{cjkH42ZHT99;q?x7d6X(w6 znSAn0>ixboN1jTtv9$puYi&1m*-SoJa^bu8?+@BP3Jdis)h54Ouz$V$!|)H!uR4G7 zQM>H8MSJgw5`pd+HmzI*j7G9YRz7cuXKdeR3{t9)x7#DlE-+@(8K$H=W)DkB1(dC~ zCwSTGMJ{|&=T@e-%c`TXvGKN5h(;}!vb6dp1!e2$1;*0fer^Mr%;4$j=d#Wzp$PyaZ8pjP literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NE_96_96.png b/navit/xpm/country_NE_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..8f2029021cb5736f205e24904506b3f74a2893b1 GIT binary patch literal 937 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlJ8<2+p) zLn`LHy>;IEa-q!ekLSPdetBb)Zo1#*14^C?Ii%XIF6<8Y(tYSf!1NCjR9G}U9P1sH zD>-_0E?L~(;l!o=;?luOm-tFGA{Ase&EkEYlYRO9K3N-<&&OZC-gm#&&U%kr`1hYR z_iW}C|E^o^yLAdz)ZBGd4N1ox7?>G(SPTRXkk6QvIcrtAMpg|QW8PI}4#k!eQZM!M zje_Tk)w{F^ynD6l(%Whq-u9Md|GqD`2r!fEx8L*g`PT)8zm1=}ulw|hxBWc(xw{wk z)~RmR4g4uJWmd(%-S0OE&W?L*xGurhwR*pKO~|bf%PFj0Jl~JAS+z{PY`S;R-@M4; z?1$}9FAG!~C*{k#=f?`9U3wo6AQyEBkL9%eR<;hIi7zK8F123x^%AyAvYbzj0Ofg~tjyoE-}9v&yV*v+yal`5_O7{e zj;|{6!e-+)S8S&FO{tu5A@<$}Lu=^@>3;6JPp?>no%p9CW>IbXU;FGVxs099URca{ zNJI&uuXLogKS6X7;MAcRnxvon@VsWeSwq z`Df}uZ`;?uoiBe$i0=Pm<@C_?_mdNgXTIwWTNj(5I`7mv$Na~foWW}gc3rw{r=RqF zosQf7wI3zQSD4+n_WEwQ3oyP!?$0*Ad~)Z)cR$1Vr==IQXPurE{df7gEV=oUZcY<9 zK3&|$_;00(@z;<4*FKl6w*AW9x@_gVH6Bc&hF|aVX%yW$roKD$e880-JWLWC2?`C3 f3~UrI9>{x(-TY^~T|x<%_ZU1~{an^LB{Ts5D(<5N literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NF.svgz b/navit/xpm/country_NF.svgz new file mode 100644 index 0000000000000000000000000000000000000000..bffd6b7fca041e4a035847491122a755ebb4cab3 GIT binary patch literal 16417 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NF_16_16.png b/navit/xpm/country_NF_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..e6a09184c15cd7ddcb7a8034b962d6c5826a4c83 GIT binary patch literal 362 zcmV-w0hRuVP)cZ-vi4Wl76ZjMk4!)9` z4n`++U@$BOLqb~QPibjs1#0i@bu$dKv7Gh(?kDG*V7*>4ySOt)YMAvmR zGypbkPAws2bvdt-QG>w7p9fiyY@qF!bp5aOf&2C|Po00gxr6b{<)Pg~*Fh?UyO^L*tD>tr*xf2|d346HeaL>f!udht z?;id=!d2sfSF?pkB=uq~b%ay^U~jufEJao%8>p8mnV$iE0ix=4a%|-=cmMzZ07*qo IM6N<$g22O}VE_OC literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NF_32_32.png b/navit/xpm/country_NF_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..8707e5c1eb4f363cb869e63ac81a995f202c071a GIT binary patch literal 761 zcmVh%{uLDl%yv4;`<)p|wQ}PDPnX6~fPm9a zs*q_sz#^Kd*JWlStE{K?bOUr%kc!H)i%HZC(6s{5+&+PJH$lmb)M{g5 zOMfBi0vyOWQpGHxL;_S3+vx~Xy9W^Wu|J^2GwsAIQU zDOSo9t1^?DGmQhhUZ3V`JkH)h4zJycD2RNHZZrmJJO!yrR-fYg&Vz!+;KtVw?iLC5LIgpEt_6*>2I2e>%z_I@} z#sSg8ef$nLoo!a4hdI6{B80OUqWJ<};%k}#nr}iyQTY^JVLH6Wkhh0!M?0>z3PGuZ zx>D5)(7XbPLW#X?Y$$d@t{D@9EJO*Igdx=~e;J7=#l z9|^G-3nQS?VzyAORmsRnY#NWECV7&#+zV`?m3tR%XicLZ;I(^nPxh}c)E59$o7ouw+_SV%4HDo z0*^AJ3M?l>q_V0^gj|8RmL#IC$VA8$SV}CTX45heas`IxC%EpvEfXPEAeGgKrDHM? z@&rcwW87O=q@b8&ApnU25p{*>kdKl3w>a+|l7*2c5J)UD9}hDVnPxmNE(?RS`d**E zL5sTe6cjd`AH?ZBYqS%@!-MgbB8b~W{2F`7AcrJp4=M@H8e4+i<<(wCx9 zfCPchM@}=k;N$uAtt=*DXgVD1-h)9g@xj1x(KzvAAf8qUB$K4FDlN_m`hDZ{`);FV zbw2JrC>kfW0(xF2kO=YGwjI=#R$()nX>nDO(sj00*U(qVtl1bVsDwqf_^Wje?NNP!uNU;K^$NM-teHm5P7+YLmDioyJZf7YO!)>)uVzx0A zniYu@E3n2dMRLsHtOU zZVn1rY^FajZ}z-IU76U)Oz2lAnN``{v+?kL1o)w7{+d?}VyRa7(acX=JqX80HmZ|UzzHo$ctBp-n z8!?;AWO5lSMlp*Vp#neLzChp9Wn!5WuW#SYxv4v3^c+t$cnBu*OorwuHkk;E~_1vy#{YMh{IyWQEVY4aD^sJz#E>Sv$mZV+dAoO z?V!?XrM%d}mH9cozcY-z2udu)49?skzpDN4e-2>+5j8?hX$6;NC-`=Jn4p?wbRj^q zvlLA);3;>p-sNG(+Ae6D^;bH zBG6(44s^dvAQ8qJo?~NG9p|Qg;fy!RnaLXu?lBvUG&^f>7n@0DlV~|j$Xp;qz@Qi? zw^~VLRNf!>hLoP8P$yPf~NiL3yq*$n%(KFupzp2Z(q z=8Mrj*1H-xy7w&%iU9?MF3)CBNI;;#;hudQ?%DU3Yv+AqIIN`@6{9H3-$ME+Wj3!% z%`aUbt!q;AOBaY|9^+$HfLKQCF2utjRlr_k!l1|<15!`mj_!S1W_sZNet~CR&4rvJ|OkCefs5=X8XGTfBye|KmWhwY&Dsd&dml2ji1lw8x(BXq{wZ!K*Qqe z6RlCs-Pepi4+S6D6+8P)!n;y z6}#86z_nbx$b#iw%e7%y0m0BgiVz_MNQ6KrsiY^QXVNB<>2vmvte~ruz`Z$VeDe7x z&yzW4&i8jd&->1tci#6Lfn^g#dYP1m-_DyBH9E1kk9#E!m7dC<_W4r@y?tCoZy&Ia zpVKEmV)_I~j8h9}>TJYfH%lGkhHz>D7usvl8FW&|xFMWcfZ1+C*VQI-Suyo#spIt+rxTD~o{8CRWZ}@MtW4j=_hs2c`1ms= z@@A={T^CN*1x5OWQr=p}M<;gEWpfbh;Yok5AWl@Dz~-rW z%Sofb(81t@eD$J0!a)C#%yyC=IusaV;!#_PG&>SHmRfb2&d?RlF#mBZT5E7%zT=R z$}HAqe~ZmwrpsbsXiyN3jh#hJdo_j4<=h@SQR=uo!YNw7cg08f;X)O2HoOd|Sa;ul z(cGzHptle1Y7HlAOL-^rd$#1A=kc8{VRcxgj(p8Hg@DiIuV!-iP+E*;mZfar#r^M+ z6g`2w#(Io4BNn@riD6OLL>0+-d3>DpwbYTX8K>xi03IDPn>JGuM=GnysH!2eW&?r< zcMTqai&8;Wbrl{i3dV*;V6=5f9rv1%eGBL?b@0^gS9ogAYE*)P|CpRaT!1$=J6Ij? zN%m1v%g^%Yn3=QnmvmA|5!JoE2M@D&;)bX#1>|21rV&HUrIYl}nMY<}g+FN=3 z_6OOPm%-+|Gfa&LWBHVS;ZWHr9@_FM*);?E}y%`!bh_s4w z0B(yM%%>-|66qI;RxOZPUO{TbONgTKAA5BFbx{h84jCa)>T5^#UC@z=AK04L-Ic`p zd689}$HL*WPzg$`4hNzj5ar`RwBM!aDS`rK4^Bix{$oS37ZBw?h`-KU!u*6d26%h& z#*D|=m7j*eYGO>tAZ`sEz|5H8)att@=?V&XdCHx9z3>CHYB!0~UmaO@LG}7NrhfVe zEhY<}&3%TWl_{(|{4w_rzmux=CN}1t!tM~stg5}ZkLZ9c=d!5lc!8;rw{rjRxe``z zb!6QFf;@w{f7m3vG_E|c=Y94S7c(vT7IJEfsBW$1j+l5v@s}m!HtF~{JBvT%jo;0qiZx$5pLhdUP~@7&(*(9}NIO z90=5l_HbFBZv=-!b{`E`Q{Qv3>YSLDVIgo0^T~dnWE+YesV0iyu&hfE31lFGXfuzVNZV3q^ zwW5sE_07M!|2=UDGs;QiSz5#l`n5fK4-E~k`r`)o2ava=uyFHQFqZCXVwLjogt zW7=E>dAorKT^2Lj^UwY4v3+m6EU%kSjZ=PXrzc>l2xH7Wt zg7y?1B;02JPmWuFn@XVBXd@F%p6d|X+4FQ-K9>QmHU%}nQL+Wxai;{_9uk`jomyDdz6zMl0@JieGyZMvQ z&yU2wegwI@Q>1HTXF(2oi!v}++L;wQnxmCPgm`;1J}j2Z>U`!Uj>hIN(ogHbs+o(J zpE#X;=hKMs55rUAdBsfSt#wUbh>B^N^@v6b@Je-xqLD2c`SC3 z^SU-R=APsItOEqPYpHB+rOjj{dEpvFQ9*7)3k!!$;cQ(Qv%Xxxij-}vKfP1xaxRN( zyC6{%DbZDOptP9JveS5W!rk<9)6ifrgD6nl(Fs7Xhn9QdlX!UhN{(Ns0bp(RZkoD` z%!o-~OlUlhjQzcorCbr&3JCWd#NLNKXIt(LzCN>$zou`)VEbi*Z84dcv;JjF_Dla8 z5){SwurLDMLwNY+2YNAe&ylTwJw*q&&~|}^!{^b`)xpv+3;F!yX7(2sqBCAP+W}fF zbK)X6R8~Qe&H%uvx)S!5oWot^!m9N3xT;;*y7+Bk{G+5Q=d#FF!1_}=*qVQikAB#T zzq=cu-hmV~*Ro>DTr#T)*j$i@=zv;%7uySpnG_a@$yP>nyMbCgfC9b6hQ8IxKo1Kg zy7E2&J>ipitN6Dur`dcig`I_2q*Yd6b3jq^4qlnIfGGb^-bmk%w?@gGu|p`;Rq@=U z1*impKkr`0XLpH*$P;?^L5JFDj7d$2-Bkz$*nKpL~T2I zi;d^@Z{WVfVfeTzX*1g~+C-L3eS~d!DWsGZfC%U6>(O*zLWIt(lxF3-hdvb+%U(t5IJ(~B(H^cbgV z^U12rXX)7aJbmjl08%Te88a{v5B1N7m>atsl(ib^@8QOyJJ+!8bOsugf`>;<`dDw5bVXz* zz)R!BgIm^MvMVTVsUy_Wmz1(few_2^uT^8T+v&1&{|4MtX z;U5zeBYnM@7(S}E%egAD6R=>|9P*n=dG*kCzAr5UL4==t3vzeS^8A>oh^Seeu^YR? z!NTFUl2>2Ok*c3h!WtSF#JhJbrOnjJgzyOjxcB;C=T(uFfEHs5yYjwe*_5ReG**(F zn*-v{KWMAkJ6N5ukFkTousQ4~1qDWniIerUzj!~DO2yI2v+OKPV{+vg4waqe%X{Bo zXmEUQm2_2PCE$VN7uZ`|#LmJ@68eP!IhWZ|LAz0p!D_?qfUiy;zxYagKR=d?m`r_V z3-$UI4wfFH(_&ytZYl@@O)|U1rECOP9afH1oCgth6y$NLw(R0-BZIvO^Bu^Jg6?&| z{oFm-y7+x=Tl*-Dooy_eaxb5p_>O{R9i^?UY|A@>kJgQWUV%I@?swSib|!|8rOn(% ze7|0QOw1LLjR3Vm&D?}B{Oxr2T7atdOZSA%sc%Pbxir_mu(^qw-djYA*@n?-=glKq zXzuEs6=AW7WY;wy-~dWlcP0x53j8%nOm-_ZFYd!rM&m-V5diS+>=o#Y&+zT}A`k_% zDuFv<%;)W37<-<2;kMYI5FA?Pz0l={S@|_j^BeD|^?Kg;4 zlY?DF#TWnA-$TXB*b&T%9nWirzGU%;X=Gn0VoQGax1z_#Eo55MB%YsG!9ZW* z1pMnQi-_ei7UicRRk??v*b04V{leba3E&I$QEzLaA_YQ~x0Vg!zR_ znEd*XodAHOm?V;7k}mtYLbx=Fu2v{;bCLgQ$jc$i-vfGzGpq-`98NF5Y_rp8?vy&l zb>s8`L_tBjxkKt0*NxK)Kol^To%c~z&MyEk*_`)*p1%nJ9Tw-gLDN6;n-HKk^$C!a z4zoe(2-nSTLx8DIfTVPoowo~;#CH(f)9d!}00000NkvXXu0mjf DFp}-E literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NG.svgz b/navit/xpm/country_NG.svgz new file mode 100644 index 0000000000000000000000000000000000000000..b476d20ceced68cfd5ce10365b43e25f548aae06 GIT binary patch literal 261 zcmV+g0s8(QiwFoLD0)Z&17mM>Zgg^aUrt9Zb9QF{eU3|O!!Qtp@BS6r?YUYhrVoOZ zK>=B9HvBl-?Kht zovUf-)S)qZPf<&QHgXjGgkU;oj46Y8tkZgV0iSTr2RWX%6$ri2p^Ly4` z$IWPoPgd2tuG+0kT{@#;3}mj{hyS?BSS#_G^N0J}m_UD-$pz;0d;Wo|aYi^BYR{5y Lj?x8$YXJZNJ;!*z literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NG_16_16.png b/navit/xpm/country_NG_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d0a711bfe30e5c55e84ba8eb04ec3484199e457f GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^yo-U3d z8WWRKGWb&*m{v1;Ih*J_yklzK*Pi#nE$qM%2PKKC2CEWZWH2x^iL?E1ZmQl5)WzWG L>gTe~DWM4fpQ0i! literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NG_32_32.png b/navit/xpm/country_NG_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..4cce6c12773066dc6528204d0640d56608ed843a GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&+7JzX3_ zJUWw8GWb&t@H&~U31gk|AW&f2!t}4b$rU074<|0>lGvJXr74ixO&6W9f|bE}4!eZd S6r*CGQ4F50elF{r5}E*amMVV$ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NG_48_48.png b/navit/xpm/country_NG_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e629e59138cb370ce659e810aa67dc43df859e GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H+rsp(y~#X0JU%=Y2OdlTsFVdQ I&MBb@0AqC_IsgCw literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NG_96_96.png b/navit/xpm/country_NG_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..224d6000b64d9f0defac4b499c11ebf819b56b70 GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt_SJY5_^ zD(1YsU?|vNz;NJzSo;Dt_62O+3J;g-#l$(Zohf{qy!3m`v~SOAb>8NCzqY@ikRf2g mA;rSm#OBz%z;V!X53)OcXPI%bpUV*FTLw>8KbLh*2~7aMqgo~a literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NI.svgz b/navit/xpm/country_NI.svgz new file mode 100644 index 0000000000000000000000000000000000000000..9b7758eaa802c0038d23706be352aaabc2dfdaee GIT binary patch literal 13230 zcmV;fGf~VRiwFoKD0)Z&17mM>Zgg^aUrtFbb9QF{>|AS)TSs#Ju3y2Wzu3s|vfmF` z(!xvGfq~hLVQaGqg213=IHQT@1rBA|{`EPh`ab%Slr*wLdlSpRu2^;Zc30QCs{78P zKmT-fIr(w5zPq@&emvEUnod^NCpV`T*XNI?e}DGXEKMhOo8|TC^77_-^>})HGyU_E z2ao>r^xqcG{_~qJCwD)dPrmv4Uyi?COs2E>{2z8PpFe%}bn@N5|LepkrBzmLKL7G> z(+ATRo6YUR`TW(ZSIsNi+^o;%&%T{=%>3Ig7c;yt>tDbObIhz&bGkX5KKQQ(lShC0 z;@Pv~ufKc76(39{Ap836;ZK(r*FQ`aPrrEf#pIK(zW$FdpHB8HqjS!489IIP;J-=z zY&Kb}SIf=nbn@zA^J4NHHhhc!O+Kw(ziYA0$<5V#`q^YQd-90;eX+VYf3bNybvZOD zn4G|)i_^zbJo65}2X;;|{pse#<7qO!@mYE8r<0!^PgSGZ|E6UpkN1!bZYXkLT5tC8 zoA)>Qc{KSGaO%<3YO_3DZk7Z9u20V%e*5&RcG8oRVaC<-X1%(*dAUAW$-E~g^KR|a zVc6}<^`$&MJ(;gAS68d+&D~r#x*v-LUQ4Aib7N*0F}wTudb9j#c76BBv=9c;PEH>F z<7WNCgd{GX-@F8m`-gaZdh&2{vAJA5`P;?Ga=ko%xqLM5aid|UtGko+#q9=Ccp_tJ z#AxK*%jf^II@t`!mP3D8p4Ye*dwGHB+8=wLzP!GGQhk5Du}Nitg!OVD&PzeK5Ay zpKn(p;Lfq^bt9)IR~H;P|88?}dHFSGp3bX@K>6jx$?E#tm(@dUK0kvVJ^aMm6wjOh zv-Qi%)x*_~tLvN7)6c7#D)`Uf7FtdFb;O$bRHX{8&dviYpF#csuz+-Pq3iHN-VbY^UWY%aQ^ znQg%A=+kQEKO2&j+a(f5%<WYT!dFf>We}_Y=V`t2FZZ9D>=yDxDjxT?|JvZyd6?sE=kE+F_cgKdbEdkh`so zSaz$_{S|J{Zd(i3x7*lQqr5qqxe!4KG-C$UaIsOT-fgQLLFd|cS3DqpteJRE{W9EO z(2e(Q;#_L1P1W{-a^vk?qmX*--g;5*Zgu_|Qc?ptCq6(3CX)LqHZD5+3ugsh*QA7l zk`i6xRRAd&Bso!p&}2RF4z%eJA@Q(;7*_b_*85%f!0VTx5v7E*SFd04Y|0YNTRwuX3$5Jxx6P&YDr zW(tQS#WxD(?E`qAgcMkr)x;RY(6Oo<)C1XU8-p<8Ep*g~fLi5g9d%8~VO@{`3moD> z%EAIrLixZ?Lx)@%izj_xN*>M6w?mna=521l>cp%pe)hVUrS@2=o^hN z-(hUdjg1�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

$|H+$7r>z03Qv>yy8!adobm#p?>QyJ%hS+ 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NI_16_16.png b/navit/xpm/country_NI_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..3734ff7909a828b76f66b130e242a4912aaadc5b GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt@&JzX3_ zEPCGtS#vQN3e+0kj4g8&JaUZtO{>k6biw|Fl}lT1+`Oq3vBr(Z^Gro!PwVZ@%lj(% z@3lYU*8cIYrFsG*gS~>o^5R=r2?ge2ohxQ}o|?qj>7sJmiH9$|nx*q#$(<(OsnwUG zD_Z$Zf0bK(mhoQcs#YiF9TEx8m9rE#XofQ0ZQ5R8r26aRpB!y|{MkGFX+10BoY>FVdQ&MBb@0K|k``v3p{ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NI_32_32.png b/navit/xpm/country_NI_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..bdc25a02f8dcb108f6f774f7dad67fc97addbae5 GIT binary patch literal 414 zcmV;P0b%}$P)!N4f*yoA@W0JZ%OErB-#Xsh$VPa3r zi3CI==y!gX&`#w62)rgba!J@jO9)4hT%g;2#_!kg`!&AaOC;=^1SLxVAPjoA-8TqZ zIGF-UjfpU7@5sHAy!?xbA|ms;60D6%fcRG&3&aAkz<&_<0l@Ns8gv^i1ONa407*qo IM6N<$f_$8@>;M1& literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NI_48_48.png b/navit/xpm/country_NI_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..11d96372fe79efed61f3cf94bf73cf6b73a1ec0f GIT binary patch literal 625 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$qWokYMw5R zAsLNtXIkf94v=V*H}~_rr6E3P3$Io$SJ#A7sZX}0C%St4VLsBIkjTiX_>n(i#sr4W z-lZH9IXkW>ISQJzHVQQb76>0N%#oLGWT!kczlwKlK5+|l_aGo*B`uZzvH z0Lw;O&Vqe=6nNS~_~!=ATUx{GQ`25>XK{@6X@xrszqPe{xjQbXdJ0`Fe8n2`-1O(C ze>3;(-+grP$!ML^iy|zWZfCFV3)Y{oiGRY(cqYq-clOR+b8jb~htbZ|BO+=GN_aag zSXdb5#&u_(OP-X{w!3+H$miu7mnaAd8n4{4$>*qW$HvR5400*Ew&YLGxV!3Oz&i#7 zT~C?cUcyuT6u6EbxyT^YpZ;1|uQlBB4Uhll={qm=d~^$l3aEY@9Hna<&UW*`$#%1s z=8X58<|pVMdcQxt_^oJm`|BGoE2mD(Vr4kwap8OHGb!J;m1v7;?T?Bp&Oc;}u71{feC2iAsBqNXD{dek)h)scbkQ s)cMA5@h5wwEoc5Uq+!MoP^6CO)2FM~?NuIc0j41aPgg&ebxsLQ09Y^`NB{r; literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NI_8_8.png b/navit/xpm/country_NI_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..f782b1be13a77b5af1e85744450f0f4b5f6e3772 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^7o-U3d z5>u0T^8SCC&&Z!}Nd4piAb6B?poZ&MV%m?h2R`(7KGYXBW(I=8|Nry+m;C?#KmYbe zw+?US;rTy9Vv7i`pqhg8_jmuz*~HY$M6@N+-~Fg$I`{K;dt>9oi4W~3iR$b=_utID j^jbX|TU-5+-%Jdmf0Zu&I_j_lXg`CetDnm{r-UW|MlehF literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NI_96_96.png b/navit/xpm/country_NI_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..09283f9aa9cae0bec0035c2c46f07f5de563d8b2 GIT binary patch literal 1589 zcmbuAdpOez7{`CZ+;^hHku^4=63wM_d-d-lYrx00iac?7hWv zKSxo1%Xvjtk8D9c+{4uwkp5ID{mDH50MDSDkNILB&a->sbs~Q!h%dZ@iBQd5s2zb% zRAkhZ!M$E@O*t}-dbOy_y!2aLlr|-}ms_xd9>yUPLFxdhWtx~gcGzcPS&?z8E{;{M zgyCVeiG=}22t(zHhkD?mqSV%)cM-yV8!-+>d>OsXF7)41*d>9YMzy6@&TFH}^Qh2wj`^i^<$uHW)Tt7^mMvy6; z;()weT|cQ!tukD;Dg3q}myyMm%R$yg1MEk~Sx#Sx&E4aavLXFy{~&OY^_p$2E%Vt1 zlEy~lwaDnF!gs-FI^j_p3B9jf%e#Z~XaTay_Y`8tcQ7(R@0TIla}C>L)1m-Qqv={_ zeELEjBhHB3bQ;Txj3FKrj`Ux%&foNn9cUG=w{ElJkdo7q)PRuT9*EstSnpu;$IBsp zSH4EZW&`~2k`XacsPiVK$5DbwxbHMI(7|jkJ=T~)5Q;?v8a7N~PY^VGB`$P){>LD{ zm}$ddh`pjMj#81Ar)uaHbaK*cz1bBGpQ@X@6Q^4mY=hdLvX4A*$%E!+tcwXp%cdA9 zh#7Pb*zELNduyLmT<>bIsD;58%>Y1j^<5| zMud4(XwqpM9v(GjV!h+SCA8-&(et=UQ483XgIV>zub@fSAF_n_We?POfwZdD7{=UL zphOT>@LOI${nAoG_*aV-?1HvDI)_wkrj3aimmK0Qg{Vln!a>mQ9|MWa;Vr+NBN+|y ztV+QM58AevJ(YH?e~aC+T=qIjHE=%bq@!A3MLC~0we$W|#GwDhD%a4%p*5fqAH;cG zJ&m)8Kr#MRLZ=?p_Ys4_3f|}oOYKV%pV=?FK+dolEGP?HRbq-)!sljz!CcQSi{TxX z9V%mny%gmAH#tNMAx+(UQIgS8bMhE}r0gLqg)+BZ ztVN>>$m8GovdjCG+=U>tt3IJ~r5Gk)O)0KOUsD9Mr(-B+H%U8{jN1%2ML$#SZS6^m zU!*`f$Ja-}XdayQWZB{pKT`){nYjN`%IY6tOI_OuNSbM&XSS1Mg7Ynw(x!Mk5}zlX z5=lUL{&(L$1}8G7VZ81;W~OWTJ0M7pPKGOdm%{dlu3Y|J#xjfj9ofHrpdm*~vc{3M z!-D~hZ}BX;SiS8_Pe_XP?#8S$X^aG)24xNeg$RY2od6D0B=F z{qTl5*SJz7YxxqvjaI%mS^K5JSn0&^#l*$*1GtH)7`5oMC@0QinNU0a0NNUx6LHJu zsI$QS&SAxYS5HY^_p)G-lg}nUG~nIpM`+w+XoPVt3jq}d-`wZdF9p4vG3dtMDC{q^ zbul1?d`_65B9es`Gw6yY=CD=N2Hwd~V;&9_m3gmXMwsMX(ll}dX>#jLzN?rK9Q54G z*-YnD`wZbEvjLx!syb|jT3%ltZ*5xv0p7E524na=-9%jGY2zP))C^W9!&8;}u^W|W zDoWf_Wg;`(n5#Ztadq?bUr;Rgh53(~8(Y`;JSA(3py`pz3NG)5D6D)!2b)pE}&Ch7&G<2&60Mv0W=W54u>Hh)8iu6DL literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NL.svgz b/navit/xpm/country_NL.svgz new file mode 100644 index 0000000000000000000000000000000000000000..cefb48d9eb4c97bd4b26062f5b7faf3bfab98013 GIT binary patch literal 337 zcmV-X0j~ZZiwFoJD0)Z&17mM>Zgg^aUrtOeb9QF{ZIIDx!Y~lVpDXx3+-}b{Nfpu2 zD6?7_3@1!C_B6UCHi0gcCNu88Un>kmeK|Pp`+oP`#na<=2?tqQT^WunqzKaFmC&Z( zxZR|^5rTD@5m{Lo$4+X5Zv*)J-ut&&yKOtnknZxVb5?IIx zS*)Lg|zu3Ewciu9XKUnC7W88&CNC@ zr)jqX0C6pI2U>8frTDb2)_aM;PM0Oe`^N=Kq7erFNzQU0x%7LboxCKZX?n{(K=|bt jT|>UgpDRYh2E)Zd%arGz6?Ndp|Nr%~q71$~PPoz($lcb!s&i9! tc1HHWZ-=*MWF5TF-yF#8rYpfD#=xMS$8m#4b1%pd44$rjF6*2UngEr6G6?_x literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NL_48_48.png b/navit/xpm/country_NL_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..b61677368a5640ef304ba22946c14c4c9d253337 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H!eUnm_oNBh(}PN$mt4%?uVS$}TD|t-$u)dGj5{P;c$C-#n>!qj zCgTe~DWM4f D7~VOP literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NL_8_8.png b/navit/xpm/country_NL_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..1842b95030302a869824f705183eff935ceebfa0 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_cZPZ!4! zj+x0Z>WdFH@ERnFrY0mLO#JrofY!ku|Nqwu^`6SR*%F)d`(gAFNmhpXSdJAIPkohv P8W}uY{an^LB{Ts5sCg#{ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NL_96_96.png b/navit/xpm/country_NL_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..ef5053564fcb9525fd2dfd9b573d4b6395661884 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt^HJY5_^ zD(1YsWGHypfPuyFw8fnr+><77PY;+PSg~$OS1gOYx&6QE&mY{~S#{tY3l|e>W0Qm9 z0)+qp4Gs~axe~?au1arv=18(es4cC9_4TXGbIvxCVK>AGe#3>V^XGZ&Edu(P!PC{x JWt~$(69AJMRFVJy literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NO.svgz b/navit/xpm/country_NO.svgz new file mode 100644 index 0000000000000000000000000000000000000000..878b214cc91ea1b2660d556209df3b4346f2e759 GIT binary patch literal 282 zcmV+#0pZgg^aUrtXhb9QF{jgZkw!!Q(v@B0+-c)gyaMJdvB zU^|8&I&dmp)+T8KH62Y{x3@PHWYbmj?i~2P|2s)K-@UbDD|@Ru!-0hqh%{9vw5d6~ zJ2gvySXUZRww;k2_R_*U3(~XVK3~7A7Q}9AvUnzLpa1?*Vnl0%T1#zi#~{B&_n3U7z>3H;1y%Dzs^`bfk%|mF%HMaGa!Q& zuJJRY{w0mnb>lcBe#ruo_Of!nCy3H*%i&zA=rt06KZ)oB*l~!DK&8|v_1*K?vHuS? gDZ4mOlt#&A@|TZ&`6kJ9{J|{v05fzdg#`it09*5fw*UYD literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NO_16_16.png b/navit/xpm/country_NO_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f41c60918bd036fac4dee42b92a47bb1439fd7e1 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`fo-U3d z8WWRi)~`Lyz#Jo+yGgb^>F*iocW?d`zmZ@zJJ1p;!Y{!m6~VGD#!2vn#gPLC4j5;% z>GAgPNJ(xf6*^oWqL3CFb!X=@`@9369NqcX&0M{h_t1|?(+s69doVEk>v2@O)NwW( PXcdE}tDnm{r-UW|HH$kl literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NO_32_32.png b/navit/xpm/country_NO_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..24e15b1fd94609304dd1911deef40764cf9613bd GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&*AJzX3_ zJUWwW)~`L?z`G$L^5dCV3*|2qy?hqT#?~h8ZpCW0{{Owp-JynZ2V7RQ1#-LTN^DI~ zi8`QE@Kk7`*G=I^K;*f#;h9}R%7qgPR)_zW2{7k8{SK$vqJ>!P{+jy?KqncEu)bLCC~X;)1~JrVnypK n|7Ohp{Oe;eizYIB)|7Qiz literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NO_8_8.png b/navit/xpm/country_NO_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9becd94bd5877d02f2345a700c2284a07102b6eb GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_b^PZ!4! zj+x0d>(`z>aKJ!&n^XJO=~wsIu}LH(9bhc*GPve{@63S%1#kY?77E&>MhYsG1e`Bo Y=!)S_oV|PH51zopr08+^-p8x;= literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NO_96_96.png b/navit/xpm/country_NO_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..da065743971cae85f71094eda539db6223291d88 GIT binary patch literal 405 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlHoy*ynU zLn`LHy|dS|IZ&kGp^LNCLCvN|=b65RNgg@nClG!?@Cc_$s8k_$A^%#PoTQ1zoN9ty zgdSF|imr*_(_jAg-G{d?Qa0FCZ$5taWJ=|}>WY24=KlS0^YY)PKW{$#^v803ea!te zg>7GN-TcCE+i!tFfPe;v2n!bzYh#mxBdJ`8xBK_ylr?=Uv6|;+Zhcrk2WDF9!v_zN zE*s~VN@Fp*^n+a literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NP.svgz b/navit/xpm/country_NP.svgz new file mode 100644 index 0000000000000000000000000000000000000000..a511b5bf5c173f89ab6e086a0e734e27dfecec8f GIT binary patch literal 841 zcmV-P1GfAhiwFoID0)Z&17mM>Zgg^aUrtaib9QF{wN_0}+dvS#SL%OQmJ5+$dv^94 z#YJk1)B~hcMXh>_f=OJAjch}pzrN!*hCmD@NIhk}v-{qgnYW{i4sI_qc9WD#O}JS}YdfLWV^-i-h++T1Hn#`wk%h zL`2R>1Y>M;mYi4ZviX{3>D9@kp0o6fE+^SlQVM<_ZcdcRwC;rKHQh}PjbNnTyO^Wk z(F1JM;l9X(Z)1WNm`2ey0)_fz(!^aV-&sP62q@krHSZ zEQtQ3kH+h~GggvHJxP1o({DUV1Twj zqV!;;lLNlQKRsTs2g^x+x*`9`#^V z^eWBwPSQx20h<<8w>;WEul5~O!AcwE&j5me9pQ8atH zvjNw3rU%g24M|V%Ho?pWSnIPu48`ElSew1Vy1MU~bk=pDP*QqF9i`4%XN6QN=l*2l zZN00?$=!3_#lF}h@6v&L@1k~2cu-mZY6NRg(hLkK2~Qz3=sXxwO_OwKT|uMIkY~|p zdY%?(4ocrTcMGT|_QVH!((-5=jbCZcWhOmuz`@(x)z+>D(ZjahQqMuj4XD@OHPCCz Tb}@?D|2BUCSA9(K6A1tSFd&>q literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NP_16_16.png b/navit/xpm/country_NP_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..4e9dd1dfd3a9db6d5d8c4d78e55b0fe0ac9d15da GIT binary patch literal 647 zcmV;20(kw2P)CK7XQv$_zCrrYcG?(M2U+A4c) zpL2fa|2zkbeefsOnfvJ+c~JfX!1~ z5a1SLNCoGROQ(@br;!SM1Q%HX04M~W3@-b3x2y%;!QpA%3gmx5T2lc@sR0lKaG#<` zg~Hojd&=(T`!p_3a)!GI^yYp63eC8+=8IH9x2Dk_QITH@AEIo4#8&Ung0s!z; htjJ8uO@0*9)*nfm(gn{%y(0hs002ovPDHLkV1i!pB-H=_ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NP_32_32.png b/navit/xpm/country_NP_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..5bb3d28095126407c1a9854ae33c8ebc6b7c1759 GIT binary patch literal 1446 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NP_8_8.png b/navit/xpm/country_NP_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..1bdcc0d5f42a630309c8eb18d65cc13678296e8f GIT binary patch literal 311 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NR.svgz b/navit/xpm/country_NR.svgz new file mode 100644 index 0000000000000000000000000000000000000000..2d5fe618adc5bc83510541660b1b98d92302d2e4 GIT binary patch literal 699 zcmV;s0z~~EiwFoID0)Z&17mM>Zgg^aUrtgkb9QF{%~f4b+b|S;@2~K@7m$cQ6FUwK zNGohYVjE&*(;h?Pwi#_wC8mY_`q^pPB&^c37et=ybFYujJ=b=I=TFN8SnIONiadrC z5eRfXDbg&T#qe(Y(F-A{Op>R`qR4d&^8%iq4TkS7zK+H}Z!ST#o`IXY57$>C06mO< z@Daur;|uWZ`zK)8Fuwc(2XJo8D#CcP*`N(aMLEOcTg(Wd`1W$-*<8;}h$6mQj4df8 zC^ac`TX`NBl{zsx1)I#w!BzfHO_G%cM;+R%0c-MO;CXhXr5OMKY=wChAJAa;ByKOb z&x)QFmgrC}RZ8JHT4(nhtCz=+AhP{x;Q1x6$x<_qp&$)hgL9qD<|c-`hh}LEod>pj z0EVfaRu0|bZpIDUDGN{+vVwf_Yx4P?qBuck%0jNvjd zW%hJL8=jLLUpv@`Jj+~-#u}UVHd5-AL zvMpRbE_9^VIxo`nv@&J!prhQL!)EN&Rkw>)W*4xH()Kt+_m8HB{VK9NT4qLCn~((ec5ew*BN~E<42QQzV6yvaiAS5$A;RzFy1VQ$M8r z+Wdn)baFeMwY*(_TMgY_w0gUJYisNF_`rGi4PNCcP3!M1UnO^UXu!#Tzg&&~|9ZJZ h)5%w|dm^ZQ>n|6Ra{Hqgx}V(H;1732gJtXo006J^Rt*3E literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NR_16_16.png b/navit/xpm/country_NR_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..1b27346cf7582665e885b206b6af891b18d3ad5f GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^-o-U3d z8WWRKF04yeU^SSyq-sf4Lgd_y^L?ZxBs(u1;OMsy_f}bXY(;NQ( zpa1Z{O7{AH|CHA>&YtWWG)4T-j~`Fj6M5tJ|F^3DYuVyBW%9p2f5R;k-~a#r|Ko1< pg^i7k58pj5|1s5x;iMot!xc^SC#H3KmjYeD;OXk;vd$@?2>?6HvHo9T!t%F4pTz`*eP&p#?yu=xddS^+j{xfg~wF3fR%+=Pfh&a zzyE*#{nJwuXJuig&;n)#F$ZKmCp+toBX>M(R9?UT7F@9E@4x@Q|4@{c7%^LRx~k%$ zLR|mDVp!^Y`ETPv0pw8UluX cg+p@-0NdGRpmpd%c>n+a07*qoM6N<$g4Wl%qyPW_ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NR_48_48.png b/navit/xpm/country_NR_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..ffc760db3227e4434117b1d557d73662ea35f98b GIT binary patch literal 530 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NZ.svgz b/navit/xpm/country_NZ.svgz new file mode 100644 index 0000000000000000000000000000000000000000..e00fdc9b2ffc739a42061e71e78b285529183b4d GIT binary patch literal 1102 zcmV-U1hM-ciwFoKD0)Z&17mM>Zgg^aUrt&sb9QF{%~soP<2Dd|Uts@X%Dg0iMDZf( z64+Vf(rp*mZG&P_VEYm%Hf;-$MMF~TWWT;cN^&H}+Y4G0g<+GN8P1$J!y!F+_p~lx ztE)OU<&<#B2-Hnh&a=XldP+(|-d((XGx_f3=j+d3Zoh|myR>T@hPya{`>fWtm09Ek zZd*JS1p#zj*5`UVC99^{oCm>fx1&2rO|=XJV?00uUvG8U)V=Xjk(Uq0?0K4|fzx)T z-*CzTghpUf=~`D?eOYhxtobEtax*1QpYr(^{K8u6hQL>2)|ch{Hp3Lw*|N+R&*beJ z0LbT4^1jHHcV=<-liuC^rn3SmX_ebt@2QJDm@3}4!W>#Up#7r+4)1)OPBsED;rZ1XsWEN7p7XzgrW<+0$<{y$23s-PTMO7I)AkDV52|U=`35Yy23l68nCiIS0C^kVQah7 z)SjMh#oi4r#)+H$Ho76*Qhvd#OF8As=5#m&IoF UpC&O0+JCRV1F8p98ubbQ006NYu>b%7 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NZ_16_16.png b/navit/xpm/country_NZ_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0c04a9953510701d4e7c4f61be8ce93cfaafd4b8 GIT binary patch literal 441 zcmV;q0Y?6bP)0QyU~pgmw$f1|Ux!^{@$G>qN zxNsY;!c0Z*|9^(lci%&}j8~1_A*_F&zcMf|F!6FjxY{4hAdDCz;r|T(m!5kEwSh%| z55oHM?;isL1Dwn75lXMP_@04*fsv8%|Ns9C3=AyU(%ucxx>{dfzPR&*jh$6QO@8yO zFALAUV|aL%fq{XImHF52zYGivb}A$({xP@l1m=YV(cv00000NkvXXu0mjfr%%)w literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NZ_32_32.png b/navit/xpm/country_NZ_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..559e7d5307a245140c7020caa9db633c2822d38e GIT binary patch literal 904 zcmV;319$w1P)x%z3baa9s_NO=}#F*0Zd=7-FiK3VP~FwQM?5%MG(`u^)y9Nqe(KIfq{W3huQes z-G?uGrgs-Q)MwgYs)+Z|?tFWY&(c^lB|5!rH>nmd-}$0@OIqFi`@qdYhJB)1rW#^3PxkUTS_wx7XLRnHyXHJrQy3W;aazD2WPj(;dlWmEm?Taf zW?*3W>*1bsW<8&Sm2gaOM#tVcYtG>^MP8DRpNH+^mtR=y-hK2Age5G%rNQ`xiJgsI zLH3qg1Oo$u!n}S4Mn+ai@f#1`J$>~FqRcgZA(|0foUFY;N(>B)#p~{V`~DkEmPKXm zG&tuajPdi~69xu`XN`RjE++$n3PKAvni1c=|CWFK5W>Lp0n3L?J8}4%0lSny5T@7} zUb+AO85kIDVX*+0=_G;f9S?Cyu?WY7Vv2s;vWJ0zf#1gki;hiyF~vTA{RwBYvM~St zgHXeA!X*U4(oz=DQWE)b>nI~J$uWjr}-p@(9} z(U*TKFQP;eOKq~{>p9E5-@aeQWxnIcO^i@wn7;fB4+m>Ue!{;WGwW_2Tf`s$5nput zxsIa3iA^Yl>&^S`(6lqXS+Mf!wc9z&#_RTCF&zTB=N~WV*(Xt)!KtbU7kvMhIsd6B zo>B+`7#UP*@vEQ^FwxZXQ45BV1&oZ0xY8?iEKro@SCHbPl?7tL+?meunJ)5T!swM9 z163-VcOSkxKRU<2z)Lal@V literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NZ_48_48.png b/navit/xpm/country_NZ_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..2e17818620c1a2c61c211a95423caf5a4e9b3045 GIT binary patch literal 1165 zcmV;81akX{P)BpX-l7ftCU**R^x9fOSAB(I{xlLY*$dQJGA) zNnD&vLrO;sP3@Mbx5aEGYSV3Hq**HG93gQ!w401U1ePoDerzKF}%mjBu-p($^zuB-d zG)OQ_N^AgtB{^Yq8*z6F&JplWVjHU!_tP0xSzgel$Qo;SUDUWstWz)e11S^Qf)Al) zgY$ipQ*Ywt3eV`Dq3lz&LUvl2=hE&+wJHgw33+^*n>te^#OduHtp%`{4Xy?)0El(! z_5+&$;Nx>YFJ*IL1AknDp<0z#rw)01%4UnTXElqwql zxL1-L1{fKeq9wGHQ*gu{4cz6OdT0%Q5fDltguI7=Yd50bp^UN;vWf27Pf~sLS^4ff z9{}JJeEcl&(;0#DNBe1#a?tLG9C*4f&0M=qk|gIsuT7gb00?q%VjX!B>0ep;w=WaR zgTk%kfxeoIFd!9Q_{n3el-SVWm*PhTiyx+paVQfhftSwJ;Xg(WW@bbGzR=8Uh}QHOnhktuezY3$__*18r{3f;9A9*r>HJB?U~j!jZdQdIEP%jGqT<8Rhi z2nFeh^WE4bD6y<0B(70DF z;nA7x4xvbI#2*}a?$jt{Z(_0b3~$}rH9s8?>(nCEOL5h%>y!1z`mT&jCo6xvTDY>bkYE862SeK+0C+5)9R}#7 ziZRq7%b}`0Y+DoC_W7YI@+2E_D;W^_Zs7Nwi@z;Q2kO4^d#4GuV^J8oWup$yLirj1 zuwNxuCC0*#PzH}X_`u@`0=$dgkngD(TA)c$!CY`209J6><8B{GlA#U}uICB)AAhN7 fvMfZ!e@^I6+`18d`nVh`00000NkvXXu0mjft*TqECyt&xaqwg3#Ho#q56``x|NsBL

YA+cvO|27o-&+%1d@Rckb>1I#&8f$n1P MboFyt=akR{0L>9vX#fBK literal 0 HcmV?d00001 diff --git a/navit/xpm/country_NZ_96_96.png b/navit/xpm/country_NZ_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..0c9dad65c640a16772beac29d3d39839f0d2c250 GIT binary patch literal 2174 zcmbW3_dnYU7stN{iYlcoHEL7)DXO)qG)7_+Emc=Fs8I>M#`UNXqeiSyyJm^m#;#FU zh|#KDQY)1Pp@`LpST(Nu4?I6SuXE1l^YeNC@Hr>m%F=|JQ-~7)0B(pW*yhY(|IRt) zGxa{4dvRuLE@mcR;Pl^mi>pWnfOF~)u))Ki{EhrDD}E0le9;rb2;L6nczLl%(_fsN z<`=aXMAv8K81Z1Wukfc(^7HzlWZ!nVcF{{VrwTSM2p>*y9MO-t;V7)7u<`}2ldq= zrsqm}VDk1)Jesv5*m?`}UiDcDo$Nd!tIEGvN1uAjXVC<-=NocR{#!l{f|~DC<^A&x zfxGq9x~n-cmg^rPh2cCoyU)e2&h~B4K>CnahM)YDj@>{Rxo|oyCS_Lshbht8?vd=| z`do1516Fo`;Iz>y6#+JS=ufe;6qR2Z=i+vIj=2&BdE@bw85p2KmqwtQyMh`)l{QR- zHPi>pE;;}k=A8AN3DBjOzp~E+0p&Pi$16sMKHt*#ni%d&o77V>Em`SP^Y&vnJMe2O z_J#%J;`r;QdQdy#r+2I+660ZTkFyO3ahiw8SX$e?yA{rXww?e!QS;jKt0Hu*ZDBZd z(Z1QMxmJO_MhCRg##XrBl%?>=JmL@U5nH#@l0SQ)dWH|(m;;`$nAuHnrzEM(a0$!- z_$JIpIJ>CQZuHX@;i&He!zW3}-)oMHLE) zKsMsOdva^b>69U}#4}Ny!HxR}Na!L1{(7pmKso-DI_y#f9+Iv=Rev64BQlP|b!MD) z85O&5W#B)Wx;EjeZBNLf(sF@t8dR3%lt*&C)(H~mU-(sND$60@z?BnCxgA*FeBJA} zCQv7;YrnrtcT(+=F8;!B$#ni;=D$*Vi|26cI6#I#?x zt|Mq=QVedr;Uxh1C8a%?BU&pvNS9myzV7Ce{sI}LPbc! zg!tS;)2;M|> zeNwR4ZcO)?Z8!6$nE0YHb@gIcmN3^nhtv92UMQ8Uj6*+u_~^UVE9_bx=0I>#22i$; z+?14rbh#OR10ePw2F3R*H--9l_ktbbHi9ZvOa=!+Q0cubq?~N=4bis~v5*knamzt` z=_Bp78iW0+5Ay%DQ+Th)gja`6)~ehWZgTXzo)^29a_wif*|@^w(pC`i;OnZY6Y&Gq z>Y=*YPwzoC9yiu*edXv`8Zw1z@y^W;v z97i|uoF$o`BxvyHnTW!l-gP&XS?_&+vw<`*<4mAA5no}ZdtYbLwkXxjyejLdR^Ozy zC;T|U589k_r;rZTi=lTB%i6hqQj%k>M)h{ip^2c z{hq(#&ghh4A{Z#=6G3B%1{d-d3L$pR?P>C`RAI@&vRGTx|+nlJnPIC7LT>&X@G7#5J~w~Tk!jD(3GIUS?}nd|6ZGmD~ZNL}F& zJdYDc@Ydbu20m&)wCEjX!AV~vJD}0Tz@Adr4Mu0?Coszg^1kGUo@`zxo473i|0g8K zaHB?!Jf?oodaV}iQouF{*Vd(0l|>I)v^rYfR}Qm?Q$N}fuLUth>;|RNW*CbNXF{Y{ zoaf)RNS!j<3EWE?#F22_*#gXOckL;+uuM?^4_BXB2S>NB`Bi>oQzfWpZaK?Rq%Q|K z8(p0>%=fL|w>P1CSSAjb`&p$-#gGEZcdU4s8w|6Enu_~Ig;YY~Ve@y{IKpw*UaI4j zsx_f!X{j%w95?IBPjz#~uxmmAANyhvNq5{ow_xn2ND>KWDU~NadGUX;-WQvoKIXi4 SGUj{sPyi4kOK^=LEb1QvQ707u literal 0 HcmV?d00001 diff --git a/navit/xpm/country_OM.svgz b/navit/xpm/country_OM.svgz new file mode 100644 index 0000000000000000000000000000000000000000..e583497830b7bd035b914c639767539f78482ac2 GIT binary patch literal 10171 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 Imf&Fj50seOivR!s literal 0 HcmV?d00001 diff --git a/navit/xpm/country_OM_16_16.png b/navit/xpm/country_OM_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd84e88f27dbbc19201ce3dbf68957a1ebfcefb GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^LJY5_^ zEPBsgu;n`BAkg-({920mrtl9;O`%!EjMCcuNzdo*XV{Wy0M* zrZRs%)BnZwUP7=y&|Cix*gBRo!p+z9GhuWu3Tbg22HgO)bU}#tF^4 z)TXI^yyg_j%P>c|jlu0eq}=UZt_k~2EUtRv{>A;j?1UQevf$s+8{#TN4gT>TW1qLO XMqb-7a@9HK~z|U?bNYL!$1_r@$X%e5-ZenaE}C}CFsyam;4DXjygzjaMi)V z(bd7hzraEN0>Pn^=p>{fVkyNz=p-F5`|#dzDvg^%#-w!J znICum-#9?tKmmRY${q|~K%~gNzW{kwVpPqC84no@Ah|UH(4&J2L!{qD?mMW(x{>Da zV*+w>h1%VR>)dCJD^?gD(Hh3x1@I~c0li1i z4mt?Q?h@o+&q#9^tsqU2qeHTX1bKUf>YQN!z}h-;b_(qa*lZaCl+%)s${SiI6!~!h90xY1|IFkytR%fRRI1kE&0;awK3$OqSuz+u| W21D^}TL3=*00009~ zPap`8Y!)e%!5So+gbwHj=0 z;4Lm=uFPm=>_}VSz(LGV2KoF22?Ati2UFRF;VkCpG0lt}X|+)J^f6Q`G(sU|4N~1j z=I3b4&uQlCN_z&Zhn&lk8aob^ADHhM#99dZdk##!Fxh_0TMJijVn;@i?GI4nuLQ&feF`7K`=_ zH1c4!wI%Q0A)`6CRD`#y&CQ^{UTp0dIDY}Qx8U2?XvLvn7#V|)TMF^I6CL6K z#C9*~Z=8TOPCy$cpp6sI#tCTS1hg4=fq#B%b>r~$BfZG6XA%okebb8^duHHU$O&lU p1hjDi+BgAioPah?K%0RV_zhvNd(du1^JbwCNb|Vl}zOEBv(`jhEczO2I|Hs$gc%s1d@BQt=2R{5ZKm7mi?u}Xrf0DDm y$S*HrV`EdRnZyGG1?{d;#gD@`L{00p(PnT~6$;2vJ-QWWID@CFpUXO@geCxpMmwGW literal 0 HcmV?d00001 diff --git a/navit/xpm/country_OM_96_96.png b/navit/xpm/country_OM_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..2965a97a753b2cf1d803cfd80801679ebdff8180 GIT binary patch literal 1327 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlITo_M-A zhE&XXd&fH`Bvs_V$NxJ&XIZ;ODYP+7WxaGmq04o`F)hW7r-Fk_R2H-eFuRDiNc0vu z-+0jUg3GzaEmlC;?9^gup`UZYd zUpBYe+IabQ`*N%A=ax*$%=$4+scWlzbkLdG`)?l=%wg8#+QKgJUZ=r`dqK_~8_qM`*PQ-!r?vCyiNl{KMs7~5%FX-vS)Xa2$79#~ zCm7q>IK*^XK7D%gRD1ft`1=?3-o3g0=~I?&se?O}`XysOHf0+h-jK!n<~Da?$L-I2 zM}$v2NGSVzYTBFgGYqx=hSG?-5)M|@2dp#VChnc%rP%q}aMpB338m-f#A;7yNPo3B zP+q2VUgvz=jPD$0vKbua#WmW04-agY=6B=&5Nz$U_Mo{=!_BV-tNH$CDErKA{J(Lp zh_TzP7mR%JN^kzLONl$DsxG;F;YQ2rmj~tZw2$^o4EvF)p-@}v;i|fC9iQZ>eNVoW ze)Wjt()%h}dtk+BX$P|$mv`$~J0E|mZGLaXAA0rX)N=19k=5tUy{9y_DTJs?Wg{WO!0fXdbJ~qm9=2!V|I4VM}~XEYu>9a`K=UWENfqB z#KZ4cU*GB8-}Z;G?x&=@zhk7(^?$N+Y#asJK0Fap5p(a8X}gzq=UzYOGxLK77*vFp z&b3kc#P;F+yFDLeLwp)KLw~HwQsMci=VImOd|dO#W0iLkWI6Bm{i${cH9dIEyukRK z^CZm^DHCQG)I4N*Q61vN%TrA8B*ut$cA zwd)&-(+jQ39pd>N6$HE;UT{qEd?D`;w$@YYo-_kX}p8eMT<9qkY?)rC3Hb=GM<I2=Ktj%q>Uyo6Ic`3efvHab9j;Vy4a&z>pFF!d-s=T zZA|ak(!|)*JNw}y*B|c}|8H}Se|)}ND5r{*>37A&h~6DfQ*O`Ruwmkv_T7mV=cV7D zduaccLvF_8zk4P~PX5DqN;@G?_+Iss>x-4+fBy(9;9EJrd$!R|4`sLLdz%-&sp?NS z*W40quAKf~r-pm$R+ehJ<8v*U*XQm`Eq(J~qP1zZ%2QiW!8^u{1<$`-G`DjI7oT}O zUUgfZ^S$%OThH5-&ITIv&-TESp1n1JX^c}M8B)a@X0irQh1vUye|BED@985+_m9S| qeZg22v~99zQnWj@%!fJlo4#Zgg^aUr<3Vb9QF{l~db}n=lZ4?taB|`m&J%wt-DZ z1X*d5-BqPtA~oBpj}|wh5{STsv|rybVb!A2O8bI6_L+0e%;4bmd@P_%>L#zs5QWVV zk}|5|yv#y;Iy_iDLZf9F%c3fi5X%a0H&?;y-N)_W>;4{^HiP}s-MhD2K#Q?2?v}CL zVF#Z+KZ39YWA`5rP-%TyGuCyT-MMyEXY8?-CzVGHBOo(CN@7GNgdOV`Ny0Fbxv~i- z(jCsZf#U_TJ{NiUZ3-w>s}<{S@y{{^LYK!{h3MT-$tuY+r9*T%1#O;mchxyW4jkMC zIG(W+Crz|@C}ajz3VT_~qYPMoXztR6mJISZMCw+Jplew+X;mNTAd*FL?aqh=00vY< z(W~GjwdzBSK;QR#&Y=~cxP1dZM>2yxM84`PFWa6k#4Mn|hfo8Jn?;7BQU l1b00gGYH>!{F~u_Zk%OrNBASHz`Tmh)i2DRWa8KZ000-I>iGZw literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PA_16_16.png b/navit/xpm/country_PA_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0d3ce82bb9bdc8c5037acbfdbef94d6c82f83197 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^jJY5_^ zG$tnh`TyUZ*{mS)g2-wM;jlm(hJ_Emy?(zvzFvJrBdgQi|KE-$KPqKoJ7yfZt0_jO z#gwCHr+28Kot!+S3rIB>u~->-E+b%2S)i6X(pjZXrS63=loauQqTO^(_(7y`SYd^pN$NR972Sz0nJh{-pM!9 kJA!%nJSn5;PXd@2j@GMaZ1wYe3Un`nr>mdKI;Vst039M`mjD0& literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PA_32_32.png b/navit/xpm/country_PA_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..364a6cd0ca0826258d73423db6b6786758cd6538 GIT binary patch literal 441 zcmV;q0Y?6bP)X}GVO$HdQ7TkXQ{m$#}G_+v*l@Hsm ze58s6ENJ}e&%Zr<_iN4Bw@i$Ts$v}SLTs9nT-3Bcf}hP}@{LFDeljpHJb3r>e6=1W zrZZp$ksue#*(zNI1_nk3hOpwt2e28LU&eh6{12y(IBdP#+N#^S&;5562K z(f;?JVej=%mP))7TEK`|RQ&w&kDY}HnSl(bP*lJT#WbA^FkFiYDgqY9jN>F}`2YSi zN$Q7w5DgIve%^cZ>;7XJTJU+-u}{0PCl*Qz%OAJy|9IKfJI+L1mUN4hwO6rzwq6tqyT(#%zw0#r;?GVvt)je*6JJ^?o9XF{)5 z>x=oi02LE@LYYqu0UkY=)lGfl>F1j-*A>Q!wKfBWv~7m*^U{ft%c;>V^RD02S5l)V z_iM#k8vqB2-`l4qcUsvvh}{l7oQ==KLS}t*BJ^N3?zRmf#26xh-%Az=sEi5lp_V%R zK|eMT;vDHUU4)LkP^s1#3aQWMCIL)ce^=4F(I9;){}Rhn24HDTAKBsEy=yywkJVO5 z?1I7n`t%3HhfE^lIC@{QAi<*U)1}XHx$-B`2YX_07*qo IM6N<$fkwJBRxUpNRF%$bZI$NfRINe{L~gSeYWOX4g=g4>X^_)78&qol`;+ E0R8DYtpET3 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PA_96_96.png b/navit/xpm/country_PA_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..3d744675e20207fe80eb3a2e8aba3e021c289496 GIT binary patch literal 1232 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlITT0LDH zLn`LHogJSO94c|({7c)nZtkhFMzPb^%=SHyC?0RHVs^gY;{z@n$Bqat>NF5mZODJX zZFuC2#32(Y=KPFDrv)k}oH-zNfnitaKS^z;O}7MJh;6pqe(~GAf4jf`Dlm_UyqW&q zcFA`2`|n@AF3;Ov^YiJv;`6!hm+o38Y;E|ecGVT#Cl57BnakK&85bxph_Ey?F$4%O za4|VJGH7rxfCcTEjxC#dV#}eWQ|>-cUZHPuU3}j2pi_At1WPQ1_6zkEYo?k@OxIF2 zoEfAyHHV$u(bBj7-&`Z6X98!1+cnEf)zU+4SHD^;yyxJn5$RCYb8C;w&GV<=+flU)|8ZYar>+4=XRb=N-~GH7d!N@n&1;`AJL!1b*Zo(cc7HP5eLJiF-G|v( zC*x+sH2b~b+4J$tuHU`;e&)RWc&_2*v^TAuj#DNHTQkcZWHMf%{KEF$&lv{4-9CpK zE_bQ^z9v0r9;e#Hd$zCVPSU8-iF=m3dFGs1-;d|`T~+Vlo~aQb^rd)Vum8c6pGm#} zC5f+NwjYc9Jt5n$vq?;HhoL*i$};cg-*RPc+>d#i)-s_{+Uc)BO5B7w7nLrr(y{q5(9--}W;uCLxheDVKFxV`>wwC_cTs1# ztv>&@cP}@|%RG6TD>wIJ-JZMkzqU)B?!C#H^^0-U>H1^Q%=41k9o~Fnm|E$`&#{~H z(EpzSz7lX!`{Ad5HK%QwU519hw@ld#6h7Kf83wjHXA=*WIx^ z|6DD`$MMsJ4kL?0OGV~?Kl;W^OGa_Zd1px`u1m#P&(h9tXiU}#6E5glx~})-%{lYV zF8$XLv0iO~!q4d&1U0%FMOj3a@WdN4RnBN$uqnRz(R2O3r9X<@uWA92vNC_HY12>R zzc){6Dqow_H7!KW_RqTId$+Fmm8yT@@;$Nr0<(TTdi~US)*P=GnO(mN-&)T-dP_0M z$MAkTdsf-rO`i-+cW?XI_r^RhhQ+aE!moMG_pWchmw)B<&!XD%j>S`11zj}OzOUT> zfalYe?bqb3UC!(~pw^|}v|_U9oHzT@(>-QhDcCgI>a70OM;uBmDeB9<%-LnK`1zGL zPqs{*<-|Fu-F>?HRHu{w`vaP$TxjC{cH(eOY_FiY^E8&Jf9*0fJLR2Q1XkX<{N-(W z%Y+x+yRZJN_|&fWqFP(=oa7SCl_e%_vFncA^VgouJoRkjvEcau)3s&yu3dU*+37B2 z4>`VIwV(Tco!G0Hk#c8t)SvjW;A0}(=BbZ3y5{eVD1XxMymi}B&-2~quhwqJ|F@eP zsA)6X+MCzj-TU+8)1O=GuBUL@@9!#R6Wzkh*Vv)_g0T@ZN2A2>f2QTZgg^aUr(6otcHctzcK`I416~n*q&ZQsF5vZj1qn-tmd^;NoZHgzyCr5Z( Sp71QbHva`paUVBq0RR97Q++f5 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PE_16_16.png b/navit/xpm/country_PE_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..78a7c380f49ba54314bcd521fe8fe829ade259e2 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt@{o-U3d z8WWRk4mU7O30p75!`WDTe|==JzKKXAqcC%4LdfA2Z3`DOGQ|6^y$R#mS`5^~;OXk; Jvd$@?2>?D9AOipZ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PE_32_32.png b/navit/xpm/country_PE_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..a71c7b1b3fc7b242a785aed0e7954d7bf8ab6698 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&+7JY5_^ zJUWwY4ma>~w6$rijcRp2xOc;b@2kTf2Oem-UZd3z$nB;pu{GgJ6B?r-ih*IvA$Fd* Tm+B0GCNX%r`njxgN@xNA$_p&e literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PE_48_48.png b/navit/xpm/country_PE_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..36818b662e6d4a29d9fb7ab39a7ee308c7acf253 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HQ(S{{qEK52;CQO9)cT Y+a+0ap1q$t5oiH}r>mdKI;Vst01bUOz5oCK literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PE_8_8.png b/navit/xpm/country_PE_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..f38b43c9b3b1d0b807daa340754c6167dbba81be GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_bmPZ!4! zj+x08hYu9AH9pMCc<~<$>dj3=lnxzfVCM1TWcd4s$Nm55TM0n*44$rjF6*2UngF34 BC29Zw literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PE_96_96.png b/navit/xpm/country_PE_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..ac70b8a41c439085d64853338d9d7e60d40240b4 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt`lJY5_^ zD(1YsU?|#PAacN=OZAU6gYVjw+5Zlm<~%XsYux5}d)O2{an^LB{Ts52{&5u literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PF.svgz b/navit/xpm/country_PF.svgz new file mode 100644 index 0000000000000000000000000000000000000000..1172c8e31bc46e3f39d446db8142fe07bf46aa67 GIT binary patch literal 5854 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PF_16_16.png b/navit/xpm/country_PF_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..e245604236ce82fd85ab91e4e0026b092587f2e9 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^TJY5_^ zG$tn7sINHYz?GonX&P%{@bCYB`QR_-XS?^ji8-@JX-1Gv1W)CTuYZ57wTW6ZhwUCu zQd-NLFaO^^o?HF@Z~EU~4{lHHJuM+|;qCDYAAWNm=AUNo6?MNgRC52{v>%_F8z%oV zG}!-B|I4p``EFunoNk3D|Mz6LExP?-e(P_R>1S`B-*f-I;oHYWsVNT?5}1vJ7f)$> zvut|3q{M&qSsF%0i>xK9H^lAvJFU4lGB%DOxT{cNi7LaUIo8YjV;I%|{lMVq>gTe~ HDWM4f6Ml2D literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PF_32_32.png b/navit/xpm/country_PF_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..5f895025dde35326160c28161f0c25fbbefeef9f GIT binary patch literal 554 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PG.svgz b/navit/xpm/country_PG.svgz new file mode 100644 index 0000000000000000000000000000000000000000..fc65f1d10e7f8e799a6f7480d0bf683b59078487 GIT binary patch literal 2988 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PG_16_16.png b/navit/xpm/country_PG_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d16d2bc6d43687dd4754841d399921c5e861534c GIT binary patch literal 444 zcmV;t0Ym0Bh=T-&N^L><8FUj|+_DM% z9DagsehI-z*E-ZiD0HzDI*1rZF!plo<<23Y=^rb;+uc1s-sgGWLpS>NHQ9oHSMFJi z0l|r8tW#iJDSM4Py>Pmp_HoaF8eheR!h5`eo)fq z((df+{Pua~eWyiF9c_drNdTB6u4?w9@^Kx=tNmjW&ZlI!@Y6pmOP(UT- z6c1ICmGhp~=2tUYy!+u9VB~qM0EWyLzIY}BP?^Dj`I~DR(yl*~IRe;00YT$!{da`d zllDm1fbxva=km=L88AV*Vde%A223FRQK$;g-QDeWyMqVciy5TH=$y_10^yo{TS=F3 z{8prD!EP`B{r&xOb8};3W3gClW$&Af(egkOJ*Ixd>8Bju@}EKBEWvRCWHtpgQIHa2 z?-4?wP)L%bk&zKfDF945T=})jIVezQyrXx$%vd8oUO7w^2`%Q&*Myn{tFa?;I-T3w z+mT4by0q;F)e+T^dVt9-Q}P-JLpH`I-$_k(HFXagnSz%tQN1kLd;kC^g5WkfXJl$X ze7eawtO>33WTl|1OIA@%f*_ctS?mJx-`LPkeNXJ%%0cX#*q_j9+Wrlw|RX9orbg2AA! z>r5X2z+a_ThV|ro$6DwQhpa5d*{$uh+lFE1~L!{PkIYG9OWG(w1B7@DS)nPaI; zR%{0tW1i<#Rkd=fs4_m-fWg5*uh*O35H&LxfWE%IrKP2biHY^~^~1x%OEMV0qS0t{ zb8}OYq^+&3>Q}c^{J(@9Q9K^s*x0yGL^;`fT;RCAkaBfZ`M9o4IUn@`SPTiFzwg^) Ubai2v2mk;807*qoM6N<$g0hXA;Q#;t literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PG_48_48.png b/navit/xpm/country_PG_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..5f4421fbaed20cc01841c7722f615c3e7e177882 GIT binary patch literal 1360 zcmV-W1+V&vP)+hFin|V3vj^ak+hO7vZKonh!k2N@6LW0NO zMF`ABkl;l_ZaF0&(Fi%HM-Lth3CIREmo*wxh>}Igikqw&;yCKAI&vY1?@_~?uL+|*EtSh+Ft*tx4!wn9_(2{ne? zcT~!ar3eX@&Z4X}j)*Y;xaSHuML^)GQwl$oK!^3N*K`a3KOtV5UIl=ID%o(qhVaM-6sJYK%Del@5F;pQbqy zSBZA;3$1acDdh+VA@sXq--BHx_||ua>}}24sQ4NbWTYFBK(fHinmWlIsI;`SsHkXf zZ_n0GH@^^ECHUB|DR(K3|CD7`CvB1%0P5@OX_{VHSpmx&cfGE;YZO~;0Dvf+31any zF|w71d_Ldk=xBR;dqYD*V`Jmw{Y%*@a<-PF`HJ3D*4elI(a>L&z%fDT}sM0yhCe=ObTkd8OC zLt^u5mc6YerkER_h?`%rSTr_mQ$SZ&R|P>xBogcE>!;TZ>bMSoLD?fT4&fxc_?bCv z5+~tso_sdy^1h!`b_vi-9bp4hUS8hX+8PRl%FD}Bwyb-L{G5pPvl{o(FrA0J4Ju%W z{pg~6y6Y{~>_MAbwzajjy}iA&v$L_WaemkO-bsIx+;8;3G{fG~sDLj0L-I=$mQYqP zW(sxw591tiREI3Ynn_C#$}{3{o^jt%vkGzi0RuY13gm|5#6#xNfO2wj6y@ZG+tw$I zM~R0F7LfRq0)W5=GNN^1nKmp%202t#R%Q(p4u?}#Y~NKh4#giZ0Kf#Xw@x{nr?XAc z$N;FPr^igM$KweE0$p8Qe!t)2@ubD%u2l*<#gZ?D=(nuKBQnSM*qM+uH#dhuq2Au! zSS*&8mzQ$Yj}9y>Ead0scXxNs&CRW?t)1Srj-4DO

qK&&WH3`&~`mCX`(Rcboy@ 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 M07*qoM6N<$f>WlO1poj5 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PH_32_32.png b/navit/xpm/country_PH_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..8ecc27c9de03c25edbe9dc93877913a2f9aa7625 GIT binary patch literal 771 zcmV+e1N{7nP)w4K_cY1pVeMu59QhY&KEIZQPVfQ3MAV3~ZnX)~( zT%4bqo)iJid`0j}mRbLzp(NX!qPc((5d}Xp<3<2&J(D}E??N)ySO5^fBKiL7;eF>i zI47+HLPQhGma<%1^?I%7F~OWVvwuy^-qlGFkpFFD(RgCh?&9TI3rMBuyO2i#=mgeM zx2-VWteJo&uTrQF5GXvxCoX^o(@o;D`jVAPOd1KoW01NbW`cVV=mZl1EXy)JuP-sD z=`|3r)UD)yPwt!Kx`qX7BLV;gs}?=FwB4YeXBPfPz$IoXqF@gI3UmpJEs)2f`=pev zldhlIoREOLPx*um;UNG3=bmQnxfSL6-*8uB#m>C5l?Cw$L;xTa`1^U_ePp!)m{OO-s~N`#I%ZxIt&Mmh93 z07y{>4<4WC?N5-7*$?O68nV`US{@`$$Grc+kA^0#=(7SIjOD3&tz)(Zt>^#*P>4Lu zk*n)}-#K)&7V|YNegXY#rN9S3nCW*8R9Go2Ye)wmGGif_L78+rELG~XS6ey&Mx=5n z)W54->b7f62OyA21C_^;L5q002ovPDHLkV1hp~ BRrmk^ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PH_48_48.png b/navit/xpm/country_PH_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..9ebbe18b6e1ea4746c0ff8cd2049064739fbde92 GIT binary patch literal 1224 zcmV;(1ULJMP)|f6cBUu$WzIR1`Q`4tcke7KI@wn9Lm%##F#P#*O;^9Yd(fe`WHA^Kc_elJ z8_j=o&FGB*{2-8T+Rn2NH}#G<_4YsjK=vQE8r!Z^?cEj=p|{5mny-WFTIzOd-HAPs zCWFo(a*LgCQ)c=pVSM)h=|Fk-)7$mG!*c4@KsLV-< zi_%hqbwB_TV$D~o_QhC5%`{j86!;R;lA|x4dekJY=MFoF=Id#pW%=^4jJv;lFLQO9 zh9Fl9-0i`cSD#7#_~0(hLCO?J0!ff=llPw$eV-oM{c`ROO+kFToR7W_^1*Ny!~`g_ ze58brmHDfT;p-2w9?y!?4#XmN!Z%Lt4v6v07)S0lNP{dQb-6(_3Uw#;q^EAy2n16K z6dQSN&|EE_u7T7G?m-X;K(s}yKb;f5HBt)@GpE6lO*3bpI^dh2`OAoUn3?Wfal?)T zOGD*etJxTK5F+kp)*Q&g{wwnQEo{kKF+%>xNO9L5&o&yua!OeO$wPeXLkd~#oV!~2 zNGZ50kdsGg{t|g_=4K~UzZ;g#NdN#+_(&-f8|1-|qBH=-#z&6?GGaU*KSqv5a8Kd0 zDet`Wz=nhTQ-Pq)0t92|3Stc8gBo=5X9AdU@dF&SHy7OcA`BoV3d!gBWCesxAw^RX z1gj8N7RbosLc%c^V!*_yufDZaZmxO{K#reaN?P=o)4Ba3l7MX@EFEB9?5vj0WhHoOcTb+0G7ZfYgvtiO8 zWQ5$;Atth@EchnLH^IygB6255J%I*E?mzIlw|mexTgYw1*C#Ip$HHYh3%(6 z@)C!JO3D^m+rp{|0l^Rh0L%zeDih-XK(GK7e{tgE=W`bt!mSAfEe2yz8Ov+UAJb>P zvz@NiK!Y{j%LoYka5|fR@5?VDpQ0lu5T34^J-G#Z!L?40b|86dqUVV`pY31GG+5_F zQFS=`@(MN9U=gIOd@3pG;A=;`-7B|gjX>mR1bA?E90>8kb`00Ox?Xyz>MdmiNT zrzWdvX3l-Diw1ze%)3D{i{1|=0+_A6G=98FFAV?zECSXXkP5*0+qL1hKEk>iLAZkv z5#(VQW4(R0o~QEFIlGP;Ebl|g)by<Ws literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PH_8_8.png b/navit/xpm/country_PH_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..ddc2129d77046981b18af733c631bc93c3f53f97 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}}PZ!4! zj+x14-dma!o;7CUIZ%`1eSYfi{p;+1w5T0Ca^%d;EnX*r+$Cb09-c1z_CDIY{MD*c zpOm~e7#RFX{&D`q|M$<^*oEuwRWeLZ`1Ak$@%{bZ^VqM~Sl6>2UGd*O{{HzH4Qi(j m95^uNoZh#xmux=InHXm5)K@99yY&NTJ%gvKpUXO@geCxfcT!jY literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PH_96_96.png b/navit/xpm/country_PH_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..42bc76fc41dd4908f1e2085046b87532a4628833 GIT binary patch literal 2957 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 D2^FIz literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PK.svgz b/navit/xpm/country_PK.svgz new file mode 100644 index 0000000000000000000000000000000000000000..824b5624dc2087412ee651364e761f0855249c1b GIT binary patch literal 451 zcmV;!0X+U6iwFoND0)Z&17mM>Zgg^aUrpsK z2)ELr4Y1T)r%&Q=^_xm-aZQIVSi?^ZOM<@8)Ppej%sL2%se3!1Z`M0cqu4N!d2=|DNMmUw-}&2E2h^;?D3x~zAq zcSvAwmGL-e7BC1`!-r4ojIx-X!O2~;dhhxDLfEfAzYd%p_~F|JZZ__(zrNyh5*Hhnys$ik{o&gO1_lN; z7B-wtdieI?@4vqjtrFoPY%FY_etg2I;m^N6tIn({cQ3b9wPj#nU}R(rF$($n?=M7_ z5o^-Wk_Sz_& literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PK_32_32.png b/navit/xpm/country_PK_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4a39646150dc8ced22609828bd9aa855542936 GIT binary patch literal 587 zcmV-R0<`^!P)6;nnn76RXV*2;*A1*DV`CvxOjD0uuef<6rS+LZ#l!1Xk zT0ojo3oMl^LySV!oLhq??x^8-qT)n>a{*ReBm_~mL-vo~Kh8cpi!7LCo93+H%)-PH zF*^dQE@FMa#K`2M=kw(Kliz=TBa7d7apT(aYk&X#ZT4@*s*zY9Xi94GbMoJKaRW{K z(CtHO&aSC@QuqARbBZib7FA|oU|?awqW<8mgGcTh`S%}tLL$}z0Zsu11_nufNld9j zw-4dbNLn(L+{`&sL^2S)zaItZH{{ERv3;zHAzxLc(1_lO3M#e>ni@4djG1UYb z2L5M2ui;6EK*b9#@U@a|3vp|?z_)PT~1z`m=@q2IXnYNiiA_)zUmJi;3eQV!i zf9k<0WWf{nPT2R@V>O+DR3AVc#mMAu;BTX1!@$6B`1awA7dPTEgiH%a0)w(uF=_#I Z0RT!ntyLdBCkOxl002ovPDHLkV1hvf5$FH_ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PK_48_48.png b/navit/xpm/country_PK_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..f11e0b12857f8a137ed90e0eba0a7c1da44353c1 GIT binary patch literal 883 zcmV-(1C0EMP)%A7BV(v>r~sG1-+zAx-a!If0$X#oK79M|-Pd=Nm_r>0F*7l*PFwx> z{o_*)PElwSbsW^<-{Pq5*t)G1tE`!#8C@M@EN@)qUbg%C?nmz)VO0=r93EjB!N9;^ zB5%UQ#)aQB7Rnve?AOf1$h79{8e9r)zq&mse3HGIy``e1L5l%?( zZ|)~(Af+J`Y!uAE!0`C}W2~~=?A*ui9l!YGB7{3VdOB?#B*`zSD5A)~!0_zDGpq`p ze|+A&wb^~5`?p`;>NnSOv2nR*y5KjHq9`+#H-<32|Nf3g*@y2R?!La;w56$OOA|pe zDGDJKQ56V-jhPLPvR{9G%|AAuNHZyNkRX>Jgh8-$nSOw9>Y;*z1h@ns3{`Pe{3?I^ z`9Ti{F)~8?Ycc{d-0a+x7zGCuIS5{{Gcq#TsoGJ)J(M}5j5>%A001eO`@-sgFuwo*002ov JPDHLkV1lEQm{R}% literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PK_8_8.png b/navit/xpm/country_PK_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..124107deb957cf681a8c7244c1182094ac60611a GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}bPZ!4! zj+x1S{{OdUW@b*dQfAglaC(;Ek-<^KxyXBl_N@Ou{wm)!iwz49b3NpL{{6w*?9=DP zC8ejjPfSQlyEfs%jj~i}erx`&Be#mPr>p7emgu!uvEK|$<4WV<;aM&>$7#9)8-uC3 Va_xt3rArOwoS*Ji0(`%8cSciws5XXZ2S%scbUyz``3nj3Mki?9O#z=bkKSkcw(M}tB1 z>3{k;fG#ZVrbYA-VMkpA~!=wNPU1DP3z(4#cK2~N@c{&g@h9SVH^HaU{b#~?Kdam$EyGe)kW+~*8 z;_hOw$EXcKlv?-Ar!z0helQNwf~xR)A<#dm|?LN$>fdZ&Lqaj!a%83}?-0$N^vUeHR|n zVckAoy%RNd7LRzcIC!TtPFY()7~nZW`32ZD7(=&k^GFp@#n)@&?qeadw!^k7b}I*u zzp}D3Hivm5&y4mQ$s7P7Lgooh^Pq&NcgL+IwgpRWtIKs3KY1wzyji{98kVj0cWNK| z7HyPcY=K`#;_#;Q?Vf~f$eL&s)heXHxYF*n2@9ZiV<6G9IlS9tzTVxDWmPgl8(Wk@-&S)jk`HC4!)>}7A2aZfDLPTW*e5k|gSx77CSC8whFFuceE(}`@xt=R#8%3s_ zygXL$xdZ%1?(V?3+>%uCZ~W(9BUTf5?JdVvV#3g()iv}-8x0j0yb>=tz(mvPSk)X7 zRG(35uC}svRICir`9XJ&6Eox^4i5ZuMw#k8bH zeWMz7z}vvDCVY?@ufVmKPZ(On!K{msZ3-JqHOZ{QqV@sKOVU+v*?~_bm|0MpVjyH3 z%BQXkLuozcyOui9`Kpvrt|XapnK3crz4N+U*Yiql56*1-%<69ZE^T``Pb-DZlKq~9 zkE|cHIfk2>>sFM(RDnNDVV-XC=k~kV*mEcSk(Fh%cPFVnyY5<;W>{{g7{y!H1b*Rh zp=9X76GoY7mzc**H0516lHjGi{Dz&ycwqWv`t4y2Z4(Iy5HE#~m*W-fAdz&#sm-7E z+CA0!i{nn-H0+Z$0VYTyzRJ{DO&>!C^vr-S5-zW}DGLcMDc#(PM0^S9!7tP-7?v(teI@MZ$%#`-1pZI0hNa!KxvIk8R>f=^wOKtP3U#nTvazZWU( zNI)>!wq?K}+EtJW(_KJK7nFVQ8IvEYxm%te^+0IqtNd-ZuaN~h=Yb(IXfF8-Ya zR>Z0(j@{dI$F?AY_V)_4V^=I246eXMGGu8%QYjj#i3jNi(il|Jz%cv@9C-Ma_BQ`q zh|goYS6Sybk*v!eH6>ObOnCr3O}SYDrPMcnh5aP6H1qR6pARLMC?=3ma~^Zgg^aUrL-;4UI+JZaxP#vFNUkbn_(Pvr^m30Y+k3F!65pCZP zaPa>0L^MrPG^LRpd)kl9X;7`BAf#CsOccTxi-Z>#5OeaRgdak$Bn!m`srtcl%;K;p z!EvXX9&87d)uAC?|B)bs&y3?Y&`BJ}Gb%s;@=><_HfJ?+I;Azo$L?np!C;Yw2=x0|lS)&{SJk9{4yzPb{>98Izgu3%j())Qr*q{F~) XJBTG?cf@^5pa~3~u6{1-oD!M<@5U!_ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PL_48_48.png b/navit/xpm/country_PL_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..6ebed23a8b06f2bb3ae5cd1b6c60a0a32edf9843 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HD&nT9&whU+g!>QHOwLobF2NGp8?{(bW m4;$|)I=Ti3hOmetQ*nU>EFIS2`^14(FnGH9xvXo!I)78&qol`;+0PwUP5&!@I literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PL_96_96.png b/navit/xpm/country_PL_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..fecc2b2d539742e85a28210f0aa628f6828ec0ad GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt`lJzX3_ zD(1YsZgg^aUraYH!eh^s9S zP|lqeh<)GFKB8?`QmDk1(taQ^X9vBPRd=24m)78&qol`;+0BOfBKmY&$ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PM_48_48.png b/navit/xpm/country_PM_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..9e58d71e8caa5c581447351d90319a0061ac6a9d GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@He#gTe~DWM4f#GpQ# literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PM_8_8.png b/navit/xpm/country_PM_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0d7704f2c7883e60aa96b1a6b724a15a82810d GIT binary patch literal 115 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PN_16_16.png b/navit/xpm/country_PN_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..12fa501885f80fcdfa87629a4c6d48b83327df03 GIT binary patch literal 580 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PN_96_96.png b/navit/xpm/country_PN_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..897c5c4c09a05f2c1c072bb246e1f47c12ee3276 GIT binary patch literal 5368 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 WZXOR7 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PR.svgz b/navit/xpm/country_PR.svgz new file mode 100644 index 0000000000000000000000000000000000000000..75217bbeae00631dd471298e706b5de62be89ce1 GIT binary patch literal 563 zcmV-30?hp%iwFoRD0)Z&17mM>Zgg^aUreRDVDaesfe>reG3EERoD8m+sn=MBTK9>TR$wHHuIJ**)2cVp4^+;Z`9 ztJKf3%(J(qc;J<8a*|PMqK5Ih(K$)R@Wk2hRi1M~fkG5RNQqHWw!HgU=mvO|lftGH zD>Y19QA}VaLWF1Ty%~eSTyD^cRnNUvykk9i2M-6{wmJFCDx7hm>*nr5!!^4w;6c8y zDLseo#G4R6#1HCZ(3okC;6}0I2R5?2$Xr|6KkX}fM$$smEn5^&8qB{o|3k$Ds{!N@48slg5&Z|d_r92*)(0ko59I;Tq zd*A|0SYnc%j03&2iL=|u-XfJMG`_u}g$G>-6blurSMUY=c!i6b znl0X#jm;E;9MLe{L{Yd&q9jeiGzk5arg4x(4)Q}^7A<>-SCgw_ zi&6?UCX8dUeXFIg7nhZEk_(NWf^i@1gEemQ9U;_l{S{1>`kQ$bNd4NQ59UkQHi{i^ z!x#Q5rct8nJN~joyNO!_R{4!hron>!Z;bm9kRL@K=(M1gH)eh&`@c~2+d!NI006F> B6^{S_ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PR_16_16.png b/navit/xpm/country_PR_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..6bbe7a8dfec5b70f6904e9cc8d0e900fe9c0d3ab GIT binary patch literal 396 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lNlHo9X(wf zLo_BPpSYe^arnTGX^o8@M`|ur9gcJqJ}-Xz#=pNw3QPuu1_p0L%Q-jP`_kn+M}oJ9 zhf!WZC-YzZ>|nc>-hWlYn1MiF{qd?GJ$`2~CcmVFgoL!D0HO3>fBx>ze|$5d z&8_YK)I;v8uIL-wN`L%?nOpeq{CXZ8A08hcp3R#r9?RS;sFcbAi2;GloSy8{JLi;q zWYu=^i+gbX*@yI5`|JK%cDvi2@oam4Ue{Vu^V?%pyRAUA69PWf?92Tun4c74Y+zt; nyx7CXcKS)bn4r{z1O^861!dPuk8l103|d`#U$Vf8_7#JABtXUW4b8)azY5@~2iB(5`JJ)@A^NG^@fztv8 z28Lrd{#sUix&8bfl`Y_4L$L2W|7ThL<>-ySRI`AagE7sO4O!&v=l?EsUsfLZO`ZiT zXnYGbW;a9DNn25hjUT@mBKy8wJ^ilE?j5BTxahHH%VG()|Nj}94+%Y7w7L6YG0Xoy z#9IJOraT-BD@(XJ*cf!>nMHURcU}0y%gIo-=;zVv=w>;++B@%50`H&CL|OoK?3W)5 z-5Y+`X|ag%F)}hTxEr#ZyZ0BD}ST=zd_gsul~)Q z{R5A-KTPOhOV|Pi1_ov(hJXJV7#JA-{l}TVJYHY-kZ7TWDM8eZ$z5TfR>70efS^I^X=Ck1{Db=IZ?((uMz%WVr1y`|C(nT!oUzh zyy*;Rg&hwE!G|O_veFv zlDeidK*}P|=i4?P@ur383=9m+@f;FU&t%IX10000dlb3p*6B}-}wb;p*~ zii80G7OR@)zUBzioAUIORI_=kkB9+cc;EdfWA6(E?G9EEVGVqN0Cc5p-@c*CB#V!v z1^_|Tl%K;HvdPXzKF^d+L<P4wa(`W$Z712AC^H z6ZYJ3#C$loSMISd9yIUK(fEukH;pw~C;|3Y$|Wp*{M9}1mq#u|d@OnC6UUg@=P<0B z(0_WlCf;ch5|pSWR}RM}sTUR@3cPaM{!XXE|GAc1|2}!CI%9fdF`#*qdfZI&_D>ro z7Y;*nM_>(r>#7x7p6olDR4f<>!0iccQ;XF;XX&){INv=TSmO-^p`mZK{y+dm44lz& zZ;-wp4tBFyY5D!!*^MP*KM4#{D@ke`1AwCdpv?}d32BY}J?G2PZ8sL9;Rh8w#!^84 zhr9Lz8>J}E3tTy>M|EFb+@Wy==z76~=fifcm)#H^&$51sWAO)ub%R6}UqNF8RDkPh`G*Rk=D%_~!p0*O#BkcDJZfG-3H> z8#1VJo%F=M7?mPi-?KvlHB`tB)y1&kEcwBL7=lA}ipFj7Fj@cv2~x_*XZvERo{)xH zgJ3|(8q(dOD)3up1x$ctpT*wo)U>CwlabND{|FTsFC5c9r*TaMTRwz{&jqtQGU5zc*|s*^ZlWQU8B0lQ@oi6QoGC@`e%!b7sS$FE-1}* zQ+KI4%W_Rb4Q4@klY=Mpdy?#T#nr$&sml##y8A1lK?8t&UXju^STB!`zk&e#2m0ep UI?hM$9mGI3e(%vANeVyst9YbbAYfa!iwF z&-|AO+~;5W|L0A5FMsjlp9O1p9Cg;){Yy^y@&ChD`#`m2@im8hWSR_Y8Rcg*+0B?< zTleqZ{d%xj2iyPNve~yZrf2^|-SiIg86PH1WWBtTVf%l_;FLBOH=v^!JYD@<);T3K F0RU03Ry6M-#%#8JL-K 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PS_16_16.png b/navit/xpm/country_PS_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..fda6d28a2a65a3d6972cb2b135d27e27bfebafcd GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^@JY5_^ zEP9g-5+43Jf8c{!2`%Ft$CuW9VCX;niCbHoF+ zm#gZl7OK|vKD-+|iKl@*Y1Vv!!;+a{lVT4XIdI@Wf!nO9I%f-*(OKxk@`pn z02qZGEkN0V+kdE9r~s-K-0y{=g&IK7f@^MAx8R!_sgD?5^_E|!<;ntZvN-RT&CNK^ z=zUBr=C_XkU_G0&p3QXtfS;F%7GTxFK>*maa1_91s|9qQA9a8@&xrF(2k1UM{QK~O z0IT%y$5jmQKDb6Kn1Gu-FST-DB2k%f-t#bprRR91007*qoM6N<$g4o%U-2eap literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PS_48_48.png b/navit/xpm/country_PS_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..841c901937023c6af55f6433255142f71c1b3f3e GIT binary patch literal 404 zcmV;F0c-w=P) z0bnYUxWi7Qe~_I>;%`PG4Im?tWc;uYX#%nkNrE>$QV60)3PE5;ih#J0A|OyB#X((B zf4#l`G8P8`_ejX%1lsrg)D0u*!e4Jg*zxHjp zzUBO*#S6XOoGLr~BA~u4`?l1lxJ5w3JeY&Hc`yfY^B@4x^B@4x^I#0JkOyOsg*@;e yBYEIKM)JUc?Bsz1*~tSyOyvO}o9l*cnCuS{qqYDyCQq3F0000t~65+43Jf8aoauyJZ3m+=E;9W|X8o`*%NuAkfV_kT<1QA@|I|F_p9|9i~j!vg~K z{~m2?YHVywT)gziR`+PNq^(Vb)B3*sH?dcoqh@f{^wGiB+zbs)CR(*=6MTX8FnGH9 KxvX@yPPCp;}hN5Sd&1~7s zj(tYCGXQR;XU9IH+!+8ufVn!4c2*ij&1JNQ14Fpz15rH@nMFavRq9*Fw%Vzfe>-YTn zYNTrlT$~^PZ;wx7+)?bJ1ARQdd_2F5aY~ts4g@kpDS@aEr33;KqQpQvh!O*V22pw- z5=7~Nz=0?$5CfvDKp;Sr8>o6jxq(nSq5%Tcjc9;Cs2b5Qf$-<=FwZG(!vs2i_&&&U z3fusJ=GRvh|He2#p!55?{D%~~+(32nL4KgR`5-e;^?Z;SsCqug3Bji4Q!1#Am(EK;pBWJCOKn=ME%3+c^S>PkW9);?tfTNPMi>fyBq!ULf%~++HB@ zIovLg_&B!>G;SKMsq84Tdc$KmY&$ M07*qoM6N<$f>7NZhyVZp literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PT.svgz b/navit/xpm/country_PT.svgz new file mode 100644 index 0000000000000000000000000000000000000000..f0de8001ea23931c54f82e86d205673c04ff5ad6 GIT binary patch literal 45410 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PT_16_16.png b/navit/xpm/country_PT_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..012f8b5491f88c6a5fe3a5890edab46599e1f90c GIT binary patch literal 341 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PW.svgz b/navit/xpm/country_PW.svgz new file mode 100644 index 0000000000000000000000000000000000000000..54d644d4558c6ae1c5026093fd759bf4949cd72a GIT binary patch literal 287 zcmV+)0pR{0iwFoND0)Z&17mM>Zgg^aUr<*rb9QF{ZIDlo!XOaE??pVAl?;B{=BCKc%`%Wu`OoN}%K007;ji=6-f literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PW_16_16.png b/navit/xpm/country_PW_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..8aa2d7656140491491c39ef5281efde8ad86bc44 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^zJzX3_ zG$tm0iK^~x6gl8BDXYk2!-9`bE#9kneKj&LI8z<<=|{T|Bkv!b_p_!3yF|nT1vLue z&hOs%?XkRKjo&BnSf0SM2M#D4`gJM1L~|LhhSZrK{0jDXxN{LE{Ez2bsK ziH1cFkNQidy!#wq#9|`z^FiMk+duc_GBPj7xbf5M$=Uouj^AhVKgQ-a8JZfbZc9IG zY5%`)-tQdkW8eO~^l!b_K6ib+cVbq8Oid?0gV%4<*%hHPvwP*2LNT)G3=9m`0=vo;iWwRH zQ^5jf;SFYd2QbCW`S&{sZ=}=$W`@5p5>s%=MoUa(V*E>y1x9>FMA@F>k`-rrYRG$> zA`49T598Nq%6E_=3sgC;;Mb|jb(JCu#Mz(X*D1zEKmh>@xS2oW*U7{Di6RTA1#nvM z^)D}eonQX)Q)I!@9}4(&5>!CIf;-=|@aw$$Lz5y4PJVR4uk*wQ0tyINaOI21>tB+% zWMBT0zWUXOA`AX9FfVzLgG+Yli|l{@nJKb>fq`M~+kjJ_95BUCestXT)}I*D30Ux- zfwA*J@3D`r$bv^dxOG10{m;Niqy+?OGzg$!l}R}m`puS63kU)LEk$Q@eSf1F00000 LNkvXXu0mjfnl-vM literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PW_48_48.png b/navit/xpm/country_PW_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..8589dc93cf27b3f1cb3bf93c1d876358b9afdd7d GIT binary patch literal 681 zcmV;a0#^NrP)P?4T4c3Vxi_ ziHDsW69o0DCq?|igV5ngg(;rKJnbR_1<_UTV=9}7EnV%hflO!Hd^DKWL!gHZn&*9E zvI+Sg-#*WuUm(!FWe$$bz

rtpO|Jfvnw0O58_@Q<(EBA~_=cY@2_CXBkSI4PH@}xMzKy}4=6__Ur!;crw+60lkLkBjE z4~WUt8USFRIv^$!o1eM|it(AD*wy+o!_g}-KI0N-D0Yo!)%r6$tDcEocLUTJeAgqq z!c6vtUv>ni9S0rRI*KnnyyX!U1^@{Pu%+GM=lIe+8z=of#X(TFkZSam@ui$k+bN_R z1hoe~k@mI+K9gerkf6AKmb5n>AYL(p0!140q`i?1-^nomNKmMuK-x>OVg>~YvPII~ z5bGq!&7eS~KVj0|l0m#;1_hE0fwY(68O)$SlHNkvOR-`G1xhPBNPE*N@roH7NbMx; zO)JDJW>BEFg?_~d;Y(#hcwgM>AV{xpslq;d>C|#UuW$~60AS+B34H0q(s3#b03I|W z_ojaD$4tInPJEHO9R~rxed(fR`0LMThX3Khd1?(AD6h5N%U`NLGctcUueG`a0)S^f zkKN4P(kuMxkMs(EBYS&t>8KqIP+X;7{5rI#HxG(;x`a2i!;i(j2hxSFN|#LyP+X;J zY2m*$^BDlhmE$=zZl7X?{@;%|t!++g`&W)y{?Fe-ZpH&y#RFNz16k!Si$tWicFO~X P00000NkvXXu0mjf{<%5H literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PW_8_8.png b/navit/xpm/country_PW_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..acd30cdcddf95aa6d27d412f796b0fe2c7966a99 GIT binary patch literal 169 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 E0Do*lsQ>@~ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PY_16_16.png b/navit/xpm/country_PY_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d4beba6bfe8a084b1127f920004eb7aa4d287ec8 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_0JY5_^ zEPCHg+Q@szL4f7?z4s!2WEGgQ7BH4G`U*}GaA zZ@BsL*tIc-d`?a{ZTU~I;m-Bjn^TWXVOdacPA4j)^g>AJth;PSjU#mgCptDrKD_#U z&N}y5?x#1uKEt8r5L&r>(hKj;)(zWx3OTM^mU58@oys}k>cg~YGak7!#5{Z}H1qxc c;B!~RPj={)3CYYo2y`cdr>mdKI;Vst05YXpB>(^b literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PY_32_32.png b/navit/xpm/country_PY_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..561b3d3680ce604a2f82cf1fa8115c743e3a5c0c GIT binary patch literal 361 zcmV-v0ha!WP)?Hed=rCr1aaC7nnd@To8 zsYAs@P(+I0Xw-moX`%#!hQucE89Yj}+_RtW{)ThTHO4F5f)dLt^KlK(01eOp0Bf<` zx+xQ26h$FE#ZeRiP_NhL5AZyX;%Y>mFJSe0IF2I%SdykRO-Y8QEKjD8!Dl?>`{)?k zwtt-^8p0q5m_0slIP)0x`&3*P-}fa^GC&r8F`A4StZxv$+!NL;vN)a}0AQ`5@REes z-Xtf(G-Xkuu1al*ZF`41{}!Y9%<6jsvsx7aL_?^QBHU_o^0WsRZzSCgEu}<&Kds@% z`6UI=+#iV7u>3>RIXJr(cmG3K?rXGLCZP1+Py;kT12o_Vm|XP)$ODowkZ`v;H8%5+^987QULBr`mQ4z^9xbPR+L%HCPi=Q}~~RAfV@<1HXk~f$br^u0H)K`3)&&Z!}Nd4piAUL#6qnv4d*ME-(Z?0|qFE3-)qVq-mXqWu{|Aqzz3vZoT qA++nOMV$Ga%0D-m<})?zV_-;g&@5zST$u_qlfl!~&t;ucLK6U5!Zg$X literal 0 HcmV?d00001 diff --git a/navit/xpm/country_PY_96_96.png b/navit/xpm/country_PY_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..d1974e33ab2ed740f63e5caca394ff318cf530b6 GIT binary patch literal 1456 zcmb`H>pK$)0LJ$yl13tzr*c=wP@zT=!nRx+letFG7)na6tqH}V%uEf7LvlF?b1G#!XX6!0H6qiI>WbpWvB8o+l<|u zzp*X3a5soEK)RE1+N(kUKsEyA?C6_RDw+y)_qndwC;mxDxHxU%f79XRDOB)fQs;Xc zP3vEKp;nRm8c)U<)M)hL6k7|-keuonMfQ7K_1^fQ<`~>QpdqK61$GqeZhwTjE$7w^ z7a(P$#?_4%yoRS_BbnyJg%uHFwNo@`G501p^_G%l4CTOgsTE~U)mh-~za0R-2d)Uj zr^BO%$hrVInb(v(5_C*V3<~u~8Sdv7*%lBroP5k|x!fPb7bnG>E@24_Gl5Dwy7H`-uN_5Lm zw)?ihUO{jh-=!|$vOV(WyAANVNp{*uqQJZ=ErUv>9yc}J*p>Gj8xlntCmBXy46s~bV)8jLI}3&FKh{U_WxX_(0J;(lMtdUR{>w7i~I*P9jZ67$bxT^-g% z6^4Z{T8LNdQ3h+8#agvmTTdL{Y!+on`gK%tGXF5fofn6ubDIKe;DPET&&4UUgOJfQ zB^8(W?#W`96Ta4Vo%HfMceMBGVID!aMlBXjnFQ8Z6_~`&r<{6T1;z*HA`mwDxKP13 zpE;0ECGklceXES>SUNlJa*>~PS=^{-wjo%LVNp6B-9~X$$;D=LmybsWccepng&w=+ zjz+4!5Q2Y-h6^4TZN|wa7?IuA$6)c@$Jq3cpr9iPStwDJy0NnSv(}b7ZaRxvJa#)( zlvVGwf1rN#D-DksPB{I2jTAhB@|7-<9&bQgY&!4JUrcyLOT$}0Odpm|CF|fv2Ejj! z4cFDiEb$zjptD-^>@DHs2=T7FIpP{YP-6(AB#yqRDw?WM=2$UX5QuRBF*Lnn3a{Gy z*;%f-PSz2fI@@c;3sEXg~?|lFX@miLdb)8?oW(O z8iw@YLC`Pu#*rZF7Nmlu#=`9x(M>6?lg~eI?+vd-^wO(UEIo0BAMA5Ot*@m&^WfKN z=|>wqia<^f=-=+EN>rCFPHrrROucQENRoJ2Ig6w`UfF|JobVvc^l}Vr>@)Ay5eV9- z%^|Vt+(Fz>UkDTk6gACS4CTLI3&x^grA+wWCql#k`7zVr>Sjwze?P2s%6(@7?1AD5 ztG((@(2hkoBK+~mqJ3asY#!0=-uBhA=x$eh$SLUWld zl0A!-*V~U-B-*BEA_mX>;zj6%1O~c^@zu#0;CwE4xpT0D(`H^PdOS0s6}J>3$8Hvj+t literal 0 HcmV?d00001 diff --git a/navit/xpm/country_QA.svgz b/navit/xpm/country_QA.svgz new file mode 100644 index 0000000000000000000000000000000000000000..1f221bf1cf02bd983956a3c51af19112e23301cc GIT binary patch literal 814 zcmV+}1JV2+iwFoRD0)Z&17mM>Zgg^aUr|9Wb9QF{%~V@!+b|e?@2?Q*<7&%t?p~b1 z77BaV!)^>lp(v7)cy%lzDNVCqzfZDdyKM%0oFT;e&iU>~UcP%el;}}vQ>ZG(G)^#* z6<4CDb~*n3?KYZYWGt%$D^(?PTq*o+b+t5)yDNkcI9DbUJjZ)$>x_{4sLNRC9TA+! zQXXVw4WTh5xTo`;ev+G5OQVjOOYg?{kg3JCr=CvnY2-m7_{q4EmaM<6J1|OOVZ|U!Q9T&WYWXZ{ zF#6mTJ4jPAE)5BG??2cP^@dX+>^{e{$TWH~gH<(N zf&20xEfY|X3)M6qEGdk@bASap%D${`n-iQl&weQV&>rD&1h#=1bBtG=c`0}Xn?EqS zDh_NXooL>`rkA7#o{{ajmVMABY`6dyFOlGf!a0$zwkXSwE(u1YtCO^awr!9>A4?J% z^(P^>rk{a3r74}av6kJC-6n<8PRk9;I~A2srzogwG8^H`j3CSL_$8r++RdH;2~>Is zR3Lk3)~PIM@!hcy(yCIzUfqP~0Md}@BBD0GB)6BbjnYEuE)#tLa8)XufpMV&**e9qOY3ea4ko(`75(4XgrT6e;F-!bv3=jz;!-*74WDv zT#~3{XQ}&J-|k#U!-tA6927zE%3Wimw#Z*&P%;3XuVJVSe+yECSPD%yLb4~ zw1yy+@ZD+BxFC=wsK?lI2@7%ov+JnNtm_j@o7*A;6TtU@Lonx|e_L{D4*Qulnjtb${6$C@SkcFO{l*i{yO|Dq~nQo#M8 fQ}fiL>kJI9^-WmX6TTz^oy*|q>gTe~DWM4fU^rf^ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_QA_32_32.png b/navit/xpm/country_QA_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..a9b0a81618aa3ba934007878d76dc80e40930aaa GIT binary patch literal 510 zcmV6GJSmI*6g(E4=-Mm zZ2>+XFfcIOJ9GKVyANcW&VWA^?VPfBYu{W-OlQFF1N(#^15bMjEg%pFzrO$I^h%~A zA>s4E%R3Ld{nBWdOt0=g@#@}VN=#=U7(};ETv(9X`1$R7vMnHxO#lA*L$=WnfG?Tu zpSOBL+w}kc{!wB9J|7r)J1Q7xQery804LLrFW*d0ET>^IJ+XTG-BTASF`a>65MADV zbV*6u_s?I+wtzq~6_6BV=jI~YbO!v%^wheYE312d|NKRX1^9d*t*OEb^K18Q{;;cGFP}5z;o;FaqHVi9_5P<*^XA9zzX%jM(tcrk|NQOW z&Mw}XEzwafAa0+3bJ|TdxiXVdUgnjZzyAOKU!AUZ|BmtV|NHAriUcw{rI;inSH9z6 zQBVx5ulrr+7)+WgTM0C+-^kBy-iK*Qc7ckscC|HL zaryi4=e1M1QZQ!$tkfA eRP^GOGXqzo`TI0~IYnT2GkCiCxvX$? zhE&XXdn?|1a-z(!kJUmgf_ppS9Mbo;b6CCLWtr!a%X!hU-ea!y3x{JpHk=FBa%9cC zv|lwa=vLSARF&$9TQ8 zcexpt_Q!;Zui^J@Z){h6@UyAMP@ zK>61{lay|RpAxNb-%u!?(vumIebV}({7U^R!4+0F*k$Z5R{pCBf4*|^n`Vy}++O|u zZu&9na{njFyA<`9SFOJ)#cMyqZ&`(V#DS;_=iYlgimIGJw4iR85Sda0L^UtVslby*iA_sIK}#N&|H z%C;MCnhReEUeUoFbz1b%!F^wACYHCbu3=qzTz&riKC`mbOMYIf*uP+JTJe_q_xH#A z|NL)~-jdD5b^A*A7W_FgU3~iE@T%Is{;%z>S+Cd_U0YV1@b7T=v4Yth{I1ta?fKR3 zAD7$u{nip?odx@s6yJX~zr?-FOdA+PIW<{R#HS~VumANWKl9h}W9QORm!w}R(nXa%izG`Op>WEFaLAhw^Cjx44XeC0} hLMdFcp9IJ3H%+@-u2OYA4VV=eJYD@<);T3K0RY3-eOUki literal 0 HcmV?d00001 diff --git a/navit/xpm/country_RE.svgz b/navit/xpm/country_RE.svgz new file mode 100644 index 0000000000000000000000000000000000000000..81d06626fd7baa0244f9ffbfe362b1b84ec3fac8 GIT binary patch literal 273 zcmV+s0q*`EiwFoSD0)Z&17mM>Zgg^aUs6Rbb9QF{b&pYN!Y~wtpVwcJ-94L|v?5cQ z%GRn3h7+caJ(f0Y0$nOiX7%4MeH*KLyzqVJ+!HS^Uky3S&g#|(;FJN8rf5rTY60J_ znmhurE;nV~v_=ZJN(;**i0`wvbpN?q5qqx5?(qEjk`kC8encr^w$I4>aYH!eh^s9S zP|lqeh<)GFKB8?`QmDk1(taQ^X9vBPRd=24m)78&qol`;+0BOfBKmY&$ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_RE_48_48.png b/navit/xpm/country_RE_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..9e58d71e8caa5c581447351d90319a0061ac6a9d GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@He#gTe~DWM4f#GpQ# literal 0 HcmV?d00001 diff --git a/navit/xpm/country_RE_8_8.png b/navit/xpm/country_RE_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0d7704f2c7883e60aa96b1a6b724a15a82810d GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_bePZ!4! zj+x0R0W;1YI3Vz9>4vOT%*@P(&mTHwznjmss+CCw` qKtn==hl`E1xykY1fZgg^aUs6vlb9QF{jgQ+3!Y~Ym?*-qX#B0}f^Tb#c zJnRYd0mRj|P+M7xoo{b9^+FlqO%jqnU;Y%U=AzM!*G^f(fF=YGHz!*uBN!a^<#++e z`J<_h+8WNlSXeEGgTmbeimS%uv0@;-zvdW+5R#B3wiY-ggy1-Xr|h@n(?C#_mkcJ; zSWB*i^b9gWpuJo3lYa~7w*WN^V!U_J`MZvW&r0ijL`b@xmw^95bj=<}x!F=W`xDaT X9>``#Y5Ib+&o2iL!2>isgaH5mc*$oS literal 0 HcmV?d00001 diff --git a/navit/xpm/country_RO_16_16.png b/navit/xpm/country_RO_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..86bfcc0842d5171fc43531496eaa43345bef3180 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_}o-U3d z7QM+S7uNkh-@umlP2YN<&cBOHk#F8weG~RqFN|8SI@L*BL9|E8AnU*i#^$383^%yB URNno61~Qky)78&qol`;+0O|rMFaQ7m literal 0 HcmV?d00001 diff --git a/navit/xpm/country_RO_32_32.png b/navit/xpm/country_RO_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..f1f95ed96f2786d7849b88f6fbc3b7df6eabe412 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_cbPZ!6K zh}Ptk3+w)$cVIbDxW6XJ>5m|H(v^EX&ul+_)-(>xn%NQP;%)G%A&|YtD&Y#_Vm^t| g11p%_WHE#o3MO*7%spat0%$OUr>mdKI;Vst02Yfh9smFU literal 0 HcmV?d00001 diff --git a/navit/xpm/country_RO_48_48.png b/navit/xpm/country_RO_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..0547422c3cdd9b7d5791131810f734608e1de71d GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HW7CDh4J|R^%l=zBPun;@`B-&)@ZaK`;J;R({|^Kh hhVY0wA0t~?F0A{1{=k6)6CT(7Jks(*S&Rn=%okVs|EW2Za}X$T;D`eQ4?ioz0YNSip2;%n QfqEG{UHx3vIVCg!0FtdJPXGV_ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_RO_96_96.png b/navit/xpm/country_RO_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..fd81fd8cfe35fb0cd388a2388cda37581b0f61bf GIT binary patch literal 305 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 o&Ny(z+`V z1mEAELVvz6{N;K6j#-*@Kc^@GCvmX+{~;;G{Ezv)fcQUF7Q%jDV*1a*&SoO7$n~Fr zi4CU)gv8fhOn;uec=+u3n-A}V`Ggo4IIwF7wNQkxWSM_5T(5m8=pp+04)Y)WPzyh- z8W{io{}1QvFY88v7#{?m=UbKb*P*egO=JtOyrQmaSKBrmp8aBa=qMpsp2^(#bGD*? z1u$rqRFxy%^|@rx-KxJWLbtz+>KXgmuLu&ZP{0)7aAD2jD_E^1#9GfYB= zj?n1Dq|g;4i-C`r!x#Yo8v~e>=~OE(EWUU$eQ;mF=Ik|P2dZ|dux53Nfp9!QT|f@v9R3^ zEam{h16OWHi{U-)4oWq_)7QQnj$OWPHyr=~8MA!cYj^K`o4TLr?(}b_Vz+KeBPSXR z003xOsV3K)(Fks7sU!XOz@M+b;J@fU&}`r*ypHwllISEM00000NkvXXu0mjf>#<7T literal 0 HcmV?d00001 diff --git a/navit/xpm/country_RS_48_48.png b/navit/xpm/country_RS_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..1ba379bf6a639cf2175c5df8b5bb51e82a1b4dbb GIT binary patch literal 1192 zcmV;Z1XufsP)?!3?Q zc*xB|cLS5%3i%#~AH!#!=Qq#u@SvNg&cKrts@H)3W*^ip`=EB&HOQrKOKj~0Whc7^ z)#Q3}w6GVHoiLr3YLZxg? z=n1Bee@Ha!jVBur?_gcSj=SulM+`HdjOJj*m`ITPP8cAZCD7o z1|vhvG3qQ8`N#AY)M-7>0IS0Kf7^#CMAqZmlEF4w;+s}#~CVfE5lEFWPI$4in$(_IC*2r6nLoJ!G{B95zC zrp2;mtI4_yn@pzD4^$=CRgl56f+!+UXel8pI>ZVBqbOuxz~NYBdI|{OPiRa4VSFJIUy6m_jd0#bKD3~k$%1J)key}qHd_UJRm|d ztm)}W)c$3NLJZ3iAblKfg%u+jF$r-;6MZ}f7#zpqeg5u(Fb+ro!7tD>)xVNaGFcH( z{lDBG7&x92r2x3DhoJUb2XZh0Vwnc*xMzO&e&^xnyYF0CSkP^oVHvP&0AKe&bW6jo zt8Z?(*REe)yc9_!q+~L4_1dPX3D2G8jvpiSIzXU%Al9&L+eYaX;o`;Wo!@my7$vxN z?pYruY&v63r5Ls8l?FQLAr{fPuE{G|+cD~ul3Z_a2x+UU!f4#Lxn(z-wC?4RsQn1( z45!~)wz!Sfjn6}+NDELsB-0Nvnvun!41Ir+rndKfJt+4il<2VGs4J%l!_o)Zmw1UU_w}>?4$V{*B-t zhZ=tk(DHDlTB(%FeFOdG(hzeukvuWWhCxlK zeDKXSGrrp(LP#fdW-h<{-uqfES2`GX;_=AMTby4w^6`g(qcgn$0f5s`bKfr3Zr{O{ z6*xK*oqv^&MZMMR4%D6e|8LOtI{Tn@*$1`DKB!%uIMBZ;x!#+f4`O)$0000P= literal 0 HcmV?d00001 diff --git a/navit/xpm/country_RS_8_8.png b/navit/xpm/country_RS_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..4eacce7ad51cb922a1a1b1eef0e17ff6485894d4 GIT binary patch literal 191 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_RU.svgz b/navit/xpm/country_RU.svgz new file mode 100644 index 0000000000000000000000000000000000000000..56dce1764fad0b091f16261000074ba363fd9659 GIT binary patch literal 186 zcmV;r07d^FiwFoSD0)Z&17mM>Zgg^aUs6>rb9QF{jm|+1f-n$;;XS8l#k0G#1Zvx)w1zfRZ|@Ly#zfci{V&t@kJ+(REzt%qpehlV@?)5+*8;8=xjzAmY4FqF zf>#23fW9l*xN1hFj{;0e_cP}?=Q1~CSTwH@k&^(H?Uamw!;xlwv4k?`|<`#X{wrl|fEZGU&g3!S^$Ef)a*00qNUF#rGn literal 0 HcmV?d00001 diff --git a/navit/xpm/country_RU_16_16.png b/navit/xpm/country_RU_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..6474cb90c2b4f64d221811a63b9a54d8adf29c13 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_po-U3d z7QM-T{{R19&&I_dtU9Z`ld(rj>wkZ63Ip@uj(*l@F>NQ+H4Ga*+A|;a;CJcbWnhS& V$^G_Z+%AwE44$rjF6*2UngG>QC%XUu literal 0 HcmV?d00001 diff --git a/navit/xpm/country_RU_32_32.png b/navit/xpm/country_RU_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..2cf54df475eb2668d6ed77ae34c91ed6503ae669 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_b|PZ!6K zh}O4P97PWp@Ei_ET_134$AU0E*2f1=C>k;TpRDDXap!WSol@O1TaS?83{1OWX1F9!es literal 0 HcmV?d00001 diff --git a/navit/xpm/country_RU_48_48.png b/navit/xpm/country_RU_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..c07d1e8b181a65d8d9149cb77b2dea2e62e9b64d GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@Hu1^{Qv*Ip3SC#bG`~Q5S)H;l1Kf6Ww SyvPI8%;4$j=d#Wzp$Pz50w`Dj literal 0 HcmV?d00001 diff --git a/navit/xpm/country_RU_96_96.png b/navit/xpm/country_RU_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..86a958c8c87b15dada7c290e78bcfedc0da95856 GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt_4JzX3_ zD(1YswUPIL0S}9z_V4#^d<5cOiacRC^w9h4z3Pu|ch(-b&nd#f#l+g!*j7TV%>SkXN?2UqYR#|elF{r5}E)_!B7wY literal 0 HcmV?d00001 diff --git a/navit/xpm/country_RW.svgz b/navit/xpm/country_RW.svgz new file mode 100644 index 0000000000000000000000000000000000000000..f92e743e8e4f2f83d24e443555592a021d89850d GIT binary patch literal 816 zcmV-01JC>)iwFoTD0)Z&17mM>Zgg^aUs6{tb9QF{jaA!j(?Ae?PQGF>ugQ96clL&o zR?tFKiAx0q#8YKrC$UK4DmD%9^~^eHx+_HpMM}J*nRCv}9B(G)zt$`EP;J|~*-SIw zB4ce=Y|3KQY^rItX|nUP;pExnhl|^9H?LXyuwXZzU%kD)VA(j&zp9Hozr4LI@9$iu<1su#;{ znxP;e!@;gDyX7=9`%@$n!kMIR+UW^4DTD~!QaCr~GkaFc6}$iWeO1p`*{q9tGaQeDl5I8XNcMnISJUjd5DsTPG;(ZP?i)?|&QFxieQCfX zrEsE@j=v9}`AGqGru~1Ss3XdK(JdpCswn1S-lvt*>>bnEbLEUyBS6iKq9^v2Y3aDq zPTLVk;0_gpAS$jv7#xAN+*=u9;5m8+R4xto+8NiEBiGJ5DmR*2X)pwZ=LWQPluA#+ z*gi;^ltpwFWT-_S1R=^e4IOd>0T=_K^IQuEED<+Sf^lA%NF_SK4FamT9mJqVp-nnR zt2hedM*v9dG=dORmP@-Au1QkQPMW0$MLGpZLYhH{h71|VL2##N1dozXsgc*5My*}1 zi8MRwtQ>j4t&Y=Nkb?*=2DH?I5ukL!ZHZdb2vnp}1NVvsAmernv3VfUq;nMnDKtJA z5?R7%;{_z+l!}BnAyhJYP5VPo;G-?km`RpZMqsi~5=KbU`=`Y#PFuH9CH_eA4puS= z=9BGW{wISzYL$tXbboIK8T|1Qwd1UW9*fVL#d5`Vm`UX?aB zSu1&fI;Y-`+drnoCOHB=+Q}r`vGX2P#vVPk6Px+e8~^7&FAF7u*uCVJj0P+9;af1E u5Bbf|Y4neb1mjPS-FDmNN0r{O``Gw!vq|oHg_H0K7EE0>;LG&5l;rZox-g90ATPM&@*#^C0*bgDfz!v()LsPB1opsGg1GfQAFjnLzZw(*?G)X|N%!G_4|iGAOoEmeS|By5oO0xHIeOtK zG84LcJWIo+Z0+@E1Jl*C=0hR{zH8*+eG$8)X z(9A3PL5Nm{`wHlLf&pLv_`U4V_DWv?f4`yu;2!`!0MPfBX|d3I0RR9107*qoM6N<$ Eg2O<}=l}o! literal 0 HcmV?d00001 diff --git a/navit/xpm/country_RW_48_48.png b/navit/xpm/country_RW_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..cfc0483ddccb68eaebce011b307a53e6a808cac8 GIT binary patch literal 800 zcmV+*1K<3KP)>o(VxtV{nTX`Y8-*~TQd z*B3Sh01qexd=V z+_qe*B(}1f1>%^`cT_s`URf`{^hxP|*!Zf8TL}u0pb!}nzH>+&6y~!A=VueNg;v$Z zv6g3>nzzrnxRCGoxN~M*lP-Iv(k0J5DZHXKQ5BM~+{49QCa;7%(_eEZI=Ph#?wK6n zw{$Tm{1}%*L&6-3RC+>5T~rMIY4dZBO(B4MI1K=O{Nk$C)bEVm_l++W+f>5R6KZ1< zes*m-+d~M0kx|JpGB!1Dta#+Kb4j!*K1JLJ=z%c;!L@QXx@h|x~C(Bz%}thfL&u5Eo*RD!}&UO z$-!umLZIBC`Y-#EJ$2R@3Cp37drD-KBCyedKUq3d)a{jy4Tf(~6VeD)35!8r)tUe? zYnt>~>GR^9bjefcP@NC}Bs9s3x6@jk0gPhs%OUMjM$P7!!3`@ui>FVdQ&MBb@0Affsi~s-t literal 0 HcmV?d00001 diff --git a/navit/xpm/country_RW_96_96.png b/navit/xpm/country_RW_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..e917f27406d1f2f6807ffb80c6e73d1b59527dff GIT binary patch literal 2204 zcma)8c{J3E7yk|>Yf6gjgORd@5r>koOpI)eHIpT~@lcN}%`l85WGrKyAxjt(L)OYp zWy$&~CVNT9(lEA1c>4YRdjGw1&%O7Yd+zqfy`OvIEzAs0atU(*0B{m%WPm!>&cB(1 zE?oG>Z+?RP|$D;x(%4#92}H#}L=jMTv~QcB?n2Xb_)IWU4(mNq|^jcFx-uxl(tQ zWa5~e!Y(O!inIdDnVOtx+8NRDo4T!`;`ys6W;%CBB6v`nIW?1e(66~Ljpd-@!OBi2 zLrdB3HAaCYvlR&(DH*Xb3B_Ce{eSSKR|(k&@BHwiZuKYjfk&dt)VS(dg$e8t;PLAv zo_rHInPhlOtm?!u#)(k7~AfU>tQdtd% zNaGzRS3h3&u(&%vS|pTPNWg%-JZ7fUPM%G6qUCZ8nQrE?lGtF7DNmk27j6IhT}A%i9H<$Cs>QBy`vT8zIW3 z8xAA(i3>B&wc~jt04O2)8Z-xQmw8zzSE;LMmBZEf?R>p9IUDlFhaB@1PDG#@T*L)dj1G5xzwEPgJ0 zDbRVU?!m<}`ks#X9$rKPCXmSk42$pN2DROjRuOb7YjEI+`|iFM6ni?LURq6(QXYqf zZGT)_yi;>IKJ&}ODzF$nFynIrf&v|{5vOHT{0ZSWk zaY#;@1;JlU`+IrMb2;4?>!XIr{t^K>KY8Vswn~uFi0AT5ajG_kx8^jxm$e^?9sLEJ zi&71fMZ^KKf|dCQfdG=yV@@C#H^r;58S3TxQV3oo{@EQA1y3jyyC zAMTHRacL-pwP4tetZ0XfiQFbIc*OF(vmZbb0*!5xT(TkbwuvQa?0i#Xyg5K{K2(>#VG3gK3@y9RiV%gi$RslL{>OnY608QjUzn3@L3N) zSiZ3j*lv5|$-(Xf56{()prm^h|Jq7|s@l77hySq;CA%S8vsc44tgNX&8Jwevtk~mj zMJls`=ricz<<+X!Z6fp0e4A!cCpT+VB6kmKb- z)`~9_#@j|vP0_0g9!*TOMq~;AXCcKdf!!_UbVrOLn!6lpyBuLk!V@k`v};VhnZl9h zX3m+E0#)52!a+J-Khm$jV9cR2D64wv?Q12mj+;&|EY7G_%7BI9XuHiev}zffkDccl zx|y;DVX8%Px&Vabv(Wq1#Q9eKXXDPasjL8$;XXKYukCYw54kG@RFI0^{nayC;FU+Y zwIE&xpE$aE2$NknlzY6*3cuq)B|5|_**{%|!f6eT&Gx%={_UL%YjVOkn+oJt|9ZC$ zHm{G$`ZGBTf3{TuXf0et<|W9aMxH;TDi-K<@e6LMtyMm+=_)hObh?(=hHEc-CUb+| zrKG%&EHAh8@G4Z8sn#WU?JCHb`1g<6F7tEC57Ps%F|dw$YwAPbo{D3emm`*W(KHS* zj=o7BM3Sw=@dY&+-kd#oFPn5y`O~hb%i*pcEhu?ZBYs79O@JHgL z8OpNWV`xkl=`PAe-gGMrH&|~MXni0s zMUN(0H&Xz!ev(3YBaI3&^8mSe8KxCtZr2zY!b;nM8rSJy7Dvn85FYo^rlX7s2p+Y z(L42>4VrcA_mBCqw+bOKT$WwjMaie2H8wxc%d&!_h%Bwe*%G62+v>o#0qB={SFeQA zo60BY9KaB9#g5jd?t6@{!n3uMS5iPoJ3a7C6Y_5Wqjy_rC<`|le? z3S@|vq)z6Lv|%tbo6IRrf5uu}9+|92AaST})o;|A4Ud7j^&-HM?S#|Lx*XLIHiKqu zrdjeA+KC|uo84&^1rCrvH1Kbi|7so{Z(FVdPT-xu~ S*9$y;HvlBU%z&onO!x;U3k9VB literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SA.svgz b/navit/xpm/country_SA.svgz new file mode 100644 index 0000000000000000000000000000000000000000..48f288422ed5077297e2b55eed25bb263b76d1ac GIT binary patch literal 17866 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

1|OTNx-u5Y>`f~|;G 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

Q9tfiaSarO_1<6l7iI5`*!3C4LyAf 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 p2mN#YWqi!(;(fC)Vn6C!lK>JYD@<);T3K0RW@{ BQ_}zd literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SV_32_32.png b/navit/xpm/country_SV_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..007af4da8a117f425c6c98c58d08b248ff2053de GIT binary patch literal 365 zcmV-z0h0cSP)lA)MWu<0}l3ZRAWn-+asu14F2sBg?Wfoo)n1U<3dF zr+QS$R6ts5Zm(?XVMw9~cL8>u3GpKuLB;R=oy1v3+GkU6xQ*%e#dWy9s$b*WT{Ed2 z4ludJ;n*7}89hYvO3cXQ>G1_5m>gFSMvYc)8eT{EcB|vQb-$P(H=>ks%S+Ff_qWY% zG03lJy*Xw60?LwWWO?0^YT_2h;t_*0SjDvZDg{(;~Z$hlmPw0hs300000 LNkvXXu0mjff>N9^ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SV_48_48.png b/navit/xpm/country_SV_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..aea4ded792dbdb750fd601d58452c01cdf45aa31 GIT binary patch literal 579 zcmV-J0=)f+P)Yf)^)QkM`f)Mz5HF(jI3ybv$? zTDN4BB3Y=gdoJKwWVbZWyY|k6oeG^jmz-{nMs$3xIzunkv z9%UZPZv8$_zuPv-hV!hNhS*f#Nxmn9dkA$q&9f2|^N=;$Zol6FISvr~pm2aNYMS=< zFDGiG>yjjm>cdg%pnlv%E)XXiP@}WA-pIXp?8I_E)%^9BPe&_9$@VD%9Q>?tyhG9A znWro9gPrb5#`^reUO}lRDJ?l1*&s#30Fm=MrF@2deEs#2>)dx#Ev>|+-PTOG2C5zg zNJ=QOlPw*;Dp$=8@_l9En)X3ji{LguF%*zm(8p(u`B942j0Mm4Hh!!w++EaSQt(aQ zdq~l%Qtd0)}{nXOjDC zPb_eMS@fpwV?EIWSpy~b8+{R=i%t^%hZqSED*<99K&%9al>o64AXWmz>Mxd}zS0Mc R$K?P3002ovPDHLkV1m{O4Ez89 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SV_8_8.png b/navit/xpm/country_SV_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..e1bf0c027087d9ca79292e2fd45f05648e8cf2e4 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}|+PZ!4! zj+x0R0W;1w@ERnFrY0mLaDEJF*l^=U-T&Xme>~^sZaMwq|NnZ9*Ec5{pXteYbgAlv zTWn?7|4-e!3-ppbp4Dk|fBgUde-8)eq*zvlhVNouiZ)FW0GiF<>FVdQ&MBb@0I7OC AM*si- literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SV_96_96.png b/navit/xpm/country_SV_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..49375e140ad0646531f09add93316826101da40f GIT binary patch literal 1639 zcmb`I`#Tc~7{}+DTsD>4(JUcR3ZcnH<7|vE+JrbFCAXY~F{TI!B|NTSjNFn#ajXl+ z{hGGST!+HkFI#R)trJH-od2Nb`@G-J`@GNl^Y@$NfVGm5RF(t)05aBSByOLcKSx4% z-vb5Hgnfv6VXTmVy`L&-s>s+sfUS|{j^PyUq}wfgD4=I!>VoOwHszC3LyEhJ<=f;S zwn>jA0*R6oZR@oF7%8hKYHYU0bwf4G?WFZJ%>c0)N;0yS5K8F#5(g!Mk0#ejy?mTi zTYG72ye6mM)gq^Zi9GV-;&KaU?=wCm?^eql*7n>QH90OC_8(wUADf z6;bQ_MJvTGuO2!_6y^#=XZ{mQH}$=Sj_RGiCs9THqNxhKXWQBDIj7kg6n5~ztxC|_nECs2n#L~bPZA4kkNmOR zl!_s=;nw=@`g9YEqs^Q@*Rt2~arL;I+6Vw&VUW>BK!pKpyq%2TvD}*&E$zrEt(+4#T`ayBE7XwsH!K;WWZ9m6qRsN$H>ud7MRk-17*Gz zINNPg$YJj>G>4Nkzlow~N6 zVA9MEe_|5h>2EoxI39tUfh&r{ju(J3bSm=sDLTgfamKhT%QE3?(+SuqH#yc zVUZ@{|0+)p+ZXymBN$)H_jz9?0p3Hrrj?A?AXp~sVm`WgQ8(FA)HO4?Mg#upBc z3C4~ZfOCfJE}u&GCKUuCUsJ=BSb1fuo=1x5MRl2n({N(gntUBT|Gw}Ecj}ZiI}`&i z*+{=3k8+m@$o&*nIQ0@BKbVcxuDo|9^#j%)K^Cqp8HH&=-UQzc4D33<8xeS-7Jqco z7GMvO;J`}E4P+(|pRBv9YZ2x-M>cd{?Sf-KGC#TE& z-QSh+W!P>b6^m$Dj}4E|+iO ze7F9_%#bG;O6*=Ke3@-thz(F5Zqe$)r!80Opta79zF_#EuK4>CxND8-F7dO9skT&CgAW6b zh|o^lW~!k7Df#Sq!F)PTCphsm)vfGkLlftlubRJBaP#RYzgKF5pfa$6|7*RuPWBxR z+)HNtt};Zr>N$VIp{^dOv>J5%tDNz{8WeGK9v};#schD_c+i0eou{=6y7S@=K&$Ud q7Zzv7_CSK2v6H_tKmQNoAHYNrqpwoXbCmt&09d22$QldJ*#7{q1OBA| literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SY.svgz b/navit/xpm/country_SY.svgz new file mode 100644 index 0000000000000000000000000000000000000000..27d46fab8819663a57ff60d09ce243d4e76c9f34 GIT binary patch literal 340 zcmV-a0jvHWiwFoiD0)Z&17mM>Zgg^aUsG8wb9QF{ZIMxKgD?z+-+PM4d)XuwoP>m= zBJBmXL!dSkG#V<%O1IN5bX|uw-eUXv?f7@Gy&PL|cKy(F-U6ctWC*3-mu=^r1>eDT zvnq!3fke;`7U~dA>ogt5k&c3P{UPOum_`D=k@cl*{M!=9j4|o83S?~dp|)T!4y;{s zsDlMH1+%{}*sKUCdbbOtYTDMqLseCO_*tX$AHH*parLXUVWf;}W+~RB^q@aq4L|{%;&WTc*a#V?soJy@GB6brz zqnc|Xqdqs;yo!nnt?zmn^-Qz*1SV;Q`91S_+v0t2Gw0<@jM)78&qol`;+0C5;hp#T5? literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SY_32_32.png b/navit/xpm/country_SY_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..221da2a9996338166eee2d84f17c6df7fc6d3d1a GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&)3c)B=- zcyuP)sINHY;C;X)__DjM#MXo>Ol%+^#%NzYE9$_H|NrY}MK$Pm?ECxEwMQ`i{~wjh zO*^;q3nm}jbGzMh+k>~~^}pNgpI7_&!B_tC^J;%Lcz@oUFTbw7!tD36gVpon_y7Ib z%EE2;_gCKDtzSR=R&SgAD!;y}^K?`6{5XlcRr~+^>->7{+WGzU6A~Jg)@Sr*S}-#^ zPivdJx5Y}2TSmpi$aIc`ghbU@C6Njjj|~ltjSoLwFPD_+TVGdmY$*d%-2WeQ*1h}i zYOl6+Mzk*4^*~uv*_qc`x>*9nH%nS{wn-3d?Elmdcox#)9 K&t;ucLK6U3$cnT8 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SY_48_48.png b/navit/xpm/country_SY_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..92ce9c6694acb71e8b244c485a0235223bedfc0a GIT binary patch literal 497 zcmV2t$)+>1*gCD06q_KgRcvHVC=y zYH7Er9#}2yBG+wkkXqAol`Gppers$8jN2+S`A;)UB6-sm;iVZeCo7 zr>3I{@zGgB-MBuiBRgxT$=;Y8md5%97l$T(Uy)B}E;f4eY8Ffl0Co(uTM(zB!^9N; zOv_4`4`mG%0P@wcZoSM8q=+kWP>;}+nOu$tA^<3oyq-*Rz|jP8z^#v@hoz|ZknQoM zFdu3`5CB93@eMTqpy47h$kR+bT|uGYH~?TF+k2(f1QpGjgw&s(U3q%1KihTsAn*SC z?201EC+02H22q~n4ZhG7_nVg9>Mm|YnpwM~B?00000NkvXXu0mjf&cWSh literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SY_8_8.png b/navit/xpm/country_SY_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..f097738a4b981389cf03aa8294444dc3ff732bc3 GIT binary patch literal 158 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SZ_16_16.png b/navit/xpm/country_SZ_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb4ac7dfa58ca84f32f73b12fc1fc1dee76fb12 GIT binary patch literal 405 zcmV;G0c!qwOhTgGk{THgrg8zPf{QUVn zJ3Bj{gfyolKO+n4pDX*A|NZ&NIQ zlIKjM7<2}>w_5Eh=m&3*aSt^ND=YY7S-4-5PI=n(@0!#@T_CWikwgY~9{1~)sq z;*~3m-@l{B1E~?m5Tw*2h5*#Og(>t~C+`O{;dLSWT1GG)cFcHrdVYc!<{e zsEx=T1b_B2JKucY{}?_7`S#oaH3O^4{$C)U(0E+|RRs`vqbk4pEkZZ-dQ}B9dE#PL zYmdW$i;G(i9N*L4PLx%`LbDpJk z7Zm&+!FoIw-X$ul_LVU!OvRZkTQ&m#rYL)DZBkKE4D%<#O%|`&OKL_Dp9i z(TWoipw6!Akw|13>1}N-+P^)AB+F!ZquYA$pj=cmM+Ha+xR3zAq}FhPOP7?|N*9?G zx^zl|;^C*m!(ofXA_zi%fB)#{=-S2|;oDc0DS^y4;IfrPC9YH`1cETDz{DDfUoHtI zMKCE{ur}}_)YR0pzIt6ojLrwqWWr-(V~U~(f)EGuwdQcODq7m-END;l1wH6faiIwR@>g*ZnN29v6xn? zt*EE~fJY~r{UGD1b9vOEEh@8eDP^gFkWUv$H(+}1aNzW5r#nDu-#)k|v#Sq*)SUhl2m zUZ2nBa=C_vh7dx7gM$pi^z`)D?e>9z0i)6A@p#@|xso`47k~zUS5@V-UK31tSIIvK znE4M#77>v&UsG;=|NiCT#VpHm9G6HW03el0wY9aS(`mEW>~uPHI^9Gh!ukEvB&PJZ zkP#UE<1dD6O^=Th6fPZpQ9Ai4_lFk6RSOn$avaBT(P%UpjmG0~gTc_!(!wx|)9GBa zaN&dIW-%0+rn4r8!e&SH+ipWP{o{~l3)bT~!?KE^0D#SA>*(mHsj10rJvnu1^z`W; z@EMApCriJmV79Q2jJPT*pC^-|C<=lgNm4^Y0|sFI{!eGm{_GVRqRd?8>!vxg>q{hL zMcKPy!;)YyPqS0qt`T{yDnDpoZpZyQfn!~5>IyvJs#O*E_a9#WzQAWr&uvmnKS;6w O00002_X&Gof;q?_4 z)6I||B;HRqLZX)3k}WwPbde;}&5$5`@gaN^<<841)o6mFqomut$eJ%|dcV>5jnVj_ z(>cCn%bVA)zw2v@8B;g~PDWQ5yglK*d%x=>;~ygut1{to+3M@Dfq{hvU+|JKa{2Mx+`B`M z))=>D(c>Ehw!l=|-rg>8%PA5gz!y*?D@xm?E_{%pwKPr@$JFQlE(%)FX z9vao_n_Mo9MpIT+mXV>J4(ru?epo>YLa+7GS(QrF($W(3q$o-*mm`EU8qK=$@+-Bq zSbskN2pA?-RRx_+s;Y{)c1<}om7FDY9})r3N5PD2F=i3MvL7zW1A#zsadAmWiB_vs ztJOo!!1%!9%Iy~GrL!Ez-M)Q0>TEC=)M_=3<65n@qM~Bs>7)0~RXZnyLi1ZY_MaKK zbEkXHo|H7R0wDlsQ3c{G9TrR9pSA=agiJ*wy@Egp0YD@Y;d!1&)qz$TH$Du0qC5Q^ zlh@fX@R|R{4dug!Df5D4$pkWzy_=sA6bhMuqcHw_$2-FX2iklL!vKIxCQ~RB2%#uP zR5VQkKvPpwb8|BQU>Fu1#V|~vPyj%H_IG|=g-;L0ra0+Lt&&#a;*4De{r}ZPS|QI= z=GnmBpnRo5@O?@i!w>*K2(U;v9P<%H5mJd|*(gWsI}TbD0wB&j`!OY`eu{j-F~W9q zt~7EV#RW+K!fDL*phl(7(>)y>&NF#_A#)-;0O;W9dlt*dt}XyDnM^e`HCnBfB*|F5 z#>U31tSkVCRw#ZC)z#GjK<`&a_|qdiJUi+)P1{1R8E_fb!5=8RcQ^~U7=yGAd6g6< zhR1SNX{Oy&gpb*4?e_I?mqW75W;2GR?rOs}+gNLByyY=z$e!`4nQ<1wgONx=Q6!V| z#~=8pVkJwn0-I3DNMwIF+?0{w_xlG22R$B-QmKrMB7_bdIyCkC;7}Ar5Cn!{8jXhM zxVz2GMBIu4!0Kt|qnuY19Fq~6%!WCE)_d(%eL0t1xbktQWT^1TllRNYzVGgKxm=PV zk|Z~5*kCXilFRe^kt5M26t7IiOO6kPvI~oxJxVbFNLpmQ5Hz{|P>uF(9qmevzRhmm zVX-9JX__{h%{H4&Vz*ztI&u7Xvi~N}olXDz3W2fe5owmxomz~xqEuq!@}v3reTmn2 zZf8%;*^$ytR9`Vq|2NNH9UDb9hE#OuY?fqX7Ul$2IzVmeNuQ(9WGZ z<7p<{?(T+$IcNYNnFi**TxXM95Golav}Vl%uQzJ(`FyRdtrSIV-n$K=&8KCc`Lql)pZ*23 Wsu6QoPSFDZ0000<)%~{r(*4|D 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 S;_IKU2{1Q-856D{;{F4%p`jQ6 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TC.svgz b/navit/xpm/country_TC.svgz new file mode 100644 index 0000000000000000000000000000000000000000..3f5daad2a19b648fa69dc2469f52704a693305d9 GIT binary patch literal 7949 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 LNkvXXu0mjfG@Y~@ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TC_48_48.png b/navit/xpm/country_TC_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..b398dddabe628c01da782692d90bf3b963212edb GIT binary patch literal 1378 zcmV-o1)chdP)*`hV!5F^e$JXUb~%Tjh&sJl$5MqNVk%b)vZTzNB8c@s;kT4xKK#Y4ODsRj=BBP z6NkfVx2LDm*RLP7TJyF0SgrZL9DT$0!NIKh`fR)1@8?TPztRoV+dHu9%fHPXmlYGs z8oRqc(=b`B`5o1k(L?(cO)wbVzWqD5dssIR0L+-$E-EI5Nl`P+*OZr^xp{LyFU<^S z#&r6wx$UBlFw21^Ae?JhPEk4JeEa5{OnTbD~}2leSRP!Uw=G7gcr!<0bo!4x(rr5q}PAriyZV`vx1^_8S_=oAh2ptWp z&fS*{Wn~3jU7yml!E3jB8yd_Vm-jS3jxDXI_%;{}=WtwRZSCXtcDH@Bs;sO)ZQR-L zJc;>qG*y756iJ|-jZvdsQk+(uyTp8rkK@d(7j}Prf6mF^ay?Q^*>-zYef{Hu``V7= zCNwc7Kr%z(R6M;>m_lhZk(NS+L!=gHA(~jzNXgI5l0aN9E-UHOVq2GoGN-5g7|n(oeGzn-*ng*~rMUtO9a6Kc3a( zc3e8}{ea8$NaGtTrpn5*JRg}go&PZYX7fCNF<@9ZG)4B0KMe8%CdwoMDR9KOcJtmYqgp1ybE#(iy#lAfM>Hd~W&pE8df^B#UbZdqUgM`a_)PMFqpJpC>0 z#)XuKKoT+~h|EM#j1TfT9NrTrvVQpa-ImdW_a-*8zg-T;W!BWhtqFw$AkzTAXo>^^ zC^SW^+Q8=(P9lO;Hj(*3pwlTGH*3}`zteivBs~Oxv#0Y&5~_|40YHQ-Sif(_@Ni&$ zm*k#h9*U1doH0f75K4gd^D1_Q@`sz=Kgr2FCfj z;eP`;y9Ohv+a@s?K?DH2kjOAw(RodE<4rn<=cCv9%ilCcLO=#(Vv8x<`Dd9RNNV-T zUG_@Wu3hn$^T8coHv%Zke5bH-&EVj3wPF%L^KX|P@%wr7+U9*5Z<|eN4ebZIe;w2) zeie5J04NG|UDzT?xN^TslC&O8Ul9lZ7={D@o>!ecN|L)%$0i{~$)bBMTLLA@5-3rY kK#8&hN|Yr~qAWVlKLO2p-nZ)b)Bpeg07*qoM6N<$g7_Mj#{d8T literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TC_8_8.png b/navit/xpm/country_TC_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..b014922470b03fdb9355144185d623afc201bfea GIT binary patch literal 218 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 Cx*Wp* literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TD.svgz b/navit/xpm/country_TD.svgz new file mode 100644 index 0000000000000000000000000000000000000000..823cc66e72b7a57acf61d196f9a8e49c2325514b GIT binary patch literal 342 zcmV-c0jd5UiwFq&CwfQ%17mM>Zgg^aUsOacb9QF{rINuZ*u9phd!j{r#iro%D5IQql z>YU=sa~j+sl#Xf6l+l8sHaH%&Tf>VWfQc2%2@aKX1w0xjR*XXs9PF#7=`~D6CYEzy zAxdr_BBTca%wAbmzyq^f=ovH}-o{%0nwMxAVcz zWuyE^7E-CfB_UC-pI~Fv6v?69oYW09CZEa|?w&kX@4^GDTnU8mXLOoQ?vLH|+4g^e oZ-i2&`YnDMbxC}Cg75zmZ~dP-W&7W;eRyAe07AWV7_R~V0G8~bDgXcg literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TD_16_16.png b/navit/xpm/country_TD_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ce6a333d483cd6e39211604d1935bc74acf50c1c GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_}o-U3d z7QM+S0cZc5Z(z&wk12Czopr0IQ`ZqyPW_ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TD_32_32.png b/navit/xpm/country_TD_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0be529144225597e0b4e314a8feaf6d6a9029912 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_cbPZ!6K zh}PtkfU|$jJFuMix~C>7=#U_H(v^E%mu)|O=ClsXn%NQP;%)G%A&|YtD&Y#_Vm^t| g11p%_WHE#oN)B*^8Zadt2O7-a>FVdQ&MBb@0QpTbAOHXW literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TD_48_48.png b/navit/xpm/country_TD_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..9c842a0d41e0b56688cc6d47a807e9d066448d45 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H;Ezvn!W$IAL7-`DznJ-^Za>+6ue%+5yx f3`2NC2~u`R{w!q~=X6&9?P2hA^>bP0l+XkKFI+V* literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TD_8_8.png b/navit/xpm/country_TD_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..f4ce10b482f8e28ebda46c8c03e4a76b0daacadd GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt@zo-U3d z5>t~?0?z(9f8fA@39l=E9$C_&EXD%_+aHzq|EW2YcMvFX;D`eQ4?iozIY}Zgg^aUsOgeb9QF{?OAPavx{#!REZ0 zC-KtXSi74C!ERq>s3_M#5(g$TTa()=AczEhFCO>e2lI?dQx*F%HubhR9!i$Usuw*R z(1F!LBn-m<(}2<$NX)8ZZljl3UVSy#3Jy+fr5NJ?c)jH7q~;YsvV-4Fyd|KM_bb?E zP;PAS@asdzoMDvMWS}O^KUQ(HGb5`lv9_H@TT|_#*i=DFulFC)#BP?p#JFB=OuF9K zrO%u7D1?rXCQBcVK$sHsx^-#ZNn*t4Nwl#uWO0GWcwbV)&bOuim__TSV)bM<=IOD7 zY}q`$FZQr1^Cw7@r@ult%Gjpy(@(IhPz&Tx({ogTrtjw;9*THhXNd>0-g{#$WM1{* z$D-QoBlP1x-v99P_a7ci_0bl)v9n-ux3^E`#hU!&HNZE(vSvHu9nHT71&gh*Q4-n6 zDLcW`QV0vfS_Y&bvF5)#Jf2ptj^p`nMftH=!s7&@XRxyL{rir*Na8u9!Zxz^={8y$ zmqmYp&@Y0XF%q`No#~aH)V38dSyf5AP2Hy8y-l<1Z_bGC1)ZNk<7jh?U~rB_&>pm2 zb>VPPO+KaO&>+$Rd`R=8ILz8i6N>rM5>0CACKU$)JMgaBL?E>E=@heoOo!vRjB7VP z7iD6~jzP{Cagi0}(*H`5pB6|iH_hZ4ifJL?BU(Z zCF6L(utjFdD0fjBaJs{NE{ZLj8EK031adK0Vj)8e6U{G}&YHqVDysAq%wa#i!a7c{ z;(ZB~YG+w=Gyu|?(U1%d(_)A5YSl&2F$VD=T;Nb+KH!?|?&?n94K_0+xxykG3pC(D zZk_w<1ZL0A1srn~WnKKn{9Td4#nDQfieQnLD(++NR&WI>|K8nNUa|6ii?S>|-8PSV zyU!yiO%Q7KuBzeQRYjOq?Uk@Avg5kQ+iE>!Q5xmztaT3(v2h9C%{cZ5g}+2%Z`Qq? z7@d4&j~Qgp3QBq2W^Qwkz}c_g*1b=sz_oXjiEXRs=#otd#sni~h6(RX3^L`+9>!D( z{;gZgnpn+=KRlna0Puw!@x1ML7nZ!23CAI&_60jzmHUAc4G zF0(W@P#5#(y|qKyzaSmw&@W8cQtL&Q!k;;BX-NckbXi8nkqJjFR;$X`Ic{lv#IE5u zBO}Cz%MLslBCR+U=ipHes1n8G1%?c+!$}NlhhGa|n|vb-Iigr-MFsyq0CN}FO?S+$ zKNpE{9Urch_{K8=&M9M*^u-Ibzk5t@NL|I~9nlnpN@(Hz4bR4@n!sT|WumvnS*Kw@6%tWiQ{8zkHB3{7v5*`QdJ(rS z7NZzXME*g zAUG?G0!jiBs>wLcc{mp08bL{(se_D^T5vYDEC_<}K%99wI?Esy-DCzcaZ+s4&n6kp z9X-3)=gAe`DvNBD*4*LHH@FI;a!sMBKxJ~Mn_*uaND$X{kWg5Kl3hxapy31)m2!d& z+bKZ|#u+@J-_7QX;t2+HJ3!}>;Z9WbBku5S7UI8@%m2e(c5!~!x|V)rqq5^!NRrBZ z4Z8^%ULo%0YmOv*Dp5`DG~7Il5Kh0DuByrHFjgah1vIid*9AffE&ZEUdGm*Zevn}5 z75R8Og|8<4jbgb`YPW0kYQ5jSGhTJ$OkY-i{9F50S#2ZuvVHk_M(!~DKt;mvA&Cwp z)FuoXAyf2EUt3f8`c_+Swe>a#z72w3HVDEuI(Zue`#})KH}^To?q(r;rwWQm_(hW- wfv{;zFaZS&KCp%QlQ%0!u(xLQ)~v2Jt3|NBf46Y|tGs{rZ)(c*of04b0MF=kbpQYW literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TF_16_16.png b/navit/xpm/country_TF_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..3f7f6604a9485624edc1049e2905b670f8b69583 GIT binary patch literal 314 zcmV-A0mc4_P)v!>`|ee*gKy!p!{a)q7@Us7e+*8g?JOc_YP)3+kLLbs_AR6K6kb?18YkLwwZ_K4c&ZFp;Ni z)Phk9MlBdw7O;eRSi(7f|NXoF_$8F1q$rS?02Nn|V<5LIVnisBF z*7=<5Y&Y*e`~BxHno2S);9zI1NDKV>?dSdzSH6D#@%r7T%JjfzFWkgnQ`#r z=WkFW-LP iQb1;X00(%Ch5!H@<@JdL374k;0000EH9nHZcg`>;eIVd`|oO>tW?L(Im;#cVjy;VxVpSP1KEp_2}J=;cu8 z)elV?S9-yCj`KsG4^8^K|L4sw@9AmZQvwf_<8FOg_u7sM)!&`zo*P=_)}UiQyjfd& ztQBl)0qY(ArD8zQ6a$K;7*I6DfTAe|6iqRpXo>+vQw%7Y_^V_|L6&%-D99lwO0Yr} zY!aLR5wGq)9Aw2y76mc!ydH^jHt5*r9apamjj|6kcc;F$;&ah7P9zYJVLMwHhsWdn zPl3wRd0!pe6|yuoZeH>D>k+b?++`Tr8J5wa{#NI;RZPS>o{RayJ- zD%ny1)n&>&`RW6Wr}ek*0BG*`6#&WSx!j?#SO$9jsr)ZbUjWeF)#rCMtxM07ukP*} z{%zP`w%Dhv41mH-SzXt(W{Z7p2R1KRb(wPC_AQ^iUn5;24k|S_zBSU`uqIUo;A!Q$ zcWSmCIj}Q5;b9XI59!n0PuKsHSZtN|I#}IpzWvL#CVC*yI(A+KX!I(+`Q+5qa>dfvI(0LnwfR^UqwRdrDqk%NeLy2 zoIrKw3u+#3!7JrYxZEC($Ll}LEl@zum24ykqW*ZxuBu|clbNC$&3TJ$`gn6EfWiW~fFdIY zc}U1$okm?C-?#l4@j{VSXS_C`6HxqfKlT(BWbJu*^V+oKBl$VW z>(}ZnwrK$GHJk!)eNdO3zS1${ylF5+$Z`TSIb}O@;i}O@``~t!!pVdJ@_K!}zu!uXUwmWOFwY3*4~nw;6KD%V tk^GPw^jvW}ApnNklmF=a|L)(9zW^IjSrmClXCMFo002ovPDHLkV1n_w2k-y@ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TF_8_8.png b/navit/xpm/country_TF_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..6e43935099f38a4b026ff5a071b065f9af42f0d1 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}~2PZ!4! zj+x0R0o;}KRR@Es_m^4DU1~nh@Bo7_Ghah+Q)Ix!lJ}k3(<@xR+14FCd06yu`tM(V zm-o-#zj4q1FJC{*d@T?frKPkTj)q;cCm+5P&^y1qyRorxreg%R-pBX% z_dkA~zpvu+!^6whYgonY`T61N@AJR?;|vW97#QRY3^(m^*k=rM4uhwwpUXO@geCwo CE>Zs5xv7xHA?rt4hRCh(K z`zUD=N0Fl2Htzer>I!X8ain>5pZ8CApLu3J^UVA*^UU*^nMc>rwi05BVgLY0pzN%i zj}ZG^!GcFNcz-732#$H%+gbtq@AAB>A4H6-i(+d_E`YKFziW?^ zil6OO6S0z#Dsx>(>66cJ)-J0E_I0vn!_THwlx)z(_m^qx0w(PhmVR?Y8#CZ-AI-fI ztaW}!gnITk<~CXCczPljT1$GY6mHigfg1a`J~cg?mX^CYwaGyk5bkUo2XQMvazz4} z{}dC`{cA045mOVX4)dg#j?LoyF2lSl--d*qBV45fb-@Di34pjooG_%7EQK`(SF3{l zui;i3H5s+6O9^PoHZyFduF0y)kgV#klAxmI(0=wZTW+)r^Y>7 z+CGzF#$$yMBqY+WU*1}JKji2tx2m$fX;cjBi8#SINf+l%oYOdqPCb0GyqAyUaUi~d zoyhr$hQ;!cr*-6H$NXTsJsw`WKywBT=Lo3k_8{1+E|=?=-$Z$wK(Up280@~o zVm}~;3(RzU)AJ;88df@`nF(dYmF5q6g9mp^5gT0}aHUh(az?C5Ex;ypBh$qXFx6iIy2UBzbf58CqfOVXMr_*G)E^cSV7z)N1u9==K$ z$lHwY#0T|G`m(Icr%pb>IOaUw{Q54gVxnF3FVC9Aihsq?<9!qPK zZh72eMl-&dTsd*L(wd5jSBzUz|ko7L)%_pH-EAKx?&;t+T0}7B$FXsAwcBpF7t`?fKBc# z*h>Y<+|$SoHd%lBW{ZLMtqGLI~cX?<0>9hJOge?-64s>UJhRcQ>GA0UB zM1|rQ?TbDE62L+wy5X<$KA_N%hCt`SV{rzT4bPU9(+9_d0eG&gp!YGoYxb+M9N7WqBjJBj^X8*YY`GAU*I` z1DpsDk)lv91gH@{4N&iHT{W=mNxYGG!Sz2YkX}Zjp@(E2)0fu%F2PP)|8VuNXx<3J z&{sD`!kjO+P`)kE`KC6^Zu_OCy}mFYNo;F(_bZoRKa43exYE-n{Oh&86WUY6>h-Y- z1V%SY^0eIcFzemlEiGtf$_KWSR~lZ}`_!>qND?fo-aJ5zfaAv|j|WdWLK!eKGkk^2 z`RBj-Q*qpk3;x--DRHS*+W@P;LihKw-0xZ}=+4`g>o18ew^VB@sh#akEHx zH2q1j4Ci&=dD^pvh>Pop&Wqo$S#8a|%asC2!-fg92O<4l?|sdT^nYn)1E2$9%$GNs4f*UK)@hzlvN`kfY}O}!j!V#O4|!9^ zTh2x28r|qnwOIrEcA#|-RlRn_KQy``GGvh%$a!PiAD$NUyve;mU;QZ*MLa>LeYM%3 z7v{yV{oYH10Fb#|83(H7#k=QkweS8m>oSSIGmTU-q6|3{w%GV@>=Ihb;YYhm_BDNb zQiUT;hq&a$F!3?F4}*eT>yW+tKrfJ{sF?V+S@eFU>5nBvH9M$o2ld=rsb^RP2Ir#t zJ;j>c6uf)$471QR%q^Z$p4-D4>gd#8RBGILJDsO?xYpr1_in!>vSegHkl-~4N=@@( z^(uYs&MDtaRrMz^j2j0vzuoid(=tA7ajJ7c10ra)o4x!@V9nenO5gaBRzN`yGXwg_ zkx;p*!rfa~v7a8eRpTvsN5%ZektR~FUuf%-k*7KkUQ(k5X&O0txCn>*nw9p{jaYy> zIn;FDzQAUy=X(PDos5N@0s!&Ec&1WYHLz^2-dpS~ zGAYilIJ3LNjk-^RuT4q(B>Yxf4K+909?BaD;JG)_Jykr^Z#D|?g~+k~|DIDaA9z&~ VN%KBsLOXgB0F*V_s?q{W{x3XN3*Z0% literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TG.svgz b/navit/xpm/country_TG.svgz new file mode 100644 index 0000000000000000000000000000000000000000..5a5c0166f1a45dd76ec2aed44b6dc4c8ecdee1f8 GIT binary patch literal 483 zcmV<90UZ7xiwFokD0)Z&17mM>Zgg^aUsOjfb9QF{wUa?_+AtKy&mi#~JnvGZkl1ku z4oaxD7OvZ&JM4raVjOF(ojHcUx36Q^Kx(UYn|6uwocI6#-qU-@Zx4?W?3rnWRt3Z% zf`F-wu7u(R{PwV#PUNz)4kGz}nho9z|W(g&hgC;Zckb zid+UfrOXdfs2?vS;w;M|{}qmggHBYoE+9o21T_=9wgsFbSJ7Uu?z27=5CH^m8e)nF z$tayA8O;)!&=@6Cno^RGbea;1@oW|&0x*KE*1>290LTs7Sg;jR7VslN>8E4~fv5_| z4P$D}jozsWf^!Y;hg?c^v}p01wOZXR`zCtUu4$NAADNW8TesGThW!&VhT!O*Z-E`} zKY-Jh!S^vnBsqZ%tJdw$U1=`7^kQ>mz<8?OcP#^cZRfRNTi5c%{mSQ5-vkHvEX*VBk7sgU^R@JhoW;MC@0LvdLW7g! Z&pE$E{q%fedH>HZo&e`4qkdBa0013JuDt9|<_=!^&;{K7IZ3 z_QR)LM~HF~6DP;Jh3lC(*cliZzx`oOKcbIE1LGwD6DBs6f4~1SGBf@E&+wV~KmK54 zVPIhR_v;S>1H=D6e;F7U7?_#xsAgbbV7Y4Y51Idm^FfwHMk)(lSCy}fH0B+p6UVOx4`3o&=U}yfMSzcik&%WL@cKEi zt0_>?0v0qrmx&G|8|%-T_i1GThn5Nx8|%9{tKlLd?7wE&T%^e@v;DYw`^S~rylj6`H6BuG!LR#I8Ffeg*%FS>8{rLGU^Dwf_ zg#&0L|9<}Zu3OUopT8j7zi-~(c8LA={Rh=7U|?YQdHdmqH9H{eSN#kAzWYeI=?rMe zlwD1c;s1XI1_ll-6{?udfR>8b6r`V(b#v&baa$Y01%LfzI`@{J3Kp^+uipOu`;UQvfmx96|L;HlzI^Ht(Pb;^y6UYTfj2=hCEFz mU}VVhqp1Z$KMqDMAP4~NhixvJD(Fc70000q8MLK+DNRS#w^`TG6u@%iTOFJCt0sc`Cu^=&*IGJT$3BZG|Mkt0Xcw1578uD@oI zlFa@~CUTdqI=(qo)RVI&$7>Uhj}OoPe+y5ZDy*NMS={@K@6m-o(VkC#KflstW@cW# zP6|j0v+qtxem8%+yu^$d5w0xpW#|6={%G8Lr}3zx{knS(uY^9{X6AJ6t&*i74-owS zzklAQDSYb^9Xzl6|8LKs{iE`++_FXeugmtYnC-!S-C)7fP4)Nd?|k+A|Mi3BrU%oT zm&>PLxp>_41z%D^!jIqY9&g?x$MXOF{`QYg|Ns9ZYrt-3U|_)gN%5rd#xBmwXH9t` zWRK)#9yoA-fnU_m`D|m^gkDZ&=EIM-%rd_`4XE~mRrICHjxSi1m5qg0x13mguTuW{ z`=2`s<=eMuP2VXuYnHTprIOi=izgjr*k;{77gKrDs=2YT@gdMg!B(%^>BdIJfB$!D ztl$4P(eAffgBzbyzmb~Qv-XLuK)*Tf_+R&@W=`OFB|RtQ*M^K$9JRKUoW3pRbSEsl z+#;)C@Jhic;euty(}fZz^L{D(I3MwZSvTe|(6vAQ%k=uF3G?jIkS-Na1gpE^*m7V& zv4Hn4!M}}V%v=dGOP%W$+-+cDi=EO7igK8`3zi%V{(L=L%Un)L0+SDer>mdKI;Vst E05f$KSpWb4 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TG_8_8.png b/navit/xpm/country_TG_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..a6533ba11982f5258a808e96a08305114d602ad9 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}*PZ!4! zj+x1OR1yvyIPhU|=Rp&vE=JA`2A@B3xc%H4w^7mevEn9{!=}9F_s`!K6I}kQzK>CI zzl3e>b1+V|HVq#Mgiy_J=!}_aB`h5y1HPe=$!4qxUbt+BZU*^G+mBWnd^S WRbO@|V6raILIzJ)KbLh*2~7Zf?L$of literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TG_96_96.png b/navit/xpm/country_TG_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..40e180bb9b8c38591ba72bb8c0d75b514723c4f9 GIT binary patch literal 1141 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlITv^-rL zLn`LHofV(M<0x}H{rkT+dHlI^>=(MM_Ihvfi(j#cJ->I0;zSXCr>-l_EnW7#3Mw`V zlhou)6b1K~vP|@l(p|Vv$f-4`sA{j<>N#2GL*K94{+RK4aQW}sw$*!ge*SH9_uZLu zwVzL(d-LW@(OOCFlQRPB)!)8&)U)xYzU)I`*@n^p0R}E62S)}C4hB}n1quuzEDcQz zNrFfEx4)Rz9GN7TvNq=UOy6DZiIXE(dZTxGY}<3QruCxy34agF|u7MTKW) z`<&&TUC>)`!t9lMR`QjQ*}`WQvhN8=P<}G&SN8R^^6Bd<*S&ln;V@g_;ymG5O8;bf zt{8iMNRRq$8heQ8)~*>L8T^06-WLCBFN|8fVB+pJd&^>9WG*D65o5Stk}0DL9Sq){o zerf4jn`uU69$WO>m=E_|y7M)f80$U(uc@nl%IZCD z%bKb+nfr&~{ras7zkgwE;LYZ zw=lx#uFJ$Af9K*SLXqFh?5`RNCa;+5>HS%G{e(ic<_!O*KeuE#wg!ruABw*a#2?yJ z5h$=|e_3YjT7SI|PNC1mmWvfjB;H7K=!fpu8N?9Uw4`ZbwaYg?t5d7(=I<4g{d`&N9@j^%ihLi1_;pU$6wg|`(&(M(i|H9Vtn@fP@2!p4qpUXO@geCx_ CtolX( literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TH.svgz b/navit/xpm/country_TH.svgz new file mode 100644 index 0000000000000000000000000000000000000000..a180af881d50a938a938f91454f64b3b86e315bf GIT binary patch literal 369 zcmV-%0gnD3iwFojD0)Z&17mM>Zgg^aUsOmgb9QF{os!LRf-n??_dG@Bb}fV-Q7O?) z>$(g307wF4CM67{B5&UWM6uFor+0PlIVZ_C7vkOdL!c9@8!k%%u8je)GL@8BfO4x0!xH;t(LP#Gjn@A4?3Z<&ZaoV=ETi=#-?synuM|*Hh{+hZ2 zF+$6!DhPxa+d8*d_hP|#UMKoWRy#3eSz{7I#!Rc;&{isV z^_Hk&u!q1=)|AzkgwE6~Ril4p@rOr;8d2QkL_8B%+zFi)R`ygeubJCDFK_`l7ba(f z>fs&3+jlpP*?l~2q-Pl0?$$P{6Z#`&T!`rD<<-UR`q>N%StTh~UF3o_;iLLM%`4Vi z5dRM1g`pkl+RWmN=5h`z>ubW%7F@A^leoTb`?`WzlJD*v3C3QqqCYR_C_YE79xFEg P@z(kRTlx}nR09A2xfQG1 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TH_16_16.png b/navit/xpm/country_TH_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d36716fffd4306ffd70ecd564692a9470662e1ac GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^0o-U3d z8WWTEs4E2=h5uUr-DVp2ubu;7khNrKO>6&b9DBSYW;*Tx^L%y{TXV+;5l-^g2PD6A+s%O#g5`#8C%$ES*o_*EWBoHHS;QCJ)2;2hog$o=3Ngj z>0MCG4gX0WPHjI*scnfIg?W&$l_@O1Ta JS?83{1OW4zJ3#;d literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TH_8_8.png b/navit/xpm/country_TH_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..f2851bb78a695785326136a980b12a90faae758d GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_cPPZ!4! zj+x1O)D;dk@EX+J+#tD{<+PcZ>l-VHkgSbf28p7n2?+@?TipoK!nxtG)D}ZL&mICD^GAt(q5V*esKQm>t2s{+OhASyPE&TTnEPm3IPHd z93m`SOstJfNZjOeJAbvUjl?bqR+}huzxpe0^k!Tppc#mT`#tGk6SAFXN)Fdw`j5{6 a4_Uu1Zgg^aUsOsib9QF{l~~)38^;lSjsgEed-6Kd?CP$* z31STIYNZHp9067w7(uXDaYws^DUu*5aqX|qsh%M@LovZdFC=?<>T>GTsan1K{^`>~ zeQ7t_`D!_>NSjKv%h~FFzI>QgpLZXdRDJ)KZ@+o@UDK#H?Xun6?N*x?>WBN)hgQ8^ zEIw~{3Kxes~UWmmSW5jpWU3u}em@j|3bdhq-lk)U%^=^7Gqyi~2`(@tl+s)0> zu3btj+liAXOEA;Qte-0Nd;htg-|rp~D?*W7aW}1e_wx(vT&?6CWt7}ecp%li z`><%64|lWQ9yY7b%lm1yZ1-w>34y-YuJ2~;v|4Z4ZM*r>N(2Jaefx1MpOeFvO*`AE zIm|q4+ID&Sy_a z)19V3&dthY4k6;Q0bouH;3_bb=QUZd!6lAybb2%Z*L_UU+E|}r>cTfZh58i!tZ~3U zX3kP8*Fn`#)aCUM>a06#>;RJb2+0xDf;O}*gpjkfVgYSLA(hCyMUAL&C!|3f6TOf@ zOq>`lG!lqYlxo6_Nhl=>6TA>64Vcj!nK7f2;h;GYvv;*k8p(P*ufYdzGvJrkDW~X+ zZ-&(T>wxQjsE+x?3UXy}ofwZ&-U<6sfjog&0lFf$Gai{doEKkAXCZ z)Z9L~>)Y$qr?sf??K>RfzRE}aS59IZ~F*sak7kRMI~^3&C*oXk!VXC$G%-x_HFwv^Jv zLp27`xP$f;ZGk1$nASi%)|U*O4rf#v8(6UTKXRoJl%>1q;-QeWIie45eZO`S zVT7T=?j9>a}7R5?rJ0bWy&uES?8VOuCa=t|5%*S|_n04v@O105o2cbplg?41^P4 zhNs9NmQjsiWYLYO4EZiP6f?#m%oao3Idm+`grn?SP(FZ3G0H4CyN|Uqg+i;L z3m=>g5;Hnu7?QXKW{wg#InLpEz%Y0ca>wWhRFNB$UU|-%ViIJ~QW0r01%vZ|EhHEx zg&UoF0&QiIMhrw0+6l|4#0M%G>QOVtu23V_8B-|sC_9vPh56MG;Y`Qo^%yDU{3)KIaI7-YJ!zqneLg4>*FFXu%~& zI}Gn*uP(DvHl=|J26xC6tv%-m3W0r7b|L!zIfAK#VbZ-k)D^byortjM9eUC`fehSs zK^ioU&#{r_vaa)??J;jUXk>S^9crCY$VH?ybX}AMJEypo)zy}1G`=r9bvlq>X0_Fx*ZZ2e_frIC&cWaLFB#?uIYl7ZBOnf%o>Vws@W zxe(K6x{O>8rjf%I!rkJ3b|0cE%L&%4p$jKH*Z)CqHjM-|>$|@Izn(_&KNR@<56P3R Ip5_q%0574_F8}}l literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TJ_16_16.png b/navit/xpm/country_TJ_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..67e585e67a6d2dcb23abb575774d7523fc8505fd GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_$JzX3_ zEP9_#-pI$8DA2P1=lS}nE{xv^E?`vu3?u=13ysBnx zY&|n&YrpbhHYeGS`4T3dJ{H6tcSw6StwNt~y>_g9atIk;r3oypQ#==G`U%@vJpToznv!e3_ zd;}~lw4kssF)>ICh9F2V+;QCAT0kgl%&o;)+~4h=%$f#%_@)e42-)iyy`Jt^@wq| zWt+yX1#$F+a*Ft$_lU~lRSt=@kII!316WmH^l}B_5PUx1kM2O6rDq|#3g{WiDKYKe zASzFJ`*iIkmBkPmOdNt!!Y%HiavMu`ugirJAiGf!Q?jbEQE3_n=B^v3!J7dJQk5M9#r$kqRzZPf>9 z4}ZBVelDlWH=4S(ZmY~RQM-BlO&jN&WWpd;N^LH)o2@f4h2?i1K8; zgczg7B_~-XsR?_`@=?eHay<7oYRx0YEo$@5CIwIzD>4R^hol^;(O8|>)KA8XAtPw zCs6hKi5K^>#b>x#7R!dzi8X{hmUHqoFs*;yU%brV7Z>mD>@8;RnIC*J7r3POX*W<2 zL)2_-p557M%7Je3)9l?hZsTc~yI%O0?4p8}r#_4UYjl&v&wOhLWZWHaT<;3wgjF4< z&MSp-Di$*wFH$qqTA=)WM+C$3GcuRv{dsNrI4O_k#e}lYjE%d$ulDUY{J7)5-Nkon zIIK*>vi%$)Sl)$CF|K{3dTORxLAhhZvm{@?#eo(sUe7l;$bQUyZaK~Nq)Vz`3yZ9f ztK2268C^ZkotJGre?0v9$6vkzlWH;>KZnOLJevRgpZ+n{Eqpg>tEErdb)P!hu;D{} zj`A9rtEaVROzT+6?vy|O+i&+TcDBqWPj^O7(Z6$~NNd^RN0Dbdcl*5fzM~|!`{z-$ ze-E5>jym^PZ<_ph@5`P4RaV{)TD4rd{PNzF`#*k4T2-y^^?xg7j2-a5`0K>1S*!JT Q0+SMhr>mdKI;Vst0CT)2&;S4c literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TJ_8_8.png b/navit/xpm/country_TJ_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..7944f4a498bd7393313e54740c3895ebbc782ebd GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^Bo-U3d z5>u0FPGx~3x%#&IJv>0r!?UI!Sn~h>|NPJY{QD-MbXJww zypi?hj{16g10Yx&aq!c>>#H{#oQr336Ju-p&vU%%nQui@1h-%8dm->3; Q63{*dPgg&ebxsLQ0AJ=p<^TWy literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TJ_96_96.png b/navit/xpm/country_TJ_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..dec7accb5a86588e49a47cfc6ac49d53e9e5562c GIT binary patch literal 1465 zcmbW1X*ARe7{>pWhN~Hdv2P=;EvLp-2s3D8#&%5!WwIoi5EEHqM#h#b)nqWr4BbeU zh;)*<)?9OK2`SD<*_WtUxQ+el^Zj)1dC&7c=R68yo@@&nW!~^(R-ck8l^-b z&NQ)wlseH%_gSZIT8QBehZaJg`DUqP-bu`XiQNt@8CeQ~LQr$?JM zyG42rT_Zv^T2CsA6MVR}6VG+I18OF7ik1R_>-oYYmzt!x_1rh8+^O_pm({sx>Uw`7 zk`j0-P47r<4hks1vm3d4U-AT zm_CE-4zq!`*VoEPe*D~U;k6=p0r>{(h2#9K8Zf~NYUvUbmbym$XyW9tEk?Emx9~`w zVx<|pV9f`?<5p`qRz<57xuAZhIew~fdz={M{e!ykJ@J8J1lzC-6BD5`*}(J&|9jDd zybw!V-Byynl|Z2HNzXikBDh>B<4jLfR{pBC*DF##GyHqq`^E^Z$!6-6XbadgfBWO> zTlAodBLzXhtW3|iFQa)fOlg2Zw0%V2(BqncV*?1Y_znFPQVQv_tklj;+_9bXhngHq z{#eGARaB1+8K$|sm*-IfVLQWWi>*Wa2Zy{(#PY|+U!cDh42{*t^d}i{9JTOw87>~O z{?}3Lqqi%>T+8lR^=#}^o8$n|UK*_6d|~>n$WBaBFE`zgrD`cx?5N`>B@{Q z6AYB%A7V(dAj&UyOxv5tKq^2LYSY5EAR{Gv8t03ee$p=0T1c44$tf|-LJ-)${ zo|q0OsxX2Nf+W4n@3JmbYG=rb&t05r#`S8BPvwxTqJtdi9aYqlV?Pom3GtCm7_a-Li`+j@{& z${W>Pv@a8rJjhhBtlGo*-mAYh7*3XfmLcr_Cz1Y*wLP(~?cKfSWM<>`Sqxwu-O;rU H0V)3g8G@}( literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TK.svgz b/navit/xpm/country_TK.svgz new file mode 100644 index 0000000000000000000000000000000000000000..8db772e7a26eb0d148ae8f4af0fe598bc23b7f67 GIT binary patch literal 1089 zcmV-H1it$piwFokD0)Z&17mM>Zgg^aUsOvjb9QF{l~zq}+c*%t=T~r*OAFZaki$`FpZDlEtl{o3I-y!8MDNc(hhnSC}H}i%w99?~WUKi{s)SJ92 zCz;@ou~5#cd0s9j*+1WIhc08AW?IgtMOB7LR#w^P>x--3hC_B!hiMb$Y@0VL_DA`B zGn+mH_F>gD5985jyWR492lA?3jy|&Cklx%pEiV{jjiJz3gE5 zORJ8A2yF9tv!W$grS&T0%T+VU%x?XZhwYc@d6Er&&Vp>}Fl+YvhbXa) zseSg5?t*EbHqaB`g#e2B1c}}vyUEyS7tm-QQHp#NgH6AVLG%N7<-Fs#>vYq+6jTz6 zyeP((AVC`QDK3W9!*rH6FJqBibRu)R$gXD9dL7E+27fH@fb*YOPTyFTTe|rEjNp* zUQe?1w5jvw55O%riKqt<{|+mX%)OSRX)u&rq4LtHk0)}LC>89_{o&-yY41;FI2x@X zzOA@3&JY*-$}E>CrM9jQlPM%?&5cI@Z4zvawMz7?9XF`XaeG9xUPTzSM`4n&1Rw)aS}17(ujIJhj$b826f6ab;|qMc~d#q{|_q z7In%ZP`ccK`QQ+^))rlYkt0gCqc~b4r-)3;aUedc@SRzd!s(wR(UT(Kz4a+A${2`_ z1yCuX)Vhxm6F7^m4Wi-u!qK`0q_Il zgn2K0+sK|8S#}v5l`+u@*<v0a@uoR|QyyH~#Zn6C z`?erFTA@3<=d`^)dv<@VkCy4*F@-6Cbe9g|e7#|Gy`hc$AO?~yI_fm4uUPr$jL_-Y zky_EkqUc;fT6(B6;=5n_z)g%@pm*slkKVX+e^D_ROKJr5l5mbC-%3l3B9_ZOmV?Ni z#Mul)Z-%wY`mqS(@D$2wKL507>gszKm-I!n`#nr^bSxg8_dpz8^zAdge{7ml?7u26 z$LqWa^&UMpEn^C4!W;(XuLm~u=vyP(bhUPsy)n7ZX?$y}YY9FDdKEv%t}p%veN&i2 HRSEzA*(Vy( literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TK_16_16.png b/navit/xpm/country_TK_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb2484d39c298520b0227b7751e614fdf48b3ee GIT binary patch literal 445 zcmV;u0Yd(XP)f32=^!&bKd`Y;LDMj;;)t!`3kC*; z2hVvC8uayLOibh%7#Lo@{DiDJE%180&n*c1%QqIdILobDFaQ5%U|?Xleft$$R88(< zcm7E@_t$S`gbm-n|NimgH?rBB?0?pD?dIV^2=ep%Lh%Cw0|O%?BV4E{JSi(QhakWW>JCtv!fU zH3I_!Gt>V#?^_5Boa}!#_U#lE{DDgY0|P^4!Uc#WEDQ_`rrNKkuhGJz8UnNw-#>rD n#gY|rHNp25LDdkjYPT`~mU47v6`aK<00000NkvXXu0mjfOmoM) literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TK_32_32.png b/navit/xpm/country_TK_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..5476c36b314fbe14ec28e9ea43089491234e1f94 GIT binary patch literal 834 zcmV-I1HJr-P)8g{ zVZnzF-@bkOB_hH@&~yRbUt1>Zlo9(17rFZcd;BpmFfcGNF>-LQ!i92j9KF1B@tDrY z$S}YDppNo8WWg72IdNLx?{5$hVG0+zcJ2Aww_osBP@Qzn&+Y-5;LqR8SQWD{FffRS z@bL2^>|eX~93InM%%0SzVo~t(7j6p<9=wGt^!M*ST&7Ejep}phfQbo9LiqI?d!A)s zU|_g)i>Rc@$jC6a_Mn*1cdW91|6#X)grXuR?24Pk6I`-Fd_O3%KuzvrTlQ%@3dDpc zuz;EA|Gc_`TpWM!s1X&w9&{)cu(7dVRg@Ec#Zr$zJc$YtvVfJ9+1FQ(i;E3Sg__*Q z)~qx5O=n=H9*6 z$kKTcSBx~?5Hy{EfdQ@LfCEP4DwBnUiGhLP&mU+;(@^+ucF8&pw!g$!@b@31s7u_( zFX$nR63Ku5{DYg$%JOeP!vP{qXJBApX8Lcf{{mASXEJR}KWnP>8ka0q;Ai)USPRT` zUKPh&BFS_H1_p1NhnU3_77MsJ|14}cz`~5P$ioGsM8CP1Jtb_x^ok>@avw=G9Re~# zt`o4JDEd;g=WX&#XJBCPwSAzk_7Lq+^WWD#aYMq>y|M(pdJ zXjy@0J_rdolS$o;{X5v M07*qoM6N<$f^avJ*8l(j literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TK_48_48.png b/navit/xpm/country_TK_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..757ae3719e64a06620b5bcc47f182a2317934c8f GIT binary patch literal 1248 zcmV<61Rwi}P)+wq-(j4^W&6mADR7At(;ovgHybrZlFXwa|S4X#d_T$ zUOgW-Ekj5`_}jd?gCuE@6!}I_4fzh5S#?B2;0H-sQdwCPj~)r(Zxc(7k?I--1_oS}E96dNwrpDJTeI z)xgNeu(0tUd4;l$@;j0pbnDhjF)=0V(J zMQv?dAld&0t|A+!gA}Dc&#XGaNKCt&bRZ(|Bf$Ov2@c}o__LvRmmoE|HMl@y`dO?= z6T5?ERUam%W~KzF%6*LSx=oaW;(cyKy5FIxYapOH=>jJ^`p_yfBcm}g-$d*6+Ri;J z%v2abBM1cfesXjE-FZR=Sr8?J#D%`EXxmG$$wEbt6Mn^1>ou|nBYbLsiRr(p+$U}h zDpXh`fgit^Z$1?G`xly@5$&OW{}^vR;HR@|Fagv-HU=*>6y6V@J1*Q5IdfeE>Y&M` z$Ff4N4xnowVA^W!{9a4O`ZSY!-v})mp#PeI$_Q!oN00K=7 zj{Q|%XEruAPJjJ<*}l0#hwktDn~<20kWlsE!P|cM{gM(AR-gSePuCzopr00p*g AK>z>% literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TK_96_96.png b/navit/xpm/country_TK_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..adcfca6beda7a23993d8469509542401bf0cde59 GIT binary patch literal 2466 zcmV;T30?MyP)X+1 zA@Aj!BrjRNf4zirp7Z3#xu55}U<}4uVAHT!y6D&b{l%q8)Uq?sdP6sa0!{wWFYTB* z$`H|*{2DZWz9KeuPDqGMqtVWrH+ld5 zuPQ1UAxlNe-VNm+{JeVf=j~mb=5{Wmar_#TpI0=_Yc4q ziHa4A@9s;yZX!X=Jpp_vgaq>U7vEs7>aXqe}6 z*=yEh@p$$#XZpey3C|2g$H`rJEIXVvdVQk{d|4Qg{U8p9)!VBb{$NG?B+9Zso_BN6 zm`?UYY47%W4195fn%IyiR#(T(MRWPkMO<|N01w+>2Y3VHX*JJg>CXJ-ijP=DB=MsT z9+E<#1PTf9M&blPjwF@LeW{gT;$}M3pe0MDW2OfZbZl5!yXwt5#M3voLoMQmfD$M) z)W^#U!AOBiL`aM2DbHwHI?N`Jlam8(wgn5Ol$R&ZoauY%QsTjb%aFJ-7CvIt>AhER z2lWwjtL%}KK2jiecc;)$AKYx0FW0rTDIFYG5{V!q;|da2jKbv%ocs7I!{#X|luubm z92hB(T<)n*5ZYwQ$hZmsID59LvGFkySB&!e9Yrttby3KuQd8fkAC3`$1cVU%Akt6e((KDE3sCmF+eCQwk28H1l+7Y=5unwHfAWxny~6yF;PyJawv~y859)AucSu zYZZsWr?>2k9dnbAI2fjfHv&co+E59%6qXGs4&38k>a{}e% z)$4S60Kob4MvhP{!13+HkX_FZsMd(j^+5)8hCf)6*r@s+M?64f%`5_05kHCY*Tlh!z5|>~tr0ea&-3xn0TQps_{^fwr!=87%KaYtxz6kHn7k1)8Dg_%OB#xmiBf zCTbAJe&9q(0nCzOEcjfTs6lD*m2#hMb6DovKoffKdvg5)r&T3B`e!#&QC!SbR4!yb;C%S*V>jjsQOd z&)J#7U|@lPUP7UhK;Sqys8cFQcd=5Bo&%e%QSy*FFZv-^#NgMUO`GO-b{>e14qm@L zqO{t=mGFB|U`^Ky$vbo?1 zoYVzB_7VytPfE%$Ja69oSG}Ix>d7jN%YZYl-%AKP8zR(6^ZA_rJ>Z89jle36Yltb( z{WKwg0s=(m&Q+C`-uL$>7fAljf_qkJTtiHI0X8&;U=4Cuy*euNNQmFSPy zkpQ#Jf=r;PFFa0Oh5m>g2|<&)WW+8}jRuWCPLA5sd#dPdoqI5s%c0SIdZREf z@I+}}a+CD6cBmS}VCYYz6cV{&O9x`3>M6uZKne7VpWJ@^0v%BsO`^b`Aj<9Hz5U&Gtkz>DX()Un4Vk> z;&c1|lu|J6x}FhiTwY83E07Qf!@!A@LYglrh#(WI-g~Q_U}6#irN&i8z0ydNd3Jo_>A>r5$9NJQbn+!)F3q)%TqJToyY7{kD!EoDD@qrtjv(TCYn+q46WlAE5uAke2Dl*LDr z-tM<;UY*e*^X$njn~0^X4f*w2oY$2ZMfsFHI7nstL#?svqxAl)zJ7*UL*@UU4C)vv gHI-MI<(5kR0}mkC(_O4V(f|Me07*qoM6N<$f;_XAb^rhX literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TL.svgz b/navit/xpm/country_TL.svgz new file mode 100644 index 0000000000000000000000000000000000000000..69d367768fea4f59d239dafce7c18dd5fb658b7f GIT binary patch literal 1024 zcmV+b1poUViwFokD0)Z&17mM>Zgg^aUsOykb9QF{l~vo0qc{+K@2_C#mt8Fw+g#0t z%)?|`8fo`srbqh{sYTmPf|_6iPScsM-!hlnBh6TfLRForIzBGU?9<1#wBBXY7OKi@ zg0OALiYrl6>&*WC{NyIK)#|(wd8sOy*_EI%KFzEp25&ueM@ zzR|i)J+JFJRE$ofnzi?b<+_mBzONrF%YwF5n+l%UBfj1>Wseiwlcn6sO1BQU+f!fp4J&Oh9$eLP78g11sB#@K_{ z5&3hdv;{G1_#NPr0}bp~kS9?kwYPX)9D*)JLW`3!la^;)&jhaWt!(R@%hsFxeg4_$ z_60K=BRsC&v%m6mh0q&Fp`*Q##d@PNI~wgmWH#)R_QpgyJ+#8eA3_t8(@+p1a-Js? zH|#U}sm#|eYW4DW-s+d6fhH(=B5xlyR1Q9S4h3dgsdJI*+!Px` znLNY~q8ol;%TtJ<~;pRHE*K{%K&miI5W9kZFnd9n0eDid+TsG<`~6$ zA-hqLN#L%igzDUBj98S|w-JZIOYkM4272u#2UKR$TR{cW5Buqdd5piRM#$z6AQu6y zO4VfcW7MxPWJ*neRln@x`I^xi&32=@bz_{m*~v>nKa|=UCXC_4hjkg}AIG=p)D0~C zYxk%QU&0`+VAj${!D&ENe;LCa&nG2=+3ZT0%6C~QAx@+>q==8B ziDaGY%@Bp)zZOO`U>J@uaL&71|5)M3K5#%=M3N{Z;KdHmH~)7te^|GuuU0&!(XUW9 zRKpmAxS~Eq`;Fb`HQdQR+iMhpL=g^PT?-Lld`E(NIUvDZ(iHpQZGp`CCDN4o2opbK zj(H*^rof6M3`LA3#Gwp6DI^Gum%;}mB(d*1egI#SD2{q;lpuz2L>%9z2!|{%`-O^- zM@i)PFamHXv%q*MK{O6%==d~3aX^eS2%uMj!^H7Pf^gsuP(o4UCrRkggrJyU8iSYh uy+Rs06f;D_ge3+W28aR7cW4OBSd2}D8#@~{otYbb{_sCQP3^^n2><{D^7?TA literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TL_16_16.png b/navit/xpm/country_TL_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..7a60619d0d90232a8aa4a59ad0da434128f0e3a4 GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lNlHoMLk^{ zLo_BP$2`$aES)>IG2=i;$&at`<&Ul!8`S^)_+Rz?euMOR@2~$CUfS5$`0&=>_+xQ0 zx4d$Wyhv;bP+~e0K22+b?4SR6cjFJ46%-fO|M~OzVYhwZ%|AUoJU`whrX?hJ`1@bK zd^vj4x0Y=}vp0&X*V+2;@bIXqsZEtNH!y?W{1vdh2=LU;lsb(Mp+_xp~5b z3%kqTADUAczRlxN_*n-2utLRW+TNlwz6$;U6+_i_V+jKR~@&t;ucLK6U%^_eOF literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TL_32_32.png b/navit/xpm/country_TL_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..54bd2e65d8fb976d24db2cd0db273c8566fb09b8 GIT binary patch literal 634 zcmV-=0)_pFP)+zcuntj~idcb6j9 z0}?Z)0=OvimcDRRAq0b_gbX@!=At%YYUrArjM)JE5w#dnq-0D2;_-N=(_xGeLi)oq zE((D6425seXf&J6DvFZJ$odf6e-Q4edq9~Ke@WQrj_f8ar|8=DRNT<_< zLV=(2`Mh{N`ZcA6oST;q3c$8)%d(QmWVhQ*Bog&{z1?mDFb)01(}??P=fF9AJGUa@ zR^@WJR4P>}6+Vx(Fg@B^k1W%_^!Wz>cLo4jtyZJaV2tr;?{2Spr$c_ z$fd(o#N|+n$)&^XV0U}f5Bem)H1yj)Lw?W!khL)V_~86JZ<&@b5i0cUyL7Q`}&^P+tg3B(QhA*b6IyLa@Ps z)QiID8zm5BVE8s)g|CD_@>MV?gk&!wNYrR)uk4jeX2Mv6Yc^+LxNB}cy|{L}yWM)V zyW8{Xo`2hi-}ml#j(Ohixw^xlZW@`4{wVfatxz;J_lJIMDBiuz=eDWU7yuvuBJY2{ zb>vzGS*tMsz%UFbMQby=9d747(!&=;Ye6i-0KkbzzkEA=Fxo^oSexBH5P*0xf2qTM z<)+hGQyB!{-KX6BTTQK(Z5EnTASt-P8@!{7SY=XyPztWQlXG+tVn;4!wn+;@DY)}a zVu?uyBnJn;e3K3cir~yQ>4TsM&SX8lR_?iQ$L0zcbygv&4k4jXh-KNu#YMZ_E{~5sIY?(!#}eaADo{F|o|u@J zpPvr|0?}wx9?$$NKAb(!>@>)v0;N(Zp67$XpeTwP8ym{0%HRw#sX$EW4&U0^5=Bw7 zv@$p&Ol8o}(9p=ph;&^n>KtTsgR8lTNbj9sFu1U=AXmum_YVvVRIWZP=s)dDL#;d@ z02~fSZ*Olr9#>Ax%*@zqHsy%h#XfuFuKbCk<-+01ntd7&0HP?4jg9$yzMh^Q0Lf%> zWo5pzp=s6al6E+|r*dEX|9+*1Po8|~b@cN1ymOn7 z^d=c$b@k`_>;KpN{dfLESCWV_H@Ei!+2=mO7t3G&TjbHfZ7AP4E%8p@!&PF|i9UgB bY-|jZ)D&(l=gTe~DWM4f;EP19 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TL_96_96.png b/navit/xpm/country_TL_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..df56411345a048751c7f91bd883a0e1e192d3968 GIT binary patch literal 1634 zcmV-o2A%ndP)m}aj@Lc+zPGQ|PezNw@jMCzcn{bfe%t2w8LQvrYyFh8 zH8zezv50K0xcK|lM;8z9PR?pgJUc)D7E+smwz|+;PRmFH z3@Do`{`SY#yKgo){k&x)Oc@Y>g{93vTiwg;4$DXwDG*+SR`24Sex7$AJ6}{d*Aznl zDuo8X`I6a<2tW{p2GbjnfdEYYvJ)E2ZKMeFd}B8>nAk`W2<4%{tVT2-l!pdW8mRzD zLWB8?RDb|1ENylisXNxb`>CU;jMRYuOg<>222u(Q1~sY}2+EX3bC1fwc}Kn)EBGO8X3)X-oQBimk1e!fv$TFFOWCx-?@7}+?|cY_=bhuv<^=heT+ z@N07OSbN>EBZ^#g#Ix4H6jB6SYKZs85xn^-_p`DJUlG9b1e33EcT54NIErA z1X@{H85|t!>gp2T>G62R$H&v@wETG0(4bEvMWE&7WuE6pM@LKd)YsSFyLYd%vvYEC zQhq#3XaE||?DL${lM!tP0fvi`0|NuXk5f}ql;s#hgMN%? zuR*2T$B!Q`-Hyd#^c5LHgHDW?fJ&22ryo6fq`D|$XwZX^dSc=szJJMwJv3CbG*JTe4+BPBs_4oJRym?c8e=3z?Uz$BMXxNBwHQ(3QcjwL>yWK87+VA%h z;fSO9VTfd00iNTKO=#=7U%G=%pFTY{Hb&F|(B0h~jYip5-^y3^x8=wWTg&0ZpD2bx zp^1qJx7$rQA(>1D0)bpEr@C~r$2R{>+rdWGaMpgvKmDFH$^UJ36FYqPa4Z({dcE`$ znwpw2nM^z$S6%w6PY=BkaH<|Aj5c*3*+Fi%ySuyl)TvY9a5x+eyId~fIcsZce!qWp zb(OMiG}3T;q=oTGXjTUjAo1+qzkhIW@cQ-Z#M7=_yLS2VWu-+cic8Bnpa1~~27_~R zbHeQ_SFR)yiEuc4^5n@ACr)f{Zy!B+ROwy+_DD-K!t~~)aUIZsd_G_4n!cl>Baui5 zw_Pq*C=|+Ov$M0a^0V0E(!LJpKpe;Aayh%*o=&G*TU%L{V~05#Q{weK}12ZzA#NO9w1K>2!K=aZz<4 zmbi4M0~R2bzF6YYqYeO--?p&4yiELPQ9LYh=~M?SKnn{C^kY=x(ytDbzTHupjg5_D zGD$fg8fp0KW7_qtu5|$H=@;Xu{3|L-iOYmKpd==V z%bYr(>>zPmrqzKGkT@wuV;I4+axfVhK7aalT$1C`>kbc88OtQ41}Q<}0JB*bOu zh-Vi_h|AKE%uZrLT(yTwwEzGB literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TM.svgz b/navit/xpm/country_TM.svgz new file mode 100644 index 0000000000000000000000000000000000000000..29dfc16c7d7bdb7d956aadbf7d7f6c37f3099b1e GIT binary patch literal 17172 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 Y2GVzhH%tm)JOBUy07*qoM6N<$f*Hi(@c;k- literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TM_48_48.png b/navit/xpm/country_TM_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..d2bda29c657250205308db884b0b620e48ca478f GIT binary patch literal 1755 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TN_16_16.png b/navit/xpm/country_TN_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..a79e73504b9b48a0fe465f519d7a8e4023e6f639 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_KJY5_^ zG$tn3oKraCz?Gon`PCsap}16FZ@u4_f0kzH);^JLCjQ2q9Ncg3e=uCzarI1xw(`HZ zz32CDe?LLgV7ftp;^&>0gzMJaJu`LUfp;&@eE9wSzkPlEe4Fm`o@Zud?eCwLa`k#; z`up$S-&%(`+cMQ9q@*Myr2P5*QJGm;Sy{|JIpat1Td~zsZ{DxwZ{^EL5fb@R`%kEF zUf=n&ttL-Tc^>;>!aa-e|GhnbLqfDSWNIG%|6g9X=t4;H#zqB+mP}5Dt1~>V-Z6f^ Q6X+WTPgg&ebxsLQ02M`br~m)} literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TN_32_32.png b/navit/xpm/country_TN_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..d39513e3aa181a03b437b842b3bd91bc0c4afcc1 GIT binary patch literal 626 zcmV-&0*(ENP)xFzCo0bm~%h}*?kEaLG2`PFObMcSRb^CO`}qr-o&XlkXR zDhgCURaL2~Q>6i5LID8rx3YWzjM)ZH(oLP#Xr!DNg{lHzp9DhyIhBE;m_s`Nd>gwB zz}&UResRD#HY}y4A6jvCA-#I%wGiI}Enm8Lb6%oV|jk=+&#HbA^w#I}c zhBmgP5~SK9Qd*m3!>W0QzB#6eW`;#BD zJ3BKu(~F6TNMV=>(~8V{HQzZeFVFdy;e5mNqX3VR$o~!SupA&GIY35ofQ;k-8OZ@M z($s(m5ngG?Ki%fP9rfRi=KtO*G}ePmDU-2$xspI(-Vgh^=axRSE_Z|nU)@OW#Qswt z#*vD2Mjh2xtBwK8+Z|`oMMvX*M4NbAYf>>Zds-a1ZL;<*;UhMn) zBWuZ4I>aq6%Rl=I0O?@sP}62j$^u|Gjug$*Mn-)5J{Df8g{CEz*C^o&X2Y#?$g`~( zfZEeLwEk_KCTGhg@lKC;qf5LMrTqiypMQa2a^HW~Lb&M;xn>oKecd1=Rkb$z>nQ-9 zty{dic7W1}?@R6oa~0)K)!6JH?H@3eZ@NQ#T@?sXy07Xq>{D~SA8ZAX-m@Q?rhB-G z^0B^~U|FHA%51)AAa~g_0J5Prz07Ie47VGAeC`kFyU@5vlHhUya4&t&XBBHn`AsAW|p-P}V6Q3i$q;F{^T9f--B4nRu{0w8`7K=xqk-TCFxkB4=G?~C1&<|p!O2hxu|@%{p! z!}mZZ%LlhC$TX0aOyT~~>A+n8(>A;=_MR7BuG0-eZ#7S{CR4Tp(O4V+TT%>w#uHtPmzggQKv4j2FIMtvs>e-&!0;gLJSBv7bjWhvBdI}nYIUI|L$rIqTH9<$+A z#t$_T&3yY40KVphg77hZO*P}q1<$d;lKkT#e)UQKnFHTjpuyua!fK=GL`AK1|IU9< zQm8FiS#OO7Q~B!v078Vu`kZ&(bO#qg)09Xw{n08}yj{x!NEH$Vd*5 jksKf+IY35wH~@ERnFx=u<+eLDBnN%M3jW^HYkhMg^q-HnZnXAjP5?40=Ux4E0!viaiZYS74hwTn_pyY)X@HGRl~GuQc5@@!$onydvDim*8p0=;OXk; Jvd$@?2>^)rJOKaz literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TN_96_96.png b/navit/xpm/country_TN_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..bcfcb8999ac3a9eaaf98be3b206a91f48f01cb30 GIT binary patch literal 2191 zcmbuA`8U*!7so%I7`rCR48|};lx$f;*@?!QeczMBFm`3hzD$e4@%#thbH3-Ed*A2WpYA#LykGAOOY`g89Ksv`0C1Za8{9lmkN=wO zuag8U70dC3LU89k3 z9F9Y9*?>XPY^Ma0A8@?WVeza;RIt<){9o5|)^NZ>ailjbU~r6H@^OO+D+B;lILQPP3Tql>%*&NDwZEEgY7{dKa_Wq%i0jumj0o&P1>emrVCU_i(^lK- zLajMo%N926bhO&Oq5A6B)K@JE73>f-7;nX!y;*@Sv$DIIkp?bqNDX{T)f}IM+@9_Z z3B{BRb5t{2a@}{B`!xHWxe)w}g}u7BNr^|&>;M$2a$MmT)Odg1-6ZFZAeTVTRN&5H zXDDCa(nnu=${e8+1RHvx*2)CjJ-SV8vw?qsIKH?25JpUxze+?k?WR zrR7)A25b9th4zVhZ?p)C^Soi+Iot5~_`HM7Xmll3Q0o0r&a-!`icf3__vhta+AxCp zn!ZWW$Yx~&PO>-p?JLJAm|m~Q@&!qYWbQ=nA6I`vVP_gV6HP;JO%7>z*sai8Dbo6n z>z0d)UP2tc9F8bQLS(E^VT{N&p(|md5q)HzTU}`Ss`T5>CK`7=Ca%7Jvlybh5*wE^ z!!zvHanxV>jA5w>01*SY?T4L1Q^e4@!ZoW?1UD0zi3^xr=K2U{H$P5q)fD0z>UX(# z04F^q>Ae!OQfGHsDIMLY|7SmWfz<67Xt_M}lt5dR;#cZPx5$0lBs|3gM7d8?5yg*i zeXToCeIY|8vd1dIWnKb7QJ_?1cm=BD1wXs2m+N57LVfe{eAJe*6UE2(*7`Iko~CTL z85k?OenrnQV=G*0pcpED4qPj`mB>t1j^`OLxp(^K@~dI37bQ!^sCAY~%W1M;mO#xQ zeGtAGcFxn-I1BBongG?Z~M}h4tIDvM}?DMFU)wKM4|P zFb34*m}$PeNCAGw-?pP8d%QRR|4D2^!3ps*c9Y)vqX7LqtI{dn2bC@_Yl3dM42Jd$ zKLJtE)y8mo>YHWY-yDdu>VRBeUxsTaP6^Hw(5?zRilUlWX}N zT@rdOxvCe)%AqUbd`5q^Q~CV0>nM!2&ok2qIcF{}(>>K7QrXGHZea9czY*uiK6ZRT zZ<993IQBwmRKj#)X3w;4`yY@$JSFi$s}P#_T3V`IidH~Y;4suI$43wX0LpWRgOJs^ zWQ3gYS}POv;1#X35--|3vT2LWu2Cm$5mX(=YrUAYf_DvYf6#5@&cj5#r|u8@D;pf_ zVWiyzhcDL#1xyF-ha-cW^Bw3FDB5Br$2T&D$DC~|QLgb_gJq4o^D=}EJ|buiW=VJZ z2Q4J8(liyD0@?gNr#WH$ta;DMLfqdv6y5g04%ki_AD;B=|Siado>0+zo8^= zxWleKBphqRoHy+5^BXPRExMba^Ew6t<_{M6@>gC`CT8DE2mA>%LP|T=?o;u!DBB#Dg=5HqESuvx^%t4YddLgopG!?n8^t^tdF;L@D6|QbcIJWEbz! z8lCG3|EWIsHT#0ES{hu$V*XzPFEiQ`Jn$DR+>c9NY`HmL!y@+FC*|Dl*26Uu;?}2$ z5aG~xatno1{rb!UYZ#EQ^<5>>v3g(Z5OozuD7lH?H)Fk8=hk^vv!rNM<{s4~EDpT; z%K?c0HsFt49E|J=V+xIadV9>3vG3*YtVw z$)&B%dRE!_tePLK=2?`0e~xiVn3LDi#=yR;zzK*`Cz(LA3f{F4(rMn#qiVmhQ`HC@$K?3fINLM#lIoHtv@5jr>I9wAwCqVS@^ zpKnzx{)vXjDIGmhHXbu$%zdDivo!u{iH#~~iWrVXCO#j^&6bwCcn^N#=toNV!oAp) z<~wfgSXHOaFLaXjcEJF0EK3;Ch+=RVCbaSNW`AS>aI|aN;W!lc_Cx*uD|t_H`T+Xm X(Rbqx)4hQc{{kk4<^}{kkHmigerg>B literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TO.svgz b/navit/xpm/country_TO.svgz new file mode 100644 index 0000000000000000000000000000000000000000..283affa507b23d016d2b4bd376c49493e4d8069d GIT binary patch literal 253 zcmVZgg^aUsO*nb9QF{jgUcZgD?<9_c_IAx-K3kh(g5> zsf(VVJwOBoED^f`3#YfQDbSEqmAdmE|NrLO`SEh@U{w8}tzncAAt+PYN}Go9{q6NJ zMHt-4RHx1w#b_)Zi(Nj9%?Bh-}}8JrRju!pY@zNqL z-L#G|PG>!8nm~@)Vk{!A4(Z|5Q@9_YTw6r z!;9%QUf1=n>|(v&EZ5E99r9^8e=;8aRcL|!Kvrt9fyyg1`wN;+e_nh6p^Q-&)d2ti D>8p1o literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TO_16_16.png b/navit/xpm/country_TO_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..6404afd50abd26527c4db70cb7d179f9ba1524bb GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_ko-U3d z8WWTM{QqyytW~i&?d;YI0c`6hIaUAw literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TO_32_32.png b/navit/xpm/country_TO_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..7f1de1718d0209259dfa789f8f39ce21897fad13 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&)VJY5_^ zJUZWAImp|fz{7eWNyf45g5r!OBb5y;e2UHw_`W{qJ<_6J+wdn^_yl)umx9s>4+Ax; z>BUATLkgY?3(U1{u@KzZ@aiRJ#V+|C#)i|sqb9#t>H4O@CB$X*R)!53Ydf|rx?0OR z Cl}*I} literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TO_48_48.png b/navit/xpm/country_TO_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..cf567226fa3104b56b3a3cca6d10498afe8b588f GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HG3FJCtAmS2uytia!ZS1U@o?$}&nU+nPsI^bz-Os$kss@4CZ_C0a`u(qd^6#_o z{*t*1qym>HUG1>{7W1NQlfV-n@g)xv*9ey0zE`(v&FfFQEaZ;yuvlJZ?bUw$>&~~w zuOcGZn&!N0;tT)A88*$a|4q}u5_6Xc&RF1QmfkOl*^yf=RsfyH;OXk;vd$@?2>|qc BU6=p> literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TO_8_8.png b/navit/xpm/country_TO_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..577bbd0d5148267c3eaed206eb946b3e1f27334f GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_cDPZ!4! zj+x0n{{R2~`|occS+8sIMS+=F#_;d&Z*K#g4?n-WTrz-Bn3?aukt0V{uU|Njoz6V%$`5t5x&q{@TnRJT02C#piDGy*J#p=X?0~yX+Rb znH(DzI0PtE$W)~5ZJ0NE-68voCXj%JfCvW{3u_Zp{)67Pv&;8$=coIkibIs$J9=&H zt3$J|ui}KMN7DY_gngIzy**)Yod+x4+8sP;>WEpqbq-++O{ N;OXk;vd$@?2>?h)YB>M^ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TR.svgz b/navit/xpm/country_TR.svgz new file mode 100644 index 0000000000000000000000000000000000000000..d1ec1cbca082b82d925921dca0456b20c4469d26 GIT binary patch literal 493 zcmVZgg^aUsO^qb9QF{ol;?I+b|IQo?mghF-X9+B->4s z5Vz2zErYQZmTv5$XDha-Dg{}slYc*1PMd6Gu+3k5(%pOS-ks)`+b0Px+%!U~3|T}G zxGHohRF&bw>L#2ZG&WadF16wr?s$Wj7lZk`<=tZS{r(!7mkRD5u0DNS0EUEoOBRGI zS4;Tv^%hvf2)X`@fVH)o86j=kMr{&lQ;}PfZ)#CA#1)dR(1C~}V=O9diB6(pZbfNp z*B6b)2sIZ~Z8IECQUpZ`r+WD zKM`M52vbN7h2v(iTSKwi2gW&ezn;IXh2^Ip$=R=vbmFV#r1IT$<8pg6zwua;t7fgu zQ-(g2x#dGQpU63g=?I!4mwcGG$Y|T;!YSRm>NyMdD*V~qY_!}}TKRixM6N37BsN+o z+w=pY0fXo)V1E#%LCD^e*kpuc&-~nQ@C%sLhOaYxf1p1i>YEK&!1hRQ{uJDIeGJ`e jp2x4qzlMbWfnjO-?>eubexu#{y%_uiRYik*zXJdOk0J4y literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TR_16_16.png b/navit/xpm/country_TR_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..950e00926060e92f60128370c9e580026d55e4ca GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_aJzX3_ zG$tn3oKZdJz?GonX*$=`fRnrP-5rI(zb5&vigLU<1=B9{aQ?6VSFtkv=z$Xl-X(ng zd_b^9YQ|DkOPknusoQ`5|DD~~`0)K-cbUF2`~LaA{y%0f1vO{=c{8@2P{_yX7S$B_;p;ckd`FH2#yG@Z&%K^5ymS_Z(F@aDLS~uB+$Iezn{E zVr#mAA8-A9yZ;+&&FjmJm9@2%rL{LNx^w<-`~UwxI)j;+nGf&oVR9?u>x@pX>?$f? h6$A=BHt_IfxO>L)+g8q;DxmimJYD@<);T3K0RStIqP)ohcuQTH3K8@7Da(5 zB0&dFMj&+9n+OpUbPwtf=*dVgD$8PuBo<4DZdxj3y3=lq;?C~On+}5^vy)B3?nU;0 z{NBg^_rCYN?>(|n9zroii|SqilmNvAc&~LxGm|wNpTmj8%Hbghf;#}Q9W>uyU-i>5 zP|6iWor{AI7+mhV4_z++K)i517@sDhm|gxL-|pA9cL1jvQJ&~WS zeOU)k_2?l0;asB=fc0*O%}oHbwXc@#o8qZ70P)gAY4#0I%JQ9o{|3;LegOK`58G_d zaXAHmh3$VKbvCx$*~67xH8$@b zjXD8Xk0_h?1VCu4r&1ul4YbaTk j3JR!W{AHE^#|Q8m`dzT-l3G#F00000NkvXXu0mjfUr`G# literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TR_48_48.png b/navit/xpm/country_TR_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..2f7930fa90bd26651cad541f0ea9774799702c58 GIT binary patch literal 860 zcmV-i1Ec(jP)P6t2N?#O06j3;9nDz(}*n>4@4`gB`!%@>VH|K7h%X|DFCvI9B8V>{h%eEB5K`>euIn@C zN6h*Wv#z&GQB?tGPEH2n{c@Eo%FuSU%h#05SoghnX|Jvg{DFR==M>Pq+N}H zTffC~#c|2y-aPs0?I72H!KS(yMp`^d>N>~qNb?76@okHJX${YM literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TR_8_8.png b/navit/xpm/country_TR_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..64b1adef01606aa530d50d6fbb8a2dd76e681df9 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}9PZ!4! zj+x0dXH?HM@ERnFwt8)le8u^tyr63L;uAK{g#H^9zY|XUslKRdewuE@8C5<lw4&uE&>jX) LS3j3^P6T3XRkVzgl_wT_U~zSP>%+KQ2}i(NA`skLR&60JSxPkf~ZDjCsGlU*7lJ^W5j0-?<;}d7gB8TQgxnX+Z!0ge}bB4yW$* zuLRDV?%=~up{K^@V`T;hPW~Oj+v@C7ux9~>ImH$-3*v&rou#_FbP_z7ySa`$6_UCY z5fy1txXFlNJcKXVQa4zar))|@6pFXXvQHN=<}v8~ASiuK04AyeQ<)&#RkvTKwapuL z3_VLEHOi-rf?y2Q4dd`TS0eOaM~^CY2^H1Q+2`5a1Sl z@>rnPn8#Zl1N~nyA;;jVhV)MMP@tKxkv4*myo@mo^{lZuC&rwl-rV(-$*^X2Ul}T%zLy6RH~5tNaG|7UDj=R*~i59d>p+TeB z9#v`|FbO!BI~awwV5oH>b{iKpAU&T#oDuRKm4xV#>TNwCzw@_?9$zKeGD2emAzw@9 z8Zt{~xRU1H6s#vmMs>k^f`>E1U|+OU0dVv}9JD%mhcdB!*VP}HdO>0#WkG=2ugT5d zUpVYNgeGUG@(EQ2YkSNpXIsp+XIB%nj@{15!Uo%a)Loe#!#`r4zE|tx+lmdKc2NyX z&2XAFg4et}M66LirZl2IwufjRZ^#s)V(hR#1ZU=Sr>Ce#?Qw$-sdi{d!%E{LX1EGFE`CA zf0E4W)#-MDC{9@%2g3fE(0@@-Zpra=VYX4R)yv9&Ds@e6z$wUjHH*mTOwTya1iIbB z-fV8@{uyW}yMz%BF7e_=>zv@r@|2)EiIJc|BY_Xpy;7m%d@NZWqMagFQD6C}%rw3z zoIY<}9VoVU6y2PhdO<+6;$tf|(k4@!21rQyTbKA17Fi+?Ex%3sqahX&9xTZxBWmQ9?!mc|&@0-5fAOY-CziMxg}qW# zGu-c?@P0B}t79zwxcL#Z5j%kMwL4a9UR>W9;}jToFnk6-D>L6et=&$uR^>asy8a6| zcrCVhqS{()S$IW|g3utL9e2y$aGP8fN6w)(&*(SU{|n*)IP^V`VK^enAdq0EVwy}4a7@x`n$MSA%V zFBz$rPVxt5_F&VXk*%hL$gs$SDkMpp{11iy+A*k zP{C1doK4cnff7A_Sli1WAB-*UT9P}|(|bsEtsJY--)`N1A90mt%ce~JteSnDeS8*q zFyR{68u7hisP}wY`%|qRPlqovY>8MZqu;}v#+kO94{D2Y|Djdmh`eR)K;p%H3oJ=_ z1}iaD@hRi#_PmEMNAcnd|Fy+`UH2u9P+{ZWL8h$JQUojzw(!>`UYLIXLCSPp literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TT.svgz b/navit/xpm/country_TT.svgz new file mode 100644 index 0000000000000000000000000000000000000000..960a8ebb1c95b23cfcf53864e4e6baffc2b5228f GIT binary patch literal 313 zcmV-90ml9xiwFolD0)Z&17mM>Zgg^aUsO~sb9QF{ZIH`u!yphv*Nv2apwn#%1Aakd z5~;6kyGR#Zwl=jT)9$i zdAgObUd?Ca^~3Z1=I!N?><`VD<3%Fs_8Qs{c1y;FVW2}oecv#Fh%8pXxnz0ltlR!q z$dyv;^a}IY6&Y+DS`8B86s@sM8#JUchJ!W3oj+<5 zU8muuGMtMXCSUSP7fH4vBf0b4cjMg&9$FjBgkQqWTNmQ@aDhZ1l_D*YbirlpKc0&6 zA`^MOz$pCd`{>@Q?c}?J$;W9Xl;ERP&?HM#nvFgoX L{vH4XBA|NcD-3(J8m z+xQC_f4_WMF!utL4wZ6XIV`09l zSFgT*|Na|4kGqN4w+mOW+W-MC`)78iW=cv*GB7aAm@(s`jRCu|0zM7@|NQ+@)-r$k z3`R!A|NsA|v|NhO-&wpye=I>EC|9aAc=7uUmQ^6BwAcI^23_wT7o c7c=T>0ZVAfKR!ooCjbBd07*qoM6N<$f~Bt(hyVZp literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TT_32_32.png b/navit/xpm/country_TT_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c65374ed796320bfc89693a1b4efe8c9288070d0 GIT binary patch literal 1211 zcmV;s1VsCZP)M#6f;tvv*1{pz;(UCC{WYpE5e00tc3lxD1!pchN2bZ?@v;MeU zxpb`1`uw@~KF@j2lk=RD`yR-o96{fXjf;yjnM{C%j*gD{%4>6Jx!6A|;C}#m^hRRL zgTcGglVY)$EpWM9wOSn)5IBD^&xsR$8^Dysx_ae$u1F-2NZ0~Nk_80?)T!_jHJAOK z9RR?Q1q9>B8u$3iIW?8Ny}cHT#jTl4CX2;#skIqZPvUDE{uw};peO(U%;!gs4NPt6 z)6>%_irSMQXlQ8YLhRYOR1uBt`e6Vw4;sUevbvO{bCs2qY}x5_N~KaXP;j!X&c79K zWC6j<8?k8s5Xfn&Q!164o15+tD2nQIx}tB}?2rD&7MFcBa7E<$;Bq4G{-ooAq@*Mq z$Jyf)3dJXxS=x7nq+!b^1DO5cBq^k%I_`9&TrT$*S6*JezPl6teXEZPU`51$GFvIL z^+S21N~J;&#LZ(EHZwCLYnPMjdi!JT(GB)RwPbWu?e z5gPJZW5uB>cws~g@PD6h0$=*5p}N1ne|vk|&6~|;gTe4=YYRFtjjyhInZa8`t`U4* z^ytqIEymQ;RBHdpQ7V<03GZlAgp}F(qH=E$F>qq|%9mB=5)x`_Ydxgm;^J)%6xQD0 zrTmbH7?4}rfF!e9>W7DiH#YVfgUx1JSXlVtn^wo%qGNvXz}mwjash@TZ{J)!ek?ID z(Qdc1m9DNXiAX$`A|y5q2h<&Db^riPBjxqcuZOp{w|giR6%{KcW5f^N0SJ1&?nn_a zpe#G2!FW;Ls8*|&m-iY2K@b{^rsV5p>Z#H8=dAw*008@Atspi!yR4+UyW8P#xcRlU zHGx2o*-&L3yhoYL?2;qz!834!gJOOgx-~NFaSP$`c$1Tpr*T@BRlxoa9(fO*fi#*{ zFV}xoSeTcW$L4Vy&(F{2oIMkAO~&SZi--ZXyvhp=5msI8>FHrN41>XdVVL+vqxF{u z#1mIn_ch=19wicV_FKh|%Ga?2M zmlHM8r={`al441rcDw0zXAXNpq;zF&%9N8g@z!NO2t;j$Hzbasx&wz Z>ObOm572eD*RcQq002ovPDHLkV1i-JOeFvS literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TT_48_48.png b/navit/xpm/country_TT_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..20fd09e41f293b35bc3dd9be8d207419089a45e8 GIT binary patch literal 1937 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 Hry>9V@7+LX literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TV_16_16.png b/navit/xpm/country_TV_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d632658a11b589b1ca6488d85d8f1426419c0c00 GIT binary patch literal 542 zcmV+(0^$9MP)B~qU}E_D zkAa!_mxODJF8enHd5vEm7#J9o6ore;M9S{5a!ZP#Y0&4}`~N>P%TrdKt*;q6eH5M@ zde89ZkCC+SivQwYzdaCTKnL8+A9z{cFy6M0f$;yl{lLJ$z#=RF;m*pgM^-J!`r^wU z0R{#JCJckn0T=Tp9_IJK5^aAN*na=#V5!pg^Rid<{e1uJ%a07Ktl}mb+s-~+d;g~b zOoI~FSuwUp$KMAtG5q_>z{DaY#_Rp$a@&nRp4{IV7#KRYKk3$FxPABYCzyu&-;6%| zmU#L@<39r<0|Nt7jo7D24;cFPK7>fmTYJ9YAzOwvC)`P2|MEjri?TgpV))Bgy6QGT zZ!j=0Ff#o26r1w&yCyzQGco)%=HJS|z`)A*Q-kN|nU8)Cf9T@Vz`^`YgZmgG7JTkz{Kv!cR)FP|5bN_J@55m3 z!~rz8j|s6n4-o5p{!8`QPZcDO;Q)sGJD8dNtbbYh{+Go4?*?#joKD*DI_t+@?(hG2 g85kJ;|3{b$0F-a2!JkX<#!I6W1;-*PQ^5cun8|b| zl2B@#nxQHGDJN=joNz$F^pA3?843PiB#RYCO9+?@2qF;Wp}U03#%}EH-S^#lZ+~3m zwF@k3=dXLu`QG!nzjJ=Sb1(AGnXko159XKGtJ_Bb000VKO8l(9830bC?r&5NGR}QF z<7(+)ZcJ2_ayP8SP<#J9%eilwYK!;mieFBYoB2eIxm&PB5&Xehe&*$&wplrn4M5<>5)965|tL`mRAS>P>B1vLFCVMF-ZAD+_ITlM+k={N!fW`L1qFcCj`31_z1w0ld{om=U8qWl zVszV;;ivRn;_My5l2`rD4gix*WhiF?K_~|)LFU>R5zJ4uPm8uCBYfUi)*%3p*H;k} zQ{1$q&R(tFI9t=(7LGrRlJ&>O9ce!s4mZ~e}aM?3n40U)yK1Z}~s?L9+Lv6BYd zBe)MhIQRZ0LC>T^*<;!3p?F-(PIzVkSmSM3W6L0hBJUhbpZ=uI($;;^9+EiN3jh~f zvUF9ft@#G`2lbiz=*haa#+Jd%=TeqrXQA#~+1YiRu|Mz^^{%*wE``MtHWx(!pm<-> zcc%-cE9;yZ-7!SbcURBE`tD5Sm)A?*eM68Ke;V&SkiFSweNZ4<4M)1n2OOltNNg|@ zvPIFk>@JP2996dby67~i+eZuD{yylvl^AY{KWxpoW8G=?gp)Lj24oT7(&u^8m33~d z?tM|}Pmc!bLThOodA*`3wBk+vCixf6zkDu&0!(91Ug(M7JeUQTs=jh*bVm_o!?huw z4+B7>dT@W)<=_v?xbn#5G!$S9Zxx~rK8gbXQqeH7+%o~&7RmLZ$d64#M2+SW`v0b8 zMs%O$g=zQ3j+tTyDG40FMx4RyskvG+7R9?K#7roV19%qG?Z8I`LGxaTtQ@s%(;H(L zPY7H0q^Qm62^q5Ox?w265CWKU5SZ~$tBkGXq4=D~Me);uepCfrwUWUUV9c}#d85x9U?YPj97z@;%tOt8GXe*U+0!~rh5dLoP0yF1+my3J_E_V3*qXs) z-^d@JX>8KDdDxb*L=$)qP#~R@klB|?QRi;imrKrC-~a?@06-8rU3z7!R1E-OY^{u= z5n#BtI1oULpdSE8nw1$+&qM734A;35G>#N0Ysy=^<{m_HM^w^gCn*f)YGfR3MsP!q zdGD=%UyBoT>s&tm4c81%iaNJSt{L3&o5sVT?8&Z~0w*N|fN{rDKJ{xZ5wkD*@oWGX zw(f9HV#dF4?>`nmgc;9kFNiQB06cUhtg2sgiL}mSnnn?X@>BmGg~;8-I1FiE00000 LNkvXXu0mjf(2G!J literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TV_48_48.png b/navit/xpm/country_TV_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..527bc255283257a4c89d11cdf5d7023abc871902 GIT binary patch literal 1794 zcmV+d2mSboP)K~z|U#n^pRQ)L(c@aNv`Zo3)G{4e9%nZ^LOayg+Y>aJOw%t4K?rwiv zx**K4V4Ke$JMX>k^St|=_ip#S??sGX6sz*Htpqhar}X#B&2Vox4rJD6ECGOrPw$at z9_Z7XIzFaiNup`RI}xk0K2Mqf{s`1isB0@KQOG5y_GC{<9qxN&Mw<4>BCRRsEmeND zrXbHR8UR2w#aoP@>@*bWWVq;uZ41+qV|^)0OOD+)JKC80o@(t<^_wegj;^5~6qun0 zG`qM?_08tCq7p-)E-X}XvSdj{n$~-LMw<3Wme#cTeNJN`$SI49hXP6oJ=Oy{U#*{8 z`cLGpLe3<^MMuA07f z-OtotGh=yKRZY{NDRGi(dGR?3vOkx_zBXO8qZ`DT=9S&>ZkjsLgXVm-e$W~K&{Iiw z$Z;4#VFKq_^P(P5k7?(o-lpEg`{(*u!^K~nPXR!K{ZW#U0|3IZte0%Erk1}C;VEOh zWNtWEKR8gTq9RdxQ6{kH^jiTyXf8hFC7W()7%Gh|Jjw}EAk3=ZUEWaTX%j+dW8 z5I4)B$YsUjgBz$%lzzad^@DAXAWb*f#3^DFLI zGM`;uM%bL1f;?4zcIzu|l+THIIz7QVf{#?i;SthH0FW8=5r#Mc;4fmD$4s=prmd(% zrQ0}f-_1TNLuIv|GpXNPsam_Vb>+L|vwbynxFSxpFKebopKN~x7jyzZoqf`MLB42u zn>y|PnR0zKUALuQw9aWDCtT^AO1L5bpvx`s44O7+L?6xk`)GL6jGV!k2v&l>@EemDT#WtM@xdnm6rzK6=1!0)QKiRFCH)#kYGvGF-&Z&79Ku z(-#_j8TwRJ^0)It=T6tU%U(cVj4H4Kd;**Ro^R;Q|}&7XQ)l+)-oxgIQep&{Ik0 ztqV|K2v@{$Q!YHH)gAzZX!lmG(J=u4nyJxUZajb>9PJdN4ggSKMvn<&WWRC^wYcG& zWuaVX;tm4^>SFP^>Mcp3XSH~>$As~rC%J~DEBZ%c-dRf)3Jd@U0|a7NVYH-vZ0NZi zceeHE8Y!!a6x~UX{+X(%XrV^d+0y~wx-FgS4b%)Fz|w9phENRK_pz|UrFurSLns$~r%&AQq4Y$76i^iDBgm%#b4g831f9CI1;b5CAZ&kZ&Z* ze||ao9m3PrCm0}^z#1-ULV%5vT;tAkxKy!{S~DFJR1kN!1po&VHc$QO0dNOIiaRifIeAO?YaUo}CMHb10CM{l5X?f{V$Md(yWE5eFn?Ix6 zp)8;Ph}ETbv10Gz_-%%Mv%YYL90vduhIN!X1OQr{iFchNNk-29`MI}s_FjcQ9k)jH4;j1rDn8det7eWK#I6 z&}Y)Gwf=HZe&VxZ&s3UyxV!Z_JHvr%%4UaO-*)!Eio_1sF{CZMw!JYD@<);T3K0RX}MWu^cC literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TV_96_96.png b/navit/xpm/country_TV_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..a99d39ecc1b77a2cf3fbe00e2674f67423a24675 GIT binary patch literal 3566 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TW.svgz b/navit/xpm/country_TW.svgz new file mode 100644 index 0000000000000000000000000000000000000000..e1fce942882b4dc0a920e9e05cc0127aaaaf6633 GIT binary patch literal 344 zcmV-e0jK^SiwFoiD0)Z&17mM>Zgg^aUsP8vb9QF{oswNk!!Q(v?*;$EF(N3eOS*1# z9gPFOt{i$XFT9e{rcJPGMw%_#zu)OT3o3{g<>g7vIq!Qy53D-%Ls@n z)tRaaPTr@_-jIy%&d=hD$JdAH$J-Os%c5Zva4NHslZauH6snMxldyrM67F8FIPpRT zUY|h^KR?79bgODkq_y)ArOvso3%c4Aw8t2uICNh!T9vB$`l-;5qKIy93FZKR*of4^ z&WykswU4^b<}-G63b&(Nl_e)eWQ6`Hsm#UaB)&uar9W!0=BD)rmgd#h&fJ$X!b|I7yUuNw_)0ssJA0jAvm literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TW_16_16.png b/navit/xpm/country_TW_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3f10211d4a75088cc8d30ec9d7a02cccd0fb5d GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_=o-U3d z8WWRK5@wui;Qf>Caa`*hOL}Go$BNaTlS5m0A{3_d^#!CX;bK1g|LN)XaXUZtZD8Z% zJhwz;>;C%x?{9y9b4pYx=fShI#Ds*Dl#~aLk`zyQmcOry+wkDo|NlJS-`5{o-zX^O zb?a8s|Nq7@yT8dDIx6bL!5*{sm)!oF0n-137jtnM2!@~ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TW_32_32.png b/navit/xpm/country_TW_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..881971d38d7aa830e6722d9c23e0e318273efed8 GIT binary patch literal 409 zcmV;K0cQS*P)Bnd!J@x zXk}z*?%n&ex7R{emWL7xP=e^uqc6{&fAjH?*V7YXU|{g}mOps#+2hAwD6s&=2fDgK zY;4Td))Ek|jg2@vJCm-i5Y;T;=V#;KU`7_<;9%zCW22e{M~=LB{rbnTV=o}wqeox9 ze*NR<(HE3hfD#9Cay(jE0=suVQC8;r|DR#co~K$`f^u>^j~7lqd=l}ltpi3R`u z{illCA%NzkDI=w&B_Tj_ABKn(x@;wxmb2v&ejm9Njw?NVuDZEaH13|Bz_kWAh*oBGrg zxwtsqoh&VlN2B3ZOHZY4oYTAsQq|7Z)PE<2}zx6V)?;Ll{1&(41K56{nkWircwfZqd9D#brMv~s!1)s@nn zTwW^qd__@O$t3S6$oKj_gyR^;MMSZ@volRmM5CbrKqxfw`1t4Kq`>oZE?0T|DRS^W zq-lmImH~j{zW98=Fp;@A3IJG^0sv7gd+=fG)^2x>kMqT1tyrub9pxN#^cwW%DhRT! z8k$Swr33xVuHAiEIAE(EgcFO@mY9ce~l!TolPE?JbC*2ZJco-J$kV^tSQfQ*yvDeub_i$ehzuVnS-U&fW~6h&RZjg~1QKh9`Bo3buuy=ryQb}_%#C`7-w|-z*9W}p)I4b&Z@<0mk zt63%Px~j4XgZ{(u`bCUS8jebFs}3$L&C5Ghaosx=-^H`Ul%WI~kS>d#B7tJuCXoS8 zQBrsZ&>=@H8Tl-&45dnWRb^$~v@t3kfuE+J&l(%v%=+!4`?D@SdUEm(6Z+U31HVUA zT*hCNJ#2`*TjN%)t<17gvU`!OaO+Yp&!M$5Q?!!pBB6$A#FHG?3dfNJ14l-aw@*4$ zrC}cc0@ZvxchPgNo)!s2DlKLDK1yZ0_eWV^m*OmM6m!6ywI=%Dsi{FsI65|VA|Do= z3o1Tb$N|447*ta;I60|blOAI=l=G24_B=FGD&RhR;OvH-G2EszdTtd80`cR- z%_RDZ*muF^Df2$zI9#Vq|Goaw+gGcq?7YuZZ7y*g35#oFktpj#%;&}VgTA$6HQvNm zoX7X?pPrvzGp0zngocM(YgmZpH`fGdX`yXxFGohQ)-NXojl~>(UvBm+w{CP#{2?X4 zidaddvLHYZD;76F#>lQz zLW6KtiuS}a;7sxNFc=^Qfjmty+a5AA1O}s5va^{Ql$w@SwaCbBAJ4bOCMIE~Lu*Sr z;Y}ez;qcXKdU^I&;^Mf=%OBhIK4GPRUs@YaM^sbpA!<#dm&Oo!Yz&=JQgUSr&DXQp>-ZI<1UoPb3-yLctGSG1b@*nqg=i7c6< zRI7mM9({=?qPjM8KVi>5T1K=XtdL>Rqtd^puh(Dw*eAY7pR0rk?=oh|w+sJ79=h*(mh_E`U7DKppv zwr5X-k9Xo3@5rvMa48Zyq^P*6sK^mRkFxF@W3e~ZwrM}7rppy@|3vgf9*J*z9&Ao9 z)hO)Qg~O@kW_EW^baw~8aeWssq6k+L0L#mh6Ra!JqoY37zramQ{1{EgP5(Z4a7TtT z^G12QtULpL>sVn_dwo3w*x2M&S3?)R?P8^?17L*!EIleGt1Ev}b0pPBcW-~ho93g| z!{YV+yMjE!?*O1_%~Rdi6cNTu>Fn=p-S1eZ857xe^g>c{0Bkq+?d)jB#-QIoO7-l) z5yiyms~5$yxoE&WfI)`5;G+#RD$>R9bhg#6myms66zcw+qqICWGDA_e!y$i~+)ZrL z{x|R7N|{46--v=k26CtVOF;>hvAKbk+xx%3EosZSp<}8_>K7y*0&uc(wS8n0ocRws CVCWS9 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TZ.svgz b/navit/xpm/country_TZ.svgz new file mode 100644 index 0000000000000000000000000000000000000000..9615d4f098cf4254a6d7c5b4c7c4e51b02eea731 GIT binary patch literal 416 zcmV;R0bl+fiwFojD0)Z&17mM>Zgg^aUsPHyb9QF{m6FR&!!Qs<*UeX$VV&4+Lex}s zk@^53@e&jeE0or5V%0cR6PlKs0XPoqoH_wKw)vDBm6~F@qMA=y( zwaooF?|`LrO=J5xKoT zB|PAijxWI@1oEm{b}6mvI;g{-SY>o_L)(mn^kzKtQO&vULdJRI02INT2eOiYb{HUp z;HOQ#t1m% zYI+o=K>J?n3ukIx)E*4BesJ8AeFZU=hEnc8xS?u5TV+g9Kb6Q@suI;3j??40#S^E; zL>t$SBA05vmrz_R@W(iu&m`yZXU5;%PT2YBGBxRJu`~IfN7MPsp&dI1ujf8%-+Kew K$X8j?0ssKc(Z>q_ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TZ_16_16.png b/navit/xpm/country_TZ_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..16d82b8894abde742638cfd7d5e88d15d0a2fe6e GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_qJzX3_ zG$tlbxt(>iLA;`%&a>j@5$nHyfBXNJl#qz{u$u45FPV>zR*L(WGBYy^*KIx=7|Q+0 z@X?hA2Y;%*IhcH1r6r3~a9J(4>qcwM39mQ5|EvD*ru@D-_Z9c7ytg!M zCV#HtrL&he{#(o(c9n;Rr>9_=g8buUl8ba>{_Z&ARw4Chk}dZUj#X(12@DKz`xXdZ TwA^|h=q(0MS3j3^P6E`U;=ZZZ4 z|KqPm_J_k~f1}AVQOk56Y^F0%=mUu9%)kGJlzzl&Iz<-X4;e}=&}02MQ}_jbw=*y> zc-gX%69?w(-Fnn4EP9vtf@36N|7#O-)u6>j>XcD~R5c}cSX?sj5K zfB&D~>E2WlEFhR7(M)%{H~G?cRbnk5&vXVNGaA{Z6J-GDVoxqUl&HpswlY7Es-E6boo!I>G`PnGUspcBV5hFfh^7bOr_n#&_o>i7ekg z|L1kTKk@80P2x>wU|?V&zV;y1?GV6x@#desC-BwUOFQ|#GV*!epK#&3I;o~JFfcIU zk)zP<1T65fWn10H|Cw2U64M!Q6?Tvo2j!+SVD$l2LI$S=)HR)ffdK$At+WsuvVJN6 O0000!SPpAq%= z%bvw$yWEsDruaH_YdV-dD}Oa}Gvk4oY!iNn%grj{Jm(r}sNvqNK5O^qSMQ$9@tUxQ zjmz5P?(93W($}wK6M5xp=X*alcTb!)gQn%meYbDP#nk=c-lVWq%A?F)C8;;jln9Ha4I-9v+@EKIZmw_k1~iZHDi%EtNmb?RQM=0ScQP%Sn2=_jO&B;%)(k YgVP+gEEmjq544oQ)78&qol`;+0PGt=_W%F@ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_TZ_96_96.png b/navit/xpm/country_TZ_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..ded6070bcc9d539fa4ea867e8010cb0c49cbb864 GIT binary patch literal 765 zcmVK`D8;NtAqK^%n68C?1Y6gM4ADk7K`9a7pRy<9JM@4fr|e(!z9Bjmz|-+M2FB-ypy z4J@{~dbm@3&$F3}!~MzKr=!uYfAyaycl^3!w6!*VJ($xZd@~VS&Am2Ku1}fDV?oS>( zccz10phdIO;JtEnDuDv5tkd)Xh15YEP+%Q&0d1}xzP#dnS3Y0S&(r`p`~;(B>qY+M z{Xhp$_?5L@;=))Bo&2iqUVw`BoI(?Qf8Bv1!AKr(d@0wh)k2|$u{=p0D64&4ID*P%lo z6*_bUq(z5LfE4Kv9!QrCfq~TN5E4kE4#9ww>JSDEIT~o(>LyOzPkY$f^!bfDG%<9>}&1ErHDI&;}?59U22gqC+#F zcywq06qOFk0>!4oQa};vP#-8x9cltat3w^2n02@mC~_UDfszgtKuKp>IZ)C$tpq6P zoNpc|>C80)lyok329$J4I{`{Mi^@qlmE}pNy6o@QtDXP0@0i|`Z!bRlyyxSNEnDea zN9^oOn>pr_&c)7vl1^zSKuKp&IZ3CoJn2-I75&W9|L+w2?9Zgg^aUsXXab9QF{g^oc>!$1&)?}h${aXg#Jnrc|0$~3Sx@l08%hyERjxP%!&4)k+J+2{ya_7sK=j$8G_f+wP6o`gjVUM zbsVqap(V$=PBgo|-fiCop^b_$kPoVIe{i+#I*zBAm|j#91p0@W#N+cgk8FJ{CA<7) Q^VoX!1vNxYTWkRU08uu5DgXcg literal 0 HcmV?d00001 diff --git a/navit/xpm/country_UA_16_16.png b/navit/xpm/country_UA_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2cbeb0246d048e9587d76fda4999b7981c3a5deb GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_No-U3d z8WWSZXxSce;7U;P{JMfoiShCI-AP-vCWbH@GBEVXFxOpN(#-}`%;4$j=d#Wzp$PzS C>>cy~ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_UA_32_32.png b/navit/xpm/country_UA_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..d76411e2b46f57dd1604f5f01620014adeda8529 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&*yJY5_^ zJUWxNXxSce@IK%YeA!)BVr#;cra*2t-33Ake=5U!mWlEFRgi)SN(hQEFzoAPp10WP RNh8n%22WQ%mvv4FO#toLCyW39 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_UA_48_48.png b/navit/xpm/country_UA_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..5979bad4dce7ab0463d83f2f7729470d1683dae2 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HR4^= jX6d-Pat{m{mZ|Kk{xa{&byR!|w1vUb)z4*}Q$iB}b5b&o literal 0 HcmV?d00001 diff --git a/navit/xpm/country_UA_8_8.png b/navit/xpm/country_UA_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..56b490c4d58ef8d55c2cf8c9252f94c80e4de2ed GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_clPZ!4! vj+x0@v}_MG@ERnFs(Lqld>(5Ub(@jlQ5bWc^)zEapfUzeS3j3^P6gTe~DWM4frr%B8 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_UG.svgz b/navit/xpm/country_UG.svgz new file mode 100644 index 0000000000000000000000000000000000000000..0f376c9522818ef8d38d4ff3cb082fed8e0f7ec4 GIT binary patch literal 2902 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 Au>b%7 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_UG_16_16.png b/navit/xpm/country_UG_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d286b8dd1aeac9e9dac162acb1551a65717e85bd GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_WJzX3_ zG$tk|EHF*r`KlUt`2X`InF&h1mdwnL-KxWU0u8m*-PFEKci)!mweiKjBsbwC<6_$- zf-fGuQ2DI+`})kiEpv}#KCXRzaIyaW`r;cE$r~MC{@^!Rn7RI6<*v%O7ugl7vSxKF zb{}o)l{WwM;e$tYYyPcGqQPR-HW^vFjSY-q_ctBA%q+@Z!7#1j0KZ3>5JNtjj_mR! Si`E03$KdJe=d#Wzp$Pz|!&le< literal 0 HcmV?d00001 diff --git a/navit/xpm/country_UG_32_32.png b/navit/xpm/country_UG_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..08b581ac94f4fdb2d0346a630d874869664b4af2 GIT binary patch literal 398 zcmV;90df9`P)|k36Z*p4Wd8hp32qJTUI@|cl*6+-K;;R9@Mnp9}|;sQuW`z zf4ToLTKGgVGBOG!R{UdRq@D#LGD6zMuV26Z%)-pV!otA7AgpKpPgt627BGv;F)%Q^ zdiCn@lgB&v?|gFm1_J{Fv!ntsdWiz|cJ}}O{{Q>?ua}oscWLfC_mJpIip^!?2%h#)~gR75c_FdRL6^v|C^XU?AC=H@o}`t-A* zlcTdEk$Q;&KHfe*zyEyw^7XbY+y4Ik>*eW1q()-1@vYmp9z1yP^T$ta9`44*#`PQ4 s6RB~uJ{SQO45s>kJTUa*VCY)_0DR1LmLTDemH+?%07*qoM6N<$f?1})ApigX literal 0 HcmV?d00001 diff --git a/navit/xpm/country_UG_48_48.png b/navit/xpm/country_UG_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..7824a584ed73e51cba7cfe86befc1d80b703fcdc GIT binary patch literal 606 zcmV-k0-^nhP)%A7J?%VcN=N3n(nc~VTzg(gR(m}th z{M2e^2q~&YHN4!j_yh+xk817AUzR=tg%>Em!IRz;lwa1aBZ5QKjH>h+!5cNiELRxO;1CDpMu3tQVk!)khkFv{`FT>fn*|~;>hPny)pLvD<|7W;#`O*M5Xv>x@ z5JpC3#==DlWu#>o|Ni+WE+eR{zIn@LvW+Dl@bK_FdhqD)@4qXTul)S+^XgTrfB*db z=)(E?ckgp?kzX)U1OfvC|Nj2_|L^}}M~-!McK!eR|Ie>K0sa94;~EG^Oh|n3>_uK~ z-iqZb-oAbt9~V!dfsB;9NlHq}#o2|Ck#X1VUC*CW+N&Dvmk|P^4k83b9YhF>I*1UU sLcff;>08tBb%*Fk@^7DoG_dR&$ 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_UM_32_32.png b/navit/xpm/country_UM_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..6f9a38722dfe05dd4f4cef5a37a91dd8ed121514 GIT binary patch literal 879 zcmV-#1CacQP)Ng8ghKt zSXtT%0~i?@J4*r?7#KQ=1DKc?TMPU-IM~QDoq>UYk>oaV6BXor z{r)o=$@%@;)*u~nt3f8wHj%-UH~mmOfx$e6zT0E0%xlqLIFb+V0u z+WwOZ7)2~g)D^|A-hQU1A#?uPBQsrvW9RSLnW`Q`-k$Olx6V1ciW6NXF50K~|37)AGcYi)FfcIu`u+Rz zt!ID!{=0hXISVuM#p_SmSXs_peayzna_PoXCMG5hIZ5^UATn*x3urEAUoBu-*feb` zn{H0$>>Z4nnLTrNGiYRV&)vnOmDxUPr$u-d`H{?Hl+VJ##KywH$jI>P_g^kfwr}5m zp^>6I97p@($qb?|-+n5}h{XDt_srYfnCn~KyRNr9xUhZA#LCe8_SJnAA!Xg`xE?<} zWe`Z71&mU*720azr!POUHB#Ag;-;sq_T~eZ0$mK&?LHsmVz6P~MQ=Nu+j~z>et3>d zAF#8tvN5y$`1wbOpXb`~W$nT3IY;n%M}oA+J*&+vcq zfy?Y{EE{%T;^bgmx9cJ&2kXYYmsnYu|9<`c@%RNYgUCQr+TK)s(S{RM>7LEgwl(Mb zR`hP@E)6Q_TH8|^RMxw`y}*BQ|ElvYiR4+p$fldaz`*eL-#<21mhV4)@o=$!`Sufy zl>G3H?D~Ll$HMId74dMe>c|R{X~BOA${At+%bP6+XleoDel7!=TEIk8(-{~T7{A`S zPg@IU9?8!aZJ?y?IYt3uqq6kNOwT)PkWO$pD0G`yDSCWs?8^002ovPDHLk FV1gNE#xMW? literal 0 HcmV?d00001 diff --git a/navit/xpm/country_UM_48_48.png b/navit/xpm/country_UM_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..d876fbb30479f26759331110f84e0fcb04616a8a GIT binary patch literal 1552 zcmV+r2JiWaP)Y^%mrYZQZ+T8}D?DHNqbi?mfd&_zUK-HX}#V2_#UAGSm^ zk;Lu>{_vCe<2y5XlTY4zzu!Cr%3OFQ4(e-@e6Cj;`w}n!^ofgldeasp!f>fX@Z7@} zLny!mfluZy>KPLO00%bBO`SLx05+|f_W7#m05D}t|3jPS0YGd_#L4_c1c7;BoT5ET zBE^Cb2_aDCzB{I0S=D`(Ws{Y$2Fjr~*%Erm5dux4F zpQ)^GGA+p%W1wv3OKSn(`suvk1LA@%ME>UmNxh>0z-)6RD`S2B001N>#hPty07&c= z#o>?upoo(2xMa{Jo&|w2w|kV>>Tm;qM99~-*d@YnpP$AU5d^Y3Tcf3-wzq9TXR?KA zhA>7acIC`pe^hI*7Vggay0HB6wYytZr;;Sj%l~mgO5)lD@1%Y3O%J*F_|BZki}#TP zKAFFG*2)8o+YSkY!JjRXVc2tJH%(?ILa6xXnupC4Lg<&uI*brP=#kb^e5nQ@WTYJD z%5E|Y>!kx1%5PfiZtCLi`VjP?e>b&67_J^Su<)m9K94(dQu3*i8UVGApAcW2BIaA8M&?{4gGu(WQh+a;F@FCAJrGIJNpvQIi$<&Ew9#C?H-5ATi2j()KUO&r(Re0P|qRB${P)jo|yds=El9| z>RXT89v{sxGn_^#?GL&TCJ4MIFC&ag*521{U6VRQ8CzbhSuk^C&U>S-T(2LLsMxkP z?biJ#B!LU^G8(m%&Sd*?Lq_P1A0$mPF;by{asU9I$H5o_06&Z*2n+x$u>5c?02nAo zv{d+XQ%6UN%r=)|MOM5l_*w{*xx6q=AVABd!WN4Q0Avw@7lVOva5*HO$8oy79FlOl zy&?L!VgP9M`iJ$8JGLX+=MP9k;Y9^Y0f1%MQw2*SM0}q=aAfU>7$EFYAkm5;`Gra6}Pnp>$nk#B!Nq-?)8w1)#C>pF0POW z!{?|~hfn`T5;%L-$ifTN`~A&I6#Ob9X`0DY4==p%2LMbN(@)c6)EcZ4R0$-9D6P5| z*FAFT*a3%&EBpawj#_oF=qkgobEl6u@+JVaWLps}`9bIn8x||TQUi+)F9oq4_4|N3Tr>vdr(2mz--w|C- zh>V$^*4Ym2cwP1#(dC3tZN}=(c4)`zKGYFiPUs(@{-6keVh4j(&q^4PEc|LesZ z^TO=-T8`Aa9sBR&^Z)<<=Rs2*PkiF;k@C9RA%d$ZM#JsqpMN~5_kR9ijePX|Hb2h| g2H~(kHa0ef@IBJ;@Aq$W2HMQv>FVdQ&MBb@0J%|2NB{r; literal 0 HcmV?d00001 diff --git a/navit/xpm/country_UM_96_96.png b/navit/xpm/country_UM_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..ddb9a7c0b967a202a424c49797ed028c95e8b715 GIT binary patch literal 3689 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_US_32_32.png b/navit/xpm/country_US_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..6f9a38722dfe05dd4f4cef5a37a91dd8ed121514 GIT binary patch literal 879 zcmV-#1CacQP)Ng8ghKt zSXtT%0~i?@J4*r?7#KQ=1DKc?TMPU-IM~QDoq>UYk>oaV6BXor z{r)o=$@%@;)*u~nt3f8wHj%-UH~mmOfx$e6zT0E0%xlqLIFb+V0u z+WwOZ7)2~g)D^|A-hQU1A#?uPBQsrvW9RSLnW`Q`-k$Olx6V1ciW6NXF50K~|37)AGcYi)FfcIu`u+Rz zt!ID!{=0hXISVuM#p_SmSXs_peayzna_PoXCMG5hIZ5^UATn*x3urEAUoBu-*feb` zn{H0$>>Z4nnLTrNGiYRV&)vnOmDxUPr$u-d`H{?Hl+VJ##KywH$jI>P_g^kfwr}5m zp^>6I97p@($qb?|-+n5}h{XDt_srYfnCn~KyRNr9xUhZA#LCe8_SJnAA!Xg`xE?<} zWe`Z71&mU*720azr!POUHB#Ag;-;sq_T~eZ0$mK&?LHsmVz6P~MQ=Nu+j~z>et3>d zAF#8tvN5y$`1wbOpXb`~W$nT3IY;n%M}oA+J*&+vcq zfy?Y{EE{%T;^bgmx9cJ&2kXYYmsnYu|9<`c@%RNYgUCQr+TK)s(S{RM>7LEgwl(Mb zR`hP@E)6Q_TH8|^RMxw`y}*BQ|ElvYiR4+p$fldaz`*eL-#<21mhV4)@o=$!`Sufy zl>G3H?D~Ll$HMId74dMe>c|R{X~BOA${At+%bP6+XleoDel7!=TEIk8(-{~T7{A`S zPg@IU9?8!aZJ?y?IYt3uqq6kNOwT)PkWO$pD0G`yDSCWs?8^002ovPDHLk FV1gNE#xMW? literal 0 HcmV?d00001 diff --git a/navit/xpm/country_US_48_48.png b/navit/xpm/country_US_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..d876fbb30479f26759331110f84e0fcb04616a8a GIT binary patch literal 1552 zcmV+r2JiWaP)Y^%mrYZQZ+T8}D?DHNqbi?mfd&_zUK-HX}#V2_#UAGSm^ zk;Lu>{_vCe<2y5XlTY4zzu!Cr%3OFQ4(e-@e6Cj;`w}n!^ofgldeasp!f>fX@Z7@} zLny!mfluZy>KPLO00%bBO`SLx05+|f_W7#m05D}t|3jPS0YGd_#L4_c1c7;BoT5ET zBE^Cb2_aDCzB{I0S=D`(Ws{Y$2Fjr~*%Erm5dux4F zpQ)^GGA+p%W1wv3OKSn(`suvk1LA@%ME>UmNxh>0z-)6RD`S2B001N>#hPty07&c= z#o>?upoo(2xMa{Jo&|w2w|kV>>Tm;qM99~-*d@YnpP$AU5d^Y3Tcf3-wzq9TXR?KA zhA>7acIC`pe^hI*7Vggay0HB6wYytZr;;Sj%l~mgO5)lD@1%Y3O%J*F_|BZki}#TP zKAFFG*2)8o+YSkY!JjRXVc2tJH%(?ILa6xXnupC4Lg<&uI*brP=#kb^e5nQ@WTYJD z%5E|Y>!kx1%5PfiZtCLi`VjP?e>b&67_J^Su<)m9K94(dQu3*i8UVGApAcW2BIaA8M&?{4gGu(WQh+a;F@FCAJrGIJNpvQIi$<&Ew9#C?H-5ATi2j()KUO&r(Re0P|qRB${P)jo|yds=El9| z>RXT89v{sxGn_^#?GL&TCJ4MIFC&ag*521{U6VRQ8CzbhSuk^C&U>S-T(2LLsMxkP z?biJ#B!LU^G8(m%&Sd*?Lq_P1A0$mPF;by{asU9I$H5o_06&Z*2n+x$u>5c?02nAo zv{d+XQ%6UN%r=)|MOM5l_*w{*xx6q=AVABd!WN4Q0Avw@7lVOva5*HO$8oy79FlOl zy&?L!VgP9M`iJ$8JGLX+=MP9k;Y9^Y0f1%MQw2*SM0}q=aAfU>7$EFYAkm5;`Gra6}Pnp>$nk#B!Nq-?)8w1)#C>pF0POW z!{?|~hfn`T5;%L-$ifTN`~A&I6#Ob9X`0DY4==p%2LMbN(@)c6)EcZ4R0$-9D6P5| z*FAFT*a3%&EBpawj#_oF=qkgobEl6u@+JVaWLps}`9bIn8x||TQUi+)F9oq4_4|N3Tr>vdr(2mz--w|C- zh>V$^*4Ym2cwP1#(dC3tZN}=(c4)`zKGYFiPUs(@{-6keVh4j(&q^4PEc|LesZ z^TO=-T8`Aa9sBR&^Z)<<=Rs2*PkiF;k@C9RA%d$ZM#JsqpMN~5_kR9ijePX|Hb2h| g2H~(kHa0ef@IBJ;@Aq$W2HMQv>FVdQ&MBb@0J%|2NB{r; literal 0 HcmV?d00001 diff --git a/navit/xpm/country_US_96_96.png b/navit/xpm/country_US_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..ddb9a7c0b967a202a424c49797ed028c95e8b715 GIT binary patch literal 3689 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_UY_16_16.png b/navit/xpm/country_UY_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b7201be1a587b1b99cb68c0c3c4031ea1eb060af GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_4JzX3_ zG$tnh`TyUZS+jxF>F)m0Io;6#F;S1d&#z}czyH|c#*hF1|1V$nw*G$wueiDR^az3Z zJ2rM4uc|To^Y{1n%ddt1+voiF*7@{xzGI=~=1&p6HBxnd|9ty>Ji6>zyw92a^@e{^ z)BaqYxU}7$SzDUjdisa&{53rFGk;XJ*8fZVsA=2a&&@Gqgf!-rbqO}be`PbJJianB7z9NayL?X00D6?c)78&qol`;+0GUXG@c;k- literal 0 HcmV?d00001 diff --git a/navit/xpm/country_UY_32_32.png b/navit/xpm/country_UY_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..f00eff0c97d95d51c2c1c03ced819d2b901ebbb6 GIT binary patch literal 625 zcmV-%0*?KOP)DTOycgePZ5fTSqK7V}v=kG_%%x+|x3kOUL3=E$?e>%Ev zuC$`V_g9-fyt?%D!=2AhmoPE&Y*|r4xdqT5x^`yX-{+n0KKzyw`}FMx!_Qy;S-7<{ zU3RguasK`H|I^ps6j|{2;f?F(mj8OcSA^pl2Rq|`MuyjKng4RyF!P!iTPF#NNKoPf z76t|eDH+xOe*->0`S|L8W`!B%D z@axzAFTcco+}-ive@ow$ zKYp__FfcrS^F6Hk7}*vuF)%Rj@bGzuHk>_uoKM_^Q^1l-$XL}N<-o3a3QC$}n~P!r z0|Uc{_isIeYySObU=_6El@9;(@tLV@(w{$nD7OHb(F6pA85o4GUXl|P5fv0SfBS(+ zSGVBY5{#~ zG+F@0-KSpA)`B75s$jYIlxhtKtY9>m5(JDh*WaP71w%fW(%b?7ghJvD9+~|`00000 LNkvXXu0mjfX84P)YO5;&pw;=1_7A@A zY^rtK784|$dg#9v+lp12WiUVwwKx8Ab#3{DNduZ)fqmzj!~i{Oa4cO`YSeM9uPQLt zk3;|SBTl(O6^TS%KCfL|STZ(@WA@IZ zJy&kbFbO317N~TcwcmBG+udxY+@nlK$Y;kgQ+<^+H(P7WoGmKI-PPe8>;ZrU%l9bR z>+YTi5$RSEZUk5nd@!$Qe~s1?JsM;3V(=6b^%;zF28 zBRFJWf)pYYt9RHDLIBX_W)5F|D=Y{AXutPO{h1Wz20H?LBxEs30w3^@9|H!Er53EV z%}CD|2r;qG&rrbMt0WBp&V>2!G&M2k$DJNtn@UhKG^*)^oo$bOUZG~z#Ky0X{eH#2 zj*D}Qp4k~pU>L7lBJcr{yF0@1q(M8}MHeny zc|0R)p-3Q(<3z#mNK0(`U4>e8jvXsxdr9sd`2L|#KvbCMd>zd zJ%R}0)r%T^-mxr$FD%Ic<-8QxXy)Q8b@odDK$05qKx5szduh$q>m(`na(OCko|-D= zK`NChEc3TLsjC!0GZ|F6)|zGc84y9J7a^%muE|NuKICe){ZeMl&MguL6!rR{)6WC| zSG!YhS~bwqDv@Ut6qZ%oI0yiGL;9y-xhBnDCyIp<;VC_-e}plv`} z5w56pXkskOs?}Nm6ssgC zRtX0}rF(1QZHOwlb;K$Oij{OriAewIzO&@k5vwF9RtX3C2=F5JT57l?$N&HU07*qo IM6N<$f^yQvRR910 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_UY_8_8.png b/navit/xpm/country_UY_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..1f0eea8dbbab58ec6427c4c129ee7e988948a586 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}fPZ!4! zj+x1S{{R2~od0~~57qbfzYjIANXXx{{P--YbH%$ONA~%j5Yjor^M2;PyU$a8i@j3m zR#Mc<|NhzCeEWold(+DUd%Rv-oNeIUuwzD7^3((qzZ;#gkM1s?AEC-1xj>Oudy}OC P&?W{?S3j3^P6 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_UY_96_96.png b/navit/xpm/country_UY_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..57a0bbca91d7040728029ad2fb0c42993ce686de GIT binary patch literal 2598 zcmZvecTm%b632f8qzM5zkRTrYK&42p(rZ*|gwUinApru?q<4@ahyoHYK}4lSnpCL* zMu`X#`XNYm^nI0N9}>23BY4@>ep0 z&MJ~RA8;m&ZnumLfYZMM`~Gzv0I7yl}bu;7LZ48}&^R#6b`V*|r2bPPBh zw?r;o;9&3wA-ICw71N=-=bb>s8Q+=JPBI8kOd+tDnLNkAy;=oG2e#?WvuvPeDa z+q5N9&g|&yB=P>vqX5UP6(OZp8$0$t=ku~Tomh$>m6ED$O4l9?KSK6^H$s6H$6Wr) zSY<|rh~S*QepB3W10qMxI6EfQHiAOf6%irHJjCPi)2x7hGaBG;nE`Y>{801Z&o`$U zs;a(u$g_L9w64Q*DAVP?&p7W(8JovK=v?QuDsk-|oiRu~AaNE6bceu?vVzICCqvQ8 z%j_Ixg|fOSv-Kl5tY;WbtuSQXmaGj3MOoe6`k-d^iZ;4_Ff?&ZpI$bwS*0k3v#>s0 zH_7|N3o__8eBHjdo?&ostlzt_p?=E-_(!~`ZSOt z?BYNnckiK}G&3EOtMk9Y#dNIWzPV<^9zAxfTQ0*1rS^@qw_aJKY|~l3`k8-kpt?8s zGGGzT1Ta9h#=&$zRcDlvJ2i|sUfd_yrpk~xI=6M776#{CS^YSk>ROJ&Mq@Uq)IcwD zSlNi`9lpBUmmKS|Yg@0BEpeWjXcECqKd`=4V@_KYwZNF~8H#Z5tBL;R;rsFP z=Vev1&KNfS=gL0f|(WVd(I$8$-ugvQIl&Yfe)eV>|A7^RG2&}FQb^|gShw! zw-wN-x-n~b(7{(pOV%xr-uzap=UiGeA<;=ID0BCc?~QS49G*L^t#Hd=UA@Ya|J=Zm z`&q=;X0r8N%xb-nW*vfVd5SQdRd3$btG~@D8qZmD2`VrYY+6#ilAvW)+S6kO>TDeD2m>LO_l8`3}JMAFDTTdg>TJUixy_?T&KOii3?9LWIGS*P169ObOAKI zn(fjLp&(F2sazI^f8Ap241Y7}8NK@ucy`Bs&cAte)e}WN-)&xC-f75NWt9(e7Xy6>q8-e|nKU}2A+b2soQdm0nNPC*k z{eE|X_dq`B=kjv}*+KXSF=31geN6Lh~u+X-erq(OkyS`H!+a&P>ou3=~ba7SUrFC{+ zE9)llFU>MaYUh6vKu{N==>mI)-A>rzs&&3T`Ru(WzUNdi>NteFV zK?You*pAjnGE5&!w~|2$>@R33YoBUHV;=FwxaeFcz;B zfoXd&P!d|;dyszaTD4@aZPlyNdK-rcpOUA?sY>P@b4P_UWGBA!hLNd#s0{?Zv*f4h zmyscy{b8W12f}EFO=8msBm&{>MNOWlIe2qr#)MONV(xK;bR=bfoH>d_h!J_29OpUxc617x{VGP=5vsQYd^a?{H>Mcemw8*U#_CEhOot z4x3s?7uHx+2%(Bd-Oy`ZTxw1OaA0w~6Fz#&sz3%>L%NrL zaf69`^d^vM(oegZu6Fn0ZG$-a$pEa5=+r%)CTbxSoL}c8)@b+Q&~dmUFGp6t(~M1m zYuBf*-`w%?*rXtut3WC!I|))>N@NDIY7})-o9#Yqt8c4Zjf{$Ne^y(+**PV7%gc_> z@@lY r^OM(?xUT5m{tq<$?>!Ndgi|^zDUj)|D*fv-@B^TRW(Ku-E(!kzeud}C literal 0 HcmV?d00001 diff --git a/navit/xpm/country_UZ.svgz b/navit/xpm/country_UZ.svgz new file mode 100644 index 0000000000000000000000000000000000000000..69e781b43922874a539ea4d9d46b721cee0e015b GIT binary patch literal 648 zcmV;30(bo%iwFoqD0)Z&17mM>Zgg^aUsYNzb9QF{rBz*Tn=ll8ZhnR5y)+WRHUUbi z&`SN(q-m?Pbkm+93I?oEjEob~f4_?%ZK@<|o8T@x3>hp06GYwB)K5vJ5e^ zDMq}EWg^Nf#P_qCQGn0S2GdVh-!Ess@2*k3%+THa#n&&F2#*N)HNGU|YIcQw{JcfX zW`taS!wBbESEqzDO=CA>TdIuQs;J6EToXtnZ6bgOkTGT_I>B%R1V<6 z<3X2mx++BZXICbhOeVzaLT)1xor5hvLzHuo zE1tZM3s?-9_e_?WPe<0|LVrjU^Szy_3fUZ>ik-Z8Wc=!<@j4?_%s`=W=R0iP% zv6_V+n2*i1iktF5#8K0teS1!W^ih-3u6=PW(ryeM%l?`h+?A6w$%+uMVC52YICzgc zh_UqM8!^e_`V3dR$6Y(J?goZkTS2ZN`p KpUXO@geCx8J#2RX literal 0 HcmV?d00001 diff --git a/navit/xpm/country_UZ_32_32.png b/navit/xpm/country_UZ_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..5aa471d9532e908873e868d5cfe940a6c2fb0e47 GIT binary patch literal 442 zcmV;r0Y(0aP)G^>zov*VviUIWc5|>a zMak)EX<8Y|vY5+|GIUmk-1Y#Z5FAy?+}Gc^dUDoe~g|B|Iz$lCp+jxgE=8w^>QoyPMG*v9AVD1plY-R5++|tQboQ;o>Vi9KNQ?XI!h9|R zzuz~zL)lGiY?q)yyU(qef4*yb_#lX9-z zYDD1-+&SFOnVuaSiHz}LItqZH36h!092LhsKhf@Ec4>u|GqHTFQo}=mK)s>U;xYLc zTOgBlhW47d9Vdmz5BXYc?O1Ns3AEPc26k@QF1q;9@gP2r$%Q>#j1KnDXc{~o4gwGv z9#lWX2|ERV*C>89N5{VsUADP5IfJeV;&zfN0< z045TP`P$Q|UjRItn%}C7|76`g&jPQ1#^`VM(&@GGbwexv*4QkLWDmd10&sDlE4M%h z_BML~2>Ke3n!sHNl{-0f2qJMsy*{l{=3^;P#g(-p$21+tbE_qXX=2swW%@ z0C0UMK%JDF>+9frUk5e1M)*Lk7Y+r`wekx%USyE_4m!Qd&xdG&Pq76oDOpOT@aQ^r zI*q=%rIMLUzPEO)2!U!s-0wT|MsUpc+>|HLieaW2!@xg1qtSYFc%OQV{Ktko!NN5?4Squ7GM>0oAwys&NHW f;|i#z>IMD+T^6BHJ$beg00000NkvXXu0mjfeELaV literal 0 HcmV?d00001 diff --git a/navit/xpm/country_UZ_8_8.png b/navit/xpm/country_UZ_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..c495d36a5fe220c054c2c0a1bf9db8d43c9d4f48 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_co-U3d z5>t~yqW1mYufZ;Tc(cE~gx#NCM?d_$Z_k!;V2S2|!wM%p&2Q{)o!L0IwUtqJLqy&0 z9saX=dw)t_k8hKo!&ATSU#fH9fgk^YK;qVfwFlHs9sq(D`wdIX?O1i5N6y<7kiyFF YP)zpT?ZdlFftE6Oy85}Sb4q9e0N$rc$^ZZW literal 0 HcmV?d00001 diff --git a/navit/xpm/country_UZ_96_96.png b/navit/xpm/country_UZ_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..b2b8c4545e87cc68b2080d25e846f9823ab76117 GIT binary patch literal 1436 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 geFbY7Cx(lq~NJVJ|CHU zhMrdXwAN2SJ_1-dt7s4DBZ=8yV>YDEO5sg3_9@91+`)eEXieXjcb}l%DZv00{3*dm zWH==li43O%Baz`$f=OgJRjHW_q)v_kR5)44M21t5I+5X2f=OhECo+Hx;kYd1%QJ4U zNS~J2Yu$Ij-xP)N-r^AcYB66ASJOYTbER)Se0MdS&Cb6aOa7O>441dF>^%EDn=dAl z?^f&O;$4+*Y4T7 z56Q3>k{S199E2n{Y-nqhmEPQgFfb6Hlxt&+gt@}{dQ0fi$JuC|{Y^>2LdFf0mr9U* z(P-1UHd5*Btyi4uW^9sG+$o&Ysv#miN-oWXeN^Ccif73w<1~HBW|WR3RIDNz-b;{1 z?8o>=U>i61S1z+TRpZW|xaF*;w@F+SZj^v!kuI;^6rYD&-O{j$aWK?DE7oK8;_$Vv zwT{y7Tp9+=%BXZ&TXRWLN;Mc7Bo2Y=lY^lT0iviK7B9S0-3M29!tpAhZq&M2%syT( z=Ix%Q|NYlbKfZeHUN>5uZWhxyyBMxmkqcPQSS_L^GChzQw6IbqnDRW5tgKjFIrI< z2*%M;C3#I+ zd)SYd;bHbiI)wckR`1Dv*J=SiF7|I&xJ0m^g1*nb7^iH(g!0P}VGvdgCb?DvhPdE1 zW1M@$>M)b~c?9hq*9!_X&ak>XS_#9*`+W2lWOZ9m3rvEFazEcza6TT)c^x&P8ALo^ z3FqV9oR3G%c`fDRqMByR;S`140k0JSFUu8GPqj6fxhO7DoGEpD*8e|9;;X)+%|#oM-&>VXRjNvtA*I1V_FS)~o$luaBJd z`XSaIc0{JJwhPsXNqUt)N*;)w>WEAmX+Q0V%yTz+)gzmZ$TTdNQTk6s*Q$+ks=Tym z{O*$gmWxoN=aJ4Vv zO;o|c_I@plZ$9Jl0OR9PGd`$87|(ITPR5h4K}l1dJm+7AMn>Zy5-bD~S+1pL99-*G zU~(_xIV3q^#P29)^x^KRCTic zMdK@KdZ&Apj+#9d$ES4E=!)-@uyUQ3uu(4+^Y9)ynx7jjw_>don&~ zcg&0rnhs-p{AdH=>T%W- zUMVXgRS#hNDd^U(1Ze4;<%6Yz!z+R+#N5k55-dGqFKhXzY%iU&e5Q1~ItTO)NoFmd zdmS2H0VTv#Ukl?&?#p=6N6mP$hny2hsXrmSA}tIz9T{bWlJXgQSrA~)vtf+%$9zmA zWjKiOhu1AN+=GYb{Yn_WZ`~3j?NKxSpt>dUsSb^AJeC*8h=_n@0Azzu(NqnEHw^-H z_Hk+FY|)}9fL8DU0Rlx~q+#(v4(<@_P~FJ|g#Oht&I({%AWH0aSxQuYETx0txKNwui-f{Uu{zP!# z+gp8XOjGiv?r&{r(l|(I+~YI}9@_%wz5g8jd)1csmj^ETqvg1ky_*dM;_sG>?cQ7S z>Dm1{5v2$+FxZrEegJ$tx;bAiZs(IG@c*EcZD`k~x3`xBav1o*te_yW{B)v(I$m}G zhZcg!HgPcYQdnhF7YMiVbA}Kq8fXrmOphP=64q1ng8)rIDiZ*6PIwu$9YD++bT9C& z9Zia~zVEG1p=1 z#^craA;yPBdu&ct1w$5GANghToZoH2#x`G;63B;NeA0gVQ7$x~W`csD(_>AVP}r0U#r7wq}+ zyIb)ae_M{saT#QDx7{x#=-T|Deyt!!+~2Qlimeoe96vOrNKgQS6SFlUFH)%oUBE6T zVQ~ThGvsFoSwS2J;e)piutRacKLO(*$dDe#TArT5LMRXwB{gs`DS;$EgCqE{M%WaH zuXh2{8KIF)vw(8JS`rNc+;s>l&BlcwQkHx4ETR~jlnOYzs0T2IP$>`GJOtGet63D@ zxBw7BII;vAj|dLol5{*B?quCT+{w?t=d(e`mBG{l!;dM$egedAWx#$o@HZhEoy1x} zX*EA(rXpe-o{ryanh>!Z>-l8Lv25@fb{pmtP6igxD8WCf1ruvHp0&_o9iSQ(vjvWb zW!kDqPqD}_u;7TbN$HH^Uv`1A4}rKL3ET|los!iHlnh`OPZlWoTg7ex*<8}%ZN~o5 zJ4DJ?4e3s@f|#AsI|~{i!8XjYUw|vCoc|W!vgbL-lwOs=0GvM~uIo@h!N?Gjj?jz* zI)Ex|&S_Ko{0`7%FF-DkwYf$VU_er7jjw}%?al1ATt^tVRVGLqxr5P1YkgaSmL$ed zXt`3B8AKzo_N2MgkgNS@E+BzI(~Wijm4kglVi|HLntZDD$fg=TRB1Ro3l*zfD6EV` za#TA|_(bb?=BEE_0ZaF3t$@1oL2TtcJ9gOtYDi#%zxn`0UZsCqvnUxGIbNc>LMUOO zmmm~uA`(_6AHmE(r5Z5Ue=x$D1cIz_Xd2kAMg$=erqhDjc@zSB=d2re#S}}Cjt3ps zV|dF!eVT3?bXfqYISi%(c4Xik2bmynjcyIP>}i#90Nnt>h+}QU_Vr{Ppvx|xNxxm@ zd}9ZOH<(s!Y?Z@ZYY`mPB!RIHR>vmcI_SI0z`S`QCvx)0`VnG{4LyBxyIyapY0}IC z17MaOw?ldo$81jXJWDzZ%e zO9sMqA-(5zG6PGQ`vS!3EJ6@84+V$WM=Xv=3-PmnPqm#g6xCy8D4NYohJygZZiHP{ z%qvz5v=Sm?l4oc1BD;Q%ohjrQxl=-vt(;+$p$AIo;})YP5jJfwatEz9^qvby#yitc zdH7+7@vBQ!v8)sgcf1JWg z$4NYbW#DIf|6t1$jN|H3{i!&_QZaA^lV6v)-wj^SwR?(IJHy618__9~~}aqOj# z9cml9$!-qG0PYpH&yNDxWezHhdZ~VMDMxinxdvG^f)!%n!8UUyyNp z&{>RfWZ~KjOja9WlfFn{pc@P$%q2M!Ouui!Cqb~k#v+?@{0bQcz?3HF85O5SIx8+18zk-#28aIlty#ybf(7x^V3P>T=&IIwagN+Ip1Y>V&m6G;ghe z+f>|!{He+47ZT2g>t08YTDJpNKDFcbi#YzJbmH)gtI{H-=7AbGge)0&0ESrv29UlU zS1MJy*~`F2K971e-|g~52@zfj%3})sILG4paz5cU?6QKo)<`~=3>^7;DSTk(Q=wgh zlA;(RsR84N)XC@@vvq(jyMSCAM(m*)+h98!G&{k@c7dEs`c#pH7dL#oTN7`a$Q_k6 zYn1KpQ%rmI>0Og~B)LlVQv=A9cdo-U!1OdPqAA&N4 zsg!}ZdL+4iZPUrQK(51CzT&rGD}NHE&n8UB^$e)mPxFczwOL5c!ROiRfG}EuMbG@^*cdN#+Z-wN6`bu|o<|ryiJ4#>t3kNno>xWVHWYvo= zm6m>Cxu|+tNox}ZiujC|e0BK00j*)FL}E#Gz;tytnFRGv`n>&>kDu7>xX3@x6J$yd z$a8MtA{Nm_N37-ku_AYd`BUlWkRo!%21pBJDj~M+bOP2YP-6i?${kWQs6>PKv3xxaWTzs>kZ|b_Q^9LEaczDmL^Ko3mi~z`-J5LgtLFluZjh% z=Hi3OS52?y(~958NpKWUFn9$moRLUIz*nJ=zCc@TgwNoWt+Cv%k#_=l#q~eUb4EUL z=0-DuR7Lm~z_?F{0%jz{Qb3W%VNXFO;rRdd{%uLFWJ%Kl@8>B(iZ|RM2++=lX$nOs ze!-iZhp4XF-7I0TYh>^0rc6Ek==ZBF_vPUhKp+!|OaPI)yAr8bz7A$;YN~3g|G$$) z`8Oawb;eqG1+Ep=C1ZNTYw*y zCAaWV0y#9V1wXdNx|m zjmE9m>&a?8k3hc{)x=k`^*q~p%Gqo^<2+*2E|^+_Pmq%vMX&+nyx(AFBb>1sV4*G z!V<6!hXs?YCk?^Lg!!d|zUi9{ldz7o44aIY$*||Gmpd!=jG?9zY@E!PeE=J7%;jXq zo~iEi89W;@4fnL!iziEFJ_Q8#J;jqLdmhO20w-IB2Bful9M+5i_+)l)oXi;o+N02| zbhc;albG>GeXa(Lw3WHj?PSodqO(EUDD!6bXW#yfambe!1jmoGWu+MEX6dG19c47r zl6{n6BT#BTmmc0l8GTUm8QXXz%An?Agj!ySG9LcggKMhxEnb~Z*V_{`92cMdw1Ngx zidg5&@xvQ`uzSLPe1a~3W&qNlLw%;#|9A$d%mxSQfN6R?YpbtB9&RPGIhJN`Iy8iX z1VCvz2AIW61^WLi|0bEor3M94-DLJ)3LD*GoTG6eL2Oclf6@8r3{%YuG?MiqCIjer zVw@}w%3*4)8G4HZA{;$uyI0w4+n+-K`3;RUvzS51`3e+r%3zd`K9j00p}jm{!66DM ztue`|WR0y^v2M1rt}#61wtPPZPNqAyFKfJUY`b}kW;Ey}uHIjx*)faD9kP-p&3jQ8 z!RqoF)}5J!Kw_}bfME;EwvKGG`3$Y*v}hfv*;{iDb(*+&>Hm1LubFc_6ON@a2Jc4) zGG{Z8_z|7>I};}9LQ03G88b;K3(9=8ZFJeTqHE)#Z8RhCech}jwwrUkN;3=j%$m`S z$A^DI&4^#nS@nsfrg`t(JleH(=*M9;s|uzDYb4uRYsuS)Qh|qn!%wgj)qlWlWkWH@ z`+j(4lPum~xe;DoyS7jeIh`0w{=i&%7UtA?*K(Ia(RgZRY9>0_Yl_k5%>0B9BF#o9 z8I57|s5n@R}}*rQN^L_ENgsE6>57t1;8;wx+N$RRI!9y5er;GG7RH2 zD9p^8I~DRts+zT6#_4p!lkD{9Lt1X{h^yEwd^~?jw4WS5zI`;(Qb`@(Ul}awo|0Jv zm66#VGLIqaa$qP!B4uUcsu$|1m7=8MFrUoa6#J@*b&ZjLokx=-uo3n`B&0TN63%AN zlZex|W->WMYEY$mB4mkd56)@*)*=AHMw2!hw(K(7t*d0i;?8oG;msZ6y^+dqn0@GN zsP=C=(dEsJjnzq@fhl*4JFfJ zk@)7T(vVrm_J2;=1&YyOoo;%F)V98yPWmcY&v%-AlU+`0;B@76sg%~pL79QMEh=8; z_Uo&(cG?ga?&~rw^_ZCJdcKJ+r-gsI@M<7#H$2HskG|QQ+e_YT)9qt!R_y%QVC%V`F&Qa)YhsYYruebxzyT3I^gsw3H` z_d15KhqiRgl~JPctsMc3iJNw3QQH?!L0_tSFWOOESKlVt%kiL!W-;*HvtabBr6 z(P>4Wgf>VPrq`25)dgk{A0?OFRkx40+N7QA?sKnp?lgW^dw3h@li@tg$koE$Chls8 zPcwY7*jH7!nf9B)+;)JQYMu9rn-bo3m7B7jx7^3gc~^XzYW!@A#VG@1x3rjeWq|k( z5G>4slX~LlITKB$`j78%_3QZtw{7ycoPkZLubyX2m9L$KXMr=&E(vjsmzWKWcxubOSCY=UWhKj zFEO{9>OtDGL=0X^7?a9p>YZPVS5bzIXj~eqS_P_FZFD%w!C1oGTiDYa z>}Oci=9y9s|Bg)Q-P?S_Vf-~ojMFHm&nk8r{m|CzNs1R^;O1c?1@g#dxaSW<4KbG# zj~S`gu`2yG{<9t9KMqyz50V~+xziF5>dRpsK(gi2wAe6H$rrob=5xc0 zf7^YSOP|627^wmrAAp&&7%7dn5A#Y$Js^oMoHL%$cnwGkP3})v3xM+r>VP zp3S4+?wnLNlhK?)FADdLh2%#T#AE^>m5fc$!900^7&*mDWMW3ExPCdR8VtP2P6v!_ zpHG~#hdzk%O}o>qwfm!E<=19dYVcq4nzcsY4@pHt(^vaMj=OPYIOOScuq&lvTZ4I> zB>QQ6V58p+(QD^Dx5@A0dpIHMz+!@*u9H;T+t#@kxtoy#hv77_*dFe+6xYk?{7oP| z%GK;2=ghYL;XaEVLIrAD&CBHMHh-*{fKpx{r_0s0#Ai)V^2&>xgpl0LR9jF4%BEkP zt57)02VzkRox5L6nX|>u(GmZqIkXNAie5%=Iq$AErwr8`>u9g^7vB<9K0N!2FTcCT z?Q?{py}(j$x4ygjbnh+<*XYBiLhMd~fWF;s_u}gF*Cb-|#Flk`Z*vnvjU~Uhx`4wv z+lz5MU48c^6knPj^5QEw0Z*g0vcA&xD~S_*0Q42U_9k~DsH+Q6g8j9*Cbv5`s$Z0R zkNN&J&X-!+)+UcawU&*vwx`Ng%G+OR^O>&TsNd!5+(+a5QV0I{`IU~v6lTl(gI z)p38V8IgEA%RIcI!wKx9Idu2q*vxcL11cxotdzZXOLw0TmFb>@41r2*uTqIvqBzao zoj!ru%UpEOc2Z>O5-jW;`R;3X3;Xj%YlJ`4XuSP zYuQHu%&n}z25f?Blca?nfP+=V~s*OSq36F8G*El39nKaj5_Mc zVAvh*u6?}k8%C^s4?5gtEL_(JS{_{b+8;uaCK_(FWW_Zx=od$8rp6S{h(t47k7T3$Z* z3JtEpH3};Ly58Y@?c;6VFks{RaTnSVWW5})rB8jl5G#N?g-rz9u4DBs>Nwr^vm;i+ zcVXjS3_=KXJ7lArLdAFug;U&(BsY1(_@wXHa;<>1zpzC&@$Y51%)j^!hV4k|jAO-= ztzn-pw*gn5bj|?Pbj^+QbH3o*Kq`+ib}^~m}x2jUoqcIS|L{*F_EJE`XY^O4Jm z>0Y{Gp!2ZX<7_)<^=|LIdxtj+@A!U9-OFr)l2_ivufV3C#=NCF>6^0{pC7UKU2G29 zT#hG{X_G#M*2S@Ic_6jMv3UxjyDhv5eQ;M}-Q#WF zFks)sKH+N9uU71K*Z_IWGW_1ko1u|x)F0f7-4OP1cZ-MnzG1+=hdshgdFe-{+t*nM zpftC9^-srXz-}Ap`Q)cv4{hRYi@3Y*8%At=HzRgyG%N9ZSeEXx7;7Ad=Xd;^=PFxc zo67y~uXp|Yc%|>b=pX8F)fzvyTpt|gag5m03$Y)(&9iNb&qBm>BO$elX$%Q5JXURX*jN>cJsC*DU2K<{>@N8D$&QYV)J9quK1jeCVKXP5l{J#aEFUC2*^1P`^M|rPNgS2)I{3 zR8&<|Q3as|(5apHB2<7!j!aXom)}Oyr|T)Ovsqa?eKE|Rd~jcCeuxI$RIgDMew~^6 z9Vi;#3itE}_c|RjMeE8t*we3Q^~+FG2jUl7dBXy?zx);;4Ju7z&mnJ*2LxC&ZeT+< zDPI4a%jJ>>(H*p+9Z(jBFrH+OH+?kvhsxN`|I^omn@C@eO6Jc?p$w9oGYKaleFn8G zh`2rU4;5%a^8=oyr~zsHprTdQnFjvWG4~U!P6x(~iN@73=7$MM$Y_gsTRCOXYQ^g(TK(9;b$a>2LZd!{ZNhqS3OICTK>RZ``vbf2y0Nz+Bgb zvvkm;U!ZUvWfs+&f~W@7bK{7f5>Li3X1JOe5Hi8h#uB}@PbxWcFN=?7?4qp>Ah#xt z!Jr79>8W7=V!ZO+H&B471iaDSgNxoKCy+PR`(`g%S@~Di`vz!mfD!v3y$4Xl_UCry zytfTHl-b&e@}B)URW*4p#`_vS+O*l{T?y}nY$&R!8{a+6ZT<>ZzWdC!Eo`oX?mpuX za2$V--6u}#A*8!;-P2o?BV~$Ls(bJ!djrMpV7iCVF42H=WxA(Q%Yn>pJolUV`-cAG zbve)9fPrKR{u$ur^FN=CIFd!huj1sSxx>l1N^j^lAP79*Cz{x3LgOg*z2b>(Ra9`l$u*e^Aauhtgz{x4`5htgl9ZpUmtri*Y z8xBqJIcR6ZnsS=08@A0=dP2`h3ozp(>KmvWBBqy6IYcBcp>nRWJE)u`y@SeW^ARei z=N(i|&ks;JCVB~#;{d=fp>leDfXcBY{{WQ(+V}%hPRx%`Ii);6<=8f~fy#l(_$5>h zvX@XfSJ@p@&h5$@R1UbtFQIb4(|d%<$@38^C$|TvoZNO$IkyXMusGKno@A#-pP+KC zFL{E>xqi$ED(CdsC#am;l{cuI>p-5Ma!x~jg33AO<_48>oxu~3%4w=^h$~l}I03U< zRp*A_a?-IA)XP;FPmnN&&fbeQP&wCSaDvLYE|(Kj&S_ztpmMI#8l$PG?!#0p?r{-f0xChVeGsCkuL-m#eA0P2bfbpXT{w zx^I9vR~vr<%(-p_C%~N3rf~wyxo$5fz?{?G`?yQLisAolAqYS1d_{|(UV2|J8L+<> z;`QKzXu3AdjM+ESEt9H+6EqsyALwTUO56s}VkMQ6wB-WDwOjyDE|G}ZY?*012nnQH z;dshg&=$ud1H2slEUj3ml9t0kXhOP`bapJzLSd3qXv34o!yLIM!nFynt{E&WX%~pO zSW(F7W>8!wKo$TR)h;E0ZMujZ!ZafgE0Nr-ISFT#J9dh@Y)+?12izO*ao8V0I7|Q+ zSu}`EUG4@Wc9^DM-U;2uo7nk*BJZZBXHLwsjTOP?JrIstU5u<8=BtlapW-LRFP z2S@UloDQwW6O|rKjRL?+IZ3MBF6UZ@z{kvz$FUrN0)mLr<>Xy$6m7=)!00g1LD2FX zge~;B`Y~MHMSvbEp&%MDOJ%qLc9Gt&<_4{(HUn*K4mKRujmd6F`M&*lpr6@Re&TR| zA~b1^Z7ou|K48o#M82&GD}l3<*+Ov&l1lnZ=NMC9_XUJ%D8F)a^co@OA5+hD%`6Uh z`oKn#lm>~sk7i#2jF{~X+|N{Gp(^&Pts|{$8)=k!hS}gpC#Eh`5M~P;Y=$dI37%() z{~s2b%TyAVkF~jk01N{K2e!NL;~}>sX!3bZFEf^{YJV4|GK}#uWi>DmfKfC| z7)J5(R7ikCTca4RXmj_(K5hHlJb_qrmO{W1IGhGB88%~dO4?<>Y7aA`Pd0o_hZafo zRvb`lM3+xrcRYbKE_u%n$$3RZa^VOdw1o$?jhkB9JOkWOKiJQOaNl;Gk#`)YC0X8LjF-(tn+kiN+e^x&Hb^d zqB8f&uji(MEMh-6otx6!I&vEK=ce{I$D5zdO_8o^Pv@o}<(pdsOUm`!GV<)hCQ>wTOdddaTD2c=G4w|r(Vp+QtCB^0=A>Kn{5)-3XnTG)=MUyQmlF)yoi*Q6 z9eq3Qwl6j3X87tKqo()em=V`KYpqeSXaRz%!o>PhgjdsGA8+z~$Y*8yht*wK#}@V> zP8`=KKZDNVKP&5ybat;-?!qgd(XI`qm03VkwxnS{%lo%@mBZyvTRb>b3N+IihMd&5 z4;q?9F|zOs+7j!;sF?zO7|M*fZ&@fSZ2be2zM-lwMRO6Feh*&1nP3NIBd~Tc5P`bw zMJXiP^s9_JM47e|+q?-vTGm=MtUyL>Usu^eQet|bEn`2OrlrBG>j2e=@)NsM?+cK; zF0@c5!ohBk6j(Hol-E5w`iRrRMWS?1FbyKtW zIfArrQC$iUA06Rq^=PR9o@Nm+t0Z?3ppm{&0ylM`dD(!L-db0((snzD%D|&G<5jk@ z%T^l6-zLz3)RiI}ENNV@oAXYhKFiWgGRu@$Co!KnONu#%QzTnxTPFRDf!Q^$8hiuJvp$DBdei|jAfz6lb9ow5LDa3>9*kK zT$nR1$yDie3`rRMLtaX=A*04FnO3Z1=L^|YLT-vuvfCs5HB^bi$z7VcfU$25OHoyu zxyEq`%m6eDWLSs{TpmiW7O-{7%#I%k4tK0#K62 ztFxN9Q*`Qu(4knqUgy&_Z}V`St;==buhV7LF{Ioo60rEkuN&t6hbG$I)Ud<8+TzTr zO0`)EZfMLtlhh?^3sQgA;XnxG!^9*e8|@e4SXJyufQh!Uglrm3Xr|Ww0O&t_m$88d zOCcm1FWb90VQp>iFJ9vf<2%1;@!|p}qm&Z)>3Q zbtG!K4lIS;KCq)6ihbyRD;vo#ySMxNxYqb57}uAkKtOR@ZQTgXjp=Id#1KRql(a@a z#A68CTt{AaTJ7W2=gAa2NPgM9+aDD|yl!7Nw$y1L%(K9l;ztk8(rCTIfw7^Xps0m5 zS8mV722>B~CQ40LV)s6ZGpPfo4>NqEP+eH8bkmx%1GPM)D3Cq)sVe7k++d1AtO<@8 zKz%2;sX?&MQ0D}(!t%E*g9pg5Qftlva((&4(J{?a3KnczET?zh>=&0M6oqmSsJQS@1zM3O9GJ}NMu$`8wf?}a$G{cjr zyrL!wJRI9~##VOu+?Cho@RUw}uLZ4CC3G1`+0um7i$P@x!^v~1iVy}wFcmVF&1df| z&HTiXGNoMRr<$qLn|38dJ|m>1r3=}Yx)_sB3Jk%BaLD_|U;n{9!fz!@%BEnSZ|(S; z@6+qc(-gT2DyA#r+E?*RjNH<__&Ia3q-&{=DvdL!lZ={=c4GQM+KX%H3$aVf^``SGd-436)ZdiHAGa*WH_iR$lev3N^Z@x^h<*JSm#F&V zJMlAX!QYGGNt!3>O~{q=e1of)ny@}~_(G+FZABd9;TfQo{%XBai*yx=_MT$eLW9-q zT5}K0)8x$Kbk~#c{04_Oo!>Un&EG@5`!3e=af8zsAkLNIzq@Pe$7v>{OGrWP5|()k zVo!P9K%gWY+X7cb!u@%M9jk)Isy;5rhHz;p zCMhc9qZYX>VT1PqAw@m?IG&w_R1sndoW~MoH6xgC2nqa77*CV15u5YK2_MB{yjBv< z;8u9~{I%vPdMbM>yuZOv@hQieI%1A0CLQ2SFkTwi^{!Xp#l6}kaP2)YaF!k)27t^8GB(^V!a`;4?Ops`|&>+?t+RfFAGEz+^`v{G>5d7TbJj z2(G$Sg#6o5I_n|TCtCTJv&teZ1Xd^AmW-OM(=xcqF6R|p1UKR3Y&6c-Ud_wtt|#I74Q^)Z^tLwxcl)fHEj$lEf>du( zx^TL1u$t05jVKlPK6&S{PaXlCCrKQ+7JA)HCj~h^b9YmZ*j$b~Es?CXrFu)9Bpm&v z>LG4nEY(|Tn!Ge~+$r?E@HY52@ok}S@Lz^m)$@|#vyLmzvqwHQoA-5Is&aeli$#4B zo(;fR96yRz<}9P$Iu(7vMtFJc+S_N{?AlIvKLj^>c^cT8Wj#&8*$ST~>}Ih~Gkde` zCoMSd12>JiZ5fARopzR+2Hx#LH)TETSXZUK+uk2tf!7M7zr2nAHx)*Ix_t2O5O`hx z@9ht#|Nf^R0{8=hrFYK>o5Cl;Rpw_RyvFf;s@FHiIB>qWjt*hHGS#3Y+fnpGoh*@qa|3X5GQz!x7> z>Io^e3%#=CnS=hT3Q@&xe(&@bv)#Q_e^{zB`Zz2l*bU@X31<8hcQB9wHFWX9s?BTV zuoI2UaDh=8FzH3mMs1%#ZcBvgH6$;H9MJ&_qR8evb6_80;Simjo$jzaRp4kNQ8U~jUL^~JtxwP0Nu`Dhu}Vf|j^n>C9-cZz9oIxwVtcq$@L>aFykWCroy&@ zl0hI852E9%bb#lQM&Arej9;rc_SGCwM5&-PSHSk(9J}qNve^B*?v4F3B(Wa~5^~rU zBwWR(Dgz?%hk^vNhr5D=G#(2Q*hJP%Z!d5Y-W4RAuDul`tef5yB%Ggrm995^QIL?s zV?o08J6{$g;6!c;60YKNK?0=K4+RPIM{Eib%+-G^NEl&LkZ={=7bM)SJ=GrE?s^u+ zZ9&5AZBGRWx9>U?B%H_KRFH7K_F9l&!pDLHHT^#pBw&Fb3KHzY9|{sm+!iFze)~|6 zP|~I#f#TdvL4tPXmjwy*NjwxJl)NoSAc35tCgFC(UwvlcT{%EK&*H6gpoU#VLtbZ$ zXW7`+BjB4n)FZIrJ=7yyh4=LcOMG9C(8H!4p_gqv0-fLw^$5Le>JfU`)+2y^{7{e3 z>tj8F$#(S!U`0LDBb2J6?s`{`P}9l8+zJv%`R9=PT}46_ip>2&xC!rT5>D6NiW15c z4&=P6J|OzM-QXq;Dj&#qMG3iYiV||)7A2gnz11Jw?s^uU-r!V}aC_TRQNr!JPE`r# zF}Rf_oG-oBCENz~RG4s{gllEOZMsgC3Ac$ook^dS;B{s!TX9#8YL$ZPA{p1#ZjxzJy>`nQ*llr<>l)%jpHq zrs(vtH?wv6teb&53-h)z;bu5b1A8;Er%5=Q+X#a`*uc zP!C-dkSVP=wyw5n+^%>mCzuGae4z^7a%rNOV}aNv;aeiieW@%6T9fWwH-|RmK z;24)~(M_eAXD&=pwW)PZX)2)Jj7u-hp??tFqif$?o{V+jOZrHEZRn@$Z{aG zsaY)@x@Y6?!jZadnlZ+lgq^_z(^X*aE9c}F2$ zI*JZZe0VBVh?m-?>i(hMV+NT10N}aFyXm7W5(zNIz=>kI&<4l>8b!J&oi zP(cWo%1_OejD5th$VdUf_e6K$BED$m0 zUinW`&KfL5|&Z>eF1@de^XH`udZ2?stf6l6cKeWE!oK;1$!Gei$Be0+lh3Ft;3TKyv+1=(eDjog{!L76HpKPe18M(oZ9Ju1`R+D&zf;Eb zCVWV^{;^r)AEHFl9Jcoo%`Z;B(>`aLeY;D)f8vzY>pRj>_ma;QGVwT5uI*l`y*G=O z>2`zjrH^<0ZVp*X|4f6SIe!tFE%QX;Y7ktaH7q)N1{gi7%1|fx0Qvm#`19{)ROS~e z(fZbTuNgP#kE}%XlZ7C7SIybv%%xWm;=|&aFBYQoB}j{oqPT0xhse4g@B00WR{s2w zOY^P-%_}|#m2S0aZ!chbyyf>ZR`m@(Yqs@Fv~CZ*9t?|@{U>bI`eUjfjn-(r{c z0#@+Kz7hZ4a_9$Jyi3)u$Q_lAn zY6gQKlWrq*y5n{JPItWi*o|49=TGe8V~o=q39c8`37@DGIDvM_$9lnP^TE6ho64rW z^e%QWjpTBE^C+4U)142Z#Y_%eWx+kj)Tb8*A-EJ0lQ$J5Eoz1tVvE}cZWikIV}d@L z(`hfE?-^*dX0&StTeycAvYRFl@hND|8DjB4?({co&^j+$RL>3e=N2Q>2D<^XwS>?v za2z)PhJ_wA^a)~RBLUQ;yf;S8NLL2XBwgs?PEQdlO693bI3pgu^t03Yz`^|A|Msu{ z^Z!KX`;UM7KmPWQ|NJk1{crznHnjic&2xSZJl_f;?H-%k^K$6E^jAj&wS;sS7j*}% zLg$-vb~f^diH`NQNt|!`-Kct>pC7F&j!J2#EwL<{GH)YTlUt9h`tO_Y7}k0B^Xomo zo533K8!-1{Pa$pJg!@()Zw;CAl?ItNMu=AOJ>2iR8K+P7->%PJ0fkx3+mQ6@INf~ua`^O$l^=in{S3+{O}#Ikb}SyX_T7Xx zUu9Wp3r0P9s`>81>#x6`Vfmz`E-)RYxneWzYAc2dhZCFPozPcH$t$v3zYZTQ;tcIx zxNiBzq59|Xk0GQ#bg260orPlsrE-_&_tlc_bN`;tKIIqgu6wxO_oGtt^ZQx8`SoRc zdXgW{Nz6H@w;W5DccInpzTeA;wNEyTE={;oEDeDzp0mRE0FXdbJ}RHQ)knSh{?w|y z)+V~%`XNv7mFg1Huc}M**$@m!zhQV>g>0#4`E^3f`PY=Rg-d!9-eixr+{HBJ0{&LG z&u+2Gi+Tu>z@=G$mBbTN9SRJ2UfH}~fZe!yQRV81yCuG7aHfy_YE;h`Xj2x5gz!W}9})p-KK3$G3w|TO$BKTfnTfG^nf>4FY9Zg*9g$YwoCXpvJXOmDow(6kv#e2G6w;$ns$Kxw8Fm>wGUgR` zUU&Ke9ITg~{dFxwN#H(D(}PIOF2%bsm{RIP@t~i>v2@9a6k$+9TiHet`t?Yjn6k_1 zGUbQU>;?%Zz@%9&bhY>oDe@kW{PAYfBFVu@ZkhgNN@X}}D2Vb}w&j=-K&)$rA0c)7 z+r$IFT^vnAX3M8Rq-Dznj3DPk_60=k?jWVZf@>C2@q!>U2sE3zo|g*n%Y)>HT@|kZ z5B~igad7?dv1HG7nEtY44?r$im10xH#7n_r*A_bS5+_-EHAxqVx_L(QR`t3R4&mfr zORZJn&Y)N}aXebZsj5QcOeMcEl);7h_>O-~Q#MV>A z9Z-8XIQS|V{4O2{}icIzYZjpp$7=jPD8Fj`$?JlZE|>UO@-XpbrvB+ zTtB|eH|9ZykSEQEI&Fu@?WRC{GYCNWPS+r6gdNszX$CFYugMbtAf`u~Ka}jzBrg4% zDSEGhc1FnSBnjmgJmDAg602XBlMT9LZl%OG-{5J(z!6qsr)ZUnw7EQi($*}th$3w_ zV`u&uia%tkY@48+!e5-0Gbkn{Z7sE;&$herKFDS+J`_V|1^2)1EIfK63WV}-$RL{` zX*CS0CuVY4_30Y&-`0qy5NHxC>;^?6-r->rnlaH}V9ad9*Jq;>>3DR+{UI0JM4ZA) zs=p$j0QS1}`O(Sl)@R#-zUn9*Q0?8co|YLK=>9}!cbzPk`mi+WZD~By8DT-@N%$;} zxAl;Y+d(1&f39!4=O;h2X|_30@#{;PP$dVnXk5QWW-V&-J%6|?7=Lc3F_Lh=>g8ie zWGop37wJ6eE)Ajh?BaV?7Y24=&7-$HVLl-*Om|Z*yvRP`OmvMYAlUJ$?0!p)hWd`% zJj|LaNA};-deAFH(>T&L96SqB8*?~l0tIl=)*nqa<#_*GZg$nABiUk;)YkGWF0|Og z?3#qO$Lja>c!Aqu)3l5lv;`c?Qbn`VjCDV)-|e>YO}FLGSA6ew-f!{c&i`xxN2@L zPMz3oC`XL45U$(_`yo94o-=q0{pS6%PSVqh-EMIDi0h-ypZholuX4M+t`Coz5J0*5 zc9dWR7^_={%CC)bUWOhq%KM_gkc3r)2$MjUT2QC^H8-KFB$AAl?P5`7mLhS3p@#N6 zNLD2?FL)?>6CqFnc=~oFP!G1EqGfw#M%3;x2WqQJu1rFROvox}*nvmEMQioOs0Rva>bfLPHt2y?5M|;h*5H!3h z%AO5n`8=>PS`Jz7L^Ws2?UnJ{OTSR*whH$-e$0RRw}1V&zg;!x4P0OLxBv0izx~@+ z*w{fBWY6>> zU;pj@IsX1-(Ght@K~yJ#s+@F^I=k9+mx2)>=pd0Y5UP3*SM8bYSMEBWFgfvCGI>H? zZTtWDwblhMggSE!2GH1Kv~2iblpqBmFsf{RDQkNt1v4f`nnwUdNT&YnsY5y&irPf# z$3_c3T+CgExR?m&!$C|lWOD@{;(B|i+DaKtKt1aQEgO>~sH!ftc%LUBfRN($A( z5A7hS3jrsVT4@U3$S(UUX;TiA>~qHyi-&;}+sv^((ZW+l2Pc(bqvhi<6h)D#pGjr- zU^xzjCOhHfwQHMzB#OU4gGLk)a z#iKqkD~){MfX%j42}lG5c$o9T*&pw0-`}SLanUoLvOb#=IL~1*n@P~6&)_aVOKa*d zMBL*m2Ncq7n!6QVUc1)p!$`6DyqlAg9e}UGcI%pFfmhUeG_#j&T%3^`^F!UG`U+cGXa?E5HVVnGjZn_01OKCh8xjkdtGJT-BbzUij)NG)WdfMfK4W61f(Q@$eJFJ6bMkrG6S&z z2$5Uo7U*8%xGRJd*R~ow5d@e6r&@6tTy;C(r%(I)W!Y>GAvX_yCaG|J`Lqe=_jBs- zx%rbugREBPCb72<2SkmTh@I@Rm2#|@EreMb&VsWEDfVxF#h5MX8^6B%n;zEEv~^~oQl)BOPBH3; zZlu??mtD5f1Vf3(kf6O~Hd&CQs+#|K_N2O=?ijg&A5y@$@Zu@hZ( z!e`sp>T)g2b(sPI0#>VYVC>k#qfdwHLG7keYP^r4PaGB&pgsl*9dVd;!pm#dLg3nu z53=D0ex`s7m9@+8TA{A9?FzO~ShFz&_(LgY(9SazNza|=vcIl#z~-B}4z3AZI|ip6 z=Cs;gz5@SZTh6lX=5|!US6LLKdF=4J1o<@^;pMe!O>c`MDzkVTzf332X1Uiwvq!mW z26m6RR#Fjo`kE?n!0rhuC~ybdY(siwPyaHex<4ex{hR7BaBk|iFMazu87Jxl%5ntF zC6w=?G)-||5gYuP%r}<5Pl1F2eXHP#W0JLArq55%>gh4EF)qTTgu}fZSC)u94e6V2d z5+y`V!nxcB+f(fwu7e=-U#EehpsTJb(BnEGQkB%tH&mV>rhNZw5@{AAwRV2d7y%*% zWbgDzEF_A!^4;enjWuZ@U582|HJhG)9aZ&C^?1#5tSJ~^WR7Ed_UQsx50mnvH$c}`=s`p(;}fX3c9~~y~&Gs#dJFNK=*j^XgN4&6GVH_v!G_T!%%yo zl+xUUveHuOK9iiDxayigiF*znJ#KIRbtYqe!^!BwrlZf_c{03VP&%Kr=rp#huhNSw zNd}tEoC%2qtS3LtX2NvEyT1a(5mghBg+J$oQ=40V(KP)1pZ@Ou??3+I@7wuEFCt;e zBF(AmAB1-}#?-#MlSWR(1sP#pFuZyeD*)6wfN2rd;qdgE?YsduO2j9Ll7L2T4)h>s z85_>f69Ae;SH)dsAs6$7g5wuy;=O?9{lt~5nw6tjcAONv8zPgTFhNpoNZJte3 zO_ad(ZjMsIce2Rc?`Y9OP*%;}dgwY4=T&`j6#yKa&VkBS$m}Sti`_q2P_uO>y6l9B z@)iXX+-_1tkx8Rbb)u_U4vJ+6|B`ZvjA0nVTp3)(px_psn4E0D`SnnWiPPrM(+WI? zjqq^y&dDFC^c#u?r+G$w)Q#k_ktM)f)#*)a&@-JJ3`6&2jWYY498 zlYo4)5`gN*OH?Ll6Jpl6&caz8CYctE6qKCh;JJe^O<`nEj0e)AMd4LS`7M*wC_yjm*F5V_6Mb6m@|IlM)Zb z4TnXm!pr7XA-XIU)%PZ0J=W;PZJL3qD{QpLrgmTdw%Nk@8L6x)u9~DciiTt(yu5O) zs`>ILf+x=)$h(iZWQ z8kDjxLRO3bnCVM)J{-yrR)+rVPVPK%AbgU~Fe~FWihp zrfr0>(~qf%ZABJSFc!)n zRb<08(7e-8+(^a(Hje$8+W*5ckJy(|w_Mhsj>RyKXEvsGJ@h{hP7t<>VkdmJId?Ya zMU`{_+?t&rvsETPLE8wQkxdmP;XF*Hi!5JVYnV!Sl_(JUB)1`xDp_*B%h@5svfYVX z;76OEx}1~Nm0hA9%=VagxF;!5+iF%!$2k^5nx_P|FkViHa(EKSi{$tbZ0<4=q{2e1 zs{8K={$2ZwC}fDFN*1N)EF}DBft~tkXyK`To&5yVfG5ghD;_9-(?tt*Bf9K_9WR6o zdnWg6Au)yiq0FkMa>$+34j?>E74>A2pq;1|D)1?OiS~Z(HeV@Ty|HHE7y52klVC4iLQhbF`2@{(s}i`ZT>?!z)VVO3^!V# z>yX3T0xYPCUklJJ0`#(}GuNS~wU*6UmjgREE7ZopQqOt%7E_YS=gCO;JvlO>%|h=E z+E-crW>Sr-y=Zn!(nv`(uo%yr;HWezQvH&Zp~pmZO?`^)^zQV0Bl=Md$Rl>FkhMjU zV2VZ!?_ZzU2Z&;a{%jZ2sNE%Zk*Y8kF_5LOX?elt25ASm?e^3-Nw3q)_Ww@Pi|Kmz zFvy$;ssI+$tutTP=JD3+HxGD?&h7Z^9{l(EkUezp_4a$NJZ=;MsC_=ciFe!Id!&6)Te$5XlEEDFJLC`LhEsKr)5I14=5w%itU( zP}~PK2;<~Z-&3B%Br=Z(+q_D7Xj4@6+Q@WIf=Tc`dKoJxkvWi_*?!zSC6OqoAJLED z@JNS;lSTG+TzBpjV&=4!UA9v5XQTNB)n!yzG)g0iCm?Wl&8o{Yooe6n_%>6hZ9)H3 z&5%4;bLbnv#njo{T%Im03jW>}uITL4UV_Ymy*ErEL08f(IGTk}JK1F`ozw_`g}BOp zf^FdRH0GhxX3ASQ8t2!-{M13bSyECS^+|;Z(~kv_*%&j~&ZnV@n${f{9}+Ky;E>sxZNKeB5t|RLxoZ|Spt;#=QA~49 zC&K#dOs$4XVJ#n9z2C{+UGY1c@*@1V-On7bd?ZZFv5a2x`yj0fpe<=4yXRavzX*Z7c|(**#3LPm zA8sN%gzA|CuO)8YYEE_1a?D0Bw_BALGEt(J7QE&?eMii1vIf zj8W8;jMlU+r`Bp$3bJb?)-ob#-)PM@_q=46l>nmYPIlQ!vnm!!^~m4cY+KbC`xa#< zCJo}ipj?o)Rl*5rn8nKs?i4?c%#oRdmV^M%9Qsx)fwT}_sLf1Cq5R;KJ_MUpHSy)_ zA-}oWW-}}B0YfKr*u0q)6^N=x5aW|GsyP!EvgF%JShQlpQ>jAolM#A1%~qk`raZQV zdB`4Y))jqibbcp$wPucP1+j?p;1psmXJ;|^JWl@v=T4iW|+O%$}amWN%Xh8Uec_Uxg)kCn1>}McW#`jHOz6D!uX%cTq%H>P1}R)fj_;EB%y7|-nO7qVcUuHcmn?BMP!r0#|BCealGxqOK4taeMNYA z(N7^h?`@&bl(1#F4LXk^@2i_~3b(x2Qp&2Q zEFV_@HG~|-P!ma0IqSc-{fA?Zo$&I?wZys6E9s%t_G#f&qE|TcBMXLgrp1B(NM5!I zXDe|%3?dzEE4r<#@8?^jmFPWbM--x;2l zr2w=*=8;yWEl?b^YC0dpG;I-zrB#Dc{ZNO5U(+Fo#Z@&eoC|92O<|4|Jv*zcL0R3( z%Kn*a#~F%6b(AbGBQt4H(^0PdIfx7hCoVMcM+2Twsz=w9npa4v&2<=N#j1zMuDfocs$X24cHRmcLj8*ybHOg()BsECYtxrWv4lpeK$L&{ThFtih1 zUb&Xzwyy3j8BYsShkBcyQGBPW(+r3(dDDh8N6^mXn`g#|+Dpj68wdg)TU z2t7L{&{|C;bWNc!MbtIM60^0km0k8%k|gN0uC#-#wBqoGEqG_hBq7ul=p&}@ZxtAc z*@bd>^Y-Qu{+C&^z!%{ziOWV(1ES{>n@pYM56=A>rqew8Mk>fHUyG`&uc8lfwWN7& zcr^-*eZ@=JvBF)ZlYBuHF%ov(HiVE}uf4TgTc-u1dVxgl(<|{ORV?+DWw8^!Tb(-4_%YqdIN_c(Og&JENHl}A4^ zZIixO+wCmg@Dir+vA{UL_L|(>zz`-5dRgQ}%+Xhd(e|<^nFXA4h3YN4(HQi^ih$KuK=j*N%n|e`dQdXBi ztW*rG%nU%Qnnl3NLX;N7NoIPL5t(D!Mp=a;r2s+pEJkim*n+<}0tN{qlf#i}YQYaa z;0tSc*=f$f%whHh7fupqv8}GS=otggTxrOWYc*vM3+#L?J z;Ot8qail8T_KBnY&s^oAE?qXFb%bnIW~%a^dRbcn+2h5OI{=ER6;%mqf~Jy!`X_by zg^^bMC-i%9-N5$UxWdKK7mZVE*#mY8-ALW?R%6t%ialFwsjrscXl`9u9xBO2wO7^L z)-hHNaC$|tNqPM{sHok+Kj@&DVS2G^5=w^mT#!eF6c58++m9m1{#JCnK+yG64%9g#Q5CUG$#wV$RrlzQt;uL@3^IYnPgt%Ofuc zkP;~75Ybn0NGG~mZ5;ghoc#2@Fal=AsZe`c^z%+m6?hjD3d~%M34qP!;R+Zjf>6o} z@XS1=fRqhPZ;ozi=!p9LfdT?RbcxDt@vOcYg$E%f?!$gv?1Vp?i*E+!?^}cO5?vhX zdBJ>n{<_JB+oxd}Ocs(z-|#cHbQ1_7)LPcP@*eu zS3qS{<)jMQ>rQxi?b`XVc-E3cT?&Z6du?T%>H`~_58}9xO1ef7bTuUkh=-RmQJi3^ zDZAEz74mq}+)wqxgE$}Pz+cDLJ%CorY2sYjyOBe7xuy{+x_Ol7H&w>2weZ zRF`*c-b_dy&V0`4LaXFn%d{QS7sxB##^!-&fzZx+g1ai*c_{@u*lB=iaA-1ogW4{ISJ+#4sYqFJ8Kp9)CH@omi`#lE#{cXM?)LPn5z(Qn7XUi9}5_dcQ$uL zxDz|+<<+ZISrXhxn&qy73&tm)`*c-=)kG*MxUCq%a=|+M*$#V9?CX|mo^uv(^iFzt^=j==EB^{AYiRzsZfbNO3RwVA z*U{GuLFJ_8-kHnhcd$*YEL`E1aHIw5Flurj5Kfy~UGG4lXwM5M!Io*xKExr(=`>-W zauea8B&RMQK5Bejv)m$9_wYz^*Cm}(rD|Pmyy|F)q>+p|(;hXlF<{?LEr3 zY!`Jz5!^B^UOw1pnzPI?NS-T*GLs`pi=FiH`qco9tj%%4|8a;hapqtUYDp*$h1yF~@Rw=xLVeGZ03U!0F>N(BP5*ysXrZL_!>2BIafesb z*M6~A-0feWve#SgRkn=0Ro4CnW&Q7e``7>ZfBM@${`0^5p1?Tu-g!Y=K#;6*jOl&U7R)rmT+*D!y0?ajYh zd+Tr3ULk0N(B8H8b?rUR)prZO8i3>_`plJ*)ajhm0Z&J5nuv3!NSzbi=|z!hzlv~L zlfL6{nxvkClgx2slDlm;q$85>L6z@SIj&<71Fce3XD)o-AgBO{bmH``P~~4$WVuLx z%E~Sd0W<4rHR!eGDZ`Ma-x-Wx%3!_SAT}lTGWhYeddcOiLzzsvbqCqd>o63sQ+il* zYjc$Q>!{`{Nw0LhA#ap|a~7SRt!jYQj#u&*)e&_q%0OSgi4P^Ie*gUfmF>mJW{$y9 zF#t$A=W$h*u@ryOZ4xN0fK2f`VFCiJ_cQyb0$&C7vwuqn){$-0=BU3j>?h|LQMJCL zB*Ag`<%y|P8)%~A%oalv`*E0QEXaDwKc^Fq<=B+~r<6OGa+~z=p6B8J+h70b-#>Y@ zI3W$?MA2fssH!#FK*LmKX+~4O!A^SHEZM0NiMyC?AIH8XVHoo!HKB0$LotW)Dz)EJ z2@VYY36kso{OiB`*Z=e1mG_BI2iy#zrpRs&K-wJ(2fD)Np)238PK>P8unGH#NUXj< znSpCDp_mSLw)<1L>5Zznc}i`h2lJFu zZx80F2HQE)gF3NMa>_V1<|z&^9=7U~zoB`G&@IjWZl1oLLKV9ALmcr<1`2led_uUD zfdaD{N{p{%pz0rNpne8*`qi%Mc$4e;>FN1Z$CRJiHol?{+s0h6P8*I;-)Q+zX$?*+ zK<#p3>%oL%9-7nq0+<@TD;e;lV%Exi*cbQw3go6^{=l=KI2N?_w8Fy*8o87BQRF-p zSAa#_{a|zGvxo$zQ1HSr=v$L&LcdI^tQJrv0bux0oP~$dDI05&YQ4Wms!`~Ws4Xv) z8yV14;~-z+IjQw(|z*o6Msz#?t1%u3Jx@?WI;jO z>EX=Z$X2%=Ic)AfA-(Qz$QZvtxpnkW-j#c&-1S|#zdz;903r6YEO)Yq=3TjW%01te z`}biKdp`k%Q%>7}Y~H2t{(5Y;Nj>ay#( z%=E77kGdY?yRLu#x}HCVBKi-R_15Nm*Y%CA=XYKIQzPO0(<=u;F?_@FzK><}l;$j7 zx6ThZ*#QMKaAzO8h1c~ghl9YCKbZQM0c_cauGBo5U8n& zQ-djnKs;(PQYfr3;CO8>Z`T{nt?cs3m4ZIR4io^sG7Z`dEX)ixIX$Hnav8UK0SGcW z5kI!v4!CMp1n9UTFanRF%l0|}bSE^eWOycoD*h<@Mey65Ir;!bZ%O_w&E6&pwa1oG zhxS{;Xp2K{XnNFv7`44&Ry;0~fIi0C(6XJAO!ILW6ciZg)7?g+0w(F9d4$4|GC1BL zvm(!H_i;ggk&XM0&-`y=@Z!VCICb9xeny%^)57xr93w~e3>LA9zCkv#O{VCx;Crh= zC+|f~^93Hz;i&gO&)IvJ4C?br8z?hCNRSc@BZol`8`I}LRbAn zGqo_JFvhmn<3@7X$hx?7vResoM=+jd)tg&!0I@N<0BZ?PwyMHDbSyE@y-AkX7F|s{ z(PbxuH#=tzCaTJo%{&*N$VG<7))c4wCrsEB1E6z;^~k1UfeXsgY|xYG%A@46kwHaO z<(s&E4`^e;tTG^#Qnk4leQb7hSrIpF7M))dFBTO!!M41e=(4>I7;&M<0FlPn&SWDR z8SWy~0zr3A+nE-ZBkV`eJJ5&_yMU1?Tc4#lR$v;!I<8=EL`MY#7DIbF0NevW2#_IC z2WuG%6-{$tG=vLSi=-x@83OV><8XUt+jksK!k7_Bw`jV+A=`*9J0TnuqmHGz5$0y# zhT~ZKGO8Y(cg|LB_3dj4y{L*;j*Y5!*em+ni7wmgFl9wA0z`1PF)zYt#)SnyxX8sZ ze*+SNqJgWu_hBKhjr0Jd8hWJ;*7`qxMGjwga!EsWIlIf8i(0>NKTLNx(NF1Zz_twE*~q@AXo6jlHj{LV37 zMYq?8`U99u8`))lWo9R@vNVnMisshPhFG;9AazGKho+}yk;WQ>R!5e{P_u~ZEM6!n z3c~qOc6sGW*y{3fvjE@D@;5A03U04T3)eVHc-S%&rfGCTakyDC*>I?&A|`7myX>!Y z1n%tqK?KRjIa4}Cu|+H{PWS=CMTxwm?Nl>q&;-C~&Te+EcRKRZ%Wd~ZMQFMC9yxxm zeS1XfBl~|y!&8&Y@Ui^)vuv(_%(q$tpQ}L%-imF1Kk0SXu#}VXCzNW1^qN} zj}!bwj`(Ll0aJW|u?lQx5?&r4y>Mo-w>%0l5=Dr81B7GSo@s!CqT&Oz1Q7rD){;C1 z1lA7(DwEWb(In9dWq#ISY54%hj!nG-AX}VR0(TcBau9gy$5JyuZgf%Os69o@cf-dA z@h>%zEDCLZqHGg?BP7M$!JM<|cN=(FCQ88I>oshq6xH}Erh~BwX&X(aN zwMt52a?cttf&};E9;MHiQ4xDV7cPXcXSl=*0nz}nGb|<~^YtU^7nDkvF%jX8U{)rf zGt^2AGtN#iae92IK8ubB?;ONo(@S9d?D=LfhgLoy#9hwkAi$C=_OYPzNXZB`9sr+E zlWkJT>*|YSN$-+$+=a(9Y0e$ta9v9p*m7Ii!O1#I92kud zRad^T4Nbe?WWj^O+?mW2LH5;V+cuBkKL!LIz9mSSWF4ZJ`3?pwSuQ!|>;}_1pofxx3nV>DM+GaCyx7TkX<6lx6(*=9Z@!RdjK7tV8<2d7W56~2Py9Yaym0Nqo{ttaT!%K;FItgHf2bhT3@b2 z9^Ek&%#{Oqq~7PjVSRRt(v4 zk`y(sS1Gn0_p;0WO40#3qjOwk(us}_Uw!`Vh4RAvU|kZ2Fj}Ru-^)JO4--PDp_*e* zD~>OkyEclS=YbMTn5#*iGYJ{loU!J+29OBaT_Edoh3R$rqZ6pDeDoCbqv_f+)KF#m zPb>U!PY@~9ymSay5Z7c=9h^_B7s0?*w;x156$(B))lf9sq8Ky%^_j`!JS@)6e*k*# zu+b2Pmr-Qpn{8w^+V9-W8zY0Wk1 zC%##+plwZKa(td`i)eCtNH=1P8(f zMOBpAIgmCdx{Eke;Xf3d=Jnuc79D63>YFuYV+Z&@X7*X#&h-CD`LtBaFdk@$E zmrFK0<6z%8A=B~T4=x@O_YK8c@nD>3C%Wu}VlWZUuZiM>1HfJ~XPs(w=p2&*PV%NX z!TZz69hm#~Bp=^jB&brEn{f!y-D@2lQqWo$coC83PIf=7RF{)Mf5#9BLZ0{qHZyo+k;L8$x|&KgM&BQ+ThGiKShlN#s=L`G#5x`qDd^ta<+m+ zu*G$xd(>_oHM*hG2(cnfxr-LcbH++>rF?cXIOd6F(d&}?Ar{Z_@Un=UIk4qTNV`D= zVD6vi(`p(1%$K6ePDq~F6Ri|P;O(oXq6O*-z|7B4bv;=_Q{AMQ|6*U7m3!7;;&el_ znNelcv@qn^i;19}3tB$d2m%LKqhqPQe9Yyf4(U;J*$FfCEFxVJxp{O^wpmDuygRmm zr`lU4RSuB1BcxTSQx^p&bygFzKxqnfvl6usW%mnA6^#>pHk4qu<78jtqmAQ92-VZ*xa{5ljt6!D56wKzCv3u#5< ziHvE6^6*JK?kYjyfG-!F>{IAqUSO8#7PYzA3^Scf2PZxmB0jSZWe6(~jhac`1q|#{ zr#X0;W{euOFjOEf13wA9Y^Zuv{uKSJ(kPr8bCZgc#T+1u#J8%wk^NM0w=Is~bjG$1 z2r?^KoNb;U1;Aa&4Tx!CZQ9<*lCz1uN8FDFHpg#=1m_WVeP=ZOx)C=?<@Vx;%Y2S8 zwViM{&yrZ+!7rtFMCRVL=2184OO^bLDSmpw?o#`~*q$g$0y5alRPj>etTGgKIgbDYj@X6jLaT7_-j~{c?sKc zi*M444Q~)D&gD#{l${!CsA_4r2W$ITOM0~Vb<3-5v4}eUQFhs1$;sc$hs^#!?Guh| z!sz40_Uu(syszhJIm)RjFXd?6wm^3@&5xdb$2rBmtHUB^f7Umu&IxWfm`_w!Qf!#3 zer)qT_p;0W$^iiV3@hSK@Uwa)@faROr{)!;`iL@c${Xp;&RHC>Z&1*~HlImOb071M zIny-f%KQ^Q-7~#N=0MLCnUj+sa4(!oDzPwmq-5sjC(lXPN2>rFsaKQOnAw0+8`d~Y z6~Z;qx$Wc06}PI>hw!|1Kkg#A5&g3p+)Hdw0C=Ov-p+Qecatox%^pyO%#c z3aJOAW~h5zMpMle;nwsO9MmKrgTnS`K9CPLZHfNQHZm1JWc0Hn$0InEQ{F zU8g)|a8%N%&mzt;B#_(oR8 zMt0d>nJGllX=7K@oOwS~l?6{XV0wB_{%p+4D0Q8EPb?{kj~;Yz-YK=vvnj*soPiOr zwCpCOG*L5GnGajv=1O@_Op}?REUj{kjgy|mw2A>VpGa>`Bw(?%^F=7HRIUmWh+^1m+OqyHrL+{7 z?@;_0vrQr|C5DqGn(!M^JN-J7OFqK+9O%_*C}vc_TBXsX`MyOJwFmSW63n%EbS0-~ zy2+%4*&R~O!!v!RSj$r|uLqBUK)M8Hcjzj*qnw5!Q;Q<2WHpAqB6!>1s_#&CpX%{@ zpfE>oP7+2xfh>7nUm#ff8zU%08HT7V{j1B0#u1Aad( zwoNO-w}o7NE}9n(a4>JCs;X|h@lk%IEuhudLjy?n!{9;pm+Hwoy)wnacXMl~)!oQ0 zuU=`ZttEfeY>{!+ra{$$f_lQD?1eS-K-B8jRyxQS06NI%gk4D$FkdCKxltJ3)ne~! ze9#utJlwa(>&i)9lut72Ke~KO^1~L3c|BwaW~lUZwI`-^W)vw5WSqh*!*c_nl3zt; zV^q9a)3k2%)h!qOc%ROrB)@963La%Y7v-qMzj*@SKS!`t${#9x-2%#{OEOk*Gs>f& zyan(1J?MWl#pPQE{Uw$6p#KYL!$KhbTC`zi+Qn$o+zg9{g{+r(*FQFGSZcqX^REAP zzR{341$*Zk{Tj+^!I$l~PW4o9BEo1ty7K;d%Deflyx)@YF17yscFv`sg7id5en@R4 zX6OkSE-f4#;`*C6t@ALjW@v0ub+HBB_|5d4PA_)_0LubuIoTFmfe&E5=>!2s7Y+-J zvl{Hom6l7&qvO$@IW69DOqvi#2ypb7lMdZFCxv8sX-*h}#(0yN<39V!6SpBe6Z!@O zYmgfRU<53gGTUJu_w|dB)S*&W&?h+UJ6+b3Iwejwqa(1Z9`^K53j-iL%cr-Sl<6j& zW3F$Qs@j})pE{NO5&F(CB=n|+c^fv)4x300PQ%+_mr&pObsix2@dMWDbUjY%S75PA zZGLkSyPSS!>Ipi`GMNBUOn@ng#11+)l!i_dP9dQGpph#I8p`7CDIN;bh!Fg`X6}_= z_ws(+6pfi$0W_?2;l#>xW!C+%D5x+p}?t>SjL9I&f=t;P6%*|(8tuh&o(v; zQK`po&0m-1J3-WI{B>7)sQgCyx@eZVpO_Gw9f~&Bd@=x1CbYwxmv*mA)T*9&LayXc zbPwcm(wT!Cs(ftCCbI67DSumTsQ6A^_d3_uNtfQpU6*P5Jz+gwEmO_;p1iJPKw#<% zsxe?J8ZC1h%ap+`+Sw%#%;HX$>N|7YcdSiCB>}y*x0$AD&fO??+QeBvDlL_-WSjaQ zY@6PB>t1(O`;SbRMo;!wK}>-m`xoFBl8&@-S}8j*St4v$KpLfvRz;qsDs^00PN-A0 zNaL5s8@?7V?3qhKG*j0;XlYxBlooSIA?;2FTd^qVG2QqMgv_XXGaJImRe6U&{z6io z&!{#SyYy_ntM-Fx&-kv|-ocDLt-l+Dw)&8zk8;;r0^1Et3sCEwT zR{KxQK~iV;W|cXpyrydFDb^Xtx>j$vE8l_ZVnjL1_QQjz~75HB)WXkK9sxTc@HRut5 z@dAd(a}orfE~Ldac)NQ3ICJ6f@^+;uMks=V=a!}SG@fFjsI}+-8je{glE?!^Fro!9 zK-q2tEE!}E`j-UBZGIKt*q@2WUlJ zx1<{w2tjx`Mh*+ktE41dV{j&2w~cMvwrv{|+xEn^ZQJ$}JDJ$Ft%;qvdB0n=|8$>o zx~jdg)?R3MObNjcB`jVvAvQ?aBW_SH3-XPZx3bzPCQ=5qs)v8FQyJV4j@w(Ihd9F=X3=Q=9c5E692M#ECDjINBBybUMi(c5DYnKk>JU9hl|!K z<$DZI#ePuuaavU%mle=2Q=`z4&=1i>NLuewK~P&+ftOaoXoRaO=xIFe2KHS^Mn2&! z|NUf~Q3c#v-z59=;A8Wo7q3DSD;;PNctsLNZHv_~A>+P!63r1Dg-L)gk(RGR(^u=z zqY9$FfNKfq%^3p}i&poQAC)zHvz+OHaEci^R0t};zq zUiShD*)UvFRa~=8gf`XD02_sIY1Qap*U!n87;RHszH15lA?U+Ay7sMm&U@|ev9Bz& zWUSMsUWhf+-4iO$`NW;<4O1+)OHo+;%LWxkrPv`)$S{P&2Z|sEgkJ@EG`d@)59rm;e(??OpThBWtvuIsvdDX+>eZB9e7SR&$cp*2S~e zS{?4of9EOUi;RDjTnm>1&mI)?tFI=GdVO&2+Qqk%S%xTVOhUw+Y@-kAZiTA4_D=Xe zl$v97IihS+Y#9@Xhzn*W)t?kUig2P>rKk=^vK3CGEP-0M*_H(V|Dwu*E{tVM<9b$n z$Hebpu8E}e8_E*O3;0nd;u6=ZB-gSAfOLh@rTUNmv0izaQrf1dfUm%nz0m!vl8DU( z0;|igZX?W$HE;Bt)R0}AHMB|hU+x)fs3*ot4^&hiw#=ck9xrhJ&na-7VrqUiA*4L6Hufjf2p|dZ~#s)*Kk$Ah&m|vI1Q?c@&^4LZEgzU>UQOG}HE9$5ci-xj$>?Jjo~ z&_A=2O=RxmEG-1O_eIw!3On%H^yKI++Jx6iBgVteD^jvI2GRBsGage4F5sRYGRH?&+r9YW z3`%4+>Dl0cp*wKLR|i*M_Z|hV;0$CbhA%)d>eJ|wy+&dG&^aIAkg58{|C^fpyMI4` zPd0H}Oz1!kKMD1SUkZHd7U(G%Lz%^i3D*lpK{sSXIF$YyZM(@WyJ~O0sfhY2HT(}%vosX*`Op->r=&+Dm!+(lW#b{z=R4&xjflIpmGP$Z zz_I$%i)K%O$j_XQXFHLfJy3DZ>wc9vex91%PA}2_sHYVtp9y>3H?`8G`dZ^Zbo#U* zum-q7QA-q{T@@Lvg{$0SbmAUC+wm3_Zq>G~uJ*J835m$PQLisJ66a1UK{&G|K#zME zH3$7e7wa#p%C@Zu3APsTyR6$!+gTXgX03x8`(J=uX6v!CQ{sYqcy>DL(i=xIjW5~Q^o_%(%$ZB#QBvqd29NaHdzF%TGXHv4GFypXjjA)tcGJ+Msq zL@E}(dtwQCE`>513#$gLf<|f@NV0&LlM;oHXyyDtWhu&xjq?u$z^>Ay1;>*2S`r~w zYl0ARl`p&&0rASQq(DS|;7^%K9_?N{Ewi;&mJCEcUvE#bo`uD3v1bw_5e~tUYQU$4W+8`piR7i&Phrp{h!f1YMR1x~ zUV^bNI7d3)THb2vmWl`=3Y8x}neKqqQxoUis?cnJyJNz^3i*yg-;*-G3H_mM{`5HD zRt!l3Kw}OtAMYch(g)3nj3I^>`49y2Bp*U0j>krML3B5XdMGHLu`FIkhZ1gw15ubD z6E*>Lg$}FLqZcJ4nMK2d4C?&HaAl^_O1aIbrDm{1Q5yI4BRY&aEMyHU<-&ulUB?D9 z;aZc$%z!bcSc70neTDFGZ=ds_3l9YWD_$kVij*_mWCc2=v~+r$oe_(wk7g zpsgxtsJR)_^AKceI%W5fF0th!7i%0O4VhggM4)UAC@lRHH`VF_Z$!PhmXE!C{xi8L zUwz;G(s0c-Xg(N3CC3Um3S!bm==eK$ z4THNL##IaEIp>DYtCZ#k#umzoIb#&SD?@}UUXZ9XN9{K9L!)(^5JaOZmX8#|o4_;$ z@T~_Yd)^HC$JiP{H*kpcc$)%QxIAC(EwMzK=g&|5JC!d|2m@yGL;FcMH`7K*PIZOf zH}|t!M%!K#1{Ap(Z31(bx(I_{G6;2l!I8K96&3PO6tM?;Lh4F%toOU2b@e5Ne|l?)>eOX)>;+0 zdZX=<(9kbHVSkTM+ZsFnl6aKn=sBCo0rTwsX!I%LVA1T)uAXLcSd(YYUOAh*o zL9I15<8hB7j+3O`_!*9w@Fol(p~oFDbHrtd_@QQc@sxL13S~&LRr#(q3P-D8ap7tg`B)jSz(^qmbW_|({G@onv9q&4A_L=wAZGyJa zT7-XkD>%rDBS9Xd6)2~q^cnFn0<;KBHdSRTk#cj90vpvUHP?7LoPouVYmT#4TpgEE z#kR^Y;g3v(?*U22n85Nu`e=DEQ!Spp_5oL=Hq$ydq8Jj=NGF*D;(hXX>2nl-hTFp) z1Xog>G&Pc}ZwLkyNV0xu!Z(q`MjA&-G}4XP>>z1{ADblRpV_6je>{QZ0*hmzDkR&Iij5=UePDa)X zSTf#9bl{|Hv-T$#TrIy)vU8Vg8SqqqcCP8O9;e_`^dM$!V`+d)gV_aw1}SZWhb-I% zB&ZFTjdG!ZR@>Ok=NKvdTSlJ!$TKHZPt|{jA3f4mw}m}&GPgyg`2?t&-z01`xoEb& z&RbFSLkM~d*(W5is~9!)V3~Z-98niYnl+gV()V6=0hY-Vy9yCsxxh0tu9qy#)Wxe9UV7qu^;;aH=G|17%0xvq=s~(iuf`HH#u}2x2 zoour19=n&4z%Q;c%4@mCnumB~>oJ}Gpc&mVG<8OJzyOR!GE1naU`kqH>O|qNE#@7* zBo0Jqx`zr98n1?ydmtIE=cQUQJ7(nMPG*eBeGzuW0}X0*%kV^5kafatg<*mUBqK_ddY=UR{;oi!PmV)A zYE|0Sb)g!~wWB{%inwQSRaIS_J8-wrEe!(PbXymV_lPZlpp-Y)58Bq^Rqf@SJ?| z%-Eu8un3UR(mQ31Bj0H9VqDb(#kkYctXccEUlIo5sA|4pQ-&Dd!>9 zb;>b<_-ne@A%l2%I&w6{<9&+20qdT0Q*W@&x^bl_pon%&z{TE(a&&n%S4*)kN zW*l2Q8F@fQofJpxb}Zs|lbx_uv(UXs9iI?f%Jbl!S>Q~fI-AMW$cQT1t1>Up%rmpz zF!f(1#5P|h7fLHRY@UYL`;Kx#u!YRTa7;bq^$K$E2_BjS-|m7D>bhM|JB}Z*r*|wg zMU6yPUC0aOk{g{F3A*QB91}-%BJ$ zgnIL|%)FjW$DVQ)kP5&U%uAr_HSay(t>$wT#Q@6K3i2uz&`qk`G88>RqfU>ixUy(B zt$}WWRPT+S7)v)AUTS>y=q`q;EF_n%Bz3D`&ZhHWow!g#TYnvl>eENtT!A*%uq;c4 zKv{OB=>kUr`bT0;HMyLzfUf8_-+`EpaX*=If_QGve;r3Ke#*4U4}b(|H~PCoepaE; zSa4beWASf=QbZ>_0~;H@X#fg$vDLqTcxu3zXXvl)PBj-5;Vq+(7gMI(k?|Nq&8}aQ zEu~|FCCC~io-Uh#j~+_6vRWUK8OFaaCcINq^{Gw@$zu2B0?Qsd2+ZIL7^%P?CUV3Py_BCWyA2(Qa9xHHaNCV)T*CL~9t*B&#-vvlWB z>|_*NxuJ{+%CNmoia~c;qDY2Fz ztq>TZmBwp%V&Q)@;qz1>$PlNEVlu3e=oa4CK;oz$)bHwNy+HQY$ z*t1RhgTxz$p+1mMi>mFkF9comt>!s1wU7Q^ZxJmEwXYzIs&M_ep(2K=c7o+$sn~TC z*}L|u{TuI%BF$;c_2Qb%cvSAx^1tRC~;XgrB=T2krqP<3DQ>N!n`6_Do*Hul1{ z)a}A?UOP&s`sc$3;9Ba>UH@9yw`JI0-c<$%Vt%1&P6RcdH+{Yb5o0+J&t5P?v^+Rc zpP~&4C0XY!q+ZQTi#9@C!(ZV7#31@0+OcXBi%t0(x5u-Cv1fW|)$_yQP|GlRo8?F? zo(WORG97d|6-yxpLE8gN5-$gxUy+CKtQO2Qx&*DUBZXz{;=pC|UtG6ko^coB4`IjE zxxVJOb+AK5RFjk?kro`r(XOKtUyJDa-N;*Xj!$&C9nMc1kT=k$!&({nYJtcW3@7_s z6c@}cI^In>Y7fhF5;OHujP?5X)U&rnc33C4Z3mzZJF~>_&-emZfpWHghw>tw%3)(4 zNKmpayDP{98H%v2$vIAeCxh8uitfqJZks%ZcW4|o!;=zHSWGj@UKS>+H8!i~i8fYp z>EqH`7Sd4CEFcwSd3J_4%vWP9H^tEe43O#)e1@u;gnaYh6R%MaoRwVNF6#%7)vjO} z7}gu4Q0E~8{YA3^sZ%B(qFE3sP^-p#6vm3UP(8u%K7fyifx1%b(es^o>9uMR z85RYDr%xEMP*|#sH#ZED14$3@H)yF3DIN(?*N|$lqVKbxA3s$?TioBj*m9iTMvB|% znDE;xX&gbs)$Az!m0+(1=Ub00>G9JyyU1J_482yqSN6@=;F+YX%f&z_M-L3kY?1{A zbmx&?hUod3z(1YEvSoL}*@^d7jYWs5O&j2#OqxkftxmoR2)os=xR4kaB&L|9&8y41 zK|e-tKaWt24&+@QG&N^i`I?bW?JmE3a;c$QXtoUH24mL`4OT(7XiNwwBsP zN|2Wtm1I7WvUgb|uXj3mc{%Ij0UBy8ocL-Xa90hL0hM5$A*`y(D0<;ygBhVJrlLgD zpfm`bIh@*E!f}+)-wV%Lt{l=*UD7E4%t>?)D|Cn{=Bb>gQsI=qr3)=|LAJ`trcg!% z1FILURf(GQwb%9>aH~RB9p{oq$m_v6*(MN_{V68;;K>0`yI*oYm*~7lK12X+%5sh` zKE2>noJ^!XWZFmhRYP*QR)L;?J7J~CADCr3n)XilYYFIH=QZiH4tDo z{r=$KM|RGI?ViXc_ptLC5ab9&l>h^w{Y+{3p|s@_PeSe0;>Y$w3F||An8RspfZk`z)l69GOu1f%d=c*)H22&ni)kf9J_==CU09O(QqK-`fAHQ{VQJgz=fv!msyF5hk9+yA|dav(rQE zV~qp3`xhMhRi5UvqL6Qwg}I^;jFApi9J>Z94Le9YYJeBb-}R7;Q-ht<55R#Fx z2POLpl=bERc2xe4)S}b@YX?*uZ`NTGPx>>S|EuHUhsFYN454lg(AHPJv6BNootuKm zryH9UQ(X)aBoY7_W2*!pvODn=vu3LXR@K%1JDz3J&d;1}vmUZ=v8s>Mc$zLBp1RF# zr-Enc$e+`+g?n6GaTUIbIxC{Uffus&UVXys^qauxxqK(AxvVeOCpe+cV*&L2i@bm< zomoG)O^?<#3rIZCj;XH0U|^rpoOF0ql50hK8kS z?EPp%c>6)9Xut&d^2LIfocNP)xD*xAfmu=uKwFfdfn3{$t$bmTzq5m`tHHZg(u)X& z-wCNhfm6#^a}V-fL_rYIIwpur<3?SHw@YeJ6&8mcECszVZ`p*GP~9b|b)K&w6#=p( zdD?F=X~}vhN}?Zx3bJB+I&!5lgbfu!hOU4DAu;tb1PD`f6W=v~Mo0~&isZWyN&MM4 z2Zm@;55?~^7`xcFd)`dhp#5LTtxEo}UXR{Q2zj0iUp1xw1#h^PW!pIG*0Yfrl+7|& zxS7@UP6h9eA?2n42Y;zLWHlbXzOV~?Mtfa(f+fe|_r6xmB=zloA#_8j**tH6ZNhQ{ zq_&E(iYKb`7*~Im$gfMH0>RRN%3@=_I~28rzbMcQxiHxaLTY;)88EDX}OKoP|q%2k^n zd63H^DN$6;5x40;;I30#fA_E#`zD4e6E6G#ET!|?t##4GO%#?@Ez@Tk?&D*D;FOA3 zRbxAu-T@6UQELCb6_1JZt1tXrU5q@h8h6irFX2@20VA?d2f?1zQ)2Z$C<^do!}e$l z6jv6x=e%|~ouY%mIdklTWum-RHO8N-`6YQtYTT{b_l1HDUI+VByO4$<2xBW6y3vbM zHd!D>Q62okqO4L%`hJuG?=Z4CRU&|nv^`ES&q;$ZP+}anI-*UrE#ID5Y0XL})g#|Z z%Gb`0Us*Bc($ll(od5XByWO`^ABY;-^=doVwhkF!-3IC!8r?^E5w|w zdFv^P|qJ@y$_WFFfU@kOl+5`=*zcOj=(wC1p#rZ*J{fz|sKV!du3Wl?S z(X~A_wiyxlIaRn1;ehE>e}V3ufkc_0R`bz-~4G6FzEX^;b*H3_W$H3 z>+I6YN-BJ#gV13e{pp^5n4)lJD)@(WZp-e&}&X7{^~C1_;Z zS!Rzo9{2gx*>7fHv-5RJB+uM!%mRv8zSFrMh@QH&uvTp9mNa7?Bl7f}?TGjZYSg3g zg<(L5y=0-Gd>BuG%H7tTtrw1>2@n*I%ZIMGHjux}SV@i!GBru}K%@JNYJU@BneBhQ zDe-$!sXwN*38)3mwGQRW~Zb8z!d5+j^NFFtL!vELvyoRARdW)NK1Iespp;bHtV-r1!K={J@9CjB$Co}R(Mt(2=bUnaoDINcrjPoka z(kPr@`OGZQyrpYl7Uw{ccigruB!FC`PvvRhC}=`AU<=)ab!<-5Mb25_Uk(!-Aj=T2 zVWuSW3auXEk%RjOExi&nU{n4_tkn`*r+sk1V_FA%+;JpWnj^4<)v{pvD<_ zh&$XJ7*Apb_x+0J$YhK5Y%9CtU3uB7aFtUiW?35q?j=SB%MeT=GU!{uPJV^)SDt#& z#@T=>hv;)A*S)(F(V^ls=gB86=_dO=z&V(yZ-K7lD^sf(*oaF2q>GBOR$!OOt=2`P zQf>8j5PRtSv@qWAY?8hGr~CuwT)yzH54(HLCtf?Q_w(Yqm%JE7b&6i7t~^dB4buEg zFpGM)VE#w`p}*xzPoH&{eOjxu`XrqSQH5d3eN-b2wZ3p)+jj39(F2PddTTj@RR5sN z(IHhu?Q5YB!#%9aKJ}N)gRkKNf7S8(hsvzJPv;gS`JFod;npOYaeHM3cC4CbrTo=% z3SCx}7m0oHdA7$G!z!kd12O}K4-y&;jiXM~>9@Z9&`PqZH~7~~Yv#d3FYXoCtGpwj zDF=b=pSRWwMJThsVqAuSa>N7r(lh6Be+f+aJ5A8|%$V&^_QF~8-{zK-4Mcq~mD76q zAndy~%mEiFb!~sfptl2(jK0l(-e9^`U*y$Tk*pW&ETNSt1+YR35`MpGy^;lz-Lg%A z6GP{VCq%4_K-yVeDEvGa3m5=0N&g5WGI=VZrYYAd*t8gnT)ktL=)7-^_ zUqR!3+im_KEdspRkaE3ca@<0C+hMOcATIoSQ82Gw$Sy)|_1>Qc8g1l^zWgXG9%~He z!LCktY>7u=@h@`GvE^h8X-k7CHzmBQ^(P42T=@8v7D@lU+ZS?%exH3(-i%(y3%&V( z=AEjMe_vAW?|8|}$7#zjM}&Spk8T=N|8+@2b}cZUtja`wpUgG;s2>TtB>Zk8?^GFf zNbLQWJDH6jx($)tR%u%|v{lLB(mN=;#iU}oVC6I^u!oin z9){0>y&NfOyGIwiVN#WJU~ZUvUKDt_VupINEJKTBQU30#&sL6p;;xd2xMmOybdgX~ zof1*M*K3ISr94_X~z#>CU3YX@JM>w6Cx&Hf~C7!3HqWmD2 z@GK1JR>rc#yufY?hTF0PXLL_m7@fF9x~R28kyShWT#0qS(BC-Z`Iap5jhRQQ(%l-H zTY5dr&G_n9k||kpm?nkw=4yu1Z_ou+>2+qZ=C78{6F~ppL9pHMldzKkA_cA(yBe1W zGlT&hTWJ;@T7DVxLYWx9TyYa|79GMNLc3_88n?{FKQo_}%)@xmEhFlfWRqpItmmr- zVDzo@@KrUdz@AVw9S2L(f4zv4A&r{E=5W3`cRKUK?=d289KSjh5$xp6pBX<=t>pfe zoSWkg;Wf~q9OW&%yT&}TNvqI&n|!z*4Hg!KQD~WL%clKyPg;SPt-;8#7W_;G9rM=y zSIaP&yrL@JjQ?hB_S5o0dJ9`hKVDL_LNj(|-$r#dyKAHG& zmTa_jxSYAUaT7*G>;aI@BOoVPRvp33y0rs&g5(+vNp?lsu-E82x=^AI;gCX$mK1*$ zKy9+X1B1^sh3SODpR;D+{HvrJ-peSDL}a`>rENV|WHw1*N1lasAepvOa;zXz<)4^A zwdwp-!==GKr%#*ox_FW)yNoyFSFs!E`0qkKpiJMXv&+@zf2@6f_$NDL%;T|pugW%J z6W9CR>@CUu;5eswuAHoU8c2C7tK%;B=W$i$8YPc>*I*x-K4mcf7LU9IFt>#Y!N+5# z+3HBVXvt~wWxsu!(fZmcx8xfsD=jROUMRAdqz-4cP@ZuorWrb&pqduS`KL|+7U#$& zThr*Udyspn{zlNO{1U56wZ^zIhg!38yU$@4cEiUSG2Rv+LIVM zva?WHD&*gn86f5*T@>P#K^96`Ph@N%WLdMB>gnjDO{FzshzCaj2+~>=JiSEe;!PM7 z5qWO-s;({Hacbe@DmYDKk5RtZTSo)Ii9R#Ej$p5(p@`~l#kBVjhY_BvQdQBpreoXj=|sO$)$>tI}-k0*4!O0RuP4P6_$guQc7 z^HQ?+QQH_y3zhRaAAq(=+K|SoGM%evr=B)<3NsyAV(bv)4o{+U>F30#A;o?dznSuT>x9Ysyd2e5Iqq^VK3UE-~ zysrRgd9Aajv=`rFON#*rl4b2AI!#@c$US`%$L38lj2}w2QNcLH`WOOsIbRUv8I^%K z3^tj&K2K97$3|V3&3*z1K3;^`jFJW8&B>J8octLhDsvw1-C(*u=* zx9X0JA5lAqo<)!hD^%xc2u!;5^Ak zdi%=yaTJdEww}^nrLuvB9*(in-bH=-hQS2-Cp8-hEm@07#sKLdf4eG~C&^z|Yx41W zpt zrX@5rzHmOX=eGUvMd2K#uoL4s9Go@&Iy)(Sjc_;IauW=gmbL+3EM**P9Q-!?Cx@b$ z+?&7J=%@Wo7fxtUcKXRhYTZ*4F@ceog1Myj0%5C0?Zm7=ns%))VRWfz7<#u+oJrGp z3YS=2ujLPL3w_!M2<^DcK2wqHZMWEil8Ej?6}COOC|BM_CQwa>);nR`m8+Mw!zu6j z;(!MmP_a5&;zP4cB^xL?E=5$thMci~yd0*``lKT9er1z}I6d;R-tl~yEXyv4!s!G~ zo&m>$+?3_rcKh}F0W~O$Rvn>tk9z&ZYD_vabvopW@BIU-PQE#0eY?TSd5Ge#&tt4i>(m!c zQsz1FfCR54I2D{$`0gU&s!;G!{k1}7kif{mQ3n~QS-q5cm7i^T=D%z*9N+0fve5)4 z(UM@v!3#x{A3+UGaTLG;M!)3MYO=1FjieM6p1W(E|6tS-_Y#*B_AA-m@9~E=nv1w7iRnHYiqF0=@dC_3eh`a`^D?}w=7nd z*_nn|ig6ibiU6t~UIu1KANTey>vZB5I7y4!?C(&rOA+GIpW43};>Tvl&o87`kLpWJ z>uTd)vlr^|b~`*8(bYaD;$LO%gN*yu^6dT+Imn6(RtWcD9oT8JBjJtxCPlA_uhH&= z7#a)C?+opg1!f12aVczr^fME z^@>cI%}6E}gb8==SIfz`gZu&|7}$VaTMroddKSZ`ifI=i<;Us#*Jy*oOf@iju=5d} zoVK=2T^h$@(>4cnX}Ig3YV0=dqUqjF37rgv&DbS8AgyocgNAi`(-GC>#Txz^LR8fE za|ym@Lw!psN}iI%qc$a8KDk9qFWJ<06U1js%s*Fm2TM9?>-OD2b78knqU+42ON&;* zcxm}42}AeQ#v*|1UuerNa1$yiJabhsHrurYiTDR4fzRsmUj!b_**jahZ>>p^iHvpR zXE0rw+VBv(h1F&xcZZttJJy1nav>;I zG^8h^NO`4}8BlUq-}yuyD-ez52RKf)bU)p|h`?}P`M`(mc23IPR&DdY%xA{OK?xHq z^F`btrLLnevoasd7JXJ#OO^I_ai`fV?)9uSLsmxcDrGd3{LA zumL$|x@~g1>JWTUIV*9L98VcPRb}wZ+<;ptnzF<8l0qy@X*(50eeFaNO6alvgbIDU zd8;f@^=ZR+HEra@JIg(ztswvxt7|^1f?SD)xmWsZvL)fGQV`YYDWA(&&K8LkCuYaH zzFpO9>RGM~Xk)v1Kyn?co{eO?p+An^LZU{E(Tw*aY&1B&9t+?3d!f`o65$YV3BqJ+ zNty2aHvOwHwB~qMb&)9ztmF;en)_z)Nuv?Eo#s|gLhNa?^JN}Qi-8o_O{F4cg7>Hk zaKOClnANS_WWi*OY0|qu;}FO8wdp^;&U^ybUBCfBYQ8*Dl?0)j&u_--#(!rezTVp8 z!lI-$X%R4><1~R8ekR3%MKvu52rHX%!tC%HniI<((tBfOLVKc^edmK60Zr4-Wp2z0W?|{0MWD2;O4iJ zKK9%fC==C|v~nb;GW5t27P97-$?!I#Xi?Z|%2W%-Tu;Z|HM$xi@dz6;Wse7OtvDwN z*iyaZ(kU$tp3Q;N7hQz#7<=~>vUME;e>jamy$ffgNae&#@AMv^$+Qf>O*8_en;NST<>SbX_lFkd9Cb;4|N-t8teiiAS1a* zFSprN%*`X-Izz!)J@)CCJ3$;0hn~v3`XQIgVC*}6EyC{jTh`8gc)E!^-!YrF)nYSF z0CAeh?1E}<&!w?ryBVIOYYNc3QDTFkYsv1Il5}DuO-YR-4SXXr*@J5h%Go3Ro3Qa=Ht?VVDbFpbo#HohSccxIKOBtHXhrdl!f zV`3N1miDw>yb?_DMw9S&XHavv3r``=62N9$PcUf5rv)!v~~8!f8E z{iR)O+B1<_MN&yMnzjwhyLiReX0_Mdxua>y-iGr$ss3(4KlJa(|E)g%qV$rxdxd;V z(BCqB&t~k%Wj=wsbY6j60inJ`AeS4CsgjPYsR1(lWL@-* z0fK*SF8JD9YJ5av6uV%%h|E8p!Wg4HC`^`r}KH9GJ3l!h4GGe6^MG=`n)p|y5 z{)?BOWHv}6n+y~x7{>LOH#2W0{;%smXbV*_Z>hX0b`DTCF2xAJ(63^+yUYb}oq^~L znLb+a?bxH;Dkw)9Qzr2}is4|>a((Q3XUKg(yryPlzSVtBVNZ@5f;!zZI68?o7RET0 z&4eQ`RqM*p8oIN*RtX9s^^%S_Xd$&tYYlZXzbBrGL>b9@N~^?*h>E#RPv+IwxdKKi z;vv$2Vyzf>o}Fh}vA}fsJCh|fMy^&V1fUub)vNN1%xvifJuzooqVdIdp2dOOc3sow*_zPP{ADD8xm39l0nx|jDR)S-2<)38>KzgH+z59 zsXqY|)J4Wq_EU!d!YD3|z5$j0p{jCsUYYgHUi%yfvkEhuDn=!C6ZU}daS27ou#5a$ zMlzTfTCcyV9qcmGLGJ}1x05UTS=ow+Z^g7Re^_3U>mY};s|jmcH3WYNS})ZGrBQ7t zp7Q!p7YL%RrxS^xg-j@COPcTN0D{c1$~sCa(z!xIMgIa#^Or_tW(+)~E`G!z%QA)f zmkexkb@D`}&TR}DhTdktV~6FQh%Oe0bEye%J-jKIo~91oj zfr<`rtbL;wTN06M`yGc9Qm0|cC}u+=>90FvReVapNF}FsH&g{fDq{*4W|dZtz9=vG zDKL?MwCn;r7T!=_Ov!cM7FtXk3e9s%*c}9MmM*(sHIg@vO1VL#I1W6h-zmgF0)SeK z&o5fLhRZK}h__b;XSt{E44b6+UK{kbf-CJ_Sj*MUoucy;OiRreE1dSE&d$x8(NNO< zyHDDoS3<>q`5J;qA$K6E?CY+ZwJQKy#t<+fGfX(*@g#w$)%>LWd~v~Pn!2PZfZL{{ z)Kqo;bmXP!QlcxYZM=c|1;W=VYpr`EAopAk2Rx*!?c47qINLk>PnWm%ZwJ&~%IN+h zPY^bOJLjkjmrl!eOL(|@zolM6pshh<>2asUm*02p;8|o&?iHl8Tr)c7BmA_lTu<~T zPKs^E7k?P>*%%k%N__olxN zj5SMTGS=bgHEddg0&R*Lz=O4=p2Wey-?uBf=i=ue!3p$I?{HfCMIHe0M^dI}U7{EKay&s4f|{yC;5QRG23~e83TZxM*zt^zoj! zBki2}*AO|PUxyZ|T31Ltoo!u$r&hD5YrmmxCY@6u;JL(p24di5YInrC#c^M|RZ>7; z^;S{CYE!6M^i*2-1W42gF;g(YS{5x_X(stQR+a_Ul4gZ_9knQctiV6E-S9p+-tcF& zRJ&nmSY#lV>TK+4p(KX{+c8$@5)JKY^x@-I-9NAJJkWu=a%L66LN7Nd{th(axg*|! zyjjzX>-}^5i<2KiugE5Ru^d6`>lWSqv8zIRKg%A6TP4mP>jSws3D-wE{FxRW-uae@ z-X7*&k^N)0U>7H&IuU|!0xP^BbMe5$E*sc>5D6RZP=$ohB4;Jtf}jgmKO=|`#4ZcF z`M_w;_#$Vcfk-@+H?u&H9|**c!NO46k8Pp(!v4F&A%1jFg~{LFa88>)Yko}O#Xqd! z_GbxXFcQ!Cts>HMk0{iS*|GV5!e#yYS^i@cAN-$io&Uel@-weCIG^aZZ#dF>B2kD! zr;Z;4?)U#sqzpmgp&xq2*345JDBWV;6TcmZ{pywUpmhsx0=V6P@4#r3F=asdh4l?6 z!k?5qv%bU6Z?VbZ-VQh{kul50TU_CWCBd`p6gZp(USrV3vEENhNFDkUQuU)Bnv-hR zYBEo`iS`s0=Q`K8f%NR>PJunFTTJ09VcS*+-FFD@%$=w3>c2qWnez_Tb6$KwXHO|! za6Q)+RvRD`;OIzF_9KtmnpksoBS%6+)`N4RsDTpv>J!B+Tq9;{0<&m9P8Cx6@(gD$ z+Nn>nWE2pNojVJK+*Xt#wWgyQ9PI#!C6X=P_|111!(?Y};jsX1F7_kem$xe<0S1<` z4DCCDwa@avAkiC)gH@-2#9#5otdyP#3GP+Uoa_2h{_`^X80bK<>xxToXdJZ7J82jQ{V!R>nyF#Fx7 zPk@IU8|xiHi?0NR_ZPK46-WjLdKk4g75BI>?hv&bU4lE?Z;7=NT_O{{dAq;X^iJ;d z0edq_syVA_nzjW!Jrh$d`2~Jm#u9}4a-PzV_USI$nOCu0z1!^Y>=@2wL^A7lxX*4_ zZO!Brf4*?-*i42f!6o*hHLnMyS>O6kO4NbA&~w$CV;A&wEj_sjMQ9VfPm=vnxiT2E z7cz&?IoPg1@r+;S9W1WUVUK_BZS9GCyTKdmR8(;idmRGSBzf1NpI_J9+_#L?KHhC7 z>$BFOfq%pE^2r3RRnm*=YI~-FzxP3=ZMJ~_3iibF+3(NQzBbOn1$L7KuRYQ8l^`rp zirn%zdOc*K)|zTv06$y{sd&y`FR~W?g55nYq*yt{QS@3!<@C0t< zKEC$Bmw-j&B#uN@uXrKfC~h~4zXX-?H9?UbMUS?jd0|YH4k@fI@iL2_b(}{8JgdHl zy`VS981X$4{D;p_y5$T)1)u;)O-|L)?c(RTMszPHdVV4Ar6C=dDF@lhuqn()uerp70jXk(EQf4kBi++M9a!Qs_%5DN^L>2$w%R+kcip}qkmEvAB z+)O`+%k_(a9Vx)A_WnSDb)CHh9>Hb~SL}oZTAr#^Iq1|O*dQrshubkK#H@M_8lt2| z0B8`TW}c7bCVb#1fR)ZO!vctaJT@4#RsYUiVE=_bqE+qHX4}vWAR@@m7Ak!V*DESB z12U>Sv&Xy1yhS_dAxd-~neo1UiGE#37(yVS{N$2DbTFW;5f-|t5J#}&f&Y?RnTSqx zy@%v%X=#^WEgMv(3bGA1{MU&n!ws&8YiWgC%%lJae~Vr@SPc(K<7wN=m;%4{RgH&) zDLC2ypMoFE3r52=2dXCLXxD84wizw zHMN(>*g9Y-0IWJWPx^t^Lnm@LJ0GT+eYnRKx`eiLPQfNMK`N?Ln$#Gr}*O-o&D?P9>U~gH;41} zx2{q4@-38xCVDJ2FT&$AQ6t9`POJw&a-wT7(~m>)EJKUo{{rU#82?8`zgZ*xY##AQ z_r{38Ty?@HQ-pQ4fV20rC1RyVQ{8(z#HCS9;wLjiAYhJBNM|dg41kV!?u-!jJ&z$+ z%&QF|yfBAQXp2`9lnOQG*kp0Y`m-KQT5@7def8TQ5lwfK{^{A zo%zg?%h~Sms2ThNZdOOf|Gmn$xEdX`hnROc&o)QBrdck)$>MC)@Ct#fvy%VyfBF0W Quz&sk0j}yd8yn060D=mfHUIzs literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VA_16_16.png b/navit/xpm/country_VA_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..cbbcf657d1e391b859de2631837e403f90bff02a GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`JJY5_^ zG$tnh`QN~3J>h?U=nT&GqB#i$89)9%zy06-e#g}h|IbgiKCXVx-uCPN`RiLuYyN)v z_vhr={rmR*{`U0iTj9<1wYAO;hi7k}Z};!X|4;sHFVE+{`@g+z|INb(4jgE5Z(g&- zF;v3hvxEie|~+Q-N5FSws5J^GWzHmZFP!2ud8wVtK z3LbzbXpcNf;Di*~Yl&JZDB?h?1UIHlP1g3>N$t#XC<+K6q1deiQvU1y`ajLg?heO} z(0ppJx$OL$@pEedSOESR00YF}3IRYrLwNYdBO!ab|8;L@e*|9Culs8C?xg_$01^t( zaj)BAqZXeN9si-2m$6b4M0I9M-=c7I*lxWhZXY6Y8jQdBQAC}9^t-!Tfp>Zd6_7~s zu}O)eudOTjvq=KljoVYQuf=c0^9_WqWdcx29mlCwYeT}6z@{!i2uZ{)Lr1PZhNJC7 zt_y_*O5LJDp`hz}r_(8Fb*whxl^1JEBb-;Ev>v;Aapn0%IzoucvJYI>)iez;Xm4BK zC+4d+9LFW(gHSeSp7b-A20@ATT89x~>$<#Peph^fO4P zf3ow;JNSZ@Z&u8g<6iHR{hp3iN_ST8J$NdW%2@$F>PQl&+4Kj4$zV`1&DG6KoXh=c z$okn~K`<;U=J~NC8J6{1I?7(bU-iE%oCRP3xJrEoifh*Kk^MBU00000NkvXXu0mjf DR}u)l literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VA_48_48.png b/navit/xpm/country_VA_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..445c1a70a86794da83d43152be0b363aefa9745d GIT binary patch literal 976 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VC_32_32.png b/navit/xpm/country_VC_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..9f7f09aafc5f9262c12080e37c482ae090051482 GIT binary patch literal 466 zcmV;@0WJQCP)!;9TXS?_h!Cs<-+`EU0fU8@%CoAg(+_(B? z#b_4!KY;|nR}KiF>7{xCP1XVMB-r0F%1MJK0RTs3*<~(I1?M1uJc3O67 z4l)O6*{Q2chcO^K~z|U?U%7m!!Qtruc$*Rc}Y4@KS5DcUW5rGtChO&4on^TLR6V} z2sYLTq^_-*5~OCxKnsJL!wpC-J~u(g|6n;M$Nu#H$|dQ*-6NRvetT_PbBwxASH?AG zPEK+t4`h-DGRXs(c+9QdGa*TBdYajweHz`(%p0Ru;;{Qntsf1C>`{)&f($JXfjMb&+O ylikd?6cZ2rmD}B-cwOCXjnJ++^Cy-vFs!;LFkyAW&kI1489ZJ6T-G@yGywolm^4`c literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VC_96_96.png b/navit/xpm/country_VC_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..eeb2333961e99b51ac08e29f66a7facff2f39649 GIT binary patch literal 914 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlJ8-923# zLn`LHowYyja)8J&{{Z&zPnV1W>>VeD#^r@Yc~Uc1cQtZG~iPN%SnZmz6-D#y9qC*;EXM;Fy+y=_0+b=XBv^vlO53kyo>s`g87yMKa5 zdu~dJ3v2C(^z7BS(YcS`9`Wp&=I$O6pjdf6_MFqryCNRzn~P4~{Wp8vzl&F=%+GGM zv=DsM6vX*=PsEzp>u0xpGIre&ucEIp^GeSLMe&0cW=O?2Bg+yy7kQEqnXKEXgJDEx&xNeC+stJ^iK<&Gu6KAj{j! z+pd25nz&!4@U+5Tr6~&YZQfmf_cZZzz+a^Yb3>=wyqmuGx>3k}4$T)|6tC;M-vF^S zR;=ANJ$-xL?wat&pWcXF)jwn>|K;UVTizY|&)OCquunAma88ShwW;myY%Hym`6UfZ6CA~l_qY15*mf&U#@;K=pXZ1 z^|bi(E6QOwe!LS{U9ZcyqS~gCJH%nm9~#UC)zopr087P{@&Et; literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VE.svgz b/navit/xpm/country_VE.svgz new file mode 100644 index 0000000000000000000000000000000000000000..19b772013e5dc6f3fb2f8477e68f9e59d40f4670 GIT binary patch literal 540 zcmV+%0^|K3iwForD0)Z&17mM>Zgg^aUsgpfb9QF{os`>-n=lZDuQyL&xi_r@W;`}y zJA$mbt@f(DYabxmkbpLU70{6O>1*d4Wu;aife*ju`_1@}J?=JZwk_JOYU-Rz0h|@} zOS7ozRnC9@c#bV+kF!bEZC7ll7JZp>2YyglRI9SjIfcfyDu$$cR^LpHLx322f_eM+ST(VdBZ1RvTie=}^hwN?Mm#kXk zyzA#JXUl56&iPPQeZg7Rx6Nyj^SY^h%a8fav=XR@QXL@)jRv%2-)E!ZdqA&nw!qpQkEBSGL&a*-7}MNHFAqkYcw_}<3|XUH0iV&gS$Nh5qL5g-M8 z8XewKkJO$orQbbPNF-;*(*roZp`#Ii)*5d^!WtzjKz#s1EdV<)nE!IHxeu zPH2;kcR91;dlzj5Y8w_wdKYq1kML0%0WskHaU-XrtIA1p{#aT-7m*VVr8eVz&h+@+ e$J4=I75gnfsg%dX$-;#;oBRdUf-=oh1poldo(up0 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VE_16_16.png b/navit/xpm/country_VE_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f2415d2502cf46a63569a948dafb670512fe5763 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_qJzX3_ zEPCHg+RMinDA2lpqqdf`p#55nBk|1wy?zgQ_w=$~sN(v_5xvU9Wl=y!A4_jX3is~s zS-J04Z4(YYH}j|3^OPgE#Y_#g1k-=IGhCAQ@4tU!NiOGs)BO9`bW6l0CheY;c;OWD zhC6p6-oKy7V7=<5j`b5G&9u+V42RHRfE6 Wme*xutV)62V(@hJb6Mw<&;$Tg4Q*cl literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VE_32_32.png b/navit/xpm/country_VE_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..92989ebf1787f232c6e25763ede86478b6fbec53 GIT binary patch literal 460 zcmV;-0WbP_3>g&0Vbs+X3ww|Z-_dFiEJ%o8J_3={PI7~b8ZX$-llSYbwvc||;)Bmpaenlz@Dm_=w*D(R)7p1djw z>P3%&SVS*^9z{<=PYQxJ1+99K3JqFCOf}e6galL5W|^c}X35ONLr<;fn@NP^@V?VK z{L9Dx{s#{eK67A@!22z*9V7$;3Bf=@Fpv-oBm@Hq!9YSVFc5yyZ-*`PIw2g#!U5Oj zIUI1|IM!o90(ejLlJDQ;xP2*9smXhH+OD4Qf5`Bqs@zM#E+>?Xao%CG&uzYOesnU< zEoAtG3_ls?Ze9rb+-C2vIT`EnXWZq4jwL(~ro*>pzVY>TOHx;h0_&g@we#?K_RIH; z^yB18uJQhBrHjgB7dfnhI&s*`4KeW$n_j8Cez%5U001zbE^{n%aBRrU(kG92AHB#` zHVj{%u~$YCnAJ?WSz45|*nale+f_-{w#CpCe*BO(l`dNtvQQRVqN1oB{Vj~`(9x*- z<-LU6LgtIYY^w054FEurwb}VXz9`tO^S-%YcU@2RF zI`_+AC5ybIGsVCTjd&~sj{V3t^$P(2cKfV~+R?w)1NZ&FKJ5th+hGd>_hUptFpv-o mBm@Hq!9YSVkPr+c1mibdx7m&|0KVb?0000u1^)CK;rXO=tA;yOf(%yZuT*!1kMDEd^WMWa+eyNdU;qF}I@qIJ1-$x8 zqQZh6x-%6fz#qQn>`=h|uVQqSWeNtz98lKoQF#lwacH>!h3AhuopwY�nxe`K zP}HQz52nm2$|b97)A@PyK%5Z^hck4__7A!EGQ+>&o6YHcaxTZGR6jgZkE&ko<0snS zfPp7xoxkK*Xt3MPTS((1;eF}`JF<1yOLeSq)|%PwEbnvNWUyoOc!03ssT)n=j}{pk z!n(--Ofw!7{aqF!e)~a$Bu6P06h(_$Z(rQ`q4L0NP`;RubNUKpeR6ty1WyiGXWgej z9K>)vZWSu$J`=tSxf${G=pWIleM1OyqBHe^UB{W^d)ID-`+ggnC9a%_n4fVRFTeeQ z?go(BOS$+d336pKD?qipQR+jdOZADODle*oxs9A(eY=p=69VCA`T5v-ZBqj&03}<% zyR{c`UlMq8Kht?huS6G!KVB6)`c;0(Bvy_o1K`VgQer?GEoSnt%Ag)W`MY{8w%X-n z)}^_uLpnT_WqsVp^4CObU>RydGtD0grJ33tuoeO+L={|XZDHhdH_wNy;Wnvf2e|GA z4JkWX7sFAIl_M@?Da0}Fy^W;2wHjl9bbfh2RjPxdKGQ>8b?3KGSGfS9O1UCL2FJadcs2^)og^uxAZK_jR;(FyVRU8N-~Rj8g$jIBS3_WaVlW*~(<|VZ!k) zY*pgCayS&xG-@jgFzSaFZ$J$^pSrMj{S^4GWf zf(2mmpUKs>h3r3Qw6{1jOCdml4EHRVdWs=Y6GiGbrvFST<&7F`rd6f3e02s$PRrA3 z%>9H7idxwGjsdNSI%{4u*-VyV-(R{`5W{!}59eoMA`Y33z2BUG_ULS%O)4x-x55N2 zlFYoC1bH=C3Ij=nj;kq?Oz+rr^fR+&=Y$3@h`n(x4$rPF`l2d+13Ubxk4y9zHa#5M z)+hrY!7a|{ej{T5L3nQj0YXRe^Sh2?Q$vg-1th*SG-~E2N+^PRc4uahxe_0%*d-U# z8$`j@=E|Gip=nJk(e`<@Q_Qh~Q1xaQ=oR<6fnwY4!nTP0P=O)kY(kKUb$N$H$nUd zE99hS-Imjyx8BN25Ci7sPsGC zZD25^CL(&8g$RtGZsfl4<;P9Y{TnT++E(WNx`2XUMQmS`g&n%%y;X+`;w|$Y1BT)m z&!EkhdQGygU;~BY+0w`S?LOf-7_i{-LmB{h{HXI#Z+KmROjqMhd`>^ktZRe^Kn3?M zwMXcpacfX8TM+}j6N~0UaTRgJ8hs4Z&;EmW<>OcCm&}K{imlQuYF?jR*?gwzJ+d+1 zRQdhbP*$>~qNi=$2MY0{+(*~+3RJ8uWuvgXBMdUEKP`R-pJtguqLN&rUGUUIagVWg zGY4U(I_CG+%?1j`&~1aYKG=WG%LpAr0T5X$YZ1(Evs=(y9kZV TB5j|6bAbw<@9 HuY&&r8f5!h literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VG.svgz b/navit/xpm/country_VG.svgz new file mode 100644 index 0000000000000000000000000000000000000000..cb9b78cffb91620b9305516b88bcfb196c3c0c4d GIT binary patch literal 15568 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VG_16_16.png b/navit/xpm/country_VG_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..39e0d9a825844f35d8a7bf831cb2081f3a5916fc GIT binary patch literal 494 zcmVNL#*d z^&XOBtxB5~c~QKGxeb7vS*^+>`TYPGqfx0P`*r|4Z(!MY0Kwpg$MXV!`RkGrd&k4E zu*1pVO*W4+0RS_Y+tu7`afDBve12#&T$OEc<7WQ!9s7F#5P@E6C^hH%o@M0(m65?V z3GR`V7w^63^#*#Ty!B?uLO*{$g%qXc>f>2L(NSQaz&~~%kIr5y-R0UGK1%GY)J4T4 zqLT@sWa={#l?FQhad0^0Jd>o+re59N%{lb|sQ;x6ROm^HEaqwi4xEXlfeF(5o% z+f$O%f$XdVN7i~en;8g2>Wph;r8)pKVEYRQzJ{SKZ!eoICI>U_)`g`vs7eEacR9YAV98h|{o%Z;n zvGfv*rT+B!^_}m1@;vY5`_6|fwYM|geNQUAB$Fut003%h^G~U}0pMiXTLS}f&*r|0 ztk3Z~SZWHteGNhZYJM=OJAZC)u%WUtdn?kuimcCKZ%1dOvrm2$k~#pOjXJS)PP_VH z%g|6`P0h2xj906(FMy0LE@HNvsH(acssTm)hd{;7ti%>=<701hAD^CHq)^b8b#ef> z#VW{3k3VDo4lgT?8>QFf+A2ui5Z&s3Ge6L6lD$ z#k(Rf(qTh5;Lwv1HY)Pcp4a9zn;a@T#1_G2zpv*h=Gb^*YF$`GS|3{eG&3o%;zyv~ zFMHdwN=jmg#VMv6*CSF=Epj;kBzJX_`VGU)n=0UJ{I zAM15?Cz|Y^57l!j4jwG*?R|5prP(^C>EBi7$-JXO*3?vLRVdg~z30ijSBDhA^$5)l z7age(6ifD0{oZ+ZnS+u*`VvsD`f_WFbxw0sUp%Q;^u#777o^fltmCaQxjF5~^;aZ0 z0qO`!nmNEgoB|ftwziBU0p@lEa8R$hO{0CsP%`p^-))k~lm`xU#W%NY<>6jHRF-H4 zO0~IN&iN>{6$>=z>3RLhC+93mWgGFr_p)Dun=mpmQ&;z8LfZ-2)1tH3ctDiBgQ!W2 z&`|&oL?ATe#h3yObQeA~jNfi@?)~QKRIs`S0|WBv>Q45l)0j{Y5W1m{o7KbsmFgnh z3N?1m6i1SNGoU6m&jIiNW_{%bpa1~i7rAd87zWqQ5`dY5Y|lwATzlZf`*cI7Y|R!XPGi0DORH&BfJU- z^qw9cTf-d`7mveLyZIAFI_i$_rG!<1MrkXRxL0G$ktmfQh&(#Rb?F{G@Z(Sb^0#f! z*J*XoMc>ZNW3~A7hV&m}yo{(4n@&4)QWtYqCp@lVrwKcPLHAkGg9!uUe>E;1T>-egA zY<$J{GH<^EFGLy4)*~b!#Kj)$zI-(x`X3nlGs68<{BICG{sPdtz~T3Rl+^$L002ov JPDHLkV1gWRHf#U@ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VG_48_48.png b/navit/xpm/country_VG_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..4767b4d226bfa35a2eea2739194fe2290e17fd72 GIT binary patch literal 1812 zcmV+v2kZEWP)0x44s{*%fV*{!Y}YjT)LYkwTJoQ=~SLrgl(un53-;gz!5y z7#m_Z|GKjezx%@(b)BTa(e&6SPpI3)XTP*5*`{w5ZTeckf`s;D{ zq5Qo~0|o;C=zDubAB5v)SVb)YiV7GN7KG z(Fb1Y*Bn0?Wuj^F(@&pG!elg-A8*zT&laWhR%Pbz7?2TH^g8~RaGQMzdW07D2R zc^t6Wmi8g(`t`{YVa+K463rfo-|k`+nw*T@%y)GKY_^oVGP$tc6eTi1Q%drPQj#T+ z+S^Sc5w`Sm-aorkAOu0Y^ZKP=F#MAOeF3MwywaN~i7<-kXKKHn#ia7pN-04Gxyn_6l3ccXfpZBhaFMDhSuqA|wkVKd$ByL79-0M~ zJp%NNgu>atSeQb%-1CpP?x6 zl-WGBf4}DV$(@Jov7wEPuQ3c;XtCt)+h>3H!Oo|O>g)B1^4=IB1bRtuU8X+|=eAXC z(wDE7B)uAL^v%7nwp<$&=2+&%FlZ*I9bulg$vnUTfb(J{CzO;i^y44O;_&z;*_U^XL`o%;1J z0iG0$JUW{v_wehpa7|_ocs=K4MjZ31t6YYR2ElU%?zCE`UU)(M?gtMYajcLgs-?Lr zv{>?6S_ESdplMF58RlKS5fqNVBJbtd{4riENthOc6m@AqZTt)K<+X2~jJP!V#cf;u zk&RJzzqw~GJp?&$YR)k6-Wso$jkBb;xgrGFk??31naldK&TnMSGpcgX2;;~Xwd zxa`v>3@zU4_FV~Qc1#q=sZ5HZbaE9n5g83j6Is#=gb-%X`+i&CRN@$puwXElLn*3q z*+#{62`ma)(mZ7t-Y2319{hR)F(JP$uduYJ)UyC63?U!{E$JO0N<+uzHM6NMa2FR+syFi6rq7&>-}%zG51n~mTA}SfbaBnG zp-&i|*rOt)%G^HJ*i;@il6U@|7=14Bs~ZISXFPxZ`yi7LthjVkN8m5 zWzSe&aPdEL3lkiEPl4g_^7^VwYX%IDcxs2P`eKdgD(YX{7oKyEJLixzaOfVowkEF< z03sMxk)^v|y;F3(gAe;14(G1M`8Z>`Mo6y6UUw(&SqPP>uPyTK62;TAyo1KcXRDqn zm%g{i{LAi^Ve)%zgZeLem{?=FY6!=%JMPf5?IrJ0whvE6B(loPqHR7uql%m#9l5e` zEqpf8^2X8pOP8*3+z-yO>20n#IrOoEE`sSSErh{wpeb<9L0vWUjBkC$e5c(m@SQYW zQx;V)7#^5d-LOT+G2e1wVEnMU5H8Pde(C*9{rxk7mh_HLR9bEJpZ}oRP%-G9opUZ! znmf?g*j%FEp91LrQhIyYkI*fk<#Y>ZIo$$UPX7g;!ZXEGk+zTk0000jJo1#O+8s7MBd;j_qOT@OdOPD*KbO)K-jabz_xwx+BS`0sH iw9Vq*mzxCt?_p4?H%ve9qB<7nTn0~9KbLh*2~7Y<-d+X( literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VG_96_96.png b/navit/xpm/country_VG_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..5fd124844e220c85f0de96bc25acca6425eff49d GIT binary patch literal 4215 zcmV--5Qy)IP)Yb;GR>+G=gD+ETIAOL1c{cqs^mB?K@D35KjQneEIzXU=l} z7!84t%nV7Cq51rE&U@bX{hjm4`@ZMA@0=5&YyEo5s#W-wy?a|0EZFGxN09=Ow8{1A ztE~?_(3?`YX_M*x`w8NKK}z+a)ha&z_~A*}eB+!s@y<>FmQ}0rHh5Dh`<+2{tX|!@ zc5Uzel~)$m)T}fbRU;kPXjIkItgKXr8)nT)*s-ozV_(01q~oRw37~7;y1tGkP0HWC z{gDxMWHhR_Z-1nWW*e`+o_9I{Sl6tv^*M)&2a>T^0CcTe*S%pwZ|aCTO4u2n6=|xj zPS~-mT6J;S0YH|0{yAf}130IzjgX_>wsVp9tX{}^mMPn{E8(brU)#EMnO3V9u3$Qy za_iP*gY>N0+ScKUHC&L_UH9xEH#Lx>88e1$%r+WTpMCc8N_BW3JG*x`&7S?t&;t!G zq~9N{uHHC^qhaZ5Nk`?~yPFm+d@&S?4JFD*Kms_+k-uTi*Xa@;F z=;Nq#xE-Zpr@A`TN7L^fvUe-t=&*+#Mn{=$2Ym%$xE);rc5sd$^mVjz=TID78g|fM z5PBVXnbMs*8LJiPJGx}-;JktW`2EoZ3tl+vWlDGL8pP2+m0mJ-FpwYsEE`GcXrQu} zj2!^9ByCEXsiLzptxA=bUtZ~OocGX-8O1ESageept|fhE4A_E3NiZrX3B>WqlZR5C zce%LJr+as01qHOpG?WU<4^ACQ@nMJf^7}r6bC`A`BB+hP1bMvME1t~_!;4w(1kVC^{(SU}TmK%YFfrf#M zf{Y?5(jE#Ywm}l|s9>bxW}3TzC>bnBk_Z6Rovc7}jd5yk8 zO}tRU_bHpw0ECPdlwgvZD^zhF7Ai*UP0TmilsQ$?<3RwBQ00xvDN#m>1J*Jybk;@o zpooL1W|SZSXr^gNf?DDys={iX+aAmY5H%E3*z+QegJfI~8OouivqXU)q>0K!=s%jfun}ts%dt;!6^i zShS1IvR@s%b6S8RvEwlDhRd2({TbcGBml2R@@h^p4wv-5t(q?cL*hV8;3ILg1}V2p zE)m3=L379__k-z&*y|?o}w;x?rbn|pgddH4ODk}1NQ@S^7=vciP0Btmu?%1KMtV|l9WA*C9 zYY~jiR=R6fLnLeN+~-`bVA6sqAOR@r4%QHQ6U_zs{IN?d<9dSJy-WXN&$j;-32A(L zu*IM_8pyhU7z1{({&qUou1(lstk$wUd+MUvfy(aR|8?)Sef@gtnl%98ot+J{W|dOD z?b{zQnba3>uIFV=N2p8}YoYp_jD(-eSTgcja3 zo!3s+x^(~;tF?63t|LBKb@hM?gY)M<-`A0C?b?JR-sx<-{`ykVJB*GD5rHOQ@CQu_ z0ipz;Tw%&H+WdaMUay~F9?yX?Mujm%SjqE{kjOKn=b#kruxzA%*#s;b`3@WZI`LSX+=3#(9rE9 z7|c;mPr}iT9mCL$ycM!v&+$AsGc?%{-XGHgm{u}LtJMaB!IrNZuE;OqK$>R?k6r73 zW}!D8$MJA_BhguchRaTZq>f66AvsDsC~ox|H~m9d*G#Odw|0mM06oqQuh-kv)#dlI zWu{z0qMmHB?Kw_v`ds-|z$OvtJt&?Ll+;cgD^J}{f{}IvfZ>E!T62H4+uThm6Dcu& z4?&S;v$?QvoJOwHlJbZ^uh^6Oq!M}39)nV`Gk^Z`Y1v6I(vGT6`k-Wt*@Qq4 z02H8qR8r~n`kYRu%AnuV+LTR@*PQlGv;md10az^B-Md$ggq;K<>Zr;UwW)ZH zClXy}p{11Lg~I%NqtWPbdA<&^r6ggAiS1EljOK!tJ1iFM&YdeJOgJ+`8D2XHM#52| zlXNL*S`vtuP@xH3q4M7{rsB2weH2BpEE|Z0#_6&hyl7JL3NB7a(gZpv7lkDCo(;Km z>#{-YG(=U47QHw`I|*1evS`tZb#?8%Dg7ON^wILvD@+Jd&x}2BS=V#(-1k`=nkcOX zz1`Q&FpR}wQBY)D5PX8mJSq6-mEIp)9gEaGAPA&07bB-kDeT?p-*#rtetMXu1pwf3 z1+Tg0=|S32Im4z~=kKGr0aoIo!v1cB$uw=?BFb<#PDhkJ}qgQmW&EqRbe- zESKNK>SIKD^Yb&gyEkk|*rAQak`F%|mY&rgmW@6Q;$soMr>Cj9I-SZS06t2- z<+S$QW2(2jmTG(1k+7rCWFrVdsZ`2hkzJk5Ah6AE+I(2?T&=EFGNgOL-v~Nqo^>>) z8wooJe7^8Gj?T>2y1Or+!gqb<^(}URB26Sig2<6+IgayqJWQNB#C8GDy7~9Ij0Xam z3#gpL$c)N^)8A2VUrQYcX9kkFoj!`dSDnW>Qu2oUE|-g87{s|KAuysiw>{{gWad7t zCynQz@1|$<=e&;kewdXOQ+?d{tjI^616j0~tIf9AY^>KSlgR-{qEry(^T|k-z$dMz zKeTmq3lcwvyMalsq*eIawWL04tPj-UfmGK_eZKJY=})B<@odhtf*z5gC=g<>RGnp4 zC>07tfc3RHeQH7;qaq#ILbk}M#P}VWz#%TZj+W6&u4f2Nh(A2e@ya64zuUWYw45Z# zEVZV5?n1lH3}D8s+-plbe^~0aDY&NS5GJb`MxSBi14V9-72_eH(Zf($6T>hhNpc*Q zmz^6Y$d!ledry#WeIb9{k;@Sz{z=xP6W6Edx> z?AaEyz)#Bl^FWSEVq9d}UoK^G3j!cvK{G3t5jL&xS;Y8cSD~9wXca1+=V_V-VAtgU zxVFKo%_c)Ma{&=DSdb)1j3itZi0f%yNqjrQ5~TuLemov$7)Gzx8)Ovl0OYjnpW^)>xu^s% z_jEv(MbTMQ{|suiIuHnq$+pZp9rQt#qyI*VS(6qbisv9|CeC~v z6NyG5ku#HRvszyqiWkYwOjZk&`GG*HU(;l;pp!?Wu}n^rk<{?8W}aLiD$ltfxJ zCZ+P5pMWGu@`OVt)e;@y4HCDAc2qK);7sEkk4zP0v1nbc&`lHOPF);*`&QQ*KXgyd z4j+rEG_=B=YYm6P!C){L3_2VRtIqI)yTk9^*7MPAU6<=4RRwbc9%jjsRNt%1)Is`* z$IDIXx;Fp3myTBCscPdOH+5J71g(=Kx7!^I1=}1QR-?Jy*>>dg$=^2Rsma#%Ftf#B ze`LaZd+`Z%b>aK(lRTgNt;LKKWH4k^6df#NHg$T&-7)R9|2onk5JV@T1Q3zpo8P|O z;R(m{Zxq07 zrA2}OV1(+KC6DuAs*w4$S>vWDggG)qURPhAJonxdBxs%_0jPN9nVWvGW2-Y?_d&U};hVDl538>^jbvn=pmO^Gvo7TJ0YGaP zoNcvB|E1xDrw{(>hMyY*W&iw?K&-m@&YBOxix<-2_Dv0~03eER^a#_6_v`gZR$wzv z5CeZWhC>Yi(B(q09a7IL%kDS4^=jM8Kl-I!IBU(27KqhTZx1#X&z_YNZ-2bLF|1Vq zz=7isL`ZzVV7TN2o$Sn=JsGXuVt-iH;eR-H9lpLv;xwP&}a`E(uHBAS2h!0QvVXkm>QGRTU;>qTQFA8$O(CBml>Z!K! zU!FLA&?VmW&gN5ths(Sc^!qmt`_(UP*cds`a^v(V1tvXQKB$$LTy!GZd~enGy4x4t z`sh`6-H|_M`I7sJOj|27KVi7q#?!Eyal0Z^!- z$>6(Ke+-7KpZ@f^s!0rklN3p~eF~>1Z{xiig*Lg_^8VNFf3>s-h1tnorP!dK3 zC1F%h5=I3jVN_5OMg=8dR8SH|1tnorP!dK3C1F%h5=I3jVN_5O{vS22r-lf+Xm
`xQ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VI.svgz b/navit/xpm/country_VI.svgz new file mode 100644 index 0000000000000000000000000000000000000000..0ae17cf3c6d52fa26289633d01eda31103bf61ed GIT binary patch literal 9326 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VI_16_16.png b/navit/xpm/country_VI_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d62bebbda0b315b927019b3f0a3d949117d00dcd GIT binary patch literal 609 zcmV-n0-pVeP)qCdYq{r-9#vbx{D zf4+IL?f?J(EDQ_`zkdB@dgA-|o(hjx5Q|7MzmW3lyR&(I&*l^jVqjo+|N6$?_cMOH zTEoozpHb#169WSSH?PDGo-&4?H-ElrXTGoY<<&-hK_M>Iw_iTo`}DAb`?=C&t5%#{!>C++Q#%}h}-nXFBsTG!levX zFfcH%eEI#S=RqV{RzMN09oc|=9e#@sI{r&YjCbdTo{{{B3WzA>fU}5+K z4J96CWC+d?h#SeljmfX;%1lPU>4T(Iw?Eh-`8)4U%y8Ls|GKZJ};M= zxYp-CA1^(<#Uruln;;JZ1H%tV7Acv#@7{k_;b8HQmHhGb8v_Fa3j+f~sDuau1H(@t z6Rsb8hfbHpsQ!7Y{PypQ-yGHgf8TF;^j3GeXBIOP(_|wps0IjNXJwy}w)p1xMsCe+ zr7v19M81piXgB^{qRX*`jfEL|($JLF@%CJH@YYclUJDIH1||XfUB7u>$mXG>jsMud v_b*RgUoZXj^IP+^yBFSnM3!Qtd1?g!6UqKON*Nuh00000NkvXXu0mjf2BR^$ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VI_32_32.png b/navit/xpm/country_VI_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..91d00baef841bb6c48a36995b009d48e4de8c1fe GIT binary patch literal 1539 zcmV+e2K@PnP)K~zYI?Ure56lEC4|Fg4m?#%A&mSx#)Ti8}wC?H3nKyAE_nm|d6 zCMqZz#b``4iY7*l!5E1ejX^vyfd~ObA);KOc%Y^N4W*nd6uU>=UG`|ZyR*BU-JQb^ zT-vUniF`3WUuH7%KL6h{@BH8Qc?rWXa5=+tS=Ijs{4+o_uswKSam=@VD3|`L(ZR0O z(Kh=)-zOJQOb$f+M^^^g@5<+g{sb^gPF7hb$%~Sm<9j=vlT+d0nbEyUaOuEcl1P47 zQaTja+tap4JvpIFd2A?km|-{o=JT&9iZe`1d_YkOF+p3dop?RMEL7hP z1y#jh+Qipvv^(4-045XZu6v5%B+&w;fN%@|1Rf?rdFQov!#y9__|%G3uH(nE9QH>~ zpI*0W3qe5O0U!`YGL6bHVC`3rt!q86NsQbo`uv^hug#K>4Mj0|JXDSN{>0Psp2^gZ zF-0Q+RIN~qdB{XqbJU8|_SL7H%UEPj&6IbUuS_u&azRb2lK}KZz_W-I zZgtPtL^J#&?MEKi*LeZZ;Bim0i8-24S+>z8*1Mda9sj22-Jqhv9|21hJp8VbzN84X z#sMc*lkw9YCALLtW6tvx?3q^biI+MPxbW#`+Xk--+5zUdv?$4 zgWbW3^6ZvYDcvD_|c z@s4=bCQ2HJp?seBqjAn$<_PRDId?ddYm$W9rrlk^kE0~=r|$2)GhSt@H=4y3Sjl0f z>AJ3pMbdG_5aY3`PQKouhK9>ZVAKU9wvpm6esJGoiQ|@ke^y z)eENHyi+msVSdXfipk}k*u2^hs=e|+Up%(P?!MJ?*8T+XX8?fNR!fs`c71b2q1rMb zRUA0_TPJ{Yd|w_f4;eafE{^~a<_F!jO}eg?+pLsYobGZp$^Ca$x`ut|1pt%FnzPw6 z_boH$OQfSmIlB4hPXVaW=iL>Ng!jV6mDg0^>Y#->kqW+hEE*5x)ts(vyKb()vH;@Y zNIVccTT02E+@DT7{Pw*a+E2Cgl~=i{?ijt%J*F(6e%ANm%KEFWCoTMs9bdP+)XK!~ z4kp~2rR}T2iOyS^%Xn_2ROyDpGnPzIE+@UJ)^@vhk4lV@*`+Rzkeso%f6#w0{Ijbi z#FgC?k*8NV2f5zIpB=51R0lvVTefWEQ_4&=)HEg%@!LmbQ;ItM#v@i|bF8D;Duuc; z`>4?!<6OafK09vq=UaR2jnsz8qv|DBQ%OMSDLNnV$dQ%bt!SP7U|pFb^h>>_X*Lmq zDUc*Iy6L^L_tykY&mwzvw=AX^OG$-G^kk=d$`h@xy|VL#Uz2j4oWnA(aIgw6lgNql zj`oEW$#F<%_$&2G0|3}X$C9~^*)5K$X>Wqy2?8twgK3yL?a>KU6(ERu;$rE4>r`>e z%z0x+d+n}Sv}bui3Urb+++002ovPDHLkV1hgZ^u_=H literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VI_48_48.png b/navit/xpm/country_VI_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..fbb7384bd89049b0e662c1c0b9a4f793620a6c9b GIT binary patch literal 2858 zcmV+_3)S?AP)(y_xsk>}xWaWG0hsvXX?5kc5yRAWN*Mh~R?Q zBh(hPr!7=_j*7Gud#JWbkJe+wrBbCTE=7TY#~_@rWM~wWS7yG6n$HYtdTwuDP1Swt{Vi@ucKpp^Jt0+hB|vda*?8Q zXtBq9Wq;kpo1#;kAYZ-L=EcNke30maNJ)BIYTq%PdH2j=s{SCiM@`j^6_ z3PV2vK>+AC!D55MjeZldQ<0wqiA1i++&ZCVYC!}+EWB;sx!woAYDQ}}6jCH;AQMB# z2LN3x>`tf^X8Z7ous!1)A&Bv@B2H6Z{Ua`?E&R%3Dgf|lkX!)JszFi6%Yes+mP@E_ zCz-fo32Cb)NB_pc7@M?aUM5kL1F;ZR2QGGA?Gg$Az<8w(z~%O%iomO3e$)z?$QdnX zL}D3$)|OT_Xa^wpdPQ~jVbp@IE70pOHv?j2u|9o%WICq#A8M}oGc)v(OlT&6Q7fWl zNJ$v)^7^>qB8H7Dl3 z;UO%GW7U|SjbSsKZaCTE^aU?z5+ir+bb0wzJ+fDqy$_(LcV?5lZ)ba>th-KxI7rOAQ*%?8V+v^l~xm_O1?hg z_>{eVrdodZWb!9R0)fEgA(Qsg3i+YR{TG|EN_N(oUT*9Xb@sqyhRF;77NF}DMmp!J8UQ>MxO@QM@EXrIaHMyH>4r9pTHtWwf?)|0dpN9S`|;C@DrhiXoF+RNHD@nZkRcJFwh;j0qU`pI=>+SaCbeP6 z*pC#!R{-=6gXDsy;N#zyTDG@(czjysC+g11V^TDlNI?LKg**ezH(9KGW^)%USRfiN z9S6JjRU2)R|c0FItTb}G*GK2n80yneCe zJxNTip5dFij zIj|(%vZ!?K16<#Vl_mEJ*p*B2H%hsy7tYzF;NDr3{$PT9X|8%%N$^4o=4D}ERN_zC ze87XJoS}HHOCPHa2PGywBLywgX`>w0PEVlG<4!PC4_;l{b;PSKeLqz0{Mi|$y1w!7xOqLOO)MkDt%w)&s zQ36s=WLrWb7PooSIub2c6_vkb88hW_-t8M6`i2C74TZ+M9;xuN(wkOM6n*dUGpr=$ zl7~?+-nZqk32bOhdI~T_imy33iUhPt6&s?cV!`-|zN6$W5NwC9Q6W{F7_4aRZ4UDa zr8+6Cw6Entq`zM>rPFn09r8gqR(Y3qOeu>=8@?Fd{h&aAeK zc856wLB|mLTYnWkn$CL|BTLxr_EG`$qDHAzD#Mo7 zpIg@ms_N=yJYJL4+Sxx4X1HAL!^^j zlDv013}9`~N5$XL<#0hDd}B@uO|l~$U+O)bk-tEP`N zD?ut{43FZm45xs+Nl&p4r?lUa(Ik?@IN4%B{Ig>tU7WyK-=g-K+QX)R^+em7$wl7o zrhmrjN`uNj@`Y*v?M-xU*k<1GyRro{#=?yMLt!v}X6*~*2w`1rGcq&~pCWy4u0&p}f~tBm)@iJu5<$!ws53Yz!++VMr2zAh=w{YkJ)uzhqm@h26vV zEwHEW5Fgf&+!?|E__mh~*@YYL+Sp{};;o~v0-z{~*+#K|T#C#Tq$WVEL@)%Y2&OUq zrmFhC^^dx<=T)lK4(mS>iIv~KAOK>qY{%+dyK7$j;OO4yxVbF9gr-1|5b_bNfZGd& z6k}HI0DncF+btwXcsvjYhWXN2`u{H1G3oIcn@b*h`paMU4ql1YZwZD-i3k8lEWEG% zc^g0zK?QtnD3ttxz6BcfEIoh63oC*kZe4hLxSdhF(;8Y4Zu^52rQ5BH$p+xEm=g#3 z;IQS$WkNpx8-0B*f+j;Gj*g%A<`}!)?1=Ix_GIVZ9p?YEq-?!RaQlccSMY7-VK&z} zvw_#^9_;V9o_BdX)m@in?`Kwp@&Ab%{?hXY$B%+$!VM?re`wrb&7eH1>i_@%07*qo IM6N<$f--q{UH||9 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VI_8_8.png b/navit/xpm/country_VI_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..fbd79a7cbb69c8a5951d4c35d653def7fef5c27b GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}~{o-U3d z95a*u{QqyyY*vq6mrMUtNsf%z8S(GlzvG#oU;gxBQ>zm*D~rqf_I`h!WR6YP z$q%0wPfayf|IO?8_p{FI_`UnT8=m=a_-y;}e>J}pRkVJ*Uj8@#%C)OLeDdw!P}Y0S#84j=l<@N!=R2Uo89ZJ6T-G@yGywn(VsXg; literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VI_96_96.png b/navit/xpm/country_VI_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..8d728d061c6396ce79575e62bf9ac22859bd21ca GIT binary patch literal 7837 zcmaKxRaDgtu*Ls$r-$wkkdUrJcS%Y&NQZQHNq2Wii5wc~5a|YK4shrW>Av56zw549 zGkeYZJk0*>Xf+i%EOb(I006KQTo{wH1tuyvvEYDq_*cg^SBo3cV@ddzQ*k~H7=zFiue$R z^Y5)42=e%ZXMy|~F}n{WVZ|YnMDqWy&%3Dju>+2dj&F-)#34SRc0WdAAjS`FowS)# z0Ve*!imv@{f2Pm~Ecf5S$s=brHdg271+`T^8D52iyryjQ2N*@jc=VYLth9bFpD>t$ zIlo5HE@=) z(;vc=*j>ahe9wL2cpda0X_4NF#*3ysd5Cf56F0Q2tgVL>8uGd4dzrMRcY7Ra?cZ@_ z<7`1aJ(jLdE;7dD&tt$6>aJ8Un)d z%G^<*L0Nv)r1zzi;tovaQtIl7CJB8r*jH8u2E@TgMD}x|*!e8g!oRAOvnYwXXj}$= z8`O&1+q=c?x%nL(9~L+JEG7}7`&E#JM|xy`)!1GCT}3Il@A6=dHd&XYn?j~8wrO2 z2Oc-ZrI|cB8JJ#)$TJ7B@ZxuDk@3>ghL--0uNJi|w6hE?mdj+=HeERLq1v5F29hwL zWAkNYTHt=y*#6WlmB}{nFXl~NS$@NGDB*d%G%qK|iagjxEWnw|^M=Zn=(2`7yoMH+NZ?U_znA)9rF zveCJWsJ+wE(c--bOBw^bspoUZ!8@>xGTm(TN6C)b)mJfH1pVjat zp*r_&sdX=s7_hgu-w3{!$M}>8A6)Kfkq0LuQ4>;uVJ-#R#x5pay*1Z{|NV@$B3BBh z5K3J~-&R`r7?C1*Y#XgKXjQCHg*pPO|2GS^j?oe{?)x!{;m1O0lCB|E5ULwfntkCe z^9dDby4%zzpy#UmTlcH)=wY*=c!BztUxtFGbF2tzuzrnbqmYM!d3SPWJ(dgsHEQMj zrYkN<_)p34IEko2V+rct$yeSsZGq;GBJ2+9k0tf?m$8g3h8w8D!*DAd&wZ6~KHQ#^5k;uv#`&jU5RerqTF&27aE{*tmVO08z2!ms2sqTO#nP%Hu z_xH0?f9dQe`?W3HIT~uFS$68Hp||BD#b*PiZ?!1+bXcs(vi4xwT%;9cUN9D>R!A~@ z>VPB3HIG7)VbZU+A!VL#1J9ODOG{wlaD_(q6JXlrQzL?@!_zNMnsZXtRvTQ$_2=UrM+D3d+8Q0x0Qp8=J}tQ2U|gjX;FaYbM1iW6i#hTlbregY<70g2=MmB1FC& zECG7&RhnqhnygmMDKZ;be@_2+U$<3UkHyM>Pn*PL2b&vAl)vL}%#zz~L4y~+%!r{E z%n%L`$;SNtX>OklR0!Tf-~b~g#^8E=k0^~tZ@pLbqji3{SjC$(Lm2m23}G!=jx*qJ48?UZeV!wYd7D~^ zl9{ZC;!9kop&UWN^@Hb-0?uOHv8APcjVJUS%29`${=b{4rOC!;K7ZlWpl-KgWfbkC zn>$_tJ)lYd^syPIRY2}FFS+8otS%1EJi(DcA1^QO4c1mgqZ<*#|4N(LkE}5ZFD4d! zihO0~+}nu1zfP~N5ji({&{Om8wn-2|su``e9}Y{;-B_eCxV8?v`Alekn4s(CObkE2 zz}A-N>&t9O+mKHZNm*S2JW#Vz{`Q@&U_aeeQ6SNd;aj0vGML4a6z}((E%ZKfb zu`K|Sc{iUlD#|vb)K50Asu{YN(MT&r4@(e}K~fydICaHa%bT7>BYbzu=j;+(L(rt3 zSM6sH8}<6ym4J*`HE#!oHfg2E(<_#_HvJhLRji(;ybpxE*b>E)mOA0G>SQ%OI#lZ{ zV7MK8X(ldbtvc1|D5mI-;2uO`MDbqLsp(fELfz?o^pvz>k}ty=nH|I-Ab-RHvgGW3 zUXZ!_%t~k%AhNjyqyR{UOu=1P{&J3qelnuAvHQR#4!Tp9|8^+#y+2;C-qqO@_#(O1 z;LurK4rg)~)>pQP0axUN+ZA>|?wmGbRZ;uw%p#wc<-ZP!}GG3GvjETythER&)NUYA31Yvr%Nc1q=PA zJswA)(AF}avgehpV$ELgt30M-FCm*mw$j1N>J~|SP6wZ8S4@C)iao3gYt&9$of@rG zpeSHk$Yq4Yq{p-rMB34j8f)JU?F5$GoA<-L!=Ff=$l^}_a9`~sH}f3?8YGYkx`Rc= zCC{VfLD+Ft`}=YE+S+`@BO3(s-~N1~{YdTtb8eB7B9kr!2PS1!ayoeg+>$FnvTw%N zeosi`csT^ZMl4I0XY6MFCWt%z)C+FLa5;w`Za!PDH@SaAdhYwHca{#?uv+|LM1!;E9xl8z|NYZkzi_9t1L}SgKhV^lrMJo~*=GQr3gB0tsTMa2M zhr^!aQ_@B)3|t|PvZ@EQq$mu8F>|awYE?iKRQSsN29hy`70+eO5B%&da1Sb+dGrX- za?SQ%oIe+Xz9wr|H(v$Rcg_%sE3=qcE1ihIWy2oO!>r7AT~SQu2uj~HKwOjJO8EYq zX7)%SS!K;@@+tJe)(Lq`amwfx*}7TTr=twM)16sNncGC|0b$~$^HCOH79$$1U^Jju zqqrir4^B+CLP)VPlrD0~+zN zW3aj`%)ulz2bhSYdjLzfSa2r)?~#N@hW>Q3Y>QK##>`!$&0IGk&o-1$YIwbOr`3aB zMx}AgIf#?_YurjDO`@3FUgdaJTPbXc;7n(AB?o&UjjM3<6*c<5V2wq+xG}$-_Af`b zD=C^KVy}qKOsj&P?<1&8g8WgGy28pP1)g^ctk0ja%ht~A{RD&Vl6Mt4vSXyU!`S!F zMR`Ov0V&TwTYu#nCq`OBY|gSaCoygHi>nTcsW0~5`)#%P&BqXYo&2S}@ArtX3G^an z4A=hsuwT!RbhMQrx_AeLGEmzHXRXJ|)Zb{At5;F&r}MM9Un?VAPcAy02{&~?iuoql z&_G%4gbLH1(4__FYT0KsuGtnUb2j;JjUwh!mp8SKe-4G?Nz*PrjI)XN(9YON;7(w| zetLJkU-iOY|9asmB}v~xRiacGp0K_S1;wf{6)<;-Zti0Ay45i*Ee>h^u!=FuDH_g& zewQeQpI%wk8)}3TSET=t;Mq=1^X1~^NcnI>#U5fqV~Gh?U_@;&SbH#-3_0sQqnViw z-K|AN7C4@~K|z#P`ZE9zWN|AQK}g`8SIN~ufMO|@`fa~Qx#+>upDh)FaLl!|50UY81OtIKrwYrXTl)2ca zs6HzDy;c-lol)Uxps?M(3st^O))-wu5TY1)_{win_}^?_vu>o~;1%qae&Bd*Ui!gK z+;LaP(dyK#{7}8`=2^%-t`yq^tn>{5##F z&LKPIE6DsuSc5d71Dk@zTm>Fu>`w0~CZ~Bgm0~Fz>Tm62zI;>84;Xy&3s_}2{7yHC zoR_i8xj8t0n-GFEB`YMv@*`tf0eSZgUIE}SioPyHSC-S zF8E`50qzA7B@K&Az6}4UDyHYD3kGpi!KF*k9HLLcKr7;Vq2*Nn=!_v2TU*C#G~~^t z^}O!sU_Wra@rpW=6-Jmt|2x4CPXw#&!&U_ZUb{_C>+5f$%ULY_+ngVKIDzbw?y#qx zovV(|dw~Yfm6M_N!{bpwr&TCmAH9|I3Ufr&i zDQb}#z7uqTX5OfzyS>XKO9Osp;K^(IHek^>wLe-f152$D}qC3d54{%-p_ zxPsi{+#ic>ReUT#>Zt6ZPC1Bbgy=~cWH zCo2s-V4|q54a>~*v+b*a)^OK-1_9~%&}nDZ>5cg)ikK40t2@^G{NALI(2x0AsXRG` z3zeF89mg+8Kl@&>LPWRszvNU$=iUByt4d#F{WK|v-DP9!!7PY>Cc5vHUn5DngqpZ? z8)}A*j;D=oAeoCJD=RB#uKdA}YY^~kob@urwg?j0NKmKQV`SX_4={*yQeEF9b+lDr zd+u&@(EntTtKi7oNX2zH!RLyNMvZ~F6wR}fv_dH`Btr*}P6WHE+uQ7t4?^6l)1zk} zfJfHVU8o&nYcyE7H3qJUM++HT5cE%Cq<(|@nl`3AJyxSV-QCg+QcB^Fl`aXJ*3EaV zN=X_4f7fVM?bT4a&0cxTiLz}9F|M4qr})IPl#jy+T$R$EtmJs~NR>(I$i0hH_0+z_ zT3B3Nx>0y-v>^}hWcAxSj$Id;ZQA$MT3%v;V)dYZ)0CpU9&rPuRq^IRdg4y6Kw72g z1LL;o!_i78V?S`g0!;@z4@Au$Y%bd9+{xrm3Puc#= z#SJZ-P5p=FF6%%NEeXZx3++1VxBjud?cQ}{_{6~GOTDHKxQM~V@w2>;%o5X)ex*d( zrP7MB9ldnBKZojSTJu{+@5{K+YBDyay?J>&B?1O=#|Q_&LSGZOPuV_0n`pLA#TaN0 zG;NpPGrqL_p-Gurfqv0AJK)_ua#E9(4X^An@zW=>E8tqicbbNcyW}oPB6&nSGX4T&-G9-MDqZJB9G$a?W=w)OnurRD9=(^lhB=$eWfn_~5Aj=z$s) z7qL^XP?xVqtj9&p!g66Oc3)Mo%)Pbxn7y?4zX#L*Dw@n=F(oBsC;TLBC-@uWnG7q| zACCa@BN^~Vm6{oMOoOrCDx82X`T2g6nvMgM*oo+B{8g_;XvLeT-9ujK&+gh zVRgCc(U;BGALQEX!M|S6yom&WWb%bxLyBJb?Un4leo8)jjhFuR%wQbv(_;IlM&N#a_>j(Ism#4dk z;UTIRN;)tdt!5=FwL3VTGE{4%D&Pi}>P3oyyVGSFHrmeVs2FS8G2pa?VeBOw90I66!W*e}VyziT_Y0f>Ql4lP?M$9%_uFG+(Du+esKv$P zQ(oU`Zpt%4$o10?Qap+{ma@$TvjHh(Zhf$s69S_jCK?{uf1!W|34W<_J@8@9=JaPO zYz70sym*ML-Jv)k5w4zYjmj0hS)v>~Od3T~=^a@Lm)Qm#wOpczVlXPquAfIVfLApu zhMBGVCdUR9b zQnQbuN%o!}86VA(-m&^3i%uYhfDl0OT9qv|RjYsZoKJz95GnTD53i!4GKata<_EPl z96hQT-;ae5B_KYC@-VfW5s8;d)UoS#h^uebZJJ^Lo(r3GeHKOaSf7w-;nn95yT|*v zucPI#DOlnZ!!_YQ65V3kI3eZ3nR2*Ze$RYUef%eB;rw?n$r?o~kXK#a zfXgogFS)ylWv=MeKX1*)+huFwwn6L~TM`1##!knQOlsb^o*2`6HWf;(i!k z*MW<(bL_jq@I(t@Snafg! zucgXr!PKZ8bP2qArG@93ItbJ|PP3&Ivg$9&I=iV{6(Q}P#}Gg}OvFkEl=Kj_c+vy~ z!~Hgiqy}!WCmmzhGRJOI!Oi+RI&#KY^Vw{Qv*} literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VN.svgz b/navit/xpm/country_VN.svgz new file mode 100644 index 0000000000000000000000000000000000000000..9b6490d5fc8d382a95cffce11759e629eef2cfb7 GIT binary patch literal 442 zcmV;r0Y&~FiwFosD0)Z&17mM>Zgg^aUsg^ob9QF{m6B0w+b|Hv-wXW?x7$ktwxvt6 zG!AhKb<#2zTVZL(o{DEHwx}uvS&h?gKiQ7A!n%h%Sts4^cYg^luJ+FgcEZ-u=maU^ z2twzkkh)Cpeti?p@appPWbtA7EnWY-TS2`m;qLzW%jXm@WbDUz%Gh$fgzpcxKoK#v z`ig*+bK5y%P18ipd1P$KZf&-$WL`7h$l68^F)t&E3Rhq|qgDGjx=!BV$DH%FAN!X1 zUP=A*UL(bE%(_!NJ!xd&ssv-seNhQnRxZJ5SM8)|uFXC{4jgC(G;Txq7*^yCHd3hs zKc*|9@f1N830hG+{>t*F(wY}tAROE@Lm1570j#%_9rG%bGRuF{FS7bivC0`;VYY{uVxr ky%_iGaa1^9$3Qfh91n$msQzw?_W!&54Gud#$TI@~0K19MTmS$7 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VN_16_16.png b/navit/xpm/country_VN_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..e5927ade7995fded7b848eeb76cfd4a60995493c GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_4JY5_^ zG$yW{WXpBPL7?@1&Y`vm5fM=lH*Wl3{ukr>fz2#T?y%bht8jrgZ(UrR6nd3T?n+i% z5gD%fAms4A?}mGBE-c;JX{744)1K)GgP)|ri&YEOu9=iw%Uj*mc=_0(Ta5clTc6z* zPVv2dJbiBPjX(ye%aaQ#%|C8_Y#gBITqcmIqJ4Od%H$`f6#SKczA|HEI2m-T`2D@( z#rlz+hZAlJ*-BN3=PqpC=Ore`a>$YI$9{%GsjuIp+co_1Xl{74?Zgh%BF2Mr1Q{mr r_{RKkC}vun-esM3Wq#j#@4F12b?hE-9eR-q^e2O-tDnm{r-UW|U)Xxe literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VN_32_32.png b/navit/xpm/country_VN_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..964dd0a874f4cd741a21a9e1bcef33d0c3016758 GIT binary patch literal 491 zcmVvpdrFL+u*hz<0M>qXX+?0Y&I*NaT zgMWhl53ag&X$J+2lnAAMX3T_Xuh%u0fWeWm z_s7d`INQFo>i zaS{bx%{j1yKhsq)M9!fVQ#}Cy0K+zR>XsZ%tL`JGZVuZxzCyCe{sZouSP=1*!_%qh z-zUFvrB~!Oh})W|M7|+YYYHBZgQ^|1_0!iguU}ct88$WOUzZe0j)BxNnXwiAOHkBpB20op<7Bf zPylGaUDP?YBnvxEGSoS;n2S`h<3`0eh%Ge(f?l+r^`hV&;)8_go$LYYBj``r4|+=S h{;|J`IpALcz5yP1hlqz{=ZydW002ovPDHLkV1kZc(>(wH literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VN_48_48.png b/navit/xpm/country_VN_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..fc64a89cd3f01fe03411ed404067d26d83d9461a GIT binary patch literal 669 zcmV;O0%HA%P)7M(?Ar4&+*tew#P+Kb-_)Di&B-)O{EG}ybe34aMY^% z?vQw$?s)(t%7!kINgJ`K3aO$dQ5?^O1!)mgf<5C=sF45F*s{-jo^zG))2%vOCprHb z;HoO1JXJt>s(|uj2gtuC{JX-6DLX*%%PfAut(dX{6h4>Xx}6hptyl@33Q$%o*#JVK zZrl;S7D`}AYZhEqdm_;Vbisct%UiPm6s}FfIa;$2Mpl5t#lk|O*#K%xfr7?0I3cp6 z{QFam+5&Q48?8>apE$YDDa+So!egE<@YM8ssaD?@irMEH-p#Dei+xq|jNF;B*$^gJyk=|{Y^%j`+!G*tupWW_W zq$DT_-Mwgd;9hxPK|pka13=m$o!v-IrZ?pTI=j)hO+Z1sVdynOpry?$`|h-wRE++p zjbe!Hgl0b+x~bDqO9G(-;6nQiMM>l@ERP9)cNy&=Fk7h6CW7GfE^K^j`;S Q0Ig#1boFyt=akR{04*Fp;{X5v literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VN_96_96.png b/navit/xpm/country_VN_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..e70fc869b61d25622feea1b8ac9a821f4473446f GIT binary patch literal 1321 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlIT?s>X6 zhE&XXJNs+tT9KGZ1l;QzxL%vo0hv`#Gya^=!u&ui?; zUijZZl`Ckem+hCPpgxm-3;LdF1PU$RD1H3i%!dJwH@utm@%p)*Q@`ixxW}FUx9Rh} zJ(bCSe!pR2VoQE0*YL7Ifm6YQiDME&lL{VYQ)JT~%V()G-vzoDcn3Ut?DuSOz;_L$ z8LAo;^Vz-AY#saFF}f&Nwza%-bTRZ0*w#8bRX?7it(1Rxw`1^`^M!8|-YDeHdo6dG zlZ}(>)7=j~pV?X!7qe`vkCT{k!bfP!4N(`dhn!Wc)ovBbcgOuPK67q{P@9jS$Qg5-_!Lb{lDIGxl0h}y0r5yUOdmIe0bKw z;q1o2b?&&2hI1H@rBo=W{>}HRgrdf_Z3Ze6Uy7&fJYg@beBylJ=}`MQbzitYi95YH zlEakf{)79MywcyMjF^^p|4ud-EQt@u;i~TB4Aq|ZOEWy(?M(gkg3U1oEp0a>wyZc1 z_Q!7ZgBj-S5&E|dZ3DPX#cLPMy%Vl7`{=CK=bmY~a)!>8$z6BpS=FYwtB+i+`Rll<$aqGb zb-;pCXBYfaFn#;_+u|hIE%o>B?t1J0eO9#nkKf-zLzKG2x^9>MnY;VmmUY`cZ{Gg* z@|0eFr@LOewz++K=ligJU-|j9wf<`R&rQ(KF=bhGkBd*vPsEf@ZrQ5sLLC{+fl=L@ zeOl%jpHI%HT>kUO$~z03-ukV1l{9sG;7_ewTiME|MPHW3?wj>ym6jOqRh#O@Ztcu_ zQV*5?a7?%J-YhO9C0n)4`jC~_T)}tK$^#;F^_4?v@pD&`ttU-5rS>jeyqbH7qd=M9$zGfI6OnDDC5 z1Q^-}Kel9tz2thk)geN7 z`nn5cZ>Mfd&a;$Y1jbNT0 zmXQN3}LqJFjhu-6wXFS*dba%?YlL=L=?+EnbuG z<7R1P`0AbSY6mD@;CS;FA zX1I4j$R3x%NA6;N9#1&#y>9szysnKIZ%Ki(DEVMso>t9p>%mtsVA;pu>FVdQ&MBb@ E0N~MI0{{R3 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VU.svgz b/navit/xpm/country_VU.svgz new file mode 100644 index 0000000000000000000000000000000000000000..a5c02df50e657204764f37993083504f9b0ea935 GIT binary patch literal 3061 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 D8_f)$ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VU_16_16.png b/navit/xpm/country_VU_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..315ee4b26eec3d6f2abd50035b82b9e47209bbfa GIT binary patch literal 432 zcmV;h0Z;ykP)@56iWm}zPaYaJ{a z70Zog=L+e9QfU4nS0|9-^{22 z9c}DzKP{CN@w0MvD^USQtDrn?9@QJTj3}Fo3Kj4s{#&vPQvDYOK&PEeZW=~{Um8J4 z#IbdP%e)!AW~gmq00=x>PC`iKU>P&(Ov>lNfUQ~s2cRUO-C7Ax!XM$pF%MiVRR{e6 z^Aqs7;g4y40$$h*HPQf>jSwUWv5O{Uwhty+I}Lz)&Eha^!GaqCshbACV9<{796UXqiead0G;7w1&BAJHYi{WuEuA)J>yL7mDd*4BWtvSLtC$Q2q62lE)p^`;SHb=2 z4;Uw8Yj=Ek_W9@Y`8?0_`hGvp``IJb86IplW=l+!$v;H`9pS(dokcIEgd){ca3Snp z8@TF@4o?L@?*0ZLa9$1{58W+OOjb#!F~F9=>-A)3;QS%lHsr~dQ)bJmmH^lH{Q5gB zjg;GQeiu6&^qPfIqD<2a0JL{;=?a_cSotKba~v7)`D5VLYHzli$}&hFvaCpZ%ts1IDdGihnb_ihINWl2AOWwu#`%_@G}Z(6^?Fm|=5827i_K0#>#fKfw;A7%CQ z^uzp2>gS@k*C}5^Pd_+vX(*n2c0d{t%>MUqo@VJrJOM#%Ax|YN$Nw_% zX$ws&wGqty0YevQ`hb0hAzfwTJZz~NW(Pz~1;;Nyj)@I+%!dDuNE85Ix6)9Ae&T%A k2=G`ItL7kSRMUUiKa{l*DSqwe_5c6?07*qoM6N<$f+yk6*#H0l literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VU_48_48.png b/navit/xpm/country_VU_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..53120a18bede6efb184147ae86ea32ace8544b4d GIT binary patch literal 1511 zcmVgQ)L{-@$b2G-P+o9i@Pv(0d^m-5eCX8un`q-160%? zPEd$kM7iiRf+p$`h6V)$ylaHSxGj^&ZAdlVV1Obplrg}K0Rn0a;ON$^EA2VQ7n`Z9 zMNRC5|C^Jh&(rgHo^yWZ@>H0uk6#p#D001&bXc(;aodY^mN4PEP)Wc!)miVhjn!F9 zf)r{GVqOM7v*IYTA3v^ih1!F3W(Te3INC~=rhe+Wlr9+tNa3LbEnmPrw;~99a|jpO zXRfwLK^`g_Lk7wj#E?{qN01ncbsvh#9=EMsa~J9&g^++YeL-706AQ`DX4Fu&?ZSD5 zMy0b^=_=M)WFgop3D|#>W2c#1L}m(;#;~Ivo1N2Y_ineXNEaF8=y@ifFpn*(iHYL3 zi%eO~WX=YHptub5E4fCS3!py?DpouN}xcDOEONQRVPMenM^ z(bi6tm4aN-lezD9YO0Vk6e%M`y3nR73c%@K zsH>-R3`ud6-9cju&1dP*lseZRS&|_+0MYY21BoKIN7ln;z1~>G10V=eUtN*TLw*Tsa{|jENFP4v{+cMQwW3d@q_|w^=J*8w=yi#&l0(3V>Sst zol#VkE{7VS32ucSo89-^7A6R2THijOeao2H)U6{aj(r@MG_sMBV;wN7?yPZra(kI3X znnt(Nho+}Ajh+npw|YT)54#g%MV(G){#gY~1}!Z~YHQb&YwU7F4%=R%-;LP2sCbvd zC;Sa^IJFnva(uYlxV~DBGzphG)QPv~4m2q~``lT~N0k^OIP)u$7Sq(~H;o4byjk0Q z@v=IjRR4XG+Yl~9=!NHFEB@ zojm86Bw6CkWz3lhP;F(_i#U6(n(0xDOG5I`cn}pnrR4_#dF2s@{2}e3j?5Iys)Ybqr0zBfEDD1WD4!*VFi<{A$jjizW&onYc{Gm% zAMav81@&%|&CJgwQXf(b^n!9@m^GNN(Erf^2#oH}v`oa1tdjevKLN@q3IQ+LCj9^a N002ovPDHLkV1l!J(boU~ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VU_8_8.png b/navit/xpm/country_VU_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..8794f20745ac801e06a658f82faf6dc97cfa148d GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}dPZ!4! zj+x0i(*%3}DxE*lz&E4r=AL;v<$q8A-=86LCj7mTR>uE*dcVT{?Ns1bHjZgJdU8(d z%+`;OF2`@WI6YtX@q?C=8}C&AIe%=zQ+sA+W#PlRg=uVMD_E43m7Uj!KMr>5+Z%R_ z=g%9C#X-#yeYL_n9xXe6;8;)6Pw&)D>v>f?IxqOx7`6l}`)%+1qX~2ogQu&X%Q~lo FCIFm*RPg`+ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_VU_96_96.png b/navit/xpm/country_VU_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..45a7f1589323faa260cdc4da9f5d6b902a8098a6 GIT binary patch literal 3459 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_WF.svgz b/navit/xpm/country_WF.svgz new file mode 100644 index 0000000000000000000000000000000000000000..5a0558f3ffeba42f1a60526421e2d5b4c3cbd4bf GIT binary patch literal 273 zcmV+s0q*`EiwFotD0)Z&17mM>Zgg^aUspyhb9QF{b&pYN!Y~wtpVwcJ-94L|v?5cQ z%GRn3h7+caJ(f0Y0$nOiX7%4MeH*KLyzqVJ+!HS^Uky3S&g#|(;FJN8rf5rTY60J_ znmhurE;nV~v_=ZJN(;**i0`wvbpN?q5qqx5?(qEjk`kC8encr^w$I4>aYH!eh^s9S zP|lqeh<)GFKB8?`QmDk1(taQ^X9vBPRd=24m)78&qol`;+0BOfBKmY&$ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_WF_48_48.png b/navit/xpm/country_WF_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..9e58d71e8caa5c581447351d90319a0061ac6a9d GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@He#gTe~DWM4f#GpQ# literal 0 HcmV?d00001 diff --git a/navit/xpm/country_WF_8_8.png b/navit/xpm/country_WF_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0d7704f2c7883e60aa96b1a6b724a15a82810d GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_bePZ!4! zj+x0R0W;1YI3Vz9>4vOT%*@P(&mTHwznjmss+CCw` qKtn==hl`E1xykY1fZgg^aUsqEub9QF{%~soP<2Dd|&sPY{ON&|*DT%tR z<$b6Tps&pq1&ROxP0_XxS#&8nw)g8hly$Kkr@QE)KokVf%$ymXGczJQ{e0L|&a2c- zsp=e2OpqgMp^CCz<>-$u4{m~-#_+n}m8xZqYK1<}?xxM_>dtW-NUoc#5II^Kv&}qj zyVDg`dgT?ula<`a+B6=;)I%d&jPSi&U@aT9(?YgsLYyOYu^gfMJ>CZ`h^A@k5#RHD z7Z7f9tPMZ7b#s4~3IuPZ`h*Yl*~0$-?;ZHWehGOJ*V1_NFY_Vj5?q+# ztV~(IG=gvC#i_lsJ-g-`*=)Ixjo16z{C!!Nb&irKY|XVSS8J1_Fz{QuEOG>lX~2Tk z?ipmmYzgk6UD@+c$S}RkE0nNQa`aH~)w5bYKk|*@xbMn2ZowPC{hB?^mDsf-cVJgSwq^eJ#_G)85Edqq~QfO+!i~D z?>#h#NQ(g!Y)AI{{NZGQEkyRG(l4C}j|K1roRT9n8{E@EWH8SSH?wlXSJJM+FEGEU zHwG@i=D3w((No!et#5uBh1irf$$KOz?`wrW;e_z&x+PnQSrBQ-zBf9OQenPGhTOi-8IiPan-wG<&W>9O_ ztWRDjT}V9y=v6?dO6eTkNA1&vY^gr5Y#%f#w<~yk_E)7gKnc@0N@G8`4vPZ>(+EQ} zdBa;AZ7{$jVG(_&Cy-Cx3EAwoHFsLW$Kh7|DE0WYcC*q_m{USyjuouU5;h~d7m`vx z`eY5a>sLlUHAbr!nbmM5ckg5HtSed;4%d=*uB$8L?Ii-Y)Tqf0>>K0=@fY#(KayKi zJL&wr=$xVM;Zh#{ecWS$LKM63K#4%V& z5PclE?EjjsUFIPCXwzlE56h(t$1zQVR_9cER7XWjTUm@G zgGjR=)=xjyPmd}VuwWJ4apVqFOvhpY3p3N7zyJ20xCh~?D~Q~D@P-l#P=bh!mD$r) zm4h8>tGF=Fik=X0VIHbkz{ABht=3yY1Zv{Tw_lE3c>MD17phtC?&J44YtKD<^%*Xb z*S4J!)6p$pU|?vRcHr0VzYGiv+?;GiT9SYN{iCu4aKORN;%cc(q3QT6`0(jR?}B5r zvOtiJlb4(A&tFQz2fGE#OiZaEMyVmj%uG1_M?AoilmGtvrz|V<|Nno=V;H*y3=9mX zuRQ&ar6i@E1&cOaq>k|n428@bEf}?c_7(sDtXNG!t8gE9 P00000NkvXXu0mjfx7el( literal 0 HcmV?d00001 diff --git a/navit/xpm/country_WS_48_48.png b/navit/xpm/country_WS_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..483061fffeedecb3c45950d400068fca436c48ad GIT binary patch literal 547 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HjcoG5eP>{g$K zm{*`jMA$#w=%3fk>KC2mbFPw^7sdVgcH;Zbar53M?zN4swzoaM*;c=CmgEVSc?*n{ z?<+5yZy;IXwpUNt+*_SxN#N>PYgB!&CG|!fWuNl(|Lt2jU;mVtFWs^(|KH=!-jx9= zV)6HOEn%1#F{hc0o$=t*Y#t~HiXzMmFYc}u-qEB|7H7DJKGHvj&uCf8?AW`8fg=y>|V+V^vr z7PN}yztG&a^MA2*|LyB~OrPE@+;6_s<-~_8L2-FyCg0}S=zZ_=64&UvB<$KiKb}3B%edRUx z{Ft`bcfocFDJM0St{3#{Pt##>;g}g~^T0Xrq4Ab|ub(?73idCY^!)FIOSV=!R2?Fi cT5u5e?Ijz2sd4;_1I9Xor>mdKI;Vst0LL})ga7~l literal 0 HcmV?d00001 diff --git a/navit/xpm/country_WS_8_8.png b/navit/xpm/country_WS_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..1077ef9cffed44ee26f5936ebb0b2f934ee24b29 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_bgPZ!4! zj+x0R7uJbCdj9AC{D*&+zkfbYH@$&Tjg5`X(atZ=FN`hZz>xz73f`ameg1x3;=~Ce sPai&VxPGw0FQAuEI^mF(*EAM}bG!KMJ^vjJ1)9m=>FVdQ&MBb@0E0|6PXGV_ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_WS_96_96.png b/navit/xpm/country_WS_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..573fd74669d985ee77eb0b7b4ef47aaf5c0e863b GIT binary patch literal 1211 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlIT3OrpL zLn`LHy_KIMoGNqR*1*vqo$q?S@cj?W6@9LS;oww#&!FO9yS&EpFH)eAyHyuu$Pvt<*)C)dfLJ)*$aNJ z(%zSUH%#R;!-m|$&Ark57CHj2RmI-R-n)9u*0yf>*OEQuGb%lk9&TXYyZ3*{y#t;W zEL^NL!8c>fmbWw6eY@#$co#dPgUOnAe?C}qDnv#9eEjqD8)2?i=LH|Xq(pniOj^R* zua`dG*F;8dV_!tQ*>eBXV%d%V_Soxk|GfEpyI8x!uDmC_X*PddrqtGD&*V#awWJ~| z_sE++iwtEm`qW)7|N1q3mXut?wv6AKd3|5MKCAB|vW$6cq~xsAz15kXAAhf3$K1eQ zwnn>9^lW-&l7Zj~wFMcDs*8R~hlgZ49(`OUYVqSh`2Lc)e|Q=C{u^AV`l9pNXl=4m zz~^b9&9P@gS8acMH@&ZZ&(04A+Y)0WyqFHOE?koMB>$dSlF|k3-TPijORzS~S(kse zP-X5+t(qE_&+qLoWq&`epvIJ{wyB!$KM#Yt@Zr1Z`U{V%|8k#K|2E_OdgagYa~aO$ zURro`U$k(rDI=?G(4-~i_MOZJqIC;BCq3I~#W;g|iEdz6?k)48(m(S)T{`40)mErH zm9gRVW69|Ej;;Ya)84tC-t;H;{QJAl^?vS2Eq{6NM)%{|^5k2U#^sxTRffwmeBtdm z^=VCbZ~RA<N%gk%qw2-aH2GWK}luL`z>ON=I>Yd!SZQGY^yx~P4V^d zcBqF z_kSPxJn!tj{P>)(`1ewk8Piq7`0gjYjh{bTZp+P|f3N3QutZ6%Iw5Vr*`B{~*M_PW zH!3|Ry*kAAC%nU1;eFGjv-e(8Q#uL1*GoyvGxziTk$g{s1hE O7(8A5T-G@yGywo8NiuN& literal 0 HcmV?d00001 diff --git a/navit/xpm/country_YE.svgz b/navit/xpm/country_YE.svgz new file mode 100644 index 0000000000000000000000000000000000000000..97be6f64a5037a49f2235984ba22514209becba9 GIT binary patch literal 350 zcmV-k0ipgMiwFouD0)Z&17mM>Zgg^aUs**ib9QF{jgV1G!!Q(upW9z?jnB<(JAE1L z25xf%fX#Ofo(V(-uA61foWL?6-JTw(ectc(}8Pkb8^Y6 wbe}RG<2!Wn75Z0dJTqDi_2;OQAE%ddlz6CrQqmJ8^WQr81drIlC^iBB0KYS-$^ZZW literal 0 HcmV?d00001 diff --git a/navit/xpm/country_YE_16_16.png b/navit/xpm/country_YE_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..892e01f7ab62369a6c2f23398dca75cce2563d3a GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^;o-U3d z7QM+e>(~CC-^g^prSn;062s&9?)`niDF^=l|LkL#1keNqPgg&ebxsLQ0JT3Xx&QzG literal 0 HcmV?d00001 diff --git a/navit/xpm/country_YE_32_32.png b/navit/xpm/country_YE_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..5546f3ad172941de4d6b4f52b6f74f2b0c6f9650 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_crPZ!6K zh}O4P9C;ZOcvucpw pl7O5)yawg>moj)RkpOb)ndR)9xy*PRB_05I44$rjF6*2UngA!WEF=H` literal 0 HcmV?d00001 diff --git a/navit/xpm/country_YE_48_48.png b/navit/xpm/country_YE_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..f9441d8fbe8c245bfb7707cfe993efac31aefaba GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HQHOwLobF2Z%CyHfOc8 qTwS?GfM5uVsG}>0Vr2O6mMwEGOY=wPQ-MHp89ZJ6T-G@yGywoDWiaFb literal 0 HcmV?d00001 diff --git a/navit/xpm/country_YE_8_8.png b/navit/xpm/country_YE_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..df06f477b4f5e7d925c951a59d88c0a5e754d313 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^eo-U3d z5>u0F*023NpOHV|kow63KyXM-w3KN+)3N{m{|BeBF7E0&Rk(*sLPA1gGZVwEOum{=Q| w92|+|wi-T<*_)UxN3uq!EdoGCg29Jq{gy8*hd&y+-vaSHUHx3vIVCg!0AKDxssI20 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_YT.svgz b/navit/xpm/country_YT.svgz new file mode 100644 index 0000000000000000000000000000000000000000..dcfe4c3f80c252c44d5f9cc4f350a7d88418cb7d GIT binary patch literal 273 zcmV+s0q*`EiwFoDD0)Z&17mM>Zgg^aUs+Txb9QF{b&pYN!Y~wtpVwcJ-94L|v?5cQ z%GRn3h7+caJ(f0Y0$nOiX7%4MeH*KLyzqVJ+!HS^Uky3S&g#|(;FJN8rf5rTY60J_ znmhurE;nV~v_=ZJN(;**i0`wvbpN?q5qqx5?(qEjk`kC8encr^w$I4>aYH!eh^s9S zP|lqeh<)GFKB8?`QmDk1(taQ^X9vBPRd=24m)78&qol`;+0BOfBKmY&$ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_YT_48_48.png b/navit/xpm/country_YT_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..9e58d71e8caa5c581447351d90319a0061ac6a9d GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@He#gTe~DWM4f#GpQ# literal 0 HcmV?d00001 diff --git a/navit/xpm/country_YT_8_8.png b/navit/xpm/country_YT_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0d7704f2c7883e60aa96b1a6b724a15a82810d GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_bePZ!4! zj+x0R0W;1YI3Vz9>4vOT%*@P(&mTHwznjmss+CCw` qKtn==hl`E1xykY1fZgg^aUs^#fb9QF{l~YY`+aMUe`&Xd1msLt)?8I$a znN+H`oH}WT?QD^lVpIwdCL!IgA0)9;yG^BC5HIk2ydUHb`&Wr}%rrtP0?7meVrs1` zp*Vp*zn9}VpvF>FQK=Oppfo%zqP*Gh$RkyA?{@@hYd80C?3|mp=|meIrx@ed-@)0e!bMWdi@t;;tirFP}BcwHH4{rFs#ZBxKK3&mrW%sz85?54f$yXms# zhB5UYSz~-#WOqZ!n_=GXhbFY6r_;47h@2bdN%rko=y&=q>x1ZFYI#`vms|V;O1nQz H_yYg{t5W0; literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ZA_16_16.png b/navit/xpm/country_ZA_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..c86fb5de6dd4c3b96ec16c983bc49970ad345adf GIT binary patch literal 388 zcmV-~0ek+5P)7Nq)bg8#pNGvEbGjEoHb{{K(kIAB+ z>+fGIUSZr&$9Er9HSY_t*!0c6e*eYpX_8bkFfcGdR5LL$PWMYq~HJJo_GwIR*0000 zg|Pnp|G)0~X$3)1BTXYN8|UwbcK`qOm6{eXFfjc8|9{KP^O~a4x~e*yR*qD$gPFx% z=N|(jod56t|Ml0;P|*(NO=-W^zLWU-AH@zxSQ)D8bC_CxJFx5jkMHDLuqc_)nENA| z9smFT-+c2NRpNs=$ePVc@+TfUDD(&Oii1C$^x5oW@Yz9$KbU{~W>|BCupNf#`sBqq zGXn#|kKYU%PyF&QW+fO_WY~c)NPwGhM+?7+8q1FN!ojx;fBs`cR>#c5G%qkc&cOEX z+t;7wPyP4#BgqypFffSnGwp8U(@`K`2l38Fw}2Rb)Hw!us~M7S0kR!y-ipWE*8TGz ziyGnqGo}zcUAf49H^GQ=Dp(y-Ca^bOnW-`)ufph zzm`h5t3^o=VbKXUohp%xt{K1E*;!b--J`7J)QGo$1(_qt&$O+X50B~VBMUv%49N5W zLAOIpzxUun=cE(gzWpZ62SmF4?8O)UQENVa`bnA(h;%y{rZX@wFw)d?1_lPki_-+P z-Dd8RWkFtDUzn9jn)yf`?E za<@YO(;p1eAx&Van9hKflc^Q%$N*7X)53HH1_l6~-13x+z3I5E($fZK9vCm1twC&~tQ{P@~K|>w+ z+2F?prUF+QpSmlUNLRP_{$ox1L<5jz(mFeOB_)S-2b)IKH@OPJ|17e@OBT69!O;+GU>rxge-WY;=K zBC<-!%8sI_JzZXx#ik*s$`sFck1ZVB;HCSdR&4=-%s%M>(%ID1_g1aD0sCq+>noL; zdKtN;?La7~ra*%M=It$)$3+8pp7oBVG#u@%+dddzUR`r_+9^RZ@g-DmL(&5z))>F+ zW%Y*8wBPM>uokUAvNTS!<>k36!@KsisHqFuznh6)@2E_%ZW>6gvZ^(urv|khQk>M% z&-D}I(_g>m)C4I`N-YhEGdrnfZmZ zx*7nC;Zs~y?WF-g%T4OkWK=s10OsssBaPL>MkAN>>CJyoga0>rCRM36>Wxs0CytC9v&VZD=wWx)m>lpO_%&^IlAMgg4K)(XaD~HZ$Ibkip2*W1*cs2 z=~cSP{nF&UI{x!&+dLdxf5!@mUA5m^_L=w4r^RaDe78M3Jv;8+p3i(YBN(0wn#`ZN SAbTayc?_PeelF{r5}E*Klwl$O literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ZA_96_96.png b/navit/xpm/country_ZA_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..8d6ca4f906dc120ab97076f3b8b451b9044147c5 GIT binary patch literal 1072 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ZM_16_16.png b/navit/xpm/country_ZM_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f4836698e5153f74ac144a3a2f0645f95b8a13d9 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_WJzX3_ zG$tlbd6T5Tx#7X|Y5z_gICS7c-`vKp`iINa*lxzRm~1dG`cj{eke0UNLx1CY=EItH zY-w@fHBxq)jNUv^1f!i~TuQ z@%Hnco(mLR9E1Hg)?G4HQaTNf zZ4*7d_!7&g?(hw+BqwF|MtHP8>%F`K38#|E;Fn_0UI1L% z-xQUAi5Gq0W}uzt0xw(YT;0+vQ$sxgO4@49Z0F6SdwA9XW>T!lPS3ypi$Wj-LLdY} fAO!vn5MB8P%@k08s|tM`00000NkvXXu0mjfFv_7H literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ZM_48_48.png b/navit/xpm/country_ZM_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..7e47c7f93ee3ea719231def94d990c755cb508eb GIT binary patch literal 550 zcmV+>0@?kEP)h9)=FT&wCIK)Fw1^;2|)zmv1(_GRgiIdQl;xnb~@O-yCzlZSQNk~NF zAq!Pu-hjz8NL9WdXTU`dQ$nWLDH0kUl@O!4nj`3Jm(`G)DdjFhlim`*{cl|Q$?FP{ z0pNz5-s9R1t&mQJnIi{;;6y_04|kXFJvR4wm2jiRqZlXV%sy8<4h!lAmc{pop_wyi z{Rp8Ave+t3vTYD5GS<2f28%?&|v2FRj)Ke0) z%WV1_&3Jlp%6#S^xZ1}`5ytfC96&E!3`yUfKAi(-=fMA_3-@!)_k^CTRYou0*~x>C z;pocs7PnVs2s+muyMO8ue;M0Q_Bk)dRu=A&X^<)nQl&wvG)R>OsnQ@-8l*~tRB4bZ o4N|2+sx(NI2C34ZiNxf>Uw@;GAF1CJ5dZ)H07*qoM6N<$f&<_FaR2}S literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ZM_8_8.png b/navit/xpm/country_ZM_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..8d2521087234a44fe8b088caaa4df78e4b368fc6 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_bYPZ!4! zj+x0*-XuA&+3c6B+i0-iZ)!rK18Z8ngv@>8m|x9`g)ikVOD?OwBgEsAAtY>8{C~#j iEiYu-SY!eMnHav+38-!^;AsMy#o+1c=d#Wzp$PzH1uJ_1 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ZM_96_96.png b/navit/xpm/country_ZM_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..f420ee9206ddbf812ede714f37114135ca0c28b9 GIT binary patch literal 1416 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ZW_32_32.png b/navit/xpm/country_ZW_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..6ee281f3b34e6657b476dd80175c8611a69b2be0 GIT binary patch literal 737 zcmV<70v`Q|P)5R^JUtfzEm4qU=_x?BM zTrTJT<2&c@{|-5Kp?cEyg0q83BB4;I?4r+cB5V?X<9Ytp`MZ&CnppqMKorIL=7Lfxngsv=##q`??a3ns1Gvo@rF3wNMpg|5Y*hdNqA2#Z9qeur3koI`R4n0~dk#&;A8iuObGED;`@^S=<;N;xOL_^KBF_}%PnYb9zVhN|W~4u3 zDlbjE(Ta!z0|WXi07R6gCuh#^>uSoL`tbne+~d_*}2ZDB1s{O zD=H9xLqt}j#BaM@Z=*;avNhAX5>-7;5?w=2dY;Yh1OUcZUtgb2fHg7LloZ)Y;&F^i zsK)se06`EQUkg0)?l1nPuTO=)eWIW)`C`nOv zyKygL?C9$u7cn3$l2IW~P1tht0RR;__~~OOt+@_s`rTn$Tqo32=WqEw?BWa!yG=31 z(j&Fy#fF#zZ0iStAdHP%G0+`0Z&5;B9anoU8Qk}`DqxJ&6fw8cSpSVP5CowAG!x!l~#r= z(wm6?V9bK3X)Pkkn8OEsQ0thDD-HxfA4D$NZbLHnhf(J$h%yvJt*k56HaWewY0@k) z_a?c=hnw~GPab^9z5PC2&N&YsexLLAqJe?_-wz~QtrYBxAW4!AJ{0yI%}}h>EC2vN z@jO3vay*qNTTN08B7^`yBpUgp`J8*7_2Q~PvMlcqan+LS9C6hO>4`=o$-Ps)b}Pkg z0+MBU;IYoj6WD3D3}{m^c%C15E&kSoRWJZsfB--cg!#O1X& zIST;!#5uk3%*4bPy{ouwC7J=`?|3G!?QyqO3Js)u`?lW5^Zcu)PJfswS^xw9CB>6h zHExjAN^1F^1-;Q^aflG2tz`>W5{0YZD(#8Z2T`R0x87FlOAW4`K37k#^U%X-MLlx= zeV@{K2SRlRQg6*J_H`3g1pxPpjK7-!fb8Fz^rlLy007A0Y`ON+4a<(26` z;aY&q1k2ZhfA)G)M+eE>NRku?1nSLGoz(ubpA#>~`jL%A**h9u)d)b~c}L^BAFL1M zc|IPGn*>CAo4oHGw>40NfT99Rqe77=&dS1HUu+!BvUQ(B#u8~;m4JgZnJWpU=+(Tpo>Wf{}{O&f7# z89)7UEc*S$F1s1B^cc&23k?8#J^dYb>AaaVQ1e};2V?xiBjIm`Gj^tCzv)0vMkAyB z;saq*X`tr23;;w?Y;#*c12rpzF&;e9dF5l-ZtjarPmKzV49CVst)YSKKo-i?48=5B-AQ?)ZZ9CP<( zEvEq;NSEbqv;H?e0H9PVwL@g-p_9oasq3cASO3fD|I2@ZvDQ?YLn-e70000hzlCyvoaqE+xO2 gFDbWiu_ptA(?iv0HjgXkfi^REy85}Sb4q9e00KNnUjP6A literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ZW_96_96.png b/navit/xpm/country_ZW_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..8d1d18245fa76c3f6555d334533dbab2d870a278 GIT binary patch literal 2322 zcmV+t3GMcYP)7;F?E9$EuA(rO;y!ua=LXYZ!4pv3<`{uf*Mq48VE^n z?8I?i?D*{S-97v89FAk369*BK-QDj??&Wz-kN^7r?s>Vpp!W9m!|(m03%n6F@gc0qobpvqvQ5FsbrYk@AfP@ z5FrEr!r`zXnktz7F+|G;PH!2asiG)GF+|G+XYLrH<$|;J4bifgp%}#wEtBjF0z4ip|!^?pZ5iyY6pP26BkU&SJDDhwC0J?H>&O0j*z-yme`3K z0m)?>o4WNnfAXL7Apg;a=>k-=a|!XyXtEg1ynmr5$FTB>*4}2gUxr+`<|bE&o)*R2d$Z$D(qbhpAo3q_!v}`SWK~i)&RhX3w5I zS%;)haO&Nz!BcNqY9e(Wh8`?ifd?;&wix11e;{1DN|FiITZgRHbghz-lE%iy{cruX zl0j=Nc^|j^-=U0yh$JS?pW)AZ7(aO|)pH#HgpGLBv*ygA16QTkKEW#98SyZTrS(g; zE#D}4^f61@Iyz0`IPOSS*U?%>16$BEc=3Y>A>*(8Zv5cOgy%C)B-i7X-R7*)mkuRe z@2fb3O6?WD*yniSN$m|C5g~*m6aAZ3%M;_7Cz21~mLF#aC_W`$dm-rxX8(4^Ti5XK zD}XTo`2Bv4mWz}-g}H5=>qkG$Jb@Sh0IL}#gc(jXv@uhU%zSb0r30DK z0f5fV&Z?@ag=lW^nf|HeJD;^~+MM2HoDhu@0LWc0YWC~7xpjEDJ+ z^{x{u>+vU_r;&{WNwx+JV!Zi?}w(Q9?Om*-Zea%pX{nnm!$Gu3uK z0NfstVmxWAX1Z^PEsgB;TViu9Gae;^NaCb!!?sVdDuzO#wzjs_Q{#WB(#Ud$dM_qN zm4(EyNmB1&ZU&?^OWD35X=MW&nIuj-s;y+$lA7F#KA(?|jJ{M+qK)W4z5t1%DY}6W zy#KL40M2!%YAW!}fK*~d@dOzP%S$}VvT9Meo^x4iwX&QD`MUYkh!P;r65P6!9goS* zQXGuPl1$H(65CJ9kq20{p24(xJ3ZKaYI z%W4?_7+$g=vx*{@*P$7?DC#bhj6@@&1Yp+hpe%LiO-;&0$@6=HLy7Qgj{pe)bSFSs zm5ZXT7_wS=4wnykzMo>)Tl|bNax@x!{SdJ`zV_!PdPJ*oQB(pXM<sJ*v?a4(^87PYVx5VIW>w}wBD^TL^9kFeGWO!;yW5dE+=J6>) zE*!@leY@+p*P+$)fdb!?Rz<@-S0;CvLE4*h<>M}2!|?fhiOKM*+pSKA249-WR52aOMJY%zeab~CNHKlNMVVVM-O5FoLoq$eMVUh}JE-_xcltryhh#E?{}q6Pl}mrg%& z!~1;TeO`cnPT6c`K9NWS4*DxALNJ%h%#94Mt-TSPj^lm(R)D|1SRQv!?rD?rhyGvQVAhrLm{P7F+ol0 z+P01MzK!*IZL1+SWYeOk87l7Vw#LqnK_it)g|01J&j(rdgzx*%@An}P7#{J3-vG&E za$@OLY%>~-%zC~DuH&lf>+cu0rR|OB>2p^B`bR??ca~w8E0-?LmPAoR0DwaS0Hw5R z7@C5>fMwcyl}dRr9>4P`etUWK!^d~amT4=#=l4uQYZ5|mSRa$&a5!3iy}EJ#!M!B_ xU;%*nHS8nu@b1%RnYRFN1^_1i`icKXKLMj}_ou1bAMpSH002ovPDHLkV1iQy1cm?r literal 0 HcmV?d00001 diff --git a/navit/xpm/country__32_32.png b/navit/xpm/country__32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..04716ad51c1c00ca129605e63ae4c8513e3fca6c GIT binary patch literal 1469 zcmV;u1w#6XP)op(M7#EVX@br7h zYL&X&YO(LDuCBH&ny#?$-5uY3|E&cP>8s{zrrg})5%a~AloX}6cia^akv_Xr-=CeG z9kQt61qFFKfBL!2f`}wZA|WE(Y`HP|EQsRL!hPL6-F8GIr_(`ScBO%c|;$j4`hgd$bg7I zW-{obW0wnd`_b_5l`W}hsR%` z?*Bu1c_&skHeNO&A~{`766`$jf{pBUff!?SwXwn2)pd`TWtq&@DKc9oY05G|c88r@ zZWonTmUa7T{WCi-qq}$S@!{cXnjKEzNYu9I6|yV?B2F8VAx0mwV&%$EwcWu35&{u` z+FuPSr3&gU)N~n#Mw6n%E~kuj zpi-*n!iCy;y*s^)6dURs!kS=mS(KmtO4_T}5)+bwc)<$HdnGxJ14IM@0z?L)BtcwkT;Q0=ba?%`H7)J!o%2G> z3s78qDkU{_Z*y|;u3(;@E)D>o_EUpKvkbIqEr^l`hzt-JNU{Vm`nbU1;gN&uBGz9w z7!3TP0g8)HrM{Gwb~7n4Iml+Sc&{3PMxy~vp`^1l)jfTE52g6n9YK;T1ELHJ5hPiJ z*qHd>v5C>Fh_&mQp9SF)ps46%`rf@SHz({&46^aw;y|EPYk>%;zP`>dGCY+S~0C{=Y(TPdPw|A%P3AXVTV8j3j zz~4^|N{*xYi}m-%$IL0!)zvP8!N6~f)ZH?UjvbEC#|BLgtLZtxP=@Gj(Sd*TKRFPg zTYs^utLtCmc{9kP6IyvzMeh;4gk~uu&lSY zSIOJVtxmTyZNrAh;QIRWzg@lZWky?Dn>ed;=zXgIK;7BdBPsn=KiF)Rw2+V&0-Bl{ zJI>dA`nJhr;=DczZw&bYm|5chKru9AbPK%YYtyJPsO9F3R{LtF7h=X{b~{5)K4KJJn=1}|#4Kq^&sTo} Xzmpv>>>i!700000NkvXXu0mjfQ7FWx literal 0 HcmV?d00001 diff --git a/navit/xpm/country__48_48.png b/navit/xpm/country__48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..0d201576a87858051d7194813500f8282166a6da GIT binary patch literal 2339 zcmV+;3EcLHP)4!ZFyP$G2?T7Fm-dSKd&-?#9@AL4y3yf(@V;a+#{?{rlex6^oYSq+x6|b=H zrR0%5%MSN})vH&>f{i_Dv2v#i3kznCbmNfLtuK6&HJOeVyVqs0;EkA(H^HGc!Z+(XNK>NDS=k)hE* zgv=8W>AFrtME^LjU;IuWLgueuzoropDT+*@B$BS{q-h#$*!Tzka3G4^MV@^h{9O#j zQmC`*CdslyL`2mGK9cS!gkiodWL{Qe5+#8|Q6NDSdLiD}`1+6_BF)QmtLrA+>byxe zJ8zIAi9|&7QT6^ILk!x)IxGb#DQQ#3jT_JEx(;2_Km-sGhzO!2fMr>{T>Q#?yu{U&uVf81byFe7W` z7vJ8zo*N$*mzbD1nPV70(=-5Nd=V5?L6kWPkIngMRDEOJ5@&jX9%;VFlan*+ zw~H6$TNFisU+4h{2u1)v1fF+*VHi|YmWiF6o$I%jdOjRAfY&ncEQWOQUB1J$D5o|F$hzJ`uy%D&6{ zRP=)E?3vFmoS$crWf=jXC&D;Du-jt6vJ5;GWrFXV@0FpN2ZnG0A$h%CZC1{sdrzJ^ z@x;W53HK)?OyU>-s;2eQFe}r+OzRXwd z^awuR*KckqDSKq354j>6$)0#VpGbL|KfeXNDNqcpe~tWm(9I z48OlS!Z<+SZ4Pi8hpInU`diMP-Bh}{e8X`44EY2?I&$QQl9idgtNCP8ZbHJODG3Ra zI1oYA)ZXk85hO`8%u5Iefe7Oufae|HSPna@JVIMr>#L=k%ZHWu5d#25V`t9T{ng3i zxf3Q#m@;|tR1P4hs*3RDlvM?)rbHO;ZCI9tr(&Dn^9`@&?+HLS#HrKGxerX7I3;n? zWKIV`Rh0py5;7ht8xt4I{AkUO3LpeA>yg~OO(z=WCQMAYe{$j!PLf6FIt?&R1Vme- zVTp>u&UbbM+S}VUZYe4I(`fbwMsS_(uac4yKg+O3o12gKIi{dt0!2((hGC$pDlT5U z!0D=fc(i*1qdWlsD0UZBI-MCSm*%gqO0o!1k}$A*jA19sh>pGwk32HVRM+6m&v2zT z9sQ#2?Eej**j-dPV@CFKix(}iN|FeFpy#&6!{>w`2(ZQ2kTY|ZsiC26;bAcZ=n1JY249Q+PstDJY$hWBlC!?aR(mEVZxO`5Lv4LjrNAxZ-5 zJdX@#hPm;}hJ4qIp_kK80GM^|!iuz1=d(+fEVqi1(3kn%Nkwqj;{Y)5c*=y1tCx$m zyj@-i05vr=+Pt|>?rv#2Gh3FWNz;>(O`35M;Y}ZGY#W^EPSdetjSGhgF(^Rc+JfIb zIQ2pIbI+`_$cls>e|Lm&BEZ2rz%VR!R(XVrmo9H8Eh#Gvk5N-oqopLL?fvH3m3g|R zJuq!r5~r#vRLy8?3QlfWlEB;Scnwf|hc+#z)L zbd%W>1%_daN!xdyXBZBZJ3PX<3m4uf-Mnq%?c!8bRRub4`5&+OtfubJzdjaiF+9xX zC}T49lRo`Gm+Y%yGY8y*!w|K~JEzw(g2EJM+WZBZrq|WMo+5W8)b~mY|c4 zSUxUT^A%gg%U3V1-THQU>D^*AG&Csl<~_NqwY_C_SJ%zNl;kv%rm0Xh6(-IMKE{rZ zKdF|yb+wI}!v4(T@d%>@U;&uDUwAuz@RJ`NIDP7?{M6KRYn&q+W>I0QdA-WKFe z09@EIg;wjC)^3}_e)ycP^_NXeO=xRx+xpJVcdNoS2sa+SVaNz;#Nuw_9< z&p+1u)$s`}Ev;ww?b*NF=ktmEyinNcpOiZSkYS1m`&kE|x3#o&j2}1d6Ms+l=kNaI zz4rj9#?p*e-S}Sb7Z3eFsk5_Fx%SPs`(oo_JN|v>v)9_&+dBa$#?o%H257Jk^&yB* z_SmrBhm3{bLZU2pjg1fOg@G!X=kJdf7U!RSbFw>smb`7ng){mm-tWu2+-8y@ vedGDr*|JPmk6L6NTcW_m#%8vthJ&Gdvd5~mxbP0l+XkKJQ!+G literal 0 HcmV?d00001 diff --git a/navit/xpm/country__96_96.png b/navit/xpm/country__96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..6035c5f86c38ffa65a6acc8017894bbc137f0732 GIT binary patch literal 5227 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 N002ovPDHLkV1hPcvu*$Y literal 0 HcmV?d00001 diff --git a/navit/xpm/cursor.svg b/navit/xpm/cursor.svg new file mode 100644 index 0000000..3f905c1 --- /dev/null +++ b/navit/xpm/cursor.svg @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/navit/xpm/cursor_16_16.png b/navit/xpm/cursor_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..6722dfecda9b8b8048c160836bb8ffb1ac2a5c2b GIT binary patch literal 685 zcmV;e0#f~nP)D_ zaI{E-x(f&ic+tfHJfjN3Mx(uksc|1Jr(@@BE~kU3@pClVYrwF9XH=oBqrh2==1 TYxLx-00000NkvXXu0mjfyvQlA literal 0 HcmV?d00001 diff --git a/navit/xpm/cursor_32_32.png b/navit/xpm/cursor_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..10a945270550b50aad794f054a8f77330c8c2d5f GIT binary patch literal 1272 zcmV*!Y`v4Z?wUie7;9-m@^?_2;6ah?Q)IfbGJ{9q?!eWEI3skZd+SZEs}H_E>aE^4#p$oX_VM|3=lc*kor8lsy0=eGpm# z$N?S#jwd3}3cLb`_`Ghu?i-FDkeyIe3B#8`RRHb; zeh2!E1Z2df6U(hW2&L5)Bkj%iaP-LUW0pKZsZM!YXTWU6Q?AeEt8js?wwpt#4aEo=IyiSBwpbBULanJy?=o2gIL6YPC zt*t2LvlkkXY$?waKOXUa? z0cVc>si+#yynEKFG}q1Pj(rIY9(w0{2F7MBaz!u-zQMH6CcR6Hc11kyt znO|B>+gma)uJ@L#?9EU$joBnd;#Qgr@ixZd2?VCi)2#$lEvX0AL?AF_?2XHSAGie+ zu`mIF$+%3g5YRMc1MBp_;y=a>I01}HfQq<;1pL3I)DaCqq83)v)CBxjjlENV7Ci~O zbn#FxsLAU}O@rCMO2U@X1JN2GhAt4B5a1hN0H`7`3D?d;MMFY8s+KrA02DQa2ZqiX z>w-Ul9wUJ;@G9a)gx|h`!b-^9h#9K7jx3lNfj>?gB^?o)`eg*ri73S&yaGSIFN#ew zfpkN#JO@900E$k!7wC?5%oR}&qLj`dv;-r+2u~PJFS}$TKg-E-NU^lBnPBY51(+U& zAC5s#FHlE;eZXQe0*k-};AtR(&@v2P62)j<8Ax^{n~f}2MnVEp3o9ZMln@Ml2bYh- zs$Q%H5p~C)(O}wTxqZ`pY$&zv4S<{DepZLC{O7Vf3LkJ1Xfz5XNy6jXDyo~zEFoN3 zfWQpFTh~z(#jK|XXhR%!>q0BSZRtME27m+WHEKrmar!Z9dz?10#>eUHi@d}r2Fi#& iV8nfLgCy_2RQMNu{0?0wG_%wI0000 literal 0 HcmV?d00001 diff --git a/navit/xpm/cursor_48_48.png b/navit/xpm/cursor_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..3fc89565e7c4125826426d6a02ef2d227fa8811b GIT binary patch literal 1951 zcmV;Q2VnS#P)T{Js$5K$4i{Wi6&{5mQv!xbyh-BHDzf5 zp@x7|6eMV5q(aq#kWht$#E({$AV{>d0u?n7iMB+61Q4{%;!>)n4xwbTlQ>RrVw>2` zjAwjj#{4+5ox7Zwacua(E1e(noo~*4-+Q+2eCNXa!k#Yk2HPC969TpZoxl=cIS@z} zfC*q6_$P1yI05_#xIRbEpA~$-mw>l`6fjd_NdbQWzL;+7zlI?29pJ_+NL!U*;Ax<8 zzR7Mti zyqAEl1JOc`#RzBv4g+Cx(v`5N3)=33@;a%i+~cCmX=m(qT>j7P8*u3z=syNAOEIT` zoxs&Q5fBEB0t*Z^zG?{XgoPgiyVFoz=CpI<+YjJ(yV&@>H;Bd)#@15_7&r<4I1E$& zHhcacupRi&il9S5z8$ej=*ZikV+(Zdg_=dVVUq7*gP(tGGY{U=#)4`;%bS86>>Xgn z;An^HHdwp?5^)&2toNt{b^!-~$x;NA18=59D}NJnB!{)YDd4P1Kma%dROC!HSoalZP`~+A ztu_4q>7Dq>tcRA}W@Fb!7V^i_Lkx{YtQ+$NMQ;qgr>|KL{1lkZwyAUIL3C9POS)mf zY9;yR8b61h+Cjiurt|~wxt+ZB#CBS1%his}YhiJh-r9oLAF{|7-~%3)+`U1#>yygo zlzUvf{>@LYpxUn{l!s82kKaADlc2wV;8mXjPe5<&0lb+X`2uzWwUTT20dRRN+jlzb z{OTLqxVyd9(#Hzn<|=;k#CFP@ifG&A6C7kT0FP#V=mq594MO`mC5ioyb+KbjOL2@% zurb`k{>Kc%L`HijcnmRKRzPMFhk)nE-tYHlYtI+CFOe&_}zL@`EqjH+$APJoDLm*?oV9wL|N@ zdW#LgIXi?prD|^#1VW~5ZCcU9i(lPn*r@IVHXFRKx0}r?jUg8R!Det*=&hZQ6Cf}0 zHSKz506IdI{BqwG0HzbEIV}LMJieKZklC5WCc<3En(yo0aBSB z7$sjoR1xkf5KknD%$EQorxD0a;&X`IOc=~)Ueaykb&0cR1ZL4lEr zh%`-UyOrpH`IrMU`cMMW2b;`Bc0#I(O~82RY0JzUP?cE?p<7o)JS5`;@N(Dxd|Z|kkk0@+y||=3h)0~2r!}_*nq{2 zW-%8WM-XCUcmlBEL6JL3A1gvtKFU2VWrMNlB!i>rIgr#~-~^mGWELubn2%e5^H%K@ z6Rou(u9#Ms)_NJTA3>X)VFX;CZpiTIrPN!3K z%{l;ldag<9;X_<>-&7DOwcJ2lbjz#4Jj0LJSpKJ<8q8IKun}>4vH@6$_~4@&`D2eU l#A@<)MCg7T5t#jd<3GT?did`voxcD8002ovPDHLkV1nGevJ3zK literal 0 HcmV?d00001 diff --git a/navit/xpm/cursor_8_8.png b/navit/xpm/cursor_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..f703a8c1193f1414f1e159529b0894321334feab GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^{JY5_^ zB&OQ-AM|2!WN6!eEa{r8PS|VKrdrm^&F%}&%@r~`F>gV+z#^kpmzck>#I}4A5h)Qq zxRg&;s7c|13RmH^V>9`(Yd_52cly6$SNo~?i^Aq#dOEwoyxilDLfYbaZ{}=`eY@wa z##Ph03(P7h&BCXC@4A(-bLC7B%3AzX<6Y*agA*M(e7D9;2~)f?OqMUx&&za6HA-r1KFz*?jiGU?`JPhYhP--@=cyCys^6+aRL?#5!rJX`?w&iF zK3<=8&pnx~|GV&`)#+;UP5&7`J!QB`U@@0r+`A9@pT$2M4>iA?V{jGdZw60SKbLh* G2~7Z*)rcto literal 0 HcmV?d00001 diff --git a/navit/xpm/cursor_96_96.png b/navit/xpm/cursor_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..5eb6d1da146f02b7f07539a198c64be8085eeff1 GIT binary patch literal 3980 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 + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/danger_16_16.png b/navit/xpm/danger_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..a485fa75c269663a01b32b62444a01d1c5e56396 GIT binary patch literal 581 zcmV-L0=oT)P)@pedXGzcHX3Uc z{4OuwFVBbX!}|dIPwmalX07@8%s;`+jg7l+2M4hsifC?b-u~Sj+bdKQh1}fTt$bNt z_B#g$;N$r_{z&9ywOYjswVRrjs8focl1a1@39M6!=F-xmUbE!qpin4WwHFqiGhQ!z z936!{NdkuBz*$^;Q7)IS{IT6qRdtIHY-h75NfJh*QEX>2xJ3wBs+vC+exvI{JHx}r z+u<-ewvDnZqb$ql*fws5!?-gta{R7dzj2oFoHhQ{)w$2QPKGKKU|1FcfdBviFf0qg z^fbJWM99F(${YaP`la1iU%%fF1Z>7)c&c>G%S@$u0Jvie8q8SPE718isEsv@E{a=(#hq5d^`@EDE|0R%Ys&`<$6vO zArOy4CzlJ#q0nOh0HW*qb-P%6O8WaDI62w18Ko2`rCnKYY6?hSAK1m>vs$fojj?8C z^6jy)hs5WDOFVz>l}`1o-3I6I5C-yj)$^5QJ9K>f!-dEbT|RkjmhJov*HhmCY9Z|I TF}IJb00000NkvXXu0mjf0yGX& literal 0 HcmV?d00001 diff --git a/navit/xpm/danger_32_32.png b/navit/xpm/danger_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..bc53300d158330c224fe2489ae5da96bcf34ebed GIT binary patch literal 1213 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 LSzW0LiVXfAaR(F} literal 0 HcmV?d00001 diff --git a/navit/xpm/desktop_icons/128x128/navit.png b/navit/xpm/desktop_icons/128x128/navit.png new file mode 100644 index 0000000000000000000000000000000000000000..2fd40bc89baee20ea966b11ebff14454b217352e GIT binary patch literal 14299 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 JPDHLkV1lnrAmji5 literal 0 HcmV?d00001 diff --git a/navit/xpm/desktop_icons/22x22/navit.png b/navit/xpm/desktop_icons/22x22/navit.png new file mode 100644 index 0000000000000000000000000000000000000000..3c412db1873ed364a876544c3848ffabe5272e63 GIT binary patch literal 956 zcmV;t14I0YP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iOG= z1STT8_l6Mw00TTpL_t(I%hi=lY*bYg$A9;}``!#pXQri{fkLz$B@nTViIJLsV^XP* z5Q#|_#Em8zodhL@7`rqPb)yS65+o)KekUR-Q5(ge#A=ja1)?m9rj-_}ErZaHnKmmNUj>e_?4 z<-zi|BA|czkW}OaJT38afiR|I|5kC8#xps~+n*IVIH1uDZMZ!doc6ow9(G0!vvqR` zgJYeMKM8Fe-I=dqG} z=eXe1IUl*c7kVE+M^@F3r8UUGKFq{-=*|o`Uhk2eGh{CtnxjFqEmeW{e=z5%&ihgK zJqqq}mNJ((@f<0J2(=4N54}X^-3oB{@q!_}E&v-{wJUaPZt&gF_c7yNE?Ak5}yN32Pfk=PkEXEI2T;tm+lqcB97dPx%flSj9-r7oqmy5cDcmDk~0&U z^H&TV>)gtU6hZTKRmC-SbA{lkUPb!s0?!=I;J0l@ogZLd#v>9Id_G!Yrcm$qmar(> ztwxIJ9EHUfwGZj_E^qDj*iiU{y*pj<4jjMm&rpC>%S1VMHirceTQ$_F|bL+n2Hc0000 c #FFFFFF", +", c #FEFEFE", +"' c #F8F9FB", +") c #EEF1F6", +"! c #DFE4EE", +"~ c #E3E7EF", +"{ c #F1F3F7", +"] c #506EA0", +"^ c #899BBD", +"/ c #8399BD", +"( c #A9B9D1", +"_ c #C1CCDC", +": c #BDC9D9", +"< c #8DA0C1", +"[ c #8196BA", +"} c #8498BC", +"| c #6D86B0", +"1 c #315693", +"2 c #889CBE", +"3 c #325593", +"4 c #F8F9FA", +"5 c #46679B", +"6 c #879CBC", +"7 c #9EAEC8", +"8 c #47669B", +"9 c #DCE2E9", +"0 c #FFFFFE", +"a c #FFFEFE", +"b c #FDFEFE", +"c c #FEFFFD", +"d c #748DB6", +"e c #DDE2EC", +"f c #CFD6E3", +"g c #B8C4D6", +"h c #F9FAFC", +"i c #325691", +"j c #DAE0EB", +"k c #FBFBFC", +"l c #D2DBE5", +"m c #C9D3E0", +"n c #C3CDDC", +"o c #F3F5F8", +"p c #E1E6EE", +"q c #9FAEC7", +"r c #CCD5E1", +"s c #CBD4E1", +"t c #CAD3E0", +"u c #5876A5", +"v c #6D86AD", +"w c #48679C", +"x c #6F88B0", +"y c #6983AC", +"z c #49679C", +"A c #E8ECF2", +"B c #D6DEE8", +"C c #4D6B9E", +"D c #647DA9", +"E c #5572A2", +"F c #49679B", +"G c #94A6C4", +"H c #9CACC8", +"I c #A0B0CA", +"J c #D5DCE7", +"K c #CAD3E1", +"L c #BDC7DA", +"M c #BDC8DA", +"N c #DCE2EA", +"O c #FFFEFF", +"P c #5F7AA7", +"Q c #AAB9D0", +"R c #A1B2CD", +"S c #7A91B5", +"T c #375994", +"U c #335792", +"V c #FEFFFE", +"W c #7990B5", +"X c #AEBCD1", +"Y c #98AAC5", +"Z c #BCC7D8", +"` c #FAFAFA", +" . c #F3F3F3", +" . + @ # @ @ + @ $ @ @ % % % & ", +"* = = - ; > , ' > ) ! ~ { ] = ^ ", +"* = = / ; ( _ > : < [ } > | 1 2 ", +"* = 3 } 4 5 6 > 7 8 5 5 9 | 1 2 ", +"* = 3 } 0 a b > , a a , c | 1 2 ", +"* = d e > > > f g h > > c | 1 2 ", +"* i j k l m n o p q r s t u 1 2 ", +"v w x y z w z A B C D E z z F G ", +"> > > > > > > > > > H I > > > > ", +"> > > > > > > J K K L M K K N O ", +"> > > > > > > P i i Q R = i S 0 ", +"> > > > > > > P = = T U = = S V ", +"> > > > > > > P = = = = = = W V ", +"> > > > > > > X Y Y Y Y Y Y Z 0 ", +"> > > > > > > V V V V V V V > > ", +"` > > > > > > > > > > > > > > ."}; diff --git a/navit/xpm/exit.png b/navit/xpm/exit.png new file mode 100644 index 0000000000000000000000000000000000000000..cc38db7d2d55813adaf98a82e2a14e6b3f361113 GIT binary patch literal 443 zcmV;s0Yv_ZP)E=G)a>p z_y&QHE{&kri1-9c3VSO>aD!GVC?N)R877-zW|GC+JK0$eTxRCpbH6$Fo5KW5@dvUj zyNTc;ru9ux6es47+W|ScFc=Je;4XB#Q+a;zj^S_^VuVC|>BMIH{ldHVA6jrOM-)tu z=ZPh5DNogJ0$+jEO9zRI!xq(Cct_nM?MuE3@-cWJrI1xYb63f-NhZS7MPMx%f ziH*002ovPDHLkV1ne=#j5}S literal 0 HcmV?d00001 diff --git a/navit/xpm/exit.svg b/navit/xpm/exit.svg new file mode 100644 index 0000000..8fd6d86 --- /dev/null +++ b/navit/xpm/exit.svg @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/navit/xpm/exit_16_16.png b/navit/xpm/exit_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..aa60286302092141f5dfa2bbc6bad881c8b89390 GIT binary patch literal 449 zcmV;y0Y3hTP)4(b^0CCxo;#j~9AzUO_O^E@Xx0w@Ak(P(s3 zO6kyqYPEW&lzOE-5*Ba=q~h`T1u!%*S>i0+gHi#s)*G2jCfz|`-|}~chpR}bjW+NJ zl!3SA14CeYYoygpv%n%y2b9N~0tomgXHw7D_Lsk%1-gJfU;sD=Zd*EVoDYO>BWSG! zunJ6j_QOC9SooPY9PI55Qm;z@3WY+_BLnOLC14GxwH26~e;| z8&kcI9OVKq`TXVU|CiU_tDzI5Xk2v zG#YLM+qScv$j~Cf=}GVJJ`@VQ{3T#GSXq4_68Vi#`M1F3WsLWCH-gsMaOj7?`_7Kz rj7ceD9x*6{(3MK%Mk!V7z)ySwq8M*KM+MNo00000NkvXXu0mjfhFHDf literal 0 HcmV?d00001 diff --git a/navit/xpm/exit_32_32.png b/navit/xpm/exit_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..20d59e60fb641c72563b573df2b960b28fded851 GIT binary patch literal 764 zcmV|F|en*Y#;dQ64$S-3yGa0=xp^0MTf) z3s?j2cnsRwR#;qY!7!w?Xwx(o6h(rtjcl~jlTk9fei2j7+DRf z=Mu~T&j1}=j`xT0)f)y%VaY9ZQSnw*RbmTA}|TOt~9<7U|YA&;E;mfUkYHF z=K9!&z^$VD55RfR`1NW;Z-H?eyYQ?b1o-?Zz~n>}Rdtnf$pKfeDY0rKtb$a^Ln^hk zlFL0nsUUavt%M;2Kw?W&R_Rdq&l3{XLm*hMViCVcU{og)K>HrNfr@YWNc7dQ%# uOeS~ud_G~Is;aH4F*Pa%)--PF>-k^E9ksVW literal 0 HcmV?d00001 diff --git a/navit/xpm/exit_48_48.png b/navit/xpm/exit_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..ec4ad7c3496b5b7ec53be5d4b0215948949d952a GIT binary patch literal 923 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 VKhU=fTE_qY002ovPDHLkV1hWyw0-~p literal 0 HcmV?d00001 diff --git a/navit/xpm/fastfood.png b/navit/xpm/fastfood.png new file mode 100644 index 0000000000000000000000000000000000000000..6ceb32bcc78e21e27edd8defcf9efa2166f68101 GIT binary patch literal 865 zcmV-n1D^beP)PP2tGJ`^wi=t!LQ9tjcbCJ@EjURyx(?9JGpVh z>Po4N_7&Kn+opa|CDjHjBG_^mP4Shq>mYUqg(l0|L-3+3{PXlOxD3Y1+nusfF&y3vWZSGl;BapcfA05j7=I1}SD2f)W) zwD^6^@$5rI{lluP<*#RIT4(I^p=f=8z`&VV
^;>VQMnQXC7lb-V5Fz8nKPv)TQI!W)ib3A5owZHTB-sGLX5Cmd-_a>VG{UN}~-OJIwA1AV+)dOi2Iz4>! zs~hr)jU^c_lRopLP4f2b{Ts60*yiJhn+|{buaWC(cau35>U#=(MqVFXH*g402&tt_ r%5TmWfWlvVa&2iP8~;{e|GoYMfY71%)ux4E00000NkvXXu0mjfbsnF@ literal 0 HcmV?d00001 diff --git a/navit/xpm/fastfood.svg b/navit/xpm/fastfood.svg new file mode 100644 index 0000000..a10bc4b --- /dev/null +++ b/navit/xpm/fastfood.svg @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/fastfood_16_16.png b/navit/xpm/fastfood_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..24201ed55d5a0a734bd3853512d44c8d22078ceb GIT binary patch literal 689 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 LNkvXXu0mjf^N-FT literal 0 HcmV?d00001 diff --git a/navit/xpm/fastfood_8_8.png b/navit/xpm/fastfood_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..f1278afe445e53d5c053241b0b46412bd40991a3 GIT binary patch literal 310 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 SQu?a^0000 + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/navit/xpm/firebrigade_16_16.png b/navit/xpm/firebrigade_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ff41010c4fbff13a153c5dce96cd248a2d71dcb5 GIT binary patch literal 458 zcmV;*0X6=KP)*`R73=A zBErD$Q4$gKMf?IT-Ic9{Tn|>bm_WlJlyPS6HW9v!THU*IU)TAc!v!Z`2_O918-jvXut=egi)&OO`ADTo?|}i4OSq;dDVr+a zjT9r-4+K~yO&H5CkW36$JT5*=dXs@J#+Ep-FW@H+a3p5sY(rg;vlRWjyj6=dps>F5VvF`zGsj@So@W3%oF9B6sbcod5s;07*qoM6N<$g7>r2 AfdBvi literal 0 HcmV?d00001 diff --git a/navit/xpm/firebrigade_32_32.png b/navit/xpm/firebrigade_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf720a480651f60c224c78dbf2f54889e521e6f GIT binary patch literal 943 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 Ti>H@=00000NkvXXu0mjfiCar| literal 0 HcmV?d00001 diff --git a/navit/xpm/flag_bk_tr.xpm b/navit/xpm/flag_bk_tr.xpm new file mode 100644 index 0000000..a115ecd --- /dev/null +++ b/navit/xpm/flag_bk_tr.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static char *flag_bk_tr[] = { +"22 22 2 1 0 21", +" c None", +"+ c #000000", +"+++++++ ", +"+ +++++++++ ", +"+ +++ +++++++++ ", +"+ +++ +++ +++ ", +"++++ +++ +++ ", +"++++ +++ +++ ", +"++++ +++ +++ + ", +"+ ++++++ +++ + ", +"+ +++ ++++++ + ", +"+ +++ +++ +++ ", +"++++ +++ +++ ", +"++++ +++ +++ ", +"++++++++++ +++ + ", +"+ +++++++++ + ", +"+ ++++++ ", +"+ ", +"+ ", +"+ ", +"+ ", +"+ ", +"+ ", +"+ "}; diff --git a/navit/xpm/flag_bk_wh.xpm b/navit/xpm/flag_bk_wh.xpm new file mode 100644 index 0000000..6b87fa8 --- /dev/null +++ b/navit/xpm/flag_bk_wh.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static char *flag_bk_wh[]={ +"22 22 3 1 0 21", +" c None", +"+ c #000000", +"* c #ffffff", +"+++++++ ", +"+***+++++++++ ", +"+***+++***+++++++++ ", +"+***+++***+++***+++ ", +"++++******+++***+++ ", +"++++***+++******+++ ", +"++++***+++***+++**+ ", +"+***++++++***+++**+ ", +"+***+++***++++++**+ ", +"+***+++***+++***+++ ", +"++++******+++***+++ ", +"++++***+++******+++ ", +"++++++++++***+++**+ ", +"+ +++++++++**+ ", +"+ ++++++ ", +"+ ", +"+ ", +"+ ", +"+ ", +"+ ", +"+ ", +"+ "}; diff --git a/navit/xpm/flag_bl_wh.xpm b/navit/xpm/flag_bl_wh.xpm new file mode 100644 index 0000000..7fa9856 --- /dev/null +++ b/navit/xpm/flag_bl_wh.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static char *flag_bl_wh[]={ +"22 22 3 1 0 21", +" c None", +"+ c #0000ff", +"* c #ffffff", +"+++++++ ", +"+***+++++++++ ", +"+***+++***+++++++++ ", +"+***+++***+++***+++ ", +"++++******+++***+++ ", +"++++***+++******+++ ", +"++++***+++***+++**+ ", +"+***++++++***+++**+ ", +"+***+++***++++++**+ ", +"+***+++***+++***+++ ", +"++++******+++***+++ ", +"++++***+++******+++ ", +"++++++++++***+++**+ ", +"+ +++++++++**+ ", +"+ ++++++ ", +"+ ", +"+ ", +"+ ", +"+ ", +"+ ", +"+ ", +"+ "}; diff --git a/navit/xpm/flag_wh_bk.xpm b/navit/xpm/flag_wh_bk.xpm new file mode 100644 index 0000000..4564f8f --- /dev/null +++ b/navit/xpm/flag_wh_bk.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static char *flag_bk_wh[]={ +"22 22 3 1 0 21", +" c None", +"+ c #ffffff", +"* c #000000", +"+++++++ ", +"+***+++++++++ ", +"+***+++***+++++++++ ", +"+***+++***+++***+++ ", +"++++******+++***+++ ", +"++++***+++******+++ ", +"++++***+++***+++**+ ", +"+***++++++***+++**+ ", +"+***+++***++++++**+ ", +"+***+++***+++***+++ ", +"++++******+++***+++ ", +"++++***+++******+++ ", +"++++++++++***+++**+ ", +"+ +++++++++**+ ", +"+ ++++++ ", +"+ ", +"+ ", +"+ ", +"+ ", +"+ ", +"+ ", +"+ "}; diff --git a/navit/xpm/fountain.png b/navit/xpm/fountain.png new file mode 100644 index 0000000000000000000000000000000000000000..7a6786f5967db50370e44721db1de032c2c616db GIT binary patch literal 975 zcmV;=12FuFP)&h-{16GlC zFvFCUtrvPDbs%^pC}ki*2i}Teyx*l)Qp+NXt##Xb z`VRAv!g(&H78e(n0ho_6o;Y4G z80;Av8%s4Gwq7#Y1Eg8qgU%_qi6OAQlTbtgnJS}WcM;vj9aOfma79mp(>AcZk;`N< znW^dN>8npn90&xIiHV8N4Muw5EA}Eiqd$*Ls|)eQ4J1Ql1k2x{x0yy)At zj53N9=P2&8J+N1noX^BU!;%H?wR{ybhR7JFZDb`E`kbGS?Q0oy;JEFZ@;@h!}! z*RWkOQPF8=mWZtijoU^HWu+ffV;7{|gWvk!g~2-D$T9%aEJ2jo!HX0G29Ov)U;tBZAXK~#)z?~&L?RC# z-*J6yZ7rs%YW%oQXbie`+8V_TXt2YoY=W*8z#26$W&=#C3Y%R9N1LGbR^V~2E4k3g$ z3Ssc&v zO1)lBO-)T*ImpZ$RNR-Ts_GS*ra$!i{m;p=%<()AK@d=@)vCI#|FFEgeB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/fountain_16_16.png b/navit/xpm/fountain_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..25c6f3b11611ab005a13a3ad30ccbc338925749a GIT binary patch literal 647 zcmV;20(kw2P)FQf-Uc(jp-U5vh$s z1|0$}B~lf%6#NqmC>dSs! z_dL@NIOe&*kvC&kcprc-)+K)8nRDDdJijOf+3c|up*UzRg=vz8W2H7eg*jU2|2 zhaH!emQMJc?T6g<>)QiNEfi>F&y2dNBS!7V(_*pM={XRK#fIYX_p^igMwvHb{IEjXJ@^pX@1+<+EV`+SX^9O;QM_qOUEzGtZnbpL01Ee6og7h z@R3D`txfFmQ+C$voAC?QTLXS?DWA`0NdTCho*tbzJM}EX%rkEa3<}~!aJ7%%tE-?Z zpWq}r*l2t3Q;I?3PN8cdD8*KtXf_&8NC1dLBG-;7!_nuJahl|PU}*}J;733(;TAYF zDGv(PVd$L}c)<;ujmBwLd6(y0pGg218ynkjvDAghzJ2*u<$%-)8hWRN9eM->>Lkj} zQ81zxJjX%qe8oBPL+wD_`>v{L>W>GBL}FY~ln0U|^{a+6Sf@Oq$%wGg4nS|fp_kz_ zN;{O%Dpaf0jrH~QyDKXzd;f`)OeSxLqPWoQc6qzq4vyn2&1RF(b=_vQTHkA$mQJVB z*`6Nca=F!TI7~{Cbd_be#q|@(tKEL1HJ^BI<^-vF@J*V7wZt7_q9^UbvS`iPl z>N}HTv@_5nRhL)!bohq}zQYSz_y%cO!?hP%U)+opx#{pNheXEi-B~w%_9yh*`BSpf z^<9QxPw`6=LM)~%+ga2Cq-cfT1B#r6UUdxC7FiKlBj}4{C(jTAtIluOgbF$O7 zcQbbMX7dM>_q*f9Y|iB^jS7_H$?NZMO0{As`}gMwemc5bvdN182cUdEe$-~dj~_q& zW1r7AR1up+E;sLBV9@ofK{$yOf~9H3pyUP@qx(8Mwy)&#`Egy>Q~wo!zP`S|_U+q$ zyL$I(l=I8j;V$5t2lnAhyZW$bx-lp2K%+!pXS=fzupSQt0+b|4i}83o z^GV+K`V08}{{A1Ss`_M0OUsr-BEjt4yB9zG3j;0qRS=adr1Vt;>?Q=3M8c3EG;TpL zlR|IZEcBai!Llq!l4Oda_{PY{$e%7_yK0Ippl!U}X*D@-^7gSJ9@FvAUi?w0;k~4vsA9EB;+O zckb6T?TK2g7D*Ib--QjnUt3^qH5jwTt~TqSg3 z3a!;Cc#Ruy>6hV1jl*l*hFb(`riqza04t9?iD=!UShp19-oHe2wzs-Cj@wf#7T;W1 zSxMXtz<%`T(cibWwgy5A7KW(rqgo??_!Uqs14xtw{aaHY)?p%tB-> zw6(QiCc2K$nhV*EXTVSZLjjcJLCMpP>2trqv&WvXheDz5SS&X5F@Wag=3kyTapLP2 z{`Pm`W&U}9pa6XVBw>MR>IKu(i*&w*#^QA>XUZrLBJ!3E1|y>a4m44Nz|)v+ItGR! zQCxfnQiBIH2{0@J&bJH3>_w;!*;-p$dpDg<-~Mn9kWQ!bK)GBd;w2j_dE*h`Xa!xT zfU4#|Ga~rUK8Dg-3jN+HBpU~w=Rde&ODSAiw}F-ctGtflQUp|>2h6{=Y1ROLdl$^2 zp5M1`-xnj1$X`DU@CBF4Rk?EIihi)aM;RM^1$xUtP$WQ!4PZ!sCILdQTbhypmC#%k3WH(43oqw?jkBW}_&I5`cei!uoJH zd^;En`pinP{QRTq+|blnB$^L{AxV&#+aOQ{t+j!sfSRiZD^w433Sh{Mcg@|occ@^f z4PcT0s>LiC;^(oyw;qv5B&@2ccV=eh<&S;?l}sknWf+DcNs?Vv>dFT`udvx07f@V{ zqN;5LYjeO#UI%h<5V-_u*#xY75=3boWX%9?lRtoAC;)|Jh_N@&ZC=Gdw}$EI>FYet zw@gk>{^IoM)8~PY7f~O81KYN3dwg(kFp$Y)bid!v`~809t*I!Yc^2uKf;H0yi)2s} zoFL`TfV9dmGjWJy2{M_7n>Wxv>hL=mxEo|dB9U9BX@cW8^5VsdKN}t%K6@wdZcRu4 z=xAzcdU|kh@K}3$yC<1UW&}YnJsywf^Z7V}*jQF7m7wc7SeAvND4?i~1I=c$h(@FF zLZJ}ndEV>wdgV|k^!n)N=nJ=Q-Fok%VfPX{Ffj1zmX?-7e!pLnB#B5SlO=*6R^4uQ z%rs3HhQU~tWmPH_!m=!$q9|DuMXkQRo?cvBOwY~D{ds(Rd?*|azj?QS`<;kHzu*6> zU@&-C)3gf5afQ0Nx_U)XWKk4Bk|YX+LPgj0HN!B9BuQ4n;qchR#Ka4!RBGv7#`il9 zYeO6Uf1^~+CvRNn;)|Zx+$^dv(Rh91UZcPvbFbo5hWnUi|8M$XTu!(t~ zR4OgG-EJeF&-?9myMtv}Qj#QIRaH^bG+t2@uq=y(g@wY@)YPkEV`FFL=jT5a;6a8` zDi{oYOVhLgyWOrzl4MwxWo0s%Xfl}$&(6-i5{t#s58(Sy5B2}iKLN{!g#h4nmNftX N002ovPDHLkV1g`uM2Y|a literal 0 HcmV?d00001 diff --git a/navit/xpm/fountain_48_48.png b/navit/xpm/fountain_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..109f9bedf3c2be8bd6bf9c5456d32a2056bfb180 GIT binary patch literal 3162 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 O7(8A5T-G@yGywo2U~<#| literal 0 HcmV?d00001 diff --git a/navit/xpm/fountain_96_96.png b/navit/xpm/fountain_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..f166f73764e652a0cab474b26635ef675606a8ed GIT binary patch literal 8780 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/fuel.png b/navit/xpm/fuel.png new file mode 100644 index 0000000000000000000000000000000000000000..9c046d6ed3efce3aa5318471330ae8bd003e2620 GIT binary patch literal 568 zcmV-80>}M{P)siK8{fPFd( zL2Lxk!oq-+g$fE{AqavfXl>ysSVRqZQ{27V-LcrcbF(*hV#oti%-eS!p83rr=;Mp+ z)lukfGZdDl+9OFKNBBoOP%nRkd5my6BVdy5;*8F8+{*0SMwa%5-32_wMV!Nrv0%u{ zj)fOzq-naT-J5^gUiuDa@e;3bY5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/fuel_16_16.png b/navit/xpm/fuel_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..98bc575ad7002d4f784da643c5c46f38b623f928 GIT binary patch literal 504 zcmVm!IV83*Zw2uO2M5pZzC8b~fKPbl z|8%^Fd7Q`2$?>5Z+eVBGx~gk&HZ(oK89YS07rI~U^X=HXr!aHdC*wm28@opbuOxpEiEyQUYwK=VC*u5oS=5W!e zY1(zNI&VI+=;N$gItfpM(r?nD8G{s1%y z&@QTPyx$$oomy->EJIaFxjNSn5XFg00002rDq_ELW zuu(~&O$rqeEewJp_)xomg*K@yqNt6=DlvJ5;s;_-kRVIQleoj%ox3~N;?BOE-M1gJ z4@?eR?#!8c&-u?eXYReT1<_@ct!4i*PF-T(`|(;IUW zxnTdk9WLfeVvJ+kjY}8(b-qaNJCF{Z$Deo$$MFi@Hd6Fc0pRTFZlA0?EQBD>^9}vc zXTP5|{RsBq>GJv(9I8Uh1ZcP0n$70A(|+sU*N_+S7_P$$_z@r02FUYVv)P;&ff#2l zBTeZu|41tAZPkY}0Xm(|Q~<7;Wde@k)e_*nxd2iMvWmk^NsdpY6fBnapfPJ^2tk%* zb)DZk<=IK>#Ga~hCcrG|T;QgygsvC>F?DDGH^$FXehKei$*eyX^m-3!vymMJOFs z0E#dG>J7G>{(5--7=Y``{(NnK(2nxf6vzE&3{r3oYq))kxoZ)S)duLT5n7cf41rYi zgA_zuz%^scUBDI6Hov|*P6g<8$g?=&bR-Jhp%jodqQx=hel7b)@I^g<^#~-V8|$D< z!7xA@+sByu24|(cp&mf5O~@uW9z>=$yhe45toMC$SjIcJp%y?`D~qra`i*t40bmuo zCYW52PD{7e0!R^<7XC5{`OuE|8=jb8vi}9_=qsi!#ocz4w^9^Bmg*s7N?p?DtyHWP z`4%_ho-roxF8e=f0t}pnR+MMSamWm{*c+O59REt^!KyUyoU}l#15E!4+T@Kmw(?^! zaoRu9+3yXU!3Vgq)IEfQ)xk3XLL7EnQ;tX}SjL;uHr&8rd{!Ia%xX`wG5gQ$_po71 zS2~D(EG;~39K$c;=0`j}qPwfq&)epaClMz_;Aexsoc~q&00*Qq`=yizNN;&rf6xB| X6H_ZxSJ9QZ00000NkvXXu0mjf`jo9$ literal 0 HcmV?d00001 diff --git a/navit/xpm/fuel_48_48.png b/navit/xpm/fuel_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..45545bea3eacd4f00acabc6f5694754e67e3ae93 GIT binary patch literal 1363 zcmV-Z1+4msP)fx=ghQByEZ4wKgH)sfo#+Mv{5n8Is*(caut96lD-CrP z;S}JmKCbyX@S6AA;TRJE&;v*OYm`!L#}n6YV|XaKRz41#0o-7}pA38qTnv2KHvls;Gc;SetuOf$#bPV0wC*W=jVZ_Q8mB-KqQotOwrB{I&>q9$1OVKD_~mwSZEp^TWdQ9fu=9ivjxhmU}#}g0ABzfVB%pp0p+0w z0F7olh5Jg+VE|kW+(MwR_2feT0d2K>2_`EQvQVXNw94DgB%>>UGb3-?3ryMZ@{qtm zZ>JM2=%yg4@y`Z6!xX0&+HLt*XtI(EU3Sh8NlBX}_Co|{f~t`PFa;a~JOi8#%ywAL z*)I69D*>3;FdFl6u`{;3i-xa2@b$hvmjC|1C7xvkOTg=$4@B zf~tdRfNp@Qr(D%@7B~RBV8>T=czg|5Y{yd}fl2^GghUCtVU*TZNypR6$w<}$V0L9- zTIMo35^z2I-jG07E+mNx}qg{g}qBVnPMUH0gQB5c@lWvj@SE>U1lLE_vy$LVEbWR&VT0XW9jHsO!UpO=sK5oXkUOYaf!R0*E3KttEid##-C3X!ZY9!c8v@g| z4txUq1ssJrM%+@e^aYlGM90wJ=AI1w_N?t+B-3sXf^N@@BpT1TZ(zX0^CiY4}yv@ z;M_&qpziUX=2>73@Pr*N0#2~H?Zj+5A8vPZv;`U>Y~0hTtnBx#(qL!;cK{Cp=K=G9 zA2C^{^u}laT43AkK|hWA9eAUg8)5+LqQrz1=)*of3*i5M>IX_Sdd(pNrbFHW{{l3t VS?k&5D82vy002ovPDHLkV1l3UVqE|L literal 0 HcmV?d00001 diff --git a/navit/xpm/fuel_8_8.png b/navit/xpm/fuel_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..7b6d056547ebbad6f437449f8a6e8873bf2c6d89 GIT binary patch literal 281 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 c #FFCA8B", +", c #C5C5C5", +"< c #FFFFFF", +/* pixels */ +"****************", +"****************", +"*****+$&&%o*****", +"***$O>>>>>>=.***", +"** >><<<<<<<>X**", +"*X><<,,,,,,,<<.*", +"*%><<--;;;;;<<:-", +"*%><<<<,,,,,<<<+", +"*%><<<<----;<<:-", +"*o:<<<<<<<<<<< *", +"** ,<<<<<<<<< **", +"***#X;<<<<< c #7B958B", +", c #7B95B4", +"< c #FF3000", +"1 c none", +"2 c #BD9500", +"3 c #BDCA00", +"4 c #FF9500", +"5 c #FFCA00", +"6 c #FFFF00", +"7 c #838383", +"8 c #BDCAB4", +"9 c #FFFFFF", +/* pixels */ +"1111111111111111", +"1111111111111111", +"1111=;######%..1", +"11- %2222222;3+1", +"117;%%%%%%%;X:*1", +"111@99&2456X 9*1", +"111O-%4<4;;& 9$1", +"11-;4<4;;;,9 @11", +"1.#222X;-999o111", +"1+;%%; 9999@1111", +"1OX%X9&99>@11111", +"1.9899&9X>111111", +"1=:>:>X=11111111", +"1111111111111111", +"1111111111111111", +"1111111111111111" +}; diff --git a/navit/xpm/gc_mystery.xpm b/navit/xpm/gc_mystery.xpm new file mode 100644 index 0000000..7857292 --- /dev/null +++ b/navit/xpm/gc_mystery.xpm @@ -0,0 +1,40 @@ +/* XPM */ +static char *gc_mystery[] = { +/* columns rows colors chars-per-pixel */ +"16 16 18 1", +" c black", +". c #000041", +"X c #003041", +"o c #396500", +"O c #7B0041", +"+ c #414141", +"@ c #00308B", +"# c #0030B4", +"$ c #7B008B", +"% c #7B658B", +"& c #399500", +"* c #009541", +"= c #0095B4", +"- c #7B95B4", +"; c none", +": c #838383", +"> c #BD95B4", +", c #C5C5C5", +/* pixels */ +";;;;;;;;;;;;;;;;", +";;;;;:$$O:;;;;;;", +";;;;+X###%o;;;;;", +";;;:@#XX@#-o;;;;", +";;;*#X,;:@#-;;;;", +";;;*#%O;;X#%;;;;", +";;;>X#%,;X#&;;;;", +";;;;>*$;*#o;;;;;", +";;;;;;;+X+;;;;;;", +";;;;;;,X$;;;;;;;", +";;;;;;$ :;;;;;;;", +";;;;;;,+,;;;;;;;", +";;;;;:.#+:;;;;;;", +";;;;;:X=+:;;;;;;", +";;;;;;:$:;;;;;;;", +";;;;;;;;;;;;;;;;" +}; diff --git a/navit/xpm/gc_question.xpm b/navit/xpm/gc_question.xpm new file mode 100644 index 0000000..9de0250 --- /dev/null +++ b/navit/xpm/gc_question.xpm @@ -0,0 +1,25 @@ +/* XPM */ +static char *gc_question[] = { +/* columns rows colors chars-per-pixel */ +"16 16 3 1", +" c black", +". c none", +"X c #FFFFFF", +/* pixels */ +".....XXXX.......", +"....XX XX......", +"....X X......", +"....X X......", +".XXXXX XXXX....", +"X X....", +"X XXX..", +"X XX X X.", +".X..X X", +".X..X X", +"X XX X X.", +"X XXX..", +"X XX X....", +"X X..X X....", +"X XX X....", +".XXXXX..XXX....." +}; diff --git a/navit/xpm/gc_reference.xpm b/navit/xpm/gc_reference.xpm new file mode 100644 index 0000000..bd19a52 --- /dev/null +++ b/navit/xpm/gc_reference.xpm @@ -0,0 +1,40 @@ +/* XPM */ +static char *gc_reference[] = { +/* columns rows colors chars-per-pixel */ +"16 16 18 1", +" c #00656A", +". c #00658B", +"X c #39658B", +"o c #39958B", +"O c #3995B4", +"+ c #7B958B", +"@ c #7B95B4", +"# c #7BCAB4", +"$ c #7BCAD5", +"% c none", +"& c #B4B4B4", +"* c #BDCAD5", +"= c #BDCAFF", +"- c #C5C5C5", +"; c #D5D5D5", +": c #FFFFD5", +"> c #E6E6E6", +", c #FFFFFF", +/* pixels */ +"%%%%%%%%%%%%%%%%", +"%%%%%**&$*;%%%%%", +"%%%%@#*=;-#@%%%%", +"%%%@*,>,>,>*@%%%", +"%%@*,,,,,,>>*%%%", +"%*#,,,>$*>,,>@;%", +"%&*,,*o. O>,>**%", +"%$>,>@.X..*,,;$%", +"%&>,>@ .X $,,;*%", +"%$*,:*X..o>,,*$%", +"%*#,,;*@@;,,>#*%", +"%%@*,,>>,,,,*@%%", +"%%%@*,,,,,,*+%%%", +"%%%%@#*>>*#@%%%%", +"%%%%%*&&$&*%%%%%", +"%%%%%%%%%%%%%%%%" +}; diff --git a/navit/xpm/gc_stages.xpm b/navit/xpm/gc_stages.xpm new file mode 100644 index 0000000..ede38d1 --- /dev/null +++ b/navit/xpm/gc_stages.xpm @@ -0,0 +1,45 @@ +/* XPM */ +static char *gc_stages[] = { +/* columns rows colors chars-per-pixel */ +"16 16 23 1", +" c black", +". c #802000", +"X c #804000", +"o c #A04000", +"O c #A06000", +"+ c #804040", +"@ c #806040", +"# c #A06040", +"$ c #C06040", +"% c #A08040", +"& c #C08040", +"* c #808080", +"= c #A08080", +"- c #A0A0A4", +"; c #C08080", +": c #C0A080", +"> c #E0A080", +", c #C0A0C0", +"< c #C0C080", +"1 c #C0C0C0", +"2 c #C0DCC0", +"3 c #FFFBF0", +"4 c #FFFFFF", +/* pixels */ +" ", +" 41-:3444434434 ", +" 3#..#244444444 ", +" 1X.X.;43444344 ", +" 1X.X.%4442:=14 ", +" 3@.oX%433#..@3 ", +" 4:Xo##34-.X..1 ", +" 43&#&:33:..XX1 ", +" 442<33,31XXoX1 ", +" 3441+X#42#OX$3 ", +" 4443=&:33&&&>3 ", +" 44433334333434 ", +" 44434444,++*34 ", +" 444444431%#:44 ", +" 44444443332334 ", +" " +}; diff --git a/navit/xpm/gc_tradi.xpm b/navit/xpm/gc_tradi.xpm new file mode 100644 index 0000000..c183b69 --- /dev/null +++ b/navit/xpm/gc_tradi.xpm @@ -0,0 +1,41 @@ +/* XPM */ +static char *gc_tradi[] = { +/* columns rows colors chars-per-pixel */ +"16 16 19 1", +" c black", +". c #003000", +"X c #393000", +"o c #393041", +"O c #396500", +"+ c #396541", +"@ c #414141", +"# c #7B6541", +"$ c #7B308B", +"% c #7B658B", +"& c #399541", +"* c #7B9541", +"= c #7B958B", +"- c none", +"; c #838383", +": c #BD95B4", +"> c #BDCAB4", +", c #C5C5C5", +"< c #FFFFFF", +/* pixels */ +"----------------", +"----------------", +"----------------", +"-------%X+@++ -", +"------oOOXO+oo+-", +"----+@OXO*oo@>$-", +"--&@*+#*@oo;<<=-", +"-.@@@@@o ;<<<<*-", +"-X@@@oo@<<<<<+--", +"-+ oo@<%<<<:+---", +"-X<,<<<#<<+-----", +"-.<<<<<%=+------", +"--&====+--------", +"----------------", +"----------------", +"----------------" +}; diff --git a/navit/xpm/gc_webcam.xpm b/navit/xpm/gc_webcam.xpm new file mode 100644 index 0000000..602d694 --- /dev/null +++ b/navit/xpm/gc_webcam.xpm @@ -0,0 +1,44 @@ +/* XPM */ +static char *gc_webcam[] = { +/* columns rows colors chars-per-pixel */ +"16 16 22 1", +" c black", +". c #393000", +"X c #393041", +"o c #006500", +"O c #396541", +"+ c #7B3041", +"@ c #414141", +"# c #7B6541", +"$ c #7B008B", +"% c #7B308B", +"& c #7B658B", +"* c #7B9541", +"= c #7B958B", +"- c #7BCA8B", +"; c #BD308B", +": c #BD30B4", +"> c none", +", c #838383", +"< c #BD95B4", +"1 c #BDCAB4", +"2 c #C5C5C5", +"3 c #FFFFFF", +/* pixels */ +">>>>>>:$$;>>>>>>", +">>>>>.1333=2>>>>", +">>>>.3322331,>>>", +">>>O33 @@ 13->>>", +">>>X3@2,&,X312>>", +">>>*3&2<<,X31,>>", +">>>O3#3,<< 3<,>>", +">>>O3<,3<@&3O,>>", +">>>,O32##<3<&>>>", +">>>>&X1333O+>>>>", +">>>>>>OXXO>>>>>>", +">>>>>>: @:>>>>>>", +">>>>>>:.=:>>>>>>", +">>>>>&*<=@%>>>>>", +">>>>oO<<>>>", +">>>>>>>>>>>>>>>>" +}; diff --git a/navit/xpm/golf.png b/navit/xpm/golf.png new file mode 100644 index 0000000000000000000000000000000000000000..57521993a5506a9a0c39ebd8d12c4ddffa4761ac GIT binary patch literal 458 zcmV;*0X6=KP)?647OLXVLg&<0cx)K7SNUM|@W14XhrgqgkHF{RFxc9qk22I7XZqO`ZNXb>|L$aV45au!vcWOpE*vFL^K)=;jV8Bs*f)*AZ_3rhGmfT zWE2w07)!yLfv+k3Z%P?UD1h|M$RyMqOIfxBZn6c{smP4y-G*U^(c2JF6p>&h$5OU! zqgJV7qwJBj%3A@X?pwPptkp`myuMgiyOiS;uHpT8Ox7ub-Y@mjL9e@aJI*m zj+fyp3088<7@G|+xCM>gHuWf^V}t9MDqKu5ie9gWqr)?-798v!>>>OZV z4mNkHD3yx1?e`G`0l1#=2yxDvp65Y`1aTZANfP+JkEzIbgfvYXP9_sM1dik2{_X+o zb~_t5ilRZKP($$egqy1YL=2pq9>e#268vxa2Aj)_oQ9&(<^TWy07*qoM6N<$f}WYp A&Hw-a literal 0 HcmV?d00001 diff --git a/navit/xpm/golf.svg b/navit/xpm/golf.svg new file mode 100644 index 0000000..45c11b6 --- /dev/null +++ b/navit/xpm/golf.svg @@ -0,0 +1,186 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/navit/xpm/golf_16_16.png b/navit/xpm/golf_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..01d361b91e70fe5f76db7dc652db156ab0c0848f GIT binary patch literal 344 zcmV-e0jK_nP)030ufOW z(YM7yi=t5AqKivn0%HsSx8pI^T7b5Tv!||5RYs!`s&VF|03c0MMB3=JCk4hBK9)=T zU;y6deUJT#h^VS++qOENzeY<$FF1~9ttCmKTgQI^4kH4D&_tQu4Gx0+`GODvo6QDe z4Eudt&{@GbcQ>8R$n$G<&5m6NNA{noQ&3gab6FN-S%$TirfC2!y9AvT>bibktyXNe qU#vgZOePb6?`V%muDtg}AM^vrZD0~PS!B=v0000*0WnHF>lr{NL_E%9G7KFY1)$Y3MD_afo&o@fNc%1#OwXJG zAQ2=1nmq%E7gkEO#{eg%jsoC$+9sSmK)n5(AON{s4r2^at7Q#fkGus$DMcccL`2Zq zKBHZEpmT8%A)x~RT3zfwR~~>(A1I{=68i+uX})-IfaR4hD5YWmtF-Q^55&58{VtB< zAR_p_KWY=ND-&)7Ieu&eldNJy2*a?y+n75_{-Rp7CiC;xWcJ)8**VIu>beR#pa>EH zz7FV19k71C>ney9r(&bBfna(I@FxStP*G%PMz!7oYzNh-wh&{#1J+g0S^u5S$wUHi z8`c1O?gQ-|sMm3|+gpIGCXD|F04nPh{Gi9j@pdq#Zg8A^It{lz6fDAf<(0=qsItpM)ay3Lu{8N#r_KsLwV zp~HBdhxRmU literal 0 HcmV?d00001 diff --git a/navit/xpm/golf_48_48.png b/navit/xpm/golf_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..28bd09753fd6d1db113e5f1176c3c6fa358dddaa GIT binary patch literal 1282 zcmV+d1^xPoP)q)MUY&ApyUw92Z~}Kd)SBpiNOd;HfF}%Y-ZWr$xKgozaD0% z?d_e!kFC)`^1x8l)iw3hQ}0{#R#n3T{0|^K5XW(nzkK>7VU%B78xFZfdO%aY6G zj+)?BCK?eDSxHe!W#2KrbtjhJdDm<=ykNn4|vFBQsvl$kL+0Je!n(w*;) zc=o+xS;@1N%C8qjERgMV)(RqmZ97T5D2zPe zvZI}j1ziz^l9vb&ViUALA6%&GKIy2el)?(rR0HNh*~!~$OHnBLNu9XIME|Gg+aylA z5-Vg{>5h<50ahXROV>P2!$)v_>gK*t~0k z7BF-o>xFDo77<#V+X!awn6p6N1iB8BLFRx?DtvRL6y65YNQf5zk&TDy5j%H9@=GCLY8i<^5toS6n`C5d;C~0Xvbw zS_@<^c>(gCPrKbl8Fbvf#DQKXGJv4f*;*@Y&V`JuLL!0+6}PHYu3o#we0`Qu*=P5} zZXVh+hG+o=TOO|P+k6$vHn(~kYiV-w7$2WJ!T4k2*tSj3YEi4z2o{BsTj8CLj-oAD zv4Db(_1A3*BLdE!zrd-_PjTSDer9HFvSY_~Y}>}NENt6mc6OHckAJ|$Z!U7^&_V3Z z&72P`u9w@0fLC5R$g8ivjAdEeo}1%F-a~7h{4C32eA_mj-?tB?6w}kwP$&%1Xbgk^ zw^YefEEZQLt-|v>5LOB3=3UptaU9$z8fqCJHzA<7dGn^^L2J#($Ow+(u(Y&9^KKIn zAq+zrjRvmkQeRjgj^m;MZX*Js^nJgGP^;E(at?(;0hA(^7}s_2Jdd;I&JisM?RNW$ z0d6A#>N7WfP1b(fv5Dds9YsV@#MZ4_$mMbQ?J*V`MJuzz0WcE?i&>HK7w?2twy*_eP*2#74qHHtJak-r|rgaQ!%XNsXaTR sCnuf_El&V@)xJn;z0m~s1N_(c9k;*~&Qm6pkN^Mx07*qoM6N<$f|Tf8KL7v# literal 0 HcmV?d00001 diff --git a/navit/xpm/golf_8_8.png b/navit/xpm/golf_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..80b51dd44b182c0d62fb0f728ab55896ce008a11 GIT binary patch literal 190 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 btP=kZY*^%0jMWX600000NkvXXu0mjfz+BV< literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_about.png b/navit/xpm/gui_about.png new file mode 100644 index 0000000000000000000000000000000000000000..746078ec7e6573b92c38ad2aeb5529de1637b771 GIT binary patch literal 2777 zcmV;~3MTc5P)f_9~q&`PWnt#*@$gsilRh~h+n)hbzp5O@_KS!9(cijw?@42u>oe(;DH zKVXKzp0Pd8?w)?taMP;@B8jO=hmt22L3<(v_YG7;YS}8 zK9xT_#D=bQkUnCb7HcQ9ku%SJzuC?GZU(f zSkBBvG6PGR6|$vG1QgIrE_#cwp}A>(=P8nj z>BYDjCQflva91v+wE}?%)kb2&$cQwFrN2At^=<9YhfbC7*10$`u($93=TDvd&;>cL7qTxRF)31-LxGvOM#ozzEBO|2TQ=hyhlhndEnVPE_Uo-9O&--`W zI^0>vXFO&iA`qGbMMR)<;PH-aoqi#gR_7M#CN>remC)`Q=+w2y1aphY?W4bY`k9sL z;5DfiAt?8g>jpeSfIT~3HNIBVolEP#*s~+&X=WloF@cGoh@iLyYVO<7+v(qOO<%^> zL=a$NW--3?BY6axZo2C`2R^r{2JZjC;V-6r4D9GhnKQHH#Mg>E&3wafPs;O{+M<~V z%mgA3p#=hQ%h+&#KIlmMtTl6NEK0S|-F$TpfcyxM6{Yu@42Z}-T;1!TSPd-%@HDfh zn6`BInp?t&33yL5;eBYL&|JB0oB*C; z(uzrIMUBL`D|^y#PCmOS1}x}`j7LafCxv`kZ|zKLCLkRst~L^PaxZ# zRET0L+GCoWUrdg_yP&Qtboc{Xv+OB`QY--AoTK^05C=!k%j8_eT|Zpl?#`3|fI#3x zV4O%gt&mvPwJ8RigK;9lL?96&0tkfJ#fB*^#`-rek7rW8#-H!*k3C!?zdtZ)b%60u;zdoM*?5%_0t{vU6bAVzIkRuU51S{%|R&T)Cx69SU27U)mFV;;x zOr%(iOtBi-`Enyj`3isgg*|moGkcn;78!)Gb4)}6fmTdc_U6#HHJhB6m{;BTlxWT5 zMBs$U2l4bmLlNAumFQV@4FpUtoG*r1VrC}bh2KxrPEHmhCZ><>=rYp_AxDW}t(ZKm z$XAMdPqFVY1zzj5QnaubaXmD&v%k}6CTiaFnDQMdK6+}_8e@LEDF*gG`su2*_L(={ zE>a<%Rf+&+B4!{RXbcYI?D%9^dx}YOb9wYNldlyw(cE`pVovWKDp;*FF*6hsb)*!} z6eDlqY`N4kW%q500RRw5zB_ulDc%j-*8pIHO&*TBIGiG`t9Kf6C3%L{rm5+n`Yow|MvNJot1qDPt3ZmTuO7Z zlEFkYQ0QRH{a_d${15sRMMReD&63kIbi#? zyb}l@fYyvdC#K>kHvh3&4eK)Se^1=8D3Isg7@Jd`QtU*;31FSTIT7a^jCEp+lQ^-G zBvxiibqw}(I;Pe!0GtCx-&ycr)UQ8O0{{>v@zY07&Ll)41hj;USSMnvh_Oy$V2{< zGR9D148^gbI57x(&jr4A#yOE@N#MT^oJzttd1Nj8>ox$8B#C+WX9rHnVm;=xwkbv< zYm<7~nkX_X8Lb5L>~BWh{9^dx;U^z>el6^4eyCp>lSh7b zeBh=p`mdil{a4+cY29DQQY!GFnW34Wlman9DQZ0@gHD|(sb_w5M9NAU-m95E5Nln>fMjR6gg1;Hsy$89igWxUS0wji=y%)GdYvim$@%&jt^_mld*VeW`mN<09tV)SeuMBm^}CWWu8lXqi69G;vwehlTg8A$vF5RZP~ z@y8c zN}=Z=u8zy4P&<_G!#eZ;NCR*!m_K^rl31$&Zk?;zI5vhSlsfvCmBIN!&lN@ZsWgZc zAb^O2vlcdq5!UOd*D5GZpF^cont$~K_5#SZ#M{f@va#A$f?I<1rM9=-g#16=gRgew zF~Y2GO9$qn>ldrOI2#|BoW_ffKZjqQ97h>I3?Nw|*j!@kmS1bN2B;;p4Yllj03g-I z^*8?6xBItcZ{Jqv_FG?A)R;a$HFa`{*aXegiE&{zmZ#0~RJthE(oWMd;Y-2Gw(ZwT zmutcMN4`DEmn+~8T$R@QJkYL-rNS8((yjdqna6rK00000NkvXXu0mjf3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + Dialog Information + + + dialog + info + information + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_about_16_16.png b/navit/xpm/gui_about_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ae7063ab5e4c1a5d572e41a1b841872230971922 GIT binary patch literal 618 zcmV-w0+s!VP)r<-!o`c4=*2JK z2QV7XhC~k@T0es^euG|&iKgB(*!YsRDio^Fb^!}4EDP+yG9H9TVCA1oGMW6I-}B52 z!HlF*oaW}fhL}-nK2IgPP7HB6yp{UoUpm|0IDJaIA~0LAIqhhz{>Nioe)!_v#llQM zD#dAMVf)n?A5X*=gHp&ZyPAe+XAZTlTJIm`tL^JA?_X6%yf7)Kgwqd}yfkrPAtIZZ+%)~8bY9biCjjpLSD<)E^3q~Ja*K>IMhQ3wA;5rhA_$ZO=UuDg{FDHM zi+-=fK71>Y{h~IAMg620N_Zqp6+FS8kW^|H(R<(7CGC^=8gTL_H63O zoCE-nev_>HGOvYu@IWLD#H6jpTJo)blAHd8Vf=#16RTY?`#m@Zayx~V6X$q^zq3(B znf$MlD0-YQrwIrExoueAnH!G61-7X zEAMjI>?QyefCiuipyMPMg#mB_5QlpJ=mD^X-T4Uo14XIUp%R_n;{X5v07*qoM6N<$ Ef|ej5m;e9( literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_about_32_32.png b/navit/xpm/gui_about_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c7b23b4a2b5a8f7fa1e11ce646eab468029664e1 GIT binary patch literal 1544 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 GgeCw`V{;h* literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_about_96_96.png b/navit/xpm/gui_about_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..463c98043be50b3094f6e4dfc10dbfae0a104053 GIT binary patch literal 7434 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 IM6N<$f_hrS(*OVf literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_actions.png b/navit/xpm/gui_actions.png new file mode 100644 index 0000000000000000000000000000000000000000..b7180af8dd9b92988c6118cee47e83918f3177d2 GIT binary patch literal 1971 zcmV;k2Tb^hP)>W$y#y^^4#%fwIO#0jChz#xW4`tea4? zC2Pp(+Jqzo667ckB_(OCma3^x3pQTN zBlg<6?B3UW{c-nUZvQMSEM?AYR563qp}FoF(;695q1yLZYxx4Q&}!Rv}0`=$sWqVzmt!^3mR zqo|G#?s`!1U3F9}Uw+46XJ;p$P2Wg3T+Ea?QB)1Q`SUkbUAL7D{A-|UHvMF;7bD>? z#=>EYgu_t$eh^VH6w)Y4KqwTlF~;jzg2{#UAtJ2(&94#h`7j6|;`d|Cp+h$;V73-w z?d|P#5bzK&y4?5bAO2lvN6tBXn>XQ+k&6HT!!QsTAA?~Uv!pN;1qld+LVm`06WOqd zOfZ8RJx6+ud;p-}FAZPiN2mXV1XEfC_*o+pLj` zCQ(ttr7=yw&Yi9HSRAiLC*p0#jvf0800Y*F-w<+TfcPBmLNC5}N(J$8r`x`1%a$!} z%mH}-KrR9EU?IAE>Efe{$}2iWSvVWo)~*4V$lPWwfKuBhgXNA0fN=);h(ma-_m$qa zaGh%?hl%E;22P#&@C<;b04NO&4P~-Rb`TK*0R39*S|Y&>&UyMM?(uj^WT))*c{~l0 zEdMmLt^Hd)uk?LqvWT1(n(G=!g2P(%iPNV~e~GE@4cVA5Sav*JRaMp7xc=^wTOZrn z-1~Cx`x&D1W1&KRi8-t~NHw0NnE-SEvEkw2AwxGmHFb04RHoSnzp1~(2M_LBD=ErR zUDpCcGm7t6x9+a=IX`C&aLYmmySofglKz>{wQYNz-Sf9XIn7FdtSCJ@pZsp6*Xx^2 zHyrHln$befKJ!D{$jHUI!!N(|1`*XV#tKSJ!2M*`waaXHemCazbDB78T04gg-p|gswS|$xy5xM z{QKR73Ml9}-PP5#SP!Ie+Ht_C{#6pK%f#f!Pffx&z`R=gj+!wknL=P}3mx z_ahOHV=NZKCDVkXvH}|C5XlD4tyL8S0j9~p*wn8$f*`;!Ofbfvswxr*6)u;7=BD++ z$#+ja1)ystZZl>e6bjh{Cho2a*2$b(r;0VN9f9=CNAYPqj#EQJ`1tBooOQdv9%)1U zkv>2Wkn%qf;PH5H`SJ*y4p&-)APDez{TR7)5v3(1>G@PuMR3JR*=A!;heDwlKl{v- z0byBiSxZ$_wO3K>&@>H3iZrFfZmMn$C?t~;tICuUWKK$qd+Ns+YLGx^i?g zdT<ki4GKr|)TLby}-$t*Rg}*cAnetiTJJvg4$#0c-VLE+=YhYavQ9KKbNh zymR6>R8@s6D<~}~#k#e3qasiNmn)MURZXC=vDtNgaBvrZ_W-EH2(X1hp)yI7?hgbi zm|>(|{b zjU62w6^9QW9zu>&ab5u{SFL!wsj*qGi14h$EyCG}PZn&m+2C;40oe0QX@PSN(=^b~ z@HI9uG5&1;-MIwhD`LS@TKa?FilAbeDGO#Np1IBxZmvuf3SHN*VtG(;I^5sS$1`6B zm~I%gPNxfkAk6US{J`Nbpd0!UklX_`SwfV&4ckLT{VP3!j7Vy81{{m0*%c~N}GTHzD002ovPDHLk FV1jf;yPyC7 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_actions.svg b/navit/xpm/gui_actions.svg new file mode 100644 index 0000000..9fc4b4d --- /dev/null +++ b/navit/xpm/gui_actions.svg @@ -0,0 +1,591 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + Games category + August 2006 + + + Andreas Nilsson + + + http://www.gnome.org + + + games + entertainment + fun + joystick + controller + + + + + Jakub Steiner +Lapo Calamandrei + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_actions_16_16.png b/navit/xpm/gui_actions_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..e6b3a29333238ee56a163642b456c8c7def15c1a GIT binary patch literal 577 zcmV-H0>1r;P)eN+IypFq&=k?#v;h$WH>b8xiYN+FinWu_K`1r~l|ZQpP403hP40g0IY^2%(F_iL zm&fBhK77Al;2#xe_mItI58mwP$PFcop7{@JYro%>b^!CDF@GT%y=CghpG`lRzSI_w zPN%y7h{mpITDY*di0bB75g-x&D`0GFsJB*g2a?I;UbL!Htsc8Sg`SD=mJU?_7`ZVL zQam24*JXZoc5WE}Hy-Mq=XDPzU|E$v17y`vS?%g%D6!#d!!ZC*6czylUlI`k05P`& zh+mgXCKC+zofubyqWQkBl*{F~VHo|f)3K8~>`S zT3EntD1`9C2iW-h2>`&%IMaXjYOz$D0&uToiIGTjw6wZ{@A*7RtMB1^J}MOpLI@BM zT-On&`XZw(v*aGUp!?tbl`uazHx3bKy-@M}O?JX`Azj-q=kFGRD zNSNlGfErNiUL8aXW&$%o*L$JqI(~M@P=rti&Y!yt;Ke?GazNF;Y;J&wAxVNHHBBOd zloCNTc(lpER-y2;^HBG7=}SRO%#y$Wlk~yFAOJ9783INIr~C> P00000NkvXXu0mjf?F0XH literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_actions_32_32.png b/navit/xpm/gui_actions_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..d87efa65826e97255132ddc3e003851d2a891197 GIT binary patch literal 1305 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 FV1jf;yPyC7 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_actions_8_8.png b/navit/xpm/gui_actions_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..5e13ba10f56735f4f54317db0bfde7329298630c GIT binary patch literal 271 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 JPDHLkV1h&VyAc2Y literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_active.svg b/navit/xpm/gui_active.svg new file mode 100644 index 0000000..390c2e1 --- /dev/null +++ b/navit/xpm/gui_active.svg @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_active_16_16.png b/navit/xpm/gui_active_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..6ff7b6fd2d7edcf0b594f717f0acbc659c7bc838 GIT binary patch literal 851 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_active_48_48.png b/navit/xpm/gui_active_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..d393fd9e9a32f284ccf33dcb9fcc3a091edc0f21 GIT binary patch literal 3587 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 JPDHLkV1h&VyAc2Y literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_active_8_8.png b/navit/xpm/gui_active_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..aac8561d14c65b591eba393b4892888c599d5511 GIT binary patch literal 346 zcmV-g0j2(lP)E{UdR1o|IEn1$jHF>gOh>xkJ6rtS5J5``_!rU{$_pK_Luz&6Sp7>11kq3gA}(W zL%Q`Or5E4sN-#11XR-MF^&_*qfF47G(>?}!nPi3*|D6nM3|tIM-}z)%Sh@ec|NZtq z1M@E)1{r=0hGdIghI@~1F|=-oW%&B%(Hq)$07*qoM6N<$f_tHy8~^|S literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_active_96_96.png b/navit/xpm/gui_active_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..19d323a3f189b61c9b11faae532741f6f810ef12 GIT binary patch literal 9137 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_arrow_down.png b/navit/xpm/gui_arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..e179ff7474d3cb41d6ae7ea0c53762199e7d2a77 GIT binary patch literal 996 zcmV{U7##pMW#K)zQ&W%F4=UYHB)urE!>=nqp*RL~TAn zXx#(x259Ug*F#u5&Pkt9hK|6*T5T=9_D0Duo@241bMuF~G#&i3|p z#>B?5v$I2IXD7j65a2a%4OmE&6Z;a!BMAHp+z5xm#)X9i8XFtQ&dxq8PZQB-6o&z2}}-ImT@|r%*@PyIAw1EgURG3 zYXHP@3ISJx!60jEYt+@%VK5}x2a=<^yPL_$Nww(!9wwWs#Q?zEeolQL5FiqXP+ME8 zv5Sux7#Lu1@cqO71-P#zU#kItKY_DA?b6Z`Mx&9+%E}bFfuW%x`uqFU<^XV4Yagi? z0GI?yfv@N1=P{W~R8&-G>R@7Gf}Wlpwdn?KBFY&}q-sC`9s?JF3v+XG6c!dzR8*8y zve)aStE)?`Z~g*)0N$n|Bvk|Oq4=u@3a6*1DJ?BMwD|M+d^j8qwZ55098|AT6_Jhs zfGA@6n`BwGcsw4etEkk;{@{vIg!3Q;!|nM@{JE*CbN z?W2J8^>yrayILZwA?lkzx&vp*0Dui)!eTa?>FevmVzB_CzOmcwtgNg6gb~Zmm%*_! z#y5y1q2%Z1D{i-285 + + + + + + + + image/svg+xml + + + + + + + + diff --git a/navit/xpm/gui_arrow_down_16_16.png b/navit/xpm/gui_arrow_down_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..5b8e37e46ebec62b4d0c6097b3ce4109bbfacbb4 GIT binary patch literal 351 zcmV-l0igbgP)B0>{?rjVDu0K8xzYReUu0>J2uq=yXjjF2J z>ihmi8iwIgRaMot?K8)5Hdnz>6umV~6LHS3L;z^p_O7n$14U7GD5dfgPSf-~j^lgI z`8fcHi$mMCw`Ex#>$<*eS(fw@&a&*&^SlSn`3Zpj+W>%}>$;>Uic?A{na}6KGS2h7 zcU`w=n&t?=$JCcIP17EI-|rb?BV%j~f?&`z?Fqna3NA+oAWgfQf2txn>002ovPDHLkV1i;pm)HOR literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_arrow_down_32_32.png b/navit/xpm/gui_arrow_down_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..74ab36bda5ccab100ad0b0319e1a6ff71118a4fc GIT binary patch literal 673 zcmV;S0$%-zP)xK~z|U?Ug@hQ&AL$zw@3b5`-d{3PD5YBE_ZM3Izix{s9XWx;Z#F zHAw9c9xg3Tu^>3qLKYpfRRpQUB@kLPlseV8R9+NPhZnK06jQ3^-s@0#*(sq=XkX+D3k!^mjTsSnt+l=Z{HWIKn%;^r=9!3G%Vx8|uC6W#27~`3Us_ti zaU89b%4@Crfb!P5)LD1NvaC0OKp-+XIcbN(;XTQV#Uk-|T$Rh^Pg?69;7e^!y#N5` zEX&HZwY8m1rBZf#d;6~BrBaD_Jg$7-|EiSg0SepoSvze&Ykg&Pb@kiG$cXZNziIi} z+8T*OLanT4vv>z?P)+uMuCpEEo$F~Q8ti~#q5RI@{O z69C{Xfa|(Zr4-%W-2kN1Y0~L5z(e5vE@$qEM}Qd`8ZwDQqWWih!p_%vU$KEH5z&@q zX%Tq^96v01l@lV85s`TyaM{U7##pMW#K)zQ&W%F4=UYHB)urE!>=nqp*RL~TAn zXx#(x259Ug*F#u5&Pkt9hK|6*T5T=9_D0Duo@241bMuF~G#&i3|p z#>B?5v$I2IXD7j65a2a%4OmE&6Z;a!BMAHp+z5xm#)X9i8XFtQ&dxq8PZQB-6o&z2}}-ImT@|r%*@PyIAw1EgURG3 zYXHP@3ISJx!60jEYt+@%VK5}x2a=<^yPL_$Nww(!9wwWs#Q?zEeolQL5FiqXP+ME8 zv5Sux7#Lu1@cqO71-P#zU#kItKY_DA?b6Z`Mx&9+%E}bFfuW%x`uqFU<^XV4Yagi? z0GI?yfv@N1=P{W~R8&-G>R@7Gf}Wlpwdn?KBFY&}q-sC`9s?JF3v+XG6c!dzR8*8y zve)aStE)?`Z~g*)0N$n|Bvk|Oq4=u@3a6*1DJ?BMwD|M+d^j8qwZ55098|AT6_Jhs zfGA@6n`BwGcsw4etEkk;{@{vIg!3Q;!|nM@{JE*CbN z?W2J8^>yrayILZwA?lkzx&vp*0Dui)!eTa?>FevmVzB_CzOmcwtgNg6gb~Zmm%*_! z#y5y1q2%Z1D{i-285u0>OrAXZ?W0GJ)D;y!&S&J@Q}MB>@ccYm>6!L*e|F65?)J7cF}dRA?%wVn89CG4 z!=oel^Ru(w>tl9KV!V9d#fuj^5`KSs`+r;h{eR~#UMy5(W@c7qmP+{i_3Pa?uV3%( qZES4hjTK_6kdTn5DD=Dpbl8=AMc?cSqfDS17(8A5T-G@yGywoD#ZGtt literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_arrow_down_96_96.png b/navit/xpm/gui_arrow_down_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..1523a279cc719a8151a3990830f3453efbb422ac GIT binary patch literal 2030 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 KMNUMnLSTZZ^qkoM literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_arrow_left.svg b/navit/xpm/gui_arrow_left.svg new file mode 100644 index 0000000..783758a --- /dev/null +++ b/navit/xpm/gui_arrow_left.svg @@ -0,0 +1,73 @@ + + + + + + + + + image/svg+xml + + + + + + + + diff --git a/navit/xpm/gui_arrow_left_16_16.png b/navit/xpm/gui_arrow_left_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d1366addbc10406f7a039c8cde4594e7d08c07d0 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lNlHo#XMac zLo9le6BOhPj0_D+C$FCA>f@6m&CPu}Kh4PGGZ#0vysw|1S^cLcC#}_lOuIR_x##O> zX0uU%VZeG*TapK{wT~?O1wzh6F6gIN0@b>h4o12|IIV>Q+VWL6?gSz_i zsS6f7*tKt;T_GnYCr{;`!~+KpCTgpxZ7aL9#52NF*yO?Se);+Je|~)Ye0_bq#Z`f> zR&M?HeOu0-KVM()_0`q-ClUvM;KPTnudj=hmX?(<*>r#^CAd=d#Wzp$Pzi(3tW7 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_arrow_left_32_32.png b/navit/xpm/gui_arrow_left_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..d773259b88fd6acf0312f206ec706bdbdc07fe3b GIT binary patch literal 681 zcmV;a0#^NrP)S+MU#qgZ2O!AH)dyN zrM+ip##)5^B(e;#TSzylF^-rL)&=I7^CXJ_Ys4>kfI0W5~Y zVM(P@RxlVm@o+txP=F`Eqrt&J9LJ%hrRCJ5dI9)=r@;Nu(NW^@I3jZ9#9DPpM4lOA z?v0O+Gd4DMuH;$)E-R&8Ypn;Sr>7Yn9zJ)0S^z>ysb%1n<2W)jG<2aNwE$GK)+K;) zxqRUwwLC@@UXzpX<7~u3HlT{Cv;f0Im6azJF(Dhe#xXWt~1= z>IHD972s>3P`Ijs6bhaL0DRI~M@ywradL7} z=W;pE0RX;KtJTQ<{{Gg?%#2=NU-ujUU`uNqIXF1@>^P3eWHQHsUj3GrjWJ8WKsKAb z76=5WR4TZx>yiC$1w`a6U~JoN%4P)M2VT&m)$CA5%c+;E*`G4NGT{3Gk6X_8$9?l% P00000NkvXXu0mjfVRbdp literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_arrow_left_48_48.png b/navit/xpm/gui_arrow_left_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..f15b5ea8e9543df8d9f54da783adb048e73935a1 GIT binary patch literal 936 zcmV;Z16TZsP)!sfi%17kSfp@GYo^0fOY+amwmUQX zz3gG$`@P?Xee>S;_ufEy>#o@eBq|&55KzrdBoQ3~qKM?v4&W&8mOsg-6~GDL6FZYn z8-PM!8c=OEn_5#-vkhP~H!n>(3%mzTI~)!=Iy$JWt=)cTb%680DByNForFRmDl02@ zG_W$jRbT|jak*TC!(mEGOaEzPRe)Q-Gr&<;SV$xip{S^6*M?REXaODp86_npgu`Ln zZug#ztpp$e-9QkK%FD~??(QZxH+SDob|W&=AUp5`xB*aIT}@kC8=0AznmU@T!@vM= z1)#pZ9-q&L&8BT~m<@0Ycm-4gG&MER*w~09Nty$g36KxG0nSL0gxBk(p`k%{5VHVI zAxzmxyWLJ}Ybzd)C!s)Q0F(j4fZO445C{aQs;Wvjn9%^|fY(5d)9EA_4DPzS>XDKA zz-7do&&kWn+tV88l~DjU5v$FSf`S5idV2P>26|-#z#ZT*kWpM*Oe7N7*BaHa9m%b8|Bb3kyjfB-JnROP~(;wz#;6EX&N!&L(vLBUYhN;3BXbi^Y&-naRn? zqy;x>ANUAd02bo$IDWsM@$vDb1U7Ofo<^K9eBRjDAP@*JG&J?oRaJU>d+F=zOE{QWMg4c69(WGW-``JHR~L$+=niD&sl*T9 zI-;0oaBz_J_IB3S*L4Lk`&i`{a2sJen3$Nr@AtF1x~e&V*#IEyMhoBv)TyZ{d_Es5 zD=V5hTLEB8K}6l~b7p1+S(aH^S~{?kl>h*q0@r}G`T2RgUhjea$!Y+g(?3}e0EB!2oFt0Dpb#Vf9sLFR8!~kntPw-~w3cY=G(j0000< KMNUMnLSTZZ^qkoM literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_arrow_left_8_8.png b/navit/xpm/gui_arrow_left_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..4ead5a9fe3f44ede38e7170c163c6f0e90dab374 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt@~o-U3d z5>t~C4)98(rlh19J(`eGT38sVqpO>Hw#9YQ_1m|r(>*;sE$r?8+l!@0*45QHT3hcf z-MMooUrtUA4+v5)A9<37KfO~l_HACp6EZEerC^UK${ zg&zQd5C0z?ZhtLrU#D~Qz<~vg$EWl3T)K40n1R_}^Xi%yKSrRN7(8A5T-G@yGywpk C_fkRt literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_arrow_left_96_96.png b/navit/xpm/gui_arrow_left_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..c1a9b27fcda1e8a11c4629252404a45cdd19c645 GIT binary patch literal 1910 zcmV-+2Z{KJP)z9n?>l>nWX0DMRIa364i$dj)GB$zV5NB@(r1SF6rfNln!d?g@3 ztN{LD@X1#K62S9BnEcGl%s@#=NtghuVQr=!7N7}u1xO1n-WRzf56bV8#qLS$uBN0 zrnR+oz{v+CU?>y-p8*fch1s)b8fh^O2T=FOYO=FOYQ$jFH5 zKuUmiN)VGjMlLK`w20c;TCCRSFDy!cHcEjHfv{^!b#*mWRaICl7EK3K0-|Rjuph_? z9<*Am)YR0lbm`KV4ypu1$1=oMh?&8I>FMb>oleTj%VR#U5->RHfEL7)?rpNNvZ$}G zr?j+mNC#H}2BwJ!Pq#TaIc(dujp@^;5BUU2KxC{yD^MdBMvoqi+wG>Ps3j_m9afi`}Xd!I! zOG--EwQE=0Cm)o6KE?ybfH`tu?%cVww6u_$o12gmt4k0RBNj{DD;Fv%D%h}LgQjRf zD`pok6A>qeWyZ^vEo1fS)taLPt(aLrIq*K>5ASU(77Hs^u4MW0u$!QSU{(Q@z&k)z z@L*b68XGrmWZ}Yvx;0`(0V{#sNMD?1W@b`XS4UY{nXb*4O@I@487bGv$;qLyv5^@w zX6W9KSp-;toq$6wj2JP3=H_N5PoAuQSC~UU-;$B%lQ;>3x#-EKyW8l`_%L8S7Na31gx5hj1yv}t&~Uc)CJQdhuOpaXbNF3g!T2am_Y z@ZrPt?h!(;E`}yV**};QWs};N5&XOfdjOi*0QbE89;8mo5OL}@bE|-f1 z3l33%@h|G>)%z3B%1&W@CHyN7i=~gJ9g|~{P^+ucQpi(?MXNQ96{_t4B^_f zYn(fGPXCUENU{k4c#AvxaBt)H``Nm6D@TqTF{Y~+Nk#zxdx6J*KY|DSem`5bY+>KN zea3VZ1Ia1?;B&+xs^5YK1Azd$ckgD;o;}8NrIBP70PqbW@w_M(+S=M^X=$Oiw^#qJ zG?4590KNz20zb%w_V#w_>gwp}>CwNdC`knYAl}DQ3VbCOIyyRVxm?`1aYO&Eq99cS z09*qW0H4Z*lP6D7TU*QZ>(}+~Y7kOM0KlJ!uORo!g|4nH91aIpuU^%^s{u$g0RVpk z&j7E;gc%-+3`&WnBneU0tkQyEdWukrE*20iFfIZiCLBKabsR=hCH12|2M6 zaEDvKYTzZgaQX6O>~?!X@*^c6lmO5GtOY{uMSVUW>(;H~^y$-aJ)sg1nN}j?N8R1s ztY5!AuKAG?&_8>Dr-7TngYnLflz@Rbh{%sZ?nUF7A1MKYa}1Fm{Te(Nulz^}h>nwp z=;BAY(AL(*&Ye4B&X1IU=sAa2e-w5bbl|{&nDZkgKpVdx@}n>0Lah0b5}+L)@F-$C zYzVRBM@m3!bOTQ!-a`?B*8E5bh@Bq9%UxfQ3tI9cC17au0xtkAxzLv%ojrSYzyl}& z@u3;86GMKK)^A0jm9G)c35yAu*Pfmp4j(>DQBe^-pN~_gP8rsqSy+l#e-!eQg&7$c zfvHocs^5~-iTe>-r__&m8pu@O5=wxf6ai;Y0t}@Pv5!p&FpvVoj!q@OK(Y~UYF7db wBn$Dzb|t_-EWj?50K;hj0xF6yj-!C(Unhq?Q#86p6#xJL07*qoM6N<$g6kb>CjbBd literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_arrow_right.png b/navit/xpm/gui_arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..0471790b581b8f630a99ab0309b7a5c35bde4cb3 GIT binary patch literal 994 zcmV<810DQ{P)|4r7me_sPzl8*h7{zbL&Q=Y zy0{*6)$|}KXze0wvv?3Y)Wsy~&_S|-3KODe@eqXR$)tl8sTFHU>vR}jWUcvj_svfG z!NBf2Jib3O^WN`2GXR%KaSUJ(aM&#pFUH0(3hc1iB`%ELj)y>wy*jaD{BgVn_S$L` zBL-m9)zujeheH(c1}L^yOO9VRZhd_{eSLjoW@ZAE122L7c8STdY2~S|t|kx&keize zPyjpu4%s0l%U?@pd3iayu9Kgi53n0}1e{8?m@HA({*sasg25og#l--bz-{1sGR0)s za`P%EC_vYB%F4d$7Km&ZhwT<8Z1>44ltgI~h`}?V_ ztrbHa;0BOxp_epL`6nYIgYNEb8X6kJ&{^OvkY$yaEYbna;c(E>(t_LV7DFe1`@k*> zyrhXKfohtD+wG>QsR>Qf0BV89z#c2)WQZ$5H#RoX+1W{YdOE-X;5ksLQcRY(djOZq zMQ?Afh#vcZXF#PYF;MJ)Qyw6?jRLa2HltS;^qwAbELtU`CGz z!0|-ql|@M#DWXSFQ4zpS;2v;J#oXJWtPd_MEF>5VQd(LH<|cO?XjL`;Rw!-colYl# zK!A#h3NYh_AGm^r(L?!@h@6}pd_JGZPXO(hg;-LAC67|V;V{d~%i`}k@E)^ORgUsN zHa|a4YilbD3kv|>fYX>awIwJ$12Z!-csw2<{~2>RwM-rq77z-BXl`z1X=w@I18@|x zr?wO&1x!p#(9zMs>gp=MJZ8vyrDE>wNcbKY8yjO_V1V`Yb%3|PG2mUI^U9J?0i&a% z3=Iuo7zV%#%xnIW3NcyYD!?!dhKGk485t2n;?c`jRbsNlTtFle!SDAoK0Ypn?f_?i z?<&P)iK&3KwKaNrdYGJ?6hqg6i$FxRm@Lu-gu`LFy1JN}ni4~P%$Q)w4l9dP0V^vj zw70i2Jv|Mk@Fn1?m144NTfpMtB3`eTxw$!jAHW6RrqyDy{Ih^$=bCufvVhsyS=!p# zL^SvUoFoa+AXcJAiBKqn$Kw(5AAuwMhw>1mfGD}v!xZ;ob0~|KpH3eIH)j_! Q^Z)<=07*qoM6N<$g7~t+ZvX%Q literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_arrow_right.svg b/navit/xpm/gui_arrow_right.svg new file mode 100644 index 0000000..94f11d9 --- /dev/null +++ b/navit/xpm/gui_arrow_right.svg @@ -0,0 +1,73 @@ + + + + + + + + + image/svg+xml + + + + + + + + diff --git a/navit/xpm/gui_arrow_right_16_16.png b/navit/xpm/gui_arrow_right_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..36ec8154ca5f5bf2d76e2161e375e8b5c05bf3e0 GIT binary patch literal 360 zcmV-u0hj)XP)0eTG6Gq2vMb z05y=I^bI;IL~t!`YBq=BCTKH5d$@ z%d+eM51W9s<0*>bb2uD6&FAwIpxhL%0n_QU8IQ-0RaJF>x4+^aK%VFIWHKqLsyYLf z+r$7UrCxfy-iMU(>i0%ljbRuo+qN$NLpuf#LY(uDcm4+TT2JvxPLv`50000QL2HxR6;eY)G+0XqS}CoB-bR=haDsPF3$sO3n$6rf|G@VH z@4m}D0CxeQjibN=z_t^hBJvD4+7>_%1S%qGt$hO|eZ~zyI-O>2ZVqEi${6zjIPDbx zkV>Tp!_ahgcAmA?R)8~J0RRI711u~on69p_Q`Xw|z&Wn~fWE#yN~MzR>FMb<#=Hem zUI73>5U{kgWP>0$CL*taYhD2Wy}i9GE-u>s{(dVW%fJn<0DxpNNwHWogM)(tJOu7| z1pp)x2?~XRq|<2u?g8^O@#@|e0MOCV!OYAI!^6V>Q@~^3h&KR$h%h!b#^~rMKt@EK z0ts(`y%`x9VPawe;HtIuC2+zk0AOfni0SERQPqpq+803gVF8E!j`eySRYg_50^hs= zRFzVx#LCJFz$4%m5PJc{aZDJ7tgf!Y?k_pT?t9|Ub6`ND(O`CVRx6bXKpqJHC;U%< zdc96QpLgr)>k8Zio-`wVAi(zaHj|T+@#f}ctg6?6=go@m3)tG)BA3g>Q4}?tb60?J zGvn}=dthT@gKRb%M^RLB&RuFn{EvWYwaWPTcwDR1BIn!%;A1P|zXhzVt&z*++|JI< z=Qxhf1D{$IhhNS>xm>1DD5$DdopYCgFRhI4jb<_#&1SPIA}S*9fRjGLKLJ4y>}^M{ zfa5;n@MARtmTA{&2HdAj%c*7eAl?RCI{@DSVPL`~f($L100000NkvXXu0mjf_)sMO literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_arrow_right_48_48.png b/navit/xpm/gui_arrow_right_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..0471790b581b8f630a99ab0309b7a5c35bde4cb3 GIT binary patch literal 994 zcmV<810DQ{P)|4r7me_sPzl8*h7{zbL&Q=Y zy0{*6)$|}KXze0wvv?3Y)Wsy~&_S|-3KODe@eqXR$)tl8sTFHU>vR}jWUcvj_svfG z!NBf2Jib3O^WN`2GXR%KaSUJ(aM&#pFUH0(3hc1iB`%ELj)y>wy*jaD{BgVn_S$L` zBL-m9)zujeheH(c1}L^yOO9VRZhd_{eSLjoW@ZAE122L7c8STdY2~S|t|kx&keize zPyjpu4%s0l%U?@pd3iayu9Kgi53n0}1e{8?m@HA({*sasg25og#l--bz-{1sGR0)s za`P%EC_vYB%F4d$7Km&ZhwT<8Z1>44ltgI~h`}?V_ ztrbHa;0BOxp_epL`6nYIgYNEb8X6kJ&{^OvkY$yaEYbna;c(E>(t_LV7DFe1`@k*> zyrhXKfohtD+wG>QsR>Qf0BV89z#c2)WQZ$5H#RoX+1W{YdOE-X;5ksLQcRY(djOZq zMQ?Afh#vcZXF#PYF;MJ)Qyw6?jRLa2HltS;^qwAbELtU`CGz z!0|-ql|@M#DWXSFQ4zpS;2v;J#oXJWtPd_MEF>5VQd(LH<|cO?XjL`;Rw!-colYl# zK!A#h3NYh_AGm^r(L?!@h@6}pd_JGZPXO(hg;-LAC67|V;V{d~%i`}k@E)^ORgUsN zHa|a4YilbD3kv|>fYX>awIwJ$12Z!-csw2<{~2>RwM-rq77z-BXl`z1X=w@I18@|x zr?wO&1x!p#(9zMs>gp=MJZ8vyrDE>wNcbKY8yjO_V1V`Yb%3|PG2mUI^U9J?0i&a% z3=Iuo7zV%#%xnIW3NcyYD!?!dhKGk485t2n;?c`jRbsNlTtFle!SDAoK0Ypn?f_?i z?<&P)iK&3KwKaNrdYGJ?6hqg6i$FxRm@Lu-gu`LFy1JN}ni4~P%$Q)w4l9dP0V^vj zw70i2Jv|Mk@Fn1?m144NTfpMtB3`eTxw$!jAHW6RrqyDy{Ih^$=bCufvVhsyS=!p# zL^SvUoFoa+AXcJAiBKqn$Kw(5AAuwMhw>1mfGD}v!xZ;ob0~|KpH3eIH)j_! Q^Z)<=07*qoM6N<$g7~t+ZvX%Q literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_arrow_right_8_8.png b/navit/xpm/gui_arrow_right_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..b8db5bc1f09fa67d0bcc4f955aedf543c0aa4fb1 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^_o-U3d z5>s3I4Y`;M8Ccu{C+Xd|@kCX#wM0lK$U|!Wg!M76`B}Ub?N0>f@bgS^Gl^oiy;F7L zu48sBOPWtg-rBoS+5QJUiEjw-+A44;j$@;r=G%tq>kJA@RgUc_JQq79Xth4Wg00`y zZN2BE*`LRhAane=0nhU}pBXDk)%Sc4Pd>Bdr2ScbH(9ls4cj$}fG%S2boFyt=akR{ E0R3T0)c^nh literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_arrow_right_96_96.png b/navit/xpm/gui_arrow_right_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..94a80efeaa754b1287ed8f59d506a37058985c5e GIT binary patch literal 1935 zcmV;A2XOd_P)fC zW*0(!i?g${@%#Pc=H|-Ej{^sQbS;G0g|MfQ%*;%DJ|D}LEt8cW0KNjG=PHNrOz1qG zl9EDQT^)smg|hN8pa+P{v;KAugR zHsN-=W#!qx5#W9mblHYU-%7^C#ZgvPMtONT@$ut+eL8Rmcu);-b|B(=`E~2oQC(e) z%jF6zr6QiLt&c{SU5IKhRa{(**Xt!IDJig&2z-DTFF1rC>e1}Vl`CmzXdpE;HL&DD zjF_G1A_S_$35ypmrmd}wtgI|qxe91g>sVGpwWj3cJDi3pBhiCMPGeW5*8GtdTxWz8mNTq%o_V(Dcs4<#Mrk^Jdns zmyXHiBmO5W(Ncri(frmhE-sD@8#Yi@CViZojWD4|YaM1qw|jH9+f8L7~U?=sGwmEiI+CwwA=i#K2M#uorkiPd#Qp_tEL9Rja74uMZYobRb5~w!x5iV9Amt zG&eVsk&zKtibG^az8gPV9>emPyu3X8em~jS*|M?+cn2G-+A%aBn>TMB?d|O>Sg=4= zej4}~i?7--JfY0W%A%#Eh5Y<{S@}`mOJLkIJ*!~20RZXg>FnCIi{;Cg%gTj79~ND; zV+sR6L>D`E?qv1q)w1$E2ovtqSC#gd#sCmgUutSWgJo?U>GhG2Cu96%`e-=pqBLoYoSnc1&vkz}mHI*}8QrQ>Kg?4on3; z#R98#Ol<%_QBe`~_4TBrj2jM20p0>O>90yXOm6^)RXfei&7`M~n+YEWG!es7Ut+=l z5UX~YnwrSW%#@X@fM#MaKZ+Rx0CID4@%#PEoH(L`6op4&+4m6eN1Vaw%AAMD6hpEN^LqkJ&Jf2|9{|NDj(lX5l6B#f#I7oSUIcLvGPwSn)Q^0@v zs?r`)7;x&;DLftz=g*&)l^cK;f$RFJ(g(v0=>);J^Wznwl6L9Stm9MJ)2}(qEPS7-B$(T<0%Du5(0pQ3j#A z0UaG3!E&7;M6T1XuOeg7&4AI-QCeDB=<1T5S$;)C3(^6AmC?n3FuBfgMDzd9LyOta z+<-8-&QYKQi{v_yps4|2a-D;~lZdU6ZHs0Du`s#Lhd?PdZ$4;bK$u*o1F>(!uolOT zHB>hsOs=yXv5Au2879VzCq+V(y7Z1awcp*m|UkDvEPsFqlL*b zp@G=Y&=3_B6~UUn7x5I!X?_HRHDGXXkc}HRa^}n#S-Ax#*NKXd28`u8=gyszm8%iU zf}Cg}3W8n(1_lP$vSkaGFONI3jO9A*S_-oZQUk)|I?n*o(U(JH-15r8{QP_+At6Eb zD#NRYnaK_+Gm)2hUI6YhN}$yV*ZkiA>2_8Q>JX~=rx5$}IA}<)=AQthFOqan7g_Va z1ElXGaZsPY=6`|nmJ40Ex%vAM`#3x3$XN4Rh_RhUtb&5gHq15?WA7o{VWs?TL+KgH@; z>#B(*JXOsFV^!=`z$EU=WHL^jI%UU>9pdr0g9i^ffBwAd*RRL$EWW@G)mSvBMiXT5 zB^vka*<)g2LQ_-IO%rb1xM5&mz}2f);b%OCZ#KJdH4HRi77rv63FG7Anwy);PAnFS z1_lN!E-pe5-S~bpi*MUZF?L}J57gJ!8yOi{Q#_>8X``c~5{U$)@fr4QM!;sif$hRQ z-(FKwV|aL2KA*p1Q8Jm-*4F0i*|V0Hmv`YwyemApDrTbwYVi>c1wr7%i4(fIy4GEs zN~N^4w3wNhQ7V=8q66;bmy5Z>PF zW+MjP!1HkI*fD*5eH&;I($dnRp`pRKbLZeeG~>fcdQ@uQ6=6Wr+uN(ZzrVurf0N7Q zEG;d$bmujt)aZLt?S&UE)Cy=8v86}-aB#e%Z-gEKL*w|=fWMnlrrSOR` zINrpq-#`-6c&M(f&e+(PY&Lt>#jeH9ojVl@h1J}YR3 + + + + + + + + image/svg+xml + + + + + + + + diff --git a/navit/xpm/gui_arrow_up_16_16.png b/navit/xpm/gui_arrow_up_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..517667c436ef3fb7dfce58e4afc70d8dec6fb7d6 GIT binary patch literal 350 zcmV-k0iphhP)HvE^8l6u6zz@SE~W(jd|@q5dbE&G4qz=8h<4jlNuY}vB^;^N}>85kHO z(G@eJ@dZUhM2>cLb}Gxs$uYtNd3kvmjE#-?j~zSa_wC!aWef}q-?16MEhs2>xVE-d zO-oA)-CzbmK|w|}H8sK0r%(HS|Nea;0|UcvWCK`5L_~HM78dH8o13%Z^qYhPqqMZN zz@&s z=^(<`IW0oO%begr#7oBxfpw^Z5%?#B7+rEF8H5Be#KZJ3MyK|D9b&OU6Lsq4d*Hpi z@5}o8isw}^1_anc*#^KTbdF!UCerj)TZ(3Yj zG|kP;$I5Fdl}aR&NvBXK{BRs6!4bdXsDOwuCfm}|5?oqZGQnW*MDi-dVv+Ij@yfx$ zL9tS)#DQ=B-Z^ZVT2*zup`jr-H#c``Ie=~3%+Jr8#>PflRo8*m;{uvg^}S_TH!_)w zi9{l&mRAXdLZs7aV_8;MRo8&)wdb`%=r_i!sOqhBI<4K^-Dj3pv2B~Kt}as?TL+KgH@; z>#B(*JXOsFV^!=`z$EU=WHL^jI%UU>9pdr0g9i^ffBwAd*RRL$EWW@G)mSvBMiXT5 zB^vka*<)g2LQ_-IO%rb1xM5&mz}2f);b%OCZ#KJdH4HRi77rv63FG7Anwy);PAnFS z1_lN!E-pe5-S~bpi*MUZF?L}J57gJ!8yOi{Q#_>8X``c~5{U$)@fr4QM!;sif$hRQ z-(FKwV|aL2KA*p1Q8Jm-*4F0i*|V0Hmv`YwyemApDrTbwYVi>c1wr7%i4(fIy4GEs zN~N^4w3wNhQ7V=8q66;bmy5Z>PF zW+MjP!1HkI*fD*5eH&;I($dnRp`pRKbLZeeG~>fcdQ@uQ6=6Wr+uN(ZzrVurf0N7Q zEG;d$bmujt)aZLt?S&UE)Cy=8v86}-aB#e%Z-gEKL*w|=fWMnlrrSOR` zINrpq-#`-6c&M(f&e+(PY&Lt>#jeH9ojVl@h1J}YR3t~C7Fa(>Oh|ZeRQ2Su_wV;BD<~w0Gcz+w?^5YrzWn*GySvN(-``vPz24vd{8t_x z9vvX&IRnH#e0+S~-CbQxmKGKgGiT0}?CI&bB5z-}=HrKlhqv|w1qEH!(b1_ndi3aj mCF!4^o_aq^KHith#Bfwx{?TWBKOLYG7(8A5T-G@yGywpq^GO^4 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_arrow_up_96_96.png b/navit/xpm/gui_arrow_up_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..00efa401487d27e59cb5cd5cc491644fbc6eb907 GIT binary patch literal 2047 zcmb7F`#;l*8~D(=E`>0clS@oa5fN=RZODCd8Ea}WT1BFhyXIDo`*rh0 zR5&%Ea;b!2<>(N(%_Ya!;k)xEd|%J&dEUP~KRnO#e!pK&nuoiK6jT)o0DzS1Ij2iP z#QmG%hlF*u;5tGGhXT&KH~|O$M%l}%Yyc4Zud9=TH>GH$DB?m6N2M=`B!_e|md6z( zJF9!k;!XOmTvDvza?!d3`Nc6=x5!SWo`#8DTQZw{o}m0R6wXYXYAv0NXS7WPN4*p` zZo3j8srwU2XgyJF{{m0=q*Qfu=+%(Ae_TPr*Fx01AZv5Z)@nF`Qu6-h(4O6QQ3dE7 z$0r{8|2G_glIkJng0=xWQA4J*jvW64Pk{&dnh|3t(dSDuaoXscY7bQP1badR=`(*l zY;Wo_u4k8lDXHX*e|ipRodwR8ui;{=X7R$tB-&4t`!R2_#4s+uZWmdR1k(4;)`>r) zy`7+2Zx)CN6yXCFjKL(qPRzkT_VItLtgO(^6u>au^S#;K3p2y#28zui^154FKY!(L z7T1=Sw@MK)uS)asDlgMPIEM!TGHH~=^b4RbApgV5rx}B%Ei716{zh6?N(vZ_MmKXJ zSu!x50lP`xIBneWoB>aXhvGDozPpb#mA-fr91_wJG;qY)+M2Sv6;?JN{Q@iy-)T4b z^X^4krJln@K$oFf81nat|Z5A$(f)q3Dh#@9{Ls z*SD{YFjZnRu|m!+DH-Clgk19i&Bkm8(&=(Awjb#6nQ(`CzxGV*b28qv&@uKB2J?Pm zLiyIMTdW#!&(wD92VR!5HNX_D+}B^T zn1{&5m}kF@jrjx*muR#FW)HC6<{ETR`KGsT-)8Zz&FGEDZ;M#VE`h14%yF5?9-CtK zOm! z{!RJMudltWbV()Mt+vYyIOdFy-LUuAAXuoKDIIS9>o&!Y7#4QS$jHs20<;E6mts(% zPqDPaGY}jeSJfMUU;FaX5ZgJ*1Kz}IXY~FeMv;kD)pPUimksQ{Y-Q8V%df8x#sAPYC|H#J-fBOYw6uz0LkOAJIMfDe} zSrUWxwpTn0_BjeL7-VE>%7CE+A9CV;D`9fqCDv5T+aHNiq>dShT}$Y_uedzb9yK}p_=C5PPweKrTO;QL49$X~SJq3rku*v8AtOUQb8bF)WP*wc4CJ%Et+y}#GqRpN2x(Yhb4wnkE7WoOYI z8`)V|2nuiJxCI~R=;+v?o@t0TP+Pa`mR(eT)CeNU&7x7id8OZhh)K_^Q?%la-ej>@ z`f&J@^77kECez-_de(czjcs9Ws0Ft-&nKScDh(}V&D4-eOh*0_o&cAq9%R$VO3 zi!WDaTfLHz@Un!q13oi4yadk3$cR0GKqw%7%NGc!%VZm&mRWF_m`_@UT>T<&0c||l z)pzvA(h}!I0!i7}PDMdc5zoA`uvi!u-KMPXw1C`qg_JrVM0cc{&#u-tH1sb0e3Q`? zs4zD-XPdA=mxLMjSDLbw1l+|P1`$LqUpK+Hxk+VYWE2dpQ#ok669xuCI%a=-u49FX z1{f_sKaa;jdFEvri`+lHtv4qfB-Z=XZC9(L4g@`|t-Zg$pGf3(>N3W`?a6j`XAMTd zks^t-yU*q~`RCl-r9TY5$73vo<7P*pgv!Vlcd&$301>oOz~RWefWK)av}sLE%@dbj zUN@r~ynTI1tJ79OUBW_5L03ig0l^CDOi6oy51^46p(c+|m(J9%LHhXQZC8r~1_jYI zY{=1j+XT+(`xKqx((vULs0aPZ1s24{%*-q-D(d*jlNWD#r6CJ$B9HTtEi~3 zrrVe?r&i?u&d}lNOT|c1vxqu&DZ$!}3zy#w!Hm$Swb`wq(ffjg-Mzim3rDq9kzx0* z`>?BQhWC7dTIaDZ$XzAynJ!z!rI{lYFEh8c_=)NwxuGk{sm?ooq13|aQ|dCOc9RI5 WYwobz7N+o{1Fp{QPK}PZl>Y%pEyO7R literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_bookmark.png b/navit/xpm/gui_bookmark.png new file mode 100644 index 0000000000000000000000000000000000000000..b5539d433a0fa5e70c9c962afe39b19ace1a2c1a GIT binary patch literal 1555 zcmV+u2JHEXP)dngJmRZuIX z_#jnOS}Haa)E6JT&<63b(i&Nof_RAqQ4|`H+F~fBv|8{*u_#tBmBvIgX-UX#HoJRf zeAr}r_GHd&H?c4M;3Ru?X6OID`TqH54hOh_>kHzi&%vkkrx~pr^*tz|6~^^{P1Ah- zm7{atHo?z3mQ%yv;NTll%KcJGT}p|$*(nr9PM|Yc!NbqJ?K-FwCMGXm!10d{fZz8P zq?Fa~rL0}^5R}qirIauA_4S=DFI{>9U+-UwN?{T+f1L-e z5vc=V9EtXgC>JL1;_ltogxUHJ4GmEt#QN#!>2Gqm+zBDXGyC@Kn^_V80JyH}7#SI< zeK9uvH-xBQcH%b_CN4S(0HGlKCP*PLK0dDQLI{${Bsk~DWHS2b=;-5 z?KG82t(HR58japjDwPg` zhy(xvIILe4d6fu42uh_A5{U#Vl?pUXs}s@F)1x!S_8dBNXiGx^R3s=NkWHqLRlwBL z6k1zb5sSsp+uMtE>((KY$w1RIaL&=)-K{gmj`jEVhn>cEETan>&Y}tg0F(k$gQE?E z0)*9(R^iH(D;ORghLjTJav7#+LI?o>FijIJEiC{LOC%D90qhMVppFkAmXrc0)xor| zs{qP)9eI_AO`A4hVqyaMd>+MO5i>J0$mjDY6bc}OAQFin8jWIXY-~?p0jf1nB}_mx z9h65r1n5fQ)_cx5LZJ|Z5D16ENTpH;hr@_OBG5Dqlv2dwab&Yu1_uOkpeBaupjuS` zAq;w=10WQosmqX}Qr(GJNJ-j`SS$v^FqD1#R6kD#R3d220U%^_Vf@dF5TcBZHFu(T z^^aP~T!Cl+?k?DN^?cE!(X6tJh{_G$Gy;ipEhe1E2gY5hb9VLVi zIQLZ!?du;w_q|U701P9E)f*m#aobj$Irbi;SbQ2)5p_DLHl0GMMZ9pByYT%G=1hXS zx4l^xY(-ledN#j|VujUw1>ICs@Z(A|G5%KvRPa+;-LUKe?BiJPZLgaeis|`0uv|{q z-!!Q(G{yzvIKnSS-hyo}AC|KK70%if^3x&c**=%-~lyce9%nt}5 zBA?HH2p~Vtt-jsmw;HN$=pOx+6B0lPRpOQF#Nh^9@gL#ojR;D~yKVpg002ovPDHLk FV1l + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + New Bookmark + + + text + plaintext + regular + document + + + + + + Andreas Nilsson + + + http://www.gnome.org + + + Luca Ferretti +Jakub Steiner +Lapo Calamandrei + + + December 2006 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_bookmark_16_16.png b/navit/xpm/gui_bookmark_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..032dc0cc2b39a21baf546f0ac8594b6dfd888968 GIT binary patch literal 465 zcmV;?0WSWDP)p*Hj7JPtoDI}y26he|U8=~fBU2~7cGMC9sqTmk$XAb9l^Us+PBE3C-^x8T1 zq(~%ud~@;nJ%5pepx5htxy`Pt>FDzQk$)%v!{I2eK0W)Pstg8$G|RFNtyb$qL^SlJ zA#l#!GvXgyk3V6*-vDs4+&9+R0}-KCtC8pVai`O{1YU+d6WcMyAS#q|#u%J)G#U-+ z_4?w{-?dVi*m-(s=fY$InlhUQLP_#A^)}f_}e$ zRjE{bTqq)29gN50Z_Q@&XzLZ?6@x?sRi&)8S11EwPym!6Yk+^b34onL+@%-mM#n{B#00000NkvXX Hu0mjf(DTfh literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_bookmark_32_32.png b/navit/xpm/gui_bookmark_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..a6927cc34d12e341081efb63a72c680c87ce96e3 GIT binary patch literal 976 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_bookmark_96_96.png b/navit/xpm/gui_bookmark_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..7b34bb88cd3a46e698b0a6ce9a03b4e95c212e04 GIT binary patch literal 3719 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 z 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Computer + + + Lapo Calamandrei + + + + + + + + + Jakub Steiner +Luca Ferretti <elle.uca@libero.it> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_display_16_16.png b/navit/xpm/gui_display_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..e11a4940d1bd49e4bb8d254d643ee08d7c4ba80d GIT binary patch literal 679 zcmV;Y0$BZtP) zHxPUR_d+(VT!@gB;6hLo6hzz@RI)Jf5}c@$Ihixb%$zx0E+(01qP1zd=>OxdzgniJ zAKo~5>hx_@m$0R5)46diLTG;cFmp@Zf0%hOyU@BYyO3_xZBqS-8yo89@KEx?tE&54 zPT9R{;9shLmYMOnTxERU9`DziKdSXD59L3G%nZNQ^qmGQR_lle-YY5&RY63$f^4P5 zx1TACl^SW*;QHn94FEu;)*y;J-g}$_=M)hoTg~~E)=BFP+IgE+5S({iS6x85k`qS| zCyMt<5dzJ2n<5zE68d_TRx3wU5fNlejTg%wmQziOho4Uyb?PvoP%T0MLB?8)=9^6K@=M{(q@B}syrp{kwKRRKX&Xy-Xu zRzp-N^_4K7U9?$Vs@?bHg>q$Z$KadgH2cf)|7vxm0)TTaEH3^?e*-8r0mb>-NzVWP N002ovPDHLkV1oTaK4Jg> literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_display_32_32.png b/navit/xpm/gui_display_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..a31a9b93f70c8f1f234e9a9a99184b24a5daca88 GIT binary patch literal 1716 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 sN5Ii9b6x;u{+;e(7^dgvp|mvo7r + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_formerdests_16_16.png b/navit/xpm/gui_formerdests_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d18157c050edd17758832f545b0a2767dd1e8ab5 GIT binary patch literal 657 zcmV;C0&e|@P)<=&eA6}jx z|L5Tm+$xbsym!0ZDNWN-LI|BZ+S}WEk;~WwTUBBP|7Qkcx`uqD^)6>%o4Gnc| zZ*My)mCAA?68TiG*XM_ahw16*;rjZTMx!Ch$;@_FgQ5a3WY-C^LbWQR&Y9pG{Wr_9XEu(7d0v)QClsQ{oT3gvPco6VM8T3Xue0MzSs5sSqb7#QH-;DF=f zW8(2ReSLl8^LeV(DpyxmXqrYK5O`(ubs0ug)t|v&@Le*Qe3{GTCbQYB_3-eJR4Rqf z=OdX+VzpXHr_%sWxUWDU@Lfu2H|kog=G@uY39qlOe~m_?H$I%T!X!f`ZCo zP!sVj@!O(gBQY9{n~8~;nQX}AcmL;kPJu~AM4wIe{Zk{N1R|O_om@8Aaq;5C`yCw}nq|wD zwOcHf%K+*aV?$FN)Z5!@uc@i|@yeAeUkZYtlq3l$DJkQ2yS-`KwrzVDV-KeVaP;WW zM-GQWpO~14uC6YuSg}IP&dz>nv)P*Udi@muzca>OMSZQRy1M#Id3pI7lgY%4Mk7=z z6#!s#bQIUGUq^p`zj*lY;X@XS<$BrHIh@xmHEiHv8if}re*uQ^2y1ToPl$3<* z>}lL>e4-o=X-FW~d}Fg`x6I(P2eqSVyX@AvNA+gMdqW!=1avutr9 zLS2Rzp|P+8en)vLjA zF~|lgR{~PKUX3=R&X7vs0%|{rp}4p6BWO`SaMYVFPMwYvJ*DpwVa|@i5$s z88h(c(IaTJTG`@FO-+c8k4I)^X2iE-$r89+t}lp4{XPImk|dlxdls8EZ9-*bC5DEE z;PH5H^5jVn5dwh#d_EuM%$XxwyrZK7&z?O)K|#S={+TmpA`l2D0i?eZfa5rEVqzk) z4uwMCI1UDb0Xui@L~d>_mM&e2nwlCYmCBgnUauDw6%}BN!SDCS#EA$1A~Qk`fb#P4 zFg!er3l}aRJv}|V2>>u_)-2q=e;;jaZL$TDl9EtZScr!YA7bCWeHa)Rh{PmG0>^O# z;7Qo0n0x@w^HO|#JTw{&^78UvwOU~?7_eo_7OYye3SO@lJkP`Jb|WJr1A-t#-aP;) z6bjgEHss{wptG|R$;ru)n8)KmMn=YS##r||72tVZif(~Ysl?;Qk8$weL1boT;`Z&^ z7#kad+wI2MwQJGb+#I9A8zo^h8Y62WLR(uKwr<_}+go`u8^!kacDP(F`2GI3Ow_D z1+ucT5C{a`%0F=60G>Q~f=ib!;q~j+F~vtlM&NKbU^bhd@7}%J&KR4Bj?3PGSFa+Y z9z8uh(CKv0>2%n!V+ZctyN9Z(D%fl`Xti1dgF)Q6a|i3ztwVi%Jp@5OVqzjhQH0;` zM@mWx)~s2Bl9G~bjIqA=N(BIQb#*N&m5S7AHR<(wTDWi_O-xKs*!uhX2>=10gnmBP$)#h!^5MFuad9zC2|*ArZ{9p86bf)0 z7oMImwPc+f$BB|8L8H<9x_qfp>1@o($|53KC>JN9w86o_5{JX#E-5Jqq^72l-EOD4 zx;h#f8lsVrkw}XGP(nfirKhJ85#>)y0iNe2Q4|3{6`Kw)#vTB80N@uQ;>*g)vRYbN z3R_!Szdn8XbXrSGi(>x#`QSJXy}i8wmTRmZ|eX6002ovPDHLkV1m11 B2rmEt literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_formerdests_48_48.png b/navit/xpm/gui_formerdests_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..01971595cf1128ae3ab0ad7c0db0129f59264d43 GIT binary patch literal 2686 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_formerdests_96_96.png b/navit/xpm/gui_formerdests_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..64c10d40eedbab330816171c88b1d2828d9a5c8a GIT binary patch literal 6076 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 DXXyvN literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_fullscreen.png b/navit/xpm/gui_fullscreen.png new file mode 100644 index 0000000000000000000000000000000000000000..86cf3d458527ed28f65de8583be0b6f742d32813 GIT binary patch literal 1207 zcmV;o1W5adP)AlB?wq(#-O51b$VERdJn%r~G`ToB5cmCZ|pg@5FvSG8G;w>GHPi?kSyj&WbTnz(& z|B-vg2=GSW(ZEr;G-NYiZSUF1Dd;=REe(Wl#t5q8e zdeqx$)e4UL+O+SahP9R~2Gonf2b+wgr6zM30RWS^jBGNNmZ%n^y{xsE8>nb^Ji~G1 z(2gf-iXOag+fk$C2zj%jqh}XOJ;Jgv>$BZzQl$QafEXc7Xy} zlGPaK@9&?8L?R8WgHfqe=Q}$)nYWvS)9Ivg;B-1^rm-k9jSUL zGf>&#*slQZ-co6ioF4L#0RY%iWqDo!-d)+@*e_L{l!2@&LA6F*zq4_>u2`?b z-&dwm8el~#15eacDb3}^4d>5Y`mB2IiMQ#JcwlPe$jwCgiVRrx^u9usWYS{Y+|bby-r=+37e1-nYE=VJr!v5bR0b|zz8b!E)f*O~;#=O4uA$ZC zDQ6+?NY{`^qT4*zZj4Kn=W7gjrl!Y465S>hJdkD`h|j&d*ILL}A(a72@v8fq!-Eo! zFSD+#gm0uPsgZmbkkVaEPJ1DiD{;Oya~entXvUNPSOgFRkk(Zu28sY^;}=9xgkG=D zCO}CZ=#B;e3y6L0{+q5|CI-0p^L#WK{c~Vopf=MW(;*1LBmf?OBCbb}CJUK-)IS73 zhgc?5@q3EQ!%T^YSg;Yqx=#>5C|#vYPbCzHjR7TMZ;0j5Bt^_b6hJus`~QdO*{E^% z32hNCT%?p%rxYZ_9b8h>-TD6T0t-#11^~d?etbL6tA1;J;c2Z}qguWn3Wf2*=y*sF z#757s{SqrZmV*!g5ODu|d*jv??cAK-X0e#~#5^)__Vj!+bw@ zG!VGw^LlTH0O0f76a#_zY4iP1H)}2CT_{0$ThHUXQhA}VsZKL-?qVn^Qk&0p|W|HFn`8{d~xr$B)m_zz?F VANY#xU@QOt002ovPDHLkV1k#DMv(vj literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_fullscreen.svg b/navit/xpm/gui_fullscreen.svg new file mode 100644 index 0000000..1c025cc --- /dev/null +++ b/navit/xpm/gui_fullscreen.svg @@ -0,0 +1,261 @@ + + + + + + + image/svg+xml + + View Fullscreen + + + + + + + http://jimmac.musichall.cz + + + Jakub Steiner + + + + + window + maximize + fullscreen + view + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_fullscreen_16_16.png b/navit/xpm/gui_fullscreen_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..fc25933826bec6e47799a537943ccf5add3ddf3b GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lNlHo>pWc? zLo9le6Beijbj~}HE@XaMc)pZc%_Ocvi!MKXqN={a^;^e;oQ6sH?RT!PzyIU@-v1R- zCpQ{POt*3?X?%Kmy0x)^fyKjs|3*eeMM9exxOZ{M%FeyiE+27c-~neEM`+0qh|esBl3KVtfO!7fwLaO2APcD47ue}5m(rd(RM z=3V`d4-f0vfPgdaU2;(8<}ClS{CP{$ZX2Z2$iKJq_r&j@w`N_tKRsAxx1xwqiTZ0WJ9c_V)JW8zn#d{QNwh zhleK!h|eb^%_wALeYNmz*Pb~xnm`er{r~=2R%Uv>Q_Fc(u*~J;^?3Pi?~YqpuU4oQ u8yVXlUCO6#&^t3Vb*k0+W}UM~m>9Z4I{kdinzDg$!{F)a=d#Wzp$Pz-*wSMF literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_fullscreen_32_32.png b/navit/xpm/gui_fullscreen_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..7598f2c5111793ed0e62828633fa48af3fcb94c0 GIT binary patch literal 917 zcmV;G18V$CmK~z|U?U&n26j2<u<$1(lT-20V;BTerO=$*+2$IrCSn|RNuV#&{f@>1FYIt9IVmlsy1y| zw1Dg;3?MqAbf;RQP8;@k72m%8fXQTBz$%$4 zb4rO`s+Up@z_5?&@!AK{8=t=&*RNA5f&sYYc>XmpVgcpl<&g%1p&Ec%syQK~Ju@@& z#7r@wuYeE|mztWIsMH!HO|H|Z@bt-}Wnyu&S_2Hjps@0>B!Hw1%Mqkdh{nwdfKrOk zU}<}eR;>bj;&IagEZtSO=JVaW7C*qHQ%RBl7=}T8{im_}h&{#8UAHf^iUO=iDGAer zsIC)2SOCd>0G{V10|=#H(YWSdd1*`RKmqdeiN9a45m6@kU|Cj3*u18M#JKHB1*`Qx zA%uYAI7yA?c~DBn+)buXTkP6Z=VPo!Yebr5{Um^>jM6Hj(O8g}yeV9-4;n{L2m#OY zlA90!02VJ|4_VVXsBA40XeTgD4)+))EeX1I6CZ$LtDZOjBfqb*0VZkX zKFevXR(nj?$Md|`J?K62`ChJ7ikGaCjHT=il}dRrDS7h}hGpO!7^Kgiy{VTvIUutr zZL7=f^9;MQTdW^!gb=)HZ2n^B+=u0OiB}BMsK51rRUIC`-C-M;Z?`+ob>7TAlB?wq(#-O51b$VERdJn%r~G`ToB5cmCZ|pg@5FvSG8G;w>GHPi?kSyj&WbTnz(& z|B-vg2=GSW(ZEr;G-NYiZSUF1Dd;=REe(Wl#t5q8e zdeqx$)e4UL+O+SahP9R~2Gonf2b+wgr6zM30RWS^jBGNNmZ%n^y{xsE8>nb^Ji~G1 z(2gf-iXOag+fk$C2zj%jqh}XOJ;Jgv>$BZzQl$QafEXc7Xy} zlGPaK@9&?8L?R8WgHfqe=Q}$)nYWvS)9Ivg;B-1^rm-k9jSUL zGf>&#*slQZ-co6ioF4L#0RY%iWqDo!-d)+@*e_L{l!2@&LA6F*zq4_>u2`?b z-&dwm8el~#15eacDb3}^4d>5Y`mB2IiMQ#JcwlPe$jwCgiVRrx^u9usWYS{Y+|bby-r=+37e1-nYE=VJr!v5bR0b|zz8b!E)f*O~;#=O4uA$ZC zDQ6+?NY{`^qT4*zZj4Kn=W7gjrl!Y465S>hJdkD`h|j&d*ILL}A(a72@v8fq!-Eo! zFSD+#gm0uPsgZmbkkVaEPJ1DiD{;Oya~entXvUNPSOgFRkk(Zu28sY^;}=9xgkG=D zCO}CZ=#B;e3y6L0{+q5|CI-0p^L#WK{c~Vopf=MW(;*1LBmf?OBCbb}CJUK-)IS73 zhgc?5@q3EQ!%T^YSg;Yqx=#>5C|#vYPbCzHjR7TMZ;0j5Bt^_b6hJus`~QdO*{E^% z32hNCT%?p%rxYZ_9b8h>-TD6T0t-#11^~d?etbL6tA1;J;c2Z}qguWn3Wf2*=y*sF z#757s{SqrZmV*!g5ODu|d*jv??cAK-X0e#~#5^)__Vj!+bw@ zG!VGw^LlTH0O0f76a#_zY4iP1H)}2CT_{0$ThHUXQhA}VsZKL-?qVn^Qk&0p|W|HFn`8{d~xr$B)m_zz?F VANY#xU@QOt002ovPDHLkV1k#DMv(vj literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_fullscreen_8_8.png b/navit/xpm/gui_fullscreen_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..3efe8d7935090a93a5509df3cdb3f06d12dda178 GIT binary patch literal 255 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 z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Lapo Calamandrei + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_help_16_16.png b/navit/xpm/gui_help_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..da2d63efcdf074e51db5d95a4557c4cd4f43960e GIT binary patch literal 914 zcmV;D18w|?P)<_0>J@Te1gHBI_^>|RdXJ6^$_zy3*{JB8@ zK=&6X56NY8`%4$sU;EN4`@dg~-=g`vMwc>a`dLrcK>%O?z)@uPFf0Q~ zDRL}>nWl!$^@6GG4V|jR0!k@3j)UFqC|eWghLJN29fU9ttTxz)>0d8!g7~f0A`rsB zFm&kog0d!%v+}QUGHDv!-C)msi^}-?fx~TW;$PvzZEa%3Qu+<<`Z&zqUS#GH#!@!> z%i1H&M|?XMKWMsCIUFHGl7Q!*L!?l+ovE$qV_1f4NZfh4uBy6%96bi}#tp;+b-MKS zkJa~VPbJ7=3|?EwtCK&!6}cXmDTIV{8cbOkEZ=+$T3if50LaV8zt#aW5`iL$h&>=g zgYVXruPlDLg_&P~lbQuC^kHrNu!Fm;NfM~X4c=7>t5tx-B7iU52&&|ui6TY>%gt>E zCEn1L?9?m-F7PN~K$mwe_H3W;o%z(vz?P?UP0V?2O*!m#2LXUwE=!X>uLho>M&P?H zo`1QcD$un}mXY~;OgAfba>DNO>dN$~#>Xb#Yj1yX_Xd|M007Cm3)e36eSYCwf5S0B o@U)uwiT6u-Xn^8f$< literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_help_32_32.png b/navit/xpm/gui_help_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..83eb71211a39fa5bb27a5f06f1d568c9ea8586fd GIT binary patch literal 2479 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 SE;d;J0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Go Home + + + go + seek + home + + + + + Rodney Dawes + + + + + Jakub Steiner + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_home_16_16.png b/navit/xpm/gui_home_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ec86511a7dc75c86c9adcb7a4d5c361d22b762df GIT binary patch literal 535 zcmV+y0_gpTP)uBSZpQ4I52dpwXS~bU|Xea^VVOQELjNoq2z*3kL!ylR3#vUhX^ZmwR&_ z5Tn}S*2CJ;i`h7jb=Aea`OW%tW&Ek&La^oSlbfadTH(5zKG^^Db?3>0dMuziw=pv_ zHL+=I=Y}SrR=Ks_4MH24oLeesik)D3e%qhATYkl|&X9_{f#@ryoGg?!@hep3o_ke) zbjRw?ojnEsV+aNW27oRx#Oc9b*cz@*j=ix5+;T6}Fvk2-+89_QdAHwtci7l%o&o%Y zXT#p@(GPac9X|;abY%WtF*}_v=CgI3_un5jcALz5v{sz-${(F;g*%;|x+;_l>aztp z%~s>f-uL^K7HpYF|3DCoNJ+UQ0LSKNA9q@evlaHYMQrx*+x;+=8B78wIB9(Pytnl2 zGGQcfh(wKV1M$lmapUTmY#E7$*aO02~2m Z{{c|R(TeAxtDFD;002ovPDHLkV1lJ|?;!vH literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_home_32_32.png b/navit/xpm/gui_home_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0c8bbc1d9dd9a5134ffbe1cc54eeefe7528767ef GIT binary patch literal 1137 zcmV-%1djWOP)qud~)~ueGzX2gpF>-9x3Gmp<`i5`%5`!7d%M20<`v{$e51d;VK!v2sK%k{gxiZMUhiwKDl2qdA;CmA#<37m zu@F*CW2Ozz(czcv1>*cGJuMB3Dq~TNukNWjVJ2wcwWDoSdmeKXaUlSt*WdI2{C+7= zvTN+vk=C||P?S*A*x(Y=IA(%6tE}=^10ij7U6_P6zXN{1wC{%d+_9dPL%N(RFNgJ% zuBuL$)3ucQ$z)mq--P?y{;p?UAjM|gEO}C;(SuDZP~SKFbv<&N9) zVF)3%Wh4abb}LGY9aYQr#Mww*j-!HACCMNXw; zS6*!}ztK5AG5$+Rfcn1E$D4efkLzkHUDNkM87E(Z&`?(5vN~cWi+zpnyRA3b@vs-omf+jIL0 zC+{wSb~t&$0wEQ3PnOtpT{~bDx6B15$NyyB-p?BqNLOF%d^#^jvA~gM!<}Uf;n>D$ zm#Hd>^AQP!z)9fZuYX0ND)q{GEau{nj(>mt4?r+hTU~al{;BHHU}S3(EgeaWF!uBH z>s;491pp$(AP9&u2;WLjqurn++=^QUDn7-%O=r<&YYH z7=S2%2!QDNhqHv0b|~==1Ty#sy-orv2h!sp0D%7h4zk=4l%6Z|00000NkvXXu0mjf DGoBM3 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_home_48_48.png b/navit/xpm/gui_home_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..12ad3bb8d948aa64c5f1b8ee642e0e0a4c36d749 GIT binary patch literal 1828 zcmV+<2iy3GP) zuw$G!iGA;R-~Di$Pk+S0=04IZTR!*R_j!Dt_dVxcTSW=s_Xjoj{CYIhZI&vBQmP9h z7*uX}-N$WZ?$hgD3hJdwQ!)XK|8>9ZtF3NdyJmT_VR$~=y!kC#De{O?T(qJ6$ZsB8 z_P~LI-wL>dqTty3XT~mFz4^%%yKg7{`mzK7-;NH-mES#@DEp#2IFc`yRz%(afQIKf z->k0i9@zg%z!kbP4wDFbU)btA{{ESOxO)BXHU3~*cX!YP1b%U7H#B9ghBuC!Fy@=D zs1{niv-4*a<(}6M?rm}197-TOoWR|>TT>b6^Sb^7 zfQcCe!{J>lH6&c})XB+vcI1%Nxc zdtP&KPeok!jbA?Dw5jjD_UcnEQZ)1q#Pgmr7)wABBjA5T^xTevXc|ueaDg6LumE4{ z;cX7xe)5O=o^~lVJ9-B4cDzYMMv{n(Bo~@`1{P$Y`e!=6s_XjS_U~=+=ne<26+nJI zU;B~TxjDcDhd+dYd^fkrm3Iqd)e=)tXPCg z{lz6OAdsP^b7I~#;CrUSr$PP4?&lx#E?rt7F5HOCEWje6&@0YMz(ei7sw9QGcLX*q zZm6qPKEEDKEjmR82>{GcRRMd_xdOn&eCMe74ybQ=a}jiLHt^W`+ASMbX`lB-ku(X+ zC`ovo8kSTqRxbA3*!4ht%ZbR9u2?R9ITymlXOEOgA+3gce|)|DTquIEqyz)^ zB_uKK43A^u>Se;=&|RV4@QW^A>#^9?kH+!}@cV;W%&nYS*SNf?t!0zrd}s*qakFHe z&laX+48{`JytYOW0-nD9!Dp-1v>Xdx>`G=A5DY3>*!Auz-_pPfty^6G>m9=Ir~ziS zBuq)T6B|d<`V}e>yx038+g%%4kH;>2WM&kwx@^ZEYnNB<-2L3wTo=BKA{tNLH``=PhmPuUCu*xa&{To& zaKcjl0I;^M993Qi3`tm7yTsPpH(1ke%7-EsKmI_hY(2c6g?LL5iV1>-F3F~CzK}#I2MCdI(apJ;Go%DF zfw;8Whg^^(Ch~Je0h#Xyfp(wmgUcaAvMqWKPzT%>XZ;20-Ri8?_277$gZ0nb(0F0tA~fWgkl|gw!K=P@!#< zrd1X%EYF8#S2Kpa34NZq?k7oY>MPlOJnwi1@l02n3_AOItt zD4Y0L1CRiaObbu}*d{^;-~hm;WYko8QWwggVe;3MS!2_Wo&JkUuJ3_o4f5pYNIeZ? z2C3|vAWjn@bFBk(_RRSl!}k{gg21*pMLfMV&9;yoQ?sI>l>e*94gz2TFeV~_l>Zay z_p^Iz+Dba6h^NVyR%#T5Cpfcsg^>3nIwn*ioKUH(67OeDMq SE;d;J0000aornZ1`;R#)`ty=IO@H*!*q zl$vj(9{btnr1Cg-zWRA>f#}0?OP8i4DW2MX`hUii^>vrIx81GO4%gv1Ai$>czv(j5 zf#8g~bJ=~9|8toJ`NuYGJ;&6r;=6k2@(J>725n(xgzJ#~3_a{an^LB{Ts5yS#3@ literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_home_96_96.png b/navit/xpm/gui_home_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab1637c70273d1203247e71c8e69826b2e85d24 GIT binary patch literal 4064 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_inactive_16_16.png b/navit/xpm/gui_inactive_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..687d713e6e26943eef9d5de72d019c976aff668e GIT binary patch literal 559 zcmV+~0?_@5P)E-_xcltryhh#E?{}q6Pl}mrg%& z!~1;TeO`cnPT6c`K9NWS4*DxALNJ%h%#94Mt-TSPj^lm(R)D|1SRQv!?rD?rhyGvQVAhrLm{P7F+ol0 z+P01MzK!*IZL1+SWYeOk87l7Vw#LqnK_it)g|01J&j(rdgzx*%@An}P7#{J3-vG&E za$@OLY%>~-%zC~DuH&lf>+cu0rR|OB>2p^B`bR??ca~w8E0-?LmPAoR0DwaS0Hw5R z7@C5>fMwcyl}dRr9>4P`etUWK!^d~amT4=#=l4uQYZ5|mSRa$&a5!3iy}EJ#!M!B_ xU;%*nHS8nu@b1%RnYRFN1^_1i`icKXKLMj}_ou1bAMpSH002ovPDHLkV1iQy1cm?r literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_inactive_32_32.png b/navit/xpm/gui_inactive_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..04716ad51c1c00ca129605e63ae4c8513e3fca6c GIT binary patch literal 1469 zcmV;u1w#6XP)op(M7#EVX@br7h zYL&X&YO(LDuCBH&ny#?$-5uY3|E&cP>8s{zrrg})5%a~AloX}6cia^akv_Xr-=CeG z9kQt61qFFKfBL!2f`}wZA|WE(Y`HP|EQsRL!hPL6-F8GIr_(`ScBO%c|;$j4`hgd$bg7I zW-{obW0wnd`_b_5l`W}hsR%` z?*Bu1c_&skHeNO&A~{`766`$jf{pBUff!?SwXwn2)pd`TWtq&@DKc9oY05G|c88r@ zZWonTmUa7T{WCi-qq}$S@!{cXnjKEzNYu9I6|yV?B2F8VAx0mwV&%$EwcWu35&{u` z+FuPSr3&gU)N~n#Mw6n%E~kuj zpi-*n!iCy;y*s^)6dURs!kS=mS(KmtO4_T}5)+bwc)<$HdnGxJ14IM@0z?L)BtcwkT;Q0=ba?%`H7)J!o%2G> z3s78qDkU{_Z*y|;u3(;@E)D>o_EUpKvkbIqEr^l`hzt-JNU{Vm`nbU1;gN&uBGz9w z7!3TP0g8)HrM{Gwb~7n4Iml+Sc&{3PMxy~vp`^1l)jfTE52g6n9YK;T1ELHJ5hPiJ z*qHd>v5C>Fh_&mQp9SF)ps46%`rf@SHz({&46^aw;y|EPYk>%;zP`>dGCY+S~0C{=Y(TPdPw|A%P3AXVTV8j3j zz~4^|N{*xYi}m-%$IL0!)zvP8!N6~f)ZH?UjvbEC#|BLgtLZtxP=@Gj(Sd*TKRFPg zTYs^utLtCmc{9kP6IyvzMeh;4gk~uu&lSY zSIOJVtxmTyZNrAh;QIRWzg@lZWky?Dn>ed;=zXgIK;7BdBPsn=KiF)Rw2+V&0-Bl{ zJI>dA`nJhr;=DczZw&bYm|5chKru9AbPK%YYtyJPsO9F3R{LtF7h=X{b~{5)K4KJJn=1}|#4Kq^&sTo} Xzmpv>>>i!700000NkvXXu0mjfQ7FWx literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_inactive_48_48.png b/navit/xpm/gui_inactive_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..0d201576a87858051d7194813500f8282166a6da GIT binary patch literal 2339 zcmV+;3EcLHP)4!ZFyP$G2?T7Fm-dSKd&-?#9@AL4y3yf(@V;a+#{?{rlex6^oYSq+x6|b=H zrR0%5%MSN})vH&>f{i_Dv2v#i3kznCbmNfLtuK6&HJOeVyVqs0;EkA(H^HGc!Z+(XNK>NDS=k)hE* zgv=8W>AFrtME^LjU;IuWLgueuzoropDT+*@B$BS{q-h#$*!Tzka3G4^MV@^h{9O#j zQmC`*CdslyL`2mGK9cS!gkiodWL{Qe5+#8|Q6NDSdLiD}`1+6_BF)QmtLrA+>byxe zJ8zIAi9|&7QT6^ILk!x)IxGb#DQQ#3jT_JEx(;2_Km-sGhzO!2fMr>{T>Q#?yu{U&uVf81byFe7W` z7vJ8zo*N$*mzbD1nPV70(=-5Nd=V5?L6kWPkIngMRDEOJ5@&jX9%;VFlan*+ zw~H6$TNFisU+4h{2u1)v1fF+*VHi|YmWiF6o$I%jdOjRAfY&ncEQWOQUB1J$D5o|F$hzJ`uy%D&6{ zRP=)E?3vFmoS$crWf=jXC&D;Du-jt6vJ5;GWrFXV@0FpN2ZnG0A$h%CZC1{sdrzJ^ z@x;W53HK)?OyU>-s;2eQFe}r+OzRXwd z^awuR*KckqDSKq354j>6$)0#VpGbL|KfeXNDNqcpe~tWm(9I z48OlS!Z<+SZ4Pi8hpInU`diMP-Bh}{e8X`44EY2?I&$QQl9idgtNCP8ZbHJODG3Ra zI1oYA)ZXk85hO`8%u5Iefe7Oufae|HSPna@JVIMr>#L=k%ZHWu5d#25V`t9T{ng3i zxf3Q#m@;|tR1P4hs*3RDlvM?)rbHO;ZCI9tr(&Dn^9`@&?+HLS#HrKGxerX7I3;n? zWKIV`Rh0py5;7ht8xt4I{AkUO3LpeA>yg~OO(z=WCQMAYe{$j!PLf6FIt?&R1Vme- zVTp>u&UbbM+S}VUZYe4I(`fbwMsS_(uac4yKg+O3o12gKIi{dt0!2((hGC$pDlT5U z!0D=fc(i*1qdWlsD0UZBI-MCSm*%gqO0o!1k}$A*jA19sh>pGwk32HVRM+6m&v2zT z9sQ#2?Eej**j-dPV@CFKix(}iN|FeFpy#&6!{>w`2(ZQ2kTY|ZsiC26;bAcZ=n1JY249Q+PstDJY$hWBlC!?aR(mEVZxO`5Lv4LjrNAxZ-5 zJdX@#hPm;}hJ4qIp_kK80GM^|!iuz1=d(+fEVqi1(3kn%Nkwqj;{Y)5c*=y1tCx$m zyj@-i05vr=+Pt|>?rv#2Gh3FWNz;>(O`35M;Y}ZGY#W^EPSdetjSGhgF(^Rc+JfIb zIQ2pIbI+`_$cls>e|Lm&BEZ2rz%VR!R(XVrmo9H8Eh#Gvk5N-oqopLL?fvH3m3g|R zJuq!r5~r#vRLy8?3QlfWlEB;Scnwf|hc+#z)L zbd%W>1%_daN!xdyXBZBZJ3PX<3m4uf-Mnq%?c!8bRRub4`5&+OtfubJzdjaiF+9xX zC}T49lRo`Gm+Y%yGY8y*!w|K~JEzw(g2EJM+WZBZrq|WMo+5W8)b~mY|c4 zSUxUT^A%gg%U3V1-THQU>D^*AG&Csl<~_NqwY_C_SJ%zNl;kv%rm0Xh6(-IMKE{rZ zKdF|yb+wI}!v4(T@d%>@U;&uDUwAuz@RJ`NIDP7?{M6KRYn&q+W>I0QdA-WKFe z09@EIg;wjC)^3}_e)ycP^_NXeO=xRx+xpJVcdNoS2sa+SVaNz;#Nuw_9< z&p+1u)$s`}Ev;ww?b*NF=ktmEyinNcpOiZSkYS1m`&kE|x3#o&j2}1d6Ms+l=kNaI zz4rj9#?p*e-S}Sb7Z3eFsk5_Fx%SPs`(oo_JN|v>v)9_&+dBa$#?o%H257Jk^&yB* z_SmrBhm3{bLZU2pjg1fOg@G!X=kJdf7U!RSbFw>smb`7ng){mm-tWu2+-8y@ vedGDr*|JPmk6L6NTcW_m#%8vthJ&Gdvd5~mxbP0l+XkKJQ!+G literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_inactive_96_96.png b/navit/xpm/gui_inactive_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..6035c5f86c38ffa65a6acc8017894bbc137f0732 GIT binary patch literal 5227 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 + + + + + + image/svg+xml + + Restore View + + + + + + + http://jimmac.musichall.cz + + + Jakub Steiner + + + + + window + fullscreen + view. restore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_leave_fullscreen_16_16.png b/navit/xpm/gui_leave_fullscreen_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..98dbfbfa07e15606b605cd7c942551e02abcb686 GIT binary patch literal 499 zcmVP#Vo&a#h}XM^{2DW&X=;EOeH2Rj22Fv zPLFI>st?zmEUW`4g8&hZM*v*cH8Yva20*=D zZ)uwLAiPikXp7_1FP684!{*&<6OLtB0C=7kwtoZ0Mvl6VZqN0YJKLYIZF?{vkdj27 z549}IHw@!DK(pDDz%gL22jKhu!KQ9WDfL_~m;W^efZO*5j^ogIYqvbl3xHlD1W4+- pUNud#9yV*W+7_S!t-~Pyq#s)|L5eRX+F-H*d&X~)}(1nSGqDN8(yrgqF{?! zao|O-97+YjiwRx~RG1f*3N_@u9_{Ui~nV zdtUN)wA(F%hn)w7+dLoKY5QjZ`Y))v9p=}&z3vl7T#o23)8Wj|v$4od7j{4Lv_Cy| zV7Jaa^uGN>oBhjEC%a$vb-4{UevMf8)#T^6azWa60M?+s+HvN?$BW;-7yU0BvRQ9D z_2kJu>p`3T+O?oPzPf&q|LRR~cWlE==o|XLbgauYm&q06+kY&-rZZ?qdV4&59J56VWwZD*T>t>+SqVS>bSoI7j*(jDEBOO$0|NtIbu))bEfbji#xB!R zy|zgUi^b@EY=wVj7WlSN006+)$5+a9gc4S*Q8iHj7NZs#6$?USq*9ykdJb{R%j=ih z2FK3a4V(`&43Nne%5+IF(~=|5M8b2qwPY%vx|hwXRY+S+GUUdS@9cT@Hh|ynKTRpM zRq$yKhr{hAlc_|>FbwVN>|F93w%i8*S(dk9DWyv4Dg|&lofG~2{Z@ui_BO?0F&YYm ze(34xS=^~7gn$rIKLE#Z@^5#Nn4Vcu6gcvH7c)OU&lC!!y`fT7oYvX^0I;%l4>NaG z6a`Xx6tXNslBC+sN&qOOcU3xZd)Repa2eFYu_ldR|SwH zNihH+1PcobUyP29eqD(VfDEAg`K$&|yaJ_NO$dS6Y`za*y$XOLX$XL2Sz1rBJpl+I zj4aD_^+2IesPEOO0-y$96-7}iie)=vRS^V%M5EDG0CoTZ0Ohl{Ll^)W0IkEr!+koP zj{AFrY6mh5ot&J!9*@TpjRF)!i>iHjSUC2WZa{9{ct`iB^KDFI9X83{5VfsDssuocE0(5+o**WP=3 zu7BJ$47T?6If&UWxk=meo$q|V^ZU+s&bb9c6`^6D^pB6`B(AS2Y=QvvifYIhmQ}Li6P-=dRDW)oHu& zpxq-$Ah%{~@$6Ln`^$>*edf%}u8uPo3ws9!{_Hx^aQ8vmM~XnfnpQQ%`8Jr+jaAP) zwX`o;tL^JJb9u4tX8*pfU3J%{>O)U=kin2w-MoO|guM$3a^9(|C>0DTDXNQCdgu4t z=#q0Q%07R-+c`AM zThY)!g7ux26e6^$gd%7uSl6V!x_eVo;CEByHl1FBohf?Fy6TFjHA$S>$qQ1l!{N}J z?6@#A>ho?HJXr4z<$GGnsByvSw=2q*mXCRb=ee8}^zfxa$MUKhi#SeoqG(Z0Sye@; z#z$yM1X$7MWey(h5M3_!ySDwCt|ZQt3 zF2j^Y-5&KpMN?4IV0Im7r$;^f=eEB#pAE}*qJswjiI8O(sVNw833zM$O75Q%oi8qb zqLB3w8iNimR4NL3PK7=D+T9*6-(uTW|691e6HXxS_Pkloq{u8f&KtFDtmnwLCA_o9&p9r^41OQL~GE&qy zd8*TQqkrglcT(;rk-CqHKx=F3m!c?|!?8WmB^J$nEKTR({gc|X9D}}_12}uG+YPVu zIu5U&Y@~pw2#BI+uB!`L*6&06#-FmXGK}5zM(ryrbbst`|Bza@ZLZF3{%*-feXVY5kpd)4ynk;1$uM{?3r zJd5U;uzmY>SS%aAyVq-TL@`87K$0XBWE(@;eD%=_ml{7?eIb;OSP@eSDFvWr84}8d z5Tz2JjQa?*wY8n)dA?YwlO#!KYikQ>V>BA=wY9aoLfKFh6;_a;a32Al=Zh^COUzCI zprxfH)$b3zFELE)2Z1R)G+U2Gou3p%q5i!U0OFG(N|=&BuR?hY7fK4meGLF|ek;{? zB?Qz{3NT>=nl@A;+6qTe_XsE{kdQJ;2*G@F==!dNz|20BH6Te+%mdT3{IWwy0Z|lV z8V3kMKxtqls8sU1f(Rx;4L|@C54V#rWeUYgAP~60USzy?0VaR!qCcp>L^LJ%OJ2cQGw*;A_DN|>NP8sv50 z9)IEv2J*}&0niXax~x`fVLTj*qSys_VkF2L6pbi$S|tSTbb82gYsLqP$NvWY@y7$; zE)t}`#7k)sUl0sRO?hGzx$<)@7q?H+<72&AK0ZEotlt&s|M)(? z^Yyvj<#s&27waE#{ZPI7IBwr>y^}{jdOo@T{(gA*{^Y&K4*)^Mqccm7@!QXQJX7M| zXYQhnHNn%wZ-4sp^Rw-(TentAN=QgVuvFfxEHPQ~6vTBK~#90?VV|G8|4|t|L?npF59v!TeckAvSY`X1dXAK6E&SP8n!B1rl=%5ZZ=t)r2c1v6I+Na1z

*47dIW_DJVcHe#U{NLw!-hFqq1_~4?P@q780tE^bC{Un4S~RVC z)YP=6v7QWGDYvIgrSG#JR6%|FnO3%C= zZ*R~(+&?T03@BkFvJ9K7iGlz#q~_WkWgL|*u{&&4PN%c1uHJRTS?2H`>pfKw2nM); zD#URN5>EkRqPe2hR^hz2NBSSH+`)Idkpg(vp;*TCb z{Q7-;skU1fhEB)&7r2H{*N-?}Txl;YuCI2NY3H9m|A5(S32GXPN-;^^|4CPUzc0|^ z_xbmA@4kC4K&H(5V<|+y6x6SNs0xuIzZT7w#ijP5+H=mSJ=wgVt{aR%)l`$L0H1Xn zK6lU;7zp_MU1g`7?{}Yp^MQf@lhUyI!S52H-C?#`Jr&Mk+r<~Q94T{@`WTp~F{Tni zwJ#5L%^&a%Nj`tzU|1GjKidAYX^ZZ73IdFyX8jI}5Q%RkgsrhyEY3zxm2}}n=k^LB zFRLm<02&C4*G+KWl8yG_sjQwmX6JN6#)P)06+-CW1iIyklwbt9-nT9%4_~)v-0XA zjImn?0nS@EpIvg%!Zsa0iA$or)v-iZSeVn15!NxR&U!~e=)-5yb^!_i#bZLam{7mI08c09~xF|`{hL2 zdRn*LN;I+ufTy;)0vmsD6{)MKgvJ;Gp*RtVH8@$BEn+cwqR475g}R})ZRR7MiO8Q6M6d(^ z=D8gJ00xHnbuMgNdpUSYKp3_H*ag7V(o}<=Y*>j(mjjB*;0?ww5>1>#5dt`D0ys+0 zeY6iBwRciQQ)EWfpLe(2*K4%d`6B?>w*a83yc7U%d@u@0)zCD*8XIr851r7{AOj5tGzeVIwY7-$z65e?80}KsE0N@ShDd(o1S++ed1b~JM0HD_G1OP-N z<+P6(OAIk5!X!{sl$fAu8s7f*C+IsB0Dw01zRRt~>tnohOX8aWdvC0yIrqHyh5ERd6ARIcydY z#YI-giUwKLrr!~OiKhsSM6maRFTfZ8g6F$;-T9%>HcrKyMF1hh2>_cmZ33mn>AvTG zM;uS=d6CvumxEG*NK~1ArzDc1p{Ur3X7%CMlR7B{qB0fDC=48N&gz3rLh%eTx)=ginB=&|Sb zK~Yjm6;si+_n;F1sw)!(IMw_Q0IJ4tDi}qj-Hh5A7uL2e!z*q3Aj!(jJyvr`)2c^r zJpAfy@wAPcf{Y2^8;TgzPPiNZDl6;&QWJm>K;$U|F0m*YgGdRgtDN}$nq_#YZ69JW z=>~;_+ZHX~a{YmKwuB5Zb^Nf>>NaV|^7496Sa9SBI^pmu6Fhj0rFtj-}nkP$*WS zF->q+I>GZC;mB4=ibM2U3Fgfk^$ z0vOQ)&#kW*$(EixQ!+LR$~4(xN6x08bm6${xFcs$0k&`7zK#&`H~^Os2hvl;&Ye5c zYDW~s=+dQ2_by(%xI3M8GTi}mCapw-kUzm7=NpM6NtX8Z_GOGQq_boTQ>CDK0J#13 z+d)Y7{FH3RjvbI?*^+5HjAGgvkWJ1XOZvmu?1+Mti}23By$e;#jL{q=_|;8Uoc3O} z70QWn67$+K)CTOufB0fr5jJ~onUabUVkD}WyAM$F%*!}yew zt^nC0;2ET#?23T1rUvL=^wtfRW~|pxN)2~-wg{NA07lH;r-RWcC|gK51!YT*(K%}b z&>f%YFFgJNO1d2))89uYWdSlB0hvDjY>~4mNKsP12XrC|5pagg!SQ({o^YsPnkO9^ zeb6b%mKrbz0+^6+zP_l*^{kS!DadZO8{K5$VN9dWrvQ}X>sjNhPC>GK+HdegB%G~c z^kIg2I-0de$k_;Z`st?)YfDj-FaQCgj%Uf&$@{1?C_ui~07X&4U0q%JgO|o%{+sp7 zfjOIkHgDeidxM(RkZ`nKboI5~^Jlf^0-mE)8*tslIxs-AG6k-Z%VEK0Fop@6vYX4oqHtdv~w>jMjfxGp|KZKasnQSUc)69 zJ^cu(s(!_BT+MUOJ(o%QCPYzxilsfG)?m# zI&|ov_!u{TfYQIH+Cxy^u7otiDq2l8YZx`HLI3~&07*qo IM6N<$f_t?yasU7T literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_log.png b/navit/xpm/gui_log.png new file mode 100644 index 0000000000000000000000000000000000000000..a00039b31534484f9c1b694ce40ff66a85076460 GIT binary patch literal 666 zcmV;L0%iS)P)ikz=pr_4|oQ4e1P#cObC1cg^m9N2^+Tr z6@tNz3xt&EJnn6Wwkl`S>CByb&w+cUB>)#(@W0{76NACv!SlRv7>3n62p8>zAl$bQ8cXAYcU#)mNMTfc|r(LtyC(Q&1L`q&-0E~?$~8)xm?C>x2wo} zebcu=Evy^c*154N7zI$0QHXH_+hWNAToRM_*UMA)~2Vw#^WH`h)HO^w?Mu?xX$0j>(WJbG1NnOIj;N2t^3kce@_lLg2LI3~6U zOCmytvzXXLyX0}|wOMsj}{!z{`u`QN5R)J+= zYO%tanDa?yWnxkb0e}z!LWm==!#GMdx~^&|j)>GImXk(br&Wn%;~or3A;vl3$O7bI z?RMKp#$~&x^6Ky_Ol(3b6T6DF)lDRTO43!Vt|hqwszQj9okcqH4;-U6Q4`++xC8LE zTCHwswVEwarr2(`@O}RsdyZQG8{kyH2EfgHK7R~?;5iJ#`y6;`;rsr_VzGDvu*MI0 z0P+8cv2Uwe0M`IY+0e7%3&1D##KWAqT=2K>4W%3U$ean>l>h($07*qoM6N<$g7DTc A6951J literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_log.svg b/navit/xpm/gui_log.svg new file mode 100644 index 0000000..33a1ac9 --- /dev/null +++ b/navit/xpm/gui_log.svg @@ -0,0 +1,352 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Justify fill + October 2006 + + + Andreas Nilsson + + + http://www.gnome.org + + + justify + format + align + left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_log_16_16.png b/navit/xpm/gui_log_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..224493c8f33c4ba822aa83d2cfdf1762bfabc4f3 GIT binary patch literal 336 zcmV-W0k8gvP)4!K~y-6t&=fsgfI|A{|uqCl?JdS!~sz5z(Mu~t36Jt+++(5z!~W2 zz#W)sNfFsv)&@mNMzU;;?dLy#WZ;iM0MNGWt*WZ4PZI6sSZ)}Gucm1}-vFR2%S)Q3 zAIuD91`)xnj|LH40Q>+P*%$+BEr`fNq?9O%!spy@u>)jTcJ$ggz$K??g0(id{Ja)I zKx-XWkmvbtYTv2w0A_|U2FtQUUuR}0r68sBdx3(OT%}Z0LDYlS5@P0^c3~Vxtm_&` zCn7KZ6yW;pE+$EGXkq|xCeHKh4{NO{IC literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_log_32_32.png b/navit/xpm/gui_log_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..d6f2d93918d37521d40c1e2f11b274e45f3267b9 GIT binary patch literal 578 zcmV-I0=@l-P)j*g*C(GA35Y%5VkA{VI(QU?&r{TtxNAi+PX zIz+cYAq&e*m6`xWDiextIiHMi65EiW>XR(l@yqAu_kH;k;C}}Z7xVf2Yo6y{YCVvU z)p$Jqc_Cmroj&w>z3)K~+zVt?0Hd}1Y`tFpiR1WjGMPL9z@0$)*y(hd`~4n-kir1~ zj^n%q))^u<2!i`Kjz0r<0syDdvx3{`9xn1#xDa3xSUf;iw2V8M$j5fOMUo`SJ$W65 zAtkbif2EhfGoULy~0~R;$&8a=xaNB8sB3=W>jzK10v*FdPoAw!6v|>wiKW z$gY$M*zI=jtH?G&Rq+mo!#h6bDR35x#joXZdF*z(9~fgGgn%&yK3CmLp6hUuB>B79 zY<|C9J{R96qtWPFqtW=p7$bR}+x6B0IF7>zA?$QIJikz=pr_4|oQ4e1P#cObC1cg^m9N2^+Tr z6@tNz3xt&EJnn6Wwkl`S>CByb&w+cUB>)#(@W0{76NACv!SlRv7>3n62p8>zAl$bQ8cXAYcU#)mNMTfc|r(LtyC(Q&1L`q&-0E~?$~8)xm?C>x2wo} zebcu=Evy^c*154N7zI$0QHXH_+hWNAToRM_*UMA)~2Vw#^WH`h)HO^w?Mu?xX$0j>(WJbG1NnOIj;N2t^3kce@_lLg2LI3~6U zOCmytvzXXLyX0}|wOMsj}{!z{`u`QN5R)J+= zYO%tanDa?yWnxkb0e}z!LWm==!#GMdx~^&|j)>GImXk(br&Wn%;~or3A;vl3$O7bI z?RMKp#$~&x^6Ky_Ol(3b6T6DF)lDRTO43!Vt|hqwszQj9okcqH4;-U6Q4`++xC8LE zTCHwswVEwarr2(`@O}RsdyZQG8{kyH2EfgHK7R~?;5iJ#`y6;`;rsr_VzGDvu*MI0 z0P+8cv2Uwe0M`IY+0e7%3&1D##KWAqT=2K>4W%3U$ean>l>h($07*qoM6N<$g7DTc A6951J literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_log_8_8.png b/navit/xpm/gui_log_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..b07467801be84293f151e080480f4f27f41c2330 GIT binary patch literal 244 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 U4!hkDSO5S307*qoM6N<$f)RDFuK)l5 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_map.svg b/navit/xpm/gui_map.svg new file mode 100644 index 0000000..efdc266 --- /dev/null +++ b/navit/xpm/gui_map.svg @@ -0,0 +1,1015 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + Web Browser + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_map_16_16.png b/navit/xpm/gui_map_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b3c906af76034435d6dafb8f4967dd7e382510a8 GIT binary patch literal 821 zcmV-51Iqk~P)3=Kt*cW;{q1 zQQHR(9(>>X@E*J`JTMaJ!8-h>VeHh0V~>{x-zj!?J*p|KJ*`L)al+Pexpw`=($e|m zuO`g<0$w=#`Flr718;O?t{F;dlhL7RZkJ!9+88IRhU_%G^3PMt=YIS2^-H@m@@{eb z&ClL`dR&>1)AJc8e2jEj!wg=m z9}68ylcv+pLghF?7~y&$nzqJ{TclDO#|!iH8q@R^w~maQyzmM@3ZQq7epr!LnXNp_ z&E=PHJPFqivE2Z@bB2Tc-(h6uaQz%!*o7j`r}p+0UTmMx5}slE21}cVi4uWGLLw2P zDuR85tF&4Iz2h!XsIhJ4SgH<_$tcD427V~}S7%O;)mC_}^gbQwJ2+l|X$uxthgqu) z&}s>kl!@gUG@Sxr5V>tY7)9k+fRbvU$y*#7{g{EmbsRU~hu=?d<<~R#0Ys7D=E^v# zEU~`XoNWWjmHIdNtRm(r!#J)6v5gcru)P4=4KVEl%h8C0M8nFF#NoQ_Tc5N6x4xXb zWbf3cMBK|lbrj3(Y&XF60vtEMw6n~vme7=9vQepCUio&ix%)^e1p0QZKGlC< z^qHI<7q)Ih|+ zo=m1wOUn|PnkK8t_^w>NJ2&_Bt&8uzg$PZ+0>nSPpaNY$E;n@aK;O`@m$i(Zm*Pa2 z&3ktmx4*ya)E2gY9l!yS|8?WPjJB)C_iOqK!F^zG@V{oZ00000NkvXXu0mjfJ6W3s literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_map_32_32.png b/navit/xpm/gui_map_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..f72949f29b4601a89f9aa60a9fa744c1e4f9c683 GIT binary patch literal 2159 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 U4!hkDSO5S307*qoM6N<$f)RDFuK)l5 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_map_8_8.png b/navit/xpm/gui_map_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..0557f199dde4c4f50507a1c5b66af08642707cdf GIT binary patch literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lNlHog*{yy zLnNj$axi}X#|Tsb27&pjY*bWv-M{~2`*Hip`wct$L#~1(zzX7-QfSq=Ysz{QLKf;XmUS9wBK77p8B&nLgforpjQTG>PH!=jRMZ zE?O}#|9{DF?}Y}#rysxHGd+6#WzD+}d@ug}e#7wL(`$y~R}>kZz7}M7_CoLq|D$II zm|tDl%)rSj^Yzm|L!%GhWOx|<|NnpYq2!%MS5MYmI5hD(+?)Jzx`JXFZYF>J{`&Fd g(!TSrUtj$K@@Dm;s&ZA&fO#Ocr>mdKI;Vst0DO0l-T(jq literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_map_96_96.png b/navit/xpm/gui_map_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..2fc61894dbbbdb400347c99904d8f9593d20f92a GIT binary patch literal 10285 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_maps.png b/navit/xpm/gui_maps.png new file mode 100644 index 0000000000000000000000000000000000000000..827fd3949aaaf5e93a59600ba5ee174738e190b7 GIT binary patch literal 3088 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 eY>;VS_WuACY(?GX)90@M0000 + + + + + + image/svg+xml + + Map + + + Map + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_maps_16_16.png b/navit/xpm/gui_maps_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..aed8861711724030834eb6695e200abb171f0649 GIT binary patch literal 817 zcmV-11J3-3P)C71O(bP&>Dk|DqTT#;zB%{z; z7vjd1N;iV8N*AJb)2g5gg`yPPh!h1~ss(Aqk5CI)lvqr)ZPYZTR?8$~64PYf=egHK z(xIUTesK67&N&?T9|bV_-q5$5>$`TLm2guyr@$$k15f~tmgaOaKR0RslxMDWZQb7H zclNcK7mj^R`K3Le)y*^c_~!~k8=GvdBut+=@t|JW4;V+sazanCh zOj_iraA>55+3R3)htj^M0kk#)+A9z~KTJ9`!$14pLRCwo*XEH_TGSU6ajxkPB5dZ6 zG_@MQw3)lC4$uR=6l>cEo_+-7Y3h59kWM#R114q*1jbVJQnIBcS-O1L{P_0nN>B*{ zi4}6SK{__cx;LK#tthSDZ8HnNCl|Y@^)Em!#EXm0rr9@I>1?N8Dr-qoT)RidYtOLU zT;{^WG?FJso)9G|?~iwLa=Ofc`~F1ogk+&{oje;c%J_pO3_~k11OUR=*kz6#Kh4XB z4)WENUQS-^rsU^*xNDrv;T+B?(#3x*1dO1d}z=~b?iP-GaF+eAeveTOQ^@fP z?K=Rx{lk4a=&07(isIkf+2G;Z>KLtV;mO^1aQ8r&4c#F|3uzSiFAR2kseU;8mnK|b00000NkvXXu0mjf{V9p+ literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_maps_32_32.png b/navit/xpm/gui_maps_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9fc3236514955e2dd03055b1ea67e432a35ce2 GIT binary patch literal 1866 zcmV-Q2etT#P)4&vvy|7EHs_K#c(w%e8z4w34J?CDHVnp^ozxc-r^&J04F|;hRf)AzM z5`mWGbFm_kijzbD6o^8^02JC2kWrg4GFHJD)R=h%pT3T_aEGsdu}A=Y%E!Qp#<3G^ z1?LJ3(*HO{?18zckX7Dij5w}AB&17p$_SC_IWI#OQp=4|r6pbpK)XJoHQFza{tYkF zx8}F_*D@7-#$xrW%}m^T7C6sP(rgZ4U`c= zv|uEvseS5ECjE00@yC{f7SMvT?>+h-`6ZdZy^VJAh?a^tbIoQnQLQ!EqD>5P*9Sr9 zDIS61u5iRg2$!T+)mLH7xE(~W7qsHOf05krE^^1aP?0e8TfT|CY-ZUEoEor$@$~B9 z;<`FdK7Cy&cqbsBkVTP1wO~Zm*!21ruaeyKN9<3{r2fSxki18B$5GPT_TXK(5)@-O z+1*_Qz_jWdRfdQ71-<8H@v_5+AxA8L_nw{=PAWAo+Ss7nEMu4ogX>?ytc_9g+-kHI zuuSY#i?CNMLh>#u94cFo8P{Ovg<1eswG0$}6!_^Bh1<$35J*OAW}?N8)YalT#b}1N z?ZNLIq<-rUAr`qgQq!s!{qx5rlXeRo@P(Fvz|RcXqy~BcvTinX$^uYY?!i!)6C&hO zUa*Kt#HoGZ+ZfGti1u#Uq>{YeQ_r^3jR1UkdOshpN+F|3QWJ2lTomB&{ZGH)6}muJ zVpm1cgc0!q*em8@-q{pPhm- zxryw&)I|H`268&MPOuHlW33nYZd(_1wmb3)j%44k$X_1-&|n<`u)?|g96*JutI1~a zw>;a{nKMwTotL|3;2)kH=nW+-Obqh*mJeBRdoOkN$T~OHtZ9==_6u-&*@got01Nai zl!0M|5$#soe0$d&JbP&c@{I@aV+jD})FoLprH7TxmuQM)17E3-MA1SnHK-7EbW~?4 zQ8TTmjR;ga|Lx~K##0@00EpJs@zv@7=AmilX^Ewai+}XffOdVnY#QKrKtLA!V;MW~VUd6kGeRMJ&n;yu zJ}-660^t6}ZWh+{l-TEeBEiEeXE5xzZ1}|+J42x+RB?Y+eN(%tX8_#0m-c+EK;JSI< zJ>6f($PG5b9Jw)bG>>vJl<-b&D6K3bjH$p>(3h>^OuD{6py7O=9}l){J;6h3ck}4F zJ#?PDT4FOof??SJ3j+cuc4d=87-j@hDNLm}G+2nS}B{KNw)m zGY3Eu*bLJl6st#+d?q-?$5*yqG+p<5b}Sy65DzJ(Ju;q+0Fxpa9+`R)L#c72xiQM) zpKB!+4RP=MNi3Mv5ZFw^M`$3M>}~tnr>FgT>z?kc0yyyV#lN!b$ok2P<|EGK@!hNc zrMO-b{U4mf&kk)_`lC13DS(5Um(+_Z9r4E7Cf7`DQQDW_B@+Qg-uS|p8*HWH0{6n8 zd>jfVc@?MstoDVa!5`>>pDkU2A?-lue;#&u$pR<;17+!C;}93R&Hw-a07*qoM6N<$ Ef(+q~+W-In literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_maps_48_48.png b/navit/xpm/gui_maps_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..827fd3949aaaf5e93a59600ba5ee174738e190b7 GIT binary patch literal 3088 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 eY>;VS_WuACY(?GX)90@M0000IanC^Bj;wH!M*r z?hT1d6iVK*YIt&G6E8Iiren)hXW?S7Y^p_liYj_(gDg5wH(N+PBPhQNZcs*JW{hOQ zzNxHgb)Ljv+e_%Yj_~oK!~L4W>3R>j&)%to+|2n1m;D-^Lkqjc0Q;*?AQ=!uVTWc? zI@=9$_>AJXc89(*ln2Q3~S8-u5TY9@(DndIwf&>zgK*i pHvb|n7ytlUjf#{FnNT(D@E^H9Zz7JS7~uc_002ovPDHLkV1fYtirxSK literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_maps_96_96.png b/navit/xpm/gui_maps_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..c732892c8743f147a04a0cd9b29f3a793d659a5a GIT binary patch literal 6984 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_menu.svg b/navit/xpm/gui_menu.svg new file mode 100644 index 0000000..e81d59f --- /dev/null +++ b/navit/xpm/gui_menu.svg @@ -0,0 +1,658 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + System Applications + + + Jakub Steiner + + + http://jimmac.musichall.cz + + + system + applications + category + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_menu_16_16.png b/navit/xpm/gui_menu_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..61f129a4ca883c72d6c3f6910bbb90b7c56f5be7 GIT binary patch literal 654 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_menu_96_96.png b/navit/xpm/gui_menu_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..5ad2171a39fdffc4c61ba4f014abb9c2a1c57892 GIT binary patch literal 9077 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_minus.png b/navit/xpm/gui_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..32688e24258fa5f9f24a6b02ae0f299f0a169128 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^2|( + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/navit/xpm/gui_minus_16_16.png b/navit/xpm/gui_minus_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ae857c04664baa6ca80c44398dcd3f45b74761d9 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^$o-U3d z7QM*{60FSp5*L5$;^E=B$nr%eH6dXK&*KdXJhNmh3Kq!B&tqqA-+Y42K(I`uuHhXk sFB=#gI`}d$_|4?>=sfZ)186FPr>mdKI;Vst0LuI=8~^|S literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_minus_32_32.png b/navit/xpm/gui_minus_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..00d268343b98b4be1b7125e4e2aff6dcf8a5178d GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_b|PZ!6K zh}O54PIEda^0-{=-g78uedvFiu}7mnIa2u(2RZcy>;UwvS|#n$o%(xxZQ-2BAg q;!++z?UMP111CPJPf>Zfi_JS)b#lvG{{=u389ZJ6T-G@yGywqU<22d; literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_minus_48_48.png b/navit/xpm/gui_minus_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..8960edea6731ae534727d8cd73ec7a4c4957c69e GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}}PPZ!6K zjK;TD5ArrBFfcoq@*Ruldk~ScjQPhxm5$Ex_fEI?b+~~FOCk^dv0QTW@t~C7FZ^0L8tgrv`<0Gr@=lH1Id|V8@f4J^6HYINc PYGm+q^>bP0l+XkK`<^KJ literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_minus_96_96.png b/navit/xpm/gui_minus_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..1dba5eaaf97e3a971e5b87e1cdb93fa16b627035 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lYt`jo-U3d z6?5L+ILO&xAmDOQLu}fm%QLqL@E=~VC;WiklgX$17=g-=zccO>8& zXF%Cf@ikj7X)k&<=i<*ghnWniOj9@m)X*4~?(d8H{wbpw^`KggXBMmK?b<*gkOiKu KelF{r5}E+^KR==X literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_plus.png b/navit/xpm/gui_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..1449cf23f02ea5e2fe2c0c1a664a482f175299d3 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^2|($tQtWd{UNv|m2YxVZIvn-#mv#WVk#-0mCR<4>@`YAUk5 l8~4wUvYpw%$Z$Y{-&;{2dmFR!I-oZhJYD@<);T3K0RU*LYd`=1 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_plus.svg b/navit/xpm/gui_plus.svg new file mode 100644 index 0000000..59747fa --- /dev/null +++ b/navit/xpm/gui_plus.svg @@ -0,0 +1,94 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/navit/xpm/gui_plus_16_16.png b/navit/xpm/gui_plus_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..5bba5d3991e04990eeb0a802f2dc67670eaf86f2 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_&o-U3d z7QM*{3k+X0BzO?OCK3`7e-h^a4dBy=ZCsM3%*=e4SAyM^Cr`oK sNa4@D&eN>S^1UL`4jfaQ4c{^_NNy63TcOWy4Ri>Dr>mdKI;Vst0Qk2<;{X5v literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_plus_32_32.png b/navit/xpm/gui_plus_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..4635a9230e348a825c3a818f66a11d8ef9192cba GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v}~IPZ!6K zh}O5$9k~uD@UU!O%75E`OaGSnH|F1T&R=Sn(CTrrK|R?hfrCrsppN{xYl1tk-Fu~? z$T`VjlezEy0~$dJtU(D?jZM{$_O4YAi^&xIa4db|7HdOak9iDy+4aA)f9!8)zuBU) zdWqJ`Nn4~YJZi-JRyi9q^#5>w{hWVUZH$AyL zgH-zd5D8-c_ajJuz4kAefb-82@3$^unr*R8 zb-}gMKKt1P3Yr_FS?+)hzRdk$@_NUr9JYq@GM+gi7p}=0a030n;OXk;vd$@?2>{D} BZtDO5 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_plus_8_8.png b/navit/xpm/gui_plus_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..e62a22e37aeef159d3462e19599d7b39dd36b56f GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^Jo-U3d z5>t~C99X>qdSq2pRMvQTcto`79BT(cK`@Je0qAC|L@6MxY#&XXN`%*4xysu2(Zf$$}_WA2wb*Zw8Z!j7%CNUjh>EIL)R#0>BX_&!4lz_3j@OMAs z|G&Qb&)l|+8E8V9-I0R$Y3DDW+5ax})-Bx^Jy?yLT_p=fS?83{1OPBHeJKC{ literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_quit.png b/navit/xpm/gui_quit.png new file mode 100644 index 0000000000000000000000000000000000000000..ceccd1bd2cbc6f1759e7f67463250080c17f5a29 GIT binary patch literal 3436 zcmV-y4U_VTP)LPf9E>%CXn>#arVE#j@+faWq>VP*g$S;^Ll3Os(l zKL9^?w-2jvT>?v`jen4yndx|Hr zo5O*{Vxgg`ibsC`dmPEhG5u{?v$u!*)4;;xq4W=bz%_L$kC&8?ou4lodA;9g z1rUOSloYyFcDY;E(QL3%!CPynKTKSn@wi3y`+R0t5-8*;>1{R zH?RUmN$B67MI|M?w|_rw!?^asLNYBDrULQs?eD;Y#&#wzp+!ReGYq0qGnc)e21>qQ8GqV#xjM{+X7>(}$%!i79GaUyDY zIo=~jK-0JfI0odvtH3_M3x*X~3O3-myQfYi)8T+CSHSHCx0~krdfJ8zVf5U&F_=F1 z?Qco?{Bs}(2u^(zjoSwryCPh~EJoarfm4Q?xf z*}8s&fRGtwQqe;X!P&ENCWAo;1lW7{FmqmfF$T|HUwVnmqeq!lP=L}G6EZl15lKlr zAOxG{%_9(w4Z7sdoJqsNg?J<`9UtQ)0dnAJz+oZ){8MID76UUfpsh^;2?jY=Tg%AB zi;0g)(8@P#Aib=Nv8k!h(jxcE#f#9@b#($h9~?RayLZFx-J~5p%!3sbY+JlIMs@D$ z)qEU|<~j)*Fj68fOo8kOffaIv3h$XZ6{WE;0-j)y^6F|P6&IU2?`m%5{JM2a9yUzw zlR!Y)w#O3_rA?x$(B3Zfg#aPQP!#UmyO&ctcbZgF^YU;%@BqOu0sR^dC}5ueGb02p zK!F1G{L!PKp&?>E!R~Hs6DDBOH)vQ6tX|FRkt3y^@lw?o?-C=LX1;`Ayv@e(7hXVU z=5k>C{(79IABsAIb#NOHX9;LLPMHL8sLNiAjyJUl1a&li6jI9CiAIj zY-HG!DW*=pICzk;85t%$6NzgP07+6O8U~LLj8+u>Z^sUksy!hA-?(um6B5XpH4bus z1f9UJ+}vDgp9Wyy;{P2xw5ip;)l zN=bl4emLTg50hO93DScEgR;6(6tpPY2XNQb5w8O<0x`~PUsfQxjiwP-Qxi)dEsc<2 z_BEt85@1P(L_HEa9D1s3B;atwbf|f~X7JH7dLt$jzPEZjXsU|EP%Jr9Qt*aB8}|V~ zqE0{opI_2oO4U3=L2XBs%2%MRXI=;3&X_j*gyv5C||LA%QOs9yE1ob2gUSK$@X|m-~+%Fzz3%RUmSo14g;b3j*htDx^Gq# zT#7=+o;`@){07BvaCQGLf64yBLLN>{jftvpLU3}&4(tgDG5Gz>%`v8<0$&27R;(Z{ zKHj8%V(V7E6$Y;BUJBng!2!SD^~<5X2#Vela!1hfOYrcY4QAN{8X=~$z#lmfcg^>XiMPbx;zsrHzT0$pIkgX_Y7a6r#356my9|D?zU3c9@ z@&5fJM;%c%R8(;KCqH3`VUMW5S78Emu&NeL0$mXTpFywyQX1Ra3n%C1lF;290g$RF zoc#OWNt!i_eg)k) z<}mue0TKnaJROi27@G~r<0PK%aDl^P2S8XL9dsR#furRbt@SL;407s>;>F#;$2t* zd_nkBB8I>Uuv~yIoL1|Ie~*tR%Q&DA_=I3vRu2+zM81PAeDReuw&68Y;U~5IJX-m3cPOj zRX``aw-Yu2)yPGO$TeSZ{1BG7;H|-+EJKz+dSQX#`z7FLd_10+Gs&Gfle~fgvhTP9 zdzg@>s-!P4Xp2EpRy+<8|NAJOYc7 z;oVHIJccYpjo^)yl0Zh*M&!$2VDmC>uv8v$cl{55bc3|xTP30rr;I@I^cuMD=$NPgEjn>5Q!|Jfrfb|57SGKa(1G#KfGEKB$Z zT$2fRXB$+XgX(%|_HLwow<8znhU8Weh!#5%yp^6{se4X8k%NVsm;VQM1}c*g+8vkx O0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_quit_16_16.png b/navit/xpm/gui_quit_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..80b681a8221e48181bb01edb27cbffe26f72fed3 GIT binary patch literal 811 zcmV+`1JwM9P)0;>%QS0kln%AC?qs3N%MQAA zvphJw57tsYEfG zCB3+auIuP8UVzWX&i(t@2FH z(01kwPoF&D<8ql#;qngfs7Il5cXM-1DVfCI)5Cl!MfL65sFRZ`g6GfK6pb?V>=~b& zJHLtDIF5{ALXNCfTHEkd>p`TUAtdYbj=G}((6sSO61>g;3#@F9Gq z*45UA-MWtH^#ZUik$^%0N~INnX+pV-@6jUwl%^&eU>$5!E0$G6*P&bnz+Srk9)an0 z1K`*;CSZf9E*6Wi`MEi&<8c6t_I4-~P!<-Ld-V!El|m^N5yRkhclTT0@GwPS4m5h9 z@sGwvF~eaQ@9!6@Qjwv3`@{(bMSMOHk4FUL&qzd!d|v(?8j`1qB6mQ(gl_;i@9~V6 z{eDR_HAzm>#I`IMjz;CLJ$q!NtxX0mT@uqUB%jU7Z<{yE5Xfnm2C4x#3=QAAT$bZ@ z%VZ!Rv3vK#v29txaU2tz@u3ie+30zg^%(?RIi4Zn6nl?zA)0u)+WZ~$du zf|_KKA}|QfV>sClHvw4|0CYip0Dk!lwl{*}1uS3&(11An6NAIQ!yq94OR$<<5DLSI pD%j#cl?5*o@WUuf0F~9V{{dSZWIvx03y}Z-002ovPDHLkV1i{Yc%J|O literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_quit_32_32.png b/navit/xpm/gui_quit_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..5d89ff23fc39619cef0aa0341d0db7c26ef15a61 GIT binary patch literal 2052 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 O00002&cdL97oV7Fu2lh0-|nl~Czr(FKJf&&2M z8g_2$b(d^b3k?H=K=VB4^`iT3_fVXhrlSg>>A4(w5TM5~YC4TfrBn+Xacmf8s%esF zx54+p^VqA^NK`6h;8fcz7GdPNgsT?q;P#!^?z|TcKzyDjU5(|OfYB3s*y=TZM{1XrGas-zF@C}1Eu&1#31G=SM UCE|Knh?8U_e5V7K(*{DAGi{R2zs& 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 FV1f%)!{`72 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_rules.png b/navit/xpm/gui_rules.png new file mode 100644 index 0000000000000000000000000000000000000000..5677ece10c8e4a266d2beca382db9846d223d2ca GIT binary patch literal 4042 zcmV;*4>j>^b!~j`HfP~5dvbfKCR4gDBBEpO-o4_Q=ZmlWPO=d#N^hbqgJ{(*kwx*HaIrkYGSq31K_USw%$X;F@!s8eiq zn^H1&UibOL!<_8`S)ui}ExDOYNKHex)q)j|JgmO&p@;Vr&z>u&)oN}2^l7AjpdW)n zeeigEfPy3E19-^Jx(Cwc%~Pc^tnJNLUx{h&Y=t&f53Np%xY$@kXd)p90$gq<`uZHO z+U?G-0r3?|!kQsEEoq>umhsQ_6~mMy!Do0gYHy1F|ciUKGaaJij`ijKgY_dM9= z@%S&PJ5pXVR`38opJ{?G;GJB3^q2&NLUd#dv|1f{dV4?!0U-pjv2kc_Zk1kn?Tv$7 zE!ND|j`rLqpL)KczP?^ECXG8eFCYXE85s#hQ3B@*{HO>>k~H&AFRpuL`MvjB-`)Iy zpjNBl^?83J5EF;3+dmcqf^chfb!mHDRaLWJ^xyo}ruRghHvZ&1MUla>3`9xPoh$Ib zC`#y9MMVREH2~HG1ko=^5(pXLP17{gDm5sYK$0XWv_?@BidJZfWmyoyfY3B(LIV_q zsZ*xVEX#IFqO>s}2HvZ!tZW$zfiq^{CzA=?=kAGj?TlKb-jZuF zrRU_AWT<)mFTZ>Ee#Yq>9%*z!gX1{(d|oVByoi12PtPXZedn^rS(+^$3;44lFeSez zkD@5n(eFT9tQLe}KnOwqU>}MK3&~3_J~uOK(&W1QY1y@}uYajHZ%Q8B33&a&=fKz` z_!(bh(~67J7@BE$@9hng!{I=er32HZO@~IKfvv~-vlmy$DeA|cR;x6yT5WjnkyT!X zAu1?v1q4AODpFcad3jg<%$ZL;y>{)&=~JiD<`c)om8;iML>8mU%F4WF!gt0JI(q0( z8%^l_^$iV*Uav!PQVKr*VwWh(G7O1HU|H_uP80GFc#5K+R%zgLy0Ci9lUTEArF!R% zzf;M{NsJ^0Of}`@T>zkB`P(K>oJjW%IFOT_%@Bt4j0QX~N-?L6Pp+yycJ$vxNs``p zXOrh>P0j1y?%9_&XVxq>F(Hv+7zQ*=0iZxp03ie%%Y)}tu-WX`_0?{PVL0WMn{T4+ zJvJ1X3fX^rx97TX@5ET`*?3SBvRK34-o76WnIMZBFaV#9eS)a(lO_t?+qtS?A=KuhL_KwcpBZtby z0YF|sLH_2gA0Ak<;!$<2*{tk8P|7@b-#s7;AizB3%7!T0*xd|@rSFA1_v=6pyTg>t7^`as~>xW&Irs+{h@UzN*;`g^v0F|AYMe6HMpsBeLS6q5A7>)ZX0LUvS&X10WuDti1Bd)Cm*js@1ALtbFvr=-C&R5Th|!cckXXwKSoWMGLNr zbh@38BngBeh>VQF#Ef+6`vYZ#Iz!^Vc*A&|M$K-1=E=3G8nv2ox`s|la7mJomXb=Y zx$2g%GAQmQb$AlrDQbU1qa60DzW6xwogsK0b3&CXB{$P!t6p zey~Z?X|Y`1+vC9C-~eoP3#LykU}s-AGkyQ}2gQ&C4+sI!H1!h+{>rOw)bTt|-GA?L zE-xpSZfb1+!!V#I3Jk--(c6b^n+3*X<7p-MuM)^HnGA6;aVG?I1YI(BUb`rY0}JL~ zooAX+fZDoRm`|AD_xlhN8wW#TB66}baj^6t2+g3exf!LU<=kDjFXhgM1RoUv4Z|$| z{o{|(lP<_$y1Ke9aP;-SG{c15|JV(ua~RRl(TI&TfaiHQT`mYh2a1Y{QC(e)S6Y*FTqv38kX*EW!3{r)MJ z%k96mzU*KF044kjVaR@U7vgy?o#%K&N5z5$jpU?cbaizhAt3=}l}CIB%PO88cJ!*g z+jrpE-QRxaOHN9LC<#bTHb9nS)eGxh4*d1+pLtjP@yVgBAAPjp&U@~64-O0|iSY)+ zM8`sdMAW{=Ty+BBVf1p;ET_93jO{48|!NhTL7p4a7|53!l@X4Z5N^vl8qOB z^66*ec$O6nh9qWuY6=>g8j+M_#J24p!{;3OZCzcRPZyg}KA?Y{l1h8TQl0X$xuM!zT2^tzZ?3tL?;q%cHZBgb zA_W>-J4Ib;N*&LL4=z}6?X29KY{nn(Llk8kH`gIMb24-BMRVvw*4qNsUEw1sMlsY zdK!508A}KN%;vqWW0jR3(S-iaYO}&%NP^ez!HtU+sTMA{_Hk`Qgyr9sEMBo>@eRDo z?F7$puyl4o2m~-VG=RauLCA{I5eya!3OPoj5eW(LAPj@n_V&T*LuGR-OAlOS>1exi z^Oo&_IIR}7X0x*Iz(HA&q#=y-DhWCro{dpSiD@%t%u=aTm-pKHkd-qTR$DiQokO_g zrkhlEEL{pg6fo=_f*=W?K;u|VEn;J}FeDmqq^8#I^>}vzpdun7G?FA~4_6-*vL;Vt zYt6?cm(#g3gu`aBwCLg!-hJq?Rd*_ot9os=)t#-aCxS4j(~QcQPGn?aPEM{)tK0v? z+SO5Zn-#u*AH_vQ2nasN(ul6-cn*YSpePF7e&>Dv-hBreXqv<*vTUSiT5fM|Ep~Kw z_W@w^2E#bLKH=(!sE8|M8AeM-+p-?3wGAUBA#)suIK4i>-rd~_Kn%KYnrk7P&8fx! zPyqTdKCu(ZU`1q3@C#owB zEd>x@S(e1=^}1fGwH<&I{8I&|DTUyDIp|WDi@)G<2r($vdu-#UJbTr| zi5V#-QxR!yX;EHWw?5$UdVZj3I&0B_`JCV9fglLb>Ec0XN(&$ofFKBh&}+3i0I*>o zeEiGy}mb`0?|y7>%D)ufIeflod8O zG5|=x=M#Eu*4>W2KBl#~>FuF`0UH4Ly}mxe^Z#=Br5Do_MWMQ;PVDIDgxBNQ=W)Ax zgMfViyumSa?ZuBJ6;415BN^^;c+^jg`04Ix5bS|doX1FsaUpVf1*SDB6`w6iqTS_m zeQ)pT{%mNd-x`dv?-cg}@ca^(f5v`o7Ya3U2sDq8%!INNYQ&I**K8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Lapo Calamandrei + + + System Run + + + + run + launch + exec + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_rules_16_16.png b/navit/xpm/gui_rules_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ef1436f94fe4e9d56424ada28b3afc6a11f4c6eb GIT binary patch literal 858 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_rules_48_48.png b/navit/xpm/gui_rules_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..5677ece10c8e4a266d2beca382db9846d223d2ca GIT binary patch literal 4042 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 VnRfopLSQg3c)I$ztaD0e0svR%l@I^` literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_rules_96_96.png b/navit/xpm/gui_rules_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..b484894a17100dff0f58a9d8c97d73fe01ee62d6 GIT binary patch literal 10761 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 BBk}+M literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_search.png b/navit/xpm/gui_search.png new file mode 100644 index 0000000000000000000000000000000000000000..6c2fbf7e23bc7b939fa9e214c4d4f94e2747e99a GIT binary patch literal 5698 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_search.svg b/navit/xpm/gui_search.svg new file mode 100644 index 0000000..e363e15 --- /dev/null +++ b/navit/xpm/gui_search.svg @@ -0,0 +1,812 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/navit/xpm/gui_search_16_16.png b/navit/xpm/gui_search_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..cf9bc0c871e1452fa9d22b6ff6ee2e557ff2e2d9 GIT binary patch literal 687 zcmV;g0#N;lP)WVzEutU{iK1=)LQpOS%^_1N7aA@Ga?*mdbaYUIY3BX7r-d5k2W@)bEDk*U zc+Lm#zt!1wjaJuIXeu*7Q<+IxUd~bb)ppv;&$c$6=h4Hy2gr)%fq*51<7!=UwLXsY z#qL|T5eikYJpr!k(*6FYD^69@gplCyfTH8+qNClCqje2`f97Uar?nko06?NGK_$C@ zpOt6dRg_yQ;4_8KZ*rw17s6ni8CdiVdth#d=7+qS2{7#8w{qTl{j)mk5l)YjJhNg)6r7z~10`+o@~eUDzvXKYfg zloF$Jg$37f;5ZHnE32?e?o98MLy@f`2msL9gH(z=8_a#;feKG?r46aTJr4jtb_8%fjtWW|&({Dlg6bva5Ki!1!u~D`I007Aw-AMKF9>xR=L%{SYm_7x=5MWFo zbMJ7^siyOLJ`@0;HrDttpI@TcuUSeB4Nz)mfO1OObZlul71k?`-u zU;vC0kw{CpE=u9LC>;%ln*o>rR3z3w$?F|7{AO@h2nQfH%zgj?0Q&%h08|190w{|_ zW7LtnMk8ax6pzO(u?3(3&<03vq}eQv^{*9^;~#>I@wMscEYj(8ahJ>fQ=3o#px@$g V=&f(@-oyX^002ovPDHLkV1mc>J-`3} literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_search_32_32.png b/navit/xpm/gui_search_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c8de12299118980f8bb2af9e31aa9a770d6b96ea GIT binary patch literal 1913 zcmV-<2Zs2GP)ocbpMZw|0IHt}hl{ps*>UlI z1u(tv;ib!#M46eHcxLr)p{i}>;G9lT)e8@ddjVBdmDryD-W??b+(v<=%a-W#YhS?N zL4$GX%n5`+h))iDg8KRf0Ki>$^~DcoKME1XkhFBv*4E&;Km8H!Z~vgzAU!(f{cN#r z*}M%WPFJG1s02~uw3;5@&HUfDIHwp#`{w(;PxI!_!@#=-Vdbx$#*X)P^a`R|r^R`> zTCi<9s!o=pXyjsR9Mq}mc;3HYQO=K%+J7KcJhc)# zKiGL&h?^X8m;6)e5e^!)N*Vfcl^#s732dcXI zi%aKGT3m|r{+vB&{bGJR?r}WkNg{3~5%(k|VNFWh<9OU~JmzsC?z11W;`^38->@~z zRV|q%#U;fEf>tQe-*2Tr2S8R1%-?L<`;kqcjI*0;ndHZdQoJ7PWtzm10eJkvlB#7@Z$9=;w-*7C(67z(8&$91(6!Q#uR@iukJkQ{=yZ2mK*~cIv zj0o>-?g^k{BXZ8+;+Gdd1SI0t7%OCqz&RjNMGzot4x;F9rI%{h^Yk~54;-Va`1tts zOSM-T8zV<51msS?djtTE99-laq9}q>?Xd(m094V~R1XnBO3bhkh7h5}xzL5+*FL&X z+Z0k5kyT3u>&xo@<-!n70jN)^4)K`B)(WjFJYO3HAzog}aBy(W^#Y*HiA6vpc;&;( zwZ<^DI;YG=o17oA^_0axjR3?@1c-tFAkoMLXs&N@FYUfwBh~@{LcT;p5@Sq69S1a!jM$q;FO?Y5**F}a2-%00s{4}1gh?IBA&QEEiDyf2$4cX z8J0joO6-)ZMC?dZ)u|8=l2Ky;M^Q3~wguGz4h}yUKOs3E>CT=2I$p!FkM@qKsI0`O zj8XV=*4Y(-6Bk6J5yUwd7co0!>xivW<2h$MwbsH~3u!YW1|$X|1~2Dac{+V)IyP_3 z$Kg*8EV?ZK0Q~L`YcOQsF!bx|$Jh`^L<1!aAkINt#Kx(yD%QgK7RGN2Yy@HiWCX?t z*boK{Of{{ot$5?jw|bQSCV)@N%BZAt55|ohi|4aWtpYI&F<2NR79z=vt>-7rCg(^j zSdzXV#)gGoteP@u8rHtJ4#)m+@RlDV?mF?}OY5%=N*#g;6CT9cN2^xB5SR(f=m0S` zY3+fT0cHXWVSRS(s>f!}L1RM$b`_OW-!gsla2}ZU@GLFewF6hL*P*)lB=%fP-@E^- z5jA3cST89#0EA(Lpfx}gv>m0w6DRs4(9+V3>Qg5{%=+%XNALRl+aVVLU~0b$BNq)nn+;XUoG}Yg7~$-> z^H}-o)#0d-=_W7lCm22=9dB;jgt{x&QVI(T8+#1^028K8oxp59-&e8=&N(!-Hi4PJ z#K~)0pW2qmn!5lI>Codxj$EGp@GPA>XEufnOUKyp_hZvr?{o{%t8?3fQ>HH_!uCWW zj%U~W9+M|dgsS4mvCpvP+2;@h0fMkK`(#DM-nLtG;KkZks7>VOA8fiE0NujSrQfw_n_<%QnaxWVFKmOzz})OPc>T4FxK?+)Ly7JdXeK~$jHFF`Pq2&mDlji)o)V@3kw@>dJTI}=2oR*B+r(n z&1|Q>R2)5=vbA6bCQqJ(GiT1Ccy}pQKeGynKCuR%`#&Q^a$E15rS_0{`;~EHPq|5{ z@*{`)0960v^2IoM^cd>Cu0wNk3wi=*hiLzX_7t=`Rk|w^0BHGhG;PL;wz+oL@3;L2!KCZLj}8L@00000NkvXXu0mjfi8PsA literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_search_48_48.png b/navit/xpm/gui_search_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..1783fd2b83a00f102e0989742f60d824754bb3fb GIT binary patch literal 3582 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 Ef^$>h;s5{u literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_search_8_8.png b/navit/xpm/gui_search_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..dafceb6b0e368ef290a14216ac752754d52fd3eb GIT binary patch literal 295 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_select_country_16_16.png b/navit/xpm/gui_select_country_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..687d713e6e26943eef9d5de72d019c976aff668e GIT binary patch literal 559 zcmV+~0?_@5P)E-_xcltryhh#E?{}q6Pl}mrg%& z!~1;TeO`cnPT6c`K9NWS4*DxALNJ%h%#94Mt-TSPj^lm(R)D|1SRQv!?rD?rhyGvQVAhrLm{P7F+ol0 z+P01MzK!*IZL1+SWYeOk87l7Vw#LqnK_it)g|01J&j(rdgzx*%@An}P7#{J3-vG&E za$@OLY%>~-%zC~DuH&lf>+cu0rR|OB>2p^B`bR??ca~w8E0-?LmPAoR0DwaS0Hw5R z7@C5>fMwcyl}dRr9>4P`etUWK!^d~amT4=#=l4uQYZ5|mSRa$&a5!3iy}EJ#!M!B_ xU;%*nHS8nu@b1%RnYRFN1^_1i`icKXKLMj}_ou1bAMpSH002ovPDHLkV1iQy1cm?r literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_select_country_32_32.png b/navit/xpm/gui_select_country_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..04716ad51c1c00ca129605e63ae4c8513e3fca6c GIT binary patch literal 1469 zcmV;u1w#6XP)op(M7#EVX@br7h zYL&X&YO(LDuCBH&ny#?$-5uY3|E&cP>8s{zrrg})5%a~AloX}6cia^akv_Xr-=CeG z9kQt61qFFKfBL!2f`}wZA|WE(Y`HP|EQsRL!hPL6-F8GIr_(`ScBO%c|;$j4`hgd$bg7I zW-{obW0wnd`_b_5l`W}hsR%` z?*Bu1c_&skHeNO&A~{`766`$jf{pBUff!?SwXwn2)pd`TWtq&@DKc9oY05G|c88r@ zZWonTmUa7T{WCi-qq}$S@!{cXnjKEzNYu9I6|yV?B2F8VAx0mwV&%$EwcWu35&{u` z+FuPSr3&gU)N~n#Mw6n%E~kuj zpi-*n!iCy;y*s^)6dURs!kS=mS(KmtO4_T}5)+bwc)<$HdnGxJ14IM@0z?L)BtcwkT;Q0=ba?%`H7)J!o%2G> z3s78qDkU{_Z*y|;u3(;@E)D>o_EUpKvkbIqEr^l`hzt-JNU{Vm`nbU1;gN&uBGz9w z7!3TP0g8)HrM{Gwb~7n4Iml+Sc&{3PMxy~vp`^1l)jfTE52g6n9YK;T1ELHJ5hPiJ z*qHd>v5C>Fh_&mQp9SF)ps46%`rf@SHz({&46^aw;y|EPYk>%;zP`>dGCY+S~0C{=Y(TPdPw|A%P3AXVTV8j3j zz~4^|N{*xYi}m-%$IL0!)zvP8!N6~f)ZH?UjvbEC#|BLgtLZtxP=@Gj(Sd*TKRFPg zTYs^utLtCmc{9kP6IyvzMeh;4gk~uu&lSY zSIOJVtxmTyZNrAh;QIRWzg@lZWky?Dn>ed;=zXgIK;7BdBPsn=KiF)Rw2+V&0-Bl{ zJI>dA`nJhr;=DczZw&bYm|5chKru9AbPK%YYtyJPsO9F3R{LtF7h=X{b~{5)K4KJJn=1}|#4Kq^&sTo} Xzmpv>>>i!700000NkvXXu0mjfQ7FWx literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_select_country_48_48.png b/navit/xpm/gui_select_country_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..0d201576a87858051d7194813500f8282166a6da GIT binary patch literal 2339 zcmV+;3EcLHP)4!ZFyP$G2?T7Fm-dSKd&-?#9@AL4y3yf(@V;a+#{?{rlex6^oYSq+x6|b=H zrR0%5%MSN})vH&>f{i_Dv2v#i3kznCbmNfLtuK6&HJOeVyVqs0;EkA(H^HGc!Z+(XNK>NDS=k)hE* zgv=8W>AFrtME^LjU;IuWLgueuzoropDT+*@B$BS{q-h#$*!Tzka3G4^MV@^h{9O#j zQmC`*CdslyL`2mGK9cS!gkiodWL{Qe5+#8|Q6NDSdLiD}`1+6_BF)QmtLrA+>byxe zJ8zIAi9|&7QT6^ILk!x)IxGb#DQQ#3jT_JEx(;2_Km-sGhzO!2fMr>{T>Q#?yu{U&uVf81byFe7W` z7vJ8zo*N$*mzbD1nPV70(=-5Nd=V5?L6kWPkIngMRDEOJ5@&jX9%;VFlan*+ zw~H6$TNFisU+4h{2u1)v1fF+*VHi|YmWiF6o$I%jdOjRAfY&ncEQWOQUB1J$D5o|F$hzJ`uy%D&6{ zRP=)E?3vFmoS$crWf=jXC&D;Du-jt6vJ5;GWrFXV@0FpN2ZnG0A$h%CZC1{sdrzJ^ z@x;W53HK)?OyU>-s;2eQFe}r+OzRXwd z^awuR*KckqDSKq354j>6$)0#VpGbL|KfeXNDNqcpe~tWm(9I z48OlS!Z<+SZ4Pi8hpInU`diMP-Bh}{e8X`44EY2?I&$QQl9idgtNCP8ZbHJODG3Ra zI1oYA)ZXk85hO`8%u5Iefe7Oufae|HSPna@JVIMr>#L=k%ZHWu5d#25V`t9T{ng3i zxf3Q#m@;|tR1P4hs*3RDlvM?)rbHO;ZCI9tr(&Dn^9`@&?+HLS#HrKGxerX7I3;n? zWKIV`Rh0py5;7ht8xt4I{AkUO3LpeA>yg~OO(z=WCQMAYe{$j!PLf6FIt?&R1Vme- zVTp>u&UbbM+S}VUZYe4I(`fbwMsS_(uac4yKg+O3o12gKIi{dt0!2((hGC$pDlT5U z!0D=fc(i*1qdWlsD0UZBI-MCSm*%gqO0o!1k}$A*jA19sh>pGwk32HVRM+6m&v2zT z9sQ#2?Eej**j-dPV@CFKix(}iN|FeFpy#&6!{>w`2(ZQ2kTY|ZsiC26;bAcZ=n1JY249Q+PstDJY$hWBlC!?aR(mEVZxO`5Lv4LjrNAxZ-5 zJdX@#hPm;}hJ4qIp_kK80GM^|!iuz1=d(+fEVqi1(3kn%Nkwqj;{Y)5c*=y1tCx$m zyj@-i05vr=+Pt|>?rv#2Gh3FWNz;>(O`35M;Y}ZGY#W^EPSdetjSGhgF(^Rc+JfIb zIQ2pIbI+`_$cls>e|Lm&BEZ2rz%VR!R(XVrmo9H8Eh#Gvk5N-oqopLL?fvH3m3g|R zJuq!r5~r#vRLy8?3QlfWlEB;Scnwf|hc+#z)L zbd%W>1%_daN!xdyXBZBZJ3PX<3m4uf-Mnq%?c!8bRRub4`5&+OtfubJzdjaiF+9xX zC}T49lRo`Gm+Y%yGY8y*!w|K~JEzw(g2EJM+WZBZrq|WMo+5W8)b~mY|c4 zSUxUT^A%gg%U3V1-THQU>D^*AG&Csl<~_NqwY_C_SJ%zNl;kv%rm0Xh6(-IMKE{rZ zKdF|yb+wI}!v4(T@d%>@U;&uDUwAuz@RJ`NIDP7?{M6KRYn&q+W>I0QdA-WKFe z09@EIg;wjC)^3}_e)ycP^_NXeO=xRx+xpJVcdNoS2sa+SVaNz;#Nuw_9< z&p+1u)$s`}Ev;ww?b*NF=ktmEyinNcpOiZSkYS1m`&kE|x3#o&j2}1d6Ms+l=kNaI zz4rj9#?p*e-S}Sb7Z3eFsk5_Fx%SPs`(oo_JN|v>v)9_&+dBa$#?o%H257Jk^&yB* z_SmrBhm3{bLZU2pjg1fOg@G!X=kJdf7U!RSbFw>smb`7ng){mm-tWu2+-8y@ vedGDr*|JPmk6L6NTcW_m#%8vthJ&Gdvd5~mxbP0l+XkKJQ!+G literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_select_country_96_96.png b/navit/xpm/gui_select_country_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..6035c5f86c38ffa65a6acc8017894bbc137f0732 GIT binary patch literal 5227 zcmZu#c{mi__nxtjC9-GVQ%3fXH4&4sCE3?#jBUss%^*u;SCd_zXk=%SeHW6QgfOs!N}a_YcYN z5*Cq72KsHHX@GaM-4zuy=FhhU=O;F=C8bg+u$E*y{+G3pU$}roI=1f+j;6ft-KFMu zWct6=ANz4#AFmnv1v@d&31_=Yx$WoGtPHls?XlYOpbdWQvEIO(+Y~Mz>eQTR!0pYe z=2m|J38_Wr$eD%>7dhup@1fvG#H``?0q;-mQyMncu4wMX7_EwMp4Jzw09sPQNq_%s zVd{moga6<>WA5y!`7+GI4gQm*7LVKNtA2-34tRL_yrr6r?5M{##o78aCVhsT!4ZhC z0`a0*&UxSYx~8Ui*a5#jCq&A_GoKnwO#$3n7d0_Zez9-dV5mtr zokg_gS+ebWbYOpF+lmvfy+>|UhBc7(r2uqsrF?9^iW!P*B|53#dfr0{6nHv!pn&!H zPCCZp8+I^B@T|c#hovf^uh4(rTL;Iu+tq$nx#QdONAN)yiq+^_bV_L{K8MX)$AP?c zc|1>Ol6ItvglB!jGEPf;U6He~v6c8v#f9`UlS?T_&cz_OX=2lK&BE(I%1FCkpJ6Gl zdT7d6<2w_?L*<3nXv(c>4sRE+lfsCLv~i2qlf=5P)zR8%+eVg;q9wjZD-z2rHDVXE zs8F(;J+e$<5Uf$Et7aYXK72$i?5mT2(YF$y)MId~k->7Y>+f)3s{SJU@m4eoo%6>m zme+mmLj|D1F4{<6v^b<|jSqBkTNp-@%g~npL!*FQsDqWl&`L6aU&l@Fl@(YIyPsoCM#=K_c#MX2DK^vc4V+zE0USlGI1!K-N)1yb$GOO3`?>l!<^O~BQE7%|Jp(2il)Gm{lQAE)Q zt_$DYlIu(1#;%#86B9;atXa2G5pBq&4^u(gzc@4srqNSB%Yo?9((juVDTSpxPW7a9 zr_JjVonfLzJP_9u(3FhbSHTP7Z45kiC4N2LKJe&hjqRP~e#}KgY3WOCnU0#?Li}?` zda5``xTSeLGp%O07Rvg(>m2{C{cvQkpdKKU=tc55+5ht{S@{<2#e8Y${`%(i(OPzr z*jOhpcs5AXSFj~5iiH@iNl*?udp;UCAF98}hk(umbn0u{+vmw4_M)a-J1dfm`o7cB z471W(%xG0gT6O8Zx|&Rpd)|BNJKC*LO}+j!`_Y{ys{WQhz6}E#hvq|7C-}eQP~YEi zHy$vN$YAWHi52^766CUgL6^o;^1HGr*#vK5RlPj5)x;r>`r5m>I&*?+RU z)uY!_Zga$4nsJZ;$?LQVfG$$AfI*l}$7Upx%C2(x>|s}faMJtSqo@{%+WIf(0)B2G zKCIF14NdSsKvO{~$bl~H_?M^7C;36`fQY)fx-qCh+~w{QypZ8kAkE5{Tx47Tv4ZUN z09*LCJr$v$=;I}cOpF|35GHy;LrI$9a@xpuiHn1y=5(oVVoB{hJec<$uc708Q=5me zG7RC6-6N(gWkjoxw)LBXG+zv8EE1@5gDo5h9r%ikCE(gF9ixaV z=OL$9^Y;%7^<&#LnRkU#4uDF*Q-g=rBmv@X((6m~EaFn1&}yX~>z38=P5@y33 zlKE~Qg{FnCxl(a!p)|E4op8l;HS*xIDo{RZ|Bhg_KkUWGvK|BS7FB(HZQUC&R==C8 zk0=%iXL3W2oCU7nn!jVg&;ef~agm-O?{T09}UU0k)n zwV#9LGw6h)S;qI1wv=DUyi>=*bueN(O=YVd6UzjHaHsyE0ynY*F1)^SCB#GLPDpUx zIT@O;2Yc*c6)b#eLD5+XRRQ`9&*hy{eER?bR3FU;cF$hWEfV)u)Eiep(Hid7b zqef9#?7pTr=s3;yyi2c2#JZl}Q{BeLn)5Tvktt%+QZCUI-K9>Y`NhjxA{PGP)Itp6 za(Z~pC)jL?ZJ3T=w;0Fyz%YuKOR+FB)0yFUK{)2t0cYxBJ7)k@*2tD-!}N^ z{SQvk!kHSL-=d408(w~a?&1pp1M(0aNO%G>B%OtBIi9;_dNH$u^35Bn`CC5vMR~>f zr?;TmokJLq0ze+>uKqY5x;fa`L;wVZS%jf zOF@T5H}2Zn=3Fl-3%zCZ37G1myH54t1upfZ*VLNObYQBp&g&^EPY!kGLq zk$OD0cLAB{2RBJR9K~`dnLt>BscQku8brFDp5u)*GE^(C-#1daw>54eCY~e)l#T%R zKe8P9^ShrdAa6Z8vM3xMyHz#+*s>lL0r^?Pn;PY4_h|4QvxW}2n(ELk?`8Tw_9ra@ z3E73w`P$}`->|xYM|MqN&sC7>&&D!kOK3utv>Kjq=)re2?0P{sDZ}Y^EmXB4uGSKK zrI_Y3c6<9i8G1H}p$I53Qu``kkNAEq{Nmp}6b+F;#JjlW-hsnny%B=5u4*WWp^ zH)s;+wRnFY0CucbiV9VL6?A%NP+XZx=)Tx>iAD)%1MmhhyR_!npKf-p88+~qZsNLA zz~JHwO~Gs)Z8P@fdIbt%?Mr>D^`>MDbt*?psV|4U{Z-@qJF0LA=qKQS=etV&sP=>s za|{JbN*_1(V8f3!KIyhvv2Q!*Xt`yi0x+Cl1M;92>i;9=6KJ@mAQ? zTF3nL=n=8{gzAi7VEZl`$LP+JVDew7$E|Jt?Ze|^JB;L9_ z22k2*Eu8kk3B2jhx;SYt-;aIIYJ_&6^#&Hl;WL2%wR*tNR~0FZKGE=GJnoa z8Ge#a1P{2|05q-!uVpH97F*D-T~HZKnz9S}m#wj?;vm7n1UGC~#R+&YRIVdd#)FJ8 zT0H7iiE-x;&86Kr5$n{bktOmsN2^Y~734*9oF_Ad0f1WYPlAktBC45XoGV!{1-iBU z#mJQX+E57yU5$+*RDO<*sU(veKteeSy(L?G!1%;O-W1Mkn2F4DFWYEu+_<4fcNeUg zNrS2dzR5e-W~fY768N(L^CB9ITi&jmC7JI8Pe9ibpj#WNdY`cL)@E~}orexIs$J}B zqm80WdS;*K<2DliotvS|_RK?Df>a_dE~HNVt|rOu<;Oo)!k0Q07_X3+Je5Con)G|> zOvP8ii<_E3aSt~P?oA#2#}K74yPw-b^VeVhSmo|LG)Jk9MS#Fgk+O-z??HeJ=?ov1 zn$AvYU_zA_Gqz9@cGJ4m&*nI}sgVyH*o<@6vwzONNH=wRo0qJZ6kVytMa4|JWAEJb zQmI)s?w&<$aM0+~Y>q$MGnWo5$3i$XotQkbwt@>26td!>%Dw8N_#!&2(wyd4Xuw!) zNP0;9;O|oa1BA2{`y~gZg0>36m+v?Rbhi{R6v^bP_=$v^1_=7EJ`x$AFD?DBdx4V$nrY9_nHxWcfRWAwS)& z9-n0l3Ieo{_EYpkoELmbPtVB(kgBWIa2)OXQ;w=#?A2xm!ow$E$uJ6$$aP_AXQJG1 zRRH*PjGrGEaR|LOp_u9#?*vy(D9`o3!}eG8&ka5ExwD^0awj48=LmE8<+lg%Qs%0V zyOwr-f271enm^T}E%e_a{AFd}1iv96IV>!$qGO!769dx0RyN6{)Y=`L-Aw9)xe2E= zk_^JC{^TP=eA&O}F6$jQ8cs$V6lM4}(Ca-OeU#)nUIMbdzk&s`fp7Q^*JXRnUfe{T z3^WV9l9U&8Yz{g|V~Cgjn9DsnIx3_Y(DPOeLsJ~Cn{s^>k1TcoXSSQ}pOHS5ZrY7` zg|scP&!sRL*l)*pPgivcBrX$JMTTC=P=ZV*Kna;Z-q)MQZ z%Ea^^Z&zUv3vKKqli&23zpJ@^{QpHKsi33gtt>5+aH->$iPv!FOb9_zQc5~_XU#(; zAfm#yomn-uAbl!2ABTsh4IAq$u_XMxXKumTgvXVLLgYKgg%bXD%Vu~j9N#=6?9kq& za(?mb{8U=?B{P>#M6|s=yEfe2J$2Sr4P|z%vf*aQ)?_o`hXMjep*U%*kA@c)V#no` z*OV3c7JInbQ&_qbpa}i6Znx9XW``fU7MVIMQ2GiVI*$V za_opo=qeZ_A|;P;uJ)ewIGoSa< z?&&Xl%I0nRZXnUU({^_2V0EZ_$I?uRW2kB=*yduXn|9`O`G8J%FhpceX2c7L%z>@B zj?~=}yRSSPj0=@HjU+f;9E>mi7&$sRdaEyT^`_K4@`OdwgSylN8wMyT*Ui^G=}YDu=Z#&Sd0fZcS6;)jIB!tLe~|qi z@IXH64PnPKq^#*qz(;2>DFPWDfr719CU@3GmuSc?6z5IAPCb#;M<4kaIgO)1zMGDh1hLhzg@4%iyZx(GuN zms9H8sE}=O2Ug3^RuFLbHE{NwKlSe%GrW$hHc!B#C&XNm*O zLvzb4R0z&++w_#lwfhNF1J)}R=Fp6)7^;9#m>0JMZip+O508(~L3!&sbY*AS-DxuC zs}&3U0>ZZt;aPHSXM?IrIFZ~LdNJ6&nSKA8Drp8{iM>yT+8JYRKJCYbTc9pGG%k;p z4Yg>XYYHW>frD1Bfv5oU`>*9}%Z|DVzcd~lzQK+=+RJ;N7E^ysxqbU`!WPjIIQrQL z;e}I)KEN65CHF_{3E*)ysaeVLug!jvRD$ty=>%L@Rl$;UKW|7K>~+nT@-!E|k`77( z1=#Qp=+GOrMl5D-- z(ysP(?>*=AkNenrcUQPcNT;3Ynfd9Qy;`07{hZ(L{LVwb|M5aT%g!3^MG@ojYASd= zK_cLVrS5K=vBMwwYVZ>d&U zR;|dg0zwEl2*D9>?1>hzU$*}U>Hl$nhMn?eA&Ey6N!_q% z^%m)}6-cxH^&P=btP3D^$4>9U zt^^>{02Y-uU|Gc`tgpQeorA6Tx5N9=Ct5#bM2JTr^M5?P2gV-+VC7EfW?3S8uUNBH zyZMiI$sHrjc(dhM3`RRZC;=e=p#X^0_7wpLAs~d+<{Y4q&`@&?uDRq6^o+FQnOA=} zH8|3Hju3wR@jbZk*#YbZz4U_g&od&Wx81wro1vm`3HBfR0s1G-TEZoOQh*R*10WXw zmInm4LAc%K0^ky^SbQ_CSiA!-z4tVG`-4{!;N*rAKQ;g3_XfCfH{@uK^oxqw)mMM@ zrbo2q?sxHa>+=wlfl>l0S))!Uv1=QIWc4l_0O5jgCR_;4fYO3Wd}+f&=;&+1a|fSF znvCDxxR1T`Y5Js#0TwTio~x;>-M(wbx3xE$e})g+4}wr(373d9@{$EYC1M%1Jwiza zj5tO>Y%=1y$*SY&7@9f{qoM9{T;-W&cp z`0J*9XzM#-i-cPf>aVE;+cUOs$?*vBdBzb>KKDX`*!NV;Fz?kl6_3HLaO0O4)J9#Pf3b#Vdm#J*Q zZild5Ff&|e2}-g0vx@?l8ohsU&2lMa#?jt?%GbHOyn1Jj z_n9q-5RV6(aPfqPm5DL~VD&>Vw`38%yW>^ND_xT5-k$u|&VPWYAv$l%Bf*WI20%C= zUt6(gz1Gz6?!{M$Jim8E!k!mWCR}pCGtD(MTk*p`dk?cCHF;m9NrkA8my19^`u?;4 zt9L35k>HGi;>av?4z;;^m}yI%-wWX}4sd2=Ac(B*d)ix<-Ghg>zX(k!wEGZl?HB-T zuDG2B3h9QMex6DHSsq~5)>JN3I|tjqIkVp4yvP+Ga)o#W3ITxHtE+HVTkfP$C#Bk7 zy>azJxbKP|K%z1LfOGB>?FA_d)`D=ACc8pg^8-+_t-N%u(l^?fqbaBD6J(7x5fryy z`VaWdRc}C{Aq&71nS9SPdmx1b@%1gw;+D04>#odR@j?i2&U2oX%C($BzAZn1z|tAv zQjARWKepBX1?o!I;4AC*fpE#QKv@ui3xw5~_|CNlv2p$lzSlc~ zy~4c!oO9F`uA|K4#_JC-Z;GnYCwY!n3Ds*4HQZNnWywro>3y&?MGEBoo>zRf^^Bjvz7PHinp%Jb+9e+5uJdAiUihvvf z&b-~?1iC@ZXX5A7E#PKwM|Ow)v67(R2vAL%%V7mj@o zhM_|U0g1{;n<+rhD8K=DCNWnqs_UtMEK4AEusf$E!M!O^AgL#?`=uLkxb*-y=NAR| z?}~RkU>G{~|K@T0>(NJHn7W%R0&);(V+tT*!0E#UIKBr7A^2omk0KO^fOF){INXNN z4IPgkybG^2{R-9sI2`~%j6<{+T3 zK6C3S1m}3_^{*kGis4Thz6?o{d`Cz}xDdjZ7M<{M>W-miJo)A>jK_!E1&@0|Skp9U z0S)7mqk*(whaJhjv{1fUj;D?EolEPMtG#0#Fm)@wiM?fZ>g=CF2sE8P1kMHO%h< zIup_#kB- z8GvQ<&dk-URrY*q? z{-gmw)hOz#SE94KJsyiipBQKqALa!BfQr>bHcWkUZFRjeGvKHAtao6bt9AKzC24J`tUK_Tmz&shbMOvX3X*DX~> zVto)0ARu67_E~_qn^ns)t9I9L3kD{-u&iP;n3(|>pBloGZ{Ls8eMjAJ@d_8*I>jlP zC4Np>B?`1Knp@h^rZ8_BJb~z^0sufsoj9rs{hn}fC^D;fHi;%jt$9E*r!21rM3x5x zx7s~pXVE|2fhFaez!^u+SUaA4YZv+^I&w$cUUy`bK-MIvnuNl_0@PM4!^xJWL?WL2 z`;&XctJzxf0t~l-&0a~5jSP=|X+iCLmC6JuW6E<)NZd*09?%>BZh65G)Hl(Afypie zq(ba@=Np(zjO2t3I6!3rB|xEQ5)_R>3o2MxwHz1vy3PKc!S-k``}48(-2dw210VqC zKojpRUrEHs*yx7(x_Xrp13F8(_n}m>^1KjmC!8Z%xG==cl5J-ws+s{>E#kT4Z9H3AF z1hOq$2}lTs3sF;Ek7#TXO-DaYObv?rK7N_~r$=ATJxDeHwV%lVQ~(MLC<7G6x9+h+u|J$D4LA2(m5zEo`=q^PIjj0 zLUOEK+{EGO0LKH4DFD==7SSk&`Pf8sWF03asjjM~1;IiHszVT#8Eqva zUQ%cdgzWKvs>vuRnuR%~)nKMT)6urnK=))|y?G?!b;eZ4Hglv$4nTzSl zic9HTatMpctBc9(suFp|j4)(Lfnla$Fdcxk9VY~!M1mr#kR=s~WE`Wz6X-oRlAM}I zljN8l~lMW zBt=TJ0P&nRjkIY-N0aHPXo{LTr_4latcU;d!ZH4~8AIG7*7S%qJ++w?MmZsr4dKiO z34S1_Ry>~-08+RDk>Z8Y5-lv|OA4u=3REId!VS(i6H{g!=aUnpeW;OrVi-PQ%r-Nt zcG`L4e>wo~a|gs*OIgpT=d;)Hm3;SmUSZQsSYPJ(|MI`7{1+r@U!~5An&|)l002ov JPDHLkV1h&VyAc2Y literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_select_street.svg b/navit/xpm/gui_select_street.svg new file mode 100644 index 0000000..390c2e1 --- /dev/null +++ b/navit/xpm/gui_select_street.svg @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_select_street_16_16.png b/navit/xpm/gui_select_street_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..6ff7b6fd2d7edcf0b594f717f0acbc659c7bc838 GIT binary patch literal 851 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_select_street_48_48.png b/navit/xpm/gui_select_street_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..d393fd9e9a32f284ccf33dcb9fcc3a091edc0f21 GIT binary patch literal 3587 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 JPDHLkV1h&VyAc2Y literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_select_street_8_8.png b/navit/xpm/gui_select_street_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..aac8561d14c65b591eba393b4892888c599d5511 GIT binary patch literal 346 zcmV-g0j2(lP)E{UdR1o|IEn1$jHF>gOh>xkJ6rtS5J5``_!rU{$_pK_Luz&6Sp7>11kq3gA}(W zL%Q`Or5E4sN-#11XR-MF^&_*qfF47G(>?}!nPi3*|D6nM3|tIM-}z)%Sh@ec|NZtq z1M@E)1{r=0hGdIghI@~1F|=-oW%&B%(Hq)$07*qoM6N<$f_tHy8~^|S literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_select_street_96_96.png b/navit/xpm/gui_select_street_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..19d323a3f189b61c9b11faae532741f6f810ef12 GIT binary patch literal 9137 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_select_town.png b/navit/xpm/gui_select_town.png new file mode 100644 index 0000000000000000000000000000000000000000..0d201576a87858051d7194813500f8282166a6da GIT binary patch literal 2339 zcmV+;3EcLHP)4!ZFyP$G2?T7Fm-dSKd&-?#9@AL4y3yf(@V;a+#{?{rlex6^oYSq+x6|b=H zrR0%5%MSN})vH&>f{i_Dv2v#i3kznCbmNfLtuK6&HJOeVyVqs0;EkA(H^HGc!Z+(XNK>NDS=k)hE* zgv=8W>AFrtME^LjU;IuWLgueuzoropDT+*@B$BS{q-h#$*!Tzka3G4^MV@^h{9O#j zQmC`*CdslyL`2mGK9cS!gkiodWL{Qe5+#8|Q6NDSdLiD}`1+6_BF)QmtLrA+>byxe zJ8zIAi9|&7QT6^ILk!x)IxGb#DQQ#3jT_JEx(;2_Km-sGhzO!2fMr>{T>Q#?yu{U&uVf81byFe7W` z7vJ8zo*N$*mzbD1nPV70(=-5Nd=V5?L6kWPkIngMRDEOJ5@&jX9%;VFlan*+ zw~H6$TNFisU+4h{2u1)v1fF+*VHi|YmWiF6o$I%jdOjRAfY&ncEQWOQUB1J$D5o|F$hzJ`uy%D&6{ zRP=)E?3vFmoS$crWf=jXC&D;Du-jt6vJ5;GWrFXV@0FpN2ZnG0A$h%CZC1{sdrzJ^ z@x;W53HK)?OyU>-s;2eQFe}r+OzRXwd z^awuR*KckqDSKq354j>6$)0#VpGbL|KfeXNDNqcpe~tWm(9I z48OlS!Z<+SZ4Pi8hpInU`diMP-Bh}{e8X`44EY2?I&$QQl9idgtNCP8ZbHJODG3Ra zI1oYA)ZXk85hO`8%u5Iefe7Oufae|HSPna@JVIMr>#L=k%ZHWu5d#25V`t9T{ng3i zxf3Q#m@;|tR1P4hs*3RDlvM?)rbHO;ZCI9tr(&Dn^9`@&?+HLS#HrKGxerX7I3;n? zWKIV`Rh0py5;7ht8xt4I{AkUO3LpeA>yg~OO(z=WCQMAYe{$j!PLf6FIt?&R1Vme- zVTp>u&UbbM+S}VUZYe4I(`fbwMsS_(uac4yKg+O3o12gKIi{dt0!2((hGC$pDlT5U z!0D=fc(i*1qdWlsD0UZBI-MCSm*%gqO0o!1k}$A*jA19sh>pGwk32HVRM+6m&v2zT z9sQ#2?Eej**j-dPV@CFKix(}iN|FeFpy#&6!{>w`2(ZQ2kTY|ZsiC26;bAcZ=n1JY249Q+PstDJY$hWBlC!?aR(mEVZxO`5Lv4LjrNAxZ-5 zJdX@#hPm;}hJ4qIp_kK80GM^|!iuz1=d(+fEVqi1(3kn%Nkwqj;{Y)5c*=y1tCx$m zyj@-i05vr=+Pt|>?rv#2Gh3FWNz;>(O`35M;Y}ZGY#W^EPSdetjSGhgF(^Rc+JfIb zIQ2pIbI+`_$cls>e|Lm&BEZ2rz%VR!R(XVrmo9H8Eh#Gvk5N-oqopLL?fvH3m3g|R zJuq!r5~r#vRLy8?3QlfWlEB;Scnwf|hc+#z)L zbd%W>1%_daN!xdyXBZBZJ3PX<3m4uf-Mnq%?c!8bRRub4`5&+OtfubJzdjaiF+9xX zC}T49lRo`Gm+Y%yGY8y*!w|K~JEzw(g2EJM+WZBZrq|WMo+5W8)b~mY|c4 zSUxUT^A%gg%U3V1-THQU>D^*AG&Csl<~_NqwY_C_SJ%zNl;kv%rm0Xh6(-IMKE{rZ zKdF|yb+wI}!v4(T@d%>@U;&uDUwAuz@RJ`NIDP7?{M6KRYn&q+W>I0QdA-WKFe z09@EIg;wjC)^3}_e)ycP^_NXeO=xRx+xpJVcdNoS2sa+SVaNz;#Nuw_9< z&p+1u)$s`}Ev;ww?b*NF=ktmEyinNcpOiZSkYS1m`&kE|x3#o&j2}1d6Ms+l=kNaI zz4rj9#?p*e-S}Sb7Z3eFsk5_Fx%SPs`(oo_JN|v>v)9_&+dBa$#?o%H257Jk^&yB* z_SmrBhm3{bLZ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_select_town_16_16.png b/navit/xpm/gui_select_town_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..687d713e6e26943eef9d5de72d019c976aff668e GIT binary patch literal 559 zcmV+~0?_@5P)E-_xcltryhh#E?{}q6Pl}mrg%& z!~1;TeO`cnPT6c`K9NWS4*DxALNJ%h%#94Mt-TSPj^lm(R)D|1SRQv!?rD?rhyGvQVAhrLm{P7F+ol0 z+P01MzK!*IZL1+SWYeOk87l7Vw#LqnK_it)g|01J&j(rdgzx*%@An}P7#{J3-vG&E za$@OLY%>~-%zC~DuH&lf>+cu0rR|OB>2p^B`bR??ca~w8E0-?LmPAoR0DwaS0Hw5R z7@C5>fMwcyl}dRr9>4P`etUWK!^d~amT4=#=l4uQYZ5|mSRa$&a5!3iy}EJ#!M!B_ xU;%*nHS8nu@b1%RnYRFN1^_1i`icKXKLMj}_ou1bAMpSH002ovPDHLkV1iQy1cm?r literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_select_town_32_32.png b/navit/xpm/gui_select_town_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..04716ad51c1c00ca129605e63ae4c8513e3fca6c GIT binary patch literal 1469 zcmV;u1w#6XP)op(M7#EVX@br7h zYL&X&YO(LDuCBH&ny#?$-5uY3|E&cP>8s{zrrg})5%a~AloX}6cia^akv_Xr-=CeG z9kQt61qFFKfBL!2f`}wZA|WE(Y`HP|EQsRL!hPL6-F8GIr_(`ScBO%c|;$j4`hgd$bg7I zW-{obW0wnd`_b_5l`W}hsR%` z?*Bu1c_&skHeNO&A~{`766`$jf{pBUff!?SwXwn2)pd`TWtq&@DKc9oY05G|c88r@ zZWonTmUa7T{WCi-qq}$S@!{cXnjKEzNYu9I6|yV?B2F8VAx0mwV&%$EwcWu35&{u` z+FuPSr3&gU)N~n#Mw6n%E~kuj zpi-*n!iCy;y*s^)6dURs!kS=mS(KmtO4_T}5)+bwc)<$HdnGxJ14IM@0z?L)BtcwkT;Q0=ba?%`H7)J!o%2G> z3s78qDkU{_Z*y|;u3(;@E)D>o_EUpKvkbIqEr^l`hzt-JNU{Vm`nbU1;gN&uBGz9w z7!3TP0g8)HrM{Gwb~7n4Iml+Sc&{3PMxy~vp`^1l)jfTE52g6n9YK;T1ELHJ5hPiJ z*qHd>v5C>Fh_&mQp9SF)ps46%`rf@SHz({&46^aw;y|EPYk>%;zP`>dGCY+S~0C{=Y(TPdPw|A%P3AXVTV8j3j zz~4^|N{*xYi}m-%$IL0!)zvP8!N6~f)ZH?UjvbEC#|BLgtLZtxP=@Gj(Sd*TKRFPg zTYs^utLtCmc{9kP6IyvzMeh;4gk~uu&lSY zSIOJVtxmTyZNrAh;QIRWzg@lZWky?Dn>ed;=zXgIK;7BdBPsn=KiF)Rw2+V&0-Bl{ zJI>dA`nJhr;=DczZw&bYm|5chKru9AbPK%YYtyJPsO9F3R{LtF7h=X{b~{5)K4KJJn=1}|#4Kq^&sTo} Xzmpv>>>i!700000NkvXXu0mjfQ7FWx literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_select_town_48_48.png b/navit/xpm/gui_select_town_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..0d201576a87858051d7194813500f8282166a6da GIT binary patch literal 2339 zcmV+;3EcLHP)4!ZFyP$G2?T7Fm-dSKd&-?#9@AL4y3yf(@V;a+#{?{rlex6^oYSq+x6|b=H zrR0%5%MSN})vH&>f{i_Dv2v#i3kznCbmNfLtuK6&HJOeVyVqs0;EkA(H^HGc!Z+(XNK>NDS=k)hE* zgv=8W>AFrtME^LjU;IuWLgueuzoropDT+*@B$BS{q-h#$*!Tzka3G4^MV@^h{9O#j zQmC`*CdslyL`2mGK9cS!gkiodWL{Qe5+#8|Q6NDSdLiD}`1+6_BF)QmtLrA+>byxe zJ8zIAi9|&7QT6^ILk!x)IxGb#DQQ#3jT_JEx(;2_Km-sGhzO!2fMr>{T>Q#?yu{U&uVf81byFe7W` z7vJ8zo*N$*mzbD1nPV70(=-5Nd=V5?L6kWPkIngMRDEOJ5@&jX9%;VFlan*+ zw~H6$TNFisU+4h{2u1)v1fF+*VHi|YmWiF6o$I%jdOjRAfY&ncEQWOQUB1J$D5o|F$hzJ`uy%D&6{ zRP=)E?3vFmoS$crWf=jXC&D;Du-jt6vJ5;GWrFXV@0FpN2ZnG0A$h%CZC1{sdrzJ^ z@x;W53HK)?OyU>-s;2eQFe}r+OzRXwd z^awuR*KckqDSKq354j>6$)0#VpGbL|KfeXNDNqcpe~tWm(9I z48OlS!Z<+SZ4Pi8hpInU`diMP-Bh}{e8X`44EY2?I&$QQl9idgtNCP8ZbHJODG3Ra zI1oYA)ZXk85hO`8%u5Iefe7Oufae|HSPna@JVIMr>#L=k%ZHWu5d#25V`t9T{ng3i zxf3Q#m@;|tR1P4hs*3RDlvM?)rbHO;ZCI9tr(&Dn^9`@&?+HLS#HrKGxerX7I3;n? zWKIV`Rh0py5;7ht8xt4I{AkUO3LpeA>yg~OO(z=WCQMAYe{$j!PLf6FIt?&R1Vme- zVTp>u&UbbM+S}VUZYe4I(`fbwMsS_(uac4yKg+O3o12gKIi{dt0!2((hGC$pDlT5U z!0D=fc(i*1qdWlsD0UZBI-MCSm*%gqO0o!1k}$A*jA19sh>pGwk32HVRM+6m&v2zT z9sQ#2?Eej**j-dPV@CFKix(}iN|FeFpy#&6!{>w`2(ZQ2kTY|ZsiC26;bAcZ=n1JY249Q+PstDJY$hWBlC!?aR(mEVZxO`5Lv4LjrNAxZ-5 zJdX@#hPm;}hJ4qIp_kK80GM^|!iuz1=d(+fEVqi1(3kn%Nkwqj;{Y)5c*=y1tCx$m zyj@-i05vr=+Pt|>?rv#2Gh3FWNz;>(O`35M;Y}ZGY#W^EPSdetjSGhgF(^Rc+JfIb zIQ2pIbI+`_$cls>e|Lm&BEZ2rz%VR!R(XVrmo9H8Eh#Gvk5N-oqopLL?fvH3m3g|R zJuq!r5~r#vRLy8?3QlfWlEB;Scnwf|hc+#z)L zbd%W>1%_daN!xdyXBZBZJ3PX<3m4uf-Mnq%?c!8bRRub4`5&+OtfubJzdjaiF+9xX zC}T49lRo`Gm+Y%yGY8y*!w|K~JEzw(g2EJM+WZBZrq|WMo+5W8)b~mY|c4 zSUxUT^A%gg%U3V1-THQU>D^*AG&Csl<~_NqwY_C_SJ%zNl;kv%rm0Xh6(-IMKE{rZ zKdF|yb+wI}!v4(T@d%>@U;&uDUwAuz@RJ`NIDP7?{M6KRYn&q+W>I0QdA-WKFe z09@EIg;wjC)^3}_e)ycP^_NXeO=xRx+xpJVcdNoS2sa+SVaNz;#Nuw_9< z&p+1u)$s`}Ev;ww?b*NF=ktmEyinNcpOiZSkYS1m`&kE|x3#o&j2}1d6Ms+l=kNaI zz4rj9#?p*e-S}Sb7Z3eFsk5_Fx%SPs`(oo_JN|v>v)9_&+dBa$#?o%H257Jk^&yB* z_SmrBhm3{bLZU2pjg1fOg@G!X=kJdf7U!RSbFw>smb`7ng){mm-tWu2+-8y@ vedGDr*|JPmk6L6NTcW_m#%8vthJ&Gdvd5~mxbP0l+XkKJQ!+G literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_select_town_96_96.png b/navit/xpm/gui_select_town_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..6035c5f86c38ffa65a6acc8017894bbc137f0732 GIT binary patch literal 5227 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + Desktop Preferences + + + preferences + desktop + user + settings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_settings_16_16.png b/navit/xpm/gui_settings_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..8feb19b357f87c337f5e97aabca43dfa721eb72e GIT binary patch literal 606 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_settings_96_96.png b/navit/xpm/gui_settings_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..2dc36d2ba48db1bc5dcf7865066ab5ec1152d337 GIT binary patch literal 4473 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Lapo Calamandrei + + + + Audio Volume High + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_sound_16_16.png b/navit/xpm/gui_sound_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..c916adddc5d0e32f0f22963d38de35873a56bb96 GIT binary patch literal 721 zcmV;?0xtcDP)8xlK~uue|x|8&UdSsNtY0vnpAWMk|~vheH}VvX-If6 zG02F#Nf3AuL=W~Ig?X|_DGpoick5KxK@UMa$A|y# zIsJkENoMIiQ$|tCrnQb(@A#c`eKpY2(D(LbLEmuSR#s2;r=_N)QWV7j07^Saju%q$ zPF<_Dw^j_&6eDC7H=2G2c#^wnVD(pGA-Qo2zj;hB8V>}50XZBB%GPtO=G^4M{mJ&q zy97<|FDk01c%FYqnV3odAZlu=^J#`Tl#{&!9LMJ;lF5t|UO+e$5yY>v2W=0k0yM*U zb51tyAz6CFYt-+Lar#k;qB8-2kR-X#HSJ_QZVyCJWE_rfFPs>3Wio#jSu9&Y>x?)x&Nd)~kwDOC;t1fCNA%K>NJDd5?E?_Q@yb^dpnmY|%6=J-8Ga9~c?5}fd4#2gwC$_!5flWcC#@3NVDOu#{Z0;-bEn>a#AYr00000NkvXXu0mjf De}_r4 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_sound_32_32.png b/navit/xpm/gui_sound_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0e816f510177b9dddd40ad6fe62f85dc9a11a4ed GIT binary patch literal 1763 zcmV<91|0c`P)98D8>&ECnwC6Vsy1e88PD-|h3gf_~LT56i45=p8istS!75vU?zQ3N)<;sKjz%;p7Wja-I+VUUHgBw_3f{3T)Xwf&9}qQ zJ4xKvclxXS{r%zFf;u~?zb>)?vT|rm`-=~KY6Q+CdLQx!eLbAmZ~YenToLlQ%4KzL zf+)XR)&9%oPlbR)uqzUYL_uhLsrAj9J7sisQUJK}$M4;MM7tx^v4l+g$BOYgCeVGZ zJ0=L}kYpdY>n@3zs;haq0ko*;XP56p=Q zY%f*gbc#xn)428dh6My#);7L*|HgY8s$#^)YDJx`?#0+OTIwxUlQ>>0RY73j!TL>N{HNAM0mu@N{Y`^1Z`PBU}8cIq*6&- zzy3Z_sU%cY#oXL1RCNleWC}wc4q@>9%b1)>LDMua#^7>KQK!?T*Xr7#-G<`#4RMGs z06?&|DJLoNBq3N+#7KlNN{I^~R*cC2;Bk(b%p7Ji8TfP!0FarTMJ}fym6||4pGRd? z6prIU%W04$KTOj^a&oF%P6&Vy5K%5LhbTQ0%0)qnQcMN_?zxkhnOV%tWFScd0Fcvk zIF1Wl*8sucaSxuyk9I=3c2-b<4~rPr zBLU8Z49c?$C*Y91nx1b}r>7fep#eQ_K$aD5+YZ%q4W1C-9!EBtLv>XR6uma;m0YKRDO77%Wae`AN34~PTId(t@`J)AApsTBEEH`iLRi{;`>Mc*F z)3`Y@IvI^b9YyhhnGCwFBd6(L%!F&ZcA){%`op7*j%DrQjx&Cvd;doOz=`;*ZJ3pg zUpoG=Bs}hUo^rEye@Q#JD9_xS#*?X(R}-s}JnliA&UiP+Cw@UFzT4EavUNp$JmNSu zEQ`Tl45npL02KgS!_03tbnQV2^cw*1z!Pt;bS$%t3w|@%^^6Gs_dR)}-gDgb5MsRi z+{ge30A+l5;+){_pGQW5CicY}~d4=F{1)xt9I)(gEdSy_ui?vhetU#RMb(lBy1ysyh5* z07{w500MvQ>+4zB-29$8oqj!5UG*8pOxVmK1q{*y2d4ly0O*51I=W5IWp@kC509RC zZV~`m_Z*G7hS+GEX4Q>g^NDf-<+mXz^YR!4K*vW$rY@elxN~$gX)%+5SvD5ieUBZ8 z&F8XvY{R@bd~)CO#W=UcR}4+x#)bDPx*lC{i%|f);9kMqf;#|g01SWuz|geWX#(;W z?s3?zBg*!00Q}n9`!c3(yfobX%${O_`+xA(=N;48X0d$5NcYd)SWH?jY<2*Mf|nC= z3M7kD5w7DNo>0{-uH{S>2)bo1Mo#ZPTTK4I_y5%533r>GooxfWHk5y)$_SuP&@P*R zR2)4P{j^-Z`0hI%7h7`~^&f@l6sNGj?%jE~!IgN2p3dwd+<9`i``NL@7+|5^ORW{V zFHN9qN}uSa+&yKDbb`wz1FFz5mv%nJYj002ovPDHLk FV1jJ>S^)q6 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_sound_48_48.png b/navit/xpm/gui_sound_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..c8c119e0d2b87f6bd4514425a3a8df9b8c2845a3 GIT binary patch literal 2962 zcmV;D3vKj?P)6^$b*D}AyF0R(uG0^ z30qZlXbVK_wn|6~)mCE5qf~3H1feWqwVP_UWP#E&DOKHWACQs&si`QbAjzhI4W%K8 z<2s2Gd+eF{d1ijE``AC`k>8B%0J}k5X>+6_|9tN~_nyx^_uR(-=jFVdm-BM2q;vIS z|1xLQ#(xGheNY?rQ9ATtGtU@rkCh z*_<-~1>-Iu1j6A6gb?rBe$L8=Kh}Bk#%CAz^qRr)H=exx9b)XiLXmjC8HtUCLf%>P z;hX^M=-)90rXO!Idm@%qDD@l78Iz{|hhvBqTlz$Nn*UKkFCseRUL#A0=5pVfX=ySE-+oA@g=lPOLO2vL3U=Wh0O;{~yx-st_LAy6L-EJ|$X~PU30%Lm4%116kjZ6ZtZ5xIWLNd`%(fYb1Y}-cI3_X6u#f5JJFpJqW)VVBhBTzOUKta4g;ziN;de)ZZ=F{qE^C;~;)C z5{~cHjOs7Cd1H6AgE|Gmm>CXd0rtsh0eX6R>OTL)TesMbgGeNThGauU6ZHw$j)U$i zmW78-48blGa6#KFghM8X7>Ec&1W}5BKgBt)|LNNXHB)<|$>guJ);DymeB|OvrPM>3 z=@Vu+k~2WJ1nq>@X;PG7Au~;!eSBJgcwOYl&N&^o&h46qrp9Jm&^8OnWCN1P2GrLl zVA~Fk4GzGz3y8(*AfTU)p<7WSm96s7AKx=)wl!gR#KP&*r;*8|D~(Lkgkw9f zvKCC!gy%XKOO3(^g%FKJ5RFE`STP4Yw-|x?x_EqWaOg1rKMxM5v`!m5bV6%XovxZ` zn;9&v6_Ua7zP>f`s`Wqc7~^?picJfkwMHhLg>AdY<#NbmGL=S=NCdX+U?P`;R1&#d z4)J&#v3LwZ#37{wV+_7ujDQdVQVNWu#ye^UBpLF^APZX6S5+t`7?h_;o3%DlG0llQ z4Hcdi0069s9Bf-+V!}cudj=rt#bDbGBBlXA2WJynDM%^7IWHx#2VV#rKQWB)bmmy? zfPe}~DUzBfTjeCcwMLjgZmk7piiD6;)>QzA$j)Z0sH-?E%R)ALrhmVb1JQ61fHa^r zpp=4E5=tr%WAKH5>$(uWz`KWz=7rSXs2z|D)g&Bm77-0sJECKr5RC*>f%WwKm=7q| z)Jnw&m~=v(iGWsp>5O$Ng`(k1He0oXeBXy{J4m$8gf(Fmn`;1CLCKNW$}cIJOPw;u4ZlL6)K*{4-0a)_DMky8a@?u*h?qR>l2o z<#Mi~ZHnnu*YjJn);|r}M1)(f!RnOo+W^`(EkIviUk~@pl>@Hl!m%A3 zc>AEUWbwjC!M2ghSs>2?prMp1p1@L8lDO2jDk-|xZMjGT-TATf&BXN1!RNmR;y{6etQ3JzS@-vCo+#vVD{|S)aJb8J32b9D>&{G!>31^WpvF zewTfDOQ&SC)XC+qS5o9VZ0CEGbp-$(+DYjP-GaS{K+gfBQ6okv3Kc!D_s#nNJQ##3 z)o~P;1RES2%nuF@-nDGSij`T*`iCWp7Q|xFFe~1L-0~8tdRHEM>7k#LfEWPXz3zw2 zTB&8q7gy)A=>>qgsr;A$idS%{(4nC^9Xmgpw5WP^1_7v~Wr*7U%g*ys`!W!F^Yzzv z&6+*?pk?K@%q)HM_1qc>>KcaCj;@U?2! z>gN(vXCarnhKTkKY=3BQDu8kh)V_46=9_BDDsU%+@ zVr^2XPi4kOd!!VH4ajrQmD@zso91>H%;| z>YqA({D|YYPy0eZDOG+CsA>Av`?jrrCo^*DTItCh1JSNq(c7znPWd(#X|RQM+WJe< zw0&U5H{Y5LpnSQhToNRA*CwV4x|*periD^02F_n zsCK@4-H+xfMVI@+y}FRKx}}h}9ew5gs=HCGl($M<8cYYE$}=9E^>UIU@V62rA^fLb z+r4KkK|fQ14$ge}drIkE_oKN?i7SQludzl`w`h|0{%OZICmme1GF_svDYQ13g8)Gg zg~_=yt>ZxHz;bA{5dI2lEcIC_<#Wfj-}m+RbN*}qwJ^2$aW;S;$Oo27*Z%wMc6$5? zp|E9e`#1h>szdAlv|P0M(W|>wZoKQy?ZnT#)8&KxlN){Czp|egs-yq@UhUUOjSug>y}jL^ z>tu&)az*)bVRhrjv)1#}UzG@J`+M}2cM1bTn^m-#%wZjnj~P5&{an^LB{Ts5r?ra0 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_sound_96_96.png b/navit/xpm/gui_sound_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..bf71264b7be762eb5a5b55d4ce081ef1c992aa8a GIT binary patch literal 7795 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 QkpKVy07*qoM6N<$f&}gOTL1t6 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_sound_off.svg b/navit/xpm/gui_sound_off.svg new file mode 100644 index 0000000..d85e1f8 --- /dev/null +++ b/navit/xpm/gui_sound_off.svg @@ -0,0 +1,771 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Lapo Calamandrei + + + + Audio Volume High + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_sound_off_16_16.png b/navit/xpm/gui_sound_off_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..e6d3873f0f1644166b2e77ac63e5d1b7e61e8e94 GIT binary patch literal 443 zcmV;s0Yv_ZP)_AbNo=M$iNF z7`;Js@m!vgDAGfgLMcm$Wt*D0wyUQ9b@jh?shhDKYv8*KA3tUW__I1s#`i8R;vuU) z+b}bgN^uU}wM&7p6~GPvv9s7BV-D6C);xxt%R8KG)a~|;m5q|{D}aj?_H7*26s5i# z2#otZq8L<^_gX_!b;}Bo$aaY1`PJE(IS7I)WDW+w5tj!It?4N|6;~`15Tb{rT-IUs zC<=uFUwJJ-RqIe{s!*-GEm;EE?bfLzm*-gr=@3v8L~FDXRsc4em8z3d z{)Mit&p#IBD^V1CHXGyZw29U?X*7A6NB|i82mrvD;L38j^dJ|D(YtK!Xw>JMrj$;o zb?rKnPTv5a0L-Bk05H;RIs@PyfD-_JD9bw=Tbn03=`sMmZ}(8JIXCZ|cNB%ni-M;zsnT5sY zq!g5U9Q}S@@W4K|diA68#p1$~89l9Ab`OXmm}U!Rr|pdc;BW*MvouO6<(vZ%plO=o zIQAP0_n$cz27#`qDzfPuKnOVJ@VP&Z{09Kb%gYN}+uyx8l`mj+W){WMMd*44_e`Ij zZ?p`WPG^yt&_O6g6h+{i!}Gkc>;Vb@XCIh<_pwJGnJY}4LMEMqo=QU@3T{^_gc5o% zZ$f|w2!(*dT`4Ewh7`X(C}U0D#$Uqt|2D-><^9ZA|8K2!ar-$Dk@n zxUP#zt$wWP4*{eIYi6sBR?CE<5CA}rSqOphV-yREq z2*^cd*^e8I#vCOP0Kl>xsH!G?KcLKF5K#mvB)Z)m3i)YhN$uv=#>QL61)u=1va<3= zukTzm8U_sGz|Ce8znAxFxoj@bv;?@zVObV>%mU{wLO=B50?4re0FX|H$;$q|a2y9# z-$Jcc7eDQmFYVm={)@itTKRk)lu~#ehr>Bs&!qq+030r`xY0sjYjjGsY3oi&RzK2Bk?G0r^A<2|o;?p%^*jk)*~! z0S?-DcPoP!@^Hps5MHht#xtQ8)MLPK$Vb`(h!gs_(*Y$;Jn*5u-u&t_A){w|rf~}g w-5GS@Ncy{fcrgFFcln@8BUgK(6a6psCw)WW`XO-06aWAK07*qoM6N<$f=DORxc~qF literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_sound_off_48_48.png b/navit/xpm/gui_sound_off_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..8b85681aead40019e53b8aaed8f2a7929fe7660b GIT binary patch literal 1618 zcmV-Y2CeytP)voj4(;X$T1_LPZFHC>Els zT8W3IJXD}o?L(r%Lta3tDuH+e#0#iuC7@6t^}!UVkV*szMyfz61R)Edw)}B(vJ=Pl z*|)b|duDfjGsDB~p4Uf0kg|4O?kjzD>%Gy>^O@i8H#>VkPd)Y2Q%{#6R%WobCr&&A zV}5Hf>rZ1py61SAu`ed8%wR_AV?);rRh3o`l^OS&R2sm<#2ecH*q-YFfL&JHOQ|#f z4d*Bk!SkvhqO!tXQcf8`PE4E_HNYcM5K21K;&Lj}7nKg<7o-!#jt|n%^b$wGw*k)IXnL3`dPA ze8)h{SkK-)_T%FKaPs8It+109>$UpW-o2x~qy&pg3;2BM3*2zrOC9v?e= z_(q!~feQ{HI969zouC~&1mO7iYkwQ#$?_|s*N*lL4Q+RVumurw*tUa}C<0>)(aOq| z16bwUW?+~)v$l%9?}Kw;zwpv?4?^R~g9i>(E3S+A#W{Gchb?{mNRk+m2uTuO*2&D+ShDQJx#7PXsED#amI04Bk0C42Ukv_X( z{gDfSYPE{Nfi-|i#RV4vx88D>H+^;*p6g=w?mh4-E)tSpjDax*$}%7~F$0}lsNPro z^WHrp_wBoO6jxuh72nyu69WT-7#JADmM#6@T;NRO|KNNTwR#_vB50(CsT@E`LXspP zB0TokAMV{$fZ^T4KfmM7+uiAz84yWu&LI;CnMjb7;6h;b{JE@DBorxVrJ#+5)~SgI zaS}sH!a^%}`PhTUHXNc;LZAKbb9cw~t1&wtVs35@LD1?9a$OgK3xw?uuInO+1s0nN za4Hq}wJLnyhh?Qbki=;Qw)EBOjmGp70AAk|0Amb-RvVnhh@uEV5OfArt5t9=upC8D zS|N%e)a!NB>NOD6p_GDUS&%Z#01-hc!hCaSWFsfP4gdhc3f>CQcxUFmrYmOReC{rU5XZU7h!tx_AHvyBoFNSR-La{Ax@*fap6?cW(ovqXsdgCMwI2KxI4kR%dj1{b$0Gm_-1F0)-M`dYT-O6}5<_r-$xl8NhYlX7u5ykj3c->D zfPvOJeF7`hY2qxl&b(pjK29?(1e(o71VPa8($W&R5D41AqaS`e89TO(9ou)H;yAFZ zG=x$reUQZoWO|fvGgpwlVwU;?!i4~A0FDr`T3DEeZ9A}S2U=@1n@tE2tJhz7^`-OY zW`A}1w2Y_`CvMd9Yf}PBz{)hmqm5`k~7UH>&CjavrV@z>}Qi|v= z0Ni&^oqB&{WMphr#81!8&EInKO*i_!Uqcv%oo%!Lppcz5vg=%>l~ukf9Z#PA;1K}7 zFG6MC*+@&mYBU-vjYi|>4{y8eC+#qN{LuB^uho3dO3y-ZUP2dpuQUah0+6pz4$=L0 zK6yJEp95JRy!YOzox65@8ivtduiHB^L_}5`cQRmgO;#7;>M{XO%{Mh|X${@IO2ySGUguVs6992$d46W*OCjRtB@wjN`TKyr zNbJ(erwE`gU1RER9&o@tP8linTr7VXR&`aq-47FZFYn1$zKYf2+~teJ@wR6PaCSQ0I-&cJXsPl QkpKVy07*qoM6N<$f&}gOTL1t6 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_sound_off_8_8.png b/navit/xpm/gui_sound_off_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..e476580471c9faddf1a8fb0564d82a24df1201e7 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^to-U3d z5>t~C6vRwSOblf0Yj=pp&Plz$@9nvINr|SEr%$HrulaMXf8m3ZpQoQSy0pp7e&4@@ z{Z)TIS@W>6f0wmWRMA>;=HS6&XOA5E#S+W-d9(lgbNBZb7XR;_zTV%^$S^B@S3#jF tGxOnmp2-pt5;yi9W;X5oCd$LWa9mA`-Sq3cqd-?Mc)I$ztaD0e0szMlOoRXc literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_sound_off_96_96.png b/navit/xpm/gui_sound_off_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..596cca31e356c284e975e1b1485f0b3a22835063 GIT binary patch literal 3899 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 F{2!J2c9{SG literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_stop.png b/navit/xpm/gui_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a9e62e221dae8cf3631f978a2087f6a4e4e143 GIT binary patch literal 2701 zcmV;83Uc*{P)bAKuV8(^x^xK$|T$GY0}3CDGXJ9^s9NNW_kCF1o{N>NB< z$t2PY9U3Vf*c;EL;v*#~ScBxjd9eGxN??(b0Pk@6IciHG)+7NSZS52wqBJ$YX_otGEQt9JKow^*!k|Bf|BZ{d9d+wA+Q-N zM`Kka7X98?=g*Etv?6NfJCI8wG#9X@xe^7{wvK=VS!pE@ilQAqleDAr=F3~txnz3d zQOVDK0>#gaz~c~U75uelQump&zkG67?ArnH{RqtkT>&oyE}0t1e(*}Uz-x(!o{6Zw z>1=)No$TQQ@z-_5Wpg0g44dAp!)CB7!E=36$A4+|*)ziOy|>_K+yz`F5CAU-5c6sy zb*ZX_WGabDj4!wr@ja zGv2o{hQMtNm|BCr{{g(e<4?d+2xYVR&o zIvMl;-{jN)^EB=QUrX9ArtV`Z3Hv_e)H6?t2u-Y51LHn60Y_u`)DtG!VOc;P9vrRP znB@~KGUY+e!2^UTF=<+#ZNq(|b#F*u9h@jM{pu;xCs?IDJH6kPzmo#{#ye>F`w{G4 zK2Xk~jnidipf}zy2`^bg$J>(dZA+>jRdABhhdY=$z0bzb=dOim$4o%L&6B3|8YD(g z*=#-d^1D6%7l^h_%z3wBEnba6bJJuwRZ4%_EQ3?JNqE^NtnXY8LSSEYgO`c?vK63m zSwv!lzRA6Y0XH8LftSEQa6{k3Zqpgu?`gFnwW47ZE4^{K4J!knYl)Nw575`wZ7IQzHaAH7bp$?wb0V>*u!KTp(wJ z8DU&UYe>Bqiry=w_GMCkr47+>{)e=G>Tu2v0= z!nHyy7BO|f1+{pM+8-3mup>5VBwyH<9sMPw#RsI3QJMpFV((P5e5NYuS6P=x}fX&@DywRjt)QCk-RS#s)K#y4pt#|M6M6sfxh$ZdMO zPH6V=`$+$8Q6Rkr03m(*8OuhSFr`kW zcHHquVW6DSs7e_#CTbUp(JY`KUn)7E>7D?;ugcmfjeFp2iOY0`GFYBlE zf%PcO2#jlFiCRJk4X02-K&~kPO>iWiE1(RsUNgRfh(FIu2^cnQE1$tW|1wWjdgW3w zPgb*2=<Abu!k27kXloLO$h)mj3m=}5sn4`*ZRD>x3TG3y@k+)Rq%<2moljUXziWV%~-7!&}f-+T~+g|S8#a20Mb!)1iV_39J=L)BsW$`v|e+45O|FnX>A?E zhlcaOlY+VpYvWsq@4{QTZ2p$s-X2q>Qz+@wcTx&16vCJ|nZ%k^#D8@=Nabw>YOA*> zN=53qXVF{R(YtyWUiB!MS6`_gBLT}sc8p`!M}wujQrG+mQnfHfJ@svXwLM)ObNX7N zc4_~_dtraPOw73 zK>HYg8+{M_R^#`=4k6k)*tvf&1>7(nj*Ow`(aSUN?<=J|AyX{Q=bzG-~Ze&2F7@c#?MGoX6`tnG?KW=`$xj;i4y zR5BU7i9W_lAb${htpcqj1|6O3K72TRIFs4-TbRGy-TNeg!f5iwa-lHL2DBf6=-=Sg zQ;Wr^g>+_OYiFlnMO#q0Jj#(C5WgGwYa>_kPJ4!l-rY+f6yp8C!Thd#{^dL1-UCp= z^$>x(`zn200uf)0=D~g*wzf!_j3tt@9HD8ku5L|OHaHHlSgOXu82;~V(CiR;M<=v* zus@k}cE{uS=cRmN89ZHdHC_Uoa$5rOjX;iN_%ILyT5HT{5`2JKO&ghE8M0Yf* zTe^? zX&e5p;Fw|nXz{htN_z@Sz6vg#0q0nzskev2dd#wP+p;iq9j$!bD5a!WDv>W1NfZjs z(QMYq7mLpO@QXM~#7Fy?-^zz@t>%DqOB13&Iz|$*00;lVD~H z`V5F^t^$xyC_*9$`}e}zTj5_Xz`Krn!ph-lHw$FSHC?U^{r-~>s4X_`0o%p}X#r-r z8o0q%2|#eeSyBzgV!0N|HHYit4gLJ{AaE?D5rHqt|6KVGpJMF3j>$_>00000NkvXX Hu0mjfaG)Ld literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_stop.svg b/navit/xpm/gui_stop.svg new file mode 100644 index 0000000..51aa9c6 --- /dev/null +++ b/navit/xpm/gui_stop.svg @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Stop Process + December 2006 + + + Jakub Steiner + + + + + Andreas Nilsson + + + + + + stop + halt + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_stop_16_16.png b/navit/xpm/gui_stop_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..9481236c09ba668939521e000c4d087530fe01f5 GIT binary patch literal 686 zcmV;f0#W^mP)iHJt_0>u&sA}NLtL|6y~ zAvCX9!wQ`A2ZUq@MMe)tAw?8fP>2~0qL45MZyK79d(S=UdF zGL~XdS-I?j_i|=x_QF}Pw*c-#*@1&q!!?myz3JsKOwe^u3VaVd7rcnY4>$E8JDF`i z4NCx85l~%|zEj0gy>RkqS|~Onpc|lRAT$t8o(#(k<$KEeiaHHo$mD26T%1%+0f2b_ zYed}%0v}`mT4NijCm%t9D%eyc^!6c>LmL3gvd$-5C!u60aC)y0=^aEKZh_;S#IE1P zzSe`3pd`dsosyE0l5PM4AR3Qme0u?5gimE+94>ca^}hfi$X#q@bz+<#fIx!ptPqQr zWmqbN02PEc2gR-`Fw3h@3J83HL>ayZz7K&9L7$OLJe6sL4{)%KH(OZEsXlY1C92mF;L! z&d4kEHHG?|K#itLmj|J4lMkL-$wwLCozeU?G#!KpQ>pcoVf|8%GK2ZB&9=KX`Cu+@ zU-~JcW4?%nrg6btUyJFBD6?90bj`MViaNcxc?#(_Yir;38j<~$5vwqj(4{MpQXusx zi;=iHF8Oq|P`J?ti$HG6EC5NMwgZ})4Wlg?iIfB6T=(}|-yePk?||?8H4EF0Kh-7- U2R=Oz>i_@%07*qoM6N<$f?SC#c>n+a literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_stop_32_32.png b/navit/xpm/gui_stop_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..5af353e09ee0de802a465712947be758f94de1c6 GIT binary patch literal 1637 zcmV-r2AcVaP)znE2S!157A&8F zyZ<$S3vgebm+$){;Un=(Djo{^J^p^LAD~usYUNU`o}0hB?v%rM+4%bX zM|K1_3yENKAfk$e?LoR3Y7MGbpmh3Z17hp|ea}v#;~C8GIR4*EBZoiL5T81VE)=#? z({8FzAP@=1&O@xJ>uKwZ_V@Yxy0(EZAT$^OS^(O8sL+52pZO!!;fDyEy#ihzGM%M< z;|(@WA44_8b(<4StJd)M2m1t!0{M;z7#Q|>tf01?hS$wWbSny4Lp@)hICT{D{te{F z-iG+QGZd$eq4I@RMRctRVhm`%U6U*B(NvpB}*}X*0Pa}s$aAyCG^Uj-CWBZ7npGFL3 zI)znBTx&3vmzq=GG%()-pkcmNv$u@p+tCB9KxX!kczzlyJBEGzb#f;r$(@+Qe(M^Z z@dG3-PQzfPA>1vl!B{@3HG9i~g&u&%Ay+PJ=W7!@R+eF4wN z820Q8%cqXx6pGu$$jKL2KJ``X_h#`<93c6t-*&(^DyE=2}SY z$!r-s$-j~32-2c~w70DyuY&#mMZ zNTfQ>`FpYUlr4d!b}J z$y~9#Sg+L{{Wh$2>+SeT_B&X4$hIAjpO403L0ze0v;j@eA+=rQbZ6x>NMth2T)DFP zLAm_1@4<_Jb1wi9ApH{LY};N;*42a2c*1W*f`K2t`nlsJWTX=Pp#M zKYtRgx>_38`ZxeT5C8)2LFKi2{d&AyPUGT{0O>*a`j7(=oKTqC z)oS@#K7Zq>e3$OuH jU7<~&w3F!nTYLK#7Za-4Cjgx}00000NkvXXu0mjfZ{Ql@ literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_stop_48_48.png b/navit/xpm/gui_stop_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a9e62e221dae8cf3631f978a2087f6a4e4e143 GIT binary patch literal 2701 zcmV;83Uc*{P)bAKuV8(^x^xK$|T$GY0}3CDGXJ9^s9NNW_kCF1o{N>NB< z$t2PY9U3Vf*c;EL;v*#~ScBxjd9eGxN??(b0Pk@6IciHG)+7NSZS52wqBJ$YX_otGEQt9JKow^*!k|Bf|BZ{d9d+wA+Q-N zM`Kka7X98?=g*Etv?6NfJCI8wG#9X@xe^7{wvK=VS!pE@ilQAqleDAr=F3~txnz3d zQOVDK0>#gaz~c~U75uelQump&zkG67?ArnH{RqtkT>&oyE}0t1e(*}Uz-x(!o{6Zw z>1=)No$TQQ@z-_5Wpg0g44dAp!)CB7!E=36$A4+|*)ziOy|>_K+yz`F5CAU-5c6sy zb*ZX_WGabDj4!wr@ja zGv2o{hQMtNm|BCr{{g(e<4?d+2xYVR&o zIvMl;-{jN)^EB=QUrX9ArtV`Z3Hv_e)H6?t2u-Y51LHn60Y_u`)DtG!VOc;P9vrRP znB@~KGUY+e!2^UTF=<+#ZNq(|b#F*u9h@jM{pu;xCs?IDJH6kPzmo#{#ye>F`w{G4 zK2Xk~jnidipf}zy2`^bg$J>(dZA+>jRdABhhdY=$z0bzb=dOim$4o%L&6B3|8YD(g z*=#-d^1D6%7l^h_%z3wBEnba6bJJuwRZ4%_EQ3?JNqE^NtnXY8LSSEYgO`c?vK63m zSwv!lzRA6Y0XH8LftSEQa6{k3Zqpgu?`gFnwW47ZE4^{K4J!knYl)Nw575`wZ7IQzHaAH7bp$?wb0V>*u!KTp(wJ z8DU&UYe>Bqiry=w_GMCkr47+>{)e=G>Tu2v0= z!nHyy7BO|f1+{pM+8-3mup>5VBwyH<9sMPw#RsI3QJMpFV((P5e5NYuS6P=x}fX&@DywRjt)QCk-RS#s)K#y4pt#|M6M6sfxh$ZdMO zPH6V=`$+$8Q6Rkr03m(*8OuhSFr`kW zcHHquVW6DSs7e_#CTbUp(JY`KUn)7E>7D?;ugcmfjeFp2iOY0`GFYBlE zf%PcO2#jlFiCRJk4X02-K&~kPO>iWiE1(RsUNgRfh(FIu2^cnQE1$tW|1wWjdgW3w zPgb*2=<Abu!k27kXloLO$h)mj3m=}5sn4`*ZRD>x3TG3y@k+)Rq%<2moljUXziWV%~-7!&}f-+T~+g|S8#a20Mb!)1iV_39J=L)BsW$`v|e+45O|FnX>A?E zhlcaOlY+VpYvWsq@4{QTZ2p$s-X2q>Qz+@wcTx&16vCJ|nZ%k^#D8@=Nabw>YOA*> zN=53qXVF{R(YtyWUiB!MS6`_gBLT}sc8p`!M}wujQrG+mQnfHfJ@svXwLM)ObNX7N zc4_~_dtraPOw73 zK>HYg8+{M_R^#`=4k6k)*tvf&1>7(nj*Ow`(aSUN?<=J|AyX{Q=bzG-~Ze&2F7@c#?MGoX6`tnG?KW=`$xj;i4y zR5BU7i9W_lAb${htpcqj1|6O3K72TRIFs4-TbRGy-TNeg!f5iwa-lHL2DBf6=-=Sg zQ;Wr^g>+_OYiFlnMO#q0Jj#(C5WgGwYa>_kPJ4!l-rY+f6yp8C!Thd#{^dL1-UCp= z^$>x(`zn200uf)0=D~g*wzf!_j3tt@9HD8ku5L|OHaHHlSgOXu82;~V(CiR;M<=v* zus@k}cE{uS=cRmN89ZHdHC_Uoa$5rOjX;iN_%ILyT5HT{5`2JKO&ghE8M0Yf* zTe^? zX&e5p;Fw|nXz{htN_z@Sz6vg#0q0nzskev2dd#wP+p;iq9j$!bD5a!WDv>W1NfZjs z(QMYq7mLpO@QXM~#7Fy?-^zz@t>%DqOB13&Iz|$*00;lVD~H z`V5F^t^$xyC_*9$`}e}zTj5_Xz`Krn!ph-lHw$FSHC?U^{r-~>s4X_`0o%p}X#r-r z8o0q%2|#eeSyBzgV!0N|HHYit4gLJ{AaE?D5rHqt|6KVGpJMF3j>$_>00000NkvXX Hu0mjfaG)Ld literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_stop_8_8.png b/navit/xpm/gui_stop_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..0841d67cf203223afc47178f0a5c59315e2b5e4c GIT binary patch literal 316 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_0.png b/navit/xpm/gui_strength_0.png new file mode 100644 index 0000000000000000000000000000000000000000..f33c42cea38918c97bb37570b5f28fb9f307de1d GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE)4%caKYZ?lYt`FJzX3_ zD(1Ys=E!%*fX5|}z3{*Ga&0r$sYzR3`ak)#|X%r@Fy z$N4)JuYX@+O#4}TIQ==dW<8^r1N(wV2HA!*#uA2GpR5&jzuB~h!Ro+@i>cE?|1s$_ z@HuQ|uwppN^nzi__3{I6Ql~#<4Uo6VzL`38KLhsy<_jOZUzP*Z2IUSQ0qw@&yD(i^jP!|P3_wGj4}{nVfEckBJHKR<~pc&>WGu++>Z<=n)& RJfIgDJYD@<);T3K0RWU0bPxal literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_0.svg b/navit/xpm/gui_strength_0.svg new file mode 100644 index 0000000..09e8fee --- /dev/null +++ b/navit/xpm/gui_strength_0.svg @@ -0,0 +1,100 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/navit/xpm/gui_strength_0_16_16.png b/navit/xpm/gui_strength_0_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b53da8fe64cc4bbb3de8acb93d239da1f0928f3e GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_Io-U3d z7QII&Y!qxz5McQ(Bb0q<-xij&p25{dhgoEq1mu|Yeahpp tZ*x23adXW9?FMEO(TM%FzpR=kM<5MX&=d%XOb-`g*9Gb+`0--tLOp=9qq?LnQf$pM4Nw%vCaIyz1?1eCEh zC|C9-m%LXlOV>%+^uw2buKks`DdwyR*>((TxmyLi<}NYbyybI>;q4bI3*L6Vzc%ye zzm~jdGk!6YH5?Ub@MXLa#%Yko^KH{JyMR=lIAe$WwEiDQ`tO#DU1gZfw82*|X}#f% z({uEm7_n8){LQH=*Syyxo|)^wGKL&^#;m@BaYer!g6o@$8CUfjjQbYKta~f9!TVO- qwi^GaBhPF67##LrtakZ#i`(?+lTQYj!TLadGI+ZBxvX=XwhO literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_0_8_8.png b/navit/xpm/gui_strength_0_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..5b83c0d23121b3c917c4e9f1b119ca92ef47fdf1 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^}o-U3d z5>s2xTXQuBh`3%{y2s7HHR`sH!UWA5R=qs8I4v5s9P&&)uRzcG;~`n&c>!9Miw-Z(%hHbfcw@cx{^SiZbrVx=Fm2EJGk^apEvYpTnq?D! PHZgd*`njxgN@xNAxZ*xR literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_0_96_96.png b/navit/xpm/gui_strength_0_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..c2daa902d3b0d36c38fd41cb9ac06612143724f9 GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlHoWj$RS zLn`LHy>YRti9y8mqRg}Z^*8UaB?>IcdwXT;J?_ln)^l$`CL9RW`N}MFb=SJro9D+) zd-}fo|IA96d8!U?w%0Wn-`E%Q?akgzF%CWrGZ+jRlbDXMbZ`m?E2x15HlEIP3^x8G zA`TQO+Zlf0nl_XJkw#Jf#vuB__OmB~K}Ow3jB|{>Z=md7$cUl_ZppoUtaD4<<~?Ep zT4-nGK0g!6Mz$QP^KG7E+LQAIAcOeNUQB!P9mC8U&h}bX V$!6O2&624guBWS?%Q~loCIEedgp&XO literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_1.png b/navit/xpm/gui_strength_1.png new file mode 100644 index 0000000000000000000000000000000000000000..3ef21ad0e463a1f8e0763511da39649542940faa GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE)4%caKYZ?lYt`FJzX3_ zD(1YsWyr^5$m0^o{`T*B8Le4MJGXM)KlJ~qwgj&pn@fv|=c}v>jAgTn&rN-POhQ@d zQK^|pL zxU$GNhOft#Pm2xv&Aoxais3BN3kDPJ1m~`c)bklL8w1X9kR|CDs;OXk;vd$@?2>^k{ajgIV literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_1.svg b/navit/xpm/gui_strength_1.svg new file mode 100644 index 0000000..3646ebe --- /dev/null +++ b/navit/xpm/gui_strength_1.svg @@ -0,0 +1,100 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/navit/xpm/gui_strength_1_16_16.png b/navit/xpm/gui_strength_1_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..37da9ab7a0c3be4d6971e55020957ec8adfb5f4a GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^Vo-U3d z7QII=Y!p0XAmDPbyoWiXnN5R%YcUJQ$`+=AS57B18XF`havW>qwG-ZOv3JSc-%x`W{x;vCjI@h*aZTtI~=b)|9w;N}9C9WLT|8iQY`g8At*lQ_G8#fuT zG^eIA1!XNLILa)3$B0qCsmXL&WYdaw!KU-4ZdzF`yG{7n{Vy!e4^->IjkdA_-NoSP L>gTe~DWM4f*N0S! literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_1_32_32.png b/navit/xpm/gui_strength_1_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..f5a5a0e50296f6f75d86bfe3f52b7c6f5bf8b017 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v}~6PZ!6K zh}O5$y!jdwcwC|n|6LywE|rwaB6GXd*gE2Z_^%%w2KD`EqDIEWM?){avTjJ;vs92p z(ZN~YLR(tqLDUDn757Q;uXE1oW`njxgN@xNAL=ZyH literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_1_48_48.png b/navit/xpm/gui_strength_1_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..10eb58fd1af1566e26ad81cc1517f371f66f60ef GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v~0Io-U3d z8I5nR8wxc!@UUJu^6}iQ&bjwGr&-@TdMqhcag+Ch-JkCB@EZ8oZBXnG5WL9pxl~EX zy`Z=F%X-~XXOSSCy_bW3^GAz|_A*|W#n15CDeYP5q`1(}=Zv{-y7`~m*j}^kT;PlF z7prDo;$Fb4bBrN_r(v5{gJp8T6x038vwIF^vq^+}o%im?r>|=dnKl6Bk9J#R@$>~< zZgo2LKx6Cr3y%yfygp|)FkX;gc&ppcIb(C_0;$;lUss2xALMLK5O8^@|421~Z)59&*bS`fGY>}vO}Ki)ZQY>?&j;=z-@iO~du~I_nYTVF zm5VK7JdFMptSnDDAk1C0g4^;@Uw&nX=$=Pg*RMXLer9=m3*Xul-AD5E_ZT*ENG)He Sbuq&&*+IY|Q1;XR{daEi=CvGr`Q(>Hx_oBQ$~cinn}B*5K8R%3HmsIP?peG) z_WIZF_5WuU%k&8;d|Sm|zsM_4*I1%wsU9DEvPFc>m|1#I)gO|pA! zx;cST)ptanAqP z0NS;2{kp~Px46wa%7V=aoC3G+vi7E0?sNO*`^w&!5$ZCStx%`#`xSR#O?lnBFEYXc e!ay%Kq*pTkNj92Mv_L5w6a=2GelF{r5}E+hhJlX& literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_2.png b/navit/xpm/gui_strength_2.png new file mode 100644 index 0000000000000000000000000000000000000000..500085afce2b0511b30d649b53e8277c6d3a67b9 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE)4%caKYZ?lYt@^JzX3_ zD(1YsX~@T9$m0?yUHD&nc2`=G4=}x8FyUUnd_kvy&%wHmy<~dqba4mvh^@Qc>^c_Tz(-XRx)1Ue;-vAi>CK?6?@3hN1Loat5*GCjQ}c7V=Q5q1=C-v zb8xr*?sXr<6Ocs{^_}mEFNnS0zn{VLQi}c&Q>_f|+?S3(&oOwq`njxgN@xNA&~IxD literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_2.svg b/navit/xpm/gui_strength_2.svg new file mode 100644 index 0000000..196f046 --- /dev/null +++ b/navit/xpm/gui_strength_2.svg @@ -0,0 +1,100 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/navit/xpm/gui_strength_2_16_16.png b/navit/xpm/gui_strength_2_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..e7a19556e9314cd8e4d3ac2d5c6504f63afd495c GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_$JY5_^ zEP9V#ILOPGD8lmKy*T@-2^kKIbMBNZVd;|!Xy|6TR{DDZx8TX*4L1(2+v=Ui-yS*wB5tQVU_-18yF4!yk#r7Y&v|cQ<$$$J{PEb_Rwa^7Z`N~sHuezOC^g-u! zGP~e5iG=G4ak>qbZaW^_Q28)hNO?|y>$R{44;2i`&fnu&S+GH~?|a0a3ZJgMGMA

w!Nsv4A(sM`Tu$>8bg=d#Wzp$Pz##Y1+5=m pZ*aX}t_Z(O7{Q& literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_2_48_48.png b/navit/xpm/gui_strength_2_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..2aed59dbedc37555c64252f2df5b0e63a05c5fbb GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v~0Io-U3d z8I5nR`wBG~@UT8O^6=a);qt2Gc{?ZX-cfi_Qy@C0QtZC@VKyrtIeWzp0l|x0pL>;* zn0FkLdARrJyAG$Wqv2J#|1;k&%1UO~@{akyt_d?M=c=s8x>YHrc>Bdo%WqREU&pl6 zwdBpxuw}G5a9x6-m+`_ZmJ^cA*_l6OZ=~|%NhSncb>H*&@bz-xeasm=4Pk$TX72+2Ie;B)4tTR`u+h73~77VBQ#ujw{@X;M|lHLI?K d_hNiCW9g#J8_nH{-T}SG;OXk;vd$@?2>`EwcDDck literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_2_8_8.png b/navit/xpm/gui_strength_2_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..fa184d1c87fd6ebef3969268748bf73e789968c8 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^Ro-U3d z5>s2xZRBlA5NLbI{%Lwpf`59ZV*wvq0%Q8dVy0;u3b@4=Bng~}^iWb1(%bpO_ul&= zdF#o!ogEp4KcqW4UiUahb#i<0tWf;#DZ8HQ@+Xb>4|Cl&*G*TtQ*cjf_Jzkk?q2RN d=dyXoocclh2J?iJWk7owJYD@<);T3K0RXGaLjnK* literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_2_96_96.png b/navit/xpm/gui_strength_2_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..311c957507320e9a99abd3902d21c805650cb0be GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlHoB|Kdm zLn`LHy<^RH$Uwm1AWPwY?b&=wJ(=64pZD=k`M5u1X}={JLEl zd;kCM;D@H;;vtF$U59t3O12hHX*Xl~fLo8aeTH=iKfm{Yp LS3j3^P6gV#ZbP0l+XkK DNGNa# literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_3.svg b/navit/xpm/gui_strength_3.svg new file mode 100644 index 0000000..7a6b452 --- /dev/null +++ b/navit/xpm/gui_strength_3.svg @@ -0,0 +1,100 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/navit/xpm/gui_strength_3_16_16.png b/navit/xpm/gui_strength_3_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ddabf6c751c4a4f578f8269b73fb0160a49a9a79 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^LJzX3_ zEP9V#*vrWjD8TaIeP?5s;*AE@jFdF@X$uzeMl^J?R=gBVO5;>IG|T4Ugv-AJ3l=5b zoH53xn)x+ll|V-_c)I$ztaD0e0stUYSnB`) literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_3_32_32.png b/navit/xpm/gui_strength_3_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..04a4fe230a431e10dc90e11e30ff65e1c449fc24 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v}}3PZ!6K zh}O5$4ssn(;Bmga@&Es)Z?+gNbDeTaW?K2@Bso)$vq$cKT&2K}ap>;pPtuLQYouV7owOQ!n==3S8fCG3%~lewYvl-d8ym(&#)cOBT!5}De)z~6zXq;Yx6?$ct9 m^BY*U<+xlFGr85r(#oy;N>yjmZ_@&x{S2P2elF{r5}E*!5KW!{ literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_3_48_48.png b/navit/xpm/gui_strength_3_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..7e1396b63ed2a0772cada228361f88a0fb253b5a GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}}Ko-U3d z8I5mm9^`8>5Ma3w``G@q@1CE5dw==gJJ!t}l<1tAs&me}s*%lVO3t(dH6=x z;V)iIy~e$PdCfA09IgZ3rZO}rN;p5;yM-CZ0}7qJt07PqApSiyHf5Ust(Q~GEWE$3 zpTM+1li~J0rktB>={K+QeeqztA(F7v`|sn`rG9sN=QYp1TVK+5BEFibqkT#N|F7lu Qfc|0dboFyt=akR{04|Mkq5uE@ literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_3_8_8.png b/navit/xpm/gui_strength_3_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..5ce4e147563e7cf10245215135dfd0aba78dea6f GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`Xo-U3d z5>s2x8*&{A5OBSi{A1}wWH=L76t_m_a#>R znR$1b$ED=`QXWO~KStKIGV01%I0v7U*4uH--S?<)-|2Ey!$(_gDqVbN@SeN1=0lsl Y?F;czg+;HP0j*^4boFyt=akR{01~7^lK=n! literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_3_96_96.png b/navit/xpm/gui_strength_3_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..a40e8b977e092956f70558a3cc91535580f8a975 GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlHog*;sx zLn`LHy<^DNps30HSJ z#ywiOzMT`vJ#aZ;g|eCPr{*VKvsaS)DI+W(4D@9~btR*KsN$UP`%m71eC_G#=d#Wz Gp$PyWLUi!} literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_4.png b/navit/xpm/gui_strength_4.png new file mode 100644 index 0000000000000000000000000000000000000000..5849753723aafb0ac7605dbc1e93cbd6310496e1 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE)4%caKYZ?lYt_qJY5_^ zD(1YsZ76iefQL1(^W@+4I$E*BsyNzWfUvATFnTC#2u-;b@UR!uygn&#%R z=i0M3?-wwK{j52h{#^XhKUNC{S%+c-{KE|rhr6dF<)RbVPC+Uaew-Q`SE3& wZ|!FQ@nA;2{ja^T+wH&kg@3FbldP(lV?T=Im`^;=4fGX*r>mdKI;Vst0Ewh=e*gdg literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_4.svg b/navit/xpm/gui_strength_4.svg new file mode 100644 index 0000000..482d4f2 --- /dev/null +++ b/navit/xpm/gui_strength_4.svg @@ -0,0 +1,100 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/navit/xpm/gui_strength_4_16_16.png b/navit/xpm/gui_strength_4_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..065e302e5946c144ae0dd8d09561bd21166a7cc3 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`Lo-U3d z7QII=@8xs~wc}4KYM;E z{E1$=R8z@H#z59o&u&`KHG^~Ow;p7 zlUbP4p0e+m9eTCj$7e>U@`_nsXEyv@T-ole6z6ip>p%bfmwf$?lronqJIn$)i^0>? K&t;ucLK6UiX;aVu literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_4_32_32.png b/navit/xpm/gui_strength_4_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..95f41931183c805b772431839d046048d9325bb0 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v}}@PZ!6K zh}O5$4fz@jc$kHc{NJCWc0_=OskP$3_R>thi@dolKdmiIIT%iTIJ5DmYl6LgG8+r` znz!akUO5wO%6_uxD2P|cKRkRx;uCL#gIk) Z%=WrS=*d2qX#=#F!PC{xWt~$(697_7Ju?6R literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_4_48_48.png b/navit/xpm/gui_strength_4_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..c444860cc4e27c4066733277ebd416aa069eba41 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}}!o-U3d z8I5mm8uB$8@U$k1e?3>yJkfb$(ek{+mjaF(yi%VE{;Kb2RXCwMF_qJp;XvaP>9c3% zJ+iDz{x@f*r{ToQpY&@>_O7;FnZXi}ZP&1lOLhCCGv986&QnU2d^>mJ_P5^YfuEy0 z7_wLblpO+#`VBvYu4#~Byuz`dY@al5R`cRNm;Bnd91NUw-wCLq;nrEEkeuelcXC*z xTo_E5LJV^1`<^!6&inGzCS&Id+XL~@jNf|;8XRU`r~ta2!PC{xWt~$(69B+QXA=Mb literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_4_8_8.png b/navit/xpm/gui_strength_4_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..4b493bf9e6af5e80d1218dc1e0472b21543f0b89 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`no-U3d z5>s2x8FDo{h_pOBpW@B^k;zjrY*G}zpvP?KrKdTI1pOyiFWI>5rtpbn8zWREH8vjq z!;}AGaT5QMDeE-)_pjU-bTsZir*y$#$>|#V6jMI*G3MU0O!+Rn{Oxvy$_2Njr9U|B ht%}>c>!MG@zPy*h2OA3v7Xz(k@O1TaS?83{1OOo%MyUV* literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_4_96_96.png b/navit/xpm/gui_strength_4_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..6c6144bd3f8dfd7710a23fc46afb7b26fab79d05 GIT binary patch literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlHoIXzt* zLn`LHy}O&M*+IY|(EQ2&`pV0#CT7Q;{IXasE~dZvXu}R2pjL)EM_2F{gcYCL`SqsZ zvEO^`zghA{a|%>nW8cwqUOV;dt*NO@NlZsrIyeP{71SJj8fGvUGJ*x}=8Kz5Kb!p| z_09f$=8RB53{@b3vU#On4qiJ^ZHQOZx8J2-T(1*SwQXPDHn)G=!sxDnSp3E&{*?R; j^Zz2oK&ybB+c90-kXK}0v|9I4kY7Dr{an^LB{Ts5u3~U7 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_5.png b/navit/xpm/gui_strength_5.png new file mode 100644 index 0000000000000000000000000000000000000000..ba32ade31b20bc09216c0c5975f51a62f4d73f59 GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE)4%caKYZ?lYt@|JzX3_ zD(1YsX2^HQK!nwiz3{(wdy^4sgh1N~>(Z{Xle_KRCaFYTUB!ylbEI7XZ~=W3Y0_W{_QA z+Q4_gZa>TaH=AZ}{llFB6_Ija&j1 + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/navit/xpm/gui_strength_5_16_16.png b/navit/xpm/gui_strength_5_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd2c6e7360cb672da5679de534214533af7d9ab GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^-o-U3d z7QII=Y~*b=5OKXYxuZ#Uf{_er{=`}X~@-oENu z)QobD1%NjWN>lJc}@;*o|m oLXLsg@|l*cwRu$fp++yBD@*o>?j9*epbHp0UHx3vIVCg!0BzDr)c^nh literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_5_32_32.png b/navit/xpm/gui_strength_5_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..87c24e7ec03aa884f705f048ec7ce10878bd7c09 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v}}9PZ!6K zh}O509Qhao1ddGm@qfDIt{EJT{L9ieo?RmNto+huZ_`%~s!p9}VG%pPdg`ORYtAdn zeGRMyjej}BlY<{{M=*%baIerXV+9M!J$!mYj$r~m)} literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_5_48_48.png b/navit/xpm/gui_strength_5_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..fe27b28babe3860b33865a69c9329826935fa0a6 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v~0Go-U3d z8I5nR845WVh`3%ne#3a_rA1r5Em>@y(quocpx;RHj%SxXBSW9g$>r0R-1^hKUGRZh zL-a?+-nXZ_+m5_i;gx(YyM{4ncEs$Zdm0|C7hud|*&(<=JDI2N5a$k%+S@-fO)_}; zic;tBNj5JQsc+>dP(JWBnUTNmV4z(Y6RXmJUWV;&O>U`v^V7e}{O1-|!hU=GIrF~d Q0iDO->FVdQ&MBb@0Pf^hYXATM literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_strength_5_8_8.png b/navit/xpm/gui_strength_5_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..58c2f28fb4dd50c5b9f5bfc8c227ea6d1c5448a8 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^Jo-U3d z5>s2xZ{%!s5OKMtE4fqY`4<)Gyk(Wyj6h`t;?aK_PT#s-_v7~4zxU;p z`yU!GCNUjh>EIL)R#0>BX_&!ah!FU;M!sOzLdnW5ZtU_94I5vdxoB^u>|e-;q!rVw zzm~uJ)1PSSVOoQv*6#epv?swkP@RD!4|FKd7YFw4Vel;EnrGxYj~B>g@O1TaS?83{ F1OP<)WwQVP literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_tools.png b/navit/xpm/gui_tools.png new file mode 100644 index 0000000000000000000000000000000000000000..70bfab396c3528766ad784b67740fef15898a848 GIT binary patch literal 3369 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + System Preferences + + + Andreas Nilsson + + + + + category + system + preferences + settings + control center + + + + + Jakub Steiner + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_tools_16_16.png b/navit/xpm/gui_tools_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..46a722c777ff6e30cdb2b35fa561bc701ecf678d GIT binary patch literal 733 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 HDWM4fmZprC literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_tools_96_96.png b/navit/xpm/gui_tools_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..63e622cf301071e8cb5b5f8a1c7537a4b53862d1 GIT binary patch literal 7979 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_town.png b/navit/xpm/gui_town.png new file mode 100644 index 0000000000000000000000000000000000000000..359811b33b67322424b98334aa9c2aa269f2f83f GIT binary patch literal 1481 zcmV;)1vdJLP)j)u5(KeDEk#;rq4e?W1%f=? zds=$?P5PqueDCjfzUO?;xxaI-LI!Yr@`KGh9qH302|Ax$IeR9PJbEx^ap>JJa;i1j>I(ERYht2r^kKV zmX{k}V;|qblk;Pr4<5{gnB~2cd5o~ZgkMyJFMBB6vE;eo4UN&m77*ySA&vJ zzXrZvd@W-ORc|bna=Lqmq@1-PV*z!W%B7sU4@Zc{;|$!t$-wq`A%xc`JkBkKX>};u#az+CxQ?ts7>(SX6hWqbu>(5{DdD34i zh6vcz;-Vnms>=~T|0|Pbdm^e1@0xd^SacS@ca#aQn+dO*aA*ogu?4qZ ze@q5^Cbq3lplYa1CKEil_b+YxkEPU)lm*0NQ6^rw35>rW;Co3ZFpdyn31?eX9JgP) zt^)`~6g&ZyO~pw~j^FFS`+ShfP4&`#r6k}{_jSC_2T3OM%b7~MpsYYJ9@00{fX}2W z0AT3he<=x&uK^)=H8LRW{5+Z}<-E~Jm9TdG2f$2d5+U?OLJ9(AXF`aiJkUIy?FUa{D=3l%S`Afp{p}QBd|F#TJZgZ2 za`Wu8e|Um|b@H?Ca#ToW0AMDGagD60*rm>%NaD-zY!404Q&Mx-oSKhFNGa6jh~p?_t)v z8l_wTBqS~}>nJePLW`j&DqD9QU_!gC9%p&-l$8Ky_mq zw)`R{#ykWk#s~(+iN})+zt$I^0A=|rXP~rd6HV_O!eW)b5H>^rK!vl83TNHI|L&g0 zMDE_yy{FJ7uq-NvRMkX%%O0E!+f&YKn1JQD)$5jWs*B%_er~><<~>I!EU8E^>N|ePg?9JRf z21mwt_+(Vd+uOF;kbH&;NF6v=5cV3ehHEeRt|$udr^`X(hc9ZLydhq#J*s zZ_6MrR#HUuk@FpjqFg{h=X;ZQ8qd#d_H>>O8mjXN~t00000NkvXXu0mjf!t=VY literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_town.svg b/navit/xpm/gui_town.svg new file mode 100644 index 0000000..2d1f383 --- /dev/null +++ b/navit/xpm/gui_town.svg @@ -0,0 +1,81 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_town_16_16.png b/navit/xpm/gui_town_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..fb0a96cc8af8cc878eeaecf1e251461e5edeb539 GIT binary patch literal 548 zcmV+<0^9wGP)6;0ca36iw66%A+?5?ly=1eEGV zS6%i8xO3yS{st*R#kE~YMT(1Rg9RZdWspFyB^tG8EwQy`GBejjGIu6qs%Lf2*K^); zxC#N5D$FeaGXO$xX>;k`%b+>{1>lwOeFjC$y1|8~#pLp;F#>S&O77#W%eh)tr%)c| z$K#JR08}T5P%gN+$;=STs|EmXOJ#k?DeH;!7zurhP`HP7&vO7ZNY-R_m}n#nKy_=E zjoLQl(rb#(o?tZ_9km?*+qT<4lpn<7C{H@ekixLe0iLmG^5M08OqW9993c*x#+oW`I}(5`7K;O&h8^sym6MZw(KySMR!o z-tPgw)V*yj)9eNe98WTmIo$y`(I@2l$DR)mqyQjuHjjSlob)3h4`6y?Xqtb50RZWV z^Ahr_p?I+NxfMl0RYL~@T*%bbJD9PIjKzBeJ<&s)xpCD+yp1KlBTIi(^-1%84UT5s3o_BtSyq58y*cfPf2viXugTS_Bm$RBe#jw1~EL-4Yz)I3JE3dw1>O zfTCj0*x5Dt9e+FXzR%3OGy4i$s{ipfo)++Kr7z%g?3>y5+{USt&-KWX+{O@rN?Ss> z-sB3vkBh0-F=T^o;H4|Kd*1orTgC714LA!*dj8ygPe zGfkXgvCL1V)`#+W`*c&ImRpsO1)vH*4f#xyNN<4Hom81$upEAxzd~m*K}Rq|c<3np zrhRV1dZ+DgXfS#Y|1HUPj#j~?K5+CWMTfb9ifYhzb{ zz&=TPlbR`O2{HxsHrNFZ09HP?D*!;>efsN_%%}jKb|5yfC9k@p!7@2yM zNOY{`uu7T6|Ez&ZMJJAHU$QL=?UgeP)%1J>l^PnK=D^5gnYXf~|1otmmjjr-27X&*mAEpTRXZqIz2;6yVB2k2LK3k_YvssV*2nI$bIdEhWA*ye*XMi1j_1%Kfpu)dx+sS86U~Okj)u5(KeDEk#;rq4e?W1%f=? zds=$?P5PqueDCjfzUO?;xxaI-LI!Yr@`KGh9qH302|Ax$IeR9PJbEx^ap>JJa;i1j>I(ERYht2r^kKV zmX{k}V;|qblk;Pr4<5{gnB~2cd5o~ZgkMyJFMBB6vE;eo4UN&m77*ySA&vJ zzXrZvd@W-ORc|bna=Lqmq@1-PV*z!W%B7sU4@Zc{;|$!t$-wq`A%xc`JkBkKX>};u#az+CxQ?ts7>(SX6hWqbu>(5{DdD34i zh6vcz;-Vnms>=~T|0|Pbdm^e1@0xd^SacS@ca#aQn+dO*aA*ogu?4qZ ze@q5^Cbq3lplYa1CKEil_b+YxkEPU)lm*0NQ6^rw35>rW;Co3ZFpdyn31?eX9JgP) zt^)`~6g&ZyO~pw~j^FFS`+ShfP4&`#r6k}{_jSC_2T3OM%b7~MpsYYJ9@00{fX}2W z0AT3he<=x&uK^)=H8LRW{5+Z}<-E~Jm9TdG2f$2d5+U?OLJ9(AXF`aiJkUIy?FUa{D=3l%S`Afp{p}QBd|F#TJZgZ2 za`Wu8e|Um|b@H?Ca#ToW0AMDGagD60*rm>%NaD-zY!404Q&Mx-oSKhFNGa6jh~p?_t)v z8l_wTBqS~}>nJePLW`j&DqD9QU_!gC9%p&-l$8Ky_mq zw)`R{#ykWk#s~(+iN})+zt$I^0A=|rXP~rd6HV_O!eW)b5H>^rK!vl83TNHI|L&g0 zMDE_yy{FJ7uq-NvRMkX%%O0E!+f&YKn1JQD)$5jWs*B%_er~><<~>I!EU8E^>N|ePg?9JRf z21mwt_+(Vd+uOF;kbH&;NF6v=5cV3ehHEeRt|$udr^`X(hc9ZLydhq#J*s zZ_6MrR#HUuk@FpjqFg{h=X;ZQ8qd#d_H>>O8mjXN~t00000NkvXXu0mjf!t=VY literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_town_8_8.png b/navit/xpm/gui_town_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..f7e90a7f05a5a1457b790503441f8c8e67e31fea GIT binary patch literal 315 zcmV-B0mS}^P)An$VL_wxvdtq*py`wWuE0xXMZ=J&QJW)n?65zF2C-9FM?o054FCK3$Xxv`` zAORY|HO<-`<8Ft~AHnm7p#2_p!|22e+IDd51c0}1NhglFL0P>Ny(Lut2ms22oI41B z!9Q&~+=dQXzpz|dA)8esX^N3g-Et^fLjcvwhjra!v@J_*0pt_6^#`(uP)%XM4S)au N002ovPDHLkV1i=Sf!_cC literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_town_96_96.png b/navit/xpm/gui_town_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..112d2b957bc853ec2b2e78cde66b23c3542ac216 GIT binary patch literal 2795 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_vehicle.png b/navit/xpm/gui_vehicle.png new file mode 100644 index 0000000000000000000000000000000000000000..d01f0049234f2c01c32a72a6947eb0eac76b9c7a GIT binary patch literal 1529 zcmVX#P1$U=378Os&k_tr zB9XLdngb$|snl6T1xO?k^DN6+2iyistTdT283OhI-6C?(uM^(|h{xmiX|3M_qJDh@ zgsGHzC>D$D^keL+03vb~@Ey?T$G!>-MIw>wHf`GUQ@MtQ&wvTeoredQn9XJrehka* z0m)>t*)+|cDeU@#fEb3cPbu}M*7^dk{UeQ_~00zcU?X~4}iri~rXIWQQ*Tr7rcrJiaY6ZCw z*e-K+!N3raH1Hr`FYq_OV~(cpIzHEDGMN=#<9I57)>>(;S3AT5Q>RW1eDJd)B6}Mf z8)q4Yu?ScI%oCBL_BJgoEuR6uIZRi39Sl7+5|PEgK8JXRh&XB zftmTSq$sW{LDMvsGj@+3_~56M8U&v6W2?1pBG(JH*~Alo<>VJmMdKDzh{z0JHSi=b z%}-+I0LPV5uSBEK*NaWp;}#$uk3X%o-om-H#x@zaAA7OoRFJy;2W92>el{-)RQVSHJ=hnIa-n48ynq$5z?KeEWwp z-?oTMB=-$FIR?yeEdCEM=Z|AENkoRg!%9#o z_564bpJy#l@!5POD5W+yA08loXRyxA-b(>KFQ&_{vc7loQAI4R^%o`d2Z6s!Iq-Wb zY^RnphL_kS+qf1$Ykf;GT{4-R4qW3QiE5#gQn!}SFT!z#;lxV;Hi*b2~B>mjH(k zAHK=5tZl%JMcSX41-#x1Tng+0MnoiIS=QOU2zBFn%d&d=`};=+yaum^YE4*xS|?Cz>~s1E@R~zE1Gvk@#{uBSAd@PCs~La4 zZ)Z1Sug*qB|0%gs%AXMy-3|jNrPjn^u~%J^s0t#o2G~)mjoTGj#jk+Y+N{)vUzAc6 z$F8^lK_uaqAc`NvAUNXQq-sj4`#ZX5ufFVSRs{uzqm zItDa1H?IX=0PK!_2Of{bVw=4rT1`Ymlu}PonBNI<7rbkO4mKly5`0dQOeUx2f7cKa f5)u*;65`H3^u^PXGnW4*00000NkvXXu0mjfbiUJ@ literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_vehicle.svg b/navit/xpm/gui_vehicle.svg new file mode 100644 index 0000000..5fb4b1a --- /dev/null +++ b/navit/xpm/gui_vehicle.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + image/svg+xml + + + + image/svg+xml + + + + + + + + diff --git a/navit/xpm/gui_vehicle_16_16.png b/navit/xpm/gui_vehicle_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ab14d16f1d76870f4db104ee760942af948c142d GIT binary patch literal 450 zcmV;z0X_bSP)0w%jE>X8xD25-8G|6~dbH~>EQQ53BJ??hzN%r1fEG^U7rHZudZJkM)- zA`)g64s*F&8%USv>2H^nUevy*nUy=KQ14WK`hwGsGbl{tz&;Ghi3^nAO_A z?F8}*;C&YFn%S8EG#ZV$IF7FXf*^QRsZ`FNV%O{Smr0UzvvginuY7FXs=^zGH7fcWoAu2ie5pRnp{TEi|AQ2CO zUi7dKA;Um?(~g9}ljvm^QFoCX!s1Ed2cjb4F^ZmK1G^{^0-|fyWins&dPq&2>9o#F z8}*V0ny!AU-sgF`y6UZlReWcdRs$v{C%u`OnRVrId2J`esZ{E}{{H?qnM|e@+rZe^ z*b!AN0P8yuZ@_Edq=;PU*no)a1f~Hmrg$CIL?W?gbaeDtRA=%tiNj8O+Vi|jGMRkS zO37O5S1Oeg#+ah2-T*EFyR5atz~QKz$Qc+PAOE3LD!l@_fuBX>S}Sn?5y=BN_juSC zGpDLIfnqwH-k8m1--dG%QADLu>5vnD4P0+W+@ZVPFvg?@1_tf`vp{#bTpo%_h%^8k zb@vGoDR*GtG*B?cjH>GIZU;;NsOr(Egk_%~2!g%V+J^vc@jPy&8U(=(Ywe%Fwoumt zV@zIEZ@cHcBJ!wlz_LYXt*twK+K#x(IRLzHR~Ws(Q(z~HGuvcfX$C~37dQhP0=n7} zj)4mBM^{%@E|<&AEg2{j3TunS;xy3zm4w6i3)mwf?-KwE3kyRH;$`4B;4IK`@3(>f zf%CvQ;Ju4&1rCB+1FE{QA>mlPbc)CX(AGNm3^F1z<@lz6TQ0r{qPOAQdP78>uviOX zqo=3mUcKGd*LM%Fjr~yu_BR;V4gB~e2IlAI_to38v$Olcno(!LuOjjj@D4cgCE^Z~ zB65kvH($mVWgx}JO1KhO1DyC&=ch{XH^ZudB!K66mut1!ePhf9RlV9cz!-B}RiDQp zH^yvN)eE86kgCpkp7%F|PQ!dYzqwki{uAOEboHQP1VJ!pt(^{qw}{A+MmwLN8b=(! zT3cx~rnx92lmCV}eBXZ=*FZX*enoTTQ{VTSe#@E+jEs!D1IBw*YQ#sB~S07*qoM6N<$g1}UM Ae*gdg literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_vehicle_48_48.png b/navit/xpm/gui_vehicle_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..e3e53fe2c486a7a3d30bbb621a5ee68a43808939 GIT binary patch literal 1202 zcmV;j1Wo&iP) zK`@(|RsASYOf*jB3^S8SH&FwEWMQS2k9<^yBi$8|Ap z(wCQcGw)4iXqEZFzBuA%5K9jw$?+0>$=N{ zMB>u$@bF)8+s1MrlgS*^S{Hz>xC2FGMkzIvPNzSO+90w6B60}$2xzHASqyBY)ZwU3 z7*UKSCMK>0UZ?Tm0a~=yQ{I@>jiVSXEG+Z^H~EStOw*il9LK6fA%Ie<3)lmEuasJG zUH4Jos8@aS;^N{Xz^Q8eM4izA-}4y}c{Y~X0GUkY8Ljop6qoR_QtF_HJSif#0|x-K z)&oRvpz0FJX0x{e`%CXisi~TkduXkN%lmJu>$=Z*eZS^2J0Kz*)%vRHfa5s+*P>#fvR#ZByO zq!PaYU&WVOB%jakwk+!n;6Z#7=eq835rN{;nQ&cq4EPne#WNWI-U{nC^dHD(v$q2G z`HD`8h+Ct6EX#TqI8h&-&=oEh2lu`VIXD9LG7r=li2UxaSm%I< z90uOz>Jc7fNhy^~r_-O53f3IR<#IRJw*4bemlU~yEVZ__?j0E!xdgrqW!v^KHi~zE z8Q?TfkN6*ze}M0RZ-JFS-8Rdzj+I{g5#g?Y;h%C(H1{9&5r;}j!OBY7&7O3nJl{YfcxG+?uq zYKMLYwANn+%TlS-FTlk*hzuPT_@a!KukrGwAfXN@rFI3&rl+S(;QCDntcEg8bHlj6 zPC~v}mHvTY5m{G1J3IR{4Gyu6y^D(6D?1D|CwnOA`Yt#z-~I=B`a!4o3V zu9P|fxLWIe;IS~{YA3R8t#x-@s3Rh=>jJvOW@h4)kp1a;qB2WYTGA zX?ckChnlm7Ve}@GNhhpbMe_Olu0o-(y)Fu4P$(3(=kxh;hnpr%n*5*m7qmHAQ%z*G QrT_o{07*qoM6N<$f?z61FaQ7m literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_vehicle_8_8.png b/navit/xpm/gui_vehicle_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9e9f62df16482a452c1db3c000bb25d56fc674bb GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`BJzX3_ zB&OD$G4x^%lyH6c{(7Uj-homLv9Pjbf|ppXFIX!*;isWA$L9W<&Q4|%bXB+|*0cyd zxw*%U+rRSs!#20HxM@LLXFl7cKT~&^>|b$!U9Uh|aQ43U$Jfc~7=2!Pw13B{t$K!T zY5S5|tM}h@KT^?_{U+c)%k8MwzU{*I3J#P{ex4g$UUA&`ozZ9RwnUA~CbF}C&zEOw W*PU+B;G6+;B7>)^pUXO@geCyS;#gV$ literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_vehicle_96_96.png b/navit/xpm/gui_vehicle_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..94d20af9d83362ca7c2e670c285d26465aa06f6d GIT binary patch literal 2273 zcmaKu`9IT-1IM?;3?ITA$yKAdQlxUXrt<`qtz7)AyI}@p`4QC z$GivkV#SY{+)cD4hRI$+zDkMv(ro`XN_lP9oafNS@K9jb!PBKFM^l=q#7}5$Gwhnr zA%jCXi8)s+NphyV8o0d`@7p&nEP2UKHReWj~aN*<9iiO z9F!d~luRZs&i1^Ja8`OkggiO>+=9(!55+k@-L&wJS*61mg7)D6^j`w={47v9Kh`L@Qbu!}<~_iLQ;fvA;E=`8i3s zN2|*r4#}_5oa*5y@V6P`c4m;DKYw2960BV3NLXVB@uK%7H z3^0QMCSPpg@q`o^Cml!_h2kyC6X|Ilttw_Sa5}rsuCHyy&}cgiIMk$O!}b?nD-Qxn z(TVl0JHUHKIq>afU7b-wztKsIPdP>6YTo85ds3f(Grn$nGOI(t!)e# z%Gk3OUa|=66B4&vI$*IGj+Du;tuz^H;NW#M|zqsrMi%YjPqImC=M3^m^$WYvo>w z{?~A>FLdjXbPGszggJcg&g|AcUB zYpaY&3l(T{ROn-gS1(_gLVD68N!bJr7Qc+@R(A z=Ka*2K=QTlMZp}sFW&tc56hdEz~oKT9m{q)MhOd>m$&uO-@NpCDlKEtBKYih-)V_@Sd zG6%YR8GrczldDFzIjO$kjwQ@th>ut!yJL`!nLanq=Z!I!I}_%nQ#0nXa8 zQd(a8@qm8gsrBy@N%T~w5kQ#6=3D}9+Fy$v4&`)qy1}=tXs}3o%*CTs6GTc|Zk(%1 zUvJ6*nR&%5s;Md8pi*BIrM7~zn}qTQx>3BfeXIHfcLu}{5_($vPXu}NkbI=w1P@F$ z{m^FRf%D*7O-)VNg0PzwOCUH=nKysF4QBi*p7lfUx;U^$C>ZE}(HX18U$%C)GgYRcR=B&Bm zM!M1d+i6~%91aKKGc6WwqrZBeXj9(FQ&twt1o%ROgWfE%ixgF=HNe4;d#bu=Pc zD}-w3lW6zxLenGdjFh$2VQ zEhp3#^cJefxkGQp55r)aD*F*Z5-)Kl6Rt+TPaW`=G~l4o(Y%9;Tm4lD9=88ThV8Y^ z1c^kV=(v4{ePip3ir%lq#!F3FSa(TjHe4q~-x7oApud%Fwon)Bp0M+SIt-Kv8VXq$ zx&ey2Hr;BQa4w+_R3F<<#_A}*8(&n73+CrzVCzM@yJzB73%7SkXV&XSN(XB#Et<4K z8_=t+rXN{cx99+^^39I%Rhn^UBsI{y*kcQ9=L! literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_vehicle_pedestrian.png b/navit/xpm/gui_vehicle_pedestrian.png new file mode 100644 index 0000000000000000000000000000000000000000..7694298692efff904563a797358e92715441a91a GIT binary patch literal 1651 zcmV-(28{WMP)n;4+A^roO_=C^Ph9?ecl$1;>d+8woa_>jU2O_M1=H}+QVzIad7;=yh16--9o1)?b z5R0mzVzD@zgLfW!e~ddKqO%{72>_fwfS3zHXJH{q0sa_3%GoA0iV#RsRMi1E2Z0zl_J@*EKda{uULVK14ncQq>qR3AhRn z5&6g%^SY`QqULfG9EJ+$gQ|`NrU2&w#{gZxd#aj?lE+~YKvkyzYk(7c+^+$%RJA(_ zE{AI}v>q7RPuMPCx~hI0HlHX5LbSED9ak!q*3f_F0mcCvJkOgMHm67h*tc)r3Sj&I z!;dk>yr8OWot>Sb%~~V71yuEFU|o%EZUSbi>i2G0MI?Z#4hJ>^69S~!Eh0Ci)9Lk& zXaUjP0*eXOd4N-lF>iRDce@KheF%L;sJXeh&KUDN{jUZ1VI6Q52Uh72VCuw)6MxL* za-X>17it9UDyI zh)fN_tq-9I(9+T}+8ER3<61kIJgWLOP!H^`v>Rhi3qWr_LKC2;r{^(Xlx2QdM4lgP zE>-;m$XRAnBeeq%iU6MHO$BbS%)5bkK*>=v|4jkf+uKJNW7>UOjjH-H?gVg>$GHG| z_wH4CH$Ez{R#l%W|LsbEqKhO>1;}JF7Xb~Hc@J<`#rOYb1sG$bR4R2)J>Xepjp1Dh z@VAR3&IBkAQSEpBo9T4=3Cre6fUjL7aUy`Ko(kCS{9VI_4ZBT5?5DL00X|J8lW#c4 zCC80-Y43aeJF8rs#>wbdB& zF1?eNFMtP9snmAAcw@{Tz|KSE6%l(YZ8b1QRrdzvd=wRkd{H!;&5kb=3QrCo^Z`}% z+eLDUz_-9)Q79DZfol#GCnA^Nzm4V;kuHiFV+6R@$5pj0W{kPB93LtoJtHI{(}4w+ zd6$SR2JHF$=#3jUZp-CzTf^iOSp{@-bR>X>ZM%qgsZ{Do-~-!djCn*=j}4PoWCC<| zch9HyHCc%rW5$emx;$9ApXw>@IABSbydn{xwYBwld^#c`56+!Cw+BE~KLlR)xqP9j zI$8bkLnH#^^Z68TvSr>@S6BD6Wm^dRW!XjmtszkhUjS7-7r5KUm6}B!Gs9qZc$f&CCq-e>KC3{5V zK_Ayup65+=N|2BRD3wZCs)yTKfLHsw&KR>2_|C_^qI|~48A204Ri^J8BkRrS(AEPQr@ zMI<$tJh52pKKutqes7hU;JgAm60Sw${9=+5y~SnSTey2dx696_C&8 z7gODNL+}YrhTgKT#IYQ>;ZhTv36RZZPshJ3p9{LQrK&%RNXExCD@a~&C_tf5Xaa^? z=6pOJ_gv&R#ykOhYnjh(X=xc9B(JNDkqN+T+b$w2mM>qv!%-V~5%C)w1?q#V3dmA@ z`g8lJQKKGmlplapD)k~zd3^SprlzJJg5(S=KzW*ay=DF_7K`1uV8H@=ZXXEcm81JA zOdUaUx~PCw4t$;d6pO{Crc$ZR4sutaJUo5{=t?G&tAgeWv@cLT0lFIK6p + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/navit/xpm/gui_vehicle_pedestrian_16_16.png b/navit/xpm/gui_vehicle_pedestrian_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..30d9ee1eb2f9ee71f9b9115e5994b3225b3e0690 GIT binary patch literal 419 zcmV;U0bKrxP)G9=@Sa=HALPNy5dXeN_+E|p3zopKTfP}K>b z5`NMEmQ?jLnoD##4uYT`*#Fk>9ystkZ?PwUb8a0l;4zf00nf~)x&jJ?!WgiTNF)}3 z=9exaEuhsE&~CSw1Nv)z#7kyAf z1wknhgQm>u%nVGX=AsY8MP(at)izobLan54`l1$XikVCaGlhnkc`e=*WpaGZbF|Lp zaqd0me}DJA!#NNBu_-r6B2og}1*(CUz%dc|;zrAGlLYhtb-*g17P#qB$2GvF41e=- z13bv^@4E%?y3D%-i~~EAQp1*Ib-4v_RfN+Pi9||MsZ_aP7(YzYe739rp-||sWm)~q zyu|^(-+wv~2uvrb&%t0Y_-Ub9ITxX2Sqiu{$Ke1~sZ{E@h}17s z&yy>FQtCL+lx2GiSP9hE)YOa&4GleY)XU}YXf(Pukx0A;R%Z#>1#|=3fHbh)sYB-U z2@;9KReks<@OX}p5$w+RRclu`X)YK*M0Nv5wR;YTWr_QR-6K#+S$P2vkz(w^0~i#M zK_KOnr<6+P1pv4Rti!%_vtDz&T{@i}bBb|n#UfG#1b~EL7!9Urj!f&%la|DunC})1 z;PrYZlF8&r;Dc$J!_(_ZsoR!iWfo#wKlg~p2n#URtyn~Qfc+WE`$XhpE;_Epv52ez zP61`Wlzx^0Cvw$t`#%r?ih(Jg&sPUL)a&O(WW$mIgu~%2*tZAhZEtUn8HN$SF3JKR zx}*T>z|Vq$g3j6d!C>$+a9z9GL!r=tyaE76fUN*ZsqVJ6w!gYuQBhGC_@>>CzP>(R zUI4U^son2|g@xDVifd_UnNUhy*6zl5JboxI0I^u?3{bA!w$|3x@oce`m6bPuw*Z!9 zon16QS67!Gdl;dG`{#>qY-~(1^R}vWzI%Yl$;oD*1be_ViAd5ZM?~%cPk`4>f64O> tBVGBWz#wo(L>@UEKFcm(x99)c{s14{;-F^ixeWjS002ovPDHLkV1kN?bX@=d literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_vehicle_pedestrian_48_48.png b/navit/xpm/gui_vehicle_pedestrian_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..59aafb73c4fa25c8d86e547ba6e89a77c5e084b8 GIT binary patch literal 1274 zcmVVptLOA!VIMx_Xe zeX*7#5vr|pntPvnH}~#l7A;YX5aNf*zDOA2hfuVF0!w<)Ug%3i(QeX4%DOYNyL0+5 zbK`j1S@)hf6ZnVu@chqn&j0z}b6?Im1LrwZCkBn%2!tW&j`z!^3w&40T`Vg>Yj_G#---cnh zvK`IzJ!*}ip`os+si_Zvg&DeC46N#Kgn^aLpW2KL+*~@jT#7 z5qZQ$*NK5BidFy{=a^oju{s?#I0ZaoqusUv5t&!7*UQFOQ^5Xn^r?%;W*|1`xy;^w z;9>?|0B$wn0bow|vr_6KBh)tHZ5inA@4pV%Vo*N-u~KT&55 zwH^nCfE$7!IFPj#Xk#@hB3A>aMC4SuZE$dKVWm>JY^Hwse14)>EdFk*o5nobjw14F ztF~&jdN)vVWV2M}6NvLgTi+} znStiP?kfhRfq#q4<#Nx_IGsqav3Y*f7MvLv85!9CEH|iqB62JVN~O||G&b`I@-)5y zZNZ6w!NI|WTIcETXy!rFzhrr(k^nE zC$rYk&J0AUc&CW`l5vb8jboSu8?qK*Wgra0dja$P{TGn=FC-E94tU$3mdA12on?&7 z2DH{nYaOTPXGP?XtYZP>^Z5Wc-3%+$YIPz@|I7xWC|W~fU7uiY5Cprjj+3BRERHIr zk|o7n5lR0+I4d$4D3{B5t#xv%)PUU!7A#n&l(ITiOVHKT^(ydlE|*I`SME_Rm-BHP kcZ-PYrTFzO$2)KE4|-p9WQXqx761SM07*qoM6N<$f~%`>y#N3J literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_vehicle_pedestrian_8_8.png b/navit/xpm/gui_vehicle_pedestrian_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..b68b322babf8fa462b4a47fad5b0afb1dc128ccb GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`ro-U3d z5>s>g6uFoJMO@F%-PmDpQ*=k){UfOzuH6sSZ=YFnAj!OA^@csN9Bhkk#55_qF#h|n zyZG_Lf*q^I!9z+}v}qOi9yj?i)LPFU-9i`Y1JB>?o52bN++GG&X}1 zTK)9DK>}puWLPZ8y&Rx*tHN OF?hQAxvXcF%|V{ph06XCP2?tYtm3t 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Find + + + document + search + find + + + + + + Lapo Calamandrei + + + + + + Jakub Steiner + + + 2006-04-21 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_zoom_in_16_16.png b/navit/xpm/gui_zoom_in_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..045469039b9a0da7349bad3976b7615f90ff4b26 GIT binary patch literal 830 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_zoom_in_48_48.png b/navit/xpm/gui_zoom_in_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..14652e853bb3d709110c8449695298060a50ff4b GIT binary patch literal 4094 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 bw=f!oMc;d1bn!nhd>A}k{an^LB{Ts5DwCH` literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_zoom_in_96_96.png b/navit/xpm/gui_zoom_in_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..399fc99b0c779afa718ba94085b1ea981456d3c1 GIT binary patch literal 11125 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 Hu0mjf5$yil literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_zoom_out.png b/navit/xpm/gui_zoom_out.png new file mode 100644 index 0000000000000000000000000000000000000000..e349fa3a422edba8a99b76e6ac83b5225ac9be57 GIT binary patch literal 4047 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Find + + + document + search + find + + + + + + Lapo Calamandrei + + + + + + Jakub Steiner + + + 2006-04-21 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/gui_zoom_out_16_16.png b/navit/xpm/gui_zoom_out_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..56f64ce430d79cdb3f54a6f6a733a60c8cbbda2f GIT binary patch literal 815 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_zoom_out_48_48.png b/navit/xpm/gui_zoom_out_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..e349fa3a422edba8a99b76e6ac83b5225ac9be57 GIT binary patch literal 4047 zcmV;=4>0hFP)S4<%4Ao9s z`4vmH6a|foxCNTj4G^G3ks3jOIw;UINfV?&(4tA~xIt38wOq%F?Zma6xJVjH3a#j2 zJxog^CB8{f6nV+}+?~@uE@{(}Y>T#=qCf{2?9AMqx!-T*>^U>L!2hTJ-9+!F^WMEX zmn+Hbeh~XG6IzPJVuPv@01%N{YlhU(tGRsk#fb6r6aVr=*9Rl}%`|U-J$v>DB-)*b z#UF^ATeG&Mg;uXv=u!Oh_rI6T z=L(O-{E4m-+Omspx%G3TfeUP{y+J&&E%#qdSMu^cb?Vmt{#oZpT6X3 z2d0s{5K=rJagYZ9aXH^;#*gb*ZM7X=U|cS-V&!$Ta@BQIo~Qtn@$HAcl|OajR98M% z{O$ew_YZ&I0K0bWN(FKI%8nhkHtyNISNaCd;p~~SIC1h+H0`Q}hjHC&Atmx+m<-K~ zMNp@JI@L%O&OsHbRe+;?2+w|mC2H6PT2U2s0o+2){TUrh1X-O-_!Fda3#vZrjk#U0vPflT+!Xr%#>!;rj-->z=!Q zFCLFQ_~2iC!5fhl452@ z%tWdH0VN6&Hx||n1mRGvD`bOYO*L)Zyw$w;(-&7ZEonMfwta$1E zPu-s^E03eI^EEwlwl6s}ZOJd;dTV?pBr`^qavZrZTE^_wS8p44jr;L97TYN|e#O4TLX+c#l! zYy_uIce;LFcQ_UV91E=Yo*`?QJx|0l!p5=$z9G*u9C#iF*5g2oc*d}AJ@S2F;|UpK zS&WdiLdF^h6DfPqnat9|r%%5YgqxMEVkXdk6HQ zEI*ToSz|=Vw;owB%$~6I3IFPS$073sDO8(Sq;$YN}43^4I&@+xzIFJcT4 z8zM1GmWi!lHb&SOVr#f$R>qJuhAbJfBJ5cqPnfI`vczOW$P)w4GP5x-M#wV;MULk} z3Nqst$HBtb+}6g3ff0c) zu^1*1Au$Hx39(S=;kHbMg~SRODVNDC36F!o`uci|PhLb6Mg)l$3=`bgc#xS#}f}AkPtj26^s-%$UO^8{+C0DNs zg;On+O9vf|1ql>F7d>_8LVwqAHme#U3>8xsqv=wt0OGM2ip63uZ-CMgmsBt_Lxwnj-0ZBS%jcEvsaj%dz7Su2&x1oXy}|qj-o>7q7YFuk&Q5z z4ztDx!VoaV0g;0+gNOlgaC%K~?5zOAl+R?Q;zSH%Jm+!F|H+X;_e9netuZv5j`AiS z6{qtN0UjbHFfkE(-|6k2*} zXByv_%h?-G7&4 zN-BAx5fKRqR)esaa7$E=y z7b@Bog$q-)NhSi$pF0od^u)CQyd@4yO=X@ra_m^a_X5<`Cb=<4FDepg1Xe&)0gY7D zDQi*LIVKlDoQhRdRy9^5@thN@5m|+Z8f#(1fDD1jpyZMbj3JO1un=GbZHuB63+fvM z01h8HnxCAUe0tshj_CQLM~_EFEGo*&5ty)Saapmf=xFAUC8`h?k*X4Fq@od6ofD_V zI8{;zsfsufQDX%{24nBw75rX-jQfl+dqEe*Mv zrAfDF$)d#^MGoKp!K2wr6O&)O7V%dFkSKa=U|{gVuMWS0vUoX~7A-KJXdT{B;fEe* zjsRv58L%O+%$kXTu@-OIy?~{350NSLF$5+Ch*2F2z5BOJ?r2%P+5n0Jhkk|L{{G?R zO-=i*72t{!Sx--oYgn-0*sv`$I9$`oWI!Si;nI~2NC-v* zWCS7tW(K%){!%DN84e19gHwPUz~tzG8;9;#v$V0YX<-wMUz)&YKll0UvpwuCyJX zQe1$lgF3~^>WP}qwDs*=*_5hSy<(N5rzY@sU;DcI`7d5R$7S(7eP_>R=L7JLFSa&q z+Ft8d;Mco8a%bZwKK^l;&P`$b(l`c(Mxx&7M9=>7%?C${x zsEDE>8vJzG&gR}5mXzfdU$<Q? zU(6#6i^%127@wGorZZU=7W0PSW?nI}Gd74S%geZ~wnoa!DnK(UbMR0HzVh{NWT&U5 zADt*(;F|2iAXh z;iATxPuzQN*|x1)KumBhDsA9ED7}T_(g}|Ejl)h@3~{LAFuwQwALM%b2QK6?xj#74 zao{BY*mC2I=YIF*n-(h(D$6TD46JQgi?Z?r9{Tpf*<3#Rwh-^>14n01&+f9aiU*tv zS8v(885=jO50)=ohQ|5^R92P)0465V7#teFneKBqdhA&4;Gqr}V@{{j6JI{o(XkIR zJ6HhNxb=p|Z`|6ptGc=py}f-%CTmb%pTfqr4e)%6hrjdPY$43wbv1LE4*<=%p8(LR z*48F#{T*eA_^kxA6pB%Op^%RQfM>mo=bIr_oR~^a{-h9w&vhO@-alu&H+I=At?j=R zO9anszv+g+T7#bMb4aC9NTuqrp{*5Vi8vm5=)0L*K6Ax0@ooTb5qy>U)ymg0?py!` zfR+uLw#5_vGdF$c`k3c?=;`S}U2Ppwsd}`vZ$u&y;Gyq4a)mj)Z5)^*j4uP=Ic@wl z^|@uaO8XV#jt&p@Rae*jd|+tkql*?c+M1dq`Um=<3Z&C%)YR5u>-Agg@na`;u3EF= z_{mpKy>_htm*=`v4Hq=``w6 zDQvxda|vSQ>R+5ZdGg$R0N$+~SE=h|(3khWVs%G`2YafMbsYmkL%W)rn@m+z6$S=M zr^|FYjfTcXENxz5PoF-$^wn2SJaWZu^s+yHr|f3(+;TMMI-A2eIhu3tT)?-O--%;~ zUz(oE?ETqGzswO6nwuA6WMl**!y}lUn!;py$|=wVyt4_-1$n3P)vi|qy*yvu4|8BJ zIy}@>RbAIHFgUbx`SNC4Ta!fN!Uc$;2v0rr%oMr&@1HvL`uKbKQvXgK=iN-|a-o-- zmCm^WfUeuP>6Wsx_`c1XS_3GelczhgMEsE#pL^~l%iUB@}_mWLVn$zuAgRK@!^5|7>@LqgJ{Cm}VT=6zf|OGkhI(rGI;tlTx>!^Ye9=NA=mX&L~*hMJ1cMYES|n2~t( z+y2`(EhPWf|Nl0B;jy;+PdeEi-D@D>Px8^Qqgm43tye-HuqN*c`Eu`TU%SdMYDlXP2%n2_m6?@T*k}r Y@O+qH*ya01!0=)4boFyt=akR{0MpNnU;qFB literal 0 HcmV?d00001 diff --git a/navit/xpm/gui_zoom_out_96_96.png b/navit/xpm/gui_zoom_out_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..cde3d34664a64f572fdaa2fb6e0a6799592f746e GIT binary patch literal 11109 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/heliport.png b/navit/xpm/heliport.png new file mode 100644 index 0000000000000000000000000000000000000000..c68a94bf2ebcd098964a0d02eb26ea08f0ec965b GIT binary patch literal 492 zcmVj^pGyGJ)6;kH`1k`|*NH?T?DzY(Xp)3s7>vhbN~IF*cKa#_g+fdwlQ+Th z^GMkCfbDimp-@2A^=mvK1hd(UmzP%_9$pCq0t|=4o3*5TJ})fGqTB6qJRVV1^=3y^ zRWVHy&-0LF8C6vojYe0A)ai7D<2cy1&3e7&cs$++(&;q4UJu*0Q51#4;lSl`p;oI& z0ADJVilk{8mSxfJ_bC>OBoc|M;B-2%SS)Z|7uR+1`~57JOE#O$``=uxRz)_O6@ZXs zSpd!=siptN?>D$N iilT^AD)k8|K82rAuCx1{MhHFt0000 + + + + + + diff --git a/navit/xpm/heliport_16_16.png b/navit/xpm/heliport_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..c68a94bf2ebcd098964a0d02eb26ea08f0ec965b GIT binary patch literal 492 zcmVj^pGyGJ)6;kH`1k`|*NH?T?DzY(Xp)3s7>vhbN~IF*cKa#_g+fdwlQ+Th z^GMkCfbDimp-@2A^=mvK1hd(UmzP%_9$pCq0t|=4o3*5TJ})fGqTB6qJRVV1^=3y^ zRWVHy&-0LF8C6vojYe0A)ai7D<2cy1&3e7&cs$++(&;q4UJu*0Q51#4;lSl`p;oI& z0ADJVilk{8mSxfJ_bC>OBoc|M;B-2%SS)Z|7uR+1`~57JOE#O$``=uxRz)_O6@ZXs zSpd!=siptN?>D$N iilT^AD)k8|K82rAuCx1{MhHFt00006GTAj0C|PHfx4tl zmBv+?%q!##ZWah&7Xk8t7(|>kys}J_7A1bq+#(h?j(zX0_ulRH04&7ea1PJ^ z{LhR8fHCGSFa!pC!wxVKLhSM#wzs$MN-2i`TIN;;hmolXa1j30*K&=?a*DKC7LWm(j9-TXGj zV2nXZxno(@2xz>ce*Lwet_#vMrK&1=y&g&_j4@PIg;EOFb#YynZnul;x@fJvwY9Z@ zZQB@Q5JIrBvO=1sjK^cN)<`K?l+>~;EXzVEh1U9a z&nSw#`C4O4kmva*&+{FiG2uA^LW~h2LCTu4ESXFugkeZg6r7x#&~CS}ZTlR7g|xHT zjPZEP$;q4~k!W4xI3`j)NVmQYfV{}*tSc*e+}EVsVdWSfHB6GQVyk*zU#UpzH@&=K*|y!ETsI_ z=T%iPolZ&9l)A2wQX+)7-~*uPkj>3awzgJTUS8((^prf$7vbdzAqGk*mY0`<=g*%5 z1W%tn{XGY6-@Z*z6wK#yilV@_ZCb4sS(Z_jC0gsIoqmMty0qJEu3fvvojZ3}Utj0& z@Q@@)SmZ-p*9ake$8m;QYhOxvP6@TXzP=O3u{WR3eao`E<>h6B5Uj1OF`LZ@!;sl* zMp>3rRYg@*=i18{gHnoKuZQP(BuTOeokqE`EWIqt20{pa`st_O4YsznxOwv?Yin!F=X2h@d&mC%K5-nABnk8Ryvc<{Sfy!77=|dN8p2Xa z9LJ&EZd2DaaU8R?nx-5b z9Wk5DJlA#orKKhB^zNS0*{fo``;RaHzT6Uwsm zj*gB7yFFs&QTRns zcySz)rYS{H5JeG5k~G8@=IMX{r`{&v{;GXxs8N(IK4(R4Z;DW!r=r*r9Mb;&$>y&m0eHxNRMwAPExV7kbkgfajC002ovPDHLkV1oFe9!mfK literal 0 HcmV?d00001 diff --git a/navit/xpm/heliport_48_48.png b/navit/xpm/heliport_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..c5b6bf5aa428798f761ed63d70e6f225e697e9ba GIT binary patch literal 2325 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 Q0DZ&Y>FVdQ&MBb@0QdcG4*&oF literal 0 HcmV?d00001 diff --git a/navit/xpm/heliport_96_96.png b/navit/xpm/heliport_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..223c4765acc4672cd21b000a119a4f9fb3907642 GIT binary patch literal 6832 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/highway_exit.xpm b/navit/xpm/highway_exit.xpm new file mode 100644 index 0000000..7d43305 --- /dev/null +++ b/navit/xpm/highway_exit.xpm @@ -0,0 +1,65 @@ +/* XPM */ +static char * highway_exit_xpm[] = { +"16 16 46 1", +" c None", +". c #035E9F", +"+ c #77A8CB", +"@ c #D4E3EE", +"# c #337CB1", +"$ c #CFE0EC", +"% c #4688B8", +"& c #8DB6D3", +"* c #A5C5DC", +"= c #488AB9", +"- c #4588B8", +"; c #B0CDE1", +"> c #8EB7D4", +", c #DEEAF2", +"' c #5C97C1", +") c #5592BE", +"! c #7EACCE", +"~ c #E6EFF5", +"{ c #F5F8FB", +"] c #2E79AF", +"^ c #FFFFFF", +"/ c #166AA6", +"( c #EAF1F7", +"_ c #8CB5D3", +": c #2674AC", +"< c #83B0CF", +"[ c #76A7CB", +"} c #5894BF", +"| c #FEFEFE", +"1 c #1469A5", +"2 c #0A63A2", +"3 c #74A6CA", +"4 c #EFF4F8", +"5 c #3880B3", +"6 c #EEF4F8", +"7 c #72A5C9", +"8 c #CADDEB", +"9 c #ACCADF", +"0 c #2272AB", +"a c #3C82B4", +"b c #3B81B4", +"c c #045F9F", +"d c #196CA7", +"e c #1B6DA8", +"f c #367EB2", +"g c #1C6EA8", +"................", +"................", +"................", +"................", +"................", +"................", +"+@@@#$%&*=@-@@@;", +">,').!~{])^/](_:", +">~<[.}|~1)^2.~3.", +">4;;56789)^2.~3.", +"0aaa:bcdaeac.fg.", +"................", +"................", +"................", +"................", +"................"}; diff --git a/navit/xpm/hospital.png b/navit/xpm/hospital.png new file mode 100644 index 0000000000000000000000000000000000000000..1ddd04fb158ff6244f530a28616b9212d16d927e GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fY)RhkE)4%caKYZ?lYt`3JzX3_ zEPCHgKFHNWXh!n%E}KDW;jW@~nVwZ~rsl?0xt{B2Otu2&GEYV-Wld}H5B+s*u6S1)*N z^dRwqZMw|o@27>%POkDP>6!NAbePIgj!5m(;W{V(_ugjhTUFPdaCgP|BO2~O>~-s3 niU~6JEUU~r_h(tgTe~DWM4ftQljP literal 0 HcmV?d00001 diff --git a/navit/xpm/hospital.svg b/navit/xpm/hospital.svg new file mode 100644 index 0000000..9d549d7 --- /dev/null +++ b/navit/xpm/hospital.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/navit/xpm/hospital_16_16.png b/navit/xpm/hospital_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..4357479f84aad1952437ba48f8b81d3ef0b6cff7 GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_~JY5_^ zEP9jwoIm@w@!*Xg%FLDz4zb#`{a?1s|Nms}n3#D+4^3*{MzOKg)^fyc;aF}YHpeLc zzL7!9E|$doRjt92dEx?`8fFX+TeoH_o@;A7+%EV=SY1LQ?X1&>pFbodl#~>5Ds*1F z{QLj>0SB3|5EUgck8e(ehFKZ&Ef_zFF*7qa_wzG1@3nREb6_}lZ03Ztb1oJ;chBx= zaZy>2B(Z?m&W?@E)s;i~=6M%s0l~(OY@3FU_WbAF*^D>qvxFuwr=KrkX4sm%r$lM@ Sa#5g<7(8A5T-G@yGywqkj$^I> literal 0 HcmV?d00001 diff --git a/navit/xpm/hospital_32_32.png b/navit/xpm/hospital_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..99b45487d70e92d34c441f4666522e1a5c3c443a GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&)pdb&7< zcyzuEv*v0s5Ro~`%))ZgR^(DO=laK@IyyGZ({{GBCZ*35e!?Pl^N`c#BdXn+=$%lE15(IeOIlph-#r8by;jXL@FOk;BlM=VS9dh7UJKHYdw%*j1IXC}bfACOA zn91v`ljg=;_TJ=_nUOP>No|d_s9aa}@t?-usjb31O$Tcu;zfHhgWs&3Eh8~U?L&Bl nn(OJNedY4iGK?d&5VX2WFhwliwh#TSm&WHpBGc~)ts%%g6~xGnlhsrHr_r7pFrnE}_0N}c5Dm-er6 zns#!f#j(8aN#%Z`@^O{uw(`sJ7y*68mD`x$k zruWHPt9W-EKUI8v;<9z!|4URmtJ5|Xa7Cv%@dzi)5O9|2DeO^r5Z%qReDWMCnGN?p zbItA*5Mg`lpf~+q=k(P4@XZG;L_jLRb_A$@ImkQfy|U+%DHU0K$=B{Yd2V^_^~KPA q&CeIEySnvEi^N;|C2XbfFZhg$Z@%re24Y>{*@VLhJWLy2E|G$2v z<*$E!9O89Xx9!!*eLZ8DG{a*K%fp*qG#UCwYX&h*k>b2p00M`+Yd(IpZ4!N#V zbX!+Oz9iYO$?r{elF{r G5}E*(>rZO{ literal 0 HcmV?d00001 diff --git a/navit/xpm/hospital_96_96.png b/navit/xpm/hospital_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..1ff16af9fd7d2ac9b917893eb2b9ed8a9c7d2539 GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlHo*Lu1* zhE&XXd)Kz>kb{iF$Nfsz#G)!Wb-yreyr|dykt5DYTigEur;e_z(}vAHnkn6_cS{}P znF=SjephZi#M8&WTynpa>x-#*m$@^nnHiZI?;YNIR_)p6wy;ZTr&I5|pKmVD?5nmh z!eqmOZ7=Kcb+$_w2q55#j}yu*WRmu-GgI|U+FyS@D=t$bVBYbsQMsqyew(+H0aZ0Z zA1;>0-(wFS3RK43K0MEF>hhGxH)UIO6_hTSv^mR#{n^uZ{L##hJARn{*dPD=^JVqh z@9TMsyBUFw#swQMv8Q0dC@$V4_X=(D#fkSJf&-}hU?`g37Aono3MyWOr8TBo$vaC|QG-CiwyT8vc3{IyL zi^ZZAzuj)l;38?7lBOv^5WIXw2vJ!t!Po1RFbuIQtFn{lL{WsUm;0;iSV~EjWp7b{ zJkOiKyT&iw;`$wp&JZ5}2z-rYF+id># eANw_ZY!rVjr}`!a2KFTY0000 + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/navit/xpm/hotel_16_16.png b/navit/xpm/hotel_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d3efa2f7fcef2d6250f2ee7ee620e94494fe599f GIT binary patch literal 318 zcmV-E0m1%>P)0>cmSa9o~L)~ zeAXJY{y19wM^C`AEJ!J7+x8d$pzAuaEMpjkV*mi96iJexlv;)Rz9$SrwAN40_#2w% znX0OAT^A|k%h@=N#Bod%MS$1_09ckqUDq^C^WvMPxyr5pWm#@9-)i*+MNu$K)8;CQ z;(Y@l1ZkS$`#z52Y~B_G0ePMyg!pa$^G`GY#t}}ZeS??F_bx!+0sCl!FDi+}N0E#5 Q)Bpeg07*qoM6N<$g1!@kLI3~& literal 0 HcmV?d00001 diff --git a/navit/xpm/hotel_32_32.png b/navit/xpm/hotel_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..dbbdc5c6948258683051ff52cdd4d32edb231edd GIT binary patch literal 428 zcmV;d0aN~oP)6Hx+hqJj&g z`$Cq1*{s{Z^BD-k(kuQ6a1L-jpYzUHudi9fBYX>bfrkQFmVq$_#u&ES?dt{dJcsML za9tNc5WHUCo+ygoI1Y}-VOF^5JeG^BoQNE+cp?u z*laeno13NyA_5U1P1AM)T~Rp$m&>J8`@WCE;ZUpjU@&MekY!n^j^h|{9M=+A27+5Zsjhb7Qh1F`+PC!*vOeW2)jH;?u zu6ZaxM7PlKc-$x)05na*VzIdO{DJ;T)(eQGbP7%<;EAtoBX+xTP1jTKkN*vY3w!|? W%{=GEJeM^90000{Hh!!G(qzm@fB26lvKoFa>^8yxX=L@K{ zt&M3cv`ps{7_rsl0k&HRi(qt}TU@eu?_D&L&1RT;_k$_UfwTMn>_0QbUV$6}HyFwl z$S2^3ZXur~rdvQzA_KZf_%*Mu;r8~srJToc;PLVAzORA1J9u~qTap?tFL2{?RvI6n z$bfDl1G@1&g-&r@m%(7*)#Y-TTCEnUC`IHGNO`*M@1@6Xx08Uk>h-$R!SnO)8sFEy zAE7^SU6=KG4L~N7p;#<_xhNHszrc38MF@cqg3)Lch9)J9kC5>Ol=r|X%jJ@8w+sB* z5AAk4keJzQ#%8ne>Q<{oJRUzg6UcyNSy+|@Kt7)j@+bht<1y3e)T^7#=0yYlUxcKT zzWu}D;2p1@<#;?Q&nO$%@Atla+qMxxC<{0xo6RcE7#|_y4Jb#*aU2ST0syI0igY^t zWnxyVmGX?TfyH8>{E{#+K0?MDP>xWwTBXhbEiw0t`7>!0Fn6eM@enF~We1swcx`_e?R(Dubaq#Zj3kZ6AsM;fGZ}cZvX%Q07*qoM6N<$g7v=# AH2?qr literal 0 HcmV?d00001 diff --git a/navit/xpm/hotel_8_8.png b/navit/xpm/hotel_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..7263736f2ce9c65eb824bb7634e48c40730a9e33 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt@~o-U3d z5>s3IHgX;|5MlM7SfH@r(25H^aYyDx_b0qvc&m8FuhtFRk|BRY8bi2t{`&Z?XKNKd zvse4?XPw`xUh*eh`NS~e`OG=R?^)ObvQuNj=M=XHSe&0+d%y9eu|;2V5ZCEV2|Ww9 z9<%5>z;f^P)Sw{2pSxULw&z}!*!ri}wKlMByFY3?JH|oT$|=< zvN&!KIO4RdU|U=XTYC93xy8@fGmF^YvDfe9Gxuctr_W%oC?d(QpK;G7_R0|Z8_YIV ztO~&lMySLlpDFG4?=>u6zQk>({QUU`e*Z2#@5c4v56_-Ge@=V!KYjf87lT#P36TaL zMjV9BG=}!Wj7O6UKO8TdW3g?g_ryHs<{$g|@8*f`cvl%GbNh~}tYZq7!!iaSA$EFt z!Hf{C)~7|CCsT^Hg{=(>)DW2@_i&l2oWfkc!=Uu2_WEnU$`Fv~OAaN3i@pEo zYMd#t+FQ{+<^1!&)mJ%$XS(wmNbu@cw)0dC&6u9xu53l4afcFzqKrJOAHn zmwGU*a-MkA;n%icyBy?8evI za*uE94g6Xq`}m_p!QD-3BEEI1Hl#)_JY46#Em!*IgBQr*f(RirR`-|h4QJVY{PN10 v@_XaWnEyFkAAU2$3D0(OLJ3!duHVdO1x&E_VT7q)9ZheTsX+7ia1JW(yVzKjp)ZmRHoy%1RV|!btrmh3$ z=Je>O3SC`o9_d2M+q7LmV`H6{(DZck68b9KYg?+?+I;mNYxAQp+_M+LQ{j7rMgOZ- k!dsCWEu_5ZU(-$KAG3kcE^eAOX#fBK07*qoM6N<$f_WnX+W-In literal 0 HcmV?d00001 diff --git a/navit/xpm/information.svg b/navit/xpm/information.svg new file mode 100644 index 0000000..972ca05 --- /dev/null +++ b/navit/xpm/information.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + i + + diff --git a/navit/xpm/information_16_16.png b/navit/xpm/information_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..9d2ea65b4e876f95af4e1b339b76c996222dbdde GIT binary patch literal 410 zcmV;L0cHM)P)~eLw_Vl#Hhg`XlRSb@6uq4U!aB{TAgYT zx2SIsI7JXGwb_!01Pu-i(wH>-8m?C_*3AxFc;Cx82j26XCm;pFI#2@UfY$)JY22h} zMyLqSf)ig?I1=X5#5v)1BnU$-6tq~>+1aE~OW2$gXM{UJ7Z&vFOnW`8)%5UC`+dE* z(ACx0^PW81wK9^+9Y;&<5MY|I@>7-i3`$d!C>$|)zeda z>i!+#)>ib^ze0qGG2Y)t#H%Y^UXIB1di1Z|{yD~>!MI47jGmrGMT*hy>-o7ZE&X1k zp~;GH^N%V&3LC#>BZO0y=~&1nH9=a?iFFQvx3qQs1~+(o_<9frX8-^I07*qoM6N<$ Ef_i+pF#rGn literal 0 HcmV?d00001 diff --git a/navit/xpm/information_32_32.png b/navit/xpm/information_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..b08bfa5fb3cf52a9c9f296227f0198e169e595cc GIT binary patch literal 773 zcmV+g1N!`lP)z@9`3On^i~1r$)yNMp1BYYSj3+N7uoyVyUU^{nPfBf%>2G{ zW@qLM{AV*#9Uuq+wZI+VHjodj1K)tp27JmWp(%P(@J#SQ@LM3Cwjy{fsLF(Jq2Q$; zmPFL8oeD+;73qps3cjQvY;OmGHZL95|A62TFb)*Dj>^r2a2QHUAtwj6w_$A!Vlkh1 zh!_wF5_yeD?Tn_OK^hyA_V(nklM`ufPU`HGva`Li(UVNPOt9e?SWzL(%s558YKZsN6$Emm16#bVx( z78G3gmXx^rba%T!Ja+?lZ*j`Yla`kJQyqz1WME{(-6tNGs;lh)yOu1N`~9cIX<)!# zJQbUrb<4t&M1VHSN5ha-S2G77oh_#o;0-{Q$xv@ukD3}NFZbRq6BE$h4s~@ zVLgg-bEU<_%L5!AOI20=N3jVI{4zQ`l(x34lg`ge`}@+-k=3`WE7)aZLO8GE`g$oE zwNBd7;$4FE_n-O1<5F*L@axzFC=;wZ28BY>)Rg~nB-+xF)Y#}I{!4xZi3w3HuPQi5 zN!HQfSCT!o>vT1=0s5EhbnEp++$6N=+JH zOBQ{QsIju3o2E^h7ky2Z15uwIv`MQ`};li9V zGncuLCVt6DZtj`?Ip6P`Gc)Hg@Jy?#NLU34%7AL%RiFgO19E^gU<#N4Mu9=#GVo&r z{tB!9ge2G~_*^h7P{8!JpiS_O;JKAH{)XUt!CV5y-O|s3V{&>csmAjK--Kvr+Th{#QVqZ{n;h*t{8viy<0?^mLe- zg2_p^b`6GyeHR7%0_=!De~_T35`5vSwbrhc4j-1TUX`9akyUr^N=;2tWu@Pq7!wpF zV!qz9@b&AZlP9H_8M|qdE?ts#?(_rklOQ9A`ARv@X>*}__DJ{cC1!lFnwzDpEYBO; zulY1VpRu4wL^^)lZs^u6r)Afyk&23(;Wag7kLmB1Hf->Mc-s#^qqUGzr@UKq`}U=A zyLNfU-MJ$b7ux_v1?e{PQNbU^0*)T_HX%7Jzc@BK+h1&Nuauc-gLuydaLgFEb*uFF zu|E^l)l1{|?)4WdNv*A3y^v}G=ywfDO_lok{2Le@m1=6Fj0~x;P&#r%nx6I_FG;nv zHi(^W<|~W=2Mz?QJPdVo*Z^AG06sDXbabpdfFy0(W&)T{Y!;ESfZL_4TYXF;9xS>zYgXB%!`L;)L%sn4KOt1 zq%f78ZOX}l_wbOlg0vW-VE1JP?_uh9by0xXXEKt z*UP%Pl3~lA1_y0Da0BA+f$Of9oj)J0sUW&=!Is+%@c=)#UN$fQSFVI-Du`NJO*s?5 zK-@pp$=tqu!CpRLyvQzJ4mO#KLAXz+Q&ObP&Xoh0o0F=lYydk<03RBIDk}UhXqF3b z_N>kPuuShSL8jn0W3b;P<#GU)v!skcG+2V2eIT3W=G^1FHoPQfH>0S?W`0n%MSTpw zzO4dMW20kqp;}v|`g&>qe)pL2awosOUTSY&YQC#WDk!j-m%uu|UI_7;;Gwm!-MgiU ziFpHcbzYUvr_-n7d+f{^uVEuWlP~iNAl~&f5{*hHP9(my*xoK}+2RMfQ}BEsfEdJQ zzFIUd&)Ipncu{)v$ZmRMB7zq*-CpiZkpJ?R|IIas`OxU;!$ZoCd5mQ!Z<`+QZ3%(ZolO*Fel&nL( zMIf&Wz6%j#MDV_neaz|tQYz<3mB>N&L&3MPp_%YOcbK0VyaZGN8*zTW0OZE%m<9d> nhJZex7w1!h*|6$=rq$BF_rHJvyOEhn00000NkvXXu0mjfDA+=P literal 0 HcmV?d00001 diff --git a/navit/xpm/information_8_8.png b/navit/xpm/information_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..dc8b565839e88743f0198a6c45e90aac561f662e GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^@JzX3_ zB&N3Z8*&|TU|@Ovu1LW}(P`F|UqaR!FCIGO^~zQSAM5o$0b`TL1p@i=3x%TC!>7q$StBYI$Bt zQVgAHB6F=MueECL+)pv_3(kIxdiA}3TK%7xIp^OVdaA_BHg!())};n_H2SocW-ivL u*7D4IRmRVhTxZgp&|}ExTl_0yAH(Y46tCiIFV%q#XYh3Ob6Mw<&;$TNOJvCa literal 0 HcmV?d00001 diff --git a/navit/xpm/information_96_96.png b/navit/xpm/information_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..90a96032c6ba9356169854700dbf58091f518e6e GIT binary patch literal 2424 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/justice.svg b/navit/xpm/justice.svg new file mode 100644 index 0000000..c09aef8 --- /dev/null +++ b/navit/xpm/justice.svg @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/justice_16_16.png b/navit/xpm/justice_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..9ca4fc9edac99c811b1d83cab7863760ac3289d3 GIT binary patch literal 352 zcmV-m0iXVfP)p)`xfVlH!gdS;Yz>eRXC{O-4V&b^m^wq6Xi6C^pgK~&L)CloP( z4_x5B6|90=d?F2A51vN;jDB9=3`y`Tk!s8Gcb#-dyaUD0|RC-DhlKu2g{ zG6N__>uKDeGYc5TONbNA;g%ynJn+}B=Lay0s}R>P7XeBkuHZ7n*O-X`G5rk#IW6>u zns`qE-PplHy4U`g}7>j89(yT6_&*S-M9Tr$erV#&S$0000afp%-&ehhgl-e2m~J9^o1W zrb1vXwxb0b&=Ar4kUV2y7{Nn4z!}`iBU6gQ`1Oa|k#e1n;WXL`bPnQZflfQRV;^Hl z*o1r7SYUj1((`TRidLWlJ@_Of z>V%}vBCs0wllK=`p5vglfWS&TOWyBdO*sU1;%rI(6`CUs@>ZZZ89Rmx*jhxORwy(h zC9)oo_{q+;5hc)u%PHBgP~oyxD;9z(G~#ngehJ(12&_k6hQU7BTQU}c z^|+ZKzav!HOacw~B2=w3uAp@i1ln;iLryqH8nXy=idU>3_=!0wc~%b82_YDb*y>7r zO(3uoFC&BC9CoE-Svjx+=X315#geg3b@JRG?EiB)1IN&7e0J#&R1344Szx0AjCyC;KkbwJ9lcE1SA)Q7|GUlpqXBZML zC?~{=+LZ7{C|cD8dQnt*Cmh9h*;}_POqqFtetZ+Q=(M95?}S`wnNG*GLKeR^p4snl zK=JLUBB!l5o^qUS{WvKcYU!$(iE{o67GRUf&u&yGG=q~I_mAN>#^R4YS4a4~00000 LNkvXXu0mjfQCBe8 literal 0 HcmV?d00001 diff --git a/navit/xpm/justice_48_48.png b/navit/xpm/justice_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..d4fe24ca4c53eb188b7e9e033e451c355103018d GIT binary patch literal 1142 zcmV-+1d02JP)!Nkfvb!j!a|LD3JbfAX_ zqKEJ$Dk7+-q8@rGdWbR#Ge|=+x|^kCM#Th{MbSW+B$ZH_1Cs zMF+mZ4!kW6p)y8PpqV8;g;}@+SK}h(0iaWy^jPf2oC>n`W4lnOBYA$Pu&xjr(Q|^H z_sTX`C5--2MazcpXBj~iAGjxBbTby#+`!`^7p$ncZWrFb17(C&6gZ5l@S*sQKdZT! zkt&>I3JdTF7UQ2P%*(J?oXGQNudxwmOP)GtPh@Qu2RCRui_1jB+J$j7*1n1_YtWCu z=i*=&;<>T~WfmAOLguF;Dr~_GH8xb&0!u|M=oX6170E9bWeP0E=G5;Ov8Kj`>MGEl z$mqo;+*D)zaoDVXmW2;+M#c5pu(u-Z)Pz2b>B8!{D6+sbaeAFC0YU?n!R zjO`VB98gKV7I$QfPsY}YJUVbtwQ&7DPRkfyjr%If>xYl!JJ1Hr`{*HjEOjWf5-I-+9wGgl|OETNzJaNx}SR5#~mf@YyHA z?*#=kBNAR?3uvyvQ&|&P78or`=64GicHyIht_ZyjJidVDO7V&OS3t8>B-1gi6Ilve zC(78ePHCOu(qf!G1&Sh3d%~*-J$MJ#m(YQiMcY>eJLEh1RB;GBxHgAo0(MrEHAj>t z{m^QG-u7>IMW!2ZOU~RBeH~w(1#ZOa6=i*ovv7KPuvLK-GPEqfOCo|~AsssN3c%HP zp@zIyM8Z3URs~jxPpB&Piq9k~Q>Gm^%K|fmQ~pvz-g?}Y9!O`%dqs`&Xbpx$_+^-^7qYNCMYlGGW*NS&DC?;3m!h0<3@b(4?aE>HEgmdkc590M{sOv*cqrkS zC96v`IhoO}>|$#kE)?O5FnNb)EsvJ0U865SJ%Wcz=tqgnJ{zYbW50rFZ8FC#85NLULet8B{(}LdCgwzwVTf9WGxj$wly*1s_-CF9Et8$htj%}LkKiRVB z8`EYyPZ0Xs#zopr05|tW0ssI2 literal 0 HcmV?d00001 diff --git a/navit/xpm/justice_96_96.png b/navit/xpm/justice_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..51c9eb5a732def8ec2da37c53f9f80a87b0ed5fc GIT binary patch literal 2466 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 + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/navit/xpm/mark_16_16.png b/navit/xpm/mark_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..e1965347a3a86a4d2c4d22af11bd3a8f9d00b810 GIT binary patch literal 492 zcmV_OvL11U#*vm-KY)!Rc{~vkT%o7WIDB^{RpY6aj#>_F4#G%*-FG zweK!6WLb987&G+Vzj4kTG5`?KEoR;U@G#4=+ZUJz#+b*ddRasU0Kfp?y+0x%1ppDb z+Xbo34^))^fSC^fKmedD%Wr9#o`w)^5D_u+)ig~}6vd}{#UV4_|Mgf>W_~`K&E7W| zL|JS1LI_WoIo1mR9>AS?RVAXv+`J&FD2nxXJpMsM*K7C{BI>sWt>*Lj+qUNqKn?kt zB*{+^i4X#Ss;XAY4wd%*82>;w1+;8~Zs4I!eZ i08TcW&Hj0P|D-d@B)3WHqtitI0000nS?4()|L=ap_ z|3aW7?SbiUaUr%FyKt9bet;sV*oC4<{isw$5oJ1at_x>El9_3yNmqJS_haU~&$;*9 zb1(3}8})WXjb^iX#29mz zh|U5y8HVA-TCMiO^Slq^h__m;8CAW_%u@i48DnOv)#?}D_qPFnlMg2+C+C>?P|{~+ zQq_48xiqS{>$)?{e3O~Gfm&K`H;5=Jay7=Rt*orP zOaTCZ@B3dJ$9bOx0f3A#(|bY0;tS|s*{(PC#+br>T z?xBc09-Qm7%q{3O-}iSKjm8!-wu6W$CkQ2?brE?w%>PgTU}#RH!~v{}$g?883jrh$ zj^k_tm?fgD{f4SqBHAbtd19H4@~l#+OfYk9-WX#LMNukY_p-t(AR-s6wb!sW^w458 z5`c(YP}OUBOFs_8Pyi8`1F(=K9v?MDdQ}L(bdmSOo&a&=*K;CQB3d`bJVDM8Epmb7 z0wl|xlXTsqw%@W{2tY(G6VZHJXmZ7qfpH*G0I~QLYi%L%aUuFXY`5FznE5JlYWuJv z6GLoAQIu7z2*7l`UjN?dbUvm4n$6~sN~LlqgTC;^5<~1X8jVj`5JW^#6wTCXwYQ$< zeFOSm#isz2#t~1f-EMD|%jNs38V%0HNj=x?CygKozGwJSW?tKm_yEK`BHGQEPQQvv zrP5mfuY1J-Y!toKav)wY^8@t1wtojf(9NU1OkZ4FEKf~Mod$3iz#9?S9#y>8MC3St pSyigxH^1Y22I8NGh}`s>X6 zGBckEA%0Lw{o32^l7LcbjG6BWAts(QBKk{f{kc-=`?SG343k83S8M&8ubN%g-Lq}G z;cqK?&Lsfv_~8LSYkiHG-`(2UdLt#~Cn*#PQ_Ot72OaimUFCiB9e0n(HRgZDy2&v!BT3$0e`kFbH# zkT8V@0Il^&7mvR%GBR=u;Biz=g+j6p0S}Jt4%vU)h6q zUAJo6_QQS$13O4dB1w24WS%E2ku*FIA^;>Op_IA>;5~yr07H1dKmdp@;lTq)6dnjz zjRs|NbMvN@@_`WInb3}jwAT6y0H;U^9*8IaTs*r0ECa}d(lBc&Wm{`)^qkjPe`eeE zH&J+urjS35Wg5s9G%V#0fgEisfpLhxQ{W4aOm6p3dj< zXO81U+MY%d=v?{tVE_++rIb}Ei?4 z6=_O@3dDu?l9t3kfu!KQq#+R~kTkrPq$TYIo|$*c<#Oaz zWvy0g&dtpo0Wev`5;ITda=FL#dOi5#ZU^cu818p1%Zj{*^`}y)>@)L+osYHy)A^wM zrc&zJu6loAZEfwE5aOo6*lbzW$HiiCXm~G`N@YKj$$UUW|Ae&_LX5huJJVI?FN}|m z8(n!J#BP*1AC^L)@N=ux`pD#$kWvQ!!Lh!+ehT34pp(66lf;$pO@!(6$Y1Ea2ec64 z%YYLTn>Il)m`;xX{OGT^bocM=?ft&6uyC%mp74${^BECUOQq6JiBtEaR;x7^7Z(qi zc@n^=S5HJI06tMlHT~@a_pwST%d)JO+U<6$R4Sbikxq@ePj+^8Mvjkgw>_=C6U!OZ7BlXsXN+Y%^Zs`Tj}bHNwKx5w;fdIH_f;OXk;vd$@?2>>akWi|i+ literal 0 HcmV?d00001 diff --git a/navit/xpm/mark_96_96.png b/navit/xpm/mark_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..3769d5ce5160a2be56a7673dc36c113fb97645cc GIT binary patch literal 2028 zcmV-P)VaYL`n+$svj?AJ)>N$cnZ3D+;twlv6J~RH7Lc1X87vQ_~Oys)*1+C4LB48}IJC z(?fQs>w13ezVFOC>3oi!cb^%3Kkqx^*?s37pr)p#rlzK*=Km2Y`v9uU($dn*%*@Qa z{eGVv$Jsn^;K210Cr%9V)W{{^t((0esN!_g_DE?%XF?YGoGCZnqy|=BJtYj)Z2{*4Nj6fByXW zud>#y5~B|IB!C|!wIiY+48u1>q?=aL$+BY+`3W;WOGHyCP49GF_lHN09QjAL+x;R- z?W!OmtyZhG2;iX%%^AQ!&-0Y;``42irV1GK{AZATw738cA3JvJ#>I;lZwUz^(gN^H z0C(s491-2`dEQ69?|&B8hLZ|}VMwm)K9$z)e~L1@gTdf;05Fi zAGn#HQtFAMHi;u32!cb*{CM6S0{{^*fQRSi=5AE=bR;4z*L9x?)f_qTO;ihG&|{@nb~3HXWQ-e!AWZsg^08^ zHa30%;5$0%G4tNoZ7H8^YB~UynSWjd3FBUHlTb=+#%)U!Kt!MFI*2Nqjx?WkzQu8z z*c=lD42Q#i={yjdPe&rs>h*fZq3N`C+o=8xsYH$TvX{ysP_&Y#Ip$dp-bs4dCsh2B|k#%=|hLeW>k_{!_Q~3-g&X zXQq`>3nqHLQfkm>G+q;tFO%A(eih;SzVbZpZvgHGuv^pd0RV`|0r1$|+}tPKZdcm{ zKMS2sXNH*MbtT>cXo6TnP<#xNB+Ho^|8Rz@{(DS^@Fe8Bh{Gdn)ola+FV`F0h z22MMp@PCsfd?2F$;MS4Q>2zj#z1|`bl^#BjLjX{Wg!%dTkA2@aA|VQ&nJ2!(-_AJU z133i%<|Qblj7YFCd|(U#K=mZp8a^fISkb6h5F)08qXJli?H5rt7*|!v{1A0LqhKI()}*w1*EE5C9Y}p{n5n zh9~EW$P|F%0PfXYTPYPV^J}|y?fPd`!v_kO9c|)A?g*vS0Kk`qF1Q1w)GMp2tAE#B zdn<)ZPd7OdOi)D6k1%o#*pA6-f^LcoA1FuwPz?!1hYu7e0I*v^8Q}v33jpktP*(Ur z2?7ASB$OFGP?7+^4hdz450oeXC|80F;R7WL0LqbIOZb2V0)S#A*c3isi2&eR30D9- z0N{2L`xs3Ze061ICGp9{BFXjeT>&(R$Te7>gCH3|i;BbKyrXfk zLO>DWM~r6RJ>q$u6%tApP-OU9utq|u0!j)$!U_qc2`D-Ih|(pLBEXXHBTAJ}xBwB^ z4PX&~4dF+WCZSLPTf)Dy$o*!d6bXe1usr;T!X*?UKt%Qc_!WTIH4`kNPzlBbh{)|k z^gIll^OaHqBKjOaOLJ)kaLDt#4}IS^y3~$Q0i&M(0t|#dnydM;QtBD`nsJhx7CEmkmiUemXKDps4Vpzg1a+b^%3)A5m2aS_PC9 zenb@|XcJI&_z_i;phbW!;YU3qPVN5+)L0YxogWkTA9Y+ry8rUBXxbsuF&L z%@T48s9N|Dwo1q)V0n3YZ==yzM8(37uu(#00n5wFd#9$R7EsafBW#n9^#u;CMx(I+ z13#veFm#zP8+sVPM9bLkM4917h{!sCmjHaMyLK3cw-M3LMjbeoGyxQb;Sr6; zb+ahZX0zFRsm$;rMiPFll=?__?Jx{ygCKY;sZFAQwY9Z9VHj#%RaPlAVCLW1GCv=< zxkNKF{}u*Dg5x+pPTHO*px5hZU0c(pp1&P~BjIi&tVob3pxJC{`?1@`p1&PKBcUlG z({US?u5Pn2-$E=ikkcjf$G54f5hAkA%rEAAlgL#7e@JVTYsIW~yZu0;(fBELc=5q#4Yx}G{wN~-Jawyrh%htH zjouF#*LjCQ5WIQi%9Xb+T(}UV)f{WdG7;I&%mvfjbxP|Smuy8u z_5*knz=KMuT>!w$JpflXH#h&fwzgLK)0Z_hH8nLgH8nLg3H%#%m=L&lEQc=u0000< KMNUMnLSTZwFRwiS literal 0 HcmV?d00001 diff --git a/navit/xpm/memorial.xpm b/navit/xpm/memorial.xpm new file mode 100644 index 0000000..c05e019 --- /dev/null +++ b/navit/xpm/memorial.xpm @@ -0,0 +1,51 @@ +/* XPM */ +static char *dummy[]={ +"16 16 32 1", +". c None", +"m c #625112", +"f c #646464", +"a c #707070", +"l c #736118", +"i c #957d1d", +"# c #999999", +"b c #9c9b95", +"e c #9f9c92", +"h c #a08723", +"o c #a5a08b", +"r c #aaa386", +"A c #aba384", +"z c #aca383", +"g c #afa580", +"D c #b0a67e", +"s c #b1a77e", +"u c #b2a77d", +"w c #b2a77e", +"k c #b3a87c", +"j c #b4a97b", +"t c #b5a97a", +"B c #b7aa77", +"n c #b8ab76", +"y c #baac74", +"x c #c4b269", +"C c #c5b368", +"v c #c6b368", +"q c #d9b830", +"p c #dab934", +"c c #ddc04e", +"d c #e2c349", +".......##.......", +".....######.....", +"....#######a....", +"....##bcde#f....", +"....##ghij#f....", +"....##klmn#f....", +"....##opqr#f....", +"....###st##f....", +"....#######f....", +"....#uvwxyzf....", +"....#######f....", +"....#ABCDvtf....", +"....#######f....", +"....#######f....", +"....#######f....", +"....#######f...."}; diff --git a/navit/xpm/menu.xpm b/navit/xpm/menu.xpm new file mode 100644 index 0000000..067a907 --- /dev/null +++ b/navit/xpm/menu.xpm @@ -0,0 +1,101 @@ +/* XPM */ +static char *dummy[]={ +"96 96 2 1", +". c None", +"# c #808080", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"...........................................####.................................................", +"..........................................######................................................", +"..........................................######................................................", +"..........................................######................................................", +"..........................................######................................................", +"..........................................######................................................", +"..........................................######................................................", +"..........................................######................................................", +"..........................................######................................................", +"..........................................######................................................", +"..........................................######................................................", +"..........................................######................................................", +"..........................................######................................................", +"..........................................######................................................", +"..........................................######................................................", +"..........................................######................................................", +"..........................................######................................................", +"..........................######################................................................", +".........................#######################................................................", +".........................#######################................................................", +".........................#######################................................................", +".........................#######################................................................", +"..........................######################................................................", +"................................................######################..........................", +"................................................#######################.........................", +"................................................#######################.........................", +"................................................#######################.........................", +"................................................#######################.........................", +"................................................######################..........................", +"................................................######..........................................", +"................................................######..........................................", +"................................................######..........................................", +"................................................######..........................................", +"................................................######..........................................", +"................................................######..........................................", +"................................................######..........................................", +"................................................######..........................................", +"................................................######..........................................", +"................................................######..........................................", +"................................................######..........................................", +"................................................######..........................................", +"................................................######..........................................", +"................................................######..........................................", +"................................................######..........................................", +"................................................######..........................................", +".................................................####...........................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................"}; diff --git a/navit/xpm/military.png b/navit/xpm/military.png new file mode 100644 index 0000000000000000000000000000000000000000..160d62ba0b88017b4c285aff8f68180d6ae42d66 GIT binary patch literal 407 zcmV;I0cie-P)Z>09BO$vF9@p$g% zll5_%#-w!er_xEcxg4)Y_!Uu({7;;rhz@+lc7B6*LGm4Q@k0$OQp>dl;=!nSnkB4z zT)?7qd+O@TIEj1(zoj!MNjI(*1K literal 0 HcmV?d00001 diff --git a/navit/xpm/military.svg b/navit/xpm/military.svg new file mode 100644 index 0000000..e8d0fe9 --- /dev/null +++ b/navit/xpm/military.svg @@ -0,0 +1,310 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/military_16_16.png b/navit/xpm/military_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ccea31cc5d2f28906d6918f7225fb2abb1200583 GIT binary patch literal 309 zcmV-50m}Y~P);x@e*$(JqnRXC}`CZQE2qOgThC+?yA$s zB_vvv=#?71hDLK7;W)Wa?Bufk@sj9xk|(=6^UTc7?DB6hjIrMY_F^9$yx|N}Uuah` zQ8aEwV9pjA!FIv7T`nZp`lM1nR&a+t41|3NCq0?4j^*s!!F}vsQOnxvq7>@_)^VG$ ziRWM&bC|(p+@_mg1iN^|aR{pz41WdlxCs9a#&Hg1X_BLu4KCsdYf+?y4QXg~>7_oj z(3GBP4-e8GIEo|<9AXluxC;9LULYUhG=_YS8(jaO`D=IwvPL--QL%e(BrHVi#72k>3zr?iiIcchii8CV8h1)*YccPM&*^vC(^g}1o@5r^ zsiTfM{xb@r__qZs(TF#AfWe6%Rf(B6iLWVP+3sNDL?@qu#}$dQHh_aQ#3^7_vOTzr z&9xBNKTPs0iF+ub3(xTi@9=q;bH$O8PsZyS2#nQ=#6VTUI<$_&GJ{R{Alf!9`DUOY zU1oanZN~;&87bh=QQT$_t7;_Lh^F#Ko($*Wcw*jP<)0tut?>O66*!G2HIf;Ef{@pE zdfSgvXdVlJo#RZNwWnB7%Zj_Y`V+d{Ir1R8J&CCtG!(bL)JNP%vl zFP&K?mdZn+cS13Xg><` zw>dSF1oXZejt}B;Rs>zkuDM@5PL70K3HSW-D+p6MMcG z#PxZJvnrT}GbuqyRHYTGMSpMLo2bH;MCL9YrSqLwDu(c?SiRfu3x`x$PL*4(fVEg; p_;;cf^onPy$rQYrja$Kc`x3C^d>Uca1 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/mini_roundabout.png b/navit/xpm/mini_roundabout.png new file mode 100644 index 0000000000000000000000000000000000000000..305a9b19f4845cc98936fe16514a4db8e47950c7 GIT binary patch literal 284 zcmV+%0ptFOP)fYA-z=89B&v_p>hnIqaJRG5iIo>eFCCdMiHZjFT zAgbdIFF4F2J-`fSTh6cXkVo9ceX6#b+Rw26UGvTl;t0backzKrl2@4EIIDPpT9BV` zg=J8yCHFEBVdU%cL(VbCD&264KK4@e6Y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/navit/xpm/mini_roundabout_16_16.png b/navit/xpm/mini_roundabout_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..92a2b346488d5d43e355289dcf39d969533c2722 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^rJzX3_ zEPCHwFyv!Q6gc`(e$nQ@OByaK9T#1(Xmoqe;B|aK5ksqs5|_Ea@(Y#?FEll4W}TgW zHgEs`tWRmro}LW|I{o77h9feZd9FR_Hx~AriCHX|mu`7baOxDhqgu8xy%IbHN7<9t zG}j%}=s#$Dq|MrIVcvteqJRBa(@TPHiA}yy&?9D6@vu?xTit$57h&0t!QM>q)6NK0 UL@i=k4Rj!br>mdKI;Vst0A2@I%m4rY literal 0 HcmV?d00001 diff --git a/navit/xpm/mini_roundabout_32_32.png b/navit/xpm/mini_roundabout_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..bbda06e6737978c49aef372cfe4fd0b489d5cc44 GIT binary patch literal 407 zcmV;I0cie-P)k%#DrzAbQrg*Cidfl+ zeM*}x(pdNpXcL4KX{-$aJ3$)-MO?HA_-%1#L6+4S$*hg@gK5q^bKZ0BeeWS7BjdeO z_>X^!=tnQwaEXUBnu?HV)$asrC^b@i8t2%@0tV25k66MXPBGdD@e%wJcHi_& zP7Bs?5jB+>dHlg9axu9D{K8I}4UFSXFkBLb1YdlKOUx%MIDx-7sEPMsMKI=5_5`0y z#uY9mY@idzb>iPKi!LnItQ|%1R2rz@bDelOsYtt7mdRQQG)33e3GgL}a{sn9Ik z|Br})L}3R;N@idaMu6AK@Wm|$@xMnpklF>^#D_t@LL1ZBRk%pUuH{Qk3Z z^PeS=NF)-8L?ZFe($a*Ooj8R3Scfi5VGPf38!wxXH#f^LfJsc(xb9)+yr`@|4_*l3 zeqsnGu>+g11qX2nAEVuOoSqM{f3qDWLDYS0t6{$s=Y;~MG1yFTwOEPwQOGqc$l%+D ziRgQxaAkFJB?=fqYXkm=g(X)KCSy)nk01CV>@Z1ulVDBHp($Ns@Tj*o&v_>xVFOc30xJH#w*;c6000zEQg-V+z`YauVL4vdVgpW zy7MorDMng-95d4c@~}6?d7N8OM%wX7n7O_NW3=FjP(Xh{x-!uplfTi}>mP{zBf^$D z=d_vW2gBG{r(Y{B2ybr+y-iV9C+&D76j8!iEUsd|3lF0GR~*Tcyr|Z_NH|iQioZYO zuF&Mhg^!(X;Sakt+PuY4JTFK?A@mCSefg|E+ckuC+TgcmBAmQ?m-$Qm5>xG`CLkD*BFekRLU2e0#F>mMT)57lAZ5z~cA|@36e=4h- uCL{XI@x)U7C0x4|RMxc4t%%xJU&*-o5PRUadjCS8u?(KBelF{r5}E*1CNz5h literal 0 HcmV?d00001 diff --git a/navit/xpm/mini_roundabout_96_96.png b/navit/xpm/mini_roundabout_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..6aab70b394976aaaf658a40d82e54936df48b994 GIT binary patch literal 1184 zcmV;R1Yi4!P)D%fmhw8;2HAnl?VF(+*jJ^_ zHBG9o(3WB|lVn4DK=ZqV31qvxA>iI7*IOuEWV?eeur4W7{fC_T4+0&5>W^+c>68Bp zxFv87cLA52JXQwIA&M#3{5^T%%OmCTypzWqpn8yMvOocakg8Hn)&*h~8He>e7o8q?p{s%u3T zupmUmF)qN}PI+G)v1S4<0Pg_L0F&y7<>t}or|`n~m~?-8zh|6>$W9>-<3E*s!in{U zXPlbE_yyeTluvrZ7!PbDyIe6Fc*!TJDtS!xj8l^s7r^Z%E_lS~A^)YyBOdX<2HvDD z&p0)SaRG*$a;HZOx3QAWdBlV43m`YorigI?{&C9P9x?iW&vX9vo<}@@o1F4_&p0)S zaRK_A@+{9dPXga0%EQ>e`L<^~H;+EgI5mm!0Cdvlc z%17#mRcK|3vkp{I0)8jGdm`_Je#`3s&X7J?-)^W;dP(0D--oI=#uzY+J&aY9u+`C+ zo^{F}M#&cBb4e}^{!1HoKS}P+w;d63=pef^{%(Xkq9|kCQS#(h1z^}1jB&tx;5qC&0(YjB+yxiw*`v@V zVRP}khN~QBfgiAs@je6gW8Z|i>fvd zEk28nnmBKCsGj2)jD>M8N;T_GI0@q_4zs%4{l;az*!;POY%Z{~h?N7oh}d#q zYbj{gB>g9De&Y1Ibz@2LmEL{5ctO(I&yv=KE)3%pmx1-84|h1gep+BqehspbI$p;> qaGi(VQ0>4ZMsiA;s*rQOR@Ns^AYC~R=zFRF0000 + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/navit/xpm/museum_16_16.png b/navit/xpm/museum_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d05e8904c87a3293847e5b5a2c16926eecbfe641 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_4JY5_^ zEPB^oviDt|5TFVk&K=aky}-aT+-a$(u=pMZ}==X??3@#&$lqSBNqair>d#x zi2XM6JHb}?)LZTIzcb&@&aUjQSBjqaI>Gwm{f$4me*_Dxx*EB>NlxxU-|cA6cf#>I z4zA&PwvqpWyZN6=fma0+pSXpxI>)T5@RQ||S=MOy?(n{2(tU^Ok7VC?KI4(dHlfDa zH!XX+lb^;1*yZZKDVuY4I;<Vy6APo`K?Pb``X*7SNpX_x#k__#ZRdD+{829Efa- ro)eLEa#qF34?WFnDKku-&+Dxj*Ngf6l#g&QPLYRN9E? zM?HhT!oT+9ybUXO$gqh#n^oUiU0(d}2*&XxS{ud3jF?0G4W9RLkzZPZW!dF^i+#>Y z&{Ie7311_=D!KKY;E$vdF}~qGTv*k4x%1cn)B*w5IO*tJ^Wn9sfIZ1gKEzzaZR1C3 z@#R_z;7B5nzbslSV(fSU|N9Y=A~0oMqL!oPx2Kq;UUP`H3_ z7&WjiX()Z^+PT)*K83;5|0QYPP1G@*`Zrqt0Y*GGwcohJPAq0Y_Xg2jGilh0Z*^}N zJyo@WpZL(F#4!$Pl5?FcNWf_Y8yG7{z*#|gOY{&P0jREcH%pz(egFUf07*qoM6N<$ Ef_zA}0ssI2 literal 0 HcmV?d00001 diff --git a/navit/xpm/museum_48_48.png b/navit/xpm/museum_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..0bcc9b01b1b2ae766369f3433ee3fac10a42d4e5 GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$qWpP1)eUB zAsLNtXV`i(I|{VTU(vCmm2o4N#*NMnq58J1^$zt73CY>3r)_K6yEoNAKu6^0g5IM` zy>k!f3oL3CGJ8Jfj#_n&+8JiyF5XnEz7I%^Hkd{x(j40{_gw9u&=1^ zr~r3gi-(Z#SGHqJ&#gb5_$gEIHYR8C{^QlM(sryX^A*3c)qHngnj;$6;e6R$M>fU( zK*o$Hu4Ksy_L~RPAKv#{IFl_d(c}98-RApFbFHt`Pv6O$aB!yjfq4sNvu+F8C{>`F z@x1YH$Quz0@h!&>%rUNK`DVOYbjRY~4LeU>(Ea$`;MUm->o{)B<;k6N>8i@aU$zNs zNy(^4Id-}B0gDY>K9(QFAH-dl-gq|T4c7|pTb>EJqS*@d?BR`^>GzoAe(aoS#!}mE zb@c!5m+5rdhZR9)@z|ivW{mhOD4H}b<9Xli%#A?(faOtMSByEno33dq&*~HBB5E$^$5>95%_px$4deA%@f%;`BpsIDQl*& k;gI$Nsa{LF`ag~OMf^}}7$CS%Ot$2ON!cpbJCKFI!nbj9N>K5 zaPSWQf$vQ_f1e9~5Pq<%?o9q7@1xp2wh{_w7!uhyj2&h$9@@jlv6`X`c5>ONYT{@-8hb$gwC>OAH{ za0}NwwR*t1A#m@6+IP3}=0`A{W6FNK*0p|zHM1T=_+{;xE0!ax&SA4*Ten=?DDeFy h?g_wH10uD@=ABGi5;yL1xe81*44$rjF6*2UngH6S1epK; literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_destination_bk.svg b/navit/xpm/nav_destination_bk.svg new file mode 100644 index 0000000..76e029f --- /dev/null +++ b/navit/xpm/nav_destination_bk.svg @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/nav_destination_bk_16_16.png b/navit/xpm/nav_destination_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..22f76e5029e4c54d092bb40a31058a134ab95b56 GIT binary patch literal 357 zcmV-r0h<1aP)N(X42XaecD5;AdzKPmCEN_$8t1zJI*k`4B{+~egQz1LR|{$O#=-D{tU-*FAvG7D@{wSV=?=ntd%X|TJ5Q$9IM-2MDZnJ&hTT`(={T<8EDqox zHsI?tVBhcv!{wZL0C}p7>z%Ly?2uFy4{$>zDp#rl?#72E&d@CAcdVYmw60j+2@B zqhYW!{Jr>H$!_yLNCZIMGtJU_Zo~e#?p8b_-veS3R!d)2!_v3Il(@6$1BG-JUPnQ7 z*c&kW!nR{;__qbX6wRd(m1;~nu%(B#K`~nut=Fy0VOc2E%sgcYU0HC{lyiO~FMM zuA~a$N~9YXuB;$}xOF2gveJz%L|sKNEr>2eq&10u30;US(xiR^)dfWTH?`;9@5y*o-m)E}{>A;UC;6LhBX`CoA%+#on6KrBEy*;BqQ& zD%8D+Pceku*pGd<89S0aS=G-4A!MRZo)(^Ln=%4waT#AE%Q%R!!u2eadWHBccqCbo zOxQPaai?&p%tYE1(2N^!YvFU|sXfUa7Hf;z!mi?H`Pv%ASFKKB1lMpjl|?&Vqy51e z?XK17d#tL>Y?|n~I(>}Po8i3pOjfwY~hjYcef7G=>L7$kk;jYoI!IPvABTh>Ub!8vK9|IJbnc>e7uxJdMwj z5iz`gDUn^q#U8N(cPJOeb?H_Xs%AazN_GT~<0Who8ERi@Gb}_-m+iQWfQRs|{LYZrX2vDip6pz+hV6#Xyhx{`g}O&Y zF3-G_d915+at&-0@jQg53-x_+FJ&IP+Q~t?&8)@GO=B2Txvtg;VJ*$6Oygg0Qrx*+ ztq#zD!DNTi_t!*L+Aa6kA^9^^P09**E`9Dv102B1@>u_^m6H(L92H& z8{jFtTBx7KM>r;r^&xRbyGp0RVE}ikOt#UK0yHj~P-YC@1iXHO2$nl-> zVjrGJma(Lr_y>_Te-bY+L*k`?Mo%qKR6JHXI1k9xJOL-dIB0q)5-gEC4 zFYQ}JPCs1eV;+CVk7KfvjYbD*Ezzp`FIc>*Zop0>e@M zfvUFE-xsl5Z)8QzBrAHWM}%Cpw{|w`Y$XKL;)*zCJdO7Y^_zva>atn{)FXQougj87 z1XcrU0#=$e0V~a#fR$!Vz)G_wV5RwA3%FEOu1XsHTjhK4cJ#Jo{{KTO{0q-^;$Gq4 RR*wJx002ovPDHLkV1ftE`UU_1 literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_destination_bk_8_8.png b/navit/xpm/nav_destination_bk_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..80f76f743a5b48b9c6bc0b4af0f609b1a7e7620a GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^7o-U3d z5>s=}Zsa_~Akg~o{0jjyP1UK+77aU^t~FUW=gd*4W-;G*$u41agjU8wSH6$!?B93H z-@TBZS54#N0bYF#Cy575yvs5+o^}%Kmb$$oB5mPeQSLVz4{35gJ|UPbV=y^lS!D~? m=Y4-Z9kKjWTlinO$=pg?SZ>o|%PBzn89ZJ6T-G@yGywobkVbF- literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_destination_bk_96_96.png b/navit/xpm/nav_destination_bk_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..fa7fa1ab2eef47ca6779e6026382b30415dd4c0f GIT binary patch literal 1572 zcmb`H`#aMM0LH(Ydm2%5&umGX$0?U$r^)SXM$0;q(OwLC12{)h9t&-;F!_s92_H~ViQ9&YzTU6osh=ya)d~k&<7}+s^475AO&82QKpFsokl*M1 z!lEsoc8b_IiE$)ErMKs%6YdR-Xb!R~E3dRmj+W+8A?o7_c@Co1ydQPR z=0$Je>uY`VXFdjZgTy9sVz?E$!P-)omOtFwb+Tlz(p7f#D4;^CT(Wxk zN}ej&&v)pnnD{Ae5Oxo!dT45Pd+>6e#xU3v6PBEH@g&EutPVM<6+metc_wX7GF{j* zK2Lq(81D(pZyP6Lw~}ai!IQFdFgmk6M5e>NoB~m^?VsFvXUZ~(L(~-v8Lp+t1EP$M zA_XMj{VZ4|chC?fOxzo4QeeKuyDbix_@w`ZK(jM0Rmh}25zP2IT{V94y|eXW&PU;t z#76TuGLV=`QF0=M2gReoeUBUOzdtj`U^iuMctI&0iFj0n!!CilTRnk%o3d7^agfO) zjkAGxdL8|G@QSXZw}P^x$m$YWX!dk-3E;}26_lOUrv2p?muA(ij6uO;l>tyq(aVj? ziikL^CDu@zGqa-_S$`LBjiX@d=xo}K!Zv3*m-T$?(gLWo!)!6^<{s%X{a4i4SH1Iu znh;GLqzLGtu~t)$_S(gOA+aNjz4UTKtl*y^jqT zqBM?b3#wC#er#XJtrPfEyM0XfnKpnp*6%2p&eRE(SvU{QdxOI@^fKA+CM+4zuW0e2 zQT432chzu!FS5XE&g%K-oOHSA=Ek=Mjr#Joe@Dbxqo6}M{ooH~S_wh5rx8ujtRpAw z0~)}SPF_3_zwZ=`BmA|@sV`pNwerIh0Xi|fEd%GOVu`Kgr1#!{0zAD-Wv=0Sl zB(sb{_Gq+oq&&F3NT={cUkXd&FyNz88X86MCr4LlC_?md3HTsX2s}_(R=Kj9P;w>Wq7Bx`kwdqQ);FfwWn+^})!MIEWi<>gxHb zvDPkji2)URxzXX2HafvQ@mb@3{R#fQ_?~(F?gL`(omAR=B8E|E=#2Z5@p7&z=QvAc zS3Gq+0w2moQsBIfPOy&O$So@Gs>T#XRq|7C14~rk{_Tti)tlu%r})Z%hXv}gy9Cwy zg96KUxb&cFZ?kYT_ln8J!(?#CfPJrKQg)##Hoggk?cyI-YkLGD%#|~zTM3QTvtIJ!K8B_%NPO^ z23U=02g+Xl!QYRgSsDGFqSv}4!P5xZl8H*FEJM0NJIj@3F0Xsv;q-u7$4KDWJIzkR?TN5nqx31|EVyII)^ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_destination_wh.svg b/navit/xpm/nav_destination_wh.svg new file mode 100644 index 0000000..ca2e2d6 --- /dev/null +++ b/navit/xpm/nav_destination_wh.svg @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/nav_destination_wh_16_16.png b/navit/xpm/nav_destination_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ebd0b614b7bc268a514e151bbd16a2d10e609aef GIT binary patch literal 394 zcmV;50d@X~P)L-~+bfeUkII zkJq@0YuJMsoWPMTU;u;IhBLTbRr~P?Q#giqIEWuzz#tYHbO2-RsP`~XRW~qZlOY8U!R9<}Q(H||$nVFJ4?J?CCr#}lkeGL5a+fj3=%_E8?Uv797B4IQ=g0z+0O o$=x-Je~{kqOa3R|!M^}M0mi>>ekxWA{Qv*}07*qoM6N<$f)6>Zz5oCK literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_destination_wh_32_32.png b/navit/xpm/nav_destination_wh_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c11e2d3f96c81b82fd01137c8f8e150205bab7e6 GIT binary patch literal 697 zcmV;q0!ICbP)FjO8zrWFkQP)by$#N~dG6&N@4YD&;R}m%*dOaWd!4=Z z+VGd9(gxf8KojsB7z!JaG`~^+1HciWE(~B67%qVtl9XR6z}k%Vw?JFG&jS~MPM`xg z0jvwyIbbBfhEvZMl73bLkQITp6abQx>c0eB0KNn7f%`xXXb0BBu$cf$Lp_o-QIW{@ zfbB7-RMOv9uFv*H+t+MQ+s=oN2^Z^5>G!gJ!E4|s&;@kbJ{c={nFTIs+V&e@Ll}}| zdsFzi0yI_&U`eCEC~!Nq(mCKVa0)mGblcu6>BAymAAtw9r^@wb0c5E@oZbL#07Pgf zNiyRuaFvK$H4d`?nr)u}21!C+NiAUyC7mxc+Rn3(x=p~BssVuhc%KEjNmkSaOxoTB zM&XL>| zepG-1vdb}&ddf|(Es|2*6?Pz=dxJRR87UI z&P=D0`6efK-ktaEIp2HEJ@?!TcPb=pmb9VWcGQC9{UPad;B8}s=(tcD^4t^)nQ-@t#sJwP{bKQI=g1WD(~cndgf zW`8x$>=Z=^+z9QxQQybFcfbhnB(NRW2HXcc6y()-5J^{XLQ_$D!ptr;V1FS3m2kt% zjseFa19t)w$^W?L0D5uq1HcPGh`vjR{Y*-3(#)>4l0Yro4XlrTC!QJ&@;tt_pfa&r zl71&$TjOT-Qzb>MB2a>v{R{jO1OQ1Bz|QEkKY{bW5b!{-YfF&VfnlH`fvy5Jj04XA zZvmf#=VoV`Uf?S;TMw+o6T^GB2dbio2NujMJA(%#&EoNz$Q*DHXlU~@vl)CXO-Onc z54l`45<=P7Jz{1LN*cm5(o?{wq#bw~z21PXTr_=eU>8xW12>BrUH}_{{88)0rH0VFnT_Kq6#z*uN}3|| zQsS|eqM2)8H6G6+z#CD2KdF}zkKJmf(w4%^=J1*+uA3$#4O70Z3@28XO+{Wl3mnB~ zZgaf~s$e+C?(lpN=)r5I#ACZiYpRMUM8M460g%)k6zq`n0U_4S>_YwaFNT@jB&wSv ztpm1J`=+khOcY3Z4cMRbOPT?`0rru``UpOwEk(1!VF-A{%u4B2QWvmE($|#7`gD_Y z0xev`X0`yFm9z)neG^;<_5xo}o}HG2Y6RAWc1+TTgjqDRb4yhg&;wjBvmlQ){ql1Re|R!@!|P(Hy=*UdD5Lv%J_3yb>fqLp$-Wc-s68KfsLOhxR@y*C?Zs z4pY7ppDAK_BdA7THncxRX>@?}79u(4K8+vR*Wx*ScQnR4eq2nhW0ISV+zYjOQEwW( z!s1na$!Q$kDhz)IeEckK@J;WroQc&GZ>#dEo##?p*l@Lml6G6UA`X%+@-pa*_AdrWs6wgINHv%gG9Rlq}hd{g0A<%Ag w2(%j=0`0~fP2gIl{eMByu%tub0J36n8;~Agxn(izjsO4v07*qoM6N<$g08gwaR2}S literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_destination_wh_8_8.png b/navit/xpm/nav_destination_wh_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..5fabb9ccd2e5e050dbaa495831a0a2d43384159e GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_2o-U3d z5>sQ(ZscSN6mhxud7AE_BR5Vc={V##COfWi6xQCrzfsUIh*|k)h(YMQ#@(N8ax*g* zCo&locXPk9cpxPxzv2&v&4vR4yU)Z-ce=`>t+UZ}zerw1QWI~Q#Z;&DCk2b&7+#t* w^YWtWGc8Y?F}z~sazy&M+W+qG@SLAai>1_jFDMkh0=k63)78&qol`;+06h6g5&!@I literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_destination_wh_96_96.png b/navit/xpm/nav_destination_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..9cb04f72e936bab9ed238194868cbbbe83c56873 GIT binary patch literal 1689 zcmb_d{Xf%-9^ZGfnQ4Ti?sZTt5t+=>@sd34%si|@i#%+3SfgkqRx_uKYgq1-lBbQ^ z?08BhJs_HKhU4LO7`i#;smnpGgK>nRqyOQ)KCjQ`{d&J&@7L$I_ve#!o`6Fl{)Pa7 zKuElor~e+3zcn1TH$N579rpkh;e+!8ef?JddROsiPaxnu-2(6M7x}$8`q%>*tv~P6 z_TT_3I+LM=Lq;x4>-Y(?K89;M?K+C2DAO_F9-r%bR5aAePqSZ12KfMt!hnIMd* zqmArPCb~oy`ooV_)r|Nrz7xewXT}<~#;ed(wnNroi7K2R;WPiU=0h)(?!JXJ15_NO z1i}Mw>==wn{J*SI`ds)joaQ)e2iXSug7vBvZep7K+YMDkHfq!kEdNl~N-9W?l2kr; zT2QaVaW3t}?FDFpy;**@A5OzM=RQ7HEWRdlDbx`8iGD%Als9 zZjFlW(clKg##I&)+7-+TNj#RYCH5|gkeCNgTCF(5r%JI@WAZqrcy5}La>Uih#m#YM z6u_swI%sm*0-MqoCmB=Bqpd6)$*otSjCYfzC!|%?>Q>jF&b$OpWYpsF!JeGZlU;q` ze!B|OKuNytE+qfBG`k_?uqGIcp+EK6J=Pna9F44!^yZqfjaf01`|BV<6Fc*XIZjx&XKaCF z(e5PZR#7kI|B}=u=Z%!U~x?uWjz@mnSK=CcqaIFzh~BN9<~8*&>ND4 zTmrcHrdAz0fkUsC>7|Y-fnL^g${XX4rMJsJZLXPKQ=9YtzD`Rmv3>qd$#vmEG`@67 zuG_Ve^q;<3SRpli$PRH?-FYgcJzJ#bcv{}RW}B#QlH*oXTyr&G$D-1jM6!E_aAKqwc^ui$bat{&916fy-AY_ddNxe+PT8c90hCKmM?D$z4Bdi^#ICff%iynyMB> z%_i^LFl=COOB^m+`&?i-6G7S=_Q|Q|JMw z$t#;R%^QOLUhHPefh89*>HdbxMscQ~UlY68{M)uATGEQDGUlFmZQdjPV|hXw(B6FV zyVIHT)>TDE!P`Xn$Gh63MmoLp;q7!I-jad04xkM0W4bfe2@+-`lI)O z%+eJ!C8=I|=(VuMjH>A4q3(6x6`#~8r!wANWRmbva=()!>aVH>wICtg-1;=In9lg{ zX08-~{lX3Fed~G2A;Lxc$ebp2lh7}{8OJRx8k7G^ujPyE1?;B z=>&CB?Qn;N-FaGNOUBtW&AfbrmRV;8f#u8;tY4kbLha-d2ev7-)1FC?k3qCbdFdq* zydQy48EkymJ56K1Y!Ay#T=Slb_jZ2e$&X0@lWtnfLesP8zaKB+H(BBV=sAc z)_!Fc@OiRM+VKJ5ZuAo~DcCE$d!Bmz)X1=nH+v~36MR5sK()z$a_goC+n#2D)l3ol z3(Q=}LJ<4^MUH}fXV?DRR=quwF47*F-sxWr&h`2Y6%#Obcg^W5B>$&J+#g2F-S>VC N2#+Or*1D5Z{{r%#4jTXf literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_left_1.xpm b/navit/xpm/nav_left_1.xpm new file mode 100644 index 0000000..18b9a77 --- /dev/null +++ b/navit/xpm/nav_left_1.xpm @@ -0,0 +1,69 @@ +/* XPM */ +static char * turn_left_90_v2_sv_xpm[] = { +"64 64 2 1", +" c None", +". c #000000", +" . ", +" ............. . ", +" ........................ ", +" ................................. ", +" ............................... ", +" ............................ ", +" .......................... ", +" ........................ ", +" ...................... ", +" ...................... ", +" ....................... ", +" ........................ ", +" ......................... ", +" ......................... ", +" .......................... ", +" .......................... ", +" .......................... ", +" .......................... ", +" ........................... ", +" ....... ................. ", +" ...... ................ ", +" .... ................ ", +" ... .............. ", +" .. ............. ", +" .. ............. ", +" . ............ ", +" ........... ", +" ............ ", +" ........... ", +" ........... ", +" .......... ", +" .......... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... ", +" ........... "}; diff --git a/navit/xpm/nav_left_1_32.xpm b/navit/xpm/nav_left_1_32.xpm new file mode 100644 index 0000000..2c23d7e --- /dev/null +++ b/navit/xpm/nav_left_1_32.xpm @@ -0,0 +1,41 @@ +/* XPM */ +static char *noname[] = { +/* width height ncolors chars_per_pixel */ +"32 32 2 1", +/* colors */ +" c #ffffff", +". c None", +/* pixels */ +" .........................", +". ..............", +".. ...............", +"... ................", +".... .................", +"..... ...............", +"...... .............", +"....... ............", +"........ ...........", +"......... .........", +".......... .. .........", +"........... .... ........", +"............ ..... .......", +"................... .......", +"................... .......", +".................... .......", +".................... ......", +".................... ......", +".................... ......", +".................... ......", +".................... ......", +".................... ......", +".................... ......", +".................... ......", +".................... ......", +".................... ......", +".................... ......", +".................... ......", +".................... ......", +".................... ......", +".................... ......", +".................... ......" +}; diff --git a/navit/xpm/nav_left_1_bk.svg b/navit/xpm/nav_left_1_bk.svg new file mode 100644 index 0000000..dd4461a --- /dev/null +++ b/navit/xpm/nav_left_1_bk.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/navit/xpm/nav_left_1_bk_16_16.png b/navit/xpm/nav_left_1_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2767754cb26edcd17fdfd858453812734e3f8cce GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_uJzX3_ zEP9V#vgc!TlxX`nf4};I>lTd#Tz(JuqSOo6Smz3RO!0fblI0}U>bE$eb)wI~v~p?x zPpS8k_NnKq9iH7b>B=F?!(6f|iCh;Ci)LE%M{ocb`rgLgPvLP5Kh-VPCa!J)I-9}M)z4*}Q$iB}LJnYO literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_left_1_bk_32_32.png b/navit/xpm/nav_left_1_bk_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..6916bd1820c167a6d563c03a230ba551285e6956 GIT binary patch literal 394 zcmV;50d@X~P)n@ek`yVG9wDzzgWbMzji@(gTQx*+fF2ArXnh z3(zVlB`Q%O2oVHh6*C)?Yb+-2Q0y-`xw$7Z_k3s0J!kIl&oqj@zY0E#S6pEgGpJPw zP{TP|8AuD4Siy8vFij*`@V2$*w^+w424VqB2Ejvn$;O*lF!?lm*N)L!Heh&Tf^F#@ z_)JMQo?-`UUtIrVHFSRB6U_Z)z)+piaFC5h7>Nn7>|-??2J>AJtD%t#^o%pbZ)5{K zF#y6eEa3VRh@}_+q-khLcY6<}@K^xwfUy_=?WVMq^UZs2(|OyB0Z_vtCIWx60N@_= z7!XCOH>5D ox&U2(vVX#R(vwhL`(+k-1ES)AqaMT!^8f$<07*qoM6N<$f(;Cy(f|Me literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_left_1_bk_48_48.png b/navit/xpm/nav_left_1_bk_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..08bd63513df65c739e5ddb6bd52e45a73e87fa29 GIT binary patch literal 582 zcmV-M0=fN(P)a2!?(^t8ygWVu2!_NkQ2pPZ2Sg(21~)p z!ooKY{Q@4?Xl-L@bA=)zh=>x;Lpf37T`V@?mL#*A+stNiuzz?6nFr>1{>kjl?9woM z%;5y~q;8}tx6s8Zp5U@=CUZ|FkdNjVuz9^RH$1gm? zHS9~#Y>4~D6PQ_<^R_OKk2RYzd#BtxXyMzK&6dSioT;nPoq_QVo<^#12&W^>HN=jB z+#;S=ocAMM^gfqm%js{$xhm5_+t!xLGR_JAv(YIk)WOo2^Q_?mj`il;n5?aMEGqxi zKgpI#|NANyQZze?vSqY_&m+d)$u8cR;GxmY|HF?!u8UU^?E!;?mQg1#o{uF{yr4sj zT1IVLS1!=Sjp?^M%-|9Gc5nQqa)Ay`O}XD82A9#s=`fHdv1d5)#8i7IT5a<--TCt1O zAyD)so>Zscrm5NUqMzjebVf$##)LjL6iyxs?IUGw9<$hc+aBZ~_T6)k`EICS%E-Ti literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_left_1_bk_96_96.png b/navit/xpm/nav_left_1_bk_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..d567ba66b7cb5a0a038ae33f3f6d4103e9e428ec GIT binary patch literal 978 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlJ8+dW+z zLn`LHook&f5-8HJ{|A%&$KIxcN)a5>!m?DCY}~k6P;e2ON!LHN*&<2GVP)TLbqI8v z*K1qRD!?M>;^MU7gJA5(i5oUbm@3Yk`=)kYb@@5=?Wb%{TYi3PYh9dP#@w|?qia#e zhD~QHcQdcwQ+Gg#%An-BOM+>>?K^%?)aM+=RV3YxAlg}AY7 zW7?nT?=-VV_G9onn>It?4HbJ>^q8xap5HZ`bI|v|p{XA^EZW!cD4Q|w|Dfy`-ln=P z*CW;9l79rFRi4_4lm4>7)@I!AIZ3N`bOT*-J32Xi%BfJp|OTl`GowJO&_@; zL^r%sShJyH=UZED`!}rHJk$l7MQ&e^`5?2~JY?FE3vJ693Lh{Q%$@c2z^_}3deIRjxwp*g5;4WU%hUAN@PEH8O&6xFQ*?*Z2ayMjGFSx_8(cC2P z(=6dDPrh7Yo1dG}^Jvw!tM{+DuF}-5*}8C}*|R&Uhqdos_+cSkm1gigYR;xlhnDj0 z-PW;FWcivJi39H*_(vZzZG0T4b(&?inMtxm{l^T3-^n7=xxat-oS0*zb}_r<|BNk) z*USGO`X~}1yl~$W!%S!9Gx0BfNti2Lna=ul%fg5Ii~ApytIpwxjp5sJxvfuUM*P7G8!<>H2!v(A*bUC;#X@NOSFZDZvvQW*4$`;XX0L z)td8Wd{cZNY;x)W`vz6D0{|FGu-pqBadbOIf z-^MQsdbUeeGyI4Y%C}n$X}Xrw(^0%H-Do$hkP9- zKRW%iOI5mY`wmYFS=(&xpuGh@yMFghZ?+R!X}$Qy`i8*98tcBgH>@>1^YflxY`*>6 z;S>LxWxpgp^m}$yAK&)nmzRpjO74b7D>I@e-4{RQcwmb28@BvN7A1DZ`!Y$p_ofPV z$gr5mB$cvO9C-Tu<+ZBQN&=P~GYUI=_w9Qkyu@PucGaKjO`j?(cquTuruL+I$2x|> zkOl)irb+Adf3jH1iYoMQ3AnLxEM{s6WIVKjArUC4}$zt*2!D aV=!J5b5%B$_Z2XcGI+ZBxvX + + + + + + + diff --git a/navit/xpm/nav_left_1_wh_16_16.png b/navit/xpm/nav_left_1_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..47fbc743597c6a1c2a2f10b37dcb9f2be51f544c GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt@|JY5_^ zEP9V#+L+7aDB^l?KgS9NuLTU;Gqn~lRVgfG;Zi6_FmHS^fosKqje;E48jXdToFDMA zo!osZmMQK_)6ekov^p1;1>*fI+Azopr01853umAu6 literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_left_1_wh_32_32.png b/navit/xpm/nav_left_1_wh_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..9326e7b2fe2dbdd627bfe74451eb0e24dc5bd6f6 GIT binary patch literal 408 zcmV;J0cZY+P)+XN-D z;0v6srIvz~TzQI$BA%$pXW<^^;wE}acF!VzGwh%2&X){3n~3};0rSA*xRTET32+bW z0c$`M5+DL@_)=ox9k2_m27v*ZK+LcP<0s$%SO=zk0W4Fj4-+4~z+}qsS6u-Ut~rM$ zs%k7E$0Cvx%!y6xipYtG?5k?g{i6wJ{PM)tz(#2aEdWJjI5+VUnDYtI;^%I-$c#I9 z+zsh6yaTDQ}bSHl5ay z4}b{R29`2@(*p1U)JuoR0jmSI7Knz+dLy?`Rectbj^)x~5CEf|#hVEU@MiI9;|7=t z2@qR6r*BE;bG$5702M$5Pyx9937?8cKjWRbEc6LPZb$-1MsKG80000x@BwnGAt6O<)0d(33JiKd{|J zqRlU033v)zv(Ek>;7v|}-jo5R3J9dxPsv=h5U2w`&MDF6J8-wGtbJJropUWoA0qV_ zmNXe@ty4H(0hpHbvEaI!l9rR#RY^F!jWdqRDsUgjJhNrsZIq1BV$OB; zC4H4NDyh#ocYOY65dfxheCywU&D8rHVB9*pq+Dav1hz7cuLHx@`6WrfyeIr0U^gK5 z8H@jb3<2L5wF2SWEOLQAXrDmV7&U-rIRpS^O$8E(&Mo%K5wD95S~jTFb*69 z1df247oGb|aPmOF$K%*NV_&0Rcd3s>?iW|UIkzFH8TiPpnEj;qXF!q~f!bi8R){hL z4gsn?7xFeZh&cb|WNKAdbHLrpK9o UV>`an5ojNSr>mdKI;Vst0E8Mm)Bpeg literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_left_1_wh_96_96.png b/navit/xpm/nav_left_1_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..950532cada4424ce4929c0d68eb7b34c5493034e GIT binary patch literal 1155 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlITEIeHt zLn`LHox8s~)>Y*AeqkSn>lsN+UQMnWE*z?N;1<-G(s1L(3XVmZJ&RiF9cQi8*&?E& zlXJwiqs@WGFszXKBRk7tL8pKzDcx&M?pl3h&HLn!W;qe}_LV_?CFT^NF>C5(z76s}CYOdaUOtfc!0z>* zD*g{@vmYCIG4HW(YdEdJTfqMz-;P^Vqit|I(qK4UP znBtk%KU8)O`keVf&y#ynS<1eDmY&6v?6?$TPSm`sbF7k{)v|qMA%niS*ap>9lPt%e zi)JRBaoblOV_K3ZJ*i|vfS&J*tv#JSJ9&K^+yO?3H!0 zNT2JY6Ud~(X`%RXCDYC&MRAvu6ZlsgB44pcM6|8 zuzk|H2z9~Jxf>Z3TeJ^k-rT2Y0UNd=)xV5>~~qbAnsE7BtNfT zb}bt$p1!`$yrKPv?kh8%hQ$Yj9lo?Iyw0G`wg1QI1I5=$r!6}>`-897*|upae|0n6 zF6}q}D-Ne^zJE6{HotVjd%v4C&B=D` zx6a-A#aWr=eBVXp_q@`xR~@6Ie=T)A6MfAzoV8%Z)9(7UsdpGE?(KRPqoSXevE6m= zs&A_cJfkLlso;3HyQMh9@syRrrGk8qOW_j}SLQD>p44}-+0dtSkzkB`? zneol`)h~rSvl5Po%$xt+Kkh628_G~~@xf86ePwTq5A^m3#cf)5UuM?Xwt4%W{wVC< zd%S3B-~BoMZ6|YIFm1?nK9l3d8J}?^~LYM(oP588c%(w0XSmm2Ki{d-H{9m9qRjt7(sjC-Ss10MOl zek^Fe+eTBPr6BOq=1J?+YVdEKb;$(tDM851)1i;&_S1af zDZv76d6gq}b9B3#LjLZM-w=Q4J?HWr`@iLvt*l~c5%@QuME9Wxd(qRNu2rmSJ{CLW zeEsbdD^Q@R`0ZRyq{t#}rhi@?cW3H$JC!&dC~{iU-@vm*<;cBxU;&3y>`bfIum8oO zI#D3{tCjn!wuUMGc46`HUpY^?H(2T&m?6S=^?G=1Q|)n9iN{Pmg^b5`FeJw`80sC6 z5KrjgHaJF!aO{tEj^!$UFB@$Wj=%9x;*-@0Xir3! + + + + + + + diff --git a/navit/xpm/nav_left_2_bk_16_16.png b/navit/xpm/nav_left_2_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..5bb966c1ee74cd5cf07386ae8acc90a2b2173ae6 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_0JzX3_ zEPCHwwBo-U3d z5v^~p7*)s*_dZwA5TqU5sQa#Vz3Be(O?s!AHd*;@e3F&+60S! z1B;gonk-kuAc!_CCkV>9hTFjlyYpvnX5I_$18>;bm!0Rgv#_%ZilW3~PFkQT>%b*2 z0M3M6f*2Jq%DNIY@}x?<0N#KlK`$qD;-+@x)aFTj^a?{$s< zh9)nv4$!mob@S=}6S|e?TKYr+7<@N#6C1!_+fKL19H7Z-z6Trt8w@{Se#`MiU^|jm zR?LbVmB(3EU?##f%!-JRe5aTi4IqsMkVXSYqXDGR0McjxX*7T|8bBHiAdLo)CdL2y iHDJExTpxIhIoTh3ng(&NB}~!)0000s=}T;z2~;Ay=m+`_r%)gTe~ HDWM4fCc!#5 literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_left_2_bk_96_96.png b/navit/xpm/nav_left_2_bk_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..65d8c696246d29f4ad5771fc7376f6173a2b4bd3 GIT binary patch literal 850 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlJ8**#qx zLn`LHonxIX5-8CoAN#Rsy3@@=-pR=<%)i)KR6EwTZp{>pc6B@wk+oi7k;0>Rfg>V| zIue#9J!E|&;~+Ke_?D}_1dIB&Qmt( zg_XS7ydNu=xnqkDG)`bVy3BX^f>m+C-`otPWFMHNUjCioak+K_YX!Sau(=V3bffVB z@h{Z{9lONM=9O%DxM>T+KZe=N>653JbNhaQ> + + + + + + + diff --git a/navit/xpm/nav_left_2_wh_16_16.png b/navit/xpm/nav_left_2_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..42501530c9ad14f6b3a54e9e67064048c809af41 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`3JzX3_ zEPCHg+{?-2DByO#Lv=<+f)3ZV1skU&c$yV*BqecfOMJsGA+ciO#0SQLF;DhbGaJVn zaa(V`FD+Krcq_;{v?|-OS#ks8uKQ|fuLAe3jNZEZ+A5y&S0-0|Kl&@O{MCw_);&{x zZQj!iYpoZiL@u3tMa`7bTWgdtDnm{r-UW|>~ml5 literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_left_2_wh_32_32.png b/navit/xpm/nav_left_2_wh_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..65d48ad90cee00f7b531dc61840a1d621eb5187b GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$qWpPe4Z|j zArY-_uh@GrJ4&>Dd~Pgw#P5P%v}jH)tF^XvHFMm7)f{mSIaB8-B&g1F6cByGa`c?q z$BifST2h5eKk+BtOPenFt-9V?huiYMYF4mq*!rteD@E*YoS(hRs{fG@`)0j&d@=dU zBKItrw@QENqk}OkbxZwY=Y)LRVE#{2{#ENPJG}?{ByRjpEi_&KDlhB*p@?5~*BZ9% zn!|O2G3r3^#&1&%(wQxMm|R@UmGm0dGJP^(y2NW_azrYf_M o0vIir`6Gt?$C@>Fm+|~!Q~GP>c2+^a4j5Jpp00i_>zopr0L68S+yDRo literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_left_2_wh_48_48.png b/navit/xpm/nav_left_2_wh_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..2bac4238a683980b04cfcc4edb1d60434990b7db GIT binary patch literal 464 zcmV;>0WbcEP)2;GmOB7Z(d+HYWu^(c_?j*f#A=n&hu=&(`GU-g6p~luCg>pb&rsYlmC_8^Ag6 z37lH{crzd#)3)}SNQyW>1gu#5r7}i5rfKas5)W~JjoIp?B+9R0}njVI}+9KQh$fZD8z$J|Xge+#UY8St7@Jm%VC<_Tz& z;a}5;`yeCp9y4`GXTY?34N;S{EvYT(E9V+Zo^v~rc607A8S>u?&lzTqOAAPZtO6&% zho{sh@Cdwl%wCipkO;~AA_E#gZ_He`vVe>soy2^1rUEjAG-o;>W=u!~)T<82{F-;p z^_+7pNt^on_+8e|Bl&-kxFUzYpDVorbJH&1oa;$y72uMKa(^jSKnSoV1XvRStO)_u zgaB(ofHfh&nh;=32(TsuSX21_^}xEM#gx-8&bj*{_xlFPSO6~xx%~hD0000s>g4)Qt#h_F2GUcfRn!;w3y@CwIP4TnX1vVUBT9c?@wV>UZSjoUnHX&4LF)-d-3 z=35pHcdvdvw}wxj`2wTx1qSU4^*a6h-B#|*44O-MepvooT^-O?cjO@J>Gk?f56YP$M?qCaZbAh_0Ni}acZ)6Xw49n;*wHaq^dG2^wMOHj{i>06FNHL zTs2h8Ch~HBZ4X)c`tB(~08;ybC# zJL>tlOInkbsm4zI5^4Khv;3hderKopy$Q|Jm$*-|diO^-yXBzw-stmr z-z|NX2(s^A^0B^5EIi}Gq$^XmoUXMKUi{#}^gG4#FT1Qr_~7lg>-^co2jz!WeVdyt zK4W5u)DONh%1vf_g*m}(C%kRc6_WS4kADDjNsbIL%-|=&naYabQYDw4dOUa(< zD!B#cR|rX+KluN2wdZt|wdLp6aIF2a@qchrWS!I5vCjI$0xOgB9}LSII(G>+f@8^xy)QE-X+BuCWa~SH z<`)drjoAmpi>FO0V>*6Uk?mq#fb)agg^&Hj zt#jcBxyi&oW&q_-n{zWlzsyWtrl2&o-{Pb>X+U=$%=7D_Z%Vy2mwW zMYu4mz1^X`tubsx$K5~hp<;%tG2y}H^8W&UOZ{kYJ;U6t{3v?uL!O-KAGLOD_ELi9ZBM>R{jcQW zQq$G3`hd<}?MHboHm1i{^}dasRNvjf`e2c@``tI;4!2Vo(;^!p#S*5m&Y&0b=8Zq= oJ4ElWxBcC2>hHzo$@@h*PEX`;cG68pU`}H2boFyt=akR{087`CO#lD@ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_left_3_bk.svg b/navit/xpm/nav_left_3_bk.svg new file mode 100644 index 0000000..4aa70dd --- /dev/null +++ b/navit/xpm/nav_left_3_bk.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/navit/xpm/nav_left_3_bk_16_16.png b/navit/xpm/nav_left_3_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b071472542b5ccdf0f30bc0bbacdde0a51d18f70 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^TJzX3_ zEPC&rx6N`26k&Owf4=<@)0WdpLQP*+t8k`>>nWygOB6i87nH)BG*^v#LtyYz{*6MM zEWV$amS6bYWcKJlYvQ|^mc=@P&iwQWZz6_DIeOW#o@YlIZC^ zaDMfx{nMJ|D-IjyIXRTiwmj^*;)a{7@|?Dv^K%(3t1?(~d$nuWbEjH8XVDNPHb6Mw< G&;$TE-DW-j literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_left_3_bk_32_32.png b/navit/xpm/nav_left_3_bk_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..ae56ccfaf4d68415be41256df3f385f78e98728d GIT binary patch literal 446 zcmV;v0YUzWP)`weKU z2?>dbU`r(-7LNjJHC9R?1sbp*k;tD%G4sM?Gmqfz6ASkwlbPJTbIzH&cZL=%TKpLv zVI4;}#Wo%fQlP+RJgdYW`Dm&yCx#6Vj9947HfXv#Nu zkjXi#W1!T({3(h!PsOp7$*KJd7W6NFHzEFl7kKEpFB+p1PJiM0l-)QF2@ld5Ht-?Y z*Z9t-2A)Roo{1xD3eWL7`HmkLN{r!HIOPU*{*j03=A+tbN~PV07*qoM6N<$f`;qCt^fc4 literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_left_3_bk_48_48.png b/navit/xpm/nav_left_3_bk_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..8eb154c126944cdfe331fbeb20fc1d86bcf0c407 GIT binary patch literal 606 zcmV-k0-^nhP)v++SwR`qOBSbu@ez3f@M&*(3k}A1>IyVW|y5TGqbzdnT!kffde~p&b{Y<_MSU; zhCm7zX$L2Ccb4i$`+mEZX)rm4&Q#%QUrFhMQmCF?M5+YkcoWfzdv zJ}vu+PdWbU;=S@9CuXK-!6O~lr*mRAHse2c++W58Tx$OQTbQ~&NgiH#wxHckb)4;( zXDVmxyD|%y=s|qT>f-16xs-Vx=Zt$@wCH3Do#|uTdTbG&uD3BRUO^bk8CP0+_1Zpp zwj|!<(>XCOiWc5lfpP3CV6NTb)yZOMz#OSb>92jVSj0WuU%v}y4D(jkHZ|PDLG6D& zuZ5pE5=DLxhtVzHegDlj3jP%1+ok zBJ4_B&uNQ(?mrcsB*HcE9(X7gU9VJ8pG4BXd54D1x6z>^6i_vxfT{@vR81(LYC-{3 s6AGxBp)X)v33Kkn<_zC=d?+&6KO1`@eGM?d6#xJL07*qoM6N<$g2}TL`v3p{ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_left_3_bk_8_8.png b/navit/xpm/nav_left_3_bk_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..ca7353eb4a485c72676ede6fbe46a6aae80dce19 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt@$o-U3d z5>tE6ZscqZkZ^t2-!7?;^ibj8xxgTchU^_}**jc4v@IILUMic3^~-bTms_@1@0_Wg z^+iKD#~|@=pJF?!)t(PW`9t+ownP{_?st!=cwGF=@ZWNtxMdu*y@wcgzv21!PU&VK P&@Ki~S3j3^P6Wi^zsg*83&+Aqi9Rwejv_rbS;e{RX3XeVe}w(m)Y%DUin~tO3o+$| z1eoiwDenuItTSoB18yf4b3Ku%EV8XL1muk$r^H;zef#Ch?p43P?EP6=AXdEF@9N6W zud8?M-u0|Wz==b#1&LUEhU+y$Q3U@RmSv6BjnNIJ2ZTPzeh@8Sv9SB$!}6%?f$9S# zy^X2gct3P_E;+X5;M}RJnZ9o4tl*7U67}eEnM8!F#%J4O>a^RN_CE2iaBsZN7UQ(bt1c(n$!Aw?*tLw`B?mXQ7uoG+v|!CyZRn>_ zCf##W>hS@apXs;1>xdV3{hu$c^Csd1OGI!;UDEBD8TH0_XOC(9^gfW^Se)Q>?XLeV zJBclOMa#7_X8yU6$2E_W`P3=@OWzpMwYR-JRJA`qJTznT>{r~e>o2eWIz#g{!>JWT z;vps9C##iwN^kVH{iE*0dPyvmsfYRd^*5j2w{2Wv$(qA@@AHe~`NQ4{n?JnOlu{z+klke{By`?X>i_!#Dgf7p2}d5^tqjkTh8L*awQX~$!E_b~2h zj&{|xI(^*c*v=;pZ*xX6Z3(Q~6v1f2R?|_vzDACd9mnENMcb!@d3~Nx_=zPe$`971Hzv!*WwO|HaefYZcnFf zCZon=)Ued&gW+W$&N{^_T8HXCBXGsN>td{Dt@Jf?KMQ@w%ta z+vH7t&+|d=!|p_#xkB6qj(^SL_r+}W^cUjZ(4BWJX37_ljSRWdr3d?F*>&%*wKhHw{le$F(xO|3!;N0L z7yK@DVdxUuHRTImM?vZDT?g-bRULOZAba5O4%@lzftRdRna(}@mc+$ewZAy$%0z}^ z9t_DU4TeGoBsdd#SPa~lB$OF@$QPa;uk^C(@s9ahbDGY-_v>EWSkL%sR%FY}I4K`s PLBrtb>gTe~DWM4f^;j0B literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_left_3_wh.svg b/navit/xpm/nav_left_3_wh.svg new file mode 100644 index 0000000..5296827 --- /dev/null +++ b/navit/xpm/nav_left_3_wh.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/navit/xpm/nav_left_3_wh_16_16.png b/navit/xpm/nav_left_3_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..af29d5c91935ef71515194a4e3d4aea93569d279 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_qJzX3_ zEPC%wF!XZ@6mUKNfZuC<$(jRP$!juw4v21Gn3izTOvmRABdfH*7ZIHXH=WKS0g}l{ z7G@J{gzmR{IPbZ7cF)e|XLL!CtNQmVV}dDSLDqpC9?Z ZN}hdpPqCgDzb4RI44$rjF6*2Ung9_tajgIV literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_left_3_wh_32_32.png b/navit/xpm/nav_left_3_wh_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..8a4eb772b3526f396a719748e75349e24ae21280 GIT binary patch literal 462 zcmV;<0WtoGP)x!<2V%?JR9^49w7J#&8&ogl9i4V65kOSV_IsgWM!$|%O zkOh`KwfbWNND3T4N9213ICASNV9Lz$d~_(PH&3iN0BYMG)dX+}%$eDVi*vQm7UzD)I$ za(>uGvAGGn^Hgza0hI-vG>!aQGh<+-poqB zWm*GZX19M~Tv4N^mjEOH3BdmVNX6W@13X4z`8b8%0fVM6^Id_`fdBvi07*qoM6N<$ Ef@Sc^i~s-t literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_left_3_wh_48_48.png b/navit/xpm/nav_left_3_wh_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..f98d36c2834b6846d9b999b442cb12255b514332 GIT binary patch literal 671 zcmV;Q0$}}#P)3m%Njb=9SL8qdyw7GcP7?+6g@*WJLRq+`G%pvb>?pukust{vu_I~6HX~g&pH0~zfTXN+(qmZINH;DVXmiscMvj4$0> z{2`tMMstiAAr$@vm@>0_iFhMp?DyW}btm3JuH7e%b--3&TGAa!6VVDn#VY`Gy!-S^ zQ_?$0&oXkJm#w|M0u$tGpKf!F5w1=e&4M+YMWMI$Nn-_=!F@RXHHIV&lf8Xr@d3C2 z90o?s>^$(TEOB`V2oJAqJ&aidW~1vxwD;FW0G!E@_lfXD?g8+`%u3%5`z0X#@cKw7 zdKQ>7vr13cyacR$KUwCF=%@dx=r{pzjqn+GNGSSey^?w(Ftd(t-a*3kMK(})19jsK z)QvY#H{L+qcms9g4b;uR8?dq`l(Yxfk`i7uvo~ed`vpZCFM}cW;k5t&002ovPDHLk FV1ig)F~|S_ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_left_3_wh_8_8.png b/navit/xpm/nav_left_3_wh_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..fb5af8e9d7d30700d42d6fd7e4ab73496b1ba865 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`Ho-U3d z5>tEo4ssrH5OKM$m(9p27u4}2P17>M;g*MV=3%|2@Pk~BPVTnT=Q`c)@XTyaVp>A~ z6}Pun0&|t$TwVPu#Qs&tXQr42;R5Ek0~`5L9`M*SSbt#S+nDH~sk?ut<-gPQJC+Ll ckz$U2e@yFH|HqKkKx-L1UHx3vIVCg!0LH*WkpKVy literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_left_3_wh_96_96.png b/navit/xpm/nav_left_3_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..e44d6414943fe9a0bb2dd3784814ec19853c8e88 GIT binary patch literal 1257 zcmbW1|2xwO0LMR{CEH=fb@C-dO>q@=ooqK@GuB7a>QOjkjnqP|*xcB$)OAr#Hu)AN zO&VFHv`UPz&nQ$N=BO4nE(KQgm#ej zE}Qzb2;*hGDM`aF%b2#4OacsFQ`KI}2LPi=h(rkcrF{COJkepFO~>cioMsU0eMTWV;)ASFagctzW;cWe;Jb1rgMjy=_Z%p!I#OYs-l%VT7cZ zh=98rFiWi^8B@%1d|HB{+voY5)_=A4*75FAwN(99vC|zpUY?@B{fFkFl~Z7Rfdm|c ze>7$R!(7N;HZLod`7nMw<5Yh_jN^&BSf4%7p#d zs{~)Fg-qs!8Z|m*)1*}YN0tjcg%rDrS6Q5T@697rMwBwXVsQxKnb)v%zvV6^6{QN# z=B)j4bYyYZjhBFK5VF#*5dEYs71!A+_{?$I7@nZy+v0WXPTxv7;&!NC@Xup?_9eVj zY~1hp)=AO>%1y{n-K~zxmFEYbA@t;|CEjQIwdukSH|N>G4ws5H1mDQ;@ca-rF28CA zm4Uu!oapFNcgS1P(%#i&^ogQq#NWwuqnk3!2KOaUyl_Wu$rE;z6-mld{xUex*Yzjt zH&l8=U};{lhrZhmGl#Jcm%RWo;2!AYmA=MJ;f|4Qm(7}EB6ZoSq6Q- zH#@gbaO&Ph1Nsx4w783j6uPy7g|2=N^>x1G2CVT%qtWvdadEri=-n;rt3tH4EjAj_ z5JSPX9b84kf;zk29`;(_B3{cc9Kv{yJdHkzDe#v4 zAjnj`G~ra-;S>l*vpi|qzt1J7sYLk)OTj)$rt%nCTI2y+3_!5SPzW$SZAl?(p<%>k zWV;?YxQ3{S50NTfe73m?yI!voB9B>#fu1uKxw?Y;Xj(>AkRAs~sJ&ZEGJ0ba!pnAV6tCLe$^SOR77*5@j zsR{wZBT?1RIBbHVwQVvpt43IB20PNI(+I~Wyuva$O4ASEJY}~w z(gl}TvEqFIVq@Y&ihK%0ktOqK=|V?FROhyObkE0b@VFMgJv5)TG4>(fcP#5bN59i7 zv3Pg7X}ZkqRii#pFjw>sck0vCTdFGMur@&QuoMjFdexVl&l0!?Ox&e z9<)&d7udiPA0Y03&#TqD(8;*qe`d||w4?MiXAPW1e-?o7N!q&nT>umqN)i*P+5Z9? CAzC~D literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_1.xpm b/navit/xpm/nav_right_1.xpm new file mode 100644 index 0000000..bcf1627 --- /dev/null +++ b/navit/xpm/nav_right_1.xpm @@ -0,0 +1,69 @@ +/* XPM */ +static char * turn_right_90_v2_sv_xpm[] = { +"64 64 2 1", +" c None", +". c #000000", +" .. ", +" ............... ", +" ......................... ", +" ................................. ", +" ............................... ", +" ............................ ", +" .......................... ", +" ........................ ", +" ...................... ", +" ....................... ", +" ....................... ", +" ........................ ", +" ......................... ", +" ......................... ", +" .......................... ", +" .......................... ", +" .......................... ", +" ........................... ", +" ........................... ", +" ................. ....... ", +" ................ ...... ", +" ............... ..... ", +" ............... ... ", +" ............. ... ", +" ............. .. ", +" ............ . ", +" ........... ", +" ............ ", +" ........... ", +" ........... ", +" .......... ", +" .......... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +".......... ", +".......... ", +".......... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... ", +"........... "}; diff --git a/navit/xpm/nav_right_1_32.xpm b/navit/xpm/nav_right_1_32.xpm new file mode 100644 index 0000000..2277040 --- /dev/null +++ b/navit/xpm/nav_right_1_32.xpm @@ -0,0 +1,41 @@ +/* XPM */ +static char *noname[] = { +/* width height ncolors chars_per_pixel */ +"32 32 2 1", +/* colors */ +" c #ffffff", +". c None", +/* pixels */ +".................. .......", +"........ ........", +"........ .........", +".......... ..........", +".......... ...........", +"........ ............", +"....... .............", +"..... ..............", +".... ...............", +"... ................", +".. .. .................", +". .... ..................", +". ..... ...................", +". .........................", +" ..........................", +" ..........................", +" ..........................", +" ..........................", +" ..........................", +" ...........................", +" ...........................", +" ..........................", +" ..........................", +" ..........................", +" ..........................", +" ..........................", +" ..........................", +" ..........................", +" ..........................", +" ..........................", +" ..........................", +" .........................." +}; diff --git a/navit/xpm/nav_right_1_bk.svg b/navit/xpm/nav_right_1_bk.svg new file mode 100644 index 0000000..aa069a6 --- /dev/null +++ b/navit/xpm/nav_right_1_bk.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/navit/xpm/nav_right_1_bk_16_16.png b/navit/xpm/nav_right_1_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..856bd48aa4ddef917446da0ef9e822ccaf8e9343 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^jJzX3_ zEP9V#vgLDh6gm1)zOw9qn2A;rXO#5@*4F_Uq9NB71m0{=)o`sb^XhC%Qwjc1^jS)M z<{95-^ZxHVDZ6TQ;L$5bdDMLtX*#bdIKaEUe*qoL;OXk;vd$@?2>^1{VKD#z literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_1_bk_32_32.png b/navit/xpm/nav_right_1_bk_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..84b8dbf9142917359d5f5131ffb0d5ecff3427db GIT binary patch literal 378 zcmV-=0fqjFP);xMP7|=q4x*Ln#B5ZaQH<`6C2ZrGsX3qP~$6@$q(Zq7q&<56Vj2*het>1yi2aQ*1=J-|y&xH^ zC<_>h7$>+GlUW#>xbwXOYoXvvxJe;b1@Nwb)8EO!t}}Ur!w~Qq&J@4+Lty)N3*bF$ z3vB-i`Z@5v

2r?nvV=UE?PYv|0m0G|)E@R}oFKXYymx5oc(Mxvbqf57~28J%=P)kuGm+A#KWJV2>wWIS8{M5~6mrw2ZVp;22|9R( zW#zxXVhXWYc45hSam$KN-?k|zcedh*e39SqH^+B7f!-lnc%VE@R&&~ur_V*B?KJ1{ zIn(x0;`BKze`N>lQt$bznf4ns>m6bSPnCOhM`V zSh4u$*dFNjq36Fo0AT><@sc8a8&4v$PQw3x07rwNDA9xXSvi~`B`qdHIe_{Xt N002ovPDHLkV1fy75d;7L literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_1_bk_8_8.png b/navit/xpm/nav_right_1_bk_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..06a8c694b11861e28f92483b292ae534dfffe187 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`Po-U3d z5>s=}8uB>=2)JGp7Ln@BjqGuGb5w0j^C>+Qu3nerm;N+8R14lSb9Uv<`mB;0j}{*4 zG4-9w`tV2#v-c@|shAfR|CRDf%TB7~VJ9FS^KbNW*~Bh9#`=t6w%lHOpfy(?ZYpxzo+90!?>Icpuj& z5SqcjH+fCX{}U#Q7(A+$x^GQQQ29UMZ@SD5wlm4oKHMu)f4*byv1eZW+0TpTHn#8B zb!l-F_l=pieQcCYFUkJdsknYg`S#6~K5I^RsM!Aaq&)LW!fF4&NpdMaXCAsc>0+pH z-47{)`Q?cft{=;a{7P9}gg?WRRxVbhjB z5k-@qoZLKh!Rq;P>k{T2DcAg!@w0P*-!Ieu>!k>#hHaH!yFT{9$J18p-uW)Dp;e zXiBWZ!;g**D}l@v42dBP23ighq6$4+0&c7vi@_?$7v}%Z`o!*odFp+2J?22K6ZWer Wm13*EWD5f`Dubu1pUXO@geCy9^u53U literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_1_wh.svg b/navit/xpm/nav_right_1_wh.svg new file mode 100644 index 0000000..8edb0e2 --- /dev/null +++ b/navit/xpm/nav_right_1_wh.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/navit/xpm/nav_right_1_wh_16_16.png b/navit/xpm/nav_right_1_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..5da8861758d0df1d69c216bfa4164be3402d341a GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_uJzX3_ zEP9V#THEUsDA4xsFq>6E^nnEmQyP{w=QdgiM6hUN9axZ&;O&rS_9wPk<)95mpT+D0 zXP?aadqpMvUb))L$w7w~TxO9}y85}Sb4q9e08pN0P5=M^ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_1_wh_32_32.png b/navit/xpm/nav_right_1_wh_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..84786e44407b900546e2965e471dc39401a87770 GIT binary patch literal 392 zcmV;30eAk1P)hx`ya8k$?8;kP;4lT;0KI}8 zzbB0!*qs0$0^3RB2im|`fscWXOXuFzlEkk?p95RpdQM$E-p|JkZUH03z`obF2iyR) z*ao@^`~g^+byn!XXe+hM7&9u%Kuf6&LI#BzXezb0G7T*LwE^u^2i11tfb=yIo6?nDf6WdJQnQ#qP^9=fK0phY1|9=D zxVaWvuOtZ=0&W7Uz;1=;9`AwvVq1-+5HKWZR^9ZNlr(t2CRU6wzq|``Q5fm3HAlLP ztBs1!3@jf}bdNT0($+`lb#={CJ5P-<`?f&nIq*!AWR;F4NGl#H4Qe{0yb761o$2rAC_U|Ci|lEY=VYa0}Qjy!%*{KB2`= zI7T+l?X3L0!uy9Y#rFd*Yly#}t8=9gi2waf#&!tty7h}vDpZ)y?tvSC*Bf&Bf00000 LNkvXXu0mjfrVSfb literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_1_wh_8_8.png b/navit/xpm/nav_right_1_wh_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..8a286bfbab5e9c8476cfcadae5ef737f4d7f94ca GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^Bo-U3d z5>sn?H}WI~(Tn^ Vc)hheynyyGc)I$ztaD0e0sySYKK1|r literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_1_wh_96_96.png b/navit/xpm/nav_right_1_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..c1b8cb841d4956a80e606f7a428e391ba0d280e9 GIT binary patch literal 1149 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlITj67W& zLn`LHonzZ08Y*)9zqnaKQ+&d~wvJB4z@&5z-PX>v z6xyx7wPCvI35}P^TGQoMy8Aa2UOK)qrf$g@))I}Ek3;nAgN~_kL`*0N$(+`+G9oCj zPV0Tc^(_)Uw`-Q?sm4#*w`y{YWjoR^<3Zok8R%MFRPZ^o%GGKDs!sys@S?JZh?mD z4Z#Qg&N_a=cSXq;8;^#+2i{I&os%gQe{S`HnGE_KR!W)8OX^ksUcM9(S9gkGc7wck z`75Ol&X0E23szkFRb|b(f$_&PL(XWnb!s9PcKrDwl)z^Zt611C95TIp?fRX;49Bxn z^uwCg*BxWD%b9RwzA{V2Pf13Z1wUu~f8X}^UU#qc>&*)U5Ab=$ua3wwdphsc+;wJF zzcnZSwPU!U_0s#OYW%ADEwzSbKZBkzHIz>B^YHpA^k%PA?&O?(o5U1e&R8d_i~ zv-H({{yn_(BfBAf`Ii0OA8#HuV7%u!<4=F1`?Nhy7;x&IF?kzuisytq9(KC!ArhUJJ2WA0wwxjjHZ!HeJhHfcmDu`?PP>Zx}x zQvId(pbjc9`{=oM4emP_l4BYSYsD{A771L)1~T;yNQfu&a2p(Bm3Yk5Q^qJnJU q$%ofB#7y`Se|TSb5Zj|K6WFa^dIt)YyYK + + + + + + + diff --git a/navit/xpm/nav_right_2_bk_16_16.png b/navit/xpm/nav_right_2_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ec8e8c40e144c785e88cf04f995aeb7a9c1de153 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`BJzX3_ zEPCHwwB=$l6li;ReEzXhr<`)$*tYDIJ7HbH>3HOrb_HK_>cK-!YjQ+lX0rsnVGBEW zYWv9+gZDMgKLl%g_6eT(aNw12ptSIu4@Z`EX7n+s@;%h~cu4eh-m=OD*{X;4R(gh? zHkrAD$Mew>-x$T|3#MKv=h=9a>G_Wd!b@Zf{iKy|$_jO@dZyMC^{?rV`MnMPue|OZ X_LcooxS?Vv(1{G5u6{1-oD!M<8Twuh literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_2_bk_32_32.png b/navit/xpm/nav_right_2_bk_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..89556b2e7afec7bd771427b324ba66cdd7b60021 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v}~ho-U3d z5v^~p8hSB1O0+#}cR5(WzJ8*Uz-<|YZB;D(3M%FsJyp%NaV&APRZdpD`wzjW~5p+ADPJWXf%mxyGr3fSl{hbuB% z-x0wY(|SO9*Z(0IzhcH+H(xOK?5g_|D-so2fiP0@KBriUGiCfL!yKmb6=z2hP87R3$`Dy{=i!!wBUr* z2PdToQy;jL{nQp%;^DK;#XyN&guBDl>R$4{OUz{rbya&g-!QH|^nHDUqQOVObsZcQ zOvj#l{}6oeZy3*7#)4qM7u%K{xa9KdPrTOWQ>D(0YtAU~KU97&CuQ&Yq|}4k_MCZG z`^5G~#Nv0C+Ad`FDy+}tnpddF@rli5d85if`v&7lORrlOdQPxTP+t2yMftPiOb4Ac z%d4hL;MnrZAYApr;-|-7YBdV-HS6!1Xp+cR!zg}$vta#%g(4?qUhK*`b3D-L(4DL8 zTUh2KGToZdV5YX9mop<7g~_7-;PL-oVjIFfAy85}S Ib4q9e0J&?pZU6uP literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_2_bk_8_8.png b/navit/xpm/nav_right_2_bk_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..8d5c1301b3f6f2c28790aed076948f0573000c24 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_ko-U3d z5>s=}?&Wo0kZ5_RUbpD#?ZaF>3396gU-B&6#5gg-<448r(|dP5_U`&4sU+$)Wk%A? z#KS$z#X>D?%v@hqY@XlEs$15Q literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_2_bk_96_96.png b/navit/xpm/nav_right_2_bk_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..20c3d079e513a8f57b6cab35e7d0d27ea7816184 GIT binary patch literal 785 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlJ8j(NH` zhE&XXduMN!NFYPoL-WXq8WAgfMYvU6RbKGk&|uLiX5BPRY?`C)l%sk{Ya=vnRB(z- zay!B;;Iha}X<6Ww!a$M#U7M3SCa2V$JF`9g{PzPBL{1u5zJGUfrtxk@V=&k}=gSrL z3me-Ha6XXy;98?|(~|d(T<-iv(FY5@bQl%MRGi+=z;|(>?E$O*{QI0sGB|%6{3a-~ zDE0IknFESZCcHMwYFOGc4l+GmrqrHs(RLMkK}W~4#`r7!4+I3)T+(T9Ho2ni*Kka6 znbcp&%omLA4ao;|42*wOO)W?hxh$}Q^$v@j%e``=w8r8CwF$gG{O-8#UcQW}n)C80 z;aU3+Sh=toA4q+m{OjO3y(3B=r2ak#ySb0Cyun$w$31;nL-qmxFU+&<8YfBZ=&oZ( z&V60jzP$GOMgFKax{~Rh)weY71nm^K&AUe-#>aP3%CZG^$saO$cc^|>`or;e!OD zLqfTnzWa2e1^+}oaP44_xwqwfU30D99hv=;8NafpZ8&Oo{Mob=uHb;2&j)6<{q8Wk z`a~jO=CAEZi_d@D$r_<>XWg1rTg9)>VfxZ=JLGqO*XwjsOV%AsbF_YLo;%m?nNULK z+VdS|um0HBwKJ$Uvgg=;J)yUth@)WQ2hEvEpR}*bFp21zpJ4yD{zkUq;|$gc`(Je& zcNqGFu04JF+SJm9IZo)Fw3T~AhqPCJ+GH6fhYIH_#a|soP9}0mW%DUKV@RSoG40TP ntq9hA*Z$mHZpeQ`?Sj0ms8?i7$wy#{W?=Ai^>bP0l+XkK^`1|o literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_2_wh.svg b/navit/xpm/nav_right_2_wh.svg new file mode 100644 index 0000000..7cf15a1 --- /dev/null +++ b/navit/xpm/nav_right_2_wh.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/navit/xpm/nav_right_2_wh_16_16.png b/navit/xpm/nav_right_2_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..1976ed3eae1f5e88f9cc743f2605890c4ad40c62 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_OJY5_^ zEPCHgG~{D+6lvQZD>c^9&?>rs5)CiWYMJwKSausRdyeCTl6VZ z-}v*s|9g4UG*bkN#E5o?9%h^Tv=?D?>5W&09VFS z_ufhAnL4!+Dt@0myPmjibb89-Aao^t0k=-0=OmTikCfCnZZiGd@bNF-`jphOr7Tnb juzt+9VSK$n?Ic$qzJvu4V9a^>bP0l+XkKW}aYa literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_2_wh_32_32.png b/navit/xpm/nav_right_2_wh_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..82595482f5f3121b352e3d67baf18e1889dd9a92 GIT binary patch literal 360 zcmV-u0hj)XP)e4I!cMTURy=@(AT|~OORdcjJcFLW0|X(J zmDYkYh3^iSSIl@twPg zh^S4!GJX;DQtcN4{jrFs4Ru3psV9CXFV;tOU!AEdcu8%mFBPFx)He}zO??_N_@{~7 zW|84@z$vg0-9bT=0I&@#Mx1*s)-KQjR;MEcRw`=Gz!fkLY*hqjzyojybV3L@#805= z@f?K^c7O(umxAH5;x)No4{tN)CCSGbv#I&0<%D;*x&yaJPHAT3*c;+ z;86(lLI}HmJrw&0Ya|-$3yV zL`Wy7jfFN=g5V2i5ES!SL=p9p+e`K`9_-id-0pm{v$qE)B@&55QGh+*2w3sXr7%Dn zc%{#KL6S!Gs%<)+H@UYDj8I+LSaMIK`Qy zT{F8XCBZC!8n6Rg4yf>bz%KZ-7O(_d#z#-5qCFx%RogseGf)g*}4CDf|ByD62mEYreZ#!Z}ynRR2$cUmL<&&7=ALdyO`^J0G{VmD^*GXfB*mh07*qoM6N<$g53nX AHvj+t literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_2_wh_8_8.png b/navit/xpm/nav_right_2_wh_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..3294ed1c9de4e786899cd14135f908d3815b1f3f GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^}o-U3d z5>re2P768&2(bMAIYmN6iPcGfFmEU;u+*54mWOb*;@ zUM(>*v|ZIc>#FzJkIwu$4$Nm9!fQiv4onEL`fnC<{v&^dX4o6S9gK?e)s4O#?wAI& OiNVv=&t;ucLK6VXS~^+) literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_2_wh_96_96.png b/navit/xpm/nav_right_2_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..c37e4134446d14d52c9a0351bef33a35cefc975d GIT binary patch literal 852 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlJ8IXzt* zLn`LHy|X_*G*#yK$M3-x7_@hV9BxQFFhN31Ts%a`JuRtYm!*YJLBob?7S27L%KsVt zbdG(H7Z6HSbmO@w!9Ghu=*ig&i`=^Q?tOme_ul7o&Sz&{{x;99_TG1!=ixyeP%trQ zf2jGD@YTnSEMIB<|7f5%&7(H>@5$$?M;5JQzxvzSr_M>IyUMM0k9SK;gv!@HJd8p~ zfmckw?zVOD=-9VXeNL{XSBGoh{+Y@SPG4MY*V(-kP*mI%lwZa(K_GU8{8y0$#U0x^ z>C1HLBj9HstIeK$8YD1VcnOr_OID#ZZ~mRac|ABcS*_krcd4AC93dp}*# zmeu=NA7URG|Np#M__M|{0^b_+)@{GG?(K)K{MEPWo|pf*!EEDh%eUutq48c_)5+Wn zbJG7^et+-!4^P$re}?DJDqbGqTQ`~W!L`Fbv){a(mGm&(bTTJH4c{K)$LIClmJ|sw zUNO$G^}ccT()q{k@(#7!JI?*rw@nofSj^8*!zNR6@cXItG0O!Kmfz-mD*XRUfZU0a zjf{VG{r$O_UC}){TYQzeyxIo#E!XM-`Ztt@e~rt|-CX7K-|QCy!`iLx2j0Fae3QcE zeZkASA&E0Uhp|i5VIzyiG=`%>3nG|AXe8+TBb?Q|(f)bO+qHJ=Ldsu6M6=s&*a>v~ Q2WArnPgg&ebxsLQ046$r-T(jq literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_3_bk.svg b/navit/xpm/nav_right_3_bk.svg new file mode 100644 index 0000000..4c74238 --- /dev/null +++ b/navit/xpm/nav_right_3_bk.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/navit/xpm/nav_right_3_bk_16_16.png b/navit/xpm/nav_right_3_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0c07af4f5a54bafcd35e0245b3e35605b723c9ee GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^TJzX3_ zEPC%=u+4Hx6li^TJU*cM_Lh}8e_rOYaGJeS$UYGlw3GR|fJgRXX#vBRCIWe)IyzfU zh{P}ao+WysvGH)@XCvc3)wU0rrS~k5sbpWes7P4S@8p@lP6S-5Rt>Bp|z zIiEw%D#u*VVyl{QkK1GG5u^8=<}cqfR@$HVFzrXT74!Ok8pSXA^(=s%VDNPHb6Mw< G&;$UxH)<*X literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_3_bk_32_32.png b/navit/xpm/nav_right_3_bk_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..f4d1488f3dcaac28095310e5cca21ffd97e91018 GIT binary patch literal 448 zcmV;x0YCnUP)zQYu>i0pYrI7Y9e7 z>n+_oITdtq?Vlh*p)TTDaT5`0Emu307P&thPJ$suTW;cY$pbIpym^!7dpPgO36&~U zDyB(n<1fy!iRZmCpT=)=GSS3G3}osju!6p_0CscC)3JlWRQ=~TKU;?RvwxT;aey&A zz;T>gD+6HhKLI*8#M{*PC!(SN?{bXxg=Wly_#yO0GJc)Bs9TcJoZLFzppnV%;gPH6 zYok^apnXH`D`s$#GJlz=i-aYNiU3^X~1&j(MVCyn=@%0?c9xFYp+xTb@sr z;Y*kP>aI6hBPVxToFXc`9a37uINl3ek1*5D4fP|KDHDLO{&hTwVLsp}zL(5AQ5&_g z0rFs;Vh*2#1B=if5f<(eAW=&=F_(q!!8|tb3q!pC$ii%4N$7!*UIV1n#MylUpoCMY q0;m8gfTHU5e_#uLGP#{@UUUi1<9&8TH$|TS0000f~ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_3_bk_48_48.png b/navit/xpm/nav_right_3_bk_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..e98f9c8bd42b862d860cd6b3d35565580a5506d5 GIT binary patch literal 602 zcmV-g0;TNa5l^Wx&O@d&#kbq?VMrqL)@ z@_O#*PyA}kVt2bYTg@IQ&!diINhk=F2^$#j&qh2ew8jpqE zzLhg(UTC9Oeq9@llxFVd+S=tzre@dS#N7@>%#aC~7!`KU0>E__C*N&w;{82I?jmsGDSs2xD+)O<2(&)TH< z4l%!VA~g4j*T|~N!o&2N6#k9e+J(jh3Mz*rx^-F?3X=svh1yX?(QwV;ez2Zs|B1EZ+6U| zwR~=kwY`pfW3S|+muzhf2NUe=8+Jzet>HPtaL?F~>Cidr2}aA*4S!os`S>Sm-eI2@ zplO9~uD9;scbR@U@|uCarrQCI0?Exc)Hg2hx*dP8I&R~vM^^Sa{0)_yhFev)*k)8G z1?OmUZH|60!}ow}Lg3Wzw}o!KJ83TyS*20O((+XFf`!(+st2)7((5-Zv|1o<$*6oF zJ0VhKnXXvwn&k_l(p5Ljm7li#K$pTYz3yN4Qk<mKao$t zN%@)EJYLZ=?dlVaIA*-R@XhXn=6VMvEzMVbvw45&JcJ_swNYZ+un-urY3yz4eW?zP<790mCy)GpD8Z>=oOv)HZqdtcPYd zH&635{Qdd>$Hu$IW7{9M-we2#xq?Uefa)=O!}W8Sw=v(>xn<90W+5Yg>|~qTVg>_o zPu&^%uU3C#ig;e|Mq}wd^OF8IhwJ}Z{Ep+V>CF6o^5Kk?%N82-Fo?f8UishdLf6jg zB1S#Y&qUop<}$U(+&Z^q#b*HvrawH}E-#z4?TDXqs(`_Z3uc}Uw$JAM6FqZi&ND7^ z?%AC)+oaTfEU0{-lyGgu+nqCxi*HZVo6uEbp*^SVoJhr)7z@X5N8jrea96Zcep#|& z_p+;}&R$f1{+pxV?8DD$bK30M^`|8A{?LJA8D^}$^Ld7RvCa~+ls~iE)S4SKwkj>2`Jn80im-rd zkQ=k3naNC6mx&WLvWGaxxSq^ld$zhEWs%Xeq`Jiyob6WTGH(cFy>XelBxzszIqj`? zS2Jyzc>P317~?w^cQ@siDIp;a`<6^w$fU+6E%`U~hur~oC&{@pu51(itbE|L)`E(v zM(&4gevXG$FeHXF7-%_2h${4O3AnLxEM{s6WF%kMM{-`@yJPR-eU5!pIPW0B|C3vk Xu~zPuS>h^SnZV%b>gTe~DWM4fxPId5 literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_3_wh.svg b/navit/xpm/nav_right_3_wh.svg new file mode 100644 index 0000000..8c3f08b --- /dev/null +++ b/navit/xpm/nav_right_3_wh.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/navit/xpm/nav_right_3_wh_16_16.png b/navit/xpm/nav_right_3_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..e36f012067a24c2e82e8f717a87a9a2650cec18e GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_~JzX3_ zEPC%wF!W<`lyJK*VBp0&=U_y{hV1 z|7!VHwgr<5d4%RMYd>JMVD4*NDOJ?e-{Rj`y@0(ZshmmVZcoDO0!|->$$1<)`(jsz zetNG}mi#rUHe~+Q>vy>Mgq&71TAkv0@F~2>_NG+C^S&R8|Lj#LZ)V%!{o`~Elli;; Vy^9-CwgA1v;OXk;vd$@?2>>&JaPVK~z|U?UXS~R#6zof6rS4&6YxgrL+VMQHCypSbc#&7x!pr^aB{p zIXMNjwDu812y&5D$?ZjgqA;7J4Bz+X@ZMXO>(TVSS6%LZJOA@={y)z1oCA#-HR?m^ zeRW0st!}Gt)jMYuKB4Y-P?yu>P*L^0Qh;1s$Q0g!c*9P53u}mp~_5Uj-)n1-O>*UIPz- zt&;x{7y|O)>jE?V0(4VeM0^0IfUkw{u~J%ctlB@v$MZyPSw z2r#XV1NVSo{`EYiybbRwrK<~xY2P}*%TWEMwyL%ur6u4t@EmAoUKj9?`axi-P5>fe zJt7t&Vl;z!0c>X5mSDQTOsxPZ7~m%G0C)v#XWJcm58&~s0Te(w5wQ{xPwD*!kAOG8 zPvFX_10-OUBjO3Y85pek4C{c|1Ad(84W!fnGyo02xdT-Fh?aq0C2zILLHnw^a6~y` R%F_S<002ovPDHLkV1k_f)L8%k literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_3_wh_48_48.png b/navit/xpm/nav_right_3_wh_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..0916bdb895e03209931e9bbb295ccdcb1f73b22d GIT binary patch literal 678 zcmV;X0$KfuP){ML2ON@g-5_Iltgl^5NvEj ztSl`30~EE>AZR5vf*?eM6xu7K)5?e!A(0pl8*{nGV()M~b|?3>y9VY52fOpmJo7#` z@6FCF1OkCTAP|U0(y*kPlHNM9 zcX=jhcY@AwNw+0EmsH5o!2LFpZ?YiiV2sW!r_Z^pk{^^*?a+WEElC=0(R$>>XR|Ue z*+ueAeo2~W=xmo%abn*UQ%2iT@G!o4mqc~~FD0D;CV(*~HVl+n2khu!vLuf6IDPE%6FbS^J*S)9y_g27Y^D#pZ>XJpg8ajYiWlFa+$~M1RUHqcjYxdtycR z#>}1oSAd^HhmSb>@+wx8(X)a$&XG|DLJU1$M#3as@(s|?v2STnQBL_frnz&+qwms-=3 zidh=~pz$ntXJ*%d1N=3!)Pc+%pp=UN7c;9nW)1=8fycmV8^bU4Jt0Z+p5yX-2Ra2w zXC=)xj?!@~|F;HOGz*eWEBb@8;tHm5obEejwoY`6o|ANy=s-6GtZoSdE@oB(UN=6O zZ=-!D7|5GoAa8uz1+sN6>Aky;if9KK&j{}w>Ih(z`4%%+&U+NuU-8^^izsw+8rvt0)-|@Y3$-Uy4 zd-a!i#p>z1R(D%XIcd`%xuQ|7A~k?XeFLNDhcgThIyydD-xU4t=YC|C^tT>6nU5Oh UKKto^23p79>FVdQ&MBb@0KR}ivj6}9 literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_right_3_wh_96_96.png b/navit/xpm/nav_right_3_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..adb0bba28c4b77f6be6d073120a7dcd10f030117 GIT binary patch literal 1167 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlITTs&PI zLn`LHopUx@HdUm3esYm%lYGGJFrKv+^meV}UYW<$I_1a>)%A~$&Ha}$RCVzP#@Nl z&2xW<$^zpGeZCo&!)>>H4hl_v(6wYK7rXu0>{FKdE57R=@w%G)uxZJ9cNK?8_oka{ z^|Z78b>yFNru)6eyB7Yq5YoTo?}5F_cb+PJSh?h_WbM1xm+ctOJii;L%fjGq{pPd6 zhnY*Pf7jHjD3>j4s`)daBuk}rxw*Z^te2VB4|Kq>uxOzH|gre)km<}sd|KGkFPHHKPqU1wkM4~hl+1-q8S zn6bUFSI>+NYhT74VZ8aXivO8=+B1%?Kj6!JY)gasW~(cX2Xa}Ht}~p;VXhFX5WOI9 z`)AvdfBc6puF-$3kg&+%jr?5sGd^i$G8K(aDhuQMg5Ov@2?)!d+D`S14Kgf#WW zxnt`XWsA>NJRLX<_F|Fz1qDGF(Q%$E`hE*f7sn3MzYA-N-!OcTILUfRBmUg0 zDGRq>>IDYGoF%T4Zr|M9Q0Kqh?I=^S+JYBS`*Qd^Z>6Q}FPC~{!2ajyT!+q>?NUH5 zEh{{mwc;gH9m~2Z^@~SMS1(+~T_Jvh&xXI|NP_vpRf}9-na*Cuec;Tsvu|>ZXS0`W zGEMmt-zKH6a8_)Rp?0R!F&_u1bjitE!kv?~6?!N4uyQb7H*}KRJZYJ;16!<78MF5R z%~O%L{Fpu~DyXNGojWt_Y);>&Y1_IL6F9tVjMJPQ9Cw}Tkz|{Ek&98)sHaCDK+rOE z&GmWP^G4}3TZ)L1NpndWdZo@-%9 zcWN+JJV3ti%EPxWu72`ceDYq4=rkoq=AZmE4;G%gUdQ(qSi&%Py85}Sb4q9e0O#rp AB>(^b literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l1_bk.svg b/navit/xpm/nav_roundabout_l1_bk.svg new file mode 100644 index 0000000..ff52db4 --- /dev/null +++ b/navit/xpm/nav_roundabout_l1_bk.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_l1_bk_16_16.png b/navit/xpm/nav_roundabout_l1_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..17bfa59c602e0095462c3e24a706163291f8854f GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_8JY5_^ zEPCHw-0#KgD8cgKeyq@c79TFrD^8013924)C(}=y{=pVHJ8$Z9zmMr_>{(gF7ry$>k%<7OWAFkhcBvQMkpv8512Ct){j##gHa_5nXdO^Rb-N(k| z9t+m4-D_VF@ZIj15h($<1^i5SpTL8O~{%G`H<(dk{$aO-}B;IZvMR%k%GC#*7&==7I7U z@8bJ3Hc%PHQFTZG6ZjAheS#VaOpV|(iG8f~*x$zPZ3)j%LVB_@BZN7XEj&#z zOwHE|tPdcdfw=+f??2D+dI0-1?KbVnWTL}GEMp$uQ14@Zfy+eSU8xE!)vA+C{KXGE z8`XIVE5dMDz2PbC7fQPB>6=emy1TFG8E-fD-x5DM@d zzwi++qus3u*cbY}j^Ef5TC%gUvj`}ggbf_xE5487JcUu(rc>B|{UyuBoeN044a?Zc aA>an9MQBOO)Xen&0000038sfjiBbbl$F)6G{pCbJfW*Xmx9FE~VZZ5ZR%o`ZRTfD&4 zc6qL6i)?P=xeDIEcAV^bwhj-`!WWE}Eh2^)Ea9z&o zG&U`)PUAS;qkiS&rB8PdN%>8?U1b3*bsm^%3(TXH`v05oRUR4|!e*`4sK3KG?CEMd z6e-l5KJz+zo+~&ce=|4~0bELT{27;p+qHgt5zQe&a5l=sgz(M(klEkG#=d u@&00NC5D1JfI;)$2T<1S@I*;||KTr%K;0v+;D`4B0000uC+-OJmYz|-=uU7mAc2uD`en*(e-2h=2$YumhLwDL|+SY#;lE9%ak^w;ms+||_E z<l%Xg3fRHP5vJ2VSWGlwb6~o-SS~?Rwi=oyYz~=QJhQFHFswi P&?*K`S3j3^P6W7uwVf}b_9)ynYa$0xjTA;4m<|8rO<3E3^Y0vK)9Z+Fp~RNzzJu?1KK+}x(!3gE7cePh5#nNBr{5#Tf65l{Uu z0L}szFd>D*Lf{+hA^J0x^ULPrsQ(u5115-w*Z};F1?OL2hlgW416;x$&M$lDzxIp) z6ToJV$5;(K?XmybQFXgJ z2=&n0ioMaUCwpwC3JyBkKC7>u<4ck&Z*4$776C_rw}D3k`VoYCfK9X?+Yv$tAsR`@ z2jC#E7?=v^16ck42JkTOD{wKaJN{V#e2onYe-+plfR9K@;;n&wsf1zR8g{~0$X;er z6%!-^tPAW*Wt;=90w;kxqtBKBd#FAw-V3}6dRWVE{DyWm-$My?Wsgx10jaUWN0zRiVX68y` zX8LIXyPW+?fN#kceAg~wSMIaG19Z0({WYh*6Eti%d}jKIuQIUUpH12C%WlM5n3#)- zoo??jGyTN&ILXq(UJw8pxJWlG{lqq%@wrbM0G^|ds;IQ|6Vl>zx83JS_Yzs@C$>v% z_WQCge4cbs%378(1U%WMO}sw8N`Au@T{W`acgd4}&g5uY#K!5P(M@+!qn%yD(t>XR z`i3F0tDhTL+6&nQY+6tPYr#zg|9%Mg3Hu-2GME640H?4NH5v6k0{ob>ucGHx3yP$lPHew(tVZ4eMc)I) zOYtI`TRrz*Yr3s|^4K|&RH8dz2Ae4__q$91?_mRJ@i(A|6b@6~l|Bi)i%qm-4I4D_ z4(OKKfWPn`bQcNWu!CxX?jivk^1OUaV{3fIDOS};fQU}2pK0tX#$KSjQc?m$JVA9q zcaZ=QD}ldBg8n}6Jbp@2mqrTE?Rd#U!0o_kYz=4?u7 literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l1_wh.svg b/navit/xpm/nav_roundabout_l1_wh.svg new file mode 100644 index 0000000..f2a3b58 --- /dev/null +++ b/navit/xpm/nav_roundabout_l1_wh.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_l1_wh_16_16.png b/navit/xpm/nav_roundabout_l1_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..59bfc0b1ce999ca4af6132ac156fbacf42cfa3a1 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_qJzX3_ zEPCHgwDoEZ6mUK7YiB69sFmxY(?Qk<&Pl2}*~}la1x2vEVLf=yO>yhgh+oAypIY6M zKKZ=YO`lQx{>*{>n^r9>Yhe5^_ergCLlsjE!*2)XJxqI5&R_M&x{|zAGb{G1N37AC zKZkBG{_?bYZa7(g0e{Y4)(yNor&)|m4l>!(1B?at%_i-*Ry!?W(Y+OmuWj7Ao^O3)7-RSPs4KB& apRhM@%-FTLp2Z62Ee20lKbLh*2~7YH+ID&X literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l1_wh_32_32.png b/navit/xpm/nav_roundabout_l1_wh_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..fc765efabf7eeec072909eac93aa25678f892c31 GIT binary patch literal 474 zcmV<00VV#4P)#^0%%!!$6fPIeius^h~* zJfYSK#BZomd1CYauV=toUIV}x@VG$yKaM)1E*6MiZMA7H#&T*t2jSuLf5C(SDrn;X=-igU{ z-dx|iVOsu^RQQ)#&tc%ZCC-CRPG54hK&!wJNpClRW`{X1BEmr#SO;2LZWWjT{s0HS z3b2)(5E17^lea~UYvs?Y Q=Kufz07*qoM6N<$g22nuf&c&j literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l1_wh_48_48.png b/navit/xpm/nav_roundabout_l1_wh_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..892e50867d602f8bc9c15823e52b25f5ca66a5f3 GIT binary patch literal 647 zcmV;20(kw2P)=m2qGAWAR&c%7K&nbU|}tG zVq>j^ohS&x6`~+EAvS87nAV@pLKM=emE=H!peUH!W3j7_=k8?xW-rP-&CSiueBb-d zeay{{6bJ+Yfj}S-2>dqy!@yZ!kJZ-%&H<*E+A;y`09JwXR^MIVMK5(Z0j7Xq>-(;R zF+*1SIB=paeNKSwz!#vEW6opXCD7+nTV{Zxz}6h&NAiphBms;97l17#VoU6oNzk|s*T_$0|lDr}$>WmZ2>1;9WBF&e=BD)i({d>L3NdprQ%0{5!Yl_&8@ z;36;t+_BF-Ipa(KlU3_WO0*L=)73W!EE3TM_IVdl6rcrke(pTL05H#=yax_uj5iMK z_N)4LvOeHLEb;)*4?H57@4#(f1{iU~oCDqg{dE{54f99PutbPSzqi z<9C41Ma0Kk2e#EB+7fS<53z~Y1r4kMr|UM*ND=e2fPuGp62`dPn)#bgcGLJTDO+ z8rLhKrlgMJIo9)!k`}8FRS879&&oQh{sy=N?CqLc+b`fU&|N-j@n;*j2^=*rRxUoa(K5FZ8-ie<*ZlJa heBBODd5ZfNKLFx7PwM){%9{WH002ovPDHLkV1g=)AE^KU literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l1_wh_8_8.png b/navit/xpm/nav_roundabout_l1_wh_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..a82380ba78f534eed0a8b9f5a22cb3ba96753549 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`Ho-U3d z5>uDjw;H4yd2p;<0M)tWU>}nX{fdAi6{3{`&RuucBqI?%tKVd)*fnn?~^uzDD{?o_SYI c*6jbmXkMfJ_IY30e4w=qp00i_>zopr0L8;Z761SM literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l1_wh_96_96.png b/navit/xpm/nav_roundabout_l1_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..71b09a4c0ae20977203d816aedf3925863312c6f GIT binary patch literal 1298 zcmV+t1?~EYP)0ZS@+bP4Iy6wV7UtI?{TzBSe2^hy(U>tY} zxI0uFK>*hQ543x>V~jDz^ePvs;ArxEz&Uq3R18rZyCmHq=~qebIp@9$8BgJ&8LJ@P)W#CMCu*S(kvVA!8{Ga1^)*d-GfvKvH^9rlYryh6kJ}Y! zTz>+Hz{9B+PGq z=G;$h>0v24h_x#g>E`w@4&VHol3ym?>|aS`-(~hm8k02PoSQAV?2hHx2aKt89(+g3OwD+r4t7BNqVf)-6b8CbZZ`E$8pXDo9#;?bCCGv=d|KG;5bKB z`^&~TCnT+ubamFas*->_`hbN-KMNUB<6Y>Kq`Txh&sXH{QcXKF&Z(yLH}jtvT>(6c zpEbL<;BU7Osy>p+beU#oe&S3@Iw0w5Nk2=PcFvu~-?g4fa-ga-L74zg=5Y2e2cB~pws6*lAny3kgxP{=iIrJWg5wkerR0x)5<^ie=+trkjqfASMLMTTmf4ZKkYa! zf2L2^nckT+3HVLYjHG4qm3~0ANPtLQP3^&kBq-5tI~UQ6jX^IrQS_|{ePao zECGR80s^xH1ZD{c%n}foB_J?MKwy@Dz^e2Yh%bZ=!1SR10bd + + + + + + + diff --git a/navit/xpm/nav_roundabout_l2_bk_16_16.png b/navit/xpm/nav_roundabout_l2_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..a0ce601aeaad3d699895686061dbf924bee2b26f GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^LJzX3_ zEPCHwu;x1CAkzAFBQZ;5;W|`^64% z-Q0I>?>e#JFmL;XgMyp8(ymU6NtMtNk6S!tR{15*zP;aSYkaOO$gGV2xY<$ar~Of$ Zd5tWRt3Q7EDg$&RgQu&X%Q~loCIGXQUgiJ* literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l2_bk_32_32.png b/navit/xpm/nav_roundabout_l2_bk_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..66066fa9ea78546580a826c495e3f038f79fbb92 GIT binary patch literal 355 zcmV-p0i6DcP)XXHgpL!6vt+V%+1*)0vQILZ-PyeF|H;no(9qD(@XuMsW=wigP) zEUafGL5Ns+0eh>#&O+iDNNk9OWX5QV(v)_qs;lZ&)sXv5Zqj}0-4FoJJX_+(nVk`y;2Xxcox8RNuW+zI-pyFTuC@Y;m=-?9OU&nDPU9U8HO&82`5kRU zUif#v#gB0|a;?2FlO4lzndmit3LoQBU@yN0qwEu(tW~@%xYpLdQ7xxZnefS4!*WGT zQ{Kq#d?V(oLuO`&tj+3j8Qa?wj@3eE+K7ljm66YZz5Ke@zvM7gWAvJ^ffbyrS!)R| z#BJqYgdSweI3R1Okcsy=UZciU+>IwW%(RgUc&xaUR`39)u&rxxbr|91&({n1qWn8i zG-?lHu{YHvTvYx12pPD857^nS+%SvknIJp(tg8dfIn^U}@ZU>S?876)(`nrsn6Mw$ z^=M#27fBV1jb1P2zY>Fx3=B;&Ff_@)&?Eyx^UoXT literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l2_bk_8_8.png b/navit/xpm/nav_roundabout_l2_bk_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..783f1ea6f134225888da54f26b0bf28f54ae9c8b GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`Po-U3d z5>wZn-OKBcz|ivWxWCDwWhR}xD#r}^u9=)kWNr0Yv{-SXzE^ncyS;ZlP8V{~2yESO zyyfH6tNopU3eN4%&V66sEvDTjaG;ablJAVaBJZ?q1;3cW4Y@e?@t5iWtzhtU^>bP0 Hl+XkKBFH%B literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l2_bk_96_96.png b/navit/xpm/nav_roundabout_l2_bk_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..b637d70c7bc1076c3556c34e9700948713a5071f GIT binary patch literal 972 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlJ88$Ded zLn`LHyWs~K4lLFU%~OxRZ_GTr?a3vDfOS)TAIs%jn{cKe1~0nho@_gBf)f4sSj zC5EXgDJNX-4Wn4W`*-~g&xLO1Fs=(Z)p5S?Txg#mf6vkTXRcjsmA<~(`OHOu<1bk3 zD*6mXqhA*#u~e|W;on&=UBFPmYr}XeIV(JEO2gv=4>^u&9J|n`w866Naf%zK`M0`9 z_m9_~*y3urG30poX~p@qTnBUtlzQ2&y;yN&_S5@L4uAXfnT>zUf1-K5>~iV0?%QDx z3YXryIOSE(-6Gj|wt0{3`_?nWRcw>>-?2CD@w}?%jrT-e_pO--)V05H?rE89(*j;` z7k8((v0j4Zty?>|7h50Q<($3c@#?2}4aw`fwl3{`$$m}higd(pN zn_pDknOgQ#`|`RCjIIydyT0CKzW1n3*v4n$z5TOtIbL~xE1B)hXdZ6Ibw+ag(pC3& zF^0{0YE+{1QaHEln&X~@JHxY=95dqBAIev#y)?vMB~bmb8QY!pJbRe0sno==K2ZI@ zVbMEVDnBc5+2Z+TJN)1N^Sq}h{q4$D2RA!jfp=|ZZl-SgsvWE%en=qiVz}gvIRUbr zTt(iS#DB!4@2*O1d(yTzFF|NKkI`nSy_)rhpMP~bB~!psE+1L*gSAlhdg1Jb{1*O& zJ+qBwuzY)Xt?k&xg4Itenkxc6-(p?FDzM~=ltTJxVecJZ&EsSb7+>ODz!7saR^*PG z{ihp!(dXxfG3;)LpZEN{dSy|h;hFz)Cw&npS^epbj^zGFotGu@B0Q8EN)H%DCCFyn zaci8vJfYe%LVZNIg}SQA#rmbVI(opNG4vV?zolGUpXDuQ1b(hHn}XLyHo z2J-7lIZRvE-CUNXc24*EXQgW*4Th`5q%M>N@YsOP3l3zqQjm Q1k9ccp00i_>zopr0OXFk{{R30 literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l2_wh.svg b/navit/xpm/nav_roundabout_l2_wh.svg new file mode 100644 index 0000000..d0c30de --- /dev/null +++ b/navit/xpm/nav_roundabout_l2_wh.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_l2_wh_16_16.png b/navit/xpm/nav_roundabout_l2_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..16c128ca265c23c41c8ae154ccfc3f8faec51787 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_0JY5_^ zEPCHw*vQA|DAM|H_EI&D)+}2NLAhYniymL3)<0x)xgxZ;hAVnQS-Dcw@|h>kSpGk= zQ?TBYOZLlbn@CLqhut^MD?gGGluTPWy)EKlkKQuTd8x4#y_1*s9bI+E{Md?BPOD>< zay(hOINRmUEUlb^gX?}Ak((@jevwfO)7J@)U&YEBdo~v3yngnPSA+A1#J%mmBro{g ckq>HMuM3#2JFUAw3FuA+Pgg&ebxsLQ06K+SDF6Tf literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l2_wh_32_32.png b/navit/xpm/nav_roundabout_l2_wh_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..06011f5d102aff1b9159a0e29fa0a249dc0cdfa7 GIT binary patch literal 375 zcmV--0f_#IP)ExuNh^``ti;Cb2h=Vxj=39t3 z6rq!^;VU?ceG7|jT0Sl*gpf9WQG}f3!p;4i^G$A&AZXO6QKSDXY~i4a$5e^X9du)@ z>8O8&vnnuYVf$E3^xDZ@)L+L+UBQQV#Sq(3?*l~oT;n{?Y%8i^0pNu&387Jr3YkgiYMl1yK5NB}2n7Eag@HQ>jS}Km+jS0IlqivAV4T;0L)P V=M%A_P)-)nkrww-pXh%+SrSNP1Hh2Onw%-8#gaIlT7YrqTGKq%s%%y=j_~=$M&BKnz`nGO{|YQO4$~OwskwlUI99X& zud*ka!uW!vj3w4On6lYvyy}>qx00Dv?k$qcNDbp<-*}ffydOjWoU(ykX(%E-Mf*G` zO6pn>@uRLt1urAwb3|OMGkB=FWNlziQ4}*ZhF*_|-F0}#BKl2*g^1Wy z(W}-pD2n1kQ54g4#x7wEYvFs@8o;9sn@B-LkTKlq6JQqS)~Pjt*Lu#DK?UjZ21m4a zrPcU?GwaZ}iHFI}FB4fFo!Fg1zo6VyW35++JrfuY^ z{s&)KfCu=By-jBbjISp|XUwpz^g@G6s<+t109z6q!ZZDMr>z~J3l8Jo-U3d z5>uDtY_kZ74N&cPRbRwd`cl4Juv-X=>chSw7m0z7_&IB?cX3;sU+&cRrghFQ$< z4;Wosdfc6JuR6Z+G(2*3RGDlv~1TmodiQyDrrBrD{I+}l zd-mM9cWccj6`!+wJ_j4|TJ+$qhD8m&lggIvzsIW>vt`Zl_YBrQ?~A^!>dJ}~pTHi$ zI)|0-S$Y6w{i8-=l5$5 zh^yX`Shb)}F=0uLb?-#KKZXw+pFP}vd)K;o(~UnG+nv9;oHd5+oAecHjyLR5zoR@Z zRjbP-80Akm@bFBTc(O0s2Du-$Z_91m=1{mR_58`MHLH z%yb;7Oq4QXg0}Ni zUD?$zBTBJlx?;=cNoHPFdN1W4&$2UocR#FiyWFZG?iaVNN?nv-H+-(uZgosz@%$h! zmW`%&>vJ0!{;}DusEpBl;Qzq<0mp_d=l*$V3mgeayPwVKG-J^*{}TL znKjK&iB$O-e2{_R9YZ`5_nPCkw?5;1j&XP)LuUQ+%e(b2Khd72#n|rQ$8E?I!T4tB%hwL8*?O4Qzv4S^ zw)x5FvZ?m!5&f$J8+cXjCw*jC!@%9h*|k6QA!7(*g!`tXT~{(sR>}0TuVLAzXlYtn zb22Noez#O%q}wOg*X?uPT%O{(uU8{zl9lbM*+LHW`}Hre+At)`H5l?An8BWKhS}g5 wqr_*1o=S#egoW3<{uh19rY3g(>U+|2x{6;a9PoPuED#txUHx3vIVCg!08TFawg3PC literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l3_bk.svg b/navit/xpm/nav_roundabout_l3_bk.svg new file mode 100644 index 0000000..3c609b2 --- /dev/null +++ b/navit/xpm/nav_roundabout_l3_bk.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_l3_bk_16_16.png b/navit/xpm/nav_roundabout_l3_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2df242b0e4abf07f8a481abeee1c36feb2a42840 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_8JY5_^ zEP9Wgx6N`26gc{EzG1>H5i_BSB6SI=swvEo)4K~;%XTqyF7Z*_(X0>=v4SH?Gc&2U z^|)Aju3>r-5gL-j7;xBt@r0FWu=|0?yFUA*AN)M@`@8A^MsW{i*_kuWO9B1C;OXk; Jvd$@?2><~$X6FC^ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l3_bk_32_32.png b/navit/xpm/nav_roundabout_l3_bk_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..543d97c9231f2fb4cfdfd220539eb842566c36f3 GIT binary patch literal 446 zcmV;v0YUzWP)XYgI=YHmh%+3I7AMm#ny3YceaxdYDu6kh<2qO?>}&XnC6tE=@BpVB0G-wf>*g>4;4>N> zh3mM)0jBYA*Z{Az+fc`^ur{$0d=>%>%;0fKfRc6_F7QYDZ8Wfqb<76;UA#;Q0AFN1 z-^X9wXQ6?&IWbl2$k<1jz$DR+2w=59 z%pqQ<0yv2PDyb4v?Dsm^N8T5hN(JyU+P^6fvsTcrkUr{e!Lh_`=%p&IB8Vfr!}G|u zj1T&2+pUT}#XKXM5$_FQbeHk12f$Y9qOm6MNj8-701BP@6siP}ycYbo1{oT0(Y|tx o?4CCU7z5l{fI+U;8z}&808xE&9OHuJdH?_b07*qoM6N<$f_sO>P5=M^ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l3_bk_48_48.png b/navit/xpm/nav_roundabout_l3_bk_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..20877edf8810f535000d014494697a5d62d883fe GIT binary patch literal 643 zcmV-}0(||6P)&-Z>l_xV2e zKHrCihK7caEX^4^fYbPnH)z+Qs6wuYM7QxCS22#hkfQ#Fy=Dxw(Te*In7|(SD;S(U z(Kp{tX@BB=3U_c2%frab=Nf)XH<4VKkGO#iL6l~YOrtylo!2LVD9xZ>l=FGwr*IKt zSRF=YK6z>MBJLkyFqFV5zpC=%ZWJ0vAzbqb4aF93(uvSx{m=|z}s0d zHpk;jCAqS*jXapR;;Q_T>s2x8S*s+2(&!pcZ}A|uw>)CIB9pKEdK+`HA@sP3RP+5d{ceWdL;MXn>TM#ei)~I z=;NLj@r}pUs^)`R>dY*0h$rgf1`rBM2@kbnmK zfEENnq)?D7l=`uAn}r}`*HS38p@l+0N8R83+HQBqS{jfQB`)aT;7S8g8f zz1*2Qcjn&v&JPA2@7_0aX8!NaJ#*&V3yPvBilQirq9}@@C`z-?YWcfuz)QgIz>+(2 zlsNPOi$DpO2TlTS0PP`-Y9{s|gI`_dfp35}fsSC-H36N#0<}d@F+6da#sXA}aS9kj z#c;+T@db#Me}N0YVPJ!Is|!R2^3S#rp;DHBtEd>(oFbV3Dn>$Vry&)?5plesq-6p4 z#8-#%h>16pM1&S!9rDd134cH8#EQloLxd@jqg+hOH8Jr|A4Uu$7hhehI%{$>`J2( zdFE~63vfNgIWxe^Rc*YATp=Z3qJb@A$SVCHa&oe9Xno( zoU;gYyXjs&I78zB{bPmWwaOIme58#j;BVl39UDH3{Pw7;j^zcDX~?8R?+INr-p6i1 z_N#}0tq3_Gbx-h#5*D9YSu&oog9jR*^Se2l@Oj2ta`n-JXNyM|U9sI9J9=qyCoPldV zPr|w~OZ7Cgul)U|*bn{)?n2VNK%1kwGD-C`)Pr<*7Q4a!iURKkq`_+77bGue1Xv5a zi{0QKBl(_%0-VEq@XrH}hA_5hJcju?;4bjAC;NJVFOdA!Lh>5s|Nf6W+4dgGued^T z1hc`PLtIuLbRpsK5)!=g9zFH35Ha<)&mw!lKA1*A*Y|)QDB!{j;0k6}z=0rE2EvDn zx7qOg8>v{4QG5tsnv&jBX(&DfSTsD}_PMoOl0^a5r(#7$@gcw+!}EP_mJA^g+W}yW z=eE6Y6f-aAxM%w&B5l9oxos~DVJ5(z_*)Qd1Rj*zy$?L@sojV8xZ!nR=G(U+nGaXf zF=rVIz(wTQwcmgf9@_LyJLbW-J4hao;)qeq19BJ8aI`aQGpJ9}Wb1;oXh%{(Y()4L z_YdoNzu9I1Q*WqxgXR!!25vvHWxCx#UAf{3?5~1KxeW{>Pt!b$d7Nnn;^vl+r*ift z=};c|fMf!glv;En?q&%|5_`&R_p(n5vh^2A0Fac#ACV;9reqWLIYKT308MpaC$joX zQ-GgxH+02jBX9|SH({j) zt;j=mt~?~gk~P4WEPsuG3J`$GM$TpAEm|r-K-N)E0rK?ZiRqx`qHj&VBoB=W5EvC8 zFe*S`RDi&!0D(~f0;2*1Mg<6r3J@3-ATTOGU{rv>r~rXc0Rp1}1V#l2j0zAK6(BGw oKwwmWz~t!-Q6GmkKq(;q130kDu#UPy6#xJL07*qoM6N<$f(dOjsQ>@~ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l3_wh.svg b/navit/xpm/nav_roundabout_l3_wh.svg new file mode 100644 index 0000000..a13af05 --- /dev/null +++ b/navit/xpm/nav_roundabout_l3_wh.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_l3_wh_16_16.png b/navit/xpm/nav_roundabout_l3_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..949f3d1f1abf55a7114e1174a18ac08980ffbd7c GIT binary patch literal 270 zcmV+p0rCEcP)2!f4} zLIew|plECJSvZ1*_}(+5@KnQ{d;a++`8UB8#yCM)1~B%SS3KhMuYhB`)$$ES*uq99 zBNRN~x|-bM2nX22{-R#*>rhIOTEgSq)3`o9`1$oy;X zN!Ggn+a literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l3_wh_32_32.png b/navit/xpm/nav_roundabout_l3_wh_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..6e74905cd585ff82c0f7847d460da5052135095a GIT binary patch literal 475 zcmV<10VMv3P)VK~z|U?bg3*6hRoq@pqGO(MA+8MF^w`Sfy2vAlHe7rL6=D3p)!T zh1eOe6hV<_sf~?)MzFEA6ESuof&tI`_@r>aFt=eho4G^qo@REI_kEx5^3Lo`#6M8tGNypD*?s;Z2Y2v4zxZG6WDRxmX#fJ^w{ulCb?8*gy~y-@;G_@-X_X?!p; zfCTXjJBN%1_=%TT#LTDxt{iH^0H4yhhg&J8kHz%7j5A%lj#^lo5wV+|2N5wB5xo@u z3O6I-azva-Aa*fCF>(HP(IN RiW2|;002ovPDHLkV1kyl*dzb| literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l3_wh_48_48.png b/navit/xpm/nav_roundabout_l3_wh_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..ef1af1eff4b552ac65f36d259fbefe53b7cd54ba GIT binary patch literal 635 zcmV->0)+jEP)2;GqcCed2F5U&6#ti=l^_vbN(~) zJSRy?N=i!pOK==FaR_~}eU=SwTjVqDV0_ht!Gvb2>G2Dua0F{&dj>&Y`pLKBPkNli zBb>mx*v?D9G=2v{wBDJoxQCswy%%WHMp*&suP?;*UI6`R&u7Wc;yOmLIkxi>I<(Q- z^!NgUv0dAe(MGRY&Yxp_I_4N|wbVI>?J)whwow&t0->H_0N3!bp~gu1{*}T5qyqIe zs^UjLzRoiYwW+bEeuvWY;UWVxw$Y7LGK&Wt>Yc_>G?uJ6wyfG4<^XKa$>3-CH{{p@lJVIWD8 zwMmi`w-C(u8J)+$!bI|dE%+4(G1KjTftU{m)E0Lk=GC^AV**PB4B;it7wujb*d}|Y z)|Q6xgKC?gqfr8+5+^M_o#>Xs(S+N9OPV+Jop_H*Z0{y;3g5a6Q2ds%8?XcS)xN+% zVtaN3TQON=fS&YYNVZa`toVGZ<4JP{Wq{a}0b)}Ih)o$FHmg2Be~;=O=uzDz`~{k@ V%sy~;L|^~_002ovPDHLkV1g=lB%lBQ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l3_wh_8_8.png b/navit/xpm/nav_roundabout_l3_wh_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..8d599a9183820ca1a9d9afa619d750c2a61dd110 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_+o-U3d z5>tE68S*tI3bZ_obX+*;g4P{J)xce|nKNXa-s*7u>zX4ZTC8j)o)Z_YhC+xMT~ zI*a7n<&&TFtL#>(UbEo^r}Uk|jL*NC145lAd2Mo0o%#3I;|@mkGspjy@Pw8gUi$R< fb;rw_)%P>THJE)*viKzqw3xxu)z4*}Q$iB}pZG}% literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l3_wh_96_96.png b/navit/xpm/nav_roundabout_l3_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..4804f9f8a028ef575c8a07704a1b878c6eba9b40 GIT binary patch literal 1354 zcmV-Q1-1H#P)qK4Fsx^N*Ph!3!cu~1zo z2!cqVAYCZFc5b^63huOm)Jla)Ar@a7H;P~y1Rrf|wMyEQ#-xPC#L}OO8RaIqb92u; z&Y64r{Z`4HGxI(EcfOf(=DQ;qhG7_nVHk#C7=~dOMhk$=!2Q7L*uGqJ0E56h2{XW6 zV93M>1n>~enE^foo&?s!_OojNdVq5oBA6H<0QN50b5Osl1P)8hrfZ(fE~cK zvE%4ifHmniy9nojuT6}cq-CWnOblPhUxrMKGN8S?p`x4vUWpxRmAE211N$XCQIaoN z%t~78oTFkpQCLxM|Bp)XqBZYzYx1SyXF!jn2}xxwLwqCYfTR&gW0KA~=T4S%?Cu1= zNm&-Nz?RstbR@vG0*Rk)`1=HKOYC?$4)Wg({o3R+6Cn@ym7xp3Xp8OR!0jz;T@O4E zGQQdaJmn$4;WoyM19vR4aSzEE0&uj2FQX*0^k+$K61pGSFGI&XggV(M06BJ2l|60Aty!W0g@!=+>E48ml-xCso&$Uy^@B3jj4@sNxw^)k@S7WK8>a61Lxdv z4||;rer3pq|E~!^AF#58502z{^-kc{aM9NQ;0m(KP|>C9W57)%`T007P{y%p2k>!5 z0v`m96ck|$=qu>oqre<+3K%Ra?%F`}GW2b_tq;G8a5G*n;9C!Hy5U$yfJ@4Yz6Q{| z484(VTSszdlb78<(Y334fxmzeU{g6!*9?}Hp-0lsUn`LOcZw#z!M_1uRT;;sB`hsN zn}AioM9$>DT~_kzNEJ2kprqfFEGOJE$J6k8%hWP<~_$}uJ?B%brj&5O1!8kAuhsaB>6m@8j$o|MZPQn z*r}vUj!OEBb<~Z-*0uN2oQWGY%IhCh>Qsk851BfCO~9NfXJ8tkud=xV**6R1c;0Y5E&C7 zGA2M|On}Ik0Ff~PB4YwX#sr9r2@n|*ATlOEWIE~9y)Vah!01B$1(4L-_KB&MWB>pF M07*qoM6N<$f>-!z)Bpeg literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l4_bk.svg b/navit/xpm/nav_roundabout_l4_bk.svg new file mode 100644 index 0000000..0dd3859 --- /dev/null +++ b/navit/xpm/nav_roundabout_l4_bk.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_l4_bk_16_16.png b/navit/xpm/nav_roundabout_l4_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..10cb3030650ef350298aedea70b61c8453ad32bf GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt@&JY5_^ zEP9t-+Q@szK%n&@e@lyq#sW`Su>=+k385uA47|F$(E-K`p<1sl?AWkq#*7b3wEvX6 z|Nb*&-|Lpg4*o%^^A?^mY>>)bVRhBS^M|(02fpX5+cJvs*BA7vMI?Xo-qCqTw`^yk zMf(Nb*(dHlXNqGCDE-59I`8uq_6borjg{wER;tSs9r~hgXf5NcCz!B>jj`7Ik7qq| f+rH%bx|PAx)z4*}Q$iB}oTOOE literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l4_bk_32_32.png b/navit/xpm/nav_roundabout_l4_bk_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..38d5e63228c1fd48339ccad436bb6d9835da1f56 GIT binary patch literal 413 zcmV;O0b>4%P)*+HsK#)O2P{GIxTDesE#PWbSv8$xQjP0ndj#}6@;ND8`QN}4_|!4gZIxHVu{L^S z`4>FtcV|@sfGWA$3;=*bV7DscI%?$e4D+PmJ2CT@9OE=1;Mz5@Z57-BrxuViR{$He zQHyJFv?El>H8T2d0!NYn_lEf!uvO514^l4)lf357Rj6&? zLn_%Tzh|H;mDpB8+!x`MBtVPhGK|SD!yVL#DXIsGcfka82AoJ6r`iCX{{ZM9JoTpP zs4e*`2OyYQo>B literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l4_bk_48_48.png b/navit/xpm/nav_roundabout_l4_bk_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..a908a816721d8e15e8db7e7c2a93a3d1fbecd5bd GIT binary patch literal 608 zcmV-m0-ybfP)0R@PbCITTETK2M7)w7{rgP|Da!}x4xA1t zstCWNJ8-b1z1z4`R!o^OP&F%}pfpCSUZK4u{o#`$10Ul)yZ6vEU}gMSEiI`6;lU7 uGj$*|QwKsbbs#jIcc89~#mSoNj_?-*Xd(D37ePk=0000rdh9OP_vkZ^g(AL}3Y_K;jqW7wpqH<}ObGUXg_=G)0WB_`|#@9XBqL~BUXiry#dRHlWs^YUqDvt1klHU(Zkc51zq45TI)y-FhZL9;29k!I(tlT; zXu5TQ&F8S9!t)1KmJb#*zfR!_zc~Mgjz<>Tj;?=9vslHZyer$8wJSSJ@$%mH{kKc@ zC$KG96u)_algi@w%?WI3-T(F<;9bC6?Ox7c{`vX^ofQpX5A+`QRdH<*m)$P9z`^>% znkP5n4i+w%=lDQOc=490FPIq4oQ~gIuqOE2pD)3a^Scd;4+$^2`&xbXJHLe8Ykt05 z&bou;kIKE2)e%ALUl{ERHs1==iD0)m{ zCgq)ypQOT)!P3^KJY(vFrbs?7*SeJq&949NPLmC@ieTK00a{<>5C96$SF0{)(pYC^vYXi#} z&6%WS;*BRh>G-#yl=rd5^eYUp2iPBI=W#O#dFo%BW8ZM**4~oRlBfm!E+09npT~=C z%Z%PP|9r?#vsCVH=jwZJx=dWc_Blr3u7AO<4dMym0^X~qbl-5V57PcN=W+6aY~Azn zhxRNv&0@zAky-iAR#02$R1SZw&L*4xtsSDlm)UgK#ge8iQ=a!*{JD5pvBTc<-{(ZW z-hIFG{TrV$&!g=O$o&;+EQ^%GcfMhURE)V+o9e6Rr3wxlJyS>Y$~;>ZYV#Hc;;Ab zsPNaziyc#3G7=uWdb7kqzH`yc7oq2`7uH)x9s3b(JoCmRmfzPe9erz?7Jo3cH=Vga zGFWLQXUx>4JPgqWshTrqy2M`ew_(hgWyD$hA%0dwzou`Fuxw;kMDPAbcfKAt{pbDf zA2ffro~JwZmb+VTmllJ3I;?;OkP&?bKeCvjnEVI)fIskY}1PcfF%Tj Mr>mdKI;Vst0FQL=y#N3J literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l4_wh.svg b/navit/xpm/nav_roundabout_l4_wh.svg new file mode 100644 index 0000000..0faf9bc --- /dev/null +++ b/navit/xpm/nav_roundabout_l4_wh.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_l4_wh_16_16.png b/navit/xpm/nav_roundabout_l4_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..124984aa3c20ee1eae1b46f295f63bad5a06a603 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_eJY5_^ zEP9ttGUPgBAky|>OXwLD6?ep=jTG1x}K9?@hg6) zxIg`g;7auaavHy@em#)cv3u%&r4<=Lt-o{_&a2*4*&CCom6@7W`syWXLDt;_#-8>A zruT2E9P}$FxF8v^?bYp&gNHf0{A`)i?*5y2{GsfcB|eu_TnkF8Z`L&}**epf`IB0s z;=4r)+>8EPXnxSAq4nWxLcl+`bwh^G6HV(KdOHe00WGH4`2$s**3NJ zQad|p130lkkDgC3w9n3K1F#Ss;MPsI&yIjrUBOLT`KPD)dKV!ZKJo=;lmORdy^GF* zfuysXK21rpvH-aP_U+G=)fngkYo7kAz;R4~dnf!E*qGCQ7Z}C_NF9L1EV&tgnFFw1 z;GIL@posrUbwsbWB)vv)0-l@^xQt?40^ly-C+x=rXnUq%I%gVg1HEVf*7SjVwSd#I z-bGi!D@miAKAV#E$^sM?-}}J;c=wfGTd)VD%^%xwh=NZqZm2OP$Sd?z98F7rCBVM} fRN0PiVgP&r>M0@C!K03(00000NkvXXu0mjfce=u) literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l4_wh_48_48.png b/navit/xpm/nav_roundabout_l4_wh_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..f1f3d8d3ce1db6e7a6d20bb653963a53f3f3571a GIT binary patch literal 661 zcmV;G0&4wKS_<}pM$pFA zS`oz5D&0(qTz+ z{wz5|i)QvYM*g7zZu#l)4mg)Hea-`${`ce5y8i=M1s47>(}%xr8n_SKNUixVzzN_L zZr>9mwa!d{OThR1#?w#(z@4J1XH21G;8<$y0xl0C-ebTP@HUo?N^KOFmGnUeZLwT3 zGXoYSO`F+PmE2JPHgc-G2Rs2*fFlKQT1EFn2iI}h0r5M)>5_3;xHVy87(G+PxAd_p zsg-ekPtpZ5dtWAqnRS5Il0H??P#xe+p!yF-Dx@mF$AE#eskM~?*bNvsS~1>T;9gZd zRsI99S&_6mvTRM8LRDU9wgcC%4kKh_05=08@C#TTFxEBPsy;e!3)z0a#13$(WSkk` zEAXgp%~{Ex2Mlya;wf$`F;fudBq?^Lz;WP5j)_eCvkO4_?gw09@a^<0ZnO6wwSGww zur`PZ|IBro@IuoCxCneJYoL+fI@3Dg?$m4pU4S_XKC8qg%9pubLSoGUV{f3Y7mG7B#qHw{LrcB+m!++~00000NkvXXu0mjfabhii literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l4_wh_8_8.png b/navit/xpm/nav_roundabout_l4_wh_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..001510800d71590dc0a4d6ebe422fbf10f764bd2 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`fo-U3d z5>s<~4std)@UWN{l_iLOOJI#UdG*m{FP($`w>~`FF8bn!i}|C{0QSudR9 QfmShiy85}Sb4q9e04GO2z5oCK literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l4_wh_96_96.png b/navit/xpm/nav_roundabout_l4_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..b2052c3e2e249e08d082b2303ab7d1cc547a674d GIT binary patch literal 1312 zcmV+*1>gFKP)-a)h zVI4pV?w2&N$mbK1?#mp@c=12k-&+^-%>g^Lc=k6;NZOGpmhobQ?C+%u`s9F9Wq(6; zL2LrDzjrR^ivvc@{)Xy;ShUFgUb&zT4hYTuhU$W@bjbeRxS(_gw9Wp8;$7gZ16Ybd z<{nlz0VHWw(#6iX&H?y0TZbf_ z6Zz0bByD!i{T}(aohZ=(I~0HNCFxvA+Y=nO6Gb^7VfHr^=YrB4kShBdigZB{u&~kr z-~_N2*xKSQcq_1PaExJU1;t_j=L2sKP1GmAmZ9&182a57;L~|u-(@q(9so=OuMKDE zK%72u^MDtCKiW+EQUX*? z0k9I-4gA(+;;R5H0Imc+i!t$4fIxs-fa5VIzX~uSzyrWPu_u4N0KjQhV=NY6I}2}; zq6+|Q0A_%PfTA9~n1NpoCdvFo1ehNB_;t&1FGlufLBQpbUY3;nv;eGd`Z>H`u zl&qEnR!aIn($%T^a?ZIypKBydN!sL`8}IUU{5n4i)?*!&Yz_c6N%~6Cx(0VZgFv-JwFA#ywpxD)sR_!Wp* z08k#lu9lPkGzr%3z$*N`LBo@=`zQ+F!xoeOQsS6y8uarEuq$O>rr;khhjI|;a0su*(*t}RcnZ4SI_8|@a6o8QU6&$=Qpq8}Okn%ykDW^< z$3XW7w!cJDEuM`9?Htk8UKKZhgFC_i!ocptTbYlWA)xiZpSdX0~454n+E(82O=6IHlrzPug^d4X%@G$<=6ue}$j(=2o zu`I){VrD~r(`?c!on8bf`G43H(!MVOjLpmMQmFzMQw1=l3SdkXz?dq4F;xI#ssP4R z0gR~v7*ho>rV3z86~LG(fH747W2ykgQ~`{s0vJ;TFs2G%OclVGKGn + + + + + + + diff --git a/navit/xpm/nav_roundabout_l5_bk_16_16.png b/navit/xpm/nav_roundabout_l5_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..02bdac61d2d3179490e21db423ae1934c18c3c4f GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_;JY5_^ zEPAhAw9R4)6lr^y?y_B=L_x7PVVXkT=~KN+dQw|N6j?SFu;(2(c8FEOs@FF`=NTVQ z^W^NNUimrC{_MGL`@G2C%ixGe_kO(M&~x=xcXx0kU6h5 z9#Z>u=llg5_b$188;%*P89InDWU5|2#=-yfnYZ}~{U>!B!r#bWb#JJ7Z1}{gD|Ave zgZ{y_ReSX2t&`NddVCF2#;gTe~ HDWM4f*;8rW literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l5_bk_32_32.png b/navit/xpm/nav_roundabout_l5_bk_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0565adda860c3fc9c2b0547b31b8ec2297f479e2 GIT binary patch literal 461 zcmV;;0W$uHP)DyP(c(^TKE7~!3#=K2x4c52nNBINR_1W zAp}v>kfaQG3ky3dW2&Io3!+3pquvxdS1;r0>h4}sct1GB4m0!pcg~qJwDi=~_DCKh zn8P{VKZ2(UUSkypIK~AQnrYgBH~0|@4{?cFh$B>+2{0Cn8ciExUrNd=IgEy}f*sdK zyNy{);7b@kYgluR?*SyYy09kw@9J@ZzX4zur(ygMqeacvGtA>S!5?=V|3mckf#x+y z3O-9}VzG$%OE(Ma7pBmSKD@*4$b1@u;rmq)fR)JnCwf!n^Qumx|`8-Gw@)Ot4k7Zbi0o=x~ zNX}!S-`S&p^63>{ZQf!>O6~wYHRL=I#1od?NjaC#CCTE)u)T%+KD?{t3=4ZgJ;$-3 zU1F1XCfUH%d5qDAyXeLRVdE=|&yo%7%rI6bz6q1J5V|CbpTMG`MAS3iHgziUzTG`l z%goonq|gdC(xJ5poRqgZL*8Gq927<(?*}uCwOi;ok7mft%w@^*U|jkhki>eN#j17+ zY{nMxlhhmYH&F@?#aoGS;Z|W6mPYb>a5#UNaW>0#2AF0@SpU0=lRTF}*$u40-Xg`u zxTyKfLVc_&M`k)Fw0<^NQIf`{Y!uE2%?|Yoo?e_&pn<%4n8JFd1$F0`g~~wLR0hhX qGEg>^fwKAU4diu~)1TA0bNBw}%HRNk@U~svpo|OKO_kmEzor7*}P3RBMhIOIWJ$f zX$TlB%?oXNU|cW6b*H1C=$YkQ zi=4|Yn%YQ5DelcQWLhviWoj)ltVqntBGHP`m;Hd9=l1P6=lSxSh>2pMQCJiJ0BH7B zMw~UlFGAW|eX=%>W)1s2kt_ya`GRxG3t|AU?PN1HCge+Jq}wZqF`-D|JAu2R+?EZ#Qje{u~-d5-CC zpo6D(1sJAGVn%yG8tS!IHfsLNf;ja+vy!!%mgJ-4me!ta?5j#29-OJth>+++_UPMq z1V=cnVDr{A%9?(&xFDIjN{$DM{6WajrvO64DUF3wC%}n!IG>U@5^oM&&wlGkL2;3@;S4x7~>riXp@XI^(-y zgX{Ox0+L5hNO4qoWx!D1#!(G;O}LQJcf- zK8&EHs+nxcT@qkPx~AD~PC{&81ety1=H)F%s~sO_L9ddZ-&%N?DHgqzyPCO)@(GG+ zY3M*j;(affp4NPiT1uin;!^GN_UAS8aXID!*u0%te|v1U_Wh%6suB`?x2NnOZQ3To zQB~N``vx40#v3Z?ZJZoUrMnBXlr%UINGVYOaE3cU{_=ID+jyk48D{Fl^szT2mqiJHt*NBsw#C-N!Pj!vY z&&WfOr5#y-95-=#qq`H8#;O|n`qL>zk?siSnsJTWwWVvN!lAq7Rb1~>{ICPaiRF>$ z{_%ZTJ^Qy}P*B?dlI)~d&o>f+1q)aDn-d<-zl;OO-d9D?HDh1^k(X`Rvt>Q@$)guH z9-K^ujektprpW3ejw_bw!hRgZtWzoq(w-ibt-^#XVRs&*sKX*IZCcV^Ht(T|hq+VH z510!wLQLH7SNy(#`x{q8RH^j|!kD5!q*09R>oCMOkO{*7&!p}nQ= + + + + + + + diff --git a/navit/xpm/nav_roundabout_l5_wh_16_16.png b/navit/xpm/nav_roundabout_l5_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..4028c6758fe24dc4270b117b657c70fb59e4ec1c GIT binary patch literal 276 zcmV+v0qg#WP)Kd12M{ezlf)UO!$2`e6 z$#arfl9wdMtGew~o%*`RV{6>YV!p-@Te!jlc5&1K%nD#w#RfRQM&G~e2Ks@n>)w(~ zve>@~xGnDqw#x+TNv26&SB_uI`@a?(cx$(@kpqj{KK^K_h?H a0=xs0o609kM#8HA0000gvDC#BBf=Nt2S+ zB~^_v8*zIINB}dy5%36@ctdYyvZ(O&tjnG&;MfI?xwjUKSV);?eS3 zU^};}?`B0(#u)P!BzX|Etc~s5d*_g(IlrVd?u(HQ*}jswo3IG<`^?D!Jy8K(eG$ZHVRDbfZgg)mvv<4M$tdj8?GEqE^WMEP zH}6Rm6%`c~7JwRX6qp1~hW6=-So#<+1$^W$w?ex)0eXPrz%kiUsGRw!5EVozE8A+p(c1RkKgrxV9 z8j@a0dM2qZX-v{ZN$VxKN~9@i&=|8=rl(DOH}D{%j?-mv7nqHo8$rtlxB$%OEQ>TR z9Pj;}KERa~iYIwR`=P6VdV$07v%m5oI&oa5&0Ao9M(haiDHZb+=#9q*h)T$7`CNC%&jb6q zh#vyp#WAx$JvDw7*yb~V=Z*v>bIdUW+ynZ6tH7u?Vawv59SIyLFjo!u3QQFB$#s<= z+E@#gp_Zh&F~&CLmAuzf9PdlLQ{^F70>+q@q&eG=q>dXn4Pb!HdE=54X%rfc_u~cT zIwYwHoGuVs4B&=i6aOINH^4F1R^Sq_$(OHf(OtMZsW*9(2m_k~Pid<6;g14n|%Cq%B%`JaU(TS7Z812{+by}^dizE*(k zL_I=gQy<#1BSgKz<<(5U%N@ogYm6yR07*qoM6N<$f&rp2vH$=8 literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l5_wh_8_8.png b/navit/xpm/nav_roundabout_l5_wh_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..ad39c12a175bec9c8c8517bdd33ffe77d91404ff GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt@yo-U3d z5>u!48*&{A5MfC_I>)&`;jyWT_~y?FJKL6gU=fSbWZ7bN;>Mp7>S1|bZ^S;^_+kB( zsZ{~i4X&bZt}t3KML%Ggu&RJP>H+JTM!S=xkr(f`Rxq9OocH+=^@^J(x&jnzyl&;8jDehj zHy8Q2ME2qHe!y+p+S$O7!)^tBS!mGd(Ea+4kMoGc?o`A5SQGB_qHEPjzWTgHN02oa z-847}AFK;udr`-}JIT`-iJGkC>?m$2jJVA@>-3prd}RJz8X6x~xsTRzz6p)13rM1r(lJzZw+ONdRhJt5a{6S~YDm4K?P!A!(5d+cDKJ@C9p} z#A6r`TGTFiVg^Ljss`}EhxudHVJ4j<;=8L>ds9JcvvqOwz)_ZhVz`Co>@i9aH zpF9MJB#EdqJEB5Xee}Ih-f0|Z)vd3a6`?yE@kP6CmHlq)uTN*=WzXza&vt{C?Ia;6t^=CVad{Hg^CF1dB0?Q7{kqltPRD!Puc0 za-RLN#wXe0+KC`LG}YkppUFLbqHaw1cj-73R_`AWW=tP?ttYC^cWq33z~{5 z5pfaVJ}H=Ll*rKn`h^1de4s4AhGxTG8~|3zq<7NsLTUXtI_g?4LXC`$^T^7L79_i^ z$kGbR{w{;xYMPGV3QGiJfI{rb{udgGa=hs zI~1w<2t}n~`Vjzsu!rU{`a~6s9yTB@cLWem$tLk#lGY3zvc6{A@X^Z13j6CDu>I>q z_9@9mv{)xktRnZZH9M9pk&5a^*1nH@30ZuvPg!r6w zwifO?d=&9W?-g<|>=OJQtov^K3J(&ri*cOHKM9%)F{?rww&6_ii3a-Wa~!C&R#iGn z`KazI?fjhbP!x-bNeRZ)N^!R0o1JZ<%+IK@%cn-Cx5kc()u}eDx0|hQyJsf_muy@$ zwpKQf5Xn)^>Tahx%5TP}ciGpk(X?_%sPm*mXV~m!J$J-G!Q7&3d#cLb8v{gwJHEz_%J>&g C-=U@e literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l6_bk.svg b/navit/xpm/nav_roundabout_l6_bk.svg new file mode 100644 index 0000000..fbf660b --- /dev/null +++ b/navit/xpm/nav_roundabout_l6_bk.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_l6_bk_16_16.png b/navit/xpm/nav_roundabout_l6_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f52ada31aea1ac375a32bed72a24b6ca7b252683 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^LJY5_^ zEPCHwFyuPqAkg~oyh21*$5zAd8$Qe`i;}cy5Q{q;Cb02>n)`*c)(JT=SFW)iJ~X@1 z-uiHS?5V&N*G24)R=jTaNa+ikL^5zY!?qGk>ehGvB YyPazHV$ZpM1Gef>>JV3m_$hwT%T4d@S(*ZZk8#?=ri4;N|7zm0vC376^g4L?~;g+cd5M zBVYx5CBzCCO0IMBmlR_i&#obcIm~T5O6^%$^A_-_nukCas7dsIH z4}b|j$uBqLZyLb@GuF%_cu>ufHlfuKa1eR7n=rSrRg>SxFyQ+bYFz_;d2UN>A>*jB zTtp|pzN$M0&dV5E?P0FhG=LH2i?^mKaF4m+;sE|kP0X*?2|%R;h&C+6vQ;+fmW_@L;g&e}I@e<6nl{xeEOL#e(5hJ!>}>Chj_AUNQ5%A?7FS-7J<08t)xT*q&-%#?G<>+|4la6F1Pr zbUK>2iFU?y4`f44KgFFvResu(m>j91K_%fjOOA_WO_7@4T7?||f2pY$80=$u|dZ=p^+L7-8 z;mspx%;W@kDOvHn_Pe}(oCFd097|}N0IfiMZxJJXOiNaH5Z#V-AA80T4?V=!M%2l= zJqDevqIIKC8*Sro5#f~5+h{|$L$q*UNS)nyiz7X?Daiv|>Wd8S2ycH|a%^Z~Q-;Pq zyvCNE+Lf}6ciC#Z!yIhL&^?P=CUBU8Ge$p7U&0F!KV^%&2Oi_1KPx*7AMg$v3(Omx zImzeYu(!~fq=DPQ-D%AS=&}tLOfW#~|3Y0tW~0wn)nP6gb%3g=15`~Npla#>RrAjW hm?}wkm|u)h_zj*#P;2pD`OyFX002ovPDHLkV1i^06&nBm literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l6_bk_8_8.png b/navit/xpm/nav_roundabout_l6_bk_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..2dca4939d533b8ec1e9537ec6fd7dfd40d6aa6da GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_!o-U3d z5>wZn+sN4xz`%TAdHm|)t-@>WoYZ|&!gbea2dj>bj6=X|{hBrU6P9p#{!o`%GtrbO z#WTURTSi%or&7pb@%a~li@enL-MDac+JlK5@^%&m51Ss9mekwtXZ$sbZ@Jv1HD7=h OF?hQAxvX=Uy4c<=`Y4`a7bj{CC=Hns-+Bh!B*)G+;Oe95_0(|8TL+(W&O z2P+z0db3<;wKSUSRcEQzV9U8h|LPY;dk?#xPk(UAl-xTtDKV2$sKJdAt)F+|MaaP0T#@v}^k8Caq z-RJdLy?CD5g7yrzIR|+{_`+|_vs4xn_?P(F$iUiVZgJyl#n*p$&ag){vG&!vKMZw93w(rGagg{Onw zaJEOa>1=&+sAJL66S{m`bGBc3q-B>Nr}5k}=e7L3=&tBD0jG_;bvy_RXc9 zA!Wk5`(7?dwvDrnwYk%Fi_dv?m4NnTgHC(Mz&bGXhe;6gQJwDcGX?G+{@p5w^ zL-|JYhgx~d&u@>Ia`sDs$&AcriGB|i@65QsWW(skyg6&i*`wSu`3{}0l2iM4`r^v2 zzxS6{EuTL-d{TnFPOPN9!Q9GV9;;;^zpF0Y?zJ;!@09i*%a-ym-8Nv(HdcP|k~uHn zuh912_FvPDK2DWUp2cV;I90D`$`2!BkG!m;nHuSy<{SEDRQ63WRWY{Q&hUm|UQ$|e zH`liWG4~xN3H3*x7Z#O?9Cwt@6VKSfnC~_Je&RKWZic-(qE|2$NLch;+od4{cQ^ar6o?g`T?^%gQu&X%Q~loCIEIY+W!Cm literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l6_wh.svg b/navit/xpm/nav_roundabout_l6_wh.svg new file mode 100644 index 0000000..9109822 --- /dev/null +++ b/navit/xpm/nav_roundabout_l6_wh.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_l6_wh_16_16.png b/navit/xpm/nav_roundabout_l6_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..e0e8b9cea6363ea51b3f04ca6b5ed1a6fc76f08f GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_0JY5_^ zEPCHwFyuPqAkg~Ig~eNNqu&`@ojuFuhOzN4XuZBc)J12@NkO~WqD+ySS)%22xbvU= zJ>xU&uc)Zkm5SEz#S%h!C07?5&|$sNen8MW#DevGgSA;i4YQ4N@y$=GuBlA_aDRiW zt3>7T6Q8q}H(RgKkiO~gSFQz1SnI-cXAG`dW c!?cId_0M$!_w>1Uf$n7RboFyt=akR{07}nU-T(jq literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l6_wh_32_32.png b/navit/xpm/nav_roundabout_l6_wh_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..ad4dd88936ccb0c8e5c2ecf40f4c12c5f7551fd8 GIT binary patch literal 424 zcmV;Z0ayNsP)L)b7AlGo z@J;kJ1haM)mg-`}Ld|EfBWxyno4pjm{xC2zd(Qd4WoOQcG-}kSk)wbva0>W9V1{q@ zw(2zYfFUp;SrgzI@aizXOEI=}TPcKjD_32b-0iaFUEs$m?gM>b#f$^s(Te#7_D$|R zuvZk|$}0Q-v}58{fsqw^2HY5kw?ZH>Mf)kShY6n}h|H%zGzY+kh%868TB;f(#I{A` zCFaqWh%8upV-b0t%K~tbs=m7Bz%*+HX@*KiQ{2I`T ztp5(-yE#wJhp@x!H5_5CVNConFfj9;$#pljisorV8^Ds4w+`$UHjWfpBy6u~8Unr2 zW+@OJa8B6aW>lMT3`mFY*INldW+O@gnKD(?LbWPwL=8X#@Gk-8OXQwZ0q_f`C57&t Sx3|jx0000w%JXF$YYBH$@7 z*|cv-5^w?7$zi;gZD6Ho^BXx=-L)GVO_^V-Xg(WaZNJS=0=pi}r|bgLiS~71w(bBA z9cF$3cYqc!lKfi0U7+Kb_k{R<0@wo{)e?lb<8&=1+Q4bY+y&r^Wo{Rk0p4cD{09Lp zTMYaJ7IMr#m+VqM)`6v-vB+x>;FYEL%>o*?EgC7``;7fg!n^=ZRtd0WDSEzu#^Qhg z?~_&UN3|UReprOZ3TTWE2=In@#a%?e-l4(?JYbCZ=1Z$gfVO4)L=_`Fj7W+s*O1he z^jOmI!phih;#&oET=Y9z`RPX3+h_+kQ(E}1{!%T*GX8j$kmY2_xK1w=Vwyt-872?;!Tz{bh32|q-kG(q`>;NgiQQ*pc z2Jre_D8**h7~{QOBZoPkgaAzw0yIqs&@>@H)BN)RhHKIt_=(XMe*oa~&oH3291H*e N002ovPDHLkV1j;i8oU4i literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l6_wh_8_8.png b/navit/xpm/nav_roundabout_l6_wh_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..d5488dedc75bf5e678b83265681a865f6272f3af GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt@`o-U3d z5>waqZRBls5MX(JZ^Fe{6FXjX&S9GK@CNS=ZZCxb2X>y5`@brsEu9>;`r_L|xk2ou zr?0Q(Z&=a5E78cZr%^N_=<5@Pjt>0~Oi>F~YtMV-Kle(A)+{EMBkprI+k5?E-}LSE a58=EEhNc^nQkDSiWbkzLb6Mw<&;$Sr8AOHv literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l6_wh_96_96.png b/navit/xpm/nav_roundabout_l6_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..7ccc68ab75451779b03fc60ba88bd0bace73e07d GIT binary patch literal 1222 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlITsy$sC zLn`LHoqI4l)>Wjv{_+g7EgQpZ(EhVv=>PZLeJfExfKHs*NGhD@1$SLAXW{J07 z@_`jgjI-iCsAeu-Vq9Xoi0M1y?O@5XS`AAcPm(*Avze#g%j(+Kd+d{@b$o75aZ+L5 zAsr#TVSOA^9Q!<`GUn*+{ng#ypEb;9+p^Kir@4nAzpVC~cCIK>MRmgh9Y*5=%kJM$ zDmZUALtuFW!<=^?D|fdrfLNA5zW zo!XT~d_Q6@trME=v-H+khBwo;%vtoVYt0jZ2eXzKWp7AUY}qgLb5rc4sIFbBCs|9T zdvQEmwUz(w6M=-SDL+rD#Fc8t z-k5p!rrd>RDRWd9<3j}=>M*Zi{qpc~MCYcrzV6;ag|jO~p9Oa~#Jv2)SiyW_qvy?q z5ff%E`L*u(-H+1vr13gP*ySiO^y`O|KRZQ6NTgQ~Kg6)T(MatcGZj3UDa(x~rKTF5yU%pmn zEqcV!;3;Eo;e()$zl;hl>^j@qT;Zj5(y@2ZzvKhiKP(^KV>mx4!DmBW_-cl4Ox$`6 zidSj^Ztt>P%Q{2pU54C>=uLU`)L$?^yIexM?Pjqse>-={euwY{FboFyt=akR{ E0DgQj3jhEB literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l7_bk.svg b/navit/xpm/nav_roundabout_l7_bk.svg new file mode 100644 index 0000000..fc122cf --- /dev/null +++ b/navit/xpm/nav_roundabout_l7_bk.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_l7_bk_16_16.png b/navit/xpm/nav_roundabout_l7_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..6a586d43d929c32c3671b469e6cedfb230f0e4c0 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`JJY5_^ zEPCHw@b+R36li^TUcg*%!h+02+5($2w?7CfxhCNFk@2L0wZNt(iwmAIDj5pNw;N3} zZu|Y3Rmc~^b#CqF@W3})J#FtiX7+w!;m12av31d>XD5OfwhLA`h`UR)PG8P&?cyEH z%E*fMSD%IPKFB^DKli)4x#8QB=YO?V@Z@)Ns~yl3tCKGf`zoog89nF0I+hp7UFJ29 zY*-hu>^PF$!X5KhoPk~9fz;zzhOJrV3~Ii@`xv)vHR_*K^JO*A2MnIBelF{r5}E)8 CCuIEq literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l7_bk_32_32.png b/navit/xpm/nav_roundabout_l7_bk_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c1ce169305cab15705e24ba3d214326ff4d2fd47 GIT binary patch literal 489 zcmVlUJr384>L-6K!nkx9M z9OoN&h+&~LkFXip)G?L>ot)&t(AJ=%ur1U6bF0SF|_b67DL0(L&wS zehk+!jfe2iJuY@u_uL>}XcO?LiBZvd+WzRo!(U4^t z!E2pAMp_{Dh5O?;TiX$C)Fhe^?)eyC5Z8sY@3sVQmZx$VV#NRp{(h44GL)nYMF4~! zl0|$IvT)L}z9YeDCcd|FxnJCN`PO&p{&i$R8 zbMHNOsHmu@sHmu@sOS{E7{(L4MGbX)#$%kqss&S*!&=#M8Fs}wc$S?{w7Wqpmzq(B71h$8F0>rUf>P+lq7KDsMLpFabn4qK5&(XPM)QJWxg{QbF zoPlZn`!Q-bT(qcG%r*xIJN6l2_pXb-nNch*LGu*aNuWVD_Trl6d3pN0C~Y-rkdi=_ zF6wZn+sN6RAkp%Wed~q-Hd!Z+?D@BjZff>5JE0X7b<}IM!>T1eTjV!>c`$3b_`4lO zw$onx^{IH=#`l?Tv&)Z#N6agDE0uaAE<6%Gq%EozawBQc!Oa$bA{O_{{$V`MBj7%p S%XuNtG6qjqKbLh*2~7ZAgFzVp literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l7_bk_96_96.png b/navit/xpm/nav_roundabout_l7_bk_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..648bdf5abe021f2c72d75fcece8165c8650b6a40 GIT binary patch literal 1343 zcmV-F1;F}=P)Y5b_4DOzdOYFj@*5L}7qqDZB!sHLTX zQgk7x)I}FsL{LQ0jSE3rX;EAh>jy4e`%&-{L~Iultw{|9sbX8vq)+t4y0~x1R#!)$jfTwV2BUHn;m*0Vhfc{7^RfaXd7pNk zB5uY_pi(z_dpU}m@YR|{!1ttY>~7@~YCc4Ln)HplP`O_%`ovs8@zgU3yaKEPRsu^} z<#Jp{x|`w?xk+G9sST2{7ym{X2kxV{^e_ZG3>+_DZ%4scOUK3dPqy{}BOW#{!sT=y zo5yhdRc-Li{m&J&y9n6tX?sIK+ofV0c?0YUWP1QO;9-AXAp6N#iC@ki4(P)uZo@|6 z!(X`mr1ES-F2F_wKYY^QZ3=!wXAiQVe?Vt4Gy+TseR*8Lk2%Dc_1!3}{}yhAG&EDd zhr(-CEBG;o7y?`>tbaho3&+R8`m0pD$Pq(;^Mv&esd(WS6V|^(#fu!;0t_LW&@^$Q z4=s)f>z|?GMGkEN288vSDqhSYjdw=HiyYblOe1U5L3EFfoG+}eF&LPGwg5B0FT!iC z)^Mc74Z`}zRlLX%qZ2+Vtbd1!7mnM7^`)J*m>2>~2`G)H7W909%% z)?b4YAvBL7U)wpT;74?pAwT;w1}qNf!&2mnaSdv+7zgkj@`bQB0@)q}KKHQyZXo-m zz;{FDWs3C&{kU~~AKM#nv-sV(O`V_d+nFl`%kbZje-k*{!)8DJ`_RAQCXuV#{=UV- zkJ9ieevNS&_usdf-j@dYfY%Gy+u6F$oo#=AUmkXOxQybbpeJx?X(MnYol`;|@LB;I zlg#eMJ=^x%sV+7v!%GwsAVwL-{j)&l!9%6f&|=DcG%+iOaWnExzg0R7fm@G>@j}Lt zg4cJOH&i|i0X&Gl0LyWmx9|1yO&%+qhB9`bD*(9jsFNPoo?PJf%BP`>?dZLtlpz)2 zrylCmA`N9cfD1@V0O(zWZv^+RMH5*OG90dHcTHn!`t9# zs4Dn80XxwbVVatbhT8EF0NmNs^|)j2THhktsuFR@@D(7BmKYy|4799-5Fk%TF&em$ zR;>vwK%Nj{)IJSq3Xo?Q_t}GYkbO9?_M@R#0_4fW*w4Z<=h}~kQV5V|7`T`D#aOFg zw=|>{AkQ#x5AZg#V*CSKC%sWs)`CFZsIg)j!hHqo1RlrPO@PGI`tw{>zywH)36K~Q zATcIDVoZRZB<9T24hVQ6wF5>C`5(27D^0#&QX~KX002ovPDHLkV1mQ+ Ba~l8v literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l7_wh.svg b/navit/xpm/nav_roundabout_l7_wh.svg new file mode 100644 index 0000000..3adc2d7 --- /dev/null +++ b/navit/xpm/nav_roundabout_l7_wh.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_l7_wh_16_16.png b/navit/xpm/nav_roundabout_l7_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0c45c85845b350f200e031cf6e584bb8f576d2e4 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^zJzX3_ zEPCHwaP(q!6lr%!LnmTjn^3pH$Nm5smr1v$8QU z&FB1^;MsYr;{UFHp<}%w>_u{$e@#Nq=4B5R_l0hCy~k1@-)QMq*pyoFSgm2cgq>bR zWkvqepNplAy`Q(;YW<}LdfRjt)$#K`^evdm6!T#3mqz_UyT@BSyNi9e8yLfGJm8-0 z>CsTO>zLJ{g3DY2-}&5j98JzXQ2$Cz!hfY|{g*GyXG8>cX8}FH;OXk;vd$@?2>|gX BW!L}! literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l7_wh_32_32.png b/navit/xpm/nav_roundabout_l7_wh_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..46f36051144b95ca00908b315c3c5780543fe175 GIT binary patch literal 504 zcmVCQB(LeY;0@<3k}3ZQ)uT41T~smbAJ{)7cS%89d35j=045t?3_8zpEGA?H-w2M znrNaig_F3Cb^JsRudssoziB*&RrHP4F79G~*XFZ$-e8>TDfV><@MH}0ftI^6U#LmG zj?0))ZOs+D$zpmq-UYyFmUs;ZYvPXJT^4(%3xJI*>7|C)Ygz2ew&qdQ*#q@8bU2P? z0AETTQ-%2$LggL z1UThStzi)dQp_Q|$YOdppYG4Js6hyLPy>;xmyLJuNY%La+5*hrSpnc`2C;>2>HZUn z4OxPi#bYBrMk!_h@m+O(Y^Ui>EVKd`0y%-@8ir{cOJ)B$WG+Fq+lCsDTsPBow`Q)J zZD;~W&*pIpA5s-|hC(*AeH%&uLvvF&tNKg&h|lNyvqi#5x56* z=#6>cHn6_myd_D%IPg6K@oszpj`W-S*&M`^SO8A-i~I!ebD07lD!W5vlOFWIZ3FAd5OBdlpaqO% z@E>)|#F;V#Ok0v)_K0!U65~Ng?u*GkTas`0h;hIYV;LexI2N%(96-aGuJ zhz>b`IXrf?JOYM+Zw@kf@DR9^_}(8(KrG^94w6rL{N5t!vlf8KpaNnMwgqj&Dx!Zn z4X^mKNeo*?2@w;(*DUN~`!o?REG}WoC?R44(WSoKOF%-z<9K++VqQ)ebqN{7aZiqI z)&jeMi$oiN>m{R{GD;C*!wLNF(atg|q5<>4GfB53HRJD&+znhu(y`E_mcUg)37Zk% zJkjZmV`iGbioZ@k!nO|V18(s9zTCYo%Gr(b2?qp zWX=cFB#lWrEa|y1=4oooTnu|BU$%g(D0>$w9F>56VVi4DDD#c0;h@nI!XGo Q)Bpeg07*qoM6N<$f_&LY*8l(j literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l7_wh_8_8.png b/navit/xpm/nav_roundabout_l7_wh_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..a99b7056952b16cfd9fe1606d260ffde84d02d6b GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_so-U3d z5>waqEaYttkYIbSE*c@G;1k%b?jhz}Drn}gk!@9I22XpX{z6~X={3)aem*d};`nz- z>Hntfze1u*&+gk{=D_*JVd1s?{I$F0Uv-sbl(X#U@T_GNEnqksKH)}#uF^3bzqv21 V-}S$U`3tm=!PC{xWt~$(69A8XKLP*% literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l7_wh_96_96.png b/navit/xpm/nav_roundabout_l7_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..f4321fe864ef3b47257d8fcad376920274b3ae25 GIT binary patch literal 1542 zcmV+h2Ko7kP)QAE9!1yUGDb|I*To-BpRgy`afh^DDUSg6_PI75y8dRTktxS2CEYwx|* zI%l_jkNbRU{lE2nXRp0(drOH#B9TZW5{X12kw_#Gi9{liNF)-8L?V$$Boc{4qHdVj z4h#oiilhaSE|D}#(rigHB=t)ACo}7kv_sN2k~T})Y>YV^-rJf0Oa&eSHUfRP(+6w- zmIJ57Zcp0)oC&-HbQcJEGyVWx1kQ@xzLo_T4Ll1Rt}yU<4ge1TBVxC=r2ysv+dT$8 z&zHcA*zIl!fct@-fWhzQPvF|v?T-rZG;kt9@cTIi+z~qtQ2-u|82Co|fTgkH5foqr za6EG08|eWqj}eRD6ER@Eq)n1KLTeAfuad4X#_SI%8Z-ewhotW%%?YXNz(z?o8e>j` z5)3^aep0O)d`Y@a(mf#sgWUnZOi9~RuIt$+=@UtxN!lstKz4ncr1_F=lC(_H_>vm4 zj4{0>>S#THH6x+|hov7cUwJk$?$~_FKJpVcG6z zKiP{H4R}pJHi~eW(DX?<;>jIJa$V^>#fujW_`U;1I@|NzIBjj-_cMWU^>N) z4>n~0jcM4?O*6LOb~k<)BUawPPW_*!qPwAq#tiJNI?wI`67}hZ8o{39Tm>8|9{zz7 zkkvmO__@Kf%zFgOLdGU2z*yiB;5!PuQ8`52w*W^=1iqir-B7!Hu4ba7LoQ{EF(xZJ zMbhb#&X;tJ?6%}Z6}eXFq^zYWat8pbEBKcWMX7G6wqFgwZsgn>K&sTFthNa-#vo~> zY&YSPn<+6Gs%-)!$r!Ur(nLv%CA}-@FAp-ES^f3KwPS8lM+dM7SWC4ZhWfZ@yV_zD zB-sSG*!Pcu2C1(@_CtV6W&gotUheLdG}#!_Ricj8riwdYkh-h5GgkO&drROm0Xdyc zU@7oEZXXV;*V<5?PzlIs_9tUKL(iPMspHyEKQR)J)9(cC8X_4Bs@828VkaQyODAwA z@LoeQ{st~~t?Pd~3aSe10p9tN4rTk@PNW1xrq(mzb|57nGARL(NePHdN + + + + + + + diff --git a/navit/xpm/nav_roundabout_l8_bk_16_16.png b/navit/xpm/nav_roundabout_l8_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..c30a053b5b8bbb3357603b54ea4a54f378c6f06b GIT binary patch literal 283 zcmV+$0p$LPP)#V)@+NZ-mrY7{Zu@!!ghpwSBxWc$Pm+7_Q zGz0G#;4FNMlP&=-G4B-GZnWnv0beoC7urI!&)VE;2zW}}FSNa?HxWnKHo{@9s~61SMeI_7X(8`=VfxC_6*M~nX# h{cP`J5pSt~@B`}LEUVh`YWDyD002ovPDHLkV1k9Kdr1HQ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l8_bk_32_32.png b/navit/xpm/nav_roundabout_l8_bk_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..cef29147ec7f38a699cca4a3f727ef1fe2e9231b GIT binary patch literal 462 zcmV;<0WtoGP)XZSK|wpQv$RNIVJrRs z!A@%tDe#6lb63*99aI}4lZ-AA&sm3!gB%$+mmoEc_k7V^j=kN+NB zDdzSAMbmx+-qYKOj~-wJxC9)aY0?2MfMuXNEAbL=9uN)7GhoEFcoBF=AnxZqFl^I6 zO%ZW`Ym=@requ{}Mj<}}Mgy2JpsL`eZ5TKZq&4(|Rsc=~cHf49J3%@Xfh`N{tqlV| zg0wdR+b6JJapXz9*>BMwh`9TNb`)E*ZtF8Jq2MNg7lGZhVW0$j z2;v4%31BL~o4|Zx@kU%1XJJAL zxxlVc-!o(7tPR{4p;x@e$uVu$jHUVENn~J-zo)-xYO}V*H3I;3rC!fMJj{UHh0InT zW&m1uA+yy-8Cbx(9UH)WJA{Qc4QzzetH6_KAGbsJ3$u{OT}!-kMF0Q*07*qoM6N<$ Ef=6b-qyPW_ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l8_bk_48_48.png b/navit/xpm/nav_roundabout_l8_bk_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..88b665a7f28e5f9102c9a9a65bad5526c294866c GIT binary patch literal 753 zcmVM`_Iho%?bukj^TX8lj_5B|V4Om{hN$IQnOjHA}3 zjp4`4=aXPF?r1N(vE9PP|3U8u3}QmM_?b3=9c7E2VJlv>5I5KM5?e~vZVCSFP3S_BFQfAglxYAXn5gta84<*F-E)wHjSCvMHt^Z{SG5R7gCQ`-pq&nb> zNdKFJ7%|)4L@l`rcpm9rn-F77V(ch+3V0Cd|2`qcu1Np=L@l{Eq51lKivBtHuf(%R zjNtA^+uQT-X`g&X^L3%e2d2eM;&@OwnqCH#l4 z#0&UUhvGY}d|G%PZpM0iBRq9t+|6PPU|k*oMNZuYT*px?jMyy1vCQr|7NsUhK6@l^ zTNv44;fXaad>?v?1;V{?xK6{Ua8OL5$O8TpHm2UJt;QYxqT&p=64Fe4PE1+=}x-$Bddx$!VsqA_R=eiNJ8-Hl}&Hjn0=LsG+ j^owZn+sN4xAmVay@r+p!4I9#CM@;$Ku`DgR(Ke!GqOXox+pItQ@dhOiRHy%Ldw6!s zjKj6cXM_@uw#dX*>_~O*<^Lxr)_LJ^yKr(#rIL5iC8(DQLxaRX zU;5CV>OV*;3VIQupn^ghM5BkStQU#uDJx2oNgsp>EXgU-u^jbbp95#Eb3fMFA7|ft z*AEtRxwFsO>ucY8?%MlaFbu;m48t%C!!QiPFbu;m48t%C!!QiPFbu;mjDDg~w*f-# zDCAn;dSJMC{tsZH_gJ6yy+pX0A2+CC4AtUWfIt0%xM5u0egra_+}Xc7AEj7 zYleaENFV%Cz5y0T_cBv%!QC#_75q|;05?bWH9LlZW7Hq~QpSO6qI#SWbAYd?Kj_VJ zps=m)d5!vm-AZ;u^g9bifobXwbSpUz+#SvPSxDInY5)g;`#kmh1AGhoh-*1CaDAZ> z;9mS&4+nwOo;tGR3H++_YhWEPx6K@Lf%UlCOP{$O58`n~G=RhCg7FuyNipBk#kHC_ zf1>v~#cf%QE)d6X?Po1Zf#b@#S9;8w9XpW+;3V$DnlHBke=6qR8DQ=#n1?(7)4&4( zZCH!^?(0-xd(X25dG);$!H)M7cC3kDM{>3ybNWBrZDnX~!rkXfY}p#Yjv1uriA#5) zzQAoihUNsW-5}wv2zJaMMFN%y$A28f3dcU-c&Y7TQY2uBaQydCtZ*C>j=wRA6%|q> zU`ROrw{T951z9Oo{~jDjfe<6e}E$3dc)r7n33ZzX->#1eQmzV-)%7 z`Z60TU66OJW(FN@J%Hs_cof=(x7{K6{%*Wkz zNQ3rn@6o(=k8$}PuTKIN7CN^F^{hwG-n|@R<|d0a0V{wXD$gH4ex9kP(I(&`uHm*D zSf#jj74Q+4H|-{fdpaXKd=d~tw#9WfKcoSY{C1F3l2(7O{$j{0k#(Pqs6R`jRl0yU zt6<<>`%9#O0(eewT_<@qs+Sp~Nx%^9OBbPne}bCZ5_O_U0EAry16%!|Pe7M!t30O(eMRewQ<1V~qbReyyL z2>{tDu + + + + + + + diff --git a/navit/xpm/nav_roundabout_l8_wh_16_16.png b/navit/xpm/nav_roundabout_l8_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..9d49fa61ea7b82f00c7fd16d79be018bdfa9d779 GIT binary patch literal 284 zcmV+%0ptFOP)%rS+F2`zwT+;t%P^4ARPMpbRKXP( zbqkgjYHcYNA}PYL$Q3@4m^^!@nVCCx&ijG?D8CKVU0^5eeJSOkim0~K8)svnwrT*~ zEWE21YA>~Frv~sE^Ik*SkM>*x_=0I_oc6EGVLT-tHMGO2*}@x~<+QPSl71ZR zcqt%|eip9tk*ZhCXDxaHz)SKbZ~#04+rVWl;3tN_DzF8t0q1`OjDWk;x22SiCH_gM ir|K}dt-h)4dEReA+QE3~3%Y0k0000;xgEQtZS>FpY(vprD=DSz4s9uoWLb zu+v(^N{F?PLJ@s}pn?j5SZHIsp}Tw*8F4wD?2XyV{IIZd=AZL_JM7Jvjyme-zst+I z5a=_;lXRZL6-n^ zCBz3V?GY&RN3O!Bl;#J(aL6+P)D+*O3xGY*w2pG40R`Y#cz0a@+=!+V5#EaMUb_JJ z5>0y|yuHHv5!XM-Gy5sV#RzYI%-T!<7h=2+;hm3Jn_j?%*w#m2O!18aPr|$I0-y}M ziN;N!8uC9}$^ZZW literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l8_wh_48_48.png b/navit/xpm/nav_roundabout_l8_wh_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..173de058523dfaf25061f83f07966e89599bd381 GIT binary patch literal 797 zcmV+&1LFLNP)6;T+*f3IB=f(lItEux|pK_yAFDhLUZ7DYjuXqOa) ztEfc~g%%a{7nDKkLZo#Yp%#gPP@q780{<;d!ok^H`R?;uW z+#izG=MmtX!@z>1euPa11#(o@MF1BL2}K-tED0%)#+4OYaqN z*Zyzz;AnMl%=-EXxeKjwT>tIC;i@fpdI<_Jc!4nT>~d2|bMh^aD>4 z#+xNQRP7)3V`?vk6Tt!E2lF1_xuawwa2nW@Kr;wjNb``NrUR7_6OQ3sz!5VWOQ3jb zW($%!CG80DkSah8>;^_8-2j>#HBFLk0wZzl8eb9bvxf)X0G&V|PzI)m-Vgl&Rs-$8 zl|>$g%xunAB+CG=fW5IsiRck@GttX55p}<^1Ioai5Rojm&vRv&T*kkEzHs}K2f z0IGK(_3A@T0jhMNE~^jubpYT#Fdu)P2OiXeH1$6;@oBTI%Fwi#eO*#JKy&~cFthV% bwE_MCOpXJV^p5-I00000NkvXXu0mjf2XSEQ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l8_wh_8_8.png b/navit/xpm/nav_roundabout_l8_wh_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..f3cd8903a5beb4e9677d9d3063b2f78dcba37d51 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^Bo-U3d z5>waqZRBil5MX&O7c9&zU}F4p(HnOY)6GoP8#t6_3kV-J{n_l!6MG{?Vp{8cB~7oW zVC(18IIRts8DE^$*(a{&xpj%#rI&k7%wddRV4Qq-0;hBUljwyy-8%;+*7fqqyRKAw VapKRkb3pqTJYD@<);T3K0RWJeJ0Ac5 literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_l8_wh_96_96.png b/navit/xpm/nav_roundabout_l8_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..99248c96d298b25bc892e477136684515ea9359f GIT binary patch literal 1474 zcmV;z1wHzSP)lzGMP-K zOIYdxTma@tnkVTZNtZ~PRlfAIq>=LHu$c{~sjy=JGk|-5*MP$e&Iqs>xEq+B`Z`(% zFdujoIOZVw**I3lnxFc*8V_(O@H%iZfbjjCq;SQ>sjstf026@6fIn*xzMrGOBfx~z z*WCz!X~4D!!uRtAFg5k{Ck2=V>`oy57@q<&Q|pifU^XzEQ2a5z1FlG=Lz2${z${6- zCCy2Z{|xMxwAjp!#7-RjjR-hj(iSyGd`X%sX-ipKR8p)2o|1HPg1qPAR!L99P8#(V z1T0c<>uKr|a8%NenSCBBVYC4NOwuk%H&zVwhosLWeWham$5iYK&6jk8q^esFyUc7^ z#Td;4xU1r7pndaR4IK2$y(FXtNdY!_2=EgyJ3#I^z%L&8H-)(N(lF#wl4w*R7*Dhl>Ew!f^F zDtd@90Fxct@2{l_zu2y|I}>97&U0*kqLwQBV!PJvOpF0={YXEhmMZ*W*S;MQV*rji zw)ft8s3G=mwN%kVi~-o^*nX&%Dhd`mws)=FnHU4`y<_`3YN?`Nm1BF?+MS6p0DB$V zF9Cvo0;PBw=jyI+Le~);V1dUT%zHJ|@u5c@*MzPk3Ha^FKM*kg{T}&izx_l5*ytg^ zU%)K^a<3?3x$pjGL=syLm>H zIA(Unx&f-hmGrx$1!i`zVw{1AdPLC7_DgywW==;Qj46IHfS0P=BgTnag%@LLkQ87t zu%m)lGl7M`mB6%~xV~(s3rA2~pg1q|mZxA3_x!%LC#DbEQi`AKn7En!BWaDKcRji< z?D_q|3T3=0X>D0c5~6=2q!%+g2CS0wuVdHaDvqa5msDltv)at6uAC~7bO0pD%tmov zJ$|fW#ZpPU{{ECFqGJw9Q@^QlE;dWr3Iuz8O!1xJt&+O42{$O7Z=L{qfFa*FJ^hA& zFMD3v3AmnTYA+QA0E!K_Ex=NbzDt3voW5x{LO^$oM{ts-y!7?}DhaUuvlXN`cnb5PE$~@uikJ zz|4%|5#>I)AAdg^KS;XD%#H_&HxR9KfFzYdg?uk~I=1*yiyct*3*~|&vtMel1EioX zNHY7SmOG&ATh#^0X1~;O2S`C&kZkr#9dJO|-`536XTQ_|2S}A%kaYG-9dSSz!_@`J zXTQ`D2S{EnNIv_e4mqHVGpGw1G5e(sIY4r9K_g~=V{mh@y_OgM$LYy0q25B9uFDJ%#H&aB)!o0Qoi@c0+_<7|92+Z cNe37H0}M8qE2QBXjsO4v07*qoM6N<$f~5hm^Z)<= literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r1_bk.svg b/navit/xpm/nav_roundabout_r1_bk.svg new file mode 100644 index 0000000..7d89c9e --- /dev/null +++ b/navit/xpm/nav_roundabout_r1_bk.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_r1_bk_16_16.png b/navit/xpm/nav_roundabout_r1_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b2b3100a91398297c2862e7ab235599abe9d1588 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`JJzX3_ zEPCHwG|XahlsNkF{wuAl0Kr@xk=bi6w>b2rOg4VXFilMCp27q*Unyz-1#6p@ozRm^ zNp;Vb_xb#6_W$ad!_Hs3e(PCTJgDJTa2CES6Lg&6_lz*kV=GwWl)q0p{qWY(iR#-6 zxb`T|yU@qj^XW){rdn!4cGbst^TR^+GalNqT{yaV|JnBE!n1FPd44Ep)X&*?INLB} zTeH){{q@Nma=&IA-=-lY(tGbi<5k;+prxV>rJ;xPgB4`v3kE%p0(ybL)78&qol`;+ E09d4HNB{r; literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r1_bk_32_32.png b/navit/xpm/nav_roundabout_r1_bk_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..08361528e99f73efa0ff029612bb3d2ce36430b3 GIT binary patch literal 439 zcmV;o0Z9IdP)9YGkz@!we$F%c256+}`50zxViv@k+iK|wA2239tL zg_U4w5zsQN-zIgM1RFcGFeVW%$w@JDP!4<6@npQg`NP7_%)9UN>^qlTI&|pJ;h9py zBD!OH8oli#D()EH6-DcqL4VA#+D5Ln*u+Z3_$)r%r-457RE)pG$bAS8s($lkK1f^> zsq@w^%zG+x7`sFKjL%beMWu1mH0~@ZZP*$Dn)6gsc zZ?Glo|5IThHpWk6+6`3(8Wfnq4i0fFoDVzAN&crK&7!Sx)$k6>IK$dQ8>r+#exshW hfz+>I8S6O=`~!yEXf>6)ACCY4002ovPDHLkV1nj-!0`Y8 literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r1_bk_48_48.png b/navit/xpm/nav_roundabout_r1_bk_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..6ac6a8b87cb49091104304269a8fb9b43eac22ab GIT binary patch literal 607 zcmV-l0-*hgP)YWU!jV6U@_j{c@NLr!*{GLL{SFDvAl=zYjCt6E&mT&FpWJqVocx?R%H!P z%Q5+8VHy6KBgO_?!|@z3N@WDA%N8-T?9jOOXJxDpF*5NG?{dbd;TtaJm(x3Yg_S4^ z+wnlyJ1z=4`OvT%pRs@!SX!?~E_AH7`m8a^7(U=pn=vbK zNGO>(jp7q~A|x?c_rEBn)o;l$Y;3yLN@OQ{ENp6tUrMhufg4?jjoAuC+-N@Mzz|j2g{N-m{qOuNoT;>I4ueUd!w&;oA)-v<2=(x-399$ LS3j3^P6HP)`v8Gzka{&*RQIpn;-~+AP9mW2!bF8f*=TjAP9mW2!bF8f*=TjAP9mW$ip-) z!__!Av$9?IR9o#aY&4EIj`)aalQ7q4GKndQM z{XBv-ed?#NY4-1*@n#J+HI5CqVnE$`TsqJ1r*Jjy7^hKf;Tn90uW(L9+t`W^aehVp zFImpRk9zTYcLm$HTnbGc9F)$epunRzjbE|7g8m=CDM^51xT%6|EO~aRHhsKP%9I9O zXM!47N||2}G@La!- zzLm)aQpR<&6bbIlXh-dA#Z!1!-T~2#dS~J%8SQ8-D{w8&&22~!1VPX~aty?-!XtPH z7vR$jHWaxCe@SD3ReIgDxxEAX0L=&i}96icg?GnRGEX}pgI{r{oA?KnO{ zpJNY0%NE-~jdV)3UoSoQw?PtMv$Pg;2d*5GO(&&M{P8jMH_?3s7VnVl+MsRVhG`)zakO9_a$R(Csxo8>&lyB3&_dn}6io_-rVL z07X{gZo|bG^eVMRkXwKvt8tg~a=@+_e@hRal%mOVL3Qoh+0vt~zu=3qKMnyhGs*Xa zTR{krnGhf|AwXtAfXsvdnF#?h69Qx=1jx*a+y<23iQEPR4dh=OBuOTuHAPkc0000< KMNUMnLSTZp4i@_W literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r1_wh.svg b/navit/xpm/nav_roundabout_r1_wh.svg new file mode 100644 index 0000000..c9fe0b1 --- /dev/null +++ b/navit/xpm/nav_roundabout_r1_wh.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_r1_wh_16_16.png b/navit/xpm/nav_roundabout_r1_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..83a78c91b28ef40c9d9beac17ee8a42d07e4509b GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_~JY5_^ zEPCHgSexhMD8lyqg7@V%1|}9!71I~9+FINXeekJeP+>YKJt4tB;>=f-B~yK8N_m+5 z`J%UP{_Xto=V$c(sQ8u>0T-8x`#-RbI)j3sp|KJRAS9u#6A7V2Ebc;oA| Va*+u4n%kWj-n^UHn>{H-iWDjSBLD;J z0U5hr1%~2qc@Yy202yNplGY{V0Z-C#RIXS6&Vi#4{}yo7O98_`HpD*yO!p%3SlFBU z#IL!Y3D>^mCE+SS(zc}82=RRmU>Vqq5MKnQTw*hhoSvjlhr|<-ijwB6sqDz#J%DlG z9;gGm*5=tE)%}bB7J)k-`zWvvJo1YgumjB4eK83E9x!j$IXa^T+yD*Wx@!R~LJaWW zAfN(#*!2rw{P-gG#@+)<0q%yRx}=JvCrQnznUz#XM1U1h^)X*c+K_Z>g-l8sw7#6A z!#KGD;ZyQ6`}_)MNnjfi5nyc#zy(kS-t9qb;*BJ}hA;swJ`Y#{O29Ml%Flc#we!R- zNqbUbj4zihdqL8Hq^dFI9xwL_v*>M1z88A%Y2tg(=bqHue@a zHVRsWbm;;SC4~_?NgG8AK_NwYL4t*af`vphh(C>Zc`R;^tmjR3clM8jd8(V4@8|t? zzx!@Z@_0NRkH_Qjcs30{09*$yNA`{Z*MROSwIv3413ZkZZvnr7{wj4@0Y-u0$a+Ty zo5PXMJAqSW>01|IE3gDSOW`vM`~dbAsVy-;Z<_uF_5c@()U^2l27pE2M1~mqfIGl$ z*BF7TqohNUYLdQXh_PSNq@+t3VpIoUfS#&#Y)pWo(b=CNPCXAjE{Pul?=!{-fbYO~ zUb@mGKM4#t`VIn*fNtP6Fq*Tx;sA~VpK0;}*j}}uBf!Cgwr7A({L53ID?IN7-U0WD zRlO#t4txaW*0I?IoC{m#51n}ebcF>1d;w}@6>$+b(6;BoJTMtqmw#8Hc{P}FECApa zuuAhy%~VmqRqSmN$J?nd^u#W;w>BA?bmn)*qlHNoOr~ zS7P&}QkM__%h3%<3zD`;8k2NWQeE~3`BhS%F{WY5wIzd27k)~5t>h1`N79I-S2ly( zTPTK?l4d2XgzJVR+uLfL$F@=K*uJT4HbcM!@F6^2wYaSS<#tMv0wT6G;5=}jwL4NH z?KG;afHuDX7zXYF%MsUUn@_1z$QYA29}uWHUdJRY7-ODyjOnB>K6&N>l2Y~*${k-o l)ol0ziu!>#T~OTr_zR1MHFTr*ro#XL002ovPDHLkV1iQ<8+rf$ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r1_wh_8_8.png b/navit/xpm/nav_roundabout_r1_wh_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..e7ddecf3eec55fe3de64d8d7ad424a88b065d558 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_co-U3d z5>uDcrJn+-RE(%GjaN{HMNDbW11-{sPyW7A5j>OQOwYQDuJ zTflP9^BM2TdEM@Nuk8Do=y$aG!MeEb;(V_b?7OnuD(Ks_^hy0z%={0y@0dAUWbyGl b7Nrw+Kxf;9-oPn9OBp;}{an^LB{Ts5B>zPk literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r1_wh_96_96.png b/navit/xpm/nav_roundabout_r1_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..b4b73337f426e322f84a768620bdc05204bb57d5 GIT binary patch literal 1282 zcmV+d1^xPoP)`XG zJ=5LQ+w*>xo|&qC?{&TISMPOKk7O8zVHk#C7=~dOhG7_nVHk#C7=~dOhG7_nVHk#C z7!d#lfUAMNl=h3twy7ro`hoX>89Y~|^m`3B1-uPxDcjCYSQ6WSh2Wg~Q_^LU`om8f zQo7zGX;jj^lCCJ;vhGF&5SsU=#2Ya1>Zokd9k{!@#9Q$X~PoYkF-ica#8qz?Ml^sS;G+60N0MJtGatxZ?r=dtYQS%9U$W?*&u-iBcqhLJC&7azb4lJ1g!toVgbJiF_IwBY9kwkW_SXvFmL>-riEPV27<_3&e%qYrvy-}oAz&1r7CzplUs?P>s84`zTC~?I z3`sr|Euc@Cd=KnMY0EVXReB`=uuRfUNgqg>Em{3pNf)>H{SQgQ&bf1WD2Y7>wBsK6 zhxSJ!=uV6E%O%~Omy)VG;IXhRyI7jm{Lx`=UWzK~0H9ye$C7?4S@m&ALv8xhFB?h& zSPAScY4ZItL*HDop-NA}%>Wdv;%iBpwD2)G=$zZrt_V1Q-eNJZOT9j3qtfyw!=an4J@^*B!s=Bsw0RDxG2TM@ZRZ&)3 z2RP@D^sIcCD3Y#0bUC5|5d0YYW$j;-+*jLoCSArrPkkB)T zzxlTxIG;gf*F{;SDa!!~oegJ9(7tj$Pn~a3$8bPG{~)lZjWf3At+z77c0j_GLEvuu zp940W@fZH(lT7q%7L*sja{2W`Q_i_>v+i#Wh)k_3;l+SCATs8F$e05nV-ARnIUq9T sfXJ8wB4ZAS%+lBfWZ;R|1{gKuUlKA-9s^Cv@c;k-07*qoM6N<$f_4a6L;wH) literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r2_bk.svg b/navit/xpm/nav_roundabout_r2_bk.svg new file mode 100644 index 0000000..a228549 --- /dev/null +++ b/navit/xpm/nav_roundabout_r2_bk.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_r2_bk_16_16.png b/navit/xpm/nav_roundabout_r2_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..c4dd1bf3f53cc4777f1c86b6e4b74cea7ed29bc8 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`hJzX3_ zEPCHwvgTqk6lr~UK0IA{QERWlBfVt-<(bRpKHw{n)^j)#wPEvwjWZ-UCRKK{IIF0V4}&i$-8xJ_En zE@f@|8KqriF79zLtgkKmey(J{vtjivCr6m@!wkFC6S;K8XAd4FVSceltLtW36W@hiWP-| z_!df^L8&0>tqF}F6f+xR%D*8;l;P`b+pqaP8K#nmx zIEdrq1kSOX*GMnSVj-h{9-|rkD`g2EVl^OdA4hS#h!5Oiqo{!;%mw7lh|Wce%h<$Y zSw_0?nbDpS@ed=lz@mGi{XGpdkme0TslFF92LlaU;WZ#{GO*sCv90?SJmXG}XQ7T8 zOn1nc!b3{9;rkHg5>C=?dB?Gd`;_=Qc4P5E!b!$(ff3nDoor{KYr9s4aEltY;<%Ie zHHOO+<_r9VdQYxqmUx5WSW?5&96dGf=ozp6|F+Dg%{)z8eVrjS7uo1z|W{WMg z5JYUW(?)w=P)k36_QJx7g_YoUP%LyUw%C`6#T_wVCYwy|?eZF>(VB4}yE08fNgY0Er5Vy+asjshEar3WKRSi|uNa!=w57D};Mp~VV4 z8aWbqz03X@C@|FH6=_3JGk#XYwgfY8aV~~{d7SN#UuWR6u|^A?QX-J5#8jXuO; zi}~mARkip{;eohPiY0FqIEagQCcK%BYnzw2FQM=|I5j%1>+h=ZLwK)R5{&k~<8%0i z2cz>g;wZnUCrCzAmVcI@cD(DeBP2K4o;aGPMj55hmsr?8t&$dJZo$`b7$q@`_~t7?rV4x zTxQV}e=+&A{Q=>U11(&oR)&v{NT{D;*|9O9-;pckU7@}?}(h&sak!b#wz+mfS7 zdPnvZ2GCM@Kehr>?{<7#c zOWqj9uqzwmR~GO|9G`nPT|1|kL*k5X_USe8JUvgpeH6YC_dieVIxpAs>46JW57_lp zeETRW-Vu^1_<`*Q#~Z#K{X84QfAGkx2;Lu*YJ2e9pP;Spl9i{vcNS_?KfwRMhLdLz zrv;ymNycvZ3YVu7A22Q&+H>ACgM@_wc1z!n9M0N9;QM z5;i;TUTe2)@A*57DoP!0*PKfkH9E9@Xr`>~ZqiUb#USD$DaL3LB4FKk`+#afyW{U^ zj8CR>-U-;D{3KcTb5!FxdbwO>V#>8Cjb65Arm71Bj47}som=W(U&qQMm(gTqaE?L9rfh@?yOZQb6O@Xe(2JKZ~J>*oxgJ_Rmwbh`U}mI8%!SO z?YPfT_j!*Sm)g_UOIg2jmx~*;{9YP;`a~+%_d^H%8NCh){NXyK-Y3>O@UM<|(c7<+ zHXUlNwtb?P$6?{}F}pQT6R^}&*Zy5DLh(p@92D$JMIdd!RH_C zcQB8+|0?iD=ADXtk{{PjJLLcH-_0c7Cwu)SD45@vzT^7@E8btTE$Wy%TrWQU66JO6 z`L~T0+qUeTcBw$5!H_k;fGbMwktDnm{ Hr-UW|ApozV literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r2_wh.svg b/navit/xpm/nav_roundabout_r2_wh.svg new file mode 100644 index 0000000..94cb7cc --- /dev/null +++ b/navit/xpm/nav_roundabout_r2_wh.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_r2_wh_16_16.png b/navit/xpm/nav_roundabout_r2_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..27109916a60a706f448bd5e1fa1869ae696064e9 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`3JzX3_ zEPCHgGUQ@16mYGdrt3PvHQMpWA?t`0+qY~H-qR>H?+~-bEv|2$bj~|k+ruIN%)`CKxjA-9}+Z&ZZ*)5+oR{~t;2jYv{bQqq4GZ~*L;@mMGj zdJ0_HWyR^=1FbSJT7Yd}C(v&IwLrfeEBFfNDCRDJuB~^0FJJ&1mIY`6b;aBku;#2E zEyO4ahyoy_cc-2KF-p^O5vdttZZ!ab_C!RgUhh*x-WD|gBJw06V@3G7((h*koG6aq z19-`G7k~=T2R7%-YyhubaL>7f`GdWH;PwKmz!5O?!l%HQ4KE(-g{=S&z;eb`ySfAF zz<%jq2fzTwww|YFU@2N~224m(;0EwNxnBY30nNNVsvl7nz>JYGg}ib<$FY?F62PAW gXrJSdu44dv1CUR0i$X8-^I literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r2_wh_48_48.png b/navit/xpm/nav_roundabout_r2_wh_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..feadc5de30e7f1305f28a07b1621f2ec23fcbe10 GIT binary patch literal 535 zcmV+y0_gpTP)iv&na5iH|37D|jghA&v^tDDKUn8u9Y zP{s3Iu$69OD>4a+`8l9&GdHt>GgSy!#Oaz0e9E&vh-y{@Z}G7v1FLz)i|Ar~rnG~I zhY_(>Qv87_;%=ezn>fp|)hx?CmmGd_MEkyo=niQU5gQTlIwDS#j6WTCK4N?Ps%`K0 ziP(jAcr@X-CBqNsbxl4-@c`E*=zkVphlt<6g5ClCOZ(4%?8kXLMQ4b3c!7JZ3CArQ z&&!kYL+`t4IXBvD#xaL)xL?A+CN4HAco2C8_vYns>EcG)+P5*L_%&Q=TkAkZ2=Cw- z4!5myCRlMJ-YKW|`~Yn39-)im!m Z{s2KY$Zuv!E))O&002ovPDHLkV1fWr^{fB@ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r2_wh_8_8.png b/navit/xpm/nav_roundabout_r2_wh_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..33ddee7a080f210686cf9630a981a90c666385b1 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`fo-U3d z5>waqt>tY95NO{2`1nFjzS9yq4u>){4sled9ZGUY?A|$j&zxneGG}l5psi9mDeAdu zLuy)n+Vao55)FG#aK)LsC$MEL=oIc=;(cj~+Ny%bjA6#slLVN{ZT>O-lTsJ^>v%-~ PXcdE}tDnm{r-UW|)$2Q^ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r2_wh_96_96.png b/navit/xpm/nav_roundabout_r2_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..0960f61404fff305bfbb52401d1d8deb37ea2dad GIT binary patch literal 1015 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlJ8*Lb=( zhE&XXd;4s+Z=uZbkMHw)+I!kRnkf0FF4akGn8xf`F_ z^Y;K}g4^Hph@=CG54``pvWs|X8Qu8q$N4>6{o5IBKT6DR6uo(Vk4nSm&h68`ANV1X zoa5i~kuT$P(z>NAJ z{RfMTUaWuv_Xci>*8$b~1;Q(K2(cVvc>W`LXA{G>qvGEfA|?c%6?>4iXl3;(8-0f9 zE7$yRWZ2xezO&nEUh>;_E_c%p{}J15u@P;G9<%Y=)`X7|eZ&ysPxybceM_I?e z@#%r{iB1|d0+$E4y_@uT@}Q zcvTbA3HPfCA`bihaVmXhXfRFNcKA%(%$sus4(*-ux|;1n^!k~xMw{Q=(Pm~Bk`EJ? zd1XGyUryR+vT*!&t1I~`vTONV^Jm`-H2$5G=Kop8hk4!k*{_@>A~MqQ_dcI^;qr#+ zLz0oNY#VP>8{f`N`)qr!$!2ZYI{QcVXS}#GRBuU_MZUeT;(JHKOv|e;gB~Xzcv6w1 z-!R=_SvTW?xi3mwb?X>5Kbn93P1+pp1flx;VpTa}*BzJtFaRx9r&m>#n#b zB)ge16)3uXX8d+6c}lS}+lvn88Ivyl2>$s${9V9b7wfX8cPE|Ux|p?``^SV$KN-?B zelM%pEAaNc9?LbR+Y+ozYU6VPS! zpJ)*_BlxpC^V-f?(G9Xo^Z(=@*yv(h$8cJxKlQEjh8v%M-4$HhlXsMNr^SE?D;o}sKNK3Xy5!k;*!J*+`irFs9HXZ>Z~9#)!F zV}G$~-%YbcZuwJs-z)z*FIK#F{o)NlCbbL|E+u@KyT1Qft@(L%xmiip+wzqyqvpc+#(eSY_1YeNz?{tB M>FVdQ&MBb@0N*>y0ssI2 literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r3_bk.svg b/navit/xpm/nav_roundabout_r3_bk.svg new file mode 100644 index 0000000..bbb2966 --- /dev/null +++ b/navit/xpm/nav_roundabout_r3_bk.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_r3_bk_16_16.png b/navit/xpm/nav_roundabout_r3_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..421a6bd7a01638a47f7938aea199147583b8aba9 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_uJY5_^ zEPAhAGURRylsNiPK9HxZvt`o3H8uM8+fQaKtzk~xYGB~0Deqvoansv@R;5w9A|58yB`aOJKr=gNY6F!;!tA)E##Ht<<;FO<>}c5|#-4GbKW z1sBy=VBqAjAM&QA55qau)q-(PECX+_mUCTJ-*d)~qEYvYa5E;L7a!0S%nwP5?<9c# z)%ec%N1X)>TuR>aYB~g~Y&Ohr}S1K;{Tl#i2gMFmMY!Xm84akn8RM0000ETp zVJjA5VJ9d?K|#dcLb1`mz`{;MMX(Zy5+#UD;+eCU3nu68-tD<}v%-F1V42(9`TlO7 zdv2DBii(Pu48#`5poaapfR%V3SEn;-7{^U~Mx!}y#FT2s01jdbUj^X>f8-mOh-R0< zDjdT@d>15tSuVXeriCX{8gAj6a?88sVA>Wn$VI8PsX~Zc{7Znd!j_;L#!}|{`UD0sFKiF;ax!K9Rrfmm0~E`2L;yPL%aySb=^PnZ?ntQN`JO=fVV0GC1-m+zgo zj-ydb6R6>X&gB5)(p7x3OiQfkR0000w}%S(^b literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r3_bk_96_96.png b/navit/xpm/nav_roundabout_r3_bk_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..29ff9a1eda49bb62087c5c14d37d10a4eea07e87 GIT binary patch literal 1242 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlIT`aNA7 zLn`LHofEr4G*skxz5Dvo{cE_FxqWj~oE7iU^w3%0t3YE)OWR%%*9rQai}YVL3+!!A z5NP2S61=`|fgIPb51KEQwtrI9GI}*B{HV*9Wo3VN*u616Q(;qn?xu0|`>SvE)@^uj z&$#;An!W$hudTVc`FX=4jV?Hv#8tdhwxdDuf#Czb2U9lapETgfVLR5SnZP!KEzH|W z)cWuNu?HNL7p&iE8opObm8h8aX+iooeFLq>X)!5|{{@7vY+4}xHkmU$IZ<%~^AElq zUjH5SZ%um;XD%b|cs_@#_?d=nf#jD(vYeJ3%N}aKm{s>{0jtb${|j?N?2A{uyCIO) z@ZMJbvG*C%1wtFS844~I|ChgdbLZ1j-Tw`{8w?XPH;7g6MZ90}-uvx8?fHx=Kk2Ad zlz!fSuO>7>)4);g$mbC8gzSX-(&xDnCPg#ZWVSyXR{2Sf)+MiTC{eAia!d zN8Bdcn_rB%_VlbYtJBJye)V^K;cM42)q+X)9Br?;&ps2k!g|B94*~_PH4jdwWtK0y zkXHEcb6xZNoAYb8cNVr4P&3!rYi)Xg0<3<_{~7(SzjhDeJIes3#4W6gJImhkMm@tcB+x0z} z`f(yavE4eitHl!zd}rKcz-H69(rsD8b|$&o-&A+i@2OBcWA#bv@%018<&Ll8vJ$zm zUxBCSbMK8upPrqQI9exq$M3$M=aL1d4?LgI^@RD1@CJcBe*YFMjj#Li(4$M|piS=P zpWosY93*EkeO_TEYpeG#Cx<8DT0vN)!sI*E@!PH6igC)-8*ACwUj8*Gjze%m1d}DjP;!mbqoM%pL z%e%t4s(0_JikjXBf@eYsZ|+(kaPWVVNnFeuul1dd_Yc~8?%4gwZ6l9y`V-?H(+%vc zmz6xs{liu-RiSnxL+TjA)q4dmuj?&dKkHixO9k)ugYy^s^Ln$SK=Mz%LHVgJ)^%EQ zbC-PAxW-w^RL@r-{QEhh7vt>(@vQq;<6P>`pXJ=f)N^u2ru*c)-RU~F&69Gf429fS n1;|H_T;HyGGqKE}bAt4(m0K9DrYg7s3o8asS3j3^P6 + + + + + + + diff --git a/navit/xpm/nav_roundabout_r3_wh_16_16.png b/navit/xpm/nav_roundabout_r3_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..7aed151e44e04716ff97003b8ce7062ef0539f8a GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt@!JzX3_ zEPAhA+UUjXC~@TDO=m~$YC%^M0i89>`=-BN92ynPdf#Eg){9Cjog7XubJ%llw>YOf z{qU)k)B1n@Gv1x^DZiyj`p)CRH=lIHZv41-cU>pD#X*tv5n(5CGAg^0V-nlG&-&BU zzpZ?|zU9gENxqt?t$$VWJ=HwLJmuOh^%vZo8GD88^}78p6J^wXzB+U2+Ld`?&of^A z6!G7BuqOOKWb2l#$DYm*^Ubd8JGmk|gyY7um(@oCe;Gfx?*8gUCC3NemwWbV3Gdu| Q8t54YPgg&ebxsLQ0I&>rPyhe` literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r3_wh_32_32.png b/navit/xpm/nav_roundabout_r3_wh_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..2389cb990e21151ca93bf3f33d0107109208f02f GIT binary patch literal 477 zcmV<30V4j1P)vajZ@=V+VV^O*4QhFGav~25kNh83#q(jTuD5+CY z*<#9)PE%@q063fKfrxjrR%V|UYeyxs^4p*_MeMf$XMusTH<;tq3KxNnUt+p|o4~{- zumPlP^=I;F;4ntqQefb`D&eHqG4#3q?VDJo0a}3WIHAFFF%tulW+bh|jPtpOnZJ5~ z-iRUG%2J>iSOXe@{Vp56>p=WD>dpu$B=GPe=~Yt2gu{M^>^kQz6XcJNo$sGG2`iPg zftGKCOTaczpPRU6B4h{XNt!414?;Kt&bd^%s=K2zpk|PpoXhp$x>L|V;f(21TL2z-hUL3_Zeq_Q6su@k~Sq0YNG@jvC zCOI#kN%W+4UIO>=GxAH9d92D;2Jj7nKy(lD+G9g108RlM!+z>M*_@XBx|Ae zw~z9EKHNmzA^eGixPtQ-Y=?8L$klAoolVp}js$q#4%e8(E}Uqxb~F;;eXBj&0=7j0 zOf`C}?zv4ZqtSw<1K<)Snk*lQjCb@5^o0;+(ceVvxybmtHTZM}fdq!D7eoTwE z%2F#2wg~yVP^naE`Fh=UGuJRhfYcNLQd0y-O%Wh9|9yZ~JkaE^w@t@g#$RJPl&dg} RwF3YE002ovPDHLkV1mdQE585$ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r3_wh_8_8.png b/navit/xpm/nav_roundabout_r3_wh_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..0be9be884cdce446dcf39cc8924a186d3689ded3 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`no-U3d z5>u!4FXTNGz~FK}aK*|@rdfWC*+CbdN-&(|(K(=Gv5R5bK^q>`53=ccJ5TR@@*sZY z+^QgbhSlpA1#WlXmuaZpd1r5JK>n+L?F>0r7<2oUmAmRGJN=Kd$0wGw2Xmh6 hdh+_wk;OG%ne?BUe9}<)b_!@UgQu&X%Q~loCID*NNB;l- literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r3_wh_96_96.png b/navit/xpm/nav_roundabout_r3_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..b90c846a0140c6d578a0d42ea1c032f936ceb754 GIT binary patch literal 1389 zcmbW1{Xf$Q0LM2rrg7-po?Y?O)VpCh5@-Xgb zN5eXKDC$PNm6iNh?)7~bU^wftkb$2mlxcJGcUxy4IQFlrLf z;@8lS+t5X>=HW zCSt3-xZ2d8agjJ3%eBeZ_Fo7|QG@aHPXlS0(#@gFwQ}pJ(7xHvsZIt3z5n4ZRH)Fd z*FMpLEdh@9pnL}Q! zm1FsO)VbILMW+Gf3WK-8I9Kj14Oe+9jyHLX6Mis>qmYkpwkz!Lv%BT1O})0_)ia^r zLVp-Q0}}-iNy>sp1p&)yD6;dPHLILfcio~DVaD-cjmxBXVS9`6&Ykr|7QhwOfXtEDPB_ z()w1563|5%R|SHKz-xH&98u~6dUYl4;wwp}`J z*3Mz0FZ=1z-Tm`wD1u7uiz4u(`~L1~VTIy*cCm%*4B4!Ep-9dXeEZVL1$MEe?2OVd zv@^=Q8!WjgUR(Z!hXFT&*deeba_|l!t6|}2V=qS+l2-VeD9(QM0@mt#e*iA3clywe zkmQM-dE&YuDRwcdV_Ap|0&WLShHh%L1RcUdc+QS$5M?kmG9$o|((W zMMk(X>y?B?ksAY0@kLFDAZRH#kzW%+9k^|uVz`FBUufW!VjyZ1V`io0n+AFI@N~zR zvQTCf4~5O<#hY-tuAw1%(QCbeuT;%em%c*~9jYeaqcPw%S!`3`|7ytneO`$43P!n3 zUu2TSk4tQatw*2pgQeI^6(-XM>SudOHk3Wsex_%QFq<8pJsJ;qLq?$ zsJJ!)ZxvyMj&3g+tJKO4QM5_=LCE^BmamCoz4<6(gHnxWh0QRh`SkK^CdKHlL5riU z7)h9IoQhC0)j?j$GYL0Isdf8%BW$lM`x5_@A59h_(W$cH7O;(~XQO~1SXk#$FlBlL zEwPX!Vs?hGs#k>?*ERI=@z#y3;M{HjGe~Zxfyu%n@OC@YH` + + + + + + + diff --git a/navit/xpm/nav_roundabout_r4_bk_16_16.png b/navit/xpm/nav_roundabout_r4_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..167070c2d9a76227d7f9f516ac0261eb2f7b89e6 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`3JzX3_ zEP9tt+{ksvfv3%WsX~U}@^xON@3bv$l&`tKE}$Onc>mDNyJt`C)YEMF{K)i|^8>x< z|98jm?aSsj>68j)EtsxR$GF8o{bH1>vhse0yaV3fj2AG?o5%NTRkQGhZ!;LPSYJH( z_B7yg*jn!gIui~H6!ZBs$7nXVN7(c+s0ljgXTOlYwel<5jt3P@Z7t3*l?)o61&{L| nVOW;rT=FvCVVcGMWeoW_GnF_K{@nTpbTWgdtDnm{r-UW|cfnsm literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r4_bk_32_32.png b/navit/xpm/nav_roundabout_r4_bk_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..952833435a5d6ddaa1caa9dc5f189d0c7c15a59b GIT binary patch literal 422 zcmV;X0a^ZuP)})Xj?540H(q-4seJaOq2}}DGt!Y2Tm|hX5xLV4VMHE*+o`}JXP?5{**o|Xyl09 zR*M)+@DFK~=AG}W@P^qU0nRbqroE9$iUi1_dJN#YsKE1B$k1;j2Jn(LAnPU^ z#aPC^zp8EDSKzA1;JeZ{;e8CC&{C{pJi#B8;jNO(Fw!z6wLb})IL;C*&q+9g;gmj? z*vk>SBPGrHP3y0ic2t)F(7;@$LAtrUG>eE;=~en4;2+>m0`zq;_MixWPy6X{;&M}! Q&Hw-a07*qoM6N<$f}%saUH||9 literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r4_bk_48_48.png b/navit/xpm/nav_roundabout_r4_bk_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..d24a56a64cc00b12e929fda2d23e22d8671dc55a GIT binary patch literal 620 zcmV-y0+aoTP)Xd2#Sq}sD-&)&SK{f?{05*bGth(-WP_Q+ne3_{r>;m z*_oj_T4;yTs<5BRSix2(k0Wa-%yD$k4W$##HHKA#2A)P$RDk~IH!chP(Qi~1(xTs( zETl!h5n0HJ{y(3E6@LqDV>6U?-+!fj7j~3%pBC0J9e)47hj4`5I24W~rjFr#N&Sz_ zElFh8a9;Z3vw%0Dz8ppA2rgqL)YA+s;VACmdIXKR8TArx;W-XOQg}+w~~=9uYsP4D-rY#a6{`+0me+`y)7j7)huPGc87;$_bEpF-QkA$?CtzRYW5YN~~0!?W-r zrl=w;7;a#_P7!x;XPejVHQd0@qBok(Zj#C=$vg00QraVwHHKHkV#@hjYl_0000t~C99VA#^oVXSGBA*7OA?!*AUvt*J`WF%xP*kn7D)+-JsW2#FfNq^^5l|@8#OK* zKXBkfS7YNr_UWASfr85n4GeM`IX5iOtmw~EVaP4vx_vJ5sy5I922WQ%mvv4FO#n$y BFc<&; literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r4_bk_96_96.png b/navit/xpm/nav_roundabout_r4_bk_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..88ee08551dc7a54f137335875bdcda95c74e3265 GIT binary patch literal 1153 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlIT%sgEj zLn`LHonxIL>L}8-KRYSONySd+h`3l&|0%txVqsiSD;{VsP~gg9`N-L{RKaeM*|jn; zt!-gh>MJ|~1e=o*54bCKNad=Wj5?#YyK=^zn{zjBuKr$QaP;n7>*{BJo}W24cjn#z zzgrFK9R#N7KQvTTKPO~uua&+hDn!w$A>T*rL3D+m;4_uUbLFQB%e`I2^1r+8Y}1?> ztKMHvcl0|W@^=>Np)0~b(&>sch`iylKdmu2XL0=I1BRK4fTUn1h%FciWGg5~F5WK^ zX>fWwZKoaz{UUD1-8GAG-6DIZ%?Fw~SI4gFS~u(J$&$~1BfHm$ zpJ@pBk}YWoi06C>v)BCW^`6H5 zUf(B8_uSoAY=@3=yf812$~brPTib!B0bfivn8klS-S5rFlpt|qW;VB%+vS$?>sUD& z0?!K};+MI5xy?i+uW!VPo<=Cf$dH zo{UTn)Hej}DolMSRvVvf%ArPK)rgJtwJwDeZx;CGtsWPM{N5U)41;} zX1k*>m!p>Hn@HE;1L;1=+qv#7XS;JOu3>qTnP{8k0lQ`M{+D~Qe>>k|xFGt*Isw#42RMbA|#3#Si8m4QBb<8}B z?~C_*mp=Vkyes12%+E(^-yEIu{%+r0;|J@vIPTl6@bY2$!;cqPd71bPV*}>h<-gJY zy4`in3WMkkubYlAA1N1~VlJ(_{=Y(!Ym*k|1)evX{+wF?w&_4z!p^7VT84_(yZ&Tk z$feyqxa`0D(u3-cZ#6uYIPQ_hxsvhw#`zu9N*Te5I~?xZC_i%BKPHGdFX{cC2Cg?V zx~HiyCop_&>+!ZSTyMU#@L#^x1{KZ%9^r*+`CjK7)A{7GIyduFX!|!4o3%4?HD_PU z)m)TPxXSn9{_Tum%+n?An?8M5b9Yup;V*_`ip@vzH+fjcn?G;+Vt7yUVus75pUNll zdNoB&A1Hi~z0B+CVOih9)${Z61zsJGnrU5soIm+y^2AvG7ylL3BdRy|zew$asK + + + + + + + diff --git a/navit/xpm/nav_roundabout_r4_wh_16_16.png b/navit/xpm/nav_roundabout_r4_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..8a2918da10a3d535ab4909058da422a354655c6c GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`ZJzX3_ zEP9ttG~{A36mYF~5eO4pojdjFE$xUGvZCJ@l2Wx_=&pIY{r0I}H(h$XC;5JHR`B^( zf5vA?M+5VQ{>r3>LKQcH|1qujxq|PfkAltQlIdTzEZw+dtKqVqoEcT;GuWi9_$m<|D2~ x2b}I%ss3-^7x?^R+Ki?984u6<9xeZX^-jZ`JNyc=r~t1xyyyPXSfn#fd@(Sc?g84=n%jJhN$-*HttC9|1=Wz;i6) z4Peuw-HZd!F6-mF2xleDdA1#%fMX{DPch9;Jr?1s0}wA2?E;%GsPCp>BWW7u2HXJ_ zDc7}+U&v0lDrvf;&7-8V0B?Wwn01HmuVUF&odlo;toQ2^e0l+X{RbFhg1kac#nChZ k7y%3&U~GWC7cl_70CATf;bMM8rT_o{07*qoM6N<$f+ZWUy#N3J literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r4_wh_48_48.png b/navit/xpm/nav_roundabout_r4_wh_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..4edf03cf8b40a9d4a19a4e68653de92df63f4b8c GIT binary patch literal 661 zcmV;G0&4wCjsEW}16sD&qI&ttLUg_FI^W@mR?I1dav?3tPGeP?EO zX6Hx^0n7rMF3mO-r!jzsz`&)I*m^1f%mE31Nr1W7y1W5aGYmYAt;>sy-tX2ZWb}S_ zMxmhhyD2n%*>+;JXVvm;>DaXw20_&2Vo7pCiS9C$r zlB5fgK81+g2qh2k0C)=Qi>)&kk2ev(25>I6);|DKz=F&BG5~JI)-Fi`UIFg`t6<=_ ziSx1b3pfHCa`~!!0}jLxJqZ*phQMy%Byb<-6_|L^mhOMWtpcxsG0*bzz~>wTeYWvt zs=JkVDe0M+B|e4C?46`VNxh7p$0VJtsiz%)<(yG?5nG!Vq+5zC*4h+t8@RR2x_fdA z{HWSioxRX8NxN#)?=B&yP{tD7HgYyN2(WyA^7f!y&Y>9VpK&~EkMQLjkUQhU65MR~lesd!;K7aLNVh5m7ll?;pJc|GT literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r4_wh_96_96.png b/navit/xpm/nav_roundabout_r4_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..8734d34f729f20db5b0516b28d610a765bcb2016 GIT binary patch literal 1338 zcmV-A1;zS_P)AjQv%XYt~p7O$Svn@~R}D#f7qjkQXp)Fz@xlAnj&rQ0MX+1;6aX0r1; zz1jEOnP;B=^UUr(GaD&EfVIFW&hsm<*4nPY06fh?p0c)U5CCJq=|u!M4UAda*OZH_ z4QRn5lExP~J}&9uo^2TxOGJONS&&)=9Ms~`UokG}Ku@*|ixotFl39>a1}qo-6*&uh z(;)hj%YsxgV5QMtk+Z-TEuufEEJz^(nnr&`&VsIVi2h`HY@h_Ke9vs9I)W#poIVcp8-z*8_Ra@0`9OFSMszJpyC`wW=&X+BUw5M zP%#Z00!FRJlN_D|sQ41tVLhg#@GJnp6mYloxS|CZnfG@HW`ToNV~i4D6nGN&irR8w zAOWCwP>ZrsY69?H%{edCj)!ChxYJ_1vDJbk>1gfq9^jH5`W%t;7O<^{zAhlDYG?)U zrlj8_J@1_Rr#!~eXL;dMNxPhLGd=W`7J;XrI*0lkSCkphgmQ|SkhERWZIbp%y0$}; z(~_=t&i(Geytn~w0WS00<_K^<@MDK8c-5y(Q36~AoCSUX?hVlXdW!XcHv9!#;oGLD zpeT-2oB%Ek(1!zFZz;l~zU_$$U_WrO9PFNe{W#$576Kd#Wm7Z&mjVy6Nd4b)KVvk% zCd>hwLfSPbC@#!R30|y=@kuxoM310i1KQy0FZ#61Io1rOsdkDEYAA z?}OKddS99YZjf}7q_dKKa?X9zWA`T-{(fT+D=Yz?tzG0^?78oC4KKp~hPKIi3QE2f z)fJ1~0h5y6S1|?kIsHgd)BF0VAXW?&;P!@7Q1Ae;o`U-3)`q|THi#891|tB)W~_S} zo;Df6mO6tGK+=7Zu4#DAAPRD82w#l5oMPRf3A3!`VjRT_8IPBa3AQDKq8$BhL+1m0 z6w0P30A8pK_G@>+Ln^ciwe-o&NxYWZV-EdmIAmDI9#8a zI!q@`_=KUqJwx$aaJ+QLB;}hdJvjeQ3^wP+_$0hf(#_@PEh;wYhGtgM1J1ecdgv=| zDDK_&0cU{2wd0|fW3}J&w*lA$Y^ePmf*BzH$MuyE!1?DedMhSLJUjmw1{d6<@#OgY zqIO$4I(`ax4cKBmj$~=!^cmn|ijwz+<$JJUHK*d0&bc$zMl44%#W-kI3v$jSF}4_= zga<_yz?dw6F + + + + + + + diff --git a/navit/xpm/nav_roundabout_r5_bk_16_16.png b/navit/xpm/nav_roundabout_r5_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..bbee7922392c2e7ddb1eeada4545cc47abc0e330 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`pJY5_^ zEP9V#FwAmt6gc*AzWzN&VMpC7R=HL0AM+OR-YzLqyWydr{(&W|skK!g@bV3gWd%o{ z3VsUH{gaR|*Yu5?^8I78?!J#bu^s$dx)W5- z7;sL0lHBYkxTKwJnZ&{_^&aLYwyA5m;sW}zwlds!b~bXKfKT?D{~u(7)HEI%&RXzp z&mjX=2H)eMkCfM`$QXu+net!QwdCg#;RpBQ^DdojC_4B%T=0STDia;!bEm2#fj(jI MboFyt=akR{0LVLTq5uE@ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r5_bk_32_32.png b/navit/xpm/nav_roundabout_r5_bk_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..17c26c6db40c63a54d645fd205ae774b74d7cc7c GIT binary patch literal 461 zcmV;;0W$uHP)xUAweYLhY(c5d{lvG;wh!WV}R^Fq2Sd9ykp5a_2mM&N*`#`ug8B*ktbm zUgHeEdW#eE5!bj(Aht1sLazW`;vBUks>%8i2Ux&JHvtB4ngU2iHF>_z%dA;hYuLwC zYVWU5fjzv!1dcRX^#faYo)_4(MjQU%1iw*9Oq*4w9y=J#3Q*8!!$o3#pJ^OlP|OOk zA@qD(XhA0cHSA^um`M^n#&QHv#tKRp!y9~$0IHbE0#Lx5#-OeWgL#NYP0p9_ErQt0 z0+7}$-eKtu^STxzfO1{{Pw=9RbE6SJB`<(>RqPa?-TQq)_!?SiK3e~5Gk;5s2m^Va zN;r1A0vmY&)HR9mXzwB33RiRd89vJ!U|qNqXnhgw@KQ8eCvgaSv8ge}7kt1gJjVNW#fy+tMsFM27Z|f}ZDh5%Mu@JJT3Q*s$swE7 zrg5FTIOYIfiI^z-(qJU`(;*;b6HS8=yJd1dU3GB+T z&u;vX9O7Czn#r8NRZ*FYHN^6ATXKNc9d^v*CZ@FhH&0@}i>Et127?pnJ>v&qeW-TVN3cHj zy@-4br@JZJimi&tUkRg`PM`c`b1sl$OR~iO;0d+_v&%u6{0KI8a-gLw1M*Ps)_BY2 zO>-JmfY4L{LQ@3@O%)(C%RWF)Nyi;3>A3Z7|&iKU8s2xZRBhY5NUnrzc^v0nd>%zOD~w3W~VZ=Z}6Nfxv4SLLpX?I*#__A&n+JW_MGLP zez=~`x}0Or!b1)3>lJuw79L?%zGXUrWnSSyVb-cSk9H*+T&u``d$RB-yYC*xx)~QA h?z7u`!szHN*3^f5zdz4zcm=eY!PC{xWt~$(699n4NHPEb literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r5_bk_96_96.png b/navit/xpm/nav_roundabout_r5_bk_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..067da719b29c243de3a9007e7bcdf216759da9ac GIT binary patch literal 1294 zcmbW1{Xf$Q0LS-WD{J3O=$3iz$kGE&T5L&XyOnm<3CS2`h?u%;-A&9(*_g)?Ysx%C zr;ZL~Ee{KKC+Dh>Sc!Sa*w9$q!$ zOV`3zcf5p+TNOO=AejhS`4UNM%_R`Xpp!!M4&ao|mLBC>_@e(x#SBWs^uhciE$)x9 zNC83#3PwX|47}YmAhVQ!e7;Tvwrg|b5CqfNYrNemRJV+cX>-Cgwl@_w1xBFv? zZn6Z#Y|rGKk~38qle8c{c(QlVC8E3+QWnYNG!{j|OE$qYhkTeMn-9W^Sy!;Cf&j}I z-%yf|uix~+f%0eDoU}T2I#F?L(0KD!isHLClvd2@M}>plLr1~w5EJ=ch8fHF4p@r9 zRVt^F{y{tNym($|^lrkW40kr%_j0Q@|bUd0F5QEd|A^@=r(2F#^`KSE)uV-4O!Bv@^h-V zOr1+lko-RFvj4dIutz=i^Zq@^VJjab@S(b#zGtRt+q|4$yx>1Zkg=1wf{CjR@wpQ6 z>CirZWe=W3=1}@viE6iipJqIKMOBd9Q`Fe$13kqnjXmps<__#|0#cNCcZ9w$sU`lk z@=jruy%RtfIn6Z{O=!%bEjWf!7;YWT3I`9)^ozphaZ8*c<;IM&I7(mt^^0|R}+Hl2UqFP$et*@t`iL7|>>hZp@%WkQd*{QG72NUnj9)8&F}DQL`DbOlPM6ih4{ za-O^hYZX=rwmolXGCY>{8W#D+r>`*2FmGc_b98WaNs+z$mT9)`+LMznB6 zJZC=EwMMk{(bW`stq>+G4+sU74t@BDZn!$I?{VNL{pBkum<@fGgCb*xa=7}@hvP?+ zJzU{=wtKsm8C!Ol182uiZ1m)SHn~@iQ-+aRT=G8K`S`FvyCtpvyxOnho)_zO*{+N_ z(_hte66*nEieJ2ehe+hibRZMrI{p@Lik>Ud&JF8Yk@w9jBuPe3Pnac)?|e(nBE3Qe zzYks+b)+>(V&xS15n|h;yGf$s%hr`d8l){MsVXV9!u?ZPSrP`;iuQE;%}LdGWi*lc zY$``C%B^3rCD}x&5GP`q0p&4sF<5`a=LrQRMl5T$H)tDRY)$(Q=-EAr(vZ7GIQvQ}Lc=~h@t)veHncu;WQ-H9`M7x$ z5*Q~-am~Yiwot}CiD^ie!iP#y4d2;~h*HC42@5-lQDJ)QBqm%~nqivi$vXdH?w2xD zhc(Dbl5TXeM#7&nk+18ncJ4F@QbhBf@G|oSdn#?};0qbktxY>`js>@G(FHc2!rtga o`v3WVsV+|D6K-3k(Y!xHvp?$8+XtI4s|N?7_)>{=`x)u~0TOLg{{R30 literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r5_wh.svg b/navit/xpm/nav_roundabout_r5_wh.svg new file mode 100644 index 0000000..98e8d37 --- /dev/null +++ b/navit/xpm/nav_roundabout_r5_wh.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_r5_wh_16_16.png b/navit/xpm/nav_roundabout_r5_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..69b41d4132d54b27200521ff45dbfddf899ac44b GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^fJY5_^ zEPBsgF!W+^6lr-lEA{;XjTMbjv#VC^ZM-hfV`d!U<08QSfU}3CSiBs_v}3Mbc=4c| z>Ba>MUta(EdDWzP<(R}i=aT)5XKFJ#*=2e^`mXw2IO(}c?WE%>>=l~NWvbWmTHSek zZNs!1`HpEfj>+n6=;MtMI}vFte9dd(P)qW@hfpTOOS z*b@=YBH~R-$ykYS58u(lCoJL|I^zO3gU^1cD91g##AQs45+LED!79qn z^N850Om9R)FCvyA;!;G+V!6_)_jrPntx(}?r48S(j<47(P5-2)m>CwJQ)$DO(!7aY zVY-gjz&|^sR7Av!i1^u#y$#oJAtLTK{H9;Fw;mk90yZiuT*GyAaR67bl2xI=sbK&* zm{ab5+`tyz;_!g@F5YDjkB6v1U-I*~i7SK5D{=D~z*<`XM{&AF+)M_r*$O~iVY(?m zt@9nTSga9xF&lrVlfMqY6y|n`>0&jjz@t_GDkjHpD4RQoYqpQ(d>fu<8{jq;%J<#0 z)T(&~lK<_wUSt0#0rvgIxWI#vnpYrlJ;d>*d3M|hn*j7BO6jk1jpv>>0hj>%%K%O9 edR5(O1KzbFvoMBvZjyYq_9Jl7Zd1jt7&+~nM&V0|z znThDrr%#{%670tXj9^aHK83**zZl0=?3y)Uu*dJz((xTeu^V%%_RIux(lg(R@98*! zTR4CPRXhIyu46hQ#LRc*J#Ju4)!sj8(MEXz8jp|l(lN<9h=GV0kBGsnmqf%=L|l%D zv51(ChUBO*3M#EP`Wn}~Q35f3Bcc9JB|yCL5ee`%v9>G%LQo34#Krg6Jxt(Mb9 zkK2&VV*A$@p#p0!WdwLsrt?gR^LUHgZ}W_`TQUNS7u~CH z@os>55%DFX{@f%|ZPAT74uC^x!L1!EKb$fD zv{RqLU=Sy^%GpDoL`D_}ETX2^fX+N#73U|Ghoh3dBwqd8|D?)KWdA-EJD zaHVOkD3g_){Zx1aOF9ft!@tEo6uFof1zhjPi}ZvYW_zzNV^70_vpsD58;?Gc+|!y9$mrTc$=zTu|GH9cnUk9ncTS`A28LZKtAC}fG<)SITUUAJ>f&Dk->){R n$UoqnGdX7Y?==l^Q~$8W?KkiI7aF1rbO3{=tDnm{r-UW|P9sXd literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r5_wh_96_96.png b/navit/xpm/nav_roundabout_r5_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..66f8ecab7df077f43d196e9d2599b6d19c930c59 GIT binary patch literal 1442 zcma)+dpy$%0L6dC9)y)BEh1zKc`eL4?`=dT&6_OZDp%%h*t{#`v5;58NF?iqpIy;K=-107`_Wt^B~V; zc7HEpkz^$;^%|@|IXOR*hi#)P9eu=GGQ3-hI&- zHP}BI+tAehc<8~@n>(XHU%t3cB{Y1Y1T{3>lDuxIkb_l{_zxL^EXkHbn1QhZ95h5Y zq$F99ZOG<3W+Vc^6}mRm0XCj7F*cMBo(CWc>HE7-AfG-VP=?e8PhJ)(6{+%~za!y{ z9t(l#Y?Z452Q+X;qoqO3)>_&Goa*y*UuMcuAnL}nAfhgHO&c&GO^jr>7$F7SmFib! zZH=?=Maw0MEZKwAvqrnd8eSPgsTaha(-VZkum-4}5mI`?i8$0}LtLzqY{VcR`U%@g zAQUkBPLz5-if(0!b)5T&xP_9%Z?nX8^H!Xz@lTo`>7k))RQBw?XiTRL zl%_%LrjA}%6&7cy*zn-aaXVrzuzn#gp%}79q*@w{Nc-__bxnMH^VNafkt}BlL)@u#kL+w~RTI7(YuwF*z8MZQBfT z0Yvfm$I9G8p>#KN5uCPiHoTe<379~W+>E4yOb8_jMVj(5$ZYSfubxn>VY<*H+&2jRzMw4g1t zOY2wkShYYbpS?_vG-Y>{$DsuZ@u^n%G8?*nu$@h-A0vNd&u$l>h2(g`LA$nMJ-M^v zN0Jg`3WFxnI*yNWZ*L-;aPO*iUrAG_VkSSGRH*7ad6xFaXj!FkLNLUuVn^a~<<~bi zG(t0=AyUZ6bbScdt@5nnGoSq+cdEVpgA07r|6mTjbD~4yKP*n640-utXE2+AFaLzkebPLDN*Yh1*h1yR8a3Q>5C%ZB~PPK2b z=x>n6dJS`{lx+2jYyM-EGWRD`y=mF${)*&x6W%p9z7=2L)sgR=Y&V~>a8tZ(Dg!Ry zE#Lq`*Kar2sKUGS{k}gfsxC^;gfffM_2=-fpX`;h))l}@OM#5*AnAi(O=S@uJ4tpS qimK%Zkp9sYT5Ip{A$=mq-#sJRB-twWjPvXBdkBdYA literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r6_bk.svg b/navit/xpm/nav_roundabout_r6_bk.svg new file mode 100644 index 0000000..1b3d205 --- /dev/null +++ b/navit/xpm/nav_roundabout_r6_bk.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_r6_bk_16_16.png b/navit/xpm/nav_roundabout_r6_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ccbd0ece842bd5925affe08ba62460990291dd6d GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_0JzX3_ zEPCHwwB%xP6li^TUe!d;seWG7DqLMunXBUw3Rwe$~aCIn^kCL__ck}>{V6k zS7!a2GEw2EvP)N>@I!{+l!|9ctBoX+I<>bsZa6F<{Kh#iSS9YEkd)uWZqF;moI9)I z?zpMXsXWKJGwdoy_MHodZC0HvSRtjjO#ZI8-Sin(B%f4vOV=mQbkuY`{kv;E?=I7? c$#V~K-z!sl{LGVmCD5S^p00i_>zopr02)47IRF3v literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r6_bk_32_32.png b/navit/xpm/nav_roundabout_r6_bk_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..4f12c703b1f1567b1317d99c43cf1ac4e1f3448f GIT binary patch literal 392 zcmV;30eAk1P)sb8&bI^nnejQ{Y2+rodiZ z@RvYefCn}B9Y`#_U0|%dw{^g#Im5oSeaD!xdErOlz zAc+5nh-hmgd4nj}3Kk-QmD-5820>%)y%xI{*Jc0Qy?1g~alUX^7-r7-o!OZ)vr8lr zi9{li$p6b!V1Ea20cUXtvuXQhyu%8f;(g$_W3v}e&_ln*dU%XIttc(vBEG5@p0^Ip zx1jeAmJB!RRc~Wy;;K^?jVC^v#Ns3b&*3gEN!IUr0PzD`$NsGp{s5b4up3ye5c31K zv49<^E#M9|D#kt9YT81lJSPSTDXr^%(5B*;EMf9*UVB8}m?H|T*TDKQE1#MYt!u=8- zBW>b5b!Bv1<|RcTcp1%8bdarLCe!C6UQ6!&!*I+54zfJ?M6wsJ-FT^dO_S`M1<5_C z>MF4uT6ms0T(9Y~Eqzw)l_L8hnT%GM!VAg$zKQs*wZnHRN(gU^x0Q{=_q{A_mDhhazPTJdr4Ss>QZ6WwU1Y`V@o8uT_Vu|H{{Ey7fLS z`>G?|b7R8d12U&LB!j-p*r&JPXxAsthR^4iW!nrq;+FjF-N&$&hu42{P%k&o76wmO KKbLh*2~7Yet~{Us literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r6_bk_96_96.png b/navit/xpm/nav_roundabout_r6_bk_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..4e7c14c252dcb5cebc4c327623ee2df7d00c78f1 GIT binary patch literal 1144 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlITbUj@h zLn`LHo#WdPnksR;{`)x}zH=ucBrp9C-8x}WuE4`vN-Y{Djs*)jrnPEZPWm=cB~olx zdGbW3ZnLeqfd;1@D2WW!O|xz>32hR*!M2BM4~GrE4R6nuetU*z4fh+f5Ab|2E>JID zDw}BKpJ0O24tI;kk2f;-Fdnvi z8X^_Pv`!(t#-{G*S5>wTX7A3OIsHdN>cBdgPueE(4Bk)j>qPh)zaQPKqru*&R`tyN zBFjDDb6X4cG{2iG->-Vd|6x~x_Pg)lx4%^U;ohS#qx@YDo*&hfwbOzA^Pmszo5=SST;KYmU9X6nv1=eBm=fULddX=$Q;`o0545sre zS04CAJ$63g*I4sy$%TcRB9>>?lzdm0eEY+Q<<6%oML`bk{#$zc9|<3n@vq4G85nR{ z`Pw5j^Uw1hElJv)ur9wU>!&YJY|Hx}6*&TDN;fZ`X6dNgAiZeo66udAB0KcI++AHb zdCd}=1G=RhiWhIDx}N&u6vY1TqS!>`eUE>&b#(E)I-qvv@j?5g(%KCA)${c4v6lo* zNnD|_@9+irmaiqQy9I)Hn77+*U7_clE$Y;@S96O<(*1yIM|UV~5W9Z-=ZpG|Pf0Oz zbWUGvmf&6Wr7-J2`H%a5_j6>Oa+$?$v{!Jl~!e(_X#2eV)q4NCw%RmsbnK zKfLy6cOd(|~Fg1g?#sV%t&V&_=aKUB*KdSfw#***&8&*e|3&gK%h^`|oILbRbGN9I4CYY(f04^>nLS~ExX6)%GtTS@+kiz0gQu&X%Q~loCIAhu92@`u literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r6_wh.svg b/navit/xpm/nav_roundabout_r6_wh.svg new file mode 100644 index 0000000..c2a516e --- /dev/null +++ b/navit/xpm/nav_roundabout_r6_wh.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_r6_wh_16_16.png b/navit/xpm/nav_roundabout_r6_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2e1840723c17af94f49765c928361f20f5ea4bce GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^jJzX3_ zEPCHwwB=$l6li<6ChAs4#O{AFhYuA;aW+LnXumLhBPw|0n6izTVA$DpU2FAQT4w&- zm!hWl$FoU>JLXZ;g5RARdKuTn?VL7iK{IDxgxf(b+b^f1Vh8{L literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r6_wh_32_32.png b/navit/xpm/nav_roundabout_r6_wh_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..2a9053d91c1f6170feb9b1ef5d23e6b16402180c GIT binary patch literal 415 zcmV;Q0bu@#P)5#V)UI8V7WjmG`OQO|3J^G zG-*myDyhn?fP{|fIhJ0s#CfDZ2|rWDOF1=D5tawAHWCr_W*MZYAW^#1sQgNxCL!S<DSwN=BVf;S-SbHY2Y3sd9yvD5ci@6Ya~}BNxb}b;Gt)@$(Pw-K zxaA1&6PT}|zd&)9Y}_0t_&MNp8MW5pU{q3as}fnHA>GU01+JvdYNaCh9`KmI<)z++C;T1YL`<)!--QN% zePuSrME8q1h?9^DNKGyvHMxM)waqI&wJ#h`7FYP1~lzJ)to)qMKDBvTf%kQRby7Y0Hv7O`S3`dj0j+d(KU*;}l>v z-O#df-Uddu1m>az49{k}Pcrgcx#ZrrFOh;}+-n?unw|#tlm>p^dn0cu==+n};s* zxXzYIGE&}-jSw9hbDA@;si;Gnhg^9*eZ7zO{NBF&KK(xYZk`SeHa6UC2mpXFCL}Oy zJIP-JH`w;+JB*{-VGxB24g|Ko;MevlJ^(7*)79HSW>5D=bYVVVtELf13@G~~O?_$v|V$Hk$pGwEkJ=t4qN5?=T+bcLHOJcpq z@f=N=KYnV`HpbJnrfhzlIpfo|(Xl7b;fP`>(|>Bi&F9F?H-coj_w0Yo+M~0TO#&F$ zal7|tFlvWaE;PPSo5GLh9mL(`r=XQwVcki%MNQrH69AE;;^_M6yT(kfG?4I9KriPX zw$uG?CceF%Hhf7SsNL0PIr+$Bgb` z$39fi4aZ;}#$EJCFzKnh6DqNY@HCQAt(g7C3b7!3^je?pPv}0^2Jw2fl!)9xQ2Fh<(Nj75}KkDNpf2hje*jnw~GKOTaJQTxOgd?Pz%8 zPAjJzTxaPI_;7sKJy}`-!~|RjVL;|a>TW12Y`}60K{ROWa(S#G!jH**eFB(tLcH)M zdr4++`y?h~C+pG3>b-3N5k5>dUk1Nw{rUJ68%W~7nJKh}FGxNJZtCu_lC0DdDSkexFL-Kh2CyhUzJpRG6j`xuhs|V^MxE?V#Rh z-C`E>C_rAt&ADz3(*3TGvOgZ!;fK?*4?UB^=lrJAb_mframh{E%R8gP!j4WdJ;ILhOC zp;lU9pCMkeN%r%cb~vo0ZlPD#O1!X-==S;~xxOw;h2xc{$8{&QUN{dWC8$3{G%dKl zJOcHFT^O+Pml1>J#1qc9nHCW$YK4K`Thb)^-QJ-|?Sg6w9d!Aw7s{0|!ch5sMHLJd3t- z_H&=si?hF0bZ1BENvtjyV$=Pxp+>ena&805aBJX)|=o}TBSUabSDXO?d41i0C7WE|^pIE4{ zm9u7cIUNzig~Wl@NhXAw_J8?tB*E$I%N@<2nS^om0 CH(6=` literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r7_bk.svg b/navit/xpm/nav_roundabout_r7_bk.svg new file mode 100644 index 0000000..a7d42a6 --- /dev/null +++ b/navit/xpm/nav_roundabout_r7_bk.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_r7_bk_16_16.png b/navit/xpm/nav_roundabout_r7_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ea192d44ccdc25b6f18932d175890d2642e7b413 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`ZJY5_^ zEPCHw@Xl&-6llG;cn9D89jqt!85JAzDZe_m!`;ajt=lzo3z z#JE7@`@RQnCwRS26gkGJHPLRWp%Z8JnnQn{mUY?-dB3qbyW?Q`jPqxcO@i*fZ~tkp w@IJgj=PdK5XPZteXK?jm(&9W|G_`=`QHt@br*nHsfi7q8boFyt=akR{0J)iG%K!iX literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r7_bk_32_32.png b/navit/xpm/nav_roundabout_r7_bk_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..36823170ac69aa4daed2207e8f2b060deef1b256 GIT binary patch literal 477 zcmV<30V4j1P)R9S^aB zZJgm3cH-P*KaFqU4gR2c#rTU47%gpn6Q4R5r{fE5mkjW_2lLk0C}sWtzZ3Bt%n4Nv zV-~yGf5)Q|0TvVCeT-*#_hPWi+_xnHY$u{GI&fza?p}!iM~P^z`WA*0?pZhSMuh;) z3Y->hWWG)3dJeFkJWqGvrtiM#t$=^fz)LJ?--Kfs{#|@cxU1JShp8wst-TGmq9NSD zGks{o)hO~#*i7l>>UI#V*D-J4FbW;vI5D5^V*Xjpqxdm?M6na$zaK~Q=aF;OWwefw zI_891@A5LA2rKa(6Bx>vFX4V&V?y7ymOocv6Hhbmis6Ziq?MD?6FMwG5fRxQgvqgeBO5 z%lMPg?{25$mt!&@F&2x5*n|&(zEfCLlys6~83H?+=)WGn12Ik);5&zVfx&O&h;cp; z<7rz>1H26kz9&bF&4C!>Z8Z%L+O(GCh_N^jV+wtFWESMPIHuC3Sk;uz`trtUC4taw z9?B78Ncv2ViFWp;X(fS|fzJ=;h!MK>O-`3w42rh=sZXNz z`|G%0=-Rf^=qPbO`0&O|0`OJz@~UU(7k+TB&H6i>!G^lN9lHZr)R#}~{m&S#U^f;9 z`u0Qu7ZU@2#wG01+zGa03G`?D@3H7L$S9u6{w{QlT#s)#2+ele$7|(*rl%+q=r;d- j0$HojeArr0+&TOMfHwZn-OJe$AmIAYKXL;%^KOF;O{^P*t2c@}D?93>h+pA5<8$mu;tQ4Z9e3pK?a}AU z$(YY$Z?fX!{-ZV#N9z|kOk2jjX2!$5dZ)H literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r7_bk_96_96.png b/navit/xpm/nav_roundabout_r7_bk_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..4eb4665aa8c52301eda69c199eeb2ae34f7c540d GIT binary patch literal 1379 zcmV-p1)TbcP)fG5=m+)zdlK6Pd@ry z27%{*Kaq>x%cg;?z}W%&Q8^mG1Hb{?37@qI;7QDorKGqD*oi;kv-Tr!U67ttfYrcZ z!inFp8O%5Cq-Gs(lgV!FHh-JWj z;)|ZO8Q><5{VoL!;7j6*-OF|Zr}^r98Q4gCkxyjL`s#da`hhWuiE{|p1`Gk00!tHH z4%`8}0{mLg$G^bUek6#?X6!}z3wV%xzhL`-`!K~hTYs+?>}%=h$5bY5#P}RI*TUyw z;C)MHGw6 zzQY*K#O|7Kg~J%4u?l&|pYRaJ8jCnKdWa)9k0I;yVayrpnm*uXVJzD`#Bp3uzPVo5 z{u9hB#5FD89pQVtmnK3aKzie2#7h*09m4h(dWj-Mhy+|9Z0~dSu}j!~iI*r+gh+tY z#{n-<7$z}edtREjnF{wLL;_}o?N9L%g`tf+9Gw*f=IYc*#0*!QKSfw0O`zQEvAy`nm*ue;d@3s z#4(RDCZGvC>>-XJ2rnvbs%4S#Qe_Op1l4vc4D-F*T}z{XA$Nk7%$-OC5wKSg6#0q2A)ZdH8JyQ zTTx!6dlCjP%iGriFJh*SwmvF<_GgEm^u_EFiY*lhWiPmuBrMtCr(>&ty*-YV$#w&0 zI9DYQ-G-lzP4##^uN56u^4K(RgL72^(rx&0VPnAMo<6%{E#Q9Ff`q2m@YAtFCpg~C z#+h3h;#2%huEhw=0Qt5WNv;Fqz?CTGIkr=7QS|S7-fG$ZkuPo(~YN>KEk@Omdv^v1_3>DpjB`;pi_=7vfA24uJkKb6Bt z%&o{Zn5FHN5i>L&M$ zO<}gFuBX_nMiY>bXZACN*`+>&yQ!omAYnD(L{Fm$NLYc{xX=;(J>VYv-^{LM0&HtR zH)0-U@eQ7Lkfe}`T8YOpS0c!SS|%XG{s3hGGy##(1Vly?5E)HCWHbSh(F8VE$~Jg@)&002ovPDHLkV1j_eht&W8 literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r7_wh.svg b/navit/xpm/nav_roundabout_r7_wh.svg new file mode 100644 index 0000000..b27ab38 --- /dev/null +++ b/navit/xpm/nav_roundabout_r7_wh.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/navit/xpm/nav_roundabout_r7_wh_16_16.png b/navit/xpm/nav_roundabout_r7_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..81b01dc8ed2565a4995eea5f495fdc2913912188 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`ZJzX3_ zEPCHw@XcZh6gX1oZsY!kE6#Dx^xZMXmI`eySgbM6;R8$410#*TI0buiU7oZrXBpp| zZC>;${_n1^YX6rDnhnpLFm&FY^+S07KmWcs(E}<>+9nqdDQ$VL)etdoa6t3xl#2Z&%7Pl xzJEELz_@|u1Vd!TRYv~>o({?fBbIyRoo;2na(Kz<6rj@?JYD@<);T3K0RW!{X?p+w literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r7_wh_32_32.png b/navit/xpm/nav_roundabout_r7_wh_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..eaae0c3c2d7e0d4318d48da530596f826d9f683b GIT binary patch literal 488 zcmVP)W?1O%`I90L`g z1AG8AyS6+^<8hz}eDXJXzy&ZBxA_=w>tU>M4`kvDa1g-!8<%mJF9Ka9UIVs(3@`y~ z08fh316JY)aHxdqz?=(j#s=%hX&eD6N_5wQyRNv;aRg{8(ShpwxD$%o8K$4|lOaG} zGnfgz7C1m%J?A~Rdhf*;6QqD204ZP}D7YNLSr>j5s48wLl(`jLwIX>2ui+z*wY+Iy zlen)TP_iOtI5Yp(;bJ(-QOr}on-yvTEoHtv#QcsZqZr5m4J+2hdG9T2zGFFV=mBM5 zGPJoBFRC`TZ70rwc_8g#UH}#%8C!GH*M7GO0oL?JSiiK(T28HZM5HYu4H3B#ksD)7 zHG-!%aQQA$IKOd|B0000bE{mI{_qbfF+RAbzwIToiR*TqvUU7l`gE z2)fWeAc82mC~g!fO3}J1;!g1gsGt>eVL=$tidZdeXC4=mz!-DxB-12QG0$c)NzOU% zdvi!mB9)Ysl$4Z|l>EQAERzBKl1@q*mNX!#M^atVtfU!9(~>5gbMLdPyJCP|;0{ou zH8tQKu&vX&B}u?h;9COWQGNm^IxYTm!d17Z17n>MKN1L7DRp49Xz{(kTn6Gpz5`o| zG;qr!W(l|f3hio+QZ`3L#ro6j&38zGLUM#S(Dy^ z>KWxCW}i!&ryT>qgIvrxQi*qjXdhNW>tSU+ao#vl6ko1KnE&FrI b`xn0f(g|?vl)W=Z00000NkvXXu0mjfLw-_o literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r7_wh_8_8.png b/navit/xpm/nav_roundabout_r7_wh_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..80492349e1a5b173a89abd7b6168fb5b2f92a3f0 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^>o-U3d z5>wZn+sNs}$kXz$nlzGMP*!lgVT$ zdVT<|P2KOd0JsbIJEHi*90OLS?tfB%rNCeU@rM}#o=B}j60jMLPj(Z6M^oz&6<{84 zJhkdIoC21o&?5Ro44aehkaTHm+oNz?(gI`5H!+QliD?Wlk~XUS#Fy-BdOa{crqQSY zkhDV5?U8M|aJ{58F%3o=g0PdHpCnyT;xK)ZHc9$e(wCBs7QfGsG)K}RN%u&aS;EE% zN!J-;ekpN`_5)a5;wJeg@DMG`V1Y5f3Se&uduwB85)EJ?aL7}PPkh*50^0^y=VAZHD*B!rpa)wHcA*crs6rnm z;df8CvML{%5hD$qFKLqFJ}*}JG|Lz>DCseeU2m((hi1eGz)gZ{ zf&hM;MvMT=b!`8BamH4PF=j~8TaLTkT(uwd#0Y@vgO9C2ys&I@Y#+R25+eW?JGKv* zee85>KP`wCHN*&jtBr#}ys-33!l8W+6{Nx=5hDPn9NV80#0v{@_a|s|v>gNBTy}8a zLP=vC+MkegERZjf;soG`WBVI|cwxE5vHfpF_7sd50odi({*Dk%6x{9D{y-2fYKRd4 z*UV!HFr{iIfH9KpbKI@BYCq~}#{l$5dN_a|%j7-;Z4cl_T#90x>k5eeii>fRfu9|H z7y>S<%7>@`Yp^TN-YEWl*Rk_p%h9D%Kx{dBy@&lB<&{VP_DNLjYPSo3B_09*Y`~7) zzP=dXRZrVdAI?_>cEwvQbAa){VNW5}`2+#G%>7MIo5z55Tskv4z-q*bxSm#PiG{iAH}^El?Ok`@|c z_Id2vDoA?V7_&a0jj&)dkyc(ca=8!e2d=8I5rQGQ;q4e2XFtvOs)aWDs9O}}CGW@# z01u|ptWt2R^$Y=@kFb3=aCrk8Rk9T*vrN8yp!MOWo;?kI>jh>tu~P*Dz|(-sW6Aag zSYASqBQ^i;WrVY`gbjedfad|%B{J;~ex>Gmj#AW&MzG_`Dd2115nysGJzOa@5i2@& zSk3c)SH6>7!}*z{J(Bv2F^3CVF6((D>3n01PwLw_P;U5Xg|#)doJgsQ3uPx_qfNfb z;<~K8CDJ;`dA1Ap5%MTw_ef3@1L6$%m^P ze)=VSAn6_1Z@v9n;j!BqugerTPqy?tp@eNG(YtjB^1T8U%TN5X_DpYvZvd7$v>lMN zMOO69AznW^tDv>o&p+6=)RzI3q>|k_5AeAH7O44S$IY^5`j&jAw}wvuewXy0>=$bX zWJ?Fbq6dAMp&Rkdf^L*FUD6k^MDNxts3V+|x;Fr^znGP&BL^TcIRJ^t0Z2>^Kw@$L u5|aavm>ht_ + + + + + + + diff --git a/navit/xpm/nav_roundabout_r8_bk_16_16.png b/navit/xpm/nav_roundabout_r8_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..a059596d9ddea8298e519205fc35ec8b177c68fc GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_KJzX3_ zEPCHgu;pTMbP0l+XkKq}pRG literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r8_bk_32_32.png b/navit/xpm/nav_roundabout_r8_bk_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..3d067a13172c39833e6184281255b276d979a077 GIT binary patch literal 462 zcmV;<0WtoGP)RA=-+yl{OYa1O@HHH?T-yVJkj> zV5hZcC&XGvp@=@gqJjzmvCzi&hi-_)&dTOG+0D<*HtvB7Gxwgk=j<>$0|^o&`0q${ zuyz2*n(+hh*14T%^a88ECEx-z6E1K8tN=aT63+qW0ntWr28?KnXMu7P;(pu%!fZrC|Y>48U_wT(-QWBmIh7*cVEN6ooG58!krP^TMYx> zqG?|Uw_k8SqnbDK&whz{CWJc}v9>J(S7N>#!d;43+ZMK{-_|E!!or&bo&|SP!$1yr z7mX`GA;2jBuY&V|;*Gd2n)~6yR$J2&2k+I~v4{)-hnD=druZl@WlTt+4Bnw^v@>&z>N`l!Fz;UGp?FiR}BEn^Y@h3OfDaX0RYD$yNcom5RwD3TJ7Z?+ZnI)UezMagmtHONYF}rX6|Nr~_ z-!&H{B_$;#B_$;#|1Gl$j@O1BY{W`*#`W*<2KO+C@q*jU%^V!TFeVbp5Dv#a{{-E5 zCRuoGd5TqkLGKiLFe<(HN*TqbR*SB%4&NJyn`!xmH7(X|0p8{mUb`;lw=#kL1VQ(4 z02|_R5Dyc4PPa<@BH^j?9lIO&?!k|M?^i5rn(8X{1_X>_+YJ17#}!JFY1|An zel10eTY(tY3soB6b)fOy6fw32V!S9+X@JoD??@42Ng&2(S}|>D9WXmk|1(95kZpTP zEtwMd5~yF1BF6HRv4dnu;8mc0M~WER1NARcYRSY2_2=(Lbj`rO6Q2SxjyFN?G`a(g zPvEiWLKk9jY!mWd-89uT3^oukge`S^dNsa(y3=&kRjkKY12GdgRAqlC!S)x{W)YHQ z5yK;#O0ZcH_+5{aq6eIo(uT{zz1oMRxPbEw>;`1-$lSEyc0gF4XsUh2)qu?nImKsj z?!Xn%oE;ZE4~KY!&G-;F|6I;D6j>6Ohh2DpqnI18n~P(y-QG;8T$jnOHPyVwyF88l0howb Ui2a?=3;+NC07*qoM6N<$f-t03Gynhq literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r8_bk_8_8.png b/navit/xpm/nav_roundabout_r8_bk_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..49280a9b3d73e6aa5eaf1fe8afea1c275eebed48 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`fo-U3d z5>wZn-pkqIz~J)m{Cuu;3}+kvrRVvy z8*b?}@NQv^e^SwYINmR0MWIWC+97u58-M2pJZ_a=#?kE(aWUa|53gSG240;DU#(^U Ptzz(W^>bP0l+XkK@;^ER literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r8_bk_96_96.png b/navit/xpm/nav_roundabout_r8_bk_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..eb73612704bb0586f0c474a97e0772c13a7f3ab3 GIT binary patch literal 1297 zcmV+s1@8KZP)O)w#C|48t%C!!QiPFbu;m48t%C!!QiPFbu;m48t%CqfLy|ZGe!g zGdUl)5E#o|{~eghe(ul22*A0(L%{36ufVB_G6lQ_JP4eV-0BuE4!jD?P(A4VWG2%! zp45W@Vy3MX=))g&pf6*pZxV$ejKc_gER4OL5Qn5?i)Lu%n9ARI5XT}+Au{45-QR}?E8cM8W#Z5NXw0Y3=GuLf2|uww#w zb$uVfj^wOF-h+8Rf*l_z?6@|99kp->x$~O?uK%cF{pfE$DR~xo0R9GU4Y2n5OqX>1 zCj+eA7$%ShAWy<=9_!wYF8Hl_`^otfT_9$Gr;)V<76Z?rzvjM2?PY_x8C@`P*^k@N z^Kl3McTT0B7Y2q8@C(d*yYs^U`eU}kYv(H982&-(hp*mg+#!Cexu51HU}G>Z8_tU~ zF99zE^sn)Z;?9136R-@p5_h3?xre?zwB!nkghjwR_$Ai&)iB8HJ!1v+W-*0fH)6yUm z?aqIn^VHK??xDNvi)XVwPeDsFolkk{X*Cbi?f5>r4@b0tTLpZhm_Kw0Si+g#b}|RN z1*}0HxHZ7r_1^+Oo+X(-=G*<0%(Vnmr0mpeTZQ?S08jc=L6zN4 zk9mzxK;0L!ik!fmY&~CieLK}IUOf@qq9LSsYL=gNwUYk + + + + + + + diff --git a/navit/xpm/nav_roundabout_r8_wh_16_16.png b/navit/xpm/nav_roundabout_r8_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..c7efff76e319efddb4633f5cf6f63aa0c5a98903 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^vJY5_^ zEPCHgFwAmt6mfme!g{$wAw@p#po2%YsK_<7-~0QWwQ{pEFs7OQnQxU@Kd_wH zGl4mN-EzZv;Z+g6_CKlNhJ1}zmgFam%+T+Tq#ZaOYP`JtHt5n$J^|hZ j+;8R@C$Od%zGv;YaLA?qg4$D{{}?=7{an^LB{Ts5v}AT4 literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r8_wh_32_32.png b/navit/xpm/nav_roundabout_r8_wh_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..ca4f9c9ebc0a36aa5569aaa266125d1471a7e17c GIT binary patch literal 465 zcmV;?0WSWDP);xgE5N*ZUN*fDd1qIWIZ(xza!d83$ z!A@(@PKdRTLJ@s}pn?j5SZHJ754z#A*io13xSNEVH12_g`8jjX$1po%OsZ6={=2+Z z7Xp38n4In2d7k&IgA^ay4J-j?K){az;1pN{y4n?<2Tn-VF)*YZo&#

;RzFsKPo zc7z1Lh5hP|`9rPn8AtJbU?k!h1xgOzvhg zyokb8pcwHKftv8VqIDwzD>xLHcWGHA+y;2SrXyqk*mI0;Xoe316Ba@$3l#p^87%;x z@UGu-0BqxU2ebh^;L-*?5k5kJZP)Ew`v5G&EWb}VcFb=(fQ6_y04jE_BLH$2YJlG{ z02>tDg-T?+V*vAnw_p{R(*Vdc$xt%J+}rj+WPG*BI^X&P;$DXOz0g5800000NkvXX Hu0mjf%Z|he literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r8_wh_48_48.png b/navit/xpm/nav_roundabout_r8_wh_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..b046587d87f0d1ba2ec76d0bb3c2ff5d06982588 GIT binary patch literal 780 zcmV+n1M~ceP)Mc{K~!jg?U_%AO;H@jKbM&-k{uCQDGMck zh9Wk$JY``;lC=$4Afhbf-{OswS)epAl$rTh%zc?&@7(w9z3<&g-EY0_edm17_xJss z-|2Mjy-=b=i4rABlqgZ+zeUteF?9y88Q2J{1Qy3#!@vjN5%3_2qKS6K%?-6%J+2Pf z998w0+CAOA0Z{wZS1lN?$4hn9berF-j$|-j!-%?Ry3DUrM{}63;itN$X!CQ`k8Lnt zLsgxV#mkJ0Ih+KRCiFi64g(wF-x1(h0)H8BBBPgdPbxQn z*dH)3p>A(s{H~bW2nUKt;7%a;trQw}0~)tG>Ae>GeIWQi3XN?6jW?b2UJD*t{|i!R z^aeCW()!7=3(X9)|4yM1;&!FRQ)ui6w7*U1B|X%^ z!212F_O&p6vHC5bakhvA`UAmLpQ}9yV;9Dp5LS0Qf!N4{1QS(tYlATZCZC_~7h*m( zvtAubFr#{O3jb&m?jLn+7B86&b5RsM1I{<0^#<-6;an6&FSB^bdKv{71a2e|)FtXw zV15GaI?X2|h|CGZ59SAedkM59z;0ksp#KhVD9=NF>IBpU>P>ZR9Qaj;8!xpjz?T5! zb>24=St>9a*aJLOPXV(6yjkjL;3=>_qrc8Tt<>!xRrRs@Fuo4O?KQjz>^^6vD}iNo z2FK(7WASyoF2O6EN+9btIs{Yzr|5Jsc~b3~qAPHX42QH}1*@v77Bvhf0*@yfUfW}oQWcHyA2{foeVY3hIsQ|zw zU_8Db2QIfsw<+58g+{F~dAO@YQFO4buaAFUYo=m2ilWbX;{F8?P>klyk8K110000< KMNUMnLSTXrzF;i? literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r8_wh_8_8.png b/navit/xpm/nav_roundabout_r8_wh_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9aee9b927d6c8029340d391c8f4136c8a0d987c0 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^Bo-U3d z5>waqY~*Zk5MX(JgiFWa$Au@|n-(0ua)M9ikQ~cFwIfGdA|~5c9J$cinkpey*S$m| z^W57x(TZyhaD+JIr+xfe;FYDy>e>EzR{>kXDeGEJ#*7B(2$`_f2@SkA8c#oDRyd}< U?vA{f0nk1MPgg&ebxsLQ0DSB}BLDyZ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_roundabout_r8_wh_96_96.png b/navit/xpm/nav_roundabout_r8_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..59be14045135afe9eb04e99b3547b280b1aaaef9 GIT binary patch literal 1482 zcmV;*1vUDKP)T&RqM3=##RvN6Ghs3^wZ zBhl!>7+1PrD=J1z+>jVuV4{dhd@V%L6*0<2QR8dEz+w!Os6^3-ATpne?!n6)7;aT} zRrS47-)0_Nea>H}>Qq-(SGSbOWHOmdCX>lzGMP*!lgVTNuogHcbv?Qc zU;*$7aM&T}r{ZvFYeDLIH6GwX;B{cMhQPNoN|6=kr>)i-|vw>|90^iP?z|7S3PYTcn>`D;)F+Kxkr;bAsfH}Zm!r+hb18_;II3&3b0Qw~D zk~BAk|C2BzX|b6di0wG~g$OuP(pEJm_>weF($-R2R8q_Yo|bfd0>7u@MoCY`b{cgE z0v4$ldYU=~JSJ(t%)W@_Fj@luCTXXnYb%=iQ_|;>zE-jRV=C5#7D&2AQq`r0oo2SI zqK)PO+);71@+q(ym^y)vslXbF>17peiy52X00w;T8I0e6`#k*JU!Lp3HxwD$8vx5Z z1F@H43EJ21<-k5q-%IL@K~jKC9s&3nm{WuAxxlX;{x{W8_v8T6JOXeGsBNkWtSD`| zZ~&NAmxg2j%N;8Y@Nxhhn>}r~A1UFZ*>;{;+ffa{Z} z9cDICw+J&Emh`dXX;;;)qn#KHaHV7UcY~-Xc*n84t9EB%G{D7<<-ZJ~qF}dU`HO<6 zXdy-eOm{3l6hwueZCCBi#Atvs9LpaKqQcL%t9EB%G=S?Z{frqbj)>6!2OZ0M zFFgdX{d*7{#AayE8Ew;77;uw+2yBu*$K#t9EB%G{AR`<(B}p z-+@v*jdRVeZ|l|(9iZQ14d(p-IzIByaYfxal7Qcu{DU?6f55|k@Zl#Kz($V%90G2r z!S{;NmMc%yQTIjwEb<7zSR>q2!S71X;6twrKVtx&cn0Da@GQ{rvH)-v@I3z8+_#5} zMG}DPJcBXDAh5CnKQ~i-&#CMELU#asP%$ttLGJ`UtigWB8$q<%BoSJ6(#MBO52W8zHTj*i1~iNohmYJOM9hT zhm}rfpN8`PPUg`nc2W=}1AyBlZ7Kh}1z2llf7fJtrlidZyPKlB0q$+P@a+Z$T8=x> za^3*&mFLAb>Ch7uUjRix zU)QuYHqmt{-vT}i6X)zp;*$9sQi zH)lX6)R+Zb-TS44A8xH73r^_$rOliHol-*#oB^(QWI@mLeyIT&AUS2hDSLluCue{U4q4Dsy}waVY}Oi{-~rY! zr`e+3jZefHkpa^2ESTtt*>kz~2WEmSIBoAQ&+obnNV+kropMQegQOSQ4s|;AKM_FI kz{r~^~07*qoM6N<$f?2_|<^TWy literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_straight.xpm b/navit/xpm/nav_straight.xpm new file mode 100644 index 0000000..dbbfc0c --- /dev/null +++ b/navit/xpm/nav_straight.xpm @@ -0,0 +1,69 @@ +/* XPM */ +static char * turn_straight_sv_xpm[] = { +"64 64 2 1", +" c None", +". c #000000", +" ", +" . ", +" . ", +" .. ", +" ... ", +" .... ", +" ..... ", +" ..... ", +" ...... ", +" ....... ", +" ....... ", +" ........ ", +" ......... ", +" ......... ", +" ........... ", +" ........... ", +" ............ ", +" ............. ", +" ............. ", +" .............. ", +" ............... ", +" ............... ", +" ................ ", +" ................. ", +" .................. ", +" ................... ", +" ................... ", +" .................... ", +" ..................... ", +" ..................... ", +" ...................... ", +" ....................... ", +" ....................... ", +" ......................... ", +" ......................... ", +" .......................... ", +" ........................... ", +" .... ............ .... ", +" .. ............ ... ", +" . ............ . ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ............ ", +" ........... "}; diff --git a/navit/xpm/nav_straight_32.xpm b/navit/xpm/nav_straight_32.xpm new file mode 100644 index 0000000..db07b57 --- /dev/null +++ b/navit/xpm/nav_straight_32.xpm @@ -0,0 +1,41 @@ +/* XPM */ +static char *noname[] = { +/* width height ncolors chars_per_pixel */ +"32 32 2 1", +/* colors */ +" c #ffffff", +". c None", +/* pixels */ +"................................", +"............... ................", +".............. ................", +".............. ...............", +".............. ...............", +"............. ...............", +"............. ..............", +"............ ..............", +"............ .............", +"............ .............", +"........... .............", +"........... ............", +"........... ............", +".......... ............", +".......... ...........", +".......... ...........", +"......... ...........", +"......... ..........", +"........ ..........", +"........ ... .. .........", +"............ .............", +"............ .............", +"............ .............", +"............ .............", +"............ .............", +"............ .............", +"............ .............", +"............ .............", +"............ .............", +"............ .............", +"............ .............", +"............ .............." +}; diff --git a/navit/xpm/nav_straight_bk.svg b/navit/xpm/nav_straight_bk.svg new file mode 100644 index 0000000..92fa2ea --- /dev/null +++ b/navit/xpm/nav_straight_bk.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/navit/xpm/nav_straight_bk_16_16.png b/navit/xpm/nav_straight_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..cdffea8c564c08b0229533b61da6eb811cb519ad GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^Vo-U3d z7QJsT8FC#8;AwcsFF1#F_ZJh}mgaEbLV@*)6*8hO?COG1?7? K&t;ucLK6Tk+)n%e literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_straight_bk_32_32.png b/navit/xpm/nav_straight_bk_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0c82b3c8d8b3554f49630af92f3d7ef0e79f57db GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v}}8o-U3d z5v^~pZuDYylsNKHK7H4o*17%*OD}ab?Mvm-=GJ9ec_~7pQDmQk!qndB5h?tA1uM&4D&YfR(a*dJ>X8gu>6SbmCNe+i4Ce|rk{=0 z#4csX@S4A-b=jAxWe72(?(LV%?;qOxgXMMW^}KOk12yJmTa zvu1Y99W}xcz6y0alS-B!(Jd=UEnEYU|{g4CCPS%g7Ks#4>mS7K{mEFaiH9ONePL* rB;!;&k;9C_dcQlu4m2IB?_CEpFOJJT;T*pu&}arvS3j3^P6pW#VEF`-Os6$(bZeRx z+;HRQ5UTHbGa-A^fBWLJxt|Y;JUn-I?%w;B)&)DI4US19_q;r5`ykiyUDx$Vvab&a zepoK!en9tSm(gR<=kj$D`b)J>b(B7kp3W-sSj^?2>2&))24yX;Pc>N|;QY$u*Km8& zRo(|(RgAVb*{(^&#cMyGA-Q7r_iFtPm&<$aS06mHksJ8Xju3%-iJFV|G&rfq`V=3qLV5%59f5iO)g-q&%>AblwIHX# z>Tjb?^aQV8Pjv%K7x@3G@3-*3{ypt#lith!tZ$h88}3fq>6^UW=2%_j8I@>(*{haE zAF_D*X6E|dsXtv0|JfF}Mkal+&9}_Me{|+;y1Dq*BmTy-T|ZsV{@KUGH2c8sSwD{- z__|Si2a6n2yoLYY;#c1nH)XO0%zMpxb^B8G!}{5gci8Qi`=g$T`sgcsm{GsK{TElv z>uSa19a5iD#D5&QS^KlSfcJfa?t{pm-=!a?1#_-cSpNVfWd=`I KKbLh*2~7Y?o=;`~ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_straight_wh.svg b/navit/xpm/nav_straight_wh.svg new file mode 100644 index 0000000..76ce34c --- /dev/null +++ b/navit/xpm/nav_straight_wh.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/navit/xpm/nav_straight_wh_16_16.png b/navit/xpm/nav_straight_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..a34e8f9201214884a643ee79d0f02718f02a8265 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^rJY5_^ zEPCHgGUPhsAmA#mv_$NV+VYc%I(ufZaGx|~>0jJ*>|GvNy{p&E*GBOPu6dj`S)}y-!v%3yYn3dH z+&UiZV=ZHzz!=jIyGFN>;Y>sDeU;Ej3w~WQf0=svgZLkZ3t#!;<}~IOy???uvApY& U!_509fbL`PboFyt=akR{0GQxdZ~y=R literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_straight_wh_32_32.png b/navit/xpm/nav_straight_wh_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..86d58fc51d69fa5a9224133a763e19a129cadd84 GIT binary patch literal 331 zcmV-R0kr;!P)6ANfT?<}+8m_cuNErO?^g@JOU3Yemg@PUMAGj^3n$XgyM-F*=iNfh^z&>XA^kjC zNK8Mk78<0VR|^f(&!Yu?Pn_Ep0$Y?PRjSWCsc6nfk@Qdf6L;FeMGJ>VGaCe--^}dZ z%+`^6*5#h}U~OP#4=v_s1~3OUz$b7Utgj*stb%=a<-PkBMhb};aCxv+OQ76423~>Z z^G+TiMW74XyaQR_0%}}9jSHx80W~h5#s$>4fEpK2;{s}2K#dEiDY||jaARh}BVT_N eMe)()@BIL(a+nVu+Vaf+0000t~C9GL$9|9}10|Nr~hnDssY*?WQbezW(b2SD0>VFbV0xuzw@CN?%cWSa8!;DG}L uoU=7QgQVmmdpMUjcZ42jI#%Di4rt*mwKyj41rLCRGkCiCxvX(a{`OW+{XU^@MY-{gfY<=_lrswk{J=z%3fZ(`e(Yz<0U%l?C zvJY;3qH|LB-)7fOO;z#1%};{mzPapOzcRr0|2IL#n)gZEek;ul+S(b;$rsivt2(RJ z`b6gBT;*l^Zzxs<^epfU)Nh=OR^8JEZgsKv#EzSqv}`p z6kU(24V-@U6W6iclrmWPQvcFc1z+Z<8UK_*xs6N{E&=ssId-vavH0scODrYRAsQ%< z*|>+X>7{uUwLF(Ku1Ay_e!kjUU3+fo z76-utTkVd=Ge>lEEbX|FQ+2W9Mo)(-12@CHFP3i^Pj2>IZ|m`z(d9@kgE>RZI=-(A zHcSQDN@h_J^~?u+8Tt!<$Qd^8T{fpiW&NZ-E}za#_#BpXhdHcm&-d7W|DW6ypOh~3 z*RkE=?z5!du1BgTO;>(2y?|feGmgDrzttBVrMm4q*&`Vk7X10}{p~~92Gy&-UfpN) zwPja$#&ATYVFt56F+&oc!x_d7O9n$a2>Sf`-{kg%>%e)#{oivZOK%i@p+E1*m3Z&< Sj#j{&!{F)a=d#Wzp$PyuVR}RW literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_turnaround_left_bk.svg b/navit/xpm/nav_turnaround_left_bk.svg new file mode 100644 index 0000000..dcaef8e --- /dev/null +++ b/navit/xpm/nav_turnaround_left_bk.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/navit/xpm/nav_turnaround_left_bk_16_16.png b/navit/xpm/nav_turnaround_left_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..de278415875fb9d8af5f99538b9c5972b4604ac9 GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`7JY5_^ zEPAJ2+Uw=)D8Tx_e`A2PE{nXQkB?%+bKWntHH_BYj@j1P+O-UwO8;1*bDI?e9Rn1_ zW<@p~E0%MMKQ24;UQMq|?MaPWg65;@R(Z9bMRO1Mc(86Wn7(rTR4$nX z@;`Hr*!6ke-O~G9=ArQ;fwe2j|Jo**KYze@eWJeGn}-{(Fy|vwyj3x#FKVSlkG+_l_N^#%Hv!PC{xWt~$(69B2I BeWCyW literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_turnaround_left_bk_32_32.png b/navit/xpm/nav_turnaround_left_bk_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..63c192bcf051d7247fe5a1383b80a0a5ddc61fbf GIT binary patch literal 499 zcmV78wf2Y*m3TT|V?Zxu`J&`k?iL?2uD z5kC7NztHjCEZq)f`wg*$TcwSU;dzVkcsvW|is;^i=5;KVFu#c1jsQP#ep-OniOW}U z3A5qzZKCeQH0CF;9l7*zqW(#w_FI7Lq-&82zhFL5Kaa1GGgo58$1?yfL~?!ARASo3 zhs=Aj0M0~mgO)R&Be}C(0ZvA8sqSlikL2dM0{m6|2lyueZs5MW#W9QPr2#IZhc$`i z5p)%w@D6vUff(004E^3pmA?!=Epks|t0W3jj;_6=J!RIq^*x(*So=6Brx?06Z;e pT{y>cr4}&gu}_+bIHscB`<6S&Yr#Yx7NqZ zteK=wHH_jg4q+!oFo5rv!ZSR;WBjg2Lm@_S7r)TTFh1ZY`kN5j$vA$>CcJYzmn7c^ zYj7tbFw6LYeKl(bw+o0}Zp>m&o#Icep!jsW!C)QYH)Fnn1X{S9RYYHj1g_(3hVx!Z zZkvnPhJzT2tXaf%d@G?Z$VhvWP!&I8tjpSA+={Gi;ZjxN;dEs4uh<%iaWN9(Qx(Ef z?ngF1k|9PvUPa>UU1{Md(}7Lj$$o7e55#HVOe{c=NBBm`HLx5H+nZ7}(Y*>K5UM_js60#s<|;{GePn(iXT15q+(2w`FSM~)ua~a$LIR~& zO`vI36KI-P0_$o~QG!qcCnWdudy2my4NAUJ>@K)IN+^LXl84qY$yb8|Ib)CE1x~h) z`wQqR#jxZhduez0MDn^9>L9P+X~%D~?Redo48)o&o5Y1c@Hu?M+xBrTaPIlQ9+f80 z&4s)pRQ=Kk#O^{ra5EMp!bCexV+>(NvFgu=e}Smf0g`riBExyzxFOsw*G3T+vQ(cM z9H5vBJyZRZJT7FdJ~cT&J{Nkf`YBml$Wwi4bbxFw^lbH0LN4U3J~cZ)*oB_2eoD6< zDc18WN9_)f^fuQze!HsSo+mF$T_{?88ghW7+UMHGasOELm$J6x`o`{`>Dj pJx`gx6R#Azuwj|G1-uU}{tM!|t-Rr5M34Xg002ovPDHLkV1k${LofgU literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_turnaround_left_bk_8_8.png b/navit/xpm/nav_turnaround_left_bk_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..1dbd1f55830c321dccc1ce5db1b0db02b6f89b1b GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_oo-U3d z5>s=}E#y6vAmaK^f9cAXd=+5_%UOlQ95ypZKM-I!%O>jjc;$g z-8*w^>LMStF{+D9in*}BsXy1MB0;$3nBXQ2FP#s(U)A#}dDgwy;B0-}ugx~BV$nbI n6@|wYYjx&-lzRW*dPraYLgC$W%(=G!9l+q}>gTe~DWM4f%DhNd literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_turnaround_left_bk_96_96.png b/navit/xpm/nav_turnaround_left_bk_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab8483db45985105d9bc45797f4cd7c8fe1d230 GIT binary patch literal 1360 zcmV-W1+V&vP)lGKWB9@-NY0!gA}{yq6-O;!2AIb=#4i;f|o)> z^1q=iC1OEV1z;D1s;Ah|z@GWrF zz}_ra4!i`60XKmek8%_E26(ZmuTX=vz^A}9{G2{lxej~=JQ}ShiLn&e2i!o{@w3Ym za0plyr(0?89B`Sij-OpF1JB0jTtBl2H{HZ^e0Q0~jk*P)JKB#d1x{e+{O&S}TTKlN zD}XcDJHES2Fd!?X5#TiT4)0Y?153hn-JS)&SJ*pxzH$_3g>ry3?_uxYI_0fU4zOe+ za0`3q)+tlKlVRLo!y@1U_Ks~*e!%TDWx?y%JJhGV62cj=c>wqeduRHTKT%$q4rx|a zlb3NKXfOku#6{*)z)IYTWhL$&v#0v~j8c2ct2&cq7??yS8jk}{)NFS>ZW~*p-AQ1f zSMU3PoyZ;VA8uLLbZtHayi;8-wc+`OZTAgFk#&3;*e$f-g{mHj9bXDp)4z zKT@(~pU{r0B)CPf16ilfp|=hn2F?rZ*`Z-b%vI19;q`Cgo}4wf1-vb+W3z@KF*%8U zwEc+whFA;uNnq0n4I^TWfEKVpaQzp!PHQp)d@i_t0}1VtK8$R>T^Go%bwaxy3S^f$ zoAB@C--H{fL%NLBZ)dFp*%p}i!SpkDUaC1me`I8)V8=WoCB=to;%Tic_(JCI~6v~knG zy_mgRy#oA>OF8@(_Zl&9XNMQ!lARvp_6wAn9FR^f`XvI4;_d}a^COoL=IvAyIGd6} zx^`}B7@d6o*vr@bx27v`aws4QD9u59$&^uH2Ohr|KtOudQxj! zjFtdn*o=bls_kUa+(ER6#H6DibOne#3X+e0(BDIk8Ij3HKj;e(YZPP={Sf9`q!^Kz zMf5`$0YZ<0Y@#2+eUBP4LbHi}2q!?OQIJ*iL)c7$5RsZy^g~zyv`0a9(GTHsX*44? zyXc4T0%(nbETbRdWRqz`ZkEvxaRiW#f^4H7;^k9HA~@UVhj;?`j)JVCAL3>d`$Tfq z(GPJ2XgUhAkA8@sQ~zP0zfG3d0@Tf*NIKJ@2^ObH>dfoe&;1=N1i06|U?ArH4p!%? z=9}LKV(#x?CBR%crOD=a`eJ#qaBq*#-i>aBF_r?10SCK&KEMFY{T;0T8_=uVK2$ep zX^0ip0>FSezC)6y%X6X#U`!Ffm?D5NMF3-p0LJvgGSr&mz;(}SPiY!bFyMbmaJ67c Scv9a00000 + + + + + + + diff --git a/navit/xpm/nav_turnaround_left_wh_16_16.png b/navit/xpm/nav_turnaround_left_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..c5866d4245b101ff2b1df4469788d805fb080ab4 GIT binary patch literal 330 zcmV-Q0k!^#P)CKhikVB$ z1&D$;<6x@s2r?oFemEvI($4QaZ*r?{cOAO>Js2Z(TfI`>)JOG1T^P52aCqO*dQz9F zhF8^(9C%ib)XM^LRs}fBji2gfk)LP&rOx;B#t6nrdMhICiu^Qv3Rs>5m`#5j$a_US zHwo}B{Q}etHOfV`p)S?}00%%P>)Z4Wa9rys>bly?mwr$0scX63EIws(=mZhb25z#Q zNxzPW`?^;E*a5m(cY)oilm7uk!~@XIwv~N-Kxz;8POsDuAm3uE>h66_j|vBV;l5sg ci=qbL2d9C+t)73SIRF3v07*qoM6N<$g3^%4&jDJ6;+6rIRt;TagN``$UZb3_Xl94@TcXRo#Py=(@0KwVZ>)uFnr ze#y^a=9l~QEfv3<#k#PqUaBpe)F(59n|Q3IS_ZD|QG9~c8saC_?>!BCQ;)ax-dE`1 z2CxwD>%b{sF+X1fHH*OYLY?2C9#D6JWDi>E9|pCb)F?oafpbB_59(4&{gV1IxN|0| zFL?zg0&bX6+KGxY|GKbGk%6NDH=1$hUBDgdYv5qOh3Tj8Ip7ZUHSkCA-@w0TK)s;e zELj}tf_lEH0pK(+05;l|M;1Q|yaisWSLZR&Y`mh5r#9GobyIzl&t~Q(7^^Fd9)n;L z4kEq%O(LZ6nR_#00004c=?lJ-g(meen)E@@uUD@jizJvYYuN)ba8zzFaV_=z8%fKxzU)v*g0 z1%7x2-p)*3wMqit08B*&zM47UP!$Fq^dR^aOTd9LgFoNH;9I-{2FeJ2JFuL<0Kk}U z9HxMQ+mbGM-1=JC*Je}FE=k8E4LasDCG9rGe2b9a;Pe9PKc72)OT2h3iRz z&x5$&So|BX)1h(Aq46c9fya);PkLzd0dE{S2U8iSSr+{Ocs*Od8Ha(3E{)(V9N4O? zx9P@HV+@{h&m{e}jPG#?#PlHB9OG|&g^V#ZNpl6(iZWo!z9iKG_2w;ONepaujIRXh zEnCL=U6ZSCVfkLbssG4;HRbw>(Y$_{|Sh^Yj&PrMV9uav$0tU$5QtXe8 z(1EQ2JCto&rzOn*M?!?j&H}TN&PkdD4#x%=1=+!4sjWMF0gO31$Q!`RwrfkkP?vS4 zEn3q>O$i|GW>M0e2=A+z%yp9Bvk%-< z_EI*6x}@>Qxn4L87-N&yQ6OJmBp8ePp*r!q6!{JX2(YGmH$UX7SQm6(dqM%DiTDFH3l_)kY#bLV1R@+notq@iO!_k=y{zoh zCxyj+S0~?E9bM`pS-M{CYFO>6?!Mf!aXY4uJHtk-*Gvj{qy7G`0)GAQ#KwwcNXXr22WQ%mvv4FO#mPqO$h)1 literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_turnaround_left_wh_96_96.png b/navit/xpm/nav_turnaround_left_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..12baa12a9f86048fe70b13d225d266f3bca7c83f GIT binary patch literal 1496 zcmV;}1tDAPAzQ&?cdRdeE1`pvNF0 z>Y<{Cu%B@2p%Nsps6U_}H0mXMXiP;EQ|!e;DoDd~MlOTGI%XOQ%Wq*I9pzL!&y9`^3LE0PwfSZ=(SQZehU@E(ios917# zI}ZMI#w9Ju(eIF>k;@_JI^av-F7I5XaS&J+LO7kW5qAMp?CEy{cYEhD1BZb7LkMS6 zHLxI6;C@iC)_%&|9DFG9`bbhTqq+(Jyb7#y&f#)w05+xy?zRL;S`F+2uJp=b04@My zA%t(N1G@+yX(8|(aEnL#6*&Uj8A7;V8PsbDdX{<(KEQ3jGuA<~&j3loz;R$WciRS> z25z$4ntIHDr?DG+0egVwfHlCf5JCW!0jnt-yQlm;3r0vV3$h_;NYY88yVaeNZtt_* zJ5)Tzw&0|sI&2*NkEBNp2H+n_FKNKNxugY>UMa7SWkaelN{XbG8-Mo+#tQ z@VV8PWJA&-NfVJBf7>XRO_6y_NLpl(OEx5}kL>ifl7@_O8Ip7)GN1Jpx#Zjh-5YuR zMys2kGS179Va6-KQe1hoV#9F%_3B!ohZH)UNkpKy2L8IIc zY3qVgIJHskhlBzom<5eQd|byjc6YxCn5Gn$p_Vcvi*pWZ`QweD-?w zESzx@pj_wQoA%L``Ly6wcc?*EQyz7BksTAnU%60HEvv;sKO y3gApDfHSQC&bV(w=Kwo_a}}@MZ<$Do1OEcmSAjs8iEM8G0000 + + + + + + + diff --git a/navit/xpm/nav_turnaround_right_bk_16_16.png b/navit/xpm/nav_turnaround_right_bk_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b20c9a4fbb9af95eea1f7125f410c85428edb444 GIT binary patch literal 304 zcmV-00nh%4P)Qv9>e4 zpeX(XTWtd(K|zo}EHdbDU9YPLE^}sf=G-&8d`Aa|c)%;puwCdYViAuR7rvbuful6g z!#Flzn;igFa9nbJjMda(4uG;Lly;vBfb2v4ikLg l-vg-$Y~$yEZ}(3CoB}&?q(bYN7drp|002ovPDHLkV1mU4=4Su^ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_turnaround_right_bk_48_48.png b/navit/xpm/nav_turnaround_right_bk_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..a255e6a177ed23b72fe6fd8813954d5ebc642b63 GIT binary patch literal 711 zcmV;&0yzDNP)pOoV6^3jP2J zg;&s^p`g$y6duh~BxsOOpb^O=gE4bwA|xK8ICmJ=y=U+9yd?7_J14n&ueHB#ednIL z_PITZqYt~V8(T4e75IV=c!j&Ti8m$eR~mXTjMtcn7+-M(Yr8?V73=U=9P!ri8Hekq z{2N;^CLj5^<1!Z1%-tqT79>7*T&k0NKc1IJes&zFOTg(0$j@L3Yx0tcy$1(z9SZ~N z8n}hqcp`bk4hCWtNuFr;BDv(kN#ROf#IiQAJMlIU`w1(n6c8eCA`m}>(Lj!aRS<{G zfsLPvyA}5Y^4ut!_$&?uHr^YVr&rQebjmZ9hg@&On)NAj-z8tz82rGUl=%THiOls2 zF#=Yl%#Gq>hW(xe<_9w5LU94_Gw$~;Fuyuuz9<2UQs$;I?$-#+FV2`RO29vjc>&$V zynt?FUO);$t#>J?O29r$#3zbx#avh+3 zkCeOP?8cFD0%u!3JEMf2rxVI{fInR*)bDreP(OjA&Fc{rR-bAdm_=W~_^!WJ`BpSR tw*?f&e=ndXV$BAf|N5E6%kt=C$4_AJtBfoahgtvt002ovPDHLkV1kv>Lbm__ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_turnaround_right_bk_8_8.png b/navit/xpm/nav_turnaround_right_bk_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..a2eca642b5225bdf891ce79e0ae0ce56ceec515c GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^7o-U3d z5>s=}Z{$1_AkgrzUqevlkfF{T#kIy9k_QZp9HUspH*A4^0o2Yd8Gb;o9&rUN$^3@g+TimJYD@<);T3K0RU7QL$m+@ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_turnaround_right_bk_96_96.png b/navit/xpm/nav_turnaround_right_bk_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..682f3469ae67d60bd8dcde65e70411b61d71a0d4 GIT binary patch literal 1350 zcmV-M1-bf(P)RaF$nKX-JnoWvBe1QUDcp$CZ&!5;|`)Qc}kfsa8% z)JqW*{UGJqLn(w{QU5>?3icQ@=7>z#q)$Z_8A0HH5Je^AuhC|F*yrMHoO|coz1H6A z?tS(L_QTw{XRo!_cddQ)Id`AaV)z&Xb^zOfhkyrx`+!m4F5q8a2KXKL1^5{_1$+%$ zGVnJGRsk;n6TmfK&ZAuez5<@F`YY661Mo3$8NZS27Z2< z0X_m&#u-)`>;f(jHt_S?1>mU|gBxa+;ij9If$wg!xT;$cdZ5F|3g85G!S8P4xYbl+ zSPh)PKJeXbiiWI|#(>k<2YjJ+8dx4~==LlDzQ8`v{n}BW6)FJM?8QF7b=sSu0$|A& z;5zoft@D{~RWP|=5y><8~a8~HgP9c?gz2MlhxOIC7W^v~iUnJwIjfMb{dq2M^*bmje z);+DhXb2#=X!%pYeyIMVT#Q)@a9P2AKO~!V$JD&&gN6W-yN6mAU%i+S92?~qvQR6K zLQRSQ#uNdJDFPT%1TdxuU`!Ffm?D5NMF3-p0LBynj41*bQv@)k2w+T#0^DD!|E!Zx4IQWD@-;M)a0UypnJz+v3$Z$h!5vhgLipMxF;KJe)@B>@21Jw9*Y zrlfPg5#TX&widRkzK&FV@9xv@J_UPTwDI44*7mSBRkQE&$lg(Lrs|{4cfau%2ax9T zP;J~auo&}~s~3SkaN8ko;9hYC?z!frxQ$r%aO>qxgFL+Lo&6~aFpfJH47zu7C1Kv2 zHHGuZi`32m9op6obRnAiQx%|71=fhNAJP>7hNB9^E1#4F7zZW|?N1`ien?vYfOk{3 zow@)M*i^w}Wm`<@0)R~wsM*XxfY?=_mi>^201&qdRBh!VK&&cI&3?#70Ekls>Nau` zAaoU|XFud60EDfAAbsa1K&UDRlKqgM01zfqgH=|J0%%u3up|aCq5Sk(Y)SK6%|GwNL0Tw$KM4kIPG)VyHKfgzv`#UsE zfL?n_#d|z`X_^24?=0}yp6FgwG*N&F;KQ!J4`DF(cS!L84Gmu5)n!lU{=aqKmY&$07*qo IM6N<$f*NmgBLDyZ literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_turnaround_right_wh.svg b/navit/xpm/nav_turnaround_right_wh.svg new file mode 100644 index 0000000..991009b --- /dev/null +++ b/navit/xpm/nav_turnaround_right_wh.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/navit/xpm/nav_turnaround_right_wh_16_16.png b/navit/xpm/nav_turnaround_right_wh_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d73313e9314d8d4236619c0fa03d76ea8991fc1a GIT binary patch literal 322 zcmV-I0lof-P)O*h=kEuMN#EvQs4DQc*vfaGVm9elNf$|%CHHORKXswN Ut^MG%!~g&Q07*qoM6N<$g2A4SmjD0& literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_turnaround_right_wh_32_32.png b/navit/xpm/nav_turnaround_right_wh_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..46f05d61b7e2f471f25eb34fa47000182570b191 GIT binary patch literal 530 zcmV+t0`2{YP)B2R2yvY^a3D*GA_m1w#!sC!cad{u`C)zbmCQP}hOW**XCnZ^-{5r8KDKne|V22N+fgj-Qc+z*>}GCV-UEHt-yprmGaK8^csJomQpk)e;-FE_zRX2sk?mGjhnL=y#odIN3r_kDcrvSOr4Ssbl zu-?{vrvO=ZfgkzYD|un+O&BR}$7_Jm);n;34Doo9_`m)=P&a|sz_*IGc@O|U0R$=! U=l(UuqGovsqTuqg$O{Zf-rQy0ow0ad^I+~h-}%0C zcypIA6$H>J>4c<{k`7Dik+en9Pf6b-jZ1na>9Ltj6wTK%03ARd@DV@!0`3F5s@5)G zH}Kk1_;UOJE>Q_?3%8yr*XlAcSNkhD>YuhoMdDF)5#l8=@s05?1;c?a0MO6+mqvm^F9ur;Lt zmw@Yz_+DVr!Erv7_ydl_Z}4~>0;e22k5U=9;7EMhlcxh1&*7Ph(bwTIXHU-9A4yMq z5}DawNl$a8^Z=WDxU%puuq|h7(#&Q8^1XG8_XKcBDsJFwV7@Po@$G?pUIy0XjLiq; zt2@Tm2l9Ct_^;76P&L{Hsz%#DGXQH-ac7al0B}aq0`L&1MRL@D2f)6(d8sE!EhnxH zOaSj2zxABCSEI!jG_YD1LgB1_vbT_#%}TmekY>2S(-f)KfqqFL=Y=e0Bn`MGB{g7X z^OA-m!-pF2xhP{L9#VK0X5?u+xq-+ocvW92Z!Z+m1@G!hB^e0pf_L?$a(AOXT?nea zRH6aTE(BHI3$ZJ46Rs{`x(U}b&=sn$)B}y93sKdt;zV{^EANNul15_4N;lBh+YByy zJmA{%M5C4efedGMr&?&gU&*1qQSB>|W+h!tR(&Z=2Qu89MfFvBtzu@si*mH@g{p@0 oJ29|VQnOD#3ugAAwUWZ{55`4DNg03Eg#Z8m07*qoM6N<$g5Fr!q7VWI8G8D9Mp^Ac&chHAXU|p|yogK%?nFmqVguJG1eO|C4!pZf>uf z%-&!X`2Cgl-j&8iuiRv>Oue=Gczoh=Ij^|Y-*5Gvl4Z`{%4+AZ*l%;dOlH{+EPf2W ydCHF#*)_0k_#?~}y`Z-vTdZwMQP}Ta^^B3(9`2lnRm*^mVeoYIb6Mw<&;$S}m`5!D literal 0 HcmV?d00001 diff --git a/navit/xpm/nav_turnaround_right_wh_96_96.png b/navit/xpm/nav_turnaround_right_wh_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..3f121cab1fe5f81499ec8c6852482b9273489022 GIT binary patch literal 1484 zcmV;-1vC1IP)B5wXCg0!L=>B7{ul$6>MH&s%#A{0_66opzbtw}Xs7jqwtX@0!S zJ@?+sy!ouckbBOV`#tBpJ2Q92vCNRP3fK$`0k;FU0_%VtU^Va;Fa?|iegS?4jsS<9 za}zmYt~`?ZB|RhQfTT&4V^Y#LlAe~-pZlCDfus$RK9Y2yQ&Khaxtx<>aNN?7s*l4 zat>yk{Fw|(TAh1N+PK&bB;5df4crsk*Ah4eY;n$=%N`qfY>8;!f^ER|oB>2pU(z6O7`QryePb>G zL(aMHayT~^KvFO818|$Q?TCy4cRS}UrFI;n1wBu-CLiDq;JF-*O)EfBA8-ojv$UIt zbHFXBm!{Sg@GN$dFW?aH0zs4IT40bOV-NZNv!I_$RbYao9!aN-u2%O;y0b&S zcd59IZNX_tRaiJ&iKNF3Cg5L5uV{&Db4e>Cz2?VB+ztp7M4= z_|j@lk|AlOq=~>2f7d9M9f5I7NLpzTOEM&F4Ls@ZCG{A^(j#dsFrKXzv2=pfD(L>e z@!PE~g1ntq1I-Ls#L@{?0&EHx`y()H6i1uAz)u0=2dx5Gj9>v&tXMV%nE1>&XSJ3G zz}x#Yz{Ex+x=U(N0qZFC>y+gygBa#wZ@}2=DK7Y;VzIX7((!xebDA>xLdSI1Zg5OVM5l!5YOc>>s{3|~f3@$U0J;C zxx5|oWfkuy+*ih4Wdv}}{YvqM`)t+&!@ebLh~;0!r*(Eyy!Ai(H|QZ?XBoSd5x~=$ z=eVP2Nhc-kk@SGY)7xtMU3pbE^hA8I6kCuS8yv0WAy4W=suSi%kplbsGrp(_ONbkf(8 zKVR+|0Xq0CNZR|`bd3O>h5CEa-ruIH1Xy5CY49G;vUHUIo;T(=_Ga=ZJY6S%@ADtb zIJ7HA?{8DN7c?wz&b=sUr~mtO&RDuq0LVY_ZMv=nEjJngGSdi82E2!D9?W%I)Ol?=ls+F0000$svg.svg + if [ -z "$w" ] + then + w=$(grep 'width="[0-9pxt.]*"' $svg.svg | head -n 1 | sed -e 's/.*width="//' -e 's/[pxt]*".*//') + fi + if [ -z "$h" ] + then + h=$(grep 'height="[0-9pxt.]*"' $svg.svg | head -n 1 | sed -e 's/.*height="//' -e 's/[pxt]*".*//') + fi + svgtopng $w $h $svg.svg $png + rm -f $svg.svg + fi +fi +exit 0 diff --git a/navit/xpm/parking.png b/navit/xpm/parking.png new file mode 100644 index 0000000000000000000000000000000000000000..24ee8b36bcff45d3616464a1266693202f664b1b GIT binary patch literal 341 zcmV-b0jmCqP)DoeAHsl$#5Jwv00000NkvXXu0mjfUD=gr literal 0 HcmV?d00001 diff --git a/navit/xpm/parking.svg b/navit/xpm/parking.svg new file mode 100644 index 0000000..3def7c6 --- /dev/null +++ b/navit/xpm/parking.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + P + + diff --git a/navit/xpm/parking_16_16.png b/navit/xpm/parking_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..094d054b9b06aa5a17a7ec936b104b8f6214057c GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt@+JY5_^ zEPA(2GUPhsAmDm`*R~|V^#V!RQ?(;*vR|rT>VGK6!k>`%QgKaCwCAZMLQYODyooxC zGzuNfAGEh7mOnrH=VoZBZe;A@mkZ+hHwy_y>O3ge;62YLVds-;>>Wxs-oIr~>eusO zfB(9q=`5Sfah_MR&AOS&tS?B_$Tu;p3!ibmo<)VTB~h5aeZn$>xwEW)Y`73M&pGl? z!Ue_!rf1R&qz-<}*q6NJLFIZ)`>k=&46C>v?daUhvn@JetqwyW&*P1j3)il9{$u^% va8r;h!@TQ%Or&?dTfD&I_rbd99Mi4!Zg~m(eIoV;=vM|$S3j3^P6F(z%XI}@Kdn} zjRy33u-!tZqZq)gT<$Rvl}d1*y#FU&HJeVkPyo|}!2opKf#~<4+l>iewes4F1)NSW zpF4Hsa`5&d3BhvdwM!+%0N3klJ9Yrm^xB6*aNp25;FhjKtp?Mnx8Aa11Q2=s{(Oe< zICy)Jt^>ClwA*mG1owF>1n@|>{T?0M1*K$B?^UTM05(DL!l6bUPpWZ6^&Y< z6OB?LT7@_Yl}0165m%@vB(m>{y-T=}J2$)b-RAa}OtCNK&HQ5CJcL3-uK*M{lQ)Hk zbU0T)d*R-JSv=PdrxUQ>b8Y1@qEW!>y$TSKP9F>gM8Mx3(1-NkqxcQ#~ zzrFk}7o)$-=RmUwWHJ^S$n*g#==X^N0SEVid>)ug0KeZ{9@ZL2rGR$ZTn@_w_WS$e zeExo3sRYF1^6OeA5Q*F$J|Cc}K%oGv*Wx@y0g6TWb)SBObRF33fL_nIeKs5MHMyL8 zep_qccm(QoF`i7y=d`_u7Yi{K3d!fQT|m>sn8zc=9>sQnSWJu^4)XbI7szJC*mf(Q z&sKqO7-%%a_-rPh^XUS?AdpT2l?t$08NJ~vqmg`m6XkOYk=#5@1BOHSb=kiURIA3v zZCO|ax?Q6~n}J0@*MU|GD3|4r-Y1sTz)ze`#&tO!1Dy`ATw0UYG699@=VA6DHj693 zjVr*7E5MB_z>QQV=IXllaQr*q3UG5%1BnDst8s1RF;w;T+5N8sH;xy02SiJi QW&i*H07*qoM6N<$f^KH$(*OVf literal 0 HcmV?d00001 diff --git a/navit/xpm/parking_8_8.png b/navit/xpm/parking_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..69d66fe03ecfd76e8082f1306310f032b5050a1d GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_6o-U3d z5>re27V@?@Ft9x5Sf9bxy@1Pz>!fg*7IUfF7ykjxD;&wI;!&%c> emBY8`u9u%8s_VwPQ)UOyW(H4JKbLh*2~7YL>OL|6 literal 0 HcmV?d00001 diff --git a/navit/xpm/parking_96_96.png b/navit/xpm/parking_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..c4907580f6655ea4f67b937175027f6867eb0446 GIT binary patch literal 998 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlJ8XM4Ih zhE&XXJLj~wXrRn-d-Hr&wp7)JhvY)ESucxi(+by9IkI4B!rLx0$8NK?Z}o;UF?yjU!9sN^9KgD}LS1Ulf-6S$?;k`?EITLD&A7pG)n^&&`=>oP5x- zoLeJ7BSOpKxmiQ*D;3MsOJ#c`gcXjlbQm%w`83Q(x}-mS+Jm#RjZ{0QG_yZE(AdKC z{7&2LmUVj14@|3%tg1G@z5ATybG0?xLdi@=W-u74IrMM};AEa53mVd>6Z7#f8)pTNxU*nbjwSO{`{QxW4{ypX{t{#+9-L=HJsx zk1mow8xsEiHs6}Ht>^r9)c$_I{p0qOAcy4Sh`-<7Ubw;{E4$BnCtC$@E zb;28#s?N3XbkSt^Q#=3Q!40LaUSB>r$z=-@LtERSSEAuZ1G#6+;#z%wzx`YpPZ!;U zQqwi}SaJ;W@3&oje`ls&pUNV!0FIjf|G&O2DN+&K+HgTT>FAxpD@=Uye5nBX^0 zWs&fO3k<@-1%E1TRDFLp^*QIh`6r*WoS7e_b7-DzK=9+;bBdoY*lSy3{rdI4la{PA zMFQUCKl=N7mY{&k4c69A51C8KU*9^vx8d~k#KOSqb?aE~?0oFM&#Oo~A%Q_JHfZ^Y zl?}7aA3k#Z@x^nl%HqWfw#=CO)&HPv?JB=dy)hg!W;V`~v%mA_PvqQZ?u&#z{M);K z>4#UMYt|h2U|>_nqaU|oa;~2mYsoM=qKCEd} zWKOYkj?$yY$8+`^`CuO$IrB$-hnn#Emh!isx+ltAW9CUZ6DY$SY=t2bl5L~&{l_2a!yXK~MYzVAEt<-q@}3E+i;h8DEvtmw4k0|N&}Ri5+d#rI!}U-{rtqPm?g4u;;4s_+xo4+kxmxeBvuZWvTtpd5-!q1^dfD5-x zRi5+B>z}-lNSj`M^J1*Koey85fS0^ z#A&~L{l*0FYXjo$1D-r~W<`OQNs^eYny-KU_QyO% zKKi$gi#D>4WX5~>e)%WvDIBJ+yNJXV6B~YCoZ?nxld8YX)$%pM?K;nlPtxCC0%J#k zG!X9B@$;GS-n03WeO-buUtOY@?qS(q<@1>@`DN}ZbE`L5Twfvy6C^VHd9%z=@ovi3 zZd8M<+7G~N2iVEE?-kDv-J8101E7`!%xsjITKR)Y)kk96>PU#fh=sL9Y&}U;mn&;n zzJk_>3`ioQ-dIn|2(gK<)-+Rr-D3f)uvy)rmW>>x^XIjsp4+we{* zb_(pV-ThgmG#D8MdRoBRb6?DzI+UedO~~$I+ln=$z$tZw>^!ke@DZ#W_3kfpa9c+2 z=(u%j*PvG*rJrhowX4r(A1*0$+ck(Z-5gum3hj~G->sD5323CkRqq-2mB9K*0eGj;;s7v$X3WXDj|%ERsU?STly&lM zsPieDg6pD{mc)Vq8zjd1i7}NVg%!coS0pqa1D^pK`#nN?H2@6l`Uv3d`Bnv1fy=;O b?Fat`0?gwuqr% + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/navit/xpm/peak_16_16.png b/navit/xpm/peak_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ed164a60ef50d8b6db36593c8830a645b1bd9064 GIT binary patch literal 629 zcmV-*0*d{KP)U^1kIjMsqnKlET{f7i;5`!~ym6S)5G=8k>u>B5}vOJ9vool66qmC|9& z)Mo0E4a+!v@z&)HRl!nfSv7Su&tour^yEOw>1cUZkKb@$s5kMWm{FeeRN4Ra?#$jT zo*Ey?tga{3`RU0t&{Q?7ac>G-o4I|pJy}e%T1cU!0;w1|F>DPTAGFfB@AM4xMR~v& zKC?Rngr!Z+d2d8lCJqXeCsCe4c@o!k!2_ptcR&y7Q-03hA<%E_k2cPyUeOwku`k?) zn|FD>^a3}NV`1ez!Lr5F-~?7Ebi~bNYa{3_)`eYTu^7PP#1q=BR+hhh#9epsvmUbK zQOM?b`0No*n-g)9**LILJrYe9XYHOS00qCu;@Ss_rBZbcN-C6u&*?9$*&B{#YG+{U z%8msOH8di&^86+uxBnFY<{sM+mNropFk9?P(a~6Q%|a`#+eK7GK-fA;7u|r+03j?f zYQ@8UxKm4%R677Ln*(9spaH~W&Pyb&yhV=~!9aJ|Huu^QEn*nL)}bu%^B#VtjF;TR zTPx+u-!^k>`kw%`Ej0jPpbv;^5u;Zaq6eiyNKi@?kZMu7-W>1}$N>BV_?QHH9{&+= P00000NkvXXu0mjf&ZZr< literal 0 HcmV?d00001 diff --git a/navit/xpm/peak_32_32.png b/navit/xpm/peak_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..a51569d7d4102c9bd34ee8293bf2b18766cdeae3 GIT binary patch literal 1335 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/peak_8_8.png b/navit/xpm/peak_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..31996b70a9b26beb050eb34a08256525c52fb280 GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`dJzX3_ zB&H@OI53@g^u~^72g7Qc=?|OsdhgGucoAx3VDQ1H!03bl2poQ*y-VwxSnCr{FHNu6 zoL*dR_5c3{|M|K&{C1=S5LjHPd>o>)^-BMKi_;2vx(B5NWsm-TczOBt>wNKP4H^Lt zKh7(vW^DeItlE}szRqaRuK$x9-_4yN!_3UA&J85wXWMMQ**;%hvTvW&$q&CD^S9l% zuQ$B&qbPhbvInGV;pEv&!)Z^NJefBzr9-@pI;-@m`oMH!5x{gb3G-2MXeI)kUHpUXO@ GgeCx{YKDaX literal 0 HcmV?d00001 diff --git a/navit/xpm/peak_96_96.png b/navit/xpm/peak_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..b2c7967e1110c0bac4b95865f7a2d9e7021b65b1 GIT binary patch literal 4760 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 q=n`T9BhN9O|LFOiQgGzc5e5KYU8n + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/navit/xpm/pharmacy_16_16.png b/navit/xpm/pharmacy_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..14538abd3a4d57e275ecae83e1b55b6ed62c0ee2 GIT binary patch literal 363 zcmV-x0hIoUP))qrBn1y%1A6P;mkIvSH|}EkIHhsd z0Kk9o4;z?@NjKd+c*#jPk=fR4hW?OPW|Da;=!NfR{(yl$;2rwFPCJl~t+N0C002ov JPDHLkV1mP!qT>Jn literal 0 HcmV?d00001 diff --git a/navit/xpm/pharmacy_32_32.png b/navit/xpm/pharmacy_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..302c9cdd77552fe825f56c2cf9ca5ce592763df9 GIT binary patch literal 423 zcmV;Y0a*TtP)>)qO5CA~rMM#2laRBhM0>|iE9lh7yStm}5Y2?HCbTfhL+0k(&*{n7@{ z@x-QrR6sNkwbYlNOZ4CR#J=ffijD#k^f zDX`ctU^?c_Lxo}axMbFu0{W3eE;I!-1_E3z#VQO fpE-M5Vs-a9d<~X3zEw;E=vD?#S3j3^P6dx=^Cwqq!P;7H`yq2O%fY3I(*B%wzBDVKLv!YHqH+my>;Wm3Uc!;FL=X zOEg}ltp3r+mvw2LUzGELv&Zc#msHl>ZY++AtN0+_q$c*rc@KXg*G75Ey+;hB7m7=i zEnO~N{B-Ayb$P+Nd0Kz}v72VEYaeIMIzz|z*rnA=8}&_n^6KxJ#a6Q%Sc!urY*b5(TKh_XGy|OGbP)B6) zx!bGqjvjm6yTn+2O-)>9^Xulm`L8t{zPg$o>wdhqM`DFnSf^Lm%hPWzPQ18o-e-;` z0+vPi@8`GJW!bgyQN*g)sFYTnwBu=$&#u0E_0gKTX*u_TuiLNRUA1mGL%00x-%ee5 zOaCqT^K84Xz2^EflKcTtd}H%Jakb~YpJ&+5@;6&w7Vd4PJvCi+!My8_KRlZdw|Kox z6EJj2OIUP$bdH2RUKPLlk9k_$xh=K%?u_5=y(!((^Y5H82T~wLD1K9}-*JK~GJbzs zkYMGL!kas4_T*K`2b_OhcyWiskD$Y6lsUdhb4-X*I&>kX9GL1DJYD@<);T3K0RU&` B74rZ9 literal 0 HcmV?d00001 diff --git a/navit/xpm/picnic.xpm b/navit/xpm/picnic.xpm new file mode 100644 index 0000000..4546b64 --- /dev/null +++ b/navit/xpm/picnic.xpm @@ -0,0 +1,38 @@ +/* XPM */ +static char *dummy[]={ +"16 15 20 1", +". c None", +"d c #020202", +"e c #080808", +"q c #0c0c0c", +"n c #161616", +"i c #212121", +"o c #282828", +"k c #2a2a2a", +"m c #2d2d2d", +"f c #393939", +"# c #424242", +"p c #474747", +"g c #4c4c4c", +"b c #555555", +"l c #686868", +"j c #6a6a6a", +"c c #757575", +"h c #808080", +"r c #838383", +"a c #9a9a9a", +"................", +"................", +"..#abbbbbbbbb#..", +"...cdddddddde...", +".....fdggddh....", +".....id..dd.....", +"....jdk..ldi....", +"..mmednkmndemm..", +".odddddeddddddd.", +"...pd#....#dd...", +"...dq#.....mdl..", +"..hdf......fdb..", +"..rbc.......bb..", +"................", +"................"}; diff --git a/navit/xpm/police.png b/navit/xpm/police.png new file mode 100644 index 0000000000000000000000000000000000000000..069bdcb31560a49692d6695f8390104c664be7c9 GIT binary patch literal 570 zcmV-A0>%A_P)I6@5IRe~?AmzAR#HxTH9c3Jn+Tx-xGgBEKqY(31syamt z7@j0ShlYegLD<<5GMVI!ajO~}FWy#yhGu6;rReTvYAVSCtXB`xvBkqohTdNK`p9PK z?`LA-)FGFnt&Qz%HaFSbrC3zJ_xMiLQrzz95>{7*qoeb+d|t?8?8KOVNO5>@!1y@p z>l#`<&*UV>#}1R$t24ePDn>_#u(DD=(}e{gm8ul(O+4c`7(SQb)6@0A?d>&h#EV8! zP*vTLk@_+W4%Q4e;_FG^m*vjzaOqhrvb4n7+NsmPK&AT&uah>9OOeJ#bF;9wC(O+W zot>x09vc&umxcNH%G^Q%Gf`u>-qPY*Hk + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/navit/xpm/police_16_16.png b/navit/xpm/police_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..53c12392fe1ad8c96653c98af3171710059a27d7 GIT binary patch literal 447 zcmV;w0YLtVP)ng)`1tv?Iy;RAM2N&rtVmz;~(#K)}1jjT|>6z*aN%eXy0?$zbD2Mn5>kR^DQI$1Xt#xv6QNY{FD zTxN7M+t>hGTh#09?XkK_v*~MW>Q4y1SF2oHFfqa4;ALTWnAuqh1zIg<_?h%|CEQ0S z7KQco&iJV>E_TOnCB19u1P%N+Kc~^qW82%^u%6~qg5Owyu`xoRQsLmBQydxT;@+hM z=@Q`$UK}2}Gd)eM*3msb&(IKP;(dO)O78p=ZM}E@4G(kJD?5m`>GHKj+s$&dJUA~Q p+Gjk_dAg_B*uVY;?DL=B`43Dgg6-N!K{5aU002ovPDHLkV1jvF$*KSV literal 0 HcmV?d00001 diff --git a/navit/xpm/police_32_32.png b/navit/xpm/police_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..47bbe9b3e4e1c26a86203d8292214e6cc9eea1ef GIT binary patch literal 857 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 bK*anHyje`ND|p($00000NkvXXu0mjf?6#Jp literal 0 HcmV?d00001 diff --git a/navit/xpm/post.png b/navit/xpm/post.png new file mode 100644 index 0000000000000000000000000000000000000000..0a869cd15f20eba6989017bc013e946c474512ac GIT binary patch literal 592 zcmV-W0s8uon*f4e z#9RYEG=Q_SGqv4rF$_cf4{^C%YJR_;=jZ4BhEb+zs(QVycDtSWTkUo`b$xxUOw&}r z!RFLxG*X#NMimMLwOXzI7`j@mRH0B%*=$ygMk5dG+mi!<0Jd#o7zU|SirH-TY3j4t zj8rOxVHk9~T>^oC=lR}F6hhE$w<(v)B$G)T$2kdg9EXdG3#!#B?RFa>#DVWS7IbrS z!|m-Y#bOaDGZ(3zrSZPnUGGW5kk;tG|)5+ z+qUufd<+HyOw;82{QMv;9*+ZP@4&9>G8_(he0(II&l3zDe~_EahJL?KC=}xI^3prJ zJ@}x;Pft%sDN#ysb#-+T3NP2QR4U=RE>cQ1o6Ujmf#>r%QcB|SIN59#UH`EB0O-0- zE|((~i_z=#SS%L5ynV-U91@8H;c%Gsdi^Q%t)kH=x~?-GkG(MsKnSrGzu)kGl>4Hu e`YFHlfqnu@i57`OUTX>f0000 + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/navit/xpm/post_16_16.png b/navit/xpm/post_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f8840223c1a0468b8dff8f139fd9263572714b5b GIT binary patch literal 451 zcmV;!0X+VRP)Mwn{C@arIfg?`z7b$aA3Jyaz3Ab05n>y)?>9=RZ$eF&xoQ()$4WDZnqzSh5)cE zONC*`Xf$Fx9>2Re3_~W93B%zK(=-);cpj$HX$FG%rxVR)6M#aY zfaiHAr9KY0TrSM#bMpB--ENoNZil96lu9M``#rPSj9RURVHj@%;y7ltT2ZM~$Y!$u zl*{G2uvjc&+cwkb6e;EF03n3FUayf-lF4M=T>qI|E{AEFEEWrd5CVRGV#9UaUzTMh t*Xvci>wbY@7+M_1>ErR({EGfR=LrzHnePc<&_VzJ002ovPDHLkV1fj%&Jh3r literal 0 HcmV?d00001 diff --git a/navit/xpm/post_32_32.png b/navit/xpm/post_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..b5ae8786b942aabbd9cb4cff950c6a56994639fe GIT binary patch literal 953 zcmV;q14jIbP)MAugH6Oa<+uK{_=H}Sk+~h9n`r-JpPN)06xVR|PYPA>{84-m-L3|X2LO~1<4-2(g zEtZy+gifdX4lGv*q|<2;3|%|ffyieNA((&_Xg0oBi~ zve|5GZEbORdC9=Q0H>#??{0e{k-%!Ta&>jZ_VzY5o2{y*N&uj%tBXh^LUVI7cDtQe zEcVOcu~>|up&@iS9g#?c&d$y!>z)(FFUH z4r4SLpRIjX0HCR+9=iwb~bD)h~_$ zwY9Yb0s%}W6KiX0QFf%j5^z<~6Bt0|hF9-lglElo+ z3?`F_g@py2PA9v&yBG`x0P^`fV`F2;vP>WlV0?W1Ez<(8Y{Ad;_VzM4IY}~^WN>hh zOeRAnlfi1Wl1wINF5$5OT0a#gCp{=bAAq1&Z zibNv8&CLxChlBe1`u7VI3Iz@h4k(pM*zI=O+uQHQ+S=L(hr^HRB}u|!v7p!MiO1vY z?d{=oI??HL&t^Q^qii-yG#UlK<#Ig=e+`q#gv;eZQ52%lDA{cG?E;FTAj>j`hljMb zw&HfXX=!PBbNCPRdOaSG2ZO=D;o%{&EF*-ds(Z8rl}d$pJWei`qr1ENe!t&KU0ofc zqoX7e3C_;WC>D!V|ATu0l}g3_{yx{&*Vt?}IyySu9sCeUlIZK}qp`7(lamw5c*;QOlQX~g bqMCmI7>Natl{e^R00000NkvXXu0mjfxG&Ge literal 0 HcmV?d00001 diff --git a/navit/xpm/post_48_48.png b/navit/xpm/post_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..4a8915ea2c5b0abc4c114ee61fc3f5048f5ce0b3 GIT binary patch literal 1530 zcmV(7Q~w{wA3L+J(_>oG^@G0sUcv%NDbURvO-pAoy0N@* zyGXhb@(EHUh*%ivhd~xr!ZOq2`+M=lef`v? zo7qP`eD{C@W9Ric=lM8$?aes{(xgd~Ce8mds&$|L1zZ8LcPLA;M1fx5-#_jc2gKiG z8(#~Zu})yudYg)h3JeBAYS-pBF+M&{AP`vpRYttJSAfXN%M*Z*Wm)w0_KKaRx3^cw zvMd0xXV0FsU*J_j0jJX`3grX>aS#U*BL`zFc?EGf4S-gDtQnag((Acsu|!G&JDz`N+lxel$V$D{Q2`=4!y>+ zXU`}vFK23MioJXHa_`~=dI zj|YuLvy~`Y6M+9Nvo4nlr_+ffNem1OaQ^&xW@l#;_RP%8P*G9Az`y{KB;j;Aak*R@ zE|Z(FWq~yu4oB2z2u7Oq~sN^^5FuV25Wxw$!3d*;j;d_Et$ckkxKixt5W8n)63$a?QWM^lSpPx@hM+cWKT|x+f5Q6IJYC1YP&}y~p+O-Rd z#X@m$F)Edcsi`UY`}?H96(VN0)YU*V35_-)uj4275Mh;8~y$Lv3WNb4Aj=vCVary z3L1@u>gwv)C{9jJGB`NM_wU~~?cGpdZ8qP(e@{k61{D<*l$MtMX`Z(WNs=&`Oqfh2 zBuOF?iO|>A$LG(VH||TcIJw2VUKCVD87-V>O7)4Pyc<>-Ln+>g2``beQ$o~ENvDs|o=jXGsvck~N5TQ^g zZtYJ3OG`_!c|UdP6c;aE-142`uOQ1ZR;!i6hYur!ARG?I{ZIU~jIOM#kdu>xUa#lG zi4#Pl(Z3{cBF>#VM@~)-v$M0CK6AWc=ihlIyKVel=a@XVVpNl zH}LC&!#=mS?JteJzgXi^dBMEpI;THva1E?Uj|}@#>p$-~L(c7E20SvyKWxN9L?Wzw);no1y>SHZ?LRRFvU*>BGJ5E^A)y sdZ*s^c=oEc?;e7NzxVC8+xvw7%3s^+{<~)kfX-&{boFyt=akR{0FyLjLI3~& literal 0 HcmV?d00001 diff --git a/navit/xpm/post_96_96.png b/navit/xpm/post_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..c5d19287cbe6830ea6b20df43d43957033471ac9 GIT binary patch literal 3062 zcmYjTXEJ-ovRa_Nt8&8UOo{-Z(;NPy+h4F=j!HJ0pG2Vozs7ga&dsa3!+e;O5FJM^; z4Yju;HTjW_j*iK@yH4t5(}cgdbj{3S%9_t9w6wHD&ISgkXgD8{r42Hv7iT?vBgF=0 zQ7I`bNssQ{CASK?l+@PI3H{Ef&*~_~?DEe5i`~nYm1|TT+4c3TjEs!Q85z`FYY)1% zw?%}7g>@|~s3UAl>IVkk>9X!5zDXg!aEZ*>ERvU*)lgUko(c5z^^sXTe-5oSyDuj%-yzw8 zJO!I)PdbiHPCmhduX|lkE9=Q`MmBSC1q^ghC~4XtNzo)lPW;==tIG@Tqsix^V`KEu zsARYOl_$&})aP4*vIL+M;pJu}FJ%=CO_BT zr>=_gBKLaYxHMc{#qS6Tnz|Jl#@P16<}@~@LzNmCSC6-6LL(wbeyqDC`8zq$MACAp z8yPV&F)^LGK_!9FH8KkCh@`c3a*EAM>|b|qaA?g`@bf10yq5IXnksRTVF!sDR$5w0 zV{dQ2cX8=ozsA_I7*|;-F)=wwCl{_t6xs2vB$fK?-Ya%u|J zBVjTzHHEysx>VD@#l;m@UoVFp8^|;Hp6Q~ZLbUBAKQ=aI;uc}!a){S6G%~UY3{>3Q zO3upC0I*^A;5I<9r(rQKs@Eh2e&=yOfWq(bMnI#w+cN4Kpt4 zs(C$4W&x6Db8CwyvDcdbr4Ub}q(^lXl$5M*OD{GDu#tokIn~M|m7Hq-3@lkt!*t-JRZP;$xp9ginw^|_tSl^Ty9*7j=Z72RJ99f;+t?Hp%ye){}mX%ErpuI^fBq~aaSsW0f0s?{cCp^7LOq2wZ zm1Pk`q_;K)T<}^*i55peAi;=yKgX7{l3Faqx5Y>D@~GOyz_cpo2Cp5nhmw*i`Q!Wb z$C@VML=ebl?eNV_$70i}h!M$$4_n_z*}i$RZDpk-B}Gy-^Byonwf5y8Ya?MuUhi(f zllB<$*7FLNDq%_KT`gFq>j}3Y^cXwCZ5QnO?m>49qEm#K)qmu)B0~c!~ zk{FSHJ2y91&xdxooR?TkT$~8qe`MDV7h%f%@+GY5OTcP3wL^`WcN11nqHLNn0};6x zbe-Ydte&f)rPZ4Vf93Db4nw0JL{)IFZ8$Wa5r&nP_r0Td1VIAF#86OCQ7t7tQ?&6M z=X~TH+}QXiUBQous>2%OVsdIKvdL12VWsH=8>*h$cCjp|M+=(GY<|9o^F-3sQODMR237|x#MWeVbE8?g}Oq(PhZ z+|KDzC~YPc9Oxa5aSv3gDe0(sVaMVV>-k0AiQ+qj@-&uF{5yUW3;{)_67 z)}!9X(pHpsI; zztCDLEg?CXc?xMPfr{>&t$9tp07_0eLXcC@pSf}&`$oBm;MqogRul^&N0+S0l54#F z+>QIQww|tTtLZ>mW@a}aA=kk#&Jek}-+@Z=PABdGSknGQln)07NAa3%U?Att&W`u# z9#6H|TixRj3T2SF;Kbw@b65|Mb(!IA97mphbZ4g;;C?u>>#vOsa^G2}UOpk9t?q=+ z+5#~#F;}9}K?(T_)tCD{Tq-jr5|F@_tk0yBH;Ee$`tE@M4%-C|OM`w*NJOL)CEEPs zBk4t(xf`jVpkR)1(I^O2v>Gv}{VDKc^GoPWE}_rbojpCPZK0&MqSbT@4LiSRl#eJm zeZYoZxo&BPl5lsAKsuRA#lx;4Ki1+6cyUA!x8TqJ?uP&08`CRXk>VlOzDB{BdZ3Yq NXgxuwm8x2Y{0|>#<-q^| literal 0 HcmV?d00001 diff --git a/navit/xpm/potable_water.xpm b/navit/xpm/potable_water.xpm new file mode 100644 index 0000000..2d24449 --- /dev/null +++ b/navit/xpm/potable_water.xpm @@ -0,0 +1,32 @@ +/* XPM */ +static char *dummy[]={ +"16 16 13 1", +". c None", +"# c #000000", +"e c #0000a5", +"h c #0000b2", +"c c #0000cc", +"d c #0000cd", +"g c #0000d3", +"b c #0000db", +"k c #0000e8", +"f c #0000e9", +"j c #0000eb", +"a c #0000ec", +"i c #0000ff", +"......####......", +"........#.......", +"...########.....", +"...##########...", +"...###########..", +"............##..", +"............##..", +".....aaab...##..", +"....caaad...##..", +"....eaaaa...##..", +".....faag.......", +".....gaah....i..", +".....gaa.....i..", +"......jk........", +"............ii..", +"................"}; diff --git a/navit/xpm/public_office.xpm b/navit/xpm/public_office.xpm new file mode 100644 index 0000000..da3554b --- /dev/null +++ b/navit/xpm/public_office.xpm @@ -0,0 +1,32 @@ +/* XPM */ +static char * public_office_xpm[] = { +"16 16 13 1", +" c None", +". c #888888", +"+ c #FFFFFF", +"@ c #D5D5D5", +"# c #5A5A5A", +"$ c #E4E4E4", +"% c #676767", +"& c #000000", +"* c #737373", +"= c #C4C4C4", +"- c #555555", +"; c #C9C9C9", +"> c #C1C1C1", +" . ", +" .+. ", +" .+++. ", +" .+@#$+. ", +" .+%&*+. ", +" .+=-;+....", +". . . .++++++++.", +"..+.. .+>>>+>>+.", +".+++. .+>>>+>>+.", +".+>+. .++++++++.", +".+>+...+>>>+>>+.", +".++++++++++++++.", +".+>>>>+>>>>+>>+.", +".+>>>>+>>>>+>>+.", +".+++++++++++>>+.", +"................"}; diff --git a/navit/xpm/repair_service.png b/navit/xpm/repair_service.png new file mode 100644 index 0000000000000000000000000000000000000000..0b9fd5855a9e334c259c3d7b65379b8130c95d36 GIT binary patch literal 429 zcmV;e0aE^nP)F;Rt8HDMhti;X^8P42M;qi(qA0CZ8l$VFdeC z&=O`bfJyYE-t=t^=q2W4eVa?K@Z0S=E}|h7RtWY|_5ot(f2^Q61^61P_<`@is$YFw z;!K#paSc#xU+_2uTEN#kpgZVDfi|HFPs92r7G$qJ?qOXL@^tMW6<)O$d`$~HU4XNi5w?SXM2tL>ApUc$$4NRqAr X8rylzzHC+&00000NkvXXu0mjfhDgIF literal 0 HcmV?d00001 diff --git a/navit/xpm/repair_service.svg b/navit/xpm/repair_service.svg new file mode 100644 index 0000000..56bbb75 --- /dev/null +++ b/navit/xpm/repair_service.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Symbol Shop + 07. Oct. 2006 + + + Stefan Fussan + + + + + Map; Symbol; Wikivoyage; Shop + + + Symbol for Wikivoyage maps:Shop + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/repair_service_16_16.png b/navit/xpm/repair_service_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..cc2309164119b7057c9ebee6cc4cabb21d9821ce GIT binary patch literal 331 zcmV-R0kr;!P)hvG5|i3M)}cSt-g! zSxw5uMq`VVtSx3EWknW5^fzeoBppJdaVKzrWf!k1Uhbw%=ekmuw9y$S(=M9Fd;2nIF zpi8uHh>0qA`w!g8$=Dt1cq_r@80qz}Tgw8gn2IdRlKXIt6}{03mTJ)^(hOf(L!LPU`ul-!41OfyzH>MsoTH d_gKpb@B_f6Lj5w}t*HP2002ovPDHLkV1i+yk}v=O literal 0 HcmV?d00001 diff --git a/navit/xpm/repair_service_32_32.png b/navit/xpm/repair_service_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..3d3ee0e0ac2b8006463cc750ab3ff0aa34eff3de GIT binary patch literal 593 zcmV-X04L^<92>umgE#T`@!&l*D1Yg1< ztd8#8fv2erY{O&(e~V4geQWRna~P^SPoaL4qP^Fdsk#cdm4VB$q)cUC91GFjMvd2B z!cFYY_KMg?^Y{5zRq;968^CQm#8GS(dP7}(5~?U9T%3gMVl)-JAe7pt4&YU6O=aLZ zK6C)D;e0CiRlI8hTga^!h1Pr~75t*+&Xd_?~XTk8AGt`Iy9kl)x<*%+^OR)dpV0;S|tbToQWwL*e4xIF`G~17+-{3h_ylZ9C7LGO=+Nv3oZ70a8DSe zc>@)!OKG5$*5ba_ec^7m;e$e^|7-z&rO~3hqJCkX&*Mi9JcS1mp5<8nhp{AN`EDUU f-V4X;(S^D&7>EzV(TyVN z%GJ0Kf-7CPi>`E`?gSM#BH~KKo!JEOfscqF8bL%+<0G1xboV4&QOw>F_Vyl>Tqrv; z&*t!I;@J$|!n}w|v$(DIu;dFYXP&JI_gc?1Uc!wyr~6w&%w};ecY1@Wa-j#;+0Wr^ z)gkvt8Oa+tQX!`QCHCSxEZ}G9kbAVW@E-d!qB>#|TkE@~+7G=yEV%}@;AZLcUL!A---b#!W3SUjy|KbwpiFjbD`&r zXXKahB`zu{e!tOtenlj7e~Box)D?adixL^?qA6H1RDwQj5|G?h^}eSn*Blt3_!AcN#6uH${Zn z6x?Dow>fST)p~A_FOO7>{L98%>lyTCmx<%s?bt3hnNRT<-oUmY1vPO1_lkUG;+!wa z7bk2?1y;HuP8ojW4~TTS2-o3P`4Y$|q4ERyTF=)h>f6S5q7qk>!~aqE8dk-j-~pw-uywF|ZR0MypXql;*Dgh|vPVA)Vgw%@V7C*0NJpY2`PrKo4Lmcz zW>zF~x%_`sOhz0W|B<4077fn( zn_`Dvs6$}tgL02kBI3-7^kGKKM5lXy7%z&EKQuX+X+}Mt&Wp5rO>BI*y`TvH0OWiw U>LoB3`2YX_07*qoM6N<$f)&5a;{X5v literal 0 HcmV?d00001 diff --git a/navit/xpm/repair_service_8_8.png b/navit/xpm/repair_service_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..a4598e383a3a0d038d69c36e9021c5ccc84011e8 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt@yo-U3d z5>s=}ZRBkVU~s)SxnD>ufzixhTHXPHk}G-%>b=H07#D84$h$^I<3=N+$;Bhz*#Bj} z-+S`(n(&8R4TdT$VybF$f}J{TX?JgW}9)g{6mj`13T9BsLsn^xyNr h?@!SY+1;u?n7{83xaH?MUjb-0gQu&X%Q~loCIIDTL-POt literal 0 HcmV?d00001 diff --git a/navit/xpm/repair_service_96_96.png b/navit/xpm/repair_service_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..d9d39bdc165224ce49f499875b73a1a40f681eba GIT binary patch literal 1686 zcmV;H25I?;P)nhM|npdWqlmlNDorT9<%aK$#1?NGlG*oeOP-vgr*+t36&sqBH{T#CNPWYu5j|PnkNuCg*q* zb@97_V>Rkt6j1KH8f7}itEgXqCp7Av3iJk)yH2BA=XeM83vh~Joy`;u@@4UPk*id! zEUEkfbSj)z53B@Q3LH}noaX&!QZK-tis$`>+^waMK|<4~7jbNx_a8~U09}gbjiIz) zTNM)Mn_uMdLw+Giy#QY;o>z?wVT++2SOHvFLiuA$Zjqz3p#BivhD^v8VjMCrTx!{0 zgyf$SbfJC`-p9WyssOG5epf74`Zj-FU1 zY^}GENqqTw%C65utC3LK?CqP_J#JdeZWX_uG^;$_z3$#2ieu;T(?g(5(>60a*!=C z=em6|z}wgtImn(R!HHQFz{}Vd+0XisIpD;K5BjklQ}zpRkwL#>!DHAL+G_*IgMS|4=_@QmR)x`0{8*nJjo4lo(HvulyLfL*}Pz$ZwA zv&V3oV!^GLzw^6*6QXj+B^DxmtV!{A11Cl0kV{++^kG)~-;k`f6c6)}j53qrcLQff z<&aCvq4<%As_jQs%BOf}M@AMV#m@o@qH@S3W*|A5CdKcg_ynx7;$-Ai-lX^gz;zM% z;}k9Ye_4+yyE!U{Tw(%}5@=fd`=WBlC7OZFm>2)?s2p;MqX=g)_2KL}+>3h|X9SWh zY+C%6NW~vQEzwM(r<*GIPy>8`dGS{w6ZWwttX-du08T|x0*4P;4-zxqgzP#9l8gEx zFgK)ngIEV#f$Wr$Sn825@oL~8!FOUmvb*4&zzYSA3(Gbj8FGoG0eBGe;Q|%wL~=tD z%K{|F-L}wvwuJ;Qf~!G>bGAhevh5UJB<(b#kS)7xiyUNofL3GPTc#P=>&CXoL6+#L z#0H`X6R27@aF#LeV?Y!`Mpf%YrYsXnJLc0sRP7+LA6ugN82du|Ss!qjIk)4%6zmJ_ zXJs>$_z?ER_OlL?PREHg*caPtcNz6KW^`j;@O60e3q0@zSridyX6iUin~iYQF}0+QAF86cAKJ4vBukV^aDQ} z=A8A&+Nm81^=(r)=Ma-M&W$a8efM_-j$e!9)9+QR?-<4NAfe9yzY7qwwc=*rV&pwR z6`dej*?hg|c!u`ByV0NWt3xjVcZFvCPLaRqQ5KjPLYa@CE`AP~pC}tT_|NghA(S^4 z{gsZlhtLjZ7>VTlycI%OZG;nFO7!%jA2*_(Vb+SICF+X5kM!f2B{PlilDM9Vxb4n! zKJpQTFvQOSCq~s(2awRj gR^$aMCB-iP0{uyugX>&(y#N3J07*qoM6N<$g6?rIlK=n! literal 0 HcmV?d00001 diff --git a/navit/xpm/resort.png b/navit/xpm/resort.png new file mode 100644 index 0000000000000000000000000000000000000000..c7afa0cf17ca63a94a31e701430ca607ac797303 GIT binary patch literal 621 zcmV-z0+RiSP)Al!6)%Y^!mXr6LmIOfoa(GbT+93Vq?g+{4Us&->ot zO8>inUZCxvp>KU3=kk*8K=(rcL)k2!Z5w}P2DY{++BR9>)qS7?j>E5Hl6*7@Qbki! zVB2`E%U2-MD)hDMVy~`Ju&f(sRk0ZC?~`{Nege<#0u1>+pK>|8>FIi4tt<p;bkru(wCfarg~9mn0R7 zy!Sl(xjD+WKWJ2khcGl$506A(ZH>1(&VJHvm+%EHyy`f((G*Id169}$8|2?1F!%rxGw2LBA7Upx><)pkjX$Y8B9Ai z2ELC2e7x48WsLb!-TC5zcaom|?SMx{q|Q!hcQ@#l%hJ`Aoc4CJSoN%?|DUA6!Ah=b zot{cdOTl+aB}r1K*8AtBl1@v*!P1_tWE zw^=P+gT-Q{?XIq%Un)t)+yg90XJ=A>f6yzJrM9- + + + + + + + + + + + image/svg+xml + + Symbol Resort + 02. Feb. 2006 + + + Stefan Fussan + + + + + Map; Symbol; Wikivoyage; Resort + + + Symbol for Wikivoyage maps: Resort + + + + + + + + + + + + + + + + R + + + diff --git a/navit/xpm/resort_16_16.png b/navit/xpm/resort_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..af89cbda7379bef7663b49df6ef2c57214feb70e GIT binary patch literal 463 zcmV;=0WkiFP) zm)gcBSP0l@XQ5ccMg+02&}gy}ljtTEhTYF%*_g!(LGZwE&J5@K=bwx8UjdlsXLg!R z7XJb#3kA-0cc~v8QMtb-3v_h^H=8UyJW!mU$CW^Wtu35ViA!Mow_PKZ3VY}0JPi-~ zVEdSz#k;xT(Q#P&4o=uMC)q47(dbt=7y|>4%Tcy%4uGBjp0jNV=``;_V=6@`EGsOu zxyf6x$Q3XVX*6_fSsEH0l^c(TosEr2%gfTrij++HYrVZvcenZu4>j}ps#5`JV6|K( zpGt)tNH94Gt_%JB{yY|gYLz=+8(5DTV{(#od&|bxyYaJSNsWeIyRPIoswNU*&7Z&*T2-nw= zF`x7H+I1yKt#2I?$Yi8asUt%z2Q6)2LDF(*1K~z|U?Up}iQ&AMgzn6q6(V>>uMyz$v5;tinMbL;^1?lD}2yPBt zGIYq$rJXBM!NH+Ju|uKQL6`nP5kUtB5r;q~!A5DZh()x;=H2^qcxm(M%ZrUos)HXK z-n-{}x!=im-aU!*AG-i>3E2NPgk!*Mz#79_Ahnm`M_ref05dc2=#s>D*t#Dy~96k(lb6!iVGC&Ce6*jn7h zMckgAor(KflF2}^h&6@}z}Z^F4*`z>=I61AL~Y{!IDa0NmT;}b1%`ph@5FnJpFQOft<76Md|0`_67D#TGv?=F)r7)OC{)hhyC>bhAIzI_ za|3gr`e3LL>9ln6WH9e@AX=9K9H$)dxHK@}RwC0fl38@ll1z;iMoqR(#MAEx*PliuI}q-YrWC6 P00000NkvXXu0mjf+r@vN literal 0 HcmV?d00001 diff --git a/navit/xpm/resort_48_48.png b/navit/xpm/resort_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..4f1e8e5454607013919789d7d29dae7a0a8f2777 GIT binary patch literal 1076 zcmV-41k3x0P)lAPPlsQ3@_P+aikEg<%4=Rsz;NGn)D;{sS8Hiw!37~p&0JrDz$!sZkhKr0Z(#yy}d zY;F|+d=C8OvYwo@l9&R%3Y()RfWd{5A(eu`K`;gm9)!1Vb4g@?VPJLGd~*O=fS+83 zFJHpmy&&bSqXQm2veftu*cvu>0iD3O%j)i3*tpRq?^<&+3=dmL%mCknN&XNp3y{gc z&=5FIdGdwU-w(;8mBev`; z+g2TU*BmFSS|($a)S;y$-wXWbu6FfmwytX-Uub=OFgyBUTcB0H4%@{CeOQch+ampsTCCQzZeeN-*^vR!ql$-A~`6WqRSCGjWF8H9LASMBNXUo0q6DR}%Cu3v|? zw#rE~HDycc!-w1ybHI0gS(1~?<>j3o2!opki5bmK-f=f(C9m$^4uTBPmU zrDMmWwFNhPPmgr}ez0{MM>=~}I(15lL?lTwk_HSgCTYjajCA6JG(KKB_{9rpYARR) z#(0w$7?7@A%lpTVOINOxk6p7y+Pt~+`GEt{#f!O(_*KAICAm+Z4qif)ZkIw_xZoYz z-5sbB??t@#tNuu(Z2$FZ@7Q!Y*qn}}FC}?>>3$$-@hyD;yLQ?B=%{yWCS$o@OZulw z*qmdGnf00k2)Ga4Fh*)^mAbm5OPBJ`M@FPX!h2ki0#A%F6XoKZ#S$z=@u4nD)R0c^XE6bXt1)R62Rme!g?3|G3Z;@WS)wwjYi9$2W`uE{YqIQ{nn( zI0Yp8+FZ5DKepi%kfiD9{A%@Ma|BDfi z2aj(^1*$cu4+Q-^|p?rctv`Q_*d523S0&G9klMJU%y%``| z)3!>Y=J4GD^E;mQck+HXME~~)Rtr2*YWDbz%tLbqDbGWz?mt&-WN|!DyFHn)qNwk0 z!U180zJ~=G-iH-ii*r~@o)>?siCBO7P{}F57gx``2@o)1RXQkemHzDh{ y&6s*GC+v30B(Iw}5ot56_OGvr?>E@;QQG`hroP6Rw0xlB89ZJ6T-G@yGywp;t!LW+ literal 0 HcmV?d00001 diff --git a/navit/xpm/resort_96_96.png b/navit/xpm/resort_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..a9940ad0bba60a7216a7e4d5545c86bcbf3b2338 GIT binary patch literal 1914 zcmV-=2Zi{FP)S3W#DDq z^BFM!`M_pifZM4D3UtpervWAcji@;RJfeG^ISDWuXmt>OkZ#~L-Sf>UfaSmy58|it z0WePY+=n&5Sl~mI!pDxm#~(We;WuEW?sW`HfJcEpRLXAN42cAYz>+1<*{KY|RbVAx z>0Z;Y0eA!GOQ&XMC)Cu~!lzn!IsEdAV>Wya+@pJKSq(4-cwePpON%Y^o#GGLU3WoU zonsJA0Z-^&XI27C2ac(f+qDbEj#Z1FYKs>`M~5;9*MW^dp6)eg4L~(;F`Zg{eenA0 z-h@xJ(o#5l*fATv1n$+ncCDc9Y5_QT66VawT>L>BGsd+f{SD03t%DYTNx%V>GW+(y zefRknKh91v}x1e&>_ccXab6LYZEDe1=QaB zuNy*pJ5*GJD}1UY5_bPEkhb6fa2j|@w@#4&Ou)VuPs@)#!sN-(iJxi<7s7x4DT9zC z*Gdu&UG2cY?OknLHgzie^pi3O0N(>8y0r@o4qa_W2P|3?ukd%4q>UTl#tmf+j0(r$5nyV@)&N&f)Vx;0J@*GN17w}RL@fY88GK4U@+9>GmhPF0nYJ#77z!?r2S;Y-FHV5gu+7j`fJB2Gy^ldh(8JVLFMJM&%$3s zoV2vqU2aq*Y2`}j?^k~OW#APj@s(X|f4}WKimosv?|`Bo;x2L z2HwJcj&cYWFG6*7bQ9LWh7HlJM+8brVE=x{Dg4Y};|6R}U3KJ${X{{Olhr{-2aF#d z?YcZPZe2i?1=Nekke3>^Zx>m!M&#Nx&-=G8zbg`OUfx;p1;CQcM7@cCZlz<|HMOGi!yKt$yDarbKq3;p@Nal_x= zr6Xqp(Aw&LO@F^X-(hAzLPR!*h)cqznr|m(OHi517lgn6?%%f}0KT-$ z*#J~kIgfw(sej*!%<=X3VonC2yj*1Ya`pJBQzD;y;@^Lm8IbTljqD*W&+bl3N<J7ZAS}+E6Irz?SnVHV zL}frwu3i<{x>aP$7LnfGaD0ZD0Xew|r!so9$n@!%onE?OZbLI5FHhvvS4DpPRpg_O z{2#!jVs1lyU|Awdmx?qrWd0q)os6gquq<~gC=i)BQ)JmPk&`E#{XPA({Vi1x!rX+j zJ^)_m?X`~(`6a z*81~pN{|P>`pS9SvP2dv@aH?sMojxxl0nbrRWvt8=i6j}X3SB9W=sZX#@vQ##@vQ# z#*`q=iE&)S2ZM{bk2SuwY8zDYPI(2D}KVgUM~v^3ls_kdV72Ecsy7vmS@oy;ggdSj*gC)oSbBC zZVtmR*x%o0VqyYK)BX?M+1cUo@e#M%&HDN}Gcz;9Vln3D=SihfOixb}3Wc7twIXN| z2*gE1q*N-&+S;0=QYkSELxRDe7=|HFxxKxWo}L~7q@kffW@l&1HMje-fF_`QGr^Ha zL~^;D6pKX(27^*46y)!mot=rQssc!3W1}oCE}CG|Q7DQ+eSJMED=UnQj8IosXWFBx zszf3Y+S}XFb)7^aVVYxl-MYHE*xK5{@Ap?kpVHmkO*kAT8jUhFHT5!Vx7)GX?Nz}) z<8(T4I-M13WjK+@Fgj}9(!V5`%$3K=ugk0TuZffeDApJSr1%s36iHBm4R5Ic0000< KMNUMnLSTXwm|=hb literal 0 HcmV?d00001 diff --git a/navit/xpm/restaurant.svg b/navit/xpm/restaurant.svg new file mode 100644 index 0000000..9566d66 --- /dev/null +++ b/navit/xpm/restaurant.svg @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/navit/xpm/restaurant_16_16.png b/navit/xpm/restaurant_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..9075b22a3d364af68915c6230ccbfd1f10229d4e GIT binary patch literal 467 zcmV;^0WAKBP)@36u zIkk&m?BW}Q1i^?9BDn4yg58?AVsDrAbPvw`y7`#-@xja}Fx&$V+^0hXNPGiujsPSQ zkG#Cp|7%iFo&Zoko14vs`FwtJAP53%+rIKI0K46ea=FZ8GC@Q>eAjg`41<2Zk7=4; z0}6!#tJMlk(-@D(oX=-G&%?4Tf*>H9&2l^*F94CxMJkmd3`1PkMb~wv(<$+IoK~yF zXfz@gi=k=S*9ibJnGDHf65F<^*X#Jc&ulg$pU+dP)lgOS-vEGgI*sEvIF3WJ*<`!j zQY;p4wO#{GrxS)@P^nZ{uh$F)13H}!jYfmR;c$yFd`%>Nh=_>q`?6dvB?tnsEKA<(T=5$q3`1Eg7P8;(#WYR%TkUpR0MT{*0`Rc~MNv>y71wpC zR;yPzd%YgfXp~$oci}5<2_7HrJmqHvhOgZJOwSSE=QjYqegl^t(2#?bWb6O{002ov JPDHLkV1i;*%XR<& literal 0 HcmV?d00001 diff --git a/navit/xpm/restaurant_32_32.png b/navit/xpm/restaurant_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..2dac76434f444ba21e134119f8d44f49a59dbf26 GIT binary patch literal 1075 zcmV-31kC%1P)dKTB+)ph;u z`+4sFeLoTyzJmznOC(u?00l_0uK^I=fUjx%pS~O*=;t6VE)1*nuTO0#NybOtXe4NP0Nc#Hv5JJ4F;O*@#gM)*pR4OhnFFyuwb8|yRMh1C# zd31Mo|8iCihXaj9LuzU&k|d$kYMGgtc|U+8NdUyh$D>lIXl-rf`uh6W+>?_N1_lPm z&CNxx*CUt92@MV9;NZY7gkON@=xDaKwg8BVilVBj3awU)$K!dFcY1ot@bEC1nVIPI zdXkfq@p`>Tl7w6?$7;2{51_EH5R=Ko#>R#ZsG*?&jYfmh>Gb7IOia+&*vQz}80qQh zoSvTI@p#D0%*1RqQ&Us(J^+Bax;j=@SJ~d)1|U2|KR>@O5)eRGSQz8u zjB$mMb$L{n1}DJdxw7Z>|m z>SqDoWW|ysp;oKu>gvL7w*wFu7)Wn#FE*PEv)TNXa=;tU0=L^uM@I+s_4SO5jNouM zd|>6}<B3p4PRUVAp}E1LqtSGP*PF?fYE3q zIy#!1oSY~5qobn~78Vj17zn`O;UTrPwM2x}>v$K8i@$oUOt*y+@&%X`8>-7>E8cK3B~$Ye5XHXC-k9fQHZ#l;0hMMZv_KPV_Dh{eT4($dm^d!I;5Onfo_MJIH* zTr4gwl8}%-k!=MQi*CJ+4?3F80&002ovPDHLkV1k0D4ZQ#W literal 0 HcmV?d00001 diff --git a/navit/xpm/restaurant_48_48.png b/navit/xpm/restaurant_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..2bba9941f743a7780440a4f421352dc955546f35 GIT binary patch literal 1857 zcmV-H2fp};P)z7z&~y%Iw$jb1 zV}3-$vVzdWMOkRl53$k^a^}Lapbs!2qU2G_WbyWKKS4PEWF;Hvw3_2?yRY|0PkY|` z*~)G1eJY;kfD3k?=XGA^ad4m9*L7Z_fXf2_!thIi{3jGZ5`Z~Bno3}xrbB)-h1ud? z0Y4hQyns+|#^mIM7#iC4cXRnJDC&w=`!D|n{&@myHrxM$N5Jq)KwVuOv|25ys;YuU zz+$nWrltnZpFa;M-Y)@9pFTx*cQ;nAUJad22SP|dNx$OBlP4%IFGp5Z78)8F0$Rf_ z0U;q@rWX|zVe{tAC@(LE%jF6vac5^IT3TAr*4BpR=4MDF5@cm%;lhOrey!t|0E(jA zzvXf{WHK3wi;KZ9jL&NjLU82B5m+o1)YsQTtJNYdE)K)P!`QcPA6~q8;SVMM1h6d2 zdEUN#J4#AQP*_-q>FMbi;~9oQX=y2vl9HfMD4XC z&CSih7ch73T)cVnhGR=lPe)~CB?<}(@ZrOUZ^p7Li=v_;D3waY$H$|hq5@*E7y^L+ z>FMdXc=00A($etu?OQZ9HsaN*SHTx>^ypD&wOUxMR*pR-B?WrD9!jMW?c zBq!e`zTnxjXCym2n@mkjdH8HL8<9$-WN>hh)YsRO^XJcd%$c5^CPPC*L?)AwiHV8t z=K3qgKgMrfkJG*)At3?Bj~_=tK>;pZx`c>`2)8dPDhgd)T~H_#h>eX!YilbQhQYwV z0K&q;AP@-9+uIA1$%M|%PEM>pnDuEiF)(;HC6?p)lzLXI6Rw9swW?*0dr%#`T(P)G~AmI31E*F$aCDPK; zuy^m?z=(QpX!?TI52U81V$YsE$j{G*)9K{+csw4AMk8pNhQVM6R!RUtY-kvUL04B7 zL?RK2i;F!(goK3P?Af!RX&UFwoeNgl;0PES8-rXfhgz*hLqh|kQmNPDHbqg0h={<6 z6DQEr)D(==vlsC4?ssI9HV=;$aK z8yitwT|L|M-fty*#r5mgaplStba!_nGBOeX@bTkE6ciMouC5LylL^_`*$@ha=>k897Lnh zknr$u0)R7?ELlPh9y~Z>zHe=0ewPr#FeooC$FgP1aPs6y@OV4`fWzT{N~Oa7{rjbL>{D6+JyYC@d`WXqtS0ZzV+2G?7ZB#B4Tul!sg{Cw+Z= zGnN4%gs?12GBPpiM|*oa;^N}mcBj*c($Z3B zG#d98XeLk;g_}2TA|)loeM#^YHk%C(9y~yPe!kCdVnzXk5S%)73Pz(53l}bQ+g&af zv|258?%autj0~TWeFdM-$Nl^Fv1ZL058veEB<|d~gBv$)__WrH0zQ5EgqWBZPTjIB zi?XsZVHBY5a8j%hmc4l9=@rmDfIXE`?SuC0>Z6h5Q#(_dvtU(wrttr(;72wWE4fAwzd{|d3lJ9jfK@}g-WGDZf}^XB2vqes}daU&Rp0iVxDVqzjPGc$dP_h~2Iuwesk-MTd^qTj>f#fw4HG|Xl* zqNAg+bm>x`V`p`g2quI=ArcZ2{EqwQ{Xg)t!D|Wq{`(}7lkfiBTmphu0d~6!CewsB v*H4FEzJ&f2@S_n5zy?4t)5M<>)QA59)OFQj!`kmH00000NkvXXu0mjfGRlBd literal 0 HcmV?d00001 diff --git a/navit/xpm/restaurant_8_8.png b/navit/xpm/restaurant_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..2827229d6b4464f9ddd116380cec198135745079 GIT binary patch literal 245 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/restroom.xpm b/navit/xpm/restroom.xpm new file mode 100644 index 0000000..597c0d6 --- /dev/null +++ b/navit/xpm/restroom.xpm @@ -0,0 +1,134 @@ +/* XPM */ +static char * restroom_xpm[] = { +"16 16 115 2", +" c None", +". c #262CA6", +"+ c #2C32A8", +"@ c #6D71C2", +"# c #3A3FAE", +"$ c #2A30A8", +"% c #8689CB", +"& c #484DB4", +"* c #3C42AF", +"= c #9699D4", +"- c #FEFEFE", +"; c #CACBE8", +"> c #2E34A9", +", c #E0E0F1", +"' c #4E53B6", +") c #FCFCFD", +"! c #EDEEF6", +"~ c #2D33A9", +"{ c #8286CB", +"] c #FCFCFC", +"^ c #ACAFDC", +"/ c #484DB3", +"( c #F6F7FA", +"_ c #E4E5F3", +": c #2C31A8", +"< c #484EB4", +"[ c #A0A2D7", +"} c #B4B6E0", +"| c #A3A6D8", +"1 c #4F54B6", +"2 c #6065BD", +"3 c #A8ABDB", +"4 c #BBBDE2", +"5 c #B2B4DF", +"6 c #A1A4D8", +"7 c #272DA6", +"8 c #D0D1EA", +"9 c #FFFEFE", +"0 c #FFFFFF", +"a c #FFFFFE", +"b c #DADBEE", +"c c #E1E1F1", +"d c #BEBFE3", +"e c #3D42AF", +"f c #DFE0F0", +"g c #E8E8F4", +"h c #EEEFF7", +"i c #CED0E9", +"j c #474CB3", +"k c #262CA5", +"l c #E9EAF6", +"m c #E7E8F4", +"n c #E7E7F4", +"o c #C6C6E6", +"p c #7D80C9", +"q c #B8B9E0", +"r c #FEFEFD", +"s c #AEB0DD", +"t c #898CCE", +"u c #AAADDC", +"v c #A9ACDB", +"w c #C8C9E8", +"x c #BDBFE2", +"y c #B6B9E0", +"z c #B0B2DE", +"A c #CBCDE8", +"B c #AAACDB", +"C c #CBCCE9", +"D c #8184CA", +"E c #C8C9E7", +"F c #CED0EA", +"G c #7A7EC8", +"H c #E3E4F2", +"I c #A8AADA", +"J c #A7AADA", +"K c #C5C7E6", +"L c #343AAC", +"M c #F9F9FB", +"N c #3B41AE", +"O c #3439AB", +"P c #9B9ED5", +"Q c #DDDEF0", +"R c #777BC6", +"S c #3036AA", +"T c #4A50B4", +"U c #A7AADB", +"V c #DADBEF", +"W c #E6E7F4", +"X c #A9ACDC", +"Y c #5156B7", +"Z c #2F34AA", +"` c #CCCEEA", +" . c #F6F6FA", +".. c #767AC6", +"+. c #AAADDB", +"@. c #A5A8DA", +"#. c #C0C2E4", +"$. c #E0E1F0", +"%. c #AAAEDC", +"&. c #A6A9DA", +"*. c #C0C3E5", +"=. c #AAAEDB", +"-. c #A7A9DA", +";. c #A0A3D6", +">. c #9598D3", +",. c #B8BAE0", +"'. c #9498D2", +"). c #C9CAE8", +"!. c #F2F3F8", +"~. c #7276C4", +"{. c #282EA6", +"]. c #2A2FA7", +"^. c #292FA7", +"/. c #7074C3", +"(. c #4248B1", +". . + @ # . . $ % . . . & * . . ", +". . = - ; . . > , . . ' ) ! ~ . ", +". . { ] ^ . . > , . . / ( _ : . ", +". < [ } | 1 . > , . 2 3 4 5 6 ' ", +"7 8 9 0 a b . > , . c 0 0 0 0 d ", +"e f g 0 h i j > , k l m 0 a n o ", +"p q - 0 r s t > , . g u 0 a v w ", +"x y 0 0 0 z A > , . g u 0 a B C ", +"D E 0 0 0 F G > , k H I 0 a J K ", +"L M 0 0 0 ] N > , . O P Q M R S ", +"T U Q V W X Y Z , . . P ` .... ", +". . +.@.#.. . > $.. . P ` .... ", +". . %.&.*.. . > , . . P ` .... ", +". . =.-.*.. . > , . . P ` .... ", +". . ;.>.,.. . > , . . '.).!.~.. ", +". . {.. ].. . ^./.. . S * (.+ . "}; diff --git a/navit/xpm/ruins.png b/navit/xpm/ruins.png new file mode 100644 index 0000000000000000000000000000000000000000..8ffc1333029dd7fd5ef25f7744203d56879d41d1 GIT binary patch literal 870 zcmV-s1DX7ZP)FpL2J&yYqI(c3bL(o6uBnEK9;DDeA?*mm&!w zEfUNHzL+>fO@dXR5abJy3VXAph~Vf&hK+$QYM2H22WNU>fhfYcsRIvp+v&F6w9wkB zH}%Rd{N6mz=l9{^_j>@2@~?yZE$DW;PgpFLVY}VFIXyl7T9)Mzuh$#P#jA2P1_uXE zna$=phr`jP)oLe5l0;DyJts+0VLF|@pwsE<91h1Dzu&(L0MO9TfG;d8005+aE7s|B z&#hML*^-hH1H&+<$HvA+c%FY&RaNyC!!TVW67l!;_D%o*jE;_0*4EYrolfUvMN#-r zD3r+g6kT0iANKe65su^1dc9r|1Yu@iV8Hz|=ka(dY&KhfqA0D=X#BjmxOma!a>dYG zVwPp26h&3iG!166xrijma5gTHNZ6N`muZ8+Fe}UQU6;!h0|3a&B~}z=!e}%`3kwT3 zL{SV0f-skj8yXsVF*P-1mn7*?b91vlQ_oCH0DuAjsZ4{SC`_$ZS0s~3U|AMunhs$z&2R4ATMt1OfqL zI2?AYuC9LE+uOTYQ&V$>T1+rFr44q+zewFmLdp(W*7!kD%Dmhl{$tX2z)=u zt*tG7et!Oj)9Li`JimC*m35E%`}+q-l5AUAS_)}28lP~L$5W|PLXxB> zf*?HX>+74%cK?@&GZ`Nr57=xr&T6$jh{xkNP1B`$d3lH^ilcLLbJsl{&u}mp6mv;) wPJA$}t*w;FWO`*XndVzsTH61_ALak$8`k|P*SN%^&j0`b07*qoM6N<$g4ng1jsO4v literal 0 HcmV?d00001 diff --git a/navit/xpm/ruins.svg b/navit/xpm/ruins.svg new file mode 100644 index 0000000..4a158d2 --- /dev/null +++ b/navit/xpm/ruins.svg @@ -0,0 +1,801 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/ruins_16_16.png b/navit/xpm/ruins_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..df0227ada0d05f586779fda0f32b8bb1c30eb2a9 GIT binary patch literal 569 zcmV-90>=G`P)WfcXb3HWR<}(cj`$$OC?DDA_+X~hy_Kqhjd+c7=}T*-R_6^d_DsJ_fB)4 z&-ZdX9^Vi}ad2sYVHh7Gkw_dNM9pTiFXkK}G#Cs9`)alN^n3vW02=@RyWPHUI-OSm z02YhI$MbNpSmbD$e!p6+-paD90|1cGXq1v9>BwTSeAjh-K@h|Y06^0;peV}SXf&=5 zhr^qOVSK|F-wlOAhojM`Rj=1iy4~(G0stV9NZ4bs*s z<~$xxkRS-a7{hkE-R<}L>TBcg{}cq_mMDtv6h%>3mc3@RT3x%{ZakSxj@s?^t8%&g z)x6XTkCaZQaWa|I=JWXjm&+AzHk-FAmC6P1Plf&#{CD~V37)c7;nwXg2x9UUucLJKt=6s9A^7`spp-|`mAeEvh55q7e zYPI^O0|yRxtE#F#`$q*>ES9<>M~?i8Vc4f}adF=rI&|m*0D$`X`fta_$BQ|R>t9(} z;RAudL$}+#ynp}xgU|ZV>-CbRrlxlr8yi!e-rv#_kRdd1MMXs^QmNFBVc73oU0n!loMwv+)u5E4(EIPuBM%*+DIveToZqd}!osm;yJMKKJE zxpCvh&5ihb_U!q3c6L_DFpM0-uqmlj+Fe#wc6rr~ZYIFxa(PEaMjq&Nx&oC-1sNF` zAeBlXD=RC`>2$K2@mZFYs#GfN^78Uyl}aVLd-rbj)Ap^@0H@Vz)yc`p387GEQmt0| z=jZ2Xx7)qa+S+)}*8)J4upCr_)(`{`~oM=Qqs&002P{7)g=_0DxdH z2n0a@K@dQaWb78`g3V^L+iW&_G~=28lgX4~x7%j{AoA=XnM@{$Mpi17ij5+lJb5xN zCMM=gC=}|VY5JSCwzie10@Bmd38T?izi;0@btn|Nc<$V}=IZKdQZAQ2I(_;yFOf*3 z>#igSz;PTXmCAJ)ICktAnSfy!pePD{zaMZMhe#x{=yW=Nq$uih ztJUgSR|5b5ckbL7M^W@(VPWBQp69hOF)?Bs$9K)m&3P9W7lGqANK8xwhG9Uf)q+SQ zLKOAPB(oJn%dZ$;ruUYnEjp91hRAT&|Yh-rlcTT3YDmYT#*fcXzuJ5)$4{ zNlCeeVVFiN7DFHqKoA6h?Cfm7aU2#F7C<7A0ES^G0IUTTi^ah6Jgf@xdcCf(v9T-d z?d_NQ`}^mj6>8KrY-?*9MG&OiXf$@j$H%A3eZ`1jE#*gMT@ba0001+%{CAl8(Wc^o7+hc#164o{II>fU2Za&JOn{# z0RW^@DHe(R*|j{+15MLC0|Nt%R;#rG0G?~PXxMNP4h#%TYc!fZp6A~biA3&5Bx3S< zy@!oPV+u{vz;WCX0K`vCO?CJ5^qi`#t*xObY7nB#lE1>HzaapC*=#OUtJU5M7cThD zo;~|cFc>_uckkY8kw`Sr(b4hIrAwFE0btXA;e`b}i{|F$D-MTa7sD_ub#--LzKD;P khE}WHa13u_8~+>p0l{@vq`uM@r2qf`07*qoM6N<$g43bJH2?qr literal 0 HcmV?d00001 diff --git a/navit/xpm/ruins_48_48.png b/navit/xpm/ruins_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..4b73eb91525de00be8cdff192664e0e50eb9ee3b GIT binary patch literal 2561 zcmV+c3jXzpP)f$CV_-B zY}}A+cJGf~7*wz&hj)J*znPuP?)$vY^ZV`lywCe&0p>A}dCX%T^SIAgy?V7C0Fe9P zn{_{&#_{5dFFvqx<;wT9TJ6gK(BpQyk6J92Z)$34F3(jA_FOrd4$GD;+hI1FOC}~J zLbSuB?G2!hn|c)UnzYUM;g?fdggfu4HmspOuX9vT4XITP^26HmO4Vc2REMWtG;cBx9G zN=i#h%fm1%T_Tatk3ar+*X7HXLjV9yr!&;r+S=6E*!ZblukTJzPuJ$==H?Lu!68Y~ z)zj0n(QGz5ri=5|TW_s;=9y=9tXZ>W`@2Lx&D+NyPuV@4owTX=&+RsZ`1(2m-?4FcSy_u4QFq zK|w)5{#4t9YI8|Ri7ziNj~fn$ksp5eAviWR1}9FO=xS?g3)<~=4xi7b4F<#d^73-i zY<;g?yS6GNCFQfh!9i|EM+fxv^+9)cx4odCV2RJ?tG&}cp%kJhipa>w5RoJ)ID7W2 z%VM$IbT}ONrcIj+7={5wQQ-A@hcFB)IDPu`x!L#@i^ad`@9!V;dc8MwI-Q8m=Z`E~ zw(P<7_V#a|efHU%b0VO$(PynG&i2cSJZ|F&qg!J@u^|fo)fTn3!zI-_-6bemC zOA9tz-weY*N=nKCxm*qcfgl!%M2MR=Z@MpBxbXYw>=UX&PN%bpB*};K^YayQxtt@D z$v~&mfzfCLyEvrPngt6NE)1MGb7tDweJ?aO zH(zgVZe9lfpi-&U+wJz;ufP8K+nMYW6#zJnC$ZUVM5EE3ULhlhs;;^W1|#fJ6k z*O&hI*d)wRF^F$)iUbR|1R#;e=ieVVWFbv4$a$aR+<-@(by+)EGO$LJj z;c~e_iA3Ti2%>e%mMxzGOw&q~l$2DImzRGLjYg9Lfxr-s;}59SYM^P_s#dFMkH-`0 z=;+v$o10s$)oS(ec?3a#-EN2C;$lEi6voEJpt`#H`4?Vzfm*a^QQ7F|XvOgGFq_S0 z2Qo4;z2u65C{b1 zTCG+ZpTlCYfTn2}8X5wIVIVg*7iwy1u9{3H5lz$Nf&~jSN~Kafl_ZdAe(*{LRpePE&VliMC23c8IY@^YrixXoQ=C+F< z2oMT|5R1it#bQl9_xXH4(==!_8n9ZeHysYgR|G+PSW{Coeka!%&jGX9d^i@1L1ks- z?pQ1)!!QgG1c|>PBoGL2002B54@jj_5C{YylgWT2NqFd?hX6%U$jZv%0>E9w;}@69 z1%W_t8+nFdKqL~u)vH(Aj~+exd3SgB-%g!6H8B&!%E*X?ilnrvAnW$M2)jC|tR6 zrNwHs*45V5)&fB6Ui^Mm002N^W8;@7igKTR`su$4g+hKjkjLZkW@ct8Gcz-R&1M6N zqF}e%K`NC3m&=U{nrtOzS_Ot-AR3J_7K`Qll`B`itgEZ5g&F=nCL{m=prN5*4}u`9 zRjXG0g~#LZg+d`@XJ?b=&!2atr>Bp5Jf5U*IIJrzEyWcI#nk;W>0<`s)WwSz&$P9* zeR1T-k#A;0d{zPg0FE6ywwtDDtg5Q&<4`EX(`YnW6h%7+1_pS+U{EX+3WpU6g)W{t z{}wS><))@fG#Vu>7R&LLmX^AvrlylH%Z@c60RR9E4Go{5C@Ra#%iBznBRVLk;!Bm;>7)aKgeVgpv7W2WHy`sap}^fvx$XU0q#GX=!Pk zq@<)mf*`1M>(*s|@WBV)<>cg4G7Q5u7!1PR-d+fY!!R*15x_7^5)Oy`&CSiVyLaz? zr=g)?_t4PLjkzG7kN^Mxo6UAsAQ0SAsZ^i7{`%`q0D!WxGCKgQ_51y!IF5_+^Yfvz zvom0|S`Y5syZ7zm$B+Nr@AnVR74bOc^xNpRZQDL#80L=@MU8FPut8N{UvJ*HabxLR z#<&x6{c)GIbLY+z{r&yQzP`Tmr%s*vaD04xbdF=(e=J$DMEk$yFpqi6V;=MP|G>Wh XI00000NkvXXu0mjf)0^M< literal 0 HcmV?d00001 diff --git a/navit/xpm/ruins_8_8.png b/navit/xpm/ruins_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..fb1c5ed4f9f023e80b3a2bbfb0e0c9a6160f6bdb GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_eJY5_^ zB&H@OC@@GQ_JpnuGnBU|Xb5(8R`zsqO3IChxDhPEdi3Z~?k7*5-ru}o!P&(89T zicaMK;-fwWtX5W5@+>SYA)7XB;RxI?`tFy{|P`vlesCd-i^w-?LwYhMEEqJ}o{30wGdTl+yw~VgFuGT=0D<%~Kfsz%^G< zkb~U)`^s)EOoBjYzbeT|>v(1EWcuo8ziw!4aZSu*dqhH}C;OxITJ3CAC zE0)|LFs^FuDvUSQIE>Wl>gwemKYmnyU22eg@%wrIKyPpFLk9d-!lgKtMnwO|@XF!F@|{cXyYRoE(cd0?S^I?)c=SZDE0V z-%Gqvkym%3ko>q$Hb1u`p(WvH&KQ-MYawi5|X`ca1j#|pZ0ZiSvUD#eGg!nKG5F9 zpqukrjya;he|w!Nlk-hLNT~P4ix&sS$8J;zIa;Q~j#vU}ZYd8BLH$xaYa5$E4>va* z!_qPJe|OfKWvXJ}MG!883KF!ius}jaPA+*l*&lG~bl6rNEj%%9$LAi;c~z&qa07ll){TC57rmYVTW8gxoiS(ri6cPE{3oNJt0- zlAV_)yScWeKn}%r2@4CmOGC2H_lF2Gzj)!VVrjWLFC!y!+gx5=K4Q(^LrzBa?xXTs z(#TxGdZXPI$JvHb`MdP`932lX*o49QDzHVV40>8 ze0+!VkcBk0uR5F#4vvlzs6lJxYJ;b-xnHH2Nf+RJ|AmBxKGxLKJl@@Pbl25QPVBSn zm19kqMwS2AY=iS@LV|8@14_UW7L4d9>F63|*pp&z^)q!R#E`_yUS3`!_LG$lCv9s! z-CnOrs$gPb)*T!ia7jwG?D(GT5()dAe|!4i0amJVJ}A=qyu3WZV5xoCz`(#ARZbcj zns`Be{!Ax3yQ_E3&I7Ot{WO`Jcy;!q`%Fws%5HA_d6kuk32AAH8yg!KBqSsXN=n@^ zpFe+|rKF@xtmp6P?X{cCk&U>G>R)R)IYQoDrw$GdVz80fd~0mH+Ev{}_NVeDCM7*! zPf*l%aw>l)B=lO5nY7ihR@Ttauu+5K7Y$)}+@w9bC_OQ0RQord6WjCkyg1r(zkvE# z$GhF1VFWl;CFH$bU0x2|i4R4Tl$3hka8a$42i~A8k5>DlPft&$A|oRoTwGir(GPqk z;Mh1g?d2xTmw|d^MjIPzYileCip-px_%wvL;Qnjd*lhGQH8nj*{Hz$i~$3@7Q>!C&sfIhs4>#V}V#kGCOItX)heeN*-!{6@m z>dN2F&MxlfcJ$k=-Q6{mJxhuBdQPORCCON#&kz z^xUK7`EhP8r=dZLZg0o&^Y;&yW5ozz4l<)T*c?U42|$V zq+J;P-C=q)U}s8TD(`P!2G-Kjk`^!FvYUrTh!is~lZ2lae7Pe=9}b5@6BMz*S{PB& zJEsTpSXfvGpmfbOG~&&yt=B0D(Iu=2>yk{e$s%-;Y;0_n<7LLCZ0zje8LI43r0|(_ zk4A>ymd{7V$G7rwbLl}p{xq*hi%S%7A_h_*O@{bIK|}MQu(0s?(D3li=;)~AOoO|M z8fyYJIR5jr!IryQU&?SZS_m%-RK~Q?qco^=_|g}4XB(MGq1y(f9fK5l4R&+sqrk}_N_(6lZ1*8W|mZ3mk|THM)6ud$o5J z+ZoQS!_w& zLEZ3>LF@OR?%GO9xW1zorBvC;35kgVkSQsGc?gEfYC7I^BcrQJd474B3*6w4Kcg>OgQFGB7YsHrF`<9k+6uwO!vpsj3%Dqh zh$t)};r{;dF*XDO3Os|P`7uSLG-@=Yu<((No*rgsTQ*SfuqALdz`d$VOG^&{LEv70 zZOkhuSj{?{^DTEOI9z*hBPL~FATsqk z!1-rmT1D@7rfX%btvRySn~A6A=bgj?uDy=@)?>`l^vYXm-|lZ$^<%~^4@^%J067e| zLi(rduCB5RrK?J@k>z~(@^@Q-$^W?B{%`-9>V%-E=%ul?wzd}df1T~^VTw5#L7*BE z6yGCciDTqLlb^f>#*A5F+(?CshbPUQiWPwlZfFplsIZ98VNLjg)v7(Oy0N*r`5!$! z+lHH{t&|ibPOUI6CMJfIiHXEdg2~6nheAR^q6|2T1891l5AEi|;Iq$czoy9KK#h!z zEqr}_Da9G%{#aHeAUcrS3r82(T16#zB#iX7Ha0Ag?MtGidcN?_Zr?eQdzOGR=5+B*04~0OO6BLi%zsLR_6-8jk zMPLxn{hFCj!pRMMfq>GFka%rN(ZY zQDpH`WY{`}9P7cN?R{(v+)xa{j=ZDduR5C{VgR6;nv5_YErIm^9SM@qgv#WIpE6G6d7yLuzC-?C)8p9Jh?Y8|FeThi0hk^hRA$#1`ndUA47Q@t{FBf5e^M8w-lUcN(5 zNT^oBOU4x!tbQ93fyUs7#LVdHz*tDgV2G0i_%v2mSJx0jCsY8yvg>Sn5|YC@rR0%j|Cd4R*yR@AlhM~nRh5;P*Ecu*K;NxfT$Vd{6BMrnd3g3-?_2PV z8i5*c_4uNP!V%0M0*8#NUW5mlQY+=Dp~t)SNXo4u9ZmyX-O+m2wLenW(((KI&KgBJ zO}V+Og5hR?*J!5OeM?i*`HFtYyK5TA#G2OpmyU1xTttxg-)l#y)RdG;4Gj%GXM6K| z_sPf-<=B(79Rv-NjkuXIRl+JNDl$OT|FrUDipo_iWnO*==z?eY!KU;YKnhwo~UA z-wl6jTQkMO$H(^@1hV|%;z+P(?H2DN%izXF--21kxI94I!0?dub#>Pp?bN15^=9bs z=$xFKaX&x5lwa-by1;Q}Yws~qQ=choXlN{`mUx`)8UuI*At;*zUpN*G)EC4l4o=R7 zd_5GZppG(MtEjiKs!HhZ>gw%bmgk)J6EQL0IGG$pfE@kXvyGlLNF*|+vQmqJmX;Ij zT0AQ=vuW72#+)`rzS?G(-INf$|Lj4W??x~mBxu$#A}5C>bzuSKNr>hL##^qzF|fF3 zMinM=55$&9;QHxyV`jiwuOC;t zjiKc&w+-UJtVDQt%58uu(ZqFP0sg!^?B%g@b#-;132!zsGHO~}Nj3d3I6r@P0KDOr z8WN<)WVku3E61^v&%CmbutN=^BhKBw8 z@a4;we2^7%_4U_<{V$J=F@py_r=-ZMzk21)!^L$xY|S5dv5zJp0oXUi3a*!|2`my4 zw~p4<)*oga@hD!lEuOD^#t&fzss)3?u?-9j+Z<~{2d%LIi3$i%0()eJE*(h~yf3S+ zKE?wvqFA4+pjfBanK)wknYcJtMiCYSvYYbpW0N#%0u;2JUkVEK1a4(@q?RSxF0VQA z10b$T=;h^QqQAet1wH{mpL|}$VScKKj0Qzto$H!fF%oI2>+XK?I07y0uM@_=z`&f; zoeh90h1(b$ejFW~YY*8C*TP^H2DSV|R8&-ui;IgBY(|4KnXJsT#qsKD{*Jrd#m{S{ zC)tQ9>Y)^=9Is_sNl6Jbqi?kiq>w^=E?jKszlPuK+nnjon1;=MpIfM3>reLe5ou{@ zWfv6S?#?w67}h#6c>ZA<9|oY4lbsEeNM{#}1})FnwqQEtWI9@y+kzoe+KJU{S{oVg>N1qO$TQ zk4$7qCK5>k#2I)wQ$vSiEqbLl)qT9&lqW$s{|Z%H%t(9Hnf6Lin3F1M3kXRd36kfQy?}rmNxaNp}c9e_5Hs7{y2Hogm}bZ0bM5ms^H$0pA+~y z69Ocg{0ZUVxC`&<7j}08kg6GdxHvdCtIw_e%swcNmAu!Y;0eY~`tV)HeS zqyk>CksVZ5SC5*Qm}uzf;m*z7W#+5dYao#3Xih9j-75fL&u zLEpa%p11P^JPRnRt)-5Ni5V?1svmMPH%^L~)=n{?37~M9WmoP$k{%rnih-da z%;4bQvzkfsidJyvUIAC9qzT^JIO%93>Rdy^8_pUmAb^CH3kfS^?Q`Cz~oE{G-xVFtx&wIUwc2BGFLX)-i5 zz4H$YybI(P5>glY(f_`4>P@9S7iB89u}_?Qo!F%m4*zzWK7hXCWnp2tl}4*y&ze^RwZWvo?pYo^!UKEZP8DOsRr8pz z7u4X~tMOd&#th~y+I=ptJyE~WBbr70<6<@A^wXzLQM$Uico3KL{N0qg<{Ium+ zqVAh#aJ~yEdwct1xVmI(v-RTj#ZfF49x*dbcpISl^CpUl(g5Zjw*Y?!Qc_Z`!jlndb?;X20c3k^mDUCUNc@|r-w32fUDwpaZ2zE6&f><|%D3>#g;58c?)^YeyF|ct~6NPHFa}H{&I5mIGFLC~Y(~ z?~6Qqh_iTfu|6RHjzQw)SR2Hi_peR7aTM8xzQ`sivQ@g&8`&p%9+aSmKq%@3N&87G zpuy*I&y02W#R=%@%?ApxGvdCd z+j{`L=JYryba^`&N;_AIR>E!hKdr{b5`ze-Aq?i9pi!;u?XjJloIu+%Q$^VTc8~>b zF#~Xw$lKR@GHxCS{ zp1FH?*b)#B%;MtWQh-75Q)y}GpJ0jZwzizN7Ih+w_g_W7=cgqC(FayFsXZpSh-kTr z3%p*wTJDUyE2^)*An|Gb@!#sc%jxh!k(B~Ur^3{5=E{X)MK|8c~?U=vVZJ~21DU}b%_h? zYJ(lpbk)&dY;3Oe3=NrsnHl@58AOA}j={mn z)_5)Ws9T}_7S^NBnPS>NHlqOM^y6b=DypbhfJ(y4=wrO&-v9%s$ZoQ%Oz}4ZfN(}L zB?IRUrtHc$z%YRR?c2AXKsp)+ndLRLLH(n)mS2Su!?4tDI1fTDxBnG;(jFLX)&PBF zzztm-hYU0i^xU+tGBd-dA=q5ijQ`Jrp#ObF6kvYMq^=mqcqih12%cg=lwPXImC3+D F{s)BEep3Jd literal 0 HcmV?d00001 diff --git a/navit/xpm/school.png b/navit/xpm/school.png new file mode 100644 index 0000000000000000000000000000000000000000..b267c630ac22e7f13c3c68d6e6ab0e5ba48afc2a GIT binary patch literal 669 zcmV;O0%HA%P)1nM5@3hAF^^CIOY*<|%e|AJSOIDj`&nCtixG4Yqo6qsv}$$8i-SxKI5s(|N|b_$Nmup|?TTGH{siV;_?Ry5?A@w=Vfsogiqir^?VQ8x{!? z^3C-7y9&SEWzVbhQYR~%e9R{k%ONYYTX2VUTiITt6s3vyl zo?xU88!@#KxCbv8sIg^n30z*b&W8NGhMjZluX3)RYK})me1n_N*~g_cS#Fi~+Eiz7 zKJDWGr=Ift*DYt%K9%W+nk1NHEapXL(iKz<`J5ApBPPU=Q)r`#?L@i~bg* z(BZq%N;s-x!hMKJn78ydhd&k=25~_;lY2iVct!mSl@Y`vh&JDs00000NkvXXu0mjf DGp0R~ literal 0 HcmV?d00001 diff --git a/navit/xpm/school.svg b/navit/xpm/school.svg new file mode 100644 index 0000000..be94ce8 --- /dev/null +++ b/navit/xpm/school.svg @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/navit/xpm/school_16_16.png b/navit/xpm/school_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..cb7ce853d5fe1c25d401ee8fffa9905377afef4b GIT binary patch literal 467 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/school_96_96.png b/navit/xpm/school_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..ef85824c36677b39ef78fbc0c52503908ab75261 GIT binary patch literal 3256 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 + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Symbol Shop + 07. Oct. 2006 + + + Stefan Fussan + + + + + Map; Symbol; Wikivoyage; Shop + + + Symbol for Wikivoyage maps:Shop + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/shop_grocery_16_16.png b/navit/xpm/shop_grocery_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2f93351b35d686520656cd593166373205a7361c GIT binary patch literal 699 zcmV;s0!00ZP)R96(oKj*yrW?tT#mwBBusU`}+SP;QlEyX|=b>phI zleiKT5nQ-%p?^X*UAgF@t8Ux~MTNR>(}FD}k~C-+4Fxr6sWCC58I$O|`FZbkp^b4G z{ca8%&iR~szkG$QRVju#5l8Z=_q3lk?6kF91M=QM*<$&lauQ5^JR0pZf))xwf1<75 zXY>2ZweA6+`;McpREmQizC4(^G||~G)N@6n7YDO&?$psr$9}ak6`byMu?AGhn~wFr80XxLR@Z(Hi3S+*P1d!a2kd2^ zU7)fuO}%0N1W*8v|1od6w-V;WQ0?1Et_cJ7DK*JRrOucxGV@p7cvQ950Sth(+^Xl@ zDik)tBi^#-*%WE46bnsuxJ3fLO253|%H8})-m<@L0DyAF=4=N zJ5NSHCdxv!T?5uP1L%5LURmqxZMKy47nXQUNFpWa6XHmTBPEHHs35G@?LTi0z0m>S h^Ijw0p literal 0 HcmV?d00001 diff --git a/navit/xpm/shop_grocery_32_32.png b/navit/xpm/shop_grocery_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c6e34b97771c75d9167fab2251ea00dd46ca983e GIT binary patch literal 1444 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 FV1k$Wu805t literal 0 HcmV?d00001 diff --git a/navit/xpm/shop_grocery_8_8.png b/navit/xpm/shop_grocery_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..b1847be5818895de62c827dc133a931e8273002f GIT binary patch literal 318 zcmV-E0m1%>P)V(!G|?O26+HicUPZ=oyqtb&N{fb z8WZE7gSv@<7!n{ADKTKhmRtJ2xY#qEoE(OK8r9NC&EXx};yT;X>C5Z-765n=SQ2N` zS$019%&vDUvRim&N#oLYh1;ylLqlNh+8phs>BI@We=TVtnBcnMna6uIiB=%0@xc+= zl^HDG55kA13rvNBMJ4-H1HL z-ET@004*;KvA>SskcY`I8uiENqX4j3{^VD^VNwt03Ip4Kv$McTQ3!zk09jmQC)l)& QMF0Q*07*qoM6N<$f)I>~O#lD@ literal 0 HcmV?d00001 diff --git a/navit/xpm/shop_grocery_96_96.png b/navit/xpm/shop_grocery_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..d6bd5cd462408f113f6481c9eafa9598fa2b8358 GIT binary patch literal 3936 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

&Ng$0yT3UWc zA}1Ov;0dlX6afV&+viLRNc88BqfpcHwrO?pd>ONs#7w7ikqV1q*Rg~Wfkp`7wgUy#Ie`f zSHRGk0L>vY%MQc&{t<9~!=oI%@9B=dlU*uD5^z~=;WI;j-S~@6=sz&Z5-*H2-&ku( z_kfoPtV@eRD-rZVR2Bz-Qn_bSw<8hH0qb7=*KRSv)wEnry{`EiM`*F;xfKC6aMUZ5 zt^UrGh($nyPKz@GqM0`haOzxL0_NpLbv?ARNbeBv)1VwO({e}{{SiaC$|9rYH9)yQ z0+&qHgY_m|WgHU&+nzaH#iIYW#J1535FNWkS0lN-`hxND_C~3DlsqMH&f5EmHEi?U4GZ% zQiByRtv&MY`dC}KhQfdBx1PVu4wG5#932dH|eSf`QP>k=!5`G4-|VzfQaF>Hi_HB3PUs* zQ6c;P8ft^`w$RCbK~t!}QW88p(3_uO$(L`j|KfB0x~!~IKu8xUAmx}OrJ5v?qD)#? zep0^S`B*0J)+VW?ghkq|)tAC0FN)e86Il_xckJyYn{yYm1k53tBw)hmgn$CdyW0m) zY_X4jH!)=1;KLUVbi7wYquAN!7XBuXXb-G*Z;_Ob!t~ivM+ulPI^B<;=8!q=dYTeA zF&oeR_s}T;nj&uXYZhw(Aq8BZ!(AU^j{tyTX>EJNrsalzf1qUoCX7xAm_uzX46KiU znKw%4(0axZLZLff7g}4N~OJLKX zwMM{nz4+qbQN#zL?!YV7y%ANdX`90T({7v5 z6+_-HgiP~Z;aU3gQ{;p8nr8(+gt3yX%VQ6_y9|eDxwG8r;cN8&3GC;qjQXw0*jVYb uhK;~e)c@MVTEVOIN&c^69qU*}7x4cgxuj-Yc`HKz0000JA$rvQ{vqps^-3^Ku6 zLAC)O0DHvbVVGjm`t};&%l>saCttIVvIChL8N?UR(Jv$r2%;>$AX=hz9rrO_dRPi< zXwL)HR0DA+i)O9xuWzq2^KGWJ6~MBom^NIPtIaXLKHsRcNjX8}HUB7EDh}j~ zY?-3TIXQ>%%j5L4^&C{4_>M6BX&N_h_wK)y$KdcwujyR6E6vNo%Y*(VO08hE#V`AK z>z?&iySZfbejP>kdSPX~dx<~`5C+L#KTk-H${2h1I4Rl3!N=nvjXg?705twbQ z*kdVJ4qUye+k>A0-gnQh=j&cr3EL$jWkKGXx_JjI0D0?MeSo7yj39)Pma00dJ_DP; z7;x!-366>jaefLsI0?f2aTVAAI*&7~j==5#Pk^1{5KAjSDOJj5vt89{wXU@`&3HPU zR;g4T{WB>pF literal 0 HcmV?d00001 diff --git a/navit/xpm/shopping.svg b/navit/xpm/shopping.svg new file mode 100644 index 0000000..3d15dee --- /dev/null +++ b/navit/xpm/shopping.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/navit/xpm/shopping_16_16.png b/navit/xpm/shopping_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0d94b9cd7fbebafb5b4022a233884c05606bba10 GIT binary patch literal 531 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/shopping_96_96.png b/navit/xpm/shopping_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..3f8abb01fa954f37315f7849b061fb3d76c78f80 GIT binary patch literal 2948 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 + + + + + + + image/svg+xml + + Hotel is near a ski area + + + + + Hotel is near a ski area + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/skiing_16_16.png b/navit/xpm/skiing_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0bd90036eea552729887242d228d29a0a2ea881c GIT binary patch literal 331 zcmV-R0kr;!P)4(_QX4Gyj>Pq9USQ)ms+ciHLqg)FWa#B3e1` z5gxH!Qlt|Rn-Osl5xrc2a|BM&$k2>OL@igKjV>;6gDmQAn!tA=xlZqa#zxJQ-J%Q(a{-g4d7u$x9XNfd#D^gmT~j0Wyf_$m?oOWhQHlDWoTYT+KA=#2c$ zU=OR5Y;{Pp=wlK4c*mS#i4Rpt<`ow>!+M#ao(WDWPFBMPUUMA=BQ()dEbR*)xJ}rV dwUm(mr5}LIN~-;=()<7b002ovPDHLkV1jeBhjIV_ literal 0 HcmV?d00001 diff --git a/navit/xpm/skiing_32_32.png b/navit/xpm/skiing_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..a3c616ea149e77cc920b25688d94892002aa6a7f GIT binary patch literal 614 zcmV-s0-61ZP)tq7 zDJe`+6AMc=?64wXLs?nOim@PLA%CVxgn2B^+`RM7y)*aTnR%6Oy^C|+`<&nJob%l0 zoR|NNi0J&6;wK|wFd}wU8`C&};*I!?K6FP!Yv$dKh}clixI1wN*RillBOMXZ6A?Ft z+FK&xTSW9`O;y7({6GvnFRKlVh{lLm8xc(raUvo^XoBDFS~IUH?avX@D3}AG*RM-zpL>P>xvYgZDc-t!Rn$6EH7gq&};OZ zXdY|erV9Ogu`$zbtMI!H+(Re6=iaqqKQ51EprJzldTGz6=lUODE2if92XP+#IRo3# zjfYZ&tck@qgKOxLW=X1!Uya<3u3UVBNlet!WenV(EU`SD_?Z*$!;&Jz7vfV+{4JIi zAx^4@S@BoWKcQ}Fy$?*uwJ+e!cns9aN(>mj_q7~OYor8j8IOs5_?0p76m!Oi*@@~ literal 0 HcmV?d00001 diff --git a/navit/xpm/skiing_48_48.png b/navit/xpm/skiing_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..ad7a1a6b74eccc4cb80ff986b0eb872f667aca12 GIT binary patch literal 951 zcmV;o14#UdP)x65mXd{8mpC3rA@kg*ry~-X6DQ} zXVN*v{$b#-XV2Q-+B18vwb$VY|3f085fNJ>Vz_QC9T5@tMdF=^XwH(`}0FPs@B>pE{jI%L`Y1~$ux;9vX6Pmx*;co}OmCE<-h2%ro z3;UirMU`ba_RHU$Zm&;TIo8P+AJ~V>YExH&4T>EI?8ccT?H$vJh%#~Dd}L*XBPE_) zhF7IDYLJb*$qG7?G}A5!e>%sAHy$Y43}|WEk2ckRTh8ZLEI}X z>^!Ei5kKeL-z+(>4Zq<#{82(*DOTbE?7)N+xW2)oSkvq?BF$RSns~opjEz`amEcZU zg|8Jmu{P(~{!Rw$_&}1wBz`Zrzen1cve;X(mbN(>ugRbJXis_;aKg z&J%xqebQRfk8#=J_u$I@tf! z=~Fy6>qZrPiD8^Er+pPx;H?hr4oc^WhcG2g$Yh7MTGEeqWxt6{+KaS9QtI*&E>Yb? zw`5RC#D**Hq1Go7gZ$=DeI+e?iDG>3^dzU z;0ip2op@cU8C89@?wVy%C2jT}89Sw7?hf2xro>(=MTM>9xLR6>`|-I{PXBS?WgX%0 Z;Xjv2qj{G}o?-w1002ovPDHLkV1k6p#m4{u literal 0 HcmV?d00001 diff --git a/navit/xpm/skiing_8_8.png b/navit/xpm/skiing_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..f37aca80f66c261f271b982f068bf6c4fc7fc0c7 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt@yo-U3d z5>s=}8S*g(GPFEA-{qzpxMItc)qlqd zoU}T*;?4FQ3tld)oRrMTQ+Q0YxvIf-+Kt3U>v=z>eGoBU^UwBxw6x8KgFNen@-94T hDYTWTYL|C>!4SPgdY(`9RTrS$44$rjF6*2UngC$oMVtTt literal 0 HcmV?d00001 diff --git a/navit/xpm/skiing_96_96.png b/navit/xpm/skiing_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..dfebf42cd20487336aa01f5442a3a0786d169601 GIT binary patch literal 1909 zcmV-*2a5QKP)`G-c) zJF-$LBBBDxN-7GCA}Gj;A}s&VUMM{%qZgKCnc6#wvNUyFU7z3n`0cPWvpchM?!9x* z?4A38gW$|P^S!@w@44sve!u%$NJ&XaNlB>@B=wgx$G47}L{e`_OJrQ@TTjg)=|Od{ zMbaqWnra3~mr2^Ae3nV-?OR*ok<=`yMO|~3Z+(eIQeR2m7BRjgZId+GvCn!*4VBWI zI3$gfG)>Y6MFwHHq`k`Qt4`8FN%JbLJCR5lFX@La2H}A+j_oDs`S$Pck#v3>n!{2L zj0GkFCjfi?FnOIlqp0J|ie*v)Zs3yxVQY5%x%yV4Js1N;Xlr)>eA0tWe$29kzL zT3cYywUYKJ^8NdZOkZzH%EYa|I}QWZkZ<_H_6KmhFM$A(21t5V($*YBpv1R9CCSx@{FHt z^Zm#y4@sjXJtpa&5(Dsyq>;Y00@MNPaT|ag*j-cANNSXHkEH(!jQ@tJ=s`RhH{)m9 zSw6%DLAJ4*CTWJGW5V`V7lo)C1_wNDNTez%NG6kM0bYozzg|&w)Xw^tk4q__4%mR( z^s|#5@C>LFQQrZ(fL9!kc>~+5r9{LKY?D>a)xQxqB|ax&=)oC#bCOacbx ze6~NZmeP01y>W`IC3*oLQQouSc261;%@w#USMTs6Gr26o-DNS;i_!$r1nef5-{>|E zdK1S4f*C)%I=VQ1$;rZX{x57hfb(KkT>+wYMU+d}cyK-D^6(nci~?T+5QQ7O5qOJy zS4NM+*8oJ7kGU`KI=0!15~obLF!&mP`Uv|P11ti{%4{oxI&6B2I#^Zo$HLGHTbsLH z(Gx=cZXu@vj{vts(ASYbGv=9H5J7(>2|ECLF#pcP2(*M{I`Aj3BxFC6+yA|b7zQAU zjIN1%Ki^?%{3srPZNNN&8EPz+rLhTn zRt*8R0}YrbcNp+Fuq^_ekehz1!9!>yp+1@8UKHPk2#k85D0~tGM;RT;NzwS|Vi-@Dpx>5LYSU3~)Xj zuUNegT#jXPB#KdV|FU=C(sVY#E4Fk;9hQ9d4Yp){l?1$>&>cr(n=Y3-;cuX1^+QLR zfEidyVk__@7Amb7CgAR(-bP1~ZBP!y=JXb)*h^W%S*I)uqTL2(JdNBF(7i#N}AA50^psny#phY+8Dl{Mx3=u-9Izt^#hgG8OkhcnO=+bN_D%Y5GcF zCeyhVQ8{fVRxGwTe#yz>T*?n+Zo{Uc5nhxgm`f z`jeJy1_1X1|B!F^l~`OMsu#CY3K)R71^y-9@SkAo`f3TYCXS)lLv#!I9?3dQ^;QNt#lavH{e#Hua1(EL-ygC8wXegTt^lB1*Rl34vR8n z9b0fMJ1iRumXH6ns|l9G~=QiA^hPy>uX6QT)000000NkvXXu0mjf-^zyX literal 0 HcmV?d00001 diff --git a/navit/xpm/sport.xpm b/navit/xpm/sport.xpm new file mode 100644 index 0000000..3d4f069 --- /dev/null +++ b/navit/xpm/sport.xpm @@ -0,0 +1,75 @@ +/* XPM */ +static char *dummy[]={ +"16 16 56 1", +". c None", +"v c #000000", +"V c #0c0c0c", +"o c #121212", +"Y c #131313", +"C c #141414", +"u c #191919", +"F c #1e1e1e", +"D c #232323", +"c c #292929", +"T c #2b2b2b", +"1 c #2d2d2d", +"g c #2e2e2e", +"b c #2f2f2f", +"K c #303030", +"y c #343434", +"d c #363636", +"a c #393939", +"B c #3b3b3b", +"L c #3d3d3d", +"k c #404040", +"m c #414141", +"f c #444444", +"p c #454545", +"U c #474747", +"t c #494949", +"n c #4d4d4d", +"J c #4e4e4e", +"j c #525252", +"e c #575757", +"# c #5a5a5a", +"E c #5b5b5b", +"w c #5d5d5d", +"l c #676767", +"x c #6d6d6d", +"z c #6f6f6f", +"r c #757575", +"O c #787878", +"Q c #7f7f7f", +"G c #808080", +"N c #878787", +"R c #888888", +"Z c #8a8a8a", +"X c #8c8c8c", +"W c #a7a7a7", +"H c #adadad", +"0 c #b3b3b3", +"h c #b6b6b6", +"I c #c5c5c5", +"P c #c8c8c8", +"S c #d6d6d6", +"M c #dadada", +"A c #dfdfdf", +"i c #e8e8e8", +"s c #fcfcfc", +"q c #fefefe", +"................", +"................", +"................", +".....#abcde.....", +"....fghijklm....", +"...nopqqrsqlt...", +"...uvwxyvzABC...", +"...DEqqFvvGxv...", +"...HGqIJKLqMB...", +"...NkBOqqOPQR...", +"...BvvySspvTU...", +"...#uVWhXvvY....", +"....#LZ0hc1.....", +"................", +"................", +"................"}; diff --git a/navit/xpm/stadium.png b/navit/xpm/stadium.png new file mode 100644 index 0000000000000000000000000000000000000000..232bdb682954f081bf94602c23db23fed77ca9af GIT binary patch literal 836 zcmV-K1H1f*P)AM$yC6L0~=fEic-=78Jl&rMlAa18he$Zz~H(EPWI?Z7Qy zyTM?<;c(z~yQ$f^6N|+{EEeO@d|p`K%-ORP z78U|{f#ccOUI3)FwpL0?O7uFGmX=EF-8-G>^0#kNU0t14>&C`LF&d2mtN>N1pe4YH zrfJgI*_rW?y1Tn|;1efLX5`Dt%A}{KN6jy%0v`dSwY63H`uZ|9J_!bO;OLt-VzpW` z)&!qERpXCw6rMJtqS-) zAY8@AWqxX0sBz&=%qw*ZkyB(qmGVc~FC4P)B+;2Ci6-rc)&b#! zvHb@Q;B-3mc_HWlyRsQ%3)6-s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/navit/xpm/stadium_16_16.png b/navit/xpm/stadium_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..21f6073970aa66775c5bb69bc603ef7c48fc607e GIT binary patch literal 655 zcmV;A0&x9_P)&{aga$VSUW1nDA)T&Bx1B6DF(;8>J`IzeVdLptw!pEk}gj(r?Bi+efG zx%V6%_&1`!vHxfe;RJ9i6bgL=1Q26PK`HeVI9n}NRp-lE>r5mPF}Rwr?s^M9So0*NM~oKj89C+*PR_P#yH>_z)?W%W-^D0`y2fr z5NoXiu3O-nG3NW*<>h!~DcNk6jg1WeJkO)Kxfy`n-Cb5zR`7ja0Ut{G2S;jagZq<{ z3m5Crd>bC-a<>Q%m~ zl)B-09s>gdCR|g){QNv^ZEY+rF3QV=1!b*$?)&})V6%FaOE{^uerSyOSrNfmYhMEw p0bMDs{y`-Sa2%)s@<8EFqTehuL!X4wzI*@x002ovPDHLkV1oHMAyEJT literal 0 HcmV?d00001 diff --git a/navit/xpm/stadium_32_32.png b/navit/xpm/stadium_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..53c560eb6916963e27fbe214dbc0abe4ae0389e1 GIT binary patch literal 1271 zcmVED>Gm!1#bH(JdsH zD1k(?7=4iJVfervbj!?e(_}`ofo{%+`7kph8O{e#7v`LECR3_FMG}dt3r?X$h4v!t z*#o`x(%xH9T$Y{Wr2U=WIp_QR{qFhQ-?{J~i+LKcX+RE;8yknFPballfwzD!fIeUh z5RHZaFVF~hVgz4_qyyW5y9t2L)9b)H(_^y&d*WMqij?Uv%=V#&?T6^q4UM5Kd> zNA<$833#GSwrtrlY23F@Zrr>nQISbH9*M}WmoH00LxU6)6eN z?OK*DU23>Z>FMd%Y_|9~8jaG?(P8Kx2n49CtRyclPc5-^x*UP=(}ch>F@8Sxv5Eau6*4(%F4=;?04?mVeZ_yw6?Zt&A%o3)y0U&iWMv5 zyOSs7$;e33Gpw(#H+a@E3m3#{wTi>x(E2Aa%>$mQ4i<|=l(Df%iIlN1 zaXOtTJE0>-kLvac3E+QW(2stpI@xTtq}7~mX?bodR!~qNp>TLo+`#?&iM_#gJ#YXg z@JMy6t*wVnehp~HvcF(ad+vTD^T?R*c5UDk2XaK9st;Ix(BgNx*iyU7DJk zWjqp*w)S>$yWQIPC^{FAk)#2iYInk9GD%fcm9(EbCt*dAuI_HBsHlho)YQ~S@9o?2 z{i##3diCl=a$(?IBcN1L1$;%UPf*2fw^LM9L{3f)!C;W#;bGF!((rn{D2kGp<8Ex_ zSEjo9M9BsY0SZ$nK#c~01}6HHWj~wd0It~YEGCZb hAmC@>W9I)O{{Rb)6?=oU+He2>002ovPDHLkV1gQ$c>n+a literal 0 HcmV?d00001 diff --git a/navit/xpm/stadium_48_48.png b/navit/xpm/stadium_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..4c775136bcb125c4810e13ae5b57f9700abe352a GIT binary patch literal 1852 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 P00000NkvXXu0mjf9EI=6 literal 0 HcmV?d00001 diff --git a/navit/xpm/swimming.png b/navit/xpm/swimming.png new file mode 100644 index 0000000000000000000000000000000000000000..8aa60a85cccb467ddf71ff53643c538f96dd42f1 GIT binary patch literal 445 zcmV;u0Yd(XP)M80LsO&RCd?~To^KSk)~*HoApR&;aJ^A*hhh|e z(U&H5ELW2*;5IH}?|*>JxP%WC*f^&0ezTf9gjWgt#4VgvEUB~_M)0NrEYB*A;!s)B zoTB%N8QsMa`q7Op98fH(KQ}v(>rUWa7#+!(uBw15QMeD!@D;<@k0;oMUVOtWw&M(1 zF_W<*kBDl+TYSdJG(@qavdOND nqO_JAmH6(8U&BsYw&C^ + + + + + + + image/svg+xml + + Hotel has pool + + + + + Hotel has pool + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/swimming_16_16.png b/navit/xpm/swimming_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2ae43b6c7ed68f09d27dc74cd53edd124f43d8de GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`dJY5_^ zEP9__JgC)DD8l;TzPZ}v89FMi$&P|zGcKxl-}KrvC4EB9o(A^~pH$9R3oH#3HZ>D7 zQ^`8!k!<)q`rM=FQ){FDzxzAC`rOXx^^)2aE`mjp4eUEyWsP5?rtUjp+-BJIat(7? zb18rMk7F@e4^^aE86Rlo9RDrxK4bChItwT6^%l;muO?d@58tqSXQ!aYm+d=yDr**q z+2sdteGA&K)v(drBvAeko1bCdUxxAx%{Hf2JQ7Zh;QsHO@$6&M@_>TI&^3!2UH?4L zn)0vJV&SU${ufSxD!B;;UXp@BiK(xlPv_ce`DVoDcLlgQu&X J%Q~loCII)Af|vjR literal 0 HcmV?d00001 diff --git a/navit/xpm/swimming_32_32.png b/navit/xpm/swimming_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..7df9a5a9fd4dc2469fbc49eaef7744bdc9e0a1e0 GIT binary patch literal 596 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 + + + + + + image/svg+xml + + + + + traffic light by http://commons.wikimedia.org/wiki/User:Manuel_Strehl +camera by KDE e.V. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/tec_common_16_16.png b/navit/xpm/tec_common_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f1bb600eed27cc9326e9c80853fa32dd42f86e06 GIT binary patch literal 854 zcmV-c1F8IpP)v_ICqK8d+cueWGMSy3 zcgKTl5aM(B!UNCe3lEO~dO4^vu=zj!0f|#Rg|!piJx6w`rY54XP>aa0I$iwjJM)nM z&H^c53-}fI<`uaAUx0ie)28I?y~Cr26U^@Ja_{&Fj`_imOs7Tj&=8SKhT8IS%DQ#y zLfv)W{R=+ng&+0-N(I{4sN}UmfqbRH--bb~BPY6lnL?)1`=7k^bxM~mMeRFxzW)=9 zKKLC#iyw;D@B4~JhQZ9n2D1G{n%_9j?P8J1$w|U6woTLE+Xh(E zq)zt3kGOKEiJ!X*wDtBOG>xm*t}!q$z|71HmSyqj$Ou=jU+4J5F|;G}-Gv;0l$yrs z(j+I(R4JDiaqT4KwM|UZWPE&_TrNj@HcMw`C%$hIJGn;3O^CE|B|O8d7<%Wu)z{A% z?HAtvn#WHPY;OfT-E!zToo8-tj+YAsJl`diDiV#}BoZ+Q!w|`~C1bmnWi%G6yH1wY z*7KxNH5|ubZ*LFBap>ymB7O8Ix-L*kL)W+PR0s$(83Fi1Mx;(ta*&OU4J^yTbzNN7 z1)#sbpZWQDmX?-CB%UXq|B_7RbL#a3@GJx_N=@jjIu%N#64h!I&-3topL{-#Wm!!8 zG=+NZRmuyuiN{aT+}z3f`WTy==8uDe7pG(p1ma=L!1sNWQUpOj5Cj0|y3XTmmq=SH zb`5MhNwGM>;^JMB$z)0hN>TutuI~pMkW#5cHk;*(&xWyWoAOI{8WZ~y=R literal 0 HcmV?d00001 diff --git a/navit/xpm/tec_common_32_32.png b/navit/xpm/tec_common_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..280fceeb987c538cbb486bcb522745652bda17de GIT binary patch literal 2191 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 RJIw$9002ovPDHLkV1mzvB-{W1 literal 0 HcmV?d00001 diff --git a/navit/xpm/tec_common_48_48.png b/navit/xpm/tec_common_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..a4d172f7f64ab9a1b52ceca36818db63f0c0b93e GIT binary patch literal 3753 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/tec_common_96_96.png b/navit/xpm/tec_common_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..4be559d8614e346a8e0bf61a5b30b0398ec600a5 GIT binary patch literal 9250 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/telephone.png b/navit/xpm/telephone.png new file mode 100644 index 0000000000000000000000000000000000000000..fbac54a34afafa5af9d9f2db99618f6c8b974a15 GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fY)RhkE)4%caKYZ?lYt_)JY5_^ zEPC%=G4x_~6k&V7&*|Y1e3OOyph#0f>TA!QsZ)DzRWg1QTK0{jih*}$W5g2PmCe0f zGq&EC8hgm(-5#eui3#^aSM-tDNBG0^qQcar?a@!K pX-|p&t0tbitUFeB+U5Ia&DZ3bTY5QuU;+A)!PC{xWt~$(699FPeAfT~ literal 0 HcmV?d00001 diff --git a/navit/xpm/telephone.svg b/navit/xpm/telephone.svg new file mode 100644 index 0000000..97f76f8 --- /dev/null +++ b/navit/xpm/telephone.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + diff --git a/navit/xpm/telephone_16_16.png b/navit/xpm/telephone_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..da2ce03177ec2214ca0bb1ded7c06f8cb9ab3841 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`hJzX3_ zEP9V#+Q`)yD8l|hUS4=IdxGg_rc)UPH+8zMMoUa_|G;w3QEheT%`*`?ry3sa_PYOM zx9WeZx#tS%=LS!&S3h}1^~{B1W^6GJI=NTfx6w#@7WTr_C#fO%Mfsb3jGJD1`&%rQ zVOF`po+840z<_~0B&mVPj4|?9Uf^*}h2j#!bKNBc+$VM~tDGpePW}LM^Bxaj?U(Ok e7EcuaksBAXP`<2yo#7(TsSKX3elF{r5}E*0Y+3&R literal 0 HcmV?d00001 diff --git a/navit/xpm/telephone_32_32.png b/navit/xpm/telephone_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..cf56ea23e23270539fc535e586f7257059d9d363 GIT binary patch literal 381 zcmV-@0fPRCP)V!Oh5_M08x{i z7tu0~mjJQx*N1lg;@;Z^U@A4MNd6b9so5|d{tC-V2ljnGA@?LN<__MlSQG$;aPJXb(Crw-X$!=&P?%{5`eP bPHsK{Te^4AkqeAn00000NkvXXu0mjfs;-^i literal 0 HcmV?d00001 diff --git a/navit/xpm/telephone_48_48.png b/navit/xpm/telephone_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..f0bd15bbbb77733d3053a30de53cb4633a83ad05 GIT binary patch literal 575 zcmV-F0>J%=P)u|A3uR78W8| zSx*)glTxBa780?LtSu}w3t3E2ek>?qni-76anp?Foco-6oBO>}=Uv~``PO}Z?s?9= z&-XbrG&D3URd(YVc0`NRWf-^d3v(Ea)v3n;d{&6J>N_?@O69T#U(J_q)x|)sY@SHV z&*2l+#HqDsn{xS9oe8tc;HdTi-e7sJ#Rf9_R%G<-!ig?iIwCi~x6Hn?or-iyZh(o* zzV}$&q06GO3?EfL1DF5y^({A*%Rh^f%3VV6pyJx|Zbf>*D*taIT6Hhbs}`fu0cNl@ z&?}o^OiPEj66jTnG3fvwur|;uo9)W)!lgj3THKHh@C8GGUfJx#59ttNfnK$^ARXX0 z4h4E;Gl-YcA>LUcW9C7{H=YV{R}c0^-3}m=ier_L#I?POyY#fn&scQUZ+Q;;Q-$x>u_KF5PfxIKY;VfXNZOM z7Mns$+prIhRLf5&-uz?}aS*j1ClxPC1{FV{lX!?biU+x&p`l@k@CU6q47lrBHU$6x N002ovPDHLkV1j!D6HovE literal 0 HcmV?d00001 diff --git a/navit/xpm/telephone_8_8.png b/navit/xpm/telephone_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..0a464e5e2d17b42166bd193d7f12d84493b16df0 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`so-U3d z5>tE6C~`Ffh`3y2W;>`R!Ls<{d-v@R&#e(_&fX}UE3YFZB4<&`H+}x=jf*-Cbo7Wc yva#QK|53$1M8d#*s*tppkKn5Jhx+uK*2hLYJ#bP4RXa-MLKbLh*2~7ZQWHU1W literal 0 HcmV?d00001 diff --git a/navit/xpm/telephone_96_96.png b/navit/xpm/telephone_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..5a848282986d28e9d860f62192f90a1ed926bafb GIT binary patch literal 1069 zcmV+|1k(G7P)LSSrQAOuK0RrQBxHXnYYX#xbO#YBX|BBu>>C8~6Ird?XXTBhNg$xCTBa17p zqhNdtu`#KtP`mBG6kv?wb6{J@wr||NyAW}9+};^jDT7Vq1HJ*1Vu($Z zv$&gZ9a;1@6sQM2;%>su7-CapJMIR22j)f4nj}4NKS@~tUIW7-=uMJo_$^(Y$KD5O z?8e=I0&oc1L!?3t@CZK>wnWgIBu&V^AXfu^knxi=m0pl3muJ6z&T)LM8?Xdf%)jRF zTzAAkql7Bp5`G^=1!PBcIq!twh*@)W<)=YC@D_g)P5=Y`(*81J8e2ftCuUWm6Io{= zQv2~W;VE)peB!TYMs{c1?Bs9X1JlEFD_d;D-vHP62+R)BtBi4ka3JV2(!MhOi_?I)B8 ztzo*AEr#K@xbGS-uq~2*q#ttMXeA9;5v(^EW&tv5(N6xJke$dngMriNCI2Y41;&fn zz-9as-vO)(EjmS-k@IH7e;V|!Xa^1us0@*(jZM|a^5azG%-X<`-+e&J-dB)IqdJ1C nGYrEp48t%C!!QiPFp}pd2f;fxeK>Px00000NkvXXu0mjfW@F}m literal 0 HcmV?d00001 diff --git a/navit/xpm/theater.xpm b/navit/xpm/theater.xpm new file mode 100644 index 0000000..9581bc7 --- /dev/null +++ b/navit/xpm/theater.xpm @@ -0,0 +1,72 @@ +/* XPM */ +static char * theater_xpm[] = { +"16 15 54 1", +" c None", +". c #FFFFFF", +"+ c #CFCFCF", +"@ c #808080", +"# c #D8D8D8", +"$ c #F7F7F7", +"% c #F5F5F5", +"& c #DEDEDE", +"* c #A2A2A2", +"= c #393939", +"- c #606060", +"; c #9D9D9D", +"> c #929292", +", c #E5E5E5", +"' c #4F4F4F", +") c #5A5A5A", +"! c #474747", +"~ c #3F3F3F", +"{ c #8B8B8B", +"] c #979797", +"^ c #767676", +"/ c #E9E9E9", +"( c #000000", +"_ c #575757", +": c #494949", +"< c #232323", +"[ c #050505", +"} c #2E2E2E", +"| c #333333", +"1 c #EBEBEB", +"2 c #7D7D7D", +"3 c #BABABA", +"4 c #BEBEBE", +"5 c #666666", +"6 c #1D1D1D", +"7 c #AAAAAA", +"8 c #2B2B2B", +"9 c #505050", +"0 c #B7B7B7", +"a c #272727", +"b c #121212", +"c c #161616", +"d c #D6D6D6", +"e c #9A9A9A", +"f c #C3C3C3", +"g c #6D6D6D", +"h c #0A0A0A", +"i c #343434", +"j c #454545", +"k c #6B6B6B", +"l c #EEEEEE", +"m c #787878", +"n c #0C0C0C", +"o c #CACACA", +" ... ..++.", +" .. .+@#$%&*=-.", +".;>. .,'')'!!)~%", +".{]^$./!(_(=@==%", +".{.*---:<][}}_|1", +".23*4.,567!83#94", +"&2/>&/0)a^:@bc'3", +"def3@#g='(}](h9/", +".g..),.$'}c]@ij%", +".k70_l*1<:@>7mk.", +".@7}fmk9{:2n8~+.", +".#g8(|_o.m:9=@. ", +" .-7k_7. .*>d$ ", +" .+9^)$ ... ", +" .%/% "}; diff --git a/navit/xpm/toggle_fullscreen.xpm b/navit/xpm/toggle_fullscreen.xpm new file mode 100644 index 0000000..9860e2a --- /dev/null +++ b/navit/xpm/toggle_fullscreen.xpm @@ -0,0 +1,101 @@ +/* XPM */ +static char *dummy[]={ +"96 96 2 1", +". c None", +"# c #808080", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"........................######################..................................................", +"........................#######################.................................................", +"........................#######################.................................................", +"........................#######################.................................................", +"........................#######################.................................................", +"........................######################..................................................", +"........................######..................................................................", +"........................######..................................................................", +"........................######..................................................................", +"........................######..................................................................", +"........................######..................................................................", +"........................######..................................................................", +"........................######..................................................................", +"........................######..................................................................", +"........................######..................................................................", +"........................######..................................................................", +"........................######..................................................................", +"........................######..................................................................", +"........................######..................................................................", +"........................######..................................................................", +"........................######..................................................................", +"........................######..................................................................", +".........................####...................................................................", +"................................................................................................", +"................................................................................................", +"...................................................................####.........................", +"..................................................................######........................", +"..................................................................######........................", +"..................................................................######........................", +"..................................................................######........................", +"..................................................................######........................", +"..................................................................######........................", +"..................................................................######........................", +"..................................................................######........................", +"..................................................................######........................", +"..................................................................######........................", +"..................................................................######........................", +"..................................................................######........................", +"..................................................................######........................", +"..................................................................######........................", +"..................................................................######........................", +"..................................................................######........................", +"..................................................######################........................", +".................................................#######################........................", +".................................................#######################........................", +".................................................#######################........................", +".................................................#######################........................", +"..................................................######################........................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................", +"................................................................................................"}; diff --git a/navit/xpm/toilets.png b/navit/xpm/toilets.png new file mode 100644 index 0000000000000000000000000000000000000000..75f1155be4940061b24cfe77901620b8f43e37fe GIT binary patch literal 525 zcmV+o0`mQdP)I6HI@K@j~1U0nom(8Z}s zNB=@`kcv167X1MoI*7I?iWC%ebFr8vB-(l%p6yGFp+#`g1DAL2$;si~n@8Xu8e)Ky zL7E^E5e~>E$ogj + + + + + + + + + + + + + image/svg+xml + + + 26.06.2008 + + + Jakub Klawiter + + + + + toilet + sign + man + woman + + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/toilets_16_16.png b/navit/xpm/toilets_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..a610ef6568e216fe5ace434100b3f6e261733df5 GIT binary patch literal 425 zcmV;a0apHrP)!00000NkvXXu0mjfLpHcC literal 0 HcmV?d00001 diff --git a/navit/xpm/toilets_32_32.png b/navit/xpm/toilets_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..cbb36daa949ddfe17b6628c1bf28b812fdd8c048 GIT binary patch literal 776 zcmV+j1NZ!iP)qkFOifwd=CPTtrorqi zEHA6!a9H~OBw&Eg2Ne}c?&yHLJWCP=xLnZKsN||DsIE5Mre!3sv;>QbN**4DtE=n@ zgu^g4rsVl~SYNl^YarnD!uU8$PC_&a3k%@!!1OeXj6hvo=EM8@)u(G{fTJTQD^mml z0m!kuE;5`5j=@36h+r@!kOCkd6YKJFk$BwNx2Y+`_nqkrxJ!YC8vLedn3@*rRJL(u-lFHL~JGY zC19xC@wgghh{x3dW>{TShZGl^+kHM57=ZJ0Q*$y6olX&#OC%IhsWUp7Oe42jq@=_; z4K+>V;J`cuFD}%-<(Fv~jY1@nTpu1L<+C#t%~tUFptRK7X17CoyHS5{F#vFK0)2fd z5CMjU)V#H&^k!LfuLO2?RTTh~F=gmnYKFq8dz-#_|owi*&uyshU|$6RD|Dh0VnG z86?|s2k;aq$@pHW_y&B^Z_?J{?iF9on3|X`Ju}Syo;c=ba?EHAs z-R@rI126NwGv9gM_q#jqJI~BOKtMo1HL(ht@(u7c@I?tRmx1@duVBr8idzqS2Ydz8 zl@R-H;CHYl9FECPAX3IM4$=S;0vRb|+ziO~P6iTwCvV*9j~F)~zet7Y>`B zZ*1W9?ZWn*JMi(Nc}H%%dj}656z;oq%l!OWKS6yxG&DeeKV&j+_%I|AaP1m2Hp0>p z%+IfN*h*U)w70{}o3OG1J9on1AiQ}4hYrEW2+YnJhbx=|;jqZ_=VHXnjL4-+Ynuao zeInVccidD;Bo_0Y1Fi;oddvo&&-U$R23lJD2cKhj_&-kK)sxnQZQIOrXU>3S`Rf2W zJE5h;{kZWYE+^5bZj(v4devET@uF@m3r?PNkL7FN$rBhGb3gw0F}!-^7sY1tW;l9O z>+!fQ5KfGa!iNu9KYP|ap09z?QJ9=`KmPJ1OilSkvFYxHP)O?!AKL$hlkU+Ytsgn! zes8GwC3NbPZbjhrYuK~LSr?7!KLomzA3yG_tEhpxI{SJ~Bw+u3cWp<9YI5X^uco2~ z4j!~uH?PYFbn@=q3*+P3jz*!@;kH{*1Nj3U9@e|97v0@3G^F*WCWu6eH5D~5H>ca_ zX{f1z4I8}m$Bx0>yP9S!EWq+|vBuTFix--gu!99hoH*gU|Lxo2eLHr*u3hf2s$!t8Pgj+uCY_)FsT5qeU~BH(vo#YF?y-Cy zX#Nk2zJaWpXmQc5FDw+dJ^1HSaV3`+ z&dwGli9Rp1KF7?zk-Z1LbW->B>cjie5)2Gzme|vyMg|5vJNg4ic?mi@Vc$N@ekUh2 z=WlM-{ya!J?342#iw3XEP0Mc}wIG(h4li5WX^?Moqh9@qsTpXc^tmwyjDeMxAV@o< qeYyhud^G`98D1*~1Ox<>gMR_%Mhy}?3GUJW0000S literal 0 HcmV?d00001 diff --git a/navit/xpm/toilets_8_8.png b/navit/xpm/toilets_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..afa1cba741b4292911aad751669652f5aa45a3ae GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^jJzX3_ zB&N2WUzp{@$k29C`JO=ygQI}s+O)+#O1f8XJKE{LFjcS9H_gD}LL-|#+eF@X`!}$E z$X2hj(bNB1cj}@>_$SAE#~;V+zB}cKWaaF$lfGKLEctXd<4N{TAGOIXd&DlhzL;|< zZ#94WtF_nmSKIot>WJ~M<(SoNj}BdXEbsWo7t0$icb;zDBocC2^SSZ&-K!4NZ7s5q mx$?0y%P#y*Uen*h$L+t!_=M=ztdIpdn8DN4&t;ucLK6U<%Vx#^ literal 0 HcmV?d00001 diff --git a/navit/xpm/toilets_96_96.png b/navit/xpm/toilets_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..361ef74ca9697c9d2966c7265cbbeb7fadfa2dab GIT binary patch literal 2071 zcmb7_c{~%28^`BvLr7@kim3QSsX59}6G|pB$u+sJkQgx*Uvebjn`3g6+-HtWh-rm# zEzQ+|uw~1!tj)RYtM4Db*YDro>v=uT`;X_3=lSFFdc9L^Z7jq=@*n^JAZ}#|v)d!` zPwx}noAdc7gFOh}x?%wX@cvZk>&hGeKxD`YW_CU5=}M7v(DiZo{&?bmzkl_^QXnkh zAma`LkuV-`G^I4xMsz;$65}l_XF-~Zw6Q*8M(GuvtpNg;1b{P2=lgExq!#5)!RlZ_ zPcEkYq+ zRQ#2~ZH8eCNPz476jR#Y(UfxKcEDjFu0Ym)^l2yIAb#$n^=RtBt;#aFC4p|?$cu}A zjm91jiWY^f8+29u+L={Ri=Hby`8%UHyqj zb^f0dy#f-1`FEkKhg`ElfF_}3;pJ~+ArssKFUYl<2^tH=NuQ8oj4il(VHGx`k!*=nGH>BEVg+k zb}_}$%F3^V_r&eX#FycI-6f6eSEOH2=$%IA+Y$40kn5-c$?TIA+8UN3{cECLz5B9Un0 zcsDO@Y&hRTqwiM>k)PEYjG;`iuc3+P&b{~0c-KM-g+xLY&sND--ja>!S7Zl6AaBe& zShJ6VrjW&xmY8%Mhz?07&X;U<;|B_ULZuc_FuKe{OB3bG%WWO?4RMw52QjOs2A$9F z*SXMKnY5Lpn6;$U+q_8JZHJuUyVg7RpG%oe?#Aw(>e@LOyImcBZg`l{r!e!A#q!~# z%kaf<4Zr4ogPZhjF(KzaN~bQJ`;ZB>D|_|%CJ%?G!@&5Hll$CDjGc|W&0ZcMpf`Hi zE7YxpFxGplc1`X05Tpop;hk$_LA>*?_U)#X*|iMk9%y?ALhz8HgQ_(*OG=@5>7&EY zuY~}xk&=W@?aOPNtLncgg5PLbX;4#5)0oa}g;u6ZlWDz78;-tkyX#c`>jb&E4_XdM zdfmI15H!;4v=A# zc!~U^PRjClk0Tyqv{Ka=>SKTVDRzbYp1(@eDKWftp zvb|a3uClWzy~!L64csjC={|dQI}W*hmnRx8q-7dh-<>+$>8Pkz*BV;f(Xijh2pKh{ z@B_6_i4+rk!{4mT0+ z;XxxgZ-G&4r+COi$da9?G?*7}KNkF(o!p|YTPh1|>``jy0L5*YqwTa#kkcx}k4PP* z4(bq}o7dEJLnAPQYoBwo01EmwY#rIek&&Sv=a)qoh3#sQhvWu5?Vg(d3tak@VnFHcQ}Xvk_~ zem3a+3G7gzTo9fK-D+0Al#TT z+!Eb_$`87C;)S2!=7PlLcagOSskOF6zC>#g@s3Uw&iWWuacK?YN!DEIr@8c?rb>PCYZ5oWSEcVvjX0Dx8kN z4TO)TcJaC`ucQy;z|;PIlJQReOiC9UYZ+KO(BOJR|C`rxBj)^)1x8U7Bq>>4C3*Zm zXEQgzcDO-GZxa-LjS(JYep?tkBH-JSB&s56AKL&hEE0+H7RBZ%c*%OGS;CbJ>P0op z&di!*QB*9}2_~*ffP%(anzp-r?&&!MIa6(s=;wckr3NjM1dnNE`J0}lTf}l9-o@Tj pe#TjtMwCwD|A_NnjppCwilWE_#q7vy*gew&tjuj-4Hu9J{{Rr55yJog literal 0 HcmV?d00001 diff --git a/navit/xpm/tower.xpm b/navit/xpm/tower.xpm new file mode 100644 index 0000000..2561c1a --- /dev/null +++ b/navit/xpm/tower.xpm @@ -0,0 +1,35 @@ +/* XPM */ +static char *tower[] = { +/* columns rows colors chars-per-pixel */ +"10 16 13 1", +" c black", +". c #131313", +"X c #141414", +"o c #1B1B1B", +"O c #1E1E1E", +"+ c #252525", +"@ c #262626", +"# c #363636", +"$ c #404040", +"% c #797979", +"& c #AEAEAE", +"* c #D7D7D7", +"= c #FFFFFF", +/* pixels */ +"==========", +"====%%====", +"===& &===", +"===&oo&===", +"===* *===", +"==== ====", +"==== ====", +"====##====", +"====$#====", +"====o@====", +"====OO====", +"====.X====", +"====@@====", +"====..====", +"==== ====", +"==== ====" +}; diff --git a/navit/xpm/townhall.xpm b/navit/xpm/townhall.xpm new file mode 100644 index 0000000..150b26f --- /dev/null +++ b/navit/xpm/townhall.xpm @@ -0,0 +1,109 @@ +/* XPM */ +static char * townhall_xpm[] = { +"16 18 88 1", +" c None", +". c #BF0000", +"+ c #CE0000", +"@ c #A80000", +"# c #C20000", +"$ c #5C652F", +"% c #5D6630", +"& c #808C42", +"* c #818D42", +"= c #5B642F", +"- c #5D662F", +"; c #808C41", +"> c #5B632E", +", c #111208", +"' c #2B2F16", +") c #535A2A", +"! c #535B2B", +"~ c #535C2A", +"{ c #545C2B", +"] c #555C2B", +"^ c #555D2B", +"/ c #535B2A", +"( c #292D14", +"_ c #454C23", +": c #565F2C", +"< c #5D6730", +"[ c #5A632E", +"} c #424822", +"| c #363B1C", +"1 c #414621", +"2 c #4A5026", +"3 c #484F25", +"4 c #454B23", +"5 c #495026", +"6 c #484E25", +"7 c #444922", +"8 c #3A401D", +"9 c #32361A", +"0 c #484D2A", +"a c #888888", +"b c #66685F", +"c c #4E542D", +"d c #72736F", +"e c #6C6E66", +"f c #51582E", +"g c #6E6E68", +"h c #80807F", +"i c #4C512B", +"j c #272B14", +"k c #6B743E", +"l c #9E9E9E", +"m c #7D7E76", +"n c #75803C", +"o c #8F8F8F", +"p c #7E7E7A", +"q c #7F8B41", +"r c #81827E", +"s c #6A743C", +"t c #75716C", +"u c #68665D", +"v c #7C5A20", +"w c #6E531E", +"x c #33371E", +"y c #505730", +"z c #9A9A9A", +"A c #75766E", +"B c #58602D", +"C c #78571E", +"D c #684F1D", +"E c #5C6430", +"F c #7B7C78", +"G c #989898", +"H c #50572E", +"I c #4B5227", +"J c #5D6531", +"K c #67695B", +"L c #5A5D45", +"M c #59602E", +"N c #564A1F", +"O c #554B20", +"P c #5D6430", +"Q c #5F624E", +"R c #626454", +"S c #5C6431", +"T c #444A23", +"U c #373C1C", +"V c #434922", +"W c #393E1D", +" .+ ", +" @# ", +" ", +" $% ", +" $&**&= ", +" -&******;> ", +",')!~~{{{{]^^/( ", +"_:<<<<<<<<<<<<[}", +" |123456}3578 ", +" 90abcdefghij ", +" klmnopqrls ", +" klmnopqrls ", +" klmnopqrls ", +" klmntuqrls ", +" klmnvwqrls ", +" xyzABCDEFGH ", +" IJKLMNOPQRST ", +"UV_4444444444_VW"}; diff --git a/navit/xpm/traffic_signals.png b/navit/xpm/traffic_signals.png new file mode 100644 index 0000000000000000000000000000000000000000..e9c0f90208645356015ceed90b36f1fb47fc406a GIT binary patch literal 522 zcmV+l0`>igP)!81f51Va=gaV+-k_BOYBIaB(Bf#;do`R=nb^DO_9 z`Y??emNr-oQ|R3a_#6V!OB^H)5aqhBZs#$GZQTINSZpK@5zmN~x;-TZv+z%O;GP`t z8fF`ti`d^19K(g|^V9VgYzo#2-jfsDn=S)0d4MAD8+>mpHtJQn{48nYKj{i$2l1e# z#`lT-w7xU8+C0SgVKFx;Zcd6Lhcb;TY+jKrHxiFdh~)*b@-4CD1u-$60blAC3i}#~ z)oUrVVb`xVp?|P553p(TdU8IpC(SBsUJ)4X!ECiX(Bga8A-_#!$wV!ym*dn4aqG62 zyCY5>&(!x9-sc^#oC99N3-t?Es_wtYPBU^W z4fKx?>ny!(y3R`eco`Md_z8Z%z-W80#aF|}JU|gR@Cbf>Z4a)dbMUwzzvEOqhxuv- zWc3U4H=5gb9r6n`jMs=#MGTK6R_bd`#7hhnC3kbj2XdYZ$v773FZzD6 + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/navit/xpm/traffic_signals_16_16.png b/navit/xpm/traffic_signals_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..5760419e626a622a0e757a8061d75f3498de1ebf GIT binary patch literal 395 zcmV;60d)R}P);zef>t}JV-p$3`TV&uAbLN}>H)ojPKS%1~&tM9D z`TP!h*s20P!z|i}DdHU=QyU*p>jjw3i({F%%C%HL0%KLD_>+i>4nUJg+2-Hn;=U&U zKLf`d#!=oH+f{&Z{Dsfhe3@ykSRbg0@Iropi(kamMW%)M$NV>V-U|TxDT(G;0cf6z zlmvFFBEYu@&dv+t^qj~p;YU^X_c%bj8WmsH#LB7|tv^OMK%;X*fBE=$4Y!l54`ycj zEl$8t4(S@<8oLtpPo$J-ER)Ke>(ZUqmEW>L^PH~V@cG8 p1zH#`7kB%OZ!l5ve&MiOcn^g5b+rH*>TUo4002ovPDHLkV1i_VuLuAD literal 0 HcmV?d00001 diff --git a/navit/xpm/traffic_signals_32_32.png b/navit/xpm/traffic_signals_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..4e1e334c537f1d69ce4319c43cdf5f2856aa0af2 GIT binary patch literal 765 zcmVn%-*f@S9LN*FfWbH}_A{kfdBE*G6 zyIBNb>Y|-Uo7}XKL~(F37b+Ok!i^sVfe50TM)9lZYn*Y>&n~L-sbl#T0(e@TofHt#*^YgeroPUd4-L5-%y(--y-t z0Ix)g9oULtY(WKglX;in5A@-;GGfx~n5NV95}YBJZSvCuJ?T&5;9|+)&E|v$Qph9U zpDtiyD*`I`xiR5*j(~ef^2=oi@~noFQP6{Da=?A)jxUWA2`FP5G@R;Y&J!4mpMDNc z7bP!x0x*W@DEK@FcsL&ZBJ6^;*r@u+Dg*}!W*SaDL-1*R&w?Lo2k|N4gnOi^z;?VU zI5QmjyPI-{(y3Mi>}*ch)g?H3NHF^#?ne#@Iy+MZv^18NVx}?SzTHXk$oG7hARkvy zXGKN$5N8_~-rtoCPT4yyY~@7@fD_S0PdEL~W&;OS(7iAS0wv}^83E_BrwK?Wyvw_taYJbm%H-t6NvH-X^ujXPlXyQUF zyq*DDlz<fB+FFWQ1$&VS;zRIK zM5sapMf@9l7o_;2qK#DBS~b<85K1+MV69fMEse!!OrqIpE!hoC$eL_-cYK)LboY0i zGrP%y_6vt)X3m`7_xyIw%$f6pE4YIHHzEzNkpMOW?Ld>^oH-y33;>rJz`+_10KWsu zQbvLM7oBw(Yk^z{K@*t)RxdJl0QOms^^?7}B;o?yrRXJ7!8R|Y7|;nk4ct`j8wK72 zdVrF*?Hxc@Rr^!mf`FS5nt^Eo-sFv-`awpbUJZgh!f+W?)Bb%GPWdQ0^K%XCvbOJ zcAz()dHew!Lg&>tb9twk13p8i7lYomBf!tmaUj<#*`2=ixDBQsIt?*>0@9+RHCLttspagv2HPH2} zxsk5te22tmfz74sQKjHBd)F@@Qn?TdJ0=v zAXRDH)&a-*peYeB1DMOhrU&8IVVA8|8xoRK;u>HLI?$E@yQr$fWil`_3XeSO9}oFF zbiD}2j=P2m!1ur{Wyu1w0&YgQ7M<1vo}?Q$puYaneSi%dMXkTfs75piTxCj1x`Yk` zkA^8FuYR z?}PHGZk4eK_|}w=)PcZ^bj{1qzBSlD`Uw2=y6^B=gk=@!Had$=`CVALF`PWW^6hZ_ z2H)X#g?t)Ql>ohLOyQ$@35z1HjRRld$Vej*NZny>Ahimw#oG(~EhS^)KnX`xB9?@R zpd1@r0x|cuoJCC~YL-!97K(ynr;u~$mw?Z0h}b%Cn(9lpf{By<%1&h5x>M-WSd4mV zG5PAo$idM49RO8?kq=$nMOzZ}I8akfoEnCqJs~p`47~$Wzqv;Kv?U=)=A39le_ox( z#h+nj98#+x?#O25vM{(C&VAu&>kXjahD1H-bPM_tzRo!iOF(KJG`H*aOd7Ihpp^HqvK%F(E{v7r@y9OB&*Abuc0e))@a0+`U+CvDm4&XLjS|~7n?0VE2~ljiU0rr M07*qoM6N<$f*Kn(hyVZp literal 0 HcmV?d00001 diff --git a/navit/xpm/traffic_signals_8_8.png b/navit/xpm/traffic_signals_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..c3b8aa287a2f985160c88bdecad20c35b3618f58 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_go-U3d z5>s=}TJtd`O0+&azBI@qhD&-Q`&L_z8*LG75q-y)OwI_L^brYGPz?MbYAozL=hf+Q zzkA!CO*U&gy7%DLOD_|xm3=sGEPAXyeaeI<&1-7Rv|Em6E&9t9Q6+Xt|EywfONze2 zFZUOH;zf*qCk5!UN&2l7Tq|fX?T1@vVK?u&?2opF$NBE@Y|%2>@cx_t&`}JYu6{1- HoD!MWr03KX$h|ssiu!atxc>H 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 c #D8DEE8", +", c #DDE3EB", +"' c #DFE5EC", +") c #D9E1E9", +"! c #D5DCE6", +"~ c #D2D8E2", +"{ c #CAD3E0", +"] c #C1CCDB", +"^ c #8D9FBD", +"/ c #345590", +"( c #F3F5F8", +"_ c #FEFEFD", +": c #FDFEFD", +"< c #FDFFFD", +"[ c #FFFFFF", +"} c #FEFFFE", +"| c #FCFFFC", +"1 c #FDFEFE", +"2 c #DFE5EB", +"3 c #F6F9FA", +"4 c #C0C9DA", +"5 c #3B5B94", +"6 c #3A5B93", +"7 c #B3C0D5", +"8 c #FCFDFE", +"9 c #3D5C92", +"0 c #C9D1DE", +"a c #335591", +"b c #BCC8DA", +"c c #B1BED4", +"d c #FBFDFE", +"e c #355791", +"f c #C8D0DD", +"g c #DFE4EB", +"h c #CED6E1", +"i c #6A83AC", +"j c #6B83AC", +"k c #C4CFDF", +"l c #FFFFFE", +"m c #FCFDFD", +"n c #6C84AC", +"o c #6A83AD", +"p c #D6DCE4", +"q c #FFFEFE", +"r c #E0E6ED", +"s c #99AAC5", +"t c #D1DAE4", +"u c #FEFEFE", +"v c #355793", +"w c #37588E", +"x c #F6F8FA", +"y c #F4F7F8", +"z c #869AB9", +"A c #E3EBF0", +"B c #95A7C1", +"C c #E0E5ED", +"D c #DEE4EB", +"E c #788FB7", +"F c #A9BAD2", +"G c #ADBBD1", +"H c #91A4C2", +"I c #C7D1DE", +"J c #3D5F94", +"K c #D0D7E2", +"L c #7C92B6", +"M c #8FA1C1", +"N c #5C79A6", +"O c #92A2C2", +"P c #A6B5CB", +"Q c #B7C2D4", +"R c #C3CCDB", +"S c #325693", +"T c #3E5E98", +"U c #546FA1", +"V c #395994", +"W c #7087B1", +"X c #3F5F99", +"Y c #345593", +"Z c #345592", +" . ++@#$%+++ ", +" .&*=-;>,')!~{]^", +" /(_:<:[}|<__:12", +" $34567[89666502", +" a3b+.c[de+.++fg", +" a3hijklmniiiopg", +" a3[[[}[[[[[[lqg", +" a3[[[[l[l[[[[lg", +" a3[[[[rstu[[[lg", +"vwxuuuyzABCuuuuD", +"EFGGGGHIJKLGGGGM", +"NO PQR% S", +"TU VWX S", +" Y Z % S", +" S", +" ++++++++++++++."}; diff --git a/navit/xpm/unknown.png b/navit/xpm/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..f824037c8de97ba326852a0ae22cbecb4e8a6db7 GIT binary patch literal 6333 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 Oc+89};f01*!~O?g&gPZ? literal 0 HcmV?d00001 diff --git a/navit/xpm/unknown.svg b/navit/xpm/unknown.svg new file mode 100644 index 0000000..5ad18ea --- /dev/null +++ b/navit/xpm/unknown.svg @@ -0,0 +1,41 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/navit/xpm/unknown_16_16.png b/navit/xpm/unknown_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..cd03b7d0694ee15d7694332b1e24cec91e977e92 GIT binary patch literal 429 zcmV;e0aE^nP)l3*Hj_oo#u z5J)1T`^M{kHoIKs`2A^`%@KUQ3|{Xs_4+uPmLd>HD#H{5o2>vqJRTyOUE$#cG`CBj!|T8czs zoyW&f-0m}qMeFYoz9JNg1F*1gMY%lF^-bRmVzCX@)((0$_uar`dSY{PAArltMXJ@w z!3+$BHnX#L02qxggKzNsJk09q5dgK?M1KQ|r9`7Krijhv2mlVpjiOCY-vglg?{|I& XRhXmmYT3Bz00000NkvXXu0mjfzzMlm literal 0 HcmV?d00001 diff --git a/navit/xpm/unknown_32_32.png b/navit/xpm/unknown_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0a2cf6d7853c9eb6b052c8528f03f15aa3923f1b GIT binary patch literal 664 zcmV;J0%!e+P)LoK~z|UWBmW0;XlK`fzM0>XgLD|0|NsKjPdUu6T{D+>~yh|lk+=* z^Z!4?|Ns9P{_or8_@9B{KV9(Cr&9l+_I{!$3b?qwG4S$!rYJN>asU(4KZbyS4Ge46 zgfM*gAi(hTD>uWZPkantzj8C|-|xtfm^hz-jqMj{E+94vBqg8yKXJkw7IZlA>C-0v zWn~``9R)-=fQ9Av|I?>U2wD!qw{NTb7ZrU)y)+OVy_CVkB@Vd&{8pH!(+!R|MT*Gg3B{A|M@?EegcY`KYy723k$!YJPJ5D zzy1IDlMTgi6O+>z>iGFT{QvQT9YvkL{|3sVKt|>XO3ME5L4e`R850b3A3yRl+`g@f zA|@vGieL<|5K{2#7aPN@S!r^y&ypcP^~14k6(b18#Fbq zQ70P`!tU-nFwzM=^Qh{8`1l1FmOptS{a;%83GE$_n>z_3*w39a{I8&JpSmR>Hmt6G zvy;P|UQ&Q$Iu(JM!^J{CH84?rcGkp8TMUpvWJHX8B6rBD2 zJ10YTcPUxs5G)69ffp|%7|xzGhO^0SO_A+@@bH!7YNgx(!oqJE>gyX(#OBRQVz_X@ zfIbco5ct55n>!gr?C@b*vK%nr&GG?v09jG+^(!~SmMuOgVz_EanmFLa3ke2a-_2xM yhzBN}Vf&~nu*N{gN%dRZH}s0A@7 zaKh@Pr@;t%*~>;mfe-CrtH z2j}G+&pE#zp6~N`xh#YLLHNSVW|~2uhzMXBQD+@JJ&)nwK*$6apO8xDp}F~$rxPJS zr!6yc69J%q(v->(53UG->Hiy{K#`aC1(Oih)8)yfBngn-i0Y3%2CJR4{F0@-X_Y@SwIAG$N3Q0TG#<>edD z+xv(#Z)r&kgM$ySvFhsgRH#r}=A_bjtbb(W9w5XzH+OQf7V8%X4k14N$Zsx`1f-;x zu>Qrx0-w3NyQ!qHq@#t+h%-Olx!3nc+nRUfFN0RTWl z!&|K1Vo3m#DaG%4A>BqxN@hW+e1nbY^$MTo2ZxXe$jx1W@$uUb6Z0Dz*J#=))eVUN zx!eE-gB;S+x3TfDv3i)8sH0XqkY(;7*4p|4IUF&hKYTMYw-BFiVQ!s1&(!L^bGOma z(YqHWA94Y5xgI&49MXNMtLrIZvD|*u#0jANFC_o~o9%}F{)fQfxV&Q9+v(8MGz>aj zB`v*zBA~47BZ$RIUjCJpTu>n1mza0tDC_3TUuVyN**9c00+>cb0MnrT7W(}8CL|07*qoM6N<$f~J$VkN^Mx literal 0 HcmV?d00001 diff --git a/navit/xpm/unknown_8_8.png b/navit/xpm/unknown_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..82cd0290609aa0f54c95a7f412c79fc92d9ed207 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`3JzX3_ zB&H_U{Ed3@f2nsB&y9x0gRT2{USDVblb-P7f4uYKU;j=b?bIZ?%A^~an=DK`0!p{*xB8k_3-ijKQq(}fS{vePvV0IKN=qiA5-^V m@?YL6rTyyczP{i8nHX&Atw?L;Gvfqgi5PK~?{tp5W(HL4;*&4fJO9&dp6vP=JfHOh> zXM_OGOu7nkHatB?5FXwEZ|_0)_zVC5`uhCw@?`+JyMr+{=FYi7I-FX7Mne!4)qtd= zD_F7OH_V%NACZx*@bDO&us6cv@#4EqxeRqG0W)T_k&`F4li^|Qlm~vIR#vu#%%9&V z1ialensJhyeT?+?`^YlzuQ!{`ljP^;5v_Ju2mlE2@#!a}r5j}*__y2b+c6|Oyq&uM zuFKGXfS0&@IT;%_{;YWJn3y`$*2W?#szLGGuft7%hsP+&%GP4pvg^D`Kv-BOs;d(b z6H~{n25tiK^A8{~v6@%_zzP?tw zpTA^DJ*lo@e0ZPh?gIh>dYLv`gM&JPrST_Tyr0g zl2ZBV4W^@vkGo<0`U|*pX|=;KV`J{f$}-^W+0C>iLa(sAGzYznpU3kr7W+ zRjs6o@$?*_zF1gMOaSc{YHpr|Cr>_i_InsARbZ27IVv#>bTz8pQqND4nV|setlPteI6cdo0eO#$jZ=ll+AuX+(DrRU%ht}3enJRh{ zmp>VonR$kKMRWiDJdBPib8Wh`fY8uqOgrJ4ngkiDnHZN9;N>-pix<}*B&3Tv)@aO- zp`wX#NdX!SL1AGImM*hJ22d%ogLXeqxM$xMuaFJ&~ zLP8Dh-d(~x_!f&ENl8~Ed-+F$>IH1ra2^#EsnF{!Oz~E$AJWrJXlRI%xH893wSesG z<1iXCsQ=FV9~~XxNJyx`_3O(duFP>%`wZBz<0J|TbD+@>ruaK|K0$iA37wr`5?4lt zD(`^k=z0_t?PeZ)gCPs?@z=NyKA^%oK&!Rk)TyuF`G}yfPEY6?bAY(;SM>SKBR%@d=S!Xb0IsM=R zDiW|@!C&z8?RU8U(W851tVTLiBVhLIhYt5`Z=a5b4`<6*jdZ9+Kv-C(!+l#?K9a8x ziBXLJnsY_8hjDqL8UZvrUo{C(%`((vN=JM9bcgyjHhwH~HPWFP0d;jTOsAZk9o0-h zu8I)A86ki(s(1#ZrdD9jo@3N;O8(rG6;%j`h-hOz>*MT*DTp&d0B3{%&IkdV5dt_P z1aL+O;EWK!86ki(LI7uk0M4l5UC`;%+h8)K^DaXcR3Ttsz=!ESo~Qva1#w0Q;EWK! z86ki(LI7uk0M2L#f!&`PK6o$(R;!;<^|%x>XFft;V6VL{O_K@`$V!u#f;b}ta7GB= jj1a&XA%HVN0B8OI)XUJgVU~v600000NkvXXu0mjfsysDc literal 0 HcmV?d00001 diff --git a/navit/xpm/viewpoint.png b/navit/xpm/viewpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..ea995e767a45751957a70ef9c3de11ec4314e558 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`Do-U3d z7QIV@9r+F@a4i1w|NNVTMcQJ^A}6ad=_(j)?&MH*`7k}1`COk*NW!}7N)GcaXTCqU zu3N@goo(7*yK>pHDyz8P`iJHjlw7#_YGG>s{ZP@R|Kb*M%;CRSerb9~ZieC{``g{> uVLN9Z-B*z`HFWjY|BvSUe4;wzH-o2p@S6t?{53#lFnGH9xvX + + + + + + diff --git a/navit/xpm/viewpoint_16_16.png b/navit/xpm/viewpoint_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ea995e767a45751957a70ef9c3de11ec4314e558 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`Do-U3d z7QIV@9r+F@a4i1w|NNVTMcQJ^A}6ad=_(j)?&MH*`7k}1`COk*NW!}7N)GcaXTCqU zu3N@goo(7*yK>pHDyz8P`iJHjlw7#_YGG>s{ZP@R|Kb*M%;CRSerb9~ZieC{``g{> uVLN9Z-B*z`HFWjY|BvSUe4;wzH-o2p@S6t?{53#lFnGH9xvXR0o`*Guk1K z4YSmHOxSClSu5Fbo;Se$FJbO#dAWhSG34Z)Q>94?hz*j86cex&XHVD3p z76c-B#qz}NLVEnQ`3lR({k-*Ev4U=H(I?Qa6KvMy|c6_7iiQGKNY9#c%kfSzUwWCuCzOiF469PA^9Q-dTI(%D8dGuljNJRDldda61fLbsyV977BiX;$AK$%4SFf9jGf%9Q hD%t9Cg7a8k?-%X;G{9ZwCK><$002ovPDHLkV1fjuRwUG#xG*_E^X!qfB@i<7FFQ! z9*o$02k@fClLK*=Cgq7cGIRi9Ohzt1xHvaDi0&Q$;LLmA2&6%`iF^7yf0jazjU2e` z;gHtv?xA#`MuTkV6~55VfN2vvdsxzsr3~39vcZ6F3haw9DfGBtE{cXu3+l8P1#c?b zD{W;bPq;dBzH==@rv+o`ArSJLJ*6LeUWAdH44-prSvoD~hn}&4B1z>@FjQR74?SZG zMN-P6V5qpH?A8iBV+%!6%A;VYxD;PxI+Y95s5L<+7j2j-3={Rzff^+gwPxt#p$$_d z7N6e~j2vJkVMuDt(8)s^mujhEt~4~FREmn82n{DYuLC1Wr4~1#Z_FJ^b`A$zNlJ_# z#&ELZTBtNsQw zX`g?}eYRT4oTL=CsD%_{jnwOjTSm92g;Y+E(ybieB&G1ITFBsKa`C6*zXQ*P`VFX3 zmhq_L6_wN&tW;)KR8=->$An zaDPYUv2%u~ow%tl4Yg_#Z|$Ves%=JVuo1*JApT4>2|piWwbRYc?>RfJeqhyr@3E#_ z5aSsoJpw%$dx%r$2?yk2)t)lNBbS#7$t7C9h8uV~Y1z)NbN z_@6hnM?Fa~oyudC8?`tBD)fproa|;gGL@uMN#DHS7@^8UvNHz-yf&kxQ)TV-1xJl4 zjFL8wC?z;aDLOHXQgKu7QJ5Lpv~2e1#8_Q${3F^Zxah<%)LL-8M1G+!dQqq}`mWPv zc~#oBy~2f_6W2nXV?zZ`vU}9!h&g^-=z@b68HGo|hLe;)p7#la$TFJMpge{4o*37X zSNVPI@7m@7t4K_nq<$d+`htV$w1x60C`B@~LH~lo(CJCtnNcJ|8=lc>>NA}@2`ew) lJ(%)dc4RuGHy>6i^%vX%)@$^35+(ou002ovPDHLkV1m<3otppv literal 0 HcmV?d00001 diff --git a/navit/xpm/viewpoint_8_8.png b/navit/xpm/viewpoint_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..0f3a83ba40cb8b473a6705ec48717e60019866a9 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^`o-U3d z5>tE6JMuLcaJXDtF236Q^~En~j~AJ4x;W(tyHN|{1UEkgNrNq0a?SdgVpx}Xr|Eso pzTN$Sr)1LIsG9W=mY@EgmEN6aan#;U`XJCm22WQ%mvv4FO#o1yGPD2y literal 0 HcmV?d00001 diff --git a/navit/xpm/viewpoint_96_96.png b/navit/xpm/viewpoint_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..65054769826687fc162a418fd148fb4f3e8fc361 GIT binary patch literal 2788 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 Vc6)n}D(~A0SejlosWtM5{TstUTp9oX literal 0 HcmV?d00001 diff --git a/navit/xpm/wifi.png b/navit/xpm/wifi.png new file mode 100644 index 0000000000000000000000000000000000000000..3ce5a33a6d798fe64a804dce8348deb2483d86db GIT binary patch literal 493 zcmV$C-O@)G5 zA@>^Z@x1Or(nfs4OquXRxPB^a!jeMn6E5H^W+S!+Z?OSir9ozer|~XY>&AT?kw*hg z;a+sP8-r!Sa1kdkinS5zspHhpk6SnwHHUD$N_bHENIpl4t8u%IGZTV+xQo-c6g8#7 zvp9^Sc!MW?AL1OE!|4I(ZLii7a{qxz>_Uq)%#Rt)3+$2JxHpqu5c;rpzT}+azk>h5 jKhd}V?zpsq{}w+0o77Xq07v@D00000NkvXXu0mjfBNXM^ literal 0 HcmV?d00001 diff --git a/navit/xpm/wifi.svg b/navit/xpm/wifi.svg new file mode 100644 index 0000000..62f82c0 --- /dev/null +++ b/navit/xpm/wifi.svg @@ -0,0 +1,127 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/navit/xpm/wifi_16_16.png b/navit/xpm/wifi_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ff6ba64e2f51ba25911fefd83a875be813a71f53 GIT binary patch literal 348 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 H&!qnVKJRgt literal 0 HcmV?d00001 diff --git a/navit/xpm/zoo.png b/navit/xpm/zoo.png new file mode 100644 index 0000000000000000000000000000000000000000..f35e39f4a04aa2d8aad07c05e7247548c45643a8 GIT binary patch literal 469 zcmV;`0V@89P)+P z*Qpg6Bve$QlB{B4lFiP!#f^z&|9fw9Pc?JCZ_anVIl%uwxm>0Yg8$NMeG2zKbxL7Rsd_MV(FbuifZdodoA});A!8A=xN-1I6c4UBI z7^qgOC>D!RKJG7axg3NLST2_UfZ1$@+wBGb$Ye6{0#Zs%-tTuzCKG)R!w}Qy6aa8O zpHZn)z9ZgjHcX{b1VG1esFb1*f~V7ozVA~h#r=Ly!!Tmg007kMb^Ve3exHZKfrG(- zzVFlXJleLc>#sLDj^S{~%jJUke69rxg#sMM0RXI4D;$r<&zX@pna}6nCoqvn&~;rZ zr8pjsBel2w+R5F(TKHL?XLn@uh(B9KZ(cg@Yej}o}c&yS?T5 + + + + + + diff --git a/navit/xpm/zoo_16_16.png b/navit/xpm/zoo_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f35e39f4a04aa2d8aad07c05e7247548c45643a8 GIT binary patch literal 469 zcmV;`0V@89P)+P z*Qpg6Bve$QlB{B4lFiP!#f^z&|9fw9Pc?JCZ_anVIl%uwxm>0Yg8$NMeG2zKbxL7Rsd_MV(FbuifZdodoA});A!8A=xN-1I6c4UBI z7^qgOC>D!RKJG7axg3NLST2_UfZ1$@+wBGb$Ye6{0#Zs%-tTuzCKG)R!w}Qy6aa8O zpHZn)z9ZgjHcX{b1VG1esFb1*f~V7ozVA~h#r=Ly!!Tmg007kMb^Ve3exHZKfrG(- zzVFlXJleLc>#sLDj^S{~%jJUke69rxg#sMM0RXI4D;$r<&zX@pna}6nCoqvn&~;rZ zr8pjsBel2w+R5F(TKHL?XLn@uh(B9KZ(cg@Yej}o}c&yS?T5|2b_Z@gb>6M3aU>Oa*002<-s9K|-kF3DzUz z3W*!uhr7N3Tyn<}Qb9#qH)9a#*SKR}2X=`i$k`>#U&iv*- z#+V1-|15HqMhgoIGd$00j~_o)U%q^aM~@yEvMlR_kimZoz+b5m&uc*tlmHY@UX@3q z(F%a||24o20L}Bfb=guAEaybw}LV$k1kFBjOeE9Go@#f7N?cm@*Jpnkpk^`?_ zzn%$#K>Pmv`*NevST;?w$QT2q6tP$gj4?DC4XCP$(P)Gq2oMB8#DR9Zjasdy8irA% zltL6mT~$?BmZkUm{c}!40D>UU7-J<$>2kGN)pmDxF&qw&&*xDn6d=noY}=%Vn&tuA)|}!T0@( z`i}w}9UTDxEX#uDc@Y3Y2vVsO78e(h%jLjvT*UsV1J|!#hoUIRWHO+XqEe}ZPW~1E z04SxAQ327|QcA&b+_^TVVW*+UX0ym-GDxS>VP5ONcvMfVUl&b+;CXVAE%Q8e!L=XfpO%wb3`=FGfP$+;g zhMk=qxUP$QK96)d4M~zfDFx5-5Cq{;$07jJxHHDWX?5zrbmYxu6G0H5-EKpYB;@mX zc%FxDw+quW;W!S)<1yyv=fN0*=Xn^9$LeS_DlRTA8lLCr)oOL{O90>ZBLKed!*Lw6 zS}oLSwb1&h{lIaa7>0pnvx#=Qjbt(j&+{-G4$7KQbRg0G>Q~0>&6psT6+v_<{ZXeK5vgSr%%w8s_Ha@bu|Z6bgkfAzjx6 zV+{Fx9=TjD3>l>qhlhvZH67S#XU_rLxN*ZEgp~L8_S8fop-GaYj>ltImWAEjUF32( z6pO{M)TUt}gdms8K@>$yCKGfz9aO7TeEISP&1N%PH!e~Hfa5sb_x+V>wWv^(#Jp{D^PgzTx2D;L^^4 zGt2S9!a`zudt2Sx+tYmCFEYk*!{HE?Wx;VAxULJ=b;IXguZO+8J=nI5cs!17w~LL9 z4XmxL;q&Lus8lMjZToZ=27o32`{Z&W0MDL1`-3r75(ME-LWpMDcB0qo!Llp>$JJn( zCR(i)>h(Gf4-dnN>G%8C+1bJR`Z~6@w$NxaU|H7L(I)_C0K$DjBm_Ty{#1h?D7vm& zv~3%n=S60)>3TmH4A5$|aO>7B$g+&t*;(*B4@xO~--qXU=Sul9MF8Hve}5bojzc^i zhi%(uEd+2pUmP7B!EqdjqKHDFfP44uh0nh4qtoeNFgUmW&~ZEu{B?341<-XJ03Zkg zWLX9POeT|a0363bk|e}pF@sX7D~bY1k~H7;TF0j~-3vO7 zV{C74mrwG<7!HT1*Xw9B8W)D{DgZiwmFLf&>q|>ZrADJseE04hDwRs4k!4xXbsd5r z065-B0mp7xmId3kBRi^p126!v{_52$5JI%o)m2bRH5`{sDA#o(3D)U!rm_8<$~beF zxiANO-`6>gTUlFM(+>|1OZewZc$st@XZK}CwW*AgwxND^I{puUUjdYHW_kU$`WyT; Vr!>Bx@JIjv002ovPDHLkV1lwyJ@xG*OA0i_yPD?79FSKiZkd*X66U-2k9@!G=uy> z2Kj>g#l888jM}M8(&e-(Rl%J!mJJjJBp$-TlFl92=LC0yjosb%PVTPSCE0+qm-gfA zvjP4u|637{{ovl-o&z|5^VL^hp%icdH=obDAIQc##d?p=I;LqJNGYpA2&9xGNdj?7r>42&(%MK5OD2P7dU)R+ZK|C0ywEu%1M&Mu`H{)yu9q>aye|S)n{U2xQmK?9gm8ZT`R8h*(Qtg1{*5XUi5 z6cI%c#bS~D{r#E71B^x^TCEn%W|O0%Bj?v&e^nuO2s|j9?gbD+I9!Lr^IR@RHk(CC zc?;m;;zDb&Smg81KW93JXL+F6Y;tmP!XJP9QK{GKD&!tq!Da&d_~Va`Wm%4t()sPT z->RKX$5BshI2;1k@n0&H*xA{^G))ba%jGallO#zn3}dDTq?AZ0iQ`y<3L!8})5&Bq z2TMy!NGVS(%W}`o&hGTaOaRNWbl3n+x7)3_uFG&ZWHcISfO5Hv<2Xnuxw^U{2m*4s z9F}E~B+0F0eH$Q25|Sj*uN#JeWm%48SyjU@94X~O;WQIKO6dSqA;fbjC4<3$larHM z#wZUsj>FZ}731-k!C*i>pU1K+ZR9);BuPRX$GW86c%WigRt2aUhOtmM%>?LnyZU@E z7!ZcxJ5SOu3{2C+G)=a)wkQ+|?C$RJ?AbH6wze<~V{Qm7EiJLVy^WL-!!Rfm3T$j_ z(C_yd3#uU~U=azYRUGed7-fOfmBZ$20dm`o-!0Zh{*l}fR_ zy^Z5IR4SEQo|z|0OG_GJV`GEe-CaD-;=%iQqq8^qi3?IY;4*?KD5JeHg;SkUB@H~%lxlE~4(g5vtn|8a+ z%E}6>tE;T8u98ZnNT<^pKmq;N0P^{~28iRB(P%`c)1ldH0@n*3KoA79+im{-`)@Wk zHvx3$sA@Lt0eFup6vwfS{psa?T9PCoiXy@=q}S_ld3njj#RWkS=yqdTRR1HTq~Gro z$1$GgvA({}#>NKOY?e5V3B!=lXvEdkl@o^H!T$a}hGCpuU0u1gTJ4>-Vy*{f^((Ug zCX)%5mzVmzDg%kuIvhGFQ7ybbW= z$rIMr)_C^p8F3tI9goKZLBL=zAd|^xfK)1lWm%+BDf<1s)@cBhFZap3BzA#AA%qBm zz=`A7DHe;BFbui8yd(@mf*{ac>+9FADHe;^wtZ{y>h*ehO(>O0lu9MC*({^ch%gKZ z!;nU!L8H;&{QR7wqa#|a*22c$2_U6>A%t)*E-nrxlS#E$ELH}C0ZEdeKvelu##@%f z`ue&qjlEuvR;xv;)gnm}ve_)9Qi^ zqm9FAwThI|SzTSNCP~8OA~BgTa7CqXArR zfI6KH=jZ3T_lcqi&-19)>qJq6>$;qso#DDJ=jZ46zE2cIb4&J(Ei-3F^Fl~(>Q`1) z93e!-G)?;bzFy|1WjGwtXf$paui{;4uh-Kc=jZ2I8;youneT{wHQIS+c61-W*STCy zmohbRm<6C_J+^I=&*!mio1L86h%(0RulDlo%8c^JkQhR_#TmO8@~{M>e1Eo`Mx@>CU)g=8QZqq zD2fh&7sKK3U^1Cho6V;4=FJ=G^*W74LobGpm4yIQNGu}xd|uB?0XGPO!*9R+_NO0y z_(6><4^->WXf)_{yNi0@K>#Y|#Lmu+v$nS8tgfzB)SkB8ZqL2obdLlegpdHg|Ngs# z>qfBG>uDVhhYLTPhXT9++%LcU@?dv&w^}NdD#ypi93LOw2{0ay>2x}b$KzXV@X^tc z?r_!AVmux*nM^(!fD0Uc_uY5;OAaB#oyIEw)oM@6bY=UHa&Hb8hH)yTJQPBRZnx`r zp639SN8D?AOZd=V2+aMSV3DzkD};C#u{0i;F6c2YBq)sV-BC*ZauVz`yvX vCf}$3zWK~YlZOtrPPwU03%>uO|7PMprdn5=9~J9E00000NkvXXu0mjfP4o2= literal 0 HcmV?d00001 diff --git a/navit/xpm/zoo_8_8.png b/navit/xpm/zoo_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..321f1d35fc95113fed2e6da81602249b484d13fb GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_eJY5_^ zB&NppFXU=YkZ|Rf)|jEgrS?BTWb@nmn{U)~&8$(_$eFdBOYGpPKo;J%d{>#s>}X%(2%~8T=b8`r=a~SJmFPJU?0Iw8U}21*`{5 yd>M}v%4l{i>RjZ(uyg&D(zWZI7^#2bl3wZpI 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 RGj#v}002ovPDHLkV1jV~>^uMf literal 0 HcmV?d00001 diff --git a/navit/xpm/zoom_in.svg b/navit/xpm/zoom_in.svg new file mode 100644 index 0000000..18ff2da --- /dev/null +++ b/navit/xpm/zoom_in.svg @@ -0,0 +1,100 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/navit/xpm/zoom_in_16_16.png b/navit/xpm/zoom_in_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..bf38128cec2c4fddb1e3b242606dca4b90329347 GIT binary patch literal 502 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 RGj#v}002ovPDHLkV1jV~>^uMf literal 0 HcmV?d00001 diff --git a/navit/xpm/zoom_in_8_8.png b/navit/xpm/zoom_in_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..bbed708db3c68632e11760817a9439322aff8994 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt@!JY5_^ zB&OQ->-rr@kYIaW=`CyDzTyFw%IpbioF46T*uP{}0W-_KOs%YqG6_dlP1U}@`p&`0 zY{L4t&5<)w{`6Q}`u?}|t!TrN*x2jy8JJ$|dgpd&?~-!QZLv4&yfkx7cn;q*@ztL+ zuTlF!^rh8rchC9!mUF{2lUw`Pv=naJvES=j6v5u`mVxiU`HRiDj4T^iS9RR*{x!kG z?TDSys>*rW|4$VB$j~!skIre;4>N*py~y93d;9Vxop1)r=dqVf;u-c=%?WI7m~$ip P=obc0S3j3^P6ILrGG)q?DO2WPg9F`wFoGaB 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/zoom_out.png b/navit/xpm/zoom_out.png new file mode 100644 index 0000000000000000000000000000000000000000..497d9aaec09d6a34aaca97a48aac5fb995f1100a GIT binary patch literal 1478 zcmV;%1v&bOP)u@L`ZJzI1mc@Gi9NP75+#{qngbIeSs2WY&mr{b>Z@yJy$>WzNgps zyys)vIrgJnaNv3F=f3afy3h0Z-VZR2as0o*VmR5fX;ZAGrsiP)t4Q7t;7$OOB@qBf z3cw|6?HOatH_2r3a93B?=X>_-NshJeF$J(|*RHwc<>fB`cpSj3BkGvE2;iW#_U(p- zhMz{uVN?OMwzl43t!)Od5UNT=0!^0W2}wr* zoFZv+`H^G*+y!76fQ3O0BoFlT^wc_zbFF9rBoc|q06qh-IMCDyU?0hIh4=}=T3bc3 z7Qnnf(}{|TisiMnwU_ew$QwXgTie9`{{Al|)%e5%0QQpX8X4tqNLm139f0(-B-t@I zIQURwW8>esY)wAr{r&y>{p3mZ0@ztB@~+QLNjoK_M^e(Fva+(ae6~3QXl-qMPSQ$W zN4+H98ts(HNyHe>_j#Xqbs~}2lFKgZ6xzLe_sm!<_5*-Pu4n+j>m)CXoo;qWng(D8 zfSX*=?H9Crm%<2t=dN_wX-y0C>ODIg%gvM7N|;sitiDp#d~EH{T6l zg-_H$va?7W3qc2f@4bqo$C{d&=7cGR1`vrvULqNFs}{iiqEpNRNo{W5AQ_EDquavt zG6F~>5-|X)y*kN`8!>f)Fvj#^_?+>ux~;7($lKl9iGG0Fo|{!)Kkfb^?HBNIrl9 zt{|g?mGqUQ4~;S2Z8W`sNU97Pge~H7uS{~#SFR!XV32`pUE2Z`l6|5t6fgd`<=x!bae* zuRIaJJtd=;2iDsA0F-(4WHR|lP$wgRo}Qi~lK%ASB$t+qVIH{KwuipHzP=+tos0k+ z$4QYq=+z}Hvew>KB92*Mt*wIZS_9yK<2V^RVCei#rBZK5N_jdYpDF>zoN&`E#w}lq zL?W++>4gRmkH=2~IOr42m$b0xEVIB`yBNM)k)-ww8#ZL@KtPU@cxY%S4&aK<$vQVR zSZY*}eAZXL9E-&ovngi{ARdpO1@N+0cXy<%k}9&+DSg?6J0RIyyH(o6$6s0B|T4aiYGJ1?Ay3;V{I9;*+x_GvecRE|@pL}hf|I)>Kb5p3(9~&+**AvKsFIYC+?8}Z7K^Q@tE;<` z#V(Cvq}K)DB*~+ael9S*elLd8>+^yfB(;-VQ(s?S(DPH#A2>*!2JnaXz~SC33wq#? zw5_3`p=Bg|#`46}Bx$8D0XABsNFItrBJphb&s-SOBVSWf)2v7&vK_z^?iN^h$HRB~ zk5Z}Bo0~Up{&ln*it^0rI8Jo>^y$moRQwVEGe}l=(~RU_?gjC8l3$ZN)ZN|vh2uD> goQ}saj&bD0KW}6yZQcf)yZ`_I07*qoM6N<$g2BnlfdBvi literal 0 HcmV?d00001 diff --git a/navit/xpm/zoom_out.svg b/navit/xpm/zoom_out.svg new file mode 100644 index 0000000..1d794ef --- /dev/null +++ b/navit/xpm/zoom_out.svg @@ -0,0 +1,108 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/navit/xpm/zoom_out_16_16.png b/navit/xpm/zoom_out_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b74c6e661ff821ed22734717fa04e8924c34e41c GIT binary patch literal 460 zcmV;-0WP?s(Rg=n;KW|&1{79!Y+;G)!(KcJ!_)s2fJ{Ye^Hq=m$Ajh*|wE^=>} zO#V8Pv75e|Idi`EJMVkX{qCJJaJR$i*)%#jy04|BGqYQfV6&NZ0tX~L13Vn@ZvwC6a=EW+HjvNfPXO-$ zO_COXGiLU^nfa|uOLCG9o7oXy7jR3`siC2v(c3mKHa2$D%sw--Cg6&s51ey1wi4a| z?UG&tIwh5zb1!AH*)O*>FflRF9R$H2KpSugc*o3^t9iGHl%zL+ZeSsmN+khVLeG_%SIaiK^7tL%|5`dZ6W5E0x z17R3;n;DV<=Un`TI|X!^)%BZ2BzW1(-Uj{!0wB%GW4U5-n;P{guf>)cs~vF8U6O>E zr6ncJY}w4-mGt;d)XnVAC`_?(^+=joXP~vUb!us8DgL?}xX8-A`*|k@Vo2(ULtrY- zuePVJuWuHZiO2^VAzBGDI~diT&gF9R>kLGsuK}EMPfObFeAI%3q(f2d^OXzLBBuc_ z=^;sn8>KGkS>Qn+lyrJi1KDi$H!9xSKzjqk?+1=VH9xN&)z-B+olc(w7J)WNuS!Z* zb80{eI1bz+X(5?RzFtjOXQ02o|FZY~STxt|1>Q8X`|1#Hm-H6UEval~$Es%ms9_{C zv$Mc=cVr}sQ7V<5E0@ck0&xef1HS;j0#_=BQs-Qk_x>p}J0$6WD1S4NNW7fMWX^9W zu$=*b@$vCJK@f~Yhw{#j<&`KFi#^`^A)pu7zX@$h(m6BxxM6=xHZju~hT(o-Pn4QV kBofn^OlG#8dUrSe1F&y}CAgUqJOBUy07*qoM6N<$f?QI&7XSbN literal 0 HcmV?d00001 diff --git a/navit/xpm/zoom_out_48_48.png b/navit/xpm/zoom_out_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..497d9aaec09d6a34aaca97a48aac5fb995f1100a GIT binary patch literal 1478 zcmV;%1v&bOP)u@L`ZJzI1mc@Gi9NP75+#{qngbIeSs2WY&mr{b>Z@yJy$>WzNgps zyys)vIrgJnaNv3F=f3afy3h0Z-VZR2as0o*VmR5fX;ZAGrsiP)t4Q7t;7$OOB@qBf z3cw|6?HOatH_2r3a93B?=X>_-NshJeF$J(|*RHwc<>fB`cpSj3BkGvE2;iW#_U(p- zhMz{uVN?OMwzl43t!)Od5UNT=0!^0W2}wr* zoFZv+`H^G*+y!76fQ3O0BoFlT^wc_zbFF9rBoc|q06qh-IMCDyU?0hIh4=}=T3bc3 z7Qnnf(}{|TisiMnwU_ew$QwXgTie9`{{Al|)%e5%0QQpX8X4tqNLm139f0(-B-t@I zIQURwW8>esY)wAr{r&y>{p3mZ0@ztB@~+QLNjoK_M^e(Fva+(ae6~3QXl-qMPSQ$W zN4+H98ts(HNyHe>_j#Xqbs~}2lFKgZ6xzLe_sm!<_5*-Pu4n+j>m)CXoo;qWng(D8 zfSX*=?H9Crm%<2t=dN_wX-y0C>ODIg%gvM7N|;sitiDp#d~EH{T6l zg-_H$va?7W3qc2f@4bqo$C{d&=7cGR1`vrvULqNFs}{iiqEpNRNo{W5AQ_EDquavt zG6F~>5-|X)y*kN`8!>f)Fvj#^_?+>ux~;7($lKl9iGG0Fo|{!)Kkfb^?HBNIrl9 zt{|g?mGqUQ4~;S2Z8W`sNU97Pge~H7uS{~#SFR!XV32`pUE2Z`l6|5t6fgd`<=x!bae* zuRIaJJtd=;2iDsA0F-(4WHR|lP$wgRo}Qi~lK%ASB$t+qVIH{KwuipHzP=+tos0k+ z$4QYq=+z}Hvew>KB92*Mt*wIZS_9yK<2V^RVCei#rBZK5N_jdYpDF>zoN&`E#w}lq zL?W++>4gRmkH=2~IOr42m$b0xEVIB`yBNM)k)-ww8#ZL@KtPU@cxY%S4&aK<$vQVR zSZY*}eAZXL9E-&ovngi{ARdpO1@N+0cXy<%k}9&+DSg?6J0RIyyH(o6$6s0B|T4aiYGJ1?Ay3;V{I9;*+x_GvecRE|@pL}hf|I)>Kb5p3(9~&+**AvKsFIYC+?8}Z7K^Q@tE;<` z#V(Cvq}K)DB*~+ael9S*elLd8>+^yfB(;-VQ(s?S(DPH#A2>*!2JnaXz~SC33wq#? zw5_3`p=Bg|#`46}Bx$8D0XABsNFItrBJphb&s-SOBVSWf)2v7&vK_z^?iN^h$HRB~ zk5Z}Bo0~Up{&ln*it^0rI8Jo>^y$moRQwVEGe}l=(~RU_?gjC8l3$ZN)ZN|vh2uD> goQ}saj&bD0KW}6yZQcf)yZ`_I07*qoM6N<$g2BnlfdBvi literal 0 HcmV?d00001 diff --git a/navit/xpm/zoom_out_8_8.png b/navit/xpm/zoom_out_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..a0dc2d480407ca95dea4b7917b0f404dcc57edb6 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^TJzX3_ zB&OQ-E%ZB_AmMuc?=341{*68#c)UH9seRnz@PA3wO=*P>zQKXrPZ`ygJu~xfn698` zTtB<}W!cxA>h5P=|NeLI8<)eSjq6^=GccCKZlAbi>KD_`-na8Lm+oy#+#!Gbqw}TT zSJgbX#TT7BuexE{m)zecx1}98;2$XRTIfI-gScln=Qi&K2EGGIO6Ml|P4W{g?CUsc z;@cjb;_{~9{LjA}dzMZ4W}bd~TX|^cT85%?$CqXPWBA7y66YRiwBn>8&=U-vu6{1- HoD!M<--BLd?cMtZy&m+h^DLzuw==S z38O}h`nI*U9>7-sOe%p|0oV@UNo(zfF=NKu+0fAN-xBC82}5pxwzjs^#EBE(oOQ(=H}*`6Xr|AfEl2@y?tCNmHHjYZzRYj09#2u2H;ub{^dm@X)J(K0h|rs zvqr-+A_zM z-b2os)J(53Rj9Dk?ol@2zDcNjxd=LaPC7ltM zmgMffzP?LaTU(zkRrw_|z_Mk_PLcEoa-)za_DSk6#tirfBO#|qYDE0pWKSxU`f5W% zLrLC*k{Dp=(xoRDW1a+XbWGA`0Ng^dJ0{(bAn6bQjQ~C$lXO=Q1ZOlgHN94BnME5Q z48vMU&yhSSCh0xKm^&n?*fIx_{0i#~02jq1-I7YBPAzr`qu2=x0Nfta_!ht_lIzR8 z@qygZHp#UBRv}k+7gKwBdTuMWyrK-SeEIT40KOTKL;zNj+*C|CLjlQ6Bv&E#46Zca z3d8WbMU_)%#{5V3F94iFIFi3dZkSoISZgmPd4)?ZsSChqEiElu3ejKi8z5;FA{rmS zpHShA4*Pz@f#2X z!3~I>Y^@w_jSuAhSO9K`NOELnXXo`v^(Hbvdwcsh0CQb(NlydVoU{^^0?EGvcrGHz zyf6%FljuxjfYGBzUkmpu*lmnin?zqFk{{XiIK&eGT$4nfw*h9%m=OSQerWP5pk?Fk zF@WqPd7n!tsYR0ax7FJK_4W0a131bd-VfjbUtN`sr2F7_3rHRlhT&zty1We_>8c3v zMgX0@x+)!#?@4;dB{#-2`0Da9Kp2MOk=sS;4;f=N`W84`Fvi>u$1;Va>5CUHKEz9p zPa=|60&s1rzbI*skDg)1UH~sTWVJyM%Q>z zBLJtfmd8GM{9y=^Cpflpv&NXW;_?H4q(lo;<$}-m%^0)WT5Hk&pLudz{#XM@>etDN zy+7J$!qdY+XX*4l0WuaLYwfA;KSNa`cGN79k~$YR~_eTJd^{(JL# zp)QWL)?QC?TBSBV0FWF@avFf^t+h^{CrPelnAkTz)&L~?odJ_{`olUU}EPAw7RvV&0duE<)~Vi&!UQpDw6hC3%M=7rTrx zH%QtXVZgFSQn#ed0B$hG>~f`xXp7i+gwI55kEBoaQ@JBZ25`&;B<(cD{3cF+IphB3 zeke_iwKi(56p2q4^om0i~g*DO!z5Rev)7G)G_Rk^d&fU3ne}7qr=w#8zL%kwx^Ea zNL26J zx+)!#^>9R5k@Uu{UAzA1tIOK}>({T(0$A#jOS%ZaCw%o)Fo#L1cL_=Uwymu#>VWr$ zNV*~O3rYJNva#0MnF;k(9FnetJI>HssZ{EwB>EB=Ae~Nkk#q*MBYC={X-RZe5|X|E z;L9#K$xPDN5s9}X>+0%$2Egf#E~znpq;pt7asq&;gBLp`-I!EwVgt;cJ^LM!KXS=Q zjsuWB5Z8G)Ajw#3)5tA7^ozCj8sDMk!4w=TB9qBHMe_8BB=?Y9U#R{vV^-9M7r>@; zI(<$diVOai8e`@mde8Hcm`Ya)7e_ruK5BcqP~`<1pt-sEUjVL-Nj5Vde!e2H)}ALR z>Zp-wYHGe$XrvUN1QD|`napkZGi2^U$h!e}t&Nls-;s1_OqyHM>9jL)fDc7~C`mTK zeOL_uAn8(T?G+K8Wo1Kt@G#4x@wcQ>spewKD@lWdVR!_9rxEXt{i>vJpo6m(O5U5f z1@X_Zt+%)L^o0u-7JWLjWdF!83{NKcn54L{mG6>V3E&^4D!W8XlQa(=VJmxkd(T?9 zaAE9*yAJ~qxb@HQ3s3)yq_xJFy``)}Qb-B00Mw{vv=V23USaAt+UwX;q2xo`PtOmJeS>#DZ;ZKM{`~n)_ryXOuu;jnb?e6N+qdsl0GB7ob|8HH zCIJ5gP?GCJB#lEZ8g3!s>u=w`fB#jB7A!DyLau>PX zG-57t>yI!DF96UC;OmIk^e6?A-Z949X{}w>($eCL_cK_Og#ixG-rhcL^ytx-S!*vb z#+-!`UFJ!0JAlUl+#LkL9|pUdiK46w@KIK*SaEz`U*9 +- ++ + + diff --git a/packaging/0004-connect-demo-gps-nmea-log.patch b/packaging/0004-connect-demo-gps-nmea-log.patch new file mode 100644 index 0000000..dc84d87 --- /dev/null +++ b/packaging/0004-connect-demo-gps-nmea-log.patch @@ -0,0 +1,22 @@ +diff -Naur navit-0.5.0/navit/navit_shipped.xml navit-0.5.0-new/navit/navit_shipped.xml +--- navit-0.5.0/navit/navit_shipped.xml 2012-02-13 16:20:52.000000000 -0800 ++++ navit-0.5.0-new/navit/navit_shipped.xml 2012-02-17 13:27:46.497707892 -0800 +@@ -108,7 +108,7 @@ + + + +- ++ + + +@@ -120,7 +120,8 @@ + + + +- ++ ++ + + + diff --git a/packaging/0005-defaults-to-qt-backend.patch b/packaging/0005-defaults-to-qt-backend.patch new file mode 100644 index 0000000..98d7bef --- /dev/null +++ b/packaging/0005-defaults-to-qt-backend.patch @@ -0,0 +1,12 @@ +diff -Naur navit-0.5.0/navit/navit_shipped.xml navit-0.5.0-new/navit/navit_shipped.xml +--- navit-0.5.0/navit/navit_shipped.xml 2012-04-19 14:27:36.581014600 -0700 ++++ navit-0.5.0-new/navit/navit_shipped.xml 2012-04-19 14:26:38.813014388 -0700 +@@ -34,7 +34,7 @@ + + +- ++ + diff --git a/packaging/0006-custom-layout.patch b/packaging/0006-custom-layout.patch new file mode 100644 index 0000000..b2980e8 --- /dev/null +++ b/packaging/0006-custom-layout.patch @@ -0,0 +1,59 @@ +diff -Naur navit-0.5.0/navit/navit_shipped.xml navit-0.5.0-new/navit/navit_shipped.xml +--- navit-0.5.0/navit/navit_shipped.xml 2012-04-19 17:44:57.085057214 -0700 ++++ navit-0.5.0-new/navit/navit_shipped.xml 2012-04-19 17:46:34.813057565 -0700 +@@ -47,23 +47,22 @@ + + Main menu +- +- Actions ++ Navigate + Show + Map + Settings + Tools + Route + About ++ Quit + +- Actions ++ Navigate + Bookmarks + Former + Destinations + + + Town +- Quit + Stop + Navigation + +@@ -75,8 +74,6 @@ + + Display + Layout +- Fullscreen +- Window Mode + 3D + 2D + +@@ -92,7 +89,7 @@ + + + +- ++ + + + +@@ -104,8 +101,8 @@ + It's always the top left corner of the icon, so you need to consider the icon's size when you enter the values. --> + + +- +- ++ ++ + + + diff --git a/packaging/0007-increase_icon_size_patch b/packaging/0007-increase_icon_size_patch new file mode 100644 index 0000000..2cf9fad --- /dev/null +++ b/packaging/0007-increase_icon_size_patch @@ -0,0 +1,12 @@ +diff -Naur navit-0.5.0/navit/gui/internal/gui_internal.c navit-0.5.0-new/navit/gui/internal/gui_internal.c +--- navit-0.5.0/navit/gui/internal/gui_internal.c 2012-02-13 16:20:44.000000000 -0800 ++++ navit-0.5.0-new/navit/gui/internal/gui_internal.c 2012-04-19 16:15:44.949037955 -0700 +@@ -212,7 +212,7 @@ + * [2] => Small profile (default) + */ + static struct gui_config_settings config_profiles[]={ +- {545,32,48,96,10} ++ {545,32,96,96,10} + , {300,32,48,64,3} + ,{200,16,32,48,2} + }; diff --git a/packaging/gpsdata.nmea b/packaging/gpsdata.nmea new file mode 100644 index 0000000..88c9444 --- /dev/null +++ b/packaging/gpsdata.nmea @@ -0,0 +1,561 @@ +$GPRMC,142557.000,A,4532.097,N,12255.882,W,0.00,0.00,190510,,*10 +$GPGGA,142557.000,4532.097,N,12255.882,W,1,00,0.0,24.000,M,0.0,M,,*45 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142601.000,A,4532.093,N,12255.883,W,0.00,0.00,190510,,*15 +$GPGGA,142601.000,4532.093,N,12255.883,W,1,00,0.0,25.000,M,0.0,M,,*41 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142603.000,A,4532.090,N,12255.883,W,0.00,0.00,190510,,*14 +$GPGGA,142603.000,4532.090,N,12255.883,W,1,00,0.0,26.000,M,0.0,M,,*43 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142605.000,A,4532.088,N,12255.883,W,0.00,0.00,190510,,*1B +$GPGGA,142605.000,4532.088,N,12255.883,W,1,00,0.0,27.000,M,0.0,M,,*4D +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142608.000,A,4532.085,N,12255.882,W,0.00,0.00,190510,,*1A +$GPGGA,142608.000,4532.085,N,12255.882,W,1,00,0.0,28.000,M,0.0,M,,*43 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142616.000,A,4532.078,N,12255.877,W,0.00,0.00,190510,,*1D +$GPGGA,142616.000,4532.078,N,12255.877,W,1,00,0.0,37.000,M,0.0,M,,*4A +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142626.000,A,4532.075,N,12255.869,W,0.00,0.00,190510,,*1C +$GPGGA,142626.000,4532.075,N,12255.869,W,1,00,0.0,40.000,M,0.0,M,,*4B +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142635.000,A,4532.070,N,12255.860,W,0.00,0.00,190510,,*12 +$GPGGA,142635.000,4532.070,N,12255.860,W,1,00,0.0,42.000,M,0.0,M,,*47 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142658.000,A,4532.063,N,12255.862,W,0.00,0.00,190510,,*19 +$GPGGA,142658.000,4532.063,N,12255.862,W,1,00,0.0,49.000,M,0.0,M,,*47 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142705.000,A,4532.061,N,12255.867,W,0.00,0.00,190510,,*17 +$GPGGA,142705.000,4532.061,N,12255.867,W,1,00,0.0,51.000,M,0.0,M,,*40 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142713.000,A,4532.059,N,12255.874,W,0.00,0.00,190510,,*19 +$GPGGA,142713.000,4532.059,N,12255.874,W,1,00,0.0,51.000,M,0.0,M,,*4E +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142718.000,A,4532.056,N,12255.881,W,0.00,0.00,190510,,*17 +$GPGGA,142718.000,4532.056,N,12255.881,W,1,00,0.0,50.000,M,0.0,M,,*41 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142723.000,A,4532.050,N,12255.888,W,0.00,0.00,190510,,*10 +$GPGGA,142723.000,4532.050,N,12255.888,W,1,00,0.0,49.000,M,0.0,M,,*4E +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142726.000,A,4532.047,N,12255.890,W,0.00,0.00,190510,,*1A +$GPGGA,142726.000,4532.047,N,12255.890,W,1,00,0.0,50.000,M,0.0,M,,*4C +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142734.000,A,4532.036,N,12255.895,W,0.00,0.00,190510,,*1A +$GPGGA,142734.000,4532.036,N,12255.895,W,1,00,0.0,51.000,M,0.0,M,,*4D +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142736.000,A,4532.033,N,12255.895,W,0.00,0.00,190510,,*1D +$GPGGA,142736.000,4532.033,N,12255.895,W,1,00,0.0,51.000,M,0.0,M,,*4A +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142738.000,A,4532.031,N,12255.895,W,0.00,0.00,190510,,*11 +$GPGGA,142738.000,4532.031,N,12255.895,W,1,00,0.0,52.000,M,0.0,M,,*45 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142740.000,A,4532.030,N,12255.895,W,0.00,0.00,190510,,*1F +$GPGGA,142740.000,4532.030,N,12255.895,W,1,00,0.0,52.000,M,0.0,M,,*4B +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142743.000,A,4532.028,N,12255.895,W,0.00,0.00,190510,,*15 +$GPGGA,142743.000,4532.028,N,12255.895,W,1,00,0.0,53.000,M,0.0,M,,*40 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142748.000,A,4532.022,N,12255.892,W,0.00,0.00,190510,,*13 +$GPGGA,142748.000,4532.022,N,12255.892,W,1,00,0.0,57.000,M,0.0,M,,*42 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142753.000,A,4532.017,N,12255.887,W,0.00,0.00,190510,,*1B +$GPGGA,142753.000,4532.017,N,12255.887,W,1,00,0.0,59.000,M,0.0,M,,*44 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142755.000,A,4532.015,N,12255.883,W,0.00,0.00,190510,,*1B +$GPGGA,142755.000,4532.015,N,12255.883,W,1,00,0.0,60.000,M,0.0,M,,*4E +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142804.000,A,4532.011,N,12255.871,W,0.00,0.00,190510,,*19 +$GPGGA,142804.000,4532.011,N,12255.871,W,1,00,0.0,60.000,M,0.0,M,,*4C +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142807.000,A,4532.011,N,12255.869,W,0.00,0.00,190510,,*13 +$GPGGA,142807.000,4532.011,N,12255.869,W,1,00,0.0,60.000,M,0.0,M,,*46 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142841.000,A,4532.011,N,12255.869,W,0.00,0.00,190510,,*11 +$GPGGA,142841.000,4532.011,N,12255.869,W,1,00,0.0,60.000,M,0.0,M,,*44 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142843.000,A,4532.009,N,12255.871,W,0.00,0.00,190510,,*13 +$GPGGA,142843.000,4532.009,N,12255.871,W,1,00,0.0,59.000,M,0.0,M,,*4C +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142846.000,A,4532.007,N,12255.872,W,0.00,0.00,190510,,*1B +$GPGGA,142846.000,4532.007,N,12255.872,W,1,00,0.0,58.000,M,0.0,M,,*45 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142850.000,A,4532.005,N,12255.873,W,0.00,0.00,190510,,*1F +$GPGGA,142850.000,4532.005,N,12255.873,W,1,00,0.0,57.000,M,0.0,M,,*4E +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142852.000,A,4532.002,N,12255.874,W,0.00,0.00,190510,,*1D +$GPGGA,142852.000,4532.002,N,12255.874,W,1,00,0.0,57.000,M,0.0,M,,*4C +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142854.000,A,4531.999,N,12255.875,W,0.00,0.00,190510,,*12 +$GPGGA,142854.000,4531.999,N,12255.875,W,1,00,0.0,57.000,M,0.0,M,,*43 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142856.000,A,4531.996,N,12255.876,W,0.00,0.00,190510,,*1C +$GPGGA,142856.000,4531.996,N,12255.876,W,1,00,0.0,57.000,M,0.0,M,,*4D +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142858.000,A,4531.992,N,12255.877,W,0.00,0.00,190510,,*17 +$GPGGA,142858.000,4531.992,N,12255.877,W,1,00,0.0,58.000,M,0.0,M,,*49 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142901.000,A,4531.989,N,12255.878,W,0.00,0.00,190510,,*1F +$GPGGA,142901.000,4531.989,N,12255.878,W,1,00,0.0,57.000,M,0.0,M,,*4E +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142903.000,A,4531.987,N,12255.879,W,0.00,0.00,190510,,*12 +$GPGGA,142903.000,4531.987,N,12255.879,W,1,00,0.0,57.000,M,0.0,M,,*43 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142905.000,A,4531.985,N,12255.880,W,0.00,0.00,190510,,*10 +$GPGGA,142905.000,4531.985,N,12255.880,W,1,00,0.0,57.000,M,0.0,M,,*41 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142920.000,A,4531.973,N,12255.882,W,0.00,0.00,190510,,*1C +$GPGGA,142920.000,4531.973,N,12255.882,W,1,00,0.0,56.000,M,0.0,M,,*4C +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142934.000,A,4531.959,N,12255.879,W,0.00,0.00,190510,,*15 +$GPGGA,142934.000,4531.959,N,12255.879,W,1,00,0.0,53.000,M,0.0,M,,*40 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142947.000,A,4531.946,N,12255.874,W,0.00,0.00,190510,,*12 +$GPGGA,142947.000,4531.946,N,12255.874,W,1,00,0.0,53.000,M,0.0,M,,*47 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,142950.000,A,4531.943,N,12255.873,W,0.00,0.00,190510,,*16 +$GPGGA,142950.000,4531.943,N,12255.873,W,1,00,0.0,53.000,M,0.0,M,,*43 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143002.000,A,4531.931,N,12255.875,W,0.00,0.00,190510,,*1A +$GPGGA,143002.000,4531.931,N,12255.875,W,1,00,0.0,53.000,M,0.0,M,,*4F +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143005.000,A,4531.929,N,12255.877,W,0.00,0.00,190510,,*16 +$GPGGA,143005.000,4531.929,N,12255.877,W,1,00,0.0,52.000,M,0.0,M,,*42 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143011.000,A,4531.924,N,12255.880,W,0.00,0.00,190510,,*16 +$GPGGA,143011.000,4531.924,N,12255.880,W,1,00,0.0,52.000,M,0.0,M,,*42 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143013.000,A,4531.922,N,12255.882,W,0.00,0.00,190510,,*10 +$GPGGA,143013.000,4531.922,N,12255.882,W,1,00,0.0,52.000,M,0.0,M,,*44 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143015.000,A,4531.921,N,12255.883,W,0.00,0.00,190510,,*14 +$GPGGA,143015.000,4531.921,N,12255.883,W,1,00,0.0,52.000,M,0.0,M,,*40 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143017.000,A,4531.919,N,12255.884,W,0.00,0.00,190510,,*1A +$GPGGA,143017.000,4531.919,N,12255.884,W,1,00,0.0,52.000,M,0.0,M,,*4E +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143022.000,A,4531.916,N,12255.886,W,0.00,0.00,190510,,*11 +$GPGGA,143022.000,4531.916,N,12255.886,W,1,00,0.0,53.000,M,0.0,M,,*44 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143026.000,A,4531.914,N,12255.888,W,0.00,0.00,190510,,*19 +$GPGGA,143026.000,4531.914,N,12255.888,W,1,00,0.0,54.000,M,0.0,M,,*4B +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143030.000,A,4531.912,N,12255.890,W,0.00,0.00,190510,,*11 +$GPGGA,143030.000,4531.912,N,12255.890,W,1,00,0.0,55.000,M,0.0,M,,*42 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143045.000,A,4531.900,N,12255.898,W,0.00,0.00,190510,,*18 +$GPGGA,143045.000,4531.900,N,12255.898,W,1,00,0.0,55.000,M,0.0,M,,*4B +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143103.000,A,4531.881,N,12255.907,W,0.00,0.00,190510,,*14 +$GPGGA,143103.000,4531.881,N,12255.907,W,1,00,0.0,48.000,M,0.0,M,,*4B +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143119.000,A,4531.866,N,12255.908,W,0.00,0.00,190510,,*19 +$GPGGA,143119.000,4531.866,N,12255.908,W,1,00,0.0,45.000,M,0.0,M,,*4B +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143121.000,A,4531.864,N,12255.906,W,0.00,0.00,190510,,*1E +$GPGGA,143121.000,4531.864,N,12255.906,W,1,00,0.0,45.000,M,0.0,M,,*4C +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143123.000,A,4531.862,N,12255.906,W,0.00,0.00,190510,,*1A +$GPGGA,143123.000,4531.862,N,12255.906,W,1,00,0.0,46.000,M,0.0,M,,*4B +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143126.000,A,4531.861,N,12255.905,W,0.00,0.00,190510,,*1F +$GPGGA,143126.000,4531.861,N,12255.905,W,1,00,0.0,47.000,M,0.0,M,,*4F +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143138.000,A,4531.852,N,12255.906,W,0.00,0.00,190510,,*13 +$GPGGA,143138.000,4531.852,N,12255.906,W,1,00,0.0,49.000,M,0.0,M,,*4D +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143145.000,A,4531.849,N,12255.907,W,0.00,0.00,190510,,*12 +$GPGGA,143145.000,4531.849,N,12255.907,W,1,00,0.0,50.000,M,0.0,M,,*44 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143149.000,A,4531.846,N,12255.907,W,0.00,0.00,190510,,*11 +$GPGGA,143149.000,4531.846,N,12255.907,W,1,00,0.0,50.000,M,0.0,M,,*47 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143151.000,A,4531.844,N,12255.908,W,0.00,0.00,190510,,*15 +$GPGGA,143151.000,4531.844,N,12255.908,W,1,00,0.0,51.000,M,0.0,M,,*42 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143156.000,A,4531.842,N,12255.908,W,0.00,0.00,190510,,*14 +$GPGGA,143156.000,4531.842,N,12255.908,W,1,00,0.0,51.000,M,0.0,M,,*43 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143158.000,A,4531.840,N,12255.908,W,0.00,0.00,190510,,*18 +$GPGGA,143158.000,4531.840,N,12255.908,W,1,00,0.0,51.000,M,0.0,M,,*4F +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143201.000,A,4531.837,N,12255.908,W,0.00,0.00,190510,,*17 +$GPGGA,143201.000,4531.837,N,12255.908,W,1,00,0.0,51.000,M,0.0,M,,*40 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143204.000,A,4531.834,N,12255.909,W,0.00,0.00,190510,,*10 +$GPGGA,143204.000,4531.834,N,12255.909,W,1,00,0.0,52.000,M,0.0,M,,*44 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143206.000,A,4531.830,N,12255.909,W,0.00,0.00,190510,,*16 +$GPGGA,143206.000,4531.830,N,12255.909,W,1,00,0.0,53.000,M,0.0,M,,*43 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143208.000,A,4531.828,N,12255.908,W,0.00,0.00,190510,,*10 +$GPGGA,143208.000,4531.828,N,12255.908,W,1,00,0.0,54.000,M,0.0,M,,*42 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143212.000,A,4531.823,N,12255.908,W,0.00,0.00,190510,,*10 +$GPGGA,143212.000,4531.823,N,12255.908,W,1,00,0.0,54.000,M,0.0,M,,*42 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143215.000,A,4531.820,N,12255.907,W,0.00,0.00,190510,,*1B +$GPGGA,143215.000,4531.820,N,12255.907,W,1,00,0.0,53.000,M,0.0,M,,*4E +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143217.000,A,4531.818,N,12255.906,W,0.00,0.00,190510,,*13 +$GPGGA,143217.000,4531.818,N,12255.906,W,1,00,0.0,53.000,M,0.0,M,,*46 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143224.000,A,4531.811,N,12255.903,W,0.00,0.00,190510,,*1F +$GPGGA,143224.000,4531.811,N,12255.903,W,1,00,0.0,53.000,M,0.0,M,,*4A +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143231.000,A,4531.806,N,12255.900,W,0.00,0.00,190510,,*1E +$GPGGA,143231.000,4531.806,N,12255.900,W,1,00,0.0,54.000,M,0.0,M,,*4C +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143234.000,A,4531.804,N,12255.899,W,0.00,0.00,190510,,*18 +$GPGGA,143234.000,4531.804,N,12255.899,W,1,00,0.0,54.000,M,0.0,M,,*4A +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143238.000,A,4531.799,N,12255.899,W,0.00,0.00,190510,,*1F +$GPGGA,143238.000,4531.799,N,12255.899,W,1,00,0.0,55.000,M,0.0,M,,*4C +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143241.000,A,4531.796,N,12255.898,W,0.00,0.00,190510,,*1F +$GPGGA,143241.000,4531.796,N,12255.898,W,1,00,0.0,56.000,M,0.0,M,,*4F +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143243.000,A,4531.793,N,12255.898,W,0.00,0.00,190510,,*18 +$GPGGA,143243.000,4531.793,N,12255.898,W,1,00,0.0,57.000,M,0.0,M,,*49 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143253.000,A,4531.786,N,12255.892,W,0.00,0.00,190510,,*17 +$GPGGA,143253.000,4531.786,N,12255.892,W,1,00,0.0,57.000,M,0.0,M,,*46 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143255.000,A,4531.786,N,12255.887,W,0.00,0.00,190510,,*15 +$GPGGA,143255.000,4531.786,N,12255.887,W,1,00,0.0,59.000,M,0.0,M,,*4A +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143258.000,A,4531.786,N,12255.882,W,0.00,0.00,190510,,*1D +$GPGGA,143258.000,4531.786,N,12255.882,W,1,00,0.0,59.000,M,0.0,M,,*42 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143301.000,A,4531.786,N,12255.876,W,0.00,0.00,190510,,*1B +$GPGGA,143301.000,4531.786,N,12255.876,W,1,00,0.0,60.000,M,0.0,M,,*4E +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143305.000,A,4531.788,N,12255.867,W,0.00,0.00,190510,,*11 +$GPGGA,143305.000,4531.788,N,12255.867,W,1,00,0.0,60.000,M,0.0,M,,*44 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143307.000,A,4531.790,N,12255.864,W,0.00,0.00,190510,,*19 +$GPGGA,143307.000,4531.790,N,12255.864,W,1,00,0.0,60.000,M,0.0,M,,*4C +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143309.000,A,4531.791,N,12255.861,W,0.00,0.00,190510,,*13 +$GPGGA,143309.000,4531.791,N,12255.861,W,1,00,0.0,61.000,M,0.0,M,,*47 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143311.000,A,4531.791,N,12255.861,W,0.00,0.00,190510,,*1A +$GPGGA,143311.000,4531.791,N,12255.861,W,1,00,0.0,61.000,M,0.0,M,,*4E +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143349.000,A,4531.797,N,12255.868,W,0.00,0.00,190510,,*18 +$GPGGA,143349.000,4531.797,N,12255.868,W,1,00,0.0,65.000,M,0.0,M,,*48 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143357.000,A,4531.797,N,12255.868,W,0.00,0.00,190510,,*17 +$GPGGA,143357.000,4531.797,N,12255.868,W,1,00,0.0,65.000,M,0.0,M,,*47 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143421.000,A,4531.795,N,12255.863,W,0.00,0.00,190510,,*18 +$GPGGA,143421.000,4531.795,N,12255.863,W,1,00,0.0,60.000,M,0.0,M,,*4D +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143425.000,A,4531.793,N,12255.862,W,0.00,0.00,190510,,*1B +$GPGGA,143425.000,4531.793,N,12255.862,W,1,00,0.0,61.000,M,0.0,M,,*4F +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143428.000,A,4531.793,N,12255.862,W,0.00,0.00,190510,,*16 +$GPGGA,143428.000,4531.793,N,12255.862,W,1,00,0.0,61.000,M,0.0,M,,*42 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143530.000,A,4531.796,N,12255.864,W,0.00,0.00,190510,,*1D +$GPGGA,143530.000,4531.796,N,12255.864,W,1,00,0.0,57.000,M,0.0,M,,*4C +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143532.000,A,4531.796,N,12255.867,W,0.00,0.00,190510,,*1C +$GPGGA,143532.000,4531.796,N,12255.867,W,1,00,0.0,53.000,M,0.0,M,,*49 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143535.000,A,4531.796,N,12255.870,W,0.00,0.00,190510,,*1D +$GPGGA,143535.000,4531.796,N,12255.870,W,1,00,0.0,52.000,M,0.0,M,,*49 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143539.000,A,4531.796,N,12255.873,W,0.00,0.00,190510,,*12 +$GPGGA,143539.000,4531.796,N,12255.873,W,1,00,0.0,50.000,M,0.0,M,,*44 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143540.000,A,4531.796,N,12255.873,W,0.00,0.00,190510,,*1C +$GPGGA,143540.000,4531.796,N,12255.873,W,1,00,0.0,50.000,M,0.0,M,,*4A +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143600.000,A,4531.793,N,12255.871,W,0.00,0.00,190510,,*1C +$GPGGA,143600.000,4531.793,N,12255.871,W,1,00,0.0,53.000,M,0.0,M,,*49 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143606.000,A,4531.793,N,12255.862,W,0.00,0.00,190510,,*18 +$GPGGA,143606.000,4531.793,N,12255.862,W,1,00,0.0,53.000,M,0.0,M,,*4D +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143608.000,A,4531.793,N,12255.859,W,0.00,0.00,190510,,*1E +$GPGGA,143608.000,4531.793,N,12255.859,W,1,00,0.0,52.000,M,0.0,M,,*4A +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143610.000,A,4531.793,N,12255.856,W,0.00,0.00,190510,,*18 +$GPGGA,143610.000,4531.793,N,12255.856,W,1,00,0.0,52.000,M,0.0,M,,*4C +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143613.000,A,4531.792,N,12255.853,W,0.00,0.00,190510,,*1F +$GPGGA,143613.000,4531.792,N,12255.853,W,1,00,0.0,51.000,M,0.0,M,,*48 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143617.000,A,4531.792,N,12255.850,W,0.00,0.00,190510,,*18 +$GPGGA,143617.000,4531.792,N,12255.850,W,1,00,0.0,49.000,M,0.0,M,,*46 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143625.000,A,4531.793,N,12255.847,W,0.00,0.00,190510,,*1E +$GPGGA,143625.000,4531.793,N,12255.847,W,1,00,0.0,47.000,M,0.0,M,,*4E +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143714.000,A,4531.799,N,12255.838,W,0.00,0.00,190510,,*1F +$GPGGA,143714.000,4531.799,N,12255.838,W,1,00,0.0,43.000,M,0.0,M,,*4B +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143718.000,A,4531.799,N,12255.838,W,0.00,0.00,190510,,*13 +$GPGGA,143718.000,4531.799,N,12255.838,W,1,00,0.0,43.000,M,0.0,M,,*47 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143749.000,A,4531.802,N,12255.843,W,0.00,0.00,190510,,*16 +$GPGGA,143749.000,4531.802,N,12255.843,W,1,00,0.0,56.000,M,0.0,M,,*46 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143754.000,A,4531.802,N,12255.843,W,0.00,0.00,190510,,*1A +$GPGGA,143754.000,4531.802,N,12255.843,W,1,00,0.0,56.000,M,0.0,M,,*4A +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143859.000,A,4531.795,N,12255.849,W,0.00,0.00,190510,,*13 +$GPGGA,143859.000,4531.795,N,12255.849,W,1,00,0.0,52.000,M,0.0,M,,*47 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143901.000,A,4531.790,N,12255.862,W,0.00,0.00,190510,,*13 +$GPGGA,143901.000,4531.790,N,12255.862,W,1,00,0.0,52.000,M,0.0,M,,*47 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143903.000,A,4531.787,N,12255.882,W,0.00,0.00,190510,,*19 +$GPGGA,143903.000,4531.787,N,12255.882,W,1,00,0.0,52.000,M,0.0,M,,*4D +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143905.000,A,4531.783,N,12255.908,W,0.00,0.00,190510,,*18 +$GPGGA,143905.000,4531.783,N,12255.908,W,1,00,0.0,53.000,M,0.0,M,,*4D +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143907.000,A,4531.779,N,12255.935,W,0.00,0.00,190510,,*11 +$GPGGA,143907.000,4531.779,N,12255.935,W,1,00,0.0,53.000,M,0.0,M,,*44 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143909.000,A,4531.773,N,12255.963,W,0.00,0.00,190510,,*16 +$GPGGA,143909.000,4531.773,N,12255.963,W,1,00,0.0,53.000,M,0.0,M,,*43 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143912.000,A,4531.768,N,12255.992,W,0.00,0.00,190510,,*18 +$GPGGA,143912.000,4531.768,N,12255.992,W,1,00,0.0,54.000,M,0.0,M,,*4A +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143914.000,A,4531.761,N,12256.023,W,0.00,0.00,190510,,*17 +$GPGGA,143914.000,4531.761,N,12256.023,W,1,00,0.0,54.000,M,0.0,M,,*45 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143916.000,A,4531.754,N,12256.055,W,0.00,0.00,190510,,*12 +$GPGGA,143916.000,4531.754,N,12256.055,W,1,00,0.0,54.000,M,0.0,M,,*40 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143918.000,A,4531.747,N,12256.089,W,0.00,0.00,190510,,*1F +$GPGGA,143918.000,4531.747,N,12256.089,W,1,00,0.0,55.000,M,0.0,M,,*4C +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143920.000,A,4531.740,N,12256.122,W,0.00,0.00,190510,,*13 +$GPGGA,143920.000,4531.740,N,12256.122,W,1,00,0.0,55.000,M,0.0,M,,*40 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143924.000,A,4531.728,N,12256.182,W,0.00,0.00,190510,,*13 +$GPGGA,143924.000,4531.728,N,12256.182,W,1,00,0.0,57.000,M,0.0,M,,*42 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143927.000,A,4531.719,N,12256.230,W,0.00,0.00,190510,,*18 +$GPGGA,143927.000,4531.719,N,12256.230,W,1,00,0.0,58.000,M,0.0,M,,*46 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143929.000,A,4531.713,N,12256.266,W,0.00,0.00,190510,,*1F +$GPGGA,143929.000,4531.713,N,12256.266,W,1,00,0.0,58.000,M,0.0,M,,*41 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143933.000,A,4531.702,N,12256.337,W,0.00,0.00,190510,,*11 +$GPGGA,143933.000,4531.702,N,12256.337,W,1,00,0.0,59.000,M,0.0,M,,*4E +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143935.000,A,4531.698,N,12256.371,W,0.00,0.00,190510,,*17 +$GPGGA,143935.000,4531.698,N,12256.371,W,1,00,0.0,60.000,M,0.0,M,,*42 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143937.000,A,4531.693,N,12256.404,W,0.00,0.00,190510,,*1B +$GPGGA,143937.000,4531.693,N,12256.404,W,1,00,0.0,60.000,M,0.0,M,,*4E +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143941.000,A,4531.682,N,12256.464,W,0.00,0.00,190510,,*1C +$GPGGA,143941.000,4531.682,N,12256.464,W,1,00,0.0,60.000,M,0.0,M,,*49 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143946.000,A,4531.672,N,12256.522,W,0.00,0.00,190510,,*17 +$GPGGA,143946.000,4531.672,N,12256.522,W,1,00,0.0,60.000,M,0.0,M,,*42 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143948.000,A,4531.667,N,12256.551,W,0.00,0.00,190510,,*19 +$GPGGA,143948.000,4531.667,N,12256.551,W,1,00,0.0,60.000,M,0.0,M,,*4C +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143951.000,A,4531.657,N,12256.601,W,0.00,0.00,190510,,*14 +$GPGGA,143951.000,4531.657,N,12256.601,W,1,00,0.0,61.000,M,0.0,M,,*40 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143954.000,A,4531.651,N,12256.625,W,0.00,0.00,190510,,*11 +$GPGGA,143954.000,4531.651,N,12256.625,W,1,00,0.0,61.000,M,0.0,M,,*45 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143956.000,A,4531.646,N,12256.651,W,0.00,0.00,190510,,*16 +$GPGGA,143956.000,4531.646,N,12256.651,W,1,00,0.0,61.000,M,0.0,M,,*42 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,143959.000,A,4531.642,N,12256.668,W,0.00,0.00,190510,,*17 +$GPGGA,143959.000,4531.642,N,12256.668,W,1,00,0.0,61.000,M,0.0,M,,*43 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144001.000,A,4531.638,N,12256.683,W,0.00,0.00,190510,,*1C +$GPGGA,144001.000,4531.638,N,12256.683,W,1,00,0.0,61.000,M,0.0,M,,*48 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144003.000,A,4531.635,N,12256.697,W,0.00,0.00,190510,,*16 +$GPGGA,144003.000,4531.635,N,12256.697,W,1,00,0.0,61.000,M,0.0,M,,*42 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144005.000,A,4531.632,N,12256.710,W,0.00,0.00,190510,,*19 +$GPGGA,144005.000,4531.632,N,12256.710,W,1,00,0.0,62.000,M,0.0,M,,*4E +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144007.000,A,4531.629,N,12256.723,W,0.00,0.00,190510,,*11 +$GPGGA,144007.000,4531.629,N,12256.723,W,1,00,0.0,63.000,M,0.0,M,,*47 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144009.000,A,4531.627,N,12256.735,W,0.00,0.00,190510,,*16 +$GPGGA,144009.000,4531.627,N,12256.735,W,1,00,0.0,63.000,M,0.0,M,,*40 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144011.000,A,4531.625,N,12256.746,W,0.00,0.00,190510,,*19 +$GPGGA,144011.000,4531.625,N,12256.746,W,1,00,0.0,63.000,M,0.0,M,,*4F +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144014.000,A,4531.623,N,12256.755,W,0.00,0.00,190510,,*18 +$GPGGA,144014.000,4531.623,N,12256.755,W,1,00,0.0,63.000,M,0.0,M,,*4E +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144016.000,A,4531.621,N,12256.760,W,0.00,0.00,190510,,*1E +$GPGGA,144016.000,4531.621,N,12256.760,W,1,00,0.0,64.000,M,0.0,M,,*4F +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144018.000,A,4531.620,N,12256.763,W,0.00,0.00,190510,,*12 +$GPGGA,144018.000,4531.620,N,12256.763,W,1,00,0.0,64.000,M,0.0,M,,*43 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144033.000,A,4531.625,N,12256.764,W,0.00,0.00,190510,,*19 +$GPGGA,144033.000,4531.625,N,12256.764,W,1,00,0.0,69.000,M,0.0,M,,*45 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144051.000,A,4531.629,N,12256.765,W,0.00,0.00,190510,,*10 +$GPGGA,144051.000,4531.629,N,12256.765,W,1,00,0.0,68.000,M,0.0,M,,*4D +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144159.000,A,4531.634,N,12256.754,W,0.00,0.00,190510,,*17 +$GPGGA,144159.000,4531.634,N,12256.754,W,1,00,0.0,64.000,M,0.0,M,,*46 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144210.000,A,4531.636,N,12256.742,W,0.00,0.00,190510,,*1C +$GPGGA,144210.000,4531.636,N,12256.742,W,1,00,0.0,64.000,M,0.0,M,,*4D +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144212.000,A,4531.642,N,12256.739,W,0.00,0.00,190510,,*11 +$GPGGA,144212.000,4531.642,N,12256.739,W,1,00,0.0,65.000,M,0.0,M,,*41 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144218.000,A,4531.654,N,12256.738,W,0.00,0.00,190510,,*1D +$GPGGA,144218.000,4531.654,N,12256.738,W,1,00,0.0,65.000,M,0.0,M,,*4D +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144222.000,A,4531.669,N,12256.746,W,0.00,0.00,190510,,*13 +$GPGGA,144222.000,4531.669,N,12256.746,W,1,00,0.0,65.000,M,0.0,M,,*43 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144230.000,A,4531.690,N,12256.761,W,0.00,0.00,190510,,*13 +$GPGGA,144230.000,4531.690,N,12256.761,W,1,00,0.0,64.000,M,0.0,M,,*42 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144237.000,A,4531.705,N,12256.773,W,0.00,0.00,190510,,*1A +$GPGGA,144237.000,4531.705,N,12256.773,W,1,00,0.0,64.000,M,0.0,M,,*4B +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144242.000,A,4531.735,N,12256.790,W,0.00,0.00,190510,,*16 +$GPGGA,144242.000,4531.735,N,12256.790,W,1,00,0.0,62.000,M,0.0,M,,*41 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144247.000,A,4531.767,N,12256.794,W,0.00,0.00,190510,,*10 +$GPGGA,144247.000,4531.767,N,12256.794,W,1,00,0.0,61.000,M,0.0,M,,*44 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144252.000,A,4531.806,N,12256.793,W,0.00,0.00,190510,,*1B +$GPGGA,144252.000,4531.806,N,12256.793,W,1,00,0.0,61.000,M,0.0,M,,*4F +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144258.000,A,4531.838,N,12256.790,W,0.00,0.00,190510,,*1F +$GPGGA,144258.000,4531.838,N,12256.790,W,1,00,0.0,61.000,M,0.0,M,,*4B +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144303.000,A,4531.858,N,12256.787,W,0.00,0.00,190510,,*10 +$GPGGA,144303.000,4531.858,N,12256.787,W,1,00,0.0,61.000,M,0.0,M,,*44 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144306.000,A,4531.863,N,12256.783,W,0.00,0.00,190510,,*19 +$GPGGA,144306.000,4531.863,N,12256.783,W,1,00,0.0,61.000,M,0.0,M,,*4D +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144308.000,A,4531.876,N,12256.786,W,0.00,0.00,190510,,*16 +$GPGGA,144308.000,4531.876,N,12256.786,W,1,00,0.0,60.000,M,0.0,M,,*43 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144312.000,A,4531.894,N,12256.789,W,0.00,0.00,190510,,*1E +$GPGGA,144312.000,4531.894,N,12256.789,W,1,00,0.0,60.000,M,0.0,M,,*4B +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144314.000,A,4531.899,N,12256.792,W,0.00,0.00,190510,,*1F +$GPGGA,144314.000,4531.899,N,12256.792,W,1,00,0.0,60.000,M,0.0,M,,*4A +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144316.000,A,4531.905,N,12256.793,W,0.00,0.00,190510,,*18 +$GPGGA,144316.000,4531.905,N,12256.793,W,1,00,0.0,60.000,M,0.0,M,,*4D +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144320.000,A,4531.914,N,12256.795,W,0.00,0.00,190510,,*1B +$GPGGA,144320.000,4531.914,N,12256.795,W,1,00,0.0,60.000,M,0.0,M,,*4E +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144327.000,A,4531.908,N,12256.797,W,0.00,0.00,190510,,*13 +$GPGGA,144327.000,4531.908,N,12256.797,W,1,00,0.0,60.000,M,0.0,M,,*46 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144329.000,A,4531.913,N,12256.797,W,0.00,0.00,190510,,*17 +$GPGGA,144329.000,4531.913,N,12256.797,W,1,00,0.0,55.000,M,0.0,M,,*44 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144331.000,A,4531.918,N,12256.798,W,0.00,0.00,190510,,*1A +$GPGGA,144331.000,4531.918,N,12256.798,W,1,00,0.0,55.000,M,0.0,M,,*49 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144335.000,A,4531.924,N,12256.798,W,0.00,0.00,190510,,*11 +$GPGGA,144335.000,4531.924,N,12256.798,W,1,00,0.0,55.000,M,0.0,M,,*42 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144337.000,A,4531.926,N,12256.798,W,0.00,0.00,190510,,*11 +$GPGGA,144337.000,4531.926,N,12256.798,W,1,00,0.0,55.000,M,0.0,M,,*42 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144345.000,A,4531.924,N,12256.797,W,0.00,0.00,190510,,*19 +$GPGGA,144345.000,4531.924,N,12256.797,W,1,00,0.0,55.000,M,0.0,M,,*4A +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144353.000,A,4531.924,N,12256.797,W,0.00,0.00,190510,,*1E +$GPGGA,144353.000,4531.924,N,12256.797,W,1,00,0.0,55.000,M,0.0,M,,*4D +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144701.000,A,4532.540,N,12257.557,W,0.00,0.00,190510,,*1F +$GPGGA,144701.000,4532.540,N,12257.557,W,1,00,0.0,58.000,M,0.0,M,,*41 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144704.000,A,4532.548,N,12257.557,W,0.00,0.00,190510,,*12 +$GPGGA,144704.000,4532.548,N,12257.557,W,1,00,0.0,56.000,M,0.0,M,,*42 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144707.000,A,4532.553,N,12257.557,W,0.00,0.00,190510,,*1B +$GPGGA,144707.000,4532.553,N,12257.557,W,1,00,0.0,55.000,M,0.0,M,,*48 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144709.000,A,4532.558,N,12257.556,W,0.00,0.00,190510,,*1F +$GPGGA,144709.000,4532.558,N,12257.556,W,1,00,0.0,54.000,M,0.0,M,,*4D +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144711.000,A,4532.559,N,12257.556,W,0.00,0.00,190510,,*17 +$GPGGA,144711.000,4532.559,N,12257.556,W,1,00,0.0,54.000,M,0.0,M,,*45 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144726.000,A,4532.568,N,12257.553,W,0.00,0.00,190510,,*14 +$GPGGA,144726.000,4532.568,N,12257.553,W,1,00,0.0,56.000,M,0.0,M,,*44 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144728.000,A,4532.571,N,12257.553,W,0.00,0.00,190510,,*12 +$GPGGA,144728.000,4532.571,N,12257.553,W,1,00,0.0,56.000,M,0.0,M,,*42 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144729.000,A,4532.571,N,12257.553,W,0.00,0.00,190510,,*13 +$GPGGA,144729.000,4532.571,N,12257.553,W,1,00,0.0,56.000,M,0.0,M,,*43 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144734.000,A,4532.584,N,12257.561,W,0.00,0.00,190510,,*14 +$GPGGA,144734.000,4532.584,N,12257.561,W,1,00,0.0,60.000,M,0.0,M,,*41 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144738.000,A,4532.584,N,12257.561,W,0.00,0.00,190510,,*18 +$GPGGA,144738.000,4532.584,N,12257.561,W,1,00,0.0,60.000,M,0.0,M,,*4D +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144747.000,A,4532.589,N,12257.565,W,0.00,0.00,190510,,*19 +$GPGGA,144747.000,4532.589,N,12257.565,W,1,00,0.0,61.000,M,0.0,M,,*4D +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144749.000,A,4532.591,N,12257.567,W,0.00,0.00,190510,,*1C +$GPGGA,144749.000,4532.591,N,12257.567,W,1,00,0.0,61.000,M,0.0,M,,*48 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144754.000,A,4532.602,N,12257.571,W,0.00,0.00,190510,,*1E +$GPGGA,144754.000,4532.602,N,12257.571,W,1,00,0.0,62.000,M,0.0,M,,*49 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144757.000,A,4532.606,N,12257.573,W,0.00,0.00,190510,,*1B +$GPGGA,144757.000,4532.606,N,12257.573,W,1,00,0.0,62.000,M,0.0,M,,*4C +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144800.000,A,4532.610,N,12257.574,W,0.00,0.00,190510,,*16 +$GPGGA,144800.000,4532.610,N,12257.574,W,1,00,0.0,62.000,M,0.0,M,,*41 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144804.000,A,4532.613,N,12257.574,W,0.00,0.00,190510,,*11 +$GPGGA,144804.000,4532.613,N,12257.574,W,1,00,0.0,67.000,M,0.0,M,,*43 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144806.000,A,4532.617,N,12257.576,W,0.00,0.00,190510,,*15 +$GPGGA,144806.000,4532.617,N,12257.576,W,1,00,0.0,67.000,M,0.0,M,,*47 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144809.000,A,4532.623,N,12257.578,W,0.00,0.00,190510,,*13 +$GPGGA,144809.000,4532.623,N,12257.578,W,1,00,0.0,68.000,M,0.0,M,,*4E +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144813.000,A,4532.631,N,12257.581,W,0.00,0.00,190510,,*1D +$GPGGA,144813.000,4532.631,N,12257.581,W,1,00,0.0,68.000,M,0.0,M,,*40 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144817.000,A,4532.637,N,12257.584,W,0.00,0.00,190510,,*1A +$GPGGA,144817.000,4532.637,N,12257.584,W,1,00,0.0,68.000,M,0.0,M,,*47 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144823.000,A,4532.642,N,12257.591,W,0.00,0.00,190510,,*1B +$GPGGA,144823.000,4532.642,N,12257.591,W,1,00,0.0,69.000,M,0.0,M,,*47 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144827.000,A,4532.640,N,12257.595,W,0.00,0.00,190510,,*19 +$GPGGA,144827.000,4532.640,N,12257.595,W,1,00,0.0,70.000,M,0.0,M,,*4D +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144830.000,A,4532.635,N,12257.597,W,0.00,0.00,190510,,*1F +$GPGGA,144830.000,4532.635,N,12257.597,W,1,00,0.0,70.000,M,0.0,M,,*4B +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144834.000,A,4532.634,N,12257.598,W,0.00,0.00,190510,,*15 +$GPGGA,144834.000,4532.634,N,12257.598,W,1,00,0.0,70.000,M,0.0,M,,*41 +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 +$GPRMC,144838.000,A,4532.634,N,12257.598,W,0.00,0.00,190510,,*19 +$GPGGA,144838.000,4532.634,N,12257.598,W,1,00,0.0,70.000,M,0.0,M,,*4D +$GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32 diff --git a/packaging/navit.changes b/packaging/navit.changes new file mode 100644 index 0000000..9068a66 --- /dev/null +++ b/packaging/navit.changes @@ -0,0 +1,49 @@ +* Thu Jul 12 18:54:29 UTC 2012 - tracy.graydon@intel.com +- Fix broken dependencies: TZIVI-214 + +* Fri May 06 2011 Jimmy Huang - 0.2.0 +- Fixed BMC#7218 - Add support for gypsy vehicle + +* Tue Apr 26 2011 Jimmy Huang - 0.2.0 +- Added patch to switch from gtk graphics backend to qpainter for faster performance +- Fixed BMC#16446 - Sometimes navit takes >16 seconds to launch +- Fixed BMC#16447 - Navit takes 8~9 seconds to switch from Menu to Map +- Fixed BMC#16449 - No default position in Navit(for demo) + +* Fri Apr 15 2011 Jimmy Huang - 0.2.0 +- Re-packaged with to version 0.2.0 from upstream +- Downgrade to version 0.2.0 since the old version was wrong, should've been 0.1.0 +- Added patch to fix build issue with the shipped moc file +- Added patch to center map to Portland, OR +- Added patch to route TTS to Festival engine +- Added patch to create a custom layout with OSD display +- Added patch to fix POI icons now showing up on maps +- Removed existing patches on webtracker, contacts, twitter used for demo + +* Thu Apr 22 2010 Todd Brandt - 1.1.0 +- Added a fix for the libfontcache crash in meego +- updated the gps demo data +- Added a demo mode for webtrack for when no net is available +- Added webtrackuser script which setups twitter username + +* Wed Sep 16 2009 Todd Brandt - 1.1.0 +- Added webtracker capabilities for twitter geolocation + +* Wed Aug 19 2009 Todd Brandt - 1.1.0 +- Added fix to contacts map, entries are now synced with what's + in EDS on navit start. + +* Mon Jul 27 2009 Todd Brandt - 1.1.0 +- upgrade to Navit 1.1.0 + +* Wed Jul 1 2009 Todd Brandt - 0.1.0-1 +- Added Lilli Szfranski's Changes for GPS simulation and contacts + +* Mon Mar 30 2009 Jimmy Huang - 0.1.0-1 +- Initial import. + +* Sun Nov 30 2008 Fabian Affolter - 0.1.0-1 +- Updated to 0.1.0 + +* Sat Nov 01 2008 Fabian Affolter - 0.0.4-1 +- Initial package for Fedora diff --git a/packaging/navit.spec b/packaging/navit.spec new file mode 100644 index 0000000..1fa3b4d --- /dev/null +++ b/packaging/navit.spec @@ -0,0 +1,119 @@ +%define buildwayland 1 +%if %{buildwayland} +%define backend -wayland +%else +%define backend -xlib +%endif + +Name: navit +Version: 0.5.0 +Release: 1%{?dist} +Summary: Car navigation system with routing engine + +Group: Applications/Productivity +License: GPL +URL: http://navit.sourceforge.net/ +Source0: http://download.navit-project.org/navit/src/svn/navit-svn-4936.tar.gz +Source1: gpsdata.nmea + +# Patch configure to build against updated Qt backends +Patch1: 0001-fix-build-issues-with-qt-backend.patch +# fixes upstream bug on undefined symbol error +Patch2: 0002-fix-undefined-symbol-error.patch +# Change map center to Oregon +Patch3: 0003-center-map.patch +# Demo GPS nmea log near Hillsboro, Oregon +Patch4: 0004-connect-demo-gps-nmea-log.patch +# Edit navit.xml to default to qt backend +Patch5: 0005-defaults-to-qt-backend.patch +# Edit navit.xml to load a customized UI and add demo gps +Patch6: 0006-custom-layout.patch +# Change the default icon size for large displays to use 96x96 png icons, work-around for TDIS-115 +Patch7: 0007-increase_icon_size_patch + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +BuildRequires: pkgconfig(dbus-glib-1) +BuildRequires: pkgconfig(glib-2.0) +BuildRequires: pkgconfig(gconf-2.0) +BuildRequires: pkgconfig(fontconfig) +BuildRequires: pkgconfig(freetype2) +BuildRequires: pkgconfig(libgps) +BuildRequires: pkgconfig(QtCore) +BuildRequires: pkgconfig(xpm) +BuildRequires: desktop-file-utils +BuildRequires: gettext-devel +BuildRequires: libjpeg-devel +BuildRequires: python-devel + +Requires: dbus +Requires: dbus-glib +Requires: gpsd + +%description +Navit is modular design is capable of using vector maps of various formats +for routing and rendering of the displayed map. It's even possible to use +multiple maps at a time. +The GTK+ or SDL user interfaces are designed to work well with touch screen +displays. Points of Interest of various formats are displayed on the map. +The current vehicle position is either read from gpsd or directly from NMEA +GPS sensors. +The routing engine not only calculates an optimal route to your destination, +but also generates directions and even speaks to you using speechd. + +%prep +%setup -q -n navit-%{version} +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 + +# get rid of moc files +find . -name '*.moc' -delete + +%build +autoreconf -fi +export PATH=%{_libdir}/qt4/bin:$PATH +%configure --disable-graphics-gtk-drawing-area \ + --enable-graphics-qt-qpainter \ + --enable-binding-dbus \ + --disable-samplemap +make %{?_smp_mflags} + + +%install +rm -rf %{buildroot} +make install DESTDIR=%{buildroot} +find %{buildroot} -name '*.la' -exec rm -f {} ';' +%find_lang navit +desktop-file-install \ + --delete-original \ + --add-category="Geography;" \ + --dir=%{buildroot}%{_datadir}/applications \ + %{buildroot}/%{_datadir}/applications/navit.desktop + +install -m 644 %{SOURCE1} $RPM_BUILD_ROOT/%{_datadir}/navit/ +# installed scaled png files +install -m 644 navit/xpm/*.png $RPM_BUILD_ROOT/%{_datadir}/navit/xpm/ + +%clean +rm -rf %{buildroot} + +%files -f navit.lang +%defattr(-,root,root) +%{_bindir}/navit +%{_bindir}/maptool +%dir %{_libdir}/navit +%{_libdir}/navit/* +%{_datadir}/applications/navit.desktop +%{_datadir}/icons/hicolor/22x22/apps/navit.png +%{_datadir}/icons/hicolor/128x128/apps/navit.png +%dir %{_datadir}/navit +%{_datadir}/navit/* +%_mandir/man1/* +%{_datadir}/dbus-1/services/*.service +%dir /usr/share/locale/jv +/usr/share/locale/jv/* +%{_datadir}/navit/gpsdata.nmea diff --git a/po/Makefile.am b/po/Makefile.am new file mode 100644 index 0000000..5ae7bad --- /dev/null +++ b/po/Makefile.am @@ -0,0 +1,85 @@ +CATALOGS = @MOFILES@ + +CLEANFILES = $(CATALOGS) navit.pot + +# keep this sorted +EXTRA_DIST = @POIFILES@ + +POTFILES = \ + $(top_srcdir)/navit/main.c \ + $(top_srcdir)/navit/navigation.c \ + $(top_srcdir)/navit/navit.c \ + $(top_srcdir)/navit/popup.c \ + $(top_srcdir)/navit/country.c \ + $(top_srcdir)/navit/gui/gtk/destination.c \ + $(top_srcdir)/navit/gui/gtk/gui_gtk_action.c \ + $(top_srcdir)/navit/gui/gtk/gui_gtk_statusbar.c \ + $(top_srcdir)/navit/gui/internal/gui_internal.c \ + $(top_srcdir)/navit/osd/core/osd_core.c \ + $(top_builddir)/navit/navit_shipped.c + +if XGETTEXT_GLADE +POTFILES += $(top_builddir)/navit/navit_shipped.glade +endif + + +SUFFIXES = .po .mo + +.po.mo: + dir=`basename $@ .mo` ;\ + $(MSGFMT) --check --verbose --statistics --output-file=$@ $< && \ + mkdir -p ../locale/$$dir/LC_MESSAGES && \ + cp $@ ../locale/$$dir/LC_MESSAGES/navit.mo + +all: @MOFILES@ + +# Trick gettext to get translateable strings out of navit_shipped.xml + +$(top_builddir)/navit/navit_shipped.glade: $(top_srcdir)/navit/navit_shipped.xml + sed -e "s/vehicleprofile/atkaction/" -e "s/name=/description=/" -e 's/$(top_builddir)/navit/navit_shipped.glade + +$(top_builddir)/navit/navit_shipped.c: $(top_srcdir)/navit/navit_shipped.xml + sed -e 's/|//g' -e 's/^/|/' -e 's/$$/|/' -e 's/\(_("[^"]*")\)/| \1; |/g' -e 's/|[^|]*|//g' <$(top_srcdir)/navit/navit_shipped.xml >$(top_builddir)/navit/navit_shipped.c + +@POFILES@: navit.pot + sed 's/^"Project-Id-Version:.*/"Project-Id-Version: $(PACKAGE_STRING)\\n"/' < $(top_srcdir)/po/$@.in | $(MSGMERGE) --no-fuzzy-matching --verbose -o $(top_builddir)/po/$@ - navit.pot + +navit.pot: $(POTFILES) + $(XGETTEXT) --no-location --default-domain=navit \ + --add-comments --keyword=_ --keyword=_n $(POTFILES) + if cmp -s navit.po navit.pot; then \ + rm -f navit.po; \ + else \ + mv -f navit.po navit.pot; \ + fi + +install-data-local: $(CATALOGS) + $(mkinstalldirs) $(DESTDIR)$(datadir)/locale + chmod 755 $(DESTDIR)$(datadir)/locale + for n in $(CATALOGS) __DuMmY ; do \ + if test "$$n" -a "$$n" != "__DuMmY" ; then \ + l=`basename $$n .mo`; \ + $(mkinstalldirs) $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES; \ + chmod 755 $(DESTDIR)$(datadir)/locale/$$l; \ + chmod 755 $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES; \ + $(INSTALL_DATA) -m 644 $$n $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES/navit.mo; \ + fi; \ + done + +uninstall-local: + for n in $(CATALOGS) __DuMmY ; do \ + if test "$$n" -a "$$n" != "__DuMmY" ; then \ + l=`basename $$n .mo`; \ + rm -f $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES/navit.mo; \ + fi; \ + done + +distclean-local: + rm -f $(top_builddir)/navit/navit_shipped.glade $(top_builddir)/navit/navit_shipped.c + for n in $(CATALOGS) __DuMmY ; do \ + if test "$$n" -a "$$n" != "__DuMmY" ; then \ + l=`basename $$n .mo`; \ + rm -f ../locale/$$l/LC_MESSAGES/navit.mo; \ + rm -f $$l.po; \ + fi; \ + done diff --git a/po/Makefile.in b/po/Makefile.in new file mode 100644 index 0000000..b7669fc --- /dev/null +++ b/po/Makefile.in @@ -0,0 +1,583 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@XGETTEXT_GLADE_TRUE@am__append_1 = $(top_builddir)/navit/navit_shipped.glade +subdir = po +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ + $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ + $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ + $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/longdouble.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/signed.m4 $(top_srcdir)/m4/size_max.m4 \ + $(top_srcdir)/m4/stdint_h.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +ANDROID_PERMISSIONS = @ANDROID_PERMISSIONS@ +ANDROID_PROJECT = @ANDROID_PROJECT@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CCLD_FOR_BUILD = @CCLD_FOR_BUILD@ +CC_FOR_BUILD = @CC_FOR_BUILD@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DBUS_SERVICE_DIR = @DBUS_SERVICE_DIR@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREEIMAGE_LIBS = @FREEIMAGE_LIBS@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FRIBIDI2_CFLAGS = @FRIBIDI2_CFLAGS@ +FRIBIDI2_LIBS = @FRIBIDI2_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GDLIB_CONFIG = @GDLIB_CONFIG@ +GD_CFLAGS = @GD_CFLAGS@ +GD_LIBS = @GD_LIBS@ +GENCAT = @GENCAT@ +GLC_CFLAGS = @GLC_CFLAGS@ +GLC_LIBS = @GLC_LIBS@ +GLIBC21 = @GLIBC21@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GMODULE_CFLAGS = @GMODULE_CFLAGS@ +GMODULE_LIBS = @GMODULE_LIBS@ +GMSGFMT = @GMSGFMT@ +GPSBT_CFLAGS = @GPSBT_CFLAGS@ +GPSBT_LIBS = @GPSBT_LIBS@ +GPSD_CFLAGS = @GPSD_CFLAGS@ +GPSD_LIBS = @GPSD_LIBS@ +GREP = @GREP@ +GTK2_CFLAGS = @GTK2_CFLAGS@ +GTK2_LIBS = @GTK2_LIBS@ +GYPSY_CFLAGS = @GYPSY_CFLAGS@ +GYPSY_LIBS = @GYPSY_LIBS@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +HILDON_CFLAGS = @HILDON_CFLAGS@ +HILDON_LIBS = @HILDON_LIBS@ +IMLIB2_CFLAGS = @IMLIB2_CFLAGS@ +IMLIB2_LIBS = @IMLIB2_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLIBS = @INTLIBS@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +IPHONE_CFLAGS = @IPHONE_CFLAGS@ +IPHONE_LIBS = @IPHONE_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBC_LIBS = @LIBC_LIBS@ +LIBGARMIN_CFLAGS = @LIBGARMIN_CFLAGS@ +LIBGARMIN_LIBS = @LIBGARMIN_LIBS@ +LIBGPS19_CFLAGS = @LIBGPS19_CFLAGS@ +LIBGPS19_LIBS = @LIBGPS19_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLOCATION_CFLAGS = @LIBLOCATION_CFLAGS@ +LIBLOCATION_LIBS = @LIBLOCATION_LIBS@ +LIBNAVIT = @LIBNAVIT@ +LIBOBJS = @LIBOBJS@ +LIBOSSO_CFLAGS = @LIBOSSO_CFLAGS@ +LIBOSSO_LIBS = @LIBOSSO_LIBS@ +LIBPDL_CFLAGS = @LIBPDL_CFLAGS@ +LIBPDL_LIBS = @LIBPDL_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOC = @MOC@ +MODULE_LDFLAGS = @MODULE_LDFLAGS@ +MODULE_LIBADD = @MODULE_LIBADD@ +MOFILES = @MOFILES@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +NAVIT_CFLAGS = @NAVIT_CFLAGS@ +NAVIT_LIBS = @NAVIT_LIBS@ +NAVIT_MODULE_LDFLAGS = @NAVIT_MODULE_LDFLAGS@ +NAVIT_SOCKET_LDFLAGS = @NAVIT_SOCKET_LDFLAGS@ +NAVIT_VARIANT = @NAVIT_VARIANT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENGL_CFLAGS = @OPENGL_CFLAGS@ +OPENGL_LIBS = @OPENGL_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PG_CONFIG = @PG_CONFIG@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POFILES = @POFILES@ +POIFILES = @POIFILES@ +POSTGRESQL_CFLAGS = @POSTGRESQL_CFLAGS@ +POSTGRESQL_LIBS = @POSTGRESQL_LIBS@ +POSUB = @POSUB@ +PYTHONCONFIG = @PYTHONCONFIG@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LIBS = @PYTHON_LIBS@ +QT_DECLARATIVE_CFLAGS = @QT_DECLARATIVE_CFLAGS@ +QT_DECLARATIVE_LIBS = @QT_DECLARATIVE_LIBS@ +QT_GUI_CFLAGS = @QT_GUI_CFLAGS@ +QT_GUI_LIBS = @QT_GUI_LIBS@ +QT_SVG_CFLAGS = @QT_SVG_CFLAGS@ +QT_SVG_LIBS = @QT_SVG_LIBS@ +QT_XML_CFLAGS = @QT_XML_CFLAGS@ +QT_XML_LIBS = @QT_XML_LIBS@ +RANLIB = @RANLIB@ +SAXON = @SAXON@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_IMAGE_LIBS = @SDL_IMAGE_LIBS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPEFILE_CFLAGS = @SHAPEFILE_CFLAGS@ +SHAPEFILE_LIBS = @SHAPEFILE_LIBS@ +SHELL = @SHELL@ +SOURCE_MODE = @SOURCE_MODE@ +SPEECHD_CFLAGS = @SPEECHD_CFLAGS@ +SPEECHD_LIBS = @SPEECHD_LIBS@ +STRIP = @STRIP@ +SVG2PNG = @SVG2PNG@ +SVG2PNG_SCALES = @SVG2PNG_SCALES@ +SVG2PNG_SCALES_FLAG = @SVG2PNG_SCALES_FLAG@ +SVG2PNG_SCALES_NAV = @SVG2PNG_SCALES_NAV@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +WORDEXP_LIBS = @WORDEXP_LIBS@ +XGETTEXT = @XGETTEXT@ +XSLTS = @XSLTS@ +ZLIB_CFLAGS = @ZLIB_CFLAGS@ +ZLIB_LIBS = @ZLIB_LIBS@ +_PATH_BZCAT = @_PATH_BZCAT@ +_PATH_PYTHON = @_PATH_PYTHON@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +cross_compiling = @cross_compiling@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +CATALOGS = @MOFILES@ +CLEANFILES = $(CATALOGS) navit.pot + +# keep this sorted +EXTRA_DIST = @POIFILES@ +POTFILES = $(top_srcdir)/navit/main.c $(top_srcdir)/navit/navigation.c \ + $(top_srcdir)/navit/navit.c $(top_srcdir)/navit/popup.c \ + $(top_srcdir)/navit/country.c \ + $(top_srcdir)/navit/gui/gtk/destination.c \ + $(top_srcdir)/navit/gui/gtk/gui_gtk_action.c \ + $(top_srcdir)/navit/gui/gtk/gui_gtk_statusbar.c \ + $(top_srcdir)/navit/gui/internal/gui_internal.c \ + $(top_srcdir)/navit/osd/core/osd_core.c \ + $(top_builddir)/navit/navit_shipped.c $(am__append_1) +SUFFIXES = .po .mo +all: all-am + +.SUFFIXES: +.SUFFIXES: .po .mo +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu po/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu po/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-local + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-data-local + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-local + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distclean-local \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-data-local \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am uninstall uninstall-am uninstall-local + + +.po.mo: + dir=`basename $@ .mo` ;\ + $(MSGFMT) --check --verbose --statistics --output-file=$@ $< && \ + mkdir -p ../locale/$$dir/LC_MESSAGES && \ + cp $@ ../locale/$$dir/LC_MESSAGES/navit.mo + +all: @MOFILES@ + +# Trick gettext to get translateable strings out of navit_shipped.xml + +$(top_builddir)/navit/navit_shipped.glade: $(top_srcdir)/navit/navit_shipped.xml + sed -e "s/vehicleprofile/atkaction/" -e "s/name=/description=/" -e 's/$(top_builddir)/navit/navit_shipped.glade + +$(top_builddir)/navit/navit_shipped.c: $(top_srcdir)/navit/navit_shipped.xml + sed -e 's/|//g' -e 's/^/|/' -e 's/$$/|/' -e 's/\(_("[^"]*")\)/| \1; |/g' -e 's/|[^|]*|//g' <$(top_srcdir)/navit/navit_shipped.xml >$(top_builddir)/navit/navit_shipped.c + +@POFILES@: navit.pot + sed 's/^"Project-Id-Version:.*/"Project-Id-Version: $(PACKAGE_STRING)\\n"/' < $(top_srcdir)/po/$@.in | $(MSGMERGE) --no-fuzzy-matching --verbose -o $(top_builddir)/po/$@ - navit.pot + +navit.pot: $(POTFILES) + $(XGETTEXT) --no-location --default-domain=navit \ + --add-comments --keyword=_ --keyword=_n $(POTFILES) + if cmp -s navit.po navit.pot; then \ + rm -f navit.po; \ + else \ + mv -f navit.po navit.pot; \ + fi + +install-data-local: $(CATALOGS) + $(mkinstalldirs) $(DESTDIR)$(datadir)/locale + chmod 755 $(DESTDIR)$(datadir)/locale + for n in $(CATALOGS) __DuMmY ; do \ + if test "$$n" -a "$$n" != "__DuMmY" ; then \ + l=`basename $$n .mo`; \ + $(mkinstalldirs) $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES; \ + chmod 755 $(DESTDIR)$(datadir)/locale/$$l; \ + chmod 755 $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES; \ + $(INSTALL_DATA) -m 644 $$n $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES/navit.mo; \ + fi; \ + done + +uninstall-local: + for n in $(CATALOGS) __DuMmY ; do \ + if test "$$n" -a "$$n" != "__DuMmY" ; then \ + l=`basename $$n .mo`; \ + rm -f $(DESTDIR)$(datadir)/locale/$$l/LC_MESSAGES/navit.mo; \ + fi; \ + done + +distclean-local: + rm -f $(top_builddir)/navit/navit_shipped.glade $(top_builddir)/navit/navit_shipped.c + for n in $(CATALOGS) __DuMmY ; do \ + if test "$$n" -a "$$n" != "__DuMmY" ; then \ + l=`basename $$n .mo`; \ + rm -f ../locale/$$l/LC_MESSAGES/navit.mo; \ + rm -f $$l.po; \ + fi; \ + done + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/po/af.po.in b/po/af.po.in new file mode 100644 index 0000000..b7d99ef --- /dev/null +++ b/po/af.po.in @@ -0,0 +1,1763 @@ +# Afrikaans translation for navit +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the navit package. +# mdhull, 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2009-12-20 20:36+0000\n" +"Last-Translator: KaZeR \n" +"Language-Team: Afrikaans \n" +"Language: af\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Loop vanaf bron gids\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "verander '%s' na '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "nulste" + +msgid "first" +msgstr "eerste" + +msgid "second" +msgstr "tweede" + +msgid "third" +msgstr "derde" + +msgid "fourth" +msgstr "vierde" + +msgid "fifth" +msgstr "vyfde" + +msgid "sixth" +msgstr "sesde" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "nulste uitgang" + +msgid "first exit" +msgstr "eerste uitgang" + +msgid "second exit" +msgstr "tweede uitgang" + +msgid "third exit" +msgstr "derde uitgang" + +msgid "fourth exit" +msgstr "vierde uitgang" + +msgid "fifth exit" +msgstr "vyfde uitgang" + +msgid "sixth exit" +msgstr "sesde uitgang" + +#, c-format +msgid "%d m" +msgstr "%d meter" + +#, c-format +msgid "in %d m" +msgstr "na %d meter" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d meter" + +#, c-format +msgid "in %d meters" +msgstr "na %d meter" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "na %d.%d kilometer" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "een kilometer" +msgstr[1] "%d kilometer" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "na een kilometer" +msgstr[1] "na %d kilometer" + +msgid "exit" +msgstr "afrit" + +msgid "into the ramp" +msgstr "na die afrit" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%sin die straat %s%s%s in" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%sin die %s%s%s|" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%sin die %s%s%s|" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%sin die %s%s%s|" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%sin die %s in" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "regs" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "links" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "maklik " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "skerp " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "regtig sterk " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "onbekend " + +msgid "When possible, please turn around" +msgstr "Draai asseblief om wanneer moontlik" + +msgid "Enter the roundabout soon" +msgstr "Gaan kortliks in die sirkel in" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "verlaat dan die sirkel by die %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Verlaat die sirkel by die %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Volg die pad vir die volgende %s" + +msgid "soon" +msgstr "kortliks" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Neem die %1$s pad na %2$s" + +#, c-format +msgid "after %i roads" +msgstr "na %i paaie" + +msgid "now" +msgstr "nou" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "neem dan die %1$s pad na %2$s" + +msgid "error" +msgstr "fout" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Draai %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "draai dan %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Jy het jou bestemming bereik %s" + +msgid "then you have reached your destination." +msgstr "dan het jy jou bestemming bereik." + +msgid "Position" +msgstr "Posisie" + +msgid "Command" +msgstr "Bevel" + +msgid "Length" +msgstr "Lengte" + +msgid "km" +msgstr "kilometer" + +msgid "m" +msgstr "meter" + +msgid "Time" +msgstr "Tyd" + +msgid "Destination Length" +msgstr "Bestemming lengte" + +msgid "Destination Time" +msgstr "Bestemming tyd" + +msgid "Roadbook" +msgstr "Padkaart" + +msgid "Set as position" +msgstr "Stel as posisie" + +msgid "Set as destination" +msgstr "Stel as bestemming" + +msgid "Add as bookmark" +msgstr "Voeg as boekmerk by" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Punt 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Skerm koordinaat : %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Verenigde Arabiese Emirate" + +#. 004 +msgid "Afghanistan" +msgstr "Afganistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigue en Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albanië" + +#. 051 +msgid "Armenia" +msgstr "Armenië" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Nederland Antille" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarktika" + +#. 032 +msgid "Argentina" +msgstr "Argentinië" + +#. 016 +msgid "American Samoa" +msgstr "Amerikaanse Samoa" + +#. 040 +msgid "Austria" +msgstr "Oostenryk" + +#. 036 +msgid "Australia" +msgstr "Australië" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Aland Eiland" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbaidjan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnië en Herzegowina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesj" + +#. 056 +msgid "Belgium" +msgstr "België" + +#. 854 +msgid "Burkina Faso" +msgstr "Boerkina Fasso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgarye" + +#. 048 +msgid "Bahrain" +msgstr "Bahrein" + +#. 108 +msgid "Burundi" +msgstr "Boeroendi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "St. Barthelemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Broenei" + +#. 068 +msgid "Bolivia" +msgstr "Bolivië" + +#. 076 +msgid "Brazil" +msgstr "Brasilië" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "Bhoetan" + +#. 074 +msgid "Bouvet Island" +msgstr "Bouveteiland" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Wit-Rusland" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Kanada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Cocos- (Keeling) eilande" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Kongo, Demokratiese Republiek van die" + +#. 140 +msgid "Central African Republic" +msgstr "Sentraal-Afrikaanse Republiek" + +#. 178 +msgid "Congo" +msgstr "Kongo" + +#. 756 +msgid "Switzerland" +msgstr "Switserland" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Ivoorkus" + +#. 184 +msgid "Cook Islands" +msgstr "Cookeilande" + +#. 152 +msgid "Chile" +msgstr "Chili" + +#. 120 +msgid "Cameroon" +msgstr "Kameroen" + +#. 156 +msgid "China" +msgstr "Sjina" + +#. 170 +msgid "Colombia" +msgstr "Kolombië" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Kuba" + +#. 132 +msgid "Cape Verde" +msgstr "Kaap Verdie" + +#. 162 +msgid "Christmas Island" +msgstr "Kerseiland" + +#. 196 +msgid "Cyprus" +msgstr "Siprus" + +#. 203 +msgid "Czech Republic" +msgstr "Tjeggiese Republiek" + +#. 276 +msgid "Germany" +msgstr "Duitsland" + +#. 262 +msgid "Djibouti" +msgstr "Djiboeti" + +#. 208 +msgid "Denmark" +msgstr "Denemarke" + +#. 212 +msgid "Dominica" +msgstr "Dominika" + +#. 214 +msgid "Dominican Republic" +msgstr "Dominikaanse Republiek" + +#. 012 +msgid "Algeria" +msgstr "Algerië" + +#. 218 +msgid "Ecuador" +msgstr "Ecuador" + +#. 233 +msgid "Estonia" +msgstr "Esland" + +#. 818 +msgid "Egypt" +msgstr "Egipte" + +#. 732 +msgid "Western Sahara" +msgstr "Wes-Sahara" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Spanje" + +#. 231 +msgid "Ethiopia" +msgstr "Etiopië" + +#. 246 +msgid "Finland" +msgstr "Finland" + +#. 242 +msgid "Fiji" +msgstr "Fidji" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falkland-eiland (Malvinas)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Mikronesia, Federale state van" + +#. 234 +msgid "Faroe Islands" +msgstr "Faroëreilande" + +#. 250 +msgid "France" +msgstr "Frankryk" + +#. 266 +msgid "Gabon" +msgstr "Gaboen" + +#. 826 +msgid "United Kingdom" +msgstr "Verenigde Koninkryk" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Georgië" + +#. 254 +msgid "French Guiana" +msgstr "Frans-Guyana" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Groenland" + +#. 270 +msgid "Gambia" +msgstr "Gambië" + +#. 324 +msgid "Guinea" +msgstr "Guinië" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Ekwatoriaal-Guinee" + +#. 300 +msgid "Greece" +msgstr "Griekeland" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "South Georgië en die Suid Sandwich Eilande" + +#. 320 +msgid "Guatemala" +msgstr "Gautemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinee-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heard Eiland en McDonald Eiland" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Kroasië" + +#. 332 +msgid "Haiti" +msgstr "Haïti" + +#. 348 +msgid "Hungary" +msgstr "Hongarye" + +#. 360 +msgid "Indonesia" +msgstr "Indonesië" + +#. 372 +msgid "Ireland" +msgstr "Ierland" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "Man eiland" + +#. 356 +msgid "India" +msgstr "Indië" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Brits Indiese oseaan gebiede" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iran" + +#. 352 +msgid "Iceland" +msgstr "Ysland" + +#. 380 +msgid "Italy" +msgstr "Italië" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaika" + +#. 400 +msgid "Jordan" +msgstr "Jordanië" + +#. 392 +msgid "Japan" +msgstr "Japan" + +#. 404 +msgid "Kenya" +msgstr "Kenia" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kyrgyzstan" + +#. 116 +msgid "Cambodia" +msgstr "Kambodja" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Komoros" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "St. Kitts en Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Noord-Korea" + +#. 410 +msgid "Korea, Republic of" +msgstr "Suid-Korea" + +#. 414 +msgid "Kuwait" +msgstr "Koeweit" + +#. 136 +msgid "Cayman Islands" +msgstr "Kaaimanseilande" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazakstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laos" + +#. 422 +msgid "Lebanon" +msgstr "Libanon" + +#. 662 +msgid "Saint Lucia" +msgstr "St. Lucia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberië" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Litoue" + +#. 442 +msgid "Luxembourg" +msgstr "Luxenburg" + +#. 428 +msgid "Latvia" +msgstr "Letland" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libië" + +#. 504 +msgid "Morocco" +msgstr "Marokko" + +#. 492 +msgid "Monaco" +msgstr "Monako" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldawië" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "St. Martin" + +#. 450 +msgid "Madagascar" +msgstr "Madagaskar" + +#. 584 +msgid "Marshall Islands" +msgstr "Marshall-eilande" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Masedonië" + +#. 466 +msgid "Mali" +msgstr "Malie" + +#. 104 +msgid "Myanmar" +msgstr "Mianmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongolië" + +#. 446 +msgid "Macao" +msgstr "Makao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Noordmarianaeilande" + +#. 474 +msgid "Martinique" +msgstr "Martinique" + +#. 478 +msgid "Mauritania" +msgstr "Mouritanië" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauritius" + +#. 462 +msgid "Maldives" +msgstr "Maldive" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Meksiko" + +#. 458 +msgid "Malaysia" +msgstr "Maleisië" + +#. 508 +msgid "Mozambique" +msgstr "Mosambiek" + +#. 516 +msgid "Namibia" +msgstr "Namibië" + +#. 540 +msgid "New Caledonia" +msgstr "Nieu-Kaledonië" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolk-eiland" + +#. 566 +msgid "Nigeria" +msgstr "Nigerië" + +#. 558 +msgid "Nicaragua" +msgstr "Nikaragua" + +#. 528 +msgid "Netherlands" +msgstr "Nederland" + +#. 578 +msgid "Norway" +msgstr "Noorweë" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Naoeroe" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Nieu-Seeland" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Frans Polinesië" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papoea Nieu-Guinee" + +#. 608 +msgid "Philippines" +msgstr "Filippyne" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Pole" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "St. Pierre en Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn Eilande" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestynse Gebied, Besette" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguaai" + +#. 634 +msgid "Qatar" +msgstr "Katar" + +#. 638 +msgid "Reunion" +msgstr "Réunion" + +#. 642 +msgid "Romania" +msgstr "Roemenië" + +#. 688 +msgid "Serbia" +msgstr "Serwië" + +#. 643 +msgid "Russian Federation" +msgstr "Rusland" + +#. 646 +msgid "Rwanda" +msgstr "Rwanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Saoedi-Arabië" + +#. 090 +msgid "Solomon Islands" +msgstr "Solomon-eilande" + +#. 690 +msgid "Seychelles" +msgstr "Seychelle" + +#. 736 +msgid "Sudan" +msgstr "Soedan" + +#. 752 +msgid "Sweden" +msgstr "Swede" + +#. 702 +msgid "Singapore" +msgstr "Singapoer" + +#. 654 +msgid "Saint Helena" +msgstr "St. Helena" + +#. 705 +msgid "Slovenia" +msgstr "Slovenië" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard en Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slowakye" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalië" + +#. 740 +msgid "Suriname" +msgstr "Suriname" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Sao Tomé en Principe" + +#. 222 +msgid "El Salvador" +msgstr "Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Sirië" + +#. 748 +msgid "Swaziland" +msgstr "Swaziland" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turkse en Caicos Eilande" + +#. 148 +msgid "Chad" +msgstr "Tsjaad" + +#. 260 +msgid "French Southern Territories" +msgstr "Franse Suidelike gebiede" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Thailand" + +#. 762 +msgid "Tajikistan" +msgstr "Tadjikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Oos-Timor" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunisië" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turkye" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad en Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Toewaloe" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzanië" + +#. 804 +msgid "Ukraine" +msgstr "Oekraïne" + +#. 800 +msgid "Uganda" +msgstr "Oeganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Verenigde State Kleiner uitliggende eilande" + +#. 840 +msgid "United States" +msgstr "Vereenigde State" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Oesbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Vatikaan" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "St. Vincent en die Grenadine" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Britse Maagde eilande" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Amerikaanse Maagde eilande" + +#. 704 +msgid "Viet Nam" +msgstr "Viëtnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis- en Futuna-eilande" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Jemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Suid-Afrika" + +#. 894 +msgid "Zambia" +msgstr "Zambië" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Onbekend, voeg is_in merkers by daai stede" + +msgid "Car" +msgstr "Kar" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Land" + +msgid "Postal" +msgstr "Pos" + +msgid "Town" +msgstr "Dorp" + +msgid "District" +msgstr "Distrik" + +msgid "Street" +msgstr "Straat" + +msgid "Number" +msgstr "Nommer" + +msgid "Enter Destination" +msgstr "Kies Bestemming" + +msgid "Zip Code" +msgstr "Poskode" + +msgid "City" +msgstr "Stad" + +msgid "District/Township" +msgstr "Distrik/Kontrei" + +msgid "Map" +msgstr "Kaart" + +msgid "Bookmark" +msgstr "Boekmerk" + +msgid "Destination" +msgstr "Bestemming" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Skerm" + +msgid "_Route" +msgstr "Roete" + +msgid "_Former Destinations" +msgstr "Voorige bestemmings" + +msgid "_Bookmarks" +msgstr "Boekmerke" + +msgid "_Map" +msgstr "Kaart" + +msgid "_Layout" +msgstr "Uitleg" + +msgid "_Projection" +msgstr "Skatting" + +msgid "_Vehicle" +msgstr "Voertuig" + +msgid "Zoom_Out" +msgstr "ZoomUit" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "ZoomIn" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Herbereken" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Inligting" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Stop Navigasie" + +msgid "Test" +msgstr "Toets" + +msgid "_Quit" +msgstr "_Sluit af" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Koppel aan Pad" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Padkaart" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Outozoom" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Volskerm" + +msgid "Data" +msgstr "Data" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NO" + +msgid "E" +msgstr "O" + +msgid "SE" +msgstr "SO" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SW" + +msgid "W" +msgstr "W" + +msgid "NW" +msgstr "NW" + +msgid "No" +msgstr "Nee" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Roete %4.0fkm %02d:%02d aankomstyd" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Roete 0000km 0+00:00 aankomstyd" + +msgid "Back to map" +msgstr "Terug kaart toe" + +msgid "Main Menu" +msgstr "Hoofkieslys" + +msgid "Help" +msgstr "Hulp" + +msgid "Back" +msgstr "Terug" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "Belangpunte" + +msgid "View in Browser" +msgstr "Besigtig in blaaier" + +msgid "Streets" +msgstr "Strate" + +msgid "House numbers" +msgstr "Huis Nommers" + +msgid "View Attributes" +msgstr "Besigtig eienskappe" + +msgid "View on map" +msgstr "Beloer op kaart" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "Boekmerke" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "Boekmerk %s" + +msgid "Former Destinations" +msgstr "Voorige bestemmings" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Huis Nommer" + +msgid "Layout" +msgstr "Uitleg" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Kaarte" + +msgid "Show Satellite Status" +msgstr "Wys Satelliet Inligting" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "Wys NMEA data" + +msgid "car" +msgstr "Motor" + +msgid "bike" +msgstr "Motorfiets" + +msgid "pedestrian" +msgstr "voetganger" + +#, c-format +msgid "Current profile: %s" +msgstr "Huidige Profiel: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Verander profiel na: %s" + +msgid "Set as active" +msgstr "Maak aktief" + +msgid "Show Satellite status" +msgstr "Wys satelliet inligting" + +msgid "Show NMEA data" +msgstr "Wys NMEA data" + +msgid "Vehicle" +msgstr "Voertuig" + +msgid "Rules" +msgstr "Reëls" + +msgid "Lock on road" +msgstr "Koppel aan pad" + +msgid "Northing" +msgstr "Draai kaart noord" + +msgid "Map follows Vehicle" +msgstr "Kaart volg voertuig" + +msgid "Message" +msgstr "Boodskap" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "Hoë profiel" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Kaart punt" + +msgid "Vehicle Position" +msgstr "Voertuig posisie" + +msgid "Main menu" +msgstr "Hoofkieslys" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Wys\n" +"Kaart" + +msgid "Settings" +msgstr "Instellings" + +msgid "Tools" +msgstr "Gereedskap" + +msgid "Route" +msgstr "Roete" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "Aksies" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Verlaat" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Stop\n" +"Navigasie" + +msgid "Display" +msgstr "Skerm" + +msgid "Fullscreen" +msgstr "Volskerm" + +msgid "Window Mode" +msgstr "Venster Modus" + +msgid "Description" +msgstr "Beskrywing" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "In %s, gaan in die sirkel in" + +#~ msgid "Cursor" +#~ msgstr "Plekaanduier" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d kilometer" diff --git a/po/ar.po.in b/po/ar.po.in new file mode 100644 index 0000000..300d995 --- /dev/null +++ b/po/ar.po.in @@ -0,0 +1,1778 @@ +# Arabic translation for navit +# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 +# This file is distributed under the same license as the navit package. +# Metehyi, 2009 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-02-01 17:37+0000\n" +"Last-Translator: KaZeR \n" +"Language-Team: Arabic \n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= " +"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "جاري التنفيذ من المجلد المصدر\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "وضع حالة '%s' إلى '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "(الرقم) صفر" + +msgid "first" +msgstr "الأوّل" + +msgid "second" +msgstr "الثّاني" + +msgid "third" +msgstr "الثّالث" + +msgid "fourth" +msgstr "الرّابع" + +msgid "fifth" +msgstr "الخامس" + +msgid "sixth" +msgstr "السادس" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "المخرج ذو الرقم صفر" + +msgid "first exit" +msgstr "المخرج الأول" + +msgid "second exit" +msgstr "المخرج الثاني" + +msgid "third exit" +msgstr "المخرج الثالث" + +msgid "fourth exit" +msgstr "المخرج الرابع" + +msgid "fifth exit" +msgstr "المخرج الخامس" + +msgid "sixth exit" +msgstr "المخرج السادس" + +#, c-format +msgid "%d m" +msgstr "%d م" + +#, c-format +msgid "in %d m" +msgstr "بعد %d متر" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d متر" + +#, c-format +msgid "in %d meters" +msgstr "بعد %d متر" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d كلم" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "بعد %d%d كلم" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "كلم واحد" +msgstr[1] "%d كلم" +msgstr[2] "%d كلم" +msgstr[3] "%d كلم" +msgstr[4] "%d كلم" +msgstr[5] "%d كلم" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "بعد كلم واحد" +msgstr[1] "بعد %d كلم" +msgstr[2] "بعد %d كلم" +msgstr[3] "بعد %d كلم" +msgstr[4] "بعد %d كلم" +msgstr[5] "بعد %d كلم" + +msgid "exit" +msgstr "خروج" + +msgid "into the ramp" +msgstr "إلى داخل الطريق المنحدر" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s إلى داخل الشارع %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%sإلى داخل %s%s%s|صفة الذكر" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%sإلى داخل %s%s%s|صفة الأنثى" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%sإلى داخل %s%s%s|غير محدد الجنس" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%s إلى داخل %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "إلى اليمين" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "إلى اليسار" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "بسهولة " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "بكل شدة " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "بشدة حادة " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "غير معروف " + +msgid "When possible, please turn around" +msgstr "حيث ممكن الرجاء اللف" + +msgid "Enter the roundabout soon" +msgstr "قريباً الدخول إلى المستديرة" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "ثم أخرج من المستديرة عند الــ%s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "أخرج من المستديرة عند الــ %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "تابع الطريق لل- %s التالية" + +msgid "soon" +msgstr "قريبا" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "خذ الطريق %1$s إلى ال%2$s" + +#, c-format +msgid "after %i roads" +msgstr "بعد %i طرقات" + +msgid "now" +msgstr "الآن" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "ثم خذ الطريق %1$s إلى ال- %2$s" + +msgid "error" +msgstr "خطء" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "حوّل %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "ثم حوّل %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "لقد وصلت إلى هدفك %s" + +msgid "then you have reached your destination." +msgstr "و بعدها تكون قد وصلت إلى هدفك" + +msgid "Position" +msgstr "الموقع" + +msgid "Command" +msgstr "الأمر" + +msgid "Length" +msgstr "الطول" + +msgid "km" +msgstr "كلم" + +msgid "m" +msgstr "م." + +msgid "Time" +msgstr "الوقت" + +msgid "Destination Length" +msgstr "بُعد الهدف" + +msgid "Destination Time" +msgstr "الوقت في مكان الوصول" + +msgid "Roadbook" +msgstr "سجل خريطة الطريق" + +msgid "Set as position" +msgstr "عين كموقع حالي" + +msgid "Set as destination" +msgstr "عيّن كهدف" + +msgid "Add as bookmark" +msgstr "أضف كعلامة مراجعة" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "الموقع 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "إحداثيات الشاشة :%d %d" + +#. 020 +msgid "Andorra" +msgstr "أندورا" + +#. 784 +msgid "United Arab Emirates" +msgstr "الإمارات العربيّة المتّحدة" + +#. 004 +msgid "Afghanistan" +msgstr "أفغانستان" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "أنتيغوا وباربودا" + +#. 660 +msgid "Anguilla" +msgstr "أنغويلا" + +#. 008 +msgid "Albania" +msgstr "ألبانيا" + +#. 051 +msgid "Armenia" +msgstr "أرمينيا" + +#. 530 +msgid "Netherlands Antilles" +msgstr "الأنتيل الهولندية" + +#. 024 +msgid "Angola" +msgstr "أنغولا" + +#. 010 +msgid "Antarctica" +msgstr "أنتاركتيكا" + +#. 032 +msgid "Argentina" +msgstr "الأرجنتين" + +#. 016 +msgid "American Samoa" +msgstr "ساموا الأميركية" + +#. 040 +msgid "Austria" +msgstr "النمسا" + +#. 036 +msgid "Australia" +msgstr "أستراليا" + +#. 533 +msgid "Aruba" +msgstr "أروبا" + +#. 248 +msgid "Aland Islands" +msgstr "جزر أولان" + +#. 031 +msgid "Azerbaijan" +msgstr "أذربيجان" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "البوسنة والهرسك" + +#. 052 +msgid "Barbados" +msgstr "بربادوس" + +#. 050 +msgid "Bangladesh" +msgstr "بنغلادش" + +#. 056 +msgid "Belgium" +msgstr "بلجيكا" + +#. 854 +msgid "Burkina Faso" +msgstr "بوركينا فاسو" + +#. 100 +msgid "Bulgaria" +msgstr "بلغاريا" + +#. 048 +msgid "Bahrain" +msgstr "البحرين" + +#. 108 +msgid "Burundi" +msgstr "بوروندي" + +#. 204 +msgid "Benin" +msgstr "البنين" + +#. 652 +msgid "Saint Barthelemy" +msgstr "سانت بارتيليمي" + +#. 060 +msgid "Bermuda" +msgstr "جزر البرمودا" + +#. 096 +msgid "Brunei Darussalam" +msgstr "بروناي دار السّلام" + +#. 068 +msgid "Bolivia" +msgstr "بوليفيا" + +#. 076 +msgid "Brazil" +msgstr "البرازيل" + +#. 044 +msgid "Bahamas" +msgstr "جزر البهاما" + +#. 064 +msgid "Bhutan" +msgstr "بوتان" + +#. 074 +msgid "Bouvet Island" +msgstr "جزيرة بوفيت" + +#. 072 +msgid "Botswana" +msgstr "بوتسوانا" + +#. 112 +msgid "Belarus" +msgstr "روسيا البيضاء \\ بيلاروس" + +#. 084 +msgid "Belize" +msgstr "بيليز" + +#. 124 +msgid "Canada" +msgstr "كندا" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "جزر الكوكوس (كيلنك)" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "جمهورية الكونغو الديمقراطيه" + +#. 140 +msgid "Central African Republic" +msgstr "جمهورية إفريقيا الوسطى" + +#. 178 +msgid "Congo" +msgstr "الكونغو" + +#. 756 +msgid "Switzerland" +msgstr "سويسرا" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "ساحل العاج" + +#. 184 +msgid "Cook Islands" +msgstr "جزر كوك" + +#. 152 +msgid "Chile" +msgstr "تشيلي" + +#. 120 +msgid "Cameroon" +msgstr "الكامرون" + +#. 156 +msgid "China" +msgstr "الصين" + +#. 170 +msgid "Colombia" +msgstr "كولومبيا" + +#. 188 +msgid "Costa Rica" +msgstr "كوستاريكا" + +#. 192 +msgid "Cuba" +msgstr "كوبا" + +#. 132 +msgid "Cape Verde" +msgstr "الرأس الاخضر كاب فيردي" + +#. 162 +msgid "Christmas Island" +msgstr "جزر الكريسماس" + +#. 196 +msgid "Cyprus" +msgstr "قبرص" + +#. 203 +msgid "Czech Republic" +msgstr "جمهورية التشيك" + +#. 276 +msgid "Germany" +msgstr "ألمانيا" + +#. 262 +msgid "Djibouti" +msgstr "جيبوتي" + +#. 208 +msgid "Denmark" +msgstr "الدنمارك" + +#. 212 +msgid "Dominica" +msgstr "الدّومينيكا" + +#. 214 +msgid "Dominican Republic" +msgstr "جمهورية الدومينيكان" + +#. 012 +msgid "Algeria" +msgstr "الجزائر" + +#. 218 +msgid "Ecuador" +msgstr "الإكوادور" + +#. 233 +msgid "Estonia" +msgstr "أستونيا" + +#. 818 +msgid "Egypt" +msgstr "جمهورية مصر العربية" + +#. 732 +msgid "Western Sahara" +msgstr "الصحراء الغربية" + +#. 232 +msgid "Eritrea" +msgstr "أريتريا" + +#. 724 +msgid "Spain" +msgstr "إسبانيا" + +#. 231 +msgid "Ethiopia" +msgstr "الحبشة" + +#. 246 +msgid "Finland" +msgstr "فنلندا" + +#. 242 +msgid "Fiji" +msgstr "فيجي" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "جزر فولكلاند (مالفيناس)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "ميكرونيزيا، ولايات ميكرونيزيا الفدرالية" + +#. 234 +msgid "Faroe Islands" +msgstr "جزر الفارو" + +#. 250 +msgid "France" +msgstr "فرنسا" + +#. 266 +msgid "Gabon" +msgstr "الغابون" + +#. 826 +msgid "United Kingdom" +msgstr "المملكة المتّحدة" + +#. 308 +msgid "Grenada" +msgstr "غرناطة" + +#. 268 +msgid "Georgia" +msgstr "جورجيا" + +#. 254 +msgid "French Guiana" +msgstr "جويانا الفرنسية" + +#. 831 +msgid "Guernsey" +msgstr "غويرنسي" + +#. 288 +msgid "Ghana" +msgstr "غانا" + +#. 292 +msgid "Gibraltar" +msgstr "جبل طارق" + +#. 304 +msgid "Greenland" +msgstr "جرينلاندا" + +#. 270 +msgid "Gambia" +msgstr "غامبيا" + +#. 324 +msgid "Guinea" +msgstr "غينيا" + +#. 312 +msgid "Guadeloupe" +msgstr "جوادلوب" + +#. 226 +msgid "Equatorial Guinea" +msgstr "غينيا الاستوائيه" + +#. 300 +msgid "Greece" +msgstr "اليونان" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "جورجيا الجنوبيّة و جزر ساندويتش الجنوبيّة" + +#. 320 +msgid "Guatemala" +msgstr "جواتيمالا" + +#. 316 +msgid "Guam" +msgstr "غوام" + +#. 624 +msgid "Guinea-Bissau" +msgstr "غينيا بيساو" + +#. 328 +msgid "Guyana" +msgstr "غيانا" + +#. 344 +msgid "Hong Kong" +msgstr "هونغ كونغ" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "جزيرة هيرد وجزر مَكْدونالد" + +#. 340 +msgid "Honduras" +msgstr "الهوندوراس" + +#. 191 +msgid "Croatia" +msgstr "كرواتيا" + +#. 332 +msgid "Haiti" +msgstr "هايتي" + +#. 348 +msgid "Hungary" +msgstr "المجر (هنغاريا)" + +#. 360 +msgid "Indonesia" +msgstr "إندونيسيا" + +#. 372 +msgid "Ireland" +msgstr "إيرلندا" + +#. 376 +msgid "Israel" +msgstr "فلسطين المحتلة" + +#. 833 +msgid "Isle of Man" +msgstr "جزيرة مان" + +#. 356 +msgid "India" +msgstr "الهند" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "مقاطعة المحيط الهندي البريطانيّة" + +#. 368 +msgid "Iraq" +msgstr "العراق" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "إيران، الجمهوريّة الإسلاميّة الإيرانيّة" + +#. 352 +msgid "Iceland" +msgstr "آيسلندا" + +#. 380 +msgid "Italy" +msgstr "إيطاليا" + +#. 832 +msgid "Jersey" +msgstr "جيرسي" + +#. 388 +msgid "Jamaica" +msgstr "جامايكا" + +#. 400 +msgid "Jordan" +msgstr "الأردن" + +#. 392 +msgid "Japan" +msgstr "اليابان" + +#. 404 +msgid "Kenya" +msgstr "كينيا" + +#. 417 +msgid "Kyrgyzstan" +msgstr "قرغيزستان" + +#. 116 +msgid "Cambodia" +msgstr "كامبوديا" + +#. 296 +msgid "Kiribati" +msgstr "كيريباتي" + +#. 174 +msgid "Comoros" +msgstr "جزر القمر" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "سانت كيتس ونيفيس" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "كوريا، جمهورية كوريا الشّعبيّة الدّيموقراطيّة" + +#. 410 +msgid "Korea, Republic of" +msgstr "كوريا، جمهوريّة كوريا" + +#. 414 +msgid "Kuwait" +msgstr "الكويت" + +#. 136 +msgid "Cayman Islands" +msgstr "جزر الكايمان" + +#. 398 +msgid "Kazakhstan" +msgstr "كازاخستان" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "جمهوريّة لاو الدّيموقراطيّة الشّعبيّة" + +#. 422 +msgid "Lebanon" +msgstr "لبنان" + +#. 662 +msgid "Saint Lucia" +msgstr "سانت لوسيا" + +#. 438 +msgid "Liechtenstein" +msgstr "ليشتنشتاين" + +#. 144 +msgid "Sri Lanka" +msgstr "سريلانكا" + +#. 430 +msgid "Liberia" +msgstr "ليبريا" + +#. 426 +msgid "Lesotho" +msgstr "ليسوتو" + +#. 440 +msgid "Lithuania" +msgstr "ليثوانيا" + +#. 442 +msgid "Luxembourg" +msgstr "اللكسمبورغ" + +#. 428 +msgid "Latvia" +msgstr "لاتفيا" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "الجماهيريّة العربيّة اللّيبيّة" + +#. 504 +msgid "Morocco" +msgstr "المغرب" + +#. 492 +msgid "Monaco" +msgstr "موناكو" + +#. 498 +msgid "Moldova, Republic of" +msgstr "مولدوفا، جمهوريّة مولدوفا" + +#. 499 +msgid "Montenegro" +msgstr "المونتنيغرو" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "سانت مارتين (القطاع الفرنسي)" + +#. 450 +msgid "Madagascar" +msgstr "مدغشقر" + +#. 584 +msgid "Marshall Islands" +msgstr "جزر المارشال" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "مقدونيا" + +#. 466 +msgid "Mali" +msgstr "مالي" + +#. 104 +msgid "Myanmar" +msgstr "مينامار" + +#. 496 +msgid "Mongolia" +msgstr "منغوليا" + +#. 446 +msgid "Macao" +msgstr "ماكاو" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "جزر ماريانا الشّمالية" + +#. 474 +msgid "Martinique" +msgstr "مارتينيك" + +#. 478 +msgid "Mauritania" +msgstr "موريتانيا" + +#. 500 +msgid "Montserrat" +msgstr "مونتسيرات" + +#. 470 +msgid "Malta" +msgstr "مالطة" + +#. 480 +msgid "Mauritius" +msgstr "موريشيوس" + +#. 462 +msgid "Maldives" +msgstr "جزر المالديف" + +#. 454 +msgid "Malawi" +msgstr "مالاوي" + +#. 484 +msgid "Mexico" +msgstr "المكسيك" + +#. 458 +msgid "Malaysia" +msgstr "ماليزيا" + +#. 508 +msgid "Mozambique" +msgstr "الموزمبيق" + +#. 516 +msgid "Namibia" +msgstr "ناميبيا" + +#. 540 +msgid "New Caledonia" +msgstr "قلدونيا الجديدة" + +#. 562 +msgid "Niger" +msgstr "النّيجر" + +#. 574 +msgid "Norfolk Island" +msgstr "جزيرة نورفولك" + +#. 566 +msgid "Nigeria" +msgstr "نيجيريا" + +#. 558 +msgid "Nicaragua" +msgstr "نيكاراغوا" + +#. 528 +msgid "Netherlands" +msgstr "هولندا" + +#. 578 +msgid "Norway" +msgstr "النروج" + +#. 524 +msgid "Nepal" +msgstr "نيبال" + +#. 520 +msgid "Nauru" +msgstr "ناورو" + +#. 570 +msgid "Niue" +msgstr "نيوي" + +#. 554 +msgid "New Zealand" +msgstr "نيوزيلاندا" + +#. 512 +msgid "Oman" +msgstr "عُمان" + +#. 591 +msgid "Panama" +msgstr "باناما" + +#. 604 +msgid "Peru" +msgstr "البيرو" + +#. 258 +msgid "French Polynesia" +msgstr "بولينيزيا الفرنسية" + +#. 598 +msgid "Papua New Guinea" +msgstr "بابوا غينيا الجديدة" + +#. 608 +msgid "Philippines" +msgstr "الفلبّين" + +#. 586 +msgid "Pakistan" +msgstr "باكستان" + +#. 616 +msgid "Poland" +msgstr "بولونيا" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "سانت بيير وميكولون" + +#. 612 +msgid "Pitcairn" +msgstr "بتكايرن" + +#. 630 +msgid "Puerto Rico" +msgstr "بورتوريكو" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "فلسطين المحتلّة، الأراضي الفلسطينيّة المحتلّة" + +#. 620 +msgid "Portugal" +msgstr "البرتغال" + +#. 585 +msgid "Palau" +msgstr "بالاو" + +#. 600 +msgid "Paraguay" +msgstr "الباراغواي" + +#. 634 +msgid "Qatar" +msgstr "قطر" + +#. 638 +msgid "Reunion" +msgstr "ريونيون" + +#. 642 +msgid "Romania" +msgstr "رومانيا" + +#. 688 +msgid "Serbia" +msgstr "صربيا" + +#. 643 +msgid "Russian Federation" +msgstr "الإتّحاد الروسي" + +#. 646 +msgid "Rwanda" +msgstr "رواندا" + +#. 682 +msgid "Saudi Arabia" +msgstr "المملكة العربيّة السّعوديّة" + +#. 090 +msgid "Solomon Islands" +msgstr "جزر سليمان" + +#. 690 +msgid "Seychelles" +msgstr "السّيشل" + +#. 736 +msgid "Sudan" +msgstr "السودان" + +#. 752 +msgid "Sweden" +msgstr "السّويد" + +#. 702 +msgid "Singapore" +msgstr "سنغفورة" + +#. 654 +msgid "Saint Helena" +msgstr "سانت هيلينا" + +#. 705 +msgid "Slovenia" +msgstr "سلوفينيا" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "سفالبارد وجان مايان" + +#. 703 +msgid "Slovakia" +msgstr "سلوفاكيا" + +#. 694 +msgid "Sierra Leone" +msgstr "سيراليون" + +#. 674 +msgid "San Marino" +msgstr "سان مارينو" + +#. 686 +msgid "Senegal" +msgstr "السنيغال" + +#. 706 +msgid "Somalia" +msgstr "الصّومال" + +#. 740 +msgid "Suriname" +msgstr "سورينام" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "ساو تومي وبرينسيبي" + +#. 222 +msgid "El Salvador" +msgstr "السلفادور" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "الجمهوريّة العربيّة السّوريّة" + +#. 748 +msgid "Swaziland" +msgstr "السّوازيلاند" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "جزر تركس وكايكوس" + +#. 148 +msgid "Chad" +msgstr "التشاد" + +#. 260 +msgid "French Southern Territories" +msgstr "المقاطعات الجنوبية الفرنسية" + +#. 768 +msgid "Togo" +msgstr "توغو" + +#. 764 +msgid "Thailand" +msgstr "تايلندا" + +#. 762 +msgid "Tajikistan" +msgstr "طاجكستان" + +#. 772 +msgid "Tokelau" +msgstr "توكلو" + +#. 626 +msgid "Timor-Leste" +msgstr "تيمور الشرقية" + +#. 795 +msgid "Turkmenistan" +msgstr "تركمانستان" + +#. 788 +msgid "Tunisia" +msgstr "تونس" + +#. 776 +msgid "Tonga" +msgstr "تونجا" + +#. 792 +msgid "Turkey" +msgstr "تركيا" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "ترينيداد وتوباغو" + +#. 798 +msgid "Tuvalu" +msgstr "توفالو" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "تايوان، محافظة صينية" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "تنزانيا، جمهوريّة تنزانيا المتّحدة" + +#. 804 +msgid "Ukraine" +msgstr "أوكرانيا" + +#. 800 +msgid "Uganda" +msgstr "اوغندا" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "جزر الولايات المتحدة البعيدة الصغيرة" + +#. 840 +msgid "United States" +msgstr "الولايات المتّحدة الأمريكية" + +#. 858 +msgid "Uruguay" +msgstr "الأوروغواي" + +#. 860 +msgid "Uzbekistan" +msgstr "أوزبكستان" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "الكرسي الرسولي (دولة الفاتيكان)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "سانت فنسنت والجرينادينز" + +#. 862 +msgid "Venezuela" +msgstr "فنزويلا" + +#. 092 +msgid "Virgin Islands, British" +msgstr "جزر فيرجن البريطانية" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "جزر فيرجن ، الولايات المتحدة" + +#. 704 +msgid "Viet Nam" +msgstr "الفييتنام" + +#. 548 +msgid "Vanuatu" +msgstr "فانواتو" + +#. 876 +msgid "Wallis and Futuna" +msgstr "واليس و فوتونا" + +#. 882 +msgid "Samoa" +msgstr "ساموا" + +#. 887 +msgid "Yemen" +msgstr "اليمن" + +#. 175 +msgid "Mayotte" +msgstr "مايوت" + +#. 710 +msgid "South Africa" +msgstr "جنوب إفريقيا" + +#. 894 +msgid "Zambia" +msgstr "زامبيا" + +#. 716 +msgid "Zimbabwe" +msgstr "زيمبابوي" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* غير معروف، أضف تسميات is_in إلى تلك المدن" + +msgid "Car" +msgstr "سيارة" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "الدولة" + +msgid "Postal" +msgstr "بريدي" + +msgid "Town" +msgstr "البلدة" + +msgid "District" +msgstr "حي" + +msgid "Street" +msgstr "الشارع" + +msgid "Number" +msgstr "الرقم" + +msgid "Enter Destination" +msgstr "أدخل الهدف" + +msgid "Zip Code" +msgstr "الرمز البريدي" + +msgid "City" +msgstr "المدينة" + +msgid "District/Township" +msgstr "الحي/البلدة" + +msgid "Map" +msgstr "الخريطة" + +msgid "Bookmark" +msgstr "إشارة مرجعية" + +msgid "Destination" +msgstr "الهدف" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "المظهار" + +msgid "_Route" +msgstr "الطريق" + +msgid "_Former Destinations" +msgstr "الأهداف السابقة" + +msgid "_Bookmarks" +msgstr "إشارات مرجعية" + +msgid "_Map" +msgstr "الخريطة" + +msgid "_Layout" +msgstr "التصميم" + +msgid "_Projection" +msgstr "الإسقاط" + +msgid "_Vehicle" +msgstr "وسيلة التنقل" + +msgid "Zoom_Out" +msgstr "صغّر الروئية" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "كبّر الروئية" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "إعادة الحساب" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "معلومات" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "قف الملاحة" + +msgid "Test" +msgstr "اختبار" + +msgid "_Quit" +msgstr "_إنهاء" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "إقفال على الطريق" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "سجل خريطة الطريق" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "تكبير/تصغير تلقائي" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "ملء الشاشة" + +msgid "Data" +msgstr "المعطيات" + +msgid "N" +msgstr "ش." + +msgid "NE" +msgstr "ش. ش." + +msgid "E" +msgstr "ش." + +msgid "SE" +msgstr "ج. ش." + +msgid "S" +msgstr "ج." + +msgid "SW" +msgstr "ج. غ." + +msgid "W" +msgstr "غ." + +msgid "NW" +msgstr "ش. غ." + +msgid "No" +msgstr "لا" + +msgid "2D" +msgstr "ثنائي الأبعاد" + +msgid "3D" +msgstr "ثلاثي الأبعاد" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Route %4.0fكلم %02d:%02d ETA" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "الطريك 0000كلم 0+00:00 ETA" + +msgid "Back to map" +msgstr "إرجع إلى الخريطة" + +msgid "Main Menu" +msgstr "اللائحة الرئيسية" + +msgid "Help" +msgstr "المساعدة" + +msgid "Back" +msgstr "السابق" + +msgid "Add Bookmark" +msgstr "أضف إشارة مرجعية" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "مواقع ذات أهمية" + +msgid "View in Browser" +msgstr "أعرض في المتصفح" + +msgid "Streets" +msgstr "الشوارع" + +msgid "House numbers" +msgstr "أرقام المنازل" + +msgid "View Attributes" +msgstr "أعرض الصفات" + +msgid "View on map" +msgstr "أعرض على الخريطة" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "إشارات مرجعية" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "علّم %s كإشارة مرجعية" + +msgid "Former Destinations" +msgstr "الأهداف السابقة" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "رقم المنزل" + +msgid "Layout" +msgstr "التصميم" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "الخرائط" + +msgid "Show Satellite Status" +msgstr "أعرض حالة القمر الإسطناعي" + +msgid " Elevation " +msgstr " الإرتفاع " + +msgid " Azimuth " +msgstr " السمت " + +msgid "Show NMEA Data" +msgstr "أعرض المعطيات NMEA" + +msgid "car" +msgstr "سيارة" + +msgid "bike" +msgstr "دراجة" + +msgid "pedestrian" +msgstr "مشاة" + +#, c-format +msgid "Current profile: %s" +msgstr "التعريف الحالي: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "غيّر التعريف إلى: %s" + +msgid "Set as active" +msgstr "عيّن كــفعلي" + +msgid "Show Satellite status" +msgstr "أعرض حالة القمر الإسطناعي" + +msgid "Show NMEA data" +msgstr "أعرض المعطيات NMEA" + +msgid "Vehicle" +msgstr "وسيلة التنقل" + +msgid "Rules" +msgstr "القواعد" + +msgid "Lock on road" +msgstr "إقفال على الطريق" + +msgid "Northing" +msgstr "شمالي دائم" + +msgid "Map follows Vehicle" +msgstr "الخريطة تتبع وسيلة التنقل" + +msgid "Message" +msgstr "الرسالة" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "وصف الطريق" + +msgid "Height Profile" +msgstr "لمحة عن الإرتفاع" + +msgid "Show Locale" +msgstr "أعرض المحليات" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "النقطة على الخريطة" + +msgid "Vehicle Position" +msgstr "موقع وسيلة التنقل" + +msgid "Main menu" +msgstr "اللائحة الرئيسية" + +msgid "" +"Show\n" +"Map" +msgstr "" +"أعرض\n" +"الخريطة" + +msgid "Settings" +msgstr "الإعدادات" + +msgid "Tools" +msgstr "العدة" + +msgid "Route" +msgstr "الطريق" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "أفعال" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "أخرج" + +msgid "" +"Stop\n" +"Navigation" +msgstr "قفّ" + +msgid "Display" +msgstr "المظهار" + +msgid "Fullscreen" +msgstr "ملء الشاشة" + +msgid "Window Mode" +msgstr "نمط النافذة" + +msgid "Description" +msgstr "الوصف" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "خيل/فرس" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "بعد %s ، أدخل المسستديرة" + +#~ msgid "Cursor" +#~ msgstr "المزلاق" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d كلم" diff --git a/po/ast.po.in b/po/ast.po.in new file mode 100644 index 0000000..bd33211 --- /dev/null +++ b/po/ast.po.in @@ -0,0 +1,1760 @@ +# Asturian translation for navit +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the navit package. +# Xuacu Saturio 2010 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-05-21 17:35+0000\n" +"Last-Translator: Xuacu Saturio \n" +"Language-Team: Asturian \n" +"Language: ast\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Executando dende'l direutoriu fonte.\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "Conseñando '%s' como '%s'.\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "cero-ésimu" + +msgid "first" +msgstr "primeru" + +msgid "second" +msgstr "segundu" + +msgid "third" +msgstr "terceru" + +msgid "fourth" +msgstr "cuartu" + +msgid "fifth" +msgstr "quintu" + +msgid "sixth" +msgstr "sestu" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "cero-ésima salida" + +msgid "first exit" +msgstr "primera salida" + +msgid "second exit" +msgstr "segunda salida" + +msgid "third exit" +msgstr "tercera salida" + +msgid "fourth exit" +msgstr "cuarta salida" + +msgid "fifth exit" +msgstr "quinta salida" + +msgid "sixth exit" +msgstr "sesta salida" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "en %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metros" + +#, c-format +msgid "in %d meters" +msgstr "en %d metros" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d,%d quilómetros" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "en %d,%d quilómetros" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "un quilómetru" +msgstr[1] "%d quilómetros" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "nun quilómetru" +msgstr[1] "en %d quilómetros" + +msgid "exit" +msgstr "salida" + +msgid "into the ramp" +msgstr "pal enllaz" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s pa la cai %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%s pal %s%s%s|male form" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%s pa la %s%s%s|female form" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%s pal %s%s%s|neutral form" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%s pa la %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "drecha" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "izquierda" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "selemente " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "enforma " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "dafechu " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "desconocío " + +msgid "When possible, please turn around" +msgstr "Cuando seya posible, de la vuelta" + +msgid "Enter the roundabout soon" +msgstr "Entre ceo na rotonda" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "llueu dexe la rotonda pola %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Dexe la rotonda pola %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Siga pela carretera los siguientes %s" + +msgid "soon" +msgstr "aína" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Tome la carretera %1$s dica %2$s" + +#, c-format +msgid "after %i roads" +msgstr "tres %i carreteres" + +msgid "now" +msgstr "agora" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "llueu tome la carretera %1$s dica %2$s" + +msgid "error" +msgstr "error" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Xire %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "llueu xire %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Llegó al destín %s" + +msgid "then you have reached your destination." +msgstr "entós llegará al destín." + +msgid "Position" +msgstr "Posición" + +msgid "Command" +msgstr "Comandu" + +msgid "Length" +msgstr "Llonxitú" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Tiempu" + +msgid "Destination Length" +msgstr "Distancia del destín" + +msgid "Destination Time" +msgstr "Tiempu a destín" + +msgid "Roadbook" +msgstr "Llibru de ruta" + +msgid "Set as position" +msgstr "Conseñar como posición" + +msgid "Set as destination" +msgstr "Conseñar como destín" + +msgid "Add as bookmark" +msgstr "Amestar marcador" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Puntu 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Coord. pantalla : %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Emiratos Árabes Unidos" + +#. 004 +msgid "Afghanistan" +msgstr "Afganistán" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua y Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguila" + +#. 008 +msgid "Albania" +msgstr "Albania" + +#. 051 +msgid "Armenia" +msgstr "Armenia" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Antilles Holandeses" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antártida" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "Samoa Americana" + +#. 040 +msgid "Austria" +msgstr "Austria" + +#. 036 +msgid "Australia" +msgstr "Australia" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Islles Aland" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbaiyán" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnia Herzegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesh" + +#. 056 +msgid "Belgium" +msgstr "Bélgica" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgaria" + +#. 048 +msgid "Bahrain" +msgstr "Bahrein" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "San Bartolomé" + +#. 060 +msgid "Bermuda" +msgstr "Bermudas" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei Darussalam" + +#. 068 +msgid "Bolivia" +msgstr "Bolivia" + +#. 076 +msgid "Brazil" +msgstr "Brasil" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "Bhután" + +#. 074 +msgid "Bouvet Island" +msgstr "Islla Bouvet" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Bielorrusia" + +#. 084 +msgid "Belize" +msgstr "Belice" + +#. 124 +msgid "Canada" +msgstr "Canadá" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Islles Cocos (Keeling)" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Congo, República Democrática del" + +#. 140 +msgid "Central African Republic" +msgstr "República Centroafricana" + +#. 178 +msgid "Congo" +msgstr "Congo" + +#. 756 +msgid "Switzerland" +msgstr "Suiza" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Costa de Marfil" + +#. 184 +msgid "Cook Islands" +msgstr "Islles Cook" + +#. 152 +msgid "Chile" +msgstr "Chile" + +#. 120 +msgid "Cameroon" +msgstr "Camerún" + +#. 156 +msgid "China" +msgstr "China" + +#. 170 +msgid "Colombia" +msgstr "Colombia" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Cuba" + +#. 132 +msgid "Cape Verde" +msgstr "Cabo Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Islla Christmas" + +#. 196 +msgid "Cyprus" +msgstr "Chipre" + +#. 203 +msgid "Czech Republic" +msgstr "República Checa" + +#. 276 +msgid "Germany" +msgstr "Alemania" + +#. 262 +msgid "Djibouti" +msgstr "Djibouti" + +#. 208 +msgid "Denmark" +msgstr "Dinamarca" + +#. 212 +msgid "Dominica" +msgstr "Dominica" + +#. 214 +msgid "Dominican Republic" +msgstr "República Dominicana" + +#. 012 +msgid "Algeria" +msgstr "Argelia" + +#. 218 +msgid "Ecuador" +msgstr "Ecuador" + +#. 233 +msgid "Estonia" +msgstr "Estonia" + +#. 818 +msgid "Egypt" +msgstr "Exiptu" + +#. 732 +msgid "Western Sahara" +msgstr "Sáhara Occidental" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "España" + +#. 231 +msgid "Ethiopia" +msgstr "Etiopía" + +#. 246 +msgid "Finland" +msgstr "Finlandia" + +#. 242 +msgid "Fiji" +msgstr "Fiyi" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Islles Falkland (Malvines)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Micronesia, Estaos Federaos de" + +#. 234 +msgid "Faroe Islands" +msgstr "Islles Feroe" + +#. 250 +msgid "France" +msgstr "Francia" + +#. 266 +msgid "Gabon" +msgstr "Gabón" + +#. 826 +msgid "United Kingdom" +msgstr "Reinu Xuníu" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Xeorxia" + +#. 254 +msgid "French Guiana" +msgstr "Guyana Francesa" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Xibraltar" + +#. 304 +msgid "Greenland" +msgstr "Groenlandia" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadalupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Guinea Ecuatorial" + +#. 300 +msgid "Greece" +msgstr "Grecia" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Islles Georgia del Sur y Sandwich del sur" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Islla Heard ya Islles McDonald" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Croacia" + +#. 332 +msgid "Haiti" +msgstr "Haití" + +#. 348 +msgid "Hungary" +msgstr "Hungría" + +#. 360 +msgid "Indonesia" +msgstr "Indonesia" + +#. 372 +msgid "Ireland" +msgstr "Irlanda" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "Islla de Man" + +#. 356 +msgid "India" +msgstr "India" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Territoriu Oceánicu de la India Británica" + +#. 368 +msgid "Iraq" +msgstr "Iraq" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Irán, República Islámica de" + +#. 352 +msgid "Iceland" +msgstr "Islandia" + +#. 380 +msgid "Italy" +msgstr "Italia" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaica" + +#. 400 +msgid "Jordan" +msgstr "Xordania" + +#. 392 +msgid "Japan" +msgstr "Xapón" + +#. 404 +msgid "Kenya" +msgstr "Kenia" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirguistán" + +#. 116 +msgid "Cambodia" +msgstr "Camboya" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Comores" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Saint Kitts y Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Corea, República Popular Democrática de" + +#. 410 +msgid "Korea, Republic of" +msgstr "Corea, República de" + +#. 414 +msgid "Kuwait" +msgstr "Kuwait" + +#. 136 +msgid "Cayman Islands" +msgstr "Islles Caimán" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazakhstán" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laos, República Popular Democrática de" + +#. 422 +msgid "Lebanon" +msgstr "Líbano" + +#. 662 +msgid "Saint Lucia" +msgstr "Santa Llucía" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberia" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Lituania" + +#. 442 +msgid "Luxembourg" +msgstr "Luxemburgo" + +#. 428 +msgid "Latvia" +msgstr "Letonia" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Jamahiriya Árabe Libia" + +#. 504 +msgid "Morocco" +msgstr "Marruecos" + +#. 492 +msgid "Monaco" +msgstr "Mónaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldavia, República de" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Saint Martin (Parte Francesa)" + +#. 450 +msgid "Madagascar" +msgstr "Madagascar" + +#. 584 +msgid "Marshall Islands" +msgstr "Islles Marshall" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Macedonia, antigua República Yugoslava de" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongolia" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Islles Marianes del Norte" + +#. 474 +msgid "Martinique" +msgstr "Martinica" + +#. 478 +msgid "Mauritania" +msgstr "Mauritania" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauricio" + +#. 462 +msgid "Maldives" +msgstr "Maldives" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "México" + +#. 458 +msgid "Malaysia" +msgstr "Malasia" + +#. 508 +msgid "Mozambique" +msgstr "Mozambique" + +#. 516 +msgid "Namibia" +msgstr "Namibia" + +#. 540 +msgid "New Caledonia" +msgstr "Nueva Caledonia" + +#. 562 +msgid "Niger" +msgstr "Níger" + +#. 574 +msgid "Norfolk Island" +msgstr "Islla Norfolk" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nicaragua" + +#. 528 +msgid "Netherlands" +msgstr "Holanda" + +#. 578 +msgid "Norway" +msgstr "Noruega" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Nueva Zelanda" + +#. 512 +msgid "Oman" +msgstr "Omán" + +#. 591 +msgid "Panama" +msgstr "Panamá" + +#. 604 +msgid "Peru" +msgstr "Perú" + +#. 258 +msgid "French Polynesia" +msgstr "Polinesia Francesa" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papúa Nueva Guinea" + +#. 608 +msgid "Philippines" +msgstr "Filipines" + +#. 586 +msgid "Pakistan" +msgstr "Paquistán" + +#. 616 +msgid "Poland" +msgstr "Polonia" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint Pierre y Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestina, Territoriu Ocupáu" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Qatar" + +#. 638 +msgid "Reunion" +msgstr "Reunión" + +#. 642 +msgid "Romania" +msgstr "Rumanía" + +#. 688 +msgid "Serbia" +msgstr "Serbia" + +#. 643 +msgid "Russian Federation" +msgstr "Federación Rusa" + +#. 646 +msgid "Rwanda" +msgstr "Ruanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Arabia Saudí" + +#. 090 +msgid "Solomon Islands" +msgstr "Islles Sólomon" + +#. 690 +msgid "Seychelles" +msgstr "Seychelles" + +#. 736 +msgid "Sudan" +msgstr "Sudán" + +#. 752 +msgid "Sweden" +msgstr "Suecia" + +#. 702 +msgid "Singapore" +msgstr "Singapur" + +#. 654 +msgid "Saint Helena" +msgstr "Santa Helena" + +#. 705 +msgid "Slovenia" +msgstr "Eslovenia" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard y Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Eslovaquia" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leona" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalia" + +#. 740 +msgid "Suriname" +msgstr "Surinam" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Santo Tomé y Príncipe" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "República Árabe de Siria" + +#. 748 +msgid "Swaziland" +msgstr "Suazilandia" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Islles Caicos y Turks" + +#. 148 +msgid "Chad" +msgstr "Chad" + +#. 260 +msgid "French Southern Territories" +msgstr "Territorios Franceses del Sur" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Tailandia" + +#. 762 +msgid "Tajikistan" +msgstr "Tayikistán" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Timor Oriental" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistán" + +#. 788 +msgid "Tunisia" +msgstr "Túnez" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turquía" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad y Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan, Provincia de China" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzania, República Xunía de" + +#. 804 +msgid "Ukraine" +msgstr "Ucrania" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Islles Perifériques Menores d'Estaos Xuníos" + +#. 840 +msgid "United States" +msgstr "Estaos Xuníos" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbequistán" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Santa Sede (Ciudá Estáu del Vaticanu)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "San Vicente y les Granadines" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Islles Vírxenes, Britániques" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Islles Vírxenes, EE.XX." + +#. 704 +msgid "Viet Nam" +msgstr "Viet Nam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis y Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Yemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Sudáfrica" + +#. 894 +msgid "Zambia" +msgstr "Zambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabue" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Desconocíes, amestar etiquetes is_in a eses ciudaes" + +msgid "Car" +msgstr "Coche" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "País" + +msgid "Postal" +msgstr "Postal" + +msgid "Town" +msgstr "Ciudá" + +msgid "District" +msgstr "Distritu" + +msgid "Street" +msgstr "Cai" + +msgid "Number" +msgstr "Númberu" + +msgid "Enter Destination" +msgstr "Escribir destín" + +msgid "Zip Code" +msgstr "Códigu postal" + +msgid "City" +msgstr "Ciudá" + +msgid "District/Township" +msgstr "Distritu/Barriu" + +msgid "Map" +msgstr "Mapa" + +msgid "Bookmark" +msgstr "Marcador" + +msgid "Destination" +msgstr "Destín" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Amosar" + +msgid "_Route" +msgstr "Ruta" + +msgid "_Former Destinations" +msgstr "Destinos anteriores" + +msgid "_Bookmarks" +msgstr "Marcadores" + +msgid "_Map" +msgstr "Mapa" + +msgid "_Layout" +msgstr "Disposición" + +msgid "_Projection" +msgstr "Proyeición" + +msgid "_Vehicle" +msgstr "Vehiculu" + +msgid "Zoom_Out" +msgstr "Amenorgar" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Aumentar" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Recalcular" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Info" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Parar navegación" + +msgid "Test" +msgstr "Probar" + +msgid "_Quit" +msgstr "_Colar" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Arcoxar carretera" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Llibru de ruta" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Autozoom" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Pantalla completa" + +msgid "Data" +msgstr "Datos" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NE" + +msgid "E" +msgstr "E" + +msgid "SE" +msgstr "SE" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SO" + +msgid "W" +msgstr "O" + +msgid "NW" +msgstr "NO" + +msgid "No" +msgstr "Non" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Ruta %4.0fkm %02d:%02d TED" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Ruta 0000km 0+00:00 TED" + +msgid "Back to map" +msgstr "Tornar al mapa" + +msgid "Main Menu" +msgstr "Menú principal" + +msgid "Help" +msgstr "Aida" + +msgid "Back" +msgstr "Atrás" + +msgid "Add Bookmark" +msgstr "Amestar marcador" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "Amestar carpeta de marcadores" + +msgid "Rename" +msgstr "Renomar" + +msgid "POIs" +msgstr "PDIs" + +msgid "View in Browser" +msgstr "Ver nel navegador" + +msgid "Streets" +msgstr "Cais" + +msgid "House numbers" +msgstr "Númberos de portal" + +msgid "View Attributes" +msgstr "Ver atributos" + +msgid "View on map" +msgstr "Ver nel mapa" + +msgid "Cut Bookmark" +msgstr "Cortar marcador" + +msgid "Copy Bookmark" +msgstr "Copiar marcador" + +msgid "Rename Bookmark" +msgstr "Renomar marcador" + +msgid "Paste Bookmark" +msgstr "Apegar marcador" + +msgid "Delete Bookmark" +msgstr "Desaniciar marcador" + +msgid "Bookmarks" +msgstr "Marcadores" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Apegar marcador" + +#, c-format +msgid "Bookmark %s" +msgstr "Marcador %s" + +msgid "Former Destinations" +msgstr "Destinos anteriores" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Númberu de portal" + +msgid "Layout" +msgstr "Disposición" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Mapes" + +msgid "Show Satellite Status" +msgstr "Amosar estáu de satélite" + +msgid " Elevation " +msgstr " Altor " + +msgid " Azimuth " +msgstr " Azimut " + +msgid "Show NMEA Data" +msgstr "Amosar datos NMEA" + +msgid "car" +msgstr "coche" + +msgid "bike" +msgstr "bici" + +msgid "pedestrian" +msgstr "peatón" + +#, c-format +msgid "Current profile: %s" +msgstr "Perfil actual: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Camudar perfil a: %s" + +msgid "Set as active" +msgstr "Conseñar como activo" + +msgid "Show Satellite status" +msgstr "Amosar estáu de satélite" + +msgid "Show NMEA data" +msgstr "Amosar datos NMEA" + +msgid "Vehicle" +msgstr "Vehiculu" + +msgid "Rules" +msgstr "Regles" + +msgid "Lock on road" +msgstr "Arcoxar a carretera" + +msgid "Northing" +msgstr "Llatitú" + +msgid "Map follows Vehicle" +msgstr "El mapa sigue al vehículu" + +msgid "Message" +msgstr "Mensax" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Descripción de ruta" + +msgid "Height Profile" +msgstr "Perfil d'altures" + +msgid "Show Locale" +msgstr "Amosar local" + +msgid "About Navit" +msgstr "Tocante a Navit" + +#. Authors +msgid "By" +msgstr "Por" + +#. Contributors +msgid "And all the Navit Team" +msgstr "Y tou l'equipu de Navit" + +msgid "members and contributors." +msgstr "miembros y collaboradores." + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Puntu del mapa" + +msgid "Vehicle Position" +msgstr "Posición del vehículu" + +msgid "Main menu" +msgstr "Menú principal" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Ver\n" +"Mapa" + +msgid "Settings" +msgstr "Axustes" + +msgid "Tools" +msgstr "Ferramientes" + +msgid "Route" +msgstr "Ruta" + +msgid "About" +msgstr "Tocante a" + +msgid "Actions" +msgstr "Aiciones" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Colar" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Parar\n" +"Navegación" + +msgid "Display" +msgstr "Amosar" + +msgid "Fullscreen" +msgstr "Pantalla completa" + +msgid "Window Mode" +msgstr "Mou ventana" + +msgid "Description" +msgstr "Descripción" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "caballu" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "En %s, entre na rotonda" + +#~ msgid "Cursor" +#~ msgstr "Cursor" diff --git a/po/bg.po.in b/po/bg.po.in new file mode 100644 index 0000000..75cb7c4 --- /dev/null +++ b/po/bg.po.in @@ -0,0 +1,1763 @@ +# Bulgarian translation for navit +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the navit package. +# MalamiR 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2009-12-20 20:36+0000\n" +"Last-Translator: Alex Stanev \n" +"Language-Team: Bulgarian \n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "нулев" + +msgid "first" +msgstr "първи" + +msgid "second" +msgstr "втори" + +msgid "third" +msgstr "трети" + +msgid "fourth" +msgstr "четвърти" + +msgid "fifth" +msgstr "пети" + +msgid "sixth" +msgstr "шести" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "няма изход" + +msgid "first exit" +msgstr "първия изход" + +msgid "second exit" +msgstr "втория изход" + +msgid "third exit" +msgstr "третия изход" + +msgid "fourth exit" +msgstr "четвъртия изход" + +msgid "fifth exit" +msgstr "петия изход" + +msgid "sixth exit" +msgstr "шестия изход" + +#, c-format +msgid "%d m" +msgstr "%d м" + +#, c-format +msgid "in %d m" +msgstr "след %d м" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d метра" + +#, c-format +msgid "in %d meters" +msgstr "след %d метра" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "след %d.%d километра" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "един километър" +msgstr[1] "%d километра" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "след един километър" +msgstr[1] "след %d километра" + +msgid "exit" +msgstr "изход" + +msgid "into the ramp" +msgstr "на рампата" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "надясно" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "наляво" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "леко " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "силно " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "" + +msgid "When possible, please turn around" +msgstr "Когато е възможно обърнете" + +msgid "Enter the roundabout soon" +msgstr "Скоро навлизате в кръгово" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "след това излезте от кръговото на %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Излезте от кръговото на %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Следвайте пътя през следващите %s" + +msgid "soon" +msgstr "скоро" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "" + +#, c-format +msgid "after %i roads" +msgstr "след %i пресечки" + +msgid "now" +msgstr "сега" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "тогава хванете пътя %1$s към %2$s" + +msgid "error" +msgstr "грешка" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Завийте %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "тогава завийте %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Достигнахте до целта %s" + +msgid "then you have reached your destination." +msgstr "след това пристигате на местоназначението" + +msgid "Position" +msgstr "Позиция" + +msgid "Command" +msgstr "Команда" + +msgid "Length" +msgstr "Дължина" + +msgid "km" +msgstr "км" + +msgid "m" +msgstr "м" + +msgid "Time" +msgstr "Време" + +msgid "Destination Length" +msgstr "Разстояние до целта" + +msgid "Destination Time" +msgstr "Време до целта" + +msgid "Roadbook" +msgstr "Пътна книга" + +msgid "Set as position" +msgstr "Установете като позиция" + +msgid "Set as destination" +msgstr "Задай като цел" + +msgid "Add as bookmark" +msgstr "Добави като Отметка" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Точка 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Координати на екрана: %d %d" + +#. 020 +msgid "Andorra" +msgstr "Андора" + +#. 784 +msgid "United Arab Emirates" +msgstr "Обединени Арабски Емирства" + +#. 004 +msgid "Afghanistan" +msgstr "Афганистан" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Антигуа и Барбуда" + +#. 660 +msgid "Anguilla" +msgstr "Ангуила" + +#. 008 +msgid "Albania" +msgstr "Албания" + +#. 051 +msgid "Armenia" +msgstr "Армения" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Холандски Антили" + +#. 024 +msgid "Angola" +msgstr "Ангола" + +#. 010 +msgid "Antarctica" +msgstr "Антарктика" + +#. 032 +msgid "Argentina" +msgstr "Аржентина" + +#. 016 +msgid "American Samoa" +msgstr "Американска Самоа" + +#. 040 +msgid "Austria" +msgstr "Австрия" + +#. 036 +msgid "Australia" +msgstr "Австралия" + +#. 533 +msgid "Aruba" +msgstr "Аруба" + +#. 248 +msgid "Aland Islands" +msgstr "Айландски Острови" + +#. 031 +msgid "Azerbaijan" +msgstr "Азърбайджан" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Босна и Херцеговина" + +#. 052 +msgid "Barbados" +msgstr "Барбадос" + +#. 050 +msgid "Bangladesh" +msgstr "Бангладеш" + +#. 056 +msgid "Belgium" +msgstr "Белгия" + +#. 854 +msgid "Burkina Faso" +msgstr "Буркина Фасо" + +#. 100 +msgid "Bulgaria" +msgstr "България" + +#. 048 +msgid "Bahrain" +msgstr "Бахрейн" + +#. 108 +msgid "Burundi" +msgstr "Бурунди" + +#. 204 +msgid "Benin" +msgstr "Бенин" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Сен Бартелми" + +#. 060 +msgid "Bermuda" +msgstr "Бермудски острови" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Бруней" + +#. 068 +msgid "Bolivia" +msgstr "Боливия" + +#. 076 +msgid "Brazil" +msgstr "Бразилия" + +#. 044 +msgid "Bahamas" +msgstr "Бахамски острови" + +#. 064 +msgid "Bhutan" +msgstr "Бутан" + +#. 074 +msgid "Bouvet Island" +msgstr "Остров Буве" + +#. 072 +msgid "Botswana" +msgstr "Ботсвана" + +#. 112 +msgid "Belarus" +msgstr "Беларус" + +#. 084 +msgid "Belize" +msgstr "Белийз" + +#. 124 +msgid "Canada" +msgstr "Канада" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Кокосови Острови" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Демократична Република Конго" + +#. 140 +msgid "Central African Republic" +msgstr "Централна Африканска Република" + +#. 178 +msgid "Congo" +msgstr "Конго" + +#. 756 +msgid "Switzerland" +msgstr "Швейцария" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Кот Д'Ивоар" + +#. 184 +msgid "Cook Islands" +msgstr "Острови Кук" + +#. 152 +msgid "Chile" +msgstr "Чили" + +#. 120 +msgid "Cameroon" +msgstr "Камерун" + +#. 156 +msgid "China" +msgstr "Китай" + +#. 170 +msgid "Colombia" +msgstr "Колумбия" + +#. 188 +msgid "Costa Rica" +msgstr "Коста Рика" + +#. 192 +msgid "Cuba" +msgstr "Куба" + +#. 132 +msgid "Cape Verde" +msgstr "Кейп Верде" + +#. 162 +msgid "Christmas Island" +msgstr "Коледни острови" + +#. 196 +msgid "Cyprus" +msgstr "Кипър" + +#. 203 +msgid "Czech Republic" +msgstr "Чешка република" + +#. 276 +msgid "Germany" +msgstr "Германия" + +#. 262 +msgid "Djibouti" +msgstr "Джибути" + +#. 208 +msgid "Denmark" +msgstr "Дания" + +#. 212 +msgid "Dominica" +msgstr "Доминика" + +#. 214 +msgid "Dominican Republic" +msgstr "Доминиканска Република" + +#. 012 +msgid "Algeria" +msgstr "Алжир" + +#. 218 +msgid "Ecuador" +msgstr "Еквадор" + +#. 233 +msgid "Estonia" +msgstr "Естония" + +#. 818 +msgid "Egypt" +msgstr "Египет" + +#. 732 +msgid "Western Sahara" +msgstr "Западна Сахара" + +#. 232 +msgid "Eritrea" +msgstr "Еритрея" + +#. 724 +msgid "Spain" +msgstr "Испания" + +#. 231 +msgid "Ethiopia" +msgstr "Етиопия" + +#. 246 +msgid "Finland" +msgstr "Финландия" + +#. 242 +msgid "Fiji" +msgstr "Фиджи" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Фолклендски Острови (Малвини)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Микронезия, Обединени щати" + +#. 234 +msgid "Faroe Islands" +msgstr "Острови Фаро" + +#. 250 +msgid "France" +msgstr "Франция" + +#. 266 +msgid "Gabon" +msgstr "Габон" + +#. 826 +msgid "United Kingdom" +msgstr "Обединеното Кралство" + +#. 308 +msgid "Grenada" +msgstr "Гренада" + +#. 268 +msgid "Georgia" +msgstr "Грузия" + +#. 254 +msgid "French Guiana" +msgstr "Френска Гвиана" + +#. 831 +msgid "Guernsey" +msgstr "Гърнси" + +#. 288 +msgid "Ghana" +msgstr "Гана" + +#. 292 +msgid "Gibraltar" +msgstr "Гибралтар" + +#. 304 +msgid "Greenland" +msgstr "Гренландия" + +#. 270 +msgid "Gambia" +msgstr "Гамбия" + +#. 324 +msgid "Guinea" +msgstr "Гвинея" + +#. 312 +msgid "Guadeloupe" +msgstr "Гваделупа" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Екваториална Гвинея" + +#. 300 +msgid "Greece" +msgstr "Гърция" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Южна Джорджия и Южни Сандвичеви острови" + +#. 320 +msgid "Guatemala" +msgstr "Гватемала" + +#. 316 +msgid "Guam" +msgstr "Гуам" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Гвинея-Бисау" + +#. 328 +msgid "Guyana" +msgstr "Гаяна" + +#. 344 +msgid "Hong Kong" +msgstr "Хонг Конг" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Острови Хърд и МакДоналд" + +#. 340 +msgid "Honduras" +msgstr "Хондурас" + +#. 191 +msgid "Croatia" +msgstr "Хърватска" + +#. 332 +msgid "Haiti" +msgstr "Хаити" + +#. 348 +msgid "Hungary" +msgstr "Унгария" + +#. 360 +msgid "Indonesia" +msgstr "Индонезия" + +#. 372 +msgid "Ireland" +msgstr "Ирландия" + +#. 376 +msgid "Israel" +msgstr "Израел" + +#. 833 +msgid "Isle of Man" +msgstr "Остров Ман" + +#. 356 +msgid "India" +msgstr "Индия" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Британска територия в Индийския океан" + +#. 368 +msgid "Iraq" +msgstr "Ирак" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Иран, Ислямска република" + +#. 352 +msgid "Iceland" +msgstr "Исландия" + +#. 380 +msgid "Italy" +msgstr "Италия" + +#. 832 +msgid "Jersey" +msgstr "Джърси (остров)" + +#. 388 +msgid "Jamaica" +msgstr "Ямайка" + +#. 400 +msgid "Jordan" +msgstr "Йордания" + +#. 392 +msgid "Japan" +msgstr "Япония" + +#. 404 +msgid "Kenya" +msgstr "Кения" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Киргизстан" + +#. 116 +msgid "Cambodia" +msgstr "Камбоджа" + +#. 296 +msgid "Kiribati" +msgstr "Кирибати" + +#. 174 +msgid "Comoros" +msgstr "Комори" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Сейнт Китс и Невис" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Корея, Демократична народна република" + +#. 410 +msgid "Korea, Republic of" +msgstr "Корея, Република" + +#. 414 +msgid "Kuwait" +msgstr "Кувейт" + +#. 136 +msgid "Cayman Islands" +msgstr "Кайманови острови" + +#. 398 +msgid "Kazakhstan" +msgstr "Казахстан" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Лаоска народнодемократична република" + +#. 422 +msgid "Lebanon" +msgstr "Ливан" + +#. 662 +msgid "Saint Lucia" +msgstr "Сейнт Лусия" + +#. 438 +msgid "Liechtenstein" +msgstr "Лихтенщайн" + +#. 144 +msgid "Sri Lanka" +msgstr "Шри Ланка" + +#. 430 +msgid "Liberia" +msgstr "Либерия" + +#. 426 +msgid "Lesotho" +msgstr "Лесото" + +#. 440 +msgid "Lithuania" +msgstr "Литва" + +#. 442 +msgid "Luxembourg" +msgstr "Люксембург" + +#. 428 +msgid "Latvia" +msgstr "Латвия" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Либийска Арабска Джамахирия" + +#. 504 +msgid "Morocco" +msgstr "Мароко" + +#. 492 +msgid "Monaco" +msgstr "Монако" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Молдова, Република" + +#. 499 +msgid "Montenegro" +msgstr "Черна гора" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Свети Мартин (френска част)" + +#. 450 +msgid "Madagascar" +msgstr "Мадагаскар" + +#. 584 +msgid "Marshall Islands" +msgstr "Маршалови острови" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Македония, Бивша Югославска Република" + +#. 466 +msgid "Mali" +msgstr "Мали" + +#. 104 +msgid "Myanmar" +msgstr "Мианмарският съюз" + +#. 496 +msgid "Mongolia" +msgstr "Монголия" + +#. 446 +msgid "Macao" +msgstr "Макао" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Северни Мариански острови" + +#. 474 +msgid "Martinique" +msgstr "Мартиника" + +#. 478 +msgid "Mauritania" +msgstr "Мавритания" + +#. 500 +msgid "Montserrat" +msgstr "Монсерат" + +#. 470 +msgid "Malta" +msgstr "Малта" + +#. 480 +msgid "Mauritius" +msgstr "Мавриций" + +#. 462 +msgid "Maldives" +msgstr "Малдивски острови" + +#. 454 +msgid "Malawi" +msgstr "Малави" + +#. 484 +msgid "Mexico" +msgstr "Мексико" + +#. 458 +msgid "Malaysia" +msgstr "Малайзия" + +#. 508 +msgid "Mozambique" +msgstr "Мозамбик" + +#. 516 +msgid "Namibia" +msgstr "Намибия" + +#. 540 +msgid "New Caledonia" +msgstr "Нова Каледония" + +#. 562 +msgid "Niger" +msgstr "Нигер" + +#. 574 +msgid "Norfolk Island" +msgstr "Остров Норфолк" + +#. 566 +msgid "Nigeria" +msgstr "Нигерия" + +#. 558 +msgid "Nicaragua" +msgstr "Никарагуа" + +#. 528 +msgid "Netherlands" +msgstr "Кралство Холандия" + +#. 578 +msgid "Norway" +msgstr "Кралство Норвегия" + +#. 524 +msgid "Nepal" +msgstr "Непал" + +#. 520 +msgid "Nauru" +msgstr "Науру" + +#. 570 +msgid "Niue" +msgstr "Ниуе" + +#. 554 +msgid "New Zealand" +msgstr "Нова Зеландия" + +#. 512 +msgid "Oman" +msgstr "Оман" + +#. 591 +msgid "Panama" +msgstr "Панама" + +#. 604 +msgid "Peru" +msgstr "Перу" + +#. 258 +msgid "French Polynesia" +msgstr "Френска Полинезия" + +#. 598 +msgid "Papua New Guinea" +msgstr "Папуа Нова Гвинея" + +#. 608 +msgid "Philippines" +msgstr "Филипини" + +#. 586 +msgid "Pakistan" +msgstr "Пакистан" + +#. 616 +msgid "Poland" +msgstr "Полша" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Свети Пиер и Микелон" + +#. 612 +msgid "Pitcairn" +msgstr "Острови Питкерн" + +#. 630 +msgid "Puerto Rico" +msgstr "Пуерто Рико" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Палестинска територия, Окупирана" + +#. 620 +msgid "Portugal" +msgstr "Португалия" + +#. 585 +msgid "Palau" +msgstr "Палау" + +#. 600 +msgid "Paraguay" +msgstr "Парагвай" + +#. 634 +msgid "Qatar" +msgstr "Катар" + +#. 638 +msgid "Reunion" +msgstr "Реюнион" + +#. 642 +msgid "Romania" +msgstr "Румъния" + +#. 688 +msgid "Serbia" +msgstr "Сърбия" + +#. 643 +msgid "Russian Federation" +msgstr "Руска Федерация" + +#. 646 +msgid "Rwanda" +msgstr "Руанда" + +#. 682 +msgid "Saudi Arabia" +msgstr "Саудитска Арабия" + +#. 090 +msgid "Solomon Islands" +msgstr "Соломонови острови" + +#. 690 +msgid "Seychelles" +msgstr "Сейшелски о-ви" + +#. 736 +msgid "Sudan" +msgstr "Судан" + +#. 752 +msgid "Sweden" +msgstr "Швеция" + +#. 702 +msgid "Singapore" +msgstr "Сингапур" + +#. 654 +msgid "Saint Helena" +msgstr "Света Елена" + +#. 705 +msgid "Slovenia" +msgstr "Словения" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Шпицберген и Ян Майен" + +#. 703 +msgid "Slovakia" +msgstr "Словакия" + +#. 694 +msgid "Sierra Leone" +msgstr "Сиера Леоне" + +#. 674 +msgid "San Marino" +msgstr "Сан Марино" + +#. 686 +msgid "Senegal" +msgstr "Сенегал" + +#. 706 +msgid "Somalia" +msgstr "Сомалия" + +#. 740 +msgid "Suriname" +msgstr "Суринам" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Сао Томе и Принсипи" + +#. 222 +msgid "El Salvador" +msgstr "Ел Салвадор" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Сирийска Арабска Република" + +#. 748 +msgid "Swaziland" +msgstr "Свазиленд" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Острови Тюрк и Кайкос" + +#. 148 +msgid "Chad" +msgstr "Чад" + +#. 260 +msgid "French Southern Territories" +msgstr "Френски Южни Територии" + +#. 768 +msgid "Togo" +msgstr "Того" + +#. 764 +msgid "Thailand" +msgstr "Тайланд" + +#. 762 +msgid "Tajikistan" +msgstr "Таджикистан" + +#. 772 +msgid "Tokelau" +msgstr "Токелау" + +#. 626 +msgid "Timor-Leste" +msgstr "Източен Тимор" + +#. 795 +msgid "Turkmenistan" +msgstr "Туркменистан" + +#. 788 +msgid "Tunisia" +msgstr "Тунис" + +#. 776 +msgid "Tonga" +msgstr "Тонга" + +#. 792 +msgid "Turkey" +msgstr "Турция" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Тринидад и Тобаго" + +#. 798 +msgid "Tuvalu" +msgstr "Тувалу" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Тайван, Китайска провинция" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Танзания, Обединена република" + +#. 804 +msgid "Ukraine" +msgstr "Украйна" + +#. 800 +msgid "Uganda" +msgstr "Уганда" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Малки далечни острови на САЩ" + +#. 840 +msgid "United States" +msgstr "Съединени Амеркански Щати" + +#. 858 +msgid "Uruguay" +msgstr "Уругвай" + +#. 860 +msgid "Uzbekistan" +msgstr "Узбекистан" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Ватикана" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Сейнт Винсънт и Гренадини" + +#. 862 +msgid "Venezuela" +msgstr "Венецуела" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Британски Вирджински острови" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Американски Вирджински острови" + +#. 704 +msgid "Viet Nam" +msgstr "Виетнам" + +#. 548 +msgid "Vanuatu" +msgstr "Вануату" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Уолис и Футуна" + +#. 882 +msgid "Samoa" +msgstr "Самоа" + +#. 887 +msgid "Yemen" +msgstr "Йемен" + +#. 175 +msgid "Mayotte" +msgstr "Майот" + +#. 710 +msgid "South Africa" +msgstr "Република Южна Африка" + +#. 894 +msgid "Zambia" +msgstr "Замбия" + +#. 716 +msgid "Zimbabwe" +msgstr "Зимбабве" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "" + +msgid "Car" +msgstr "Автомобил" + +msgid "Iso2" +msgstr "" + +msgid "Iso3" +msgstr "" + +msgid "Country" +msgstr "Държава" + +msgid "Postal" +msgstr "Пощенски" + +msgid "Town" +msgstr "Град" + +msgid "District" +msgstr "Окръг" + +msgid "Street" +msgstr "Улица" + +msgid "Number" +msgstr "Номер" + +msgid "Enter Destination" +msgstr "Въведете мостоназначение" + +msgid "Zip Code" +msgstr "Пощенски код" + +msgid "City" +msgstr "Град" + +msgid "District/Township" +msgstr "Община" + +msgid "Map" +msgstr "Карта" + +msgid "Bookmark" +msgstr "Отметка" + +msgid "Destination" +msgstr "Местоназначение" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Показване" + +msgid "_Route" +msgstr "Маршрут" + +msgid "_Former Destinations" +msgstr "Предишни Местоназначения" + +msgid "_Bookmarks" +msgstr "Отметки" + +msgid "_Map" +msgstr "Карта" + +msgid "_Layout" +msgstr "Изглед" + +msgid "_Projection" +msgstr "Проекция" + +msgid "_Vehicle" +msgstr "Превозно средство" + +msgid "Zoom_Out" +msgstr "Отдалечи" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Приближи" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Преизчисляване" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Информация" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Спри Навигацията" + +msgid "Test" +msgstr "Тест" + +msgid "_Quit" +msgstr "_Изход" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Придържай към пътя" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Пътна книга" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Цял екран" + +msgid "Data" +msgstr "Данни" + +msgid "N" +msgstr "С" + +msgid "NE" +msgstr "СИ" + +msgid "E" +msgstr "И" + +msgid "SE" +msgstr "ЮИ" + +msgid "S" +msgstr "Ю" + +msgid "SW" +msgstr "ЮЗ" + +msgid "W" +msgstr "З" + +msgid "NW" +msgstr "СЗ" + +msgid "No" +msgstr "" + +msgid "2D" +msgstr "" + +msgid "3D" +msgstr "" + +msgid "OT" +msgstr "" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "" + +msgid "Back to map" +msgstr "Обратно към картата" + +msgid "Main Menu" +msgstr "Основно меню" + +msgid "Help" +msgstr "Помощ" + +msgid "Back" +msgstr "Назад" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "" + +msgid "View in Browser" +msgstr "Виж в Браузър" + +msgid "Streets" +msgstr "Улици" + +msgid "House numbers" +msgstr "" + +msgid "View Attributes" +msgstr "Виж Атрибутите" + +msgid "View on map" +msgstr "Виж на картата" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "Отметки" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "Отметка %s" + +msgid "Former Destinations" +msgstr "Предишни Местоназначения" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "" + +msgid "Layout" +msgstr "Изглед" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Карти" + +msgid "Show Satellite Status" +msgstr "Покажи Състояние на Сателити" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "Покажи NMEA Данни" + +msgid "car" +msgstr "" + +msgid "bike" +msgstr "" + +msgid "pedestrian" +msgstr "" + +#, c-format +msgid "Current profile: %s" +msgstr "" + +#, c-format +msgid "Change profile to: %s" +msgstr "" + +msgid "Set as active" +msgstr "Укажи като активен" + +msgid "Show Satellite status" +msgstr "Покажи състояние на Сателити" + +msgid "Show NMEA data" +msgstr "Покажи NMEA Данни" + +msgid "Vehicle" +msgstr "Превозно средство" + +msgid "Rules" +msgstr "Правила" + +msgid "Lock on road" +msgstr "" + +msgid "Northing" +msgstr "" + +msgid "Map follows Vehicle" +msgstr "Картата следва Автомобила" + +msgid "Message" +msgstr "" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Точка на карта" + +msgid "Vehicle Position" +msgstr "Позиция на автомобил" + +msgid "Main menu" +msgstr "Главно меню" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Покажи\n" +"Картата" + +msgid "Settings" +msgstr "Настройки" + +msgid "Tools" +msgstr "Инструменти" + +msgid "Route" +msgstr "Маршрут" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "Действия" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Излез" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Спри\n" +"Навигацията" + +msgid "Display" +msgstr "Показване" + +msgid "Fullscreen" +msgstr "Цял екран" + +msgid "Window Mode" +msgstr "Режим Прозорец" + +msgid "Description" +msgstr "" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "След %s влезте в кръговото" + +#~ msgid "Cursor" +#~ msgstr "Курсор" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d километра" diff --git a/po/ca.po.in b/po/ca.po.in new file mode 100644 index 0000000..f9ba2d9 --- /dev/null +++ b/po/ca.po.in @@ -0,0 +1,1757 @@ +# Catalan translation for navit +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the navit package. +# peremayol@gmail.com, 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-05-18 09:31+0000\n" +"Last-Translator: KaZeR \n" +"Language-Team: Catalan \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "S'està executant des del directori arrel\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "s'està establint '%s' a '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "" + +msgid "first" +msgstr "primera" + +msgid "second" +msgstr "segona" + +msgid "third" +msgstr "tercera" + +msgid "fourth" +msgstr "quarta" + +msgid "fifth" +msgstr "cinquena" + +msgid "sixth" +msgstr "sisena" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "" + +msgid "first exit" +msgstr "primera sortida" + +msgid "second exit" +msgstr "segona sortida" + +msgid "third exit" +msgstr "tercera sortida" + +msgid "fourth exit" +msgstr "quarta sortida" + +msgid "fifth exit" +msgstr "cinquena sortida" + +msgid "sixth exit" +msgstr "sisena sortida" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "d'aquí a %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metres" + +#, c-format +msgid "in %d meters" +msgstr "d'aquí a %d metres" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d,%d quilòmetres" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "d'aquí a %d,%d quilòmetres" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "un quilòmetre" +msgstr[1] "%d quilòmetres" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "d'aquí a un quilòmetre" +msgstr[1] "d'aquí a %d quilòmetres" + +msgid "exit" +msgstr "surt" + +msgid "into the ramp" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s al carrer %s %s %s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "dreta" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "esquerra" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "fàcilment " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "fortament " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "realment fort " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "desconegut " + +msgid "When possible, please turn around" +msgstr "Quan sigui possible, doneu mitja volta" + +msgid "Enter the roundabout soon" +msgstr "" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "aleshores deixeu la rotonda a la %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Deixeu la rotonda a la %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "" + +msgid "soon" +msgstr "" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "" + +#, c-format +msgid "after %i roads" +msgstr "" + +msgid "now" +msgstr "ara" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "després, agafeu la %1$s carretera a la %2$s" + +msgid "error" +msgstr "error" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Heu arribat a la destinació %s" + +msgid "then you have reached your destination." +msgstr "aleshores heu arribat a destí" + +msgid "Position" +msgstr "Posició" + +msgid "Command" +msgstr "Ordre" + +msgid "Length" +msgstr "Durada" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Temps" + +msgid "Destination Length" +msgstr "" + +msgid "Destination Time" +msgstr "" + +msgid "Roadbook" +msgstr "" + +msgid "Set as position" +msgstr "" + +msgid "Set as destination" +msgstr "" + +msgid "Add as bookmark" +msgstr "" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Punt 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Unió dels Emirats Àrabs" + +#. 004 +msgid "Afghanistan" +msgstr "Afganistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua i Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "" + +#. 008 +msgid "Albania" +msgstr "Albània" + +#. 051 +msgid "Armenia" +msgstr "Armènia" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Antilles Holandeses" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antàrtida" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "Samoa Americana" + +#. 040 +msgid "Austria" +msgstr "Àustria" + +#. 036 +msgid "Australia" +msgstr "Austràlia" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Illes Aland" + +#. 031 +msgid "Azerbaijan" +msgstr "" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bòsnia i Hercegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesh" + +#. 056 +msgid "Belgium" +msgstr "Bèlgica" + +#. 854 +msgid "Burkina Faso" +msgstr "" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgària" + +#. 048 +msgid "Bahrain" +msgstr "Bahrain" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "" + +#. 652 +msgid "Saint Barthelemy" +msgstr "" + +#. 060 +msgid "Bermuda" +msgstr "Illes Bermudes" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei" + +#. 068 +msgid "Bolivia" +msgstr "Bolívia" + +#. 076 +msgid "Brazil" +msgstr "Brasil" + +#. 044 +msgid "Bahamas" +msgstr "" + +#. 064 +msgid "Bhutan" +msgstr "Bhutan" + +#. 074 +msgid "Bouvet Island" +msgstr "" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Bielorússia" + +#. 084 +msgid "Belize" +msgstr "" + +#. 124 +msgid "Canada" +msgstr "Canadà" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Congo, República Democràtica del" + +#. 140 +msgid "Central African Republic" +msgstr "" + +#. 178 +msgid "Congo" +msgstr "Congo" + +#. 756 +msgid "Switzerland" +msgstr "Suïssa" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Costa d'Ivori" + +#. 184 +msgid "Cook Islands" +msgstr "Illes Cook" + +#. 152 +msgid "Chile" +msgstr "Xile" + +#. 120 +msgid "Cameroon" +msgstr "" + +#. 156 +msgid "China" +msgstr "Xina" + +#. 170 +msgid "Colombia" +msgstr "Colòmbia" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Cuba" + +#. 132 +msgid "Cape Verde" +msgstr "Cap Verd" + +#. 162 +msgid "Christmas Island" +msgstr "" + +#. 196 +msgid "Cyprus" +msgstr "Xipre" + +#. 203 +msgid "Czech Republic" +msgstr "República Txeca" + +#. 276 +msgid "Germany" +msgstr "Alemanya" + +#. 262 +msgid "Djibouti" +msgstr "" + +#. 208 +msgid "Denmark" +msgstr "Dinamarca" + +#. 212 +msgid "Dominica" +msgstr "Dominica" + +#. 214 +msgid "Dominican Republic" +msgstr "República Dominicana" + +#. 012 +msgid "Algeria" +msgstr "Algèria" + +#. 218 +msgid "Ecuador" +msgstr "Equador" + +#. 233 +msgid "Estonia" +msgstr "Estònia" + +#. 818 +msgid "Egypt" +msgstr "Egipte" + +#. 732 +msgid "Western Sahara" +msgstr "Sàhara Occidental" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Espanya" + +#. 231 +msgid "Ethiopia" +msgstr "Etiòpia" + +#. 246 +msgid "Finland" +msgstr "Finlàndia" + +#. 242 +msgid "Fiji" +msgstr "" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Micronèsia, Estats Federats de" + +#. 234 +msgid "Faroe Islands" +msgstr "" + +#. 250 +msgid "France" +msgstr "França" + +#. 266 +msgid "Gabon" +msgstr "" + +#. 826 +msgid "United Kingdom" +msgstr "Regne Unit" + +#. 308 +msgid "Grenada" +msgstr "" + +#. 268 +msgid "Georgia" +msgstr "Geòrgia" + +#. 254 +msgid "French Guiana" +msgstr "" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "" + +#. 270 +msgid "Gambia" +msgstr "Gàmbia" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Guinea Equatorial" + +#. 300 +msgid "Greece" +msgstr "Grècia" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "" + +#. 328 +msgid "Guyana" +msgstr "" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Illa Heard i Illes McDonald" + +#. 340 +msgid "Honduras" +msgstr "" + +#. 191 +msgid "Croatia" +msgstr "Croàcia" + +#. 332 +msgid "Haiti" +msgstr "" + +#. 348 +msgid "Hungary" +msgstr "Hongria" + +#. 360 +msgid "Indonesia" +msgstr "Indonèsia" + +#. 372 +msgid "Ireland" +msgstr "Irlanda" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "Illa de Man" + +#. 356 +msgid "India" +msgstr "Índia" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "" + +#. 368 +msgid "Iraq" +msgstr "Iraq" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "" + +#. 352 +msgid "Iceland" +msgstr "Islàndia" + +#. 380 +msgid "Italy" +msgstr "Itàlia" + +#. 832 +msgid "Jersey" +msgstr "" + +#. 388 +msgid "Jamaica" +msgstr "Jamàica" + +#. 400 +msgid "Jordan" +msgstr "" + +#. 392 +msgid "Japan" +msgstr "Japó" + +#. 404 +msgid "Kenya" +msgstr "Kenya" + +#. 417 +msgid "Kyrgyzstan" +msgstr "" + +#. 116 +msgid "Cambodia" +msgstr "" + +#. 296 +msgid "Kiribati" +msgstr "" + +#. 174 +msgid "Comoros" +msgstr "" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "" + +#. 410 +msgid "Korea, Republic of" +msgstr "" + +#. 414 +msgid "Kuwait" +msgstr "Kuwait" + +#. 136 +msgid "Cayman Islands" +msgstr "" + +#. 398 +msgid "Kazakhstan" +msgstr "" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "" + +#. 422 +msgid "Lebanon" +msgstr "" + +#. 662 +msgid "Saint Lucia" +msgstr "" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Libèria" + +#. 426 +msgid "Lesotho" +msgstr "" + +#. 440 +msgid "Lithuania" +msgstr "Lituània" + +#. 442 +msgid "Luxembourg" +msgstr "Luxemburg" + +#. 428 +msgid "Latvia" +msgstr "" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "" + +#. 504 +msgid "Morocco" +msgstr "Marroc" + +#. 492 +msgid "Monaco" +msgstr "Mònaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldàvia" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "" + +#. 450 +msgid "Madagascar" +msgstr "Madagascar" + +#. 584 +msgid "Marshall Islands" +msgstr "" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "" + +#. 466 +msgid "Mali" +msgstr "" + +#. 104 +msgid "Myanmar" +msgstr "" + +#. 496 +msgid "Mongolia" +msgstr "Mongòlia" + +#. 446 +msgid "Macao" +msgstr "" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "" + +#. 474 +msgid "Martinique" +msgstr "" + +#. 478 +msgid "Mauritania" +msgstr "Mauritània" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "" + +#. 462 +msgid "Maldives" +msgstr "" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mèxic" + +#. 458 +msgid "Malaysia" +msgstr "Malàisia" + +#. 508 +msgid "Mozambique" +msgstr "Moçambic" + +#. 516 +msgid "Namibia" +msgstr "Namíbia" + +#. 540 +msgid "New Caledonia" +msgstr "Nova Caledònia" + +#. 562 +msgid "Niger" +msgstr "" + +#. 574 +msgid "Norfolk Island" +msgstr "" + +#. 566 +msgid "Nigeria" +msgstr "Nigèria" + +#. 558 +msgid "Nicaragua" +msgstr "Nicaragua" + +#. 528 +msgid "Netherlands" +msgstr "" + +#. 578 +msgid "Norway" +msgstr "Noruega" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "" + +#. 570 +msgid "Niue" +msgstr "" + +#. 554 +msgid "New Zealand" +msgstr "Nova Zelanda" + +#. 512 +msgid "Oman" +msgstr "" + +#. 591 +msgid "Panama" +msgstr "Panamà" + +#. 604 +msgid "Peru" +msgstr "Perú" + +#. 258 +msgid "French Polynesia" +msgstr "" + +#. 598 +msgid "Papua New Guinea" +msgstr "" + +#. 608 +msgid "Philippines" +msgstr "" + +#. 586 +msgid "Pakistan" +msgstr "" + +#. 616 +msgid "Poland" +msgstr "Polònia" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint Pierre i Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "" + +#. 634 +msgid "Qatar" +msgstr "Qatar" + +#. 638 +msgid "Reunion" +msgstr "" + +#. 642 +msgid "Romania" +msgstr "Romania" + +#. 688 +msgid "Serbia" +msgstr "Sèrbia" + +#. 643 +msgid "Russian Federation" +msgstr "Rússia" + +#. 646 +msgid "Rwanda" +msgstr "Rwanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "" + +#. 090 +msgid "Solomon Islands" +msgstr "" + +#. 690 +msgid "Seychelles" +msgstr "Seychelles" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Suècia" + +#. 702 +msgid "Singapore" +msgstr "Singapur" + +#. 654 +msgid "Saint Helena" +msgstr "" + +#. 705 +msgid "Slovenia" +msgstr "Eslovènia" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard i Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Eslovàquia" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somàlia" + +#. 740 +msgid "Suriname" +msgstr "" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Síria" + +#. 748 +msgid "Swaziland" +msgstr "" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "" + +#. 148 +msgid "Chad" +msgstr "Txad" + +#. 260 +msgid "French Southern Territories" +msgstr "" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Tailàndia" + +#. 762 +msgid "Tajikistan" +msgstr "" + +#. 772 +msgid "Tokelau" +msgstr "" + +#. 626 +msgid "Timor-Leste" +msgstr "Timor Oriental" + +#. 795 +msgid "Turkmenistan" +msgstr "" + +#. 788 +msgid "Tunisia" +msgstr "" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turquia" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzània" + +#. 804 +msgid "Ukraine" +msgstr "Ucraïna" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "" + +#. 840 +msgid "United States" +msgstr "Estats Units d'Amèrica" + +#. 858 +msgid "Uruguay" +msgstr "Uruguai" + +#. 860 +msgid "Uzbekistan" +msgstr "" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Ciutat del Vaticà" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Saint Vincent i les Grenadines" + +#. 862 +msgid "Venezuela" +msgstr "Veneçuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "" + +#. 704 +msgid "Viet Nam" +msgstr "" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis i Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "" + +#. 894 +msgid "Zambia" +msgstr "Zàmbia" + +#. 716 +msgid "Zimbabwe" +msgstr "" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Desconegut, afegiu etiquetes is_in a aquestes ciutats" + +msgid "Car" +msgstr "Cotxe" + +msgid "Iso2" +msgstr "iso2" + +msgid "Iso3" +msgstr "iso3" + +msgid "Country" +msgstr "Estat" + +msgid "Postal" +msgstr "Codi postal" + +msgid "Town" +msgstr "Població" + +msgid "District" +msgstr "Districte" + +msgid "Street" +msgstr "Adreça" + +msgid "Number" +msgstr "Número" + +msgid "Enter Destination" +msgstr "Introduïu una destinació" + +msgid "Zip Code" +msgstr "Codi postal" + +msgid "City" +msgstr "Ciutat" + +msgid "District/Township" +msgstr "" + +msgid "Map" +msgstr "Mapa" + +msgid "Bookmark" +msgstr "" + +msgid "Destination" +msgstr "Destinació" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Pantalla" + +msgid "_Route" +msgstr "Ruta" + +msgid "_Former Destinations" +msgstr "Destinacions anteriors" + +msgid "_Bookmarks" +msgstr "" + +msgid "_Map" +msgstr "Mapa" + +msgid "_Layout" +msgstr "Disposició" + +msgid "_Projection" +msgstr "Projecció" + +msgid "_Vehicle" +msgstr "Vehicle" + +msgid "Zoom_Out" +msgstr "Allunya" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Apropa" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Recalcula" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Informació" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Atura la navegació" + +msgid "Test" +msgstr "Prova" + +msgid "_Quit" +msgstr "_Surt" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Zoom automàtic" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Pantalla completa" + +msgid "Data" +msgstr "Dades" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NE" + +msgid "E" +msgstr "E" + +msgid "SE" +msgstr "SE" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SO" + +msgid "W" +msgstr "O" + +msgid "NW" +msgstr "NO" + +msgid "No" +msgstr "No" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "" + +msgid "Back to map" +msgstr "Torna al mapa" + +msgid "Main Menu" +msgstr "Menú principal" + +msgid "Help" +msgstr "Ajuda" + +msgid "Back" +msgstr "Enrere" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "Punts d'interès" + +msgid "View in Browser" +msgstr "Visualitza al navegador" + +msgid "Streets" +msgstr "Carrers" + +msgid "House numbers" +msgstr "" + +msgid "View Attributes" +msgstr "Visualitza els atributs" + +msgid "View on map" +msgstr "Visualitza al mapa" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "Afegeix %s a les adreces d'interès" + +msgid "Former Destinations" +msgstr "Destinacions anteriors" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Número de casa/portal" + +msgid "Layout" +msgstr "Disposició" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Mapes" + +msgid "Show Satellite Status" +msgstr "Mostra l'estat del satèl·lit" + +msgid " Elevation " +msgstr " Elevació " + +msgid " Azimuth " +msgstr " Azimut " + +msgid "Show NMEA Data" +msgstr "Mostra les dades NMEA" + +msgid "car" +msgstr "cotxe" + +msgid "bike" +msgstr "bicicleta" + +msgid "pedestrian" +msgstr "vianant" + +#, c-format +msgid "Current profile: %s" +msgstr "Perfil actual: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Canvia el perfil a: %s" + +msgid "Set as active" +msgstr "" + +msgid "Show Satellite status" +msgstr "Mostra l'estat del satèl·lit" + +msgid "Show NMEA data" +msgstr "Mostra les dades NMEA" + +msgid "Vehicle" +msgstr "Vehicle" + +msgid "Rules" +msgstr "Regles" + +msgid "Lock on road" +msgstr "" + +msgid "Northing" +msgstr "" + +msgid "Map follows Vehicle" +msgstr "El mapa segueix el vehicle" + +msgid "Message" +msgstr "Missatge" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Descripció de la ruta" + +msgid "Height Profile" +msgstr "" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Punt del mapa" + +msgid "Vehicle Position" +msgstr "Posició del vehicle" + +msgid "Main menu" +msgstr "Menú principal" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Mostra\n" +"Mapa" + +msgid "Settings" +msgstr "Configuració" + +msgid "Tools" +msgstr "Eines" + +msgid "Route" +msgstr "Ruta" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "Accions" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Surt" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Atura la\n" +"Navegació" + +msgid "Display" +msgstr "Pantalla" + +msgid "Fullscreen" +msgstr "Pantalla completa" + +msgid "Window Mode" +msgstr "Mode de la finestra" + +msgid "Description" +msgstr "Descripció" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "cavall" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "Cursor" +#~ msgstr "Cursor" diff --git a/po/cs.po.in b/po/cs.po.in new file mode 100644 index 0000000..fece8ed --- /dev/null +++ b/po/cs.po.in @@ -0,0 +1,1767 @@ +# translation of navit_cs.po to Čeština +# Copyright (C) 2007, 2008 The Navit Team +# This file is distributed under the same license as the navit package. +# Vaclav Cerny , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-06-18 19:02+0000\n" +"Last-Translator: Vladimír Burian \n" +"Language-Team: Čeština\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Běží ze zdrojového adresáře\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "nastavuji '%s' na '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "nultý" + +msgid "first" +msgstr "první" + +msgid "second" +msgstr "druhý" + +msgid "third" +msgstr "třetí" + +msgid "fourth" +msgstr "čtvrtý" + +msgid "fifth" +msgstr "pátý" + +msgid "sixth" +msgstr "šestý" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "nultý exit" + +msgid "first exit" +msgstr "první exit" + +msgid "second exit" +msgstr "druhý exit" + +msgid "third exit" +msgstr "třetí exit" + +msgid "fourth exit" +msgstr "čtvrtý exit" + +msgid "fifth exit" +msgstr "pátý exit" + +msgid "sixth exit" +msgstr "šestý exit" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "za %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metrů" + +#, c-format +msgid "in %d meters" +msgstr "za %d metrů" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d kilometrů" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "za %d.%d kilometrů" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "%d kilometr" +msgstr[1] "%d kilometry" +msgstr[2] "%d kilometrů" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "za %d kilometr" +msgstr[1] "za %d kilometry" +msgstr[2] "za %d kilometrů" + +msgid "exit" +msgstr "konec" + +msgid "into the ramp" +msgstr "na přivadeč" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s do ulice %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%s o%s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%s do %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%s do %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%sna %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "vpravo" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "vlevo" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "mírně " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "silně " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "opravdu silně " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "neurčitě " + +msgid "When possible, please turn around" +msgstr "Až to bude možné, otočte se" + +msgid "Enter the roundabout soon" +msgstr "Brzy najeďte na kruhový objezd" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "pak opusťte kruhový objezd na výjezdu %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Opusťte kruhový objezd na výjezdu %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Pokračujte po další %s" + +msgid "soon" +msgstr "brzy" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Jeďte na %1$s silnici %2$s" + +#, c-format +msgid "after %i roads" +msgstr "za %i silnice" + +msgid "now" +msgstr "nyní" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "pak jeďte %1$s silnici %2$s" + +msgid "error" +msgstr "chyba" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Zabočte %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "pak odbočte %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "%s dorazíte do cíle" + +msgid "then you have reached your destination." +msgstr "pak budete v cíli." + +msgid "Position" +msgstr "Poloha" + +msgid "Command" +msgstr "Příkaz" + +msgid "Length" +msgstr "Délka" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Čas" + +msgid "Destination Length" +msgstr "Cílová vzdálenost" + +msgid "Destination Time" +msgstr "Cílový čas" + +msgid "Roadbook" +msgstr "Itinerář" + +msgid "Set as position" +msgstr "Použít jako pozici" + +msgid "Set as destination" +msgstr "Nastavit jako cíl" + +msgid "Add as bookmark" +msgstr "Použít jako záložku" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Bod 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Souřadnice obrazovky: %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Spojené arabské emiráty" + +#. 004 +msgid "Afghanistan" +msgstr "Afghánistán" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua a Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albánie" + +#. 051 +msgid "Armenia" +msgstr "Arménie" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Nizozemské Antily" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarktida" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "Americká Samoa" + +#. 040 +msgid "Austria" +msgstr "Rakousko" + +#. 036 +msgid "Australia" +msgstr "Austrálie" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Ålandy" + +#. 031 +msgid "Azerbaijan" +msgstr "Ázerbájdžán" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosna a Hercegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladéš" + +#. 056 +msgid "Belgium" +msgstr "Belgie" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulharsko" + +#. 048 +msgid "Bahrain" +msgstr "Bahrajn" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Svatý Bartoloměj" + +#. 060 +msgid "Bermuda" +msgstr "Bermudy" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunej" + +#. 068 +msgid "Bolivia" +msgstr "Bolívie" + +#. 076 +msgid "Brazil" +msgstr "Brazílie" + +#. 044 +msgid "Bahamas" +msgstr "Bahamy" + +#. 064 +msgid "Bhutan" +msgstr "Bhútán" + +#. 074 +msgid "Bouvet Island" +msgstr "Bouvetův ostrov" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Bělorusko" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Kanada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Kokosové (Keelingovy) ostrovy" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Kongo, demokratická republika" + +#. 140 +msgid "Central African Republic" +msgstr "Středoafrická republika" + +#. 178 +msgid "Congo" +msgstr "Kongo" + +#. 756 +msgid "Switzerland" +msgstr "Švýcarsko" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Pobřeží slonoviny" + +#. 184 +msgid "Cook Islands" +msgstr "Cookovy ostrovy" + +#. 152 +msgid "Chile" +msgstr "Chile" + +#. 120 +msgid "Cameroon" +msgstr "Kamerun" + +#. 156 +msgid "China" +msgstr "Čína" + +#. 170 +msgid "Colombia" +msgstr "Kolumbie" + +#. 188 +msgid "Costa Rica" +msgstr "Kostarika" + +#. 192 +msgid "Cuba" +msgstr "Kuba" + +#. 132 +msgid "Cape Verde" +msgstr "Kapverdy" + +#. 162 +msgid "Christmas Island" +msgstr "Vánoční ostrov" + +#. 196 +msgid "Cyprus" +msgstr "Kypr" + +#. 203 +msgid "Czech Republic" +msgstr "Česká republika" + +#. 276 +msgid "Germany" +msgstr "Německo" + +#. 262 +msgid "Djibouti" +msgstr "Džibutsko" + +#. 208 +msgid "Denmark" +msgstr "Dánsko" + +#. 212 +msgid "Dominica" +msgstr "Dominika" + +#. 214 +msgid "Dominican Republic" +msgstr "Dominikánská republika" + +#. 012 +msgid "Algeria" +msgstr "Alžírsko" + +#. 218 +msgid "Ecuador" +msgstr "Ekvádor" + +#. 233 +msgid "Estonia" +msgstr "Estonsko" + +#. 818 +msgid "Egypt" +msgstr "Egypt" + +#. 732 +msgid "Western Sahara" +msgstr "Západní Sahara" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Španělsko" + +#. 231 +msgid "Ethiopia" +msgstr "Etiopie" + +#. 246 +msgid "Finland" +msgstr "Finsko" + +#. 242 +msgid "Fiji" +msgstr "Fidži" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falklandy (Malvíny)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Mikronésie, federativní státy" + +#. 234 +msgid "Faroe Islands" +msgstr "Faerské ostrovy" + +#. 250 +msgid "France" +msgstr "Francie" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Spojené království" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Gruzie" + +#. 254 +msgid "French Guiana" +msgstr "Francouzská Guyana" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Grónsko" + +#. 270 +msgid "Gambia" +msgstr "Gambie" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Rovníková Guinea" + +#. 300 +msgid "Greece" +msgstr "Řecko" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Jižní Georgie a Jižní Sandwichovy ostrovy" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hongkong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heardův a McDonaldovy ostrovy" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Chorvatsko" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Maďarsko" + +#. 360 +msgid "Indonesia" +msgstr "Indonésie" + +#. 372 +msgid "Ireland" +msgstr "Irsko" + +#. 376 +msgid "Israel" +msgstr "Izrael" + +#. 833 +msgid "Isle of Man" +msgstr "Ostrov Man" + +#. 356 +msgid "India" +msgstr "Indie" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Britské indickooceánské území" + +#. 368 +msgid "Iraq" +msgstr "Irák" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Írán, islámská republika" + +#. 352 +msgid "Iceland" +msgstr "Island" + +#. 380 +msgid "Italy" +msgstr "Itálie" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamajka" + +#. 400 +msgid "Jordan" +msgstr "Jordánsko" + +#. 392 +msgid "Japan" +msgstr "Japonsko" + +#. 404 +msgid "Kenya" +msgstr "Keňa" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kyrgyzstán" + +#. 116 +msgid "Cambodia" +msgstr "Kambodža" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Komory" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Svatý Kryštof a Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Korejská lidově demokratická republika" + +#. 410 +msgid "Korea, Republic of" +msgstr "Korejská republika" + +#. 414 +msgid "Kuwait" +msgstr "Kuvajt" + +#. 136 +msgid "Cayman Islands" +msgstr "Kajmanské ostrovy" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazachstán" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laoská lidově demokratická republika" + +#. 422 +msgid "Lebanon" +msgstr "Libanon" + +#. 662 +msgid "Saint Lucia" +msgstr "Svatá Lucie" + +#. 438 +msgid "Liechtenstein" +msgstr "Lichtenštejnsko" + +#. 144 +msgid "Sri Lanka" +msgstr "Srí Lanka" + +#. 430 +msgid "Liberia" +msgstr "Libérie" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Litva" + +#. 442 +msgid "Luxembourg" +msgstr "Lucembursko" + +#. 428 +msgid "Latvia" +msgstr "Lotyšsko" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libyjská arabská džamáhíríje" + +#. 504 +msgid "Morocco" +msgstr "Maroko" + +#. 492 +msgid "Monaco" +msgstr "Monako" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldavská republika" + +#. 499 +msgid "Montenegro" +msgstr "Černá Hora" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Svatý Martin (francouzská část)" + +#. 450 +msgid "Madagascar" +msgstr "Madagaskar" + +#. 584 +msgid "Marshall Islands" +msgstr "Marshallovy ostrovy" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Makedonie, bývalá jugoslávská republika" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongolsko" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Severní Mariany" + +#. 474 +msgid "Martinique" +msgstr "Martinik" + +#. 478 +msgid "Mauritania" +msgstr "Mauritánie" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauricius" + +#. 462 +msgid "Maldives" +msgstr "Maledivy" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mexiko" + +#. 458 +msgid "Malaysia" +msgstr "Malajsie" + +#. 508 +msgid "Mozambique" +msgstr "Mosambik" + +#. 516 +msgid "Namibia" +msgstr "Namibie" + +#. 540 +msgid "New Caledonia" +msgstr "Nová Kaledonie" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolkský ostrov" + +#. 566 +msgid "Nigeria" +msgstr "Nigérie" + +#. 558 +msgid "Nicaragua" +msgstr "Nikaragua" + +#. 528 +msgid "Netherlands" +msgstr "Nizozemsko" + +#. 578 +msgid "Norway" +msgstr "Norsko" + +#. 524 +msgid "Nepal" +msgstr "Nepál" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Nový Zéland" + +#. 512 +msgid "Oman" +msgstr "Omán" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Francouzská Polynésie" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua Nová Guinea" + +#. 608 +msgid "Philippines" +msgstr "Filipíny" + +#. 586 +msgid "Pakistan" +msgstr "Pákistán" + +#. 616 +msgid "Poland" +msgstr "Polsko" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Svatý Pierre a Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairnovy ostrovy" + +#. 630 +msgid "Puerto Rico" +msgstr "Portoriko" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestinské území, okupované" + +#. 620 +msgid "Portugal" +msgstr "Portugalsko" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Katar" + +#. 638 +msgid "Reunion" +msgstr "Réunion" + +#. 642 +msgid "Romania" +msgstr "Rumunsko" + +#. 688 +msgid "Serbia" +msgstr "Srbsko" + +#. 643 +msgid "Russian Federation" +msgstr "Ruská federace" + +#. 646 +msgid "Rwanda" +msgstr "Rwanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Saúdská Arábie" + +#. 090 +msgid "Solomon Islands" +msgstr "Šalamounovy ostrovy" + +#. 690 +msgid "Seychelles" +msgstr "Seychely" + +#. 736 +msgid "Sudan" +msgstr "Súdán" + +#. 752 +msgid "Sweden" +msgstr "Švédsko" + +#. 702 +msgid "Singapore" +msgstr "Singapur" + +#. 654 +msgid "Saint Helena" +msgstr "Svatá Helena" + +#. 705 +msgid "Slovenia" +msgstr "Slovinsko" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Špicberky a Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slovensko" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somálsko" + +#. 740 +msgid "Suriname" +msgstr "Surinam" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Svatý Tomáš a Princův ostrov" + +#. 222 +msgid "El Salvador" +msgstr "Salvádor" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Syrská arabská republika" + +#. 748 +msgid "Swaziland" +msgstr "Svazijsko" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Ostrovy Turks a Caicos" + +#. 148 +msgid "Chad" +msgstr "Čad" + +#. 260 +msgid "French Southern Territories" +msgstr "Francouzská jižní a antarktická území" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Thajsko" + +#. 762 +msgid "Tajikistan" +msgstr "Tádžikistán" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Východní Timor" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistán" + +#. 788 +msgid "Tunisia" +msgstr "Tunisko" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turecko" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad a Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Tchaj-wan, provincie Číny" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzanie, sjednocená republika" + +#. 804 +msgid "Ukraine" +msgstr "Ukrajina" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Drobné odlehlé ostrovy Spojených států" + +#. 840 +msgid "United States" +msgstr "Spojené státy" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbekistán" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Svatý stolec (Vatikánský městský stát)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Svatý Vincenc a Grenadiny" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Britské Panenské ostrovy" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Americké Panenské ostrovy" + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu (Nové Hebridy)" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis a Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Jemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Jihoafrická republika" + +#. 894 +msgid "Zambia" +msgstr "Zambie" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Není známo, přidejte is_in atributy do těchto měst" + +msgid "Car" +msgstr "Automobil" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Země" + +msgid "Postal" +msgstr "Poštovní" + +msgid "Town" +msgstr "Město" + +msgid "District" +msgstr "Kraj/Okres" + +msgid "Street" +msgstr "Ulice" + +msgid "Number" +msgstr "Číslo" + +msgid "Enter Destination" +msgstr "Zadejte cíl" + +msgid "Zip Code" +msgstr "PSČ" + +msgid "City" +msgstr "Město" + +msgid "District/Township" +msgstr "Kraj/Okres" + +msgid "Map" +msgstr "Mapa" + +msgid "Bookmark" +msgstr "Záložka" + +msgid "Destination" +msgstr "Cíl" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Zobrazit" + +msgid "_Route" +msgstr "Trasa" + +msgid "_Former Destinations" +msgstr "Minulé cíle" + +msgid "_Bookmarks" +msgstr "Záložky" + +msgid "_Map" +msgstr "Mapa" + +msgid "_Layout" +msgstr "Rozvržení" + +msgid "_Projection" +msgstr "Projekce" + +msgid "_Vehicle" +msgstr "Vozidlo" + +msgid "Zoom_Out" +msgstr "Zmenšit" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Zvětšit" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Přepočítat" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Informace" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Přestat navigovat" + +msgid "Test" +msgstr "Vyzkoušet" + +msgid "_Quit" +msgstr "_Konec" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Jet jen po silnici" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Itinerář" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Autozoom" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Celá obrazovka" + +msgid "Data" +msgstr "Data" + +msgid "N" +msgstr "S" + +msgid "NE" +msgstr "SV" + +msgid "E" +msgstr "V" + +msgid "SE" +msgstr "JV" + +msgid "S" +msgstr "J" + +msgid "SW" +msgstr "JZ" + +msgid "W" +msgstr "Z" + +msgid "NW" +msgstr "SZ" + +msgid "No" +msgstr "Ne" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Trasa %4.0fkm %02d:%02d ETA" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Trasa 0000km 0+00:00 ETA" + +msgid "Back to map" +msgstr "Zpět na mapu" + +msgid "Main Menu" +msgstr "Hlavní menu" + +msgid "Help" +msgstr "Nápověda" + +msgid "Back" +msgstr "Zpět" + +msgid "Add Bookmark" +msgstr "Přidat značku" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "Přidat složku záložek" + +msgid "Rename" +msgstr "Přejmenovat" + +msgid "POIs" +msgstr "Body zájmu" + +msgid "View in Browser" +msgstr "Zobrazit v prohlížeči" + +msgid "Streets" +msgstr "Ulice" + +msgid "House numbers" +msgstr "Čísla domů" + +msgid "View Attributes" +msgstr "Zobrazit atributy" + +msgid "View on map" +msgstr "Zobrazit na mapě" + +msgid "Cut Bookmark" +msgstr "Vyjmout záložku" + +msgid "Copy Bookmark" +msgstr "Kopírovat záložku" + +msgid "Rename Bookmark" +msgstr "Přejmenovat záložku" + +msgid "Paste Bookmark" +msgstr "Vložit záložku" + +msgid "Delete Bookmark" +msgstr "Smazat záložku" + +msgid "Bookmarks" +msgstr "Záložky" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Vložit záložku" + +#, c-format +msgid "Bookmark %s" +msgstr "Záložka %s" + +msgid "Former Destinations" +msgstr "Minulé cíle" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Číslo domu" + +msgid "Layout" +msgstr "Rozvržení" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Mapy" + +msgid "Show Satellite Status" +msgstr "Ukázat stav satelitu" + +msgid " Elevation " +msgstr " Převýšení " + +msgid " Azimuth " +msgstr " Azimut " + +msgid "Show NMEA Data" +msgstr "Ukázat NMEA data" + +msgid "car" +msgstr "auto" + +msgid "bike" +msgstr "kolo" + +msgid "pedestrian" +msgstr "chodec" + +#, c-format +msgid "Current profile: %s" +msgstr "Aktuální profil: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Změnit profil na: %s" + +msgid "Set as active" +msgstr "Nastavit jako aktivní" + +msgid "Show Satellite status" +msgstr "Ukázat stav satelitu" + +msgid "Show NMEA data" +msgstr "Ukázat NMEA data" + +msgid "Vehicle" +msgstr "Vozidlo" + +msgid "Rules" +msgstr "Pravidla" + +msgid "Lock on road" +msgstr "Uchytit na cestu" + +msgid "Northing" +msgstr "Severně" + +msgid "Map follows Vehicle" +msgstr "Mapa sleduje vozidlo" + +msgid "Message" +msgstr "Zpráva" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Popis trasy" + +msgid "Height Profile" +msgstr "Výška profilu" + +msgid "Show Locale" +msgstr "Zobrazit jazyk" + +msgid "About Navit" +msgstr "O Navitu" + +#. Authors +msgid "By" +msgstr "Od" + +#. Contributors +msgid "And all the Navit Team" +msgstr "A další z Navit týmu" + +msgid "members and contributors." +msgstr "členové a přispívající" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Bod na mapě" + +msgid "Vehicle Position" +msgstr "Poloha vozidla" + +msgid "Main menu" +msgstr "Hlavní menu" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Ukázat\n" +"mapu" + +msgid "Settings" +msgstr "Nastavení" + +msgid "Tools" +msgstr "Nástroje" + +msgid "Route" +msgstr "Trasa" + +msgid "About" +msgstr "O programu" + +msgid "Actions" +msgstr "Akce" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Konec" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Ukonči\n" +"Navigaci" + +msgid "Display" +msgstr "Zobrazit" + +msgid "Fullscreen" +msgstr "Celá obrazovka" + +msgid "Window Mode" +msgstr "V okně" + +msgid "Description" +msgstr "Popis" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "kůň" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "Za %s, najeďte na kruhový objezd" + +#~ msgid "Cursor" +#~ msgstr "Kurzor" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d kilometrů" diff --git a/po/da.po.in b/po/da.po.in new file mode 100644 index 0000000..e6102e3 --- /dev/null +++ b/po/da.po.in @@ -0,0 +1,1763 @@ +# Danish translation for Navit +# Copyright (C) 2008 The Navit Team +# This file is distributed under the same license as the navit package. +# Glenn Sommer , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-05-18 09:31+0000\n" +"Last-Translator: Lasse Luttermann \n" +"Language-Team: Glenn Sommer \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Kører fra kildekode mappen\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "sætter '%s' til '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "nulte" + +msgid "first" +msgstr "første" + +msgid "second" +msgstr "anden" + +msgid "third" +msgstr "tredje" + +msgid "fourth" +msgstr "fjerde" + +msgid "fifth" +msgstr "femte" + +msgid "sixth" +msgstr "sjette" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "nulte afkørsel" + +msgid "first exit" +msgstr "første afkørsel" + +msgid "second exit" +msgstr "anden afkørsel" + +msgid "third exit" +msgstr "tredje afkørsel" + +msgid "fourth exit" +msgstr "fjerde afkørsel" + +msgid "fifth exit" +msgstr "femte afkørsel" + +msgid "sixth exit" +msgstr "sjette afkørsel" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "om %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d meter" + +#, c-format +msgid "in %d meters" +msgstr "om %d meter" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d kilometer" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "om %d.%d kilometer" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "én kilometer" +msgstr[1] "%d kilometer" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "om én kilometer" +msgstr[1] "om %d kilometer" + +msgid "exit" +msgstr "afkørsel" + +msgid "into the ramp" +msgstr "op på rampen" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s ind i gaden %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%s ind i %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%s ind i %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%s ind i %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%sind i %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "højre" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "venstre" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "blødt " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "skarpt " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "meget kraftigt " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "ukendt " + +msgid "When possible, please turn around" +msgstr "Når muligt, vend venligst om" + +msgid "Enter the roundabout soon" +msgstr "Kør snart ind i rundkørslen" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "forlad så rundkørslen ved den %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Forlad rundkørslen ved den %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Følg vejen de næste %s" + +msgid "soon" +msgstr "snart" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Tag den %1$s vej til %2$s" + +#, c-format +msgid "after %i roads" +msgstr "efter %i veje" + +msgid "now" +msgstr "nu" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "tag så den %1$s vej til %2$s" + +msgid "error" +msgstr "fejl" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Drej %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "drej så %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Du er fremme ved destinationen %s" + +msgid "then you have reached your destination." +msgstr "og så ankommer du til din destination" + +msgid "Position" +msgstr "Position" + +msgid "Command" +msgstr "Kommando" + +msgid "Length" +msgstr "Længde" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Tid" + +msgid "Destination Length" +msgstr "Længde til destinationen" + +msgid "Destination Time" +msgstr "Tid til destinationen" + +msgid "Roadbook" +msgstr "Vejbog" + +msgid "Set as position" +msgstr "Sæt som position" + +msgid "Set as destination" +msgstr "Sæt som destination" + +msgid "Add as bookmark" +msgstr "Tilføj som bogmærke" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Punkt 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Skærm koordinater %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Forenede Arabiske Emirater" + +#. 004 +msgid "Afghanistan" +msgstr "Afghanistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua og Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albanien" + +#. 051 +msgid "Armenia" +msgstr "Armenien" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Nederlandske Antiller" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarktis" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "Amerikansk Samoa" + +#. 040 +msgid "Austria" +msgstr "Østrig" + +#. 036 +msgid "Australia" +msgstr "Australien" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Ålands Øerne" + +#. 031 +msgid "Azerbaijan" +msgstr "Aserbajdsjan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnien-Hercegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesh" + +#. 056 +msgid "Belgium" +msgstr "Belgien" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgarien" + +#. 048 +msgid "Bahrain" +msgstr "Bahrain" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "St Barthelemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei Darussalam" + +#. 068 +msgid "Bolivia" +msgstr "Bolivia" + +#. 076 +msgid "Brazil" +msgstr "Brasilien" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "Bhutan" + +#. 074 +msgid "Bouvet Island" +msgstr "Bouvetøen" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Hviderusland" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Canada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Cocosøerne (Keelingøerne)" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Congo, Den Demokratiske Republik" + +#. 140 +msgid "Central African Republic" +msgstr "Centralafrikanske Republik" + +#. 178 +msgid "Congo" +msgstr "Congo" + +#. 756 +msgid "Switzerland" +msgstr "Svejts" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Elfenbenskysten" + +#. 184 +msgid "Cook Islands" +msgstr "Cook-øerne" + +#. 152 +msgid "Chile" +msgstr "Chile" + +#. 120 +msgid "Cameroon" +msgstr "Cameroun" + +#. 156 +msgid "China" +msgstr "Kina" + +#. 170 +msgid "Colombia" +msgstr "Columbia" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Cuba" + +#. 132 +msgid "Cape Verde" +msgstr "Kap Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Christmas Island (Indiske Ocean)" + +#. 196 +msgid "Cyprus" +msgstr "Cypern" + +#. 203 +msgid "Czech Republic" +msgstr "Tjekkiet" + +#. 276 +msgid "Germany" +msgstr "Tyskland" + +#. 262 +msgid "Djibouti" +msgstr "Djibouti" + +#. 208 +msgid "Denmark" +msgstr "Danmark" + +#. 212 +msgid "Dominica" +msgstr "Dominica" + +#. 214 +msgid "Dominican Republic" +msgstr "Dominikanske Republik" + +#. 012 +msgid "Algeria" +msgstr "Algeriet" + +#. 218 +msgid "Ecuador" +msgstr "Ecuador" + +#. 233 +msgid "Estonia" +msgstr "Estland" + +#. 818 +msgid "Egypt" +msgstr "Egypten" + +#. 732 +msgid "Western Sahara" +msgstr "Vestsahara" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Spanien" + +#. 231 +msgid "Ethiopia" +msgstr "Etiopien" + +#. 246 +msgid "Finland" +msgstr "Finland" + +#. 242 +msgid "Fiji" +msgstr "Fiji" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falklandsøerne" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Mikronesien, de forenede stater af" + +#. 234 +msgid "Faroe Islands" +msgstr "Færøerne" + +#. 250 +msgid "France" +msgstr "Frankrig" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Storbritannien" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Georgien" + +#. 254 +msgid "French Guiana" +msgstr "Fransk Guyana" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Grønland" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Ækvatorialguinea" + +#. 300 +msgid "Greece" +msgstr "Grækenland" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Sydgeorgien og Sydsandwichøerne" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heard-øen og McDonald-øerne" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Kroatien" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Ungarn" + +#. 360 +msgid "Indonesia" +msgstr "Indonesien" + +#. 372 +msgid "Ireland" +msgstr "Irland" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "Isle of Man" + +#. 356 +msgid "India" +msgstr "Indien" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Det britiske territorium i Indiske Ocean" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iran, Den Islamiske Republik" + +#. 352 +msgid "Iceland" +msgstr "Island" + +#. 380 +msgid "Italy" +msgstr "Italien" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaica" + +#. 400 +msgid "Jordan" +msgstr "Jordan" + +#. 392 +msgid "Japan" +msgstr "Japan" + +#. 404 +msgid "Kenya" +msgstr "Kenya" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirgisistan" + +#. 116 +msgid "Cambodia" +msgstr "Cambodja" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Comorerne" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Sankt Kitts og Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Korea, Den Demokratiske Folkerepublik" + +#. 410 +msgid "Korea, Republic of" +msgstr "Korea, Republikken" + +#. 414 +msgid "Kuwait" +msgstr "Kuwait" + +#. 136 +msgid "Cayman Islands" +msgstr "Cayman-øerne" + +#. 398 +msgid "Kazakhstan" +msgstr "Kasakhstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laos" + +#. 422 +msgid "Lebanon" +msgstr "Libanon" + +#. 662 +msgid "Saint Lucia" +msgstr "Saint Lucia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberia" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Litauen" + +#. 442 +msgid "Luxembourg" +msgstr "Luxembourg" + +#. 428 +msgid "Latvia" +msgstr "Letland" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libysk-arabisk Jamahiriya" + +#. 504 +msgid "Morocco" +msgstr "Marokko" + +#. 492 +msgid "Monaco" +msgstr "Monaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldova, Republikken" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Sankt Marin (Fransk del)" + +#. 450 +msgid "Madagascar" +msgstr "Madagaskar" + +#. 584 +msgid "Marshall Islands" +msgstr "Marshall-øerne" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Makedonien, Den Tidligere Jugoslaviske Republik" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar (Burma)" + +#. 496 +msgid "Mongolia" +msgstr "Mongoliet" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Nordmarianerne" + +#. 474 +msgid "Martinique" +msgstr "Martinique" + +#. 478 +msgid "Mauritania" +msgstr "Mauretanien" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauritius" + +#. 462 +msgid "Maldives" +msgstr "Maldiverne" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mexico" + +#. 458 +msgid "Malaysia" +msgstr "Malaysia" + +#. 508 +msgid "Mozambique" +msgstr "Mozambique" + +#. 516 +msgid "Namibia" +msgstr "Namibia" + +#. 540 +msgid "New Caledonia" +msgstr "Ny Kaledonien" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolk-øen" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nicaragua" + +#. 528 +msgid "Netherlands" +msgstr "Holland" + +#. 578 +msgid "Norway" +msgstr "Norge" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "New Zealand" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Fransk Polynesien" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua New Guinea" + +#. 608 +msgid "Philippines" +msgstr "Filippinerne" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Polen" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Sankt Pierre og Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palæstinensiske Territorie, Det Besatte" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Qatar" + +#. 638 +msgid "Reunion" +msgstr "Reunion" + +#. 642 +msgid "Romania" +msgstr "Romænien" + +#. 688 +msgid "Serbia" +msgstr "Serbien" + +#. 643 +msgid "Russian Federation" +msgstr "Rusland" + +#. 646 +msgid "Rwanda" +msgstr "Rwanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Saudi-Arabien" + +#. 090 +msgid "Solomon Islands" +msgstr "Salomon-øerne" + +#. 690 +msgid "Seychelles" +msgstr "Seychellerne" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Sverige" + +#. 702 +msgid "Singapore" +msgstr "Singapore" + +#. 654 +msgid "Saint Helena" +msgstr "Sankt Helena" + +#. 705 +msgid "Slovenia" +msgstr "Slovenien" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard og Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slovakiet" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalia" + +#. 740 +msgid "Suriname" +msgstr "Surinam" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "São Tomé og Príncipe" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Den arabiske republik Syrien" + +#. 748 +msgid "Swaziland" +msgstr "Swaziland" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turks- og Caicosøerne" + +#. 148 +msgid "Chad" +msgstr "Tchad" + +#. 260 +msgid "French Southern Territories" +msgstr "Fransk sydlige territorier" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Thailand" + +#. 762 +msgid "Tajikistan" +msgstr "Tajikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Timor-Leste" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunesien" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Tyrkiet" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad og Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan, Den Kinesiske Provins" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzania, Den Forenede Republik" + +#. 804 +msgid "Ukraine" +msgstr "Ukraine" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "USA, mindre omliggende øer" + +#. 840 +msgid "United States" +msgstr "USA" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Usbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Vatikanstaten" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Sankt Vincent og Grenadinerne" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Britiske jomfruøer" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Amerikanske Jomfruøer" + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis og Futunaøerne" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Yemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Sydafrika" + +#. 894 +msgid "Zambia" +msgstr "Zambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Ukendt, tilføj is_in mærke til disse byer" + +msgid "Car" +msgstr "Bil" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Land" + +msgid "Postal" +msgstr "Post" + +msgid "Town" +msgstr "By" + +msgid "District" +msgstr "Område" + +msgid "Street" +msgstr "Gade" + +msgid "Number" +msgstr "Nummer" + +msgid "Enter Destination" +msgstr "Indtast destination" + +msgid "Zip Code" +msgstr "Postnummer" + +msgid "City" +msgstr "By" + +msgid "District/Township" +msgstr "Distrikt" + +msgid "Map" +msgstr "Kort" + +msgid "Bookmark" +msgstr "Bogmærke" + +msgid "Destination" +msgstr "Destination" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Vis" + +msgid "_Route" +msgstr "Rute" + +msgid "_Former Destinations" +msgstr "Tidligere destinationer" + +msgid "_Bookmarks" +msgstr "Bogmærker" + +msgid "_Map" +msgstr "Kort" + +msgid "_Layout" +msgstr "Layout" + +msgid "_Projection" +msgstr "Visning" + +msgid "_Vehicle" +msgstr "Køretøj" + +msgid "Zoom_Out" +msgstr "Zoom ud" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Zoom ind" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Genberegn" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Info" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Stop Navigation" + +msgid "Test" +msgstr "Test" + +msgid "_Quit" +msgstr "_Afslut" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Stop Navigation" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Vejbog" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Autozoom" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Fuldskærm" + +msgid "Data" +msgstr "Data" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NØ" + +msgid "E" +msgstr "Ø" + +msgid "SE" +msgstr "SØ" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SV" + +msgid "W" +msgstr "V" + +msgid "NW" +msgstr "NV" + +msgid "No" +msgstr "Nej" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Rute %4.0fkm %02d:%02d ETA" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Rute 0000km 0+00:00 ETA" + +msgid "Back to map" +msgstr "Tilbage til kort" + +msgid "Main Menu" +msgstr "Hovedmenu" + +msgid "Help" +msgstr "Hjælp" + +msgid "Back" +msgstr "Tilbage" + +msgid "Add Bookmark" +msgstr "Tilføj Bogmærke" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "POI" + +msgid "View in Browser" +msgstr "Vis i Browser" + +msgid "Streets" +msgstr "Gader" + +msgid "House numbers" +msgstr "Hus numre" + +msgid "View Attributes" +msgstr "Vis attributter" + +msgid "View on map" +msgstr "Vis på kort" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "Bogmærker" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "Bogmærke %s" + +msgid "Former Destinations" +msgstr "Tidligere destinationer" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Husnummer" + +msgid "Layout" +msgstr "Layout" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Kort" + +msgid "Show Satellite Status" +msgstr "Vis satellit status" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "Vis NMEA data" + +msgid "car" +msgstr "Bil" + +msgid "bike" +msgstr "cykel" + +msgid "pedestrian" +msgstr "fodgænger" + +#, c-format +msgid "Current profile: %s" +msgstr "Aktuel profil: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Skift profil til: %s" + +msgid "Set as active" +msgstr "Sæt til aktiv" + +msgid "Show Satellite status" +msgstr "Vis satellit status" + +msgid "Show NMEA data" +msgstr "Vis NMEA data" + +msgid "Vehicle" +msgstr "Køretøj" + +msgid "Rules" +msgstr "Regler" + +msgid "Lock on road" +msgstr "Lås til vej" + +msgid "Northing" +msgstr "mod nord" + +msgid "Map follows Vehicle" +msgstr "Kort følger køretøj" + +msgid "Message" +msgstr "Meddelelse" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Route Beskrivelse" + +msgid "Height Profile" +msgstr "Lodret profil" + +msgid "Show Locale" +msgstr "Vis Lokale" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Kort punkt" + +msgid "Vehicle Position" +msgstr "Køretøjsposition" + +msgid "Main menu" +msgstr "Hovedmenu" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Vis\n" +"Kort" + +msgid "Settings" +msgstr "Indstillinger" + +msgid "Tools" +msgstr "Værktøj" + +msgid "Route" +msgstr "Rute" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "Funktioner" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Luk" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Stop\n" +"Navigation" + +msgid "Display" +msgstr "Vis" + +msgid "Fullscreen" +msgstr "Fuldskærm" + +msgid "Window Mode" +msgstr "Vinduestilstand" + +msgid "Description" +msgstr "Beskrivelse" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "hest" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "Om %s, kør ind i rundkørslen" + +#~ msgid "Cursor" +#~ msgstr "Markør" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d kilometer" diff --git a/po/de.po.in b/po/de.po.in new file mode 100644 index 0000000..6d2aa0f --- /dev/null +++ b/po/de.po.in @@ -0,0 +1,1762 @@ +# German translations for navit +# Copyright (C) 2007,2008 The Navit Team +# This file is distributed under the same license as the navit package. +# Martin Schaller , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-06-01 22:09+0000\n" +"Last-Translator: Achim Behrens \n" +"Language-Team: Martin Schaller \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Aufruf aus Quellverzeichnis\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "setze '%s' auf '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "nullte" + +msgid "first" +msgstr "erste" + +msgid "second" +msgstr "zweite" + +msgid "third" +msgstr "dritte" + +msgid "fourth" +msgstr "vierte" + +msgid "fifth" +msgstr "fünfte" + +msgid "sixth" +msgstr "sechste" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "nullten Ausfahrt" + +msgid "first exit" +msgstr "ersten Ausfahrt" + +msgid "second exit" +msgstr "zweiten Ausfahrt" + +msgid "third exit" +msgstr "dritten Ausfahrt" + +msgid "fourth exit" +msgstr "vierten Ausfahrt" + +msgid "fifth exit" +msgstr "fünften Ausfahrt" + +msgid "sixth exit" +msgstr "sechsten Ausfahrt" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "in %d m" + +#, c-format +msgid "%d feet" +msgstr "%d Fuss" + +#, c-format +msgid "in %d feet" +msgstr "in %d Fuss" + +#, c-format +msgid "%d meters" +msgstr "%d Meter" + +#, c-format +msgid "in %d meters" +msgstr "In %d Metern" + +#, c-format +msgid "%d.%d miles" +msgstr "%d.%d Meilen" + +#, c-format +msgid "in %d.%d miles" +msgstr "in %d.%d Meilen" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d,%d Kilometer" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "In %d,%d Kilometern" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "eine Meile" +msgstr[1] "%d Meilen" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "in einer Meile" +msgstr[1] "in %d Meilen" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "einen Kilometer" +msgstr[1] "%d Kilometer" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "In einem Kilometer" +msgstr[1] "In %d Kilometern" + +msgid "exit" +msgstr "Ausfahrt" + +msgid "into the ramp" +msgstr "auf die Autobahnauffahrt" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%sauf die Straße %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%sauf den %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%sauf die %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%sauf das %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%sauf die %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "rechts" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "links" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "leicht " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "scharf " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "scharf " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "unbekannt " + +# +msgid "When possible, please turn around" +msgstr "Wenn möglich bitte wenden" + +msgid "Enter the roundabout soon" +msgstr "Demnächst in den Kreisverkehr einfahren" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "%s in den Kreisverkehr einfahren" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "dann verlassen Sie den Kreisverkehr an der %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Den Kreisverkehr an der %s verlassen" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Dem Straßenverlauf %s folgen" + +msgid "soon" +msgstr "Demnächst" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Die %1$s Straße %2$s abbiegen" + +#, c-format +msgid "after %i roads" +msgstr "nach %i Straßen" + +msgid "now" +msgstr "Jetzt" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "dann die %1$s Straße %2$s abbiegen" + +msgid "error" +msgstr "Fehler" + +# c-format +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "%3$s %1$s%2$s abbiegen%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "dann %3$s %1$s%2$s abbiegen%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "%s haben Sie ihr Ziel erreicht" + +msgid "then you have reached your destination." +msgstr "dann haben Sie Ihr Ziel erreicht." + +msgid "Position" +msgstr "Position" + +msgid "Command" +msgstr "Befehl" + +msgid "Length" +msgstr "Länge" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Zeit" + +msgid "Destination Length" +msgstr "Verbleibende Strecke zum Ziel" + +msgid "Destination Time" +msgstr "Fahrzeit zum Ziel" + +msgid "Roadbook" +msgstr "Straßenkarte" + +msgid "Set as position" +msgstr "Als Position setzen" + +msgid "Set as destination" +msgstr "Als Ziel setzen" + +msgid "Add as bookmark" +msgstr "Als Lesezeichen aufnehmen" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Punkt 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Bildschirm %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Die Vereinigte arabische Emirate" + +#. 004 +msgid "Afghanistan" +msgstr "Afghanistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua und Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albanien" + +#. 051 +msgid "Armenia" +msgstr "Armenien" + +# +#. 530 +msgid "Netherlands Antilles" +msgstr "Niederländische Antillen" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarktis" + +#. 032 +msgid "Argentina" +msgstr "Argentinien" + +#. 016 +msgid "American Samoa" +msgstr "Amerikanisch-Samoa" + +#. 040 +msgid "Austria" +msgstr "Österreich" + +#. 036 +msgid "Australia" +msgstr "Australien" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Åland" + +#. 031 +msgid "Azerbaijan" +msgstr "Aserbaidschan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnien und Herzegowina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesch" + +#. 056 +msgid "Belgium" +msgstr "Belgien" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgarien" + +#. 048 +msgid "Bahrain" +msgstr "Bahrain" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint-Barthélemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei Darussalam" + +#. 068 +msgid "Bolivia" +msgstr "Bolivien" + +#. 076 +msgid "Brazil" +msgstr "Brasilien" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "Bhutan" + +#. 074 +msgid "Bouvet Island" +msgstr "Bouvetinsel" + +#. 072 +msgid "Botswana" +msgstr "Botsuana" + +#. 112 +msgid "Belarus" +msgstr "Weißrussland" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Kanada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Kokosinseln" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Kongo, Demokratische Republik" + +#. 140 +msgid "Central African Republic" +msgstr "Zentralafrikanische Republik" + +#. 178 +msgid "Congo" +msgstr "Republik Kongo" + +#. 756 +msgid "Switzerland" +msgstr "Schweiz" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Côte d'Ivoire" + +#. 184 +msgid "Cook Islands" +msgstr "Cookinseln" + +#. 152 +msgid "Chile" +msgstr "Chile" + +#. 120 +msgid "Cameroon" +msgstr "Kamerun" + +#. 156 +msgid "China" +msgstr "China, Volksrepublik" + +#. 170 +msgid "Colombia" +msgstr "Kolumbien" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Kuba" + +#. 132 +msgid "Cape Verde" +msgstr "Kap Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Weihnachtsinsel" + +#. 196 +msgid "Cyprus" +msgstr "Zypern" + +#. 203 +msgid "Czech Republic" +msgstr "Tschechische Republik" + +#. 276 +msgid "Germany" +msgstr "Deutschland" + +#. 262 +msgid "Djibouti" +msgstr "Dschibuti" + +#. 208 +msgid "Denmark" +msgstr "Dänemark" + +#. 212 +msgid "Dominica" +msgstr "Dominica" + +#. 214 +msgid "Dominican Republic" +msgstr "Dominikanische Republik" + +#. 012 +msgid "Algeria" +msgstr "Algerien" + +#. 218 +msgid "Ecuador" +msgstr "Ecuador" + +#. 233 +msgid "Estonia" +msgstr "Estland" + +#. 818 +msgid "Egypt" +msgstr "Ägypten" + +#. 732 +msgid "Western Sahara" +msgstr "Westsahara" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Spanien" + +#. 231 +msgid "Ethiopia" +msgstr "Äthiopien" + +#. 246 +msgid "Finland" +msgstr "Finnland" + +#. 242 +msgid "Fiji" +msgstr "Fidschi" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falklandinseln" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Mikronesien" + +#. 234 +msgid "Faroe Islands" +msgstr "Färöer" + +#. 250 +msgid "France" +msgstr "Frankreich" + +#. 266 +msgid "Gabon" +msgstr "Gabun" + +#. 826 +msgid "United Kingdom" +msgstr "Grossbritannien" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Georgien" + +#. 254 +msgid "French Guiana" +msgstr "Französisch-Guayana" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Grönland" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Äquatorialguinea" + +#. 300 +msgid "Greece" +msgstr "Griechenland" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Südgeorgien und die Südlichen Sandwichinseln" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hongkong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heard- und McDonald-Inseln" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Kroatien" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Ungarn" + +#. 360 +msgid "Indonesia" +msgstr "Indonesien" + +#. 372 +msgid "Ireland" +msgstr "Irland" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "Insel Man" + +#. 356 +msgid "India" +msgstr "Indien" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Britisches Territorium im Indischen Ozean" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iran, Islamische Republik" + +#. 352 +msgid "Iceland" +msgstr "Island" + +#. 380 +msgid "Italy" +msgstr "Italien" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaika" + +#. 400 +msgid "Jordan" +msgstr "Jordanien" + +#. 392 +msgid "Japan" +msgstr "Japan" + +#. 404 +msgid "Kenya" +msgstr "Kenia" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirgisistan" + +#. 116 +msgid "Cambodia" +msgstr "Kambodscha" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Komoren" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "St. Kitts und Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Korea, Demokratische Volksrepublik" + +#. 410 +msgid "Korea, Republic of" +msgstr "Südkorea" + +#. 414 +msgid "Kuwait" +msgstr "Kuwait" + +#. 136 +msgid "Cayman Islands" +msgstr "Kaimaninseln" + +#. 398 +msgid "Kazakhstan" +msgstr "Kasachstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laos, Demokratische Volksrepublik" + +#. 422 +msgid "Lebanon" +msgstr "Libanon" + +#. 662 +msgid "Saint Lucia" +msgstr "St. Lucia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberia" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Litauen" + +#. 442 +msgid "Luxembourg" +msgstr "Luxemburg" + +#. 428 +msgid "Latvia" +msgstr "Lettland" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libysch-Arabische Dschamahirija" + +#. 504 +msgid "Morocco" +msgstr "Marokko" + +#. 492 +msgid "Monaco" +msgstr "Monaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldawien" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Saint-Martin (franz. Teil)" + +#. 450 +msgid "Madagascar" +msgstr "Madagaskar" + +#. 584 +msgid "Marshall Islands" +msgstr "Marshallinseln" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Mazedonien, ehem. jugoslawische Republik" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Burma" + +#. 496 +msgid "Mongolia" +msgstr "Mongolei" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Nördliche Marianen" + +#. 474 +msgid "Martinique" +msgstr "Martinique" + +#. 478 +msgid "Mauritania" +msgstr "Mauretanien" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauritius" + +#. 462 +msgid "Maldives" +msgstr "Malediven" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mexiko" + +#. 458 +msgid "Malaysia" +msgstr "Malaysia" + +#. 508 +msgid "Mozambique" +msgstr "Mosambik" + +#. 516 +msgid "Namibia" +msgstr "Namibia" + +#. 540 +msgid "New Caledonia" +msgstr "Neukaledonien" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolkinsel" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nicaragua" + +#. 528 +msgid "Netherlands" +msgstr "Niederlande" + +#. 578 +msgid "Norway" +msgstr "Norwegen" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Neuseeland" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Französisch-Polynesien" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua-Neuguinea" + +#. 608 +msgid "Philippines" +msgstr "Philippinen" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Polen" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint-Pierre und Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairninseln" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palästinensische Autonomiegebiete" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Katar" + +#. 638 +msgid "Reunion" +msgstr "Réunion" + +#. 642 +msgid "Romania" +msgstr "Rumänien" + +#. 688 +msgid "Serbia" +msgstr "Serbien" + +#. 643 +msgid "Russian Federation" +msgstr "Rußland" + +#. 646 +msgid "Rwanda" +msgstr "Ruanda" + +# +#. 682 +msgid "Saudi Arabia" +msgstr "Saudi-Arabien" + +#. 090 +msgid "Solomon Islands" +msgstr "Salomonen" + +#. 690 +msgid "Seychelles" +msgstr "Seychellen" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Schweden" + +#. 702 +msgid "Singapore" +msgstr "Singapur" + +#. 654 +msgid "Saint Helena" +msgstr "St. Helena" + +#. 705 +msgid "Slovenia" +msgstr "Slowenien" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard und Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slowakei" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalia" + +#. 740 +msgid "Suriname" +msgstr "Suriname" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "São Tomé und Príncipe" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Syrien, Arabische Republik" + +#. 748 +msgid "Swaziland" +msgstr "Swasiland" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turks- und Caicosinseln" + +#. 148 +msgid "Chad" +msgstr "Tschad" + +#. 260 +msgid "French Southern Territories" +msgstr "Französische Süd- und Antarktisgebiete" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Thailand" + +#. 762 +msgid "Tajikistan" +msgstr "Tadschikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Osttimor" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunesien" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Türkei" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad und Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Republik China" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tansania, Vereinigte Republik" + +#. 804 +msgid "Ukraine" +msgstr "Ukraine" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "United States Minor Outlying Islands" + +#. 840 +msgid "United States" +msgstr "Vereinigte Staaten von Amerika" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Usbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Vatikanstadt" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "St. Vincent und die Grenadinen" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Britische Jungferninseln" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Amerikanische Jungferninseln" + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis und Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Jemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Südafrika" + +#. 894 +msgid "Zambia" +msgstr "Sambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Simbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "*Unbekannt, füge Etikett \"ist in\" zu diesen Städten hinzu" + +msgid "Car" +msgstr "Auto" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Land" + +# +msgid "Postal" +msgstr "PLZ" + +msgid "Town" +msgstr "Ort" + +msgid "District" +msgstr "Gegend" + +msgid "Street" +msgstr "Straße" + +msgid "Number" +msgstr "Nummer" + +msgid "Enter Destination" +msgstr "Reiseziel eingeben" + +msgid "Zip Code" +msgstr "Postleitzahl" + +msgid "City" +msgstr "Stadt" + +msgid "District/Township" +msgstr "Ortsteil/Gemeinde" + +msgid "Map" +msgstr "Karte" + +msgid "Bookmark" +msgstr "Lesezeichen" + +msgid "Destination" +msgstr "Reiseziel" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "_Anzeige" + +msgid "_Route" +msgstr "_Route" + +msgid "_Former Destinations" +msgstr "_Vorherige Ziele" + +msgid "_Bookmarks" +msgstr "_Lesezeichen" + +msgid "_Map" +msgstr "_Karte" + +msgid "_Layout" +msgstr "_Erscheinungsbild" + +msgid "_Projection" +msgstr "_Projektion" + +msgid "_Vehicle" +msgstr "_Fahrzeug" + +msgid "Zoom_Out" +msgstr "Ver_kleinern" + +msgid "Decrease zoom level" +msgstr "Verkleinern" + +msgid "Zoom_In" +msgstr "Ver_größern" + +msgid "Increase zoom level" +msgstr "Vergrößern" + +msgid "_Recalculate" +msgstr "_Neu berechnen" + +msgid "Redraw map" +msgstr "Karte neuzeichnen" + +msgid "_Info" +msgstr "_Info" + +msgid "Set _destination" +msgstr "Als _Ziel setzen" + +msgid "Opens address search dialog" +msgstr "Öffnet Adresssuche-Dialog" + +msgid "_Stop Navigation" +msgstr "Navigation be_enden" + +msgid "Test" +msgstr "Test" + +msgid "_Quit" +msgstr "_Beenden" + +msgid "Quit the application" +msgstr "Die Anwendung beenden" + +msgid "Show position _cursor" +msgstr "Positions_marke zeigen" + +msgid "_Lock on Road" +msgstr "Auf Straße _zeigen" + +msgid "_Keep orientation to the North" +msgstr "_Nordorientierung" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" +"Die Kartenorientierung zwischen Norden und Fahrzeugausrichtung wechseln" + +msgid "_Roadbook" +msgstr "_Straßenkarte" + +msgid "Show/hide route description" +msgstr "Routenbeschreibung anzeigen/schließen" + +msgid "_Autozoom" +msgstr "_automatischer Zoom" + +msgid "Enable/disable automatic zoom level changing" +msgstr "Automatischen Zoom einschalten/ausschalten" + +msgid "_Fullscreen" +msgstr "_Vollbild" + +msgid "Data" +msgstr "Daten" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NO" + +msgid "E" +msgstr "O" + +msgid "SE" +msgstr "SO" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SW" + +msgid "W" +msgstr "W" + +msgid "NW" +msgstr "NW" + +msgid "No" +msgstr "Nein" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Route %4.0fkm %02d:%02d ETA" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Route 0000km 0+00:00 ETA" + +msgid "Back to map" +msgstr "Zurück zur Karte" + +msgid "Main Menu" +msgstr "Hauptmenü" + +msgid "Help" +msgstr "Hilfe" + +msgid "Back" +msgstr "Zurück" + +msgid "Add Bookmark" +msgstr "Lesezeichen hinzufügen" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "Lesezeichen-Ordner hinzufügen" + +msgid "Rename" +msgstr "Umbennenen" + +msgid "POIs" +msgstr "Interessante Kartenpunkte" + +msgid "View in Browser" +msgstr "Im Browser anzeigen" + +msgid "Streets" +msgstr "Straßen" + +msgid "House numbers" +msgstr "Hausnummern" + +msgid "View Attributes" +msgstr "Attribute anzeigen" + +msgid "View on map" +msgstr "Auf der Karte zeigen" + +msgid "Cut Bookmark" +msgstr "Lesezeichen entfernen" + +msgid "Copy Bookmark" +msgstr "Lesezeichen kopieren" + +msgid "Rename Bookmark" +msgstr "Lesezeichen umbenennen" + +msgid "Paste Bookmark" +msgstr "Lesezeichen einfügen" + +msgid "Delete Bookmark" +msgstr "Lesezeichen entfernen" + +msgid "Bookmarks" +msgstr "Lesezeichen" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Lesezeichen einfügen" + +#, c-format +msgid "Bookmark %s" +msgstr "Lesezeichen %s" + +msgid "Former Destinations" +msgstr "Vorherige Ziele" + +msgid "- No former destinations available -" +msgstr "- Keine vorherigen Ziele -" + +msgid "House number" +msgstr "Hausnummer" + +msgid "Layout" +msgstr "Erscheinungsbild" + +#, c-format +msgid "Download %s" +msgstr "%s herunterladen" + +msgid "Map Download" +msgstr "Kartendownload" + +msgid "Active" +msgstr "Aktiv" + +msgid "Download Enabled" +msgstr "Download aktiviert" + +msgid "Download completely" +msgstr "Komplett herunterladen" + +msgid "Maps" +msgstr "Karten" + +msgid "Show Satellite Status" +msgstr "Satellitenstatus anzeigen" + +msgid " Elevation " +msgstr " Höhe " + +msgid " Azimuth " +msgstr " Längengrad " + +msgid "Show NMEA Data" +msgstr "zeige NMEA Daten" + +msgid "car" +msgstr "Auto" + +msgid "bike" +msgstr "Fahrrad" + +msgid "pedestrian" +msgstr "Fußgänger" + +#, c-format +msgid "Current profile: %s" +msgstr "Aktuelles Profil: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Profil ändern nach: %s" + +msgid "Set as active" +msgstr "Als Aktiv setzen" + +msgid "Show Satellite status" +msgstr "Satellitenstatus anzeigen" + +msgid "Show NMEA data" +msgstr "NMEA Daten anzeigen" + +msgid "Vehicle" +msgstr "Fahrzeug" + +msgid "Rules" +msgstr "Regeln" + +msgid "Lock on road" +msgstr "Auf Straße zeigen" + +msgid "Northing" +msgstr "Einnorden" + +msgid "Map follows Vehicle" +msgstr "Karte folgt Fahrzeug" + +msgid "Message" +msgstr "Benachrichtigung" + +msgid "Next" +msgstr "Vor" + +msgid "Prev" +msgstr "Zurück" + +msgid "Route Description" +msgstr "Wegbeschreibung" + +msgid "Height Profile" +msgstr "Höhenprofil" + +msgid "Show Locale" +msgstr "Lokalisierung anzeigen" + +msgid "About Navit" +msgstr "Über Navit" + +#. Authors +msgid "By" +msgstr "Von" + +#. Contributors +msgid "And all the Navit Team" +msgstr "Und das ganze Navit Team" + +msgid "members and contributors." +msgstr "Mitglieder und Mitarbeiter" + +msgid "Return to route!" +msgstr "Zurück zur Route!" + +#. warning told +msgid "Look out! Camera!" +msgstr "Achtung Blitzer!" + +#. warning told +msgid "Please decrease your speed" +msgstr "Bitte Geschwindigkeit verringern" + +msgid "Map Point" +msgstr "Kartenpunkt" + +msgid "Vehicle Position" +msgstr "Fahrzeugposition" + +msgid "Main menu" +msgstr "Hauptmenü" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Karte\n" +"anzeigen" + +msgid "Settings" +msgstr "Einstellungen" + +msgid "Tools" +msgstr "Werkzeuge" + +msgid "Route" +msgstr "Route" + +msgid "About" +msgstr "Über" + +msgid "Actions" +msgstr "Aktionen" + +msgid "" +"Former\n" +"Destinations" +msgstr "" +"Vorherige\n" +"Ziele" + +msgid "Quit" +msgstr "Ende" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Navigation\n" +"beenden" + +msgid "Display" +msgstr "Anzeige" + +msgid "Fullscreen" +msgstr "Vollbild" + +msgid "Window Mode" +msgstr "Fenstermodus" + +msgid "Description" +msgstr "Beschreibung" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "Auto ohne Maut" + +msgid "horse" +msgstr "Pferd" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "LKW" diff --git a/po/de_CH.po.in b/po/de_CH.po.in new file mode 100644 index 0000000..bf59252 --- /dev/null +++ b/po/de_CH.po.in @@ -0,0 +1,1749 @@ +# German (Switzerland) translation for navit +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the navit package. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-05-18 08:49+0000\n" +"Last-Translator: \n" +"Language-Team: German (Switzerland) \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "" + +msgid "first" +msgstr "" + +msgid "second" +msgstr "" + +msgid "third" +msgstr "" + +msgid "fourth" +msgstr "" + +msgid "fifth" +msgstr "" + +msgid "sixth" +msgstr "" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "" + +msgid "first exit" +msgstr "" + +msgid "second exit" +msgstr "" + +msgid "third exit" +msgstr "" + +msgid "fourth exit" +msgstr "" + +msgid "fifth exit" +msgstr "" + +msgid "sixth exit" +msgstr "" + +#, c-format +msgid "%d m" +msgstr "" + +#, c-format +msgid "in %d m" +msgstr "" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "" + +#, c-format +msgid "in %d meters" +msgstr "" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "" +msgstr[1] "" + +msgid "exit" +msgstr "" + +msgid "into the ramp" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "" + +msgid "When possible, please turn around" +msgstr "" + +msgid "Enter the roundabout soon" +msgstr "" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "" + +msgid "soon" +msgstr "" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "" + +#, c-format +msgid "after %i roads" +msgstr "" + +msgid "now" +msgstr "" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "" + +msgid "error" +msgstr "" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "" + +#, c-format +msgid "You have reached your destination %s" +msgstr "" + +msgid "then you have reached your destination." +msgstr "" + +msgid "Position" +msgstr "" + +msgid "Command" +msgstr "" + +msgid "Length" +msgstr "" + +msgid "km" +msgstr "" + +msgid "m" +msgstr "" + +msgid "Time" +msgstr "" + +msgid "Destination Length" +msgstr "" + +msgid "Destination Time" +msgstr "" + +msgid "Roadbook" +msgstr "" + +msgid "Set as position" +msgstr "" + +msgid "Set as destination" +msgstr "" + +msgid "Add as bookmark" +msgstr "" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "" + +#. 020 +msgid "Andorra" +msgstr "" + +#. 784 +msgid "United Arab Emirates" +msgstr "" + +#. 004 +msgid "Afghanistan" +msgstr "" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "" + +#. 660 +msgid "Anguilla" +msgstr "" + +#. 008 +msgid "Albania" +msgstr "" + +#. 051 +msgid "Armenia" +msgstr "" + +#. 530 +msgid "Netherlands Antilles" +msgstr "" + +#. 024 +msgid "Angola" +msgstr "" + +#. 010 +msgid "Antarctica" +msgstr "" + +#. 032 +msgid "Argentina" +msgstr "" + +#. 016 +msgid "American Samoa" +msgstr "" + +#. 040 +msgid "Austria" +msgstr "" + +#. 036 +msgid "Australia" +msgstr "" + +#. 533 +msgid "Aruba" +msgstr "" + +#. 248 +msgid "Aland Islands" +msgstr "" + +#. 031 +msgid "Azerbaijan" +msgstr "" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "" + +#. 052 +msgid "Barbados" +msgstr "" + +#. 050 +msgid "Bangladesh" +msgstr "" + +#. 056 +msgid "Belgium" +msgstr "" + +#. 854 +msgid "Burkina Faso" +msgstr "" + +#. 100 +msgid "Bulgaria" +msgstr "" + +#. 048 +msgid "Bahrain" +msgstr "" + +#. 108 +msgid "Burundi" +msgstr "" + +#. 204 +msgid "Benin" +msgstr "" + +#. 652 +msgid "Saint Barthelemy" +msgstr "" + +#. 060 +msgid "Bermuda" +msgstr "" + +#. 096 +msgid "Brunei Darussalam" +msgstr "" + +#. 068 +msgid "Bolivia" +msgstr "" + +#. 076 +msgid "Brazil" +msgstr "" + +#. 044 +msgid "Bahamas" +msgstr "" + +#. 064 +msgid "Bhutan" +msgstr "" + +#. 074 +msgid "Bouvet Island" +msgstr "" + +#. 072 +msgid "Botswana" +msgstr "" + +#. 112 +msgid "Belarus" +msgstr "" + +#. 084 +msgid "Belize" +msgstr "" + +#. 124 +msgid "Canada" +msgstr "" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "" + +#. 140 +msgid "Central African Republic" +msgstr "" + +#. 178 +msgid "Congo" +msgstr "" + +#. 756 +msgid "Switzerland" +msgstr "" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "" + +#. 184 +msgid "Cook Islands" +msgstr "" + +#. 152 +msgid "Chile" +msgstr "" + +#. 120 +msgid "Cameroon" +msgstr "" + +#. 156 +msgid "China" +msgstr "" + +#. 170 +msgid "Colombia" +msgstr "" + +#. 188 +msgid "Costa Rica" +msgstr "" + +#. 192 +msgid "Cuba" +msgstr "" + +#. 132 +msgid "Cape Verde" +msgstr "" + +#. 162 +msgid "Christmas Island" +msgstr "" + +#. 196 +msgid "Cyprus" +msgstr "" + +#. 203 +msgid "Czech Republic" +msgstr "" + +#. 276 +msgid "Germany" +msgstr "" + +#. 262 +msgid "Djibouti" +msgstr "" + +#. 208 +msgid "Denmark" +msgstr "" + +#. 212 +msgid "Dominica" +msgstr "" + +#. 214 +msgid "Dominican Republic" +msgstr "" + +#. 012 +msgid "Algeria" +msgstr "" + +#. 218 +msgid "Ecuador" +msgstr "" + +#. 233 +msgid "Estonia" +msgstr "" + +#. 818 +msgid "Egypt" +msgstr "" + +#. 732 +msgid "Western Sahara" +msgstr "" + +#. 232 +msgid "Eritrea" +msgstr "" + +#. 724 +msgid "Spain" +msgstr "" + +#. 231 +msgid "Ethiopia" +msgstr "" + +#. 246 +msgid "Finland" +msgstr "" + +#. 242 +msgid "Fiji" +msgstr "" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "" + +#. 234 +msgid "Faroe Islands" +msgstr "" + +#. 250 +msgid "France" +msgstr "" + +#. 266 +msgid "Gabon" +msgstr "" + +#. 826 +msgid "United Kingdom" +msgstr "" + +#. 308 +msgid "Grenada" +msgstr "" + +#. 268 +msgid "Georgia" +msgstr "" + +#. 254 +msgid "French Guiana" +msgstr "" + +#. 831 +msgid "Guernsey" +msgstr "" + +#. 288 +msgid "Ghana" +msgstr "" + +#. 292 +msgid "Gibraltar" +msgstr "" + +#. 304 +msgid "Greenland" +msgstr "" + +#. 270 +msgid "Gambia" +msgstr "" + +#. 324 +msgid "Guinea" +msgstr "" + +#. 312 +msgid "Guadeloupe" +msgstr "" + +#. 226 +msgid "Equatorial Guinea" +msgstr "" + +#. 300 +msgid "Greece" +msgstr "" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "" + +#. 320 +msgid "Guatemala" +msgstr "" + +#. 316 +msgid "Guam" +msgstr "" + +#. 624 +msgid "Guinea-Bissau" +msgstr "" + +#. 328 +msgid "Guyana" +msgstr "" + +#. 344 +msgid "Hong Kong" +msgstr "" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "" + +#. 340 +msgid "Honduras" +msgstr "" + +#. 191 +msgid "Croatia" +msgstr "" + +#. 332 +msgid "Haiti" +msgstr "" + +#. 348 +msgid "Hungary" +msgstr "" + +#. 360 +msgid "Indonesia" +msgstr "" + +#. 372 +msgid "Ireland" +msgstr "" + +#. 376 +msgid "Israel" +msgstr "" + +#. 833 +msgid "Isle of Man" +msgstr "" + +#. 356 +msgid "India" +msgstr "" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "" + +#. 368 +msgid "Iraq" +msgstr "" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "" + +#. 352 +msgid "Iceland" +msgstr "" + +#. 380 +msgid "Italy" +msgstr "" + +#. 832 +msgid "Jersey" +msgstr "" + +#. 388 +msgid "Jamaica" +msgstr "" + +#. 400 +msgid "Jordan" +msgstr "" + +#. 392 +msgid "Japan" +msgstr "" + +#. 404 +msgid "Kenya" +msgstr "" + +#. 417 +msgid "Kyrgyzstan" +msgstr "" + +#. 116 +msgid "Cambodia" +msgstr "" + +#. 296 +msgid "Kiribati" +msgstr "" + +#. 174 +msgid "Comoros" +msgstr "" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "" + +#. 410 +msgid "Korea, Republic of" +msgstr "" + +#. 414 +msgid "Kuwait" +msgstr "" + +#. 136 +msgid "Cayman Islands" +msgstr "" + +#. 398 +msgid "Kazakhstan" +msgstr "" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "" + +#. 422 +msgid "Lebanon" +msgstr "" + +#. 662 +msgid "Saint Lucia" +msgstr "" + +#. 438 +msgid "Liechtenstein" +msgstr "" + +#. 144 +msgid "Sri Lanka" +msgstr "" + +#. 430 +msgid "Liberia" +msgstr "" + +#. 426 +msgid "Lesotho" +msgstr "" + +#. 440 +msgid "Lithuania" +msgstr "" + +#. 442 +msgid "Luxembourg" +msgstr "" + +#. 428 +msgid "Latvia" +msgstr "" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "" + +#. 504 +msgid "Morocco" +msgstr "" + +#. 492 +msgid "Monaco" +msgstr "" + +#. 498 +msgid "Moldova, Republic of" +msgstr "" + +#. 499 +msgid "Montenegro" +msgstr "" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "" + +#. 450 +msgid "Madagascar" +msgstr "" + +#. 584 +msgid "Marshall Islands" +msgstr "" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "" + +#. 466 +msgid "Mali" +msgstr "" + +#. 104 +msgid "Myanmar" +msgstr "" + +#. 496 +msgid "Mongolia" +msgstr "" + +#. 446 +msgid "Macao" +msgstr "" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "" + +#. 474 +msgid "Martinique" +msgstr "" + +#. 478 +msgid "Mauritania" +msgstr "" + +#. 500 +msgid "Montserrat" +msgstr "" + +#. 470 +msgid "Malta" +msgstr "" + +#. 480 +msgid "Mauritius" +msgstr "" + +#. 462 +msgid "Maldives" +msgstr "" + +#. 454 +msgid "Malawi" +msgstr "" + +#. 484 +msgid "Mexico" +msgstr "" + +#. 458 +msgid "Malaysia" +msgstr "" + +#. 508 +msgid "Mozambique" +msgstr "" + +#. 516 +msgid "Namibia" +msgstr "" + +#. 540 +msgid "New Caledonia" +msgstr "" + +#. 562 +msgid "Niger" +msgstr "" + +#. 574 +msgid "Norfolk Island" +msgstr "" + +#. 566 +msgid "Nigeria" +msgstr "" + +#. 558 +msgid "Nicaragua" +msgstr "" + +#. 528 +msgid "Netherlands" +msgstr "" + +#. 578 +msgid "Norway" +msgstr "" + +#. 524 +msgid "Nepal" +msgstr "" + +#. 520 +msgid "Nauru" +msgstr "" + +#. 570 +msgid "Niue" +msgstr "" + +#. 554 +msgid "New Zealand" +msgstr "" + +#. 512 +msgid "Oman" +msgstr "" + +#. 591 +msgid "Panama" +msgstr "" + +#. 604 +msgid "Peru" +msgstr "" + +#. 258 +msgid "French Polynesia" +msgstr "" + +#. 598 +msgid "Papua New Guinea" +msgstr "" + +#. 608 +msgid "Philippines" +msgstr "" + +#. 586 +msgid "Pakistan" +msgstr "" + +#. 616 +msgid "Poland" +msgstr "" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "" + +#. 612 +msgid "Pitcairn" +msgstr "" + +#. 630 +msgid "Puerto Rico" +msgstr "" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "" + +#. 620 +msgid "Portugal" +msgstr "" + +#. 585 +msgid "Palau" +msgstr "" + +#. 600 +msgid "Paraguay" +msgstr "" + +#. 634 +msgid "Qatar" +msgstr "" + +#. 638 +msgid "Reunion" +msgstr "" + +#. 642 +msgid "Romania" +msgstr "" + +#. 688 +msgid "Serbia" +msgstr "" + +#. 643 +msgid "Russian Federation" +msgstr "" + +#. 646 +msgid "Rwanda" +msgstr "" + +#. 682 +msgid "Saudi Arabia" +msgstr "" + +#. 090 +msgid "Solomon Islands" +msgstr "" + +#. 690 +msgid "Seychelles" +msgstr "" + +#. 736 +msgid "Sudan" +msgstr "" + +#. 752 +msgid "Sweden" +msgstr "" + +#. 702 +msgid "Singapore" +msgstr "" + +#. 654 +msgid "Saint Helena" +msgstr "" + +#. 705 +msgid "Slovenia" +msgstr "" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "" + +#. 703 +msgid "Slovakia" +msgstr "" + +#. 694 +msgid "Sierra Leone" +msgstr "" + +#. 674 +msgid "San Marino" +msgstr "" + +#. 686 +msgid "Senegal" +msgstr "" + +#. 706 +msgid "Somalia" +msgstr "" + +#. 740 +msgid "Suriname" +msgstr "" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "" + +#. 222 +msgid "El Salvador" +msgstr "" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "" + +#. 748 +msgid "Swaziland" +msgstr "" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "" + +#. 148 +msgid "Chad" +msgstr "" + +#. 260 +msgid "French Southern Territories" +msgstr "" + +#. 768 +msgid "Togo" +msgstr "" + +#. 764 +msgid "Thailand" +msgstr "" + +#. 762 +msgid "Tajikistan" +msgstr "" + +#. 772 +msgid "Tokelau" +msgstr "" + +#. 626 +msgid "Timor-Leste" +msgstr "" + +#. 795 +msgid "Turkmenistan" +msgstr "" + +#. 788 +msgid "Tunisia" +msgstr "" + +#. 776 +msgid "Tonga" +msgstr "" + +#. 792 +msgid "Turkey" +msgstr "" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "" + +#. 798 +msgid "Tuvalu" +msgstr "" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "" + +#. 804 +msgid "Ukraine" +msgstr "" + +#. 800 +msgid "Uganda" +msgstr "" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "" + +#. 840 +msgid "United States" +msgstr "" + +#. 858 +msgid "Uruguay" +msgstr "" + +#. 860 +msgid "Uzbekistan" +msgstr "" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "" + +#. 862 +msgid "Venezuela" +msgstr "" + +#. 092 +msgid "Virgin Islands, British" +msgstr "" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "" + +#. 704 +msgid "Viet Nam" +msgstr "" + +#. 548 +msgid "Vanuatu" +msgstr "" + +#. 876 +msgid "Wallis and Futuna" +msgstr "" + +#. 882 +msgid "Samoa" +msgstr "" + +#. 887 +msgid "Yemen" +msgstr "" + +#. 175 +msgid "Mayotte" +msgstr "" + +#. 710 +msgid "South Africa" +msgstr "" + +#. 894 +msgid "Zambia" +msgstr "" + +#. 716 +msgid "Zimbabwe" +msgstr "" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "" + +msgid "Car" +msgstr "" + +msgid "Iso2" +msgstr "" + +msgid "Iso3" +msgstr "" + +msgid "Country" +msgstr "" + +msgid "Postal" +msgstr "" + +msgid "Town" +msgstr "" + +msgid "District" +msgstr "" + +msgid "Street" +msgstr "" + +msgid "Number" +msgstr "" + +msgid "Enter Destination" +msgstr "" + +msgid "Zip Code" +msgstr "" + +msgid "City" +msgstr "" + +msgid "District/Township" +msgstr "" + +msgid "Map" +msgstr "" + +msgid "Bookmark" +msgstr "" + +msgid "Destination" +msgstr "" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "" + +msgid "_Route" +msgstr "" + +msgid "_Former Destinations" +msgstr "" + +msgid "_Bookmarks" +msgstr "" + +msgid "_Map" +msgstr "" + +msgid "_Layout" +msgstr "" + +msgid "_Projection" +msgstr "" + +msgid "_Vehicle" +msgstr "" + +msgid "Zoom_Out" +msgstr "" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "" + +msgid "Test" +msgstr "" + +msgid "_Quit" +msgstr "" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "" + +msgid "Data" +msgstr "" + +msgid "N" +msgstr "" + +msgid "NE" +msgstr "" + +msgid "E" +msgstr "" + +msgid "SE" +msgstr "" + +msgid "S" +msgstr "" + +msgid "SW" +msgstr "" + +msgid "W" +msgstr "" + +msgid "NW" +msgstr "" + +msgid "No" +msgstr "" + +msgid "2D" +msgstr "" + +msgid "3D" +msgstr "" + +msgid "OT" +msgstr "" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "" + +msgid "Back to map" +msgstr "" + +msgid "Main Menu" +msgstr "" + +msgid "Help" +msgstr "" + +msgid "Back" +msgstr "" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "" + +msgid "View in Browser" +msgstr "" + +msgid "Streets" +msgstr "" + +msgid "House numbers" +msgstr "" + +msgid "View Attributes" +msgstr "" + +msgid "View on map" +msgstr "" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "" + +msgid "Former Destinations" +msgstr "" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "" + +msgid "Layout" +msgstr "" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "" + +msgid "Show Satellite Status" +msgstr "" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "" + +msgid "car" +msgstr "" + +msgid "bike" +msgstr "" + +msgid "pedestrian" +msgstr "" + +#, c-format +msgid "Current profile: %s" +msgstr "" + +#, c-format +msgid "Change profile to: %s" +msgstr "" + +msgid "Set as active" +msgstr "" + +msgid "Show Satellite status" +msgstr "" + +msgid "Show NMEA data" +msgstr "" + +msgid "Vehicle" +msgstr "" + +msgid "Rules" +msgstr "" + +msgid "Lock on road" +msgstr "" + +msgid "Northing" +msgstr "" + +msgid "Map follows Vehicle" +msgstr "" + +msgid "Message" +msgstr "" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "" + +msgid "Vehicle Position" +msgstr "" + +msgid "Main menu" +msgstr "" + +msgid "" +"Show\n" +"Map" +msgstr "" + +msgid "Settings" +msgstr "" + +msgid "Tools" +msgstr "" + +msgid "Route" +msgstr "" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" + +msgid "Display" +msgstr "" + +msgid "Fullscreen" +msgstr "" + +msgid "Window Mode" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" diff --git a/po/el.po.in b/po/el.po.in new file mode 100644 index 0000000..a170985 --- /dev/null +++ b/po/el.po.in @@ -0,0 +1,1767 @@ +# Greek translation for navit +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the navit package. +# Vassilis, 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-05-24 14:51+0000\n" +"Last-Translator: aitolos \n" +"Language-Team: Greek \n" +"Language: el\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Λειτουργία από τον πηγαίο κατάλογο\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "ρύθμιση '%s' στο'%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "τρέχουσα" + +msgid "first" +msgstr "πρώτος" + +msgid "second" +msgstr "δεύτερος" + +msgid "third" +msgstr "τρίτη" + +msgid "fourth" +msgstr "τέταρτος" + +msgid "fifth" +msgstr "πέμπτος" + +msgid "sixth" +msgstr "έκτος" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "τρέχουσα έξοδο" + +msgid "first exit" +msgstr "πρώτη έξοδο" + +msgid "second exit" +msgstr "δεύτερη έξοδο" + +msgid "third exit" +msgstr "τρίτη έξοδο" + +msgid "fourth exit" +msgstr "τέταρτη έξοδο" + +msgid "fifth exit" +msgstr "πέμπτη έξοδο" + +msgid "sixth exit" +msgstr "έκτη έξοδο" + +#, c-format +msgid "%d m" +msgstr "%d μ" + +#, c-format +msgid "in %d m" +msgstr "σε %d μ" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d μέτρα" + +#, c-format +msgid "in %d meters" +msgstr "σε %d μέτρα" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d χιλιόμετρα" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "σε %d %d χιλιόμετρα" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "Ένα χιλιόμετρο" +msgstr[1] "%d χιλιόμετρα" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "σε ένα χιλιόμετρο" +msgstr[1] "σε %d χιλιόμετρα" + +msgid "exit" +msgstr "έξοδος" + +msgid "into the ramp" +msgstr "στη ράμπα" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s στην οδό %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%sστον %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%sστην %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%sστο %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%s στην %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "δεξιά" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "αριστερά" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "ελαφρά " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "Κλειστά " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "πολύ κλειστά " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "άγνωστο " + +msgid "When possible, please turn around" +msgstr "Όταν είναι δυνατόν, κάνε αναστροφή" + +msgid "Enter the roundabout soon" +msgstr "Μπές στη κυκλική πορεία άμεσα" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "και βγείτε απο την κυκλική πορεία στην %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Εξοδος απο την κυκλική πορεία στην %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Ακολουθήστε το δρόμο για τα επόμενα %s" + +msgid "soon" +msgstr "σύντομα" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Πάρτε τον %1$s δρόμο για το %2$s" + +#, c-format +msgid "after %i roads" +msgstr "μετά από %i δρόμους" + +msgid "now" +msgstr "τώρα" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "στη συνέχεια πάρτε το %1$s δρόμο για το %2$s" + +msgid "error" +msgstr "σφάλμα" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Στρίψτε %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "και στρίψτε %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Φτάσατε στον προορισμό σας %s" + +msgid "then you have reached your destination." +msgstr "τότε έχετε φτάσει στον προορισμό σας." + +msgid "Position" +msgstr "Θέση" + +msgid "Command" +msgstr "Εντολή" + +msgid "Length" +msgstr "Μήκος" + +msgid "km" +msgstr "χλμ" + +msgid "m" +msgstr "μ" + +msgid "Time" +msgstr "Χρόνος" + +msgid "Destination Length" +msgstr "Απόσταση Προορισμού" + +msgid "Destination Time" +msgstr "Χρόνος που απομένει" + +msgid "Roadbook" +msgstr "Οδηγίες Διαδρομής" + +msgid "Set as position" +msgstr "Ορισμός ως αφετηρία" + +msgid "Set as destination" +msgstr "Ορισμός ως προορισμός" + +msgid "Add as bookmark" +msgstr "Προσθήκη ως σελιδοδείκτης" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Σημείο 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Συντεταγμένες οθόνης : %d %d" + +#. 020 +msgid "Andorra" +msgstr "Ανδόρα" + +#. 784 +msgid "United Arab Emirates" +msgstr "Ηνωμένα Αραβικά Εμιράτα" + +#. 004 +msgid "Afghanistan" +msgstr "Αφγανιστάν" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Αντίγκουα και Μπαρμπούντα" + +#. 660 +msgid "Anguilla" +msgstr "Ανγκίλα" + +#. 008 +msgid "Albania" +msgstr "Αλβανία" + +#. 051 +msgid "Armenia" +msgstr "Αρμενία" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Ολλανδικές Αντίλλες" + +#. 024 +msgid "Angola" +msgstr "Ανγκόλα" + +#. 010 +msgid "Antarctica" +msgstr "Ανταρκτική" + +#. 032 +msgid "Argentina" +msgstr "Αργεντινή" + +#. 016 +msgid "American Samoa" +msgstr "Αμερικανική Σαμόα" + +#. 040 +msgid "Austria" +msgstr "Αυστρία" + +#. 036 +msgid "Australia" +msgstr "Αυστραλία" + +#. 533 +msgid "Aruba" +msgstr "Αρούμπα" + +#. 248 +msgid "Aland Islands" +msgstr "Νήσοι Όλαντ" + +#. 031 +msgid "Azerbaijan" +msgstr "Αζερμπαϊτζάν" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Βοσνία-Ερζεγοβίνη" + +#. 052 +msgid "Barbados" +msgstr "Μπαρμπέιντος" + +#. 050 +msgid "Bangladesh" +msgstr "Μπαγκλαντές" + +#. 056 +msgid "Belgium" +msgstr "Βέλγιο" + +#. 854 +msgid "Burkina Faso" +msgstr "Μπουρκίνα Φάσο" + +#. 100 +msgid "Bulgaria" +msgstr "Βουλγαρία" + +#. 048 +msgid "Bahrain" +msgstr "Μπαχρέιν" + +#. 108 +msgid "Burundi" +msgstr "Μπουρουντί" + +#. 204 +msgid "Benin" +msgstr "Μπενίν" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Αγιος Βαρθολομαίος" + +#. 060 +msgid "Bermuda" +msgstr "Βερμούδες" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Μπρουνέι Νταρουσαλάμ" + +#. 068 +msgid "Bolivia" +msgstr "Βολιβία" + +#. 076 +msgid "Brazil" +msgstr "Βραζιλία" + +#. 044 +msgid "Bahamas" +msgstr "Μπαχάμες" + +#. 064 +msgid "Bhutan" +msgstr "Μπουτάν" + +#. 074 +msgid "Bouvet Island" +msgstr "Νήσος Μπουβέ" + +#. 072 +msgid "Botswana" +msgstr "Μποτσουάνα" + +#. 112 +msgid "Belarus" +msgstr "Λευκορωσία" + +#. 084 +msgid "Belize" +msgstr "Μπελίζ" + +#. 124 +msgid "Canada" +msgstr "Καναδάς" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Νήσοι Κόκος (Κήλινγκ)" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Δημοκρατία του Κονγκό" + +#. 140 +msgid "Central African Republic" +msgstr "Δημοκρατία Κεντρικής Αφρικής" + +#. 178 +msgid "Congo" +msgstr "Κονγκό" + +#. 756 +msgid "Switzerland" +msgstr "Ελβετία" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Ακτή Ελεφαντοστού" + +#. 184 +msgid "Cook Islands" +msgstr "Νήσοι Κουκ" + +#. 152 +msgid "Chile" +msgstr "Χιλή" + +#. 120 +msgid "Cameroon" +msgstr "Καμερούν" + +#. 156 +msgid "China" +msgstr "Κίνα" + +#. 170 +msgid "Colombia" +msgstr "Κολομβία" + +#. 188 +msgid "Costa Rica" +msgstr "Κόστα Ρίκα" + +#. 192 +msgid "Cuba" +msgstr "Κούβα" + +#. 132 +msgid "Cape Verde" +msgstr "Πράσινο Ακρωτήριο" + +#. 162 +msgid "Christmas Island" +msgstr "Νήσοι Χριστουγέννων" + +#. 196 +msgid "Cyprus" +msgstr "Κύπρος" + +#. 203 +msgid "Czech Republic" +msgstr "Δημοκρατία της Τσεχίας" + +#. 276 +msgid "Germany" +msgstr "Γερμανία" + +#. 262 +msgid "Djibouti" +msgstr "Τζιμπουτί" + +#. 208 +msgid "Denmark" +msgstr "Δανία" + +#. 212 +msgid "Dominica" +msgstr "Ντομίνικα" + +#. 214 +msgid "Dominican Republic" +msgstr "Δομινικανή Δημοκρατία" + +#. 012 +msgid "Algeria" +msgstr "Αλγερία" + +#. 218 +msgid "Ecuador" +msgstr "Εκουαδόρ" + +#. 233 +msgid "Estonia" +msgstr "Εσθονία" + +#. 818 +msgid "Egypt" +msgstr "Αίγυπτος" + +#. 732 +msgid "Western Sahara" +msgstr "Δυτική Σαχάρα" + +#. 232 +msgid "Eritrea" +msgstr "Ερυθραία" + +#. 724 +msgid "Spain" +msgstr "Ισπανία" + +#. 231 +msgid "Ethiopia" +msgstr "Αιθιοπία" + +#. 246 +msgid "Finland" +msgstr "Φινλανδία" + +#. 242 +msgid "Fiji" +msgstr "Νησιά Φίτζι" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Νήσοι Φώκλαντ (Μαλβίνες)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Μικρονησία, Ομόσπονδες Πολιτείες της" + +#. 234 +msgid "Faroe Islands" +msgstr "Νήσοι Φερόε" + +#. 250 +msgid "France" +msgstr "Γαλλία" + +#. 266 +msgid "Gabon" +msgstr "Γκαμπόν" + +#. 826 +msgid "United Kingdom" +msgstr "Ηνωμένο Βασίλειο" + +#. 308 +msgid "Grenada" +msgstr "Γρενάδα" + +#. 268 +msgid "Georgia" +msgstr "Γεωργία" + +#. 254 +msgid "French Guiana" +msgstr "Γαλλική Γουινέα" + +#. 831 +msgid "Guernsey" +msgstr "Νήσος Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Γκάνα" + +#. 292 +msgid "Gibraltar" +msgstr "Γιβραλτάρ" + +#. 304 +msgid "Greenland" +msgstr "Γροιλανδία" + +#. 270 +msgid "Gambia" +msgstr "Γκάμπια" + +#. 324 +msgid "Guinea" +msgstr "Γουινέα" + +#. 312 +msgid "Guadeloupe" +msgstr "Γουαδελούπη" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Ισημερινή Γουινέα" + +#. 300 +msgid "Greece" +msgstr "Ελλάδα" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Νότια Τζόρτζια και Νότιοι νήσοι Σάντουιτς" + +#. 320 +msgid "Guatemala" +msgstr "Γουατεμάλα" + +#. 316 +msgid "Guam" +msgstr "Γκουάμ" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Γουινέα-Μπισσάου" + +#. 328 +msgid "Guyana" +msgstr "Γουιάνα" + +#. 344 +msgid "Hong Kong" +msgstr "Χονγκ Κονγκ" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Νήσος Χερντ και Νήσοι ΜακΝτόναλντ" + +#. 340 +msgid "Honduras" +msgstr "Ονδούρα" + +#. 191 +msgid "Croatia" +msgstr "Κροατία" + +#. 332 +msgid "Haiti" +msgstr "Αϊτή" + +#. 348 +msgid "Hungary" +msgstr "Ουγγαρία" + +#. 360 +msgid "Indonesia" +msgstr "Ινδονησία" + +#. 372 +msgid "Ireland" +msgstr "Ιρλανδία" + +#. 376 +msgid "Israel" +msgstr "Ισραήλ" + +#. 833 +msgid "Isle of Man" +msgstr "Αϊλ οφ Μαν" + +#. 356 +msgid "India" +msgstr "Ινδία" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Βρετανικά Εδάφη Ινδικού Ωκεανού" + +#. 368 +msgid "Iraq" +msgstr "Ιράκ" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Ισλαμική Δημοκρατία του Ιράν" + +#. 352 +msgid "Iceland" +msgstr "Ισλανδία" + +#. 380 +msgid "Italy" +msgstr "Ιταλία" + +#. 832 +msgid "Jersey" +msgstr "Τζέρσεϋ" + +#. 388 +msgid "Jamaica" +msgstr "Τζαμάικα" + +#. 400 +msgid "Jordan" +msgstr "Ιορδανία" + +#. 392 +msgid "Japan" +msgstr "Ιαπωνία" + +#. 404 +msgid "Kenya" +msgstr "Κένυα" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Κιργκιστάν" + +#. 116 +msgid "Cambodia" +msgstr "Καμπότζη" + +#. 296 +msgid "Kiribati" +msgstr "Κιριμπάτι" + +#. 174 +msgid "Comoros" +msgstr "Κομόρες" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Σαιντ Κίτς και Νέβις" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Κορέα, Λαϊκη Δημοκρατία της" + +#. 410 +msgid "Korea, Republic of" +msgstr "Κορέα, Δημοκρατία της" + +#. 414 +msgid "Kuwait" +msgstr "Κουβέιτ" + +#. 136 +msgid "Cayman Islands" +msgstr "Νήσοι Κέυμαν" + +#. 398 +msgid "Kazakhstan" +msgstr "Καζακστάν" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Λαϊκή Δημοκρατία του Λάος" + +#. 422 +msgid "Lebanon" +msgstr "Λίβανος" + +#. 662 +msgid "Saint Lucia" +msgstr "Αγία Λουκία" + +#. 438 +msgid "Liechtenstein" +msgstr "Λίχτενσταϊν" + +#. 144 +msgid "Sri Lanka" +msgstr "Σρι Λάνκα" + +#. 430 +msgid "Liberia" +msgstr "Λιβερία" + +#. 426 +msgid "Lesotho" +msgstr "Λεσότο" + +#. 440 +msgid "Lithuania" +msgstr "Λιθουανία" + +#. 442 +msgid "Luxembourg" +msgstr "Λουξεμβούργο" + +#. 428 +msgid "Latvia" +msgstr "Λεττονία" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Λυβική Αραβική Τζαμαχιρία" + +#. 504 +msgid "Morocco" +msgstr "Μαρόκο" + +#. 492 +msgid "Monaco" +msgstr "Μονακό" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Δημοκρατία της Μολδαβίας" + +#. 499 +msgid "Montenegro" +msgstr "Μαυροβούνιο" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Άγιος Μαρτίνος (Γαλλικό τμήμα)" + +#. 450 +msgid "Madagascar" +msgstr "Μαδαγασκάρη" + +#. 584 +msgid "Marshall Islands" +msgstr "Νήσοι Μάρσαλ" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Π.Γ.Δ.Μ." + +#. 466 +msgid "Mali" +msgstr "Μάλι" + +#. 104 +msgid "Myanmar" +msgstr "Μιανμάρ" + +#. 496 +msgid "Mongolia" +msgstr "Μογγολία" + +#. 446 +msgid "Macao" +msgstr "Μακάο" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Νήσοι Βόρειες Μαριάνες" + +#. 474 +msgid "Martinique" +msgstr "Μαρτινίκα" + +#. 478 +msgid "Mauritania" +msgstr "Μαυριτανία" + +#. 500 +msgid "Montserrat" +msgstr "Μοντσεράτ" + +#. 470 +msgid "Malta" +msgstr "Μάλτα" + +#. 480 +msgid "Mauritius" +msgstr "Μαυρίκιος" + +#. 462 +msgid "Maldives" +msgstr "Μαλδίβες" + +#. 454 +msgid "Malawi" +msgstr "Μαλάουι" + +#. 484 +msgid "Mexico" +msgstr "Μεξικό" + +#. 458 +msgid "Malaysia" +msgstr "Μαλαισία" + +#. 508 +msgid "Mozambique" +msgstr "Μοζαμβίκη" + +#. 516 +msgid "Namibia" +msgstr "Ναμίμπια" + +#. 540 +msgid "New Caledonia" +msgstr "Νέα Καληδονία" + +#. 562 +msgid "Niger" +msgstr "Νίγηρας" + +#. 574 +msgid "Norfolk Island" +msgstr "Νήσοι Νόρφολκ" + +#. 566 +msgid "Nigeria" +msgstr "Νιγηρία" + +#. 558 +msgid "Nicaragua" +msgstr "Νικαράγουα" + +#. 528 +msgid "Netherlands" +msgstr "Ολλανδία" + +#. 578 +msgid "Norway" +msgstr "Νορβηγία" + +#. 524 +msgid "Nepal" +msgstr "Νεπάλ" + +#. 520 +msgid "Nauru" +msgstr "Ναουρού" + +#. 570 +msgid "Niue" +msgstr "Νιούε" + +#. 554 +msgid "New Zealand" +msgstr "Νέα Ζηλανδία" + +#. 512 +msgid "Oman" +msgstr "Ομάν" + +#. 591 +msgid "Panama" +msgstr "Παναμάς" + +#. 604 +msgid "Peru" +msgstr "Περού" + +#. 258 +msgid "French Polynesia" +msgstr "Γαλλική Πολυνησία" + +#. 598 +msgid "Papua New Guinea" +msgstr "Παπούα-Νέα Γουινέα" + +#. 608 +msgid "Philippines" +msgstr "Φιλιππίνες" + +#. 586 +msgid "Pakistan" +msgstr "Πακιστάν" + +#. 616 +msgid "Poland" +msgstr "Πολωνία" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Σεν Πιερ και Μικελόν" + +#. 612 +msgid "Pitcairn" +msgstr "Πίτκερν" + +#. 630 +msgid "Puerto Rico" +msgstr "Πόρτο Ρίκο" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Κατεχόμενα Παλαιστινιακά Εδάφη" + +#. 620 +msgid "Portugal" +msgstr "Πορτογαλία" + +#. 585 +msgid "Palau" +msgstr "Παλάου" + +#. 600 +msgid "Paraguay" +msgstr "Παραγουάη" + +#. 634 +msgid "Qatar" +msgstr "Κατάρ" + +#. 638 +msgid "Reunion" +msgstr "Ρεουνιόν" + +#. 642 +msgid "Romania" +msgstr "Ρουμανία" + +#. 688 +msgid "Serbia" +msgstr "Σερβία" + +#. 643 +msgid "Russian Federation" +msgstr "Ρωσική Ομοσπονδία" + +#. 646 +msgid "Rwanda" +msgstr "Ρουάντα" + +#. 682 +msgid "Saudi Arabia" +msgstr "Σαουδική Αραβία" + +#. 090 +msgid "Solomon Islands" +msgstr "Νήσοι Σολομώντος" + +#. 690 +msgid "Seychelles" +msgstr "Σεϋχέλλες" + +#. 736 +msgid "Sudan" +msgstr "Σουδάν" + +#. 752 +msgid "Sweden" +msgstr "Σουηδία" + +#. 702 +msgid "Singapore" +msgstr "Σινγκαπούρη" + +#. 654 +msgid "Saint Helena" +msgstr "Νήσος Αγίας Ελένης" + +#. 705 +msgid "Slovenia" +msgstr "Σλοβενία" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Νήσοι Σβάλμπαρντ και Γιαν Μάγιεν" + +#. 703 +msgid "Slovakia" +msgstr "Σλοβακία" + +#. 694 +msgid "Sierra Leone" +msgstr "Σιέρα Λεόνε" + +#. 674 +msgid "San Marino" +msgstr "Άγιος Μαρίνος" + +#. 686 +msgid "Senegal" +msgstr "Σενεγάλη" + +#. 706 +msgid "Somalia" +msgstr "Σομαλία" + +#. 740 +msgid "Suriname" +msgstr "Σουρινάμ" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Sao Tome και Principe" + +#. 222 +msgid "El Salvador" +msgstr "Ελ Σαλβαδόρ" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Αραβική Δημοκρατία της Συρίας" + +#. 748 +msgid "Swaziland" +msgstr "Σουαζιλάνδη" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Νήσοι Τούρκς και Καΐκος" + +#. 148 +msgid "Chad" +msgstr "Τσαντ" + +#. 260 +msgid "French Southern Territories" +msgstr "Γαλλικές Νότιες Περιοχές" + +#. 768 +msgid "Togo" +msgstr "Τόγκο" + +#. 764 +msgid "Thailand" +msgstr "Ταϊλάνδη" + +#. 762 +msgid "Tajikistan" +msgstr "Τατζικιστάν" + +#. 772 +msgid "Tokelau" +msgstr "Τοκελάου" + +#. 626 +msgid "Timor-Leste" +msgstr "Τιμόρ-Λέστε" + +#. 795 +msgid "Turkmenistan" +msgstr "Τουρκμενιστάν" + +#. 788 +msgid "Tunisia" +msgstr "Τυνησία" + +#. 776 +msgid "Tonga" +msgstr "Τόνγκα" + +#. 792 +msgid "Turkey" +msgstr "Τουρκία" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Τρίνινταντ και Τομπάγκο" + +#. 798 +msgid "Tuvalu" +msgstr "Τουβάλου" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Ταϊβάν, Επαρχία της Κίνας" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Τανζανία, Ενωμένη Δημοκρατία της" + +#. 804 +msgid "Ukraine" +msgstr "Ουκρανία" + +#. 800 +msgid "Uganda" +msgstr "Ουγκάντα" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Απομακρυσμένες Νησίδες των Ηνωμένων Πολιτειών" + +#. 840 +msgid "United States" +msgstr "Ηνωμένες Πολιτείες της Αμερικής" + +#. 858 +msgid "Uruguay" +msgstr "Ουρουγουάη" + +#. 860 +msgid "Uzbekistan" +msgstr "Ουζμπεκιστάν" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Αγία Έδρα (Κράτος της Πόλης του Βατικανού)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Άγιος Βικέντιος και Γρεναδίνες" + +#. 862 +msgid "Venezuela" +msgstr "Βενεζουέλα" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Παρθένοι Νήσοι, Βρετανικές" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Παρθένοι Νήσοι, Η.Π.A." + +#. 704 +msgid "Viet Nam" +msgstr "Βιετνάμ" + +#. 548 +msgid "Vanuatu" +msgstr "Βανουάτου" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Νήσοι Γουόλις και Φουτούνα" + +#. 882 +msgid "Samoa" +msgstr "Σαμόα" + +#. 887 +msgid "Yemen" +msgstr "Υεμένη" + +#. 175 +msgid "Mayotte" +msgstr "Μαγιότ" + +#. 710 +msgid "South Africa" +msgstr "Νότιος Αφρική" + +#. 894 +msgid "Zambia" +msgstr "Ζάμπια" + +#. 716 +msgid "Zimbabwe" +msgstr "Ζιμπάμπουε" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Άγνωστη, προσθέστε ετικέτες is_in σε αυτές τις πόλεις" + +msgid "Car" +msgstr "Αυτοκίνητο" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Χώρα" + +msgid "Postal" +msgstr "Ταχυδρομική" + +msgid "Town" +msgstr "Πόλη" + +msgid "District" +msgstr "Επαρχία" + +msgid "Street" +msgstr "Οδός" + +msgid "Number" +msgstr "Αριθμός" + +msgid "Enter Destination" +msgstr "Εισάγετε προορισμό" + +msgid "Zip Code" +msgstr "Ταχ. Κώδικας" + +msgid "City" +msgstr "Πόλη" + +msgid "District/Township" +msgstr "Επαρχία/Οικισμός" + +msgid "Map" +msgstr "Χάρτης" + +msgid "Bookmark" +msgstr "Σελιδοδείκτης" + +msgid "Destination" +msgstr "Προορισμός" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Προβολή" + +msgid "_Route" +msgstr "Διαδρομή" + +msgid "_Former Destinations" +msgstr "Προγενέστερες διαδρομές" + +msgid "_Bookmarks" +msgstr "Σελιδοδείκτες" + +msgid "_Map" +msgstr "Χάρτης" + +msgid "_Layout" +msgstr "Διάταξη" + +msgid "_Projection" +msgstr "Προβολή :" + +msgid "_Vehicle" +msgstr "Όχημα" + +msgid "Zoom_Out" +msgstr "Σμίκρυνση" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Μεγέθυνση" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Επαναϋπολογισμός" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Πληροφορίες" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Διακοπή πλοήγησης" + +msgid "Test" +msgstr "Δοκιμή" + +msgid "_Quit" +msgstr "_Έξοδος" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Κλείδωμα στο δρόμο" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Οδηγίες Διαδρομής" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Αυτόματο Ζουμ" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Πλήρης Οθόνη" + +msgid "Data" +msgstr "Δεδομένα" + +msgid "N" +msgstr "Β" + +msgid "NE" +msgstr "ΒΑ" + +msgid "E" +msgstr "Α" + +msgid "SE" +msgstr "ΝΑ" + +msgid "S" +msgstr "Ν" + +msgid "SW" +msgstr "ΝΔ" + +msgid "W" +msgstr "Δ" + +msgid "NW" +msgstr "ΒΔ" + +msgid "No" +msgstr "Όχι" + +msgid "2D" +msgstr "2Δ" + +msgid "3D" +msgstr "3Δ" + +msgid "OT" +msgstr "ΟΤ" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Διαδρομή %4.0fχλμ Χρόνος που απομένει %02d:%02d" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Διαδρομή 0000χλμ Χρόνος που απομένει 0+00:00" + +msgid "Back to map" +msgstr "Πίσω στο χάρτη" + +msgid "Main Menu" +msgstr "Κύριο Μενού" + +msgid "Help" +msgstr "Βοήθεια" + +msgid "Back" +msgstr "Προηγ." + +msgid "Add Bookmark" +msgstr "Προσθήκη σελιδοδείκτη" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "Πρόσθεση φακέλου Σελιδοδείκτη" + +msgid "Rename" +msgstr "Μετονομασία" + +msgid "POIs" +msgstr "Σημεία Ενδιαφέροντος" + +msgid "View in Browser" +msgstr "Επισκόπηση σε Φυλλομετρητή" + +msgid "Streets" +msgstr "Οδοί" + +msgid "House numbers" +msgstr "Αριθμοί σπιτιών" + +msgid "View Attributes" +msgstr "Προβολή Ιδιοτήτων" + +msgid "View on map" +msgstr "Προβολή στο χάρτη" + +msgid "Cut Bookmark" +msgstr "Αποκοπή Σελιδοδείκτη" + +msgid "Copy Bookmark" +msgstr "Αντιγραφή Σελιδοδείκτη" + +msgid "Rename Bookmark" +msgstr "Μετονομασία Σελιδοδείκτη" + +msgid "Paste Bookmark" +msgstr "Επικόληση Σελιδοδείκτη" + +msgid "Delete Bookmark" +msgstr "Διαγραφή Σελιδοδείκτη" + +msgid "Bookmarks" +msgstr "Σελιδοδείκτες" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Επικόληση σελιδοδείκτη" + +#, c-format +msgid "Bookmark %s" +msgstr "Σελιδοδείκτης %s" + +msgid "Former Destinations" +msgstr "Προγενέστερες διαδρομές" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Αριθμός σπιτιού" + +msgid "Layout" +msgstr "Διάταξη" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Χάρτες" + +msgid "Show Satellite Status" +msgstr "Εμφάνιση Κατάστασης Δορυφόρων" + +msgid " Elevation " +msgstr " Υψόμετρο " + +msgid " Azimuth " +msgstr " Αζιμούθιο " + +msgid "Show NMEA Data" +msgstr "Εμφάνιση Δεδομένων ΝΜΕΑ" + +msgid "car" +msgstr "αυτοκίνητο" + +msgid "bike" +msgstr "ποδήλατο" + +msgid "pedestrian" +msgstr "Πεζός" + +#, c-format +msgid "Current profile: %s" +msgstr "Τρέχον προφίλ: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Αλλαγή προφίλ σε: %s" + +msgid "Set as active" +msgstr "Καθορισμός ως ενεργό" + +msgid "Show Satellite status" +msgstr "Εμφάνιση Κατάστασης Δορυφόρων" + +msgid "Show NMEA data" +msgstr "Εμφάνιση δεδομένων ΝΜΕΑ" + +msgid "Vehicle" +msgstr "Όχημα" + +msgid "Rules" +msgstr "Κανόνες" + +msgid "Lock on road" +msgstr "Κλείδωμα στο δρόμο" + +msgid "Northing" +msgstr "Χάρτης στο βορρά" + +msgid "Map follows Vehicle" +msgstr "Ο χάρτης ακολουθεί το Όχημα" + +msgid "Message" +msgstr "Μήνυμα" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Περιγραφή Διαδρομής" + +msgid "Height Profile" +msgstr "Ύψος προφίλ" + +msgid "Show Locale" +msgstr "Eμφάνιση Εντοπιότητας" + +msgid "About Navit" +msgstr "Περί του Navit" + +#. Authors +msgid "By" +msgstr "Από" + +#. Contributors +msgid "And all the Navit Team" +msgstr "Και όλη την ομάδα του Navit" + +msgid "members and contributors." +msgstr "μέλη και συνεισφέροντες" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Σημείο Χάρτη" + +msgid "Vehicle Position" +msgstr "Θέση Οχήματος" + +msgid "Main menu" +msgstr "Κύριο Μενού" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Εμφάνιση\n" +"Χάρτη" + +msgid "Settings" +msgstr "Ρυθμίσεις" + +msgid "Tools" +msgstr "Εργαλεία" + +msgid "Route" +msgstr "Διαδρομή" + +msgid "About" +msgstr "Περί" + +msgid "Actions" +msgstr "Ενέργειες" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Έξοδος" + +msgid "" +"Stop\n" +"Navigation" +msgstr "Διακοπή" + +msgid "Display" +msgstr "Προβολή" + +msgid "Fullscreen" +msgstr "Πλήρης Οθόνη" + +msgid "Window Mode" +msgstr "Λειτουργία παραθύρων" + +msgid "Description" +msgstr "Περιγραφή" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "άλογο" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "Σε %s, μπες σε κυκλική πορεία" + +#~ msgid "Cursor" +#~ msgstr "Δρομέας" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d %d χιλιόμετρα" + +#~ msgid " PRN " +#~ msgstr " PRN " + +#~ msgid " SNR " +#~ msgstr " SNR " diff --git a/po/en_AU.po.in b/po/en_AU.po.in new file mode 100644 index 0000000..32aa6b3 --- /dev/null +++ b/po/en_AU.po.in @@ -0,0 +1,1760 @@ +# English (Australia) translation for navit +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the navit package. +# Athol Mullen, 2010 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-09-12 05:53+0000\n" +"Last-Translator: Athol Mullen \n" +"Language-Team: English (Australia) \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Running from source directory\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "setting '%s' to '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "zeroth" + +msgid "first" +msgstr "first" + +msgid "second" +msgstr "second" + +msgid "third" +msgstr "third" + +msgid "fourth" +msgstr "fourth" + +msgid "fifth" +msgstr "fifth" + +msgid "sixth" +msgstr "sixth" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "zeroth exit" + +msgid "first exit" +msgstr "first exit" + +msgid "second exit" +msgstr "second exit" + +msgid "third exit" +msgstr "third exit" + +msgid "fourth exit" +msgstr "fourth exit" + +msgid "fifth exit" +msgstr "fifth exit" + +msgid "sixth exit" +msgstr "sixth exit" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "in %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metres" + +#, c-format +msgid "in %d meters" +msgstr "in %d metres" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d kilometres" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "in %d.%d kilometres" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "one kilometre" +msgstr[1] "%d kilometres" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "in one kilometre" +msgstr[1] "in %d kilometres" + +msgid "exit" +msgstr "exit" + +msgid "into the ramp" +msgstr "into the ramp" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%sinto the street %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%sinto the %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%sinto the %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%sinto the %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%sinto the %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "right" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "left" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "easily " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "strongly " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "really strongly " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "unknown " + +msgid "When possible, please turn around" +msgstr "When possible, please turn around" + +msgid "Enter the roundabout soon" +msgstr "" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "then leave the roundabout at the %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Leave the roundabout at the %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Follow the road for the next %s" + +msgid "soon" +msgstr "soon" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Take the %1$s road to the %2$s" + +#, c-format +msgid "after %i roads" +msgstr "after %i roads" + +msgid "now" +msgstr "now" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "then take the %1$s road to the %2$s" + +msgid "error" +msgstr "error" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Turn %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "then turn %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "You have reached your destination %s" + +msgid "then you have reached your destination." +msgstr "then you will have reached your destination" + +msgid "Position" +msgstr "Position" + +msgid "Command" +msgstr "Command" + +msgid "Length" +msgstr "Length" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Time" + +msgid "Destination Length" +msgstr "Destination Length" + +msgid "Destination Time" +msgstr "Destination Time" + +msgid "Roadbook" +msgstr "Roadbook" + +msgid "Set as position" +msgstr "Set as position" + +msgid "Set as destination" +msgstr "Set as destination" + +msgid "Add as bookmark" +msgstr "Add as bookmark" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Point 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Screen coord : %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "United Arab Emirates" + +#. 004 +msgid "Afghanistan" +msgstr "Afghanistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua and Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albania" + +#. 051 +msgid "Armenia" +msgstr "Armenia" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Netherlands Antilles" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarctica" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "American Samoa" + +#. 040 +msgid "Austria" +msgstr "Austria" + +#. 036 +msgid "Australia" +msgstr "Australia" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Aland Islands" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbaijan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnia and Herzegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesh" + +#. 056 +msgid "Belgium" +msgstr "Belgium" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgaria" + +#. 048 +msgid "Bahrain" +msgstr "Bahrain" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint Barthelemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei Darussalam" + +#. 068 +msgid "Bolivia" +msgstr "Bolivia" + +#. 076 +msgid "Brazil" +msgstr "Brazil" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "Bhutan" + +#. 074 +msgid "Bouvet Island" +msgstr "Bouvet Island" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Belarus" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Canada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Cocos (Keeling) Islands" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Congo, Democratic Republic of the" + +#. 140 +msgid "Central African Republic" +msgstr "Central African Republic" + +#. 178 +msgid "Congo" +msgstr "Congo" + +#. 756 +msgid "Switzerland" +msgstr "Switzerland" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Cote d'Ivoire (Ivory Coast)" + +#. 184 +msgid "Cook Islands" +msgstr "Cook Islands" + +#. 152 +msgid "Chile" +msgstr "Chile" + +#. 120 +msgid "Cameroon" +msgstr "Cameroon" + +#. 156 +msgid "China" +msgstr "China" + +#. 170 +msgid "Colombia" +msgstr "Colombia" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Cuba" + +#. 132 +msgid "Cape Verde" +msgstr "Cape Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Christmas Island" + +#. 196 +msgid "Cyprus" +msgstr "Cyprus" + +#. 203 +msgid "Czech Republic" +msgstr "Czech Republic" + +#. 276 +msgid "Germany" +msgstr "Germany" + +#. 262 +msgid "Djibouti" +msgstr "Djibouti" + +#. 208 +msgid "Denmark" +msgstr "Denmark" + +#. 212 +msgid "Dominica" +msgstr "Dominica" + +#. 214 +msgid "Dominican Republic" +msgstr "Dominican Republic" + +#. 012 +msgid "Algeria" +msgstr "Algeria" + +#. 218 +msgid "Ecuador" +msgstr "Ecuador" + +#. 233 +msgid "Estonia" +msgstr "Estonia" + +#. 818 +msgid "Egypt" +msgstr "Egypt" + +#. 732 +msgid "Western Sahara" +msgstr "Western Sahara" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Spain" + +#. 231 +msgid "Ethiopia" +msgstr "Ethiopia" + +#. 246 +msgid "Finland" +msgstr "Finland" + +#. 242 +msgid "Fiji" +msgstr "Fiji" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falkland Islands (Malvinas)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Micronesia, Federated States of" + +#. 234 +msgid "Faroe Islands" +msgstr "Faroe Islands" + +#. 250 +msgid "France" +msgstr "France" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "United Kingdom" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Georgia" + +#. 254 +msgid "French Guiana" +msgstr "French Guiana" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Greenland" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Equatorial Guinea" + +#. 300 +msgid "Greece" +msgstr "Greece" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "South Georgia and the South Sandwich Islands" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heard Island and McDonald Islands" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Croatia" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Hungary" + +#. 360 +msgid "Indonesia" +msgstr "Indonesia" + +#. 372 +msgid "Ireland" +msgstr "Ireland" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "Isle of Man" + +#. 356 +msgid "India" +msgstr "India" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "British Indian Ocean Territory" + +#. 368 +msgid "Iraq" +msgstr "Iraq" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iran, Islamic Republic of" + +#. 352 +msgid "Iceland" +msgstr "Iceland" + +#. 380 +msgid "Italy" +msgstr "Italy" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaica" + +#. 400 +msgid "Jordan" +msgstr "Jordan" + +#. 392 +msgid "Japan" +msgstr "Japan" + +#. 404 +msgid "Kenya" +msgstr "Kenya" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kyrgyzstan" + +#. 116 +msgid "Cambodia" +msgstr "Cambodia" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Comoros" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Saint Kitts and Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Korea, Democratic People's Republic of" + +#. 410 +msgid "Korea, Republic of" +msgstr "Korea, Republic of" + +#. 414 +msgid "Kuwait" +msgstr "Kuwait" + +#. 136 +msgid "Cayman Islands" +msgstr "Cayman Islands" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazakhstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Lao People's Democratic Republic" + +#. 422 +msgid "Lebanon" +msgstr "Lebanon" + +#. 662 +msgid "Saint Lucia" +msgstr "Saint Lucia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberia" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Lithuania" + +#. 442 +msgid "Luxembourg" +msgstr "Luxembourg" + +#. 428 +msgid "Latvia" +msgstr "Latvia" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libyan Arab Jamahiriya" + +#. 504 +msgid "Morocco" +msgstr "Morocco" + +#. 492 +msgid "Monaco" +msgstr "Monaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldova, Republic of" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Saint Martin (French part)" + +#. 450 +msgid "Madagascar" +msgstr "Madagascar" + +#. 584 +msgid "Marshall Islands" +msgstr "Marshall Islands" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Macedonia, the former Yugoslav Republic of" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongolia" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Northern Mariana Islands" + +#. 474 +msgid "Martinique" +msgstr "Martinique" + +#. 478 +msgid "Mauritania" +msgstr "Mauritania" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauritius" + +#. 462 +msgid "Maldives" +msgstr "Maldives" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mexico" + +#. 458 +msgid "Malaysia" +msgstr "Malaysia" + +#. 508 +msgid "Mozambique" +msgstr "Mozambique" + +#. 516 +msgid "Namibia" +msgstr "Namibia" + +#. 540 +msgid "New Caledonia" +msgstr "New Caledonia" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolk Island" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nicaragua" + +#. 528 +msgid "Netherlands" +msgstr "Netherlands" + +#. 578 +msgid "Norway" +msgstr "Norway" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "New Zealand" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "French Polynesia" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua New Guinea" + +#. 608 +msgid "Philippines" +msgstr "Philippines" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Poland" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint Pierre and Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestinian Territory, Occupied" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Qatar" + +#. 638 +msgid "Reunion" +msgstr "Reunion" + +#. 642 +msgid "Romania" +msgstr "Romania" + +#. 688 +msgid "Serbia" +msgstr "Serbia" + +#. 643 +msgid "Russian Federation" +msgstr "Russian Federation" + +#. 646 +msgid "Rwanda" +msgstr "Rwanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Saudi Arabia" + +#. 090 +msgid "Solomon Islands" +msgstr "Solomon Islands" + +#. 690 +msgid "Seychelles" +msgstr "Seychelles" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Sweden" + +#. 702 +msgid "Singapore" +msgstr "Singapore" + +#. 654 +msgid "Saint Helena" +msgstr "Saint Helena" + +#. 705 +msgid "Slovenia" +msgstr "Slovenia" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard and Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slovakia" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalia" + +#. 740 +msgid "Suriname" +msgstr "Suriname" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Sao Tome and Principe" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Syrian Arab Republic" + +#. 748 +msgid "Swaziland" +msgstr "Swaziland" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turks and Caicos Islands" + +#. 148 +msgid "Chad" +msgstr "Chad" + +#. 260 +msgid "French Southern Territories" +msgstr "French Southern Territories" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Thailand" + +#. 762 +msgid "Tajikistan" +msgstr "Tajikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Timor-Leste" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunisia" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turkey" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad and Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan, Province of China" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzania, United Republic of" + +#. 804 +msgid "Ukraine" +msgstr "Ukraine" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "United States Minor Outlying Islands" + +#. 840 +msgid "United States" +msgstr "United States" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Holy See (Vatican City State)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Saint Vincent and the Grenadines" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Virgin Islands, British" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Virgin Islands, U.S." + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis and Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Yemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "South Africa" + +#. 894 +msgid "Zambia" +msgstr "Zambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Unknown, add is_in tags to those cities" + +msgid "Car" +msgstr "Car" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Country" + +msgid "Postal" +msgstr "Postal" + +msgid "Town" +msgstr "Town" + +msgid "District" +msgstr "District" + +msgid "Street" +msgstr "Street" + +msgid "Number" +msgstr "Number" + +msgid "Enter Destination" +msgstr "Enter Destination" + +msgid "Zip Code" +msgstr "Post Code" + +msgid "City" +msgstr "City" + +msgid "District/Township" +msgstr "District/Township" + +msgid "Map" +msgstr "Map" + +msgid "Bookmark" +msgstr "Bookmark" + +msgid "Destination" +msgstr "Destination" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Display" + +msgid "_Route" +msgstr "Route" + +msgid "_Former Destinations" +msgstr "Former Destinations" + +msgid "_Bookmarks" +msgstr "Bookmarks" + +msgid "_Map" +msgstr "Map" + +msgid "_Layout" +msgstr "Layout" + +msgid "_Projection" +msgstr "Projection" + +msgid "_Vehicle" +msgstr "Vehicle" + +msgid "Zoom_Out" +msgstr "ZoomOut" + +msgid "Decrease zoom level" +msgstr "Decrease zoom level" + +msgid "Zoom_In" +msgstr "ZoomIn" + +msgid "Increase zoom level" +msgstr "Increase zoom level" + +msgid "_Recalculate" +msgstr "Recalculate" + +msgid "Redraw map" +msgstr "Redraw map" + +msgid "_Info" +msgstr "Info" + +msgid "Set _destination" +msgstr "Set destination" + +msgid "Opens address search dialog" +msgstr "Opens address search dialogue" + +msgid "_Stop Navigation" +msgstr "Stop Navigation" + +msgid "Test" +msgstr "Test" + +msgid "_Quit" +msgstr "_Quit" + +msgid "Quit the application" +msgstr "Quit the application" + +msgid "Show position _cursor" +msgstr "Show position cursor" + +msgid "_Lock on Road" +msgstr "Lock on Road" + +msgid "_Keep orientation to the North" +msgstr "Keep orientation to the North" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "Switches map orientation to the north or the vehicle" + +msgid "_Roadbook" +msgstr "Roadbook" + +msgid "Show/hide route description" +msgstr "Show/hide route description" + +msgid "_Autozoom" +msgstr "AutoZoom" + +msgid "Enable/disable automatic zoom level changing" +msgstr "Enable/disable automatic zoom level changing" + +msgid "_Fullscreen" +msgstr "FullScreen" + +msgid "Data" +msgstr "Data" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NE" + +msgid "E" +msgstr "E" + +msgid "SE" +msgstr "SE" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SW" + +msgid "W" +msgstr "W" + +msgid "NW" +msgstr "NW" + +msgid "No" +msgstr "No" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Route %4.0fkm %02d:%02d ETA" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Route 0000km 0+00:00 ETA" + +msgid "Back to map" +msgstr "Back to map" + +msgid "Main Menu" +msgstr "Main Menu" + +msgid "Help" +msgstr "Help" + +msgid "Back" +msgstr "Back" + +msgid "Add Bookmark" +msgstr "Add Bookmark" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "Add Bookmark folder" + +msgid "Rename" +msgstr "Rename" + +msgid "POIs" +msgstr "POIs" + +msgid "View in Browser" +msgstr "View in Browser" + +msgid "Streets" +msgstr "Streets" + +msgid "House numbers" +msgstr "House numbers" + +msgid "View Attributes" +msgstr "View Attributes" + +msgid "View on map" +msgstr "View on map" + +msgid "Cut Bookmark" +msgstr "Cut Bookmark" + +msgid "Copy Bookmark" +msgstr "Copy Bookmark" + +msgid "Rename Bookmark" +msgstr "Rename Bookmark" + +msgid "Paste Bookmark" +msgstr "Paste Bookmark" + +msgid "Delete Bookmark" +msgstr "Delete Bookmark" + +msgid "Bookmarks" +msgstr "Bookmarks" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Paste bookmark" + +#, c-format +msgid "Bookmark %s" +msgstr "Bookmark %s" + +msgid "Former Destinations" +msgstr "Former Destinations" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "House number" + +msgid "Layout" +msgstr "Layout" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Maps" + +msgid "Show Satellite Status" +msgstr "Show Satellite Status" + +msgid " Elevation " +msgstr " Elevation " + +msgid " Azimuth " +msgstr " Azimuth " + +msgid "Show NMEA Data" +msgstr "Show NMEA Data" + +msgid "car" +msgstr "car" + +msgid "bike" +msgstr "bike" + +msgid "pedestrian" +msgstr "pedestrian" + +#, c-format +msgid "Current profile: %s" +msgstr "Current profile: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Change profile to: %s" + +msgid "Set as active" +msgstr "Set as active" + +msgid "Show Satellite status" +msgstr "Show Satellite status" + +msgid "Show NMEA data" +msgstr "Show NMEA data" + +msgid "Vehicle" +msgstr "Vehicle" + +msgid "Rules" +msgstr "Rules" + +msgid "Lock on road" +msgstr "Lock on road" + +msgid "Northing" +msgstr "Northing" + +msgid "Map follows Vehicle" +msgstr "Map follows vehicle" + +msgid "Message" +msgstr "Message" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Route Description" + +msgid "Height Profile" +msgstr "Height Profile" + +msgid "Show Locale" +msgstr "Show Locale" + +msgid "About Navit" +msgstr "About Navit" + +#. Authors +msgid "By" +msgstr "By" + +#. Contributors +msgid "And all the Navit Team" +msgstr "And all the Navit Team" + +msgid "members and contributors." +msgstr "members and contributors." + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Map Point" + +msgid "Vehicle Position" +msgstr "Vehicle Position" + +msgid "Main menu" +msgstr "Main menu" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Show\n" +"Map" + +msgid "Settings" +msgstr "Settings" + +msgid "Tools" +msgstr "Tools" + +msgid "Route" +msgstr "Route" + +msgid "About" +msgstr "About" + +msgid "Actions" +msgstr "Actions" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Quit" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Stop\n" +"Navigation" + +msgid "Display" +msgstr "Display" + +msgid "Fullscreen" +msgstr "FullScreen" + +msgid "Window Mode" +msgstr "Window Mode" + +msgid "Description" +msgstr "Description" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "horse" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "Enter the roundabout soon and leave it at the %s" +#~ msgstr "Enter the roundabout soon and leave it at the %s" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "In %s, enter the roundabout" diff --git a/po/en_GB.po.in b/po/en_GB.po.in new file mode 100644 index 0000000..2717c70 --- /dev/null +++ b/po/en_GB.po.in @@ -0,0 +1,1765 @@ +# English (United Kingdom) translation for navit +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the navit package. +# Jeff Bailes 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-05-29 13:38+0000\n" +"Last-Translator: Matthew Gall \n" +"Language-Team: English (United Kingdom) \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Running from source directory\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "setting '%s' to '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "zeroth" + +msgid "first" +msgstr "first" + +msgid "second" +msgstr "second" + +msgid "third" +msgstr "third" + +msgid "fourth" +msgstr "fourth" + +msgid "fifth" +msgstr "fifth" + +msgid "sixth" +msgstr "sixth" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "zeroth exit" + +msgid "first exit" +msgstr "first exit" + +msgid "second exit" +msgstr "second exit" + +msgid "third exit" +msgstr "third exit" + +msgid "fourth exit" +msgstr "fourth exit" + +msgid "fifth exit" +msgstr "fifth exit" + +msgid "sixth exit" +msgstr "sixth exit" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "in %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metres" + +#, c-format +msgid "in %d meters" +msgstr "in %d metres" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d kilometres" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "in %d.%d kilometres" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "one kilometre" +msgstr[1] "%d kilometres" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "in one kilometre" +msgstr[1] "in %d kilometres" + +msgid "exit" +msgstr "exit" + +msgid "into the ramp" +msgstr "onto the slip road" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%sonto the street %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%sonto the %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%sonto the %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%sonto the %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%sonto the %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "right" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "left" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "easily " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "strongly " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "really strongly " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "unknown " + +msgid "When possible, please turn around" +msgstr "When possible, please turn around" + +msgid "Enter the roundabout soon" +msgstr "Enter the roundabout soon" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "then leave the roundabout at the %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Leave the roundabout at the %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Follow the road for the next %s" + +msgid "soon" +msgstr "soon" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Take the %1$s road to the %2$s" + +#, c-format +msgid "after %i roads" +msgstr "after %i roads" + +msgid "now" +msgstr "now" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "then take the %1$s road to the %2$s" + +msgid "error" +msgstr "error" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Turn %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "then turn %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "You have reached your destination %s" + +msgid "then you have reached your destination." +msgstr "then you have reached your destination" + +msgid "Position" +msgstr "Position" + +msgid "Command" +msgstr "Command" + +msgid "Length" +msgstr "Length" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Time" + +msgid "Destination Length" +msgstr "Destination Length" + +msgid "Destination Time" +msgstr "Destination Time" + +msgid "Roadbook" +msgstr "Roadbook" + +msgid "Set as position" +msgstr "Set as position" + +msgid "Set as destination" +msgstr "Set as destination" + +msgid "Add as bookmark" +msgstr "Add as bookmark" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Point 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Screen coord : %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "United Arab Emirates" + +#. 004 +msgid "Afghanistan" +msgstr "Afghanistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua and Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albania" + +#. 051 +msgid "Armenia" +msgstr "Armenia" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Netherlands Antilles" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarctica" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "American Samoa" + +#. 040 +msgid "Austria" +msgstr "Austria" + +#. 036 +msgid "Australia" +msgstr "Australia" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Aland Islands" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbaijan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnia and Herzegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesh" + +#. 056 +msgid "Belgium" +msgstr "Belgium" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgaria" + +#. 048 +msgid "Bahrain" +msgstr "Bahrain" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint Barthelemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei Darussalam" + +#. 068 +msgid "Bolivia" +msgstr "Bolivia" + +#. 076 +msgid "Brazil" +msgstr "Brazil" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "Bhutan" + +#. 074 +msgid "Bouvet Island" +msgstr "Bouvet Island" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Belarus" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Canada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Cocos (Keeling) Islands" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Congo, Democratic Republic of the" + +#. 140 +msgid "Central African Republic" +msgstr "Central African Republic" + +#. 178 +msgid "Congo" +msgstr "Congo" + +#. 756 +msgid "Switzerland" +msgstr "Switzerland" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Cote d'Ivoire" + +#. 184 +msgid "Cook Islands" +msgstr "Cook Islands" + +#. 152 +msgid "Chile" +msgstr "Chile" + +#. 120 +msgid "Cameroon" +msgstr "Cameroon" + +#. 156 +msgid "China" +msgstr "China" + +#. 170 +msgid "Colombia" +msgstr "Colombia" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Cuba" + +#. 132 +msgid "Cape Verde" +msgstr "Cape Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Christmas Island" + +#. 196 +msgid "Cyprus" +msgstr "Cyprus" + +#. 203 +msgid "Czech Republic" +msgstr "Czech Republic" + +#. 276 +msgid "Germany" +msgstr "Germany" + +#. 262 +msgid "Djibouti" +msgstr "Djibouti" + +#. 208 +msgid "Denmark" +msgstr "Denmark" + +#. 212 +msgid "Dominica" +msgstr "Dominica" + +#. 214 +msgid "Dominican Republic" +msgstr "Dominican Republic" + +#. 012 +msgid "Algeria" +msgstr "Algeria" + +#. 218 +msgid "Ecuador" +msgstr "Ecuador" + +#. 233 +msgid "Estonia" +msgstr "Estonia" + +#. 818 +msgid "Egypt" +msgstr "Egypt" + +#. 732 +msgid "Western Sahara" +msgstr "Western Sahara" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Spain" + +#. 231 +msgid "Ethiopia" +msgstr "Ethiopia" + +#. 246 +msgid "Finland" +msgstr "Finland" + +#. 242 +msgid "Fiji" +msgstr "Fiji" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falkland Islands (Malvinas)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Micronesia, Federated States of" + +#. 234 +msgid "Faroe Islands" +msgstr "Faroe Islands" + +#. 250 +msgid "France" +msgstr "France" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "United Kingdom" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Georgia" + +#. 254 +msgid "French Guiana" +msgstr "French Guiana" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Greenland" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Equatorial Guinea" + +#. 300 +msgid "Greece" +msgstr "Greece" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "South Georgia and the South Sandwich Islands" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heard Island and McDonald Islands" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Croatia" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Hungary" + +#. 360 +msgid "Indonesia" +msgstr "Indonesia" + +#. 372 +msgid "Ireland" +msgstr "Ireland" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "Isle of Man" + +#. 356 +msgid "India" +msgstr "India" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "British Indian Ocean Territory" + +#. 368 +msgid "Iraq" +msgstr "Iraq" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iran, Islamic Republic of" + +#. 352 +msgid "Iceland" +msgstr "Iceland" + +#. 380 +msgid "Italy" +msgstr "Italy" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaica" + +#. 400 +msgid "Jordan" +msgstr "Jordan" + +#. 392 +msgid "Japan" +msgstr "Japan" + +#. 404 +msgid "Kenya" +msgstr "Kenya" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kyrgyzstan" + +#. 116 +msgid "Cambodia" +msgstr "Cambodia" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Comoros" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Saint Kitts and Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Korea, Democratic People's Republic of" + +#. 410 +msgid "Korea, Republic of" +msgstr "Korea, Republic of" + +#. 414 +msgid "Kuwait" +msgstr "Kuwait" + +#. 136 +msgid "Cayman Islands" +msgstr "Cayman Islands" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazakhstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Lao People's Democratic Republic" + +#. 422 +msgid "Lebanon" +msgstr "Lebanon" + +#. 662 +msgid "Saint Lucia" +msgstr "Saint Lucia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberia" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Lithuania" + +#. 442 +msgid "Luxembourg" +msgstr "Luxembourg" + +#. 428 +msgid "Latvia" +msgstr "Latvia" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libyan Arab Jamahiriya" + +#. 504 +msgid "Morocco" +msgstr "Morocco" + +#. 492 +msgid "Monaco" +msgstr "Monaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldova, Republic of" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Saint Martin (French part)" + +#. 450 +msgid "Madagascar" +msgstr "Madagascar" + +#. 584 +msgid "Marshall Islands" +msgstr "Marshall Islands" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Macedonia, the former Yugoslav Republic of" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongolia" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Northern Mariana Islands" + +#. 474 +msgid "Martinique" +msgstr "Martinique" + +#. 478 +msgid "Mauritania" +msgstr "Mauritania" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauritius" + +#. 462 +msgid "Maldives" +msgstr "Maldives" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mexico" + +#. 458 +msgid "Malaysia" +msgstr "Malaysia" + +#. 508 +msgid "Mozambique" +msgstr "Mozambique" + +#. 516 +msgid "Namibia" +msgstr "Namibia" + +#. 540 +msgid "New Caledonia" +msgstr "New Caledonia" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolk Island" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nicaragua" + +#. 528 +msgid "Netherlands" +msgstr "Netherlands" + +#. 578 +msgid "Norway" +msgstr "Norway" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "New Zealand" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "French Polynesia" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua New Guinea" + +#. 608 +msgid "Philippines" +msgstr "Philippines" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Poland" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint Pierre and Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestinian Territory, Occupied" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Qatar" + +#. 638 +msgid "Reunion" +msgstr "Reunion" + +#. 642 +msgid "Romania" +msgstr "Romania" + +#. 688 +msgid "Serbia" +msgstr "Serbia" + +#. 643 +msgid "Russian Federation" +msgstr "Russian Federation" + +#. 646 +msgid "Rwanda" +msgstr "Rwanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Saudi Arabia" + +#. 090 +msgid "Solomon Islands" +msgstr "Solomon Islands" + +#. 690 +msgid "Seychelles" +msgstr "Seychelles" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Sweden" + +#. 702 +msgid "Singapore" +msgstr "Singapore" + +#. 654 +msgid "Saint Helena" +msgstr "Saint Helena" + +#. 705 +msgid "Slovenia" +msgstr "Slovenia" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard and Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slovakia" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalia" + +#. 740 +msgid "Suriname" +msgstr "Suriname" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Sao Tome and Principe" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Syrian Arab Republic" + +#. 748 +msgid "Swaziland" +msgstr "Swaziland" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turks and Caicos Islands" + +#. 148 +msgid "Chad" +msgstr "Chad" + +#. 260 +msgid "French Southern Territories" +msgstr "French Southern Territories" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Thailand" + +#. 762 +msgid "Tajikistan" +msgstr "Tajikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Timor-Leste" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunisia" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turkey" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad and Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan, Province of China" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzania, United Republic of" + +#. 804 +msgid "Ukraine" +msgstr "Ukraine" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "United States Minor Outlying Islands" + +#. 840 +msgid "United States" +msgstr "United States" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Holy See (Vatican City State)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Saint Vincent and the Grenadines" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Virgin Islands, British" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Virgin Islands, U.S." + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis and Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Yemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "South Africa" + +#. 894 +msgid "Zambia" +msgstr "Zambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Unknown, add is_in tags to those cities" + +msgid "Car" +msgstr "Car" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Country" + +msgid "Postal" +msgstr "Postal" + +msgid "Town" +msgstr "Town" + +msgid "District" +msgstr "District" + +msgid "Street" +msgstr "Street" + +msgid "Number" +msgstr "Number" + +msgid "Enter Destination" +msgstr "Enter Destination" + +msgid "Zip Code" +msgstr "Post Code" + +msgid "City" +msgstr "City" + +msgid "District/Township" +msgstr "District/Township" + +msgid "Map" +msgstr "Map" + +msgid "Bookmark" +msgstr "Bookmark" + +msgid "Destination" +msgstr "Destination" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Display" + +msgid "_Route" +msgstr "Route" + +msgid "_Former Destinations" +msgstr "Former Destinations" + +msgid "_Bookmarks" +msgstr "Bookmarks" + +msgid "_Map" +msgstr "Map" + +msgid "_Layout" +msgstr "Layout" + +msgid "_Projection" +msgstr "Projection" + +msgid "_Vehicle" +msgstr "Vehicle" + +msgid "Zoom_Out" +msgstr "ZoomOut" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "ZoomIn" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Recalculate" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Info" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Stop navigation" + +msgid "Test" +msgstr "Test" + +msgid "_Quit" +msgstr "_Quit" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr " Lock on road" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Roadbook" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Autozoom" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Fullscreen" + +msgid "Data" +msgstr "Data" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NE" + +msgid "E" +msgstr "E" + +msgid "SE" +msgstr "SE" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SW" + +msgid "W" +msgstr "W" + +msgid "NW" +msgstr "NW" + +msgid "No" +msgstr "No" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "QT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Route %4.0fkm %02d:%02d ETA" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Route 0000km 0+00:00 ETA" + +msgid "Back to map" +msgstr "Back to map" + +msgid "Main Menu" +msgstr "Main Menu" + +msgid "Help" +msgstr "Help" + +msgid "Back" +msgstr "Back" + +msgid "Add Bookmark" +msgstr "Add bookmark" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "Add bookmark folder" + +msgid "Rename" +msgstr "Rename" + +msgid "POIs" +msgstr "POIs" + +msgid "View in Browser" +msgstr "View in browser" + +msgid "Streets" +msgstr "Streets" + +msgid "House numbers" +msgstr "House numbers" + +msgid "View Attributes" +msgstr "View attributes" + +msgid "View on map" +msgstr "View on map" + +msgid "Cut Bookmark" +msgstr "Cut bookmark" + +msgid "Copy Bookmark" +msgstr "Copy bookmark" + +msgid "Rename Bookmark" +msgstr "Rename bookmark" + +msgid "Paste Bookmark" +msgstr "Paste bookmark" + +msgid "Delete Bookmark" +msgstr "Delete bookmark" + +msgid "Bookmarks" +msgstr "Bookmarks" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Paste bookmark" + +#, c-format +msgid "Bookmark %s" +msgstr "Bookmark %s" + +msgid "Former Destinations" +msgstr "Former Destinations" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "House number" + +msgid "Layout" +msgstr "Layout" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Maps" + +msgid "Show Satellite Status" +msgstr "Show satellite status" + +msgid " Elevation " +msgstr " Elevation " + +msgid " Azimuth " +msgstr " Azimuth " + +msgid "Show NMEA Data" +msgstr "Show NMEA data" + +msgid "car" +msgstr "car" + +msgid "bike" +msgstr "bike" + +msgid "pedestrian" +msgstr "pedestrian" + +#, c-format +msgid "Current profile: %s" +msgstr "Current profile: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Change profile to: %s" + +msgid "Set as active" +msgstr "Set as active" + +msgid "Show Satellite status" +msgstr "Show satellite status" + +msgid "Show NMEA data" +msgstr "Show NMEA data" + +msgid "Vehicle" +msgstr "Vehicle" + +msgid "Rules" +msgstr "Rules" + +msgid "Lock on road" +msgstr "Lock on road" + +msgid "Northing" +msgstr " Orient map North" + +msgid "Map follows Vehicle" +msgstr " Map follows vehicle" + +msgid "Message" +msgstr "Message" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Route Description" + +msgid "Height Profile" +msgstr "Height Profile" + +msgid "Show Locale" +msgstr "Show Locale" + +msgid "About Navit" +msgstr "About Navit" + +#. Authors +msgid "By" +msgstr "By" + +#. Contributors +msgid "And all the Navit Team" +msgstr "And all the Navit Team" + +msgid "members and contributors." +msgstr "members and contributors." + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Map Point" + +msgid "Vehicle Position" +msgstr "Vehicle Position" + +msgid "Main menu" +msgstr "Main Menu" + +msgid "" +"Show\n" +"Map" +msgstr "Show Map" + +msgid "Settings" +msgstr "Settings" + +msgid "Tools" +msgstr "Tools" + +msgid "Route" +msgstr "Route" + +msgid "About" +msgstr "About" + +msgid "Actions" +msgstr "Actions" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Quit" + +msgid "" +"Stop\n" +"Navigation" +msgstr "Stop" + +msgid "Display" +msgstr "Display" + +msgid "Fullscreen" +msgstr "Fullscreen" + +msgid "Window Mode" +msgstr "Window Mode" + +msgid "Description" +msgstr "Description" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "horse" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "In %s, enter the roundabout" + +#~ msgid "Cursor" +#~ msgstr "Cursor" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d kilometre" + +#~ msgid " SNR " +#~ msgstr " SNR " + +#~ msgid " PRN " +#~ msgstr " PRN " diff --git a/po/eo.po.in b/po/eo.po.in new file mode 100644 index 0000000..402e1d4 --- /dev/null +++ b/po/eo.po.in @@ -0,0 +1,1750 @@ +# Esperanto translation for navit +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the navit package. +# OlivierWeb, , 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2009-12-20 20:37+0000\n" +"Last-Translator: KaZeR \n" +"Language-Team: Esperanto \n" +"Language: eo\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "nula" + +msgid "first" +msgstr "unua" + +msgid "second" +msgstr "dua" + +msgid "third" +msgstr "tria" + +msgid "fourth" +msgstr "kvara" + +msgid "fifth" +msgstr "kvina" + +msgid "sixth" +msgstr "sesa" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "" + +msgid "first exit" +msgstr "" + +msgid "second exit" +msgstr "" + +msgid "third exit" +msgstr "" + +msgid "fourth exit" +msgstr "" + +msgid "fifth exit" +msgstr "" + +msgid "sixth exit" +msgstr "" + +#, c-format +msgid "%d m" +msgstr "" + +#, c-format +msgid "in %d m" +msgstr "" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metroj" + +#, c-format +msgid "in %d meters" +msgstr "" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "unu kilometro" +msgstr[1] "%d kilometroj" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "" +msgstr[1] "" + +msgid "exit" +msgstr "" + +msgid "into the ramp" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "dekstren" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "maldekstren" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "facile " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "" + +msgid "When possible, please turn around" +msgstr "" + +msgid "Enter the roundabout soon" +msgstr "" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "" + +msgid "soon" +msgstr "baldaŭ" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "" + +#, c-format +msgid "after %i roads" +msgstr "" + +msgid "now" +msgstr "nun" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "" + +msgid "error" +msgstr "eraro" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "" + +#, c-format +msgid "You have reached your destination %s" +msgstr "" + +msgid "then you have reached your destination." +msgstr "" + +msgid "Position" +msgstr "" + +msgid "Command" +msgstr "Komando" + +msgid "Length" +msgstr "Longo" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Horo" + +msgid "Destination Length" +msgstr "" + +msgid "Destination Time" +msgstr "" + +msgid "Roadbook" +msgstr "" + +msgid "Set as position" +msgstr "" + +msgid "Set as destination" +msgstr "" + +msgid "Add as bookmark" +msgstr "" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "" + +#. 020 +msgid "Andorra" +msgstr "Andoro" + +#. 784 +msgid "United Arab Emirates" +msgstr "Unuiĝintaj Arabaj Emirlandoj" + +#. 004 +msgid "Afghanistan" +msgstr "Afganio" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigvo-Barbudo" + +#. 660 +msgid "Anguilla" +msgstr "Angvilo" + +#. 008 +msgid "Albania" +msgstr "Albanio" + +#. 051 +msgid "Armenia" +msgstr "" + +#. 530 +msgid "Netherlands Antilles" +msgstr "" + +#. 024 +msgid "Angola" +msgstr "" + +#. 010 +msgid "Antarctica" +msgstr "" + +#. 032 +msgid "Argentina" +msgstr "" + +#. 016 +msgid "American Samoa" +msgstr "" + +#. 040 +msgid "Austria" +msgstr "" + +#. 036 +msgid "Australia" +msgstr "" + +#. 533 +msgid "Aruba" +msgstr "" + +#. 248 +msgid "Aland Islands" +msgstr "" + +#. 031 +msgid "Azerbaijan" +msgstr "" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "" + +#. 052 +msgid "Barbados" +msgstr "" + +#. 050 +msgid "Bangladesh" +msgstr "" + +#. 056 +msgid "Belgium" +msgstr "" + +#. 854 +msgid "Burkina Faso" +msgstr "" + +#. 100 +msgid "Bulgaria" +msgstr "" + +#. 048 +msgid "Bahrain" +msgstr "" + +#. 108 +msgid "Burundi" +msgstr "" + +#. 204 +msgid "Benin" +msgstr "" + +#. 652 +msgid "Saint Barthelemy" +msgstr "" + +#. 060 +msgid "Bermuda" +msgstr "" + +#. 096 +msgid "Brunei Darussalam" +msgstr "" + +#. 068 +msgid "Bolivia" +msgstr "" + +#. 076 +msgid "Brazil" +msgstr "" + +#. 044 +msgid "Bahamas" +msgstr "" + +#. 064 +msgid "Bhutan" +msgstr "" + +#. 074 +msgid "Bouvet Island" +msgstr "" + +#. 072 +msgid "Botswana" +msgstr "" + +#. 112 +msgid "Belarus" +msgstr "" + +#. 084 +msgid "Belize" +msgstr "" + +#. 124 +msgid "Canada" +msgstr "" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "" + +#. 140 +msgid "Central African Republic" +msgstr "" + +#. 178 +msgid "Congo" +msgstr "" + +#. 756 +msgid "Switzerland" +msgstr "" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "" + +#. 184 +msgid "Cook Islands" +msgstr "" + +#. 152 +msgid "Chile" +msgstr "" + +#. 120 +msgid "Cameroon" +msgstr "" + +#. 156 +msgid "China" +msgstr "" + +#. 170 +msgid "Colombia" +msgstr "" + +#. 188 +msgid "Costa Rica" +msgstr "" + +#. 192 +msgid "Cuba" +msgstr "" + +#. 132 +msgid "Cape Verde" +msgstr "" + +#. 162 +msgid "Christmas Island" +msgstr "" + +#. 196 +msgid "Cyprus" +msgstr "" + +#. 203 +msgid "Czech Republic" +msgstr "" + +#. 276 +msgid "Germany" +msgstr "" + +#. 262 +msgid "Djibouti" +msgstr "" + +#. 208 +msgid "Denmark" +msgstr "" + +#. 212 +msgid "Dominica" +msgstr "" + +#. 214 +msgid "Dominican Republic" +msgstr "" + +#. 012 +msgid "Algeria" +msgstr "" + +#. 218 +msgid "Ecuador" +msgstr "" + +#. 233 +msgid "Estonia" +msgstr "" + +#. 818 +msgid "Egypt" +msgstr "" + +#. 732 +msgid "Western Sahara" +msgstr "" + +#. 232 +msgid "Eritrea" +msgstr "" + +#. 724 +msgid "Spain" +msgstr "" + +#. 231 +msgid "Ethiopia" +msgstr "" + +#. 246 +msgid "Finland" +msgstr "" + +#. 242 +msgid "Fiji" +msgstr "" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "" + +#. 234 +msgid "Faroe Islands" +msgstr "" + +#. 250 +msgid "France" +msgstr "" + +#. 266 +msgid "Gabon" +msgstr "" + +#. 826 +msgid "United Kingdom" +msgstr "" + +#. 308 +msgid "Grenada" +msgstr "" + +#. 268 +msgid "Georgia" +msgstr "" + +#. 254 +msgid "French Guiana" +msgstr "" + +#. 831 +msgid "Guernsey" +msgstr "" + +#. 288 +msgid "Ghana" +msgstr "" + +#. 292 +msgid "Gibraltar" +msgstr "" + +#. 304 +msgid "Greenland" +msgstr "" + +#. 270 +msgid "Gambia" +msgstr "" + +#. 324 +msgid "Guinea" +msgstr "" + +#. 312 +msgid "Guadeloupe" +msgstr "" + +#. 226 +msgid "Equatorial Guinea" +msgstr "" + +#. 300 +msgid "Greece" +msgstr "" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "" + +#. 320 +msgid "Guatemala" +msgstr "" + +#. 316 +msgid "Guam" +msgstr "" + +#. 624 +msgid "Guinea-Bissau" +msgstr "" + +#. 328 +msgid "Guyana" +msgstr "" + +#. 344 +msgid "Hong Kong" +msgstr "" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "" + +#. 340 +msgid "Honduras" +msgstr "" + +#. 191 +msgid "Croatia" +msgstr "" + +#. 332 +msgid "Haiti" +msgstr "" + +#. 348 +msgid "Hungary" +msgstr "" + +#. 360 +msgid "Indonesia" +msgstr "" + +#. 372 +msgid "Ireland" +msgstr "" + +#. 376 +msgid "Israel" +msgstr "" + +#. 833 +msgid "Isle of Man" +msgstr "" + +#. 356 +msgid "India" +msgstr "" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "" + +#. 368 +msgid "Iraq" +msgstr "" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "" + +#. 352 +msgid "Iceland" +msgstr "" + +#. 380 +msgid "Italy" +msgstr "" + +#. 832 +msgid "Jersey" +msgstr "" + +#. 388 +msgid "Jamaica" +msgstr "" + +#. 400 +msgid "Jordan" +msgstr "" + +#. 392 +msgid "Japan" +msgstr "" + +#. 404 +msgid "Kenya" +msgstr "" + +#. 417 +msgid "Kyrgyzstan" +msgstr "" + +#. 116 +msgid "Cambodia" +msgstr "" + +#. 296 +msgid "Kiribati" +msgstr "" + +#. 174 +msgid "Comoros" +msgstr "" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "" + +#. 410 +msgid "Korea, Republic of" +msgstr "" + +#. 414 +msgid "Kuwait" +msgstr "" + +#. 136 +msgid "Cayman Islands" +msgstr "" + +#. 398 +msgid "Kazakhstan" +msgstr "" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "" + +#. 422 +msgid "Lebanon" +msgstr "" + +#. 662 +msgid "Saint Lucia" +msgstr "" + +#. 438 +msgid "Liechtenstein" +msgstr "" + +#. 144 +msgid "Sri Lanka" +msgstr "" + +#. 430 +msgid "Liberia" +msgstr "" + +#. 426 +msgid "Lesotho" +msgstr "" + +#. 440 +msgid "Lithuania" +msgstr "" + +#. 442 +msgid "Luxembourg" +msgstr "" + +#. 428 +msgid "Latvia" +msgstr "" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "" + +#. 504 +msgid "Morocco" +msgstr "" + +#. 492 +msgid "Monaco" +msgstr "" + +#. 498 +msgid "Moldova, Republic of" +msgstr "" + +#. 499 +msgid "Montenegro" +msgstr "" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "" + +#. 450 +msgid "Madagascar" +msgstr "" + +#. 584 +msgid "Marshall Islands" +msgstr "" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "" + +#. 466 +msgid "Mali" +msgstr "" + +#. 104 +msgid "Myanmar" +msgstr "" + +#. 496 +msgid "Mongolia" +msgstr "" + +#. 446 +msgid "Macao" +msgstr "" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "" + +#. 474 +msgid "Martinique" +msgstr "" + +#. 478 +msgid "Mauritania" +msgstr "" + +#. 500 +msgid "Montserrat" +msgstr "" + +#. 470 +msgid "Malta" +msgstr "" + +#. 480 +msgid "Mauritius" +msgstr "" + +#. 462 +msgid "Maldives" +msgstr "" + +#. 454 +msgid "Malawi" +msgstr "" + +#. 484 +msgid "Mexico" +msgstr "" + +#. 458 +msgid "Malaysia" +msgstr "" + +#. 508 +msgid "Mozambique" +msgstr "" + +#. 516 +msgid "Namibia" +msgstr "" + +#. 540 +msgid "New Caledonia" +msgstr "" + +#. 562 +msgid "Niger" +msgstr "" + +#. 574 +msgid "Norfolk Island" +msgstr "" + +#. 566 +msgid "Nigeria" +msgstr "" + +#. 558 +msgid "Nicaragua" +msgstr "" + +#. 528 +msgid "Netherlands" +msgstr "" + +#. 578 +msgid "Norway" +msgstr "" + +#. 524 +msgid "Nepal" +msgstr "" + +#. 520 +msgid "Nauru" +msgstr "" + +#. 570 +msgid "Niue" +msgstr "" + +#. 554 +msgid "New Zealand" +msgstr "" + +#. 512 +msgid "Oman" +msgstr "" + +#. 591 +msgid "Panama" +msgstr "" + +#. 604 +msgid "Peru" +msgstr "" + +#. 258 +msgid "French Polynesia" +msgstr "" + +#. 598 +msgid "Papua New Guinea" +msgstr "" + +#. 608 +msgid "Philippines" +msgstr "" + +#. 586 +msgid "Pakistan" +msgstr "" + +#. 616 +msgid "Poland" +msgstr "" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "" + +#. 612 +msgid "Pitcairn" +msgstr "" + +#. 630 +msgid "Puerto Rico" +msgstr "" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "" + +#. 620 +msgid "Portugal" +msgstr "" + +#. 585 +msgid "Palau" +msgstr "" + +#. 600 +msgid "Paraguay" +msgstr "" + +#. 634 +msgid "Qatar" +msgstr "" + +#. 638 +msgid "Reunion" +msgstr "" + +#. 642 +msgid "Romania" +msgstr "" + +#. 688 +msgid "Serbia" +msgstr "" + +#. 643 +msgid "Russian Federation" +msgstr "" + +#. 646 +msgid "Rwanda" +msgstr "" + +#. 682 +msgid "Saudi Arabia" +msgstr "" + +#. 090 +msgid "Solomon Islands" +msgstr "" + +#. 690 +msgid "Seychelles" +msgstr "" + +#. 736 +msgid "Sudan" +msgstr "" + +#. 752 +msgid "Sweden" +msgstr "" + +#. 702 +msgid "Singapore" +msgstr "" + +#. 654 +msgid "Saint Helena" +msgstr "" + +#. 705 +msgid "Slovenia" +msgstr "" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "" + +#. 703 +msgid "Slovakia" +msgstr "" + +#. 694 +msgid "Sierra Leone" +msgstr "" + +#. 674 +msgid "San Marino" +msgstr "" + +#. 686 +msgid "Senegal" +msgstr "" + +#. 706 +msgid "Somalia" +msgstr "" + +#. 740 +msgid "Suriname" +msgstr "" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "" + +#. 222 +msgid "El Salvador" +msgstr "" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "" + +#. 748 +msgid "Swaziland" +msgstr "" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "" + +#. 148 +msgid "Chad" +msgstr "" + +#. 260 +msgid "French Southern Territories" +msgstr "" + +#. 768 +msgid "Togo" +msgstr "" + +#. 764 +msgid "Thailand" +msgstr "" + +#. 762 +msgid "Tajikistan" +msgstr "" + +#. 772 +msgid "Tokelau" +msgstr "" + +#. 626 +msgid "Timor-Leste" +msgstr "" + +#. 795 +msgid "Turkmenistan" +msgstr "" + +#. 788 +msgid "Tunisia" +msgstr "" + +#. 776 +msgid "Tonga" +msgstr "" + +#. 792 +msgid "Turkey" +msgstr "" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "" + +#. 798 +msgid "Tuvalu" +msgstr "" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "" + +#. 804 +msgid "Ukraine" +msgstr "" + +#. 800 +msgid "Uganda" +msgstr "" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "" + +#. 840 +msgid "United States" +msgstr "" + +#. 858 +msgid "Uruguay" +msgstr "" + +#. 860 +msgid "Uzbekistan" +msgstr "" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "" + +#. 862 +msgid "Venezuela" +msgstr "" + +#. 092 +msgid "Virgin Islands, British" +msgstr "" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "" + +#. 704 +msgid "Viet Nam" +msgstr "" + +#. 548 +msgid "Vanuatu" +msgstr "" + +#. 876 +msgid "Wallis and Futuna" +msgstr "" + +#. 882 +msgid "Samoa" +msgstr "" + +#. 887 +msgid "Yemen" +msgstr "" + +#. 175 +msgid "Mayotte" +msgstr "" + +#. 710 +msgid "South Africa" +msgstr "" + +#. 894 +msgid "Zambia" +msgstr "" + +#. 716 +msgid "Zimbabwe" +msgstr "" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "" + +msgid "Car" +msgstr "" + +msgid "Iso2" +msgstr "" + +msgid "Iso3" +msgstr "" + +msgid "Country" +msgstr "" + +msgid "Postal" +msgstr "" + +msgid "Town" +msgstr "" + +msgid "District" +msgstr "" + +msgid "Street" +msgstr "" + +msgid "Number" +msgstr "" + +msgid "Enter Destination" +msgstr "" + +msgid "Zip Code" +msgstr "" + +msgid "City" +msgstr "" + +msgid "District/Township" +msgstr "" + +msgid "Map" +msgstr "" + +msgid "Bookmark" +msgstr "" + +msgid "Destination" +msgstr "" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "" + +msgid "_Route" +msgstr "" + +msgid "_Former Destinations" +msgstr "" + +msgid "_Bookmarks" +msgstr "Legosignoj" + +msgid "_Map" +msgstr "" + +msgid "_Layout" +msgstr "" + +msgid "_Projection" +msgstr "" + +msgid "_Vehicle" +msgstr "" + +msgid "Zoom_Out" +msgstr "" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "" + +msgid "Test" +msgstr "" + +msgid "_Quit" +msgstr "" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "" + +msgid "Data" +msgstr "" + +msgid "N" +msgstr "" + +msgid "NE" +msgstr "" + +msgid "E" +msgstr "" + +msgid "SE" +msgstr "" + +msgid "S" +msgstr "" + +msgid "SW" +msgstr "" + +msgid "W" +msgstr "" + +msgid "NW" +msgstr "" + +msgid "No" +msgstr "" + +msgid "2D" +msgstr "" + +msgid "3D" +msgstr "" + +msgid "OT" +msgstr "" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "" + +msgid "Back to map" +msgstr "" + +msgid "Main Menu" +msgstr "" + +msgid "Help" +msgstr "" + +msgid "Back" +msgstr "" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "" + +msgid "View in Browser" +msgstr "" + +msgid "Streets" +msgstr "" + +msgid "House numbers" +msgstr "" + +msgid "View Attributes" +msgstr "" + +msgid "View on map" +msgstr "" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "Legosignoj" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "" + +msgid "Former Destinations" +msgstr "" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "" + +msgid "Layout" +msgstr "" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "" + +msgid "Show Satellite Status" +msgstr "" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "" + +msgid "car" +msgstr "" + +msgid "bike" +msgstr "" + +msgid "pedestrian" +msgstr "" + +#, c-format +msgid "Current profile: %s" +msgstr "" + +#, c-format +msgid "Change profile to: %s" +msgstr "" + +msgid "Set as active" +msgstr "" + +msgid "Show Satellite status" +msgstr "" + +msgid "Show NMEA data" +msgstr "" + +msgid "Vehicle" +msgstr "" + +msgid "Rules" +msgstr "" + +msgid "Lock on road" +msgstr "" + +msgid "Northing" +msgstr "" + +msgid "Map follows Vehicle" +msgstr "" + +msgid "Message" +msgstr "" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "" + +msgid "Vehicle Position" +msgstr "" + +msgid "Main menu" +msgstr "" + +msgid "" +"Show\n" +"Map" +msgstr "" + +msgid "Settings" +msgstr "" + +msgid "Tools" +msgstr "" + +msgid "Route" +msgstr "" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" + +msgid "Display" +msgstr "" + +msgid "Fullscreen" +msgstr "" + +msgid "Window Mode" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" diff --git a/po/es.po.in b/po/es.po.in new file mode 100644 index 0000000..1d94dd8 --- /dev/null +++ b/po/es.po.in @@ -0,0 +1,1734 @@ +# Spanish translations for navit +# Copyright (C) 2008 The Navit Team +# This file is distributed under the same license as the navit package. +# Chris Eubank 2007 +# Emilio Gómez Fernández 2008 +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: http://trac.navit-project.org/\n" +"POT-Creation-Date: 2012-02-11 21:11+0100\n" +"PO-Revision-Date: 2012-02-09 00:00+0000\n" +"Last-Translator: Ricardo Jurado \n" +"Language-Team: Chris Eubank \n" +"Language-Team: Chris Eubank \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +msgid "Running from source directory\n" +msgstr "Ejecutando desde el directorio fuente\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "configurando '%s' a '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "cero" + +msgid "first" +msgstr "primera" + +msgid "second" +msgstr "segunda" + +msgid "third" +msgstr "tercera" + +msgid "fourth" +msgstr "cuarta" + +msgid "fifth" +msgstr "quinta" + +msgid "sixth" +msgstr "sexta" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "salida cero" + +msgid "first exit" +msgstr "primera salida" + +msgid "second exit" +msgstr "segunda salida" + +msgid "third exit" +msgstr "tercera salida" + +msgid "fourth exit" +msgstr "cuarta salida" + +msgid "fifth exit" +msgstr "quinta salida" + +msgid "sixth exit" +msgstr "sexta salida" + +#, c-format +msgid "%d m" +msgstr "%d metros" + +#, c-format +msgid "in %d m" +msgstr "en %d metros" + +#, c-format +msgid "%d feet" +msgstr "%d pies" + +#, c-format +msgid "in %d feet" +msgstr "en %d pies" + +#, c-format +msgid "%d meters" +msgstr "%d metros" + +#, c-format +msgid "in %d meters" +msgstr "en %d metros" + +#, c-format +msgid "%d.%d miles" +msgstr "%d,%d millas" + +#, c-format +msgid "in %d.%d miles" +msgstr "en %d,%d millas" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d,%d kilómetros" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "en %d,%d kilómetros" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "una milla" +msgstr[1] "%d millas" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "en una milla" +msgstr[1] "en %d millas" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "un kilómetro" +msgstr[1] "%d kilómetros" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "en un kilómetro" +msgstr[1] "en %d kilómetros" + +msgid "exit" +msgstr "salir" + +msgid "into the ramp" +msgstr "en la salida" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s en la calle %s %s %s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%s en el %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%s en la %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%s en %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%s en la %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "a la derecha" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "a la izquierda" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "ligeramente " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "bruscamente " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "de forma muy pronunciada " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "desconocido " + +msgid "When possible, please turn around" +msgstr "Dé la vuelta cuando sea posible" + +msgid "Enter the roundabout soon" +msgstr "Entre en la próxima rotonda" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "Entre en la rotonda %s" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "después salga de la rotonda por la %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Salga de la rotonda por la %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Continúe en esta carretera durante %s" + +msgid "soon" +msgstr "próximamente" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Tome la %1$s carretera %2$s" + +#, c-format +msgid "after %i roads" +msgstr "después de %i carreteras" + +msgid "now" +msgstr "ahora" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "entonces tome la %1$s salida %2$s" + +msgid "error" +msgstr "error" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Gire %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "luego gire %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Ha llegado a su destino %s" + +msgid "then you have reached your destination." +msgstr "entonces ha llegado a su destino." + +msgid "Position" +msgstr "Posición" + +msgid "Command" +msgstr "Orden" + +msgid "Length" +msgstr "Longitud" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Tiempo" + +msgid "Destination Length" +msgstr "Distancia a destino" + +msgid "Destination Time" +msgstr "Tiempo a destino" + +msgid "Roadbook" +msgstr "Guía" + +msgid "Set as position" +msgstr "Definir como origen" + +msgid "Set as destination" +msgstr "Definir como destino" + +msgid "Add as bookmark" +msgstr "Agregar como favorito" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Punto 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Coordenadas de pantalla : %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Emiratos Árabes Unidos" + +#. 004 +msgid "Afghanistan" +msgstr "Afganistán" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua y Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguila" + +#. 008 +msgid "Albania" +msgstr "Albania" + +#. 051 +msgid "Armenia" +msgstr "Armenia" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Antillas Holandesas" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antártica" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "Samoa Americana" + +#. 040 +msgid "Austria" +msgstr "Austria" + +#. 036 +msgid "Australia" +msgstr "Australia" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Islas de Åland" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbaiyán" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnia y Herzegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesh" + +#. 056 +msgid "Belgium" +msgstr "Bélgica" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgaria" + +#. 048 +msgid "Bahrain" +msgstr "Bahrein" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benín" + +#. 652 +msgid "Saint Barthelemy" +msgstr "San Bartolomé" + +#. 060 +msgid "Bermuda" +msgstr "Bermudas" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei Darussalam" + +#. 068 +msgid "Bolivia" +msgstr "Bolivia" + +#. 076 +msgid "Brazil" +msgstr "Brasil" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "Bután" + +#. 074 +msgid "Bouvet Island" +msgstr "Isla Bouvet" + +#. 072 +msgid "Botswana" +msgstr "Botsuana" + +#. 112 +msgid "Belarus" +msgstr "Bielorrusia" + +#. 084 +msgid "Belize" +msgstr "Belice" + +#. 124 +msgid "Canada" +msgstr "Canadá" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Islas de Cocos (Keeling)" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Congo, República Democrática del" + +#. 140 +msgid "Central African Republic" +msgstr "República Centroafricana" + +#. 178 +msgid "Congo" +msgstr "Congo" + +#. 756 +msgid "Switzerland" +msgstr "Suiza" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Costa de Marfil" + +#. 184 +msgid "Cook Islands" +msgstr "Islas Cook" + +#. 152 +msgid "Chile" +msgstr "Chile" + +#. 120 +msgid "Cameroon" +msgstr "Camerún" + +#. 156 +msgid "China" +msgstr "China" + +#. 170 +msgid "Colombia" +msgstr "Colombia" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Cuba" + +#. 132 +msgid "Cape Verde" +msgstr "Cabo Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Isla Natividad" + +#. 196 +msgid "Cyprus" +msgstr "Chipre" + +#. 203 +msgid "Czech Republic" +msgstr "República Checa" + +#. 276 +msgid "Germany" +msgstr "Alemania" + +#. 262 +msgid "Djibouti" +msgstr "República de Yibuti" + +#. 208 +msgid "Denmark" +msgstr "Dinamarca" + +#. 212 +msgid "Dominica" +msgstr "Dominica" + +#. 214 +msgid "Dominican Republic" +msgstr "República Dominicana" + +#. 012 +msgid "Algeria" +msgstr "Argelia" + +#. 218 +msgid "Ecuador" +msgstr "Ecuador" + +#. 233 +msgid "Estonia" +msgstr "Estonia" + +#. 818 +msgid "Egypt" +msgstr "Egipto" + +#. 732 +msgid "Western Sahara" +msgstr "Sahara Occidental" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "España" + +#. 231 +msgid "Ethiopia" +msgstr "Etiopía" + +#. 246 +msgid "Finland" +msgstr "Finlandia" + +#. 242 +msgid "Fiji" +msgstr "Fiyi" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Islas Malvinas" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Estados Federados de Micronesia" + +#. 234 +msgid "Faroe Islands" +msgstr "Islas Feroe" + +#. 250 +msgid "France" +msgstr "Francia" + +#. 266 +msgid "Gabon" +msgstr "Gabón" + +#. 826 +msgid "United Kingdom" +msgstr "Reino Unido" + +#. 308 +msgid "Grenada" +msgstr "Granada" + +#. 268 +msgid "Georgia" +msgstr "Georgia" + +#. 254 +msgid "French Guiana" +msgstr "Guayana Francesa" + +#. 831 +msgid "Guernsey" +msgstr "Guernesey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Groenlandia" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadalupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Guinea Ecuatorial" + +#. 300 +msgid "Greece" +msgstr "Grecia" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Islas Georgias del Sur y Sandwich del Sur" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guayana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Islas Heard y McDonald" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Croacia" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Hungría" + +#. 360 +msgid "Indonesia" +msgstr "Indonesia" + +#. 372 +msgid "Ireland" +msgstr "Irlanda" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "Isla de Man" + +#. 356 +msgid "India" +msgstr "India" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Territorio Británico en el Océano Indico" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Irán" + +#. 352 +msgid "Iceland" +msgstr "Islandia" + +#. 380 +msgid "Italy" +msgstr "Italia" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaica" + +#. 400 +msgid "Jordan" +msgstr "Jordania" + +#. 392 +msgid "Japan" +msgstr "Japón" + +#. 404 +msgid "Kenya" +msgstr "Kenia" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirguistán" + +#. 116 +msgid "Cambodia" +msgstr "Camboya" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Comoras" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "San Cristóbal y Nieves" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Corea, República Democrática Popular de" + +#. 410 +msgid "Korea, Republic of" +msgstr "Corea, República de" + +#. 414 +msgid "Kuwait" +msgstr "Kuwait" + +#. 136 +msgid "Cayman Islands" +msgstr "Islas Caimán" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazajstán" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "República Democrática Popular Lao" + +#. 422 +msgid "Lebanon" +msgstr "Líbano" + +#. 662 +msgid "Saint Lucia" +msgstr "Santa Lucía" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberia" + +#. 426 +msgid "Lesotho" +msgstr "Lesoto" + +#. 440 +msgid "Lithuania" +msgstr "Lituania" + +#. 442 +msgid "Luxembourg" +msgstr "Luxemburgo" + +#. 428 +msgid "Latvia" +msgstr "Letonia" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libia" + +#. 504 +msgid "Morocco" +msgstr "Marruecos" + +#. 492 +msgid "Monaco" +msgstr "Mónaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldavia, República de" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "San Martín (zona francesa)" + +#. 450 +msgid "Madagascar" +msgstr "Madagascar" + +#. 584 +msgid "Marshall Islands" +msgstr "Islas Marshall" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Antigua República Yugoslava de Macedonia" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongolia" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Islas Marianas del Norte" + +#. 474 +msgid "Martinique" +msgstr "Martinica" + +#. 478 +msgid "Mauritania" +msgstr "Mauritania" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauricio" + +#. 462 +msgid "Maldives" +msgstr "Maldivas" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "México" + +#. 458 +msgid "Malaysia" +msgstr "Malasia" + +#. 508 +msgid "Mozambique" +msgstr "Mozambique" + +#. 516 +msgid "Namibia" +msgstr "Namibia" + +#. 540 +msgid "New Caledonia" +msgstr "Nueva Caledonia" + +#. 562 +msgid "Niger" +msgstr "Níger" + +#. 574 +msgid "Norfolk Island" +msgstr "Isla Norfolk" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nicaragua" + +#. 528 +msgid "Netherlands" +msgstr "Países Bajos" + +#. 578 +msgid "Norway" +msgstr "Noruega" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Nueva Zelanda" + +#. 512 +msgid "Oman" +msgstr "Omán" + +#. 591 +msgid "Panama" +msgstr "Panamá" + +#. 604 +msgid "Peru" +msgstr "Perú" + +#. 258 +msgid "French Polynesia" +msgstr "Polinesia Francesa" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papúa Nueva Guinea" + +#. 608 +msgid "Philippines" +msgstr "Filipinas" + +#. 586 +msgid "Pakistan" +msgstr "Pakistán" + +#. 616 +msgid "Poland" +msgstr "Polonia" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "San Pedro y Miquelón" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Territorio Palestino Ocupado" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Catar" + +#. 638 +msgid "Reunion" +msgstr "Reunión" + +#. 642 +msgid "Romania" +msgstr "Rumania" + +#. 688 +msgid "Serbia" +msgstr "Serbia" + +#. 643 +msgid "Russian Federation" +msgstr "Federación de Rusia" + +#. 646 +msgid "Rwanda" +msgstr "Ruanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Arabia Saudita" + +#. 090 +msgid "Solomon Islands" +msgstr "Islas Salomón" + +#. 690 +msgid "Seychelles" +msgstr "Seychelles" + +#. 736 +msgid "Sudan" +msgstr "Sudán" + +#. 752 +msgid "Sweden" +msgstr "Suecia" + +#. 702 +msgid "Singapore" +msgstr "Singapur" + +#. 654 +msgid "Saint Helena" +msgstr "Santa Helena" + +#. 705 +msgid "Slovenia" +msgstr "Eslovenia" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard y Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Eslovaquia" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leona" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalia" + +#. 740 +msgid "Suriname" +msgstr "Surinam" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Santo Tomé y Príncipe" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "República Árabe de Siria" + +#. 748 +msgid "Swaziland" +msgstr "Suazilandia" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Islas Turcas y Caicos" + +#. 148 +msgid "Chad" +msgstr "Chad" + +#. 260 +msgid "French Southern Territories" +msgstr "Territorios Australes Franceses" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Tailandia" + +#. 762 +msgid "Tajikistan" +msgstr "Tayikistán" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Timor Oriental" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistán" + +#. 788 +msgid "Tunisia" +msgstr "Túnez" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turquía" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad y Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwán, Provincia de China" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzania, República Unida de" + +#. 804 +msgid "Ukraine" +msgstr "Ucrania" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Islas Ultramarinas Menores de los Estados Unidos" + +#. 840 +msgid "United States" +msgstr "Estados Unidos" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbekistán" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Santa Sede (Ciudad Estado del Vaticano)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "San Vicente y las Granadinas" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Islas Vírgenes, Británicas" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Islas Vírgenes, EE.UU." + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis y Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Yemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Sudáfrica" + +#. 894 +msgid "Zambia" +msgstr "Zambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabue" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Desconocido, añadir etiquetas is_in a estas ciudades" + +msgid "Car" +msgstr "Auto" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "País" + +msgid "Postal" +msgstr "Postal" + +msgid "Town" +msgstr "Pueblo" + +msgid "District" +msgstr "Distrito" + +msgid "Street" +msgstr "Calle" + +msgid "Number" +msgstr "Número" + +msgid "Enter Destination" +msgstr "Introducir destino" + +msgid "Zip Code" +msgstr "Código postal" + +msgid "City" +msgstr "Ciudad" + +msgid "District/Township" +msgstr "Distrito" + +msgid "Map" +msgstr "Mapa" + +msgid "Bookmark" +msgstr "Marcador" + +msgid "Destination" +msgstr "Destino" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "_Visualizar" + +msgid "_Route" +msgstr "_Ruta" + +msgid "_Former Destinations" +msgstr "Destinos _anteriores" + +msgid "_Bookmarks" +msgstr "_Favoritos" + +msgid "_Map" +msgstr "_Mapa" + +msgid "_Layout" +msgstr "D_iseño" + +msgid "_Projection" +msgstr "_Proyección" + +msgid "_Vehicle" +msgstr "_Vehículo" + +msgid "Zoom_Out" +msgstr "A_lejar" + +msgid "Decrease zoom level" +msgstr "Reducir el nivel de zoom" + +msgid "Zoom_In" +msgstr "A_umentar" + +msgid "Increase zoom level" +msgstr "Aumentar el nivel de zoom" + +msgid "_Recalculate" +msgstr "_Recalcular" + +msgid "Redraw map" +msgstr "Redibujar mapa" + +msgid "_Info" +msgstr "_Información" + +msgid "Set _destination" +msgstr "_Fijar destino" + +msgid "Opens address search dialog" +msgstr "Abre el dialogo de busqueda de dirección" + +msgid "_Stop Navigation" +msgstr "_Detener navegación" + +msgid "Test" +msgstr "Prueba" + +msgid "_Quit" +msgstr "_Salir" + +msgid "Quit the application" +msgstr "Salir de la aplicación" + +msgid "Show position _cursor" +msgstr "_Mostrar posición del cursor" + +msgid "_Lock on Road" +msgstr "_Bloqueo en la ruta" + +msgid "_Keep orientation to the North" +msgstr "Mantener _orientación al Norte" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "Cambia la orientación del mapa entre el norte y el vehículo" + +msgid "_Roadbook" +msgstr "Guía" + +msgid "Show/hide route description" +msgstr "Mostrar/ocultar descripción de la ruta" + +msgid "_Autozoom" +msgstr "_Autoampliar" + +msgid "Enable/disable automatic zoom level changing" +msgstr "Activa/desactiva nivel de zoom automático" + +msgid "_Fullscreen" +msgstr "Pantalla completa" + +msgid "Data" +msgstr "Datos" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NE" + +msgid "E" +msgstr "E" + +msgid "SE" +msgstr "SE" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SO" + +msgid "W" +msgstr "O" + +msgid "NW" +msgstr "NO" + +msgid "No" +msgstr "No" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Ruta %4.0fkm %02d:%02d TEL" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Ruta 0000km 0+00:00 TEL" + +msgid "Back to map" +msgstr "Volver al mapa" + +msgid "Main Menu" +msgstr "Menú principal" + +msgid "Help" +msgstr "Ayuda" + +msgid "Back" +msgstr "Atrás" + +msgid "Add Bookmark" +msgstr "Añadir marcador" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "Añadir carpeta de marcadores" + +msgid "Rename" +msgstr "Renombrar" + +msgid "POIs" +msgstr "PDIs" + +msgid "View in Browser" +msgstr "Ver en el navegador" + +msgid "Item type" +msgstr "Tipo de objeto" + +msgid "Streets" +msgstr "Calles" + +msgid "House numbers" +msgstr "Números de portal" + +msgid "View Attributes" +msgstr "Ver atributos" + +msgid "View on map" +msgstr "Ver en el mapa" + +msgid "Cut Bookmark" +msgstr "Cortar marcador" + +msgid "Copy Bookmark" +msgstr "Copiar marcador" + +msgid "Rename Bookmark" +msgstr "Renombrar marcador" + +msgid "Paste Bookmark" +msgstr "Pegar marcador" + +msgid "Delete Bookmark" +msgstr "Eliminar marcador" + +msgid "Bookmarks" +msgstr "Favoritos" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Pegar marcador" + +#, c-format +msgid "Bookmark %s" +msgstr "Marcador %s" + +msgid "Former Destinations" +msgstr "Destinos anteriores" + +msgid "- No former destinations available -" +msgstr "- No hay destinos anteriores -" + +msgid "House number" +msgstr "Número de portal" + +msgid "Layout" +msgstr "Diseño" + +#, c-format +msgid "Download %s" +msgstr "Descargar %s" + +msgid "Map Download" +msgstr "Descargar mapa" + +msgid "Active" +msgstr "Activo" + +msgid "Download Enabled" +msgstr "Derscaga activada" + +msgid "Download completely" +msgstr "Descargar completo" + +msgid "Maps" +msgstr "Mapas" + +msgid "Show Satellite Status" +msgstr "Mostrar estado de satélite" + +msgid " Elevation " +msgstr " Elevación " + +msgid " Azimuth " +msgstr " Azimut " + +msgid "Show NMEA Data" +msgstr "Mostar datos NMEA" + +msgid "car" +msgstr "automóvil" + +msgid "bike" +msgstr "bicicleta" + +msgid "pedestrian" +msgstr "peatón" + +#, c-format +msgid "Current profile: %s" +msgstr "Perfil actual: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Cambiar perfil a: %s" + +msgid "Set as active" +msgstr "Establecer como activo" + +msgid "Show Satellite status" +msgstr "Mostrar estado de satélite" + +msgid "Show NMEA data" +msgstr "Mostar datos NMEA" + +msgid "Vehicle" +msgstr "Vehículo" + +msgid "Rules" +msgstr "Reglas" + +msgid "Lock on road" +msgstr "Bloqueo en la ruta" + +msgid "Northing" +msgstr "Hacia el Norte" + +msgid "Map follows Vehicle" +msgstr "El mapa sigue al vehículo" + +msgid "Message" +msgstr "Mensaje" + +msgid "Next" +msgstr "Siguiente" + +msgid "Prev" +msgstr "Anterior" + +msgid "Route Description" +msgstr "Descripción de ruta" + +msgid "Height Profile" +msgstr "Perfil de altura" + +msgid "Show Locale" +msgstr "Mostrar locale" + +msgid "About Navit" +msgstr "Acerca de Navit" + +#. Authors +msgid "By" +msgstr "Por" + +#. Contributors +msgid "And all the Navit Team" +msgstr "Y todo el equipo de Navit" + +msgid "members and contributors." +msgstr "miembros y colaboradores" + +msgid "Return to route!" +msgstr "Vuelva a la ruta" + +#. warning told +msgid "Look out! Camera!" +msgstr "!Atencion! Radar" + +#. warning told +msgid "Please decrease your speed" +msgstr "Reduzca velocidad por favor" + +msgid "Map Point" +msgstr "Punto del Mapa" + +msgid "Vehicle Position" +msgstr "Posición del vehículo" + +msgid "Main menu" +msgstr "Menú principal" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Mostrar\n" +"Mapa" + +msgid "Settings" +msgstr "Configuración" + +msgid "Tools" +msgstr "Herramientas" + +msgid "Route" +msgstr "Ruta" + +msgid "About" +msgstr "Acerca de" + +msgid "Actions" +msgstr "Acciones" + +msgid "" +"Former\n" +"Destinations" +msgstr "" +"Destinos\n" +"anteriores" + +msgid "Quit" +msgstr "Cerrar" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Parar\n" +"Navegación" + +msgid "Display" +msgstr "Visualizar" + +msgid "Fullscreen" +msgstr "Pantalla completa" + +msgid "Window Mode" +msgstr "Modo ventana" + +msgid "Description" +msgstr "Descripción" + +msgid "car_shortest" +msgstr "automovil_ruta_mas_corta" + +msgid "car_avoid_tolls" +msgstr "automovil_evitar_peajes" + +msgid "horse" +msgstr "caballo" + +msgid "Truck" +msgstr "Camión" diff --git a/po/et.po.in b/po/et.po.in new file mode 100644 index 0000000..29fcd2f --- /dev/null +++ b/po/et.po.in @@ -0,0 +1,1756 @@ +# Estonian translation for navit +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the navit package. +# Andres Kaaber 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-05-18 12:23+0000\n" +"Last-Translator: Andres Kaaber \n" +"Language-Team: Estonian \n" +"Language: et\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Käivitan lähtekataloogist\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "määran '%s' -i '%s' -ks\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "" + +msgid "first" +msgstr "" + +msgid "second" +msgstr "" + +msgid "third" +msgstr "" + +msgid "fourth" +msgstr "" + +msgid "fifth" +msgstr "" + +msgid "sixth" +msgstr "" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "" + +msgid "first exit" +msgstr "" + +msgid "second exit" +msgstr "" + +msgid "third exit" +msgstr "" + +msgid "fourth exit" +msgstr "" + +msgid "fifth exit" +msgstr "" + +msgid "sixth exit" +msgstr "" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "%d m pärast" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d meetrit" + +#, c-format +msgid "in %d meters" +msgstr "%d meetri pärast" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "%d.%d kilomeetri pärast" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "üks kilomeeter" +msgstr[1] "%d kilomeetrit" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "ühe kilomeetri pärast" +msgstr[1] "%d kilomeetri pärast" + +msgid "exit" +msgstr "välju" + +msgid "into the ramp" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s %s%s%s tänavale" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%s %s%s%s tänavale| mees vorm" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%s %s%s%s tänavale| nais vorm" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%s %s%s%s tänavale| neutraalne vorm" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "paremale" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "vasakule" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "kergesti " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "tugevalt " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "teadmata " + +msgid "When possible, please turn around" +msgstr "Kui võimalik, palun pööra ümber" + +msgid "Enter the roundabout soon" +msgstr "" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Mööda teed järgmise %s" + +msgid "soon" +msgstr "varsti" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "" + +#, c-format +msgid "after %i roads" +msgstr "" + +msgid "now" +msgstr "nüüd" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "" + +msgid "error" +msgstr "viga" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Pööra %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Sa oled jõudnud sihtpunkti %s" + +msgid "then you have reached your destination." +msgstr "" + +msgid "Position" +msgstr "" + +msgid "Command" +msgstr "Käsk" + +msgid "Length" +msgstr "Pikkus" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Aeg" + +msgid "Destination Length" +msgstr "Sihtkoha kaugus" + +msgid "Destination Time" +msgstr "Kohalejõudmise aeg" + +msgid "Roadbook" +msgstr "Teekonna raamat" + +msgid "Set as position" +msgstr "Määra asukohaks" + +msgid "Set as destination" +msgstr "Määra sihtpunktiks" + +msgid "Add as bookmark" +msgstr "Lisa järjehoidjasse" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Punkt 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Ekraani koordinaadid: %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Araabia Ühendemiraadid" + +#. 004 +msgid "Afghanistan" +msgstr "Afganistaan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua ja Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albaania" + +#. 051 +msgid "Armenia" +msgstr "Armeenia" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Hollandi antillid" + +#. 024 +msgid "Angola" +msgstr "Angoola" + +#. 010 +msgid "Antarctica" +msgstr "Antarktika" + +#. 032 +msgid "Argentina" +msgstr "Argentiina" + +#. 016 +msgid "American Samoa" +msgstr "Ameerika Samoa" + +#. 040 +msgid "Austria" +msgstr "Austria" + +#. 036 +msgid "Australia" +msgstr "Austraalia" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Alandi saared" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbaidžaan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnia ja Hertsegoviina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesh" + +#. 056 +msgid "Belgium" +msgstr "Belgia" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgaaria" + +#. 048 +msgid "Bahrain" +msgstr "Bahrein" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benini" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint Barthelemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei Darussalam" + +#. 068 +msgid "Bolivia" +msgstr "Boliivia" + +#. 076 +msgid "Brazil" +msgstr "Brasiilia" + +#. 044 +msgid "Bahamas" +msgstr "Bahama" + +#. 064 +msgid "Bhutan" +msgstr "Bhutan" + +#. 074 +msgid "Bouvet Island" +msgstr "Bouvet' saar" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Valgevene" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Kanada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Kookosesaared" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Kongo Demokraatlik Vabariik" + +#. 140 +msgid "Central African Republic" +msgstr "Kesk-Aafrika Vabariik" + +#. 178 +msgid "Congo" +msgstr "Kongo" + +#. 756 +msgid "Switzerland" +msgstr "Šveits" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Elevandiluu rannik" + +#. 184 +msgid "Cook Islands" +msgstr "Cooki saared" + +#. 152 +msgid "Chile" +msgstr "Tšiili" + +#. 120 +msgid "Cameroon" +msgstr "Kamerun" + +#. 156 +msgid "China" +msgstr "Hiina" + +#. 170 +msgid "Colombia" +msgstr "Kolumbia" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Kuuba" + +#. 132 +msgid "Cape Verde" +msgstr "Roheneeme saared" + +#. 162 +msgid "Christmas Island" +msgstr "Jõulusaar" + +#. 196 +msgid "Cyprus" +msgstr "Küpros" + +#. 203 +msgid "Czech Republic" +msgstr "Tšehhi Vabariik" + +#. 276 +msgid "Germany" +msgstr "Saksamaa" + +#. 262 +msgid "Djibouti" +msgstr "Djibouti" + +#. 208 +msgid "Denmark" +msgstr "Taani" + +#. 212 +msgid "Dominica" +msgstr "Dominica" + +#. 214 +msgid "Dominican Republic" +msgstr "Dominikaani Vabariik" + +#. 012 +msgid "Algeria" +msgstr "Alžeeria" + +#. 218 +msgid "Ecuador" +msgstr "Ekvador" + +#. 233 +msgid "Estonia" +msgstr "Eesti" + +#. 818 +msgid "Egypt" +msgstr "Egiptus" + +#. 732 +msgid "Western Sahara" +msgstr "Lääne-Sahara" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Hispaania" + +#. 231 +msgid "Ethiopia" +msgstr "Etioopia" + +#. 246 +msgid "Finland" +msgstr "Soome" + +#. 242 +msgid "Fiji" +msgstr "Fidži" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falklandi (Malviini) saared" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Mikroneesia Liiduriigid" + +#. 234 +msgid "Faroe Islands" +msgstr "Fääri saared" + +#. 250 +msgid "France" +msgstr "Prantsusmaa" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Suurbritannia" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Georgia" + +#. 254 +msgid "French Guiana" +msgstr "Prantsuse Guajaana" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Gröönimaa" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Ekvatoriaal-Guinea" + +#. 300 +msgid "Greece" +msgstr "Kreeka" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Lõuna-Georgia ja Lõuna-Sandwichi saared" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guajaana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heardi ja McDonaldi saarte ala" + +#. 340 +msgid "Honduras" +msgstr "Honduuras" + +#. 191 +msgid "Croatia" +msgstr "Horvaatia" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Ungari" + +#. 360 +msgid "Indonesia" +msgstr "Indoneesia" + +#. 372 +msgid "Ireland" +msgstr "Iirimaa" + +#. 376 +msgid "Israel" +msgstr "Iisrael" + +#. 833 +msgid "Isle of Man" +msgstr "Man'i saar" + +#. 356 +msgid "India" +msgstr "India" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Briti India ookeani territoorium" + +#. 368 +msgid "Iraq" +msgstr "Iraak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iraani Islamivabariik" + +#. 352 +msgid "Iceland" +msgstr "Island" + +#. 380 +msgid "Italy" +msgstr "Itaalia" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaica" + +#. 400 +msgid "Jordan" +msgstr "Jordaania" + +#. 392 +msgid "Japan" +msgstr "Jaapan" + +#. 404 +msgid "Kenya" +msgstr "Keenia" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kõrgõstan" + +#. 116 +msgid "Cambodia" +msgstr "Kambodža" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Komoorid" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "St. Kitts ja Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Korea Rahvademokraatlik Vabariik" + +#. 410 +msgid "Korea, Republic of" +msgstr "Korea Vabariik" + +#. 414 +msgid "Kuwait" +msgstr "Kuveit" + +#. 136 +msgid "Cayman Islands" +msgstr "Kaimani saared" + +#. 398 +msgid "Kazakhstan" +msgstr "Kasashtan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laose Demokraatlik Rahvavabariik" + +#. 422 +msgid "Lebanon" +msgstr "Liibanon" + +#. 662 +msgid "Saint Lucia" +msgstr "St. Lucia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Libeeria" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Leedu" + +#. 442 +msgid "Luxembourg" +msgstr "Luksemburg" + +#. 428 +msgid "Latvia" +msgstr "Läti" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Liibüa Araabia Džamahirija" + +#. 504 +msgid "Morocco" +msgstr "Maroko" + +#. 492 +msgid "Monaco" +msgstr "Monaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldova Vabariik" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "St. Martin (Prantsuse osa)" + +#. 450 +msgid "Madagascar" +msgstr "Madagaskar" + +#. 584 +msgid "Marshall Islands" +msgstr "Marshalli saared" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Makedoonia, endine Jugoslaavia vabariik" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongoolia" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Põhja-Mariaani saared" + +#. 474 +msgid "Martinique" +msgstr "Martinique" + +#. 478 +msgid "Mauritania" +msgstr "Marutaania" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauritius" + +#. 462 +msgid "Maldives" +msgstr "Maldiivid" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mehhiko" + +#. 458 +msgid "Malaysia" +msgstr "Malaisia" + +#. 508 +msgid "Mozambique" +msgstr "Mosambiik" + +#. 516 +msgid "Namibia" +msgstr "Namiibia" + +#. 540 +msgid "New Caledonia" +msgstr "Uus Kaledoonia" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolki saar" + +#. 566 +msgid "Nigeria" +msgstr "Nigeeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nikaraagua" + +#. 528 +msgid "Netherlands" +msgstr "Holland" + +#. 578 +msgid "Norway" +msgstr "Norra" + +#. 524 +msgid "Nepal" +msgstr "Nepaal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Uus-Meremaa" + +#. 512 +msgid "Oman" +msgstr "Omaan" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peruu" + +#. 258 +msgid "French Polynesia" +msgstr "Prantsuse Polüneesia" + +#. 598 +msgid "Papua New Guinea" +msgstr "Paapua Uus-Guinea" + +#. 608 +msgid "Philippines" +msgstr "Filipiinid" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Poola" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "St. Pierre and Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestiina okupeeritud ala" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguai" + +#. 634 +msgid "Qatar" +msgstr "Katar" + +#. 638 +msgid "Reunion" +msgstr "Reunion" + +#. 642 +msgid "Romania" +msgstr "Rumeenia" + +#. 688 +msgid "Serbia" +msgstr "Serbia" + +#. 643 +msgid "Russian Federation" +msgstr "Venemaa" + +#. 646 +msgid "Rwanda" +msgstr "Rwanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Saudi Araabia" + +#. 090 +msgid "Solomon Islands" +msgstr "Saalomoni saared" + +#. 690 +msgid "Seychelles" +msgstr "Seišellid" + +#. 736 +msgid "Sudan" +msgstr "Sudaan" + +#. 752 +msgid "Sweden" +msgstr "Rootsi" + +#. 702 +msgid "Singapore" +msgstr "Singapur" + +#. 654 +msgid "Saint Helena" +msgstr "St. Helena" + +#. 705 +msgid "Slovenia" +msgstr "Sloveenia" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard ja Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slovakkia" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somaalia" + +#. 740 +msgid "Suriname" +msgstr "Surinam" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Sao Tome ja Principe" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Süüria Araabia Vabariik" + +#. 748 +msgid "Swaziland" +msgstr "Svaasimaa" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turks ja Caicose saared" + +#. 148 +msgid "Chad" +msgstr "Tšaad" + +#. 260 +msgid "French Southern Territories" +msgstr "Prantsuse Lõunaalad" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Tai" + +#. 762 +msgid "Tajikistan" +msgstr "Tadžikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Ida-Timor" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tuneesia" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Türgi" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad ja Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tansaania Ühendvabariik" + +#. 804 +msgid "Ukraine" +msgstr "Ukraina" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Ühendriikide hajasaared" + +#. 840 +msgid "United States" +msgstr "USA" + +#. 858 +msgid "Uruguay" +msgstr "Uruguai" + +#. 860 +msgid "Uzbekistan" +msgstr "Usbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Püha Tool (Vatikan)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "St. Vincent ja Grenadines" + +#. 862 +msgid "Venezuela" +msgstr "Venetsueela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Neitsisaared, Briti" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Neitsisaared, USA" + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis ja Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Jeemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Lõuna-Aafrika" + +#. 894 +msgid "Zambia" +msgstr "Zambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "" + +msgid "Car" +msgstr "Auto" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Riik" + +msgid "Postal" +msgstr "Postiindeks" + +msgid "Town" +msgstr "Linn" + +msgid "District" +msgstr "Linnaosa" + +msgid "Street" +msgstr "Tänav" + +msgid "Number" +msgstr "Number" + +msgid "Enter Destination" +msgstr "Sisesta sihtpunkt" + +msgid "Zip Code" +msgstr "Postiindeks" + +msgid "City" +msgstr "Linn" + +msgid "District/Township" +msgstr "Linnaosa" + +msgid "Map" +msgstr "Kaart" + +msgid "Bookmark" +msgstr "Järjehoidja" + +msgid "Destination" +msgstr "Sihtkoht" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Kuva" + +msgid "_Route" +msgstr "Teekond" + +msgid "_Former Destinations" +msgstr "Eelmine sihtkoht" + +msgid "_Bookmarks" +msgstr "Järjehoidjad" + +msgid "_Map" +msgstr "Kaart" + +msgid "_Layout" +msgstr "Paigutus" + +msgid "_Projection" +msgstr "Projektsioon" + +msgid "_Vehicle" +msgstr "Liiklusvahend" + +msgid "Zoom_Out" +msgstr "Vähenda" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Suurenda" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Arvuta uuesti" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Teave" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Peata navigatsioon" + +msgid "Test" +msgstr "Test" + +msgid "_Quit" +msgstr "_Välju" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Lukusta tee peale" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Teekonna raamat" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Täisekraan" + +msgid "Data" +msgstr "Andmed" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NE" + +msgid "E" +msgstr "E" + +msgid "SE" +msgstr "SE" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SW" + +msgid "W" +msgstr "W" + +msgid "NW" +msgstr "NW" + +msgid "No" +msgstr "" + +msgid "2D" +msgstr "" + +msgid "3D" +msgstr "" + +msgid "OT" +msgstr "" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Teekond %4.0fkm %02d:%02d ETA" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Teekond 0000km 0+00:00 ETA" + +msgid "Back to map" +msgstr "" + +msgid "Main Menu" +msgstr "" + +msgid "Help" +msgstr "" + +msgid "Back" +msgstr "" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "" + +msgid "View in Browser" +msgstr "" + +msgid "Streets" +msgstr "" + +msgid "House numbers" +msgstr "" + +msgid "View Attributes" +msgstr "" + +msgid "View on map" +msgstr "" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "Järjehoidjad" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "" + +msgid "Former Destinations" +msgstr "Eelmine sihtkoht" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "" + +msgid "Layout" +msgstr "Paigutus" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "" + +msgid "Show Satellite Status" +msgstr "" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "" + +msgid "car" +msgstr "" + +msgid "bike" +msgstr "" + +msgid "pedestrian" +msgstr "" + +#, c-format +msgid "Current profile: %s" +msgstr "" + +#, c-format +msgid "Change profile to: %s" +msgstr "" + +msgid "Set as active" +msgstr "" + +msgid "Show Satellite status" +msgstr "" + +msgid "Show NMEA data" +msgstr "" + +msgid "Vehicle" +msgstr "Liiklusvahend" + +msgid "Rules" +msgstr "" + +msgid "Lock on road" +msgstr "" + +msgid "Northing" +msgstr "Põhjasuund" + +msgid "Map follows Vehicle" +msgstr "" + +msgid "Message" +msgstr "" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "" + +msgid "Vehicle Position" +msgstr "" + +msgid "Main menu" +msgstr "" + +msgid "" +"Show\n" +"Map" +msgstr "" + +msgid "Settings" +msgstr "" + +msgid "Tools" +msgstr "" + +msgid "Route" +msgstr "Teekond" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" + +msgid "Display" +msgstr "Kuva" + +msgid "Fullscreen" +msgstr "Täisekraan" + +msgid "Window Mode" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "Cursor" +#~ msgstr "Kursor" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d kilomeeter" diff --git a/po/eu.po.in b/po/eu.po.in new file mode 100644 index 0000000..909221a --- /dev/null +++ b/po/eu.po.in @@ -0,0 +1,1760 @@ +# Basque translation for navit +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the navit package. +# Inaki Saez +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-08-27 18:11+0000\n" +"Last-Translator: Inaki Saez \n" +"Language-Team: Basque \n" +"Language: eu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Iturburu direktoriotik ari\\n\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "'%s' '%s'ra ezartzen\\n\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "zero" + +msgid "first" +msgstr "lehen" + +msgid "second" +msgstr "bigarren" + +msgid "third" +msgstr "hirugarren" + +msgid "fourth" +msgstr "laugarren" + +msgid "fifth" +msgstr "boskarren" + +msgid "sixth" +msgstr "seigarren" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "zerogarren irteera" + +msgid "first exit" +msgstr "lehenengo irteera" + +msgid "second exit" +msgstr "bigarren irteera" + +msgid "third exit" +msgstr "hirugarren irteera" + +msgid "fourth exit" +msgstr "laugarren irteera" + +msgid "fifth exit" +msgstr "boskarren" + +msgid "sixth exit" +msgstr "seigarren irteera" + +#, c-format +msgid "%d m" +msgstr "%d metro" + +#, c-format +msgid "in %d m" +msgstr "%d metrotan" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metro" + +#, c-format +msgid "in %d meters" +msgstr "%d metrotan" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d,%d kilometro" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "%d,%d kilometrotan" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "kilometro bat" +msgstr[1] "%d kilometro" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "kilometro batean" +msgstr[1] "%d kilometrotan" + +msgid "exit" +msgstr "irteera" + +msgid "into the ramp" +msgstr "maldan" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s %s %s %s kalean" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%s %s%s%s-an" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%s %s%s%s-an" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%s %s%s%s-en" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%s %s-an" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "eskuina" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "ezkerra" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "pizka bat " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "gogorki " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "benetan gogor " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "ezezaguna " + +msgid "When possible, please turn around" +msgstr "Ahal duzunean eman itzulia, mesedez" + +msgid "Enter the roundabout soon" +msgstr "" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "gero, irten errotondatik %s-ean" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Irten errotondatik %s-ean" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Jarraitu bidean urrengo %s-arte" + +msgid "soon" +msgstr "hurrengotan" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Hartu %1$s bidea %2$s-ean" + +#, c-format +msgid "after %i roads" +msgstr "%i bideen ondoren" + +msgid "now" +msgstr "orain" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "orduan hartu %1$s irteera %2$s-era" + +msgid "error" +msgstr "akatsa" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Biratu %1$s%2$s-ra %3$s%4$s-tan" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "ondoren biratu %1$s %2$s-ra %3$s%4$s-raino" + +#, c-format +msgid "You have reached your destination %s" +msgstr "%s helburura iritsi zara" + +msgid "then you have reached your destination." +msgstr "dagoeneko helburura iritsi zara" + +msgid "Position" +msgstr "kokalekua" + +msgid "Command" +msgstr "Agindua" + +msgid "Length" +msgstr "Luzera" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Denbora" + +msgid "Destination Length" +msgstr "Helbururaino urruntasuna" + +msgid "Destination Time" +msgstr "Helbururaino denbora" + +msgid "Roadbook" +msgstr "Gida" + +msgid "Set as position" +msgstr "Kolekua finkatu" + +msgid "Set as destination" +msgstr "Heburuz hautatu" + +msgid "Add as bookmark" +msgstr "Nahikotzat gehitu" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Puntu 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Pantaila koordenatuak: %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Arabiar Emirerri Batuak" + +#. 004 +msgid "Afghanistan" +msgstr "Afganistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua eta Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Angila" + +#. 008 +msgid "Albania" +msgstr "Albania" + +#. 051 +msgid "Armenia" +msgstr "Armenia" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Herbeheren Antillak" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antartika" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "Amerikar Samoa" + +#. 040 +msgid "Austria" +msgstr "Austria" + +#. 036 +msgid "Australia" +msgstr "Australia" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Aland uharteak" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbaijan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnia-Herzegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesh" + +#. 056 +msgid "Belgium" +msgstr "Belgika" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgaria" + +#. 048 +msgid "Bahrain" +msgstr "Bahrain" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "San Bartolome" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Bruneiko Sultanerria" + +#. 068 +msgid "Bolivia" +msgstr "Bolivia" + +#. 076 +msgid "Brazil" +msgstr "Brasil" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "Bhutan" + +#. 074 +msgid "Bouvet Island" +msgstr "Bouvet Uhartea" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Bielorrusia" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Kanada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Cocos (Keeling) Uharteak" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Kongoko Errepublika Demokratikoa" + +#. 140 +msgid "Central African Republic" +msgstr "Ertafrikar Errepublika" + +#. 178 +msgid "Congo" +msgstr "Kongo" + +#. 756 +msgid "Switzerland" +msgstr "Suitza" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Bolikosta" + +#. 184 +msgid "Cook Islands" +msgstr "Cook uharteak" + +#. 152 +msgid "Chile" +msgstr "Txile" + +#. 120 +msgid "Cameroon" +msgstr "Kamerun" + +#. 156 +msgid "China" +msgstr "Txina" + +#. 170 +msgid "Colombia" +msgstr "Kolonbia" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Kuba" + +#. 132 +msgid "Cape Verde" +msgstr "Cabo Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Christmas Uhartea" + +#. 196 +msgid "Cyprus" +msgstr "Txipre" + +#. 203 +msgid "Czech Republic" +msgstr "Txekiar Errepublika" + +#. 276 +msgid "Germany" +msgstr "Alemania" + +#. 262 +msgid "Djibouti" +msgstr "Djibuti" + +#. 208 +msgid "Denmark" +msgstr "Danimarka" + +#. 212 +msgid "Dominica" +msgstr "Dominika" + +#. 214 +msgid "Dominican Republic" +msgstr "Dominikar Errepublika" + +#. 012 +msgid "Algeria" +msgstr "Algeria" + +#. 218 +msgid "Ecuador" +msgstr "Ekuador" + +#. 233 +msgid "Estonia" +msgstr "Estonia" + +#. 818 +msgid "Egypt" +msgstr "Egipto" + +#. 732 +msgid "Western Sahara" +msgstr "Mendebaldeko Sahara" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Espainia" + +#. 231 +msgid "Ethiopia" +msgstr "Etiopia" + +#. 246 +msgid "Finland" +msgstr "Finlandia" + +#. 242 +msgid "Fiji" +msgstr "Fiji" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Malvinak Uharteak (Falkland Uharteak)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Mikronesiako Estatu Federatuak" + +#. 234 +msgid "Faroe Islands" +msgstr "Faroe Uharteak" + +#. 250 +msgid "France" +msgstr "Frantzia" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Erresuma Batua" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Georgia" + +#. 254 +msgid "French Guiana" +msgstr "Guayana Frantsesa" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Groenlandia" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Ginea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadalupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Ekuatore Ginea" + +#. 300 +msgid "Greece" +msgstr "Grezia" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Hegoaldeko Georgia eta Hegoaldeko Sandwich Uharteak" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Ginea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guayana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heard Uhartea eta McDonald Uharteak" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Kroazia" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Hungaria" + +#. 360 +msgid "Indonesia" +msgstr "Indonesia" + +#. 372 +msgid "Ireland" +msgstr "Irlanda" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "Man Uhartea" + +#. 356 +msgid "India" +msgstr "India" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Indiako Ozeanoko Britainiar Lurraldea" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iran, Errepublika Islamikoa" + +#. 352 +msgid "Iceland" +msgstr "Islandia" + +#. 380 +msgid "Italy" +msgstr "Italia" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaika" + +#. 400 +msgid "Jordan" +msgstr "Jordania" + +#. 392 +msgid "Japan" +msgstr "Japonia" + +#. 404 +msgid "Kenya" +msgstr "Kenia" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirgizistan" + +#. 116 +msgid "Cambodia" +msgstr "Kanbodia" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Komoroak" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Saint Kitts eta Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Korea, Herri-errepublika Demokratikoa (Ipar Korea)" + +#. 410 +msgid "Korea, Republic of" +msgstr "Korea, Errepublika (Hego Korea)" + +#. 414 +msgid "Kuwait" +msgstr "Kuwait" + +#. 136 +msgid "Cayman Islands" +msgstr "Kaiman Uharteak" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazakhstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laos Herri Errepublika Demokratikoa" + +#. 422 +msgid "Lebanon" +msgstr "Libano" + +#. 662 +msgid "Saint Lucia" +msgstr "Santa Luzia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberia" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Lituania" + +#. 442 +msgid "Luxembourg" +msgstr "Luxenburgo" + +#. 428 +msgid "Latvia" +msgstr "Letonia" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libiar Arabiar Jamahiriya" + +#. 504 +msgid "Morocco" +msgstr "Maroko" + +#. 492 +msgid "Monaco" +msgstr "Monako" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldavia, errepublika" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Saint Martin (Frantziar zatia)" + +#. 450 +msgid "Madagascar" +msgstr "Madagaskar" + +#. 584 +msgid "Marshall Islands" +msgstr "Marshall Uharteak" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Mazedonia, Antzineko Jugoslabiar Errepublika" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongolia" + +#. 446 +msgid "Macao" +msgstr "Makao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Ipar Mariana Uharteak" + +#. 474 +msgid "Martinique" +msgstr "Martinika" + +#. 478 +msgid "Mauritania" +msgstr "Mauritania" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Maurizio" + +#. 462 +msgid "Maldives" +msgstr "Maldibak" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mexiko" + +#. 458 +msgid "Malaysia" +msgstr "Malasia" + +#. 508 +msgid "Mozambique" +msgstr "Mozambike" + +#. 516 +msgid "Namibia" +msgstr "Namibia" + +#. 540 +msgid "New Caledonia" +msgstr "Kaledonia Berria" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolk Uhartea" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nikaragua" + +#. 528 +msgid "Netherlands" +msgstr "Herbehereak" + +#. 578 +msgid "Norway" +msgstr "Norvegia" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Zelanda Berria" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Polinesia Frantsesa" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua Ginea Berria" + +#. 608 +msgid "Philippines" +msgstr "Filipinak" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Polonia" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint Pierre eta Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestinar Lurralde Okupatuak" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguai" + +#. 634 +msgid "Qatar" +msgstr "Qatar" + +#. 638 +msgid "Reunion" +msgstr "Reunion" + +#. 642 +msgid "Romania" +msgstr "Errumania" + +#. 688 +msgid "Serbia" +msgstr "Serbia" + +#. 643 +msgid "Russian Federation" +msgstr "Errusiako Federazioa" + +#. 646 +msgid "Rwanda" +msgstr "Ruanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Saudi Arabia" + +#. 090 +msgid "Solomon Islands" +msgstr "Solomon Uharteak" + +#. 690 +msgid "Seychelles" +msgstr "Seychelleak" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Suedia" + +#. 702 +msgid "Singapore" +msgstr "Singapur" + +#. 654 +msgid "Saint Helena" +msgstr "Santa Helena" + +#. 705 +msgid "Slovenia" +msgstr "Eslovenia" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard eta Jan Mayen Uharteak" + +#. 703 +msgid "Slovakia" +msgstr "Eslovakia" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leona" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalia" + +#. 740 +msgid "Suriname" +msgstr "Surinam" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Sao Tome eta Printze" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Siriako Arabiar Errepublika" + +#. 748 +msgid "Swaziland" +msgstr "Swazilandia" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turk eta Caico uharteak" + +#. 148 +msgid "Chad" +msgstr "Txad" + +#. 260 +msgid "French Southern Territories" +msgstr "Hegoaldeko Lurralde Frantsesak" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Tailandia" + +#. 762 +msgid "Tajikistan" +msgstr "Tajikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Ekialdeko Timor" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunisia" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turkia" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad eta Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan, Txinako Errepublika" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzaniako Errepublika Batua" + +#. 804 +msgid "Ukraine" +msgstr "Ukraina" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Estatu Batuetako Itsas Bestaldeko Uharte Txikiak" + +#. 840 +msgid "United States" +msgstr "Estatu Batuak" + +#. 858 +msgid "Uruguay" +msgstr "Uruguai" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Vatikanoko hiria" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Saint Vincent eta Grenadinak" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Birgina Uharteak, Britainarrak" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Birjina Uharteak, A.E.B." + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis eta Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Yemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Hegoafrika" + +#. 894 +msgid "Zambia" +msgstr "Zambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Ezezaguna, gehitu -en_dago etiketak hiri hauentzat" + +msgid "Car" +msgstr "Berebila" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Herrialdea" + +msgid "Postal" +msgstr "Posta" + +msgid "Town" +msgstr "Herria" + +msgid "District" +msgstr "Barrutia" + +msgid "Street" +msgstr "Kalea" + +msgid "Number" +msgstr "Zenbakia" + +msgid "Enter Destination" +msgstr "Sartu helburua" + +msgid "Zip Code" +msgstr "Posta-kodea" + +msgid "City" +msgstr "Hiria" + +msgid "District/Township" +msgstr "Auzoa" + +msgid "Map" +msgstr "Mapa" + +msgid "Bookmark" +msgstr "Gogokoa" + +msgid "Destination" +msgstr "Helburua" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Bistaratzea" + +msgid "_Route" +msgstr "Ibilbidea" + +msgid "_Former Destinations" +msgstr "Aurreko Helburuak" + +msgid "_Bookmarks" +msgstr "Gogokoak" + +msgid "_Map" +msgstr "Mapa" + +msgid "_Layout" +msgstr "Antolaketa" + +msgid "_Projection" +msgstr "Proiekzioa" + +msgid "_Vehicle" +msgstr "Ibilgailua" + +msgid "Zoom_Out" +msgstr "Hurrundu" + +msgid "Decrease zoom level" +msgstr "Txikitu zooma" + +msgid "Zoom_In" +msgstr "Hurbildu" + +msgid "Increase zoom level" +msgstr "Handitu zooma" + +msgid "_Recalculate" +msgstr "Birkalkulatu" + +msgid "Redraw map" +msgstr "Mapa Birmargotu" + +msgid "_Info" +msgstr "Datuak" + +msgid "Set _destination" +msgstr "Helburua ezarri" + +msgid "Opens address search dialog" +msgstr "Ireki helbidea bilatzeko lehioa" + +msgid "_Stop Navigation" +msgstr "Nabigazioa Gelditu" + +msgid "Test" +msgstr "Saiatu" + +msgid "_Quit" +msgstr "_Irten" + +msgid "Quit the application" +msgstr "Irten programatik" + +msgid "Show position _cursor" +msgstr "Erakutsi kurtsore kokalekua" + +msgid "_Lock on Road" +msgstr "Bidean oztopoa" + +msgid "_Keep orientation to the North" +msgstr "Iparralderantz begira" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "Maparen norabidea iparralde edo berebilaren artean aldatu" + +msgid "_Roadbook" +msgstr "Gida" + +msgid "Show/hide route description" +msgstr "Erakutsi/ezkutatu hibilbidearen berri" + +msgid "_Autozoom" +msgstr "Autohanditu" + +msgid "Enable/disable automatic zoom level changing" +msgstr "Zoom automatikoa onartu/debekatu" + +msgid "_Fullscreen" +msgstr "Pantaila osoa" + +msgid "Data" +msgstr "Datuak" + +msgid "N" +msgstr "I" + +msgid "NE" +msgstr "IE" + +msgid "E" +msgstr "E" + +msgid "SE" +msgstr "HE" + +msgid "S" +msgstr "H" + +msgid "SW" +msgstr "HM" + +msgid "W" +msgstr "M" + +msgid "NW" +msgstr "IM" + +msgid "No" +msgstr "Ez" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Ibilide %4.0fkm %02d:%02d EDI" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Ibilbide 0000km 0+00:00 EDI" + +msgid "Back to map" +msgstr "Mapara itzuli" + +msgid "Main Menu" +msgstr "Menu nagusia" + +msgid "Help" +msgstr "Laguntza" + +msgid "Back" +msgstr "Atzera" + +msgid "Add Bookmark" +msgstr "Gogokoa gehitu" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "Gehitu Gogokoen direktorioa" + +msgid "Rename" +msgstr "Izena aldatu" + +msgid "POIs" +msgstr "PIak" + +msgid "View in Browser" +msgstr "Ikusi nabigatzailean" + +msgid "Streets" +msgstr "Kaleak" + +msgid "House numbers" +msgstr "Etxebizitza zenbakiak" + +msgid "View Attributes" +msgstr "Atributoak erakutsi" + +msgid "View on map" +msgstr "Mapan Ikusi" + +msgid "Cut Bookmark" +msgstr "Moztu Gogokoa" + +msgid "Copy Bookmark" +msgstr "Kopiatu Gogokoa" + +msgid "Rename Bookmark" +msgstr "Gogokoa berrizendatu" + +msgid "Paste Bookmark" +msgstr "Itsatsi Gogokoa" + +msgid "Delete Bookmark" +msgstr "Ezabatu Gogokoa" + +msgid "Bookmarks" +msgstr "Gogokoak" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Itsatsi gogokoa" + +#, c-format +msgid "Bookmark %s" +msgstr "%s marka" + +msgid "Former Destinations" +msgstr "Aurreko Helburuak" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Etxebizitza zenbakia" + +msgid "Layout" +msgstr "Antolaketa" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Mapak" + +msgid "Show Satellite Status" +msgstr "Sateliteen egoera erakutsi" + +msgid " Elevation " +msgstr " Garaiera " + +msgid " Azimuth " +msgstr " Azimuth " + +msgid "Show NMEA Data" +msgstr "NMEA datuak erakutsi" + +msgid "car" +msgstr "berebila" + +msgid "bike" +msgstr "bizikleta" + +msgid "pedestrian" +msgstr "oinezkoa" + +#, c-format +msgid "Current profile: %s" +msgstr "Oraingo profila: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Profila aldatu: %s-ra" + +msgid "Set as active" +msgstr "Lanean ezarri" + +msgid "Show Satellite status" +msgstr "Sateliteen egoera erakutsi" + +msgid "Show NMEA data" +msgstr "NMEA datuak erakutsi" + +msgid "Vehicle" +msgstr "Ibilgailua" + +msgid "Rules" +msgstr "Arauak" + +msgid "Lock on road" +msgstr "Bidean oztopoa" + +msgid "Northing" +msgstr "Iparrerantz" + +msgid "Map follows Vehicle" +msgstr "Mapak ibilgailua jarraitzen du" + +msgid "Message" +msgstr "Mezua" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Ibilbidearen nondik-norakoa" + +msgid "Height Profile" +msgstr "Garaiera ikusi" + +msgid "Show Locale" +msgstr "Locale erakutsi" + +msgid "About Navit" +msgstr "Naviti buruz" + +#. Authors +msgid "By" +msgstr "Egileak" + +#. Contributors +msgid "And all the Navit Team" +msgstr "Eta Navit talde osoa" + +msgid "members and contributors." +msgstr "partaide eta laguntzaileak." + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Mapako puntua" + +msgid "Vehicle Position" +msgstr "Berebilaren kokalekua" + +msgid "Main menu" +msgstr "Menu nagusia" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Mapa\n" +"Erakutsi" + +msgid "Settings" +msgstr "Ezarpenak" + +msgid "Tools" +msgstr "Tresnak" + +msgid "Route" +msgstr "Ibilbidea" + +msgid "About" +msgstr "Honi buruz" + +msgid "Actions" +msgstr "Ekintzak" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Irten" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Nabigazioa\n" +"Gelditu" + +msgid "Display" +msgstr "Bistaratzea" + +msgid "Fullscreen" +msgstr "Pantaila osoa" + +msgid "Window Mode" +msgstr "Lehio modua" + +msgid "Description" +msgstr "Zehazketa" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "zaldia" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "Enter the roundabout soon and leave it at the %s" +#~ msgstr "Hurrengoan sartu errotondan eta atera %sean" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "%s-tan sartu errotondan" diff --git a/po/fi.po.in b/po/fi.po.in new file mode 100644 index 0000000..6245fee --- /dev/null +++ b/po/fi.po.in @@ -0,0 +1,1773 @@ +# Finnish translations for navit +# Copyright (C) 2007,2008 The Navit Team +# This file is distributed under the same license as the navit package. +# Ossi Berg , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-06-08 07:37+0000\n" +"Last-Translator: Timo Jyrinki \n" +"Language-Team: Ossi Berg \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Ajetaan lähdehakemistosta\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "asetetaan '%s' arvoon '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "nollas" + +msgid "first" +msgstr "ensimmäinen" + +msgid "second" +msgstr "toinen" + +msgid "third" +msgstr "kolmas" + +msgid "fourth" +msgstr "neljäs" + +msgid "fifth" +msgstr "viides" + +msgid "sixth" +msgstr "kuudes" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "nollannesta liittymästä" + +msgid "first exit" +msgstr "ensimmäisestä liittymästä" + +msgid "second exit" +msgstr "toisesta liittymästä" + +msgid "third exit" +msgstr "kolmannesta liittymästä" + +msgid "fourth exit" +msgstr "neljännestä liittymästä" + +msgid "fifth exit" +msgstr "viidennestä liittymästä" + +msgid "sixth exit" +msgstr "kuudennesta liittymästä" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "%d m päästä" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metriä" + +#, c-format +msgid "in %d meters" +msgstr "%d metrin päästä" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d kilometriä" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "%d,%d kilometrin päästä" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "yksi kilometri" +msgstr[1] "%d kilometriä" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "Yhden kilometrin päästä" +msgstr[1] "%d kilometrin päästä" + +msgid "exit" +msgstr "poistumistie" + +msgid "into the ramp" +msgstr "rampille" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%skadulle %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%skadulle %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%skadulle %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%skadulle %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%stielle %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "oikealle" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "vasemmalle" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "loivasti " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "jyrkästi " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "todella voimakkaasti " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "tuntematon " + +msgid "When possible, please turn around" +msgstr "Kun mahdollista, tee u-käännös" + +msgid "Enter the roundabout soon" +msgstr "Liity liikenneympyrään pian" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "poistu sitten liikenneympyrästä %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Poistu liikenneympyrästä %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Seuraa tätä tietä %s" + +msgid "soon" +msgstr "pian" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Valitse %1$s tie suuntaan %2$s" + +#, c-format +msgid "after %i roads" +msgstr "%i tien jälkeen" + +msgid "now" +msgstr "nyt" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "valitse sitten %1$s tie suuntaan %2$s" + +msgid "error" +msgstr "virhe" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Käänny %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "käänny sitten %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Olet saavuttanut kohteesi %s" + +msgid "then you have reached your destination." +msgstr "sitten olet perillä." + +msgid "Position" +msgstr "Sijainti" + +msgid "Command" +msgstr "Komento" + +msgid "Length" +msgstr "Pituus" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Aika" + +msgid "Destination Length" +msgstr "Kohde" + +msgid "Destination Time" +msgstr "Kohde" + +msgid "Roadbook" +msgstr "Ohjeistaja" + +msgid "Set as position" +msgstr "Aseta sijainniksi" + +msgid "Set as destination" +msgstr "Aseta kohteeksi" + +msgid "Add as bookmark" +msgstr "Lisää kirjanmerkiksi" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Piste 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Ruutu %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Yhdistyneet Arabiemiirikunnat" + +#. 004 +msgid "Afghanistan" +msgstr "Afganistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua ja Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albania" + +#. 051 +msgid "Armenia" +msgstr "Armenia" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Alankomaiden Antillit" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Etelänapamanner" + +#. 032 +msgid "Argentina" +msgstr "Argentiina" + +#. 016 +msgid "American Samoa" +msgstr "Amerikan Samoa" + +#. 040 +msgid "Austria" +msgstr "Itävalta" + +#. 036 +msgid "Australia" +msgstr "Australia" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Ahvenanmaa" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbaizan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnia ja Hertsegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesh" + +#. 056 +msgid "Belgium" +msgstr "Belgia" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgaria" + +#. 048 +msgid "Bahrain" +msgstr "Bahrain" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint Barthelemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei" + +#. 068 +msgid "Bolivia" +msgstr "Bolivia" + +#. 076 +msgid "Brazil" +msgstr "Brasilia" + +#. 044 +msgid "Bahamas" +msgstr "Bahamasaaret" + +#. 064 +msgid "Bhutan" +msgstr "Bhutan" + +#. 074 +msgid "Bouvet Island" +msgstr "Bouvet'n saari" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Valko-Venäjä" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Kanada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Kookossaaret (Keeling-saaret)" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Kongon tasavalta" + +#. 140 +msgid "Central African Republic" +msgstr "Keski-Afrikan tasavalta" + +#. 178 +msgid "Congo" +msgstr "Kongo" + +#. 756 +msgid "Switzerland" +msgstr "Sveitsi" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Norsunluurannikko" + +#. 184 +msgid "Cook Islands" +msgstr "Cook-saaret" + +#. 152 +msgid "Chile" +msgstr "Chile" + +#. 120 +msgid "Cameroon" +msgstr "Kamerun" + +#. 156 +msgid "China" +msgstr "Kiina" + +#. 170 +msgid "Colombia" +msgstr "Kolumbia" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Kuuba" + +#. 132 +msgid "Cape Verde" +msgstr "Kap Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Joulusaari" + +#. 196 +msgid "Cyprus" +msgstr "Kypros" + +#. 203 +msgid "Czech Republic" +msgstr "Tsekin tasavalta" + +#. 276 +msgid "Germany" +msgstr "Saksa" + +#. 262 +msgid "Djibouti" +msgstr "Djibouti" + +#. 208 +msgid "Denmark" +msgstr "Tanska" + +#. 212 +msgid "Dominica" +msgstr "Dominica" + +#. 214 +msgid "Dominican Republic" +msgstr "Dominikaaninen tasavalta" + +#. 012 +msgid "Algeria" +msgstr "Algeria" + +#. 218 +msgid "Ecuador" +msgstr "Ecuador" + +#. 233 +msgid "Estonia" +msgstr "Viro" + +#. 818 +msgid "Egypt" +msgstr "Egypti" + +#. 732 +msgid "Western Sahara" +msgstr "Länsi-Sahara" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Espanja" + +#. 231 +msgid "Ethiopia" +msgstr "Etiopia" + +#. 246 +msgid "Finland" +msgstr "Suomi" + +#. 242 +msgid "Fiji" +msgstr "Fidzi" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falkland-saaret (Malvinas-saaret)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Mikronesian liittovaltio" + +#. 234 +msgid "Faroe Islands" +msgstr "Färsaaret" + +#. 250 +msgid "France" +msgstr "Ranska" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Iso-Britannia" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Georgia" + +#. 254 +msgid "French Guiana" +msgstr "Ranskan Guinea" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Grönlanti" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Päiväntasaajan Guinea" + +#. 300 +msgid "Greece" +msgstr "Kreikka" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Etelä-Georgia ja Eteläiset Sandwichsaaret" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heardin saari ja McDonaldin saaret" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Kroatia" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Unkari" + +#. 360 +msgid "Indonesia" +msgstr "Indonesia" + +#. 372 +msgid "Ireland" +msgstr "Irlanti" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "Mansaari" + +#. 356 +msgid "India" +msgstr "Intia" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Brittiläinen Intian valtameren alue" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iranin islamilainen tasavalta" + +#. 352 +msgid "Iceland" +msgstr "Islanti" + +#. 380 +msgid "Italy" +msgstr "Italia" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaika" + +#. 400 +msgid "Jordan" +msgstr "Jordania" + +#. 392 +msgid "Japan" +msgstr "Japani" + +#. 404 +msgid "Kenya" +msgstr "Kenia" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirgistan" + +#. 116 +msgid "Cambodia" +msgstr "Kambodza" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Komorit" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Saint Kitts ja Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Pohjois-Korea" + +#. 410 +msgid "Korea, Republic of" +msgstr "Etelä-Korea" + +#. 414 +msgid "Kuwait" +msgstr "Kuwait" + +#. 136 +msgid "Cayman Islands" +msgstr "Caymansaaret" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazakstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laosin demokraattinen tasavalta" + +#. 422 +msgid "Lebanon" +msgstr "Libanon" + +#. 662 +msgid "Saint Lucia" +msgstr "Saint Lucia" + +#. 438 +msgid "Liechtenstein" +msgstr "Lichtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberia" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Liettua" + +#. 442 +msgid "Luxembourg" +msgstr "Luxemburg" + +#. 428 +msgid "Latvia" +msgstr "Latvia" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libya" + +#. 504 +msgid "Morocco" +msgstr "Marokko" + +#. 492 +msgid "Monaco" +msgstr "Monaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldova" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Saint-Martin (Ranskan osa)" + +#. 450 +msgid "Madagascar" +msgstr "Madagaskar" + +#. 584 +msgid "Marshall Islands" +msgstr "Marshallinsaaret" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Entinen Jugoslavian tasavalta Makedonia" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongolia" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Pohjois-Mariaanit" + +#. 474 +msgid "Martinique" +msgstr "Martinique" + +#. 478 +msgid "Mauritania" +msgstr "Mauritania" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauritius" + +#. 462 +msgid "Maldives" +msgstr "Malediivit" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Meksiko" + +#. 458 +msgid "Malaysia" +msgstr "Malesia" + +#. 508 +msgid "Mozambique" +msgstr "Mosambik" + +#. 516 +msgid "Namibia" +msgstr "Namibia" + +#. 540 +msgid "New Caledonia" +msgstr "Uusi-Kaledonia" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolkinsaaret" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nicaragua" + +#. 528 +msgid "Netherlands" +msgstr "Alankomaat" + +#. 578 +msgid "Norway" +msgstr "Norja" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Uusi-Seelanti" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Ranskan Polynesia" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua Uusi-Guinea" + +#. 608 +msgid "Philippines" +msgstr "Filippiinit" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Puola" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint Pierre ja Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestiinalaisalueet, miehitetyt" + +#. 620 +msgid "Portugal" +msgstr "Portugali" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Qatar" + +#. 638 +msgid "Reunion" +msgstr "Reunion" + +#. 642 +msgid "Romania" +msgstr "Romania" + +#. 688 +msgid "Serbia" +msgstr "Serbia" + +#. 643 +msgid "Russian Federation" +msgstr "Venäjä" + +#. 646 +msgid "Rwanda" +msgstr "Ruanda" + +# +#. 682 +msgid "Saudi Arabia" +msgstr "Saudi-Arabia" + +#. 090 +msgid "Solomon Islands" +msgstr "Salomonsaaret" + +#. 690 +msgid "Seychelles" +msgstr "Seychellit" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Ruotsi" + +#. 702 +msgid "Singapore" +msgstr "Singapore" + +#. 654 +msgid "Saint Helena" +msgstr "Saint Helena" + +#. 705 +msgid "Slovenia" +msgstr "Slovenia" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard ja Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slovakia" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalia" + +#. 740 +msgid "Suriname" +msgstr "Surinam" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Sao Tome ja Principe" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Syyrian arabitasavalta" + +#. 748 +msgid "Swaziland" +msgstr "Swazimaa" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turks- ja Caicossaaret" + +#. 148 +msgid "Chad" +msgstr "Tšad" + +#. 260 +msgid "French Southern Territories" +msgstr "Ranskan eteläiset alueet" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Thaimaa" + +#. 762 +msgid "Tajikistan" +msgstr "Tadzikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Itä-Timor" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunisia" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turkki" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad ja Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan, Kiinan maakunta" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tansania, yhdistynyt tasavalta" + +#. 804 +msgid "Ukraine" +msgstr "Ukraina" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Yhdysvaltojen Tyynenmeren erillissaaret" + +#. 840 +msgid "United States" +msgstr "Yhdysvallat" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Vatikaanivaltio (Pyhä Istuin)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Saint Vincent ja Grenadiinit" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Neitsytsaaret, brittiläiset" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Neitsytsaaret, Yhdysvaltojen" + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis- ja Futunasaaret" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Jemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Etelä-Afrikka" + +#. 894 +msgid "Zambia" +msgstr "Sambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Tuntematon, lisätä is_in koodit näistä kaupungeista" + +msgid "Car" +msgstr "Auto" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Maa" + +# +msgid "Postal" +msgstr "Postinumero" + +msgid "Town" +msgstr "Paikkakunta" + +# +msgid "District" +msgstr "Alue" + +msgid "Street" +msgstr "Katu" + +msgid "Number" +msgstr "Numero" + +# +msgid "Enter Destination" +msgstr "Anna kohde" + +msgid "Zip Code" +msgstr "Postinumero" + +msgid "City" +msgstr "Kaupunki" + +msgid "District/Township" +msgstr "Maakunta" + +msgid "Map" +msgstr "Kartta" + +msgid "Bookmark" +msgstr "Kirjanmerkki" + +msgid "Destination" +msgstr "Kohde" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Näyttö" + +msgid "_Route" +msgstr "Reitti" + +msgid "_Former Destinations" +msgstr "Aiemmat kohteet" + +msgid "_Bookmarks" +msgstr "Kirjanmerkit" + +msgid "_Map" +msgstr "Kartta" + +msgid "_Layout" +msgstr "Pohja" + +msgid "_Projection" +msgstr "Projektio" + +msgid "_Vehicle" +msgstr "Kulkuneuvo" + +msgid "Zoom_Out" +msgstr "Loitonna" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Lähennä" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Laske uudelleen" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Info" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Lopeta navigointi" + +msgid "Test" +msgstr "Testi" + +msgid "_Quit" +msgstr "Sulje" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Lukitse tiehen" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Ohjeistaja" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Autom. suurennus" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Koko ruutu" + +msgid "Data" +msgstr "Tieto" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NE" + +msgid "E" +msgstr "E" + +msgid "SE" +msgstr "SE" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SW" + +msgid "W" +msgstr "W" + +msgid "NW" +msgstr "NW" + +msgid "No" +msgstr "Ei" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Reitti %4.0fkm, arvioitu aika %02d:%02d" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Reitti 0000km, arvioitu aika 0+00:00" + +msgid "Back to map" +msgstr "Takaisin karttaan" + +msgid "Main Menu" +msgstr "Päävalikko" + +msgid "Help" +msgstr "Ohje" + +msgid "Back" +msgstr "Takaisin" + +msgid "Add Bookmark" +msgstr "Lisää kirjanmerkki" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "Lisää kirjanmerkkikansio" + +msgid "Rename" +msgstr "Nimeä uudelleen" + +msgid "POIs" +msgstr "POIt" + +msgid "View in Browser" +msgstr "Näytä selaimessa" + +msgid "Streets" +msgstr "Kadut" + +msgid "House numbers" +msgstr "Talojen numerot" + +msgid "View Attributes" +msgstr "Näytä ominaisuudet" + +msgid "View on map" +msgstr "Näytä kartalla" + +msgid "Cut Bookmark" +msgstr "Leikkaa kirjanmerkki" + +msgid "Copy Bookmark" +msgstr "Kopioi kirjanmerkki" + +msgid "Rename Bookmark" +msgstr "Nimeä kirjanmerkki uudelleen" + +msgid "Paste Bookmark" +msgstr "Liitä kirjanmerkki" + +msgid "Delete Bookmark" +msgstr "Poista kirjanmerkki" + +msgid "Bookmarks" +msgstr "Kirjanmerkit" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Liitä kirjanmerkki" + +#, c-format +msgid "Bookmark %s" +msgstr "Tee kirjanmerkki %s" + +msgid "Former Destinations" +msgstr "Aiemmat kohteet" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Talon numero" + +msgid "Layout" +msgstr "Pohja" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Kartat" + +msgid "Show Satellite Status" +msgstr "Näytä satelliittien tila" + +msgid " Elevation " +msgstr " Korkeus " + +msgid " Azimuth " +msgstr " Atsimuutti " + +msgid "Show NMEA Data" +msgstr "Näytä NMEA-tiedot" + +msgid "car" +msgstr "auto" + +msgid "bike" +msgstr "Pyörän" + +msgid "pedestrian" +msgstr "jalankulkijoiden" + +#, c-format +msgid "Current profile: %s" +msgstr "Nykyinen profiili: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Muuta profiilin: %s" + +msgid "Set as active" +msgstr "Aseta aktiiviseksi" + +msgid "Show Satellite status" +msgstr "Näytä satelliittien tila" + +msgid "Show NMEA data" +msgstr "Näytä NMEA-tiedot" + +msgid "Vehicle" +msgstr "Kulkuneuvo" + +msgid "Rules" +msgstr "Säännöt" + +msgid "Lock on road" +msgstr "Lukitse tiehen" + +msgid "Northing" +msgstr "Pohjoinen ylhäällä" + +msgid "Map follows Vehicle" +msgstr "Kartta seuraa ajoneuvoa" + +msgid "Message" +msgstr "Viesti" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Reitin kuvaus" + +msgid "Height Profile" +msgstr "Korkeusprofiili" + +msgid "Show Locale" +msgstr "Näytä maa-asetusto" + +msgid "About Navit" +msgstr "Tietoja - Navit" + +#. Authors +msgid "By" +msgstr "Tekijä" + +#. Contributors +msgid "And all the Navit Team" +msgstr "sekä koko Navit-tiimi" + +msgid "members and contributors." +msgstr "jäsenet ja osallistujat." + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Karttapiste" + +msgid "Vehicle Position" +msgstr "Ajoneuvon sijainti" + +msgid "Main menu" +msgstr "Päävalikko" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Näytä\n" +"kartta" + +msgid "Settings" +msgstr "Asetukset" + +msgid "Tools" +msgstr "Työkalut" + +msgid "Route" +msgstr "Reitti" + +msgid "About" +msgstr "Tietoja" + +msgid "Actions" +msgstr "Toiminnat" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Lopeta" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Lopeta\n" +"Suunnistus" + +msgid "Display" +msgstr "Näyttö" + +msgid "Fullscreen" +msgstr "Koko ruutu" + +msgid "Window Mode" +msgstr "Ikkunatila" + +msgid "Description" +msgstr "Kuvaus" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "hevonen" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "%s, liity liikenneympyrään" + +#~ msgid "Cursor" +#~ msgstr "Osoitin" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d,%d kilometri" + +#~ msgid " SNR " +#~ msgstr " SNR " + +#~ msgid " PRN " +#~ msgstr " PRN " diff --git a/po/fo.po.in b/po/fo.po.in new file mode 100644 index 0000000..c988105 --- /dev/null +++ b/po/fo.po.in @@ -0,0 +1,1765 @@ +# Faroese translation for navit +# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 +# This file is distributed under the same license as the navit package. +# Cyberish 2009 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-05-18 12:19+0000\n" +"Last-Translator: Cyberish \n" +"Language-Team: Faroese \n" +"Language: fo\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Koyrur frá keldumappuni\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "setur '%s' til '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "nullta" + +msgid "first" +msgstr "fyrsti" + +msgid "second" +msgstr "annar" + +msgid "third" +msgstr "triði" + +msgid "fourth" +msgstr "fjórði" + +msgid "fifth" +msgstr "fimti" + +msgid "sixth" +msgstr "sætti" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "sjeyndi" + +msgid "first exit" +msgstr "fyrsta avkoyring" + +msgid "second exit" +msgstr "onnur avkoyring" + +msgid "third exit" +msgstr "triða avkoyring" + +msgid "fourth exit" +msgstr "fjórða avkoyring" + +msgid "fifth exit" +msgstr "fimta avkoyring" + +msgid "sixth exit" +msgstr "sætta avkoyring" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "um %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metrar" + +#, c-format +msgid "in %d meters" +msgstr "um %d metrar" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d kilometrar" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "um %d.%d kilometrar" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "ein kilometur" +msgstr[1] "%d kilometrar" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "um ein kilometur" +msgstr[1] "um %d kilometrar" + +msgid "exit" +msgstr "avkoyring" + +msgid "into the ramp" +msgstr "uppá rampuna" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%sinná gøtuna %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%sinto the %s%s%sur" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%sinto the %s%s%sa" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%sinná %s%s%si" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%sinná %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "Høgra" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "Vinstra" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "lætt " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "knapt " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "sera knapt " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "ókent " + +msgid "When possible, please turn around" +msgstr "vend um skótast tilber" + +msgid "Enter the roundabout soon" +msgstr "Um lítið bil verður koyrt inní rundkoyringina" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "far so út úr rundkoyring við %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "far út úr rundkoyring við %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "fylg vegnum tær næstu %s" + +msgid "soon" +msgstr "skjótt" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "tak tann %1$s vegin til %2$s" + +#, c-format +msgid "after %i roads" +msgstr "eftir %i vegir" + +msgid "now" +msgstr "nú" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "so tak tann %1$s vegin til %2$s" + +msgid "error" +msgstr "feilur" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "dreya %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "dreya síðan %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Tú hevur nátt tínum ferðamáli %s" + +msgid "then you have reached your destination." +msgstr "tá hevur tú nátt tínum ferðamáli" + +msgid "Position" +msgstr "Stað" + +msgid "Command" +msgstr "Boð" + +msgid "Length" +msgstr "Longd" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Tíð" + +msgid "Destination Length" +msgstr "Longd til ferðamál" + +msgid "Destination Time" +msgstr "Tíð til málið" + +msgid "Roadbook" +msgstr "Vegbók" + +msgid "Set as position" +msgstr "Set sum stað" + +msgid "Set as destination" +msgstr "Set sum ferðamál" + +msgid "Add as bookmark" +msgstr "legg til sum bókamerkið" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Punkt 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "SKíggja krosspunkt : %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Sameindu Arabisku Emuraturnar" + +#. 004 +msgid "Afghanistan" +msgstr "Afganistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua og Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albania" + +#. 051 +msgid "Armenia" +msgstr "Armenia" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Netherlands Antilles" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarktis" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "Amerikanskt Samoa" + +#. 040 +msgid "Austria" +msgstr "Eysturríki" + +#. 036 +msgid "Australia" +msgstr "Avstralia" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Áland" + +#. 031 +msgid "Azerbaijan" +msgstr "Aserbajdsjan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnien-Hercegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesj" + +#. 056 +msgid "Belgium" +msgstr "Belgia" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgaria" + +#. 048 +msgid "Bahrain" +msgstr "Barain" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint Barthelemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei Darussalam" + +#. 068 +msgid "Bolivia" +msgstr "Bolivia" + +#. 076 +msgid "Brazil" +msgstr "Brasilia" + +#. 044 +msgid "Bahamas" +msgstr "Bahamasoyggjar" + +#. 064 +msgid "Bhutan" +msgstr "Butan" + +#. 074 +msgid "Bouvet Island" +msgstr "Bouvet oyggjin" + +#. 072 +msgid "Botswana" +msgstr "Botsvana" + +#. 112 +msgid "Belarus" +msgstr "Hvítarussland" + +#. 084 +msgid "Belize" +msgstr "Belis" + +#. 124 +msgid "Canada" +msgstr "Kanada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Kokosøyggjarnar" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Kongo, tann demokratiska lýðveldið" + +#. 140 +msgid "Central African Republic" +msgstr "Miðafrikalýðveldið" + +#. 178 +msgid "Congo" +msgstr "Kongo" + +#. 756 +msgid "Switzerland" +msgstr "Sveis" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Fílabeinsstrondin" + +#. 184 +msgid "Cook Islands" +msgstr "Cookoyggjarnar" + +#. 152 +msgid "Chile" +msgstr "Kili" + +#. 120 +msgid "Cameroon" +msgstr "Kamerun" + +#. 156 +msgid "China" +msgstr "Kina" + +#. 170 +msgid "Colombia" +msgstr "Kolombia" + +#. 188 +msgid "Costa Rica" +msgstr "Kosta Rika" + +#. 192 +msgid "Cuba" +msgstr "Kuba" + +#. 132 +msgid "Cape Verde" +msgstr "Grønhøvdaoyggjarnar" + +#. 162 +msgid "Christmas Island" +msgstr "Jólaoyggjin" + +#. 196 +msgid "Cyprus" +msgstr "Kýpros" + +#. 203 +msgid "Czech Republic" +msgstr "Kekkia" + +#. 276 +msgid "Germany" +msgstr "Týskland" + +#. 262 +msgid "Djibouti" +msgstr "Djibouti" + +#. 208 +msgid "Denmark" +msgstr "Danmørk" + +#. 212 +msgid "Dominica" +msgstr "Dominika" + +#. 214 +msgid "Dominican Republic" +msgstr "Domingo lýðveldið" + +#. 012 +msgid "Algeria" +msgstr "Algeria" + +#. 218 +msgid "Ecuador" +msgstr "Ekvador" + +#. 233 +msgid "Estonia" +msgstr "Estland" + +#. 818 +msgid "Egypt" +msgstr "Egyptaland" + +#. 732 +msgid "Western Sahara" +msgstr "Vestur Sahara" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Spania" + +#. 231 +msgid "Ethiopia" +msgstr "Etiopia" + +#. 246 +msgid "Finland" +msgstr "Finnland" + +#. 242 +msgid "Fiji" +msgstr "Fiji" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falklandsoyggjarnar" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Mikronesia, tær sameindu statirnir av" + +#. 234 +msgid "Faroe Islands" +msgstr "Føroyar" + +#. 250 +msgid "France" +msgstr "Frakland" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Stórabretland" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Georgia" + +#. 254 +msgid "French Guiana" +msgstr "Fransk Guinea" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Grønland" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Ekvator Guinea" + +#. 300 +msgid "Greece" +msgstr "Grikkaland" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Suður Georgia og Suður Sandwich oyggjarnar" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Gujana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heard- og McDonald-oyggjarnar" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Kroatia" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Ungarn" + +#. 360 +msgid "Indonesia" +msgstr "Indonesia" + +#. 372 +msgid "Ireland" +msgstr "Írland" + +#. 376 +msgid "Israel" +msgstr "Ísrael" + +#. 833 +msgid "Isle of Man" +msgstr "Isle of Man" + +#. 356 +msgid "India" +msgstr "India" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Bretskt-indiska sjóøki" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iran, Islamiska lýveldi av" + +#. 352 +msgid "Iceland" +msgstr "Ísland" + +#. 380 +msgid "Italy" +msgstr "Italia" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jameika" + +#. 400 +msgid "Jordan" +msgstr "Jordan" + +#. 392 +msgid "Japan" +msgstr "Japan" + +#. 404 +msgid "Kenya" +msgstr "Kenja" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirgisia" + +#. 116 +msgid "Cambodia" +msgstr "Kambodja" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Komorooyggjarnar" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Saint Kitts og Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Korea, Tað Demokratiska Folkalýveldi" + +#. 410 +msgid "Korea, Republic of" +msgstr "Korea, Lýveldi" + +#. 414 +msgid "Kuwait" +msgstr "Kuvait" + +#. 136 +msgid "Cayman Islands" +msgstr "Cayman oyggjarnar" + +#. 398 +msgid "Kazakhstan" +msgstr "Kasakstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laos" + +#. 422 +msgid "Lebanon" +msgstr "Libanon" + +#. 662 +msgid "Saint Lucia" +msgstr "Saint Lusia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liktenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberia" + +#. 426 +msgid "Lesotho" +msgstr "Lesoto" + +#. 440 +msgid "Lithuania" +msgstr "Litava" + +#. 442 +msgid "Luxembourg" +msgstr "Luksemborg" + +#. 428 +msgid "Latvia" +msgstr "Lettland" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libyan" + +#. 504 +msgid "Morocco" +msgstr "Marokko" + +#. 492 +msgid "Monaco" +msgstr "Monako" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldovia, Lýveldi" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Saint Martin (Franski parturin)" + +#. 450 +msgid "Madagascar" +msgstr "Madagaskar" + +#. 584 +msgid "Marshall Islands" +msgstr "Marshalloyggjarnar" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Macedonia, tað fyrrverandi Jugoslaviska Lýveldi" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar (Burma)" + +#. 496 +msgid "Mongolia" +msgstr "Mongolia" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Norður Mariana oyggjarnar" + +#. 474 +msgid "Martinique" +msgstr "Martinique" + +#. 478 +msgid "Mauritania" +msgstr "Móritania" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Móritius" + +#. 462 +msgid "Maldives" +msgstr "Maldivuoyggjarnar" + +#. 454 +msgid "Malawi" +msgstr "Malavi" + +#. 484 +msgid "Mexico" +msgstr "Meksiko" + +#. 458 +msgid "Malaysia" +msgstr "Maleisia" + +#. 508 +msgid "Mozambique" +msgstr "Mosambik" + +#. 516 +msgid "Namibia" +msgstr "Namibia" + +#. 540 +msgid "New Caledonia" +msgstr "Ný Kaledonia" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolk oyggjin" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nikaragua" + +#. 528 +msgid "Netherlands" +msgstr "Niðurlond" + +#. 578 +msgid "Norway" +msgstr "Noreg" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Ný Sæland" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Perú" + +#. 258 +msgid "French Polynesia" +msgstr "Fransk Polynesien" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua Nýguinea" + +#. 608 +msgid "Philippines" +msgstr "Filipsoyggjar" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Pólland" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint-Pierre og Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn oyggjar" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestina" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguei" + +#. 634 +msgid "Qatar" +msgstr "Katar" + +#. 638 +msgid "Reunion" +msgstr "Reunion oyggin" + +#. 642 +msgid "Romania" +msgstr "Rumenia" + +#. 688 +msgid "Serbia" +msgstr "Serbia" + +#. 643 +msgid "Russian Federation" +msgstr "Russland" + +#. 646 +msgid "Rwanda" +msgstr "Ruanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Saudi-Arábia" + +#. 090 +msgid "Solomon Islands" +msgstr "Sálomonoyggjarnar" + +#. 690 +msgid "Seychelles" +msgstr "Seyskelloyggjarnar" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Svøríki" + +#. 702 +msgid "Singapore" +msgstr "Singapor" + +#. 654 +msgid "Saint Helena" +msgstr "St. Helena" + +#. 705 +msgid "Slovenia" +msgstr "Slovenia" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard og Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slovakia" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalia" + +#. 740 +msgid "Suriname" +msgstr "Surinam" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Sao Tome og Prinsipi" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Sýria" + +#. 748 +msgid "Swaziland" +msgstr "Svasiland" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turks og Caicos oyggjarnar" + +#. 148 +msgid "Chad" +msgstr "Kjad" + +#. 260 +msgid "French Southern Territories" +msgstr "Fraklands suður øki" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Thailand" + +#. 762 +msgid "Tajikistan" +msgstr "Tadsjikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Timor-Leste" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunesia" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turkaland" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad og Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taivan" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tansania, Sameinda lýveldi av" + +#. 804 +msgid "Ukraine" +msgstr "Ukreina" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "USA umkringliggjandi oyggjar" + +#. 840 +msgid "United States" +msgstr "Sambandsríki Amerika" + +#. 858 +msgid "Uruguay" +msgstr "Uruguei" + +#. 860 +msgid "Uzbekistan" +msgstr "Usbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Vatikanríkið" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Saint Vinsent og Grenadinoyggjar" + +#. 862 +msgid "Venezuela" +msgstr "Venesuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "jomfrúðoyggjarnar, Bretsku" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "jomfrúðoyggjarnar, U.S" + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis- og Futunaoyggjarnar" + +#. 882 +msgid "Samoa" +msgstr "Sámoa" + +#. 887 +msgid "Yemen" +msgstr "Jemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotta" + +#. 710 +msgid "South Africa" +msgstr "Suðurafrika" + +#. 894 +msgid "Zambia" +msgstr "Sambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Simbabvi" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Ókent, knýt is_in tag til hasar býirnar" + +msgid "Car" +msgstr "Bilur" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Land" + +msgid "Postal" +msgstr "Adressa" + +msgid "Town" +msgstr "Bygd" + +msgid "District" +msgstr "Distrikt" + +msgid "Street" +msgstr "Gøta" + +msgid "Number" +msgstr "Nummar" + +msgid "Enter Destination" +msgstr "Slá inn ferðamál" + +msgid "Zip Code" +msgstr "Postnr." + +msgid "City" +msgstr "Býur" + +msgid "District/Township" +msgstr "Distrikt/Kommuna" + +msgid "Map" +msgstr "Kort" + +msgid "Bookmark" +msgstr "Bókamerki" + +msgid "Destination" +msgstr "Ferðamál" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Skíggji" + +msgid "_Route" +msgstr "Ruta" + +msgid "_Former Destinations" +msgstr "Gomul Ferðamál" + +msgid "_Bookmarks" +msgstr "Bókamerki" + +msgid "_Map" +msgstr "Kort" + +msgid "_Layout" +msgstr "Snið" + +msgid "_Projection" +msgstr "Sýning" + +msgid "_Vehicle" +msgstr "Akfar" + +msgid "Zoom_Out" +msgstr "ZoomOut" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "ZoomIn" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Umrokna" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Info" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Stegga Navigering" + +msgid "Test" +msgstr "Roynd" + +msgid "_Quit" +msgstr "_Gevst" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Læs til veg" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Vegbók" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Sjálvvirkið zoom" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Fullur skermur" + +msgid "Data" +msgstr "Dáta" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NE" + +msgid "E" +msgstr "E" + +msgid "SE" +msgstr "SE" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SV" + +msgid "W" +msgstr "V" + +msgid "NW" +msgstr "NV" + +msgid "No" +msgstr "Nei" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Ruta %4.0fkm %02d:%02d Tíðarmeting" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Ruta 0000km 0+00:00 Tíðarmeting" + +msgid "Back to map" +msgstr "Aftur til kort" + +msgid "Main Menu" +msgstr "Høvuðsvalmynd" + +msgid "Help" +msgstr "Hjálp" + +msgid "Back" +msgstr "Aftur" + +msgid "Add Bookmark" +msgstr "Legg bókamerki afturat" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "Áhugaverd støð" + +msgid "View in Browser" +msgstr "Vís í kagara" + +msgid "Streets" +msgstr "Gøtur" + +msgid "House numbers" +msgstr "Húsanummur" + +msgid "View Attributes" +msgstr "Vís eginleikar" + +msgid "View on map" +msgstr "Vís á mappu" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "Bókamerki" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "Bókamerk %s" + +msgid "Former Destinations" +msgstr "Gomul Ferðamál" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Húsanummur" + +msgid "Layout" +msgstr "Snið" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Kort" + +msgid "Show Satellite Status" +msgstr "Vís Satilit Støðu" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "Vís NMEA Dáta" + +msgid "car" +msgstr "bilur" + +msgid "bike" +msgstr "Súkla" + +msgid "pedestrian" +msgstr "fótgangari" + +#, c-format +msgid "Current profile: %s" +msgstr "Núverandi profilur %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Broyt profil til: %s" + +msgid "Set as active" +msgstr "Set sum virkið" + +msgid "Show Satellite status" +msgstr "Vís Satelit støðu" + +msgid "Show NMEA data" +msgstr "Vís NMEA dáta" + +msgid "Vehicle" +msgstr "Akfar" + +msgid "Rules" +msgstr "Reglur" + +msgid "Lock on road" +msgstr "Læs til veg" + +msgid "Northing" +msgstr "Mót norðan" + +msgid "Map follows Vehicle" +msgstr "Kort fylgur akfari" + +msgid "Message" +msgstr "Boð" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Rutulýsing" + +msgid "Height Profile" +msgstr "Hæddar profilur" + +msgid "Show Locale" +msgstr "Staðarlýsing" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Kort Punkt" + +msgid "Vehicle Position" +msgstr "Akfars stað" + +msgid "Main menu" +msgstr "Høvuðsvalmynd" + +msgid "" +"Show\n" +"Map" +msgstr "Vís Kort" + +msgid "Settings" +msgstr "Setingar" + +msgid "Tools" +msgstr "Tól" + +msgid "Route" +msgstr "Ruta" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "Gerðir" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Enda" + +msgid "" +"Stop\n" +"Navigation" +msgstr "Enda navigering" + +msgid "Display" +msgstr "Skíggji" + +msgid "Fullscreen" +msgstr "Fullur skermur" + +msgid "Window Mode" +msgstr "Vindeyga støða" + +msgid "Description" +msgstr "Frágreiðing" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "hestur" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "um %s verður koyrt inní rundkoyringina" + +#~ msgid "Cursor" +#~ msgstr "Markør" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d kilometur" + +#~ msgid " SNR " +#~ msgstr " SNR " + +#~ msgid " PRN " +#~ msgstr " PRN " diff --git a/po/fr.po.in b/po/fr.po.in new file mode 100644 index 0000000..63dfdaa --- /dev/null +++ b/po/fr.po.in @@ -0,0 +1,1774 @@ +# French translations for navit +# Copyright (C) 2007, 2008 The Navit Team +# This file is distributed under the same license as the navit package. +# 'KaZeR' +# 'Nekohayo' +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-06-18 19:16+0000\n" +"Last-Translator: yannick56 \n" +"Language-Team: KaZeR \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Execution depuis le dossier d'origine\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "'%s' mis à '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "zéroième" + +msgid "first" +msgstr "première" + +msgid "second" +msgstr "deuxième" + +msgid "third" +msgstr "troisième" + +msgid "fourth" +msgstr "quatrième" + +msgid "fifth" +msgstr "cinquième" + +msgid "sixth" +msgstr "sixième" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "zéroième sortie" + +msgid "first exit" +msgstr "première sortie" + +msgid "second exit" +msgstr "deuxième sortie" + +msgid "third exit" +msgstr "troisième sortie" + +msgid "fourth exit" +msgstr "quatrième sortie" + +msgid "fifth exit" +msgstr "cinquième sortie" + +msgid "sixth exit" +msgstr "sixième sortie" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "dans %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d mètres" + +#, c-format +msgid "in %d meters" +msgstr "dans %d mètres" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d kilomètres" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "dans %d.%d kilomètres" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "un kilomètre" +msgstr[1] "%d kilomètres" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "dans un kilomètre" +msgstr[1] "dans %d kilomètres" + +msgid "exit" +msgstr "sortie" + +msgid "into the ramp" +msgstr "vers la sortie" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%ssur %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%ssur le %s%s%s|male form" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%ssur la %s%s%s|female form" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%ssur l'%s%s%s|neutral form" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%svers la %s" + +# tournez à droite +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "à droite" + +# tournez à gauche +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "à gauche" + +# utilisé pour les changements de voie pour les sorties? +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "légèrement " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "fortement " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "très fortement " + +# attention à l'espace à la fin +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "inconnu " + +msgid "When possible, please turn around" +msgstr "Dès que possible, faites demi-tour" + +msgid "Enter the roundabout soon" +msgstr "Préparez vous à vous engager dans le rond-point" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "puis sortez du rond-point à la %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Sortez du rond-point à la %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Suivez la route sur %s" + +msgid "soon" +msgstr "bientôt" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Prenez la %1$s route vers la %2$s" + +#, c-format +msgid "after %i roads" +msgstr "après %i rues" + +msgid "now" +msgstr "maintenant" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "puis prenez la %1$s route à %2$s" + +msgid "error" +msgstr "erreur" + +# espace important après le 2 +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "%3$s, tournez %1$s%2$s %4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "puis tournez %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Vous êtes arrivé à destination : %s" + +msgid "then you have reached your destination." +msgstr "ensuite vous serez à destination" + +msgid "Position" +msgstr "Position" + +msgid "Command" +msgstr "Commande" + +msgid "Length" +msgstr "Distance" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Durée" + +msgid "Destination Length" +msgstr "Distance à parcourir" + +msgid "Destination Time" +msgstr "Temps de parcours" + +msgid "Roadbook" +msgstr "Carnet de route" + +msgid "Set as position" +msgstr "Définir comme position" + +msgid "Set as destination" +msgstr "Définir comme destination" + +msgid "Add as bookmark" +msgstr "Ajouter aux favoris" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Point 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Coord. à l'écran : %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorre" + +#. 784 +msgid "United Arab Emirates" +msgstr "Émirats Arabes Unis" + +#. 004 +msgid "Afghanistan" +msgstr "Afghanistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua et Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguille" + +#. 008 +msgid "Albania" +msgstr "Albanie" + +#. 051 +msgid "Armenia" +msgstr "Arménie" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Antilles Néérlandaises" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarctique" + +#. 032 +msgid "Argentina" +msgstr "Argentine" + +#. 016 +msgid "American Samoa" +msgstr "Samoa américaines" + +#. 040 +msgid "Austria" +msgstr "Autriche" + +#. 036 +msgid "Australia" +msgstr "Australie" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Åland, îles" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbaïdjan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnie Herzégovine" + +#. 052 +msgid "Barbados" +msgstr "Barbades" + +#. 050 +msgid "Bangladesh" +msgstr "Bengladesh" + +#. 056 +msgid "Belgium" +msgstr "Belgique" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgarie" + +#. 048 +msgid "Bahrain" +msgstr "Bahreïn" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint Barthelemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermudes" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei Darussalam" + +#. 068 +msgid "Bolivia" +msgstr "Bolivie" + +#. 076 +msgid "Brazil" +msgstr "Brésil" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "Bhoutan" + +#. 074 +msgid "Bouvet Island" +msgstr "Îles Bouvet" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Biélorussie" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Canada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Iles Cocos" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Répulique démocratique du Congo" + +#. 140 +msgid "Central African Republic" +msgstr "République Centrafricaine" + +#. 178 +msgid "Congo" +msgstr "Congo" + +#. 756 +msgid "Switzerland" +msgstr "Suisse" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Cote d'Ivoire" + +#. 184 +msgid "Cook Islands" +msgstr "Îles Cook" + +#. 152 +msgid "Chile" +msgstr "Chili" + +#. 120 +msgid "Cameroon" +msgstr "Cameroun" + +#. 156 +msgid "China" +msgstr "Chine" + +#. 170 +msgid "Colombia" +msgstr "Colombie" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Cuba" + +#. 132 +msgid "Cape Verde" +msgstr "Cap Vert" + +#. 162 +msgid "Christmas Island" +msgstr "Île Christmas" + +#. 196 +msgid "Cyprus" +msgstr "Chypre" + +#. 203 +msgid "Czech Republic" +msgstr "République Tchèque" + +#. 276 +msgid "Germany" +msgstr "Allemagne" + +#. 262 +msgid "Djibouti" +msgstr "Djibouti" + +#. 208 +msgid "Denmark" +msgstr "Danemark" + +#. 212 +msgid "Dominica" +msgstr "Dominique" + +#. 214 +msgid "Dominican Republic" +msgstr "République Dominicaine" + +#. 012 +msgid "Algeria" +msgstr "Algérie" + +#. 218 +msgid "Ecuador" +msgstr "Equateur" + +#. 233 +msgid "Estonia" +msgstr "Estonie" + +#. 818 +msgid "Egypt" +msgstr "Égypte" + +#. 732 +msgid "Western Sahara" +msgstr "Sahara occidental" + +#. 232 +msgid "Eritrea" +msgstr "Erythrée" + +#. 724 +msgid "Spain" +msgstr "Espagne" + +#. 231 +msgid "Ethiopia" +msgstr "Ethiopie" + +#. 246 +msgid "Finland" +msgstr "Finlande" + +#. 242 +msgid "Fiji" +msgstr "Fiji" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Les Malouines (les Malvinas)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Micronésie, États fédérés de" + +#. 234 +msgid "Faroe Islands" +msgstr "Îles Feroe" + +#. 250 +msgid "France" +msgstr "France" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Royaume-Uni" + +#. 308 +msgid "Grenada" +msgstr "Grenade" + +#. 268 +msgid "Georgia" +msgstr "Géorgie" + +#. 254 +msgid "French Guiana" +msgstr "Guyanne française" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Groenland" + +#. 270 +msgid "Gambia" +msgstr "Gambie" + +#. 324 +msgid "Guinea" +msgstr "Guinée" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Guinée équatoriale" + +#. 300 +msgid "Greece" +msgstr "Grèce" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Géorgie du Sud et Îles Sandwich du Sud" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinée-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyane" + +#. 344 +msgid "Hong Kong" +msgstr "Hong-kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heard, Île et McDonald, Îles" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Croatie" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Hongrie" + +#. 360 +msgid "Indonesia" +msgstr "Indonésie" + +#. 372 +msgid "Ireland" +msgstr "Irlande" + +#. 376 +msgid "Israel" +msgstr "Israël" + +#. 833 +msgid "Isle of Man" +msgstr "Ile de Man" + +#. 356 +msgid "India" +msgstr "Inde" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Océan Indien, Territoire britannique de l'" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iran, République islamique d'" + +#. 352 +msgid "Iceland" +msgstr "Islande" + +#. 380 +msgid "Italy" +msgstr "Italie" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaique" + +#. 400 +msgid "Jordan" +msgstr "Jordanie" + +#. 392 +msgid "Japan" +msgstr "Japon" + +#. 404 +msgid "Kenya" +msgstr "Kenya" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirghizstan" + +#. 116 +msgid "Cambodia" +msgstr "Cambodge" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Comores, Les" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Saint Kitts et Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Corée, République populaire démocratique de" + +#. 410 +msgid "Korea, Republic of" +msgstr "Corée, République de" + +#. 414 +msgid "Kuwait" +msgstr "Koweït" + +#. 136 +msgid "Cayman Islands" +msgstr "Îles Cayman" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazakhstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laos" + +#. 422 +msgid "Lebanon" +msgstr "Liban" + +#. 662 +msgid "Saint Lucia" +msgstr "Sainte-Lucie" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Libéria" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Lithuanie" + +#. 442 +msgid "Luxembourg" +msgstr "Luxembourg" + +#. 428 +msgid "Latvia" +msgstr "Lettonie" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libye" + +#. 504 +msgid "Morocco" +msgstr "Maroc" + +#. 492 +msgid "Monaco" +msgstr "Monaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldova, République de" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Saint Martin" + +#. 450 +msgid "Madagascar" +msgstr "Madagascar" + +#. 584 +msgid "Marshall Islands" +msgstr "Îles Marshall" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Macédoine" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongolie" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Îles Mariannes du Nord" + +#. 474 +msgid "Martinique" +msgstr "Martinique" + +#. 478 +msgid "Mauritania" +msgstr "Mauritanie" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malte" + +#. 480 +msgid "Mauritius" +msgstr "Iles Maurice" + +#. 462 +msgid "Maldives" +msgstr "Maldives" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mexique" + +#. 458 +msgid "Malaysia" +msgstr "Malaisie" + +#. 508 +msgid "Mozambique" +msgstr "Mozambique" + +#. 516 +msgid "Namibia" +msgstr "Namibie" + +#. 540 +msgid "New Caledonia" +msgstr "Nouvelle Calédonie" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Île Norfolk" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nicaragua" + +#. 528 +msgid "Netherlands" +msgstr "Pays-Bas" + +#. 578 +msgid "Norway" +msgstr "Norvège" + +#. 524 +msgid "Nepal" +msgstr "Népal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Nouvelle-Zélande" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Pérou" + +#. 258 +msgid "French Polynesia" +msgstr "Polynésie Française" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papouasie-Nouvelle-Guinée" + +#. 608 +msgid "Philippines" +msgstr "Philippines" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Pologne" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint-Pierre-et-Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Îles Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestine" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Qatar" + +#. 638 +msgid "Reunion" +msgstr "Réunion" + +#. 642 +msgid "Romania" +msgstr "Roumanie" + +#. 688 +msgid "Serbia" +msgstr "Serbie" + +#. 643 +msgid "Russian Federation" +msgstr "Russie" + +#. 646 +msgid "Rwanda" +msgstr "Rwanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Arabie Saoudite" + +#. 090 +msgid "Solomon Islands" +msgstr "Îles Solomon" + +#. 690 +msgid "Seychelles" +msgstr "Seychelles" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Suède" + +#. 702 +msgid "Singapore" +msgstr "Singapour" + +#. 654 +msgid "Saint Helena" +msgstr "Sainte Hélène" + +#. 705 +msgid "Slovenia" +msgstr "Slovènie" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard et île Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slovaquie" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "Saint-Marin" + +#. 686 +msgid "Senegal" +msgstr "Sénégal" + +#. 706 +msgid "Somalia" +msgstr "Somalie" + +#. 740 +msgid "Suriname" +msgstr "Surinam" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Sao Tomé-et-Principe" + +#. 222 +msgid "El Salvador" +msgstr "Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Syrie" + +#. 748 +msgid "Swaziland" +msgstr "Souaziland" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Îles Turques et Caïques" + +#. 148 +msgid "Chad" +msgstr "Tchad" + +#. 260 +msgid "French Southern Territories" +msgstr "Terres australes françaises" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Thailande" + +#. 762 +msgid "Tajikistan" +msgstr "Tajikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Timor-Leste" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunisie" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turquie" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinité et Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan, province de la Chine" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzanie, République unie de" + +#. 804 +msgid "Ukraine" +msgstr "Ukraine" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Îles périphériques mineures des Etats-Unis" + +#. 840 +msgid "United States" +msgstr "États-Unis" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Ouzbékistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Saint-Siège (état de la cité du Vatican)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Saint-Vincent-et-les Grenadines" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Îles Vierges britanniques" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Îles Vierges des États-Unis" + +#. 704 +msgid "Viet Nam" +msgstr "Viêt Nam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis et Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Yemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Afrique du Sud" + +#. 894 +msgid "Zambia" +msgstr "Zambie" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "Inconnu, ajoutez des étiquettes d'is_in à ces villes" + +msgid "Car" +msgstr "Voiture" + +msgid "Iso2" +msgstr "iso2" + +msgid "Iso3" +msgstr "iso3" + +msgid "Country" +msgstr "Pays" + +msgid "Postal" +msgstr "Code postal" + +msgid "Town" +msgstr "Ville" + +msgid "District" +msgstr "Quartier" + +msgid "Street" +msgstr "Rue" + +msgid "Number" +msgstr "Numéro" + +msgid "Enter Destination" +msgstr "Entrez une destination" + +msgid "Zip Code" +msgstr "Code postal" + +msgid "City" +msgstr "Ville" + +msgid "District/Township" +msgstr "Canton" + +msgid "Map" +msgstr "Carte" + +msgid "Bookmark" +msgstr "Favoris" + +msgid "Destination" +msgstr "Destination" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Affichage" + +msgid "_Route" +msgstr "Itinéraire" + +msgid "_Former Destinations" +msgstr "Destinations précédentes" + +msgid "_Bookmarks" +msgstr "Favoris" + +msgid "_Map" +msgstr "Carte" + +msgid "_Layout" +msgstr "Thème" + +msgid "_Projection" +msgstr "Projection" + +msgid "_Vehicle" +msgstr "Véhicule" + +msgid "Zoom_Out" +msgstr "Zoom arrière" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Zoom avant" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Recalculer" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Info" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Annuler le trajet" + +msgid "Test" +msgstr "Test" + +msgid "_Quit" +msgstr "_Quitter" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Coller à la route" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Carnet de route" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Zoom automatique" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Plein écran" + +msgid "Data" +msgstr "Données" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NE" + +msgid "E" +msgstr "E" + +msgid "SE" +msgstr "SE" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SO" + +msgid "W" +msgstr "O" + +msgid "NW" +msgstr "NO" + +msgid "No" +msgstr "Non" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "Autre" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Trajet restant %4.0f km heure d'arrivée estimée %02d:%02d" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Trajet 0000 km temps estimé 0+00:00" + +msgid "Back to map" +msgstr "Retourner à la carte" + +msgid "Main Menu" +msgstr "Menu principal" + +msgid "Help" +msgstr "Aide" + +msgid "Back" +msgstr "Retour" + +msgid "Add Bookmark" +msgstr "Ajouter au favoris" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "Ajouter un dossier de signets" + +msgid "Rename" +msgstr "Renommer" + +msgid "POIs" +msgstr "Points d'intérêt" + +msgid "View in Browser" +msgstr "Voir dans le navigateur" + +msgid "Streets" +msgstr "Rues" + +msgid "House numbers" +msgstr "Numéros de maison" + +msgid "View Attributes" +msgstr "Voir les attributs" + +msgid "View on map" +msgstr "Voir sur la carte" + +msgid "Cut Bookmark" +msgstr "Couper le signet" + +msgid "Copy Bookmark" +msgstr "Copier le signet" + +msgid "Rename Bookmark" +msgstr "Renommer le signet" + +msgid "Paste Bookmark" +msgstr "Insérer le signet" + +msgid "Delete Bookmark" +msgstr "Supprimer le signet" + +msgid "Bookmarks" +msgstr "Favoris" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Insérer le signet" + +#, c-format +msgid "Bookmark %s" +msgstr "Ajouter %s aux favoris" + +msgid "Former Destinations" +msgstr "Destinations précédentes" + +msgid "- No former destinations available -" +msgstr "- Pas de destinations précedentes -" + +msgid "House number" +msgstr "Numéro de maison" + +msgid "Layout" +msgstr "Thème" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Cartes" + +msgid "Show Satellite Status" +msgstr "Afficher les infos satellite" + +msgid " Elevation " +msgstr " Elévation " + +msgid " Azimuth " +msgstr " Azimuth " + +msgid "Show NMEA Data" +msgstr "Afficher les données NMEA" + +msgid "car" +msgstr "voiture" + +msgid "bike" +msgstr "vélo" + +msgid "pedestrian" +msgstr "piéton" + +#, c-format +msgid "Current profile: %s" +msgstr "Profil actuel : %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Définir le profil à : %s" + +msgid "Set as active" +msgstr "Activer" + +msgid "Show Satellite status" +msgstr "Afficher les infos satellite" + +msgid "Show NMEA data" +msgstr "Afficher les données NMEA" + +msgid "Vehicle" +msgstr "Véhicule" + +msgid "Rules" +msgstr "Règles" + +msgid "Lock on road" +msgstr "Coller à la route" + +msgid "Northing" +msgstr "Orientation toujours au Nord" + +msgid "Map follows Vehicle" +msgstr "La carte suit le véhicule" + +msgid "Message" +msgstr "Message" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Description de la route" + +msgid "Height Profile" +msgstr "Profil de hauteur" + +msgid "Show Locale" +msgstr "Afficher la locale" + +msgid "About Navit" +msgstr "A propos de Navit" + +#. Authors +msgid "By" +msgstr "par" + +#. Contributors +msgid "And all the Navit Team" +msgstr "Et tous les membres du projet Navit" + +msgid "members and contributors." +msgstr "membres et contributeurs" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "Attention! Radar!" + +#. warning told +msgid "Please decrease your speed" +msgstr "Veuillez ralentir" + +msgid "Map Point" +msgstr "Point sur la carte" + +msgid "Vehicle Position" +msgstr "Position du véhicule" + +msgid "Main menu" +msgstr "Menu principal" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Afficher\n" +"la carte" + +msgid "Settings" +msgstr "Configuration" + +msgid "Tools" +msgstr "Outils" + +msgid "Route" +msgstr "Itinéraire" + +msgid "About" +msgstr "À propos" + +msgid "Actions" +msgstr "Actions" + +msgid "" +"Former\n" +"Destinations" +msgstr "" +"Destinations\n" +"précédentes" + +msgid "Quit" +msgstr "Quitter" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Arrêter\n" +"La navigation" + +msgid "Display" +msgstr "Affichage" + +msgid "Fullscreen" +msgstr "Plein écran" + +msgid "Window Mode" +msgstr "Mode fenêtré" + +msgid "Description" +msgstr "Description" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "cheval" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "Dans %s, engagez vous dans le rond-point" + +#~ msgid "Cursor" +#~ msgstr "Curseur" + +#~ msgid " SNR " +#~ msgstr " Rapport Signal/Bruit " + +#~ msgid " PRN " +#~ msgstr " PRN " diff --git a/po/fr_CH.po.in b/po/fr_CH.po.in new file mode 100644 index 0000000..de01821 --- /dev/null +++ b/po/fr_CH.po.in @@ -0,0 +1,1772 @@ +# French/Switzerland translations for navit +# Copyright (C) 2007-2010 The Navit Team +# This file is distributed under the same license as the navit package. +# 'KaZeR' +# 'Nekohayo' +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-02-06 10:37+0000\n" +"Last-Translator: KaZeR \n" +"Language-Team: KaZeR \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Execution depuis le dossier d'origine\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "'%s' mis à '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "zéroième" + +msgid "first" +msgstr "première" + +msgid "second" +msgstr "deuxième" + +msgid "third" +msgstr "troisième" + +msgid "fourth" +msgstr "quatrième" + +msgid "fifth" +msgstr "cinquième" + +msgid "sixth" +msgstr "sixième" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "la zéroième sortie" + +msgid "first exit" +msgstr "la première sortie" + +msgid "second exit" +msgstr "la deuxième sortie" + +msgid "third exit" +msgstr "la troisième sortie" + +msgid "fourth exit" +msgstr "la quatrième sortie" + +msgid "fifth exit" +msgstr "la cinquième sortie" + +msgid "sixth exit" +msgstr "la sixième sortie" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "dans %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d mètres" + +#, c-format +msgid "in %d meters" +msgstr "dans %d mètres" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d kilomètres" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "dans %d.%d kilomètres" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "un kilomètre" +msgstr[1] "%d kilomètres" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "dans un kilomètre" +msgstr[1] "dans %d kilomètres" + +msgid "exit" +msgstr "sortie" + +msgid "into the ramp" +msgstr "vers la sortie" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%ssur %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%ssur le %s%s%s|male form" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%ssur la %s%s%s|female form" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%ssur l'%s%s%s|neutral form" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%svers la %s" + +# tournez à droite +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "à droite" + +# tournez à gauche +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "à gauche" + +# utilisé pour les changements de voie pour les sorties? +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "légèrement " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "fortement " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "très fortement " + +# attention à l'espace à la fin +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "inconnu " + +msgid "When possible, please turn around" +msgstr "Dès que possible, faites demi-tour" + +msgid "Enter the roundabout soon" +msgstr "Préparez vous à vous engager dans le rond-point" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "puis sortez du rond-point à la %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Sortez du rond-point à la %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Suivez la route sur %s" + +msgid "soon" +msgstr "bientôt" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Prenez la %1$s route vers la %2$s" + +#, c-format +msgid "after %i roads" +msgstr "après %i rues" + +msgid "now" +msgstr "maintenant" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "puis prenez la %1$s route à %2$s" + +msgid "error" +msgstr "erreur" + +# espace important après le 2 +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "%3$s, tournez %1$s%2$s %4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "puis tournez %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Vous êtes arrivé à destination : %s" + +msgid "then you have reached your destination." +msgstr "ensuite vous serez à destination" + +msgid "Position" +msgstr "Position" + +msgid "Command" +msgstr "Commande" + +msgid "Length" +msgstr "Distance" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Durée" + +msgid "Destination Length" +msgstr "Distance à parcourir" + +msgid "Destination Time" +msgstr "Temps de parcours" + +msgid "Roadbook" +msgstr "Carnet de route" + +msgid "Set as position" +msgstr "Définir comme position" + +msgid "Set as destination" +msgstr "Définir comme destination" + +msgid "Add as bookmark" +msgstr "Ajouter aux favoris" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Point 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Coord. à l'écran : %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorre" + +#. 784 +msgid "United Arab Emirates" +msgstr "Émirats Arabes Unis" + +#. 004 +msgid "Afghanistan" +msgstr "Afghanistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua et Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguille" + +#. 008 +msgid "Albania" +msgstr "Albanie" + +#. 051 +msgid "Armenia" +msgstr "Arménie" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Antilles Néérlandaises" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarctique" + +#. 032 +msgid "Argentina" +msgstr "Argentine" + +#. 016 +msgid "American Samoa" +msgstr "Samoa américaines" + +#. 040 +msgid "Austria" +msgstr "Autriche" + +#. 036 +msgid "Australia" +msgstr "Australie" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Åland, îles" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbaïdjan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnie Herzégovine" + +#. 052 +msgid "Barbados" +msgstr "Barbades" + +#. 050 +msgid "Bangladesh" +msgstr "Bengladesh" + +#. 056 +msgid "Belgium" +msgstr "Belgique" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgarie" + +#. 048 +msgid "Bahrain" +msgstr "Bahreïn" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint Barthelemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermudes" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei Darussalam" + +#. 068 +msgid "Bolivia" +msgstr "Bolivie" + +#. 076 +msgid "Brazil" +msgstr "Brésil" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "Bhoutan" + +#. 074 +msgid "Bouvet Island" +msgstr "Îles Bouvet" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Biélorussie" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Canada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Iles Cocos" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Répulique démocratique du Congo" + +#. 140 +msgid "Central African Republic" +msgstr "République Centrafricaine" + +#. 178 +msgid "Congo" +msgstr "Congo" + +#. 756 +msgid "Switzerland" +msgstr "Suisse" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Cote d'Ivoire" + +#. 184 +msgid "Cook Islands" +msgstr "Îles Cook" + +#. 152 +msgid "Chile" +msgstr "Chili" + +#. 120 +msgid "Cameroon" +msgstr "Cameroun" + +#. 156 +msgid "China" +msgstr "Chine" + +#. 170 +msgid "Colombia" +msgstr "Colombie" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Cuba" + +#. 132 +msgid "Cape Verde" +msgstr "Cap Vert" + +#. 162 +msgid "Christmas Island" +msgstr "Île Christmas" + +#. 196 +msgid "Cyprus" +msgstr "Chypre" + +#. 203 +msgid "Czech Republic" +msgstr "République Tchèque" + +#. 276 +msgid "Germany" +msgstr "Allemagne" + +#. 262 +msgid "Djibouti" +msgstr "Djibouti" + +#. 208 +msgid "Denmark" +msgstr "Danemark" + +#. 212 +msgid "Dominica" +msgstr "Dominique" + +#. 214 +msgid "Dominican Republic" +msgstr "République Dominicaine" + +#. 012 +msgid "Algeria" +msgstr "Algérie" + +#. 218 +msgid "Ecuador" +msgstr "Equateur" + +#. 233 +msgid "Estonia" +msgstr "Estonie" + +#. 818 +msgid "Egypt" +msgstr "Égypte" + +#. 732 +msgid "Western Sahara" +msgstr "Sahara occidental" + +#. 232 +msgid "Eritrea" +msgstr "Erythrée" + +#. 724 +msgid "Spain" +msgstr "Espagne" + +#. 231 +msgid "Ethiopia" +msgstr "Ethiopie" + +#. 246 +msgid "Finland" +msgstr "Finlande" + +#. 242 +msgid "Fiji" +msgstr "Fiji" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Les Malouines (les Malvinas)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Micronésie, États fédérés de" + +#. 234 +msgid "Faroe Islands" +msgstr "Îles Feroe" + +#. 250 +msgid "France" +msgstr "France" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Royaume-Uni" + +#. 308 +msgid "Grenada" +msgstr "Grenade" + +#. 268 +msgid "Georgia" +msgstr "Géorgie" + +#. 254 +msgid "French Guiana" +msgstr "Guyanne française" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Groenland" + +#. 270 +msgid "Gambia" +msgstr "Gambie" + +#. 324 +msgid "Guinea" +msgstr "Guinée" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Guinée équatoriale" + +#. 300 +msgid "Greece" +msgstr "Grèce" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Géorgie du Sud et Îles Sandwich du Sud" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinée-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyane" + +#. 344 +msgid "Hong Kong" +msgstr "Hong-kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heard, Île et McDonald, Îles" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Croatie" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Hongrie" + +#. 360 +msgid "Indonesia" +msgstr "Indonésie" + +#. 372 +msgid "Ireland" +msgstr "Irlande" + +#. 376 +msgid "Israel" +msgstr "Israël" + +#. 833 +msgid "Isle of Man" +msgstr "Ile de Man" + +#. 356 +msgid "India" +msgstr "Inde" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Océan Indien, Territoire britannique de l'" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iran, République islamique d'" + +#. 352 +msgid "Iceland" +msgstr "Islande" + +#. 380 +msgid "Italy" +msgstr "Italie" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaique" + +#. 400 +msgid "Jordan" +msgstr "Jordanie" + +#. 392 +msgid "Japan" +msgstr "Japon" + +#. 404 +msgid "Kenya" +msgstr "Kenya" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirghizstan" + +#. 116 +msgid "Cambodia" +msgstr "Cambodge" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Comores, Les" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Saint Kitts et Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Corée, République populaire démocratique de" + +#. 410 +msgid "Korea, Republic of" +msgstr "Corée, République de" + +#. 414 +msgid "Kuwait" +msgstr "Koweït" + +#. 136 +msgid "Cayman Islands" +msgstr "Îles Cayman" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazakhstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laos" + +#. 422 +msgid "Lebanon" +msgstr "Liban" + +#. 662 +msgid "Saint Lucia" +msgstr "Sainte-Lucie" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Libéria" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Lithuanie" + +#. 442 +msgid "Luxembourg" +msgstr "Luxembourg" + +#. 428 +msgid "Latvia" +msgstr "Lettonie" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libye" + +#. 504 +msgid "Morocco" +msgstr "Maroc" + +#. 492 +msgid "Monaco" +msgstr "Monaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldova, République de" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Saint Martin" + +#. 450 +msgid "Madagascar" +msgstr "Madagascar" + +#. 584 +msgid "Marshall Islands" +msgstr "Îles Marshall" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Macédoine" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongolie" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Îles Mariannes du Nord" + +#. 474 +msgid "Martinique" +msgstr "Martinique" + +#. 478 +msgid "Mauritania" +msgstr "Mauritanie" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malte" + +#. 480 +msgid "Mauritius" +msgstr "Iles Maurice" + +#. 462 +msgid "Maldives" +msgstr "Maldives" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mexique" + +#. 458 +msgid "Malaysia" +msgstr "Malaisie" + +#. 508 +msgid "Mozambique" +msgstr "Mozambique" + +#. 516 +msgid "Namibia" +msgstr "Namibie" + +#. 540 +msgid "New Caledonia" +msgstr "Nouvelle Calédonie" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Île Norfolk" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nicaragua" + +#. 528 +msgid "Netherlands" +msgstr "Pays-Bas" + +#. 578 +msgid "Norway" +msgstr "Norvège" + +#. 524 +msgid "Nepal" +msgstr "Népal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Nouvelle-Zélande" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Pérou" + +#. 258 +msgid "French Polynesia" +msgstr "Polynésie Française" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papouasie-Nouvelle-Guinée" + +#. 608 +msgid "Philippines" +msgstr "Philippines" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Pologne" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint-Pierre-et-Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Îles Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestine" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Qatar" + +#. 638 +msgid "Reunion" +msgstr "Réunion" + +#. 642 +msgid "Romania" +msgstr "Roumanie" + +#. 688 +msgid "Serbia" +msgstr "Serbie" + +#. 643 +msgid "Russian Federation" +msgstr "Russie" + +#. 646 +msgid "Rwanda" +msgstr "Rwanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Arabie Saoudite" + +#. 090 +msgid "Solomon Islands" +msgstr "Îles Solomon" + +#. 690 +msgid "Seychelles" +msgstr "Seychelles" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Suède" + +#. 702 +msgid "Singapore" +msgstr "Singapour" + +#. 654 +msgid "Saint Helena" +msgstr "Sainte Hélène" + +#. 705 +msgid "Slovenia" +msgstr "Slovènie" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard et île Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slovaquie" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "Saint-Marin" + +#. 686 +msgid "Senegal" +msgstr "Sénégal" + +#. 706 +msgid "Somalia" +msgstr "Somalie" + +#. 740 +msgid "Suriname" +msgstr "Surinam" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Sao Tomé-et-Principe" + +#. 222 +msgid "El Salvador" +msgstr "Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Syrie" + +#. 748 +msgid "Swaziland" +msgstr "Souaziland" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Îles Turques et Caïques" + +#. 148 +msgid "Chad" +msgstr "Tchad" + +#. 260 +msgid "French Southern Territories" +msgstr "Terres australes françaises" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Thailande" + +#. 762 +msgid "Tajikistan" +msgstr "Tajikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Timor-Leste" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunisie" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turquie" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinité et Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan, province de la Chine" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzanie, République unie de" + +#. 804 +msgid "Ukraine" +msgstr "Ukraine" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Îles périphériques mineures des Etats-Unis" + +#. 840 +msgid "United States" +msgstr "États-Unis" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Ouzbékistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Saint-Siège (état de la cité du Vatican)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Saint-Vincent-et-les Grenadines" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Îles Vierges britanniques" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Îles Vierges des États-Unis" + +#. 704 +msgid "Viet Nam" +msgstr "Viêt Nam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis et Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Yemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Afrique du Sud" + +#. 894 +msgid "Zambia" +msgstr "Zambie" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "Inconnu, ajoutez des étiquettes d'is_in à ces villes" + +msgid "Car" +msgstr "Voiture" + +msgid "Iso2" +msgstr "iso2" + +msgid "Iso3" +msgstr "iso3" + +msgid "Country" +msgstr "Pays" + +msgid "Postal" +msgstr "Code postal" + +msgid "Town" +msgstr "Ville" + +msgid "District" +msgstr "Quartier" + +msgid "Street" +msgstr "Rue" + +msgid "Number" +msgstr "Numéro" + +msgid "Enter Destination" +msgstr "Entrez une destination" + +msgid "Zip Code" +msgstr "Code postal" + +msgid "City" +msgstr "Ville" + +msgid "District/Township" +msgstr "Canton" + +msgid "Map" +msgstr "Carte" + +msgid "Bookmark" +msgstr "Favoris" + +msgid "Destination" +msgstr "Destination" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Affichage" + +msgid "_Route" +msgstr "Itinéraire" + +msgid "_Former Destinations" +msgstr "Destinations précédentes" + +msgid "_Bookmarks" +msgstr "Favoris" + +msgid "_Map" +msgstr "Carte" + +msgid "_Layout" +msgstr "Thème" + +msgid "_Projection" +msgstr "Projection" + +msgid "_Vehicle" +msgstr "Véhicule" + +msgid "Zoom_Out" +msgstr "Zoom arrière" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Zoom avant" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Recalculer" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Info" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Annuler le trajet" + +msgid "Test" +msgstr "Test" + +msgid "_Quit" +msgstr "_Quitter" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Coller à la route" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Carnet de route" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Zoom automatique" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Plein écran" + +msgid "Data" +msgstr "Données" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NE" + +msgid "E" +msgstr "E" + +msgid "SE" +msgstr "SE" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SO" + +msgid "W" +msgstr "O" + +msgid "NW" +msgstr "NO" + +msgid "No" +msgstr "Non" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "Autre" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Trajet restant %4.0f km heure d'arrivée estimée %02d:%02d" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Trajet 0000 km temps estimé 0+00:00" + +msgid "Back to map" +msgstr "Retourner à la carte" + +msgid "Main Menu" +msgstr "Menu principal" + +msgid "Help" +msgstr "Aide" + +msgid "Back" +msgstr "Retour" + +msgid "Add Bookmark" +msgstr "Ajouter au favoris" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "Points d'intérêt" + +msgid "View in Browser" +msgstr "Voir dans le navigateur" + +msgid "Streets" +msgstr "Rues" + +msgid "House numbers" +msgstr "Numéros de maison" + +msgid "View Attributes" +msgstr "Voir les attributs" + +msgid "View on map" +msgstr "Voir sur la carte" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "Favoris" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "Ajouter %s aux favoris" + +msgid "Former Destinations" +msgstr "Destinations précédentes" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Numéro de maison" + +msgid "Layout" +msgstr "Thème" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Cartes" + +msgid "Show Satellite Status" +msgstr "Afficher les infos satellite" + +msgid " Elevation " +msgstr " Elévation " + +msgid " Azimuth " +msgstr " Azimuth " + +msgid "Show NMEA Data" +msgstr "Afficher les données NMEA" + +msgid "car" +msgstr "voiture" + +msgid "bike" +msgstr "vélo" + +msgid "pedestrian" +msgstr "piéton" + +#, c-format +msgid "Current profile: %s" +msgstr "Profil actuel : %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Définir le profil à : %s" + +msgid "Set as active" +msgstr "Activer" + +msgid "Show Satellite status" +msgstr "Afficher les infos satellite" + +msgid "Show NMEA data" +msgstr "Afficher les données NMEA" + +msgid "Vehicle" +msgstr "Véhicule" + +msgid "Rules" +msgstr "Règles" + +msgid "Lock on road" +msgstr "Coller à la route" + +msgid "Northing" +msgstr "Orientation toujours au Nord" + +msgid "Map follows Vehicle" +msgstr "La carte suit le véhicule" + +msgid "Message" +msgstr "Message" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Description de la route" + +msgid "Height Profile" +msgstr "Profil de hauteur" + +msgid "Show Locale" +msgstr "Afficher la locale" + +msgid "About Navit" +msgstr "A propos de Navit" + +#. Authors +msgid "By" +msgstr "Développé par" + +#. Contributors +msgid "And all the Navit Team" +msgstr "Et tous les membres du projet Navit" + +msgid "members and contributors." +msgstr "membres et contributeurs" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Point sur la carte" + +msgid "Vehicle Position" +msgstr "Position du véhicule" + +msgid "Main menu" +msgstr "Menu principal" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Afficher\n" +"la carte" + +msgid "Settings" +msgstr "Configuration" + +msgid "Tools" +msgstr "Outils" + +msgid "Route" +msgstr "Itinéraire" + +msgid "About" +msgstr "À propos" + +msgid "Actions" +msgstr "Actions" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Quitter" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Arrêter\n" +"La navigation" + +msgid "Display" +msgstr "Affichage" + +msgid "Fullscreen" +msgstr "Plein écran" + +msgid "Window Mode" +msgstr "Mode fenêtré" + +msgid "Description" +msgstr "Description" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "cheval" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "Dans %s, engagez vous dans le rond-point" + +#~ msgid "Cursor" +#~ msgstr "Curseur" + +#~ msgid " SNR " +#~ msgstr " Rapport Signal/Bruit " + +#~ msgid " PRN " +#~ msgstr " PRN " diff --git a/po/gl.po.in b/po/gl.po.in new file mode 100644 index 0000000..a1d5bac --- /dev/null +++ b/po/gl.po.in @@ -0,0 +1,1756 @@ +# Galician translation for navit +# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 +# This file is distributed under the same license as the navit package. +# Iván Pérez , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-05-18 09:32+0000\n" +"Last-Translator: andreout \n" +"Language-Team: Galician \n" +"Language: gl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Executando desde o directorio fonte.\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "Establecendo '%s' a '%s'.\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "cero-ésimo" + +msgid "first" +msgstr "primeiro" + +msgid "second" +msgstr "segundo" + +msgid "third" +msgstr "terceiro" + +msgid "fourth" +msgstr "cuarto" + +msgid "fifth" +msgstr "quinto" + +msgid "sixth" +msgstr "sexto" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "cero-ésimo" + +msgid "first exit" +msgstr "primeria saída" + +msgid "second exit" +msgstr "segunda saída" + +msgid "third exit" +msgstr "terceria saída" + +msgid "fourth exit" +msgstr "cuarta saída" + +msgid "fifth exit" +msgstr "quinta saída" + +msgid "sixth exit" +msgstr "sexta saída" + +#, c-format +msgid "%d m" +msgstr "%d m." + +#, c-format +msgid "in %d m" +msgstr "en %d m." + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metros" + +#, c-format +msgid "in %d meters" +msgstr "en %d metros" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "en %d.%d quilómetros" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "un quilómetro" +msgstr[1] "%d quilómetros" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "nun quilómetro" +msgstr[1] "en %d quilómetros" + +msgid "exit" +msgstr "saída" + +msgid "into the ramp" +msgstr "na rampa" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s na rúa %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%s no %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%s na %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%s no %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%s na %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "á dereita" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "á esquerda" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "suavemente " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "bruscamente " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "moi bruscamente " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "descoñecido " + +msgid "When possible, please turn around" +msgstr "Cando sexa posible, dea a volta" + +msgid "Enter the roundabout soon" +msgstr "Métase pronto na rotonda" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "logo saia da rotonda pola %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Saia da rotonda pola %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Siga a estrada durante os próximos %s" + +msgid "soon" +msgstr "cedo" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Tome a estrada %1$s cara o %2$s" + +#, c-format +msgid "after %i roads" +msgstr "despois de %i estradas" + +msgid "now" +msgstr "agora" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "logo tome a estrada %1$s cara %2$s" + +msgid "error" +msgstr "erro" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Xire %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "" + +#, c-format +msgid "You have reached your destination %s" +msgstr "" + +msgid "then you have reached your destination." +msgstr "" + +msgid "Position" +msgstr "" + +msgid "Command" +msgstr "" + +msgid "Length" +msgstr "" + +msgid "km" +msgstr "" + +msgid "m" +msgstr "" + +msgid "Time" +msgstr "" + +msgid "Destination Length" +msgstr "" + +msgid "Destination Time" +msgstr "" + +msgid "Roadbook" +msgstr "" + +msgid "Set as position" +msgstr "" + +msgid "Set as destination" +msgstr "" + +msgid "Add as bookmark" +msgstr "" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "" + +#. 020 +msgid "Andorra" +msgstr "" + +#. 784 +msgid "United Arab Emirates" +msgstr "" + +#. 004 +msgid "Afghanistan" +msgstr "" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "" + +#. 660 +msgid "Anguilla" +msgstr "" + +#. 008 +msgid "Albania" +msgstr "" + +#. 051 +msgid "Armenia" +msgstr "" + +#. 530 +msgid "Netherlands Antilles" +msgstr "" + +#. 024 +msgid "Angola" +msgstr "" + +#. 010 +msgid "Antarctica" +msgstr "" + +#. 032 +msgid "Argentina" +msgstr "" + +#. 016 +msgid "American Samoa" +msgstr "" + +#. 040 +msgid "Austria" +msgstr "" + +#. 036 +msgid "Australia" +msgstr "" + +#. 533 +msgid "Aruba" +msgstr "" + +#. 248 +msgid "Aland Islands" +msgstr "" + +#. 031 +msgid "Azerbaijan" +msgstr "" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "" + +#. 052 +msgid "Barbados" +msgstr "" + +#. 050 +msgid "Bangladesh" +msgstr "" + +#. 056 +msgid "Belgium" +msgstr "" + +#. 854 +msgid "Burkina Faso" +msgstr "" + +#. 100 +msgid "Bulgaria" +msgstr "" + +#. 048 +msgid "Bahrain" +msgstr "" + +#. 108 +msgid "Burundi" +msgstr "" + +#. 204 +msgid "Benin" +msgstr "" + +#. 652 +msgid "Saint Barthelemy" +msgstr "" + +#. 060 +msgid "Bermuda" +msgstr "" + +#. 096 +msgid "Brunei Darussalam" +msgstr "" + +#. 068 +msgid "Bolivia" +msgstr "" + +#. 076 +msgid "Brazil" +msgstr "" + +#. 044 +msgid "Bahamas" +msgstr "" + +#. 064 +msgid "Bhutan" +msgstr "" + +#. 074 +msgid "Bouvet Island" +msgstr "" + +#. 072 +msgid "Botswana" +msgstr "" + +#. 112 +msgid "Belarus" +msgstr "" + +#. 084 +msgid "Belize" +msgstr "" + +#. 124 +msgid "Canada" +msgstr "" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "" + +#. 140 +msgid "Central African Republic" +msgstr "" + +#. 178 +msgid "Congo" +msgstr "" + +#. 756 +msgid "Switzerland" +msgstr "" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "" + +#. 184 +msgid "Cook Islands" +msgstr "" + +#. 152 +msgid "Chile" +msgstr "" + +#. 120 +msgid "Cameroon" +msgstr "" + +#. 156 +msgid "China" +msgstr "" + +#. 170 +msgid "Colombia" +msgstr "" + +#. 188 +msgid "Costa Rica" +msgstr "" + +#. 192 +msgid "Cuba" +msgstr "" + +#. 132 +msgid "Cape Verde" +msgstr "" + +#. 162 +msgid "Christmas Island" +msgstr "" + +#. 196 +msgid "Cyprus" +msgstr "" + +#. 203 +msgid "Czech Republic" +msgstr "" + +#. 276 +msgid "Germany" +msgstr "" + +#. 262 +msgid "Djibouti" +msgstr "" + +#. 208 +msgid "Denmark" +msgstr "" + +#. 212 +msgid "Dominica" +msgstr "" + +#. 214 +msgid "Dominican Republic" +msgstr "" + +#. 012 +msgid "Algeria" +msgstr "" + +#. 218 +msgid "Ecuador" +msgstr "" + +#. 233 +msgid "Estonia" +msgstr "" + +#. 818 +msgid "Egypt" +msgstr "" + +#. 732 +msgid "Western Sahara" +msgstr "" + +#. 232 +msgid "Eritrea" +msgstr "" + +#. 724 +msgid "Spain" +msgstr "" + +#. 231 +msgid "Ethiopia" +msgstr "" + +#. 246 +msgid "Finland" +msgstr "" + +#. 242 +msgid "Fiji" +msgstr "" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "" + +#. 234 +msgid "Faroe Islands" +msgstr "" + +#. 250 +msgid "France" +msgstr "" + +#. 266 +msgid "Gabon" +msgstr "" + +#. 826 +msgid "United Kingdom" +msgstr "" + +#. 308 +msgid "Grenada" +msgstr "" + +#. 268 +msgid "Georgia" +msgstr "" + +#. 254 +msgid "French Guiana" +msgstr "" + +#. 831 +msgid "Guernsey" +msgstr "" + +#. 288 +msgid "Ghana" +msgstr "" + +#. 292 +msgid "Gibraltar" +msgstr "" + +#. 304 +msgid "Greenland" +msgstr "" + +#. 270 +msgid "Gambia" +msgstr "" + +#. 324 +msgid "Guinea" +msgstr "" + +#. 312 +msgid "Guadeloupe" +msgstr "" + +#. 226 +msgid "Equatorial Guinea" +msgstr "" + +#. 300 +msgid "Greece" +msgstr "" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "" + +#. 320 +msgid "Guatemala" +msgstr "" + +#. 316 +msgid "Guam" +msgstr "" + +#. 624 +msgid "Guinea-Bissau" +msgstr "" + +#. 328 +msgid "Guyana" +msgstr "" + +#. 344 +msgid "Hong Kong" +msgstr "" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "" + +#. 340 +msgid "Honduras" +msgstr "" + +#. 191 +msgid "Croatia" +msgstr "" + +#. 332 +msgid "Haiti" +msgstr "" + +#. 348 +msgid "Hungary" +msgstr "" + +#. 360 +msgid "Indonesia" +msgstr "" + +#. 372 +msgid "Ireland" +msgstr "" + +#. 376 +msgid "Israel" +msgstr "" + +#. 833 +msgid "Isle of Man" +msgstr "" + +#. 356 +msgid "India" +msgstr "" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "" + +#. 368 +msgid "Iraq" +msgstr "" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "" + +#. 352 +msgid "Iceland" +msgstr "" + +#. 380 +msgid "Italy" +msgstr "" + +#. 832 +msgid "Jersey" +msgstr "" + +#. 388 +msgid "Jamaica" +msgstr "" + +#. 400 +msgid "Jordan" +msgstr "" + +#. 392 +msgid "Japan" +msgstr "" + +#. 404 +msgid "Kenya" +msgstr "" + +#. 417 +msgid "Kyrgyzstan" +msgstr "" + +#. 116 +msgid "Cambodia" +msgstr "" + +#. 296 +msgid "Kiribati" +msgstr "" + +#. 174 +msgid "Comoros" +msgstr "" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "" + +#. 410 +msgid "Korea, Republic of" +msgstr "" + +#. 414 +msgid "Kuwait" +msgstr "" + +#. 136 +msgid "Cayman Islands" +msgstr "" + +#. 398 +msgid "Kazakhstan" +msgstr "" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "" + +#. 422 +msgid "Lebanon" +msgstr "" + +#. 662 +msgid "Saint Lucia" +msgstr "" + +#. 438 +msgid "Liechtenstein" +msgstr "" + +#. 144 +msgid "Sri Lanka" +msgstr "" + +#. 430 +msgid "Liberia" +msgstr "" + +#. 426 +msgid "Lesotho" +msgstr "" + +#. 440 +msgid "Lithuania" +msgstr "" + +#. 442 +msgid "Luxembourg" +msgstr "" + +#. 428 +msgid "Latvia" +msgstr "" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "" + +#. 504 +msgid "Morocco" +msgstr "" + +#. 492 +msgid "Monaco" +msgstr "" + +#. 498 +msgid "Moldova, Republic of" +msgstr "" + +#. 499 +msgid "Montenegro" +msgstr "" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "" + +#. 450 +msgid "Madagascar" +msgstr "" + +#. 584 +msgid "Marshall Islands" +msgstr "" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "" + +#. 466 +msgid "Mali" +msgstr "" + +#. 104 +msgid "Myanmar" +msgstr "" + +#. 496 +msgid "Mongolia" +msgstr "" + +#. 446 +msgid "Macao" +msgstr "" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "" + +#. 474 +msgid "Martinique" +msgstr "" + +#. 478 +msgid "Mauritania" +msgstr "" + +#. 500 +msgid "Montserrat" +msgstr "" + +#. 470 +msgid "Malta" +msgstr "" + +#. 480 +msgid "Mauritius" +msgstr "" + +#. 462 +msgid "Maldives" +msgstr "" + +#. 454 +msgid "Malawi" +msgstr "" + +#. 484 +msgid "Mexico" +msgstr "" + +#. 458 +msgid "Malaysia" +msgstr "" + +#. 508 +msgid "Mozambique" +msgstr "" + +#. 516 +msgid "Namibia" +msgstr "" + +#. 540 +msgid "New Caledonia" +msgstr "" + +#. 562 +msgid "Niger" +msgstr "" + +#. 574 +msgid "Norfolk Island" +msgstr "" + +#. 566 +msgid "Nigeria" +msgstr "" + +#. 558 +msgid "Nicaragua" +msgstr "" + +#. 528 +msgid "Netherlands" +msgstr "" + +#. 578 +msgid "Norway" +msgstr "" + +#. 524 +msgid "Nepal" +msgstr "" + +#. 520 +msgid "Nauru" +msgstr "" + +#. 570 +msgid "Niue" +msgstr "" + +#. 554 +msgid "New Zealand" +msgstr "" + +#. 512 +msgid "Oman" +msgstr "" + +#. 591 +msgid "Panama" +msgstr "" + +#. 604 +msgid "Peru" +msgstr "" + +#. 258 +msgid "French Polynesia" +msgstr "" + +#. 598 +msgid "Papua New Guinea" +msgstr "" + +#. 608 +msgid "Philippines" +msgstr "" + +#. 586 +msgid "Pakistan" +msgstr "" + +#. 616 +msgid "Poland" +msgstr "" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "" + +#. 612 +msgid "Pitcairn" +msgstr "" + +#. 630 +msgid "Puerto Rico" +msgstr "" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "" + +#. 620 +msgid "Portugal" +msgstr "" + +#. 585 +msgid "Palau" +msgstr "" + +#. 600 +msgid "Paraguay" +msgstr "" + +#. 634 +msgid "Qatar" +msgstr "" + +#. 638 +msgid "Reunion" +msgstr "" + +#. 642 +msgid "Romania" +msgstr "" + +#. 688 +msgid "Serbia" +msgstr "" + +#. 643 +msgid "Russian Federation" +msgstr "" + +#. 646 +msgid "Rwanda" +msgstr "" + +#. 682 +msgid "Saudi Arabia" +msgstr "" + +#. 090 +msgid "Solomon Islands" +msgstr "" + +#. 690 +msgid "Seychelles" +msgstr "" + +#. 736 +msgid "Sudan" +msgstr "" + +#. 752 +msgid "Sweden" +msgstr "" + +#. 702 +msgid "Singapore" +msgstr "" + +#. 654 +msgid "Saint Helena" +msgstr "" + +#. 705 +msgid "Slovenia" +msgstr "" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "" + +#. 703 +msgid "Slovakia" +msgstr "" + +#. 694 +msgid "Sierra Leone" +msgstr "" + +#. 674 +msgid "San Marino" +msgstr "" + +#. 686 +msgid "Senegal" +msgstr "" + +#. 706 +msgid "Somalia" +msgstr "" + +#. 740 +msgid "Suriname" +msgstr "" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "" + +#. 222 +msgid "El Salvador" +msgstr "" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "" + +#. 748 +msgid "Swaziland" +msgstr "" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "" + +#. 148 +msgid "Chad" +msgstr "" + +#. 260 +msgid "French Southern Territories" +msgstr "" + +#. 768 +msgid "Togo" +msgstr "" + +#. 764 +msgid "Thailand" +msgstr "" + +#. 762 +msgid "Tajikistan" +msgstr "" + +#. 772 +msgid "Tokelau" +msgstr "" + +#. 626 +msgid "Timor-Leste" +msgstr "" + +#. 795 +msgid "Turkmenistan" +msgstr "" + +#. 788 +msgid "Tunisia" +msgstr "" + +#. 776 +msgid "Tonga" +msgstr "" + +#. 792 +msgid "Turkey" +msgstr "" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "" + +#. 798 +msgid "Tuvalu" +msgstr "" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "" + +#. 804 +msgid "Ukraine" +msgstr "" + +#. 800 +msgid "Uganda" +msgstr "" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "" + +#. 840 +msgid "United States" +msgstr "" + +#. 858 +msgid "Uruguay" +msgstr "" + +#. 860 +msgid "Uzbekistan" +msgstr "" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "" + +#. 862 +msgid "Venezuela" +msgstr "" + +#. 092 +msgid "Virgin Islands, British" +msgstr "" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "" + +#. 704 +msgid "Viet Nam" +msgstr "" + +#. 548 +msgid "Vanuatu" +msgstr "" + +#. 876 +msgid "Wallis and Futuna" +msgstr "" + +#. 882 +msgid "Samoa" +msgstr "" + +#. 887 +msgid "Yemen" +msgstr "" + +#. 175 +msgid "Mayotte" +msgstr "" + +#. 710 +msgid "South Africa" +msgstr "" + +#. 894 +msgid "Zambia" +msgstr "" + +#. 716 +msgid "Zimbabwe" +msgstr "" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "" + +msgid "Car" +msgstr "" + +msgid "Iso2" +msgstr "" + +msgid "Iso3" +msgstr "" + +msgid "Country" +msgstr "" + +msgid "Postal" +msgstr "" + +msgid "Town" +msgstr "" + +msgid "District" +msgstr "" + +msgid "Street" +msgstr "" + +msgid "Number" +msgstr "" + +msgid "Enter Destination" +msgstr "" + +msgid "Zip Code" +msgstr "" + +msgid "City" +msgstr "" + +msgid "District/Township" +msgstr "" + +msgid "Map" +msgstr "" + +msgid "Bookmark" +msgstr "" + +msgid "Destination" +msgstr "" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "" + +msgid "_Route" +msgstr "" + +msgid "_Former Destinations" +msgstr "" + +msgid "_Bookmarks" +msgstr "" + +msgid "_Map" +msgstr "" + +msgid "_Layout" +msgstr "" + +msgid "_Projection" +msgstr "" + +msgid "_Vehicle" +msgstr "" + +msgid "Zoom_Out" +msgstr "" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "" + +msgid "Test" +msgstr "" + +msgid "_Quit" +msgstr "" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "" + +msgid "Data" +msgstr "" + +msgid "N" +msgstr "" + +msgid "NE" +msgstr "" + +msgid "E" +msgstr "" + +msgid "SE" +msgstr "" + +msgid "S" +msgstr "" + +msgid "SW" +msgstr "" + +msgid "W" +msgstr "" + +msgid "NW" +msgstr "" + +msgid "No" +msgstr "" + +msgid "2D" +msgstr "" + +msgid "3D" +msgstr "" + +msgid "OT" +msgstr "" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "" + +msgid "Back to map" +msgstr "" + +msgid "Main Menu" +msgstr "" + +msgid "Help" +msgstr "" + +msgid "Back" +msgstr "" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "" + +msgid "View in Browser" +msgstr "" + +msgid "Streets" +msgstr "" + +msgid "House numbers" +msgstr "" + +msgid "View Attributes" +msgstr "" + +msgid "View on map" +msgstr "" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "" + +msgid "Former Destinations" +msgstr "" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "" + +msgid "Layout" +msgstr "" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "" + +msgid "Show Satellite Status" +msgstr "" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "" + +msgid "car" +msgstr "" + +msgid "bike" +msgstr "" + +msgid "pedestrian" +msgstr "" + +#, c-format +msgid "Current profile: %s" +msgstr "" + +#, c-format +msgid "Change profile to: %s" +msgstr "" + +msgid "Set as active" +msgstr "" + +msgid "Show Satellite status" +msgstr "" + +msgid "Show NMEA data" +msgstr "" + +msgid "Vehicle" +msgstr "" + +msgid "Rules" +msgstr "" + +msgid "Lock on road" +msgstr "" + +msgid "Northing" +msgstr "" + +msgid "Map follows Vehicle" +msgstr "" + +msgid "Message" +msgstr "" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "" + +msgid "Vehicle Position" +msgstr "" + +msgid "Main menu" +msgstr "" + +msgid "" +"Show\n" +"Map" +msgstr "" + +msgid "Settings" +msgstr "" + +msgid "Tools" +msgstr "" + +msgid "Route" +msgstr "" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" + +msgid "Display" +msgstr "" + +msgid "Fullscreen" +msgstr "" + +msgid "Window Mode" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "En %s, entre na rotonda" + +#~ msgid "%d.%d kilometer" +#~ msgstr "quilómetro %d.%d" diff --git a/po/he.po.in b/po/he.po.in new file mode 100644 index 0000000..35dd09f --- /dev/null +++ b/po/he.po.in @@ -0,0 +1,1763 @@ +# Hebrew translation for navit +# Copyright (c) 2008 The Navit Team +# This file is distributed under the same license as the navit package. +# Rintintin , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2009-12-20 20:37+0000\n" +"Last-Translator: KaZeR \n" +"Language-Team: Hebrew \n" +"Language: he\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "מופעל מתיקיית המקור\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "הגדרת '%s' ל־'%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "במקום ה־0" + +msgid "first" +msgstr "ראשון" + +msgid "second" +msgstr "שני" + +msgid "third" +msgstr "שלישי" + +msgid "fourth" +msgstr "רביעי" + +msgid "fifth" +msgstr "חמישי" + +msgid "sixth" +msgstr "שישי" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "היציאה ה-0" + +msgid "first exit" +msgstr "היציאה הראשונה" + +msgid "second exit" +msgstr "היציאה השנייה" + +msgid "third exit" +msgstr "היציאה השלישית" + +msgid "fourth exit" +msgstr "היציאה הרביעית" + +msgid "fifth exit" +msgstr "היציאה החמישית" + +msgid "sixth exit" +msgstr "היציאה השישית" + +#, c-format +msgid "%d m" +msgstr "%d מ'" + +#, c-format +msgid "in %d m" +msgstr "בעוד %d מ'" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d מטרים" + +#, c-format +msgid "in %d meters" +msgstr "בעוד %d מטרים" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "בעוד %d.%d קילומטרים" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "קילומטר אחד" +msgstr[1] "%d קילומטרים" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "בעוד קילומטר אחד" +msgstr[1] "בעוד %d קילומטרים" + +msgid "exit" +msgstr "יציאה" + +msgid "into the ramp" +msgstr "אל הרמפה" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s אל רחוב %s %s %s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%s אל רחוב %s %s %s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%s אל רחוב %s %s %s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%s אל רחוב %s %s %s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%sאל תוך ה%s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "ימינה" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "שמאלה" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "מעט " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "בצורה חדה " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "באופן חזק מאד " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "לא ידוע " + +msgid "When possible, please turn around" +msgstr "כשיתאפשר לך, פנה חזרה" + +msgid "Enter the roundabout soon" +msgstr "הכנס לכיכר הקרובה" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "אחר כך צא מהכיכר ב%s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "צא מהכיכר ב%s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "המשך בדרך זו למשך %s" + +msgid "soon" +msgstr "בקרוב" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "קח את הכביש ה%1$s אל %2$s" + +#, c-format +msgid "after %i roads" +msgstr "לאחר %i כבישים" + +msgid "now" +msgstr "כעת" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "ואז קח את הכביש ה%1$s אל ה%2$s" + +msgid "error" +msgstr "שגיאה" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "פנה %1$s %2$s %4$s %3$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "ואז פנה %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "הגעת ליעדך %s" + +msgid "then you have reached your destination." +msgstr "ואז הגעת ליעד." + +msgid "Position" +msgstr "מיקום" + +msgid "Command" +msgstr "פקודה" + +msgid "Length" +msgstr "אורך" + +msgid "km" +msgstr "ק\"מ" + +msgid "m" +msgstr "מ'" + +msgid "Time" +msgstr "זמן" + +msgid "Destination Length" +msgstr "מרחק ליעד" + +msgid "Destination Time" +msgstr "זמן ליעד" + +msgid "Roadbook" +msgstr "הוראות נסיעה" + +msgid "Set as position" +msgstr "קבע כמיקום נוכחי" + +msgid "Set as destination" +msgstr "קבע כיעד" + +msgid "Add as bookmark" +msgstr "צור סימניה למקום זה" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "נקודה 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "קואורדינטת מסך: %d %d" + +#. 020 +msgid "Andorra" +msgstr "אנדורה" + +#. 784 +msgid "United Arab Emirates" +msgstr "איחוד האמירויות הערביות" + +#. 004 +msgid "Afghanistan" +msgstr "אפגניסטן" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "אנטיגואה וברבודה" + +#. 660 +msgid "Anguilla" +msgstr "אנגווילה" + +#. 008 +msgid "Albania" +msgstr "אלבניה" + +#. 051 +msgid "Armenia" +msgstr "ארמניה" + +#. 530 +msgid "Netherlands Antilles" +msgstr "האנטילים ההולנדיים" + +#. 024 +msgid "Angola" +msgstr "אנגולה" + +#. 010 +msgid "Antarctica" +msgstr "אנטארקטיקה" + +#. 032 +msgid "Argentina" +msgstr "ארגנטינה" + +#. 016 +msgid "American Samoa" +msgstr "סמואה האמריקאית" + +#. 040 +msgid "Austria" +msgstr "אוסטריה" + +#. 036 +msgid "Australia" +msgstr "אוסטרליה" + +#. 533 +msgid "Aruba" +msgstr "ארובה" + +#. 248 +msgid "Aland Islands" +msgstr "איי אלאנדה" + +#. 031 +msgid "Azerbaijan" +msgstr "אזרבייג'אן" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "בוסניה והרצגובינה" + +#. 052 +msgid "Barbados" +msgstr "ברבדוס" + +#. 050 +msgid "Bangladesh" +msgstr "בנגלדש" + +#. 056 +msgid "Belgium" +msgstr "בלגיה" + +#. 854 +msgid "Burkina Faso" +msgstr "בורקינה פאסו" + +#. 100 +msgid "Bulgaria" +msgstr "בולגריה" + +#. 048 +msgid "Bahrain" +msgstr "בחריין" + +#. 108 +msgid "Burundi" +msgstr "בורונדי" + +#. 204 +msgid "Benin" +msgstr "בנין" + +#. 652 +msgid "Saint Barthelemy" +msgstr "סנט ברתלמי" + +#. 060 +msgid "Bermuda" +msgstr "ברמודה" + +#. 096 +msgid "Brunei Darussalam" +msgstr "סולטנות ברוניי" + +#. 068 +msgid "Bolivia" +msgstr "בוליביה" + +#. 076 +msgid "Brazil" +msgstr "ברזיל" + +#. 044 +msgid "Bahamas" +msgstr "איי בהאמה" + +#. 064 +msgid "Bhutan" +msgstr "בהוטאן" + +#. 074 +msgid "Bouvet Island" +msgstr "אי בובט" + +#. 072 +msgid "Botswana" +msgstr "בוטסואנה" + +#. 112 +msgid "Belarus" +msgstr "בלרוס" + +#. 084 +msgid "Belize" +msgstr "בליז" + +#. 124 +msgid "Canada" +msgstr "קנדה" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "איי קוקוס (קילינג)" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "הרפובליקה הדמוקרטית של קונגו" + +#. 140 +msgid "Central African Republic" +msgstr "רפובליקת מרכז אפריקה" + +#. 178 +msgid "Congo" +msgstr "קונגו" + +#. 756 +msgid "Switzerland" +msgstr "שוויץ" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "חוף השנהב" + +#. 184 +msgid "Cook Islands" +msgstr "איי קוק" + +#. 152 +msgid "Chile" +msgstr "צ'ילה" + +#. 120 +msgid "Cameroon" +msgstr "קמרון" + +#. 156 +msgid "China" +msgstr "סין" + +#. 170 +msgid "Colombia" +msgstr "קולומביה" + +#. 188 +msgid "Costa Rica" +msgstr "קוסטה ריקה" + +#. 192 +msgid "Cuba" +msgstr "קובה" + +#. 132 +msgid "Cape Verde" +msgstr "קייפ ורדה" + +#. 162 +msgid "Christmas Island" +msgstr "אי כריסמס" + +#. 196 +msgid "Cyprus" +msgstr "קפריסין" + +#. 203 +msgid "Czech Republic" +msgstr "צ'כיה" + +#. 276 +msgid "Germany" +msgstr "גרמניה" + +#. 262 +msgid "Djibouti" +msgstr "ג'יבוטי" + +#. 208 +msgid "Denmark" +msgstr "דנמרק" + +#. 212 +msgid "Dominica" +msgstr "דומיניקה" + +#. 214 +msgid "Dominican Republic" +msgstr "הרפובליקה הדומיניקנית" + +#. 012 +msgid "Algeria" +msgstr "אלג'יריה" + +#. 218 +msgid "Ecuador" +msgstr "אקוודור" + +#. 233 +msgid "Estonia" +msgstr "אסטוניה" + +#. 818 +msgid "Egypt" +msgstr "מצרים" + +#. 732 +msgid "Western Sahara" +msgstr "סהרה המערבית" + +#. 232 +msgid "Eritrea" +msgstr "אריתריאה" + +#. 724 +msgid "Spain" +msgstr "ספרד" + +#. 231 +msgid "Ethiopia" +msgstr "אתיופיה" + +#. 246 +msgid "Finland" +msgstr "פינלנד" + +#. 242 +msgid "Fiji" +msgstr "פיג'י" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "איי פוקלנד" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "מיקרונזיה" + +#. 234 +msgid "Faroe Islands" +msgstr "איי פארו" + +#. 250 +msgid "France" +msgstr "צרפת" + +#. 266 +msgid "Gabon" +msgstr "גבון" + +#. 826 +msgid "United Kingdom" +msgstr "אנגליה" + +#. 308 +msgid "Grenada" +msgstr "גרנדה" + +#. 268 +msgid "Georgia" +msgstr "גאורגיה" + +#. 254 +msgid "French Guiana" +msgstr "גיאנה הצרפתית" + +#. 831 +msgid "Guernsey" +msgstr "גרנזי" + +#. 288 +msgid "Ghana" +msgstr "גאנה" + +#. 292 +msgid "Gibraltar" +msgstr "גיברלטר" + +#. 304 +msgid "Greenland" +msgstr "גרינלנד" + +#. 270 +msgid "Gambia" +msgstr "גמביה" + +#. 324 +msgid "Guinea" +msgstr "גינאה" + +#. 312 +msgid "Guadeloupe" +msgstr "גוואדלופ" + +#. 226 +msgid "Equatorial Guinea" +msgstr "גינאה המשוונית" + +#. 300 +msgid "Greece" +msgstr "יוון" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "איי ג'ורג'יה הדרומית ואיי סנדוויץ' הדרומיים" + +#. 320 +msgid "Guatemala" +msgstr "גואטמלה" + +#. 316 +msgid "Guam" +msgstr "גואם" + +#. 624 +msgid "Guinea-Bissau" +msgstr "גיניאה ביסאו" + +#. 328 +msgid "Guyana" +msgstr "גיאנה" + +#. 344 +msgid "Hong Kong" +msgstr "הונג קונג" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "האי הרד ואיי מקדונלד" + +#. 340 +msgid "Honduras" +msgstr "הונדורס" + +#. 191 +msgid "Croatia" +msgstr "קרואטיה" + +#. 332 +msgid "Haiti" +msgstr "האיטי" + +#. 348 +msgid "Hungary" +msgstr "הונגריה" + +#. 360 +msgid "Indonesia" +msgstr "אינדונזיה" + +#. 372 +msgid "Ireland" +msgstr "אירלנד" + +#. 376 +msgid "Israel" +msgstr "ישראל" + +#. 833 +msgid "Isle of Man" +msgstr "האי מאן" + +#. 356 +msgid "India" +msgstr "הודו" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "הטריטוריה הבריטית באוקיינוס ההודי" + +#. 368 +msgid "Iraq" +msgstr "עיראק" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "אירן" + +#. 352 +msgid "Iceland" +msgstr "איסלנד" + +#. 380 +msgid "Italy" +msgstr "איטליה" + +#. 832 +msgid "Jersey" +msgstr "ג'רסי" + +#. 388 +msgid "Jamaica" +msgstr "ג'מייקה" + +#. 400 +msgid "Jordan" +msgstr "ירדן" + +#. 392 +msgid "Japan" +msgstr "יפן" + +#. 404 +msgid "Kenya" +msgstr "קניה" + +#. 417 +msgid "Kyrgyzstan" +msgstr "קירגיסטן" + +#. 116 +msgid "Cambodia" +msgstr "קמבודיה" + +#. 296 +msgid "Kiribati" +msgstr "קיריבאטי" + +#. 174 +msgid "Comoros" +msgstr "איי קומורו" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "סנט קיטס ונוויס" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "קוריאה הצפונית" + +#. 410 +msgid "Korea, Republic of" +msgstr "קוריאה הדרומית" + +#. 414 +msgid "Kuwait" +msgstr "כווית" + +#. 136 +msgid "Cayman Islands" +msgstr "איי קיימן" + +#. 398 +msgid "Kazakhstan" +msgstr "קזחסטן" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "לאוס" + +#. 422 +msgid "Lebanon" +msgstr "לבנון" + +#. 662 +msgid "Saint Lucia" +msgstr "סנט לוסיה" + +#. 438 +msgid "Liechtenstein" +msgstr "ליכטנשטיין" + +#. 144 +msgid "Sri Lanka" +msgstr "סרי לנקה" + +#. 430 +msgid "Liberia" +msgstr "ליבריה" + +#. 426 +msgid "Lesotho" +msgstr "לסוטו" + +#. 440 +msgid "Lithuania" +msgstr "ליטא" + +#. 442 +msgid "Luxembourg" +msgstr "לוקסמבורג" + +#. 428 +msgid "Latvia" +msgstr "לטביה" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "לוב" + +#. 504 +msgid "Morocco" +msgstr "מרוקו" + +#. 492 +msgid "Monaco" +msgstr "מונקו" + +#. 498 +msgid "Moldova, Republic of" +msgstr "מולדובה" + +#. 499 +msgid "Montenegro" +msgstr "מונטנגרו" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "סנט מרטיו (החלק הצרפתי)" + +#. 450 +msgid "Madagascar" +msgstr "מדגסקר" + +#. 584 +msgid "Marshall Islands" +msgstr "איי מרשל" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "מקדוניה" + +#. 466 +msgid "Mali" +msgstr "מאלי" + +#. 104 +msgid "Myanmar" +msgstr "מיאנמר" + +#. 496 +msgid "Mongolia" +msgstr "מונגוליה" + +#. 446 +msgid "Macao" +msgstr "מקאו" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "איי מריאנה הצפוניים" + +#. 474 +msgid "Martinique" +msgstr "מרטיניק" + +#. 478 +msgid "Mauritania" +msgstr "מאוריטניה" + +#. 500 +msgid "Montserrat" +msgstr "מונטסראט" + +#. 470 +msgid "Malta" +msgstr "מלטה" + +#. 480 +msgid "Mauritius" +msgstr "מאוריציוס" + +#. 462 +msgid "Maldives" +msgstr "האיים המלדיביים" + +#. 454 +msgid "Malawi" +msgstr "מלאווי" + +#. 484 +msgid "Mexico" +msgstr "מקסיקו" + +#. 458 +msgid "Malaysia" +msgstr "מלזיה" + +#. 508 +msgid "Mozambique" +msgstr "מוזמביק" + +#. 516 +msgid "Namibia" +msgstr "נמיביה" + +#. 540 +msgid "New Caledonia" +msgstr "קלדוניה החדשה" + +#. 562 +msgid "Niger" +msgstr "ניז'ר" + +#. 574 +msgid "Norfolk Island" +msgstr "האי נורפוק" + +#. 566 +msgid "Nigeria" +msgstr "ניגריה" + +#. 558 +msgid "Nicaragua" +msgstr "ניקרגואה" + +#. 528 +msgid "Netherlands" +msgstr "הולנד" + +#. 578 +msgid "Norway" +msgstr "נורבגיה" + +#. 524 +msgid "Nepal" +msgstr "נפאל" + +#. 520 +msgid "Nauru" +msgstr "נאורו" + +#. 570 +msgid "Niue" +msgstr "ניואה" + +#. 554 +msgid "New Zealand" +msgstr "ניו-זילנד" + +#. 512 +msgid "Oman" +msgstr "עומן" + +#. 591 +msgid "Panama" +msgstr "פנמה" + +#. 604 +msgid "Peru" +msgstr "פרו" + +#. 258 +msgid "French Polynesia" +msgstr "פולינזיה הצרפתית" + +#. 598 +msgid "Papua New Guinea" +msgstr "פפואה גינאה החדשה" + +#. 608 +msgid "Philippines" +msgstr "הפיליפינים" + +#. 586 +msgid "Pakistan" +msgstr "פקיסטן" + +#. 616 +msgid "Poland" +msgstr "פולין" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "סנט פייר ומיקלון" + +#. 612 +msgid "Pitcairn" +msgstr "פיטקרן" + +#. 630 +msgid "Puerto Rico" +msgstr "פורטו ריקו" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "פלסטין" + +#. 620 +msgid "Portugal" +msgstr "פורטוגל" + +#. 585 +msgid "Palau" +msgstr "פלאו" + +#. 600 +msgid "Paraguay" +msgstr "פראגוואי" + +#. 634 +msgid "Qatar" +msgstr "קטאר" + +#. 638 +msgid "Reunion" +msgstr "ריוניון" + +#. 642 +msgid "Romania" +msgstr "רומניה" + +#. 688 +msgid "Serbia" +msgstr "סרביה" + +#. 643 +msgid "Russian Federation" +msgstr "רוסיה" + +#. 646 +msgid "Rwanda" +msgstr "רואנדה" + +#. 682 +msgid "Saudi Arabia" +msgstr "ערב הסעודית" + +#. 090 +msgid "Solomon Islands" +msgstr "איי שלמה" + +#. 690 +msgid "Seychelles" +msgstr "איי סיישל" + +#. 736 +msgid "Sudan" +msgstr "סודן" + +#. 752 +msgid "Sweden" +msgstr "שבדיה" + +#. 702 +msgid "Singapore" +msgstr "סינגפור" + +#. 654 +msgid "Saint Helena" +msgstr "סנט הלנה" + +#. 705 +msgid "Slovenia" +msgstr "סלובניה" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "סוולבראד ויאן מאיין" + +#. 703 +msgid "Slovakia" +msgstr "סלובקיה" + +#. 694 +msgid "Sierra Leone" +msgstr "סיירה ליאונה" + +#. 674 +msgid "San Marino" +msgstr "סן מרינו" + +#. 686 +msgid "Senegal" +msgstr "סנגל" + +#. 706 +msgid "Somalia" +msgstr "סומליה" + +#. 740 +msgid "Suriname" +msgstr "סורינאם" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "סאו תומה ופרינסיפה" + +#. 222 +msgid "El Salvador" +msgstr "אל סלוודור" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "סוריה" + +#. 748 +msgid "Swaziland" +msgstr "סווזילנד" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "איי טורקס וקאיקוס" + +#. 148 +msgid "Chad" +msgstr "צ'אד" + +#. 260 +msgid "French Southern Territories" +msgstr "הטריטוריות הדרום צרפתיות" + +#. 768 +msgid "Togo" +msgstr "טוגו" + +#. 764 +msgid "Thailand" +msgstr "תאילנד" + +#. 762 +msgid "Tajikistan" +msgstr "טג'יקיסטן" + +#. 772 +msgid "Tokelau" +msgstr "טוקלאו" + +#. 626 +msgid "Timor-Leste" +msgstr "טימור מזרח" + +#. 795 +msgid "Turkmenistan" +msgstr "טורקמניסטן" + +#. 788 +msgid "Tunisia" +msgstr "טוניסיה" + +#. 776 +msgid "Tonga" +msgstr "טונגה" + +#. 792 +msgid "Turkey" +msgstr "טורקיה" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "טרינידד וטובגו" + +#. 798 +msgid "Tuvalu" +msgstr "טובלו" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "טאיוואן" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "טנזניה" + +#. 804 +msgid "Ukraine" +msgstr "אוקראינה" + +#. 800 +msgid "Uganda" +msgstr "אוגנדה" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "איים מזעריים ומרוחקים השייכים לארה\"ב" + +#. 840 +msgid "United States" +msgstr "ארצות הברית" + +#. 858 +msgid "Uruguay" +msgstr "אורוגוואי" + +#. 860 +msgid "Uzbekistan" +msgstr "אוזבקיסטן" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "וותיקן" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "סנט וינסנט והגרנדינים" + +#. 862 +msgid "Venezuela" +msgstr "ונצואלה" + +#. 092 +msgid "Virgin Islands, British" +msgstr "איי הבתולה (בריטיים)" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "איי הבתולה (ארה\"ב)" + +#. 704 +msgid "Viet Nam" +msgstr "וייטנאם" + +#. 548 +msgid "Vanuatu" +msgstr "ונואטו" + +#. 876 +msgid "Wallis and Futuna" +msgstr "ואליס ופוטונה" + +#. 882 +msgid "Samoa" +msgstr "סמואה" + +#. 887 +msgid "Yemen" +msgstr "תימן" + +#. 175 +msgid "Mayotte" +msgstr "מיוט" + +#. 710 +msgid "South Africa" +msgstr "דרום אפריקה" + +#. 894 +msgid "Zambia" +msgstr "זמביה" + +#. 716 +msgid "Zimbabwe" +msgstr "זימבבואה" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "*לא ידוע,הוסף תגי is_in לערים אלו" + +msgid "Car" +msgstr "מכונית" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "ארץ" + +msgid "Postal" +msgstr "דואר" + +msgid "Town" +msgstr "עיירה" + +msgid "District" +msgstr "מחוז" + +msgid "Street" +msgstr "רחוב" + +msgid "Number" +msgstr "מס'" + +msgid "Enter Destination" +msgstr "הכנס יעד" + +msgid "Zip Code" +msgstr "מיקוד" + +msgid "City" +msgstr "עיר" + +msgid "District/Township" +msgstr "מחוז/איזור העיר" + +msgid "Map" +msgstr "מפה" + +msgid "Bookmark" +msgstr "סימניה" + +msgid "Destination" +msgstr "יעד" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "תצוגה" + +msgid "_Route" +msgstr "מסלול" + +msgid "_Former Destinations" +msgstr "יעדים קודמים" + +msgid "_Bookmarks" +msgstr "סימניות" + +msgid "_Map" +msgstr "מפה" + +msgid "_Layout" +msgstr "מערך" + +msgid "_Projection" +msgstr "תכנון" + +msgid "_Vehicle" +msgstr "רכב (ׂGPS)" + +msgid "Zoom_Out" +msgstr "התרחק" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "התקרב" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "חשב מחדש" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "מידע" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "עצור ניווט" + +msgid "Test" +msgstr "בדיקה" + +msgid "_Quit" +msgstr "_יציאה" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "הנעל על הדרך" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "הוראות נסיעה" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "זום אוטומטי" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "מסך מלא" + +msgid "Data" +msgstr "מידע" + +msgid "N" +msgstr "צ'" + +msgid "NE" +msgstr "צפון מזרח" + +msgid "E" +msgstr "מז'" + +msgid "SE" +msgstr "דרום מזרח" + +msgid "S" +msgstr "ד'" + +msgid "SW" +msgstr "דרום מערב" + +msgid "W" +msgstr "מע'" + +msgid "NW" +msgstr "צפון מערב" + +msgid "No" +msgstr "לא" + +msgid "2D" +msgstr "דו-מימד" + +msgid "3D" +msgstr "תלת מימד" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "נשארו עוד %4.0f ק\"מ, זמן הגעה משוער %02d:%02d" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "מסלול 0000ק\"מ 0+00:00 זמן הגעה משוער" + +msgid "Back to map" +msgstr "חזור למפה" + +msgid "Main Menu" +msgstr "תפריט ראשי" + +msgid "Help" +msgstr "עזרה" + +msgid "Back" +msgstr "חזרה" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "נ\"צ" + +msgid "View in Browser" +msgstr "צפה בדפדפן אינטרנט" + +msgid "Streets" +msgstr "רחובות" + +msgid "House numbers" +msgstr "מספרי בתים" + +msgid "View Attributes" +msgstr "צפה בתכונות" + +msgid "View on map" +msgstr "צפה במפה" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "סימניות" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "סימנייה %s" + +msgid "Former Destinations" +msgstr "יעדים קודמים" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "מספר בית" + +msgid "Layout" +msgstr "מערך" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "מפות" + +msgid "Show Satellite Status" +msgstr "הצגת מצב הלוויינים" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "הצגת נתוני NMEA" + +msgid "car" +msgstr "מכונית" + +msgid "bike" +msgstr "אופניים" + +msgid "pedestrian" +msgstr "הולך רגל" + +#, c-format +msgid "Current profile: %s" +msgstr "פרופיל נוכחי: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "שנה את הפרופיל ל: %s" + +msgid "Set as active" +msgstr "הגדרה כפעיל" + +msgid "Show Satellite status" +msgstr "הצגת מצב הלוויינים" + +msgid "Show NMEA data" +msgstr "הצגת נתוני NMEA" + +msgid "Vehicle" +msgstr "רכב (ׂGPS)" + +msgid "Rules" +msgstr "כללים" + +msgid "Lock on road" +msgstr "נעול על הדרך" + +msgid "Northing" +msgstr "הצפנה" + +msgid "Map follows Vehicle" +msgstr "מפה עוקבת אחר הרכב" + +msgid "Message" +msgstr "הודעה" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "פרופיל גובה" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "נקודה במפה" + +msgid "Vehicle Position" +msgstr "מיקום רכב" + +msgid "Main menu" +msgstr "תפריט ראשי" + +msgid "" +"Show\n" +"Map" +msgstr "" +"הצגת\n" +"מפה" + +msgid "Settings" +msgstr "הגדרות" + +msgid "Tools" +msgstr "כלים" + +msgid "Route" +msgstr "מסלול" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "פעולות" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "יציאה" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"עצור\n" +"ניווט" + +msgid "Display" +msgstr "תצוגה" + +msgid "Fullscreen" +msgstr "מסך מלא" + +msgid "Window Mode" +msgstr "מצב חלון" + +msgid "Description" +msgstr "תיאור" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "ב%s, הכנס לכיכר" + +#~ msgid "Cursor" +#~ msgstr "סמן" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d קילומטר" diff --git a/po/hr.po.in b/po/hr.po.in new file mode 100644 index 0000000..f34ad3e --- /dev/null +++ b/po/hr.po.in @@ -0,0 +1,1762 @@ +# Croatian translation for navit +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the navit package. +# klajo 2010 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-03-21 04:05+0000\n" +"Last-Translator: klajo \n" +"Language-Team: Croatian \n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "" + +msgid "first" +msgstr "prvi" + +msgid "second" +msgstr "drugi" + +msgid "third" +msgstr "treći" + +msgid "fourth" +msgstr "četvrti" + +msgid "fifth" +msgstr "peti" + +msgid "sixth" +msgstr "šesti" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "" + +msgid "first exit" +msgstr "prvi izlaz" + +msgid "second exit" +msgstr "drugi izlaz" + +msgid "third exit" +msgstr "treći izlaz" + +msgid "fourth exit" +msgstr "četvrti izlaz" + +msgid "fifth exit" +msgstr "peti izlaz" + +msgid "sixth exit" +msgstr "šesti izlaz" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "za %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metara" + +#, c-format +msgid "in %d meters" +msgstr "za %d metara" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d kilometara" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "za %d.%d kilometara" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "%d kilometar" +msgstr[1] "%d kilometara" +msgstr[2] "%d kilometara" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "za %d kilometar" +msgstr[1] "za %d kilometara" +msgstr[2] "za %d kilometara" + +msgid "exit" +msgstr "izlaz" + +msgid "into the ramp" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%su ulicu %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%su %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "desno" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "lijevo" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "jednostavno " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "teško " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "vrlo teško " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "nepoznatno " + +msgid "When possible, please turn around" +msgstr "" + +msgid "Enter the roundabout soon" +msgstr "" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Pratite cestu za idući %s" + +msgid "soon" +msgstr "uskoro" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "" + +#, c-format +msgid "after %i roads" +msgstr "nakon %i ceste" + +msgid "now" +msgstr "sada" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "" + +msgid "error" +msgstr "greška" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Krenite %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "onda krenite %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "" + +msgid "then you have reached your destination." +msgstr "nakon toga ste stigli do cilja" + +msgid "Position" +msgstr "Pozicija" + +msgid "Command" +msgstr "Naredba" + +msgid "Length" +msgstr "Dužina" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Vrijeme" + +msgid "Destination Length" +msgstr "" + +msgid "Destination Time" +msgstr "Vrijeme dolaska" + +msgid "Roadbook" +msgstr "" + +msgid "Set as position" +msgstr "" + +msgid "Set as destination" +msgstr "" + +msgid "Add as bookmark" +msgstr "" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "" + +#. 020 +msgid "Andorra" +msgstr "Andora" + +#. 784 +msgid "United Arab Emirates" +msgstr "Ujedinjeni Arapski Emirati" + +#. 004 +msgid "Afghanistan" +msgstr "Afganistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua i Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguila" + +#. 008 +msgid "Albania" +msgstr "Albanija" + +#. 051 +msgid "Armenia" +msgstr "Armenija" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Nizozemski Antili" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarktika" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "Američki Samoa" + +#. 040 +msgid "Austria" +msgstr "Austrija" + +#. 036 +msgid "Australia" +msgstr "Australija" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbejdžan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosna i Hercegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladeš" + +#. 056 +msgid "Belgium" +msgstr "Belgija" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bugarska" + +#. 048 +msgid "Bahrain" +msgstr "Bahrein" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "" + +#. 068 +msgid "Bolivia" +msgstr "Bolivija" + +#. 076 +msgid "Brazil" +msgstr "Brazil" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "" + +#. 074 +msgid "Bouvet Island" +msgstr "" + +#. 072 +msgid "Botswana" +msgstr "Bocvana" + +#. 112 +msgid "Belarus" +msgstr "Bjelorusija" + +#. 084 +msgid "Belize" +msgstr "" + +#. 124 +msgid "Canada" +msgstr "Kanada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Kokosovi (Keeling) otoci" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "" + +#. 140 +msgid "Central African Republic" +msgstr "Srednjoafrička Republika" + +#. 178 +msgid "Congo" +msgstr "Kongo" + +#. 756 +msgid "Switzerland" +msgstr "Švicarska" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "" + +#. 184 +msgid "Cook Islands" +msgstr "Cookovi otoci" + +#. 152 +msgid "Chile" +msgstr "Čile" + +#. 120 +msgid "Cameroon" +msgstr "Kamerun" + +#. 156 +msgid "China" +msgstr "Kina" + +#. 170 +msgid "Colombia" +msgstr "Kolumbija" + +#. 188 +msgid "Costa Rica" +msgstr "Kostarika" + +#. 192 +msgid "Cuba" +msgstr "Kuba" + +#. 132 +msgid "Cape Verde" +msgstr "Zelenortski otoci" + +#. 162 +msgid "Christmas Island" +msgstr "Božićni otoci" + +#. 196 +msgid "Cyprus" +msgstr "Cipar" + +#. 203 +msgid "Czech Republic" +msgstr "Češka Republika" + +#. 276 +msgid "Germany" +msgstr "Njemačka" + +#. 262 +msgid "Djibouti" +msgstr "" + +#. 208 +msgid "Denmark" +msgstr "Danska" + +#. 212 +msgid "Dominica" +msgstr "Dominika" + +#. 214 +msgid "Dominican Republic" +msgstr "Dominikanska Republika" + +#. 012 +msgid "Algeria" +msgstr "Alžir" + +#. 218 +msgid "Ecuador" +msgstr "Ekvador" + +#. 233 +msgid "Estonia" +msgstr "Estonija" + +#. 818 +msgid "Egypt" +msgstr "Egipat" + +#. 732 +msgid "Western Sahara" +msgstr "Zapadna Sahara" + +#. 232 +msgid "Eritrea" +msgstr "" + +#. 724 +msgid "Spain" +msgstr "Španjolska" + +#. 231 +msgid "Ethiopia" +msgstr "Etiopija" + +#. 246 +msgid "Finland" +msgstr "Finska" + +#. 242 +msgid "Fiji" +msgstr "Fidži" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "" + +#. 234 +msgid "Faroe Islands" +msgstr "Otočje Faroe" + +#. 250 +msgid "France" +msgstr "Francuska" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Velika Britanija" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Gruzija" + +#. 254 +msgid "French Guiana" +msgstr "" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Gana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Grenland" + +#. 270 +msgid "Gambia" +msgstr "Gambija" + +#. 324 +msgid "Guinea" +msgstr "Gvineja" + +#. 312 +msgid "Guadeloupe" +msgstr "" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Ekvatorska Gvineja" + +#. 300 +msgid "Greece" +msgstr "Grčka" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "" + +#. 320 +msgid "Guatemala" +msgstr "Gvatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Gvineja-Bissau" + +#. 328 +msgid "Guyana" +msgstr "" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Otok Heard i MacDonaldovi otoci" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Hrvatska" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Mađarska" + +#. 360 +msgid "Indonesia" +msgstr "Indonezija" + +#. 372 +msgid "Ireland" +msgstr "Irska" + +#. 376 +msgid "Israel" +msgstr "Izrael" + +#. 833 +msgid "Isle of Man" +msgstr "" + +#. 356 +msgid "India" +msgstr "Indija" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Britanski Teritorij Indijskog Oceana" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "" + +#. 352 +msgid "Iceland" +msgstr "Island" + +#. 380 +msgid "Italy" +msgstr "Italija" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamajka" + +#. 400 +msgid "Jordan" +msgstr "Jordan" + +#. 392 +msgid "Japan" +msgstr "Japan" + +#. 404 +msgid "Kenya" +msgstr "Kenija" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirgistan" + +#. 116 +msgid "Cambodia" +msgstr "Kambodža" + +#. 296 +msgid "Kiribati" +msgstr "" + +#. 174 +msgid "Comoros" +msgstr "" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "" + +#. 410 +msgid "Korea, Republic of" +msgstr "" + +#. 414 +msgid "Kuwait" +msgstr "Kuvajt" + +#. 136 +msgid "Cayman Islands" +msgstr "Kajmanski otoci" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazahstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "" + +#. 422 +msgid "Lebanon" +msgstr "Libanon" + +#. 662 +msgid "Saint Lucia" +msgstr "Sveta Lucija" + +#. 438 +msgid "Liechtenstein" +msgstr "Lihtenštajn" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberija" + +#. 426 +msgid "Lesotho" +msgstr "Lesoto" + +#. 440 +msgid "Lithuania" +msgstr "" + +#. 442 +msgid "Luxembourg" +msgstr "Luksemburg" + +#. 428 +msgid "Latvia" +msgstr "Latvija" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libijska Arapska Jamahirija" + +#. 504 +msgid "Morocco" +msgstr "Maroko" + +#. 492 +msgid "Monaco" +msgstr "Monako" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldova" + +#. 499 +msgid "Montenegro" +msgstr "Crna Gora" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "" + +#. 450 +msgid "Madagascar" +msgstr "Madagaskar" + +#. 584 +msgid "Marshall Islands" +msgstr "Maršalovi otoci" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Makedonija" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "" + +#. 496 +msgid "Mongolia" +msgstr "Mongolija" + +#. 446 +msgid "Macao" +msgstr "" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "" + +#. 474 +msgid "Martinique" +msgstr "" + +#. 478 +msgid "Mauritania" +msgstr "" + +#. 500 +msgid "Montserrat" +msgstr "" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauricijus" + +#. 462 +msgid "Maldives" +msgstr "Maledivi" + +#. 454 +msgid "Malawi" +msgstr "" + +#. 484 +msgid "Mexico" +msgstr "Meksiko" + +#. 458 +msgid "Malaysia" +msgstr "" + +#. 508 +msgid "Mozambique" +msgstr "Mozambik" + +#. 516 +msgid "Namibia" +msgstr "Namibija" + +#. 540 +msgid "New Caledonia" +msgstr "" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "" + +#. 566 +msgid "Nigeria" +msgstr "Nigerija" + +#. 558 +msgid "Nicaragua" +msgstr "Nikaragva" + +#. 528 +msgid "Netherlands" +msgstr "Nizozemska" + +#. 578 +msgid "Norway" +msgstr "Norveška" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "" + +#. 570 +msgid "Niue" +msgstr "" + +#. 554 +msgid "New Zealand" +msgstr "Novi Zeland" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Francuska Polinezija" + +#. 598 +msgid "Papua New Guinea" +msgstr "" + +#. 608 +msgid "Philippines" +msgstr "Filipini" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Poljska" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "" + +#. 612 +msgid "Pitcairn" +msgstr "" + +#. 630 +msgid "Puerto Rico" +msgstr "Porto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestina" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paragvaj" + +#. 634 +msgid "Qatar" +msgstr "Katar" + +#. 638 +msgid "Reunion" +msgstr "" + +#. 642 +msgid "Romania" +msgstr "Rumunjska" + +#. 688 +msgid "Serbia" +msgstr "Srbija" + +#. 643 +msgid "Russian Federation" +msgstr "Ruska Federacija" + +#. 646 +msgid "Rwanda" +msgstr "" + +#. 682 +msgid "Saudi Arabia" +msgstr "Saudijska Arabija" + +#. 090 +msgid "Solomon Islands" +msgstr "" + +#. 690 +msgid "Seychelles" +msgstr "" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Švedska" + +#. 702 +msgid "Singapore" +msgstr "Singapur" + +#. 654 +msgid "Saint Helena" +msgstr "Sveta Helena" + +#. 705 +msgid "Slovenia" +msgstr "Slovenija" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "" + +#. 703 +msgid "Slovakia" +msgstr "Slovačka" + +#. 694 +msgid "Sierra Leone" +msgstr "" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalija" + +#. 740 +msgid "Suriname" +msgstr "" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Sirijska Arapska Republika" + +#. 748 +msgid "Swaziland" +msgstr "" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "" + +#. 148 +msgid "Chad" +msgstr "" + +#. 260 +msgid "French Southern Territories" +msgstr "" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Tajland" + +#. 762 +msgid "Tajikistan" +msgstr "" + +#. 772 +msgid "Tokelau" +msgstr "" + +#. 626 +msgid "Timor-Leste" +msgstr "" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunis" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turska" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Kineska Pokrajina Tajvan" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "" + +#. 804 +msgid "Ukraine" +msgstr "Ukrajina" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "" + +#. 840 +msgid "United States" +msgstr "Sjedinjene države" + +#. 858 +msgid "Uruguay" +msgstr "Urugvaj" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Vatikan (država Vatikanskog grada)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "" + +#. 862 +msgid "Venezuela" +msgstr "Venecuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "" + +#. 704 +msgid "Viet Nam" +msgstr "Vijetnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Jemen" + +#. 175 +msgid "Mayotte" +msgstr "" + +#. 710 +msgid "South Africa" +msgstr "Južna Afrika" + +#. 894 +msgid "Zambia" +msgstr "" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabve" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "" + +msgid "Car" +msgstr "Auto" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Država" + +msgid "Postal" +msgstr "Poštanski" + +msgid "Town" +msgstr "Grad" + +msgid "District" +msgstr "Područje" + +msgid "Street" +msgstr "Ulica" + +msgid "Number" +msgstr "Broj" + +msgid "Enter Destination" +msgstr "Ubacite odredište" + +msgid "Zip Code" +msgstr "Poštanski broj" + +msgid "City" +msgstr "Grad" + +msgid "District/Township" +msgstr "" + +msgid "Map" +msgstr "Karta" + +msgid "Bookmark" +msgstr "Oznaka" + +msgid "Destination" +msgstr "Odredište" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Ekran" + +msgid "_Route" +msgstr "Ruta" + +msgid "_Former Destinations" +msgstr "Nekadašnji odredište" + +msgid "_Bookmarks" +msgstr "Oznake" + +msgid "_Map" +msgstr "Karta" + +msgid "_Layout" +msgstr "Izgled" + +msgid "_Projection" +msgstr "Projekcija" + +msgid "_Vehicle" +msgstr "Vozilo" + +msgid "Zoom_Out" +msgstr "" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Ponovno izračunaj" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Info" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Stop navigaciju" + +msgid "Test" +msgstr "Provjera" + +msgid "_Quit" +msgstr "_Izlaz" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Cijeli ekran" + +msgid "Data" +msgstr "Podaci" + +msgid "N" +msgstr "S" + +msgid "NE" +msgstr "SI" + +msgid "E" +msgstr "I" + +msgid "SE" +msgstr "JI" + +msgid "S" +msgstr "J" + +msgid "SW" +msgstr "JZ" + +msgid "W" +msgstr "Z" + +msgid "NW" +msgstr "SZ" + +msgid "No" +msgstr "Ne" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "" + +msgid "Back to map" +msgstr "Vrati kartu" + +msgid "Main Menu" +msgstr "Glavni meni" + +msgid "Help" +msgstr "Pomoć" + +msgid "Back" +msgstr "Natrag" + +msgid "Add Bookmark" +msgstr "Dodaj oznaku" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "POIs" + +msgid "View in Browser" +msgstr "" + +msgid "Streets" +msgstr "Ulice" + +msgid "House numbers" +msgstr "kućni broja" + +msgid "View Attributes" +msgstr "" + +msgid "View on map" +msgstr "Gledaj na kartu" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "Oznake" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "" + +msgid "Former Destinations" +msgstr "Nekadašnji odredište" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "" + +msgid "Layout" +msgstr "Izgled" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Karte" + +msgid "Show Satellite Status" +msgstr "Pokaži status satelita" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "" + +msgid "car" +msgstr "auto" + +msgid "bike" +msgstr "biciklo" + +msgid "pedestrian" +msgstr "pješak" + +#, c-format +msgid "Current profile: %s" +msgstr "Trenutni profil: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Mijenjaj profil na: %s" + +msgid "Set as active" +msgstr "" + +msgid "Show Satellite status" +msgstr "Pokaži status satelita" + +msgid "Show NMEA data" +msgstr "" + +msgid "Vehicle" +msgstr "Vozilo" + +msgid "Rules" +msgstr "Pravila" + +msgid "Lock on road" +msgstr "" + +msgid "Northing" +msgstr "" + +msgid "Map follows Vehicle" +msgstr "" + +msgid "Message" +msgstr "Poruka" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "Sve od Navit" + +#. Authors +msgid "By" +msgstr "Od" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "" + +msgid "Vehicle Position" +msgstr "Pozicija vozila" + +msgid "Main menu" +msgstr "Glavni izbornik" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Pokaži\n" +"kartu" + +msgid "Settings" +msgstr "Postavke" + +msgid "Tools" +msgstr "" + +msgid "Route" +msgstr "Ruta" + +msgid "About" +msgstr "O programu" + +msgid "Actions" +msgstr "Akcije" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Izlaz" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Stop\n" +"navigaciju" + +msgid "Display" +msgstr "Ekran" + +msgid "Fullscreen" +msgstr "Cijeli ekran" + +msgid "Window Mode" +msgstr "" + +msgid "Description" +msgstr "Opis" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "konj" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "Cursor" +#~ msgstr "Kursor" diff --git a/po/hu.po.in b/po/hu.po.in new file mode 100644 index 0000000..9af5a29 --- /dev/null +++ b/po/hu.po.in @@ -0,0 +1,1769 @@ +# Hungarian translation for navit +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the navit package. +# WintermuteHun , 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-05-18 12:25+0000\n" +"Last-Translator: KaZeR \n" +"Language-Team: Hungarian \n" +"Language: hu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Futtatás a forráskönyvtárból\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "'%s' beállítása erre: '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "nulladik" + +msgid "first" +msgstr "első" + +msgid "second" +msgstr "második" + +msgid "third" +msgstr "harmadik" + +msgid "fourth" +msgstr "negyedik" + +msgid "fifth" +msgstr "ötödik" + +msgid "sixth" +msgstr "hatodik" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "nulladik kijáraton" + +msgid "first exit" +msgstr "első kijáraton" + +msgid "second exit" +msgstr "második kijáraton" + +msgid "third exit" +msgstr "harmadik kijáraton" + +msgid "fourth exit" +msgstr "negyedik kijáraton" + +msgid "fifth exit" +msgstr "ötödik kijáraton" + +msgid "sixth exit" +msgstr "hatodik kijáraton" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "%d m után" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d méter" + +#, c-format +msgid "in %d meters" +msgstr "%d méter után" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d,%d kilométer" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "%d,%d kilométer után" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "egy kilométer" +msgstr[1] "%d kilométer" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "egy kilométer után" +msgstr[1] "%d kilométer után" + +msgid "exit" +msgstr "kijárat" + +msgid "into the ramp" +msgstr "a felhajtóra" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%sa(z) %s%s%s utcába" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%sa(z) %s%s%s útra" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%sa(z) %s%s%s útra" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%sa(z) %s%s%s útra" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%shajtson rá a(z) %s útra" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "jobbra" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "balra" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "enyhén " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "élesen " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "nagyon élesen " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "ismeretlen " + +msgid "When possible, please turn around" +msgstr "Amint lehet, fordujon meg" + +msgid "Enter the roundabout soon" +msgstr "Hajtson be a körforgalomba hamarosan." + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "majd hagyja el a körforgalmat a(z) %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Hagyja el a körforgalmat a(z) %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Haladjon az úton a következő %sig" + +msgid "soon" +msgstr "hamarosan" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "A(z) %1$s útnál forduljon %2$s" + +#, c-format +msgid "after %i roads" +msgstr "%i út után" + +msgid "now" +msgstr "most" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "aztán a(z) %1$s útnál forduljon %2$s" + +msgid "error" +msgstr "hiba" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Forduljon %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "aztán forduljon %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Elérte az úticélját: %s" + +msgid "then you have reached your destination." +msgstr "majd eléri az úticélját." + +msgid "Position" +msgstr "Pozíció" + +msgid "Command" +msgstr "Parancs" + +msgid "Length" +msgstr "Hossz" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Idő" + +msgid "Destination Length" +msgstr "Távolság a céltól" + +msgid "Destination Time" +msgstr "Menetidő" + +msgid "Roadbook" +msgstr "Útikalauz" + +msgid "Set as position" +msgstr "Beállítás pozícióként" + +msgid "Set as destination" +msgstr "Beállítás úticélként" + +msgid "Add as bookmark" +msgstr "Hozzáadás a könyvjelzőkhöz" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Pont 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Képernyő koordinátái: %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Egyesült Arab Emirátusok" + +#. 004 +msgid "Afghanistan" +msgstr "Afganisztán" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua és Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Angola" + +#. 008 +msgid "Albania" +msgstr "Albánia" + +#. 051 +msgid "Armenia" +msgstr "Örményország" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Holland Antillák" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarktisz" + +#. 032 +msgid "Argentina" +msgstr "Argentína" + +#. 016 +msgid "American Samoa" +msgstr "Amerikai Szamoa" + +#. 040 +msgid "Austria" +msgstr "Ausztria" + +#. 036 +msgid "Australia" +msgstr "Ausztrália" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Aland-sziget" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbajdzsán" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosznia és Hercegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Banglades" + +#. 056 +msgid "Belgium" +msgstr "Belgium" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgária" + +#. 048 +msgid "Bahrain" +msgstr "Bahrain" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint Barthelemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermudák" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei Szultanátus" + +#. 068 +msgid "Bolivia" +msgstr "Bolívia" + +#. 076 +msgid "Brazil" +msgstr "Brazília" + +#. 044 +msgid "Bahamas" +msgstr "Bahamák" + +#. 064 +msgid "Bhutan" +msgstr "Bhután" + +#. 074 +msgid "Bouvet Island" +msgstr "Bouvet-sziget" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Fehéroroszország" + +#. 084 +msgid "Belize" +msgstr "Belizé" + +#. 124 +msgid "Canada" +msgstr "Kanada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Cocos (Keeling) -szigetek" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Kongói Demokratikus Köztársaság" + +#. 140 +msgid "Central African Republic" +msgstr "Közép-afrikai Köztársaság" + +#. 178 +msgid "Congo" +msgstr "Kongó" + +#. 756 +msgid "Switzerland" +msgstr "Svájc" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Elefántcsontpart" + +#. 184 +msgid "Cook Islands" +msgstr "Cook-szigetek" + +#. 152 +msgid "Chile" +msgstr "Chile" + +#. 120 +msgid "Cameroon" +msgstr "Kamerun" + +#. 156 +msgid "China" +msgstr "Kína" + +#. 170 +msgid "Colombia" +msgstr "Kolumbia" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Kuba" + +#. 132 +msgid "Cape Verde" +msgstr "Zöldfoki-szigetek" + +#. 162 +msgid "Christmas Island" +msgstr "Karácsony-szigetek" + +#. 196 +msgid "Cyprus" +msgstr "Ciprus" + +#. 203 +msgid "Czech Republic" +msgstr "Csehország" + +#. 276 +msgid "Germany" +msgstr "Németország" + +#. 262 +msgid "Djibouti" +msgstr "Dzsibuti" + +#. 208 +msgid "Denmark" +msgstr "Dánia" + +#. 212 +msgid "Dominica" +msgstr "Dominika" + +#. 214 +msgid "Dominican Republic" +msgstr "Dominikai Köztársaság" + +#. 012 +msgid "Algeria" +msgstr "Algéria" + +#. 218 +msgid "Ecuador" +msgstr "Ecuador" + +#. 233 +msgid "Estonia" +msgstr "Észtország" + +#. 818 +msgid "Egypt" +msgstr "Egyiptom" + +#. 732 +msgid "Western Sahara" +msgstr "Nyugat-Szahara" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Spanyolország" + +#. 231 +msgid "Ethiopia" +msgstr "Etiópia" + +#. 246 +msgid "Finland" +msgstr "Finnország" + +#. 242 +msgid "Fiji" +msgstr "Fidzsi-szigetek" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falkland-szigetek" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Mikronéz Államszövetség" + +#. 234 +msgid "Faroe Islands" +msgstr "Feröer-szigetek" + +#. 250 +msgid "France" +msgstr "Franciaország" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Egyesült Királyság" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Grúzia" + +#. 254 +msgid "French Guiana" +msgstr "Francia Guyana" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghána" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltár" + +#. 304 +msgid "Greenland" +msgstr "Grönland" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Egyenlítői Guinea" + +#. 300 +msgid "Greece" +msgstr "Görögország" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Dél-Georgia és Déli-Sandwich-szigetek" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hongkong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heard-sziget és McDonald-szigetek" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Horvátország" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Magyarország" + +#. 360 +msgid "Indonesia" +msgstr "Indonézia" + +#. 372 +msgid "Ireland" +msgstr "Írország" + +#. 376 +msgid "Israel" +msgstr "Izrael" + +#. 833 +msgid "Isle of Man" +msgstr "Man sziget" + +#. 356 +msgid "India" +msgstr "India" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Brit Indiai Óceáni Terület" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Irán" + +#. 352 +msgid "Iceland" +msgstr "Izland" + +#. 380 +msgid "Italy" +msgstr "Olaszország" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaika" + +#. 400 +msgid "Jordan" +msgstr "Jordánia" + +#. 392 +msgid "Japan" +msgstr "Japán" + +#. 404 +msgid "Kenya" +msgstr "Kenya" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirgizisztán" + +#. 116 +msgid "Cambodia" +msgstr "Kambodzsa" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Comore-szigetek" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "St. Kitts és Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Koreai Demokratikus Népköztársaság" + +#. 410 +msgid "Korea, Republic of" +msgstr "Koreai Köztársaság" + +#. 414 +msgid "Kuwait" +msgstr "Kuvait" + +#. 136 +msgid "Cayman Islands" +msgstr "Kajmán-szigetek" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazahsztán" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laoszi Demokratikus Népköztársaság" + +#. 422 +msgid "Lebanon" +msgstr "Libanon" + +#. 662 +msgid "Saint Lucia" +msgstr "St. Lucia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Libéria" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Litvánia" + +#. 442 +msgid "Luxembourg" +msgstr "Luxemburg" + +#. 428 +msgid "Latvia" +msgstr "Lettország" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Líbiai Arab Jamahiriya" + +#. 504 +msgid "Morocco" +msgstr "Marokkó" + +#. 492 +msgid "Monaco" +msgstr "Monaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldáv Köztársaság" + +#. 499 +msgid "Montenegro" +msgstr "Montenegró" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Saint Martin (francia oldal)" + +#. 450 +msgid "Madagascar" +msgstr "Madagaszkár" + +#. 584 +msgid "Marshall Islands" +msgstr "Marsall-szigetek" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Macedónia, korábban Jugoszláv Köztársaság" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongólia" + +#. 446 +msgid "Macao" +msgstr "Makaó" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Északi Mariana-szigetek" + +#. 474 +msgid "Martinique" +msgstr "Martinique" + +#. 478 +msgid "Mauritania" +msgstr "Mauritánia" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Málta" + +#. 480 +msgid "Mauritius" +msgstr "Mauritius" + +#. 462 +msgid "Maldives" +msgstr "Maldív-szigetek" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mexikó" + +#. 458 +msgid "Malaysia" +msgstr "Malajzia" + +#. 508 +msgid "Mozambique" +msgstr "Mozambik" + +#. 516 +msgid "Namibia" +msgstr "Namíbia" + +#. 540 +msgid "New Caledonia" +msgstr "Új-Kaledónia" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolk-sziget" + +#. 566 +msgid "Nigeria" +msgstr "Nigéria" + +#. 558 +msgid "Nicaragua" +msgstr "Nicaragua" + +#. 528 +msgid "Netherlands" +msgstr "Hollandia" + +#. 578 +msgid "Norway" +msgstr "Norvégia" + +#. 524 +msgid "Nepal" +msgstr "Nepál" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Új-Zéland" + +#. 512 +msgid "Oman" +msgstr "Omán" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Francia Polinézia" + +#. 598 +msgid "Papua New Guinea" +msgstr "Pápua Új-Guinea" + +#. 608 +msgid "Philippines" +msgstr "Fülöp-szigetek" + +#. 586 +msgid "Pakistan" +msgstr "Pakisztán" + +#. 616 +msgid "Poland" +msgstr "Lengyelország" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint-Pierre és Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn-szigetek" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palesztin Megszállt Területek" + +#. 620 +msgid "Portugal" +msgstr "Portugália" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Katar" + +#. 638 +msgid "Reunion" +msgstr "Réunion" + +#. 642 +msgid "Romania" +msgstr "Románia" + +#. 688 +msgid "Serbia" +msgstr "Szerbia" + +#. 643 +msgid "Russian Federation" +msgstr "Orosz Föderáció" + +#. 646 +msgid "Rwanda" +msgstr "Ruanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Szaúd-Arábia" + +#. 090 +msgid "Solomon Islands" +msgstr "Salamon-szigetek" + +#. 690 +msgid "Seychelles" +msgstr "Seychelles-szigetek" + +#. 736 +msgid "Sudan" +msgstr "Szudán" + +#. 752 +msgid "Sweden" +msgstr "Svédország" + +#. 702 +msgid "Singapore" +msgstr "Szingapúr" + +#. 654 +msgid "Saint Helena" +msgstr "Szent Ilona" + +#. 705 +msgid "Slovenia" +msgstr "Szlovénia" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard-szigetek és Jan Mayen-sziget" + +#. 703 +msgid "Slovakia" +msgstr "Szlovákia" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Szenegál" + +#. 706 +msgid "Somalia" +msgstr "Szomália" + +#. 740 +msgid "Suriname" +msgstr "Suriname" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "São Tomé és Príncipe" + +#. 222 +msgid "El Salvador" +msgstr "Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Szíriai Arab Köztársaság" + +#. 748 +msgid "Swaziland" +msgstr "Szváziföld" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turks és Caicos-szigetek" + +#. 148 +msgid "Chad" +msgstr "Csád" + +#. 260 +msgid "French Southern Territories" +msgstr "Francia déli területek" + +#. 768 +msgid "Togo" +msgstr "Togó" + +#. 764 +msgid "Thailand" +msgstr "Thaiföld" + +#. 762 +msgid "Tajikistan" +msgstr "Tadzsikisztán" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau-szigetek" + +#. 626 +msgid "Timor-Leste" +msgstr "Kelet-Timor" + +#. 795 +msgid "Turkmenistan" +msgstr "Türkmenisztán" + +#. 788 +msgid "Tunisia" +msgstr "Tunézia" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Törökország" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad és Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Tajvan, Kínai Tartomány" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzániai Egyesült Köztársaság" + +#. 804 +msgid "Ukraine" +msgstr "Ukrajna" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Amerikai Csendes-óceáni-szigetek" + +#. 840 +msgid "United States" +msgstr "Egyesült Államok" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Üzbegisztán" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Vatikán" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Saint Vincent és a Grenadines-szigetek" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Virgin-szigetek (brit)" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Virgin-szigetek (USA)" + +#. 704 +msgid "Viet Nam" +msgstr "Vietnám" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis és Futuna" + +#. 882 +msgid "Samoa" +msgstr "Szamoa" + +#. 887 +msgid "Yemen" +msgstr "Jemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Dél-Afrika" + +#. 894 +msgid "Zambia" +msgstr "Zambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabve" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "*Ismeretlen, is_in címkék hozzáadása ezekhez a városokhoz" + +msgid "Car" +msgstr "Autó" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Ország" + +msgid "Postal" +msgstr "Ir. szám" + +msgid "Town" +msgstr "Város" + +msgid "District" +msgstr "Kerület" + +msgid "Street" +msgstr "Utca" + +msgid "Number" +msgstr "Házszám" + +msgid "Enter Destination" +msgstr "Úticél megadása" + +msgid "Zip Code" +msgstr "Irányítószám" + +msgid "City" +msgstr "Város" + +msgid "District/Township" +msgstr "Kerület/Környék" + +msgid "Map" +msgstr "Térkép" + +msgid "Bookmark" +msgstr "Könyvjelző" + +msgid "Destination" +msgstr "Úticél" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Megjelenítés" + +msgid "_Route" +msgstr "Útvonal" + +msgid "_Former Destinations" +msgstr "Korábbi úticélok" + +msgid "_Bookmarks" +msgstr "Könyvjelzők" + +msgid "_Map" +msgstr "Térkép" + +msgid "_Layout" +msgstr "Elrendezés" + +msgid "_Projection" +msgstr "Vetület" + +msgid "_Vehicle" +msgstr "Jármű" + +msgid "Zoom_Out" +msgstr "Távolítás" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Közelítés" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Újratervezés" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Információk" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Navigálás vége" + +msgid "Test" +msgstr "Teszt" + +msgid "_Quit" +msgstr "_Kilépés" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Rögzítés az úthoz" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Útikalauz" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Ráközelítés" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Teljes képernyő" + +msgid "Data" +msgstr "Adat" + +msgid "N" +msgstr "É" + +msgid "NE" +msgstr "ÉK" + +msgid "E" +msgstr "K" + +msgid "SE" +msgstr "DK" + +msgid "S" +msgstr "D" + +msgid "SW" +msgstr "DNy" + +msgid "W" +msgstr "Ny" + +msgid "NW" +msgstr "ÉNy" + +msgid "No" +msgstr "Nincs" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Útvonal hossza: %4.0fkm, becsült menetidő: %02d:%02d" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Útvonal hossza 0000km, becsült menetidő: 0+00:00" + +msgid "Back to map" +msgstr "Vissza a térképhez" + +msgid "Main Menu" +msgstr "Főmenü" + +msgid "Help" +msgstr "Súgó" + +msgid "Back" +msgstr "Vissza" + +msgid "Add Bookmark" +msgstr "Könyvjelző hozzáadása" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "POI-k" + +msgid "View in Browser" +msgstr "Megtekintés böngészőben" + +msgid "Streets" +msgstr "Utcák" + +msgid "House numbers" +msgstr "Házszámok" + +msgid "View Attributes" +msgstr "Attribútumok megjelenítése" + +msgid "View on map" +msgstr "Megtekintés térképen" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "Könyvjelzők" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "%s hozzáadása a könyvjelzőkhöz" + +msgid "Former Destinations" +msgstr "Korábbi úticélok" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Házszám" + +msgid "Layout" +msgstr "Elrendezés" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Térképek" + +msgid "Show Satellite Status" +msgstr "Műhold státusz" + +msgid " Elevation " +msgstr " Magasság " + +msgid " Azimuth " +msgstr " Irány " + +msgid "Show NMEA Data" +msgstr "NMEA adatok" + +msgid "car" +msgstr "autós" + +msgid "bike" +msgstr "kerékpáros" + +msgid "pedestrian" +msgstr "gyalogos" + +#, c-format +msgid "Current profile: %s" +msgstr "Jelenlegi profil: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Profil módosítása erre: %s" + +msgid "Set as active" +msgstr "Aktívra állítás" + +msgid "Show Satellite status" +msgstr "Műhold státusz" + +msgid "Show NMEA data" +msgstr "NMEA adatok" + +msgid "Vehicle" +msgstr "Jármű" + +msgid "Rules" +msgstr "Szabályok" + +msgid "Lock on road" +msgstr "Rögzítés az úthoz" + +msgid "Northing" +msgstr "Észak felé" + +msgid "Map follows Vehicle" +msgstr "A térkép követi a járművet" + +msgid "Message" +msgstr "Üzenet" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Útvonalleírás" + +msgid "Height Profile" +msgstr "Magassági profil" + +msgid "Show Locale" +msgstr "Hely megjelenítése" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "Vigyázz, kamera!" + +#. warning told +msgid "Please decrease your speed" +msgstr "Lassíts!" + +msgid "Map Point" +msgstr "Térképpont" + +msgid "Vehicle Position" +msgstr "Jármű helyzete" + +msgid "Main menu" +msgstr "Főmenü" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Térkép\n" +"megjelenítése" + +msgid "Settings" +msgstr "Beállítások" + +msgid "Tools" +msgstr "Eszközök" + +msgid "Route" +msgstr "Útvonal" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "Műveletek" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Kilépés" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Navigáció\n" +"leállítása" + +msgid "Display" +msgstr "Megjelenítés" + +msgid "Fullscreen" +msgstr "Teljes képernyő" + +msgid "Window Mode" +msgstr "Ablak mód" + +msgid "Description" +msgstr "Leírás" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "ló" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "%s után hajtson be a körforgalomba." + +#~ msgid "Cursor" +#~ msgstr "Mutató" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d,%d kilométer" + +#~ msgid " SNR " +#~ msgstr " SNR " + +#~ msgid " PRN " +#~ msgstr " PRN " diff --git a/po/id.po.in b/po/id.po.in new file mode 100644 index 0000000..40e26b3 --- /dev/null +++ b/po/id.po.in @@ -0,0 +1,1754 @@ +# Indonesian translation for navit +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the navit package. +# Joel-apobae.com , 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-05-27 15:01+0000\n" +"Last-Translator: M Bambang I \n" +"Language-Team: Indonesian \n" +"Language: id\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "penataan '%s' ke '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "ke nol" + +msgid "first" +msgstr "pertama" + +msgid "second" +msgstr "kedua" + +msgid "third" +msgstr "ketiga" + +msgid "fourth" +msgstr "keempat" + +msgid "fifth" +msgstr "kelima" + +msgid "sixth" +msgstr "keenam" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "" + +msgid "first exit" +msgstr "exit pertama" + +msgid "second exit" +msgstr "exit kedua" + +msgid "third exit" +msgstr "exit ketiga" + +msgid "fourth exit" +msgstr "exit keempat" + +msgid "fifth exit" +msgstr "exit kelima" + +msgid "sixth exit" +msgstr "exit keenam" + +#, c-format +msgid "%d m" +msgstr "%d meter" + +#, c-format +msgid "in %d m" +msgstr "dalam %d meter" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d meter" + +#, c-format +msgid "in %d meters" +msgstr "dalam %d meter" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d kilometer" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "dalam %d.%d kilometer" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "dalam %d kilometer" + +msgid "exit" +msgstr "keluar" + +msgid "into the ramp" +msgstr "menuju jalur yang melandai" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s menuju jalan %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%smenuju ke%s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%smenuju ke %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%smenuju ke %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%smenuju ke %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "kanan" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "Kiri" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "dengan mudah " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "Sangat " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "amat sangat " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "tidak diketahui " + +msgid "When possible, please turn around" +msgstr "bila memungkinkan, balik arah" + +msgid "Enter the roundabout soon" +msgstr "segera memasuki bundaran" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "kemudian tinggalkan bundaran pada %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Tinggalkan bundaran pada %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "ikuti jalan untuk ke tujuan berikutnya %s" + +msgid "soon" +msgstr "segera" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Ambil %1$s jalan ke %2$s" + +#, c-format +msgid "after %i roads" +msgstr "setelah %i jalan" + +msgid "now" +msgstr "saat ini" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "kemudian ambil %1$s jalan menuju %2$s" + +msgid "error" +msgstr "kesalahan" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Beloklah %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "kemudian beloklah %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "anda telah sampai pada tujuan %s" + +msgid "then you have reached your destination." +msgstr "kini anda telah sampai pada tujuan" + +msgid "Position" +msgstr "Posisi" + +msgid "Command" +msgstr "Perintah" + +msgid "Length" +msgstr "" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "" + +msgid "Destination Length" +msgstr "Jarak ke tujuan" + +msgid "Destination Time" +msgstr "Waktu di tujuan" + +msgid "Roadbook" +msgstr "Panduan perjalanan" + +msgid "Set as position" +msgstr "Tetapkan sebagai posisi" + +msgid "Set as destination" +msgstr "Tetapkan sebagai tujuan" + +msgid "Add as bookmark" +msgstr "Tambahkan sebagai penunjuk" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Titik 0X%x 0X%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Koordinat dilayar :%d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Uni Emirat Arab" + +#. 004 +msgid "Afghanistan" +msgstr "Afghanistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua dan Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albania" + +#. 051 +msgid "Armenia" +msgstr "Armenia" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Antilles Belanda" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antartika" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "American Samoa" + +#. 040 +msgid "Austria" +msgstr "Austria" + +#. 036 +msgid "Australia" +msgstr "Australia" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Kepulauan Aland" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbaijan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnia dan Herzegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesh" + +#. 056 +msgid "Belgium" +msgstr "Belgia" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgaria" + +#. 048 +msgid "Bahrain" +msgstr "Bahrain" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint Barthelemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei Darussalam" + +#. 068 +msgid "Bolivia" +msgstr "Bolivia" + +#. 076 +msgid "Brazil" +msgstr "Brasilia" + +#. 044 +msgid "Bahamas" +msgstr "Kepulauan Bahama" + +#. 064 +msgid "Bhutan" +msgstr "Butan" + +#. 074 +msgid "Bouvet Island" +msgstr "Pulau Bouvet" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Belarusia" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Kanada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Kepulauan Cocos (Keeling)" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Republik Demokrat Kongo" + +#. 140 +msgid "Central African Republic" +msgstr "Republik Afrika Tengah" + +#. 178 +msgid "Congo" +msgstr "Kongo" + +#. 756 +msgid "Switzerland" +msgstr "Swiss" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Pantai Gading" + +#. 184 +msgid "Cook Islands" +msgstr "Kepulauan Cook" + +#. 152 +msgid "Chile" +msgstr "Chili" + +#. 120 +msgid "Cameroon" +msgstr "Kamerun" + +#. 156 +msgid "China" +msgstr "China" + +#. 170 +msgid "Colombia" +msgstr "Kolombia" + +#. 188 +msgid "Costa Rica" +msgstr "Kosta Rika" + +#. 192 +msgid "Cuba" +msgstr "Kuba" + +#. 132 +msgid "Cape Verde" +msgstr "Tanjung Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Pulau Christmas" + +#. 196 +msgid "Cyprus" +msgstr "Siprus" + +#. 203 +msgid "Czech Republic" +msgstr "Republik Ceko" + +#. 276 +msgid "Germany" +msgstr "Jerman" + +#. 262 +msgid "Djibouti" +msgstr "Djibouti" + +#. 208 +msgid "Denmark" +msgstr "Denmark" + +#. 212 +msgid "Dominica" +msgstr "Dominika" + +#. 214 +msgid "Dominican Republic" +msgstr "Republik Dominikan" + +#. 012 +msgid "Algeria" +msgstr "Algeria" + +#. 218 +msgid "Ecuador" +msgstr "Ekuador" + +#. 233 +msgid "Estonia" +msgstr "Estonia" + +#. 818 +msgid "Egypt" +msgstr "Mesir" + +#. 732 +msgid "Western Sahara" +msgstr "Sahara Barat" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Spanyol" + +#. 231 +msgid "Ethiopia" +msgstr "Ethiopia" + +#. 246 +msgid "Finland" +msgstr "Finlandia" + +#. 242 +msgid "Fiji" +msgstr "Fiji" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Kepulauan Fakland (Malvinas)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "" + +#. 234 +msgid "Faroe Islands" +msgstr "Kepulauan Faroe" + +#. 250 +msgid "France" +msgstr "Perancis" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Inggris" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Georgia" + +#. 254 +msgid "French Guiana" +msgstr "Guiana Perancis" + +#. 831 +msgid "Guernsey" +msgstr "" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Jibraltar" + +#. 304 +msgid "Greenland" +msgstr "Greenland" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "" + +#. 226 +msgid "Equatorial Guinea" +msgstr "" + +#. 300 +msgid "Greece" +msgstr "Yunani" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Pulau Heard dan Kepulauan McDonald" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Kroatia" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Hongaria" + +#. 360 +msgid "Indonesia" +msgstr "Indonesia" + +#. 372 +msgid "Ireland" +msgstr "Irlandia" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "" + +#. 356 +msgid "India" +msgstr "India" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Republik Islam Iran" + +#. 352 +msgid "Iceland" +msgstr "Islandia" + +#. 380 +msgid "Italy" +msgstr "Italia" + +#. 832 +msgid "Jersey" +msgstr "" + +#. 388 +msgid "Jamaica" +msgstr "Jamaika" + +#. 400 +msgid "Jordan" +msgstr "Jordania" + +#. 392 +msgid "Japan" +msgstr "Jepang" + +#. 404 +msgid "Kenya" +msgstr "Kenya" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kyrgyzstan" + +#. 116 +msgid "Cambodia" +msgstr "Kamboja" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Komoro" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Korea Utara" + +#. 410 +msgid "Korea, Republic of" +msgstr "Korea Selatan" + +#. 414 +msgid "Kuwait" +msgstr "Kuwait" + +#. 136 +msgid "Cayman Islands" +msgstr "Kepulauan Cayman" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazakhstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "" + +#. 422 +msgid "Lebanon" +msgstr "Lebanon" + +#. 662 +msgid "Saint Lucia" +msgstr "Santa Lusia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberia" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Lithuania" + +#. 442 +msgid "Luxembourg" +msgstr "" + +#. 428 +msgid "Latvia" +msgstr "Latvia" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "" + +#. 504 +msgid "Morocco" +msgstr "Maroko" + +#. 492 +msgid "Monaco" +msgstr "Monaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Republik Moldova" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "" + +#. 450 +msgid "Madagascar" +msgstr "Madagaskar" + +#. 584 +msgid "Marshall Islands" +msgstr "Kepulauan Mashall" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongolia" + +#. 446 +msgid "Macao" +msgstr "Makao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "" + +#. 474 +msgid "Martinique" +msgstr "" + +#. 478 +msgid "Mauritania" +msgstr "Mauritania" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauritius" + +#. 462 +msgid "Maldives" +msgstr "Maldives" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mexico" + +#. 458 +msgid "Malaysia" +msgstr "Malaysia" + +#. 508 +msgid "Mozambique" +msgstr "" + +#. 516 +msgid "Namibia" +msgstr "Namibia" + +#. 540 +msgid "New Caledonia" +msgstr "Kaledonia Baru" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Pulau Norfolk" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nikaragua" + +#. 528 +msgid "Netherlands" +msgstr "Belanda" + +#. 578 +msgid "Norway" +msgstr "Norwegia" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "" + +#. 554 +msgid "New Zealand" +msgstr "Selandia Baru" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "" + +#. 598 +msgid "Papua New Guinea" +msgstr "" + +#. 608 +msgid "Philippines" +msgstr "Philipina" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Polandia" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "" + +#. 612 +msgid "Pitcairn" +msgstr "" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguai" + +#. 634 +msgid "Qatar" +msgstr "" + +#. 638 +msgid "Reunion" +msgstr "" + +#. 642 +msgid "Romania" +msgstr "Romania" + +#. 688 +msgid "Serbia" +msgstr "Serbia" + +#. 643 +msgid "Russian Federation" +msgstr "Federasi Rusia" + +#. 646 +msgid "Rwanda" +msgstr "Rwanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Arab Saudi" + +#. 090 +msgid "Solomon Islands" +msgstr "Kepulauan Salomon" + +#. 690 +msgid "Seychelles" +msgstr "" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Swedia" + +#. 702 +msgid "Singapore" +msgstr "Singapura" + +#. 654 +msgid "Saint Helena" +msgstr "" + +#. 705 +msgid "Slovenia" +msgstr "Slovenia" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "" + +#. 703 +msgid "Slovakia" +msgstr "Slovakia" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalia" + +#. 740 +msgid "Suriname" +msgstr "Suriname" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Republik Arab Siria" + +#. 748 +msgid "Swaziland" +msgstr "" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "" + +#. 148 +msgid "Chad" +msgstr "Chad" + +#. 260 +msgid "French Southern Territories" +msgstr "" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Thailand" + +#. 762 +msgid "Tajikistan" +msgstr "Tajikistan" + +#. 772 +msgid "Tokelau" +msgstr "" + +#. 626 +msgid "Timor-Leste" +msgstr "Timor-Leste" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunisia" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turki" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad dan Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "" + +#. 804 +msgid "Ukraine" +msgstr "Ukraina" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "" + +#. 840 +msgid "United States" +msgstr "Amerika Serikat" + +#. 858 +msgid "Uruguay" +msgstr "Uruguai" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Vatikan" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "" + +#. 704 +msgid "Viet Nam" +msgstr "Viet Nam" + +#. 548 +msgid "Vanuatu" +msgstr "" + +#. 876 +msgid "Wallis and Futuna" +msgstr "" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Yaman" + +#. 175 +msgid "Mayotte" +msgstr "" + +#. 710 +msgid "South Africa" +msgstr "Afika Selatan" + +#. 894 +msgid "Zambia" +msgstr "Zambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "" + +msgid "Car" +msgstr "Mibil" + +msgid "Iso2" +msgstr "" + +msgid "Iso3" +msgstr "" + +msgid "Country" +msgstr "Negara" + +msgid "Postal" +msgstr "Pos" + +msgid "Town" +msgstr "Kota" + +msgid "District" +msgstr "" + +msgid "Street" +msgstr "Jalan" + +msgid "Number" +msgstr "Nomer" + +msgid "Enter Destination" +msgstr "Masukan Tujuan" + +msgid "Zip Code" +msgstr "kode Pos" + +msgid "City" +msgstr "kota" + +msgid "District/Township" +msgstr "" + +msgid "Map" +msgstr "Peta" + +msgid "Bookmark" +msgstr "" + +msgid "Destination" +msgstr "Tujuan" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Tampilan" + +msgid "_Route" +msgstr "Rute" + +msgid "_Former Destinations" +msgstr "" + +msgid "_Bookmarks" +msgstr "" + +msgid "_Map" +msgstr "Peta" + +msgid "_Layout" +msgstr "" + +msgid "_Projection" +msgstr "Proyeksi" + +msgid "_Vehicle" +msgstr "Kendaraan" + +msgid "Zoom_Out" +msgstr "" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Menghitung ulang" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Informasi" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Navigasi berhenti" + +msgid "Test" +msgstr "Tes" + +msgid "_Quit" +msgstr "" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Panduan perjalanan" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "AutoZoom" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Layar penuh" + +msgid "Data" +msgstr "Data" + +msgid "N" +msgstr "Utara" + +msgid "NE" +msgstr "Timur Laut" + +msgid "E" +msgstr "Timur" + +msgid "SE" +msgstr "Tenggara" + +msgid "S" +msgstr "Selatan" + +msgid "SW" +msgstr "Barat Daya" + +msgid "W" +msgstr "Barat" + +msgid "NW" +msgstr "Barat Laut" + +msgid "No" +msgstr "Tidak" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Rute %4.0fkm %02d:%02d Perkiraan waktu kedatangan" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Rute 0000km 0+00:00 Perkiraan waktu kedatangan" + +msgid "Back to map" +msgstr "Kembali ke Peta" + +msgid "Main Menu" +msgstr "Menu Utama" + +msgid "Help" +msgstr "Bantuan" + +msgid "Back" +msgstr "Kembali" + +msgid "Add Bookmark" +msgstr "Tambah Penanda" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "POIs" + +msgid "View in Browser" +msgstr "" + +msgid "Streets" +msgstr "jalan" + +msgid "House numbers" +msgstr "Nomor Rumah" + +msgid "View Attributes" +msgstr "Lihat atribut" + +msgid "View on map" +msgstr "Lihat pada peta" + +msgid "Cut Bookmark" +msgstr "Hapus penanda" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "Penanda %s" + +msgid "Former Destinations" +msgstr "" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Nomer rumah" + +msgid "Layout" +msgstr "" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Peta - peta" + +msgid "Show Satellite Status" +msgstr "Status Satelit" + +msgid " Elevation " +msgstr " Elevasi " + +msgid " Azimuth " +msgstr " Azimuth " + +msgid "Show NMEA Data" +msgstr "Data NMEA" + +msgid "car" +msgstr "mobil" + +msgid "bike" +msgstr "sepeda" + +msgid "pedestrian" +msgstr "pejalan kaki" + +#, c-format +msgid "Current profile: %s" +msgstr "Profil saat ini: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "" + +msgid "Set as active" +msgstr "Diaktifkan" + +msgid "Show Satellite status" +msgstr "Status Satelit" + +msgid "Show NMEA data" +msgstr "Data NMEA" + +msgid "Vehicle" +msgstr "Kendaraan" + +msgid "Rules" +msgstr "Aturan - aturan" + +msgid "Lock on road" +msgstr "Kunci pada jalan" + +msgid "Northing" +msgstr "Keutara" + +msgid "Map follows Vehicle" +msgstr "Peta mengikuti kendaraan" + +msgid "Message" +msgstr "Pesan" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Deskripsi rute" + +msgid "Height Profile" +msgstr "Profil ketinggian" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "Tentang Navit" + +#. Authors +msgid "By" +msgstr "Oleh" + +#. Contributors +msgid "And all the Navit Team" +msgstr "Dan seluruh anggota tim Navit" + +msgid "members and contributors." +msgstr "para anggota dan kontributor" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Letak pada peta" + +msgid "Vehicle Position" +msgstr "Posisi kendaraan" + +msgid "Main menu" +msgstr "Menu Utama" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Tampilan\n" +"Map" + +msgid "Settings" +msgstr "Pengaturan" + +msgid "Tools" +msgstr "Peralatan" + +msgid "Route" +msgstr "Rute" + +msgid "About" +msgstr "Tentang" + +msgid "Actions" +msgstr "Tindakan-tindakan" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Berhenti" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Navigasi\n" +"Berhenti" + +msgid "Display" +msgstr "Tampilan" + +msgid "Fullscreen" +msgstr "Layar penuh" + +msgid "Window Mode" +msgstr "" + +msgid "Description" +msgstr "Deskripsi" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "kuda" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "Dalam %s,memasuki bundaran" diff --git a/po/it.po.in b/po/it.po.in new file mode 100644 index 0000000..ed361bf --- /dev/null +++ b/po/it.po.in @@ -0,0 +1,1768 @@ +# translation of it.po to Italiano +# Italian translations for navit +# Copyright (C) 2007, 2008 The Navit Team +# This file is distributed under the same license as the navit package. +# Andrea GHENSI 2007 +# Niccolo Rigacci , 2008. +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-05-18 09:27+0000\n" +"Last-Translator: Marco Ciampa \n" +"Language-Team: Italiano\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Esecuzione dalla cartella di compilazione\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "impostazione di '%s' a '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "zero" + +msgid "first" +msgstr "primo" + +msgid "second" +msgstr "secondo" + +msgid "third" +msgstr "terzo" + +msgid "fourth" +msgstr "quarto" + +msgid "fifth" +msgstr "quinto" + +msgid "sixth" +msgstr "sesto" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "Uscita zero" + +msgid "first exit" +msgstr "prima uscita" + +msgid "second exit" +msgstr "seconda uscita" + +msgid "third exit" +msgstr "terza uscita" + +msgid "fourth exit" +msgstr "quarta uscita" + +msgid "fifth exit" +msgstr "quinta uscita" + +msgid "sixth exit" +msgstr "sesta uscita" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "fra %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metri" + +#, c-format +msgid "in %d meters" +msgstr "fra %d metri" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d chilometri" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "fra %d,%d chilometri" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "un chilometro" +msgstr[1] "%d chilometri" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "fra un chilometro" +msgstr[1] "fra %d chilometri" + +msgid "exit" +msgstr "esci" + +msgid "into the ramp" +msgstr "nella rampa" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%sin %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%sin %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%sin %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%sin %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%sin %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "destra" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "sinistra" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "leggermente " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "decisamente " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "molto decisamente " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "facendo quasi inversione " + +msgid "When possible, please turn around" +msgstr "Appena possibile, invertire il senso di marcia" + +msgid "Enter the roundabout soon" +msgstr "Tra poco si entrerà in rotonda" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "e alla rotonda prendere la %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Alla rotonda prendere la %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Seguire la strada per i prossimi %s" + +msgid "soon" +msgstr "tra poco" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Prendere la %1$s strada a %2$s" + +#, c-format +msgid "after %i roads" +msgstr "tra %i strade" + +msgid "now" +msgstr "adesso" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "poi prendere la %1$s strada a %2$s" + +msgid "error" +msgstr "errore" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Svoltare %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "poi girare %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Siete arrivati a destinazione %s" + +msgid "then you have reached your destination." +msgstr "poi sarete arrivati a destinazione" + +msgid "Position" +msgstr "Posizione" + +msgid "Command" +msgstr "Indicazione" + +msgid "Length" +msgstr "Distanza" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Tempo" + +msgid "Destination Length" +msgstr "Distanza all'arrivo" + +msgid "Destination Time" +msgstr "Tempo all'arrivo" + +msgid "Roadbook" +msgstr "Quaderno di viaggio" + +msgid "Set as position" +msgstr "Imposta come posizione" + +msgid "Set as destination" +msgstr "Imposta come destinazione" + +msgid "Add as bookmark" +msgstr "Aggiungi come segnalibro" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Punto 0x%x, 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Coordinate schermo: %d, %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Emirati Arabi Uniti" + +#. 004 +msgid "Afghanistan" +msgstr "Afghanistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua e Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albania" + +#. 051 +msgid "Armenia" +msgstr "Armenia" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Antille olandesi" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antartide" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "Samoa Americane" + +#. 040 +msgid "Austria" +msgstr "Austria" + +#. 036 +msgid "Australia" +msgstr "Australia" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Isole Åland" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbaigian" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnia - Herzegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesh" + +#. 056 +msgid "Belgium" +msgstr "Belgio" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgaria" + +#. 048 +msgid "Bahrain" +msgstr "Bahrain" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint-Barthélemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei" + +#. 068 +msgid "Bolivia" +msgstr "Bolivia" + +#. 076 +msgid "Brazil" +msgstr "Brasile" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "Bhutan" + +#. 074 +msgid "Bouvet Island" +msgstr "Isola Bouvet" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Bielorussia" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Canada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Isole Cocos" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Congo, Repubblica Democratica del" + +#. 140 +msgid "Central African Republic" +msgstr "Repubblica Centrafricana" + +#. 178 +msgid "Congo" +msgstr "Congo" + +#. 756 +msgid "Switzerland" +msgstr "Svizzera" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Costa d'Avorio" + +#. 184 +msgid "Cook Islands" +msgstr "Isole Cook" + +#. 152 +msgid "Chile" +msgstr "Cile" + +#. 120 +msgid "Cameroon" +msgstr "Camerun" + +#. 156 +msgid "China" +msgstr "Cina" + +#. 170 +msgid "Colombia" +msgstr "Colombia" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Cuba" + +#. 132 +msgid "Cape Verde" +msgstr "Capo Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Isola di Natale" + +#. 196 +msgid "Cyprus" +msgstr "Cipro" + +#. 203 +msgid "Czech Republic" +msgstr "Repubblica Ceca" + +#. 276 +msgid "Germany" +msgstr "Germania" + +#. 262 +msgid "Djibouti" +msgstr "Gibuti" + +#. 208 +msgid "Denmark" +msgstr "Danimarca" + +#. 212 +msgid "Dominica" +msgstr "Dominica" + +#. 214 +msgid "Dominican Republic" +msgstr "Repubblica Dominicana" + +#. 012 +msgid "Algeria" +msgstr "Algeria" + +#. 218 +msgid "Ecuador" +msgstr "Ecuador" + +#. 233 +msgid "Estonia" +msgstr "Estonia" + +#. 818 +msgid "Egypt" +msgstr "Egitto" + +#. 732 +msgid "Western Sahara" +msgstr "Sahara Occidentale" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Spagna" + +#. 231 +msgid "Ethiopia" +msgstr "Etiopia" + +#. 246 +msgid "Finland" +msgstr "Finlandia" + +#. 242 +msgid "Fiji" +msgstr "Figi" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Isole Falkland (Malvinas)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Stati Federati di Micronesia" + +#. 234 +msgid "Faroe Islands" +msgstr "Isole Fær Øer" + +#. 250 +msgid "France" +msgstr "Francia" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Regno Unito" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Georgia" + +#. 254 +msgid "French Guiana" +msgstr "Guyana Francese" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibilterra" + +#. 304 +msgid "Greenland" +msgstr "Groenlandia" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadalupa" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Guinea Equatoriale" + +#. 300 +msgid "Greece" +msgstr "Grecia" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Georgia del Sud e Isole delle Sandwich meridionali" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Isole Heard e McDonald" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Croazia" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Ungheria" + +#. 360 +msgid "Indonesia" +msgstr "Indonesia" + +#. 372 +msgid "Ireland" +msgstr "Irlanda" + +#. 376 +msgid "Israel" +msgstr "Israele" + +#. 833 +msgid "Isle of Man" +msgstr "Isola di Man" + +#. 356 +msgid "India" +msgstr "India" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Territorio Britannico dell'Oceano Indiano" + +#. 368 +msgid "Iraq" +msgstr "Iraq" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iran, Repubblica Islamica dell'" + +#. 352 +msgid "Iceland" +msgstr "Islanda" + +#. 380 +msgid "Italy" +msgstr "Italia" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Giamaica" + +#. 400 +msgid "Jordan" +msgstr "Giordania" + +#. 392 +msgid "Japan" +msgstr "Giappone" + +#. 404 +msgid "Kenya" +msgstr "Kenya" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirghizistan" + +#. 116 +msgid "Cambodia" +msgstr "Cambogia" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Comore" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Saint Kitts e Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Corea, Repubblica Democratica Popolare di" + +#. 410 +msgid "Korea, Republic of" +msgstr "Corea, Repubblica di" + +#. 414 +msgid "Kuwait" +msgstr "Kuwait" + +#. 136 +msgid "Cayman Islands" +msgstr "Isole Cayman" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazakistan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laos, Repubblica popolare democratica del" + +#. 422 +msgid "Lebanon" +msgstr "Libano" + +#. 662 +msgid "Saint Lucia" +msgstr "Santa Lucia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberia" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Lituania" + +#. 442 +msgid "Luxembourg" +msgstr "Lussemburgo" + +#. 428 +msgid "Latvia" +msgstr "Lettonia" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libia" + +#. 504 +msgid "Morocco" +msgstr "Marocco" + +#. 492 +msgid "Monaco" +msgstr "Principato di Monaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldavia" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Saint-Martin (parte francese)" + +#. 450 +msgid "Madagascar" +msgstr "Madagascar" + +#. 584 +msgid "Marshall Islands" +msgstr "Isole Marshall" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Repubblica di Macedonia" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongolia" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Isole Marianne Settentrionali" + +#. 474 +msgid "Martinique" +msgstr "Martinica" + +#. 478 +msgid "Mauritania" +msgstr "Mauritania" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauritius" + +#. 462 +msgid "Maldives" +msgstr "Maldive" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Messico" + +#. 458 +msgid "Malaysia" +msgstr "Malesia" + +#. 508 +msgid "Mozambique" +msgstr "Mozambico" + +#. 516 +msgid "Namibia" +msgstr "Namibia" + +#. 540 +msgid "New Caledonia" +msgstr "Nuova Caledonia" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Isola Norfolk" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nicaragua" + +#. 528 +msgid "Netherlands" +msgstr "Olanda" + +#. 578 +msgid "Norway" +msgstr "Norvegia" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Nuova Zelanda" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Perù" + +#. 258 +msgid "French Polynesia" +msgstr "Polinesia francese" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua Nuova Guinea" + +#. 608 +msgid "Philippines" +msgstr "Filippine" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Polonia" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint-Pierre e Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Isole Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Porto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestina" + +#. 620 +msgid "Portugal" +msgstr "Portogallo" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Qatar" + +#. 638 +msgid "Reunion" +msgstr "Isola della Riunione" + +#. 642 +msgid "Romania" +msgstr "Romania" + +#. 688 +msgid "Serbia" +msgstr "Serbia" + +#. 643 +msgid "Russian Federation" +msgstr "Federazione Russa" + +#. 646 +msgid "Rwanda" +msgstr "Ruanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Arabia Saudita" + +#. 090 +msgid "Solomon Islands" +msgstr "Isole Salomone" + +#. 690 +msgid "Seychelles" +msgstr "Seychelles" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Svezia" + +#. 702 +msgid "Singapore" +msgstr "Singapore" + +#. 654 +msgid "Saint Helena" +msgstr "Sant'Elena" + +#. 705 +msgid "Slovenia" +msgstr "Slovenia" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard e Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slovacchia" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalia" + +#. 740 +msgid "Suriname" +msgstr "Suriname" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "São Tomé e Príncipe" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Siria" + +#. 748 +msgid "Swaziland" +msgstr "Swaziland" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turks e Caicos" + +#. 148 +msgid "Chad" +msgstr "Ciad" + +#. 260 +msgid "French Southern Territories" +msgstr "Terre Australi e Antartiche Francesi" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Thailandia" + +#. 762 +msgid "Tajikistan" +msgstr "Tagikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Timor Est" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunisia" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turchia" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad e Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzania" + +#. 804 +msgid "Ukraine" +msgstr "Ucraina" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Isole minori esterne degli Stati Uniti" + +#. 840 +msgid "United States" +msgstr "Stati Uniti" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Città del Vaticano" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Saint Vincent e Grenadine" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Isole Vergini britanniche" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Isole Vergini americane" + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis e Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Yemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Sudafrica" + +#. 894 +msgid "Zambia" +msgstr "Zambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Sconosciuto, aggiungi tag is_in a quelle città" + +msgid "Car" +msgstr "Automobile" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Stato" + +msgid "Postal" +msgstr "Postale" + +msgid "Town" +msgstr "Centro abitato" + +msgid "District" +msgstr "Regione" + +msgid "Street" +msgstr "Via" + +msgid "Number" +msgstr "Numero" + +msgid "Enter Destination" +msgstr "Inserire la destinazione" + +msgid "Zip Code" +msgstr "C.A.P." + +msgid "City" +msgstr "Città" + +msgid "District/Township" +msgstr "Regione/provincia" + +msgid "Map" +msgstr "Mappa" + +msgid "Bookmark" +msgstr "Posto" + +msgid "Destination" +msgstr "Destinazione" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Visualizza" + +msgid "_Route" +msgstr "Percorso" + +msgid "_Former Destinations" +msgstr "Destinazioni precedenti" + +msgid "_Bookmarks" +msgstr "Posti" + +msgid "_Map" +msgstr "Mappa" + +msgid "_Layout" +msgstr "Layout" + +msgid "_Projection" +msgstr "Proiezione" + +msgid "_Vehicle" +msgstr "Veicolo" + +msgid "Zoom_Out" +msgstr "Zoom -" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Zoom +" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Ricalcola" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Informazioni" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Interrompi la navigazione" + +msgid "Test" +msgstr "Prova" + +msgid "_Quit" +msgstr "_Esci" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Prosegui su questa strada" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Quaderno di viaggio" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Zoom automatico" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Schermo intero" + +msgid "Data" +msgstr "Dati" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NE" + +msgid "E" +msgstr "E" + +msgid "SE" +msgstr "SE" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SO" + +msgid "W" +msgstr "O" + +msgid "NW" +msgstr "NO" + +msgid "No" +msgstr "No" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "" + +msgid "Back to map" +msgstr "Torna alla mappa" + +msgid "Main Menu" +msgstr "Menù principale" + +msgid "Help" +msgstr "Aiuto" + +msgid "Back" +msgstr "Indietro" + +msgid "Add Bookmark" +msgstr "Aggiungere un posto" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "Aggiungere una cartella di posti" + +msgid "Rename" +msgstr "Rinomina" + +msgid "POIs" +msgstr "Punti d'interesse" + +msgid "View in Browser" +msgstr "Visualizza nel browser" + +msgid "Streets" +msgstr "Strade" + +msgid "House numbers" +msgstr "Numeri civici" + +msgid "View Attributes" +msgstr "Visualizza attributi" + +msgid "View on map" +msgstr "Visualizza sulla mappa" + +msgid "Cut Bookmark" +msgstr "Taglia posto" + +msgid "Copy Bookmark" +msgstr "Copia posto" + +msgid "Rename Bookmark" +msgstr "Rinomina posto" + +msgid "Paste Bookmark" +msgstr "Incolla posto" + +msgid "Delete Bookmark" +msgstr "Cancella posto" + +msgid "Bookmarks" +msgstr "Posti" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Incolla posto" + +#, c-format +msgid "Bookmark %s" +msgstr "Posto %s" + +msgid "Former Destinations" +msgstr "Destinazioni precedenti" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Numero civico" + +msgid "Layout" +msgstr "Layout" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Mappe" + +msgid "Show Satellite Status" +msgstr "Mostra stato satellite" + +msgid " Elevation " +msgstr " Elevazione " + +msgid " Azimuth " +msgstr " Azimuth " + +msgid "Show NMEA Data" +msgstr "Mostra dati NMEA" + +msgid "car" +msgstr "automobile" + +msgid "bike" +msgstr "bicicletta" + +msgid "pedestrian" +msgstr "pedone" + +#, c-format +msgid "Current profile: %s" +msgstr "Profilo corrente: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Cambia profilo con: %s" + +msgid "Set as active" +msgstr "Imposta come attivo" + +msgid "Show Satellite status" +msgstr "Mostra stato satellite" + +msgid "Show NMEA data" +msgstr "Mostra dati NMEA" + +msgid "Vehicle" +msgstr "Veicolo" + +msgid "Rules" +msgstr "Regole" + +msgid "Lock on road" +msgstr "Blocca sulla strada" + +msgid "Northing" +msgstr "Visione verso nord" + +msgid "Map follows Vehicle" +msgstr "La mappa segue il veicolo" + +msgid "Message" +msgstr "Messaggio" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Descrizione del percorso" + +msgid "Height Profile" +msgstr "Altimetria" + +msgid "Show Locale" +msgstr "Mostra la localizzazione" + +msgid "About Navit" +msgstr "Info su Navit" + +#. Authors +msgid "By" +msgstr "di" + +#. Contributors +msgid "And all the Navit Team" +msgstr "e tutta la squadra Navit" + +msgid "members and contributors." +msgstr "membri e contributori." + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Punto sulla mappa" + +msgid "Vehicle Position" +msgstr "Posizione del veicolo" + +msgid "Main menu" +msgstr "Menù principale" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Mostra\n" +"Mappa" + +msgid "Settings" +msgstr "Impostazioni" + +msgid "Tools" +msgstr "Strumenti" + +msgid "Route" +msgstr "Percorso" + +msgid "About" +msgstr "Info" + +msgid "Actions" +msgstr "Azioni" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Esci" + +msgid "" +"Stop\n" +"Navigation" +msgstr "Stop" + +msgid "Display" +msgstr "Visualizza" + +msgid "Fullscreen" +msgstr "Schermo intero" + +msgid "Window Mode" +msgstr "Modalità finestre" + +msgid "Description" +msgstr "Descrizione" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "cavallo" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "Tra %s entrare nella rotonda" + +#~ msgid "Cursor" +#~ msgstr "Posizione attuale" + +#~ msgid "Route %4.0fkm %02d:%02d ETA" +#~ msgstr "Percorso %4.0f km, %02d:%02d ETA" + +#~ msgid "Route 0000km 0+00:00 ETA" +#~ msgstr "Percorso 0000 km, 00:00 ETA" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d,%d chilometri" diff --git a/po/ja.po.in b/po/ja.po.in new file mode 100644 index 0000000..a82f306 --- /dev/null +++ b/po/ja.po.in @@ -0,0 +1,1751 @@ +# Japanese translation for navit +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the navit package. +# MontBlanc, 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2009-07-02 22:46+0000\n" +"Last-Translator: KaZeR \n" +"Language-Team: Japanese \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "" + +msgid "first" +msgstr "" + +msgid "second" +msgstr "" + +msgid "third" +msgstr "" + +msgid "fourth" +msgstr "" + +msgid "fifth" +msgstr "" + +msgid "sixth" +msgstr "" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "" + +msgid "first exit" +msgstr "" + +msgid "second exit" +msgstr "" + +msgid "third exit" +msgstr "" + +msgid "fourth exit" +msgstr "" + +msgid "fifth exit" +msgstr "" + +msgid "sixth exit" +msgstr "" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d メートル" + +#, c-format +msgid "in %d meters" +msgstr "" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "" +msgstr[1] "" + +msgid "exit" +msgstr "" + +msgid "into the ramp" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "右" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "左" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "" + +msgid "When possible, please turn around" +msgstr "" + +msgid "Enter the roundabout soon" +msgstr "" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "" + +msgid "soon" +msgstr "まもなく" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "" + +#, c-format +msgid "after %i roads" +msgstr "" + +msgid "now" +msgstr "今" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "" + +msgid "error" +msgstr "" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "" + +#, c-format +msgid "You have reached your destination %s" +msgstr "目的地の%sにつきました" + +msgid "then you have reached your destination." +msgstr "" + +msgid "Position" +msgstr "" + +msgid "Command" +msgstr "コマンド" + +msgid "Length" +msgstr "" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "" + +msgid "Destination Length" +msgstr "" + +msgid "Destination Time" +msgstr "" + +msgid "Roadbook" +msgstr "" + +msgid "Set as position" +msgstr "現在地として設定" + +msgid "Set as destination" +msgstr "目的地として設定" + +msgid "Add as bookmark" +msgstr "" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "" + +#. 020 +msgid "Andorra" +msgstr "アンドラ" + +#. 784 +msgid "United Arab Emirates" +msgstr "アラブ首長国連邦" + +#. 004 +msgid "Afghanistan" +msgstr "アフガニスタン" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "アンティグア・バーブーダ" + +#. 660 +msgid "Anguilla" +msgstr "アンギラ" + +#. 008 +msgid "Albania" +msgstr "アルバニア" + +#. 051 +msgid "Armenia" +msgstr "アルメニア" + +#. 530 +msgid "Netherlands Antilles" +msgstr "オランダ領アンティル" + +#. 024 +msgid "Angola" +msgstr "アンゴラ" + +#. 010 +msgid "Antarctica" +msgstr "南極" + +#. 032 +msgid "Argentina" +msgstr "アルゼンチン" + +#. 016 +msgid "American Samoa" +msgstr "アメリカ領サモア" + +#. 040 +msgid "Austria" +msgstr "オーストリア" + +#. 036 +msgid "Australia" +msgstr "オーストラリア" + +#. 533 +msgid "Aruba" +msgstr "アルバ" + +#. 248 +msgid "Aland Islands" +msgstr "オーランド諸島" + +#. 031 +msgid "Azerbaijan" +msgstr "アゼルバイジャン" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "ボスニア・ヘルツェゴビナ" + +#. 052 +msgid "Barbados" +msgstr "バルバドス" + +#. 050 +msgid "Bangladesh" +msgstr "バングラデシュ" + +#. 056 +msgid "Belgium" +msgstr "ベルギー" + +#. 854 +msgid "Burkina Faso" +msgstr "ブルキナファソ" + +#. 100 +msgid "Bulgaria" +msgstr "ブルガリア" + +#. 048 +msgid "Bahrain" +msgstr "バーレーン" + +#. 108 +msgid "Burundi" +msgstr "ブルンジ" + +#. 204 +msgid "Benin" +msgstr "ベナン" + +#. 652 +msgid "Saint Barthelemy" +msgstr "" + +#. 060 +msgid "Bermuda" +msgstr "バミューダ諸島" + +#. 096 +msgid "Brunei Darussalam" +msgstr "ブルネイ・ダルサラーム" + +#. 068 +msgid "Bolivia" +msgstr "ボリビア" + +#. 076 +msgid "Brazil" +msgstr "ブラジル" + +#. 044 +msgid "Bahamas" +msgstr "バハマ" + +#. 064 +msgid "Bhutan" +msgstr "ブータン" + +#. 074 +msgid "Bouvet Island" +msgstr "ブーベ島" + +#. 072 +msgid "Botswana" +msgstr "ボツワナ" + +#. 112 +msgid "Belarus" +msgstr "ベラルーシ" + +#. 084 +msgid "Belize" +msgstr "ベリーズ" + +#. 124 +msgid "Canada" +msgstr "カナダ" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "ココス (キーリング) 諸島" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "コンゴ民主共和国" + +#. 140 +msgid "Central African Republic" +msgstr "中央アフリカ共和国" + +#. 178 +msgid "Congo" +msgstr "コンゴ" + +#. 756 +msgid "Switzerland" +msgstr "スイス" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "コートジボアール" + +#. 184 +msgid "Cook Islands" +msgstr "クック諸島" + +#. 152 +msgid "Chile" +msgstr "チリ" + +#. 120 +msgid "Cameroon" +msgstr "カメルーン" + +#. 156 +msgid "China" +msgstr "中国" + +#. 170 +msgid "Colombia" +msgstr "コロンビア" + +#. 188 +msgid "Costa Rica" +msgstr "コスタリカ" + +#. 192 +msgid "Cuba" +msgstr "キューバ" + +#. 132 +msgid "Cape Verde" +msgstr "カーボベルデ" + +#. 162 +msgid "Christmas Island" +msgstr "クリスマス島" + +#. 196 +msgid "Cyprus" +msgstr "キプロス" + +#. 203 +msgid "Czech Republic" +msgstr "チェコ共和国" + +#. 276 +msgid "Germany" +msgstr "ドイツ" + +#. 262 +msgid "Djibouti" +msgstr "ジブチ" + +#. 208 +msgid "Denmark" +msgstr "デンマーク" + +#. 212 +msgid "Dominica" +msgstr "ドミニカ" + +#. 214 +msgid "Dominican Republic" +msgstr "ドミニカ共和国" + +#. 012 +msgid "Algeria" +msgstr "アルジェリア" + +#. 218 +msgid "Ecuador" +msgstr "エクアドル" + +#. 233 +msgid "Estonia" +msgstr "エストニア" + +#. 818 +msgid "Egypt" +msgstr "エジプト" + +#. 732 +msgid "Western Sahara" +msgstr "西サハラ" + +#. 232 +msgid "Eritrea" +msgstr "エリトリア" + +#. 724 +msgid "Spain" +msgstr "スペイン" + +#. 231 +msgid "Ethiopia" +msgstr "エチオピア" + +#. 246 +msgid "Finland" +msgstr "フィンランド" + +#. 242 +msgid "Fiji" +msgstr "フィジー" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "フォークランド諸島 (マルビナス)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "ミクロネシア連邦邦国" + +#. 234 +msgid "Faroe Islands" +msgstr "フェロー諸島" + +#. 250 +msgid "France" +msgstr "フランス" + +#. 266 +msgid "Gabon" +msgstr "ガボン" + +#. 826 +msgid "United Kingdom" +msgstr "イギリス" + +#. 308 +msgid "Grenada" +msgstr "グレナダ" + +#. 268 +msgid "Georgia" +msgstr "グルジア" + +#. 254 +msgid "French Guiana" +msgstr "フランス領ギアナ" + +#. 831 +msgid "Guernsey" +msgstr "ガーンジー島" + +#. 288 +msgid "Ghana" +msgstr "ガーナ" + +#. 292 +msgid "Gibraltar" +msgstr "ジブラルタル" + +#. 304 +msgid "Greenland" +msgstr "グリーンランド" + +#. 270 +msgid "Gambia" +msgstr "ガンビア" + +#. 324 +msgid "Guinea" +msgstr "ギニア" + +#. 312 +msgid "Guadeloupe" +msgstr "グアドループ島" + +#. 226 +msgid "Equatorial Guinea" +msgstr "赤道ギニア" + +#. 300 +msgid "Greece" +msgstr "ギリシャ" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "南ジョージア島・南サンドイッチ諸島" + +#. 320 +msgid "Guatemala" +msgstr "グアテマラ" + +#. 316 +msgid "Guam" +msgstr "グアム" + +#. 624 +msgid "Guinea-Bissau" +msgstr "ギニアビサウ" + +#. 328 +msgid "Guyana" +msgstr "ガイアナ" + +#. 344 +msgid "Hong Kong" +msgstr "香港" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "ハード島とマクドナルド諸島" + +#. 340 +msgid "Honduras" +msgstr "ホンジュラス" + +#. 191 +msgid "Croatia" +msgstr "クロアチア" + +#. 332 +msgid "Haiti" +msgstr "ハイチ" + +#. 348 +msgid "Hungary" +msgstr "ハンガリー" + +#. 360 +msgid "Indonesia" +msgstr "インドネシア" + +#. 372 +msgid "Ireland" +msgstr "アイルランド" + +#. 376 +msgid "Israel" +msgstr "イスラエル" + +#. 833 +msgid "Isle of Man" +msgstr "マン島" + +#. 356 +msgid "India" +msgstr "インド" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "イギリス領インド洋地域" + +#. 368 +msgid "Iraq" +msgstr "イラク" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "イラン・イスラム共和国" + +#. 352 +msgid "Iceland" +msgstr "アイスランド" + +#. 380 +msgid "Italy" +msgstr "イタリア" + +#. 832 +msgid "Jersey" +msgstr "ジャージー島" + +#. 388 +msgid "Jamaica" +msgstr "ジャマイカ" + +#. 400 +msgid "Jordan" +msgstr "ヨルダン" + +#. 392 +msgid "Japan" +msgstr "日本" + +#. 404 +msgid "Kenya" +msgstr "ケニア" + +#. 417 +msgid "Kyrgyzstan" +msgstr "キルギス" + +#. 116 +msgid "Cambodia" +msgstr "カンボジア" + +#. 296 +msgid "Kiribati" +msgstr "キリバス共和国" + +#. 174 +msgid "Comoros" +msgstr "コモロ" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "朝鮮民主主義人民共和国" + +#. 410 +msgid "Korea, Republic of" +msgstr "大韓民国 (韓国)" + +#. 414 +msgid "Kuwait" +msgstr "クウェート" + +#. 136 +msgid "Cayman Islands" +msgstr "ケイマン諸島" + +#. 398 +msgid "Kazakhstan" +msgstr "カザフスタン" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "ラオス人民民主共和国" + +#. 422 +msgid "Lebanon" +msgstr "レバノン" + +#. 662 +msgid "Saint Lucia" +msgstr "セントルシア" + +#. 438 +msgid "Liechtenstein" +msgstr "リヒテンシュタイン" + +#. 144 +msgid "Sri Lanka" +msgstr "スリランカ" + +#. 430 +msgid "Liberia" +msgstr "リベリア" + +#. 426 +msgid "Lesotho" +msgstr "レソト" + +#. 440 +msgid "Lithuania" +msgstr "リトアニア" + +#. 442 +msgid "Luxembourg" +msgstr "ルクセンブルク" + +#. 428 +msgid "Latvia" +msgstr "ラトビア" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "" + +#. 504 +msgid "Morocco" +msgstr "モロッコ" + +#. 492 +msgid "Monaco" +msgstr "モナコ" + +#. 498 +msgid "Moldova, Republic of" +msgstr "モルドバ共和国" + +#. 499 +msgid "Montenegro" +msgstr "モンテネグロ" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "" + +#. 450 +msgid "Madagascar" +msgstr "マダガスカル" + +#. 584 +msgid "Marshall Islands" +msgstr "マーシャル諸島" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "" + +#. 466 +msgid "Mali" +msgstr "マリ" + +#. 104 +msgid "Myanmar" +msgstr "ミャンマー" + +#. 496 +msgid "Mongolia" +msgstr "モンゴル" + +#. 446 +msgid "Macao" +msgstr "マカオ" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "北マリアナ諸島連邦" + +#. 474 +msgid "Martinique" +msgstr "マルティニク" + +#. 478 +msgid "Mauritania" +msgstr "モーリタニア" + +#. 500 +msgid "Montserrat" +msgstr "モントセラト" + +#. 470 +msgid "Malta" +msgstr "マルタ" + +#. 480 +msgid "Mauritius" +msgstr "モーリシャス" + +#. 462 +msgid "Maldives" +msgstr "モルディブ" + +#. 454 +msgid "Malawi" +msgstr "マラウイ" + +#. 484 +msgid "Mexico" +msgstr "メキシコ" + +#. 458 +msgid "Malaysia" +msgstr "マレーシア" + +#. 508 +msgid "Mozambique" +msgstr "モザンビーク" + +#. 516 +msgid "Namibia" +msgstr "ナミビア" + +#. 540 +msgid "New Caledonia" +msgstr "ニューカレドニア" + +#. 562 +msgid "Niger" +msgstr "ニジェール" + +#. 574 +msgid "Norfolk Island" +msgstr "ノーフォーク島" + +#. 566 +msgid "Nigeria" +msgstr "ナイジェリア" + +#. 558 +msgid "Nicaragua" +msgstr "ニカラグア" + +#. 528 +msgid "Netherlands" +msgstr "オランダ" + +#. 578 +msgid "Norway" +msgstr "ノルウェー" + +#. 524 +msgid "Nepal" +msgstr "ネパール" + +#. 520 +msgid "Nauru" +msgstr "ナウル語" + +#. 570 +msgid "Niue" +msgstr "ニウエ" + +#. 554 +msgid "New Zealand" +msgstr "ニュージーランド" + +#. 512 +msgid "Oman" +msgstr "オマーン" + +#. 591 +msgid "Panama" +msgstr "パナマ" + +#. 604 +msgid "Peru" +msgstr "ペルー" + +#. 258 +msgid "French Polynesia" +msgstr "フランス領ポリネシア" + +#. 598 +msgid "Papua New Guinea" +msgstr "パプアニューギニア" + +#. 608 +msgid "Philippines" +msgstr "フィリピン" + +#. 586 +msgid "Pakistan" +msgstr "パキスタン" + +#. 616 +msgid "Poland" +msgstr "ポーランド" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "サンピエールエミクロン" + +#. 612 +msgid "Pitcairn" +msgstr "ピトケルン" + +#. 630 +msgid "Puerto Rico" +msgstr "プエルトリコ" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "パレスチナ占領地区" + +#. 620 +msgid "Portugal" +msgstr "ポルトガル" + +#. 585 +msgid "Palau" +msgstr "パラオ" + +#. 600 +msgid "Paraguay" +msgstr "パラグアイ" + +#. 634 +msgid "Qatar" +msgstr "カタール" + +#. 638 +msgid "Reunion" +msgstr "レユニオン" + +#. 642 +msgid "Romania" +msgstr "ルーマニア" + +#. 688 +msgid "Serbia" +msgstr "セルビア" + +#. 643 +msgid "Russian Federation" +msgstr "ロシア連邦" + +#. 646 +msgid "Rwanda" +msgstr "ルワンダ" + +#. 682 +msgid "Saudi Arabia" +msgstr "サウジアラビア" + +#. 090 +msgid "Solomon Islands" +msgstr "ソロモン諸島" + +#. 690 +msgid "Seychelles" +msgstr "セーシェル" + +#. 736 +msgid "Sudan" +msgstr "スーダン" + +#. 752 +msgid "Sweden" +msgstr "スウェーデン" + +#. 702 +msgid "Singapore" +msgstr "シンガポール" + +#. 654 +msgid "Saint Helena" +msgstr "セントヘレナ" + +#. 705 +msgid "Slovenia" +msgstr "スロベニア" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "" + +#. 703 +msgid "Slovakia" +msgstr "スロバキア" + +#. 694 +msgid "Sierra Leone" +msgstr "シエラレオネ" + +#. 674 +msgid "San Marino" +msgstr "サンマリノ" + +#. 686 +msgid "Senegal" +msgstr "セネガル" + +#. 706 +msgid "Somalia" +msgstr "ソマリア" + +#. 740 +msgid "Suriname" +msgstr "スリナム" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "サントメ・プリンシペ" + +#. 222 +msgid "El Salvador" +msgstr "エルサルバドル" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "シリアアラブ共和国" + +#. 748 +msgid "Swaziland" +msgstr "スワジランド" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "タークス諸島・カイコス諸島" + +#. 148 +msgid "Chad" +msgstr "チャド" + +#. 260 +msgid "French Southern Territories" +msgstr "仏領極南諸島" + +#. 768 +msgid "Togo" +msgstr "トーゴ" + +#. 764 +msgid "Thailand" +msgstr "タイ" + +#. 762 +msgid "Tajikistan" +msgstr "タジキスタン" + +#. 772 +msgid "Tokelau" +msgstr "トケラウ" + +#. 626 +msgid "Timor-Leste" +msgstr "東ティモール" + +#. 795 +msgid "Turkmenistan" +msgstr "トルクメニスタン" + +#. 788 +msgid "Tunisia" +msgstr "チュニジア" + +#. 776 +msgid "Tonga" +msgstr "トンガ" + +#. 792 +msgid "Turkey" +msgstr "トルコ" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "トリニダード・トバゴ" + +#. 798 +msgid "Tuvalu" +msgstr "ツバル" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "タニザニア連合共和国" + +#. 804 +msgid "Ukraine" +msgstr "ウクライナ" + +#. 800 +msgid "Uganda" +msgstr "ウガンダ" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "合衆国領有小離島" + +#. 840 +msgid "United States" +msgstr "アメリカ合衆国" + +#. 858 +msgid "Uruguay" +msgstr "ウルグアイ" + +#. 860 +msgid "Uzbekistan" +msgstr "ウズベキスタン" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "" + +#. 862 +msgid "Venezuela" +msgstr "ベネズエラ" + +#. 092 +msgid "Virgin Islands, British" +msgstr "イギリス領ヴァージン諸島" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "アメリカ領ヴァージン諸島" + +#. 704 +msgid "Viet Nam" +msgstr "ベトナム" + +#. 548 +msgid "Vanuatu" +msgstr "バヌアツ" + +#. 876 +msgid "Wallis and Futuna" +msgstr "" + +#. 882 +msgid "Samoa" +msgstr "サモア" + +#. 887 +msgid "Yemen" +msgstr "イエメン" + +#. 175 +msgid "Mayotte" +msgstr "" + +#. 710 +msgid "South Africa" +msgstr "南アフリカ" + +#. 894 +msgid "Zambia" +msgstr "ザンビア" + +#. 716 +msgid "Zimbabwe" +msgstr "ジンバブエ" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "" + +msgid "Car" +msgstr "" + +msgid "Iso2" +msgstr "" + +msgid "Iso3" +msgstr "" + +msgid "Country" +msgstr "国" + +msgid "Postal" +msgstr "" + +msgid "Town" +msgstr "" + +msgid "District" +msgstr "" + +msgid "Street" +msgstr "" + +msgid "Number" +msgstr "" + +msgid "Enter Destination" +msgstr "目的地を入力" + +msgid "Zip Code" +msgstr "郵便番号" + +msgid "City" +msgstr "" + +msgid "District/Township" +msgstr "" + +msgid "Map" +msgstr "地図" + +msgid "Bookmark" +msgstr "ブックマーク" + +msgid "Destination" +msgstr "目的地" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "" + +msgid "_Route" +msgstr "ルート" + +msgid "_Former Destinations" +msgstr "前の目的地" + +msgid "_Bookmarks" +msgstr "ブックマーク" + +msgid "_Map" +msgstr "地図" + +msgid "_Layout" +msgstr "" + +msgid "_Projection" +msgstr "" + +msgid "_Vehicle" +msgstr "" + +msgid "Zoom_Out" +msgstr "ズームアウト" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "ズームイン" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "再計算" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "案内中止" + +msgid "Test" +msgstr "テスト" + +msgid "_Quit" +msgstr "" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "全画面表示" + +msgid "Data" +msgstr "" + +msgid "N" +msgstr "北" + +msgid "NE" +msgstr "北東" + +msgid "E" +msgstr "東" + +msgid "SE" +msgstr "南東" + +msgid "S" +msgstr "南" + +msgid "SW" +msgstr "南西" + +msgid "W" +msgstr "西" + +msgid "NW" +msgstr "北西" + +msgid "No" +msgstr "" + +msgid "2D" +msgstr "" + +msgid "3D" +msgstr "" + +msgid "OT" +msgstr "" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "" + +msgid "Back to map" +msgstr "" + +msgid "Main Menu" +msgstr "" + +msgid "Help" +msgstr "" + +msgid "Back" +msgstr "" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "" + +msgid "View in Browser" +msgstr "" + +msgid "Streets" +msgstr "" + +msgid "House numbers" +msgstr "" + +msgid "View Attributes" +msgstr "" + +msgid "View on map" +msgstr "" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "ブックマーク" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "" + +msgid "Former Destinations" +msgstr "前の目的地" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "" + +msgid "Layout" +msgstr "" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "" + +msgid "Show Satellite Status" +msgstr "" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "" + +msgid "car" +msgstr "" + +msgid "bike" +msgstr "" + +msgid "pedestrian" +msgstr "" + +#, c-format +msgid "Current profile: %s" +msgstr "" + +#, c-format +msgid "Change profile to: %s" +msgstr "" + +msgid "Set as active" +msgstr "" + +msgid "Show Satellite status" +msgstr "" + +msgid "Show NMEA data" +msgstr "" + +msgid "Vehicle" +msgstr "" + +msgid "Rules" +msgstr "" + +msgid "Lock on road" +msgstr "" + +msgid "Northing" +msgstr "" + +msgid "Map follows Vehicle" +msgstr "" + +msgid "Message" +msgstr "" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "" + +msgid "Vehicle Position" +msgstr "" + +msgid "Main menu" +msgstr "" + +msgid "" +"Show\n" +"Map" +msgstr "" + +msgid "Settings" +msgstr "" + +msgid "Tools" +msgstr "" + +msgid "Route" +msgstr "ルート" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" + +msgid "Display" +msgstr "" + +msgid "Fullscreen" +msgstr "全画面表示" + +msgid "Window Mode" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d キロメートル" diff --git a/po/jv.po.in b/po/jv.po.in new file mode 100644 index 0000000..a4e7a9f --- /dev/null +++ b/po/jv.po.in @@ -0,0 +1,1756 @@ +# Javanese translation for navit +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the navit package. +# Leonardus Priyo Handono, 2010 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-08-10 04:53+0000\n" +"Last-Translator: Leonardus Priyo Handono \n" +"Language-Team: Javanese \n" +"Language: jv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 0;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "" + +msgid "first" +msgstr "" + +msgid "second" +msgstr "" + +msgid "third" +msgstr "" + +msgid "fourth" +msgstr "" + +msgid "fifth" +msgstr "" + +msgid "sixth" +msgstr "" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "" + +msgid "first exit" +msgstr "metu kapisan" + +msgid "second exit" +msgstr "metu kapindho" + +msgid "third exit" +msgstr "metu katelu" + +msgid "fourth exit" +msgstr "metu kapapat" + +msgid "fifth exit" +msgstr "metu kalimo" + +msgid "sixth exit" +msgstr "metu kaenem" + +#, c-format +msgid "%d m" +msgstr "" + +#, c-format +msgid "in %d m" +msgstr "" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "" + +#, c-format +msgid "in %d meters" +msgstr "" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d kilometer" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "" +msgstr[1] "ing %d kilometer" + +msgid "exit" +msgstr "metu" + +msgid "into the ramp" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s ing dalan %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%s ing dalan %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%s ing dalan %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%s ing dalan %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%s ing dalan %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "nengen" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "ngiwa" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "kanthi gampang " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "ora dikenal " + +msgid "When possible, please turn around" +msgstr "Yen biso, mutero" + +msgid "Enter the roundabout soon" +msgstr "" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "terus metu soko puteran ing cawang kaping %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "metu soko puteran ing cawang kaping %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "tetep ing dalan iki nganti %s" + +msgid "soon" +msgstr "sedhelo maneh" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Jupuk dalan kaping %1$s ing %2$s" + +#, c-format +msgid "after %i roads" +msgstr "sakwise %i dalan" + +msgid "now" +msgstr "saiki" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "Jupuk dalan kaping %1$s neng %2$s" + +msgid "error" +msgstr "salah" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "menggok %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "terus menggok %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "" + +msgid "then you have reached your destination." +msgstr "terus panjenengan tekan tujuan" + +msgid "Position" +msgstr "dunung" + +msgid "Command" +msgstr "perintah" + +msgid "Length" +msgstr "Amba" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Wektu" + +msgid "Destination Length" +msgstr "" + +msgid "Destination Time" +msgstr "Wektu tekan tujuan" + +msgid "Roadbook" +msgstr "" + +msgid "Set as position" +msgstr "" + +msgid "Set as destination" +msgstr "Dadekno tujuan" + +msgid "Add as bookmark" +msgstr "" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Titik 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Koordinat layar : %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "" + +#. 004 +msgid "Afghanistan" +msgstr "Afganistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua lan Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albania" + +#. 051 +msgid "Armenia" +msgstr "Armenia" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Londo" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antartika" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "Samoa Amerika" + +#. 040 +msgid "Austria" +msgstr "Austria" + +#. 036 +msgid "Australia" +msgstr "Australia" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Pulo Aland" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbaijan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnia lan Herzegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesh" + +#. 056 +msgid "Belgium" +msgstr "Belgia" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgaria" + +#. 048 +msgid "Bahrain" +msgstr "Bahrain" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Santo Bartolomeus" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei Darussalam" + +#. 068 +msgid "Bolivia" +msgstr "Bolivia" + +#. 076 +msgid "Brazil" +msgstr "Brazil" + +#. 044 +msgid "Bahamas" +msgstr "Bahama" + +#. 064 +msgid "Bhutan" +msgstr "Bhutan" + +#. 074 +msgid "Bouvet Island" +msgstr "" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Belarusia" + +#. 084 +msgid "Belize" +msgstr "" + +#. 124 +msgid "Canada" +msgstr "Kanada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "" + +#. 140 +msgid "Central African Republic" +msgstr "Republik Afrika Tengah" + +#. 178 +msgid "Congo" +msgstr "Kongo" + +#. 756 +msgid "Switzerland" +msgstr "Swiss" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "" + +#. 184 +msgid "Cook Islands" +msgstr "" + +#. 152 +msgid "Chile" +msgstr "Chili" + +#. 120 +msgid "Cameroon" +msgstr "Kamerun" + +#. 156 +msgid "China" +msgstr "Cina" + +#. 170 +msgid "Colombia" +msgstr "Kolombia" + +#. 188 +msgid "Costa Rica" +msgstr "Kosta Rika" + +#. 192 +msgid "Cuba" +msgstr "Kuba" + +#. 132 +msgid "Cape Verde" +msgstr "" + +#. 162 +msgid "Christmas Island" +msgstr "Pulau Natal" + +#. 196 +msgid "Cyprus" +msgstr "Siprus" + +#. 203 +msgid "Czech Republic" +msgstr "Republik Czech" + +#. 276 +msgid "Germany" +msgstr "Jerman" + +#. 262 +msgid "Djibouti" +msgstr "Jibouti" + +#. 208 +msgid "Denmark" +msgstr "Denmark" + +#. 212 +msgid "Dominica" +msgstr "Dominika" + +#. 214 +msgid "Dominican Republic" +msgstr "Republik Dominika" + +#. 012 +msgid "Algeria" +msgstr "Algeria" + +#. 218 +msgid "Ecuador" +msgstr "Ekuador" + +#. 233 +msgid "Estonia" +msgstr "Estonia" + +#. 818 +msgid "Egypt" +msgstr "Mesir" + +#. 732 +msgid "Western Sahara" +msgstr "Sahara Kulon" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Spanyol" + +#. 231 +msgid "Ethiopia" +msgstr "Ethiopia" + +#. 246 +msgid "Finland" +msgstr "Finlandia" + +#. 242 +msgid "Fiji" +msgstr "Fiji" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "" + +#. 234 +msgid "Faroe Islands" +msgstr "" + +#. 250 +msgid "France" +msgstr "Perancis" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "" + +#. 308 +msgid "Grenada" +msgstr "" + +#. 268 +msgid "Georgia" +msgstr "Georgia" + +#. 254 +msgid "French Guiana" +msgstr "" + +#. 831 +msgid "Guernsey" +msgstr "" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadalupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "" + +#. 300 +msgid "Greece" +msgstr "" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Kroasia" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Hungaria" + +#. 360 +msgid "Indonesia" +msgstr "Indonesia" + +#. 372 +msgid "Ireland" +msgstr "Irlandia" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "" + +#. 356 +msgid "India" +msgstr "India" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Republik Islam Iran" + +#. 352 +msgid "Iceland" +msgstr "Islandia" + +#. 380 +msgid "Italy" +msgstr "Italia" + +#. 832 +msgid "Jersey" +msgstr "" + +#. 388 +msgid "Jamaica" +msgstr "Jamaika" + +#. 400 +msgid "Jordan" +msgstr "Yordania" + +#. 392 +msgid "Japan" +msgstr "Jepang" + +#. 404 +msgid "Kenya" +msgstr "Kenya" + +#. 417 +msgid "Kyrgyzstan" +msgstr "" + +#. 116 +msgid "Cambodia" +msgstr "" + +#. 296 +msgid "Kiribati" +msgstr "" + +#. 174 +msgid "Comoros" +msgstr "" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "" + +#. 410 +msgid "Korea, Republic of" +msgstr "" + +#. 414 +msgid "Kuwait" +msgstr "" + +#. 136 +msgid "Cayman Islands" +msgstr "" + +#. 398 +msgid "Kazakhstan" +msgstr "" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "" + +#. 422 +msgid "Lebanon" +msgstr "" + +#. 662 +msgid "Saint Lucia" +msgstr "" + +#. 438 +msgid "Liechtenstein" +msgstr "" + +#. 144 +msgid "Sri Lanka" +msgstr "" + +#. 430 +msgid "Liberia" +msgstr "" + +#. 426 +msgid "Lesotho" +msgstr "" + +#. 440 +msgid "Lithuania" +msgstr "" + +#. 442 +msgid "Luxembourg" +msgstr "" + +#. 428 +msgid "Latvia" +msgstr "" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "" + +#. 504 +msgid "Morocco" +msgstr "" + +#. 492 +msgid "Monaco" +msgstr "" + +#. 498 +msgid "Moldova, Republic of" +msgstr "" + +#. 499 +msgid "Montenegro" +msgstr "" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "" + +#. 450 +msgid "Madagascar" +msgstr "" + +#. 584 +msgid "Marshall Islands" +msgstr "" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "" + +#. 466 +msgid "Mali" +msgstr "" + +#. 104 +msgid "Myanmar" +msgstr "" + +#. 496 +msgid "Mongolia" +msgstr "" + +#. 446 +msgid "Macao" +msgstr "" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "" + +#. 474 +msgid "Martinique" +msgstr "" + +#. 478 +msgid "Mauritania" +msgstr "" + +#. 500 +msgid "Montserrat" +msgstr "" + +#. 470 +msgid "Malta" +msgstr "" + +#. 480 +msgid "Mauritius" +msgstr "" + +#. 462 +msgid "Maldives" +msgstr "" + +#. 454 +msgid "Malawi" +msgstr "" + +#. 484 +msgid "Mexico" +msgstr "" + +#. 458 +msgid "Malaysia" +msgstr "" + +#. 508 +msgid "Mozambique" +msgstr "" + +#. 516 +msgid "Namibia" +msgstr "" + +#. 540 +msgid "New Caledonia" +msgstr "" + +#. 562 +msgid "Niger" +msgstr "" + +#. 574 +msgid "Norfolk Island" +msgstr "" + +#. 566 +msgid "Nigeria" +msgstr "" + +#. 558 +msgid "Nicaragua" +msgstr "" + +#. 528 +msgid "Netherlands" +msgstr "" + +#. 578 +msgid "Norway" +msgstr "" + +#. 524 +msgid "Nepal" +msgstr "" + +#. 520 +msgid "Nauru" +msgstr "" + +#. 570 +msgid "Niue" +msgstr "" + +#. 554 +msgid "New Zealand" +msgstr "" + +#. 512 +msgid "Oman" +msgstr "" + +#. 591 +msgid "Panama" +msgstr "" + +#. 604 +msgid "Peru" +msgstr "" + +#. 258 +msgid "French Polynesia" +msgstr "" + +#. 598 +msgid "Papua New Guinea" +msgstr "" + +#. 608 +msgid "Philippines" +msgstr "" + +#. 586 +msgid "Pakistan" +msgstr "" + +#. 616 +msgid "Poland" +msgstr "" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "" + +#. 612 +msgid "Pitcairn" +msgstr "" + +#. 630 +msgid "Puerto Rico" +msgstr "" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "" + +#. 620 +msgid "Portugal" +msgstr "" + +#. 585 +msgid "Palau" +msgstr "" + +#. 600 +msgid "Paraguay" +msgstr "" + +#. 634 +msgid "Qatar" +msgstr "" + +#. 638 +msgid "Reunion" +msgstr "" + +#. 642 +msgid "Romania" +msgstr "" + +#. 688 +msgid "Serbia" +msgstr "" + +#. 643 +msgid "Russian Federation" +msgstr "" + +#. 646 +msgid "Rwanda" +msgstr "" + +#. 682 +msgid "Saudi Arabia" +msgstr "" + +#. 090 +msgid "Solomon Islands" +msgstr "" + +#. 690 +msgid "Seychelles" +msgstr "" + +#. 736 +msgid "Sudan" +msgstr "" + +#. 752 +msgid "Sweden" +msgstr "" + +#. 702 +msgid "Singapore" +msgstr "" + +#. 654 +msgid "Saint Helena" +msgstr "" + +#. 705 +msgid "Slovenia" +msgstr "" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "" + +#. 703 +msgid "Slovakia" +msgstr "" + +#. 694 +msgid "Sierra Leone" +msgstr "" + +#. 674 +msgid "San Marino" +msgstr "" + +#. 686 +msgid "Senegal" +msgstr "" + +#. 706 +msgid "Somalia" +msgstr "" + +#. 740 +msgid "Suriname" +msgstr "" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "" + +#. 222 +msgid "El Salvador" +msgstr "" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "" + +#. 748 +msgid "Swaziland" +msgstr "" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "" + +#. 148 +msgid "Chad" +msgstr "" + +#. 260 +msgid "French Southern Territories" +msgstr "" + +#. 768 +msgid "Togo" +msgstr "" + +#. 764 +msgid "Thailand" +msgstr "" + +#. 762 +msgid "Tajikistan" +msgstr "" + +#. 772 +msgid "Tokelau" +msgstr "" + +#. 626 +msgid "Timor-Leste" +msgstr "" + +#. 795 +msgid "Turkmenistan" +msgstr "" + +#. 788 +msgid "Tunisia" +msgstr "" + +#. 776 +msgid "Tonga" +msgstr "" + +#. 792 +msgid "Turkey" +msgstr "" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "" + +#. 798 +msgid "Tuvalu" +msgstr "" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "" + +#. 804 +msgid "Ukraine" +msgstr "" + +#. 800 +msgid "Uganda" +msgstr "" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "" + +#. 840 +msgid "United States" +msgstr "" + +#. 858 +msgid "Uruguay" +msgstr "" + +#. 860 +msgid "Uzbekistan" +msgstr "" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "" + +#. 862 +msgid "Venezuela" +msgstr "" + +#. 092 +msgid "Virgin Islands, British" +msgstr "" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "" + +#. 704 +msgid "Viet Nam" +msgstr "" + +#. 548 +msgid "Vanuatu" +msgstr "" + +#. 876 +msgid "Wallis and Futuna" +msgstr "" + +#. 882 +msgid "Samoa" +msgstr "" + +#. 887 +msgid "Yemen" +msgstr "" + +#. 175 +msgid "Mayotte" +msgstr "" + +#. 710 +msgid "South Africa" +msgstr "" + +#. 894 +msgid "Zambia" +msgstr "" + +#. 716 +msgid "Zimbabwe" +msgstr "" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "" + +msgid "Car" +msgstr "" + +msgid "Iso2" +msgstr "" + +msgid "Iso3" +msgstr "" + +msgid "Country" +msgstr "" + +msgid "Postal" +msgstr "" + +msgid "Town" +msgstr "" + +msgid "District" +msgstr "" + +msgid "Street" +msgstr "" + +msgid "Number" +msgstr "" + +msgid "Enter Destination" +msgstr "" + +msgid "Zip Code" +msgstr "" + +msgid "City" +msgstr "" + +msgid "District/Township" +msgstr "" + +msgid "Map" +msgstr "" + +msgid "Bookmark" +msgstr "" + +msgid "Destination" +msgstr "" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "" + +msgid "_Route" +msgstr "" + +msgid "_Former Destinations" +msgstr "" + +msgid "_Bookmarks" +msgstr "" + +msgid "_Map" +msgstr "" + +msgid "_Layout" +msgstr "" + +msgid "_Projection" +msgstr "" + +msgid "_Vehicle" +msgstr "" + +msgid "Zoom_Out" +msgstr "" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "" + +msgid "Test" +msgstr "" + +msgid "_Quit" +msgstr "" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "" + +msgid "Data" +msgstr "" + +msgid "N" +msgstr "" + +msgid "NE" +msgstr "" + +msgid "E" +msgstr "" + +msgid "SE" +msgstr "" + +msgid "S" +msgstr "" + +msgid "SW" +msgstr "" + +msgid "W" +msgstr "" + +msgid "NW" +msgstr "" + +msgid "No" +msgstr "" + +msgid "2D" +msgstr "" + +msgid "3D" +msgstr "" + +msgid "OT" +msgstr "" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "" + +msgid "Back to map" +msgstr "" + +msgid "Main Menu" +msgstr "" + +msgid "Help" +msgstr "" + +msgid "Back" +msgstr "" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "" + +msgid "View in Browser" +msgstr "" + +msgid "Streets" +msgstr "" + +msgid "House numbers" +msgstr "" + +msgid "View Attributes" +msgstr "" + +msgid "View on map" +msgstr "" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "" + +msgid "Former Destinations" +msgstr "" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "" + +msgid "Layout" +msgstr "" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "" + +msgid "Show Satellite Status" +msgstr "" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "" + +msgid "car" +msgstr "" + +msgid "bike" +msgstr "" + +msgid "pedestrian" +msgstr "" + +#, c-format +msgid "Current profile: %s" +msgstr "" + +#, c-format +msgid "Change profile to: %s" +msgstr "" + +msgid "Set as active" +msgstr "" + +msgid "Show Satellite status" +msgstr "" + +msgid "Show NMEA data" +msgstr "" + +msgid "Vehicle" +msgstr "" + +msgid "Rules" +msgstr "" + +msgid "Lock on road" +msgstr "" + +msgid "Northing" +msgstr "" + +msgid "Map follows Vehicle" +msgstr "" + +msgid "Message" +msgstr "" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "" + +msgid "Vehicle Position" +msgstr "" + +msgid "Main menu" +msgstr "" + +msgid "" +"Show\n" +"Map" +msgstr "" + +msgid "Settings" +msgstr "" + +msgid "Tools" +msgstr "" + +msgid "Route" +msgstr "" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" + +msgid "Display" +msgstr "" + +msgid "Fullscreen" +msgstr "" + +msgid "Window Mode" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "Enter the roundabout soon and leave it at the %s" +#~ msgstr "Mlebu puteran sedhelo maneh lan metu ing cawang %s" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "ing %s, mlebu puteran" diff --git a/po/kk.po.in b/po/kk.po.in new file mode 100644 index 0000000..23fb121 --- /dev/null +++ b/po/kk.po.in @@ -0,0 +1,1747 @@ +# Kazakh translation for navit +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the navit package. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-02-24 19:32+0000\n" +"Last-Translator: \n" +"Language-Team: Kazakh \n" +"Language: kk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "" + +msgid "first" +msgstr "" + +msgid "second" +msgstr "" + +msgid "third" +msgstr "" + +msgid "fourth" +msgstr "" + +msgid "fifth" +msgstr "" + +msgid "sixth" +msgstr "" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "" + +msgid "first exit" +msgstr "" + +msgid "second exit" +msgstr "" + +msgid "third exit" +msgstr "" + +msgid "fourth exit" +msgstr "" + +msgid "fifth exit" +msgstr "" + +msgid "sixth exit" +msgstr "" + +#, c-format +msgid "%d m" +msgstr "" + +#, c-format +msgid "in %d m" +msgstr "" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "" + +#, c-format +msgid "in %d meters" +msgstr "" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "" +msgstr[1] "" + +msgid "exit" +msgstr "" + +msgid "into the ramp" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "" + +msgid "When possible, please turn around" +msgstr "" + +msgid "Enter the roundabout soon" +msgstr "" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "" + +msgid "soon" +msgstr "" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "" + +#, c-format +msgid "after %i roads" +msgstr "" + +msgid "now" +msgstr "" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "" + +msgid "error" +msgstr "" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "" + +#, c-format +msgid "You have reached your destination %s" +msgstr "" + +msgid "then you have reached your destination." +msgstr "" + +msgid "Position" +msgstr "" + +msgid "Command" +msgstr "" + +msgid "Length" +msgstr "" + +msgid "km" +msgstr "" + +msgid "m" +msgstr "" + +msgid "Time" +msgstr "" + +msgid "Destination Length" +msgstr "" + +msgid "Destination Time" +msgstr "" + +msgid "Roadbook" +msgstr "" + +msgid "Set as position" +msgstr "" + +msgid "Set as destination" +msgstr "" + +msgid "Add as bookmark" +msgstr "" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "" + +#. 020 +msgid "Andorra" +msgstr "" + +#. 784 +msgid "United Arab Emirates" +msgstr "" + +#. 004 +msgid "Afghanistan" +msgstr "" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "" + +#. 660 +msgid "Anguilla" +msgstr "" + +#. 008 +msgid "Albania" +msgstr "" + +#. 051 +msgid "Armenia" +msgstr "" + +#. 530 +msgid "Netherlands Antilles" +msgstr "" + +#. 024 +msgid "Angola" +msgstr "" + +#. 010 +msgid "Antarctica" +msgstr "" + +#. 032 +msgid "Argentina" +msgstr "" + +#. 016 +msgid "American Samoa" +msgstr "" + +#. 040 +msgid "Austria" +msgstr "" + +#. 036 +msgid "Australia" +msgstr "" + +#. 533 +msgid "Aruba" +msgstr "" + +#. 248 +msgid "Aland Islands" +msgstr "" + +#. 031 +msgid "Azerbaijan" +msgstr "" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "" + +#. 052 +msgid "Barbados" +msgstr "" + +#. 050 +msgid "Bangladesh" +msgstr "" + +#. 056 +msgid "Belgium" +msgstr "" + +#. 854 +msgid "Burkina Faso" +msgstr "" + +#. 100 +msgid "Bulgaria" +msgstr "" + +#. 048 +msgid "Bahrain" +msgstr "" + +#. 108 +msgid "Burundi" +msgstr "" + +#. 204 +msgid "Benin" +msgstr "" + +#. 652 +msgid "Saint Barthelemy" +msgstr "" + +#. 060 +msgid "Bermuda" +msgstr "" + +#. 096 +msgid "Brunei Darussalam" +msgstr "" + +#. 068 +msgid "Bolivia" +msgstr "" + +#. 076 +msgid "Brazil" +msgstr "" + +#. 044 +msgid "Bahamas" +msgstr "" + +#. 064 +msgid "Bhutan" +msgstr "" + +#. 074 +msgid "Bouvet Island" +msgstr "" + +#. 072 +msgid "Botswana" +msgstr "" + +#. 112 +msgid "Belarus" +msgstr "" + +#. 084 +msgid "Belize" +msgstr "" + +#. 124 +msgid "Canada" +msgstr "" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "" + +#. 140 +msgid "Central African Republic" +msgstr "" + +#. 178 +msgid "Congo" +msgstr "" + +#. 756 +msgid "Switzerland" +msgstr "" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "" + +#. 184 +msgid "Cook Islands" +msgstr "" + +#. 152 +msgid "Chile" +msgstr "" + +#. 120 +msgid "Cameroon" +msgstr "" + +#. 156 +msgid "China" +msgstr "" + +#. 170 +msgid "Colombia" +msgstr "" + +#. 188 +msgid "Costa Rica" +msgstr "" + +#. 192 +msgid "Cuba" +msgstr "" + +#. 132 +msgid "Cape Verde" +msgstr "" + +#. 162 +msgid "Christmas Island" +msgstr "" + +#. 196 +msgid "Cyprus" +msgstr "" + +#. 203 +msgid "Czech Republic" +msgstr "" + +#. 276 +msgid "Germany" +msgstr "" + +#. 262 +msgid "Djibouti" +msgstr "" + +#. 208 +msgid "Denmark" +msgstr "" + +#. 212 +msgid "Dominica" +msgstr "" + +#. 214 +msgid "Dominican Republic" +msgstr "" + +#. 012 +msgid "Algeria" +msgstr "" + +#. 218 +msgid "Ecuador" +msgstr "" + +#. 233 +msgid "Estonia" +msgstr "" + +#. 818 +msgid "Egypt" +msgstr "" + +#. 732 +msgid "Western Sahara" +msgstr "" + +#. 232 +msgid "Eritrea" +msgstr "" + +#. 724 +msgid "Spain" +msgstr "" + +#. 231 +msgid "Ethiopia" +msgstr "" + +#. 246 +msgid "Finland" +msgstr "" + +#. 242 +msgid "Fiji" +msgstr "" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "" + +#. 234 +msgid "Faroe Islands" +msgstr "" + +#. 250 +msgid "France" +msgstr "" + +#. 266 +msgid "Gabon" +msgstr "" + +#. 826 +msgid "United Kingdom" +msgstr "" + +#. 308 +msgid "Grenada" +msgstr "" + +#. 268 +msgid "Georgia" +msgstr "" + +#. 254 +msgid "French Guiana" +msgstr "" + +#. 831 +msgid "Guernsey" +msgstr "" + +#. 288 +msgid "Ghana" +msgstr "" + +#. 292 +msgid "Gibraltar" +msgstr "" + +#. 304 +msgid "Greenland" +msgstr "" + +#. 270 +msgid "Gambia" +msgstr "" + +#. 324 +msgid "Guinea" +msgstr "" + +#. 312 +msgid "Guadeloupe" +msgstr "" + +#. 226 +msgid "Equatorial Guinea" +msgstr "" + +#. 300 +msgid "Greece" +msgstr "" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "" + +#. 320 +msgid "Guatemala" +msgstr "" + +#. 316 +msgid "Guam" +msgstr "" + +#. 624 +msgid "Guinea-Bissau" +msgstr "" + +#. 328 +msgid "Guyana" +msgstr "" + +#. 344 +msgid "Hong Kong" +msgstr "" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "" + +#. 340 +msgid "Honduras" +msgstr "" + +#. 191 +msgid "Croatia" +msgstr "" + +#. 332 +msgid "Haiti" +msgstr "" + +#. 348 +msgid "Hungary" +msgstr "" + +#. 360 +msgid "Indonesia" +msgstr "" + +#. 372 +msgid "Ireland" +msgstr "" + +#. 376 +msgid "Israel" +msgstr "" + +#. 833 +msgid "Isle of Man" +msgstr "" + +#. 356 +msgid "India" +msgstr "" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "" + +#. 368 +msgid "Iraq" +msgstr "" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "" + +#. 352 +msgid "Iceland" +msgstr "" + +#. 380 +msgid "Italy" +msgstr "" + +#. 832 +msgid "Jersey" +msgstr "" + +#. 388 +msgid "Jamaica" +msgstr "" + +#. 400 +msgid "Jordan" +msgstr "" + +#. 392 +msgid "Japan" +msgstr "" + +#. 404 +msgid "Kenya" +msgstr "" + +#. 417 +msgid "Kyrgyzstan" +msgstr "" + +#. 116 +msgid "Cambodia" +msgstr "" + +#. 296 +msgid "Kiribati" +msgstr "" + +#. 174 +msgid "Comoros" +msgstr "" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "" + +#. 410 +msgid "Korea, Republic of" +msgstr "" + +#. 414 +msgid "Kuwait" +msgstr "" + +#. 136 +msgid "Cayman Islands" +msgstr "" + +#. 398 +msgid "Kazakhstan" +msgstr "" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "" + +#. 422 +msgid "Lebanon" +msgstr "" + +#. 662 +msgid "Saint Lucia" +msgstr "" + +#. 438 +msgid "Liechtenstein" +msgstr "" + +#. 144 +msgid "Sri Lanka" +msgstr "" + +#. 430 +msgid "Liberia" +msgstr "" + +#. 426 +msgid "Lesotho" +msgstr "" + +#. 440 +msgid "Lithuania" +msgstr "" + +#. 442 +msgid "Luxembourg" +msgstr "" + +#. 428 +msgid "Latvia" +msgstr "" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "" + +#. 504 +msgid "Morocco" +msgstr "" + +#. 492 +msgid "Monaco" +msgstr "" + +#. 498 +msgid "Moldova, Republic of" +msgstr "" + +#. 499 +msgid "Montenegro" +msgstr "" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "" + +#. 450 +msgid "Madagascar" +msgstr "" + +#. 584 +msgid "Marshall Islands" +msgstr "" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "" + +#. 466 +msgid "Mali" +msgstr "" + +#. 104 +msgid "Myanmar" +msgstr "" + +#. 496 +msgid "Mongolia" +msgstr "" + +#. 446 +msgid "Macao" +msgstr "" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "" + +#. 474 +msgid "Martinique" +msgstr "" + +#. 478 +msgid "Mauritania" +msgstr "" + +#. 500 +msgid "Montserrat" +msgstr "" + +#. 470 +msgid "Malta" +msgstr "" + +#. 480 +msgid "Mauritius" +msgstr "" + +#. 462 +msgid "Maldives" +msgstr "" + +#. 454 +msgid "Malawi" +msgstr "" + +#. 484 +msgid "Mexico" +msgstr "" + +#. 458 +msgid "Malaysia" +msgstr "" + +#. 508 +msgid "Mozambique" +msgstr "" + +#. 516 +msgid "Namibia" +msgstr "" + +#. 540 +msgid "New Caledonia" +msgstr "" + +#. 562 +msgid "Niger" +msgstr "" + +#. 574 +msgid "Norfolk Island" +msgstr "" + +#. 566 +msgid "Nigeria" +msgstr "" + +#. 558 +msgid "Nicaragua" +msgstr "" + +#. 528 +msgid "Netherlands" +msgstr "" + +#. 578 +msgid "Norway" +msgstr "" + +#. 524 +msgid "Nepal" +msgstr "" + +#. 520 +msgid "Nauru" +msgstr "" + +#. 570 +msgid "Niue" +msgstr "" + +#. 554 +msgid "New Zealand" +msgstr "" + +#. 512 +msgid "Oman" +msgstr "" + +#. 591 +msgid "Panama" +msgstr "" + +#. 604 +msgid "Peru" +msgstr "" + +#. 258 +msgid "French Polynesia" +msgstr "" + +#. 598 +msgid "Papua New Guinea" +msgstr "" + +#. 608 +msgid "Philippines" +msgstr "" + +#. 586 +msgid "Pakistan" +msgstr "" + +#. 616 +msgid "Poland" +msgstr "" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "" + +#. 612 +msgid "Pitcairn" +msgstr "" + +#. 630 +msgid "Puerto Rico" +msgstr "" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "" + +#. 620 +msgid "Portugal" +msgstr "" + +#. 585 +msgid "Palau" +msgstr "" + +#. 600 +msgid "Paraguay" +msgstr "" + +#. 634 +msgid "Qatar" +msgstr "" + +#. 638 +msgid "Reunion" +msgstr "" + +#. 642 +msgid "Romania" +msgstr "" + +#. 688 +msgid "Serbia" +msgstr "" + +#. 643 +msgid "Russian Federation" +msgstr "" + +#. 646 +msgid "Rwanda" +msgstr "" + +#. 682 +msgid "Saudi Arabia" +msgstr "" + +#. 090 +msgid "Solomon Islands" +msgstr "" + +#. 690 +msgid "Seychelles" +msgstr "" + +#. 736 +msgid "Sudan" +msgstr "" + +#. 752 +msgid "Sweden" +msgstr "" + +#. 702 +msgid "Singapore" +msgstr "" + +#. 654 +msgid "Saint Helena" +msgstr "" + +#. 705 +msgid "Slovenia" +msgstr "" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "" + +#. 703 +msgid "Slovakia" +msgstr "" + +#. 694 +msgid "Sierra Leone" +msgstr "" + +#. 674 +msgid "San Marino" +msgstr "" + +#. 686 +msgid "Senegal" +msgstr "" + +#. 706 +msgid "Somalia" +msgstr "" + +#. 740 +msgid "Suriname" +msgstr "" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "" + +#. 222 +msgid "El Salvador" +msgstr "" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "" + +#. 748 +msgid "Swaziland" +msgstr "" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "" + +#. 148 +msgid "Chad" +msgstr "" + +#. 260 +msgid "French Southern Territories" +msgstr "" + +#. 768 +msgid "Togo" +msgstr "" + +#. 764 +msgid "Thailand" +msgstr "" + +#. 762 +msgid "Tajikistan" +msgstr "" + +#. 772 +msgid "Tokelau" +msgstr "" + +#. 626 +msgid "Timor-Leste" +msgstr "" + +#. 795 +msgid "Turkmenistan" +msgstr "" + +#. 788 +msgid "Tunisia" +msgstr "" + +#. 776 +msgid "Tonga" +msgstr "" + +#. 792 +msgid "Turkey" +msgstr "" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "" + +#. 798 +msgid "Tuvalu" +msgstr "" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "" + +#. 804 +msgid "Ukraine" +msgstr "" + +#. 800 +msgid "Uganda" +msgstr "" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "" + +#. 840 +msgid "United States" +msgstr "" + +#. 858 +msgid "Uruguay" +msgstr "" + +#. 860 +msgid "Uzbekistan" +msgstr "" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "" + +#. 862 +msgid "Venezuela" +msgstr "" + +#. 092 +msgid "Virgin Islands, British" +msgstr "" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "" + +#. 704 +msgid "Viet Nam" +msgstr "" + +#. 548 +msgid "Vanuatu" +msgstr "" + +#. 876 +msgid "Wallis and Futuna" +msgstr "" + +#. 882 +msgid "Samoa" +msgstr "" + +#. 887 +msgid "Yemen" +msgstr "" + +#. 175 +msgid "Mayotte" +msgstr "" + +#. 710 +msgid "South Africa" +msgstr "" + +#. 894 +msgid "Zambia" +msgstr "" + +#. 716 +msgid "Zimbabwe" +msgstr "" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "" + +msgid "Car" +msgstr "" + +msgid "Iso2" +msgstr "" + +msgid "Iso3" +msgstr "" + +msgid "Country" +msgstr "" + +msgid "Postal" +msgstr "" + +msgid "Town" +msgstr "" + +msgid "District" +msgstr "" + +msgid "Street" +msgstr "" + +msgid "Number" +msgstr "" + +msgid "Enter Destination" +msgstr "" + +msgid "Zip Code" +msgstr "" + +msgid "City" +msgstr "" + +msgid "District/Township" +msgstr "" + +msgid "Map" +msgstr "" + +msgid "Bookmark" +msgstr "" + +msgid "Destination" +msgstr "" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "" + +msgid "_Route" +msgstr "" + +msgid "_Former Destinations" +msgstr "" + +msgid "_Bookmarks" +msgstr "" + +msgid "_Map" +msgstr "" + +msgid "_Layout" +msgstr "" + +msgid "_Projection" +msgstr "" + +msgid "_Vehicle" +msgstr "" + +msgid "Zoom_Out" +msgstr "" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "" + +msgid "Test" +msgstr "" + +msgid "_Quit" +msgstr "" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "" + +msgid "Data" +msgstr "" + +msgid "N" +msgstr "" + +msgid "NE" +msgstr "" + +msgid "E" +msgstr "" + +msgid "SE" +msgstr "" + +msgid "S" +msgstr "" + +msgid "SW" +msgstr "" + +msgid "W" +msgstr "" + +msgid "NW" +msgstr "" + +msgid "No" +msgstr "" + +msgid "2D" +msgstr "" + +msgid "3D" +msgstr "" + +msgid "OT" +msgstr "" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "" + +msgid "Back to map" +msgstr "" + +msgid "Main Menu" +msgstr "" + +msgid "Help" +msgstr "" + +msgid "Back" +msgstr "" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "" + +msgid "View in Browser" +msgstr "" + +msgid "Streets" +msgstr "" + +msgid "House numbers" +msgstr "" + +msgid "View Attributes" +msgstr "" + +msgid "View on map" +msgstr "" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "" + +msgid "Former Destinations" +msgstr "" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "" + +msgid "Layout" +msgstr "" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "" + +msgid "Show Satellite Status" +msgstr "" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "" + +msgid "car" +msgstr "" + +msgid "bike" +msgstr "" + +msgid "pedestrian" +msgstr "" + +#, c-format +msgid "Current profile: %s" +msgstr "" + +#, c-format +msgid "Change profile to: %s" +msgstr "" + +msgid "Set as active" +msgstr "" + +msgid "Show Satellite status" +msgstr "" + +msgid "Show NMEA data" +msgstr "" + +msgid "Vehicle" +msgstr "" + +msgid "Rules" +msgstr "" + +msgid "Lock on road" +msgstr "" + +msgid "Northing" +msgstr "" + +msgid "Map follows Vehicle" +msgstr "" + +msgid "Message" +msgstr "" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "" + +msgid "Vehicle Position" +msgstr "" + +msgid "Main menu" +msgstr "" + +msgid "" +"Show\n" +"Map" +msgstr "" + +msgid "Settings" +msgstr "" + +msgid "Tools" +msgstr "" + +msgid "Route" +msgstr "" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" + +msgid "Display" +msgstr "" + +msgid "Fullscreen" +msgstr "" + +msgid "Window Mode" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" diff --git a/po/lt.po.in b/po/lt.po.in new file mode 100644 index 0000000..fde680d --- /dev/null +++ b/po/lt.po.in @@ -0,0 +1,1768 @@ +# Lithuanian translation for navit +# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 +# This file is distributed under the same license as the navit package. +# laimonas 2009 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2009-12-20 20:38+0000\n" +"Last-Translator: laimonas \n" +"Language-Team: Lithuanian \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" +"%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Paleidžiu pradiniame kataloge\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "nustatau iš '%s' į '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "nulinis" + +msgid "first" +msgstr "pirmas" + +msgid "second" +msgstr "antras" + +msgid "third" +msgstr "trečias" + +msgid "fourth" +msgstr "ketvirtas" + +msgid "fifth" +msgstr "penktas" + +msgid "sixth" +msgstr "šeštas" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "nulinis išvažiavimas" + +msgid "first exit" +msgstr "pirmas išvažiavimas" + +msgid "second exit" +msgstr "antras išvažiavimas" + +msgid "third exit" +msgstr "trečias išvažiavimas" + +msgid "fourth exit" +msgstr "ketvirtas išvažiavimas" + +msgid "fifth exit" +msgstr "penktas išvažiavimas" + +msgid "sixth exit" +msgstr "šeštas išvažiavimas" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "už %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metrai" + +#, c-format +msgid "in %d meters" +msgstr "už %d metrų" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "už %d.%d kilometrų" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "%d kilometras" +msgstr[1] "%d kilometrai" +msgstr[2] "%d kilometrai" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "už %d kilometro" +msgstr[1] "už %d kilometrų" +msgstr[2] "už %d kilometrų" + +msgid "exit" +msgstr "išvažiavimas" + +msgid "into the ramp" +msgstr "į rampą" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s į gatvę %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%s į %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%s į %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%s į %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%s į %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "dešinėn" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "kairėn" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "lengvai " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "stipriai " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "labai stipriai " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "nežinomas " + +msgid "When possible, please turn around" +msgstr "kai įmanoma, apsisukite" + +msgid "Enter the roundabout soon" +msgstr "Netrukus įsukite į žiedą" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "tada išsukite iš žiedo %s išvažiavime" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "išsukite iš žiedo %s išvažiavime" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Laikykitės kelio sekančius %s" + +msgid "soon" +msgstr "netrukus" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Važiuokite %1$s keliu į %2$s" + +#, c-format +msgid "after %i roads" +msgstr "už %i kelių" + +msgid "now" +msgstr "dabar" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "tada važiuokite %1$s keliu į %2$s" + +msgid "error" +msgstr "klaida" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Pasukite %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "tada pasukite %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Jūs pasiekėte tikslą %s" + +msgid "then you have reached your destination." +msgstr "tada jūs pasiekėte kelionės tikslą." + +msgid "Position" +msgstr "Pozicija" + +msgid "Command" +msgstr "Komanda" + +msgid "Length" +msgstr "Ilgis" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Laikas" + +msgid "Destination Length" +msgstr "Atvykimo ilgis" + +msgid "Destination Time" +msgstr "Atvykimo laikas" + +msgid "Roadbook" +msgstr "Kelionės knyga" + +msgid "Set as position" +msgstr "Nustatykite poziciją" + +msgid "Set as destination" +msgstr "Nustatykite tikslą" + +msgid "Add as bookmark" +msgstr "Pridėkite žymę" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Taškas 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Ekrano koordinatės : %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andora" + +#. 784 +msgid "United Arab Emirates" +msgstr "Jungtiniai Arabų Emyratai" + +#. 004 +msgid "Afghanistan" +msgstr "Afganistanas" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigva ir Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Angilija" + +#. 008 +msgid "Albania" +msgstr "Albanija" + +#. 051 +msgid "Armenia" +msgstr "Armėnija" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Olandijos Antilai" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarktida" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "Amerikos Samoa" + +#. 040 +msgid "Austria" +msgstr "Austrija" + +#. 036 +msgid "Australia" +msgstr "Australija" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Alandų salos" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbaidžanas" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnija ir Hercegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbadosas" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladešas" + +#. 056 +msgid "Belgium" +msgstr "Belgija" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Fasas" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgarija" + +#. 048 +msgid "Bahrain" +msgstr "Bahreinas" + +#. 108 +msgid "Burundi" +msgstr "Burundis" + +#. 204 +msgid "Benin" +msgstr "Beninas" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Švento Baltramiejaus sala" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunėjaus Darusalamas" + +#. 068 +msgid "Bolivia" +msgstr "Bolivija" + +#. 076 +msgid "Brazil" +msgstr "Brazilija" + +#. 044 +msgid "Bahamas" +msgstr "Bahamos" + +#. 064 +msgid "Bhutan" +msgstr "Butanas" + +#. 074 +msgid "Bouvet Island" +msgstr "Buvė sala" + +#. 072 +msgid "Botswana" +msgstr "Botsvana" + +#. 112 +msgid "Belarus" +msgstr "Gudija" + +#. 084 +msgid "Belize" +msgstr "Belizas" + +#. 124 +msgid "Canada" +msgstr "Kanada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Kokosų (Keelingo) salos" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Kongo Demokratinė Respublika" + +#. 140 +msgid "Central African Republic" +msgstr "Centrinės Afrikos Respublika" + +#. 178 +msgid "Congo" +msgstr "Kongas" + +#. 756 +msgid "Switzerland" +msgstr "Šveicarija" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Dramblio Kaulo Krantas" + +#. 184 +msgid "Cook Islands" +msgstr "Kuko salos" + +#. 152 +msgid "Chile" +msgstr "Čilė" + +#. 120 +msgid "Cameroon" +msgstr "Kamerūnas" + +#. 156 +msgid "China" +msgstr "Kinija" + +#. 170 +msgid "Colombia" +msgstr "Kolumbija" + +#. 188 +msgid "Costa Rica" +msgstr "Kosta Rika" + +#. 192 +msgid "Cuba" +msgstr "Kuba" + +#. 132 +msgid "Cape Verde" +msgstr "Žaliasis Kyšulys" + +#. 162 +msgid "Christmas Island" +msgstr "Kalėdų sala" + +#. 196 +msgid "Cyprus" +msgstr "Kipras" + +#. 203 +msgid "Czech Republic" +msgstr "Čekija" + +#. 276 +msgid "Germany" +msgstr "Vokietija" + +#. 262 +msgid "Djibouti" +msgstr "Džibutis" + +#. 208 +msgid "Denmark" +msgstr "Danija" + +#. 212 +msgid "Dominica" +msgstr "Dominika" + +#. 214 +msgid "Dominican Republic" +msgstr "Dominikos Respublika" + +#. 012 +msgid "Algeria" +msgstr "Alžyras" + +#. 218 +msgid "Ecuador" +msgstr "Ekvadoras" + +#. 233 +msgid "Estonia" +msgstr "Estija" + +#. 818 +msgid "Egypt" +msgstr "Egiptas" + +#. 732 +msgid "Western Sahara" +msgstr "Vakarų Sachara" + +#. 232 +msgid "Eritrea" +msgstr "Eritrėja" + +#. 724 +msgid "Spain" +msgstr "Ispanija" + +#. 231 +msgid "Ethiopia" +msgstr "Etiopija" + +#. 246 +msgid "Finland" +msgstr "Suomija" + +#. 242 +msgid "Fiji" +msgstr "Fidžis" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falklando (Malvinų) salos" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Mikronezijos Federacinės Valstijos" + +#. 234 +msgid "Faroe Islands" +msgstr "Farerų salos" + +#. 250 +msgid "France" +msgstr "Prancūzija" + +#. 266 +msgid "Gabon" +msgstr "Gabonas" + +#. 826 +msgid "United Kingdom" +msgstr "Jungtinė Karalystė" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Gruzija" + +#. 254 +msgid "French Guiana" +msgstr "Prancūzijos Gviana" + +#. 831 +msgid "Guernsey" +msgstr "Guernsis" + +#. 288 +msgid "Ghana" +msgstr "Gana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltaras" + +#. 304 +msgid "Greenland" +msgstr "Grenlandija" + +#. 270 +msgid "Gambia" +msgstr "Gambija" + +#. 324 +msgid "Guinea" +msgstr "Gvinėja" + +#. 312 +msgid "Guadeloupe" +msgstr "Gvadelupa" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Pusiaujo Gvinėja" + +#. 300 +msgid "Greece" +msgstr "Graikija" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Pietų Georgijos ir Pietų Sandwicho salos" + +#. 320 +msgid "Guatemala" +msgstr "Gvatemala" + +#. 316 +msgid "Guam" +msgstr "Guamas" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Bisau-Gvinėja" + +#. 328 +msgid "Guyana" +msgstr "Gajana" + +#. 344 +msgid "Hong Kong" +msgstr "Honk Kongas" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heardo ir McDonaldo salos" + +#. 340 +msgid "Honduras" +msgstr "Hondūras" + +#. 191 +msgid "Croatia" +msgstr "Kroatija" + +#. 332 +msgid "Haiti" +msgstr "Haitis" + +#. 348 +msgid "Hungary" +msgstr "Vengrija" + +#. 360 +msgid "Indonesia" +msgstr "Indonezija" + +#. 372 +msgid "Ireland" +msgstr "Airija" + +#. 376 +msgid "Israel" +msgstr "Izraelis" + +#. 833 +msgid "Isle of Man" +msgstr "Meno sala" + +#. 356 +msgid "India" +msgstr "Indija" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Indijos vandenyno britų sritis" + +#. 368 +msgid "Iraq" +msgstr "Irakas" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iranas" + +#. 352 +msgid "Iceland" +msgstr "Islandija" + +#. 380 +msgid "Italy" +msgstr "Italija" + +#. 832 +msgid "Jersey" +msgstr "Džersis" + +#. 388 +msgid "Jamaica" +msgstr "Jamaika" + +#. 400 +msgid "Jordan" +msgstr "Jordanas" + +#. 392 +msgid "Japan" +msgstr "Japonija" + +#. 404 +msgid "Kenya" +msgstr "Kenija" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirgizija" + +#. 116 +msgid "Cambodia" +msgstr "Kambodža" + +#. 296 +msgid "Kiribati" +msgstr "Kiribatis" + +#. 174 +msgid "Comoros" +msgstr "Komorai" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Sent Kitsas ir Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Korėjos Demokratinė Respublika" + +#. 410 +msgid "Korea, Republic of" +msgstr "Korėjos Respublika" + +#. 414 +msgid "Kuwait" +msgstr "Kuveitas" + +#. 136 +msgid "Cayman Islands" +msgstr "Kaimanų salos" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazachija" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laosas" + +#. 422 +msgid "Lebanon" +msgstr "Libanas" + +#. 662 +msgid "Saint Lucia" +msgstr "Šventoji Liucija" + +#. 438 +msgid "Liechtenstein" +msgstr "Lichtenšteinas" + +#. 144 +msgid "Sri Lanka" +msgstr "Šri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberija" + +#. 426 +msgid "Lesotho" +msgstr "Lesotas" + +#. 440 +msgid "Lithuania" +msgstr "Lietuva" + +#. 442 +msgid "Luxembourg" +msgstr "Liuksemburgas" + +#. 428 +msgid "Latvia" +msgstr "Latvija" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libija" + +#. 504 +msgid "Morocco" +msgstr "Marokas" + +#. 492 +msgid "Monaco" +msgstr "Monakas" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldova" + +#. 499 +msgid "Montenegro" +msgstr "Juodkalnija" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "San Martenas (Prancūzijos dalis)" + +#. 450 +msgid "Madagascar" +msgstr "Madagaskaras" + +#. 584 +msgid "Marshall Islands" +msgstr "Maršalo salos" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Makedonija" + +#. 466 +msgid "Mali" +msgstr "Malis" + +#. 104 +msgid "Myanmar" +msgstr "Mianmaras" + +#. 496 +msgid "Mongolia" +msgstr "Mongolija" + +#. 446 +msgid "Macao" +msgstr "Makao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Šiaurės Marianų salos" + +#. 474 +msgid "Martinique" +msgstr "Martinika" + +#. 478 +msgid "Mauritania" +msgstr "Mauritanija" + +#. 500 +msgid "Montserrat" +msgstr "Montserratas" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauricijus" + +#. 462 +msgid "Maldives" +msgstr "Maldyvai" + +#. 454 +msgid "Malawi" +msgstr "Malavis" + +#. 484 +msgid "Mexico" +msgstr "Meksika" + +#. 458 +msgid "Malaysia" +msgstr "Malaizija" + +#. 508 +msgid "Mozambique" +msgstr "Mozambikas" + +#. 516 +msgid "Namibia" +msgstr "Namibija" + +#. 540 +msgid "New Caledonia" +msgstr "Naujoji Kaledonija" + +#. 562 +msgid "Niger" +msgstr "Nigeris" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolko sala" + +#. 566 +msgid "Nigeria" +msgstr "Nigerija" + +#. 558 +msgid "Nicaragua" +msgstr "Nikaragva" + +#. 528 +msgid "Netherlands" +msgstr "Nyderlandai" + +#. 578 +msgid "Norway" +msgstr "Norvegija" + +#. 524 +msgid "Nepal" +msgstr "Nepalas" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niujė" + +#. 554 +msgid "New Zealand" +msgstr "Naujoji Zelandija" + +#. 512 +msgid "Oman" +msgstr "Omanas" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Prancūzijos Polinezija" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua Naujoji Gvinėja" + +#. 608 +msgid "Philippines" +msgstr "Filipinai" + +#. 586 +msgid "Pakistan" +msgstr "Pakistanas" + +#. 616 +msgid "Poland" +msgstr "Lenkija" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Sen Pjeras ir Mikelonas" + +#. 612 +msgid "Pitcairn" +msgstr "Pitkernas" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Riko" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Okupuota Palestinos teritorija" + +#. 620 +msgid "Portugal" +msgstr "Portugalija" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paragvajus" + +#. 634 +msgid "Qatar" +msgstr "Kataras" + +#. 638 +msgid "Reunion" +msgstr "Reunionas" + +#. 642 +msgid "Romania" +msgstr "Rumunija" + +#. 688 +msgid "Serbia" +msgstr "Serbija" + +#. 643 +msgid "Russian Federation" +msgstr "Rusijos Federacija" + +#. 646 +msgid "Rwanda" +msgstr "Ruanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Saudo Arabija" + +#. 090 +msgid "Solomon Islands" +msgstr "Saliamono salos" + +#. 690 +msgid "Seychelles" +msgstr "Seišeliai" + +#. 736 +msgid "Sudan" +msgstr "Sudanas" + +#. 752 +msgid "Sweden" +msgstr "Švedija" + +#. 702 +msgid "Singapore" +msgstr "Singapūras" + +#. 654 +msgid "Saint Helena" +msgstr "Šventoji Elena" + +#. 705 +msgid "Slovenia" +msgstr "Slovėnija" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbardo ir Jan Majen salos" + +#. 703 +msgid "Slovakia" +msgstr "Slovakija" + +#. 694 +msgid "Sierra Leone" +msgstr "Siera Leonė" + +#. 674 +msgid "San Marino" +msgstr "San Marinas" + +#. 686 +msgid "Senegal" +msgstr "Senegalas" + +#. 706 +msgid "Somalia" +msgstr "Somalis" + +#. 740 +msgid "Suriname" +msgstr "Surinamas" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "San Tomė ir Prinsipė" + +#. 222 +msgid "El Salvador" +msgstr "Salvadoras" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Sirijos Arabų Respublika" + +#. 748 +msgid "Swaziland" +msgstr "Svazilendas" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turkso ir Caicoso salos" + +#. 148 +msgid "Chad" +msgstr "Čadas" + +#. 260 +msgid "French Southern Territories" +msgstr "Prancūzijos Pietų sritys" + +#. 768 +msgid "Togo" +msgstr "Togas" + +#. 764 +msgid "Thailand" +msgstr "Tailandas" + +#. 762 +msgid "Tajikistan" +msgstr "Tadžikija" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Rytų Timoras" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmėnija" + +#. 788 +msgid "Tunisia" +msgstr "Tunisas" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turkija" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidadas ir Tobagas" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taivanas, Kinijos provincija" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzanija" + +#. 804 +msgid "Ukraine" +msgstr "Ukraina" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "JAV mažosios aplinkinės salos" + +#. 840 +msgid "United States" +msgstr "JAV" + +#. 858 +msgid "Uruguay" +msgstr "Urugvajus" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbekija" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Šventasis Sostas (Vatikano Miesto Valstybė)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Sent Vinsentas ir Grenadinai" + +#. 862 +msgid "Venezuela" +msgstr "Venesuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Mergelių salos, Jungtinė Karalystė" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Mergelių salos, JAV" + +#. 704 +msgid "Viet Nam" +msgstr "Vietnamas" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallisas ir Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Jemenas" + +#. 175 +msgid "Mayotte" +msgstr "Majotas" + +#. 710 +msgid "South Africa" +msgstr "Pietų Afrika" + +#. 894 +msgid "Zambia" +msgstr "Zambija" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabvė" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Nežinomas, pridėti is_in žodžius į šiuos miestus" + +msgid "Car" +msgstr "Automobilis" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Šalis:" + +msgid "Postal" +msgstr "Pašto" + +msgid "Town" +msgstr "Miestas" + +msgid "District" +msgstr "Rajonas" + +msgid "Street" +msgstr "Gatvė:" + +msgid "Number" +msgstr "Numeris" + +msgid "Enter Destination" +msgstr "Įveskite kelionės tikslą" + +msgid "Zip Code" +msgstr "Pašto kodas" + +msgid "City" +msgstr "Miestas" + +msgid "District/Township" +msgstr "Rajonas/miestas" + +msgid "Map" +msgstr "Žemėlapis" + +msgid "Bookmark" +msgstr "Pažymėti" + +msgid "Destination" +msgstr "Kelionės tikslas" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Rodyti" + +msgid "_Route" +msgstr "Parinkti kelią" + +msgid "_Former Destinations" +msgstr "Ankstesnės vietos" + +msgid "_Bookmarks" +msgstr "Adresynas" + +msgid "_Map" +msgstr "Žemėlapis" + +msgid "_Layout" +msgstr "Išdėstymas" + +msgid "_Projection" +msgstr "Projekcija" + +msgid "_Vehicle" +msgstr "Transporto priemonė" + +msgid "Zoom_Out" +msgstr "Sumažinti" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Padidinti" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Perskaičiuoti" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Informacija" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Stabdyti navigaciją" + +msgid "Test" +msgstr "Bandymas" + +msgid "_Quit" +msgstr "_Išeiti" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Sekti kelią" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Kelionės knyga" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Automatinis didinimas" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Visas ekranas" + +msgid "Data" +msgstr "Duomenys" + +msgid "N" +msgstr "Š" + +msgid "NE" +msgstr "ŠR" + +msgid "E" +msgstr "R" + +msgid "SE" +msgstr "PR" + +msgid "S" +msgstr "P" + +msgid "SW" +msgstr "PV" + +msgid "W" +msgstr "V" + +msgid "NW" +msgstr "ŠV" + +msgid "No" +msgstr "Ne" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Liko kelio %4.0fkm %02d:%02d atvykimo laikas" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Liko kelio 0000km 0+00:00 atvykimo laikas" + +msgid "Back to map" +msgstr "Grižti į žemėlapį" + +msgid "Main Menu" +msgstr "Pagrindinis meniu" + +msgid "Help" +msgstr "Žinynas" + +msgid "Back" +msgstr "Grįžti" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "Lankytinos vietos" + +msgid "View in Browser" +msgstr "Peržiūrėti naršyklėje" + +msgid "Streets" +msgstr "Gatvės" + +msgid "House numbers" +msgstr "Namų numeriai" + +msgid "View Attributes" +msgstr "Rodyti savybes" + +msgid "View on map" +msgstr "Rodyti žemėlapyje" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "Adresynas" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "Pasižymėti %s" + +msgid "Former Destinations" +msgstr "Ankstesnės vietos" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Namo numeris" + +msgid "Layout" +msgstr "Išdėstymas" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Žemėlapiai" + +msgid "Show Satellite Status" +msgstr "Parodyti palydovų būseną" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "Rodyti NMEA duomenis" + +msgid "car" +msgstr "" + +msgid "bike" +msgstr "" + +msgid "pedestrian" +msgstr "" + +#, c-format +msgid "Current profile: %s" +msgstr "" + +#, c-format +msgid "Change profile to: %s" +msgstr "" + +msgid "Set as active" +msgstr "Aktyvuoti" + +msgid "Show Satellite status" +msgstr "Parodyti palydovų būseną" + +msgid "Show NMEA data" +msgstr "Parodyti NMEA duomenis" + +msgid "Vehicle" +msgstr "Transporto priemonė" + +msgid "Rules" +msgstr "Taisyklės" + +msgid "Lock on road" +msgstr "Sekti kelią" + +msgid "Northing" +msgstr "Į šiaurę" + +msgid "Map follows Vehicle" +msgstr "Sekti transporto priemonę" + +msgid "Message" +msgstr "Žinutė" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "Aukščio profilis" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Vieta žemėlapyje" + +msgid "Vehicle Position" +msgstr "Transporto priemonės vieta" + +msgid "Main menu" +msgstr "Pagrindinis meniu" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Rodyti\n" +"žemėlapį" + +msgid "Settings" +msgstr "Parinktys" + +msgid "Tools" +msgstr "Įrankiai" + +msgid "Route" +msgstr "Parinkti kelią" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "Veiksmai" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Išeiti" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Stabdyti\n" +"navigaciją" + +msgid "Display" +msgstr "Rodyti" + +msgid "Fullscreen" +msgstr "Visas ekranas" + +msgid "Window Mode" +msgstr "Langų režimas" + +msgid "Description" +msgstr "Aprašas" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "Už %s, įsukite į žiedą" + +#~ msgid "Cursor" +#~ msgstr "Kursorius" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d kilometras" diff --git a/po/lv.po.in b/po/lv.po.in new file mode 100644 index 0000000..78ce5f9 --- /dev/null +++ b/po/lv.po.in @@ -0,0 +1,1757 @@ +# Latvian translation for navit +# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 +# This file is distributed under the same license as the navit package. +# Janis +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2009-12-20 21:37+0000\n" +"Last-Translator: Janis \n" +"Language-Team: Latvian \n" +"Language: lv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "nultais" + +msgid "first" +msgstr "pirmais" + +msgid "second" +msgstr "otrais" + +msgid "third" +msgstr "trešais" + +msgid "fourth" +msgstr "ceturtais" + +msgid "fifth" +msgstr "piektais" + +msgid "sixth" +msgstr "sestais" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "nultā izeja" + +msgid "first exit" +msgstr "pirmā izeja" + +msgid "second exit" +msgstr "otrā izeja" + +msgid "third exit" +msgstr "" + +msgid "fourth exit" +msgstr "ceturtā izeja" + +msgid "fifth exit" +msgstr "piektā izeja" + +msgid "sixth exit" +msgstr "sestā izeja" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "pēc %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metri" + +#, c-format +msgid "in %d meters" +msgstr "pēc %d metriem" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "pēc %d.%d kilometr(a,iem" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "%d kilometrs" +msgstr[1] "%d kilometrs" +msgstr[2] "%d kilometrs" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "pēc %d kilometra" +msgstr[1] "pēc %d kilometriem" +msgstr[2] "pēc %d kilometriem" + +msgid "exit" +msgstr "nobraukt nost" + +msgid "into the ramp" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "" + +msgid "When possible, please turn around" +msgstr "" + +msgid "Enter the roundabout soon" +msgstr "" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "" + +msgid "soon" +msgstr "" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "" + +#, c-format +msgid "after %i roads" +msgstr "" + +msgid "now" +msgstr "" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "" + +msgid "error" +msgstr "" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "" + +#, c-format +msgid "You have reached your destination %s" +msgstr "" + +msgid "then you have reached your destination." +msgstr "" + +msgid "Position" +msgstr "" + +msgid "Command" +msgstr "" + +msgid "Length" +msgstr "" + +msgid "km" +msgstr "" + +msgid "m" +msgstr "" + +msgid "Time" +msgstr "" + +msgid "Destination Length" +msgstr "" + +msgid "Destination Time" +msgstr "" + +msgid "Roadbook" +msgstr "" + +msgid "Set as position" +msgstr "" + +msgid "Set as destination" +msgstr "" + +msgid "Add as bookmark" +msgstr "" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "" + +#. 020 +msgid "Andorra" +msgstr "" + +#. 784 +msgid "United Arab Emirates" +msgstr "" + +#. 004 +msgid "Afghanistan" +msgstr "" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "" + +#. 660 +msgid "Anguilla" +msgstr "" + +#. 008 +msgid "Albania" +msgstr "" + +#. 051 +msgid "Armenia" +msgstr "" + +#. 530 +msgid "Netherlands Antilles" +msgstr "" + +#. 024 +msgid "Angola" +msgstr "" + +#. 010 +msgid "Antarctica" +msgstr "" + +#. 032 +msgid "Argentina" +msgstr "" + +#. 016 +msgid "American Samoa" +msgstr "" + +#. 040 +msgid "Austria" +msgstr "" + +#. 036 +msgid "Australia" +msgstr "" + +#. 533 +msgid "Aruba" +msgstr "" + +#. 248 +msgid "Aland Islands" +msgstr "" + +#. 031 +msgid "Azerbaijan" +msgstr "" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "" + +#. 052 +msgid "Barbados" +msgstr "" + +#. 050 +msgid "Bangladesh" +msgstr "" + +#. 056 +msgid "Belgium" +msgstr "" + +#. 854 +msgid "Burkina Faso" +msgstr "" + +#. 100 +msgid "Bulgaria" +msgstr "" + +#. 048 +msgid "Bahrain" +msgstr "" + +#. 108 +msgid "Burundi" +msgstr "" + +#. 204 +msgid "Benin" +msgstr "" + +#. 652 +msgid "Saint Barthelemy" +msgstr "" + +#. 060 +msgid "Bermuda" +msgstr "" + +#. 096 +msgid "Brunei Darussalam" +msgstr "" + +#. 068 +msgid "Bolivia" +msgstr "" + +#. 076 +msgid "Brazil" +msgstr "" + +#. 044 +msgid "Bahamas" +msgstr "" + +#. 064 +msgid "Bhutan" +msgstr "" + +#. 074 +msgid "Bouvet Island" +msgstr "" + +#. 072 +msgid "Botswana" +msgstr "" + +#. 112 +msgid "Belarus" +msgstr "" + +#. 084 +msgid "Belize" +msgstr "" + +#. 124 +msgid "Canada" +msgstr "" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "" + +#. 140 +msgid "Central African Republic" +msgstr "" + +#. 178 +msgid "Congo" +msgstr "" + +#. 756 +msgid "Switzerland" +msgstr "" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "" + +#. 184 +msgid "Cook Islands" +msgstr "" + +#. 152 +msgid "Chile" +msgstr "" + +#. 120 +msgid "Cameroon" +msgstr "" + +#. 156 +msgid "China" +msgstr "" + +#. 170 +msgid "Colombia" +msgstr "" + +#. 188 +msgid "Costa Rica" +msgstr "" + +#. 192 +msgid "Cuba" +msgstr "" + +#. 132 +msgid "Cape Verde" +msgstr "" + +#. 162 +msgid "Christmas Island" +msgstr "" + +#. 196 +msgid "Cyprus" +msgstr "" + +#. 203 +msgid "Czech Republic" +msgstr "" + +#. 276 +msgid "Germany" +msgstr "" + +#. 262 +msgid "Djibouti" +msgstr "" + +#. 208 +msgid "Denmark" +msgstr "" + +#. 212 +msgid "Dominica" +msgstr "" + +#. 214 +msgid "Dominican Republic" +msgstr "" + +#. 012 +msgid "Algeria" +msgstr "" + +#. 218 +msgid "Ecuador" +msgstr "" + +#. 233 +msgid "Estonia" +msgstr "" + +#. 818 +msgid "Egypt" +msgstr "" + +#. 732 +msgid "Western Sahara" +msgstr "" + +#. 232 +msgid "Eritrea" +msgstr "" + +#. 724 +msgid "Spain" +msgstr "" + +#. 231 +msgid "Ethiopia" +msgstr "" + +#. 246 +msgid "Finland" +msgstr "" + +#. 242 +msgid "Fiji" +msgstr "" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "" + +#. 234 +msgid "Faroe Islands" +msgstr "" + +#. 250 +msgid "France" +msgstr "" + +#. 266 +msgid "Gabon" +msgstr "" + +#. 826 +msgid "United Kingdom" +msgstr "" + +#. 308 +msgid "Grenada" +msgstr "" + +#. 268 +msgid "Georgia" +msgstr "" + +#. 254 +msgid "French Guiana" +msgstr "" + +#. 831 +msgid "Guernsey" +msgstr "" + +#. 288 +msgid "Ghana" +msgstr "" + +#. 292 +msgid "Gibraltar" +msgstr "" + +#. 304 +msgid "Greenland" +msgstr "" + +#. 270 +msgid "Gambia" +msgstr "" + +#. 324 +msgid "Guinea" +msgstr "" + +#. 312 +msgid "Guadeloupe" +msgstr "" + +#. 226 +msgid "Equatorial Guinea" +msgstr "" + +#. 300 +msgid "Greece" +msgstr "" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "" + +#. 320 +msgid "Guatemala" +msgstr "" + +#. 316 +msgid "Guam" +msgstr "" + +#. 624 +msgid "Guinea-Bissau" +msgstr "" + +#. 328 +msgid "Guyana" +msgstr "" + +#. 344 +msgid "Hong Kong" +msgstr "" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "" + +#. 340 +msgid "Honduras" +msgstr "" + +#. 191 +msgid "Croatia" +msgstr "" + +#. 332 +msgid "Haiti" +msgstr "" + +#. 348 +msgid "Hungary" +msgstr "" + +#. 360 +msgid "Indonesia" +msgstr "" + +#. 372 +msgid "Ireland" +msgstr "" + +#. 376 +msgid "Israel" +msgstr "" + +#. 833 +msgid "Isle of Man" +msgstr "" + +#. 356 +msgid "India" +msgstr "" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "" + +#. 368 +msgid "Iraq" +msgstr "" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "" + +#. 352 +msgid "Iceland" +msgstr "" + +#. 380 +msgid "Italy" +msgstr "" + +#. 832 +msgid "Jersey" +msgstr "" + +#. 388 +msgid "Jamaica" +msgstr "" + +#. 400 +msgid "Jordan" +msgstr "" + +#. 392 +msgid "Japan" +msgstr "" + +#. 404 +msgid "Kenya" +msgstr "" + +#. 417 +msgid "Kyrgyzstan" +msgstr "" + +#. 116 +msgid "Cambodia" +msgstr "" + +#. 296 +msgid "Kiribati" +msgstr "" + +#. 174 +msgid "Comoros" +msgstr "" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "" + +#. 410 +msgid "Korea, Republic of" +msgstr "" + +#. 414 +msgid "Kuwait" +msgstr "" + +#. 136 +msgid "Cayman Islands" +msgstr "" + +#. 398 +msgid "Kazakhstan" +msgstr "" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "" + +#. 422 +msgid "Lebanon" +msgstr "" + +#. 662 +msgid "Saint Lucia" +msgstr "" + +#. 438 +msgid "Liechtenstein" +msgstr "" + +#. 144 +msgid "Sri Lanka" +msgstr "" + +#. 430 +msgid "Liberia" +msgstr "" + +#. 426 +msgid "Lesotho" +msgstr "" + +#. 440 +msgid "Lithuania" +msgstr "" + +#. 442 +msgid "Luxembourg" +msgstr "" + +#. 428 +msgid "Latvia" +msgstr "" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "" + +#. 504 +msgid "Morocco" +msgstr "" + +#. 492 +msgid "Monaco" +msgstr "" + +#. 498 +msgid "Moldova, Republic of" +msgstr "" + +#. 499 +msgid "Montenegro" +msgstr "" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "" + +#. 450 +msgid "Madagascar" +msgstr "" + +#. 584 +msgid "Marshall Islands" +msgstr "" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "" + +#. 466 +msgid "Mali" +msgstr "" + +#. 104 +msgid "Myanmar" +msgstr "" + +#. 496 +msgid "Mongolia" +msgstr "" + +#. 446 +msgid "Macao" +msgstr "" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "" + +#. 474 +msgid "Martinique" +msgstr "" + +#. 478 +msgid "Mauritania" +msgstr "" + +#. 500 +msgid "Montserrat" +msgstr "" + +#. 470 +msgid "Malta" +msgstr "" + +#. 480 +msgid "Mauritius" +msgstr "" + +#. 462 +msgid "Maldives" +msgstr "" + +#. 454 +msgid "Malawi" +msgstr "" + +#. 484 +msgid "Mexico" +msgstr "" + +#. 458 +msgid "Malaysia" +msgstr "" + +#. 508 +msgid "Mozambique" +msgstr "" + +#. 516 +msgid "Namibia" +msgstr "" + +#. 540 +msgid "New Caledonia" +msgstr "" + +#. 562 +msgid "Niger" +msgstr "" + +#. 574 +msgid "Norfolk Island" +msgstr "" + +#. 566 +msgid "Nigeria" +msgstr "" + +#. 558 +msgid "Nicaragua" +msgstr "" + +#. 528 +msgid "Netherlands" +msgstr "" + +#. 578 +msgid "Norway" +msgstr "" + +#. 524 +msgid "Nepal" +msgstr "" + +#. 520 +msgid "Nauru" +msgstr "" + +#. 570 +msgid "Niue" +msgstr "" + +#. 554 +msgid "New Zealand" +msgstr "" + +#. 512 +msgid "Oman" +msgstr "" + +#. 591 +msgid "Panama" +msgstr "" + +#. 604 +msgid "Peru" +msgstr "" + +#. 258 +msgid "French Polynesia" +msgstr "" + +#. 598 +msgid "Papua New Guinea" +msgstr "" + +#. 608 +msgid "Philippines" +msgstr "" + +#. 586 +msgid "Pakistan" +msgstr "" + +#. 616 +msgid "Poland" +msgstr "" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "" + +#. 612 +msgid "Pitcairn" +msgstr "" + +#. 630 +msgid "Puerto Rico" +msgstr "" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "" + +#. 620 +msgid "Portugal" +msgstr "" + +#. 585 +msgid "Palau" +msgstr "" + +#. 600 +msgid "Paraguay" +msgstr "" + +#. 634 +msgid "Qatar" +msgstr "" + +#. 638 +msgid "Reunion" +msgstr "" + +#. 642 +msgid "Romania" +msgstr "" + +#. 688 +msgid "Serbia" +msgstr "" + +#. 643 +msgid "Russian Federation" +msgstr "" + +#. 646 +msgid "Rwanda" +msgstr "" + +#. 682 +msgid "Saudi Arabia" +msgstr "" + +#. 090 +msgid "Solomon Islands" +msgstr "" + +#. 690 +msgid "Seychelles" +msgstr "" + +#. 736 +msgid "Sudan" +msgstr "" + +#. 752 +msgid "Sweden" +msgstr "" + +#. 702 +msgid "Singapore" +msgstr "" + +#. 654 +msgid "Saint Helena" +msgstr "" + +#. 705 +msgid "Slovenia" +msgstr "" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "" + +#. 703 +msgid "Slovakia" +msgstr "" + +#. 694 +msgid "Sierra Leone" +msgstr "" + +#. 674 +msgid "San Marino" +msgstr "" + +#. 686 +msgid "Senegal" +msgstr "" + +#. 706 +msgid "Somalia" +msgstr "" + +#. 740 +msgid "Suriname" +msgstr "" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "" + +#. 222 +msgid "El Salvador" +msgstr "" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "" + +#. 748 +msgid "Swaziland" +msgstr "" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "" + +#. 148 +msgid "Chad" +msgstr "" + +#. 260 +msgid "French Southern Territories" +msgstr "" + +#. 768 +msgid "Togo" +msgstr "" + +#. 764 +msgid "Thailand" +msgstr "" + +#. 762 +msgid "Tajikistan" +msgstr "" + +#. 772 +msgid "Tokelau" +msgstr "" + +#. 626 +msgid "Timor-Leste" +msgstr "" + +#. 795 +msgid "Turkmenistan" +msgstr "" + +#. 788 +msgid "Tunisia" +msgstr "" + +#. 776 +msgid "Tonga" +msgstr "" + +#. 792 +msgid "Turkey" +msgstr "" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "" + +#. 798 +msgid "Tuvalu" +msgstr "" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "" + +#. 804 +msgid "Ukraine" +msgstr "" + +#. 800 +msgid "Uganda" +msgstr "" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "" + +#. 840 +msgid "United States" +msgstr "" + +#. 858 +msgid "Uruguay" +msgstr "" + +#. 860 +msgid "Uzbekistan" +msgstr "" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "" + +#. 862 +msgid "Venezuela" +msgstr "" + +#. 092 +msgid "Virgin Islands, British" +msgstr "" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "" + +#. 704 +msgid "Viet Nam" +msgstr "" + +#. 548 +msgid "Vanuatu" +msgstr "" + +#. 876 +msgid "Wallis and Futuna" +msgstr "" + +#. 882 +msgid "Samoa" +msgstr "" + +#. 887 +msgid "Yemen" +msgstr "" + +#. 175 +msgid "Mayotte" +msgstr "" + +#. 710 +msgid "South Africa" +msgstr "" + +#. 894 +msgid "Zambia" +msgstr "" + +#. 716 +msgid "Zimbabwe" +msgstr "" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "" + +msgid "Car" +msgstr "" + +msgid "Iso2" +msgstr "" + +msgid "Iso3" +msgstr "" + +msgid "Country" +msgstr "" + +msgid "Postal" +msgstr "" + +msgid "Town" +msgstr "" + +msgid "District" +msgstr "" + +msgid "Street" +msgstr "" + +msgid "Number" +msgstr "" + +msgid "Enter Destination" +msgstr "" + +msgid "Zip Code" +msgstr "" + +msgid "City" +msgstr "" + +msgid "District/Township" +msgstr "" + +msgid "Map" +msgstr "" + +msgid "Bookmark" +msgstr "" + +msgid "Destination" +msgstr "" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "" + +msgid "_Route" +msgstr "" + +msgid "_Former Destinations" +msgstr "" + +msgid "_Bookmarks" +msgstr "" + +msgid "_Map" +msgstr "" + +msgid "_Layout" +msgstr "" + +msgid "_Projection" +msgstr "" + +msgid "_Vehicle" +msgstr "" + +msgid "Zoom_Out" +msgstr "" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "" + +msgid "Test" +msgstr "" + +msgid "_Quit" +msgstr "" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "" + +msgid "Data" +msgstr "" + +msgid "N" +msgstr "" + +msgid "NE" +msgstr "" + +msgid "E" +msgstr "" + +msgid "SE" +msgstr "" + +msgid "S" +msgstr "" + +msgid "SW" +msgstr "" + +msgid "W" +msgstr "" + +msgid "NW" +msgstr "" + +msgid "No" +msgstr "" + +msgid "2D" +msgstr "" + +msgid "3D" +msgstr "" + +msgid "OT" +msgstr "" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "" + +msgid "Back to map" +msgstr "" + +msgid "Main Menu" +msgstr "" + +msgid "Help" +msgstr "" + +msgid "Back" +msgstr "" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "" + +msgid "View in Browser" +msgstr "" + +msgid "Streets" +msgstr "" + +msgid "House numbers" +msgstr "" + +msgid "View Attributes" +msgstr "" + +msgid "View on map" +msgstr "" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "" + +msgid "Former Destinations" +msgstr "" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "" + +msgid "Layout" +msgstr "" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "" + +msgid "Show Satellite Status" +msgstr "" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "" + +msgid "car" +msgstr "" + +msgid "bike" +msgstr "" + +msgid "pedestrian" +msgstr "" + +#, c-format +msgid "Current profile: %s" +msgstr "" + +#, c-format +msgid "Change profile to: %s" +msgstr "" + +msgid "Set as active" +msgstr "" + +msgid "Show Satellite status" +msgstr "" + +msgid "Show NMEA data" +msgstr "" + +msgid "Vehicle" +msgstr "" + +msgid "Rules" +msgstr "" + +msgid "Lock on road" +msgstr "" + +msgid "Northing" +msgstr "" + +msgid "Map follows Vehicle" +msgstr "" + +msgid "Message" +msgstr "" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "" + +msgid "Vehicle Position" +msgstr "" + +msgid "Main menu" +msgstr "" + +msgid "" +"Show\n" +"Map" +msgstr "" + +msgid "Settings" +msgstr "" + +msgid "Tools" +msgstr "" + +msgid "Route" +msgstr "" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" + +msgid "Display" +msgstr "" + +msgid "Fullscreen" +msgstr "" + +msgid "Window Mode" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d kilometrs" diff --git a/po/mk.po.in b/po/mk.po.in new file mode 100644 index 0000000..95a3943 --- /dev/null +++ b/po/mk.po.in @@ -0,0 +1,1763 @@ +# Macedonian translation for navit +# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 +# This file is distributed under the same license as the navit package. +# goran.cvetkovski 2009 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-04-25 02:12+0000\n" +"Last-Translator: Robert Mileski \n" +"Language-Team: Macedonian \n" +"Language: mk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Работи од основниот директориум\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "смени '%s' во '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "нулти" + +msgid "first" +msgstr "прв" + +msgid "second" +msgstr "втор" + +msgid "third" +msgstr "трет" + +msgid "fourth" +msgstr "четврт" + +msgid "fifth" +msgstr "петти" + +msgid "sixth" +msgstr "шести" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "нема излез" + +msgid "first exit" +msgstr "прв излез" + +msgid "second exit" +msgstr "втор излез" + +msgid "third exit" +msgstr "трет излез" + +msgid "fourth exit" +msgstr "четврт излез" + +msgid "fifth exit" +msgstr "петти излез" + +msgid "sixth exit" +msgstr "шести излез" + +#, c-format +msgid "%d m" +msgstr "%d м" + +#, c-format +msgid "in %d m" +msgstr "после %d м" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d метри" + +#, c-format +msgid "in %d meters" +msgstr "после %d метра" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d километри" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "после %d.%d километри" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "%d километри" +msgstr[1] "%d километри" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "после %d километри" +msgstr[1] "после %d километри" + +msgid "exit" +msgstr "излез" + +msgid "into the ramp" +msgstr "на рампа" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%sна улица %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%sна %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%sна %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%sна %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%sна %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "на десно" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "на лево" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "лесно " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "силно " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "многу силно " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "непознато " + +msgid "When possible, please turn around" +msgstr "Кога можете, свртете" + +msgid "Enter the roundabout soon" +msgstr "Наскоро влегувате во кружен тек" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "Потоа излегувате од кружен тек на %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Излегувате од кружен тек на %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Следете го патот следните %s" + +msgid "soon" +msgstr "наскоро" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Продолжи по %1$s патот до %2$s" + +#, c-format +msgid "after %i roads" +msgstr "после %i патишта" + +msgid "now" +msgstr "сега" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "тогаш појдете по патот %1$s кон %2$s" + +msgid "error" +msgstr "грешка" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Свртете %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "тогаш свртете %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Стигнавте на целта %s" + +msgid "then you have reached your destination." +msgstr "потоа пристигате на одредиштето." + +msgid "Position" +msgstr "Позиция" + +msgid "Command" +msgstr "Програма" + +msgid "Length" +msgstr "Length" + +msgid "km" +msgstr "км" + +msgid "m" +msgstr "м" + +msgid "Time" +msgstr "Време" + +msgid "Destination Length" +msgstr "Растојание до целта" + +msgid "Destination Time" +msgstr "Време до целта" + +msgid "Roadbook" +msgstr "Патна книга" + +msgid "Set as position" +msgstr "Зададете како позиција" + +msgid "Set as destination" +msgstr "Зададете како цел" + +msgid "Add as bookmark" +msgstr "Додадете како место" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Точка 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Координати на екранот: %d %d" + +#. 020 +msgid "Andorra" +msgstr "Андора" + +#. 784 +msgid "United Arab Emirates" +msgstr "Обединети Арапски Емирати" + +#. 004 +msgid "Afghanistan" +msgstr "Авганистан" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Антигва и Барбуда" + +#. 660 +msgid "Anguilla" +msgstr "Ангила" + +#. 008 +msgid "Albania" +msgstr "Албанија" + +#. 051 +msgid "Armenia" +msgstr "Ерменија" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Холандски Антили" + +#. 024 +msgid "Angola" +msgstr "Ангола" + +#. 010 +msgid "Antarctica" +msgstr "Антарктика" + +#. 032 +msgid "Argentina" +msgstr "Аргентина" + +#. 016 +msgid "American Samoa" +msgstr "Американска Самоа" + +#. 040 +msgid "Austria" +msgstr "Австрија" + +#. 036 +msgid "Australia" +msgstr "Австралија" + +#. 533 +msgid "Aruba" +msgstr "Аруба" + +#. 248 +msgid "Aland Islands" +msgstr "Аландски острови" + +#. 031 +msgid "Azerbaijan" +msgstr "Азербејџан" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Босна и Херцеговина" + +#. 052 +msgid "Barbados" +msgstr "Барбадос" + +#. 050 +msgid "Bangladesh" +msgstr "Бангладеш" + +#. 056 +msgid "Belgium" +msgstr "Белгија" + +#. 854 +msgid "Burkina Faso" +msgstr "Буркина Фасо" + +#. 100 +msgid "Bulgaria" +msgstr "Бугарија" + +#. 048 +msgid "Bahrain" +msgstr "Бахреин" + +#. 108 +msgid "Burundi" +msgstr "Бурунди" + +#. 204 +msgid "Benin" +msgstr "Бенин" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Свети Бартоломеј" + +#. 060 +msgid "Bermuda" +msgstr "Бермуда" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Брунеи Дар ес Салам" + +#. 068 +msgid "Bolivia" +msgstr "Боливија" + +#. 076 +msgid "Brazil" +msgstr "Бразил" + +#. 044 +msgid "Bahamas" +msgstr "Бахами" + +#. 064 +msgid "Bhutan" +msgstr "Бутан" + +#. 074 +msgid "Bouvet Island" +msgstr "Остров Буве" + +#. 072 +msgid "Botswana" +msgstr "Боцвана" + +#. 112 +msgid "Belarus" +msgstr "Белорусија" + +#. 084 +msgid "Belize" +msgstr "Белизе" + +#. 124 +msgid "Canada" +msgstr "Канада" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Кокосови (Килинг) острови" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Конго, Демократска Република" + +#. 140 +msgid "Central African Republic" +msgstr "Централна Африканска Република" + +#. 178 +msgid "Congo" +msgstr "Конго" + +#. 756 +msgid "Switzerland" +msgstr "Швајцарија" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Брегот на Слоновата коска" + +#. 184 +msgid "Cook Islands" +msgstr "Кук острови" + +#. 152 +msgid "Chile" +msgstr "Чиле" + +#. 120 +msgid "Cameroon" +msgstr "Камерун" + +#. 156 +msgid "China" +msgstr "Кина" + +#. 170 +msgid "Colombia" +msgstr "Колумбија" + +#. 188 +msgid "Costa Rica" +msgstr "Костарика" + +#. 192 +msgid "Cuba" +msgstr "Куба" + +#. 132 +msgid "Cape Verde" +msgstr "Кејп Верде" + +#. 162 +msgid "Christmas Island" +msgstr "Велигденски Острови" + +#. 196 +msgid "Cyprus" +msgstr "Кипар" + +#. 203 +msgid "Czech Republic" +msgstr "Чешка Република" + +#. 276 +msgid "Germany" +msgstr "Германија" + +#. 262 +msgid "Djibouti" +msgstr "Џибути" + +#. 208 +msgid "Denmark" +msgstr "Данска" + +#. 212 +msgid "Dominica" +msgstr "Доминика" + +#. 214 +msgid "Dominican Republic" +msgstr "Доминиканска Република" + +#. 012 +msgid "Algeria" +msgstr "Алжир" + +#. 218 +msgid "Ecuador" +msgstr "Еквадор" + +#. 233 +msgid "Estonia" +msgstr "Естонија" + +#. 818 +msgid "Egypt" +msgstr "Египет" + +#. 732 +msgid "Western Sahara" +msgstr "Западна Сахара" + +#. 232 +msgid "Eritrea" +msgstr "Еритреја" + +#. 724 +msgid "Spain" +msgstr "Шпанија" + +#. 231 +msgid "Ethiopia" +msgstr "Етиопија" + +#. 246 +msgid "Finland" +msgstr "Финска" + +#. 242 +msgid "Fiji" +msgstr "Фиџи" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Фокландски Острови (Малвини)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Микронезија, Федеративни Држави на" + +#. 234 +msgid "Faroe Islands" +msgstr "Фарски Острови" + +#. 250 +msgid "France" +msgstr "Франција" + +#. 266 +msgid "Gabon" +msgstr "Габон" + +#. 826 +msgid "United Kingdom" +msgstr "Обединето Кралство" + +#. 308 +msgid "Grenada" +msgstr "Гренада" + +#. 268 +msgid "Georgia" +msgstr "Грузија" + +#. 254 +msgid "French Guiana" +msgstr "Француска Гвинеја" + +#. 831 +msgid "Guernsey" +msgstr "Гернзи" + +#. 288 +msgid "Ghana" +msgstr "Гана" + +#. 292 +msgid "Gibraltar" +msgstr "Гибралтар" + +#. 304 +msgid "Greenland" +msgstr "Гренланд" + +#. 270 +msgid "Gambia" +msgstr "Гамбија" + +#. 324 +msgid "Guinea" +msgstr "Гвинеја" + +#. 312 +msgid "Guadeloupe" +msgstr "Гваделупе" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Екваторијална Гвинеја" + +#. 300 +msgid "Greece" +msgstr "Грција" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Јужна Џорџија и Јужните Сендвич острови" + +#. 320 +msgid "Guatemala" +msgstr "Гватемала" + +#. 316 +msgid "Guam" +msgstr "Гуам" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Гвинеја Бисао" + +#. 328 +msgid "Guyana" +msgstr "Гвајана" + +#. 344 +msgid "Hong Kong" +msgstr "Хонг Конг" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Херд острови и Мекдоналд острови" + +#. 340 +msgid "Honduras" +msgstr "Хондурас" + +#. 191 +msgid "Croatia" +msgstr "Хрватска" + +#. 332 +msgid "Haiti" +msgstr "Хаити" + +#. 348 +msgid "Hungary" +msgstr "Унгарија" + +#. 360 +msgid "Indonesia" +msgstr "Индонезија" + +#. 372 +msgid "Ireland" +msgstr "Ирска" + +#. 376 +msgid "Israel" +msgstr "Израел" + +#. 833 +msgid "Isle of Man" +msgstr "Островот Ман" + +#. 356 +msgid "India" +msgstr "Индија" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Британска територија на Индиски океан" + +#. 368 +msgid "Iraq" +msgstr "Ирак" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Иран, Исламска Република" + +#. 352 +msgid "Iceland" +msgstr "Исланд" + +#. 380 +msgid "Italy" +msgstr "Италија" + +#. 832 +msgid "Jersey" +msgstr "Џерси" + +#. 388 +msgid "Jamaica" +msgstr "Јамајка" + +#. 400 +msgid "Jordan" +msgstr "Јордан" + +#. 392 +msgid "Japan" +msgstr "Јапонија" + +#. 404 +msgid "Kenya" +msgstr "Кенија" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Киргистан" + +#. 116 +msgid "Cambodia" +msgstr "Камбоџа" + +#. 296 +msgid "Kiribati" +msgstr "Кирибати" + +#. 174 +msgid "Comoros" +msgstr "Коморски острови" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Свети Китс и Невис" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Кореја, Демократска Народна Република" + +#. 410 +msgid "Korea, Republic of" +msgstr "Кореја, Република" + +#. 414 +msgid "Kuwait" +msgstr "Кувајт" + +#. 136 +msgid "Cayman Islands" +msgstr "Кајмански Острови" + +#. 398 +msgid "Kazakhstan" +msgstr "Казахстан" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Народна Демократска Република Лао" + +#. 422 +msgid "Lebanon" +msgstr "Либан" + +#. 662 +msgid "Saint Lucia" +msgstr "Света Лусија" + +#. 438 +msgid "Liechtenstein" +msgstr "Лихтенштајн" + +#. 144 +msgid "Sri Lanka" +msgstr "Шри Ланка" + +#. 430 +msgid "Liberia" +msgstr "Либерија" + +#. 426 +msgid "Lesotho" +msgstr "Лесото" + +#. 440 +msgid "Lithuania" +msgstr "Литванија" + +#. 442 +msgid "Luxembourg" +msgstr "Луксембург" + +#. 428 +msgid "Latvia" +msgstr "Латвија" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Либиска Арапска Џамахирија" + +#. 504 +msgid "Morocco" +msgstr "Мароко" + +#. 492 +msgid "Monaco" +msgstr "Монако" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Молдавија, Република" + +#. 499 +msgid "Montenegro" +msgstr "Црна Гора" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Свети Мартин (Француски дел)" + +#. 450 +msgid "Madagascar" +msgstr "Мадагаскар" + +#. 584 +msgid "Marshall Islands" +msgstr "Маршалови Острови" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Македонија" + +#. 466 +msgid "Mali" +msgstr "Мали" + +#. 104 +msgid "Myanmar" +msgstr "Мијанмар" + +#. 496 +msgid "Mongolia" +msgstr "Монголија" + +#. 446 +msgid "Macao" +msgstr "Макао" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Северни Маријански острови" + +#. 474 +msgid "Martinique" +msgstr "Мартиник" + +#. 478 +msgid "Mauritania" +msgstr "Мавританија" + +#. 500 +msgid "Montserrat" +msgstr "Монтсерат" + +#. 470 +msgid "Malta" +msgstr "Малта" + +#. 480 +msgid "Mauritius" +msgstr "Маврициус" + +#. 462 +msgid "Maldives" +msgstr "Малдиви" + +#. 454 +msgid "Malawi" +msgstr "Малави" + +#. 484 +msgid "Mexico" +msgstr "Мексико" + +#. 458 +msgid "Malaysia" +msgstr "Малезија" + +#. 508 +msgid "Mozambique" +msgstr "Мозамбик" + +#. 516 +msgid "Namibia" +msgstr "Намибија" + +#. 540 +msgid "New Caledonia" +msgstr "Нова Каледонија" + +#. 562 +msgid "Niger" +msgstr "Нигер" + +#. 574 +msgid "Norfolk Island" +msgstr "Норфолк, Остров" + +#. 566 +msgid "Nigeria" +msgstr "Нигерија" + +#. 558 +msgid "Nicaragua" +msgstr "Никарагва" + +#. 528 +msgid "Netherlands" +msgstr "Холандија" + +#. 578 +msgid "Norway" +msgstr "Норвешка" + +#. 524 +msgid "Nepal" +msgstr "Непал" + +#. 520 +msgid "Nauru" +msgstr "Науру" + +#. 570 +msgid "Niue" +msgstr "Ниуе" + +#. 554 +msgid "New Zealand" +msgstr "Нов Зеланд" + +#. 512 +msgid "Oman" +msgstr "Оман" + +#. 591 +msgid "Panama" +msgstr "Панама" + +#. 604 +msgid "Peru" +msgstr "Перу" + +#. 258 +msgid "French Polynesia" +msgstr "Француска Полинезија" + +#. 598 +msgid "Papua New Guinea" +msgstr "Папуа Нова Гвинеја" + +#. 608 +msgid "Philippines" +msgstr "Филипини" + +#. 586 +msgid "Pakistan" +msgstr "Пакистан" + +#. 616 +msgid "Poland" +msgstr "Полска" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Свети Пјер и Микелон" + +#. 612 +msgid "Pitcairn" +msgstr "Питкерн" + +#. 630 +msgid "Puerto Rico" +msgstr "Порто Рико" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Палестинска територија, Окупирана" + +#. 620 +msgid "Portugal" +msgstr "Португалија" + +#. 585 +msgid "Palau" +msgstr "Палау" + +#. 600 +msgid "Paraguay" +msgstr "Парагвај" + +#. 634 +msgid "Qatar" +msgstr "Катар" + +#. 638 +msgid "Reunion" +msgstr "Реунион" + +#. 642 +msgid "Romania" +msgstr "Романија" + +#. 688 +msgid "Serbia" +msgstr "Србија" + +#. 643 +msgid "Russian Federation" +msgstr "Руска федерација" + +#. 646 +msgid "Rwanda" +msgstr "Руанда" + +#. 682 +msgid "Saudi Arabia" +msgstr "Саудиска Арабија" + +#. 090 +msgid "Solomon Islands" +msgstr "Соломонски Острови" + +#. 690 +msgid "Seychelles" +msgstr "Сејшели" + +#. 736 +msgid "Sudan" +msgstr "Судан" + +#. 752 +msgid "Sweden" +msgstr "Шведска" + +#. 702 +msgid "Singapore" +msgstr "Сингапур" + +#. 654 +msgid "Saint Helena" +msgstr "Света Елена" + +#. 705 +msgid "Slovenia" +msgstr "Словенија" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Свалбард и Жан Мајен" + +#. 703 +msgid "Slovakia" +msgstr "Словачка" + +#. 694 +msgid "Sierra Leone" +msgstr "Сиера Леоне" + +#. 674 +msgid "San Marino" +msgstr "Сан Марино" + +#. 686 +msgid "Senegal" +msgstr "Сенегал" + +#. 706 +msgid "Somalia" +msgstr "Сомалија" + +#. 740 +msgid "Suriname" +msgstr "Суринам" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Сао Томе и Принципе" + +#. 222 +msgid "El Salvador" +msgstr "Ел Салвадор" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Сиријска Арапска Република" + +#. 748 +msgid "Swaziland" +msgstr "Свазиленд" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Острови Турк и Каикос" + +#. 148 +msgid "Chad" +msgstr "Чад" + +#. 260 +msgid "French Southern Territories" +msgstr "Француски Јужни Територии" + +#. 768 +msgid "Togo" +msgstr "Того" + +#. 764 +msgid "Thailand" +msgstr "Тајланд" + +#. 762 +msgid "Tajikistan" +msgstr "Таџикистан" + +#. 772 +msgid "Tokelau" +msgstr "Токелау" + +#. 626 +msgid "Timor-Leste" +msgstr "Тимор-Источен" + +#. 795 +msgid "Turkmenistan" +msgstr "Туркменистан" + +#. 788 +msgid "Tunisia" +msgstr "Тунис" + +#. 776 +msgid "Tonga" +msgstr "Тонга" + +#. 792 +msgid "Turkey" +msgstr "Турција" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Тринидад и Тобаго" + +#. 798 +msgid "Tuvalu" +msgstr "Тувалу" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Тајван, Кинеска провинција" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Танзанија, Обединета Република" + +#. 804 +msgid "Ukraine" +msgstr "Украина" + +#. 800 +msgid "Uganda" +msgstr "Уганда" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Соединетите Држави, Мали додатни острови на" + +#. 840 +msgid "United States" +msgstr "Соединетите Американски Држави" + +#. 858 +msgid "Uruguay" +msgstr "Уругвај" + +#. 860 +msgid "Uzbekistan" +msgstr "Узбекистан" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Светата Столица (Ватикан, Град - Држава)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Свети Винсент и Гренадините" + +#. 862 +msgid "Venezuela" +msgstr "Венецуела" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Девствени Острови, Британски" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Девствени Острови, САД" + +#. 704 +msgid "Viet Nam" +msgstr "Виетнам" + +#. 548 +msgid "Vanuatu" +msgstr "Вануату" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Валис и Футуна" + +#. 882 +msgid "Samoa" +msgstr "Самоа" + +#. 887 +msgid "Yemen" +msgstr "Јемен" + +#. 175 +msgid "Mayotte" +msgstr "Мајоти" + +#. 710 +msgid "South Africa" +msgstr "Јужна Африка" + +#. 894 +msgid "Zambia" +msgstr "Замбија" + +#. 716 +msgid "Zimbabwe" +msgstr "Зимбабве" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Непознато, додадете is_in тагови за овие градови" + +msgid "Car" +msgstr "Автомобил" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Држава" + +msgid "Postal" +msgstr "Поштенска" + +msgid "Town" +msgstr "Град" + +msgid "District" +msgstr "Област" + +msgid "Street" +msgstr "Улица" + +msgid "Number" +msgstr "Број" + +msgid "Enter Destination" +msgstr "Внесете одредиште" + +msgid "Zip Code" +msgstr "Поштенски број" + +msgid "City" +msgstr "Град" + +msgid "District/Township" +msgstr "Општина" + +msgid "Map" +msgstr "Карта" + +msgid "Bookmark" +msgstr "Омилено место" + +msgid "Destination" +msgstr "Одредиште" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Екран" + +msgid "_Route" +msgstr "Рута" + +msgid "_Former Destinations" +msgstr "Претходни одредишта" + +msgid "_Bookmarks" +msgstr "Омилени места" + +msgid "_Map" +msgstr "Карта" + +msgid "_Layout" +msgstr "Изглед" + +msgid "_Projection" +msgstr "Проекција" + +msgid "_Vehicle" +msgstr "Возило" + +msgid "Zoom_Out" +msgstr "Намали" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Зголеми" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Повторно пресметај" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Инфо" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Запирање на навигација" + +msgid "Test" +msgstr "Тест" + +msgid "_Quit" +msgstr "_Заврши" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Придржувај се до патот" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Патна книга" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Авто-зголемување" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "На цел екран" + +msgid "Data" +msgstr "Податоци" + +msgid "N" +msgstr "С" + +msgid "NE" +msgstr "СИ" + +msgid "E" +msgstr "И" + +msgid "SE" +msgstr "ЈИ" + +msgid "S" +msgstr "Ј" + +msgid "SW" +msgstr "ЈЗ" + +msgid "W" +msgstr "З" + +msgid "NW" +msgstr "СЗ" + +msgid "No" +msgstr "Не" + +msgid "2D" +msgstr "2Д" + +msgid "3D" +msgstr "3Д" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Рута %4.0fkm %02d:%02d ETA" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Рута 0000km 0+00:00 ETA" + +msgid "Back to map" +msgstr "Врати се на картата" + +msgid "Main Menu" +msgstr "Главно мени" + +msgid "Help" +msgstr "Помош" + +msgid "Back" +msgstr "Назад" + +msgid "Add Bookmark" +msgstr "Додај обележувач" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "Интересни точки" + +msgid "View in Browser" +msgstr "Види во пребарувач" + +msgid "Streets" +msgstr "Улици" + +msgid "House numbers" +msgstr "Куќни броеви" + +msgid "View Attributes" +msgstr "Види атрибути" + +msgid "View on map" +msgstr "Види на карта" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "Омилени места" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "Интересно место %s" + +msgid "Former Destinations" +msgstr "Претходни одредишта" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Куќен број" + +msgid "Layout" +msgstr "Изглед" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Изгледи" + +msgid "Show Satellite Status" +msgstr "Покажи статус на сателитите" + +msgid " Elevation " +msgstr " Елевација " + +msgid " Azimuth " +msgstr " Азимут " + +msgid "Show NMEA Data" +msgstr "Покажи NMEA податоци" + +msgid "car" +msgstr "автомобил" + +msgid "bike" +msgstr "велосипед" + +msgid "pedestrian" +msgstr "пешак" + +#, c-format +msgid "Current profile: %s" +msgstr "Тековен профил: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Смени профил во: %s" + +msgid "Set as active" +msgstr "Постави како активен" + +msgid "Show Satellite status" +msgstr "Покажи статус на сателитите" + +msgid "Show NMEA data" +msgstr "Покажи NMEA податоци" + +msgid "Vehicle" +msgstr "Возило" + +msgid "Rules" +msgstr "Правила" + +msgid "Lock on road" +msgstr "Придржувај се на патот" + +msgid "Northing" +msgstr "Северен правец" + +msgid "Map follows Vehicle" +msgstr "Картата го следи возилото" + +msgid "Message" +msgstr "Порака" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Објаснување за патот" + +msgid "Height Profile" +msgstr "Висински профил" + +msgid "Show Locale" +msgstr "Прикажи јазично подесување" + +msgid "About Navit" +msgstr "За Navit" + +#. Authors +msgid "By" +msgstr "Од" + +#. Contributors +msgid "And all the Navit Team" +msgstr "И целиот Navit тим" + +msgid "members and contributors." +msgstr "членови и придонесувачи" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Точка на карта" + +msgid "Vehicle Position" +msgstr "Позиција на возило" + +msgid "Main menu" +msgstr "Главно мени" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Покажи ја\n" +"Картата" + +msgid "Settings" +msgstr "Поставувања" + +msgid "Tools" +msgstr "Алатки" + +msgid "Route" +msgstr "Рута" + +msgid "About" +msgstr "За" + +msgid "Actions" +msgstr "Акции" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Напушти" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Сопри ја\n" +"Навигацијата" + +msgid "Display" +msgstr "Екран" + +msgid "Fullscreen" +msgstr "На цел екран" + +msgid "Window Mode" +msgstr "Работи во прозорец" + +msgid "Description" +msgstr "Опис" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "коњ" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "После %s влегувате во кружен ток" + +#~ msgid "Cursor" +#~ msgstr "Покажувач" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d километри" diff --git a/po/nb.po.in b/po/nb.po.in new file mode 100644 index 0000000..c724e64 --- /dev/null +++ b/po/nb.po.in @@ -0,0 +1,1764 @@ +# Norwegian translations for navit +# Copyright (C) 2008 The Navit Team +# This file is distributed under the same license as the navit package. +# Bendik Brenne , 2008. +# Helge Hafting +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-06-19 07:59+0000\n" +"Last-Translator: Kurt Nielsen \n" +"Language-Team: Bendik Brenne \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Kjører fra kildemappen\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "setter '%s' til '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "nullte" + +msgid "first" +msgstr "første" + +msgid "second" +msgstr "andre" + +msgid "third" +msgstr "tredje" + +msgid "fourth" +msgstr "fjerde" + +msgid "fifth" +msgstr "femte" + +msgid "sixth" +msgstr "sjette" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "nullte avkjørsel" + +msgid "first exit" +msgstr "første avkjøring" + +msgid "second exit" +msgstr "andre avkjøring" + +msgid "third exit" +msgstr "tredje avkjøring" + +msgid "fourth exit" +msgstr "fjerde avkjøring" + +msgid "fifth exit" +msgstr "femte avkjøring" + +msgid "sixth exit" +msgstr "sjette avkjøring" + +#, c-format +msgid "%d m" +msgstr "%d meter" + +#, c-format +msgid "in %d m" +msgstr "om %d meter" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d meter" + +#, c-format +msgid "in %d meters" +msgstr "om %d meter" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d kilometer" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "om %d,%d kilometer" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "en kilometer" +msgstr[1] "%d kilometer" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "om en kilometer" +msgstr[1] "om %d kilometer" + +msgid "exit" +msgstr "avkjørsel" + +msgid "into the ramp" +msgstr "ut på akselerasjonsfeltet" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%sinn på gaten %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%sinn på %s%s%sen" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%sinn på %s%s%sa" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%sin på %s%s%set" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%sinn på %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "høyre" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "venstre" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "slakt " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "skarpt " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "veldig skarpt " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "ukjent " + +msgid "When possible, please turn around" +msgstr "Snu når det er mulig" + +msgid "Enter the roundabout soon" +msgstr "Kjør inn i rundkjøringen snart" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "forlat så rundkjøringen ut %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Forlat rundkjøringen ut %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Følg veien de neste %s" + +msgid "soon" +msgstr "snart" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Ta den %1$s veien mot %2$s" + +#, c-format +msgid "after %i roads" +msgstr "etter %i avkjøringer" + +msgid "now" +msgstr "nå" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "ta deretter %1$s til %2$s" + +msgid "error" +msgstr "feil" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Sving %1$s til %2$s om %3$s %4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "sving så %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Du har nådd ditt reisemål %s" + +msgid "then you have reached your destination." +msgstr "så har du nådd ditt reisemål." + +msgid "Position" +msgstr "Posisjon" + +msgid "Command" +msgstr "Instruks" + +msgid "Length" +msgstr "Avstand" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Tid" + +msgid "Destination Length" +msgstr "Avstand til målet" + +msgid "Destination Time" +msgstr "Tid til målet" + +msgid "Roadbook" +msgstr "Kjørebok" + +msgid "Set as position" +msgstr "Sett som posisjon" + +msgid "Set as destination" +msgstr "Sett som reisemål" + +msgid "Add as bookmark" +msgstr "Legg til som bokmerke" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Punkt 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Skjermkoordinat: %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "De forente arabiske emirater" + +#. 004 +msgid "Afghanistan" +msgstr "Afghanistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua og Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albania" + +#. 051 +msgid "Armenia" +msgstr "Armenia" + +#. 530 +msgid "Netherlands Antilles" +msgstr "De nederlandske Antillene" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarktis" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "Amerikansk Samoa" + +#. 040 +msgid "Austria" +msgstr "Østerrike" + +#. 036 +msgid "Australia" +msgstr "Australia" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Åland" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbaijan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnia and Herzegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesh" + +#. 056 +msgid "Belgium" +msgstr "Belgia" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgaria" + +#. 048 +msgid "Bahrain" +msgstr "Bahrain" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint Barthelemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei" + +#. 068 +msgid "Bolivia" +msgstr "Bolivia" + +#. 076 +msgid "Brazil" +msgstr "Brasil" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "Bhutan" + +#. 074 +msgid "Bouvet Island" +msgstr "Bouvetøya" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Hviterussland" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Canada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Kokosøyene" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Kongo, Den demokratiske republikken" + +#. 140 +msgid "Central African Republic" +msgstr "Den sentralafrikanske republikk" + +#. 178 +msgid "Congo" +msgstr "Kongo" + +#. 756 +msgid "Switzerland" +msgstr "Sveits" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Elfenbenskysten" + +#. 184 +msgid "Cook Islands" +msgstr "Cookøyene" + +#. 152 +msgid "Chile" +msgstr "Chile" + +#. 120 +msgid "Cameroon" +msgstr "Kamerun" + +#. 156 +msgid "China" +msgstr "Kina" + +#. 170 +msgid "Colombia" +msgstr "Colombia" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Kuba" + +#. 132 +msgid "Cape Verde" +msgstr "Kapp Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Christmasøya" + +#. 196 +msgid "Cyprus" +msgstr "Kypros" + +#. 203 +msgid "Czech Republic" +msgstr "Tsjekkia" + +#. 276 +msgid "Germany" +msgstr "Tyskland" + +#. 262 +msgid "Djibouti" +msgstr "Djibouti" + +#. 208 +msgid "Denmark" +msgstr "Danmark" + +#. 212 +msgid "Dominica" +msgstr "Dominica" + +#. 214 +msgid "Dominican Republic" +msgstr "Den dominikanske republikk" + +#. 012 +msgid "Algeria" +msgstr "Algerie" + +#. 218 +msgid "Ecuador" +msgstr "Ecuador" + +#. 233 +msgid "Estonia" +msgstr "Estland" + +#. 818 +msgid "Egypt" +msgstr "Egypt" + +#. 732 +msgid "Western Sahara" +msgstr "Vest-Sahara" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Spania" + +#. 231 +msgid "Ethiopia" +msgstr "Etiopia" + +#. 246 +msgid "Finland" +msgstr "Finland" + +#. 242 +msgid "Fiji" +msgstr "Fiji" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falklandsøyene (Malvinas)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Mikronesia" + +#. 234 +msgid "Faroe Islands" +msgstr "Færøyene" + +#. 250 +msgid "France" +msgstr "Frankrike" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Storbritannia" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Georgia" + +#. 254 +msgid "French Guiana" +msgstr "Fransk Guyana" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Grønland" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Ekvatorial-Guinea" + +#. 300 +msgid "Greece" +msgstr "Hellas" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Sør-Georgia og Sør-Sandwichøyene" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heard- og McDonald-øyene" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Kroatia" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Ungarn" + +#. 360 +msgid "Indonesia" +msgstr "Indonesia" + +#. 372 +msgid "Ireland" +msgstr "Irland" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "Man" + +#. 356 +msgid "India" +msgstr "India" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Det britiske territoriet i Indiahavet" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iran" + +#. 352 +msgid "Iceland" +msgstr "Island" + +#. 380 +msgid "Italy" +msgstr "Italia" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaica" + +#. 400 +msgid "Jordan" +msgstr "Jordan" + +#. 392 +msgid "Japan" +msgstr "Japan" + +#. 404 +msgid "Kenya" +msgstr "Kenya" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirgisistan" + +#. 116 +msgid "Cambodia" +msgstr "Kambodsja" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Komorene" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Saint Kitts og Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Nord-Korea" + +#. 410 +msgid "Korea, Republic of" +msgstr "Sør-Korea" + +#. 414 +msgid "Kuwait" +msgstr "Kuwait" + +#. 136 +msgid "Cayman Islands" +msgstr "Caymanøyene" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazakhstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laos" + +#. 422 +msgid "Lebanon" +msgstr "Libanon" + +#. 662 +msgid "Saint Lucia" +msgstr "Saint Lucia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberia" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Litauen" + +#. 442 +msgid "Luxembourg" +msgstr "Luxembourg" + +#. 428 +msgid "Latvia" +msgstr "Latvia" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libya" + +#. 504 +msgid "Morocco" +msgstr "Marokko" + +#. 492 +msgid "Monaco" +msgstr "Monaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldova" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Saint Martin (Fransk del)" + +#. 450 +msgid "Madagascar" +msgstr "Madagaskar" + +#. 584 +msgid "Marshall Islands" +msgstr "Marshalløyene" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Makedonia" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Burma" + +#. 496 +msgid "Mongolia" +msgstr "Mongolia" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Nord-Marianene" + +#. 474 +msgid "Martinique" +msgstr "Martinique" + +#. 478 +msgid "Mauritania" +msgstr "Mauretania" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauritius" + +#. 462 +msgid "Maldives" +msgstr "Maldivene" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mexico" + +#. 458 +msgid "Malaysia" +msgstr "Malaysia" + +#. 508 +msgid "Mozambique" +msgstr "Mosambik" + +#. 516 +msgid "Namibia" +msgstr "Namibia" + +#. 540 +msgid "New Caledonia" +msgstr "Ny-Caledonia" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolkøya" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nicaragua" + +#. 528 +msgid "Netherlands" +msgstr "Nederland" + +#. 578 +msgid "Norway" +msgstr "Norge" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "New Zealand" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Fransk Polynesia" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua Ny-Guinea" + +#. 608 +msgid "Philippines" +msgstr "Filippinene" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Polen" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint-Pierre og Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairnøyene" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestina" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Qatar" + +#. 638 +msgid "Reunion" +msgstr "Reunion" + +#. 642 +msgid "Romania" +msgstr "Romania" + +#. 688 +msgid "Serbia" +msgstr "Serbia" + +#. 643 +msgid "Russian Federation" +msgstr "Russland" + +#. 646 +msgid "Rwanda" +msgstr "Rwanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Saudi-Arabia" + +#. 090 +msgid "Solomon Islands" +msgstr "Salomonøyene" + +#. 690 +msgid "Seychelles" +msgstr "Seychellene" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Sverige" + +#. 702 +msgid "Singapore" +msgstr "Singapore" + +#. 654 +msgid "Saint Helena" +msgstr "Saint Helena" + +#. 705 +msgid "Slovenia" +msgstr "Slovenia" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard og Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slovakia" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalia" + +#. 740 +msgid "Suriname" +msgstr "Surinam" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "São Tomé og Príncipe" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Syria" + +#. 748 +msgid "Swaziland" +msgstr "Swaziland" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turks- og Caicosøyene" + +#. 148 +msgid "Chad" +msgstr "Tsjad" + +#. 260 +msgid "French Southern Territories" +msgstr "De franske sørterritorier" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Thailand" + +#. 762 +msgid "Tajikistan" +msgstr "Tadsjikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Øst-Timor" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunisia" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Tyrkia" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad og Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzania" + +#. 804 +msgid "Ukraine" +msgstr "Ukraina" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "USAs ytre småøyer" + +#. 840 +msgid "United States" +msgstr "USA" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Usbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Vatikanstaten" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Saint Vincent og Grenadinene" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Jomfruøyene (Storbritannia)" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Jomfruøyene (USA)" + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis- og Futunaøyene" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Yemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Sør-Afrika" + +#. 894 +msgid "Zambia" +msgstr "Zambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "Ukjent, legg is_in-tagger til de byene." + +msgid "Car" +msgstr "Bil" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Land" + +msgid "Postal" +msgstr "Post" + +msgid "Town" +msgstr "Sted" + +msgid "District" +msgstr "Distrikt/Kommune" + +msgid "Street" +msgstr "Gate" + +msgid "Number" +msgstr "Nummer" + +msgid "Enter Destination" +msgstr "Oppgi reisemålet" + +msgid "Zip Code" +msgstr "Postnummer" + +msgid "City" +msgstr "Sted" + +msgid "District/Township" +msgstr "Distrikt/Kommune" + +msgid "Map" +msgstr "Kart" + +msgid "Bookmark" +msgstr "Bokmerke" + +msgid "Destination" +msgstr "Reisemål" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Visning" + +msgid "_Route" +msgstr "Rute" + +msgid "_Former Destinations" +msgstr "Tidligere reisemål" + +msgid "_Bookmarks" +msgstr "Bokmerker" + +msgid "_Map" +msgstr "Kart" + +msgid "_Layout" +msgstr "Utseende" + +msgid "_Projection" +msgstr "Projeksjon" + +msgid "_Vehicle" +msgstr "Kjøretøy" + +msgid "Zoom_Out" +msgstr "Zoom ut" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Zoom inn" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Omberegn" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Info" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Stopp navigasjon" + +msgid "Test" +msgstr "Test" + +msgid "_Quit" +msgstr "_Avslutt" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Lås til vei" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Kjørebok" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Auto-zoom" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Fullskjerm" + +msgid "Data" +msgstr "Data" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NØ" + +msgid "E" +msgstr "Ø" + +msgid "SE" +msgstr "SØ" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SV" + +msgid "W" +msgstr "V" + +msgid "NW" +msgstr "NV" + +msgid "No" +msgstr "Nei" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Rute %4.0fkm %02d:%02d estimert tid" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Rute 0000km 0+00:00 estimert tid" + +msgid "Back to map" +msgstr "Tilbake til kart" + +msgid "Main Menu" +msgstr "Hovedmeny" + +msgid "Help" +msgstr "Hjelp" + +msgid "Back" +msgstr "Tilbake" + +msgid "Add Bookmark" +msgstr "Legg til bokmerke" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "Legg til bokmerke mappe" + +msgid "Rename" +msgstr "Bytt navn" + +msgid "POIs" +msgstr "Landemerker" + +msgid "View in Browser" +msgstr "Vis i browser" + +msgid "Streets" +msgstr "Gater" + +msgid "House numbers" +msgstr "Husnummer" + +msgid "View Attributes" +msgstr "Vis attributter" + +msgid "View on map" +msgstr "Vis på kart" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "Kopier bokmerke" + +msgid "Rename Bookmark" +msgstr "Endre navn på bokmerke" + +msgid "Paste Bookmark" +msgstr "Lim inn bokmerke" + +msgid "Delete Bookmark" +msgstr "Slett bokmerke" + +msgid "Bookmarks" +msgstr "Bokmerker" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Lim inn bokmerke" + +#, c-format +msgid "Bookmark %s" +msgstr "Bokmerk %s" + +msgid "Former Destinations" +msgstr "Tidligere reisemål" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Husnummer" + +msgid "Layout" +msgstr "Utseende" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Kart" + +msgid "Show Satellite Status" +msgstr "Vis satelittstatus" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "Vis NMEA-data" + +msgid "car" +msgstr "bil" + +msgid "bike" +msgstr "sykkel" + +msgid "pedestrian" +msgstr "fotgjenger" + +#, c-format +msgid "Current profile: %s" +msgstr "Aktiv profil: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Bytt profil: %s" + +msgid "Set as active" +msgstr "Sett som aktiv" + +msgid "Show Satellite status" +msgstr "Vis satelittstatus" + +msgid "Show NMEA data" +msgstr "Vis NMEA-data" + +msgid "Vehicle" +msgstr "Kjøretøy" + +msgid "Rules" +msgstr "Regler" + +msgid "Lock on road" +msgstr "Lås til vei" + +msgid "Northing" +msgstr "Hold nord oppover" + +msgid "Map follows Vehicle" +msgstr "Kart følger kjøretøy" + +msgid "Message" +msgstr "Melding" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "Høydeprofil" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "Om Navit" + +#. Authors +msgid "By" +msgstr "Av" + +#. Contributors +msgid "And all the Navit Team" +msgstr "Og alle i Navit teamet" + +msgid "members and contributors." +msgstr "medlemmer og bidragsytere." + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Kartpunkt" + +msgid "Vehicle Position" +msgstr "Kjøretøysposisjon" + +msgid "Main menu" +msgstr "Hovedmeny" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Vis\n" +"kart" + +msgid "Settings" +msgstr "Innstillinger" + +msgid "Tools" +msgstr "Verktøy" + +msgid "Route" +msgstr "Rute" + +msgid "About" +msgstr "Om" + +msgid "Actions" +msgstr "Handlinger" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Avslutt" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Stopp\n" +"navigasjon" + +msgid "Display" +msgstr "Visning" + +msgid "Fullscreen" +msgstr "Fullskjerm" + +msgid "Window Mode" +msgstr "Vindusmodus" + +msgid "Description" +msgstr "Beskrivelse" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "hest" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "Om %s, kjør inn i rundkjøringen" + +#~ msgid "Cursor" +#~ msgstr "Markør" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d,%d kilometer" diff --git a/po/nds.po.in b/po/nds.po.in new file mode 100644 index 0000000..971466e --- /dev/null +++ b/po/nds.po.in @@ -0,0 +1,1763 @@ +# German, Low translation for navit +# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 +# This file is distributed under the same license as the navit package. +# Sagamir, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-05-18 09:29+0000\n" +"Last-Translator: KaZeR \n" +"Language-Team: German, Low \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Aus dem Quellverzeichins starten\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "%s zu %s setzen\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "diese" + +msgid "first" +msgstr "erste" + +msgid "second" +msgstr "zweite" + +msgid "third" +msgstr "dritte" + +msgid "fourth" +msgstr "vierte" + +msgid "fifth" +msgstr "fünfte" + +msgid "sixth" +msgstr "sechste" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "diese Ausfahrt" + +msgid "first exit" +msgstr "erste Ausfahrt" + +msgid "second exit" +msgstr "zweite Ausfahrt" + +msgid "third exit" +msgstr "dritte Ausfahrt" + +msgid "fourth exit" +msgstr "vierte Ausfahrt" + +msgid "fifth exit" +msgstr "fünfte Ausfahrt" + +msgid "sixth exit" +msgstr "sechste Ausfahrt" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "in %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d Meter" + +#, c-format +msgid "in %d meters" +msgstr "in %d Metern" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "in %d %d Kilometern" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "ein Kilometer" +msgstr[1] "%d Kilometer" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "in einem Kilometer" +msgstr[1] "in %d Kilometern" + +msgid "exit" +msgstr "Ausfahrt" + +msgid "into the ramp" +msgstr "auf die Auffahrt" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s in die Straße %s %s %s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%s in den %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%s in die %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%s in das %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%s in die %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "Rechts" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "links" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "einfach " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "straf " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "wirklich scharf " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "unbekannt " + +msgid "When possible, please turn around" +msgstr "Wenn möglich, bitte wenden" + +msgid "Enter the roundabout soon" +msgstr "In Kürze in den Kreisverkehr einfahren" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "dann den Kreisverkehr an der %s verlassen" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Den Kreisverkehr an der %s verlassen" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Der Straße %s folgen" + +msgid "soon" +msgstr "in Kürze" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Die %1$s Straße zur %2$s nehmen" + +#, c-format +msgid "after %i roads" +msgstr "nach %i Straßen" + +msgid "now" +msgstr "jetzt" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "Dann die %1$s Straße zur %2$s nehmen" + +msgid "error" +msgstr "Fehler" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "In %3$s %1$s%2$s %4$s abbiegen" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "dann %1$s%2$s %3$s%4$s abbiegen" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Sie haben Ihr Ziel erreicht %s" + +msgid "then you have reached your destination." +msgstr "Dann haben Sie Ihr Ziel erreicht" + +msgid "Position" +msgstr "Position" + +msgid "Command" +msgstr "Kommando" + +msgid "Length" +msgstr "Länge" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Zeit" + +msgid "Destination Length" +msgstr "Fahrstrecke" + +msgid "Destination Time" +msgstr "Fahrzeit" + +msgid "Roadbook" +msgstr "Straßenatlas" + +msgid "Set as position" +msgstr "Als Position setzen" + +msgid "Set as destination" +msgstr "Als Ziel setzen" + +msgid "Add as bookmark" +msgstr "Als Lesezeichen hinzufügen" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Punkt 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Koordinaten der Anzeige: %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Vereinigte Arabische Emirate" + +#. 004 +msgid "Afghanistan" +msgstr "Afghanistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua und Barbados" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albanien" + +#. 051 +msgid "Armenia" +msgstr "Armenien" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Niederländische Antillen" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarktis" + +#. 032 +msgid "Argentina" +msgstr "Argentinien" + +#. 016 +msgid "American Samoa" +msgstr "Amerikanisch Samoa" + +#. 040 +msgid "Austria" +msgstr "Österreich" + +#. 036 +msgid "Australia" +msgstr "Australien" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Åland" + +#. 031 +msgid "Azerbaijan" +msgstr "Aserbaidschan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnien und Herzegowina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesch" + +#. 056 +msgid "Belgium" +msgstr "Belgien" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgarien" + +#. 048 +msgid "Bahrain" +msgstr "Bahrain" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Sankt Bartholomäus" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei Darussalam" + +#. 068 +msgid "Bolivia" +msgstr "Bolivien" + +#. 076 +msgid "Brazil" +msgstr "Brasilien" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "Bhutan" + +#. 074 +msgid "Bouvet Island" +msgstr "Insel Bouvet" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Weißrussland" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Kanada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Kokos Inseln" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Demokratische Republik Kongo" + +#. 140 +msgid "Central African Republic" +msgstr "Zentralafrikanische Republik" + +#. 178 +msgid "Congo" +msgstr "Kongo" + +#. 756 +msgid "Switzerland" +msgstr "Schweiz" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Elfenbeinküste" + +#. 184 +msgid "Cook Islands" +msgstr "Insel Cook" + +#. 152 +msgid "Chile" +msgstr "Chile" + +#. 120 +msgid "Cameroon" +msgstr "Kamerun" + +#. 156 +msgid "China" +msgstr "China" + +#. 170 +msgid "Colombia" +msgstr "Kolumbien" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Kuba" + +#. 132 +msgid "Cape Verde" +msgstr "Kap Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Weihnachtsinsel" + +#. 196 +msgid "Cyprus" +msgstr "Zypern" + +#. 203 +msgid "Czech Republic" +msgstr "Tschechische Republik" + +#. 276 +msgid "Germany" +msgstr "Deutschland" + +#. 262 +msgid "Djibouti" +msgstr "Dschibuti" + +#. 208 +msgid "Denmark" +msgstr "Dänemark" + +#. 212 +msgid "Dominica" +msgstr "Dominika" + +#. 214 +msgid "Dominican Republic" +msgstr "Dominikanische Republik" + +#. 012 +msgid "Algeria" +msgstr "Algerien" + +#. 218 +msgid "Ecuador" +msgstr "Ecuador" + +#. 233 +msgid "Estonia" +msgstr "Estland" + +#. 818 +msgid "Egypt" +msgstr "Ägypten" + +#. 732 +msgid "Western Sahara" +msgstr "Westsahara" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Spanien" + +#. 231 +msgid "Ethiopia" +msgstr "Äthiopien" + +#. 246 +msgid "Finland" +msgstr "Finnland" + +#. 242 +msgid "Fiji" +msgstr "Fidschi" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falkland Inseln" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Mikronesien" + +#. 234 +msgid "Faroe Islands" +msgstr "Färöer Inseln" + +#. 250 +msgid "France" +msgstr "Frankreich" + +#. 266 +msgid "Gabon" +msgstr "Gabun" + +#. 826 +msgid "United Kingdom" +msgstr "Vereinigtes Königreich" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Georgien" + +#. 254 +msgid "French Guiana" +msgstr "Französisch Guyana" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Grönland" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Äquatorial Guinea" + +#. 300 +msgid "Greece" +msgstr "Griechenland" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Südgeorgien und die Südlichen Sandwichinseln" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heard Insel und die McDonaldinseln" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Kroatien" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Ungarn" + +#. 360 +msgid "Indonesia" +msgstr "Indonesien" + +#. 372 +msgid "Ireland" +msgstr "Irland" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "Isle of Man" + +#. 356 +msgid "India" +msgstr "Indien" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Britisches Territorium im Indischen Ozean" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iran" + +#. 352 +msgid "Iceland" +msgstr "Island" + +#. 380 +msgid "Italy" +msgstr "Italien" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaika" + +#. 400 +msgid "Jordan" +msgstr "Jordanien" + +#. 392 +msgid "Japan" +msgstr "Japan" + +#. 404 +msgid "Kenya" +msgstr "Kenia" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirgisien" + +#. 116 +msgid "Cambodia" +msgstr "Kambodscha" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Komoren" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "St. Kitts und Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Nordkorea" + +#. 410 +msgid "Korea, Republic of" +msgstr "Südkorea" + +#. 414 +msgid "Kuwait" +msgstr "Kuwait" + +#. 136 +msgid "Cayman Islands" +msgstr "Kaiman-Inseln" + +#. 398 +msgid "Kazakhstan" +msgstr "Kasachstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laos" + +#. 422 +msgid "Lebanon" +msgstr "Libanon" + +#. 662 +msgid "Saint Lucia" +msgstr "St. Lucia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberia" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Litauen" + +#. 442 +msgid "Luxembourg" +msgstr "Luxemburg" + +#. 428 +msgid "Latvia" +msgstr "Lettland" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libyen" + +#. 504 +msgid "Morocco" +msgstr "Marokko" + +#. 492 +msgid "Monaco" +msgstr "Monaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Republik Moldau" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "St. Martin" + +#. 450 +msgid "Madagascar" +msgstr "Madagaskar" + +#. 584 +msgid "Marshall Islands" +msgstr "Marshallinseln" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Mazedonien" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongolei" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Nord Mariannen Inseln" + +#. 474 +msgid "Martinique" +msgstr "Martinique" + +#. 478 +msgid "Mauritania" +msgstr "Mauretanien" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauritius" + +#. 462 +msgid "Maldives" +msgstr "Malediven" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mexiko" + +#. 458 +msgid "Malaysia" +msgstr "Malaysia" + +#. 508 +msgid "Mozambique" +msgstr "Mosambik" + +#. 516 +msgid "Namibia" +msgstr "Namibia" + +#. 540 +msgid "New Caledonia" +msgstr "Neukaledonien" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolkinsel" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nicaragua" + +#. 528 +msgid "Netherlands" +msgstr "Niederlande" + +#. 578 +msgid "Norway" +msgstr "Norwegen" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Neuseeland" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Französisch Polynesien" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua Neu Guinea" + +#. 608 +msgid "Philippines" +msgstr "Phillippinen" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Polen" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "St.-Pierre und Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairninseln" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palästina" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Katar" + +#. 638 +msgid "Reunion" +msgstr "Reunion" + +#. 642 +msgid "Romania" +msgstr "Rumänien" + +#. 688 +msgid "Serbia" +msgstr "Serbien" + +#. 643 +msgid "Russian Federation" +msgstr "Russland" + +#. 646 +msgid "Rwanda" +msgstr "Ruanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Saudi Arabien" + +#. 090 +msgid "Solomon Islands" +msgstr "Salomonen" + +#. 690 +msgid "Seychelles" +msgstr "Seychellen" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Schweden" + +#. 702 +msgid "Singapore" +msgstr "Singapur" + +#. 654 +msgid "Saint Helena" +msgstr "St. Helena" + +#. 705 +msgid "Slovenia" +msgstr "Slowenien" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard und Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slowakei" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalia" + +#. 740 +msgid "Suriname" +msgstr "Surinam" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Sao Tome and Principe" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Syrien" + +#. 748 +msgid "Swaziland" +msgstr "Swasiland" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turks- und Caicosinseln" + +#. 148 +msgid "Chad" +msgstr "Tschad" + +#. 260 +msgid "French Southern Territories" +msgstr "Französische Süd- und Antarktisgebiete" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Thailand" + +#. 762 +msgid "Tajikistan" +msgstr "Tadschikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Osttimor" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunesien" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Türkei" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad und Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tansania" + +#. 804 +msgid "Ukraine" +msgstr "Ukraine" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Amerikanisch-Ozeanien" + +#. 840 +msgid "United States" +msgstr "USA" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Usbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Vatikanstadt" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "St. Vincent und die Grenadinen" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Britische Jungferninseln" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Amerikanische Jungferninseln" + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis und Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Jemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Südafrika" + +#. 894 +msgid "Zambia" +msgstr "Sambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Simbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "" + +msgid "Car" +msgstr "Auto" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Land" + +msgid "Postal" +msgstr "Postanschrift" + +msgid "Town" +msgstr "Stadt" + +msgid "District" +msgstr "Bezirk" + +msgid "Street" +msgstr "Straße" + +msgid "Number" +msgstr "Nummer" + +msgid "Enter Destination" +msgstr "Reiseziel eingeben" + +msgid "Zip Code" +msgstr "Postleitzahl" + +msgid "City" +msgstr "Stadt" + +msgid "District/Township" +msgstr "Ortsteil/Gemeinde" + +msgid "Map" +msgstr "Karte" + +msgid "Bookmark" +msgstr "Lesezeichen" + +msgid "Destination" +msgstr "Reiseziel" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Anzeige" + +msgid "_Route" +msgstr "Route" + +msgid "_Former Destinations" +msgstr "Vorherige Ziele" + +msgid "_Bookmarks" +msgstr "Lesezeichen" + +msgid "_Map" +msgstr "Karte" + +msgid "_Layout" +msgstr "Erscheinungsbild" + +msgid "_Projection" +msgstr "Darstellung" + +msgid "_Vehicle" +msgstr "Fahrzeug" + +msgid "Zoom_Out" +msgstr "Verkleinern" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Vergrößern" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Neu berechnen" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Information" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Navigation beenden" + +msgid "Test" +msgstr "Test" + +msgid "_Quit" +msgstr "_Beenden" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Auf Straße zeigen" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Straßenatlas" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "automatischer Zoom" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Vollbild" + +msgid "Data" +msgstr "Daten" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NO" + +msgid "E" +msgstr "O" + +msgid "SE" +msgstr "SO" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SW" + +msgid "W" +msgstr "W" + +msgid "NW" +msgstr "NW" + +msgid "No" +msgstr "Nein" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Route %4.0fkm %02d:%02d ETA" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Route 0000km 0+00:00 ETA" + +msgid "Back to map" +msgstr "Zurück zur Karte" + +msgid "Main Menu" +msgstr "Hauptmenü" + +msgid "Help" +msgstr "Hilfe" + +msgid "Back" +msgstr "Zurück" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "POI" + +msgid "View in Browser" +msgstr "Im Browser anzeigen" + +msgid "Streets" +msgstr "Straßen" + +msgid "House numbers" +msgstr "Hausnummern" + +msgid "View Attributes" +msgstr "Attribute anzeigen" + +msgid "View on map" +msgstr "Auf der Karte zeigen" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "Lesezeichen" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "Lesezeichen %s" + +msgid "Former Destinations" +msgstr "Vorherige Ziele" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Huisnummer" + +msgid "Layout" +msgstr "Erscheinungsbild" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Karten" + +msgid "Show Satellite Status" +msgstr "Satellitenstatus anzeigen" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "zeige NMEA Daten" + +msgid "car" +msgstr "Auto" + +msgid "bike" +msgstr "Riejwiel" + +msgid "pedestrian" +msgstr "Voetganger" + +#, c-format +msgid "Current profile: %s" +msgstr "Aktuelles Profil: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Profil wechseln nach: %s" + +msgid "Set as active" +msgstr "Als Aktiv setzen" + +msgid "Show Satellite status" +msgstr "Satellitenstatus anzeigen" + +msgid "Show NMEA data" +msgstr "NMEA Daten anzeigen" + +msgid "Vehicle" +msgstr "Fahrzeug" + +msgid "Rules" +msgstr "Regeln" + +msgid "Lock on road" +msgstr "Auf Straße zeigen" + +msgid "Northing" +msgstr "Einnorden" + +msgid "Map follows Vehicle" +msgstr "Karte folgt Fahrzeug" + +msgid "Message" +msgstr "Nachricht" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "Höhenprofil" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Kartenpunkt" + +msgid "Vehicle Position" +msgstr "Fahrzeugposition" + +msgid "Main menu" +msgstr "Hauptmenü" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Karte\n" +"anzeigen" + +msgid "Settings" +msgstr "Einstellungen" + +msgid "Tools" +msgstr "Werkzeuge" + +msgid "Route" +msgstr "Route" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "Aktionen" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Beenden" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Navigation\n" +"beenden" + +msgid "Display" +msgstr "Anzeige" + +msgid "Fullscreen" +msgstr "Vollbild" + +msgid "Window Mode" +msgstr "Fenstermodus" + +msgid "Description" +msgstr "Beschreibung" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "In %s, in den Kreisverkehr einfahren" + +#~ msgid "Cursor" +#~ msgstr "Zeiger" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d %d Kilometer" diff --git a/po/nl.po.in b/po/nl.po.in new file mode 100644 index 0000000..599fb90 --- /dev/null +++ b/po/nl.po.in @@ -0,0 +1,1770 @@ +# Dutch translations for navit +# Copyright (C) 2007,2008 The Navit Team +# This file is distributed under the same license as the navit package. +# Albert Faber, 2007. +# Ed Kapitein +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-06-17 08:22+0000\n" +"Last-Translator: Christ van Willegen \n" +"Language-Team: afaber\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Gestart vanuit de brondirectory\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "Instelling '%s' naar '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "nulde" + +msgid "first" +msgstr "eerste" + +msgid "second" +msgstr "tweede" + +msgid "third" +msgstr "derde" + +msgid "fourth" +msgstr "vierde" + +msgid "fifth" +msgstr "vijfde" + +msgid "sixth" +msgstr "zesde" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "nulde afrit" + +msgid "first exit" +msgstr "eerste afslag" + +msgid "second exit" +msgstr "tweede afslag" + +msgid "third exit" +msgstr "derde afslag" + +msgid "fourth exit" +msgstr "vierde afslag" + +msgid "fifth exit" +msgstr "vijfde afslag" + +msgid "sixth exit" +msgstr "zesde afslag" + +#, c-format +msgid "%d m" +msgstr "%d meter" + +#, c-format +msgid "in %d m" +msgstr "na %d meter" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d meter" + +#, c-format +msgid "in %d meters" +msgstr "na %d meter" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d kilometer" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "na %d,%d kilometer" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "één kilometer" +msgstr[1] "%d kilometer" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "na één kilometer" +msgstr[1] "na %d kilometer" + +msgid "exit" +msgstr "afslag" + +msgid "into the ramp" +msgstr "naar de afslag" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%sde straat %s%s%s in" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%sde %s%s%s in" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%sde %s%s%s in" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%sde %s%s%s in" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%snaar de %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "rechts" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "links" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "flauw " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "scherp " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "zeer scherp " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "onbekende " + +msgid "When possible, please turn around" +msgstr "Indien mogelijk omkeren" + +msgid "Enter the roundabout soon" +msgstr "U rijdt zodadelijk de rotonde op" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "daarna de rotonde verlaten bij de %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Verlaat de rotonde bij de %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Volg de weg voor de volgende %s" + +msgid "soon" +msgstr "binnenkort" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Neem de %1$s straat naar %2$s" + +#, c-format +msgid "after %i roads" +msgstr "na %i wegen" + +msgid "now" +msgstr "nu" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "neem daarna de %1$s weg naar %2$s" + +msgid "error" +msgstr "fout" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Ga %3$s %1$s naar %2$s %4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "daarna, ga na %3$s wegen %1$s %2$s naar %4$s" + +# over 200 meter links aanhouden +#, c-format +msgid "You have reached your destination %s" +msgstr "%s bestemming bereikt" + +msgid "then you have reached your destination." +msgstr "dan heeft u uw bestemming bereikt." + +msgid "Position" +msgstr "Positie" + +msgid "Command" +msgstr "Opdracht" + +msgid "Length" +msgstr "Duur" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Tijd" + +msgid "Destination Length" +msgstr "Afstand" + +msgid "Destination Time" +msgstr "Aankomsttijd" + +msgid "Roadbook" +msgstr "route beschrijving" + +msgid "Set as position" +msgstr "Zet als positie" + +msgid "Set as destination" +msgstr "Gebruik als bestemming" + +msgid "Add as bookmark" +msgstr "Opnemen als favoriet" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Punt 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Schermcoörd: %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Verenigde Arabische Emiraten" + +#. 004 +msgid "Afghanistan" +msgstr "Afghanistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua en Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albanië" + +#. 051 +msgid "Armenia" +msgstr "Armenië" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Nederlandse Antillen" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarctica" + +#. 032 +msgid "Argentina" +msgstr "Argentinië" + +#. 016 +msgid "American Samoa" +msgstr "Samoa" + +#. 040 +msgid "Austria" +msgstr "Oostenrijk" + +#. 036 +msgid "Australia" +msgstr "Australië" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Färöer eilanden" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbeidjan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnië en Herzegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesh" + +#. 056 +msgid "Belgium" +msgstr "België" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgarije" + +#. 048 +msgid "Bahrain" +msgstr "Bahrein" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint-Barthélemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei" + +#. 068 +msgid "Bolivia" +msgstr "Bolivia" + +#. 076 +msgid "Brazil" +msgstr "Brazilië" + +#. 044 +msgid "Bahamas" +msgstr "Bahama's" + +#. 064 +msgid "Bhutan" +msgstr "Bhutan" + +#. 074 +msgid "Bouvet Island" +msgstr "Bouvet eiland" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Wit-Rusland" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Canada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Cocoseilanden" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Congo-Kinshasa" + +#. 140 +msgid "Central African Republic" +msgstr "Centraal Afrikaanse Republiek" + +#. 178 +msgid "Congo" +msgstr "Congo-Brazzaville" + +#. 756 +msgid "Switzerland" +msgstr "Zwitserland" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Ivoorkust" + +#. 184 +msgid "Cook Islands" +msgstr "Cookeilanden" + +#. 152 +msgid "Chile" +msgstr "Chili" + +#. 120 +msgid "Cameroon" +msgstr "Kameroen" + +#. 156 +msgid "China" +msgstr "China" + +#. 170 +msgid "Colombia" +msgstr "Colombia" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Cuba" + +#. 132 +msgid "Cape Verde" +msgstr "Kaap Verdië" + +#. 162 +msgid "Christmas Island" +msgstr "Kersteiland" + +#. 196 +msgid "Cyprus" +msgstr "Cyprus" + +#. 203 +msgid "Czech Republic" +msgstr "Tsjechië" + +#. 276 +msgid "Germany" +msgstr "Duitsland" + +#. 262 +msgid "Djibouti" +msgstr "Djibouti" + +#. 208 +msgid "Denmark" +msgstr "Denemarken" + +#. 212 +msgid "Dominica" +msgstr "Dominica" + +#. 214 +msgid "Dominican Republic" +msgstr "Dominicaanse Republiek" + +#. 012 +msgid "Algeria" +msgstr "Algerije" + +#. 218 +msgid "Ecuador" +msgstr "Ecuador" + +#. 233 +msgid "Estonia" +msgstr "Estland" + +#. 818 +msgid "Egypt" +msgstr "Egypte" + +#. 732 +msgid "Western Sahara" +msgstr "Westsahara" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Spanje" + +#. 231 +msgid "Ethiopia" +msgstr "Ethiopië" + +#. 246 +msgid "Finland" +msgstr "Finland" + +#. 242 +msgid "Fiji" +msgstr "Fiji" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falkland Eilanden" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Micronesië" + +#. 234 +msgid "Faroe Islands" +msgstr "Färöer" + +#. 250 +msgid "France" +msgstr "Frankrijk" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Verenigd Koninkrijk" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Georgië" + +#. 254 +msgid "French Guiana" +msgstr "Frans Guiana" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Groenland" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Papoea-Nieuw-Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Equitoriaal Guinea" + +#. 300 +msgid "Greece" +msgstr "Griekenland" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Zuid Georgia en de zuidelijke Sandwich eilanden" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinee-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heard en McDonald eilanden" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Kroatië" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Hongarije" + +#. 360 +msgid "Indonesia" +msgstr "Indonesië" + +#. 372 +msgid "Ireland" +msgstr "Ierland" + +#. 376 +msgid "Israel" +msgstr "Israël" + +#. 833 +msgid "Isle of Man" +msgstr "Eiland van Man" + +#. 356 +msgid "India" +msgstr "India" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Brits Territorium in de Indische Oceaan" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iran" + +#. 352 +msgid "Iceland" +msgstr "IJsland" + +#. 380 +msgid "Italy" +msgstr "Italië" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaica" + +#. 400 +msgid "Jordan" +msgstr "Jordanie" + +#. 392 +msgid "Japan" +msgstr "Japan" + +#. 404 +msgid "Kenya" +msgstr "Kenia" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirgizië" + +#. 116 +msgid "Cambodia" +msgstr "Cambodja" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Comoren" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Saint Kitts en Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "ZuidKorea" + +#. 410 +msgid "Korea, Republic of" +msgstr "Noord-Korea" + +#. 414 +msgid "Kuwait" +msgstr "Koeweit" + +#. 136 +msgid "Cayman Islands" +msgstr "Caymaneilanden" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazachstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laos" + +#. 422 +msgid "Lebanon" +msgstr "Libanon" + +#. 662 +msgid "Saint Lucia" +msgstr "Saint Lucia" + +#. 438 +msgid "Liechtenstein" +msgstr "Lichtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberia" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Litouwen" + +#. 442 +msgid "Luxembourg" +msgstr "Luxemburg" + +#. 428 +msgid "Latvia" +msgstr "Letland" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libië" + +#. 504 +msgid "Morocco" +msgstr "Marokko" + +#. 492 +msgid "Monaco" +msgstr "Monaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldavië" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Sint-Maarten (Franse Antillen)" + +#. 450 +msgid "Madagascar" +msgstr "Madagascar" + +#. 584 +msgid "Marshall Islands" +msgstr "Marshall eilanden" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Macedonië" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongolië" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Noordelijke Marianen" + +#. 474 +msgid "Martinique" +msgstr "Martinique" + +#. 478 +msgid "Mauritania" +msgstr "Mauretanië" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauritius" + +#. 462 +msgid "Maldives" +msgstr "Maldiven" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mexico" + +#. 458 +msgid "Malaysia" +msgstr "Maleisië" + +#. 508 +msgid "Mozambique" +msgstr "Mozambique" + +#. 516 +msgid "Namibia" +msgstr "Namibië" + +#. 540 +msgid "New Caledonia" +msgstr "Nieuw Caledonië" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolk" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "NIcaragua" + +#. 528 +msgid "Netherlands" +msgstr "Nederland" + +#. 578 +msgid "Norway" +msgstr "Noorwegen" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Nieuw Zeeland" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Frans Polynesië" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua Nieuw Guinea" + +#. 608 +msgid "Philippines" +msgstr "Philippijnen" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Polen" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint-Pierre en Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairneilanden" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestijns Gebied, Bezet" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Qatar" + +#. 638 +msgid "Reunion" +msgstr "Réunion" + +#. 642 +msgid "Romania" +msgstr "Roemenië" + +#. 688 +msgid "Serbia" +msgstr "Servië" + +#. 643 +msgid "Russian Federation" +msgstr "Rusland" + +#. 646 +msgid "Rwanda" +msgstr "Rwanda" + +# +#. 682 +msgid "Saudi Arabia" +msgstr "Saudi-Arabië" + +#. 090 +msgid "Solomon Islands" +msgstr "Salomonseilanden" + +#. 690 +msgid "Seychelles" +msgstr "Seychellen" + +#. 736 +msgid "Sudan" +msgstr "Soedan" + +#. 752 +msgid "Sweden" +msgstr "Zweden" + +#. 702 +msgid "Singapore" +msgstr "Singapore" + +#. 654 +msgid "Saint Helena" +msgstr "Sint-Helena" + +#. 705 +msgid "Slovenia" +msgstr "Slovenië" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard und Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slowakije" + +#. 694 +msgid "Sierra Leone" +msgstr "Siërra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalië" + +#. 740 +msgid "Suriname" +msgstr "Suriname" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Sao Tomé en Principe" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Syrië" + +#. 748 +msgid "Swaziland" +msgstr "Swasiland" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turks- en Caicoseilanden" + +#. 148 +msgid "Chad" +msgstr "Tjaad" + +#. 260 +msgid "French Southern Territories" +msgstr "Franse Zuidelijke en Antarctische Gebieden" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Thailand" + +#. 762 +msgid "Tajikistan" +msgstr "Tadzjikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau-eilanden" + +#. 626 +msgid "Timor-Leste" +msgstr "Oost-Timor" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunesië" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turkije" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad en Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzania" + +#. 804 +msgid "Ukraine" +msgstr "Oekraïne" + +#. 800 +msgid "Uganda" +msgstr "Oeganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Kleine Pacifische eilanden van de Verenigde Staten" + +#. 840 +msgid "United States" +msgstr "Verenigde Staten" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Vaticaanstad" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Saint Vincent en de Grenadines" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Britse Maagdeneilanden" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Maagdeneilanden, USA" + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis en Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Jemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Zuid-Afrika" + +#. 894 +msgid "Zambia" +msgstr "Zambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Onbekend, voeg een is_in-label toe aan deze steden" + +msgid "Car" +msgstr "Auto" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Land" + +# +msgid "Postal" +msgstr "Postcode" + +msgid "Town" +msgstr "Plaats" + +# +msgid "District" +msgstr "District" + +msgid "Street" +msgstr "Straat" + +msgid "Number" +msgstr "Nummer" + +# +msgid "Enter Destination" +msgstr "Bestemming" + +msgid "Zip Code" +msgstr "Postcode" + +msgid "City" +msgstr "Stad" + +msgid "District/Township" +msgstr "Gebied" + +msgid "Map" +msgstr "Kaart" + +msgid "Bookmark" +msgstr "Favoriet" + +msgid "Destination" +msgstr "Bestemming" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Tonen" + +msgid "_Route" +msgstr "Route" + +msgid "_Former Destinations" +msgstr "Vorige bestemmingen" + +msgid "_Bookmarks" +msgstr "Favorieten" + +msgid "_Map" +msgstr "Kaart" + +msgid "_Layout" +msgstr "Opmaak" + +msgid "_Projection" +msgstr "Projectie" + +msgid "_Vehicle" +msgstr "Voertuig" + +msgid "Zoom_Out" +msgstr "Verkleinen" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Vergroten" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Herberekenen" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Info" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Stop navigatie" + +msgid "Test" +msgstr "Test" + +msgid "_Quit" +msgstr "Beëindigen" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Huidige locatie altijd op de weg" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "route beschrijving" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Autozoom" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Beeldvullend" + +msgid "Data" +msgstr "Gegevens" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NO" + +msgid "E" +msgstr "O" + +msgid "SE" +msgstr "ZO" + +msgid "S" +msgstr "Z" + +msgid "SW" +msgstr "ZW" + +msgid "W" +msgstr "W" + +msgid "NW" +msgstr "NW" + +msgid "No" +msgstr "Nee" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Route %4.0fkm %02d:%02d Aankomsttijd" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Route 0000km 0+00:00 Aankomsttijd" + +msgid "Back to map" +msgstr "Terug naar de kaart" + +msgid "Main Menu" +msgstr "Hoofdmenu" + +msgid "Help" +msgstr "Hulp" + +msgid "Back" +msgstr "Terug" + +msgid "Add Bookmark" +msgstr "Bladwijzer Toevoegen" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "Hernoem" + +msgid "POIs" +msgstr "bezienswaardigheden" + +msgid "View in Browser" +msgstr "Bekijk in browser" + +msgid "Streets" +msgstr "Straten" + +msgid "House numbers" +msgstr "huisnummers" + +msgid "View Attributes" +msgstr "Bekijk eigenschappen" + +msgid "View on map" +msgstr "Bekijk op de kaart" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "Plak Bladwijzer" + +msgid "Delete Bookmark" +msgstr "Verwijder Bladwijzer" + +msgid "Bookmarks" +msgstr "Favorieten" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Plak Bladwijzer" + +#, c-format +msgid "Bookmark %s" +msgstr "Favoriet %s" + +msgid "Former Destinations" +msgstr "Vorige bestemmingen" + +msgid "- No former destinations available -" +msgstr "- Geen vorige bestemmingen -" + +msgid "House number" +msgstr "Huisnummer" + +msgid "Layout" +msgstr "Opmaak" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Kaarten" + +msgid "Show Satellite Status" +msgstr "Toon satellietstatus" + +msgid " Elevation " +msgstr " Hoogte " + +msgid " Azimuth " +msgstr " Azimuth " + +msgid "Show NMEA Data" +msgstr "Toon NMEA gegevens" + +msgid "car" +msgstr "auto" + +msgid "bike" +msgstr "fiets" + +msgid "pedestrian" +msgstr "voetganger" + +#, c-format +msgid "Current profile: %s" +msgstr "Huidig profiel: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "profiel veranderen naar: % s" + +msgid "Set as active" +msgstr "Activeren" + +msgid "Show Satellite status" +msgstr "Satellietstatus weergeven" + +msgid "Show NMEA data" +msgstr "Toon NMEA-gegevens" + +msgid "Vehicle" +msgstr "Voertuig" + +msgid "Rules" +msgstr "Voorschrift" + +msgid "Lock on road" +msgstr "Op weg plaatsen" + +msgid "Northing" +msgstr "Noord boven" + +msgid "Map follows Vehicle" +msgstr "Kaart volgt voertuig" + +msgid "Message" +msgstr "Boodschap" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Routebeschrijving" + +msgid "Height Profile" +msgstr "Hoogteprofiel" + +msgid "Show Locale" +msgstr "Toon taal" + +msgid "About Navit" +msgstr "Over Navit" + +#. Authors +msgid "By" +msgstr "Door" + +#. Contributors +msgid "And all the Navit Team" +msgstr "En het hele Navit Team" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Punt op de kaart" + +msgid "Vehicle Position" +msgstr "Voertuigpositie" + +msgid "Main menu" +msgstr "Hoofdmenu" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Kaart\n" +"Weergeven" + +msgid "Settings" +msgstr "Instellingen" + +msgid "Tools" +msgstr "Gereedschappen" + +msgid "Route" +msgstr "Route" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "Acties" + +msgid "" +"Former\n" +"Destinations" +msgstr "" +"Vorige\n" +"bestemmingen" + +msgid "Quit" +msgstr "Afsluiten" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Stop\n" +"navigatie" + +msgid "Display" +msgstr "Tonen" + +msgid "Fullscreen" +msgstr "Beeldvullend" + +msgid "Window Mode" +msgstr "Venstermodus" + +msgid "Description" +msgstr "Beschrijving" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "paard" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "Neem de rotonde over %s" + +#~ msgid "Cursor" +#~ msgstr "Cursor" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d,%d kilometer" diff --git a/po/nn.po.in b/po/nn.po.in new file mode 100644 index 0000000..cb974cf --- /dev/null +++ b/po/nn.po.in @@ -0,0 +1,1760 @@ +# Norwegian Nynorsk translation for navit +# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 +# This file is distributed under the same license as the navit package. +# Skippern 2009 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2009-12-20 21:37+0000\n" +"Last-Translator: KaZeR \n" +"Language-Team: Norwegian Nynorsk \n" +"Language: nn\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "nullte" + +msgid "first" +msgstr "fyrste" + +msgid "second" +msgstr "andre" + +msgid "third" +msgstr "tredje" + +msgid "fourth" +msgstr "fjerde" + +msgid "fifth" +msgstr "femte" + +msgid "sixth" +msgstr "sjette" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "nullte avkjøyring" + +msgid "first exit" +msgstr "første avkjøyring" + +msgid "second exit" +msgstr "andre avkjøyring" + +msgid "third exit" +msgstr "tredje avkjøyring" + +msgid "fourth exit" +msgstr "fjerde avkjøyring" + +msgid "fifth exit" +msgstr "femte avkjøyring" + +msgid "sixth exit" +msgstr "sjette avkjøyring" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "om %d meter" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d meter" + +#, c-format +msgid "in %d meters" +msgstr "om %d meter" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "om %d,%d kilometer" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "ein kilometer" +msgstr[1] "%d kilometer" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "om ein kilometer" +msgstr[1] "om %d kilometer" + +msgid "exit" +msgstr "avkjøyring" + +msgid "into the ramp" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%sinn på %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "høgre" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "venstre" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "slakt " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "krapt " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "veldig krapt " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "ukjend " + +msgid "When possible, please turn around" +msgstr "" + +msgid "Enter the roundabout soon" +msgstr "" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "" + +msgid "soon" +msgstr "snart" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Ta den %1$s vegen mot %2$s" + +#, c-format +msgid "after %i roads" +msgstr "" + +msgid "now" +msgstr "no" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "" + +msgid "error" +msgstr "feil" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "" + +#, c-format +msgid "You have reached your destination %s" +msgstr "" + +msgid "then you have reached your destination." +msgstr "" + +msgid "Position" +msgstr "Posisjon" + +msgid "Command" +msgstr "Kommando" + +msgid "Length" +msgstr "Avstand" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "" + +msgid "Destination Length" +msgstr "" + +msgid "Destination Time" +msgstr "" + +msgid "Roadbook" +msgstr "" + +msgid "Set as position" +msgstr "" + +msgid "Set as destination" +msgstr "" + +msgid "Add as bookmark" +msgstr "" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Punkt 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Dei sameinte arabiske emirata" + +#. 004 +msgid "Afghanistan" +msgstr "Afghanistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua og Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albania" + +#. 051 +msgid "Armenia" +msgstr "Armenia" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Dei nederlandske Antillane" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarktika" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "Amerikansk Samoa" + +#. 040 +msgid "Austria" +msgstr "Austerrike" + +#. 036 +msgid "Australia" +msgstr "Australia" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Åland" + +#. 031 +msgid "Azerbaijan" +msgstr "Aserbadjan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnia Herzegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesh" + +#. 056 +msgid "Belgium" +msgstr "Belgia" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgaria" + +#. 048 +msgid "Bahrain" +msgstr "Bahrain" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint Barthelemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei" + +#. 068 +msgid "Bolivia" +msgstr "Bolivia" + +#. 076 +msgid "Brazil" +msgstr "Brasil" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "Bhutan" + +#. 074 +msgid "Bouvet Island" +msgstr "Bouvetøya" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Kviterussland" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Canada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Kokosøyane" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Kongo, Den demokratiske republikken" + +#. 140 +msgid "Central African Republic" +msgstr "Den sentralafrikanske republikken" + +#. 178 +msgid "Congo" +msgstr "Kongo-Brazzaville" + +#. 756 +msgid "Switzerland" +msgstr "Sveits" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Elfenbeinskysten" + +#. 184 +msgid "Cook Islands" +msgstr "Cookøyane" + +#. 152 +msgid "Chile" +msgstr "Chile" + +#. 120 +msgid "Cameroon" +msgstr "Kamerun" + +#. 156 +msgid "China" +msgstr "Kina" + +#. 170 +msgid "Colombia" +msgstr "Colombia" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Kuba" + +#. 132 +msgid "Cape Verde" +msgstr "Kapp Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Juløya" + +#. 196 +msgid "Cyprus" +msgstr "Kypros" + +#. 203 +msgid "Czech Republic" +msgstr "Tsjekkiske republikk" + +#. 276 +msgid "Germany" +msgstr "Tyskland" + +#. 262 +msgid "Djibouti" +msgstr "Djibouti" + +#. 208 +msgid "Denmark" +msgstr "Danmark" + +#. 212 +msgid "Dominica" +msgstr "Dominica" + +#. 214 +msgid "Dominican Republic" +msgstr "Den dominikanske republikken" + +#. 012 +msgid "Algeria" +msgstr "Algerie" + +#. 218 +msgid "Ecuador" +msgstr "Ekvador" + +#. 233 +msgid "Estonia" +msgstr "Estland" + +#. 818 +msgid "Egypt" +msgstr "Egypt" + +#. 732 +msgid "Western Sahara" +msgstr "Vest-Sahara" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Spania" + +#. 231 +msgid "Ethiopia" +msgstr "Etiopia" + +#. 246 +msgid "Finland" +msgstr "Finnland" + +#. 242 +msgid "Fiji" +msgstr "Fiji" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falklandsøyane" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Mikronesiaføderasjonen" + +#. 234 +msgid "Faroe Islands" +msgstr "Færøyane" + +#. 250 +msgid "France" +msgstr "Frankrike" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Storbritannia" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Georgia" + +#. 254 +msgid "French Guiana" +msgstr "Fransk Guyana" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Grønnland" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadelope" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Ekvatorial-Guinea" + +#. 300 +msgid "Greece" +msgstr "Hellas" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Sør-Georgia og Sør-Sandwichøyane" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heard- og McDonaldøyane" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Kroatsia" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Ungarn" + +#. 360 +msgid "Indonesia" +msgstr "Indonesia" + +#. 372 +msgid "Ireland" +msgstr "Irland" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "Man" + +#. 356 +msgid "India" +msgstr "India" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Britiske territorier i det indiske hav" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iran, Den islamske republikk" + +#. 352 +msgid "Iceland" +msgstr "Island" + +#. 380 +msgid "Italy" +msgstr "Italia" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaica" + +#. 400 +msgid "Jordan" +msgstr "Jordan" + +#. 392 +msgid "Japan" +msgstr "Japan" + +#. 404 +msgid "Kenya" +msgstr "Kenya" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirgistan" + +#. 116 +msgid "Cambodia" +msgstr "Kambodsja" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Komorane" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "St. Kitts og Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Korea, Den demokratiske folkerepublikk" + +#. 410 +msgid "Korea, Republic of" +msgstr "Sør-Korea" + +#. 414 +msgid "Kuwait" +msgstr "Kuwait" + +#. 136 +msgid "Cayman Islands" +msgstr "Kayman-øyane" + +#. 398 +msgid "Kazakhstan" +msgstr "Kasakstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laos" + +#. 422 +msgid "Lebanon" +msgstr "Libanon" + +#. 662 +msgid "Saint Lucia" +msgstr "St. Lucia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberia" + +#. 426 +msgid "Lesotho" +msgstr "Lesoto" + +#. 440 +msgid "Lithuania" +msgstr "Litauen" + +#. 442 +msgid "Luxembourg" +msgstr "Luxemburg" + +#. 428 +msgid "Latvia" +msgstr "Latvia" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libya" + +#. 504 +msgid "Morocco" +msgstr "Marokko" + +#. 492 +msgid "Monaco" +msgstr "Monaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldova" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Saint Martin (Fransk del)" + +#. 450 +msgid "Madagascar" +msgstr "Madagaskar" + +#. 584 +msgid "Marshall Islands" +msgstr "Marshalløyane" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Makedonia" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongolia" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Nord-Marianane" + +#. 474 +msgid "Martinique" +msgstr "Martinik" + +#. 478 +msgid "Mauritania" +msgstr "Mauritania" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauritius" + +#. 462 +msgid "Maldives" +msgstr "Maldivane" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mexico" + +#. 458 +msgid "Malaysia" +msgstr "Malaysia" + +#. 508 +msgid "Mozambique" +msgstr "Mosambik" + +#. 516 +msgid "Namibia" +msgstr "Namibia" + +#. 540 +msgid "New Caledonia" +msgstr "Ny-Kaledonia" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolkøya" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nikaragua" + +#. 528 +msgid "Netherlands" +msgstr "Nederland" + +#. 578 +msgid "Norway" +msgstr "Noreg" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Ny-Zealand" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Fransk Polynesia" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua Ny-Guinea" + +#. 608 +msgid "Philippines" +msgstr "Fillipinane" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Polen" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint-Pierre og Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairnøyane" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestina" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Qatar" + +#. 638 +msgid "Reunion" +msgstr "Reunion" + +#. 642 +msgid "Romania" +msgstr "Romania" + +#. 688 +msgid "Serbia" +msgstr "Serbia" + +#. 643 +msgid "Russian Federation" +msgstr "Russland" + +#. 646 +msgid "Rwanda" +msgstr "Rwanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Saudi-Arabia" + +#. 090 +msgid "Solomon Islands" +msgstr "Salomonøyane" + +#. 690 +msgid "Seychelles" +msgstr "Seychellane" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Sverige" + +#. 702 +msgid "Singapore" +msgstr "Singapore" + +#. 654 +msgid "Saint Helena" +msgstr "St. Helena" + +#. 705 +msgid "Slovenia" +msgstr "Slovenia" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard og Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slovakia" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalia" + +#. 740 +msgid "Suriname" +msgstr "Surinam" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Sao Tome og Principe" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Syria" + +#. 748 +msgid "Swaziland" +msgstr "Swaziland" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turks- og Caicosøyane" + +#. 148 +msgid "Chad" +msgstr "Tsjad" + +#. 260 +msgid "French Southern Territories" +msgstr "Dei franske sørterritoria" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Thailand" + +#. 762 +msgid "Tajikistan" +msgstr "Tadsjikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Aust-Timor" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunis" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Tyrkia" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad og Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzania" + +#. 804 +msgid "Ukraine" +msgstr "Ukraina" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Mindre utenforliggende øyar til USA" + +#. 840 +msgid "United States" +msgstr "Dei forenede statar" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Usbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Vatikanstaten" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "St. Vincent og Grenadinane" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Jomfruøyane (Storbritannia)" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Jomfruøyane (USA)" + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis- og Futunaøyane" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Jemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Sør-Afrika" + +#. 894 +msgid "Zambia" +msgstr "Zambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "Ukjend, legg is_in-tagger til dei byane." + +msgid "Car" +msgstr "Bil" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Land" + +msgid "Postal" +msgstr "Post" + +msgid "Town" +msgstr "Sted" + +msgid "District" +msgstr "Distrikt/Kommune" + +msgid "Street" +msgstr "Gate" + +msgid "Number" +msgstr "Tal" + +msgid "Enter Destination" +msgstr "" + +msgid "Zip Code" +msgstr "Postnummer" + +msgid "City" +msgstr "Sted" + +msgid "District/Township" +msgstr "Distrikt/Kommune" + +msgid "Map" +msgstr "Kart" + +msgid "Bookmark" +msgstr "Bokmerke" + +msgid "Destination" +msgstr "" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Visning" + +msgid "_Route" +msgstr "Rute" + +msgid "_Former Destinations" +msgstr "" + +msgid "_Bookmarks" +msgstr "Bokmerker" + +msgid "_Map" +msgstr "Kart" + +msgid "_Layout" +msgstr "" + +msgid "_Projection" +msgstr "Projeksjon" + +msgid "_Vehicle" +msgstr "" + +msgid "Zoom_Out" +msgstr "Zoom ut" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Zoom inn" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Berekne på nytt" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Opplysningar" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Stopp navigasjon" + +msgid "Test" +msgstr "Test" + +msgid "_Quit" +msgstr "" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Lås til veg" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Auto-zoom" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Heile skjermen" + +msgid "Data" +msgstr "Data" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NØ" + +msgid "E" +msgstr "Ø" + +msgid "SE" +msgstr "SØ" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SV" + +msgid "W" +msgstr "V" + +msgid "NW" +msgstr "NV" + +msgid "No" +msgstr "Nei" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "" + +msgid "Back to map" +msgstr "" + +msgid "Main Menu" +msgstr "Hovudmenyen" + +msgid "Help" +msgstr "Hjelp" + +msgid "Back" +msgstr "Tilbake" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "" + +msgid "View in Browser" +msgstr "" + +msgid "Streets" +msgstr "Vegar" + +msgid "House numbers" +msgstr "Husnummer" + +msgid "View Attributes" +msgstr "" + +msgid "View on map" +msgstr "" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "Bokmerker" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "Bokmerk %s" + +msgid "Former Destinations" +msgstr "" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Husnummer" + +msgid "Layout" +msgstr "" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Kart" + +msgid "Show Satellite Status" +msgstr "Vis satelittstatus" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "Vis NMEA-data" + +msgid "car" +msgstr "bil" + +msgid "bike" +msgstr "sykkel" + +msgid "pedestrian" +msgstr "fotgjengar" + +#, c-format +msgid "Current profile: %s" +msgstr "" + +#, c-format +msgid "Change profile to: %s" +msgstr "" + +msgid "Set as active" +msgstr "" + +msgid "Show Satellite status" +msgstr "Vis satelittstatus" + +msgid "Show NMEA data" +msgstr "Vis NMEA-data" + +msgid "Vehicle" +msgstr "" + +msgid "Rules" +msgstr "Reglar" + +msgid "Lock on road" +msgstr "Lås til veg" + +msgid "Northing" +msgstr "" + +msgid "Map follows Vehicle" +msgstr "" + +msgid "Message" +msgstr "Melding" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "Høgdeprofil" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "" + +msgid "Vehicle Position" +msgstr "" + +msgid "Main menu" +msgstr "Hovudmeny" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Vis\n" +"kart" + +msgid "Settings" +msgstr "Innstillingar" + +msgid "Tools" +msgstr "Verkty" + +msgid "Route" +msgstr "Rute" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "Handlingar" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Avslutt" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Stopp\n" +"navigasjon" + +msgid "Display" +msgstr "Visning" + +msgid "Fullscreen" +msgstr "Heile skjermen" + +msgid "Window Mode" +msgstr "" + +msgid "Description" +msgstr "Beskriving" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "Cursor" +#~ msgstr "Peikar" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d,%d kilometer" diff --git a/po/pl.po.in b/po/pl.po.in new file mode 100644 index 0000000..4936d40 --- /dev/null +++ b/po/pl.po.in @@ -0,0 +1,1770 @@ +# Polish translations for navit. +# Copyright (C) 2007, 2008 The Navit Team +# This file is distributed under the same license as the Navit package. +# Michael "Mineque" Madej , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-06-09 18:10+0000\n" +"Last-Translator: Lukasz Semler \n" +"Language-Team: Translators\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Poedit-Country: POLAND\n" +"X-Poedit-Language: Polish\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Uruchamiam z katalogu źródłowego\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "ustawiam '%s' na '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "zerowy" + +msgid "first" +msgstr "pierwszy" + +msgid "second" +msgstr "drugi" + +msgid "third" +msgstr "trzeci" + +msgid "fourth" +msgstr "czwarty" + +msgid "fifth" +msgstr "piąty" + +msgid "sixth" +msgstr "szósty" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "zerowym wyjeździe" + +msgid "first exit" +msgstr "pierwszym wyjeździe" + +msgid "second exit" +msgstr "drugim wyjeździe" + +msgid "third exit" +msgstr "trzecim wyjeździe" + +msgid "fourth exit" +msgstr "czwartym wyjeździe" + +msgid "fifth exit" +msgstr "piątym wyjeździe" + +msgid "sixth exit" +msgstr "szóstym wyjeździe" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "za %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metrów" + +#, c-format +msgid "in %d meters" +msgstr "za %d m" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d kilometrów" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "za %d.%d kilometrów" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "jeden kilometr" +msgstr[1] "%d kilometr" +msgstr[2] "%d kilometr" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "za kilometr" +msgstr[1] "%d kilometr" +msgstr[2] "%d kilometr" + +msgid "exit" +msgstr "zjazd" + +msgid "into the ramp" +msgstr "na wjazd" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s w ulicę %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%sw %s%s%s|male form" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%sw %s%s%s|female form" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%sw %s%s%s|neutral form" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%s na / w %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "w prawo" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "w lewo" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "lekko " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "silnie " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "bardzo silnie " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "nieznane " + +msgid "When possible, please turn around" +msgstr "Zawróc, gdy będzie to możliwe" + +msgid "Enter the roundabout soon" +msgstr "Wjazd na rondo wkrótce" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "następnie zjedź z ronda na %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Zjedź z ronda na %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Jedź tą drogą %s" + +msgid "soon" +msgstr "wkrótce" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Jedź %1$s drogą w %2$s" + +#, c-format +msgid "after %i roads" +msgstr "%i skrzyżowanie" + +msgid "now" +msgstr "teraz" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "następnie jedź %1$s drogą w %2$s" + +msgid "error" +msgstr "błąd" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Skręć %1$s%2$s %4$s %3$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "następnie skręć %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Dotarłeś do celu %s" + +msgid "then you have reached your destination." +msgstr "następnie dojechałeś do celu." + +msgid "Position" +msgstr "Położenie" + +msgid "Command" +msgstr "Polecenie" + +msgid "Length" +msgstr "Odległość" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Czas" + +msgid "Destination Length" +msgstr "Odległość do celu" + +msgid "Destination Time" +msgstr "Czas do celu" + +msgid "Roadbook" +msgstr "Szczegóły trasy" + +msgid "Set as position" +msgstr "Ustaw jako pozycję" + +msgid "Set as destination" +msgstr "Ustaw jako cel" + +msgid "Add as bookmark" +msgstr "Dodaj jako zakładkę" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Punkt 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Współrzędne ekranu: %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andora" + +#. 784 +msgid "United Arab Emirates" +msgstr "Zjednoczone Emiraty Arabskie" + +#. 004 +msgid "Afghanistan" +msgstr "Afganistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua i Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albania" + +#. 051 +msgid "Armenia" +msgstr "Armenia" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Antyle Holenderskie" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarktyka" + +#. 032 +msgid "Argentina" +msgstr "Argentyna" + +#. 016 +msgid "American Samoa" +msgstr "Samoa Amerykańskie" + +#. 040 +msgid "Austria" +msgstr "Austria" + +#. 036 +msgid "Australia" +msgstr "Australia" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Wyspy Alandzkie" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbejdżan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bośnia i Hercegowina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesz" + +#. 056 +msgid "Belgium" +msgstr "Belgia" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bułgaria" + +#. 048 +msgid "Bahrain" +msgstr "Bahrajn" + +#. 108 +msgid "Burundi" +msgstr "Republika Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint-Barthélemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermudy" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Państwo Brunei Siedziba Pokoju" + +#. 068 +msgid "Bolivia" +msgstr "Boliwia" + +#. 076 +msgid "Brazil" +msgstr "Brazylia" + +#. 044 +msgid "Bahamas" +msgstr "Bahamy" + +#. 064 +msgid "Bhutan" +msgstr "Bhutan" + +#. 074 +msgid "Bouvet Island" +msgstr "Wyspa Bouveta" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Białoruś" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Kanada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Wyspy Kokosowe (Keelinga)" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Demokratyczna Republika Konga" + +#. 140 +msgid "Central African Republic" +msgstr "Republika Środkowej Afryki" + +#. 178 +msgid "Congo" +msgstr "Kongo" + +#. 756 +msgid "Switzerland" +msgstr "Szwajcaria" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Wybrzeże Kości Słoniowej" + +#. 184 +msgid "Cook Islands" +msgstr "Wyspy Cook'a" + +#. 152 +msgid "Chile" +msgstr "Chile" + +#. 120 +msgid "Cameroon" +msgstr "Kamerun" + +#. 156 +msgid "China" +msgstr "Chiny" + +#. 170 +msgid "Colombia" +msgstr "Kolumbia" + +#. 188 +msgid "Costa Rica" +msgstr "Kostaryka" + +#. 192 +msgid "Cuba" +msgstr "Kuba" + +#. 132 +msgid "Cape Verde" +msgstr "Republika Zielonego Przylądka" + +#. 162 +msgid "Christmas Island" +msgstr "Wyspy Bożego Narodzenia" + +#. 196 +msgid "Cyprus" +msgstr "Cypr" + +#. 203 +msgid "Czech Republic" +msgstr "Republika Czeska" + +#. 276 +msgid "Germany" +msgstr "Niemcy" + +#. 262 +msgid "Djibouti" +msgstr "Dżibuti" + +#. 208 +msgid "Denmark" +msgstr "Dania" + +#. 212 +msgid "Dominica" +msgstr "Dominika" + +#. 214 +msgid "Dominican Republic" +msgstr "Republika Dominikańska" + +#. 012 +msgid "Algeria" +msgstr "Algeria" + +#. 218 +msgid "Ecuador" +msgstr "Ekwador" + +#. 233 +msgid "Estonia" +msgstr "Estonia" + +#. 818 +msgid "Egypt" +msgstr "Egipt" + +#. 732 +msgid "Western Sahara" +msgstr "Zachodnia Sahara" + +#. 232 +msgid "Eritrea" +msgstr "Erytrea" + +#. 724 +msgid "Spain" +msgstr "Hiszpania" + +#. 231 +msgid "Ethiopia" +msgstr "Etiopia" + +#. 246 +msgid "Finland" +msgstr "Finlandia" + +#. 242 +msgid "Fiji" +msgstr "Fidżi" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falklandy (Malwiny)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Mikronezja" + +#. 234 +msgid "Faroe Islands" +msgstr "Wyspy Faroe" + +#. 250 +msgid "France" +msgstr "Francja" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Wielka Brytania" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Georgia" + +#. 254 +msgid "French Guiana" +msgstr "Gujana Francuska" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Grenlandia" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Gwinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Gwadelupa" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Gwinea Równikowa" + +#. 300 +msgid "Greece" +msgstr "Grecja" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Wyspy Południowa Georgia i Sandwich Południowy" + +#. 320 +msgid "Guatemala" +msgstr "Gwatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Gwinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Gujana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Wyspa Heard i Wyspy McDonalda" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Chorwacja" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Węgry" + +#. 360 +msgid "Indonesia" +msgstr "Indonezja" + +#. 372 +msgid "Ireland" +msgstr "Irlandia" + +#. 376 +msgid "Israel" +msgstr "Izrael" + +#. 833 +msgid "Isle of Man" +msgstr "Wyspa Man" + +#. 356 +msgid "India" +msgstr "Indie" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Brytyjskie Terytorium Oceanu Indyjskiego" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iran" + +#. 352 +msgid "Iceland" +msgstr "Islandia" + +#. 380 +msgid "Italy" +msgstr "Włochy" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamajka" + +#. 400 +msgid "Jordan" +msgstr "Jordania" + +#. 392 +msgid "Japan" +msgstr "Japonia" + +#. 404 +msgid "Kenya" +msgstr "Kenia" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirgistan" + +#. 116 +msgid "Cambodia" +msgstr "Kambodża" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Komory" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Saint Kitts i Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Korea Północna" + +#. 410 +msgid "Korea, Republic of" +msgstr "Korea Południowa" + +#. 414 +msgid "Kuwait" +msgstr "Kuwejt" + +#. 136 +msgid "Cayman Islands" +msgstr "Kajmany" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazachstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laos, Laotańska Republika Ludowo-Demokratyczna" + +#. 422 +msgid "Lebanon" +msgstr "Liban" + +#. 662 +msgid "Saint Lucia" +msgstr "Saint Lucia" + +#. 438 +msgid "Liechtenstein" +msgstr "Lichtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberia" + +#. 426 +msgid "Lesotho" +msgstr "Lesoto" + +#. 440 +msgid "Lithuania" +msgstr "Litwa" + +#. 442 +msgid "Luxembourg" +msgstr "Luksemburg" + +#. 428 +msgid "Latvia" +msgstr "Łotwa" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Wielka Arabska Libijska Dżamahirijja Ludowo-Socjalistyczna" + +#. 504 +msgid "Morocco" +msgstr "Maroko" + +#. 492 +msgid "Monaco" +msgstr "Monako" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Mołdawia" + +#. 499 +msgid "Montenegro" +msgstr "Czarnogóra" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Saint Martin (część francuska)" + +#. 450 +msgid "Madagascar" +msgstr "Madagaskar" + +#. 584 +msgid "Marshall Islands" +msgstr "Wyspy Marshalla" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Republika Macedonii" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Związek Myanmar (Birma)" + +#. 496 +msgid "Mongolia" +msgstr "Mongolia" + +#. 446 +msgid "Macao" +msgstr "Makau" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Mariany Północne" + +#. 474 +msgid "Martinique" +msgstr "Martynika" + +#. 478 +msgid "Mauritania" +msgstr "Mauretania" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauritius" + +#. 462 +msgid "Maldives" +msgstr "Malediwy" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Meksyk" + +#. 458 +msgid "Malaysia" +msgstr "Malezja" + +#. 508 +msgid "Mozambique" +msgstr "Mozambik" + +#. 516 +msgid "Namibia" +msgstr "Namibia" + +#. 540 +msgid "New Caledonia" +msgstr "Nowa Kaledonia" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Wyspa Norfolk" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nikaragua" + +#. 528 +msgid "Netherlands" +msgstr "Holandia" + +#. 578 +msgid "Norway" +msgstr "Norwegia" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Nowa Zelandia" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Polinezja Francuska" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua Nowa Gwinea" + +#. 608 +msgid "Philippines" +msgstr "Filipiny" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Polska" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint Pierre i Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Portoryko" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Terytorium Palestyńskie, okupowane" + +#. 620 +msgid "Portugal" +msgstr "Portugalia" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paragwaj" + +#. 634 +msgid "Qatar" +msgstr "Katar" + +#. 638 +msgid "Reunion" +msgstr "Reunion" + +#. 642 +msgid "Romania" +msgstr "Rumunia" + +#. 688 +msgid "Serbia" +msgstr "Serbia" + +#. 643 +msgid "Russian Federation" +msgstr "Federacja Rosyjska" + +#. 646 +msgid "Rwanda" +msgstr "Rwanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Arabia Saudyjska" + +#. 090 +msgid "Solomon Islands" +msgstr "Wyspy Salomona" + +#. 690 +msgid "Seychelles" +msgstr "Seszele" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Szwecja" + +#. 702 +msgid "Singapore" +msgstr "Singapur" + +#. 654 +msgid "Saint Helena" +msgstr "Święta Helena" + +#. 705 +msgid "Slovenia" +msgstr "Słowenia" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard i Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Słowacja" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalia" + +#. 740 +msgid "Suriname" +msgstr "Surinam" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Wyspy Świętego Tomasza i Książęca" + +#. 222 +msgid "El Salvador" +msgstr "Salwador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Syryjska Republika Arabska" + +#. 748 +msgid "Swaziland" +msgstr "Suazi" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Wyspy Turks i Caicos" + +#. 148 +msgid "Chad" +msgstr "Czad" + +#. 260 +msgid "French Southern Territories" +msgstr "Francuskie Terytoria Południowe" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Tajlandia" + +#. 762 +msgid "Tajikistan" +msgstr "Tadżykistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Timor Wschodni" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunezja" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turcja" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trynidad i Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Tajwan, Republika Chińska" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzania, Zjednoczona Republika" + +#. 804 +msgid "Ukraine" +msgstr "Ukraina" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Dalekie Wyspy Mniejsze Stanów Zjednoczonych" + +#. 840 +msgid "United States" +msgstr "Stany Zjednoczone" + +#. 858 +msgid "Uruguay" +msgstr "Urugwaj" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Watykan" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Saint Vincent i Grenadyny" + +#. 862 +msgid "Venezuela" +msgstr "Wenezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Brytyjskie Wyspy Dziewicze" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Wyspy Dziewicze Stanów Zjednoczonych" + +#. 704 +msgid "Viet Nam" +msgstr "Wietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis i Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Jemen" + +#. 175 +msgid "Mayotte" +msgstr "Majotta" + +#. 710 +msgid "South Africa" +msgstr "Republika Południowej Afryki" + +#. 894 +msgid "Zambia" +msgstr "Zambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Nieznane, dodaj tag \"is_in\" dla tych miast" + +msgid "Car" +msgstr "Samochód" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Państwo" + +msgid "Postal" +msgstr "Kod Pocztowy" + +msgid "Town" +msgstr "Miasto" + +msgid "District" +msgstr "Dzielnica/Okręg miejski" + +msgid "Street" +msgstr "Ulica" + +msgid "Number" +msgstr "Numer" + +msgid "Enter Destination" +msgstr "Podaj cel" + +msgid "Zip Code" +msgstr "Kod Pocztowy" + +msgid "City" +msgstr "Miasto" + +msgid "District/Township" +msgstr "Dzielnica/Okręg miejski" + +msgid "Map" +msgstr "Mapa" + +msgid "Bookmark" +msgstr "Zakładka" + +msgid "Destination" +msgstr "Cel" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Pokaż" + +msgid "_Route" +msgstr "Trasa" + +msgid "_Former Destinations" +msgstr "Poprzednie cele" + +msgid "_Bookmarks" +msgstr "Zakładki" + +msgid "_Map" +msgstr "Mapa" + +msgid "_Layout" +msgstr "Układ kolorów" + +msgid "_Projection" +msgstr "Odwzorowanie" + +msgid "_Vehicle" +msgstr "Pojazd" + +msgid "Zoom_Out" +msgstr "Oddal" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Zbliż" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Oblicz ponownie" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Info" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Zatrzymaj nawigację" + +msgid "Test" +msgstr "Test" + +msgid "_Quit" +msgstr "Zakończ" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Trzymaj się drogi" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Szczegóły trasy" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Automatyczne przybliżenie" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Pełny ekran" + +msgid "Data" +msgstr "Dane" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NE" + +msgid "E" +msgstr "E" + +msgid "SE" +msgstr "SE" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SW" + +msgid "W" +msgstr "W" + +msgid "NW" +msgstr "NW" + +msgid "No" +msgstr "Nie" + +msgid "2D" +msgstr "2W" + +msgid "3D" +msgstr "3W" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Trasa %4.0fkm %02d:%02d ETA" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Trasa 0000km 0+00:00 ETA" + +msgid "Back to map" +msgstr "Wróć do mapy" + +msgid "Main Menu" +msgstr "Menu główne" + +msgid "Help" +msgstr "Pomoc" + +msgid "Back" +msgstr "Wróć" + +msgid "Add Bookmark" +msgstr "Dodaj zakładkę" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "Dodaj folder zakładek" + +msgid "Rename" +msgstr "Zmień nazwę" + +msgid "POIs" +msgstr "Użyteczne miejsca" + +msgid "View in Browser" +msgstr "Zobacz w przeglądarce" + +msgid "Streets" +msgstr "Ulice" + +msgid "House numbers" +msgstr "Numery domów" + +msgid "View Attributes" +msgstr "Zobacz właściwości" + +msgid "View on map" +msgstr "Zobacz na mapie" + +msgid "Cut Bookmark" +msgstr "Wytnij zakładkę" + +msgid "Copy Bookmark" +msgstr "Kopiuj zakładkę" + +msgid "Rename Bookmark" +msgstr "Zmień nazwę zakładki" + +msgid "Paste Bookmark" +msgstr "Wklej zakładkę" + +msgid "Delete Bookmark" +msgstr "Usuń zakładkę" + +msgid "Bookmarks" +msgstr "Zakładki" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Wklej zakładkę" + +#, c-format +msgid "Bookmark %s" +msgstr "Zakładka %s" + +msgid "Former Destinations" +msgstr "Poprzednie cele" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Numer domu" + +msgid "Layout" +msgstr "Układ kolorów" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Mapy" + +msgid "Show Satellite Status" +msgstr "Pokaż status satelitów" + +msgid " Elevation " +msgstr " Wysokość n.p.m. " + +msgid " Azimuth " +msgstr " Azymut " + +msgid "Show NMEA Data" +msgstr "Pokaż dane NMEA" + +msgid "car" +msgstr "auto" + +msgid "bike" +msgstr "motor" + +msgid "pedestrian" +msgstr "pieszy" + +#, c-format +msgid "Current profile: %s" +msgstr "Aktualny profil: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Zmień profil na: %s" + +msgid "Set as active" +msgstr "Ustaw jako aktywny" + +msgid "Show Satellite status" +msgstr "Pokaż status satelitów" + +msgid "Show NMEA data" +msgstr "Pokaż dane NMEA" + +msgid "Vehicle" +msgstr "Pojazd" + +msgid "Rules" +msgstr "Reguły" + +msgid "Lock on road" +msgstr "Trzymaj się drogi" + +msgid "Northing" +msgstr "Północ zawsze na górze" + +msgid "Map follows Vehicle" +msgstr "Wyśrodkuj mapę" + +msgid "Message" +msgstr "Wiadomość" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Opis trasy" + +msgid "Height Profile" +msgstr "Profil wysokości" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "O Navit" + +#. Authors +msgid "By" +msgstr "Przez" + +#. Contributors +msgid "And all the Navit Team" +msgstr "I cały zespół Navit" + +msgid "members and contributors." +msgstr "członkowie oraz współtwórcy." + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Punkt na mapie" + +msgid "Vehicle Position" +msgstr "Pozycja pojazdu" + +msgid "Main menu" +msgstr "Menu główne" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Pokaż\n" +"mapę" + +msgid "Settings" +msgstr "Ustawienia" + +msgid "Tools" +msgstr "Narzędzia" + +msgid "Route" +msgstr "Trasa" + +msgid "About" +msgstr "O" + +msgid "Actions" +msgstr "Akcje" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Zakończ" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Przerwij\n" +"nawigację" + +msgid "Display" +msgstr "Pokaż" + +msgid "Fullscreen" +msgstr "Pełny ekran" + +msgid "Window Mode" +msgstr "Tryb Widoku" + +msgid "Description" +msgstr "Opis" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "koń" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "Wjedź na rondo za %s" + +#~ msgid "Cursor" +#~ msgstr "Kursor" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d kilometra" diff --git a/po/pt.po.in b/po/pt.po.in new file mode 100644 index 0000000..be5bb17 --- /dev/null +++ b/po/pt.po.in @@ -0,0 +1,1763 @@ +# Portuguese translation for navit +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the navit package. +# Joel Patrao \n" +"Language-Team: Portuguese \n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Executando do diretório de origem\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "ajuste '%s' to '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "zero" + +msgid "first" +msgstr "primeiro" + +msgid "second" +msgstr "segundo" + +msgid "third" +msgstr "terceiro" + +msgid "fourth" +msgstr "quarto" + +msgid "fifth" +msgstr "quinta" + +msgid "sixth" +msgstr "sexto" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "saída zero" + +msgid "first exit" +msgstr "primeira saida" + +msgid "second exit" +msgstr "segunda saida" + +msgid "third exit" +msgstr "terceira saida" + +msgid "fourth exit" +msgstr "quarta saida" + +msgid "fifth exit" +msgstr "quinta saida" + +msgid "sixth exit" +msgstr "sexta saida" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "em %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metros" + +#, c-format +msgid "in %d meters" +msgstr "em %d metros" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "em %d.%d quilómetros" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "um quilḿetro" +msgstr[1] "%d quilómetros" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "em um quilómetro" +msgstr[1] "em %d quilómetros" + +msgid "exit" +msgstr "sair" + +msgid "into the ramp" +msgstr "na subida" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%spara a rua %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%sna %s%s%s|formulário masculino" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%sna %s%s%s|formulário feminino" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%sna %s%s%s|formulário neutral" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%sna %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "direita" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "esquerda" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "facilmente " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "veementemente " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "com força " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "desconhecido " + +msgid "When possible, please turn around" +msgstr "Quando for possível" + +msgid "Enter the roundabout soon" +msgstr "em breve entre na rotatória" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "depois deixe a rotunda na %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Deixe a rotunda na %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Siga a estrada para a próxima %s" + +msgid "soon" +msgstr "logo" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Apanhe a %1$s estrada para %2$s" + +#, c-format +msgid "after %i roads" +msgstr "depois de %i estradas" + +msgid "now" +msgstr "agora" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "depois apanhe a %1$s estrada para %2$s" + +msgid "error" +msgstr "erro" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Vire %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "depois vire á %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Você chegou ao seu destino %s" + +msgid "then you have reached your destination." +msgstr "depois chegou ao seu destino" + +msgid "Position" +msgstr "Posição" + +msgid "Command" +msgstr "Executar comandos" + +msgid "Length" +msgstr "Duração" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Tempo" + +msgid "Destination Length" +msgstr "Duração Destino" + +msgid "Destination Time" +msgstr "Tempo Destino" + +msgid "Roadbook" +msgstr "Roadbook" + +msgid "Set as position" +msgstr "Definir como posição" + +msgid "Set as destination" +msgstr "Definir como destino" + +msgid "Add as bookmark" +msgstr "Adicionar como marcador" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Ponto 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Coordenada da tela: %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Emirados Árabes Unidos" + +#. 004 +msgid "Afghanistan" +msgstr "Afeganistão" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua e Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Ilhas Anguillas" + +#. 008 +msgid "Albania" +msgstr "Albânia" + +#. 051 +msgid "Armenia" +msgstr "Arménia" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Antilhas Holandesas" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antárctida" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "Samoa Americana" + +#. 040 +msgid "Austria" +msgstr "Áustria" + +#. 036 +msgid "Australia" +msgstr "Austrália" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Aland Islands" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbaijão" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bósnia-Herzegóvina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesh" + +#. 056 +msgid "Belgium" +msgstr "Bélgica" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgária" + +#. 048 +msgid "Bahrain" +msgstr "Barein" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benim" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint Barthelemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei" + +#. 068 +msgid "Bolivia" +msgstr "Bolívia" + +#. 076 +msgid "Brazil" +msgstr "Brasil" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "Butão" + +#. 074 +msgid "Bouvet Island" +msgstr "Ilha Bouvet" + +#. 072 +msgid "Botswana" +msgstr "Botsuana" + +#. 112 +msgid "Belarus" +msgstr "Bielorússia" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Canadá" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Ilhas Cocos" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "República Democrática do Congo" + +#. 140 +msgid "Central African Republic" +msgstr "República Centro-Africanaa" + +#. 178 +msgid "Congo" +msgstr "Congo" + +#. 756 +msgid "Switzerland" +msgstr "Suíça" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Costa do Marfim" + +#. 184 +msgid "Cook Islands" +msgstr "Ilhas Cook" + +#. 152 +msgid "Chile" +msgstr "Chile" + +#. 120 +msgid "Cameroon" +msgstr "Camarões" + +#. 156 +msgid "China" +msgstr "China" + +#. 170 +msgid "Colombia" +msgstr "Colômbia" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Cuba" + +#. 132 +msgid "Cape Verde" +msgstr "Cabo Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Ilha Natal" + +#. 196 +msgid "Cyprus" +msgstr "Chipre" + +#. 203 +msgid "Czech Republic" +msgstr "República Checa" + +#. 276 +msgid "Germany" +msgstr "Alemanha" + +#. 262 +msgid "Djibouti" +msgstr "Djibouti" + +#. 208 +msgid "Denmark" +msgstr "Dinamarca" + +#. 212 +msgid "Dominica" +msgstr "Dominica" + +#. 214 +msgid "Dominican Republic" +msgstr "República Dominicana" + +#. 012 +msgid "Algeria" +msgstr "Algéria" + +#. 218 +msgid "Ecuador" +msgstr "Equador" + +#. 233 +msgid "Estonia" +msgstr "Estónia" + +#. 818 +msgid "Egypt" +msgstr "Egipto" + +#. 732 +msgid "Western Sahara" +msgstr "Sahara Ocidental" + +#. 232 +msgid "Eritrea" +msgstr "Eritreia" + +#. 724 +msgid "Spain" +msgstr "Espanha" + +#. 231 +msgid "Ethiopia" +msgstr "Etiópia" + +#. 246 +msgid "Finland" +msgstr "Finlândia" + +#. 242 +msgid "Fiji" +msgstr "Fiji" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Ilhas Falkland (Maldinas)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Micronesia, estados federados de" + +#. 234 +msgid "Faroe Islands" +msgstr "Ilhas Faroé" + +#. 250 +msgid "France" +msgstr "França" + +#. 266 +msgid "Gabon" +msgstr "Gabão" + +#. 826 +msgid "United Kingdom" +msgstr "Reino Unido" + +#. 308 +msgid "Grenada" +msgstr "Granada" + +#. 268 +msgid "Georgia" +msgstr "Geórgia" + +#. 254 +msgid "French Guiana" +msgstr "Guiana Francesa" + +#. 831 +msgid "Guernsey" +msgstr "Guernesei" + +#. 288 +msgid "Ghana" +msgstr "Gana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Gronelândia" + +#. 270 +msgid "Gambia" +msgstr "Gâmbia" + +#. 324 +msgid "Guinea" +msgstr "Guiné" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadalupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Guiné Equatorial" + +#. 300 +msgid "Greece" +msgstr "Grécia" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Geórgia do Sul e Ilhas Sandwich do Sul" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guiné-Bissáu" + +#. 328 +msgid "Guyana" +msgstr "Guiana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Ilha Heard e Ilhas McDonald" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Croácia" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Hungria" + +#. 360 +msgid "Indonesia" +msgstr "Indonésia" + +#. 372 +msgid "Ireland" +msgstr "Irlanda" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "Ilha de Man" + +#. 356 +msgid "India" +msgstr "Índia" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Território Britânico do Oceano Índico" + +#. 368 +msgid "Iraq" +msgstr "Iraque" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Irão, República Islâmica do" + +#. 352 +msgid "Iceland" +msgstr "Islândia" + +#. 380 +msgid "Italy" +msgstr "Itália" + +#. 832 +msgid "Jersey" +msgstr "Jérsia" + +#. 388 +msgid "Jamaica" +msgstr "Jamaica" + +#. 400 +msgid "Jordan" +msgstr "Jordânia" + +#. 392 +msgid "Japan" +msgstr "Japão" + +#. 404 +msgid "Kenya" +msgstr "Quénia" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Quirgistão" + +#. 116 +msgid "Cambodia" +msgstr "Cambodja" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Comoros" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Saint Kitts e Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Coreia, República Popular Democrática de" + +#. 410 +msgid "Korea, Republic of" +msgstr "Coreia, República da" + +#. 414 +msgid "Kuwait" +msgstr "Kuwait" + +#. 136 +msgid "Cayman Islands" +msgstr "Ilhas Caimão" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazaquistão" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Républica Democrática Popular do Laos" + +#. 422 +msgid "Lebanon" +msgstr "Líbano" + +#. 662 +msgid "Saint Lucia" +msgstr "Santa Lúcia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Libéria" + +#. 426 +msgid "Lesotho" +msgstr "Lesoto" + +#. 440 +msgid "Lithuania" +msgstr "Lituânia" + +#. 442 +msgid "Luxembourg" +msgstr "Luxemburgo" + +#. 428 +msgid "Latvia" +msgstr "Letónia" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Jamahirya Árabe Líbia" + +#. 504 +msgid "Morocco" +msgstr "Marrocos" + +#. 492 +msgid "Monaco" +msgstr "Mónaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldova, República da" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "São Martin (Território Francês)" + +#. 450 +msgid "Madagascar" +msgstr "Madagáscar" + +#. 584 +msgid "Marshall Islands" +msgstr "Ilhas Marshall" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Macedónia, da Antiga República Jugoslava" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongólia" + +#. 446 +msgid "Macao" +msgstr "Macau" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Ilhas Marianas do Norte" + +#. 474 +msgid "Martinique" +msgstr "Martinica" + +#. 478 +msgid "Mauritania" +msgstr "Mauritânia" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Maurício" + +#. 462 +msgid "Maldives" +msgstr "Maldivas" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "México" + +#. 458 +msgid "Malaysia" +msgstr "Malásia" + +#. 508 +msgid "Mozambique" +msgstr "Moçambique" + +#. 516 +msgid "Namibia" +msgstr "Namíbia" + +#. 540 +msgid "New Caledonia" +msgstr "Nova Caledónia" + +#. 562 +msgid "Niger" +msgstr "Níger" + +#. 574 +msgid "Norfolk Island" +msgstr "Ilha Norfolk" + +#. 566 +msgid "Nigeria" +msgstr "Nigéria" + +#. 558 +msgid "Nicaragua" +msgstr "Nicarágua" + +#. 528 +msgid "Netherlands" +msgstr "Países Baixos" + +#. 578 +msgid "Norway" +msgstr "Noruega" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauruano" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Nova Zelândia" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panamá" + +#. 604 +msgid "Peru" +msgstr "Perú" + +#. 258 +msgid "French Polynesia" +msgstr "Polinésia Francesa" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua Nova Guiné" + +#. 608 +msgid "Philippines" +msgstr "Filipinas" + +#. 586 +msgid "Pakistan" +msgstr "Paquistão" + +#. 616 +msgid "Poland" +msgstr "Polónia" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint Pierre e Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Porto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Territórios Palestinos, Ocupados" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguai" + +#. 634 +msgid "Qatar" +msgstr "Quatar" + +#. 638 +msgid "Reunion" +msgstr "Ilha Reunião" + +#. 642 +msgid "Romania" +msgstr "Roménia" + +#. 688 +msgid "Serbia" +msgstr "Sérvia" + +#. 643 +msgid "Russian Federation" +msgstr "Federação Russa" + +#. 646 +msgid "Rwanda" +msgstr "Ruanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Arábia Saudita" + +#. 090 +msgid "Solomon Islands" +msgstr "Ilhas Salomão" + +#. 690 +msgid "Seychelles" +msgstr "Seychelles" + +#. 736 +msgid "Sudan" +msgstr "Sudão" + +#. 752 +msgid "Sweden" +msgstr "Suécia" + +#. 702 +msgid "Singapore" +msgstr "Singapura" + +#. 654 +msgid "Saint Helena" +msgstr "Santa Helena" + +#. 705 +msgid "Slovenia" +msgstr "Eslovénia" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard e Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Eslováquia" + +#. 694 +msgid "Sierra Leone" +msgstr "Serra Leoa" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somália" + +#. 740 +msgid "Suriname" +msgstr "Suriname" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "São Tomé e Príncipe" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Républica Árabe Síria" + +#. 748 +msgid "Swaziland" +msgstr "Suazilândia" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Ilhas Turks e Caicos" + +#. 148 +msgid "Chad" +msgstr "Chade" + +#. 260 +msgid "French Southern Territories" +msgstr "Territórios Franceses do Sul" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Tailândia" + +#. 762 +msgid "Tajikistan" +msgstr "Tadjaquistão" + +#. 772 +msgid "Tokelau" +msgstr "Toquelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Timor Leste" + +#. 795 +msgid "Turkmenistan" +msgstr "Turcomenistão" + +#. 788 +msgid "Tunisia" +msgstr "Tunísia" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turquia" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidade e Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan, Província da China" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzânia, República Unida da" + +#. 804 +msgid "Ukraine" +msgstr "Ucrânia" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Ilhas Menores Exteriores dos Estados Unidos" + +#. 840 +msgid "United States" +msgstr "Estados Unidos da América" + +#. 858 +msgid "Uruguay" +msgstr "Uruguai" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbequistão" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Santa Sé (Estado Cidade do Vaticano)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "São Vicente e Grenadinas" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Ilhas Virgens, Britânicas" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Ilhas Virgens, Estados Unidos" + +#. 704 +msgid "Viet Nam" +msgstr "Vietname" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis e Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Yémen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Africa do Sul" + +#. 894 +msgid "Zambia" +msgstr "Zâmbia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Desconhecido, adicione tags \"is_in\" para essas cidades" + +msgid "Car" +msgstr "Carro" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "País" + +msgid "Postal" +msgstr "Postal" + +msgid "Town" +msgstr "Cidade" + +msgid "District" +msgstr "Distrito" + +msgid "Street" +msgstr "Rua" + +msgid "Number" +msgstr "Número" + +msgid "Enter Destination" +msgstr "Introduza destino" + +msgid "Zip Code" +msgstr "Código Postal" + +msgid "City" +msgstr "Cidade" + +msgid "District/Township" +msgstr "Distrito/Concelho" + +msgid "Map" +msgstr "Mapa" + +msgid "Bookmark" +msgstr "Marcador" + +msgid "Destination" +msgstr "Destino" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Exibir" + +msgid "_Route" +msgstr "Rota" + +msgid "_Former Destinations" +msgstr "Anteriores Destinos" + +msgid "_Bookmarks" +msgstr "Marcadores" + +msgid "_Map" +msgstr "Mapa" + +msgid "_Layout" +msgstr "Esquema" + +msgid "_Projection" +msgstr "Projecção" + +msgid "_Vehicle" +msgstr "Veículo" + +msgid "Zoom_Out" +msgstr "ZoomOut" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "ZoomIn" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Recalcular" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Info" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Parar Navegação" + +msgid "Test" +msgstr "Teste" + +msgid "_Quit" +msgstr "_Sair" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Bloqueio na estrada" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Roadbook" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Zoom Automático" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Ecrã Inteiro" + +msgid "Data" +msgstr "Dados" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NE" + +msgid "E" +msgstr "E" + +msgid "SE" +msgstr "SE" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SW" + +msgid "W" +msgstr "W" + +msgid "NW" +msgstr "NW" + +msgid "No" +msgstr "Não" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Rota %4.0fkm %02d:%02d ETA" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Rota 0000km 0+00:00 ETA" + +msgid "Back to map" +msgstr "Voltar ao mapa" + +msgid "Main Menu" +msgstr "Menu Principal" + +msgid "Help" +msgstr "Ajuda" + +msgid "Back" +msgstr "Voltar" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "POIs" + +msgid "View in Browser" +msgstr "Ver no Navegador" + +msgid "Streets" +msgstr "Ruas" + +msgid "House numbers" +msgstr "Números da Casa" + +msgid "View Attributes" +msgstr "Ver Atributos" + +msgid "View on map" +msgstr "Ver no mapa" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "Marcadores" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "Marcador %s" + +msgid "Former Destinations" +msgstr "Anteriores Destinos" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Número da Casa" + +msgid "Layout" +msgstr "Esquema" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Mapas" + +msgid "Show Satellite Status" +msgstr "Mostrar Estado do Satélite" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "Mostrar Dados NMEA" + +msgid "car" +msgstr "carro" + +msgid "bike" +msgstr "bicicleta" + +msgid "pedestrian" +msgstr "pedestre" + +#, c-format +msgid "Current profile: %s" +msgstr "Perfil atual: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Alterar perfil para: %s" + +msgid "Set as active" +msgstr "Definir como activo" + +msgid "Show Satellite status" +msgstr "Mostrar estado do Satélite" + +msgid "Show NMEA data" +msgstr "Mostrar dados NMEA" + +msgid "Vehicle" +msgstr "Veículo" + +msgid "Rules" +msgstr "Regras" + +msgid "Lock on road" +msgstr "Prender na estrada" + +msgid "Northing" +msgstr "Norte" + +msgid "Map follows Vehicle" +msgstr "Mapa segue veículo" + +msgid "Message" +msgstr "Mensagem" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "Perfil de Altitude" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Ponto do mapa" + +msgid "Vehicle Position" +msgstr "Posição do Veículo" + +msgid "Main menu" +msgstr "Menu Principal" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Mostrar\n" +"Mapa" + +msgid "Settings" +msgstr "Definições" + +msgid "Tools" +msgstr "Ferramentas" + +msgid "Route" +msgstr "Rota" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "Acções" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Sair" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Parar\n" +"Navegação" + +msgid "Display" +msgstr "Exibir" + +msgid "Fullscreen" +msgstr "Ecrã Inteiro" + +msgid "Window Mode" +msgstr "Modo de Janela" + +msgid "Description" +msgstr "Descrição" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "Em %s, entre na rotatória" + +#~ msgid "Cursor" +#~ msgstr "Cursor" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d quilómetros" diff --git a/po/pt_BR.po.in b/po/pt_BR.po.in new file mode 100644 index 0000000..f3aa0be --- /dev/null +++ b/po/pt_BR.po.in @@ -0,0 +1,1774 @@ +# Brazilian Portuguese translation for navit +# Copyright (c) 2008 The Navit Team +# This file is distributed under the same license as the navit package. +# Paulohm, 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-01-06 19:50-0300\n" +"PO-Revision-Date: 2010-06-13 14:14+0000\n" +"Last-Translator: Leonardo Hamada \n" +"Language-Team: Brazilian Portuguese \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Executando do diretório de origem\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "ajustando '%s' para '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "zero" + +msgid "first" +msgstr "primeira" + +msgid "second" +msgstr "segunda" + +msgid "third" +msgstr "terceira" + +msgid "fourth" +msgstr "quarta" + +msgid "fifth" +msgstr "quinta" + +msgid "sixth" +msgstr "sexta" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "saída zero" + +msgid "first exit" +msgstr "primeira saída" + +msgid "second exit" +msgstr "segunda saída" + +msgid "third exit" +msgstr "terceira saída" + +msgid "fourth exit" +msgstr "quarta saída" + +msgid "fifth exit" +msgstr "quinta saída" + +msgid "sixth exit" +msgstr "sexta saída" + +#, c-format +msgid "%d m" +msgstr "%d metros" + +#, c-format +msgid "in %d m" +msgstr "em %d metros" + +#, c-format +msgid "%d feet" +msgstr "%d pés" + +#, c-format +msgid "in %d feet" +msgstr "em %d pés" + +#, c-format +msgid "%d meters" +msgstr "%d metros" + +#, c-format +msgid "in %d meters" +msgstr "em %d metros" + +#, c-format +msgid "%d.%d miles" +msgstr "%d vírgula %d milhas" + +#, c-format +msgid "in %d.%d miles" +msgstr "em %d vírgula %d milhas" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d vírgula %d quilômetros" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "em %d vírgula %d quilômetros" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "uma milha" +msgstr[1] "%d milhas" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "em uma milha" +msgstr[1] "em %d milhas" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "um quilômetro" +msgstr[1] "%d quilômetros" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "em um quilômetro" +msgstr[1] "em %d quilômetros" + +msgid "exit" +msgstr "saída" + +msgid "into the ramp" +msgstr "na rampa" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%sna %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%sno %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%sna %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%sem %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%sna %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "à direita" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "à esquerda" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "levemente " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "acentuadamente " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "vigorosamente " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "desconhecido " + +msgid "When possible, please turn around" +msgstr "Quando possível, favor retornar" + +msgid "Enter the roundabout soon" +msgstr "Prepare-se para entrar na rotatória em breve" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "Entrarás na rotatória %s" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "então deixe a rotatória na %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Deixe a rotatória na %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Continue na via pelos próximos %s" + +msgid "soon" +msgstr "em breve" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Pegue a %1$s via para a %2$s" + +#, c-format +msgid "after %i roads" +msgstr "após %i vias" + +msgid "now" +msgstr "agora" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "então pegue a %1$s via para a %2$s" + +msgid "error" +msgstr "erro" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Vire %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "então vire %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Você chegará ao destino %s" + +msgid "then you have reached your destination." +msgstr "então você chegará ao destino." + +msgid "Position" +msgstr "Posição" + +msgid "Command" +msgstr "Comando" + +msgid "Length" +msgstr "Distância" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Tempo" + +msgid "Destination Length" +msgstr "Distância ao Destino" + +msgid "Destination Time" +msgstr "Tempo até o Destino" + +msgid "Roadbook" +msgstr "Guia de estrada" + +msgid "Set as position" +msgstr "Definir como posição" + +msgid "Set as destination" +msgstr "Definir como destino" + +msgid "Add as bookmark" +msgstr "Adicionar aos marcadores" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Ponto 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Coordenada na tela : %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Emirados Árabes Unidos" + +#. 004 +msgid "Afghanistan" +msgstr "Afeganistão" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antígua e Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albânia" + +#. 051 +msgid "Armenia" +msgstr "Armênia" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Antilhas Holandesas" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antártida" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "Samoa Americana" + +#. 040 +msgid "Austria" +msgstr "Áustria" + +#. 036 +msgid "Australia" +msgstr "Austrália" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Ilhas Aland" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbaijão" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bósnia e Herzegóvina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesh" + +#. 056 +msgid "Belgium" +msgstr "Bélgica" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Fasso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgária" + +#. 048 +msgid "Bahrain" +msgstr "Bahrein" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "São Bartolomeu" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei Darussalam" + +#. 068 +msgid "Bolivia" +msgstr "Bolívia" + +#. 076 +msgid "Brazil" +msgstr "Brasil" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "Butão" + +#. 074 +msgid "Bouvet Island" +msgstr "Ilha Bouvet" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Bielorrússia" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Canadá" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Ilhas Cocos (Keeling)" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "República Democrática do Congo" + +#. 140 +msgid "Central African Republic" +msgstr "República Africana Central" + +#. 178 +msgid "Congo" +msgstr "Congo" + +#. 756 +msgid "Switzerland" +msgstr "Suíça" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Côte d'Ivoire" + +#. 184 +msgid "Cook Islands" +msgstr "Ilhas Cook" + +#. 152 +msgid "Chile" +msgstr "Chile" + +#. 120 +msgid "Cameroon" +msgstr "Camarões" + +#. 156 +msgid "China" +msgstr "China" + +#. 170 +msgid "Colombia" +msgstr "Colômbia" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Cuba" + +#. 132 +msgid "Cape Verde" +msgstr "Cabo Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Ilha Christmas" + +#. 196 +msgid "Cyprus" +msgstr "Chipre" + +#. 203 +msgid "Czech Republic" +msgstr "República Tcheca" + +#. 276 +msgid "Germany" +msgstr "Alemanha" + +#. 262 +msgid "Djibouti" +msgstr "Djibuti" + +#. 208 +msgid "Denmark" +msgstr "Dinamarca" + +#. 212 +msgid "Dominica" +msgstr "Dominica" + +#. 214 +msgid "Dominican Republic" +msgstr "República Dominicana" + +#. 012 +msgid "Algeria" +msgstr "Algéria" + +#. 218 +msgid "Ecuador" +msgstr "Equador" + +#. 233 +msgid "Estonia" +msgstr "Estônia" + +#. 818 +msgid "Egypt" +msgstr "Egito" + +#. 732 +msgid "Western Sahara" +msgstr "Saara Ocidental" + +#. 232 +msgid "Eritrea" +msgstr "Eritreia" + +#. 724 +msgid "Spain" +msgstr "Espanha" + +#. 231 +msgid "Ethiopia" +msgstr "Etiópia" + +#. 246 +msgid "Finland" +msgstr "Finlândia" + +#. 242 +msgid "Fiji" +msgstr "Fiji" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Ilhas Falkland (Malvinas)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Federação dos Estados da Micronésia" + +#. 234 +msgid "Faroe Islands" +msgstr "Ilhas Faroé" + +#. 250 +msgid "France" +msgstr "França" + +#. 266 +msgid "Gabon" +msgstr "Gabão" + +#. 826 +msgid "United Kingdom" +msgstr "Reino Unido" + +#. 308 +msgid "Grenada" +msgstr "Granada" + +#. 268 +msgid "Georgia" +msgstr "Geórgia" + +#. 254 +msgid "French Guiana" +msgstr "Guiana Francesa" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Gana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Groelândia" + +#. 270 +msgid "Gambia" +msgstr "Gâmbia" + +#. 324 +msgid "Guinea" +msgstr "Guiné" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadalupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Guiné Equatorial" + +#. 300 +msgid "Greece" +msgstr "Grécia" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Ilhas Geórgia e Sanduíche do Sul" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guiné-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guiana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Ilha Heard e Ilhas McDonald" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Croácia" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Hungria" + +#. 360 +msgid "Indonesia" +msgstr "Indonésia" + +#. 372 +msgid "Ireland" +msgstr "Irlanda" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "Ilha de Man" + +#. 356 +msgid "India" +msgstr "Índia" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Território Britânico do Oceano Índico" + +#. 368 +msgid "Iraq" +msgstr "Iraque" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "República Islâmica do Irã" + +#. 352 +msgid "Iceland" +msgstr "Islândia" + +#. 380 +msgid "Italy" +msgstr "Itália" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaica" + +#. 400 +msgid "Jordan" +msgstr "Jordânia" + +#. 392 +msgid "Japan" +msgstr "Japão" + +#. 404 +msgid "Kenya" +msgstr "Quênia" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Quirguistão" + +#. 116 +msgid "Cambodia" +msgstr "Camboja" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Comores" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "São Cristóvão e Névis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "República do Povo Democrático da Coréia" + +#. 410 +msgid "Korea, Republic of" +msgstr "República da Coréia" + +#. 414 +msgid "Kuwait" +msgstr "Kuwait" + +#. 136 +msgid "Cayman Islands" +msgstr "Ilhas Caiman" + +#. 398 +msgid "Kazakhstan" +msgstr "Cazaquistão" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "República Democrática do Povo de Lao" + +#. 422 +msgid "Lebanon" +msgstr "Líbano" + +#. 662 +msgid "Saint Lucia" +msgstr "Santa Lúcia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Siri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Libéria" + +#. 426 +msgid "Lesotho" +msgstr "Lesoto" + +#. 440 +msgid "Lithuania" +msgstr "Lituânia" + +#. 442 +msgid "Luxembourg" +msgstr "Luxemburgo" + +#. 428 +msgid "Latvia" +msgstr "Letônia" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Líbia" + +#. 504 +msgid "Morocco" +msgstr "Marrocos" + +#. 492 +msgid "Monaco" +msgstr "Mônaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "República da Moldávia" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "São Martin (parte francesa)" + +#. 450 +msgid "Madagascar" +msgstr "Madagascar" + +#. 584 +msgid "Marshall Islands" +msgstr "Ilhas Marshall" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Macedônia" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Mianmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongólia" + +#. 446 +msgid "Macao" +msgstr "Macau" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Ilhas Marianas do Norte" + +#. 474 +msgid "Martinique" +msgstr "Martinica" + +#. 478 +msgid "Mauritania" +msgstr "Mauritânia" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Maurício" + +#. 462 +msgid "Maldives" +msgstr "Maldivas" + +#. 454 +msgid "Malawi" +msgstr "Malavi" + +#. 484 +msgid "Mexico" +msgstr "México" + +#. 458 +msgid "Malaysia" +msgstr "Malásia" + +#. 508 +msgid "Mozambique" +msgstr "Moçambique" + +#. 516 +msgid "Namibia" +msgstr "Namíbia" + +#. 540 +msgid "New Caledonia" +msgstr "Nova Caledônia" + +#. 562 +msgid "Niger" +msgstr "Níger" + +#. 574 +msgid "Norfolk Island" +msgstr "Ilha Norfolk" + +#. 566 +msgid "Nigeria" +msgstr "Nigéria" + +#. 558 +msgid "Nicaragua" +msgstr "Nicarágua" + +#. 528 +msgid "Netherlands" +msgstr "Holanda" + +#. 578 +msgid "Norway" +msgstr "Noruega" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauruano" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Nova Zelândia" + +#. 512 +msgid "Oman" +msgstr "Omã" + +#. 591 +msgid "Panama" +msgstr "Panamá" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Polinésia francesa" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua Nova Guiné" + +#. 608 +msgid "Philippines" +msgstr "Filipinas" + +#. 586 +msgid "Pakistan" +msgstr "Paquistão" + +#. 616 +msgid "Poland" +msgstr "Polônia" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "São Pedro e Miquelão" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Porto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Território Palestino Ocupado" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguai" + +#. 634 +msgid "Qatar" +msgstr "Catar" + +#. 638 +msgid "Reunion" +msgstr "Reunião" + +#. 642 +msgid "Romania" +msgstr "Romênia" + +#. 688 +msgid "Serbia" +msgstr "Sérvia" + +#. 643 +msgid "Russian Federation" +msgstr "Federação Russa" + +#. 646 +msgid "Rwanda" +msgstr "Ruanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Arábia Saudita" + +#. 090 +msgid "Solomon Islands" +msgstr "Ilhas Salomão" + +#. 690 +msgid "Seychelles" +msgstr "Seicheles" + +#. 736 +msgid "Sudan" +msgstr "Sudão" + +#. 752 +msgid "Sweden" +msgstr "Suécia" + +#. 702 +msgid "Singapore" +msgstr "Singapura" + +#. 654 +msgid "Saint Helena" +msgstr "Santa Helena" + +#. 705 +msgid "Slovenia" +msgstr "Eslovênia" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard e Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Eslováquia" + +#. 694 +msgid "Sierra Leone" +msgstr "Serra Leoa" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somália" + +#. 740 +msgid "Suriname" +msgstr "Suriname" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "São Tomé e Príncipe" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "República Árabe Síria" + +#. 748 +msgid "Swaziland" +msgstr "Suazilândia" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Ilhas Turcas e Caicos" + +#. 148 +msgid "Chad" +msgstr "Chade" + +#. 260 +msgid "French Southern Territories" +msgstr "Territórios Franceses do Sul" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Tailândia" + +#. 762 +msgid "Tajikistan" +msgstr "Tajiquistão" + +#. 772 +msgid "Tokelau" +msgstr "Toquelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Timor-Leste" + +#. 795 +msgid "Turkmenistan" +msgstr "Turcomenistão" + +#. 788 +msgid "Tunisia" +msgstr "Tunísia" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turquia" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad e Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "República Unida da Tanzânia" + +#. 804 +msgid "Ukraine" +msgstr "Ucrânia" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Ilhas Menores Distantes dos Estados Unidos" + +#. 840 +msgid "United States" +msgstr "Estados Unidos" + +#. 858 +msgid "Uruguay" +msgstr "Uruguai" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbequistão" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Santa Sé (Vaticano)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "São Vicente e Granadinas" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Ilhas Virgens Britânicas" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Ilhas Virgens (Estados Unidos)" + +#. 704 +msgid "Viet Nam" +msgstr "Vietnã" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis e Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Iêmen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "África do Sul" + +#. 894 +msgid "Zambia" +msgstr "Zâmbia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbábue" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Desconhecido, adicione tags \"is_in\" para essas cidades" + +msgid "Car" +msgstr "Carro" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "País" + +msgid "Postal" +msgstr "Postal" + +msgid "Town" +msgstr "Cidade" + +msgid "District" +msgstr "Distrito" + +msgid "Street" +msgstr "Rua" + +msgid "Number" +msgstr "Número" + +msgid "Enter Destination" +msgstr "Especifique o Destino" + +msgid "Zip Code" +msgstr "Código Postal" + +msgid "City" +msgstr "Cidade" + +msgid "District/Township" +msgstr "Distrito/Comunidade" + +msgid "Map" +msgstr "Mapa" + +msgid "Bookmark" +msgstr "Marcador" + +msgid "Destination" +msgstr "Destino" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "E_xibição" + +msgid "_Route" +msgstr "Ro_ta" + +msgid "_Former Destinations" +msgstr "Destinos _Anteriores" + +msgid "_Bookmarks" +msgstr "Mar_cadores" + +msgid "_Map" +msgstr "_Mapa" + +msgid "_Layout" +msgstr "Dis_posição" + +msgid "_Projection" +msgstr "Pro_jeção" + +msgid "_Vehicle" +msgstr "_Veículo" + +msgid "Zoom_Out" +msgstr "A_fastar" + +msgid "Decrease zoom level" +msgstr "Diminuir o nível de aproximação" + +msgid "Zoom_In" +msgstr "Apro_ximar" + +msgid "Increase zoom level" +msgstr "Aumentar o nível de aproximação" + +msgid "_Recalculate" +msgstr "_Recalcular" + +msgid "Redraw map" +msgstr "Redesenhar mapa" + +msgid "_Info" +msgstr "In_formação" + +msgid "Set _destination" +msgstr "Estabelecer _destino" + +msgid "Opens address search dialog" +msgstr "Abre a busca de endereço" + +msgid "_Stop Navigation" +msgstr "Parar Nave_gação" + +msgid "Test" +msgstr "Verificação" + +msgid "_Quit" +msgstr "_Sair" + +msgid "Quit the application" +msgstr "Sair da aplicação" + +msgid "Show position _cursor" +msgstr "Mostrar o curs_or de posição" + +msgid "_Lock on Road" +msgstr "Prender na _Estrada" + +msgid "_Keep orientation to the North" +msgstr "Ma_nter orientado ao Norte" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "Muda a orientação do mapa para o norte ou o veículo" + +msgid "_Roadbook" +msgstr "G_uia de estrada" + +msgid "Show/hide route description" +msgstr "Mostrar/ocultar descrição da rota" + +msgid "_Autozoom" +msgstr "Aproximação Automática" + +msgid "Enable/disable automatic zoom level changing" +msgstr "Ativar/desativar a mudança automática do nível de aproximação" + +msgid "_Fullscreen" +msgstr "Tela _Inteira" + +msgid "Data" +msgstr "Dados" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NE" + +msgid "E" +msgstr "L" + +msgid "SE" +msgstr "SE" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SO" + +msgid "W" +msgstr "O" + +msgid "NW" +msgstr "NO" + +msgid "No" +msgstr "Não" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Rota %4.0fkm TEC %02d:%02d" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Rota 0000km TEC 0+00:00" + +msgid "Back to map" +msgstr "Voltar ao mapa" + +msgid "Main Menu" +msgstr "Menu Principal" + +msgid "Help" +msgstr "Ajuda" + +msgid "Back" +msgstr "Voltar" + +msgid "Add Bookmark" +msgstr "Adicionar aos Marcadores" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "Adicionar Pasta de Marcadores" + +msgid "Rename" +msgstr "Renomear" + +msgid "POIs" +msgstr "Pontos de Interesse" + +msgid "View in Browser" +msgstr "Ver no Navegador" + +msgid "Item type" +msgstr "Tipo do item" + +msgid "Streets" +msgstr "Ruas" + +msgid "House numbers" +msgstr "Números das casas" + +msgid "View Attributes" +msgstr "Ver Atributos" + +msgid "View on map" +msgstr "Ver no mapa" + +msgid "Cut Bookmark" +msgstr "Recortar Marcador" + +msgid "Copy Bookmark" +msgstr "Copiar Marcador" + +msgid "Rename Bookmark" +msgstr "Renomear Marcador" + +msgid "Paste Bookmark" +msgstr "Colar Marcador" + +msgid "Delete Bookmark" +msgstr "Apagar Marcador" + +msgid "Bookmarks" +msgstr "Marcadores" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Colar marcador" + +#, c-format +msgid "Bookmark %s" +msgstr "Marcar %s" + +msgid "Former Destinations" +msgstr "Destinos Anteriores" + +msgid "- No former destinations available -" +msgstr "- Destinos anteriores indisponíveis -" + +msgid "House number" +msgstr "Número da casa" + +msgid "Layout" +msgstr "Disposição" + +#, c-format +msgid "Download %s" +msgstr "Baixar %s" + +msgid "Map Download" +msgstr "Baixar Mapa" + +msgid "Active" +msgstr "Ativo" + +msgid "Download Enabled" +msgstr "Habilitado para Baixar" + +msgid "Download completely" +msgstr "Baixar completamente" + +msgid "Maps" +msgstr "Mapas" + +msgid "Show Satellite Status" +msgstr "Mostrar Estado do Satélite" + +msgid " Elevation " +msgstr " Elevação " + +msgid " Azimuth " +msgstr " Azimute " + +msgid "Show NMEA Data" +msgstr "Mostrar Dados NMEA" + +msgid "car" +msgstr "carro" + +msgid "bike" +msgstr "bicicleta" + +msgid "pedestrian" +msgstr "pedestre" + +#, c-format +msgid "Current profile: %s" +msgstr "Perfil atual: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Alterar perfil para: %s" + +msgid "Set as active" +msgstr "Definir como ativo" + +msgid "Show Satellite status" +msgstr "Mostrar estado do Satélite" + +msgid "Show NMEA data" +msgstr "Mostrar dados NMEA" + +msgid "Vehicle" +msgstr "Veículo" + +msgid "Rules" +msgstr "Regras" + +msgid "Lock on road" +msgstr "Prender na estrada" + +msgid "Northing" +msgstr "Ao Norte" + +msgid "Map follows Vehicle" +msgstr "Mapa segue Veículo" + +msgid "Message" +msgstr "Mensagem" + +msgid "Next" +msgstr "Próximo" + +msgid "Prev" +msgstr "Anterior" + +msgid "Route Description" +msgstr "Descrição do Percurso" + +msgid "Height Profile" +msgstr "Perfil de Altitude" + +msgid "Show Locale" +msgstr "Mostrar a Localidade" + +msgid "About Navit" +msgstr "Sobre Navit" + +#. Authors +msgid "By" +msgstr "Por" + +#. Contributors +msgid "And all the Navit Team" +msgstr "E toda a equipe do Navit, " + +msgid "members and contributors." +msgstr "membros e contribuintes." + +msgid "Return to route!" +msgstr "Retorne para a rota!" + +#. warning told +msgid "Look out! Camera!" +msgstr "Atenção! Camera!" + +#. warning told +msgid "Please decrease your speed" +msgstr "Por favor, diminua a velocidade" + +msgid "Map Point" +msgstr "Ponto no Mapa" + +msgid "Vehicle Position" +msgstr "Posição do Veículo" + +msgid "Main menu" +msgstr "Menu Principal" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Mostrar\n" +"Mapa" + +msgid "Settings" +msgstr "Ajustes" + +msgid "Tools" +msgstr "Ferramentas" + +msgid "Route" +msgstr "Rota" + +msgid "About" +msgstr "Sobre" + +msgid "Actions" +msgstr "Ações" + +msgid "" +"Former\n" +"Destinations" +msgstr "" +"Destinos\n" +"Anteriores" + +msgid "Quit" +msgstr "Sair" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Parar\n" +"Navegação" + +msgid "Display" +msgstr "Exibição" + +msgid "Fullscreen" +msgstr "Tela Inteira" + +msgid "Window Mode" +msgstr "Modo de Janela" + +msgid "Description" +msgstr "Descrição" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "cavalo" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "Caminhão" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "Em %s, entre na rotatória" + +#~ msgid "Cursor" +#~ msgstr "Cursor" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d quilômetros" + +#~ msgid " SNR " +#~ msgstr " SNR " + +#~ msgid " PRN " +#~ msgstr " PRN " diff --git a/po/ro.po.in b/po/ro.po.in new file mode 100644 index 0000000..96552bc --- /dev/null +++ b/po/ro.po.in @@ -0,0 +1,1768 @@ +# Romanian translation for navit +# Copyright (c) 2008 The Navit Team +# This file is distributed under the same license as the navit package. +# Nostriel , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-06-12 09:37+0000\n" +"Last-Translator: igorashu \n" +"Language-Team: Romanian \n" +"Language: ro\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 " +"== 0) && (n != 0))) ? 2: 1));\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Rulează din directorul sursă\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "se setează „%s” ca „%s”\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "zero" + +msgid "first" +msgstr "prima" + +msgid "second" +msgstr "a doua" + +msgid "third" +msgstr "a treia" + +msgid "fourth" +msgstr "a patra" + +msgid "fifth" +msgstr "a cincea" + +msgid "sixth" +msgstr "a șasea" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "ieșirea zero" + +msgid "first exit" +msgstr "prima ieșire" + +msgid "second exit" +msgstr "a doua ieșire" + +msgid "third exit" +msgstr "a treia ieșire" + +msgid "fourth exit" +msgstr "a patra ieșire" + +msgid "fifth exit" +msgstr "a cincea ieșire" + +msgid "sixth exit" +msgstr "a șasea ieșire" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "în %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metri" + +#, c-format +msgid "in %d meters" +msgstr "în %d metri" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d kilometri" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "în %d.%d kilometri" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "un kilometru" +msgstr[1] "%d kilometri" +msgstr[2] "%d de kilometri" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "într-un kilometru" +msgstr[1] "în %d kilometri" +msgstr[2] "în %d de kilometri" + +msgid "exit" +msgstr "ieșire" + +msgid "into the ramp" +msgstr "pe rampă" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s pe strada %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%s pe %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%s pe %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%s pe %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%s spre %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "la dreapta" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "la stânga" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "uşor " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "strâns " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "foarte puternic " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "necunoscut " + +msgid "When possible, please turn around" +msgstr "Când este posibil, întoarceţi" + +msgid "Enter the roundabout soon" +msgstr "Intrați în curând în giratoriu" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "apoi ieșiți din giratoriu la %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Ieșiți din giratoriu la %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Urmați drumul pentru încă %s" + +msgid "soon" +msgstr "curând" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Virați %2s pe %1s stradă" + +#, c-format +msgid "after %i roads" +msgstr "după %i străzi" + +msgid "now" +msgstr "acum" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "apoi faceți %2s pe %1s stradă" + +msgid "error" +msgstr "eroare" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Virați %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "apoi virați %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Ați ajuns la destinație %s" + +msgid "then you have reached your destination." +msgstr "apoi ajungeți la destinație." + +msgid "Position" +msgstr "Poziție" + +msgid "Command" +msgstr "Comandă" + +msgid "Length" +msgstr "Lungime" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Timp" + +msgid "Destination Length" +msgstr "Lungimea până la destinaţie" + +msgid "Destination Time" +msgstr "Timpul până la destinaţie" + +msgid "Roadbook" +msgstr "Drum blocat" + +msgid "Set as position" +msgstr "Configurează ca poziție" + +msgid "Set as destination" +msgstr "Configurează ca destinație" + +msgid "Add as bookmark" +msgstr "Adaugă la semnele de carte" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Punctul 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Coordonate ecran : %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andora" + +#. 784 +msgid "United Arab Emirates" +msgstr "Emiratele Arabe Unite" + +#. 004 +msgid "Afghanistan" +msgstr "Afganistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua şi Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albania" + +#. 051 +msgid "Armenia" +msgstr "Armenia" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Antilele Olandeze" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarctica" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "Samoa Americană" + +#. 040 +msgid "Austria" +msgstr "Austria" + +#. 036 +msgid "Australia" +msgstr "Australia" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Aland Islands" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbaijan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnia și Herțegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladeș" + +#. 056 +msgid "Belgium" +msgstr "Belgia" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgaria" + +#. 048 +msgid "Bahrain" +msgstr "Bahrein" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Sfântul Bartolomeu" + +#. 060 +msgid "Bermuda" +msgstr "Bermude" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei Darussalam" + +#. 068 +msgid "Bolivia" +msgstr "Bolivia" + +#. 076 +msgid "Brazil" +msgstr "Brazilia" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "Butan" + +#. 074 +msgid "Bouvet Island" +msgstr "Insula Bouvet" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Bielorusia" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Canada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Insulele Cocos (Keeling)" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Congo, Republica Democrată" + +#. 140 +msgid "Central African Republic" +msgstr "Republica Centrafricană" + +#. 178 +msgid "Congo" +msgstr "Congo" + +#. 756 +msgid "Switzerland" +msgstr "Elveția" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Coasta de Azur" + +#. 184 +msgid "Cook Islands" +msgstr "Insulele Cook" + +#. 152 +msgid "Chile" +msgstr "Chile" + +#. 120 +msgid "Cameroon" +msgstr "Camerun" + +#. 156 +msgid "China" +msgstr "China" + +#. 170 +msgid "Colombia" +msgstr "Columbia" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Cuba" + +#. 132 +msgid "Cape Verde" +msgstr "Capul Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Insula Crăciunului" + +#. 196 +msgid "Cyprus" +msgstr "Cipru" + +#. 203 +msgid "Czech Republic" +msgstr "Republica Cehă" + +#. 276 +msgid "Germany" +msgstr "Germania" + +#. 262 +msgid "Djibouti" +msgstr "Djibouti" + +#. 208 +msgid "Denmark" +msgstr "Danemarca" + +#. 212 +msgid "Dominica" +msgstr "Dominica" + +#. 214 +msgid "Dominican Republic" +msgstr "Republica Dominicană" + +#. 012 +msgid "Algeria" +msgstr "Algeria" + +#. 218 +msgid "Ecuador" +msgstr "Ecuador" + +#. 233 +msgid "Estonia" +msgstr "Estonia" + +#. 818 +msgid "Egypt" +msgstr "Egipt" + +#. 732 +msgid "Western Sahara" +msgstr "Sahara de Vest" + +#. 232 +msgid "Eritrea" +msgstr "Eritreea" + +#. 724 +msgid "Spain" +msgstr "Spania" + +#. 231 +msgid "Ethiopia" +msgstr "Etiopia" + +#. 246 +msgid "Finland" +msgstr "Finlanda" + +#. 242 +msgid "Fiji" +msgstr "Fiji" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Insulele Falkland (Malvine)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Micronesia, Statele Federale ale" + +#. 234 +msgid "Faroe Islands" +msgstr "Insulele Feroe" + +#. 250 +msgid "France" +msgstr "Franţa" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Regatul Unit al Marii Britanii" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Georgia" + +#. 254 +msgid "French Guiana" +msgstr "Guiana Franceză" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Groenlanda" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Guineea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadalupa" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Guineea Ecuatorială" + +#. 300 +msgid "Greece" +msgstr "Grecia" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Georgia de Sud şi Insulele Sudice Sandwich" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guineea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guiana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Insulele Heard şi McDonald" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Croaţia" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Ungaria" + +#. 360 +msgid "Indonesia" +msgstr "Indonezia" + +#. 372 +msgid "Ireland" +msgstr "Irlanda" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "Insula Omului" + +#. 356 +msgid "India" +msgstr "India" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Teritoriul Britanic al Oceanului Indian" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iran, Republica Islamică" + +#. 352 +msgid "Iceland" +msgstr "Islanda" + +#. 380 +msgid "Italy" +msgstr "Italia" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaica" + +#. 400 +msgid "Jordan" +msgstr "Iordan" + +#. 392 +msgid "Japan" +msgstr "Japonia" + +#. 404 +msgid "Kenya" +msgstr "Kenya" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirghistan" + +#. 116 +msgid "Cambodia" +msgstr "Cambogia" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Comoros" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Saint Kitts şi Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Republica Democrată Poapulară Coreea" + +#. 410 +msgid "Korea, Republic of" +msgstr "Republica Coreea" + +#. 414 +msgid "Kuwait" +msgstr "Kuweit" + +#. 136 +msgid "Cayman Islands" +msgstr "Insulele Caiman" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazahstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Republica Populară Democrată Lao" + +#. 422 +msgid "Lebanon" +msgstr "Liban" + +#. 662 +msgid "Saint Lucia" +msgstr "Sfânta Lucia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberia" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Lituania" + +#. 442 +msgid "Luxembourg" +msgstr "Luxemburg" + +#. 428 +msgid "Latvia" +msgstr "Letonia" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Jamahiriya Arabă Libiană" + +#. 504 +msgid "Morocco" +msgstr "Maroc" + +#. 492 +msgid "Monaco" +msgstr "Monaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Republica Moldovă" + +#. 499 +msgid "Montenegro" +msgstr "Muntenegru" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Sfântul Martin (partea franceză)" + +#. 450 +msgid "Madagascar" +msgstr "Madagascar" + +#. 584 +msgid "Marshall Islands" +msgstr "Insulele Marshall" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Fosta Republică Iugoslavă Macedonia" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongolia" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Insulele Mariane de Nord" + +#. 474 +msgid "Martinique" +msgstr "Martinica" + +#. 478 +msgid "Mauritania" +msgstr "Mauritania" + +#. 500 +msgid "Montserrat" +msgstr "Montserat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauritania" + +#. 462 +msgid "Maldives" +msgstr "Maldive" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mexic" + +#. 458 +msgid "Malaysia" +msgstr "Malaezia" + +#. 508 +msgid "Mozambique" +msgstr "Mozambic" + +#. 516 +msgid "Namibia" +msgstr "Namibia" + +#. 540 +msgid "New Caledonia" +msgstr "Noua Caledonie" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Insula Norfolk" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nicaragua" + +#. 528 +msgid "Netherlands" +msgstr "Olanda" + +#. 578 +msgid "Norway" +msgstr "Norvegia" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Noua Zeelandă" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Polinezia Franceză" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua Noua Guinee" + +#. 608 +msgid "Philippines" +msgstr "Filipine" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Polonia" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Sfântul Pierre şi Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Teritoriile Palestiniene, Ocupate" + +#. 620 +msgid "Portugal" +msgstr "Portugalia" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Qatar" + +#. 638 +msgid "Reunion" +msgstr "Reunion" + +#. 642 +msgid "Romania" +msgstr "România" + +#. 688 +msgid "Serbia" +msgstr "Serbia" + +#. 643 +msgid "Russian Federation" +msgstr "Federaţia Rusă" + +#. 646 +msgid "Rwanda" +msgstr "Ruanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Arabia Saudită" + +#. 090 +msgid "Solomon Islands" +msgstr "Insulele Solomon" + +#. 690 +msgid "Seychelles" +msgstr "Seychelles" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Suedia" + +#. 702 +msgid "Singapore" +msgstr "Singapore" + +#. 654 +msgid "Saint Helena" +msgstr "Saint Helena" + +#. 705 +msgid "Slovenia" +msgstr "Slovenia" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Insulele Svalbard şi Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slovacia" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalia" + +#. 740 +msgid "Suriname" +msgstr "Suriname" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Sao Tome și Principe" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Republica Araba Siria" + +#. 748 +msgid "Swaziland" +msgstr "Swaziland" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Insulele Turks şi Caicos" + +#. 148 +msgid "Chad" +msgstr "Ciad" + +#. 260 +msgid "French Southern Territories" +msgstr "Teritoriile Franceze de Sud" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Tailanda" + +#. 762 +msgid "Tajikistan" +msgstr "Tajikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Timorul de Est" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunisia" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turcia" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad şi Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Provincia Chineză Taiwan" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Republica Unită Tanzania" + +#. 804 +msgid "Ukraine" +msgstr "Ucraina" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Insulele de Coasta ale Statelor Unite" + +#. 840 +msgid "United States" +msgstr "Statele Unite" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Vatican (Oraşul Stat Vatican)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Saint Vincent şi Grenadin" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Insulele Virgine (Britanice)" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Insulele Virgine (SUA)" + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis şi Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Yemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Africa de Sud" + +#. 894 +msgid "Zambia" +msgstr "Zambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Necunoscut, adaugă eticheta is_in tags acestor orașe" + +msgid "Car" +msgstr "Maşină" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Ţară" + +msgid "Postal" +msgstr "Poştal" + +msgid "Town" +msgstr "Oraş" + +msgid "District" +msgstr "Cartier" + +msgid "Street" +msgstr "Stradă" + +msgid "Number" +msgstr "Număr" + +msgid "Enter Destination" +msgstr "Introduceți destinaţia" + +msgid "Zip Code" +msgstr "Cod poștal" + +msgid "City" +msgstr "Oraș" + +msgid "District/Township" +msgstr "District/Reședință" + +msgid "Map" +msgstr "Hartă" + +msgid "Bookmark" +msgstr "Semn de carte" + +msgid "Destination" +msgstr "Destinaţie" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Ecran" + +msgid "_Route" +msgstr "Traseu" + +msgid "_Former Destinations" +msgstr "Destinații anterioare" + +msgid "_Bookmarks" +msgstr "Semne de carte" + +msgid "_Map" +msgstr "Hartă" + +msgid "_Layout" +msgstr "Dispunere" + +msgid "_Projection" +msgstr "Proiecție" + +msgid "_Vehicle" +msgstr "Vehicul" + +msgid "Zoom_Out" +msgstr "Depărtează" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Apropie" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Recalculează" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Informații" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Oprește navigarea" + +msgid "Test" +msgstr "Testează" + +msgid "_Quit" +msgstr "_Ieșire" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Fixează strada" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Drum blocat" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Autozoom" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Pe tot ecranul" + +msgid "Data" +msgstr "Date" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NE" + +msgid "E" +msgstr "E" + +msgid "SE" +msgstr "SE" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SV" + +msgid "W" +msgstr "V" + +msgid "NW" +msgstr "NV" + +msgid "No" +msgstr "Nu" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "Glob" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Rută %4.0f km sosire estimată %02d:%02d" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Rută 0000 km sosire estimată 0+00:00" + +msgid "Back to map" +msgstr "Înapoi la hartă" + +msgid "Main Menu" +msgstr "Meniu principal" + +msgid "Help" +msgstr "Ajutor" + +msgid "Back" +msgstr "Înapoi" + +msgid "Add Bookmark" +msgstr "Adaugă semn de carte" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "Adaugă director pentru semne de carte" + +msgid "Rename" +msgstr "Redenumește" + +msgid "POIs" +msgstr "Puncte de interes" + +msgid "View in Browser" +msgstr "Arată în navigator" + +msgid "Streets" +msgstr "Străzi" + +msgid "House numbers" +msgstr "Numere case" + +msgid "View Attributes" +msgstr "Arată atributele" + +msgid "View on map" +msgstr "Arată pe hartă" + +msgid "Cut Bookmark" +msgstr "Taie semnul de carte" + +msgid "Copy Bookmark" +msgstr "Copiază semnul de carte" + +msgid "Rename Bookmark" +msgstr "Redenumește semnul de carte" + +msgid "Paste Bookmark" +msgstr "Lipește semnul de carte" + +msgid "Delete Bookmark" +msgstr "Șterge semnul de carte" + +msgid "Bookmarks" +msgstr "Semne de carte" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Lipește semn de carte" + +#, c-format +msgid "Bookmark %s" +msgstr "%s ca semn de carte" + +msgid "Former Destinations" +msgstr "Destinații anterioare" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Număr casă" + +msgid "Layout" +msgstr "Dispunere" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Hărți" + +msgid "Show Satellite Status" +msgstr "Arată starea sateliților" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr " Azimut " + +msgid "Show NMEA Data" +msgstr "Arată datele NMEA" + +msgid "car" +msgstr "mașină" + +msgid "bike" +msgstr "bicicletă" + +msgid "pedestrian" +msgstr "pieton" + +#, c-format +msgid "Current profile: %s" +msgstr "Profil curent: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Schimbă profilul la: %s" + +msgid "Set as active" +msgstr "Activează" + +msgid "Show Satellite status" +msgstr "Arată starea sateliților" + +msgid "Show NMEA data" +msgstr "Arată datele NMEA" + +msgid "Vehicle" +msgstr "Vehicul" + +msgid "Rules" +msgstr "Reguli" + +msgid "Lock on road" +msgstr "Fixează strada" + +msgid "Northing" +msgstr "Nimic" + +msgid "Map follows Vehicle" +msgstr "Harta urmează vehiculul" + +msgid "Message" +msgstr "Mesaj" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Descrerea traseului" + +msgid "Height Profile" +msgstr "Profil înălțime" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "Despre Navit" + +#. Authors +msgid "By" +msgstr "De" + +#. Contributors +msgid "And all the Navit Team" +msgstr "Și întreaga echipă Navit" + +msgid "members and contributors." +msgstr "membri și colaboratori." + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Locație pe hartă" + +msgid "Vehicle Position" +msgstr "Poziția vehiculului" + +msgid "Main menu" +msgstr "Meniu principal" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Afișează\n" +"hartă" + +msgid "Settings" +msgstr "Configurații" + +msgid "Tools" +msgstr "Unelte" + +msgid "Route" +msgstr "Traseu" + +msgid "About" +msgstr "Despre" + +msgid "Actions" +msgstr "Acțiuni" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Ieși" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Oprește\n" +"navigația" + +msgid "Display" +msgstr "Ecran" + +msgid "Fullscreen" +msgstr "Pe tot ecranul" + +msgid "Window Mode" +msgstr "Mod „fereastră”" + +msgid "Description" +msgstr "Descriere" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "cal" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "În %s, intrați în sensul giratoriu" + +#~ msgid "Cursor" +#~ msgstr "Cursor" + +#~ msgid "%d.%d kilometer" +#~ msgstr "kilometrul %d.%d" diff --git a/po/ru.po.in b/po/ru.po.in new file mode 100644 index 0000000..d61b0e3 --- /dev/null +++ b/po/ru.po.in @@ -0,0 +1,1775 @@ +# Russian translations for navit. +# Copyright (C) 2008 The Navit Team +# This file is distributed under the same license as the navit package. +# Rustam Usmanov , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-06-30 18:26+0000\n" +"Last-Translator: Denis Chapligin \n" +"Language-Team: Rustam T. Usmanov\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Launchpad-Export-Date: 2010-06-30 20:12+0000\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Запуск в исходном каталоге\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "установка '%s' в '%s'\\n\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "нулевой" + +msgid "first" +msgstr "первый" + +msgid "second" +msgstr "второй" + +msgid "third" +msgstr "третий" + +msgid "fourth" +msgstr "четвертый" + +msgid "fifth" +msgstr "пятый" + +msgid "sixth" +msgstr "шестой" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "нулевой выезд" + +msgid "first exit" +msgstr "первый выезд" + +msgid "second exit" +msgstr "второй выезд" + +msgid "third exit" +msgstr "третий выезд" + +msgid "fourth exit" +msgstr "четвертый выезд" + +msgid "fifth exit" +msgstr "пятый выезд" + +msgid "sixth exit" +msgstr "шестой выезд" + +#, c-format +msgid "%d m" +msgstr "%d м" + +#, c-format +msgid "in %d m" +msgstr "через %d м" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d метров" + +#, c-format +msgid "in %d meters" +msgstr "через %d метров" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d,%d км." + +#, c-format +msgid "in %d.%d kilometers" +msgstr "через %d,%d км." + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "%d километр" +msgstr[1] "%d километра" +msgstr[2] "%d километров" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "через %d километр" +msgstr[1] "%d километра" +msgstr[2] "%d километров" + +msgid "exit" +msgstr "съезд" + +msgid "into the ramp" +msgstr "съезд на" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s на улицу %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%s на %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%s на %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%s на %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%s на %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "направо" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "налево" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "немного " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "круто " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "очень круто " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "неизвестно " + +msgid "When possible, please turn around" +msgstr "Развернитесь, пожалуйста, если это возможно" + +msgid "Enter the roundabout soon" +msgstr "Скоро круговое движение" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "потом съезжайте с кругового движения на %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Съезжайте с кругового движения на %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Двигайтесь по дороге следующие %s" + +msgid "soon" +msgstr "скоро" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Выезжайте на %1$s дорогу в направлении %2$s" + +#, c-format +msgid "after %i roads" +msgstr "после %i дорог" + +msgid "now" +msgstr "сейчас" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "после чего выезжайте на %1$s дорогу в направлении %2$s" + +msgid "error" +msgstr "ошибка" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Сверните %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "после чего поверните %1$s%2$s на %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Вы прибыли в пункт назначения %s" + +msgid "then you have reached your destination." +msgstr "после чего вы прибудете в пункт назначения" + +msgid "Position" +msgstr "Позиция" + +msgid "Command" +msgstr "Команда" + +msgid "Length" +msgstr "Длина" + +msgid "km" +msgstr "км" + +msgid "m" +msgstr "м" + +msgid "Time" +msgstr "Время" + +msgid "Destination Length" +msgstr "Дистанция до пункта назначения" + +msgid "Destination Time" +msgstr "Время до пункта назначения" + +msgid "Roadbook" +msgstr "Дорожный справочник" + +msgid "Set as position" +msgstr "Установить как пункт отправления" + +msgid "Set as destination" +msgstr "Установить как пункт назначения" + +msgid "Add as bookmark" +msgstr "Добавить закладку" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Точка 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Экран %d %d" + +#. 020 +msgid "Andorra" +msgstr "Андорра" + +#. 784 +msgid "United Arab Emirates" +msgstr "Объединенные Арабские Эмираты" + +#. 004 +msgid "Afghanistan" +msgstr "Афганистан" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Антигуа и Барбуда" + +#. 660 +msgid "Anguilla" +msgstr "Ангилья" + +#. 008 +msgid "Albania" +msgstr "Албания" + +#. 051 +msgid "Armenia" +msgstr "Армения" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Антильские (Нидерланские) острова" + +#. 024 +msgid "Angola" +msgstr "Ангола" + +#. 010 +msgid "Antarctica" +msgstr "Антарктика" + +#. 032 +msgid "Argentina" +msgstr "Аргентина" + +#. 016 +msgid "American Samoa" +msgstr "Америк. Самоа" + +#. 040 +msgid "Austria" +msgstr "Австрия" + +#. 036 +msgid "Australia" +msgstr "Австралия" + +#. 533 +msgid "Aruba" +msgstr "Аруба" + +#. 248 +msgid "Aland Islands" +msgstr "Фарерские Острова" + +#. 031 +msgid "Azerbaijan" +msgstr "Азербайджан" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Босния и Герцеговина" + +#. 052 +msgid "Barbados" +msgstr "Барбадос" + +#. 050 +msgid "Bangladesh" +msgstr "Бангладеш" + +#. 056 +msgid "Belgium" +msgstr "Бельгия" + +#. 854 +msgid "Burkina Faso" +msgstr "Буркина-Фасо" + +#. 100 +msgid "Bulgaria" +msgstr "Болгария" + +#. 048 +msgid "Bahrain" +msgstr "Бахрейн" + +#. 108 +msgid "Burundi" +msgstr "Бурунди" + +#. 204 +msgid "Benin" +msgstr "Бенин" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Сен-Бартелемей" + +#. 060 +msgid "Bermuda" +msgstr "Бермудские острова" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Бруней Даруссалам" + +#. 068 +msgid "Bolivia" +msgstr "Боливия" + +#. 076 +msgid "Brazil" +msgstr "Бразилия" + +#. 044 +msgid "Bahamas" +msgstr "Багамы" + +#. 064 +msgid "Bhutan" +msgstr "Бутан" + +#. 074 +msgid "Bouvet Island" +msgstr "Остров Буве" + +#. 072 +msgid "Botswana" +msgstr "Ботсвана" + +#. 112 +msgid "Belarus" +msgstr "Белоруссия" + +#. 084 +msgid "Belize" +msgstr "Белиз" + +#. 124 +msgid "Canada" +msgstr "Канада" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Кокосовые (Килинг) острова" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Конго, Демократическая Республика" + +#. 140 +msgid "Central African Republic" +msgstr "Центральноафриканская Республика" + +#. 178 +msgid "Congo" +msgstr "Конго" + +#. 756 +msgid "Switzerland" +msgstr "Швейцария" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Кот-д'Ивуар" + +#. 184 +msgid "Cook Islands" +msgstr "Кука Острова" + +#. 152 +msgid "Chile" +msgstr "Чили" + +#. 120 +msgid "Cameroon" +msgstr "Камерун" + +#. 156 +msgid "China" +msgstr "Китай" + +#. 170 +msgid "Colombia" +msgstr "Колумбия" + +#. 188 +msgid "Costa Rica" +msgstr "Коста-Рика" + +#. 192 +msgid "Cuba" +msgstr "Куба" + +#. 132 +msgid "Cape Verde" +msgstr "Кабо-Верде" + +#. 162 +msgid "Christmas Island" +msgstr "Остров Рождества" + +#. 196 +msgid "Cyprus" +msgstr "Кипр" + +#. 203 +msgid "Czech Republic" +msgstr "Чешская Республика" + +#. 276 +msgid "Germany" +msgstr "Германия" + +#. 262 +msgid "Djibouti" +msgstr "Джибути" + +#. 208 +msgid "Denmark" +msgstr "Дания" + +#. 212 +msgid "Dominica" +msgstr "Доминика" + +#. 214 +msgid "Dominican Republic" +msgstr "Доминиканская Республика" + +#. 012 +msgid "Algeria" +msgstr "Алжир" + +#. 218 +msgid "Ecuador" +msgstr "Эквадор" + +#. 233 +msgid "Estonia" +msgstr "Эстония" + +#. 818 +msgid "Egypt" +msgstr "Египет" + +#. 732 +msgid "Western Sahara" +msgstr "Западная Сахара" + +#. 232 +msgid "Eritrea" +msgstr "Эритрея" + +#. 724 +msgid "Spain" +msgstr "Испания" + +#. 231 +msgid "Ethiopia" +msgstr "Эфиопия" + +#. 246 +msgid "Finland" +msgstr "Финляндия" + +#. 242 +msgid "Fiji" +msgstr "Фиджи" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Фолклендские (Мальвинские) острова" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Микронэзия, Федеративные Штаты" + +#. 234 +msgid "Faroe Islands" +msgstr "Фарерские Острова" + +#. 250 +msgid "France" +msgstr "Франция" + +#. 266 +msgid "Gabon" +msgstr "Габон" + +#. 826 +msgid "United Kingdom" +msgstr "Великобритания" + +#. 308 +msgid "Grenada" +msgstr "Гренада" + +#. 268 +msgid "Georgia" +msgstr "Грузия" + +#. 254 +msgid "French Guiana" +msgstr "Французская Гвиана" + +#. 831 +msgid "Guernsey" +msgstr "Гернси" + +#. 288 +msgid "Ghana" +msgstr "Гана" + +#. 292 +msgid "Gibraltar" +msgstr "Гибралтар" + +#. 304 +msgid "Greenland" +msgstr "Гренландия" + +#. 270 +msgid "Gambia" +msgstr "Гамбия" + +#. 324 +msgid "Guinea" +msgstr "Гвинея" + +#. 312 +msgid "Guadeloupe" +msgstr "Гваделупа" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Экваториальная Гвинея" + +#. 300 +msgid "Greece" +msgstr "Греция" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Южная Георгия и Южные Сандвичевы Острова" + +#. 320 +msgid "Guatemala" +msgstr "Гватемала" + +#. 316 +msgid "Guam" +msgstr "Гуам" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Гвинея-Бисау" + +#. 328 +msgid "Guyana" +msgstr "Гайана" + +#. 344 +msgid "Hong Kong" +msgstr "Гонконг" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Острова Херд и Макдональд" + +#. 340 +msgid "Honduras" +msgstr "Гондурас" + +#. 191 +msgid "Croatia" +msgstr "Хорватия" + +#. 332 +msgid "Haiti" +msgstr "Гаити" + +#. 348 +msgid "Hungary" +msgstr "Венгрия" + +#. 360 +msgid "Indonesia" +msgstr "Индонезия" + +#. 372 +msgid "Ireland" +msgstr "Ирландия" + +#. 376 +msgid "Israel" +msgstr "Израиль" + +#. 833 +msgid "Isle of Man" +msgstr "Остров Мэн" + +#. 356 +msgid "India" +msgstr "Индия" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Британская территория в Индийском океане" + +#. 368 +msgid "Iraq" +msgstr "Ирак" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Ирак, Исламская Демократическая Республика" + +#. 352 +msgid "Iceland" +msgstr "Исландия" + +#. 380 +msgid "Italy" +msgstr "Италия" + +#. 832 +msgid "Jersey" +msgstr "Джерси" + +#. 388 +msgid "Jamaica" +msgstr "Ямайка" + +#. 400 +msgid "Jordan" +msgstr "Иордания" + +#. 392 +msgid "Japan" +msgstr "Япония" + +#. 404 +msgid "Kenya" +msgstr "Кения" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Кыргызстан" + +#. 116 +msgid "Cambodia" +msgstr "Камбоджа" + +#. 296 +msgid "Kiribati" +msgstr "Кирибати" + +#. 174 +msgid "Comoros" +msgstr "Коморские Острова" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Сент-Китс и Невис" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Корея, Демократическая Республика" + +#. 410 +msgid "Korea, Republic of" +msgstr "Корея, Республика" + +#. 414 +msgid "Kuwait" +msgstr "Кувейт" + +#. 136 +msgid "Cayman Islands" +msgstr "Каймановы острова" + +#. 398 +msgid "Kazakhstan" +msgstr "Казахстан" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Лао, Демократическая Республика" + +#. 422 +msgid "Lebanon" +msgstr "Ливан" + +#. 662 +msgid "Saint Lucia" +msgstr "Сент-Люсия" + +#. 438 +msgid "Liechtenstein" +msgstr "Лихтенштейн" + +#. 144 +msgid "Sri Lanka" +msgstr "Шри-Ланка" + +#. 430 +msgid "Liberia" +msgstr "Либерия" + +#. 426 +msgid "Lesotho" +msgstr "Лесото" + +#. 440 +msgid "Lithuania" +msgstr "Литва" + +#. 442 +msgid "Luxembourg" +msgstr "Люксембург" + +#. 428 +msgid "Latvia" +msgstr "Латвия" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Ливия" + +#. 504 +msgid "Morocco" +msgstr "Марокко" + +#. 492 +msgid "Monaco" +msgstr "Монако" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Молдовия, Республика" + +#. 499 +msgid "Montenegro" +msgstr "Черногория" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Сен-Мартин (Французкая часть)" + +#. 450 +msgid "Madagascar" +msgstr "Мадагаскар" + +#. 584 +msgid "Marshall Islands" +msgstr "Маршалловы Острова" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Македония, бывшая республика Югославии" + +#. 466 +msgid "Mali" +msgstr "Мали" + +#. 104 +msgid "Myanmar" +msgstr "Мьянма" + +#. 496 +msgid "Mongolia" +msgstr "Монголия" + +#. 446 +msgid "Macao" +msgstr "Мокао" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Северные Марианские Острова" + +#. 474 +msgid "Martinique" +msgstr "Мартиника" + +#. 478 +msgid "Mauritania" +msgstr "Мавритания" + +#. 500 +msgid "Montserrat" +msgstr "Монтсеррат" + +#. 470 +msgid "Malta" +msgstr "Мальта" + +#. 480 +msgid "Mauritius" +msgstr "Маврикий" + +#. 462 +msgid "Maldives" +msgstr "Мальдивы" + +#. 454 +msgid "Malawi" +msgstr "Малави" + +#. 484 +msgid "Mexico" +msgstr "Мексика" + +#. 458 +msgid "Malaysia" +msgstr "Малайзия" + +#. 508 +msgid "Mozambique" +msgstr "Мозамбик" + +#. 516 +msgid "Namibia" +msgstr "Намибия" + +#. 540 +msgid "New Caledonia" +msgstr "Новая Каледония" + +#. 562 +msgid "Niger" +msgstr "Нигер" + +#. 574 +msgid "Norfolk Island" +msgstr "Норфолк Остров" + +#. 566 +msgid "Nigeria" +msgstr "Нигерия" + +#. 558 +msgid "Nicaragua" +msgstr "Никарагуа" + +#. 528 +msgid "Netherlands" +msgstr "Нидерланды" + +#. 578 +msgid "Norway" +msgstr "Норвегия" + +#. 524 +msgid "Nepal" +msgstr "Непал" + +#. 520 +msgid "Nauru" +msgstr "Науру" + +#. 570 +msgid "Niue" +msgstr "Ниуэ" + +#. 554 +msgid "New Zealand" +msgstr "Новая Зеландия" + +#. 512 +msgid "Oman" +msgstr "Оман" + +#. 591 +msgid "Panama" +msgstr "Панама" + +#. 604 +msgid "Peru" +msgstr "Перу" + +#. 258 +msgid "French Polynesia" +msgstr "Французская Полинезия" + +#. 598 +msgid "Papua New Guinea" +msgstr "Папуа - Новая Гвинея" + +#. 608 +msgid "Philippines" +msgstr "Филиппины" + +#. 586 +msgid "Pakistan" +msgstr "Пакистан" + +#. 616 +msgid "Poland" +msgstr "Польша" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Сен-Пьер и Микелон" + +#. 612 +msgid "Pitcairn" +msgstr "Питкэрн" + +#. 630 +msgid "Puerto Rico" +msgstr "Пуэрто Рико" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Палестина" + +#. 620 +msgid "Portugal" +msgstr "Португалия" + +#. 585 +msgid "Palau" +msgstr "Палау" + +#. 600 +msgid "Paraguay" +msgstr "Парагвай" + +#. 634 +msgid "Qatar" +msgstr "Катар" + +#. 638 +msgid "Reunion" +msgstr "Реюньон" + +#. 642 +msgid "Romania" +msgstr "Румыния" + +#. 688 +msgid "Serbia" +msgstr "Сербия" + +#. 643 +msgid "Russian Federation" +msgstr "Российская Федерация" + +#. 646 +msgid "Rwanda" +msgstr "Руанда" + +#. 682 +msgid "Saudi Arabia" +msgstr "Саудовская Аравия" + +#. 090 +msgid "Solomon Islands" +msgstr "Соломоновы Острова" + +#. 690 +msgid "Seychelles" +msgstr "Сейшельские Острова" + +#. 736 +msgid "Sudan" +msgstr "Судан" + +#. 752 +msgid "Sweden" +msgstr "Швеция" + +#. 702 +msgid "Singapore" +msgstr "Сингапур" + +#. 654 +msgid "Saint Helena" +msgstr "Сент-Хелен" + +#. 705 +msgid "Slovenia" +msgstr "Словения" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Свальбард и Ян Майен" + +#. 703 +msgid "Slovakia" +msgstr "Словакия" + +#. 694 +msgid "Sierra Leone" +msgstr "Сьерра-Леоне" + +#. 674 +msgid "San Marino" +msgstr "Сан-Марино" + +#. 686 +msgid "Senegal" +msgstr "Сенегал" + +#. 706 +msgid "Somalia" +msgstr "Сомали" + +#. 740 +msgid "Suriname" +msgstr "Суринам" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Сан-Томе и Принсипи" + +#. 222 +msgid "El Salvador" +msgstr "Сальвадор" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Сирийская Арабская Республика" + +#. 748 +msgid "Swaziland" +msgstr "Свазиленд" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Тёркс и Кайкос" + +#. 148 +msgid "Chad" +msgstr "Чад" + +#. 260 +msgid "French Southern Territories" +msgstr "Французские Южные территории" + +#. 768 +msgid "Togo" +msgstr "Того" + +#. 764 +msgid "Thailand" +msgstr "Таиланд" + +#. 762 +msgid "Tajikistan" +msgstr "Таджикистан" + +#. 772 +msgid "Tokelau" +msgstr "Токелау" + +#. 626 +msgid "Timor-Leste" +msgstr "Восточный Тимор" + +#. 795 +msgid "Turkmenistan" +msgstr "Туркменистан" + +#. 788 +msgid "Tunisia" +msgstr "Тунис" + +#. 776 +msgid "Tonga" +msgstr "Тонга" + +#. 792 +msgid "Turkey" +msgstr "Турция" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Тринидад и Тобаго" + +#. 798 +msgid "Tuvalu" +msgstr "Тувалу" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Тайвань, Провинция Китая" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Танзия, Объедененная Республика" + +#. 804 +msgid "Ukraine" +msgstr "Украина" + +#. 800 +msgid "Uganda" +msgstr "Уганда" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Внешние Малые Острова Соединённых Штатов" + +#. 840 +msgid "United States" +msgstr "США" + +#. 858 +msgid "Uruguay" +msgstr "Уругвай" + +#. 860 +msgid "Uzbekistan" +msgstr "Узбекистан" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Ватикан" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Сент-Винсент и Гренадины" + +#. 862 +msgid "Venezuela" +msgstr "Венесуэла" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Виргинские Острова, Британия" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Виргинские Острова, США" + +#. 704 +msgid "Viet Nam" +msgstr "Вьетнам" + +#. 548 +msgid "Vanuatu" +msgstr "Вануату" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Уоллис и Футуна" + +#. 882 +msgid "Samoa" +msgstr "Самоа" + +#. 887 +msgid "Yemen" +msgstr "Йемен" + +#. 175 +msgid "Mayotte" +msgstr "Майотта" + +#. 710 +msgid "South Africa" +msgstr "Южная Африка" + +#. 894 +msgid "Zambia" +msgstr "Замбия" + +#. 716 +msgid "Zimbabwe" +msgstr "Зимбабве" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Неизвестный, для выбора городов добавьте теги is_in" + +msgid "Car" +msgstr "Авто" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Страна" + +msgid "Postal" +msgstr "Индекс" + +msgid "Town" +msgstr "Город" + +msgid "District" +msgstr "Район" + +msgid "Street" +msgstr "Улица" + +msgid "Number" +msgstr "Номер" + +msgid "Enter Destination" +msgstr "Введите пункт назначения" + +msgid "Zip Code" +msgstr "Индекс" + +msgid "City" +msgstr "Город" + +msgid "District/Township" +msgstr "Район" + +msgid "Map" +msgstr "Карта" + +msgid "Bookmark" +msgstr "Закладка" + +msgid "Destination" +msgstr "Пункт назначения" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Дисплей" + +msgid "_Route" +msgstr "Маршрут" + +msgid "_Former Destinations" +msgstr "Прошлые пункты назначения" + +msgid "_Bookmarks" +msgstr "Закладки" + +msgid "_Map" +msgstr "Карта" + +msgid "_Layout" +msgstr "Схема" + +msgid "_Projection" +msgstr "Проекция" + +msgid "_Vehicle" +msgstr "Т/с" + +msgid "Zoom_Out" +msgstr "Уменьшить" + +msgid "Decrease zoom level" +msgstr "Уменьшить масштаб" + +msgid "Zoom_In" +msgstr "Увеличить" + +msgid "Increase zoom level" +msgstr "Увеличить масштаб" + +msgid "_Recalculate" +msgstr "Пересчитать" + +msgid "Redraw map" +msgstr "Обновить карту" + +msgid "_Info" +msgstr "Информация" + +msgid "Set _destination" +msgstr "Установить пункт назначения" + +msgid "Opens address search dialog" +msgstr "Диалог поиска по адресу" + +msgid "_Stop Navigation" +msgstr "Остановить навигацию" + +msgid "Test" +msgstr "Тест" + +msgid "_Quit" +msgstr "_Выход" + +msgid "Quit the application" +msgstr "Выйти из программы" + +msgid "Show position _cursor" +msgstr "Показать/скрыть отметку текущей позиции" + +msgid "_Lock on Road" +msgstr "Заблокировать дорогу" + +msgid "_Keep orientation to the North" +msgstr "Ориентировать карту на север" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "Переключить ориентацию карты на север или по ходу движения" + +msgid "_Roadbook" +msgstr "Дорожный справочник" + +msgid "Show/hide route description" +msgstr "Показать описание маршрута" + +msgid "_Autozoom" +msgstr "Автомасштабирование" + +msgid "Enable/disable automatic zoom level changing" +msgstr "Включить/выключить автоматическое масштабирование" + +msgid "_Fullscreen" +msgstr "Во весь экран" + +msgid "Data" +msgstr "Данные" + +msgid "N" +msgstr "С" + +msgid "NE" +msgstr "СВ" + +msgid "E" +msgstr "В" + +msgid "SE" +msgstr "ЮВ" + +msgid "S" +msgstr "Ю" + +msgid "SW" +msgstr "ЮЗ" + +msgid "W" +msgstr "З" + +msgid "NW" +msgstr "СЗ" + +msgid "No" +msgstr "Нет" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "Другой" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Маршрут %4.0fкм %02d:%02d РВП" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Маршрут 0000км 0+00:00 РВП" + +msgid "Back to map" +msgstr "Назад к карте" + +msgid "Main Menu" +msgstr "Главное меню" + +msgid "Help" +msgstr "Справка" + +msgid "Back" +msgstr "Назад" + +msgid "Add Bookmark" +msgstr "Добавить закладку" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "Добавить папку закладок" + +msgid "Rename" +msgstr "Переименовать" + +msgid "POIs" +msgstr "POIs" + +msgid "View in Browser" +msgstr "Просмотреть в браузере" + +msgid "Streets" +msgstr "Улицы" + +msgid "House numbers" +msgstr "Номера домов" + +msgid "View Attributes" +msgstr "Просмотреть Атрибуты" + +msgid "View on map" +msgstr "Показать на карте" + +msgid "Cut Bookmark" +msgstr "Вырезать закладку" + +msgid "Copy Bookmark" +msgstr "Скопировать закладку" + +msgid "Rename Bookmark" +msgstr "Переименовать закладку" + +msgid "Paste Bookmark" +msgstr "Вставить закладку" + +msgid "Delete Bookmark" +msgstr "Удалить закладку" + +msgid "Bookmarks" +msgstr "Закладки" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Вставить закладку" + +#, c-format +msgid "Bookmark %s" +msgstr "Закладка %s" + +msgid "Former Destinations" +msgstr "Прошлые пункты назначения" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Номер дома" + +msgid "Layout" +msgstr "Схема" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Карты" + +msgid "Show Satellite Status" +msgstr "Показать Состояние Спутников" + +msgid " Elevation " +msgstr " Высота " + +msgid " Azimuth " +msgstr " Азимут " + +msgid "Show NMEA Data" +msgstr "Показать Данные NMEA" + +msgid "car" +msgstr "машина" + +msgid "bike" +msgstr "велосипед" + +msgid "pedestrian" +msgstr "пешеход" + +#, c-format +msgid "Current profile: %s" +msgstr "Текущий профиль: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Сменить профиль на: %s" + +msgid "Set as active" +msgstr "Сделать активным" + +msgid "Show Satellite status" +msgstr "Показать состояние Спутников" + +msgid "Show NMEA data" +msgstr "Показать данные NMEA" + +msgid "Vehicle" +msgstr "Т/с" + +msgid "Rules" +msgstr "Правила" + +msgid "Lock on road" +msgstr "Придерживаться дороги" + +msgid "Northing" +msgstr "на север" + +msgid "Map follows Vehicle" +msgstr "Карта следует за машиной" + +msgid "Message" +msgstr "Сообщение" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Описание маршрута" + +msgid "Height Profile" +msgstr "Профиль высот" + +msgid "Show Locale" +msgstr "Проверить локализацию" + +msgid "About Navit" +msgstr "О Navit" + +#. Authors +msgid "By" +msgstr "Авторы:" + +#. Contributors +msgid "And all the Navit Team" +msgstr "И все участники команды Navit" + +msgid "members and contributors." +msgstr "и лица внесшие вклад" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Точка на карте" + +msgid "Vehicle Position" +msgstr "Местоположение автомобиля" + +msgid "Main menu" +msgstr "Главное меню" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Показать\n" +"Карту" + +msgid "Settings" +msgstr "Настройки" + +msgid "Tools" +msgstr "Инструменты" + +msgid "Route" +msgstr "Маршрут" + +msgid "About" +msgstr "О программе" + +msgid "Actions" +msgstr "Команды" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Выход" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Прекращение\n" +"навигации" + +msgid "Display" +msgstr "Дисплей" + +msgid "Fullscreen" +msgstr "Во весь экран" + +msgid "Window Mode" +msgstr "Режим окна" + +msgid "Description" +msgstr "Описание" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "лошадь" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "Enter the roundabout soon and leave it at the %s" +#~ msgstr "Скоро круговое движение, ожидайте съезд на %s" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "Круговое движение через %s" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d километр" + +#~ msgid "Cursor" +#~ msgstr "Курсор" + +#~ msgid " SNR " +#~ msgstr " Сигнал/Шум " diff --git a/po/sk.po.in b/po/sk.po.in new file mode 100644 index 0000000..9b5ce30 --- /dev/null +++ b/po/sk.po.in @@ -0,0 +1,1767 @@ +# Translation of Navit to Slovak language +# Copyright (C) 2008 The Navit Team +# This file is distributed under the same license as the navit package. +# Eduard DRUSA , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-06-11 09:50+0000\n" +"Last-Translator: kayle.sk \n" +"Language-Team: Slovenčina\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Beží zo zdrojového adresára\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "nastavuje sa „%s“ na „%s“\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "nultý" + +msgid "first" +msgstr "prvý" + +msgid "second" +msgstr "druhý" + +msgid "third" +msgstr "tretí" + +msgid "fourth" +msgstr "štvrtý" + +msgid "fifth" +msgstr "piaty" + +msgid "sixth" +msgstr "šiesty" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "nultý výjazd" + +msgid "first exit" +msgstr "prvý výjazd" + +msgid "second exit" +msgstr "druhý výjazd" + +msgid "third exit" +msgstr "tretí výjazd" + +msgid "fourth exit" +msgstr "štvrtý výjazd" + +msgid "fifth exit" +msgstr "piaty výjazd" + +msgid "sixth exit" +msgstr "šiesty výjazd" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "o %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metrov" + +#, c-format +msgid "in %d meters" +msgstr "o %d metrov" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d kilometrov" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "o %d.%d kilometrov" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "%d kilometrov" +msgstr[1] "jeden kilometer" +msgstr[2] "%d kilometre" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "o %d kilometrov" +msgstr[1] "o jeden kilometer" +msgstr[2] "o %d kilometre" + +msgid "exit" +msgstr "výjazd" + +msgid "into the ramp" +msgstr "na privádzač" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s do ulice %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%s do %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%s do %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%s do %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%s na %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "vpravo" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "vľavo" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "mierne " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "prudko " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "naozaj silno " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "neznámy " + +msgid "When possible, please turn around" +msgstr "Ak to bude možné, prosím, otočte sa" + +msgid "Enter the roundabout soon" +msgstr "Vstúpte do kruhového objazdu onedlho" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "potom opustite kruhový objazd na %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Opustite kruhový objazd na %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Pokračujte naďalej po ceste %s" + +msgid "soon" +msgstr "onedlho" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Choďte %1$s cestou na %2$s" + +#, c-format +msgid "after %i roads" +msgstr "po %i cestách" + +msgid "now" +msgstr "teraz" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "potom nasledujte cestu %1$s do %2$s" + +msgid "error" +msgstr "chyba" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Odbočte %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "potom %1$s odbočte %2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Dorazili ste do svojho cieľa %s" + +msgid "then you have reached your destination." +msgstr "potom dosiahnete svoj cieľ cesty" + +msgid "Position" +msgstr "Pozícia" + +msgid "Command" +msgstr "Príkaz" + +msgid "Length" +msgstr "Dĺžka" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Čas" + +msgid "Destination Length" +msgstr "Cieľová vzdialenosť" + +msgid "Destination Time" +msgstr "Čas k cieľu" + +msgid "Roadbook" +msgstr "Plán trasy" + +msgid "Set as position" +msgstr "Nastaviť ako pozíciu" + +msgid "Set as destination" +msgstr "Nastaviť ako cieľ" + +msgid "Add as bookmark" +msgstr "Pridať ako záložku" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Bod 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Súradnice obrazovky: %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Spojené arabské emiráty" + +#. 004 +msgid "Afghanistan" +msgstr "Afganistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua a Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albánsko" + +#. 051 +msgid "Armenia" +msgstr "Arménsko" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Holandské Antily" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarktída" + +#. 032 +msgid "Argentina" +msgstr "Argentína" + +#. 016 +msgid "American Samoa" +msgstr "Americká Samoa" + +#. 040 +msgid "Austria" +msgstr "Rakúsko" + +#. 036 +msgid "Australia" +msgstr "Austrália" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Alandy" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbajdžan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosna a Hercegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladéž" + +#. 056 +msgid "Belgium" +msgstr "Belgicko" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulharsko" + +#. 048 +msgid "Bahrain" +msgstr "Bahrajn" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Svátý Bartolomej" + +#. 060 +msgid "Bermuda" +msgstr "Bermudy" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunejský Darussalam" + +#. 068 +msgid "Bolivia" +msgstr "Bolívia" + +#. 076 +msgid "Brazil" +msgstr "Brazília" + +#. 044 +msgid "Bahamas" +msgstr "Bahamy" + +#. 064 +msgid "Bhutan" +msgstr "Bután" + +#. 074 +msgid "Bouvet Island" +msgstr "Bouvetov ostrov" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Bielorusko" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Kanada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Kokosové (Keeling) ostrovy" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Konžská demokratická republika" + +#. 140 +msgid "Central African Republic" +msgstr "Stredoafrická republika" + +#. 178 +msgid "Congo" +msgstr "Kongo" + +#. 756 +msgid "Switzerland" +msgstr "Švajčiarsko" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Pobrežie slonoviny" + +#. 184 +msgid "Cook Islands" +msgstr "Cookove ostrovy" + +#. 152 +msgid "Chile" +msgstr "Čile" + +#. 120 +msgid "Cameroon" +msgstr "Kamerun" + +#. 156 +msgid "China" +msgstr "Čína" + +#. 170 +msgid "Colombia" +msgstr "Kolumbia" + +#. 188 +msgid "Costa Rica" +msgstr "Kostarika" + +#. 192 +msgid "Cuba" +msgstr "Kuba" + +#. 132 +msgid "Cape Verde" +msgstr "Cape Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Vianočné ostrovy" + +#. 196 +msgid "Cyprus" +msgstr "Cyprus" + +#. 203 +msgid "Czech Republic" +msgstr "Česká republika" + +#. 276 +msgid "Germany" +msgstr "Nemecko" + +#. 262 +msgid "Djibouti" +msgstr "Džibutsko" + +#. 208 +msgid "Denmark" +msgstr "Dánsko" + +#. 212 +msgid "Dominica" +msgstr "Dominika" + +#. 214 +msgid "Dominican Republic" +msgstr "Dominikánska republika" + +#. 012 +msgid "Algeria" +msgstr "Alžírsko" + +#. 218 +msgid "Ecuador" +msgstr "Ekvádor" + +#. 233 +msgid "Estonia" +msgstr "Estónsko" + +#. 818 +msgid "Egypt" +msgstr "Egypt" + +#. 732 +msgid "Western Sahara" +msgstr "Západná Sahara" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Španielsko" + +#. 231 +msgid "Ethiopia" +msgstr "Etiópia" + +#. 246 +msgid "Finland" +msgstr "Fínsko" + +#. 242 +msgid "Fiji" +msgstr "Fidži" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falkandské ostrovy (Malvíny)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Mikronézske federatívne štáty" + +#. 234 +msgid "Faroe Islands" +msgstr "Faerské ostrovy" + +#. 250 +msgid "France" +msgstr "Francúzsko" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Spojené kráľovstvo" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Gruzínsko" + +#. 254 +msgid "French Guiana" +msgstr "Francúzska Guiana" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltár" + +#. 304 +msgid "Greenland" +msgstr "Grónsko" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Rovníková Guinea" + +#. 300 +msgid "Greece" +msgstr "Grécko" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Južná Georgia a Južné Sandwitchové ostrovy" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heardov a McDonaldove ostrovy" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Chorvátsko" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Maďarsko" + +#. 360 +msgid "Indonesia" +msgstr "Indonézia" + +#. 372 +msgid "Ireland" +msgstr "Írsko" + +#. 376 +msgid "Israel" +msgstr "Izrael" + +#. 833 +msgid "Isle of Man" +msgstr "Ostrov Man" + +#. 356 +msgid "India" +msgstr "India" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Britské teritórium Indického oceánu" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iránska islamská republika" + +#. 352 +msgid "Iceland" +msgstr "Island" + +#. 380 +msgid "Italy" +msgstr "Taliansko" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamajka" + +#. 400 +msgid "Jordan" +msgstr "Jordánsko" + +#. 392 +msgid "Japan" +msgstr "Japonsko" + +#. 404 +msgid "Kenya" +msgstr "Keňa" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirgistán" + +#. 116 +msgid "Cambodia" +msgstr "Kambodža" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Komory" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Svätý Krištof a Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Kórejská ľudovodemokratická republika" + +#. 410 +msgid "Korea, Republic of" +msgstr "Kórejská republika" + +#. 414 +msgid "Kuwait" +msgstr "Kuvajt" + +#. 136 +msgid "Cayman Islands" +msgstr "Kajmanské ostrovy" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazachstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laoská ľudovodemokratická republika" + +#. 422 +msgid "Lebanon" +msgstr "Libanon" + +#. 662 +msgid "Saint Lucia" +msgstr "Svätá Lucia" + +#. 438 +msgid "Liechtenstein" +msgstr "Lichtenštajnsko" + +#. 144 +msgid "Sri Lanka" +msgstr "Srí Lanka" + +#. 430 +msgid "Liberia" +msgstr "Libéria" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Litva" + +#. 442 +msgid "Luxembourg" +msgstr "Luxembursko" + +#. 428 +msgid "Latvia" +msgstr "Lotyšsko" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Líbijská Arabská Džahamíra" + +#. 504 +msgid "Morocco" +msgstr "Maroko" + +#. 492 +msgid "Monaco" +msgstr "Monako" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldavská republika" + +#. 499 +msgid "Montenegro" +msgstr "Čierna hora" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Svátý martin (Francúzska časť)" + +#. 450 +msgid "Madagascar" +msgstr "Madagaskar" + +#. 584 +msgid "Marshall Islands" +msgstr "Maršalové ostrovy" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Macedónsko" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Mjanmarsko" + +#. 496 +msgid "Mongolia" +msgstr "Mongolsko" + +#. 446 +msgid "Macao" +msgstr "Makao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Severné Mariány" + +#. 474 +msgid "Martinique" +msgstr "Martinik" + +#. 478 +msgid "Mauritania" +msgstr "Mauretánia" + +#. 500 +msgid "Montserrat" +msgstr "Monserat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauricius" + +#. 462 +msgid "Maldives" +msgstr "Maledivy" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mexiko" + +#. 458 +msgid "Malaysia" +msgstr "Malajzia" + +#. 508 +msgid "Mozambique" +msgstr "Mozambik" + +#. 516 +msgid "Namibia" +msgstr "Namíbia" + +#. 540 +msgid "New Caledonia" +msgstr "Nová Kaledónia" + +#. 562 +msgid "Niger" +msgstr "Nigér" + +#. 574 +msgid "Norfolk Island" +msgstr "Ostrov Norfolk" + +#. 566 +msgid "Nigeria" +msgstr "Nigéria" + +#. 558 +msgid "Nicaragua" +msgstr "Nikaragua" + +#. 528 +msgid "Netherlands" +msgstr "Holandsko" + +#. 578 +msgid "Norway" +msgstr "Nórsko" + +#. 524 +msgid "Nepal" +msgstr "Nepál" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Nový Zéland" + +#. 512 +msgid "Oman" +msgstr "Omán" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Francúzska Polynézia" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua Nová Guinea" + +#. 608 +msgid "Philippines" +msgstr "Filipíny" + +#. 586 +msgid "Pakistan" +msgstr "Pakistán" + +#. 616 +msgid "Poland" +msgstr "Poľsko" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Svätý Piere a Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Portoriko" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestínske územie, okupované" + +#. 620 +msgid "Portugal" +msgstr "Portugalsko" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguaj" + +#. 634 +msgid "Qatar" +msgstr "Katar" + +#. 638 +msgid "Reunion" +msgstr "Réunion" + +#. 642 +msgid "Romania" +msgstr "Rumunsko" + +#. 688 +msgid "Serbia" +msgstr "Srbsko" + +#. 643 +msgid "Russian Federation" +msgstr "Ruská federácia" + +#. 646 +msgid "Rwanda" +msgstr "Rwanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Saudská Arábia" + +#. 090 +msgid "Solomon Islands" +msgstr "Šalamúnove Ostrovy" + +#. 690 +msgid "Seychelles" +msgstr "Seychelské ostrovy" + +#. 736 +msgid "Sudan" +msgstr "Sudán" + +#. 752 +msgid "Sweden" +msgstr "Švédsko" + +#. 702 +msgid "Singapore" +msgstr "Singapúr" + +#. 654 +msgid "Saint Helena" +msgstr "Svätá Helena" + +#. 705 +msgid "Slovenia" +msgstr "Slovinsko" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Špicbergy a Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slovenská republika" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Maríno" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somálsko" + +#. 740 +msgid "Suriname" +msgstr "Surinam" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Svatý Tomáš" + +#. 222 +msgid "El Salvador" +msgstr "Salvádor" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Sýrska arabská republika" + +#. 748 +msgid "Swaziland" +msgstr "Svazijsko" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turkské a kaikoské ostrovy" + +#. 148 +msgid "Chad" +msgstr "Čad" + +#. 260 +msgid "French Southern Territories" +msgstr "Francúzske južné a antarktické územia" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Thajsko" + +#. 762 +msgid "Tajikistan" +msgstr "Tadžikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Timor-Leste" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkménsko" + +#. 788 +msgid "Tunisia" +msgstr "Tunisko" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turecko" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad a Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan, provincia Číny" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzánijská zjednotená republika" + +#. 804 +msgid "Ukraine" +msgstr "Ukrajina" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Spojené štáty drobných odľahlých ostrovov" + +#. 840 +msgid "United States" +msgstr "Spojené štáty americké" + +#. 858 +msgid "Uruguay" +msgstr "Uruguaj" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Svätá stolica (Vatikánsky mestský štát)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Svätý Vincent a Grenadíny" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Panenské ostrovy, Britské" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Panenské ostrovy, Americké" + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis a Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Jemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Juhoafrická republika" + +#. 894 +msgid "Zambia" +msgstr "Zambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Neznáme, pridajte is_in tag v týchto mestách." + +msgid "Car" +msgstr "Vozidlo" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Krajina" + +msgid "Postal" +msgstr "PSČ" + +msgid "Town" +msgstr "Mesto" + +msgid "District" +msgstr "Kraj" + +msgid "Street" +msgstr "Ulica" + +msgid "Number" +msgstr "Číslo" + +msgid "Enter Destination" +msgstr "Uveďte cieľ" + +msgid "Zip Code" +msgstr "PSČ" + +msgid "City" +msgstr "Mesto" + +msgid "District/Township" +msgstr "Kraj/Okres" + +msgid "Map" +msgstr "Mapa" + +msgid "Bookmark" +msgstr "Záložka" + +msgid "Destination" +msgstr "Cieľ" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Displej" + +msgid "_Route" +msgstr "Trasa" + +msgid "_Former Destinations" +msgstr "Predošlé cieľe" + +msgid "_Bookmarks" +msgstr "Záložky" + +msgid "_Map" +msgstr "Mapa" + +msgid "_Layout" +msgstr "Značenie" + +msgid "_Projection" +msgstr "Projekcia" + +msgid "_Vehicle" +msgstr "Vozidlo" + +msgid "Zoom_Out" +msgstr "Oddialiť" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Priblížiť" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Prepočítať" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Informácie" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Zastaviť navigáciu" + +msgid "Test" +msgstr "Otestovať" + +msgid "_Quit" +msgstr "_Koniec" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Uzamknúť na cesty" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Plán trasy" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Automatické zväčšenie" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Celá obrazovka" + +msgid "Data" +msgstr "Dáta" + +msgid "N" +msgstr "S" + +msgid "NE" +msgstr "SV" + +msgid "E" +msgstr "V" + +msgid "SE" +msgstr "JV" + +msgid "S" +msgstr "J" + +msgid "SW" +msgstr "JZ" + +msgid "W" +msgstr "Z" + +msgid "NW" +msgstr "SZ" + +msgid "No" +msgstr "Nie" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Cesta %4.0fkm čas %02d:%02d" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Cesta 0000km čas 0+00:00" + +msgid "Back to map" +msgstr "Späť na mapu" + +msgid "Main Menu" +msgstr "Hlavné menu" + +msgid "Help" +msgstr "Pomoc" + +msgid "Back" +msgstr "Späť" + +msgid "Add Bookmark" +msgstr "Pridať záložku" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "Pridať priečinok pre záložky" + +msgid "Rename" +msgstr "Premenovať" + +msgid "POIs" +msgstr "POI" + +msgid "View in Browser" +msgstr "Zobraziť v prehliadači" + +msgid "Streets" +msgstr "Ulice" + +msgid "House numbers" +msgstr "Čísla domov" + +msgid "View Attributes" +msgstr "Zobraziť atribúty" + +msgid "View on map" +msgstr "Zobraziť na mape" + +msgid "Cut Bookmark" +msgstr "Vystrihnúť záložku" + +msgid "Copy Bookmark" +msgstr "Kopírovať záložku" + +msgid "Rename Bookmark" +msgstr "Premenovať záložku" + +msgid "Paste Bookmark" +msgstr "Vložiť záložku" + +msgid "Delete Bookmark" +msgstr "Odstrániť záložku" + +msgid "Bookmarks" +msgstr "Záložky" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Vložiť záložku" + +#, c-format +msgid "Bookmark %s" +msgstr "Záložka %s" + +msgid "Former Destinations" +msgstr "Predošlé cieľe" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Číslo domu" + +msgid "Layout" +msgstr "Značenie" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Mapy" + +msgid "Show Satellite Status" +msgstr "Zobraziť stav satelitov" + +msgid " Elevation " +msgstr " Prevýšenie " + +msgid " Azimuth " +msgstr " Azimut " + +msgid "Show NMEA Data" +msgstr "Zobraziť NMEA data" + +msgid "car" +msgstr "auto" + +msgid "bike" +msgstr "bicykel" + +msgid "pedestrian" +msgstr "chodec" + +#, c-format +msgid "Current profile: %s" +msgstr "Aktuálny profil: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Zmeniť profil na: %s" + +msgid "Set as active" +msgstr "Nastaviť ako aktívny" + +msgid "Show Satellite status" +msgstr "Zobraziť stav satelitov" + +msgid "Show NMEA data" +msgstr "Zobraziť NMEA data" + +msgid "Vehicle" +msgstr "Vozidlo" + +msgid "Rules" +msgstr "Pravidlá" + +msgid "Lock on road" +msgstr "Prichytiť k ceste" + +msgid "Northing" +msgstr "Sever vždy hore" + +msgid "Map follows Vehicle" +msgstr "Mapa sleduje vozidlo" + +msgid "Message" +msgstr "Správa" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Popis trasy" + +msgid "Height Profile" +msgstr "Výškovy Profil" + +msgid "Show Locale" +msgstr "Zobraziť jazyk" + +msgid "About Navit" +msgstr "O Navite" + +#. Authors +msgid "By" +msgstr "Od" + +#. Contributors +msgid "And all the Navit Team" +msgstr "A všetci členovia týmu Navitu" + +msgid "members and contributors." +msgstr "členovia a prispievatelia" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Bod na mape" + +msgid "Vehicle Position" +msgstr "Pozícia vozidla" + +msgid "Main menu" +msgstr "Hlavné menu" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Zobraziť\n" +"mapu" + +msgid "Settings" +msgstr "Nastavenia" + +msgid "Tools" +msgstr "Nástroje" + +msgid "Route" +msgstr "Trasa" + +msgid "About" +msgstr "O programe" + +msgid "Actions" +msgstr "Akcie" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Koniec" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Zastaviť\n" +"navigáciu" + +msgid "Display" +msgstr "Displej" + +msgid "Fullscreen" +msgstr "Celá obrazovka" + +msgid "Window Mode" +msgstr "V okne" + +msgid "Description" +msgstr "Popis" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "kôň" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "O %s vstúpte do kruhového objazdu" + +#~ msgid "Cursor" +#~ msgstr "Kurzor" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d kilometra" diff --git a/po/sl.po.in b/po/sl.po.in new file mode 100644 index 0000000..ed2ae76 --- /dev/null +++ b/po/sl.po.in @@ -0,0 +1,1768 @@ +# Slovenian translation for navit +# Copyright (c) 2008 The Navit Team +# This file is distributed under the same license as the navit package. +# Štefan Baebler , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2009-07-02 21:39+0000\n" +"Last-Translator: KaZeR \n" +"Language-Team: Slovenian \n" +"Language: sl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" +"%100==4 ? 3 : 0);\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Zagon iz mape z izvorno kodo\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "nastavljam '%s' na '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "ničt" + +msgid "first" +msgstr "prv" + +msgid "second" +msgstr "drug" + +msgid "third" +msgstr "tretj" + +msgid "fourth" +msgstr "četrt" + +msgid "fifth" +msgstr "pet" + +msgid "sixth" +msgstr "šest" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "" + +msgid "first exit" +msgstr "" + +msgid "second exit" +msgstr "" + +msgid "third exit" +msgstr "" + +msgid "fourth exit" +msgstr "" + +msgid "fifth exit" +msgstr "" + +msgid "sixth exit" +msgstr "" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "Čez %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metrov" + +#, c-format +msgid "in %d meters" +msgstr "Čez %d metrov" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "Čez %d.%d kilometov" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "%d kilometrov" +msgstr[1] "%d kilometer" +msgstr[2] "%d kilometra" +msgstr[3] "%d kilometri" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "Čez %d kilometrov" +msgstr[1] "Čez %d kilometer" +msgstr[2] "Čez %d kilometra" +msgstr[3] "Čez %d kilometre" + +msgid "exit" +msgstr "odcep" + +msgid "into the ramp" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%sna %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%sna %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%sna %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%sna %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "desno" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "levo" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "rahlo " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "ostro " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "neznano " + +msgid "When possible, please turn around" +msgstr "Obrnite čim bo to mogoče" + +msgid "Enter the roundabout soon" +msgstr "Kmalu zapeljite v krožišče" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Ostanite na tej cesti naslednjih %s" + +msgid "soon" +msgstr "kmalu" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Zavijte na %2$s v %1$so cesto" + +#, c-format +msgid "after %i roads" +msgstr "čez %i cest" + +msgid "now" +msgstr "sedaj" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "nato zavijte na %2$s v %1$so cesto" + +msgid "error" +msgstr "napaka" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "%3$s zavijte %1$s%2$s %4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "nato zavijte %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "%s ste na cilju" + +msgid "then you have reached your destination." +msgstr "in ste na cilju." + +msgid "Position" +msgstr "Položaj" + +msgid "Command" +msgstr "Navodilo" + +msgid "Length" +msgstr "Razdalja" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Čas" + +msgid "Destination Length" +msgstr "Razdalja do cilja" + +msgid "Destination Time" +msgstr "Čas do cilja" + +msgid "Roadbook" +msgstr "Načrt poti" + +msgid "Set as position" +msgstr "Nastavi kot položaj" + +msgid "Set as destination" +msgstr "Nastavi kot cilj" + +msgid "Add as bookmark" +msgstr "Dodaj zaznamek" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Točka 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Koordinate zaslona: %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andora" + +#. 784 +msgid "United Arab Emirates" +msgstr "Združeni arabski emirati" + +#. 004 +msgid "Afghanistan" +msgstr "Afganistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigva in Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Angvila" + +#. 008 +msgid "Albania" +msgstr "Albanija" + +#. 051 +msgid "Armenia" +msgstr "Armenija" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Nizozemski Antili" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarktika" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "Ameriška Samoa" + +#. 040 +msgid "Austria" +msgstr "Avstrija" + +#. 036 +msgid "Australia" +msgstr "Avstralija" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Aland Islands" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbajdžan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosna in Hercegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladeš" + +#. 056 +msgid "Belgium" +msgstr "Belgija" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bolgarija" + +#. 048 +msgid "Bahrain" +msgstr "Bahrajn" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint Barthelemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermudi" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunej" + +#. 068 +msgid "Bolivia" +msgstr "Bolivija" + +#. 076 +msgid "Brazil" +msgstr "Brazilija" + +#. 044 +msgid "Bahamas" +msgstr "Bahami" + +#. 064 +msgid "Bhutan" +msgstr "Butan" + +#. 074 +msgid "Bouvet Island" +msgstr "Bouvetov otok" + +#. 072 +msgid "Botswana" +msgstr "Bocvana" + +#. 112 +msgid "Belarus" +msgstr "Belorusija" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Kanada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Kokosovi otoki" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Kongo, Demokratična Republika" + +#. 140 +msgid "Central African Republic" +msgstr "Srednjeafriška Republika" + +#. 178 +msgid "Congo" +msgstr "Kongo" + +#. 756 +msgid "Switzerland" +msgstr "Švica" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Slonokoščena obala" + +#. 184 +msgid "Cook Islands" +msgstr "Cookovi otoki" + +#. 152 +msgid "Chile" +msgstr "Čile" + +#. 120 +msgid "Cameroon" +msgstr "Kamerun" + +#. 156 +msgid "China" +msgstr "Kitajska" + +#. 170 +msgid "Colombia" +msgstr "Kolumbija" + +#. 188 +msgid "Costa Rica" +msgstr "Kostarika" + +#. 192 +msgid "Cuba" +msgstr "Kuba" + +#. 132 +msgid "Cape Verde" +msgstr "Zelenortski otoki" + +#. 162 +msgid "Christmas Island" +msgstr "Božični otok" + +#. 196 +msgid "Cyprus" +msgstr "Ciper" + +#. 203 +msgid "Czech Republic" +msgstr "Češka" + +#. 276 +msgid "Germany" +msgstr "Nemčija" + +#. 262 +msgid "Djibouti" +msgstr "Džibuti" + +#. 208 +msgid "Denmark" +msgstr "Danska" + +#. 212 +msgid "Dominica" +msgstr "Dominika" + +#. 214 +msgid "Dominican Republic" +msgstr "Dominikanska republika" + +#. 012 +msgid "Algeria" +msgstr "Alžirija" + +#. 218 +msgid "Ecuador" +msgstr "Ekvador" + +#. 233 +msgid "Estonia" +msgstr "Estonija" + +#. 818 +msgid "Egypt" +msgstr "Egipt" + +#. 732 +msgid "Western Sahara" +msgstr "Zahodna Sahara" + +#. 232 +msgid "Eritrea" +msgstr "Eritreja" + +#. 724 +msgid "Spain" +msgstr "Španija" + +#. 231 +msgid "Ethiopia" +msgstr "Etiopija" + +#. 246 +msgid "Finland" +msgstr "Finska" + +#. 242 +msgid "Fiji" +msgstr "Fidži" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falklandski otoki" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Mikronezija" + +#. 234 +msgid "Faroe Islands" +msgstr "Ferski otoki" + +#. 250 +msgid "France" +msgstr "Francija" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Združeno kraljestvo" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Gruzija" + +#. 254 +msgid "French Guiana" +msgstr "Francoska Gvajana" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Gana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Grenlandija" + +#. 270 +msgid "Gambia" +msgstr "Gambija" + +#. 324 +msgid "Guinea" +msgstr "Gvineja" + +#. 312 +msgid "Guadeloupe" +msgstr "Gvadelup" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Ekvatorialna Gvineja" + +#. 300 +msgid "Greece" +msgstr "Grčija" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Južna Georgia in Južni Sandwichevi otoki" + +#. 320 +msgid "Guatemala" +msgstr "Gvatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Gvineja-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Gvajana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Otoki Heard in McDonald" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Hrvaška" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Madžarska" + +#. 360 +msgid "Indonesia" +msgstr "Indonezija" + +#. 372 +msgid "Ireland" +msgstr "Irska" + +#. 376 +msgid "Israel" +msgstr "Izrael" + +#. 833 +msgid "Isle of Man" +msgstr "Otok Man" + +#. 356 +msgid "India" +msgstr "Indija" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Britansko ozemlje v Indijskem oceanu" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iran" + +#. 352 +msgid "Iceland" +msgstr "Islandija" + +#. 380 +msgid "Italy" +msgstr "Italija" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamajka" + +#. 400 +msgid "Jordan" +msgstr "Jordanija" + +#. 392 +msgid "Japan" +msgstr "Japonska" + +#. 404 +msgid "Kenya" +msgstr "Kenija" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirgizistan" + +#. 116 +msgid "Cambodia" +msgstr "Kambodža" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Komori" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Saint Kitts in Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Severna Koreja" + +#. 410 +msgid "Korea, Republic of" +msgstr "Južna Koreja" + +#. 414 +msgid "Kuwait" +msgstr "Kuvajt" + +#. 136 +msgid "Cayman Islands" +msgstr "Kajmanski otoki" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazahstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Laoška ljudska demokratična republika" + +#. 422 +msgid "Lebanon" +msgstr "Libanon" + +#. 662 +msgid "Saint Lucia" +msgstr "Saint Lucia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Šrilanka" + +#. 430 +msgid "Liberia" +msgstr "Liberija" + +#. 426 +msgid "Lesotho" +msgstr "Lesoto" + +#. 440 +msgid "Lithuania" +msgstr "Litva" + +#. 442 +msgid "Luxembourg" +msgstr "Luksemburg" + +#. 428 +msgid "Latvia" +msgstr "Latvija" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libijska arabska džamahirija" + +#. 504 +msgid "Morocco" +msgstr "Maroko" + +#. 492 +msgid "Monaco" +msgstr "Monako" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldavija" + +#. 499 +msgid "Montenegro" +msgstr "Črna Gora" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Saint Martin (Francoski del)" + +#. 450 +msgid "Madagascar" +msgstr "Madagaskar" + +#. 584 +msgid "Marshall Islands" +msgstr "Marshallovi otoki" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Makedonija" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Mjanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mongolija" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Severni Marianski otoki" + +#. 474 +msgid "Martinique" +msgstr "Martinik" + +#. 478 +msgid "Mauritania" +msgstr "Mavretanija" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mavricij" + +#. 462 +msgid "Maldives" +msgstr "Maldivi" + +#. 454 +msgid "Malawi" +msgstr "Malavi" + +#. 484 +msgid "Mexico" +msgstr "Mehika" + +#. 458 +msgid "Malaysia" +msgstr "Malezija" + +#. 508 +msgid "Mozambique" +msgstr "Mozambik" + +#. 516 +msgid "Namibia" +msgstr "Namibija" + +#. 540 +msgid "New Caledonia" +msgstr "Nova Kaledonija" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolški otok" + +#. 566 +msgid "Nigeria" +msgstr "Nigerija" + +#. 558 +msgid "Nicaragua" +msgstr "Nikaragva" + +#. 528 +msgid "Netherlands" +msgstr "Nizozemska" + +#. 578 +msgid "Norway" +msgstr "Norveška" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Nova Zelandija" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Francoska Polinezija" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua Nova Gvineja" + +#. 608 +msgid "Philippines" +msgstr "Filipini" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Poljska" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint Pierre in Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Portoriko" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestinsko ozemlje, okupirano" + +#. 620 +msgid "Portugal" +msgstr "Portugalska" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paragvaj" + +#. 634 +msgid "Qatar" +msgstr "Katar" + +#. 638 +msgid "Reunion" +msgstr "Reunion" + +#. 642 +msgid "Romania" +msgstr "Romunija" + +#. 688 +msgid "Serbia" +msgstr "Srbija" + +#. 643 +msgid "Russian Federation" +msgstr "Ruska federacija" + +#. 646 +msgid "Rwanda" +msgstr "Ruanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Saudska Arabija" + +#. 090 +msgid "Solomon Islands" +msgstr "Solomonovi otoki" + +#. 690 +msgid "Seychelles" +msgstr "Sejšeli" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Švedska" + +#. 702 +msgid "Singapore" +msgstr "Singapur" + +#. 654 +msgid "Saint Helena" +msgstr "Sveta Helena" + +#. 705 +msgid "Slovenia" +msgstr "Slovenija" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard in Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slovaška" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalija" + +#. 740 +msgid "Suriname" +msgstr "Surinam" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Sao Tome in Principe" + +#. 222 +msgid "El Salvador" +msgstr "Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Sirska arabska republika" + +#. 748 +msgid "Swaziland" +msgstr "Svazi" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turks in Caicoški otoki" + +#. 148 +msgid "Chad" +msgstr "Čad" + +#. 260 +msgid "French Southern Territories" +msgstr "Francoska južna ozemlja" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Tajska" + +#. 762 +msgid "Tajikistan" +msgstr "Tadžikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Vzhodni Timor" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunizija" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turčija" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad in Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Tajvan, provinca Kitajske" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzanija" + +#. 804 +msgid "Ukraine" +msgstr "Ukrajina" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "manjši otoki Združenih držav Amerike" + +#. 840 +msgid "United States" +msgstr "Združene države Amerike" + +#. 858 +msgid "Uruguay" +msgstr "Urugvaj" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Sveti sedež (Vatikanska mestna država)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Saint Vincent in Grenadini" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Britanski Deviški otoki" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Ameriški Deviški otoki" + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis in Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Jemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Južnoafriška Republika" + +#. 894 +msgid "Zambia" +msgstr "Zambija" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabve" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "" + +msgid "Car" +msgstr "Avto" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Država" + +msgid "Postal" +msgstr "Pošta" + +msgid "Town" +msgstr "Mesto" + +msgid "District" +msgstr "Regija" + +msgid "Street" +msgstr "Ulica" + +msgid "Number" +msgstr "Številka" + +msgid "Enter Destination" +msgstr "Vpišite cilj" + +msgid "Zip Code" +msgstr "Poštna številka" + +msgid "City" +msgstr "Mesto" + +msgid "District/Township" +msgstr "Regija" + +msgid "Map" +msgstr "Zemljevid" + +msgid "Bookmark" +msgstr "Zaznamek" + +msgid "Destination" +msgstr "Cilj" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Prikaz" + +msgid "_Route" +msgstr "Načrt poti" + +msgid "_Former Destinations" +msgstr "Prejšnji cilji" + +msgid "_Bookmarks" +msgstr "Zaznamki" + +msgid "_Map" +msgstr "Zemljevid" + +msgid "_Layout" +msgstr "Razporeditev" + +msgid "_Projection" +msgstr "Projekcija" + +msgid "_Vehicle" +msgstr "Vozilo" + +msgid "Zoom_Out" +msgstr "Pomanjšava" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Povečava" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Preračunaj" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Podrobnosti" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Ustavi navigacijo" + +msgid "Test" +msgstr "Preizkus" + +msgid "_Quit" +msgstr "_Izhod" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Ostani na cesti" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Načrt poti" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Celozaslonski način" + +msgid "Data" +msgstr "Podatki" + +msgid "N" +msgstr "S" + +msgid "NE" +msgstr "SV" + +msgid "E" +msgstr "V" + +msgid "SE" +msgstr "JV" + +msgid "S" +msgstr "J" + +msgid "SW" +msgstr "JZ" + +msgid "W" +msgstr "Z" + +msgid "NW" +msgstr "SZ" + +msgid "No" +msgstr "Ne" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Načrt poti %4.0fkm %02d:%02d ETA" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Načrt poti 0000km 0+00:00 ETA" + +msgid "Back to map" +msgstr "Nazaj na zemljevid" + +msgid "Main Menu" +msgstr "Glavni meni" + +msgid "Help" +msgstr "" + +msgid "Back" +msgstr "" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "" + +msgid "View in Browser" +msgstr "Prikaz v brskalniku" + +msgid "Streets" +msgstr "Ceste" + +msgid "House numbers" +msgstr "" + +msgid "View Attributes" +msgstr "Prikaz lastnosti" + +msgid "View on map" +msgstr "Prikaz na zemljevidu" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "Zaznamki" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "Zaznamuj %s" + +msgid "Former Destinations" +msgstr "Prejšnji cilji" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "" + +msgid "Layout" +msgstr "Razporeditev" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Zemljevidi" + +msgid "Show Satellite Status" +msgstr "" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "" + +msgid "car" +msgstr "" + +msgid "bike" +msgstr "" + +msgid "pedestrian" +msgstr "" + +#, c-format +msgid "Current profile: %s" +msgstr "" + +#, c-format +msgid "Change profile to: %s" +msgstr "" + +msgid "Set as active" +msgstr "" + +msgid "Show Satellite status" +msgstr "" + +msgid "Show NMEA data" +msgstr "" + +msgid "Vehicle" +msgstr "Vozilo" + +msgid "Rules" +msgstr "Pravila" + +msgid "Lock on road" +msgstr "Prikleni na cesto" + +msgid "Northing" +msgstr "Sever zgoraj" + +msgid "Map follows Vehicle" +msgstr "Zemljevid sledi vozilu" + +msgid "Message" +msgstr "" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "" + +msgid "Vehicle Position" +msgstr "Položaj vozila" + +msgid "Main menu" +msgstr "Glavni meni" + +msgid "" +"Show\n" +"Map" +msgstr "" + +msgid "Settings" +msgstr "Nastavitve" + +msgid "Tools" +msgstr "Orodja" + +msgid "Route" +msgstr "Načrt poti" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "Dejanja" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Izhod" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" + +msgid "Display" +msgstr "Prikaz" + +msgid "Fullscreen" +msgstr "Celozaslonski način" + +msgid "Window Mode" +msgstr "Okenski način" + +msgid "Description" +msgstr "" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "Čez %s zapeljite v krožišče" + +#~ msgid "Cursor" +#~ msgstr "Kurzor" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d kilometrov" diff --git a/po/sr.po.in b/po/sr.po.in new file mode 100644 index 0000000..1b35c41 --- /dev/null +++ b/po/sr.po.in @@ -0,0 +1,1763 @@ +# Serbian translation for navit +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the navit package. +# momcilo, 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-06-08 21:56+0000\n" +"Last-Translator: momcilo \n" +"Language-Team: Serbian \n" +"Language: sr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Покренут из изворног директоријума\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "постављам вредност '%s' на '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "нулти" + +msgid "first" +msgstr "прво" + +msgid "second" +msgstr "друго" + +msgid "third" +msgstr "треће" + +msgid "fourth" +msgstr "четврто" + +msgid "fifth" +msgstr "пето" + +msgid "sixth" +msgstr "шестп" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "нулти излаз" + +msgid "first exit" +msgstr "први излаз" + +msgid "second exit" +msgstr "други излаз" + +msgid "third exit" +msgstr "трећи излаз" + +msgid "fourth exit" +msgstr "четврти излаз" + +msgid "fifth exit" +msgstr "пети излаз" + +msgid "sixth exit" +msgstr "шести излаз" + +#, c-format +msgid "%d m" +msgstr "%d м" + +#, c-format +msgid "in %d m" +msgstr "за %d м" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d метара" + +#, c-format +msgid "in %d meters" +msgstr "за %d метара" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d километара" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "за %d.%d километара" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "%d километара" +msgstr[1] "%d километара" +msgstr[2] "%d километара" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "за %d километара" +msgstr[1] "за %d километара" +msgstr[2] "за %d километара" + +msgid "exit" +msgstr "излаз" + +msgid "into the ramp" +msgstr "на нагибу" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%sу улици %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%sу %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%sу %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%sу %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%sна %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "десно" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "лево" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "лако " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "јако " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "веома јако " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "непознат " + +msgid "When possible, please turn around" +msgstr "По могућству, променити смер" + +msgid "Enter the roundabout soon" +msgstr "Ускоро прелазак на обилазницу" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "потом напутстите обилазницу на %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Напуштање обилазнице за %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Прати пут до следећег %s" + +msgid "soon" +msgstr "ускоро" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Прати %1$s пут до %2$s" + +#, c-format +msgid "after %i roads" +msgstr "после %i путева" + +msgid "now" +msgstr "сад" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "потом прати пут %1$s до %2$s" + +msgid "error" +msgstr "грешка" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Скрени %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "потом скрени %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Стигли сте на одредиште %s" + +msgid "then you have reached your destination." +msgstr "потом сте стигли на Ваше одредиште." + +msgid "Position" +msgstr "Положај" + +msgid "Command" +msgstr "Наредба" + +msgid "Length" +msgstr "Дужина" + +msgid "km" +msgstr "км" + +msgid "m" +msgstr "м" + +msgid "Time" +msgstr "Време" + +msgid "Destination Length" +msgstr "Одредишна дужина" + +msgid "Destination Time" +msgstr "Одредишно време" + +msgid "Roadbook" +msgstr "План пута" + +msgid "Set as position" +msgstr "Постави као позицију" + +msgid "Set as destination" +msgstr "Постави као одредиште" + +msgid "Add as bookmark" +msgstr "Додај као пречицу" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Тачка 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Екранске координате: %d %d" + +#. 020 +msgid "Andorra" +msgstr "Андора" + +#. 784 +msgid "United Arab Emirates" +msgstr "Уједињени Арапски Емирати" + +#. 004 +msgid "Afghanistan" +msgstr "Авганистан" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Антигва и Барбуда" + +#. 660 +msgid "Anguilla" +msgstr "Ангвила" + +#. 008 +msgid "Albania" +msgstr "Албанија" + +#. 051 +msgid "Armenia" +msgstr "Јерменија" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Холандски Антили" + +#. 024 +msgid "Angola" +msgstr "Ангола" + +#. 010 +msgid "Antarctica" +msgstr "Антарктик" + +#. 032 +msgid "Argentina" +msgstr "Аргентина" + +#. 016 +msgid "American Samoa" +msgstr "Америчка Самоа" + +#. 040 +msgid "Austria" +msgstr "Аустрија" + +#. 036 +msgid "Australia" +msgstr "Аустралија" + +#. 533 +msgid "Aruba" +msgstr "Аруба" + +#. 248 +msgid "Aland Islands" +msgstr "Оландска острва" + +#. 031 +msgid "Azerbaijan" +msgstr "Азербејџан" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Босна и Херцеговина" + +#. 052 +msgid "Barbados" +msgstr "Барбадос" + +#. 050 +msgid "Bangladesh" +msgstr "Бангладеш" + +#. 056 +msgid "Belgium" +msgstr "Белгија" + +#. 854 +msgid "Burkina Faso" +msgstr "Буркина Фасо" + +#. 100 +msgid "Bulgaria" +msgstr "Бугарска" + +#. 048 +msgid "Bahrain" +msgstr "Бахреин" + +#. 108 +msgid "Burundi" +msgstr "Бурунди" + +#. 204 +msgid "Benin" +msgstr "Бенин" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Свети Бартоломеј" + +#. 060 +msgid "Bermuda" +msgstr "Бермуди" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Брунеј" + +#. 068 +msgid "Bolivia" +msgstr "Боливија" + +#. 076 +msgid "Brazil" +msgstr "Бразил" + +#. 044 +msgid "Bahamas" +msgstr "Бахами" + +#. 064 +msgid "Bhutan" +msgstr "Бутан" + +#. 074 +msgid "Bouvet Island" +msgstr "Бувеова острва" + +#. 072 +msgid "Botswana" +msgstr "Боцвана" + +#. 112 +msgid "Belarus" +msgstr "Белорусија" + +#. 084 +msgid "Belize" +msgstr "Белизе" + +#. 124 +msgid "Canada" +msgstr "Канада" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Kokosova ostrva" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Демократска република Конго" + +#. 140 +msgid "Central African Republic" +msgstr "Централноафричка Република" + +#. 178 +msgid "Congo" +msgstr "Конго" + +#. 756 +msgid "Switzerland" +msgstr "Швајцарска" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Обала Слоноваче" + +#. 184 +msgid "Cook Islands" +msgstr "Кукова острва" + +#. 152 +msgid "Chile" +msgstr "Чиле" + +#. 120 +msgid "Cameroon" +msgstr "Камерун" + +#. 156 +msgid "China" +msgstr "Кина" + +#. 170 +msgid "Colombia" +msgstr "Колумбија" + +#. 188 +msgid "Costa Rica" +msgstr "Костарика" + +#. 192 +msgid "Cuba" +msgstr "Куба" + +#. 132 +msgid "Cape Verde" +msgstr "Зеленортска острва" + +#. 162 +msgid "Christmas Island" +msgstr "Божићна острва" + +#. 196 +msgid "Cyprus" +msgstr "Кипар" + +#. 203 +msgid "Czech Republic" +msgstr "Чешка" + +#. 276 +msgid "Germany" +msgstr "Немачка" + +#. 262 +msgid "Djibouti" +msgstr "Џибути" + +#. 208 +msgid "Denmark" +msgstr "Данска" + +#. 212 +msgid "Dominica" +msgstr "Доминика" + +#. 214 +msgid "Dominican Republic" +msgstr "Доминиканска Република" + +#. 012 +msgid "Algeria" +msgstr "Алжир" + +#. 218 +msgid "Ecuador" +msgstr "Еквадор" + +#. 233 +msgid "Estonia" +msgstr "Естонија" + +#. 818 +msgid "Egypt" +msgstr "Египат" + +#. 732 +msgid "Western Sahara" +msgstr "Западна Сахара" + +#. 232 +msgid "Eritrea" +msgstr "Еритреја" + +#. 724 +msgid "Spain" +msgstr "Шпанија" + +#. 231 +msgid "Ethiopia" +msgstr "Етиопија" + +#. 246 +msgid "Finland" +msgstr "Финска" + +#. 242 +msgid "Fiji" +msgstr "Фиџи" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Фокландска острва (Малвини)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Микронезија, Федеративне државе" + +#. 234 +msgid "Faroe Islands" +msgstr "Фарска острва" + +#. 250 +msgid "France" +msgstr "Француска" + +#. 266 +msgid "Gabon" +msgstr "Габон" + +#. 826 +msgid "United Kingdom" +msgstr "Уједињено краљевство" + +#. 308 +msgid "Grenada" +msgstr "Гренада" + +#. 268 +msgid "Georgia" +msgstr "Грузија" + +#. 254 +msgid "French Guiana" +msgstr "Француска Гвајана" + +#. 831 +msgid "Guernsey" +msgstr "Генрзи" + +#. 288 +msgid "Ghana" +msgstr "Гана" + +#. 292 +msgid "Gibraltar" +msgstr "Гибралтар" + +#. 304 +msgid "Greenland" +msgstr "Гренланд" + +#. 270 +msgid "Gambia" +msgstr "Гамбија" + +#. 324 +msgid "Guinea" +msgstr "Гвинеја" + +#. 312 +msgid "Guadeloupe" +msgstr "Гваделуп" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Екваторијална Гвинеја" + +#. 300 +msgid "Greece" +msgstr "Грчка" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Јужна Џорџија и Јужна Сендвичка острва" + +#. 320 +msgid "Guatemala" +msgstr "Гватемала" + +#. 316 +msgid "Guam" +msgstr "Гуам" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Гвинеја Бисао" + +#. 328 +msgid "Guyana" +msgstr "Гвајана" + +#. 344 +msgid "Hong Kong" +msgstr "Хонг Конг" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Херд острво и Мекдоналд острва" + +#. 340 +msgid "Honduras" +msgstr "Хондурас" + +#. 191 +msgid "Croatia" +msgstr "Хрватска" + +#. 332 +msgid "Haiti" +msgstr "Хаити" + +#. 348 +msgid "Hungary" +msgstr "Мађарска" + +#. 360 +msgid "Indonesia" +msgstr "Индонезија" + +#. 372 +msgid "Ireland" +msgstr "Ирска" + +#. 376 +msgid "Israel" +msgstr "Израел" + +#. 833 +msgid "Isle of Man" +msgstr "Острво Ман" + +#. 356 +msgid "India" +msgstr "Индија" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Британска Индијска Океанска Територија" + +#. 368 +msgid "Iraq" +msgstr "Ирак" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Иран, Исламска Република" + +#. 352 +msgid "Iceland" +msgstr "Исланд" + +#. 380 +msgid "Italy" +msgstr "Италија" + +#. 832 +msgid "Jersey" +msgstr "Џерси" + +#. 388 +msgid "Jamaica" +msgstr "Јамајка" + +#. 400 +msgid "Jordan" +msgstr "Јордан" + +#. 392 +msgid "Japan" +msgstr "Јапан" + +#. 404 +msgid "Kenya" +msgstr "Кенија" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Киргистан" + +#. 116 +msgid "Cambodia" +msgstr "Камбоџа" + +#. 296 +msgid "Kiribati" +msgstr "Кирибати" + +#. 174 +msgid "Comoros" +msgstr "Комори" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Свети Китс и Невис" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Кореја, Демократска Народна Република" + +#. 410 +msgid "Korea, Republic of" +msgstr "Република Кореја" + +#. 414 +msgid "Kuwait" +msgstr "Кувајт" + +#. 136 +msgid "Cayman Islands" +msgstr "Кајманска острва" + +#. 398 +msgid "Kazakhstan" +msgstr "Казахстан" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Лаос" + +#. 422 +msgid "Lebanon" +msgstr "Либан" + +#. 662 +msgid "Saint Lucia" +msgstr "Света Луција" + +#. 438 +msgid "Liechtenstein" +msgstr "Лихтенштајн" + +#. 144 +msgid "Sri Lanka" +msgstr "Шри Ланка" + +#. 430 +msgid "Liberia" +msgstr "Либерија" + +#. 426 +msgid "Lesotho" +msgstr "Лесото" + +#. 440 +msgid "Lithuania" +msgstr "Литванија" + +#. 442 +msgid "Luxembourg" +msgstr "Луксембург" + +#. 428 +msgid "Latvia" +msgstr "Летонија" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Либија Арапска Џамахирија" + +#. 504 +msgid "Morocco" +msgstr "Мароко" + +#. 492 +msgid "Monaco" +msgstr "Монако" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Молдавија, Република" + +#. 499 +msgid "Montenegro" +msgstr "Црна Гора" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Свети Мартин (француски део)" + +#. 450 +msgid "Madagascar" +msgstr "Мадагаскар" + +#. 584 +msgid "Marshall Islands" +msgstr "Маршалска острва" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Македонија" + +#. 466 +msgid "Mali" +msgstr "Мали" + +#. 104 +msgid "Myanmar" +msgstr "Мијанмар" + +#. 496 +msgid "Mongolia" +msgstr "Монголија" + +#. 446 +msgid "Macao" +msgstr "Макао" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Северна Маријанска острва" + +#. 474 +msgid "Martinique" +msgstr "Мартиник" + +#. 478 +msgid "Mauritania" +msgstr "Мауританија" + +#. 500 +msgid "Montserrat" +msgstr "Монсерат" + +#. 470 +msgid "Malta" +msgstr "Малта" + +#. 480 +msgid "Mauritius" +msgstr "Маурицијус" + +#. 462 +msgid "Maldives" +msgstr "Малдиви" + +#. 454 +msgid "Malawi" +msgstr "Малави" + +#. 484 +msgid "Mexico" +msgstr "Мексико" + +#. 458 +msgid "Malaysia" +msgstr "Малезија" + +#. 508 +msgid "Mozambique" +msgstr "Мозамбик" + +#. 516 +msgid "Namibia" +msgstr "Намибија" + +#. 540 +msgid "New Caledonia" +msgstr "Нова Каледонија" + +#. 562 +msgid "Niger" +msgstr "Нигер" + +#. 574 +msgid "Norfolk Island" +msgstr "Острво Норфок" + +#. 566 +msgid "Nigeria" +msgstr "Нигерија" + +#. 558 +msgid "Nicaragua" +msgstr "Никарагва" + +#. 528 +msgid "Netherlands" +msgstr "Холандија" + +#. 578 +msgid "Norway" +msgstr "Норвешка" + +#. 524 +msgid "Nepal" +msgstr "Непал" + +#. 520 +msgid "Nauru" +msgstr "Науру" + +#. 570 +msgid "Niue" +msgstr "Нијуе" + +#. 554 +msgid "New Zealand" +msgstr "Нови Зеланд" + +#. 512 +msgid "Oman" +msgstr "Оман" + +#. 591 +msgid "Panama" +msgstr "Панама" + +#. 604 +msgid "Peru" +msgstr "Перу" + +#. 258 +msgid "French Polynesia" +msgstr "Француска Полинезија" + +#. 598 +msgid "Papua New Guinea" +msgstr "Папуа Нова Гвинеја" + +#. 608 +msgid "Philippines" +msgstr "Филипини" + +#. 586 +msgid "Pakistan" +msgstr "Пакистан" + +#. 616 +msgid "Poland" +msgstr "Пољска" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Свети Пјер и Микелон" + +#. 612 +msgid "Pitcairn" +msgstr "Острва Питкерн" + +#. 630 +msgid "Puerto Rico" +msgstr "Порторико" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Палестинска Територија, Окупирана" + +#. 620 +msgid "Portugal" +msgstr "Португал" + +#. 585 +msgid "Palau" +msgstr "Палау" + +#. 600 +msgid "Paraguay" +msgstr "Парагвај" + +#. 634 +msgid "Qatar" +msgstr "Катар" + +#. 638 +msgid "Reunion" +msgstr "Реинион" + +#. 642 +msgid "Romania" +msgstr "Румунија" + +#. 688 +msgid "Serbia" +msgstr "Србија" + +#. 643 +msgid "Russian Federation" +msgstr "Руска федерација" + +#. 646 +msgid "Rwanda" +msgstr "Руанда" + +#. 682 +msgid "Saudi Arabia" +msgstr "Саудијска Арабија" + +#. 090 +msgid "Solomon Islands" +msgstr "Соломонска острва" + +#. 690 +msgid "Seychelles" +msgstr "Сејшели" + +#. 736 +msgid "Sudan" +msgstr "Судан" + +#. 752 +msgid "Sweden" +msgstr "Шведска" + +#. 702 +msgid "Singapore" +msgstr "Сингапур" + +#. 654 +msgid "Saint Helena" +msgstr "Света Јелена" + +#. 705 +msgid "Slovenia" +msgstr "Словенија" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Свалбард и Јан Мајен" + +#. 703 +msgid "Slovakia" +msgstr "Словачка" + +#. 694 +msgid "Sierra Leone" +msgstr "Сијера Леоне" + +#. 674 +msgid "San Marino" +msgstr "Сан Марино" + +#. 686 +msgid "Senegal" +msgstr "Сенегал" + +#. 706 +msgid "Somalia" +msgstr "Сомалија" + +#. 740 +msgid "Suriname" +msgstr "Суринам" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Сао Томе и Принципе" + +#. 222 +msgid "El Salvador" +msgstr "Салвадор" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Сиријска арапска република" + +#. 748 +msgid "Swaziland" +msgstr "Свазиленд" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Туркс и Кајкос" + +#. 148 +msgid "Chad" +msgstr "Чад" + +#. 260 +msgid "French Southern Territories" +msgstr "Француске jужне tериторије" + +#. 768 +msgid "Togo" +msgstr "Того" + +#. 764 +msgid "Thailand" +msgstr "Тајланд" + +#. 762 +msgid "Tajikistan" +msgstr "Таџикистан" + +#. 772 +msgid "Tokelau" +msgstr "Токелау" + +#. 626 +msgid "Timor-Leste" +msgstr "Источни Тимор" + +#. 795 +msgid "Turkmenistan" +msgstr "Туркменистан" + +#. 788 +msgid "Tunisia" +msgstr "Тунис" + +#. 776 +msgid "Tonga" +msgstr "Тонга" + +#. 792 +msgid "Turkey" +msgstr "Турска" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Тринидад и Тобаго" + +#. 798 +msgid "Tuvalu" +msgstr "Тувалу" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Тајван, Кинеска Провинција" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Танзанија, Уједињена република" + +#. 804 +msgid "Ukraine" +msgstr "Украјна" + +#. 800 +msgid "Uganda" +msgstr "Уганда" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Спољна ивична острва САД" + +#. 840 +msgid "United States" +msgstr "Sjedinjene Američke Države" + +#. 858 +msgid "Uruguay" +msgstr "Уругвај" + +#. 860 +msgid "Uzbekistan" +msgstr "Узбекистан" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Ватикан" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Свети Винсент и Гренадини" + +#. 862 +msgid "Venezuela" +msgstr "Венецуела" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Девичанска острва, Британска" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Девичанска острва, САД" + +#. 704 +msgid "Viet Nam" +msgstr "Вијетнам" + +#. 548 +msgid "Vanuatu" +msgstr "Вануату" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Валис и Футуна" + +#. 882 +msgid "Samoa" +msgstr "Самоа" + +#. 887 +msgid "Yemen" +msgstr "Јемен" + +#. 175 +msgid "Mayotte" +msgstr "Мајот" + +#. 710 +msgid "South Africa" +msgstr "Јужноафричка република" + +#. 894 +msgid "Zambia" +msgstr "Замбија" + +#. 716 +msgid "Zimbabwe" +msgstr "Зимбабве" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Непознато, додај is_in таг у ове градове" + +msgid "Car" +msgstr "Кола" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Држава" + +msgid "Postal" +msgstr "Поштански" + +msgid "Town" +msgstr "Град" + +msgid "District" +msgstr "Општина" + +msgid "Street" +msgstr "Улица" + +msgid "Number" +msgstr "Број" + +msgid "Enter Destination" +msgstr "Унесите одредиште" + +msgid "Zip Code" +msgstr "Поштански број" + +msgid "City" +msgstr "Град" + +msgid "District/Township" +msgstr "Општрина/Град" + +msgid "Map" +msgstr "Карта" + +msgid "Bookmark" +msgstr "Обележивач" + +msgid "Destination" +msgstr "Одредиште" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Приказ" + +msgid "_Route" +msgstr "рута" + +msgid "_Former Destinations" +msgstr "Претходна одредишта" + +msgid "_Bookmarks" +msgstr "Обележивачи" + +msgid "_Map" +msgstr "Карта" + +msgid "_Layout" +msgstr "Распоред" + +msgid "_Projection" +msgstr "Пројекција" + +msgid "_Vehicle" +msgstr "Возило" + +msgid "Zoom_Out" +msgstr "Умањи" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Увећај" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Прерачунај" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Подаци" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Заустави навигацију" + +msgid "Test" +msgstr "Проба" + +msgid "_Quit" +msgstr "_Изађи" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Прати пут" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "План пута" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Аутоматски увећавање" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Цео екран" + +msgid "Data" +msgstr "Подаци" + +msgid "N" +msgstr "С" + +msgid "NE" +msgstr "СИ" + +msgid "E" +msgstr "И" + +msgid "SE" +msgstr "ЈИ" + +msgid "S" +msgstr "Ј" + +msgid "SW" +msgstr "ЈЗ" + +msgid "W" +msgstr "З" + +msgid "NW" +msgstr "СЗ" + +msgid "No" +msgstr "Не" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3Д" + +msgid "OT" +msgstr "ОТ" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Рута %4.0fкм %02d:%02d ПВД" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Рута 0000км 0+00:00 ПВД" + +msgid "Back to map" +msgstr "Назад на мапу" + +msgid "Main Menu" +msgstr "Главни мени" + +msgid "Help" +msgstr "Помоћ" + +msgid "Back" +msgstr "Назад" + +msgid "Add Bookmark" +msgstr "Додавање обележивача" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "Додај фолдер са обележивачима" + +msgid "Rename" +msgstr "Преименуј" + +msgid "POIs" +msgstr "Тачке интересовања" + +msgid "View in Browser" +msgstr "Погледај у претраживачу" + +msgid "Streets" +msgstr "Улице" + +msgid "House numbers" +msgstr "Кућни бројеви" + +msgid "View Attributes" +msgstr "Преглед особина" + +msgid "View on map" +msgstr "Погледај на мапи" + +msgid "Cut Bookmark" +msgstr "Исеци обележивач" + +msgid "Copy Bookmark" +msgstr "Умножи обележивач" + +msgid "Rename Bookmark" +msgstr "Преименуј обележивач" + +msgid "Paste Bookmark" +msgstr "Прилепи обележивач" + +msgid "Delete Bookmark" +msgstr "Обриши обележивач" + +msgid "Bookmarks" +msgstr "Обележивачи" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Прилепи обележивач" + +#, c-format +msgid "Bookmark %s" +msgstr "Обележи %s" + +msgid "Former Destinations" +msgstr "Претходна одредишта" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Кућни број" + +msgid "Layout" +msgstr "Распоред" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Мапе" + +msgid "Show Satellite Status" +msgstr "Прикажи стање сателита" + +msgid " Elevation " +msgstr " Висина " + +msgid " Azimuth " +msgstr " Азимут " + +msgid "Show NMEA Data" +msgstr "Приказ NMEA података" + +msgid "car" +msgstr "кола" + +msgid "bike" +msgstr "бицикл" + +msgid "pedestrian" +msgstr "пешак" + +#, c-format +msgid "Current profile: %s" +msgstr "Тренутни профил: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Примени профил: %s" + +msgid "Set as active" +msgstr "Примени као активан" + +msgid "Show Satellite status" +msgstr "Прикажи стање сателита" + +msgid "Show NMEA data" +msgstr "Прикажи NMEA податке" + +msgid "Vehicle" +msgstr "Возило" + +msgid "Rules" +msgstr "Правила" + +msgid "Lock on road" +msgstr "Прати пут" + +msgid "Northing" +msgstr "Ништа" + +msgid "Map follows Vehicle" +msgstr "Мапа прати возило" + +msgid "Message" +msgstr "Порука" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Опис руте" + +msgid "Height Profile" +msgstr "Висински профил" + +msgid "Show Locale" +msgstr "Прикажи име локализације" + +msgid "About Navit" +msgstr "О програму Навит" + +#. Authors +msgid "By" +msgstr "Од" + +#. Contributors +msgid "And all the Navit Team" +msgstr "И цео Navit тим" + +msgid "members and contributors." +msgstr "чланови и доприносиоци" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Тачка на мапи" + +msgid "Vehicle Position" +msgstr "Позиција возила" + +msgid "Main menu" +msgstr "Главни мени" + +msgid "" +"Show\n" +"Map" +msgstr "Прикажи мапу" + +msgid "Settings" +msgstr "Подешавања" + +msgid "Tools" +msgstr "Алати" + +msgid "Route" +msgstr "рута" + +msgid "About" +msgstr "O" + +msgid "Actions" +msgstr "Поступци" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Заврши" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Заустави\n" +"навигацију" + +msgid "Display" +msgstr "Приказ" + +msgid "Fullscreen" +msgstr "Цео екран" + +msgid "Window Mode" +msgstr "Режим прозора" + +msgid "Description" +msgstr "Опис" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "коњ" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "За %s, прелазак на обилазницу" + +#~ msgid "Cursor" +#~ msgstr "Курсор" diff --git a/po/sv.po.in b/po/sv.po.in new file mode 100644 index 0000000..bcd81f8 --- /dev/null +++ b/po/sv.po.in @@ -0,0 +1,1763 @@ +# Swedish translation for navit +# Copyright (c) 2008 The Navit Team +# This file is distributed under the same license as the navit package. +# Pipatron , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-05-18 12:27+0000\n" +"Last-Translator: KaZeR \n" +"Language-Team: Swedish \n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Körs från källkodsbiblioteket\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "sätter '%s' till '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "nollte" + +msgid "first" +msgstr "första" + +msgid "second" +msgstr "andra" + +msgid "third" +msgstr "tredje" + +msgid "fourth" +msgstr "fjärde" + +msgid "fifth" +msgstr "femte" + +msgid "sixth" +msgstr "sjätte" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "ingen avfart" + +msgid "first exit" +msgstr "första avfarten" + +msgid "second exit" +msgstr "andra avfarten" + +msgid "third exit" +msgstr "tredje avfarten" + +msgid "fourth exit" +msgstr "fjärde avfarten" + +msgid "fifth exit" +msgstr "femte avfarten" + +msgid "sixth exit" +msgstr "sjätte avfarten" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "om %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d meter" + +#, c-format +msgid "in %d meters" +msgstr "om %d meter" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "om %d,%d kilometer" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "en kilometer" +msgstr[1] "%d kilometer" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "om en kilometer" +msgstr[1] "om %d kilometer" + +msgid "exit" +msgstr "avfart" + +msgid "into the ramp" +msgstr "ut på påfarten" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%sin på gatan %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%sin på %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%sin på %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%sin på %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%sut på %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "höger" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "vänster" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "lätt " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "tvärt " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "mycket tvärt " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "okänd " + +msgid "When possible, please turn around" +msgstr "Vänd när det går" + +msgid "Enter the roundabout soon" +msgstr "Kör snart in i rondellen" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "kör sedan ut ur rondellen mot %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Kör ut ur rondellen mot %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Följ vägen i %s" + +msgid "soon" +msgstr "snart" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Ta %1$s vägen mot %2$s" + +#, c-format +msgid "after %i roads" +msgstr "efter %i vägar" + +msgid "now" +msgstr "nu" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "ta sedan %1$s vägen mot %2$s" + +msgid "error" +msgstr "fel" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Sväng %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "sväng sedan %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Du har nått din destination %s" + +msgid "then you have reached your destination." +msgstr "sedan har du nått din destination." + +msgid "Position" +msgstr "Position" + +msgid "Command" +msgstr "Kommando" + +msgid "Length" +msgstr "Sträcka" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Tid" + +msgid "Destination Length" +msgstr "Sträcka kvar" + +msgid "Destination Time" +msgstr "Restid" + +msgid "Roadbook" +msgstr "Vägbok" + +msgid "Set as position" +msgstr "Ange som position" + +msgid "Set as destination" +msgstr "Ange som destination" + +msgid "Add as bookmark" +msgstr "Lägg till som bokmärke" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Punkt 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Skärm koordinat : %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Förenade Arabemiraten" + +#. 004 +msgid "Afghanistan" +msgstr "Afghanistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua och Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albanien" + +#. 051 +msgid "Armenia" +msgstr "Armenien" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Nederländska Antillerna" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarktis" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "Amerikanska Samoa" + +#. 040 +msgid "Austria" +msgstr "Österrike" + +#. 036 +msgid "Australia" +msgstr "Australien" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Åland" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbajdzjan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnien-Hercegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesh" + +#. 056 +msgid "Belgium" +msgstr "Belgien" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgarien" + +#. 048 +msgid "Bahrain" +msgstr "Bahrain" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint-Barthélemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Brunei" + +#. 068 +msgid "Bolivia" +msgstr "Bolivia" + +#. 076 +msgid "Brazil" +msgstr "Brasilien" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "Bhutan" + +#. 074 +msgid "Bouvet Island" +msgstr "Bouvetön" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Vitryssland" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Kanada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Kokosöarna" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Kongo, Demokratiska republiken" + +#. 140 +msgid "Central African Republic" +msgstr "Centralafrikanska republiken" + +#. 178 +msgid "Congo" +msgstr "Kongo" + +#. 756 +msgid "Switzerland" +msgstr "Schweiz" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Elfenbenskusten" + +#. 184 +msgid "Cook Islands" +msgstr "Cooköarna" + +#. 152 +msgid "Chile" +msgstr "Chile" + +#. 120 +msgid "Cameroon" +msgstr "Kamerun" + +#. 156 +msgid "China" +msgstr "Kina" + +#. 170 +msgid "Colombia" +msgstr "Colombia" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Kuba" + +#. 132 +msgid "Cape Verde" +msgstr "Kap Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Julön" + +#. 196 +msgid "Cyprus" +msgstr "Cypern" + +#. 203 +msgid "Czech Republic" +msgstr "Tjeckien" + +#. 276 +msgid "Germany" +msgstr "Tyskland" + +#. 262 +msgid "Djibouti" +msgstr "Djibouti" + +#. 208 +msgid "Denmark" +msgstr "Danmark" + +#. 212 +msgid "Dominica" +msgstr "Dominica" + +#. 214 +msgid "Dominican Republic" +msgstr "Dominikanska republiken" + +#. 012 +msgid "Algeria" +msgstr "Algeriet" + +#. 218 +msgid "Ecuador" +msgstr "Ecuador" + +#. 233 +msgid "Estonia" +msgstr "Estland" + +#. 818 +msgid "Egypt" +msgstr "Egypten" + +#. 732 +msgid "Western Sahara" +msgstr "Västsahara" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Spanien" + +#. 231 +msgid "Ethiopia" +msgstr "Etiopien" + +#. 246 +msgid "Finland" +msgstr "Finland" + +#. 242 +msgid "Fiji" +msgstr "Fiji" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falklandsöarna" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Mikronesien, federala staterna" + +#. 234 +msgid "Faroe Islands" +msgstr "Färöarna" + +#. 250 +msgid "France" +msgstr "Frankrike" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Storbritannien" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Georgien" + +#. 254 +msgid "French Guiana" +msgstr "Franska Guyana" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Grönland" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Ekvatorialguinea" + +#. 300 +msgid "Greece" +msgstr "Grekland" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Sydgeorgien och Sydsandwichöarna" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heard- och McDonaldsöarna" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Kroatien" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Ungern" + +#. 360 +msgid "Indonesia" +msgstr "Indonesien" + +#. 372 +msgid "Ireland" +msgstr "Irland" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "Isle of Man" + +#. 356 +msgid "India" +msgstr "Indien" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Brittiska territoriet i Indiska Oceanen" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iran, islamiska republiken" + +#. 352 +msgid "Iceland" +msgstr "Island" + +#. 380 +msgid "Italy" +msgstr "Italien" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaica" + +#. 400 +msgid "Jordan" +msgstr "Jordanien" + +#. 392 +msgid "Japan" +msgstr "Japan" + +#. 404 +msgid "Kenya" +msgstr "Kenya" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kirgizistan" + +#. 116 +msgid "Cambodia" +msgstr "Kambodja" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Komorerna" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Saint Kitts och Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Korea, demokratiska folkrepubliken" + +#. 410 +msgid "Korea, Republic of" +msgstr "Korea, Republiken" + +#. 414 +msgid "Kuwait" +msgstr "Kuwait" + +#. 136 +msgid "Cayman Islands" +msgstr "Caymanöarna" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazakstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Demokratiska folkrepubliken Laos" + +#. 422 +msgid "Lebanon" +msgstr "Libanon" + +#. 662 +msgid "Saint Lucia" +msgstr "Saint Lucia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberia" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Litauen" + +#. 442 +msgid "Luxembourg" +msgstr "Luxemburg" + +#. 428 +msgid "Latvia" +msgstr "Lettland" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libyen" + +#. 504 +msgid "Morocco" +msgstr "Marocko" + +#. 492 +msgid "Monaco" +msgstr "Monaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldavien, republiken" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Saint Martin (Franksa delen)" + +#. 450 +msgid "Madagascar" +msgstr "Madagaskar" + +#. 584 +msgid "Marshall Islands" +msgstr "Marshallöarna" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Makedonien, republiken" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Burma (Myanmar)" + +#. 496 +msgid "Mongolia" +msgstr "Mongoliet" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Nordmarianerna" + +#. 474 +msgid "Martinique" +msgstr "Martinique" + +#. 478 +msgid "Mauritania" +msgstr "Mauretanien" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauritius" + +#. 462 +msgid "Maldives" +msgstr "Maldiverna" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mexiko" + +#. 458 +msgid "Malaysia" +msgstr "Malaysia" + +#. 508 +msgid "Mozambique" +msgstr "Moçambique" + +#. 516 +msgid "Namibia" +msgstr "Namibia" + +#. 540 +msgid "New Caledonia" +msgstr "Nya Kaledonien" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolkön" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nicaragua" + +#. 528 +msgid "Netherlands" +msgstr "Nederländerna" + +#. 578 +msgid "Norway" +msgstr "Norge" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Nya Zeeland" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Franska Polynesien" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua Nya Guinea" + +#. 608 +msgid "Philippines" +msgstr "Filippinerna" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Polen" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint Pierre och Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestinska självstyret" + +#. 620 +msgid "Portugal" +msgstr "Portugal" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Qatar" + +#. 638 +msgid "Reunion" +msgstr "Reunion" + +#. 642 +msgid "Romania" +msgstr "Rumänien" + +#. 688 +msgid "Serbia" +msgstr "Serbien" + +#. 643 +msgid "Russian Federation" +msgstr "Ryssland" + +#. 646 +msgid "Rwanda" +msgstr "Rwanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Saudiarabien" + +#. 090 +msgid "Solomon Islands" +msgstr "Salomonöarna" + +#. 690 +msgid "Seychelles" +msgstr "Seychellerna" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Sverige" + +#. 702 +msgid "Singapore" +msgstr "Singapore" + +#. 654 +msgid "Saint Helena" +msgstr "Sankta Helena" + +#. 705 +msgid "Slovenia" +msgstr "Slovenien" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard och Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slovakien" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalia" + +#. 740 +msgid "Suriname" +msgstr "Surinam" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "São Tomé och Príncipe" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Syrien" + +#. 748 +msgid "Swaziland" +msgstr "Swaziland" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turks- och Caicosöarna" + +#. 148 +msgid "Chad" +msgstr "Tchad" + +#. 260 +msgid "French Southern Territories" +msgstr "Franska sydterritorierna" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Thailand" + +#. 762 +msgid "Tajikistan" +msgstr "Tadzjikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Östtimor" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunisien" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Turkiet" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad och Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Taiwan, provins i Kina" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzania" + +#. 804 +msgid "Ukraine" +msgstr "Ukraina" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Förenta staternas avlägset belägna öar" + +#. 840 +msgid "United States" +msgstr "USA" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Vatikanstaten" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Saint Vincent och Grenadinerna" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Jungfruöarna, brittiska" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Jungfruöarna, amerikanska" + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis och Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Jemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Sydafrika" + +#. 894 +msgid "Zambia" +msgstr "Zambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Okänt, lägg till is_in-taggar till dessa städer" + +msgid "Car" +msgstr "Bil" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Land" + +msgid "Postal" +msgstr "Post" + +msgid "Town" +msgstr "Stad" + +msgid "District" +msgstr "Distrikt" + +msgid "Street" +msgstr "Gata" + +msgid "Number" +msgstr "Nummer" + +msgid "Enter Destination" +msgstr "Ange destination" + +msgid "Zip Code" +msgstr "Postnummer" + +msgid "City" +msgstr "Stad" + +msgid "District/Township" +msgstr "Distrikt" + +msgid "Map" +msgstr "Karta" + +msgid "Bookmark" +msgstr "Bokmärke" + +msgid "Destination" +msgstr "Destination" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Visa" + +msgid "_Route" +msgstr "Rutt" + +msgid "_Former Destinations" +msgstr "Tidigare destinationer" + +msgid "_Bookmarks" +msgstr "Bokmärken" + +msgid "_Map" +msgstr "Karta" + +msgid "_Layout" +msgstr "Layout" + +msgid "_Projection" +msgstr "Projektion" + +msgid "_Vehicle" +msgstr "Fordon" + +msgid "Zoom_Out" +msgstr "Zooma ut" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Zooma in" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Gör ny beräkning" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Info" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Avsluta navigering" + +msgid "Test" +msgstr "Testa" + +msgid "_Quit" +msgstr "_Avsluta" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Lås till vägen" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Vägbok" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Autozoom" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Helskärm" + +msgid "Data" +msgstr "Data" + +msgid "N" +msgstr "N" + +msgid "NE" +msgstr "NÖ" + +msgid "E" +msgstr "Ö" + +msgid "SE" +msgstr "SÖ" + +msgid "S" +msgstr "S" + +msgid "SW" +msgstr "SV" + +msgid "W" +msgstr "V" + +msgid "NW" +msgstr "NV" + +msgid "No" +msgstr "Nej" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Rutt %4.0fkm %02d:%02d Ankomsttid" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Rutt 0000km 0+00:00 Ankomsttid" + +msgid "Back to map" +msgstr "Tillbaka till kartan" + +msgid "Main Menu" +msgstr "Huvudmeny" + +msgid "Help" +msgstr "Hjälp" + +msgid "Back" +msgstr "Tillbaka" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "Intressepunkter" + +msgid "View in Browser" +msgstr "Visa i webbläsare" + +msgid "Streets" +msgstr "Gator" + +msgid "House numbers" +msgstr "Husnummer" + +msgid "View Attributes" +msgstr "Visa attribut" + +msgid "View on map" +msgstr "Visa på karta" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "Bokmärken" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "Bokmärk %s" + +msgid "Former Destinations" +msgstr "Tidigare destinationer" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Husnummer" + +msgid "Layout" +msgstr "Layout" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Kartor" + +msgid "Show Satellite Status" +msgstr "Visa satellitstatus" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "Visa NMEA-data" + +msgid "car" +msgstr "bil" + +msgid "bike" +msgstr "cykel" + +msgid "pedestrian" +msgstr "fotgängare" + +#, c-format +msgid "Current profile: %s" +msgstr "Aktuell profil: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Byt profil till: %s" + +msgid "Set as active" +msgstr "Sätt som aktiv" + +msgid "Show Satellite status" +msgstr "Visa satellitstatus" + +msgid "Show NMEA data" +msgstr "Visa NMEA-data" + +msgid "Vehicle" +msgstr "Fordon" + +msgid "Rules" +msgstr "Regler" + +msgid "Lock on road" +msgstr "Lås till väg" + +msgid "Northing" +msgstr "Håll norr uppåt" + +msgid "Map follows Vehicle" +msgstr "Kartan följer fordonet" + +msgid "Message" +msgstr "Meddelande" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "Höjdprofil" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Kartpunkt" + +msgid "Vehicle Position" +msgstr "Fordonsposition" + +msgid "Main menu" +msgstr "Huvudmeny" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Visa\n" +"Karta" + +msgid "Settings" +msgstr "Inställningar" + +msgid "Tools" +msgstr "Verktyg" + +msgid "Route" +msgstr "Rutt" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "Åtgärder" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Avsluta" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Stoppa\n" +"Navigering" + +msgid "Display" +msgstr "Visa" + +msgid "Fullscreen" +msgstr "Helskärm" + +msgid "Window Mode" +msgstr "Fönsterläge" + +msgid "Description" +msgstr "Beskrivning" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "Om %s, kör in i rondellen" + +#~ msgid "Cursor" +#~ msgstr "Markör" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d,%d kilometer" diff --git a/po/ta.po.in b/po/ta.po.in new file mode 100644 index 0000000..455da99 --- /dev/null +++ b/po/ta.po.in @@ -0,0 +1,1750 @@ +# Tamil translation for navit +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the navit package. +# Dinesh Ramalingam, 2010 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-07-07 20:13+0000\n" +"Last-Translator: Dinesh Ramalingam \n" +"Language-Team: Tamil \n" +"Language: ta\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "'%s', '%s' ஆக மாற்றபடுகின்றது\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "" + +msgid "first" +msgstr "முதல்" + +msgid "second" +msgstr "இரண்டாவது" + +msgid "third" +msgstr "மூன்றாவது" + +msgid "fourth" +msgstr "நான்காவது" + +msgid "fifth" +msgstr "ஐந்தாவது" + +msgid "sixth" +msgstr "ஆறாவது" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "" + +msgid "first exit" +msgstr "முதல் வெளியேற்றம்" + +msgid "second exit" +msgstr "இரண்டாவது வெளியேற்றம்" + +msgid "third exit" +msgstr "மூன்றாவது வெளியேற்றம்" + +msgid "fourth exit" +msgstr "நான்காவது வெளியேற்றம்" + +msgid "fifth exit" +msgstr "" + +msgid "sixth exit" +msgstr "ஐந்தாவது வெளியேற்றம்" + +#, c-format +msgid "%d m" +msgstr "%d நி" + +#, c-format +msgid "in %d m" +msgstr "%d நி.யில்" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d மீட்டர்கள்" + +#, c-format +msgid "in %d meters" +msgstr "%d மீட்டருக்குள்" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d கிலோமீட்டர்கள்." + +#, c-format +msgid "in %d.%d kilometers" +msgstr "%d.%d கிலோமீட்டருக்குள்" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "ஒரு கிலோமீட்டர்" +msgstr[1] "%d கிலோமீட்டர்கள்" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "ஒரு கிலோமீட்டருக்குள்" +msgstr[1] "%d கிலோமீட்டர்களுக்குள்" + +msgid "exit" +msgstr "" + +msgid "into the ramp" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "" + +msgid "When possible, please turn around" +msgstr "" + +msgid "Enter the roundabout soon" +msgstr "" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "" + +msgid "soon" +msgstr "" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "" + +#, c-format +msgid "after %i roads" +msgstr "" + +msgid "now" +msgstr "" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "" + +msgid "error" +msgstr "" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "" + +#, c-format +msgid "You have reached your destination %s" +msgstr "" + +msgid "then you have reached your destination." +msgstr "" + +msgid "Position" +msgstr "" + +msgid "Command" +msgstr "" + +msgid "Length" +msgstr "" + +msgid "km" +msgstr "" + +msgid "m" +msgstr "" + +msgid "Time" +msgstr "" + +msgid "Destination Length" +msgstr "" + +msgid "Destination Time" +msgstr "" + +msgid "Roadbook" +msgstr "" + +msgid "Set as position" +msgstr "" + +msgid "Set as destination" +msgstr "" + +msgid "Add as bookmark" +msgstr "" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "" + +#. 020 +msgid "Andorra" +msgstr "" + +#. 784 +msgid "United Arab Emirates" +msgstr "" + +#. 004 +msgid "Afghanistan" +msgstr "" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "" + +#. 660 +msgid "Anguilla" +msgstr "" + +#. 008 +msgid "Albania" +msgstr "" + +#. 051 +msgid "Armenia" +msgstr "" + +#. 530 +msgid "Netherlands Antilles" +msgstr "" + +#. 024 +msgid "Angola" +msgstr "" + +#. 010 +msgid "Antarctica" +msgstr "" + +#. 032 +msgid "Argentina" +msgstr "" + +#. 016 +msgid "American Samoa" +msgstr "" + +#. 040 +msgid "Austria" +msgstr "" + +#. 036 +msgid "Australia" +msgstr "" + +#. 533 +msgid "Aruba" +msgstr "" + +#. 248 +msgid "Aland Islands" +msgstr "" + +#. 031 +msgid "Azerbaijan" +msgstr "" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "" + +#. 052 +msgid "Barbados" +msgstr "" + +#. 050 +msgid "Bangladesh" +msgstr "" + +#. 056 +msgid "Belgium" +msgstr "" + +#. 854 +msgid "Burkina Faso" +msgstr "" + +#. 100 +msgid "Bulgaria" +msgstr "" + +#. 048 +msgid "Bahrain" +msgstr "" + +#. 108 +msgid "Burundi" +msgstr "" + +#. 204 +msgid "Benin" +msgstr "" + +#. 652 +msgid "Saint Barthelemy" +msgstr "" + +#. 060 +msgid "Bermuda" +msgstr "" + +#. 096 +msgid "Brunei Darussalam" +msgstr "" + +#. 068 +msgid "Bolivia" +msgstr "" + +#. 076 +msgid "Brazil" +msgstr "" + +#. 044 +msgid "Bahamas" +msgstr "" + +#. 064 +msgid "Bhutan" +msgstr "" + +#. 074 +msgid "Bouvet Island" +msgstr "" + +#. 072 +msgid "Botswana" +msgstr "" + +#. 112 +msgid "Belarus" +msgstr "" + +#. 084 +msgid "Belize" +msgstr "" + +#. 124 +msgid "Canada" +msgstr "" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "" + +#. 140 +msgid "Central African Republic" +msgstr "" + +#. 178 +msgid "Congo" +msgstr "" + +#. 756 +msgid "Switzerland" +msgstr "" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "" + +#. 184 +msgid "Cook Islands" +msgstr "" + +#. 152 +msgid "Chile" +msgstr "" + +#. 120 +msgid "Cameroon" +msgstr "" + +#. 156 +msgid "China" +msgstr "" + +#. 170 +msgid "Colombia" +msgstr "" + +#. 188 +msgid "Costa Rica" +msgstr "" + +#. 192 +msgid "Cuba" +msgstr "" + +#. 132 +msgid "Cape Verde" +msgstr "" + +#. 162 +msgid "Christmas Island" +msgstr "" + +#. 196 +msgid "Cyprus" +msgstr "" + +#. 203 +msgid "Czech Republic" +msgstr "" + +#. 276 +msgid "Germany" +msgstr "" + +#. 262 +msgid "Djibouti" +msgstr "" + +#. 208 +msgid "Denmark" +msgstr "" + +#. 212 +msgid "Dominica" +msgstr "" + +#. 214 +msgid "Dominican Republic" +msgstr "" + +#. 012 +msgid "Algeria" +msgstr "" + +#. 218 +msgid "Ecuador" +msgstr "" + +#. 233 +msgid "Estonia" +msgstr "" + +#. 818 +msgid "Egypt" +msgstr "" + +#. 732 +msgid "Western Sahara" +msgstr "" + +#. 232 +msgid "Eritrea" +msgstr "" + +#. 724 +msgid "Spain" +msgstr "" + +#. 231 +msgid "Ethiopia" +msgstr "" + +#. 246 +msgid "Finland" +msgstr "" + +#. 242 +msgid "Fiji" +msgstr "" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "" + +#. 234 +msgid "Faroe Islands" +msgstr "" + +#. 250 +msgid "France" +msgstr "" + +#. 266 +msgid "Gabon" +msgstr "" + +#. 826 +msgid "United Kingdom" +msgstr "" + +#. 308 +msgid "Grenada" +msgstr "" + +#. 268 +msgid "Georgia" +msgstr "" + +#. 254 +msgid "French Guiana" +msgstr "" + +#. 831 +msgid "Guernsey" +msgstr "" + +#. 288 +msgid "Ghana" +msgstr "" + +#. 292 +msgid "Gibraltar" +msgstr "" + +#. 304 +msgid "Greenland" +msgstr "" + +#. 270 +msgid "Gambia" +msgstr "" + +#. 324 +msgid "Guinea" +msgstr "" + +#. 312 +msgid "Guadeloupe" +msgstr "" + +#. 226 +msgid "Equatorial Guinea" +msgstr "" + +#. 300 +msgid "Greece" +msgstr "" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "" + +#. 320 +msgid "Guatemala" +msgstr "" + +#. 316 +msgid "Guam" +msgstr "" + +#. 624 +msgid "Guinea-Bissau" +msgstr "" + +#. 328 +msgid "Guyana" +msgstr "" + +#. 344 +msgid "Hong Kong" +msgstr "" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "" + +#. 340 +msgid "Honduras" +msgstr "" + +#. 191 +msgid "Croatia" +msgstr "" + +#. 332 +msgid "Haiti" +msgstr "" + +#. 348 +msgid "Hungary" +msgstr "" + +#. 360 +msgid "Indonesia" +msgstr "" + +#. 372 +msgid "Ireland" +msgstr "" + +#. 376 +msgid "Israel" +msgstr "" + +#. 833 +msgid "Isle of Man" +msgstr "" + +#. 356 +msgid "India" +msgstr "" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "" + +#. 368 +msgid "Iraq" +msgstr "" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "" + +#. 352 +msgid "Iceland" +msgstr "" + +#. 380 +msgid "Italy" +msgstr "" + +#. 832 +msgid "Jersey" +msgstr "" + +#. 388 +msgid "Jamaica" +msgstr "" + +#. 400 +msgid "Jordan" +msgstr "" + +#. 392 +msgid "Japan" +msgstr "" + +#. 404 +msgid "Kenya" +msgstr "" + +#. 417 +msgid "Kyrgyzstan" +msgstr "" + +#. 116 +msgid "Cambodia" +msgstr "" + +#. 296 +msgid "Kiribati" +msgstr "" + +#. 174 +msgid "Comoros" +msgstr "" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "" + +#. 410 +msgid "Korea, Republic of" +msgstr "" + +#. 414 +msgid "Kuwait" +msgstr "" + +#. 136 +msgid "Cayman Islands" +msgstr "" + +#. 398 +msgid "Kazakhstan" +msgstr "" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "" + +#. 422 +msgid "Lebanon" +msgstr "" + +#. 662 +msgid "Saint Lucia" +msgstr "" + +#. 438 +msgid "Liechtenstein" +msgstr "" + +#. 144 +msgid "Sri Lanka" +msgstr "" + +#. 430 +msgid "Liberia" +msgstr "" + +#. 426 +msgid "Lesotho" +msgstr "" + +#. 440 +msgid "Lithuania" +msgstr "" + +#. 442 +msgid "Luxembourg" +msgstr "" + +#. 428 +msgid "Latvia" +msgstr "" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "" + +#. 504 +msgid "Morocco" +msgstr "" + +#. 492 +msgid "Monaco" +msgstr "" + +#. 498 +msgid "Moldova, Republic of" +msgstr "" + +#. 499 +msgid "Montenegro" +msgstr "" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "" + +#. 450 +msgid "Madagascar" +msgstr "" + +#. 584 +msgid "Marshall Islands" +msgstr "" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "" + +#. 466 +msgid "Mali" +msgstr "" + +#. 104 +msgid "Myanmar" +msgstr "" + +#. 496 +msgid "Mongolia" +msgstr "" + +#. 446 +msgid "Macao" +msgstr "" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "" + +#. 474 +msgid "Martinique" +msgstr "" + +#. 478 +msgid "Mauritania" +msgstr "" + +#. 500 +msgid "Montserrat" +msgstr "" + +#. 470 +msgid "Malta" +msgstr "" + +#. 480 +msgid "Mauritius" +msgstr "" + +#. 462 +msgid "Maldives" +msgstr "" + +#. 454 +msgid "Malawi" +msgstr "" + +#. 484 +msgid "Mexico" +msgstr "" + +#. 458 +msgid "Malaysia" +msgstr "" + +#. 508 +msgid "Mozambique" +msgstr "" + +#. 516 +msgid "Namibia" +msgstr "" + +#. 540 +msgid "New Caledonia" +msgstr "" + +#. 562 +msgid "Niger" +msgstr "" + +#. 574 +msgid "Norfolk Island" +msgstr "" + +#. 566 +msgid "Nigeria" +msgstr "" + +#. 558 +msgid "Nicaragua" +msgstr "" + +#. 528 +msgid "Netherlands" +msgstr "" + +#. 578 +msgid "Norway" +msgstr "" + +#. 524 +msgid "Nepal" +msgstr "" + +#. 520 +msgid "Nauru" +msgstr "" + +#. 570 +msgid "Niue" +msgstr "" + +#. 554 +msgid "New Zealand" +msgstr "" + +#. 512 +msgid "Oman" +msgstr "" + +#. 591 +msgid "Panama" +msgstr "" + +#. 604 +msgid "Peru" +msgstr "" + +#. 258 +msgid "French Polynesia" +msgstr "" + +#. 598 +msgid "Papua New Guinea" +msgstr "" + +#. 608 +msgid "Philippines" +msgstr "" + +#. 586 +msgid "Pakistan" +msgstr "" + +#. 616 +msgid "Poland" +msgstr "" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "" + +#. 612 +msgid "Pitcairn" +msgstr "" + +#. 630 +msgid "Puerto Rico" +msgstr "" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "" + +#. 620 +msgid "Portugal" +msgstr "" + +#. 585 +msgid "Palau" +msgstr "" + +#. 600 +msgid "Paraguay" +msgstr "" + +#. 634 +msgid "Qatar" +msgstr "" + +#. 638 +msgid "Reunion" +msgstr "" + +#. 642 +msgid "Romania" +msgstr "" + +#. 688 +msgid "Serbia" +msgstr "" + +#. 643 +msgid "Russian Federation" +msgstr "" + +#. 646 +msgid "Rwanda" +msgstr "" + +#. 682 +msgid "Saudi Arabia" +msgstr "" + +#. 090 +msgid "Solomon Islands" +msgstr "" + +#. 690 +msgid "Seychelles" +msgstr "" + +#. 736 +msgid "Sudan" +msgstr "" + +#. 752 +msgid "Sweden" +msgstr "" + +#. 702 +msgid "Singapore" +msgstr "" + +#. 654 +msgid "Saint Helena" +msgstr "" + +#. 705 +msgid "Slovenia" +msgstr "" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "" + +#. 703 +msgid "Slovakia" +msgstr "" + +#. 694 +msgid "Sierra Leone" +msgstr "" + +#. 674 +msgid "San Marino" +msgstr "" + +#. 686 +msgid "Senegal" +msgstr "" + +#. 706 +msgid "Somalia" +msgstr "" + +#. 740 +msgid "Suriname" +msgstr "" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "" + +#. 222 +msgid "El Salvador" +msgstr "" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "" + +#. 748 +msgid "Swaziland" +msgstr "" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "" + +#. 148 +msgid "Chad" +msgstr "" + +#. 260 +msgid "French Southern Territories" +msgstr "" + +#. 768 +msgid "Togo" +msgstr "" + +#. 764 +msgid "Thailand" +msgstr "" + +#. 762 +msgid "Tajikistan" +msgstr "" + +#. 772 +msgid "Tokelau" +msgstr "" + +#. 626 +msgid "Timor-Leste" +msgstr "" + +#. 795 +msgid "Turkmenistan" +msgstr "" + +#. 788 +msgid "Tunisia" +msgstr "" + +#. 776 +msgid "Tonga" +msgstr "" + +#. 792 +msgid "Turkey" +msgstr "" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "" + +#. 798 +msgid "Tuvalu" +msgstr "" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "" + +#. 804 +msgid "Ukraine" +msgstr "" + +#. 800 +msgid "Uganda" +msgstr "" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "" + +#. 840 +msgid "United States" +msgstr "" + +#. 858 +msgid "Uruguay" +msgstr "" + +#. 860 +msgid "Uzbekistan" +msgstr "" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "" + +#. 862 +msgid "Venezuela" +msgstr "" + +#. 092 +msgid "Virgin Islands, British" +msgstr "" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "" + +#. 704 +msgid "Viet Nam" +msgstr "" + +#. 548 +msgid "Vanuatu" +msgstr "" + +#. 876 +msgid "Wallis and Futuna" +msgstr "" + +#. 882 +msgid "Samoa" +msgstr "" + +#. 887 +msgid "Yemen" +msgstr "" + +#. 175 +msgid "Mayotte" +msgstr "" + +#. 710 +msgid "South Africa" +msgstr "" + +#. 894 +msgid "Zambia" +msgstr "" + +#. 716 +msgid "Zimbabwe" +msgstr "" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "" + +msgid "Car" +msgstr "" + +msgid "Iso2" +msgstr "" + +msgid "Iso3" +msgstr "" + +msgid "Country" +msgstr "" + +msgid "Postal" +msgstr "" + +msgid "Town" +msgstr "" + +msgid "District" +msgstr "" + +msgid "Street" +msgstr "" + +msgid "Number" +msgstr "" + +msgid "Enter Destination" +msgstr "" + +msgid "Zip Code" +msgstr "" + +msgid "City" +msgstr "" + +msgid "District/Township" +msgstr "" + +msgid "Map" +msgstr "" + +msgid "Bookmark" +msgstr "" + +msgid "Destination" +msgstr "" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "" + +msgid "_Route" +msgstr "" + +msgid "_Former Destinations" +msgstr "" + +msgid "_Bookmarks" +msgstr "" + +msgid "_Map" +msgstr "" + +msgid "_Layout" +msgstr "" + +msgid "_Projection" +msgstr "" + +msgid "_Vehicle" +msgstr "" + +msgid "Zoom_Out" +msgstr "" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "" + +msgid "Test" +msgstr "" + +msgid "_Quit" +msgstr "" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "" + +msgid "Data" +msgstr "" + +msgid "N" +msgstr "" + +msgid "NE" +msgstr "" + +msgid "E" +msgstr "" + +msgid "SE" +msgstr "" + +msgid "S" +msgstr "" + +msgid "SW" +msgstr "" + +msgid "W" +msgstr "" + +msgid "NW" +msgstr "" + +msgid "No" +msgstr "" + +msgid "2D" +msgstr "" + +msgid "3D" +msgstr "" + +msgid "OT" +msgstr "" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "" + +msgid "Back to map" +msgstr "" + +msgid "Main Menu" +msgstr "" + +msgid "Help" +msgstr "" + +msgid "Back" +msgstr "" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "" + +msgid "View in Browser" +msgstr "" + +msgid "Streets" +msgstr "" + +msgid "House numbers" +msgstr "" + +msgid "View Attributes" +msgstr "" + +msgid "View on map" +msgstr "" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "" + +msgid "Former Destinations" +msgstr "" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "" + +msgid "Layout" +msgstr "" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "" + +msgid "Show Satellite Status" +msgstr "" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "" + +msgid "car" +msgstr "" + +msgid "bike" +msgstr "" + +msgid "pedestrian" +msgstr "" + +#, c-format +msgid "Current profile: %s" +msgstr "" + +#, c-format +msgid "Change profile to: %s" +msgstr "" + +msgid "Set as active" +msgstr "" + +msgid "Show Satellite status" +msgstr "" + +msgid "Show NMEA data" +msgstr "" + +msgid "Vehicle" +msgstr "" + +msgid "Rules" +msgstr "" + +msgid "Lock on road" +msgstr "" + +msgid "Northing" +msgstr "" + +msgid "Map follows Vehicle" +msgstr "" + +msgid "Message" +msgstr "" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "" + +msgid "Vehicle Position" +msgstr "" + +msgid "Main menu" +msgstr "" + +msgid "" +"Show\n" +"Map" +msgstr "" + +msgid "Settings" +msgstr "" + +msgid "Tools" +msgstr "" + +msgid "Route" +msgstr "" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" + +msgid "Display" +msgstr "" + +msgid "Fullscreen" +msgstr "" + +msgid "Window Mode" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" diff --git a/po/te.po.in b/po/te.po.in new file mode 100644 index 0000000..afecf8b --- /dev/null +++ b/po/te.po.in @@ -0,0 +1,1750 @@ +# Telugu translation for navit +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the navit package. +# Veeven 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2009-07-02 20:53+0000\n" +"Last-Translator: KaZeR \n" +"Language-Team: Telugu \n" +"Language: te\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "" + +msgid "first" +msgstr "" + +msgid "second" +msgstr "" + +msgid "third" +msgstr "" + +msgid "fourth" +msgstr "" + +msgid "fifth" +msgstr "" + +msgid "sixth" +msgstr "" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "" + +msgid "first exit" +msgstr "" + +msgid "second exit" +msgstr "" + +msgid "third exit" +msgstr "" + +msgid "fourth exit" +msgstr "" + +msgid "fifth exit" +msgstr "" + +msgid "sixth exit" +msgstr "" + +#, c-format +msgid "%d m" +msgstr "" + +#, c-format +msgid "in %d m" +msgstr "" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d మీటర్లు" + +#, c-format +msgid "in %d meters" +msgstr "" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "ఒక కిలోమీటరు" +msgstr[1] "%d కిలోమీటర్లు" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "" +msgstr[1] "" + +msgid "exit" +msgstr "" + +msgid "into the ramp" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "కుడి" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "ఎడమ" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "తేలికగా " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "" + +msgid "When possible, please turn around" +msgstr "" + +msgid "Enter the roundabout soon" +msgstr "" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "" + +msgid "soon" +msgstr "త్వరలో" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "" + +#, c-format +msgid "after %i roads" +msgstr "" + +msgid "now" +msgstr "ఇప్పుడు" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "" + +msgid "error" +msgstr "పొరపాటు" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "" + +#, c-format +msgid "You have reached your destination %s" +msgstr "మీరు మీ గమ్యస్థానం %s చేరారు" + +msgid "then you have reached your destination." +msgstr "" + +msgid "Position" +msgstr "" + +msgid "Command" +msgstr "ఆదేశం" + +msgid "Length" +msgstr "పొడవు" + +msgid "km" +msgstr "కిమీ" + +msgid "m" +msgstr "" + +msgid "Time" +msgstr "సమయం" + +msgid "Destination Length" +msgstr "" + +msgid "Destination Time" +msgstr "" + +msgid "Roadbook" +msgstr "" + +msgid "Set as position" +msgstr "" + +msgid "Set as destination" +msgstr "" + +msgid "Add as bookmark" +msgstr "" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "" + +#. 020 +msgid "Andorra" +msgstr "అండోరా" + +#. 784 +msgid "United Arab Emirates" +msgstr "యునైటెడ్ అరబ్ ఎమిరేట్స్" + +#. 004 +msgid "Afghanistan" +msgstr "ఆఫ్ఘనిస్తాన్" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "" + +#. 660 +msgid "Anguilla" +msgstr "" + +#. 008 +msgid "Albania" +msgstr "అల్బేనియా" + +#. 051 +msgid "Armenia" +msgstr "అర్మేనియా" + +#. 530 +msgid "Netherlands Antilles" +msgstr "" + +#. 024 +msgid "Angola" +msgstr "అంగోలా" + +#. 010 +msgid "Antarctica" +msgstr "అంటార్కిటికా" + +#. 032 +msgid "Argentina" +msgstr "అర్జెంటీనా" + +#. 016 +msgid "American Samoa" +msgstr "" + +#. 040 +msgid "Austria" +msgstr "" + +#. 036 +msgid "Australia" +msgstr "" + +#. 533 +msgid "Aruba" +msgstr "" + +#. 248 +msgid "Aland Islands" +msgstr "" + +#. 031 +msgid "Azerbaijan" +msgstr "" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "" + +#. 052 +msgid "Barbados" +msgstr "" + +#. 050 +msgid "Bangladesh" +msgstr "బంగ్లాదేశ్" + +#. 056 +msgid "Belgium" +msgstr "బెల్జియం" + +#. 854 +msgid "Burkina Faso" +msgstr "" + +#. 100 +msgid "Bulgaria" +msgstr "బల్గేరియా" + +#. 048 +msgid "Bahrain" +msgstr "" + +#. 108 +msgid "Burundi" +msgstr "" + +#. 204 +msgid "Benin" +msgstr "" + +#. 652 +msgid "Saint Barthelemy" +msgstr "" + +#. 060 +msgid "Bermuda" +msgstr "బెర్ముడా" + +#. 096 +msgid "Brunei Darussalam" +msgstr "" + +#. 068 +msgid "Bolivia" +msgstr "బొలీవియా" + +#. 076 +msgid "Brazil" +msgstr "బ్రెజిల్" + +#. 044 +msgid "Bahamas" +msgstr "బహమాస్" + +#. 064 +msgid "Bhutan" +msgstr "భూటాన్" + +#. 074 +msgid "Bouvet Island" +msgstr "" + +#. 072 +msgid "Botswana" +msgstr "" + +#. 112 +msgid "Belarus" +msgstr "బెలారస్" + +#. 084 +msgid "Belize" +msgstr "" + +#. 124 +msgid "Canada" +msgstr "కెనడా" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "" + +#. 140 +msgid "Central African Republic" +msgstr "మధ్య ఆఫ్రికన్ రిపబ్లిక్" + +#. 178 +msgid "Congo" +msgstr "కాంగో" + +#. 756 +msgid "Switzerland" +msgstr "స్విట్జర్లాండ్" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "" + +#. 184 +msgid "Cook Islands" +msgstr "" + +#. 152 +msgid "Chile" +msgstr "చిలీ" + +#. 120 +msgid "Cameroon" +msgstr "కామెరూన్" + +#. 156 +msgid "China" +msgstr "చైనా" + +#. 170 +msgid "Colombia" +msgstr "కొలంబియా" + +#. 188 +msgid "Costa Rica" +msgstr "కోస్టారికా" + +#. 192 +msgid "Cuba" +msgstr "క్యూబా" + +#. 132 +msgid "Cape Verde" +msgstr "" + +#. 162 +msgid "Christmas Island" +msgstr "" + +#. 196 +msgid "Cyprus" +msgstr "సైప్రస్" + +#. 203 +msgid "Czech Republic" +msgstr "" + +#. 276 +msgid "Germany" +msgstr "జర్మనీ" + +#. 262 +msgid "Djibouti" +msgstr "" + +#. 208 +msgid "Denmark" +msgstr "డెన్మార్క్" + +#. 212 +msgid "Dominica" +msgstr "డొమినికా" + +#. 214 +msgid "Dominican Republic" +msgstr "డొమినికన్ రిపబ్లిక్" + +#. 012 +msgid "Algeria" +msgstr "అల్జీరియా" + +#. 218 +msgid "Ecuador" +msgstr "ఈక్విడార్" + +#. 233 +msgid "Estonia" +msgstr "ఎస్టోనియా" + +#. 818 +msgid "Egypt" +msgstr "ఈజిప్ట్" + +#. 732 +msgid "Western Sahara" +msgstr "పశ్చిమ సహారా" + +#. 232 +msgid "Eritrea" +msgstr "" + +#. 724 +msgid "Spain" +msgstr "స్పెయిన్" + +#. 231 +msgid "Ethiopia" +msgstr "ఇథియోపియా" + +#. 246 +msgid "Finland" +msgstr "ఫిన్లాండ్" + +#. 242 +msgid "Fiji" +msgstr "ఫిజీ" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "" + +#. 234 +msgid "Faroe Islands" +msgstr "" + +#. 250 +msgid "France" +msgstr "ఫ్రాన్స్" + +#. 266 +msgid "Gabon" +msgstr "" + +#. 826 +msgid "United Kingdom" +msgstr "" + +#. 308 +msgid "Grenada" +msgstr "" + +#. 268 +msgid "Georgia" +msgstr "జార్జియా" + +#. 254 +msgid "French Guiana" +msgstr "ఫ్రెంచ్ గయానా" + +#. 831 +msgid "Guernsey" +msgstr "" + +#. 288 +msgid "Ghana" +msgstr "ఘనా" + +#. 292 +msgid "Gibraltar" +msgstr "" + +#. 304 +msgid "Greenland" +msgstr "గ్రీన్‌లాండ్" + +#. 270 +msgid "Gambia" +msgstr "జాంబియా" + +#. 324 +msgid "Guinea" +msgstr "" + +#. 312 +msgid "Guadeloupe" +msgstr "" + +#. 226 +msgid "Equatorial Guinea" +msgstr "" + +#. 300 +msgid "Greece" +msgstr "గ్రీస్" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "" + +#. 320 +msgid "Guatemala" +msgstr "" + +#. 316 +msgid "Guam" +msgstr "" + +#. 624 +msgid "Guinea-Bissau" +msgstr "" + +#. 328 +msgid "Guyana" +msgstr "గయానా" + +#. 344 +msgid "Hong Kong" +msgstr "హాంకాంగ్" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "" + +#. 340 +msgid "Honduras" +msgstr "" + +#. 191 +msgid "Croatia" +msgstr "క్రోయేషియా" + +#. 332 +msgid "Haiti" +msgstr "" + +#. 348 +msgid "Hungary" +msgstr "హంగరీ" + +#. 360 +msgid "Indonesia" +msgstr "ఇండోనేషియా" + +#. 372 +msgid "Ireland" +msgstr "ఐర్లాండ్" + +#. 376 +msgid "Israel" +msgstr "" + +#. 833 +msgid "Isle of Man" +msgstr "" + +#. 356 +msgid "India" +msgstr "భారతదేశం" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "" + +#. 368 +msgid "Iraq" +msgstr "ఇరాక్" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "" + +#. 352 +msgid "Iceland" +msgstr "" + +#. 380 +msgid "Italy" +msgstr "ఇటలీ" + +#. 832 +msgid "Jersey" +msgstr "" + +#. 388 +msgid "Jamaica" +msgstr "జమైకా" + +#. 400 +msgid "Jordan" +msgstr "జోర్డాన్" + +#. 392 +msgid "Japan" +msgstr "జపాన్" + +#. 404 +msgid "Kenya" +msgstr "కెన్యా" + +#. 417 +msgid "Kyrgyzstan" +msgstr "" + +#. 116 +msgid "Cambodia" +msgstr "కాంబోడియా" + +#. 296 +msgid "Kiribati" +msgstr "" + +#. 174 +msgid "Comoros" +msgstr "" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "" + +#. 410 +msgid "Korea, Republic of" +msgstr "" + +#. 414 +msgid "Kuwait" +msgstr "కువైట్" + +#. 136 +msgid "Cayman Islands" +msgstr "కేమన్ దీవులు" + +#. 398 +msgid "Kazakhstan" +msgstr "కజకిస్తాన్" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "" + +#. 422 +msgid "Lebanon" +msgstr "లెబనాన్" + +#. 662 +msgid "Saint Lucia" +msgstr "" + +#. 438 +msgid "Liechtenstein" +msgstr "" + +#. 144 +msgid "Sri Lanka" +msgstr "శ్రీలంక" + +#. 430 +msgid "Liberia" +msgstr "" + +#. 426 +msgid "Lesotho" +msgstr "" + +#. 440 +msgid "Lithuania" +msgstr "" + +#. 442 +msgid "Luxembourg" +msgstr "" + +#. 428 +msgid "Latvia" +msgstr "లాత్వియా" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "" + +#. 504 +msgid "Morocco" +msgstr "మొరాకో" + +#. 492 +msgid "Monaco" +msgstr "మొనాకో" + +#. 498 +msgid "Moldova, Republic of" +msgstr "" + +#. 499 +msgid "Montenegro" +msgstr "" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "" + +#. 450 +msgid "Madagascar" +msgstr "మడగాస్కర్" + +#. 584 +msgid "Marshall Islands" +msgstr "" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "" + +#. 466 +msgid "Mali" +msgstr "" + +#. 104 +msgid "Myanmar" +msgstr "మియన్మార్" + +#. 496 +msgid "Mongolia" +msgstr "మంగోలియా" + +#. 446 +msgid "Macao" +msgstr "" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "" + +#. 474 +msgid "Martinique" +msgstr "" + +#. 478 +msgid "Mauritania" +msgstr "" + +#. 500 +msgid "Montserrat" +msgstr "" + +#. 470 +msgid "Malta" +msgstr "మాల్టా" + +#. 480 +msgid "Mauritius" +msgstr "మారిషస్" + +#. 462 +msgid "Maldives" +msgstr "మాల్దీవులు" + +#. 454 +msgid "Malawi" +msgstr "" + +#. 484 +msgid "Mexico" +msgstr "మెక్సికో" + +#. 458 +msgid "Malaysia" +msgstr "మలేషియా" + +#. 508 +msgid "Mozambique" +msgstr "" + +#. 516 +msgid "Namibia" +msgstr "నమీబియా" + +#. 540 +msgid "New Caledonia" +msgstr "" + +#. 562 +msgid "Niger" +msgstr "" + +#. 574 +msgid "Norfolk Island" +msgstr "" + +#. 566 +msgid "Nigeria" +msgstr "నైజీరియా" + +#. 558 +msgid "Nicaragua" +msgstr "" + +#. 528 +msgid "Netherlands" +msgstr "" + +#. 578 +msgid "Norway" +msgstr "నార్వే" + +#. 524 +msgid "Nepal" +msgstr "నేపాల్" + +#. 520 +msgid "Nauru" +msgstr "" + +#. 570 +msgid "Niue" +msgstr "" + +#. 554 +msgid "New Zealand" +msgstr "న్యూజిలాండ్" + +#. 512 +msgid "Oman" +msgstr "" + +#. 591 +msgid "Panama" +msgstr "పనామా" + +#. 604 +msgid "Peru" +msgstr "పెరూ" + +#. 258 +msgid "French Polynesia" +msgstr "" + +#. 598 +msgid "Papua New Guinea" +msgstr "" + +#. 608 +msgid "Philippines" +msgstr "ఫిలిప్ఫీన్స్" + +#. 586 +msgid "Pakistan" +msgstr "పాకిస్తాన్" + +#. 616 +msgid "Poland" +msgstr "పోలాండ్" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "" + +#. 612 +msgid "Pitcairn" +msgstr "" + +#. 630 +msgid "Puerto Rico" +msgstr "" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "" + +#. 620 +msgid "Portugal" +msgstr "పోర్చుగల్" + +#. 585 +msgid "Palau" +msgstr "" + +#. 600 +msgid "Paraguay" +msgstr "పరాగ్వే" + +#. 634 +msgid "Qatar" +msgstr "ఖతార్" + +#. 638 +msgid "Reunion" +msgstr "" + +#. 642 +msgid "Romania" +msgstr "రొమేనియా" + +#. 688 +msgid "Serbia" +msgstr "సెర్బియా" + +#. 643 +msgid "Russian Federation" +msgstr "" + +#. 646 +msgid "Rwanda" +msgstr "రువాండా" + +#. 682 +msgid "Saudi Arabia" +msgstr "సౌది అరేబియా" + +#. 090 +msgid "Solomon Islands" +msgstr "" + +#. 690 +msgid "Seychelles" +msgstr "" + +#. 736 +msgid "Sudan" +msgstr "సూడాన్" + +#. 752 +msgid "Sweden" +msgstr "స్వీడన్" + +#. 702 +msgid "Singapore" +msgstr "సింగపూర్" + +#. 654 +msgid "Saint Helena" +msgstr "" + +#. 705 +msgid "Slovenia" +msgstr "" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "" + +#. 703 +msgid "Slovakia" +msgstr "స్లొవేకియా" + +#. 694 +msgid "Sierra Leone" +msgstr "" + +#. 674 +msgid "San Marino" +msgstr "" + +#. 686 +msgid "Senegal" +msgstr "" + +#. 706 +msgid "Somalia" +msgstr "సోమాలియా" + +#. 740 +msgid "Suriname" +msgstr "" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "" + +#. 222 +msgid "El Salvador" +msgstr "" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "" + +#. 748 +msgid "Swaziland" +msgstr "స్వాజిలాండ్" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "" + +#. 148 +msgid "Chad" +msgstr "" + +#. 260 +msgid "French Southern Territories" +msgstr "" + +#. 768 +msgid "Togo" +msgstr "టోగో" + +#. 764 +msgid "Thailand" +msgstr "థాయిలాండ్" + +#. 762 +msgid "Tajikistan" +msgstr "తజకిస్తాన్" + +#. 772 +msgid "Tokelau" +msgstr "" + +#. 626 +msgid "Timor-Leste" +msgstr "" + +#. 795 +msgid "Turkmenistan" +msgstr "" + +#. 788 +msgid "Tunisia" +msgstr "" + +#. 776 +msgid "Tonga" +msgstr "" + +#. 792 +msgid "Turkey" +msgstr "" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "" + +#. 798 +msgid "Tuvalu" +msgstr "" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "" + +#. 804 +msgid "Ukraine" +msgstr "ఉక్రేయిన్" + +#. 800 +msgid "Uganda" +msgstr "ఉగాండా" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "" + +#. 840 +msgid "United States" +msgstr "యునైటెడ్ స్టేట్స్ ఆఫ్ అమెరికా" + +#. 858 +msgid "Uruguay" +msgstr "ఉరూగ్వే" + +#. 860 +msgid "Uzbekistan" +msgstr "ఉజ్బెకిస్తాన్" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "" + +#. 862 +msgid "Venezuela" +msgstr "వెనిజులా" + +#. 092 +msgid "Virgin Islands, British" +msgstr "" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "" + +#. 704 +msgid "Viet Nam" +msgstr "వియత్నాం" + +#. 548 +msgid "Vanuatu" +msgstr "" + +#. 876 +msgid "Wallis and Futuna" +msgstr "" + +#. 882 +msgid "Samoa" +msgstr "" + +#. 887 +msgid "Yemen" +msgstr "" + +#. 175 +msgid "Mayotte" +msgstr "" + +#. 710 +msgid "South Africa" +msgstr "దక్షిణ ఆఫ్రికా" + +#. 894 +msgid "Zambia" +msgstr "జాంబియా" + +#. 716 +msgid "Zimbabwe" +msgstr "జింబాబ్వే" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "" + +msgid "Car" +msgstr "" + +msgid "Iso2" +msgstr "" + +msgid "Iso3" +msgstr "" + +msgid "Country" +msgstr "దేశం" + +msgid "Postal" +msgstr "తపాలా" + +msgid "Town" +msgstr "పట్టణం" + +msgid "District" +msgstr "జిల్లా" + +msgid "Street" +msgstr "వీధి" + +msgid "Number" +msgstr "సంఖ్య" + +msgid "Enter Destination" +msgstr "" + +msgid "Zip Code" +msgstr "" + +msgid "City" +msgstr "నగరం" + +msgid "District/Township" +msgstr "" + +msgid "Map" +msgstr "పటం" + +msgid "Bookmark" +msgstr "" + +msgid "Destination" +msgstr "గమ్యం" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "" + +msgid "_Route" +msgstr "" + +msgid "_Former Destinations" +msgstr "" + +msgid "_Bookmarks" +msgstr "పేజీకలు" + +msgid "_Map" +msgstr "పటం" + +msgid "_Layout" +msgstr "కూర్పు" + +msgid "_Projection" +msgstr "" + +msgid "_Vehicle" +msgstr "వాహనం" + +msgid "Zoom_Out" +msgstr "" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "సమాచారం" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "" + +msgid "Test" +msgstr "పరీక్ష" + +msgid "_Quit" +msgstr "" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "నిండు తెర" + +msgid "Data" +msgstr "దత్తాంశం" + +msgid "N" +msgstr "" + +msgid "NE" +msgstr "" + +msgid "E" +msgstr "" + +msgid "SE" +msgstr "" + +msgid "S" +msgstr "" + +msgid "SW" +msgstr "" + +msgid "W" +msgstr "" + +msgid "NW" +msgstr "" + +msgid "No" +msgstr "" + +msgid "2D" +msgstr "" + +msgid "3D" +msgstr "" + +msgid "OT" +msgstr "" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "" + +msgid "Back to map" +msgstr "" + +msgid "Main Menu" +msgstr "" + +msgid "Help" +msgstr "" + +msgid "Back" +msgstr "" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "" + +msgid "View in Browser" +msgstr "" + +msgid "Streets" +msgstr "" + +msgid "House numbers" +msgstr "" + +msgid "View Attributes" +msgstr "" + +msgid "View on map" +msgstr "" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "పేజీకలు" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "" + +msgid "Former Destinations" +msgstr "" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "" + +msgid "Layout" +msgstr "కూర్పు" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "" + +msgid "Show Satellite Status" +msgstr "" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "" + +msgid "car" +msgstr "" + +msgid "bike" +msgstr "" + +msgid "pedestrian" +msgstr "" + +#, c-format +msgid "Current profile: %s" +msgstr "" + +#, c-format +msgid "Change profile to: %s" +msgstr "" + +msgid "Set as active" +msgstr "" + +msgid "Show Satellite status" +msgstr "" + +msgid "Show NMEA data" +msgstr "" + +msgid "Vehicle" +msgstr "వాహనం" + +msgid "Rules" +msgstr "" + +msgid "Lock on road" +msgstr "" + +msgid "Northing" +msgstr "" + +msgid "Map follows Vehicle" +msgstr "" + +msgid "Message" +msgstr "" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "" + +msgid "Vehicle Position" +msgstr "" + +msgid "Main menu" +msgstr "" + +msgid "" +"Show\n" +"Map" +msgstr "" + +msgid "Settings" +msgstr "" + +msgid "Tools" +msgstr "" + +msgid "Route" +msgstr "" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" + +msgid "Display" +msgstr "" + +msgid "Fullscreen" +msgstr "నిండు తెర" + +msgid "Window Mode" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" diff --git a/po/th.po.in b/po/th.po.in new file mode 100644 index 0000000..22b0e22 --- /dev/null +++ b/po/th.po.in @@ -0,0 +1,1752 @@ +# Thai translation for navit +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the navit package. +# Mansv68 , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2009-07-02 21:52+0000\n" +"Last-Translator: mansv68 \n" +"Language-Team: Thai \n" +"Language: th\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "กำหนด '%s' ถึง '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "" + +msgid "first" +msgstr "" + +msgid "second" +msgstr "" + +msgid "third" +msgstr "" + +msgid "fourth" +msgstr "" + +msgid "fifth" +msgstr "" + +msgid "sixth" +msgstr "" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "" + +msgid "first exit" +msgstr "" + +msgid "second exit" +msgstr "" + +msgid "third exit" +msgstr "" + +msgid "fourth exit" +msgstr "" + +msgid "fifth exit" +msgstr "" + +msgid "sixth exit" +msgstr "" + +#, c-format +msgid "%d m" +msgstr "%d เมตร" + +#, c-format +msgid "in %d m" +msgstr "อีก %d เมตร" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d เมตร" + +#, c-format +msgid "in %d meters" +msgstr "อีก %d เมตร" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "อีก %d.%d กิโลเมตร" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "%d กิโลเมตร" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "อีก %d กิโลเมตร" + +msgid "exit" +msgstr "ทางออก" + +msgid "into the ramp" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s เข้าสู่ถนน %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%s เข้าสู่ %s%s%s| จาก" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%s เข้าสู %s%s%s| จาก" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%s เข้าสู่ %s%s%s| จาก" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "ขวา" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "ซ้าย" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "อย่างเคร่งคัด " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "ไม่ทราบ " + +msgid "When possible, please turn around" +msgstr "ถ้าเป็นไปได้ ให้กลับรถ" + +msgid "Enter the roundabout soon" +msgstr "" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "ตรงไปตามถนน แล้ว %s" + +msgid "soon" +msgstr "ในไม่ช้า" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "" + +#, c-format +msgid "after %i roads" +msgstr "" + +msgid "now" +msgstr "เดี๋ยวนี้" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "" + +msgid "error" +msgstr "ข้อผิดพลาด" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "เลี้ยว %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "" + +#, c-format +msgid "You have reached your destination %s" +msgstr "คุณได้ถึงที่หมายแล้ว %s" + +msgid "then you have reached your destination." +msgstr "" + +msgid "Position" +msgstr "" + +msgid "Command" +msgstr "คำสั่ง" + +msgid "Length" +msgstr "ความยาว" + +msgid "km" +msgstr "กม." + +msgid "m" +msgstr "เมตร" + +msgid "Time" +msgstr "เวลา" + +msgid "Destination Length" +msgstr "ระยะทาง ถึงที่หมาย" + +msgid "Destination Time" +msgstr "เวลา ถึงที่หมาย" + +msgid "Roadbook" +msgstr "" + +msgid "Set as position" +msgstr "กำหนดตำแหน่ง" + +msgid "Set as destination" +msgstr "กำหนดเป็นที่หมาย" + +msgid "Add as bookmark" +msgstr "เพิ่มใน บุกมาร์ก" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "จุด 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "พิกัดหน้าจอ : %d %d" + +#. 020 +msgid "Andorra" +msgstr "แอนโดรา" + +#. 784 +msgid "United Arab Emirates" +msgstr "สหรัฐอาหรับอีมิเรตส์" + +#. 004 +msgid "Afghanistan" +msgstr "อาฟกานิสถาน" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "อันทิกัว และ บาร์บูดา" + +#. 660 +msgid "Anguilla" +msgstr "แองกีลา" + +#. 008 +msgid "Albania" +msgstr "อัลเบเนีย" + +#. 051 +msgid "Armenia" +msgstr "อาร์เมเนีย" + +#. 530 +msgid "Netherlands Antilles" +msgstr "เนเธอร์แลนด์ แอนทิลีส" + +#. 024 +msgid "Angola" +msgstr "แองโกลา" + +#. 010 +msgid "Antarctica" +msgstr "แอนตาร์กติกา" + +#. 032 +msgid "Argentina" +msgstr "อาร์เจนตินา" + +#. 016 +msgid "American Samoa" +msgstr "อเมริกัน ซามัว" + +#. 040 +msgid "Austria" +msgstr "ออสเตรีย" + +#. 036 +msgid "Australia" +msgstr "ออสเตรเลีย" + +#. 533 +msgid "Aruba" +msgstr "อรูบา" + +#. 248 +msgid "Aland Islands" +msgstr "เกาะ เอแลนด์" + +#. 031 +msgid "Azerbaijan" +msgstr "อาร์เซอร์ไบจัน" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "บอสเนียและเฮอร์เซโกวินา" + +#. 052 +msgid "Barbados" +msgstr "บาร์บาดอส" + +#. 050 +msgid "Bangladesh" +msgstr "บังคลาเทศ" + +#. 056 +msgid "Belgium" +msgstr "เบลเยียม" + +#. 854 +msgid "Burkina Faso" +msgstr "เบอร์กินาฟาโซ" + +#. 100 +msgid "Bulgaria" +msgstr "บัลแกเรีย" + +#. 048 +msgid "Bahrain" +msgstr "บาห์เรียน" + +#. 108 +msgid "Burundi" +msgstr "บูรันดิ" + +#. 204 +msgid "Benin" +msgstr "เบนิน" + +#. 652 +msgid "Saint Barthelemy" +msgstr "" + +#. 060 +msgid "Bermuda" +msgstr "เบอร์มิวดา" + +#. 096 +msgid "Brunei Darussalam" +msgstr "บรูไนดูรัสซาลาม" + +#. 068 +msgid "Bolivia" +msgstr "โบลิเวีย" + +#. 076 +msgid "Brazil" +msgstr "บราซิล" + +#. 044 +msgid "Bahamas" +msgstr "บาฮามา" + +#. 064 +msgid "Bhutan" +msgstr "ภูฏาน" + +#. 074 +msgid "Bouvet Island" +msgstr "เกาะบูเวต์" + +#. 072 +msgid "Botswana" +msgstr "บอทสวานา" + +#. 112 +msgid "Belarus" +msgstr "เบลารุส" + +#. 084 +msgid "Belize" +msgstr "เบลไลซ์" + +#. 124 +msgid "Canada" +msgstr "แคนาดา" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "หมู่เกาะโคโคส (คีลิง)" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "" + +#. 140 +msgid "Central African Republic" +msgstr "สาธารณรัฐอัฟริกากลาง" + +#. 178 +msgid "Congo" +msgstr "คองโก" + +#. 756 +msgid "Switzerland" +msgstr "สวิสเซอร์แลนด์" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "โกตดิวัวร์" + +#. 184 +msgid "Cook Islands" +msgstr "หมู่เกาะคุ้ก" + +#. 152 +msgid "Chile" +msgstr "ชิลี" + +#. 120 +msgid "Cameroon" +msgstr "คาเมรูน" + +#. 156 +msgid "China" +msgstr "จีน" + +#. 170 +msgid "Colombia" +msgstr "โคลัมเบีย" + +#. 188 +msgid "Costa Rica" +msgstr "คอสตาริกา" + +#. 192 +msgid "Cuba" +msgstr "คิวบา" + +#. 132 +msgid "Cape Verde" +msgstr "แหลมเวอร์ดี" + +#. 162 +msgid "Christmas Island" +msgstr "เกาะคริสต์มาส" + +#. 196 +msgid "Cyprus" +msgstr "ไซปรัส" + +#. 203 +msgid "Czech Republic" +msgstr "สาธารณรัฐเชค" + +#. 276 +msgid "Germany" +msgstr "เยอรมันนี" + +#. 262 +msgid "Djibouti" +msgstr "จิบูติ" + +#. 208 +msgid "Denmark" +msgstr "เดนมาร์ก" + +#. 212 +msgid "Dominica" +msgstr "โดมินากัน" + +#. 214 +msgid "Dominican Republic" +msgstr "สาธารณรัฐโดมินิกัน" + +#. 012 +msgid "Algeria" +msgstr "อัลจีเรีย" + +#. 218 +msgid "Ecuador" +msgstr "เอกวาดอร์" + +#. 233 +msgid "Estonia" +msgstr "เอสโทเนีย" + +#. 818 +msgid "Egypt" +msgstr "อียิปต์" + +#. 732 +msgid "Western Sahara" +msgstr "ซาฮาร่าตะวันตก" + +#. 232 +msgid "Eritrea" +msgstr "เอริเทรีย" + +#. 724 +msgid "Spain" +msgstr "สเปน" + +#. 231 +msgid "Ethiopia" +msgstr "เอธิโอเปีย" + +#. 246 +msgid "Finland" +msgstr "ฟินแลนด์" + +#. 242 +msgid "Fiji" +msgstr "ฟิจิ" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "หมู่เกาะฟอล์กแลนด์ (มาลบีนาส)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "ไมโครนีเซีย" + +#. 234 +msgid "Faroe Islands" +msgstr "หมู่เกาะแฟโร" + +#. 250 +msgid "France" +msgstr "ฝรั่งเศส" + +#. 266 +msgid "Gabon" +msgstr "กาบอน" + +#. 826 +msgid "United Kingdom" +msgstr "อังกฤษ" + +#. 308 +msgid "Grenada" +msgstr "เกรนาดา" + +#. 268 +msgid "Georgia" +msgstr "จอร์เจีย" + +#. 254 +msgid "French Guiana" +msgstr "เฟรนช์เกียนา" + +#. 831 +msgid "Guernsey" +msgstr "เกิร์นซีย์" + +#. 288 +msgid "Ghana" +msgstr "กานา" + +#. 292 +msgid "Gibraltar" +msgstr "ยิบรอลตา" + +#. 304 +msgid "Greenland" +msgstr "กรีนแลนด์" + +#. 270 +msgid "Gambia" +msgstr "แกมเบีย" + +#. 324 +msgid "Guinea" +msgstr "กินี" + +#. 312 +msgid "Guadeloupe" +msgstr "กวาเดอลูป" + +#. 226 +msgid "Equatorial Guinea" +msgstr "กินี ตรงเส้นศูนย์สูตร" + +#. 300 +msgid "Greece" +msgstr "กรีซ" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "เกาะเซาท์จอร์เจียและหมู่เกาะเซาท์แซนด์วิช" + +#. 320 +msgid "Guatemala" +msgstr "กัวเตมาลา" + +#. 316 +msgid "Guam" +msgstr "กวม" + +#. 624 +msgid "Guinea-Bissau" +msgstr "กินี - บิสซอ" + +#. 328 +msgid "Guyana" +msgstr "กูยาน่า" + +#. 344 +msgid "Hong Kong" +msgstr "ฮ่องกง" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "เกาะเฮิร์ดและหมู่เกาะแมกดอนัลด์" + +#. 340 +msgid "Honduras" +msgstr "ฮอนดูรัส" + +#. 191 +msgid "Croatia" +msgstr "โครเอเธีย" + +#. 332 +msgid "Haiti" +msgstr "ไฮติ" + +#. 348 +msgid "Hungary" +msgstr "ฮังการี" + +#. 360 +msgid "Indonesia" +msgstr "อินโดนีเซีย" + +#. 372 +msgid "Ireland" +msgstr "ไอร์แลนด์" + +#. 376 +msgid "Israel" +msgstr "อิสราเอล" + +#. 833 +msgid "Isle of Man" +msgstr "เกาะแมน" + +#. 356 +msgid "India" +msgstr "อินเดีย" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "บริติชอินเดียนโอเชียนเทร์ริทอรี" + +#. 368 +msgid "Iraq" +msgstr "อิรัก" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "" + +#. 352 +msgid "Iceland" +msgstr "ไอซ์แลนด์" + +#. 380 +msgid "Italy" +msgstr "อิตาลี" + +#. 832 +msgid "Jersey" +msgstr "เจอร์ซีย์" + +#. 388 +msgid "Jamaica" +msgstr "จาไมก้า" + +#. 400 +msgid "Jordan" +msgstr "จอร์แดน" + +#. 392 +msgid "Japan" +msgstr "ญี่ปุ่น" + +#. 404 +msgid "Kenya" +msgstr "เคนยา" + +#. 417 +msgid "Kyrgyzstan" +msgstr "คีร์กีซสถาน" + +#. 116 +msgid "Cambodia" +msgstr "กัมพูชา" + +#. 296 +msgid "Kiribati" +msgstr "คิริบาติ" + +#. 174 +msgid "Comoros" +msgstr "โคโมรอส" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "เซนต์คิตส์และเนวิส" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "เกาหลีเหนือ" + +#. 410 +msgid "Korea, Republic of" +msgstr "เกาหลีใต้" + +#. 414 +msgid "Kuwait" +msgstr "คูเวต" + +#. 136 +msgid "Cayman Islands" +msgstr "หมู่เกาะเคย์แมน" + +#. 398 +msgid "Kazakhstan" +msgstr "คาซัคสถาน" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "สาธารณรัฐประชาธิปไตยประชาชนลาว" + +#. 422 +msgid "Lebanon" +msgstr "เลบานอน" + +#. 662 +msgid "Saint Lucia" +msgstr "เซนต์ลูเซีย" + +#. 438 +msgid "Liechtenstein" +msgstr "ลิชเทนสไตน์" + +#. 144 +msgid "Sri Lanka" +msgstr "ศรีลังกา" + +#. 430 +msgid "Liberia" +msgstr "ไลบีเรีย" + +#. 426 +msgid "Lesotho" +msgstr "เลโซโต" + +#. 440 +msgid "Lithuania" +msgstr "ลิธัวเนีย" + +#. 442 +msgid "Luxembourg" +msgstr "ลักเซมเบอร์ก" + +#. 428 +msgid "Latvia" +msgstr "ลัธเวีย" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "ลิเบีย" + +#. 504 +msgid "Morocco" +msgstr "โมร็อคโค" + +#. 492 +msgid "Monaco" +msgstr "โมนาโค" + +#. 498 +msgid "Moldova, Republic of" +msgstr "มอลโดวา, สาธารณรัฐ" + +#. 499 +msgid "Montenegro" +msgstr "มอนเตเนโกร" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "แซงมาร์แตง (ส่วนของฝรั่งเศส)" + +#. 450 +msgid "Madagascar" +msgstr "มาดากัสกา" + +#. 584 +msgid "Marshall Islands" +msgstr "หมู่เกาะมาแชล" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "" + +#. 466 +msgid "Mali" +msgstr "มาลี" + +#. 104 +msgid "Myanmar" +msgstr "พม่า" + +#. 496 +msgid "Mongolia" +msgstr "มองโกเลีย" + +#. 446 +msgid "Macao" +msgstr "มาเก๊า" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "หมู่เกาะมาเรียน่เหนือ" + +#. 474 +msgid "Martinique" +msgstr "มาทินิค" + +#. 478 +msgid "Mauritania" +msgstr "มอริทาเนีย" + +#. 500 +msgid "Montserrat" +msgstr "มอนต์เซอร์รัท" + +#. 470 +msgid "Malta" +msgstr "มอลตา" + +#. 480 +msgid "Mauritius" +msgstr "มอริเชียส" + +#. 462 +msgid "Maldives" +msgstr "มัลดิฟ" + +#. 454 +msgid "Malawi" +msgstr "มาลาวี" + +#. 484 +msgid "Mexico" +msgstr "เม็กซิโก" + +#. 458 +msgid "Malaysia" +msgstr "มาเลเซีย" + +#. 508 +msgid "Mozambique" +msgstr "โมแซมบิก" + +#. 516 +msgid "Namibia" +msgstr "นามิเบีย" + +#. 540 +msgid "New Caledonia" +msgstr "นิวคาเลโดเนีย" + +#. 562 +msgid "Niger" +msgstr "ไนเจอร์" + +#. 574 +msgid "Norfolk Island" +msgstr "เกาะนอร์ฟอล์ค" + +#. 566 +msgid "Nigeria" +msgstr "ไนจีเรีย" + +#. 558 +msgid "Nicaragua" +msgstr "นิคารากัว" + +#. 528 +msgid "Netherlands" +msgstr "เนเธอร์แลนด์" + +#. 578 +msgid "Norway" +msgstr "นอร์เวย์" + +#. 524 +msgid "Nepal" +msgstr "เนปาล" + +#. 520 +msgid "Nauru" +msgstr "นาวรู" + +#. 570 +msgid "Niue" +msgstr "นิอุเอ" + +#. 554 +msgid "New Zealand" +msgstr "นิวซีแลนด์" + +#. 512 +msgid "Oman" +msgstr "โอมาน" + +#. 591 +msgid "Panama" +msgstr "ปานามา" + +#. 604 +msgid "Peru" +msgstr "เปรู" + +#. 258 +msgid "French Polynesia" +msgstr "ฝรั่งเศสโพลีนีเซีย" + +#. 598 +msgid "Papua New Guinea" +msgstr "ปาปัวนิวกินี" + +#. 608 +msgid "Philippines" +msgstr "ฟิลิปปินส์" + +#. 586 +msgid "Pakistan" +msgstr "ปากีสถาน" + +#. 616 +msgid "Poland" +msgstr "โปแลนด์" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "แซงปีแยร์และมีเกอลง" + +#. 612 +msgid "Pitcairn" +msgstr "พิตแคร์น" + +#. 630 +msgid "Puerto Rico" +msgstr "เปอร์โตริโก" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "ปาเลสไตน์, ดินแดนยึดครอง" + +#. 620 +msgid "Portugal" +msgstr "โปรตุเกส" + +#. 585 +msgid "Palau" +msgstr "เกาะพาเลา" + +#. 600 +msgid "Paraguay" +msgstr "ปารากวัย" + +#. 634 +msgid "Qatar" +msgstr "กาตาร์" + +#. 638 +msgid "Reunion" +msgstr "รียูเนียน" + +#. 642 +msgid "Romania" +msgstr "โรมาเนีย" + +#. 688 +msgid "Serbia" +msgstr "เซอร์เบีย" + +#. 643 +msgid "Russian Federation" +msgstr "สมาพันธรัฐรัสเซีย" + +#. 646 +msgid "Rwanda" +msgstr "รวันด้า" + +#. 682 +msgid "Saudi Arabia" +msgstr "ซาอุดิอาระเบีย" + +#. 090 +msgid "Solomon Islands" +msgstr "หมู่เกาะโซโลมอน" + +#. 690 +msgid "Seychelles" +msgstr "ซีเชลล์" + +#. 736 +msgid "Sudan" +msgstr "ซูดาน" + +#. 752 +msgid "Sweden" +msgstr "สวีเดน" + +#. 702 +msgid "Singapore" +msgstr "สิงคโปร์" + +#. 654 +msgid "Saint Helena" +msgstr "เซนต์เฮเลนา" + +#. 705 +msgid "Slovenia" +msgstr "สโลเวเนีย" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "สฟาลบาร์ และ ยานไมเอน" + +#. 703 +msgid "Slovakia" +msgstr "สโลวาเกีย" + +#. 694 +msgid "Sierra Leone" +msgstr "" + +#. 674 +msgid "San Marino" +msgstr "ซานมาริโน" + +#. 686 +msgid "Senegal" +msgstr "เซนีกัล" + +#. 706 +msgid "Somalia" +msgstr "โซมาเลีย" + +#. 740 +msgid "Suriname" +msgstr "ซูรีนามิ" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "ซาวโทม และ พรินซิป" + +#. 222 +msgid "El Salvador" +msgstr "เอลซัลวาดอร์" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "สาธารณรัฐอาหรับซีเรีย" + +#. 748 +msgid "Swaziland" +msgstr "สวาซิแลนด์" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "เกาะดติร์กและเคคอส" + +#. 148 +msgid "Chad" +msgstr "ชาด" + +#. 260 +msgid "French Southern Territories" +msgstr "เฟรนช์เซาเทิร์นเทร์ริทอรีส์" + +#. 768 +msgid "Togo" +msgstr "โตโก" + +#. 764 +msgid "Thailand" +msgstr "ราชอาณาจักรไทย" + +#. 762 +msgid "Tajikistan" +msgstr "ธาจีกิสถาน" + +#. 772 +msgid "Tokelau" +msgstr "โตเกเลา" + +#. 626 +msgid "Timor-Leste" +msgstr "ติมอร์ตะวันออก" + +#. 795 +msgid "Turkmenistan" +msgstr "เตอร์กเมนิสถาน" + +#. 788 +msgid "Tunisia" +msgstr "ตูนีเซีย" + +#. 776 +msgid "Tonga" +msgstr "ตองก้า" + +#. 792 +msgid "Turkey" +msgstr "ตุรกี" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "ตรีนิแดดและโทบาโก" + +#. 798 +msgid "Tuvalu" +msgstr "ตูวาลู" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "ไต้หวัน, จังหวัดของจีน" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "แทนซาเนีย, สหสาธารณรัฐ" + +#. 804 +msgid "Ukraine" +msgstr "ยูเครน" + +#. 800 +msgid "Uganda" +msgstr "ยูกันดา" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "เกาะเล็กรอบนอกของสหรัฐอเมริกา" + +#. 840 +msgid "United States" +msgstr "สหรัฐ" + +#. 858 +msgid "Uruguay" +msgstr "อุรุกวัย" + +#. 860 +msgid "Uzbekistan" +msgstr "อุซเบกิสถาน" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "นครรัฐวาติกัน" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "เซนต์วินเซนต์และเกรนาดีนส์" + +#. 862 +msgid "Venezuela" +msgstr "เวเนซุเอลา" + +#. 092 +msgid "Virgin Islands, British" +msgstr "หมู่เกาะบริติชเวอร์จิน" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "หมู่เกาะเวอร์จินของสหรัฐอเมริกา" + +#. 704 +msgid "Viet Nam" +msgstr "เวียตนาม" + +#. 548 +msgid "Vanuatu" +msgstr "แวนัวตู" + +#. 876 +msgid "Wallis and Futuna" +msgstr "หมู่เกาะวาลลิสและหมู่เกาะฟูตูนา" + +#. 882 +msgid "Samoa" +msgstr "ซามัว" + +#. 887 +msgid "Yemen" +msgstr "เยเมน" + +#. 175 +msgid "Mayotte" +msgstr "เมโยเต้" + +#. 710 +msgid "South Africa" +msgstr "แอฟริกาใต้" + +#. 894 +msgid "Zambia" +msgstr "แซมเบีย" + +#. 716 +msgid "Zimbabwe" +msgstr "ซิมบับเว" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "" + +msgid "Car" +msgstr "รถยนต์" + +msgid "Iso2" +msgstr "ISO2" + +msgid "Iso3" +msgstr "ISO3" + +msgid "Country" +msgstr "ประเทศ" + +msgid "Postal" +msgstr "ไปรษณีย์" + +msgid "Town" +msgstr "เมือง" + +msgid "District" +msgstr "เขต" + +msgid "Street" +msgstr "ถนน" + +msgid "Number" +msgstr "หมายเลข" + +msgid "Enter Destination" +msgstr "กำหนด ที่หมาย" + +msgid "Zip Code" +msgstr "รหัสไปรษณีย์" + +msgid "City" +msgstr "เมือง" + +msgid "District/Township" +msgstr "" + +msgid "Map" +msgstr "แผนที่" + +msgid "Bookmark" +msgstr "" + +msgid "Destination" +msgstr "จุดหมาย" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "แสดง" + +msgid "_Route" +msgstr "เส้นทาง" + +msgid "_Former Destinations" +msgstr "ก่อนถึง ที่หมาย" + +msgid "_Bookmarks" +msgstr "บุ๊กมาร์ก" + +msgid "_Map" +msgstr "แผนที่" + +msgid "_Layout" +msgstr "การจัดเรียง" + +msgid "_Projection" +msgstr "การฉายแผนที่" + +msgid "_Vehicle" +msgstr "ยานพาหนะ" + +msgid "Zoom_Out" +msgstr "ขยายออก" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "ขยายเข้า" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "คำนวนใหม่" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "ข้อมูล" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "หยุดการนำทาง" + +msgid "Test" +msgstr "ทดสอบ" + +msgid "_Quit" +msgstr "_ออกจากโปรแกรม" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "แสดงผลเต็มจอภาพ" + +msgid "Data" +msgstr "ข้อมูล" + +msgid "N" +msgstr "เหนือ" + +msgid "NE" +msgstr "ตะวันออกเฉียงเหนือ" + +msgid "E" +msgstr "ตะวันออก" + +msgid "SE" +msgstr "ตะวันออกเฉียงใต้" + +msgid "S" +msgstr "ใต้" + +msgid "SW" +msgstr "ตะวันตกเฉียงใต้" + +msgid "W" +msgstr "ตะวันตก" + +msgid "NW" +msgstr "ตะวันออกเฉียงเหนือ" + +msgid "No" +msgstr "" + +msgid "2D" +msgstr "" + +msgid "3D" +msgstr "" + +msgid "OT" +msgstr "" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "เส้นทาง %4.0f กม. %02d:%02d ETA" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "เส้นทาง 0000km 0+00:00 ETA" + +msgid "Back to map" +msgstr "" + +msgid "Main Menu" +msgstr "" + +msgid "Help" +msgstr "" + +msgid "Back" +msgstr "" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "" + +msgid "View in Browser" +msgstr "" + +msgid "Streets" +msgstr "" + +msgid "House numbers" +msgstr "" + +msgid "View Attributes" +msgstr "" + +msgid "View on map" +msgstr "" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "บุ๊กมาร์ก" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "" + +msgid "Former Destinations" +msgstr "ก่อนถึง ที่หมาย" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "" + +msgid "Layout" +msgstr "การจัดเรียง" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "" + +msgid "Show Satellite Status" +msgstr "" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "" + +msgid "car" +msgstr "" + +msgid "bike" +msgstr "" + +msgid "pedestrian" +msgstr "" + +#, c-format +msgid "Current profile: %s" +msgstr "" + +#, c-format +msgid "Change profile to: %s" +msgstr "" + +msgid "Set as active" +msgstr "" + +msgid "Show Satellite status" +msgstr "" + +msgid "Show NMEA data" +msgstr "" + +msgid "Vehicle" +msgstr "ยานพาหนะ" + +msgid "Rules" +msgstr "" + +msgid "Lock on road" +msgstr "" + +msgid "Northing" +msgstr "ทางทิศเหนือ" + +msgid "Map follows Vehicle" +msgstr "" + +msgid "Message" +msgstr "" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "" + +msgid "Vehicle Position" +msgstr "" + +msgid "Main menu" +msgstr "" + +msgid "" +"Show\n" +"Map" +msgstr "" + +msgid "Settings" +msgstr "" + +msgid "Tools" +msgstr "" + +msgid "Route" +msgstr "เส้นทาง" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" + +msgid "Display" +msgstr "แสดง" + +msgid "Fullscreen" +msgstr "แสดงผลเต็มจอภาพ" + +msgid "Window Mode" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "Cursor" +#~ msgstr "เคอร์เซอร์" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d กิโลเมตร" diff --git a/po/tr.po.in b/po/tr.po.in new file mode 100644 index 0000000..7eb7293 --- /dev/null +++ b/po/tr.po.in @@ -0,0 +1,1757 @@ +# Turkish translation for navit +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the navit package. +# seqizz (gurkanGur) 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-05-10 15:05+0000\n" +"Last-Translator: seqizz (gurkanGur) \n" +"Language-Team: Turkish \n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Kaynak klasörden çalıştırılıyor\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "'%s' , '%s' değerine ayarlanıyor\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "sıfırıncı" + +msgid "first" +msgstr "birinci" + +msgid "second" +msgstr "ikinci" + +msgid "third" +msgstr "üçüncü" + +msgid "fourth" +msgstr "dördüncü" + +msgid "fifth" +msgstr "beşinci" + +msgid "sixth" +msgstr "altıncı" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "sıfırıncı çıkış" + +msgid "first exit" +msgstr "ilk çıkış" + +msgid "second exit" +msgstr "ikinci çıkış" + +msgid "third exit" +msgstr "üçüncü çıkış" + +msgid "fourth exit" +msgstr "dördüncü çıkış" + +msgid "fifth exit" +msgstr "beşinci çıkış" + +msgid "sixth exit" +msgstr "altıncı çıkış" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "%d m'de" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d metre" + +#, c-format +msgid "in %d meters" +msgstr "%d metrede" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d kilometre" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "%d.%d kilometrede" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "%d kilometre" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "%d kilometrede" + +msgid "exit" +msgstr "çıkış" + +msgid "into the ramp" +msgstr "rampada" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%sCaddesi'ne %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%scaddesine %s%s%s|male form" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%scaddesine %s%s%s|female form" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%scaddesine %s%s%s|neutral form" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%s%s yoluna" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "Sağa" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "Sola" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "kolayca " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "sertçe " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "gerçekten sertçe " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "bilinmeyen " + +msgid "When possible, please turn around" +msgstr "Müsait olduğunda lütfen yönünü değiştir" + +msgid "Enter the roundabout soon" +msgstr "Yakındaki kavşağa girin" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "ardından %s'de kavşaktan çıkın" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "%s'de kavşaktan çıkın" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Gelecek %s için yolu takip et" + +msgid "soon" +msgstr "yakında" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "%1$s yolunda %2$s yönüne dönün" + +#, c-format +msgid "after %i roads" +msgstr "%i yol sonra" + +msgid "now" +msgstr "şimdi" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "ardından %1$s yolunda %2$s yönüne dönün" + +msgid "error" +msgstr "hata" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Dönüş %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "sonra %1$s%2$s %3$s%4$s dönün" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Hedefinize ulaştınız, %s" + +msgid "then you have reached your destination." +msgstr "ardından hedefinize ulaşacaksınız" + +msgid "Position" +msgstr "Konum" + +msgid "Command" +msgstr "Komut" + +msgid "Length" +msgstr "Uzaklık" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Zaman" + +msgid "Destination Length" +msgstr "Hedef Uzaklığı" + +msgid "Destination Time" +msgstr "Varış Zamanı" + +msgid "Roadbook" +msgstr "Yol Haritası" + +msgid "Set as position" +msgstr "Pozisyon olarak ayarla" + +msgid "Set as destination" +msgstr "Hedef olarak ayarla" + +msgid "Add as bookmark" +msgstr "Yer imi olarak ayarla" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Nokta 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Ekran koordinatları :%d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "Birleşik Arap Emirlikleri" + +#. 004 +msgid "Afghanistan" +msgstr "Afganistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua ve Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Angola" + +#. 008 +msgid "Albania" +msgstr "Arnavutluk" + +#. 051 +msgid "Armenia" +msgstr "Ermenistan" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Hollanda Antilleri" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarktika" + +#. 032 +msgid "Argentina" +msgstr "Arjantin" + +#. 016 +msgid "American Samoa" +msgstr "Amerikan Samoa" + +#. 040 +msgid "Austria" +msgstr "Avusturya" + +#. 036 +msgid "Australia" +msgstr "Avustralya" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Aland Adaları" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbeycan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosna Hersek" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladeş" + +#. 056 +msgid "Belgium" +msgstr "Belçika" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgaristan" + +#. 048 +msgid "Bahrain" +msgstr "Bahreyn" + +#. 108 +msgid "Burundi" +msgstr "Brundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint Barthelemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Bruney" + +#. 068 +msgid "Bolivia" +msgstr "Bolivya" + +#. 076 +msgid "Brazil" +msgstr "Brezilya" + +#. 044 +msgid "Bahamas" +msgstr "Bahamalar" + +#. 064 +msgid "Bhutan" +msgstr "Bhutan" + +#. 074 +msgid "Bouvet Island" +msgstr "Bouvet Adası" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Beyaz Rusya" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Kanada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Cocos (Keeling) Adaları" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Kongo Demokratik Cumhuriyeti" + +#. 140 +msgid "Central African Republic" +msgstr "Merkezi Afrika Cumhuriyeti" + +#. 178 +msgid "Congo" +msgstr "Kongo" + +#. 756 +msgid "Switzerland" +msgstr "İsviçre" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Cote d'Ivoire" + +#. 184 +msgid "Cook Islands" +msgstr "Cook Adaları" + +#. 152 +msgid "Chile" +msgstr "Şili" + +#. 120 +msgid "Cameroon" +msgstr "Kamerun" + +#. 156 +msgid "China" +msgstr "Çin" + +#. 170 +msgid "Colombia" +msgstr "Kolombiya" + +#. 188 +msgid "Costa Rica" +msgstr "Kosta Rika" + +#. 192 +msgid "Cuba" +msgstr "Küba" + +#. 132 +msgid "Cape Verde" +msgstr "Cape Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Christmas Island" + +#. 196 +msgid "Cyprus" +msgstr "Kıbrıs" + +#. 203 +msgid "Czech Republic" +msgstr "Çek Cumhuriyeti" + +#. 276 +msgid "Germany" +msgstr "Almanya" + +#. 262 +msgid "Djibouti" +msgstr "Cibuti" + +#. 208 +msgid "Denmark" +msgstr "Danimarka" + +#. 212 +msgid "Dominica" +msgstr "Dominik" + +#. 214 +msgid "Dominican Republic" +msgstr "Dominik Cumhuriyeti" + +#. 012 +msgid "Algeria" +msgstr "Cezayir" + +#. 218 +msgid "Ecuador" +msgstr "Ekvator" + +#. 233 +msgid "Estonia" +msgstr "Estonya" + +#. 818 +msgid "Egypt" +msgstr "Mısır" + +#. 732 +msgid "Western Sahara" +msgstr "Batı Sahra" + +#. 232 +msgid "Eritrea" +msgstr "Eritre" + +#. 724 +msgid "Spain" +msgstr "İspanya" + +#. 231 +msgid "Ethiopia" +msgstr "Etyopya" + +#. 246 +msgid "Finland" +msgstr "Finlandiya" + +#. 242 +msgid "Fiji" +msgstr "Fiji" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falkland Adaları (Malvinas)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Mikronezya, Federe Devletleri" + +#. 234 +msgid "Faroe Islands" +msgstr "Faroe Adaları" + +#. 250 +msgid "France" +msgstr "Fransa" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Birleşik Krallık" + +#. 308 +msgid "Grenada" +msgstr "Granada" + +#. 268 +msgid "Georgia" +msgstr "Gürcistan" + +#. 254 +msgid "French Guiana" +msgstr "Fransız Guyanası" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Gana" + +#. 292 +msgid "Gibraltar" +msgstr "Cebelitarık" + +#. 304 +msgid "Greenland" +msgstr "Grönland" + +#. 270 +msgid "Gambia" +msgstr "Gambiya" + +#. 324 +msgid "Guinea" +msgstr "Gine" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadalup" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Ekvator Ginesi" + +#. 300 +msgid "Greece" +msgstr "Yunanistan" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Güney Gürcistan ve Güney Sandoviç Adaları" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Gine-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hong Kong" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heard Adası ve McDonald Adaları" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Hırvatistan" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Macaristan" + +#. 360 +msgid "Indonesia" +msgstr "Endonezya" + +#. 372 +msgid "Ireland" +msgstr "İrlanda" + +#. 376 +msgid "Israel" +msgstr "İsrail" + +#. 833 +msgid "Isle of Man" +msgstr "Man adası" + +#. 356 +msgid "India" +msgstr "Hindistan" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Hint Okyanusu İngiliz Bölgesi" + +#. 368 +msgid "Iraq" +msgstr "Irak" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "İran, İslâm Cumhuriyeti" + +#. 352 +msgid "Iceland" +msgstr "İzlanda" + +#. 380 +msgid "Italy" +msgstr "İtalya" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaika" + +#. 400 +msgid "Jordan" +msgstr "Ürdün" + +#. 392 +msgid "Japan" +msgstr "Japonya" + +#. 404 +msgid "Kenya" +msgstr "Kenya" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kırgızistan" + +#. 116 +msgid "Cambodia" +msgstr "Kamboçya" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Komoros" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Sen Kitts ve Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Kore, Demokratik Halk Cumhuriyeti" + +#. 410 +msgid "Korea, Republic of" +msgstr "Kore Cumhuriyeti" + +#. 414 +msgid "Kuwait" +msgstr "Kuveyt" + +#. 136 +msgid "Cayman Islands" +msgstr "Seyman Adaları" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazakistan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Lao, Demokratik Halk Cumhuriyeti" + +#. 422 +msgid "Lebanon" +msgstr "Lübnan" + +#. 662 +msgid "Saint Lucia" +msgstr "Sen Lusia" + +#. 438 +msgid "Liechtenstein" +msgstr "Lihtenştayn" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberya" + +#. 426 +msgid "Lesotho" +msgstr "Lesoto" + +#. 440 +msgid "Lithuania" +msgstr "Litvanya" + +#. 442 +msgid "Luxembourg" +msgstr "Lüksemburg" + +#. 428 +msgid "Latvia" +msgstr "Letonya" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libya" + +#. 504 +msgid "Morocco" +msgstr "Fas" + +#. 492 +msgid "Monaco" +msgstr "Monako" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldova Cumhuriyeti" + +#. 499 +msgid "Montenegro" +msgstr "Karadağ" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Sen Martin (Fransız kısmı)" + +#. 450 +msgid "Madagascar" +msgstr "Madagaskar" + +#. 584 +msgid "Marshall Islands" +msgstr "Marshall Adaları" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Makedonya" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Moğolistan" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Northern Mariana Adaları" + +#. 474 +msgid "Martinique" +msgstr "Martinik" + +#. 478 +msgid "Mauritania" +msgstr "Moritanya" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauritius" + +#. 462 +msgid "Maldives" +msgstr "Maldivler" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Meksika" + +#. 458 +msgid "Malaysia" +msgstr "Malezya" + +#. 508 +msgid "Mozambique" +msgstr "Mozambik" + +#. 516 +msgid "Namibia" +msgstr "Namibiya" + +#. 540 +msgid "New Caledonia" +msgstr "Yeni Kaledonya" + +#. 562 +msgid "Niger" +msgstr "Nijer" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolk Adası" + +#. 566 +msgid "Nigeria" +msgstr "Nijerya" + +#. 558 +msgid "Nicaragua" +msgstr "Nikaragua" + +#. 528 +msgid "Netherlands" +msgstr "Hollanda" + +#. 578 +msgid "Norway" +msgstr "Norveç" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "Yeni Zelanda" + +#. 512 +msgid "Oman" +msgstr "Umman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "Fransız Polinezyası" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua Yeni Gine" + +#. 608 +msgid "Philippines" +msgstr "Filipinler" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Polonya" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint Pierre ve Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Porto Riko" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Filistin Özerk Bölgesi" + +#. 620 +msgid "Portugal" +msgstr "Portekiz" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Katar" + +#. 638 +msgid "Reunion" +msgstr "Reunion" + +#. 642 +msgid "Romania" +msgstr "Romanya" + +#. 688 +msgid "Serbia" +msgstr "Sırbistan" + +#. 643 +msgid "Russian Federation" +msgstr "Rusya Federasyonu" + +#. 646 +msgid "Rwanda" +msgstr "Ruanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Suudi Arabistan" + +#. 090 +msgid "Solomon Islands" +msgstr "Solomon Adaları" + +#. 690 +msgid "Seychelles" +msgstr "Seyşel Adaları" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "İsveç" + +#. 702 +msgid "Singapore" +msgstr "Singapur" + +#. 654 +msgid "Saint Helena" +msgstr "Saint Helena" + +#. 705 +msgid "Slovenia" +msgstr "Slovenya" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard ve Jan Mayen Adaları" + +#. 703 +msgid "Slovakia" +msgstr "Slovakya" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somali" + +#. 740 +msgid "Suriname" +msgstr "Surinam" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Sao Tome ve Principe" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Suriye" + +#. 748 +msgid "Swaziland" +msgstr "Swaziland" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turks ve Kaykos Adaları" + +#. 148 +msgid "Chad" +msgstr "Çad" + +#. 260 +msgid "French Southern Territories" +msgstr "Güney Fransa Bölgeleri" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Tayland" + +#. 762 +msgid "Tajikistan" +msgstr "Tacikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Timor-Leste" + +#. 795 +msgid "Turkmenistan" +msgstr "Türkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunus" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Türkiye" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad ve Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Tayvan, Çin Eyaleti" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzanya, Birleşik Cumhuriyeti" + +#. 804 +msgid "Ukraine" +msgstr "Ukrayna" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Küçük Birleşik Devletler adaları" + +#. 840 +msgid "United States" +msgstr "Birleşik Devletler" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Özbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Vatikan" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Sen Vinsınt ve Granadalar" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Virgin Adaları, İngiliz" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Virgin Adaları, A.B.D." + +#. 704 +msgid "Viet Nam" +msgstr "Vietnam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis ve Futuna Adaları" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Yemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "Güney Afrika" + +#. 894 +msgid "Zambia" +msgstr "Zambiya" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabve" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* tanınmıyor, bu yerleşime bir etiket ekleyin" + +msgid "Car" +msgstr "Araç" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Isa3" + +msgid "Country" +msgstr "Ülke" + +msgid "Postal" +msgstr "Posta" + +msgid "Town" +msgstr "Şehir" + +msgid "District" +msgstr "Bölge" + +msgid "Street" +msgstr "Cadde" + +msgid "Number" +msgstr "Numara" + +msgid "Enter Destination" +msgstr "Hedefi Giriniz" + +msgid "Zip Code" +msgstr "Zip Kodu" + +msgid "City" +msgstr "Şehir" + +msgid "District/Township" +msgstr "Bölge/Mahal" + +msgid "Map" +msgstr "Harita" + +msgid "Bookmark" +msgstr "Yer imi" + +msgid "Destination" +msgstr "Hedef" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Görüntüle" + +msgid "_Route" +msgstr "Rota" + +msgid "_Former Destinations" +msgstr "önceki istikamet" + +msgid "_Bookmarks" +msgstr "Yer İmleri" + +msgid "_Map" +msgstr "Harita" + +msgid "_Layout" +msgstr "Yerleşim" + +msgid "_Projection" +msgstr "İzdüşüm" + +msgid "_Vehicle" +msgstr "Araç" + +msgid "Zoom_Out" +msgstr "Uzaklaştır" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Yakınlaştır" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Yeniden hesapla" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Bilgi" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Dolaşmayı Durdur" + +msgid "Test" +msgstr "Test" + +msgid "_Quit" +msgstr "Çı_kış" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Kapalı yol" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Yol Haritası" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Oto-yaklaş" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Tam Ekran" + +msgid "Data" +msgstr "Veri" + +msgid "N" +msgstr "K" + +msgid "NE" +msgstr "KD" + +msgid "E" +msgstr "D" + +msgid "SE" +msgstr "GD" + +msgid "S" +msgstr "G" + +msgid "SW" +msgstr "GB" + +msgid "W" +msgstr "B" + +msgid "NW" +msgstr "Kuzey-Batı" + +msgid "No" +msgstr "Hayır" + +msgid "2D" +msgstr "2B" + +msgid "3D" +msgstr "3B" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Rota %4.0fkm %02d:%02d ETA" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Rota 0000km 0+00:00 ETA" + +msgid "Back to map" +msgstr "Haritaya dön" + +msgid "Main Menu" +msgstr "Ana Menü" + +msgid "Help" +msgstr "Yardım" + +msgid "Back" +msgstr "Geri" + +msgid "Add Bookmark" +msgstr "Yer İmi Ekle" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "İlgi Noktaları" + +msgid "View in Browser" +msgstr "Tarayıcıda Bak" + +msgid "Streets" +msgstr "Sokaklar" + +msgid "House numbers" +msgstr "Ev numaraları" + +msgid "View Attributes" +msgstr "Özniteliklere Bak" + +msgid "View on map" +msgstr "Haritada bak" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "Yer İmleri" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "Yerimi ata %s" + +msgid "Former Destinations" +msgstr "önceki istikamet" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Ev no:" + +msgid "Layout" +msgstr "Yerleşim" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Haritalar" + +msgid "Show Satellite Status" +msgstr "Uydu durumunu göster" + +msgid " Elevation " +msgstr " Yükseklik " + +msgid " Azimuth " +msgstr " Azimut " + +msgid "Show NMEA Data" +msgstr "NMEA verisi göster" + +msgid "car" +msgstr "araba" + +msgid "bike" +msgstr "bisiklet" + +msgid "pedestrian" +msgstr "yaya" + +#, c-format +msgid "Current profile: %s" +msgstr "Geçerli profil: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Yeni profil: %s" + +msgid "Set as active" +msgstr "Etkin olarak ata" + +msgid "Show Satellite status" +msgstr "Uydu durumunuı göster" + +msgid "Show NMEA data" +msgstr "NMEA verisi göster" + +msgid "Vehicle" +msgstr "Araç" + +msgid "Rules" +msgstr "Kurallar" + +msgid "Lock on road" +msgstr "Yola Kilitlen" + +msgid "Northing" +msgstr "Kuzey mesafesi" + +msgid "Map follows Vehicle" +msgstr "Harita aracı takip etsin" + +msgid "Message" +msgstr "Mesaj" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Rota Açıklaması" + +msgid "Height Profile" +msgstr "Yükseklik Profili" + +msgid "Show Locale" +msgstr "Yerel Ayarlar" + +msgid "About Navit" +msgstr "Navit Hakkında" + +#. Authors +msgid "By" +msgstr "Yazar" + +#. Contributors +msgid "And all the Navit Team" +msgstr "Ve tüm Navit takımı" + +msgid "members and contributors." +msgstr "üyeler ve katkıda bulunanlar." + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Harita Noktası" + +msgid "Vehicle Position" +msgstr "Araç Konumu" + +msgid "Main menu" +msgstr "Ana menü" + +msgid "" +"Show\n" +"Map" +msgstr "Haritayı Göster" + +msgid "Settings" +msgstr "Ayarlar" + +msgid "Tools" +msgstr "Araçlar" + +msgid "Route" +msgstr "Rota" + +msgid "About" +msgstr "Hakkında" + +msgid "Actions" +msgstr "Eylemler" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Çık" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Navigasyonu\n" +"Durdur" + +msgid "Display" +msgstr "Görüntüle" + +msgid "Fullscreen" +msgstr "Tam Ekran" + +msgid "Window Mode" +msgstr "Pencere Modu" + +msgid "Description" +msgstr "Açıklama" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "at" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "%s içerisinde kavşağa girin" + +#~ msgid "Cursor" +#~ msgstr "İmleç" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d kilometre" diff --git a/po/uk.po.in b/po/uk.po.in new file mode 100644 index 0000000..1702ce6 --- /dev/null +++ b/po/uk.po.in @@ -0,0 +1,1768 @@ +# Ukrainian translation for navit +# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 +# This file is distributed under the same license as the navit package. +# serg_stetsuk 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-05-28 14:54+0000\n" +"Last-Translator: andygol \n" +"Language-Team: Ukrainian \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Запуск з початкового каталогу\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "настройка '%s' до '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "нульовий" + +msgid "first" +msgstr "перший" + +msgid "second" +msgstr "другий" + +msgid "third" +msgstr "третій" + +msgid "fourth" +msgstr "четвертий" + +msgid "fifth" +msgstr "п’ятий" + +msgid "sixth" +msgstr "шостий" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "нульовий виїзд" + +msgid "first exit" +msgstr "перший виїзд" + +msgid "second exit" +msgstr "другий виїзд" + +msgid "third exit" +msgstr "третій виїзд" + +msgid "fourth exit" +msgstr "четвертий виїзд" + +msgid "fifth exit" +msgstr "п’ятий виїзд" + +msgid "sixth exit" +msgstr "шостий виїзд" + +#, c-format +msgid "%d m" +msgstr "%d м" + +#, c-format +msgid "in %d m" +msgstr "за %d м" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d метрів" + +#, c-format +msgid "in %d meters" +msgstr "за %d метрів" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d кілометрів" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "за %d.%d кілометрів" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "%d кілометр" +msgstr[1] "%d кілометри" +msgstr[2] "%d кілометрів" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "за %d кілометр" +msgstr[1] "за %d кілометри" +msgstr[2] "за %d кілометрів" + +msgid "exit" +msgstr "виїзд" + +msgid "into the ramp" +msgstr "з'їзд на" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s на вулицю %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%s на %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%s на %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%s на %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%s в %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "праворуч" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "ліворуч" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "легко " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "круто " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "дуже круто " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "невідомо " + +msgid "When possible, please turn around" +msgstr "Якщо це можливо, то розверніться" + +msgid "Enter the roundabout soon" +msgstr "Скоро виїзд на дорогу з кільцевим рухом" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "тоді виїдьте з кільця через %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Виїдьте з кільця через %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Їдьте дорогою наступні %s" + +msgid "soon" +msgstr "скоро" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "З’їдьте на дорогу %1$s до %2$s" + +#, c-format +msgid "after %i roads" +msgstr "після %i дороги" + +msgid "now" +msgstr "зараз" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "тоді виїдьте на доргу %1$s до %2$s" + +msgid "error" +msgstr "помилка" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Поверніть на %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "тоді поверніть на %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Ви досягли місця призначення %s" + +msgid "then you have reached your destination." +msgstr "і тоді Ви прибудете в місце призначення." + +msgid "Position" +msgstr "Позиція" + +msgid "Command" +msgstr "Команда" + +msgid "Length" +msgstr "Довжина" + +msgid "km" +msgstr "км" + +msgid "m" +msgstr "м" + +msgid "Time" +msgstr "Час" + +msgid "Destination Length" +msgstr "Відстань до місця призначення" + +msgid "Destination Time" +msgstr "Час до місця призначення" + +msgid "Roadbook" +msgstr "Атлас доріг" + +msgid "Set as position" +msgstr "Встановити як початкове положення" + +msgid "Set as destination" +msgstr "Встановити як місце призначення" + +msgid "Add as bookmark" +msgstr "Додати як закладку" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Точка 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Координати екрану: %d %d" + +#. 020 +msgid "Andorra" +msgstr "Андора" + +#. 784 +msgid "United Arab Emirates" +msgstr "Об’єднані Арабські Емірати" + +#. 004 +msgid "Afghanistan" +msgstr "Афганістан" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Антигуа і Барбуда" + +#. 660 +msgid "Anguilla" +msgstr "Ангілья" + +#. 008 +msgid "Albania" +msgstr "Албанія" + +#. 051 +msgid "Armenia" +msgstr "Вірменія" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Антильські острови (Нідерланди)" + +#. 024 +msgid "Angola" +msgstr "Ангола" + +#. 010 +msgid "Antarctica" +msgstr "Антарктика" + +#. 032 +msgid "Argentina" +msgstr "Аргентина" + +#. 016 +msgid "American Samoa" +msgstr "Американське Самоа" + +#. 040 +msgid "Austria" +msgstr "Австрія" + +#. 036 +msgid "Australia" +msgstr "Австралія" + +#. 533 +msgid "Aruba" +msgstr "Аруба" + +#. 248 +msgid "Aland Islands" +msgstr "Аландські острови" + +#. 031 +msgid "Azerbaijan" +msgstr "Азербайджан" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Боснія і Герцеговина" + +#. 052 +msgid "Barbados" +msgstr "Барбадос" + +#. 050 +msgid "Bangladesh" +msgstr "Бангладеш" + +#. 056 +msgid "Belgium" +msgstr "Бельгія" + +#. 854 +msgid "Burkina Faso" +msgstr "Буркіна Фасо" + +#. 100 +msgid "Bulgaria" +msgstr "Болгарія" + +#. 048 +msgid "Bahrain" +msgstr "Бахрейн" + +#. 108 +msgid "Burundi" +msgstr "Бурунді" + +#. 204 +msgid "Benin" +msgstr "Бенін" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Сен Бартельмі" + +#. 060 +msgid "Bermuda" +msgstr "Бермудські острови" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Бруней-Даруссалам" + +#. 068 +msgid "Bolivia" +msgstr "Болівія" + +#. 076 +msgid "Brazil" +msgstr "Бразілія" + +#. 044 +msgid "Bahamas" +msgstr "Багамські острови" + +#. 064 +msgid "Bhutan" +msgstr "Бутан" + +#. 074 +msgid "Bouvet Island" +msgstr "Острів Буве" + +#. 072 +msgid "Botswana" +msgstr "Ботсвана" + +#. 112 +msgid "Belarus" +msgstr "Білорусь" + +#. 084 +msgid "Belize" +msgstr "Беліз" + +#. 124 +msgid "Canada" +msgstr "Канада" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Кокосові острови" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Конго, Демократична Республіка" + +#. 140 +msgid "Central African Republic" +msgstr "Центрально-Африканська Республіка" + +#. 178 +msgid "Congo" +msgstr "Конго" + +#. 756 +msgid "Switzerland" +msgstr "Швейцарія" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Кот д’Івуар" + +#. 184 +msgid "Cook Islands" +msgstr "Острови Кука" + +#. 152 +msgid "Chile" +msgstr "Чілі" + +#. 120 +msgid "Cameroon" +msgstr "Камерун" + +#. 156 +msgid "China" +msgstr "Китай" + +#. 170 +msgid "Colombia" +msgstr "Колумбія" + +#. 188 +msgid "Costa Rica" +msgstr "Коста Ріка" + +#. 192 +msgid "Cuba" +msgstr "Куба" + +#. 132 +msgid "Cape Verde" +msgstr "Кабо-Верде" + +#. 162 +msgid "Christmas Island" +msgstr "Острів Різдва" + +#. 196 +msgid "Cyprus" +msgstr "Кіпр" + +#. 203 +msgid "Czech Republic" +msgstr "Чеська Республіка" + +#. 276 +msgid "Germany" +msgstr "Німеччина" + +#. 262 +msgid "Djibouti" +msgstr "Джибуті" + +#. 208 +msgid "Denmark" +msgstr "Данія" + +#. 212 +msgid "Dominica" +msgstr "Домініка" + +#. 214 +msgid "Dominican Republic" +msgstr "Домініканська республіка" + +#. 012 +msgid "Algeria" +msgstr "Алжир" + +#. 218 +msgid "Ecuador" +msgstr "Еквадор" + +#. 233 +msgid "Estonia" +msgstr "Естонія" + +#. 818 +msgid "Egypt" +msgstr "Єгипет" + +#. 732 +msgid "Western Sahara" +msgstr "Західна Сахара" + +#. 232 +msgid "Eritrea" +msgstr "Еритрея" + +#. 724 +msgid "Spain" +msgstr "Іспанія" + +#. 231 +msgid "Ethiopia" +msgstr "Ефіопія" + +#. 246 +msgid "Finland" +msgstr "Фінляндія" + +#. 242 +msgid "Fiji" +msgstr "Фіджі" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Фолклендські острови (Британія)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Мікронезія, федеративні штати" + +#. 234 +msgid "Faroe Islands" +msgstr "Фарерські острови" + +#. 250 +msgid "France" +msgstr "Франція" + +#. 266 +msgid "Gabon" +msgstr "Габон" + +#. 826 +msgid "United Kingdom" +msgstr "Об’єднане Королівство (Великобританія)" + +#. 308 +msgid "Grenada" +msgstr "Гренада" + +#. 268 +msgid "Georgia" +msgstr "Грузія" + +#. 254 +msgid "French Guiana" +msgstr "Французька Гвіана" + +#. 831 +msgid "Guernsey" +msgstr "Гернсі" + +#. 288 +msgid "Ghana" +msgstr "Гана" + +#. 292 +msgid "Gibraltar" +msgstr "Гібралтар" + +#. 304 +msgid "Greenland" +msgstr "Гренландія" + +#. 270 +msgid "Gambia" +msgstr "Гамбія" + +#. 324 +msgid "Guinea" +msgstr "Гвінея" + +#. 312 +msgid "Guadeloupe" +msgstr "Гваделупа" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Екваторіальна Гвінея" + +#. 300 +msgid "Greece" +msgstr "Греція" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "Південна Джорджія та Південні Сандвічеві Острови" + +#. 320 +msgid "Guatemala" +msgstr "Гватемала" + +#. 316 +msgid "Guam" +msgstr "Гуам" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Гвінея-Біссау" + +#. 328 +msgid "Guyana" +msgstr "Гайана" + +#. 344 +msgid "Hong Kong" +msgstr "Гонконг" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Острів Херд і Острови Макдональд" + +#. 340 +msgid "Honduras" +msgstr "Гондурас" + +#. 191 +msgid "Croatia" +msgstr "Хорватія" + +#. 332 +msgid "Haiti" +msgstr "Гаїті" + +#. 348 +msgid "Hungary" +msgstr "Угорщина" + +#. 360 +msgid "Indonesia" +msgstr "Індонезія" + +#. 372 +msgid "Ireland" +msgstr "Ірландія" + +#. 376 +msgid "Israel" +msgstr "Ізраїль" + +#. 833 +msgid "Isle of Man" +msgstr "Острів Мен" + +#. 356 +msgid "India" +msgstr "Індія" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "Британські території у Індійському океані" + +#. 368 +msgid "Iraq" +msgstr "Ірак" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Іран, Ісламська Республіка" + +#. 352 +msgid "Iceland" +msgstr "Ісландія" + +#. 380 +msgid "Italy" +msgstr "Італія" + +#. 832 +msgid "Jersey" +msgstr "Джерсі" + +#. 388 +msgid "Jamaica" +msgstr "Ямайка" + +#. 400 +msgid "Jordan" +msgstr "Йорданія" + +#. 392 +msgid "Japan" +msgstr "Японія" + +#. 404 +msgid "Kenya" +msgstr "Кенія" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Киргизстан" + +#. 116 +msgid "Cambodia" +msgstr "Камбоджа" + +#. 296 +msgid "Kiribati" +msgstr "Кірибаті" + +#. 174 +msgid "Comoros" +msgstr "Коморські острови" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Сент-Кіттс і Невіс" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Корея, Демократична Республіка" + +#. 410 +msgid "Korea, Republic of" +msgstr "Корея, Республіка" + +#. 414 +msgid "Kuwait" +msgstr "Кувейт" + +#. 136 +msgid "Cayman Islands" +msgstr "Кайманові острови" + +#. 398 +msgid "Kazakhstan" +msgstr "Казахстан" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Лаоська Народно-Демократична Республіка" + +#. 422 +msgid "Lebanon" +msgstr "Ліван" + +#. 662 +msgid "Saint Lucia" +msgstr "Санта Лючія" + +#. 438 +msgid "Liechtenstein" +msgstr "Ліхтенштейн" + +#. 144 +msgid "Sri Lanka" +msgstr "Шрі Ланка" + +#. 430 +msgid "Liberia" +msgstr "Ліберія" + +#. 426 +msgid "Lesotho" +msgstr "Лесото" + +#. 440 +msgid "Lithuania" +msgstr "Литва" + +#. 442 +msgid "Luxembourg" +msgstr "Люксембург" + +#. 428 +msgid "Latvia" +msgstr "Латвія" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Лівійська Арабська Джамахірія" + +#. 504 +msgid "Morocco" +msgstr "Марокко" + +#. 492 +msgid "Monaco" +msgstr "Монако" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Республіка Молдова" + +#. 499 +msgid "Montenegro" +msgstr "Чорногорія" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Сен-Мартен (французька частина)" + +#. 450 +msgid "Madagascar" +msgstr "Мадагаскар" + +#. 584 +msgid "Marshall Islands" +msgstr "Маршаллові Острови" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Македонія, колишня республіка Югославії" + +#. 466 +msgid "Mali" +msgstr "Малі" + +#. 104 +msgid "Myanmar" +msgstr "М'янма" + +#. 496 +msgid "Mongolia" +msgstr "Монголія" + +#. 446 +msgid "Macao" +msgstr "Макао" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Північні Маріанські Острови" + +#. 474 +msgid "Martinique" +msgstr "Мартиніка" + +#. 478 +msgid "Mauritania" +msgstr "Мавританія" + +#. 500 +msgid "Montserrat" +msgstr "Монтсеррат" + +#. 470 +msgid "Malta" +msgstr "Мальта" + +#. 480 +msgid "Mauritius" +msgstr "Маврикій" + +#. 462 +msgid "Maldives" +msgstr "Мальдиви" + +#. 454 +msgid "Malawi" +msgstr "Малаві" + +#. 484 +msgid "Mexico" +msgstr "Мексика" + +#. 458 +msgid "Malaysia" +msgstr "Малайзія" + +#. 508 +msgid "Mozambique" +msgstr "Мозамбік" + +#. 516 +msgid "Namibia" +msgstr "Намібія" + +#. 540 +msgid "New Caledonia" +msgstr "Нова Каледонія" + +#. 562 +msgid "Niger" +msgstr "Нігер" + +#. 574 +msgid "Norfolk Island" +msgstr "Норфолкські острови" + +#. 566 +msgid "Nigeria" +msgstr "Нігерія" + +#. 558 +msgid "Nicaragua" +msgstr "Нікарагуа" + +#. 528 +msgid "Netherlands" +msgstr "Нідерланди" + +#. 578 +msgid "Norway" +msgstr "Норвегія" + +#. 524 +msgid "Nepal" +msgstr "Непал" + +#. 520 +msgid "Nauru" +msgstr "Науру" + +#. 570 +msgid "Niue" +msgstr "Ніуе" + +#. 554 +msgid "New Zealand" +msgstr "Нова Зеландія" + +#. 512 +msgid "Oman" +msgstr "Оман" + +#. 591 +msgid "Panama" +msgstr "Панама" + +#. 604 +msgid "Peru" +msgstr "Перу" + +#. 258 +msgid "French Polynesia" +msgstr "Французька Полінезія" + +#. 598 +msgid "Papua New Guinea" +msgstr "Папуа Нова Гвінея" + +#. 608 +msgid "Philippines" +msgstr "Філіппіни" + +#. 586 +msgid "Pakistan" +msgstr "Пакистан" + +#. 616 +msgid "Poland" +msgstr "Польща" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Сен-П'єр і Мікелон" + +#. 612 +msgid "Pitcairn" +msgstr "Піткерн" + +#. 630 +msgid "Puerto Rico" +msgstr "Пуерто Ріко" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Окуповані Палестинські Території" + +#. 620 +msgid "Portugal" +msgstr "Португалія" + +#. 585 +msgid "Palau" +msgstr "Палау" + +#. 600 +msgid "Paraguay" +msgstr "Парагвай" + +#. 634 +msgid "Qatar" +msgstr "Катар" + +#. 638 +msgid "Reunion" +msgstr "Реюньйон" + +#. 642 +msgid "Romania" +msgstr "Румунія" + +#. 688 +msgid "Serbia" +msgstr "Сербія" + +#. 643 +msgid "Russian Federation" +msgstr "Російська Федерація" + +#. 646 +msgid "Rwanda" +msgstr "Руанда" + +#. 682 +msgid "Saudi Arabia" +msgstr "Саудівська Аравія" + +#. 090 +msgid "Solomon Islands" +msgstr "Соломонові острови" + +#. 690 +msgid "Seychelles" +msgstr "Сейшельські острови" + +#. 736 +msgid "Sudan" +msgstr "Судан" + +#. 752 +msgid "Sweden" +msgstr "Швеція" + +#. 702 +msgid "Singapore" +msgstr "Сингапур" + +#. 654 +msgid "Saint Helena" +msgstr "Острів Святої Єлени" + +#. 705 +msgid "Slovenia" +msgstr "Словенія" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Острови Свальбард та Ян-Маєн" + +#. 703 +msgid "Slovakia" +msgstr "Словаччина" + +#. 694 +msgid "Sierra Leone" +msgstr "Сьєрра-Леоне" + +#. 674 +msgid "San Marino" +msgstr "Сан Маріно" + +#. 686 +msgid "Senegal" +msgstr "Сенегал" + +#. 706 +msgid "Somalia" +msgstr "Сомалі" + +#. 740 +msgid "Suriname" +msgstr "Сурінам" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Сан-Томе і Принсипі" + +#. 222 +msgid "El Salvador" +msgstr "Сальвадор" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Сирійська Арабська Республіка" + +#. 748 +msgid "Swaziland" +msgstr "Свазиленд" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Острови Теркс і Кайкос" + +#. 148 +msgid "Chad" +msgstr "Чад" + +#. 260 +msgid "French Southern Territories" +msgstr "Французькі Південні Території" + +#. 768 +msgid "Togo" +msgstr "Того" + +#. 764 +msgid "Thailand" +msgstr "Таїланд" + +#. 762 +msgid "Tajikistan" +msgstr "Таджикістан" + +#. 772 +msgid "Tokelau" +msgstr "Токелау" + +#. 626 +msgid "Timor-Leste" +msgstr "Східний Тімор" + +#. 795 +msgid "Turkmenistan" +msgstr "Туркменістан" + +#. 788 +msgid "Tunisia" +msgstr "Тунізія" + +#. 776 +msgid "Tonga" +msgstr "Тонга" + +#. 792 +msgid "Turkey" +msgstr "Туреччина" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Тринідад і Тобаго" + +#. 798 +msgid "Tuvalu" +msgstr "Тувалу" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Иайвань, провінція Китаю" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Танзанія, Об’єднана Республіка" + +#. 804 +msgid "Ukraine" +msgstr "Україна" + +#. 800 +msgid "Uganda" +msgstr "Уганда" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "Сполучені Штати Малих Віддалених Островів" + +#. 840 +msgid "United States" +msgstr "Сполучені Штати Америки" + +#. 858 +msgid "Uruguay" +msgstr "Уругвай" + +#. 860 +msgid "Uzbekistan" +msgstr "Узбекістан" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Святий Престіл (Ватикан, Місто-Держава)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Сент-Вінсент і Гренадини" + +#. 862 +msgid "Venezuela" +msgstr "Венесуела" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Віргінські острови (Британія)" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Віргінські острови (США)" + +#. 704 +msgid "Viet Nam" +msgstr "В’єтнам" + +#. 548 +msgid "Vanuatu" +msgstr "Вануату" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Уолліс і Футуна" + +#. 882 +msgid "Samoa" +msgstr "Самоа" + +#. 887 +msgid "Yemen" +msgstr "Йемен" + +#. 175 +msgid "Mayotte" +msgstr "Майотта" + +#. 710 +msgid "South Africa" +msgstr "Південна Африка" + +#. 894 +msgid "Zambia" +msgstr "Замбія" + +#. 716 +msgid "Zimbabwe" +msgstr "Зімбабве" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "Новідомо, додайте is_in теґ до цих міст" + +msgid "Car" +msgstr "Машина" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Країна" + +msgid "Postal" +msgstr "Поштова адреса" + +msgid "Town" +msgstr "Місто" + +msgid "District" +msgstr "Округ" + +msgid "Street" +msgstr "Вулиця" + +msgid "Number" +msgstr "Номер" + +msgid "Enter Destination" +msgstr "Введіть пункт призначення" + +msgid "Zip Code" +msgstr "Поштовий індекс" + +msgid "City" +msgstr "Місто" + +msgid "District/Township" +msgstr "Округ/Селище" + +msgid "Map" +msgstr "Карта" + +msgid "Bookmark" +msgstr "Закладка" + +msgid "Destination" +msgstr "Пункт призначення" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Показати" + +msgid "_Route" +msgstr "Дорога" + +msgid "_Former Destinations" +msgstr "Минулий пункт призначення" + +msgid "_Bookmarks" +msgstr "Закладки" + +msgid "_Map" +msgstr "Карта" + +msgid "_Layout" +msgstr "Розкладка" + +msgid "_Projection" +msgstr "Проекція" + +msgid "_Vehicle" +msgstr "Транспортний засіб" + +msgid "Zoom_Out" +msgstr "Зменшити" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Збільшити" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Перерахувати" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Інформація" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Зупинити навігацію" + +msgid "Test" +msgstr "Тест" + +msgid "_Quit" +msgstr "_Вийти" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Триматися дороги" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Атлас доріг" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Авторозмір" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "На весь екран" + +msgid "Data" +msgstr "Дата" + +msgid "N" +msgstr "Пн" + +msgid "NE" +msgstr "ПнСх" + +msgid "E" +msgstr "Сх" + +msgid "SE" +msgstr "ПдСх" + +msgid "S" +msgstr "Пд" + +msgid "SW" +msgstr "ПдЗ" + +msgid "W" +msgstr "З" + +msgid "NW" +msgstr "ПнЗ" + +msgid "No" +msgstr "№" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "Інший" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Дорога %4.0fкм %02d:%02d ETA" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Дорога 0000км 0+00:00 ETA" + +msgid "Back to map" +msgstr "Повернутися до карти" + +msgid "Main Menu" +msgstr "Головне меню" + +msgid "Help" +msgstr "Допомога" + +msgid "Back" +msgstr "Назад" + +msgid "Add Bookmark" +msgstr "Додати закладку" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "Додати папку закладок" + +msgid "Rename" +msgstr "Перейменувати" + +msgid "POIs" +msgstr "Інформація про об’єкти" + +msgid "View in Browser" +msgstr "Показати в переглядачі" + +msgid "Streets" +msgstr "Вулиці" + +msgid "House numbers" +msgstr "Номери будинків" + +msgid "View Attributes" +msgstr "Показати атрибути" + +msgid "View on map" +msgstr "Показати на карті" + +msgid "Cut Bookmark" +msgstr "Вирізати закладку" + +msgid "Copy Bookmark" +msgstr "Копіювати закладку" + +msgid "Rename Bookmark" +msgstr "Перейменувати закладку" + +msgid "Paste Bookmark" +msgstr "Вставити закладку" + +msgid "Delete Bookmark" +msgstr "Вилучити закладку" + +msgid "Bookmarks" +msgstr "Закладки" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "Вставити закладку" + +#, c-format +msgid "Bookmark %s" +msgstr "Закладка %s" + +msgid "Former Destinations" +msgstr "Минулий пункт призначення" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Номер будинку" + +msgid "Layout" +msgstr "Розкладка" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Карти" + +msgid "Show Satellite Status" +msgstr "Показати статус супутника" + +msgid " Elevation " +msgstr " Висота " + +msgid " Azimuth " +msgstr " Азимут " + +msgid "Show NMEA Data" +msgstr "Показати дані NMEA" + +msgid "car" +msgstr "автомобіль" + +msgid "bike" +msgstr "велосипед" + +msgid "pedestrian" +msgstr "пішохід" + +#, c-format +msgid "Current profile: %s" +msgstr "Поточний профіль: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Змінити профіль на: %s" + +msgid "Set as active" +msgstr "Встановити активним" + +msgid "Show Satellite status" +msgstr "Показати статус супутника" + +msgid "Show NMEA data" +msgstr "Показати дані NMEA" + +msgid "Vehicle" +msgstr "Транспортний засіб" + +msgid "Rules" +msgstr "Правила" + +msgid "Lock on road" +msgstr "Триматися дороги" + +msgid "Northing" +msgstr "Північніше" + +msgid "Map follows Vehicle" +msgstr "Карта слідує за транспортним засобом" + +msgid "Message" +msgstr "Повідомлення" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "Опис маршруту" + +msgid "Height Profile" +msgstr "Профіль висот" + +msgid "Show Locale" +msgstr "Перевірити локалізацію" + +msgid "About Navit" +msgstr "Про Navit" + +#. Authors +msgid "By" +msgstr "від" + +#. Contributors +msgid "And all the Navit Team" +msgstr "Все про Navit Team" + +msgid "members and contributors." +msgstr "члени та учасникі." + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Точка на карті" + +msgid "Vehicle Position" +msgstr "Положення транспорту" + +msgid "Main menu" +msgstr "Головне меню" + +msgid "" +"Show\n" +"Map" +msgstr "" +"Показати\n" +"Карту" + +msgid "Settings" +msgstr "Настройки" + +msgid "Tools" +msgstr "Інструменти" + +msgid "Route" +msgstr "Дорога" + +msgid "About" +msgstr "Про програму..." + +msgid "Actions" +msgstr "Дія" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Вийти" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"Зупинити\n" +"Навігацію" + +msgid "Display" +msgstr "Показати" + +msgid "Fullscreen" +msgstr "На весь екран" + +msgid "Window Mode" +msgstr "Режим вікна" + +msgid "Description" +msgstr "Опис" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "кінь" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "Через %s виїзд на дорогу з кільцевим рухом" + +#~ msgid "Cursor" +#~ msgstr "Курсор" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d кілометрів" diff --git a/po/ur.po.in b/po/ur.po.in new file mode 100644 index 0000000..8dac50a --- /dev/null +++ b/po/ur.po.in @@ -0,0 +1,1761 @@ +# Urdu translation for navit +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the navit package. +# asghar, 2010 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2010-11-14 14:11+0000\n" +"Last-Translator: asghar \n" +"Language-Team: Urdu \n" +"Language: ur\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Launchpad-Export-Date: 2010-11-21 21:04+0000\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "سورس ڈایرکٹری سے چلا ر ہے ہیں\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "ترتیب '%s' سے '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "صفر سے" + +msgid "first" +msgstr "پہلا" + +msgid "second" +msgstr "دوسرا" + +msgid "third" +msgstr "تیسرا" + +msgid "fourth" +msgstr "چوتھا" + +msgid "fifth" +msgstr "پانچواں" + +msgid "sixth" +msgstr "چھٹا" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "صفر سے خارج" + +msgid "first exit" +msgstr "پہلا اخراج" + +msgid "second exit" +msgstr "دوسرا اخراج" + +msgid "third exit" +msgstr "تیسرا اخراج" + +msgid "fourth exit" +msgstr "چوتھا اخراج" + +msgid "fifth exit" +msgstr "پانچواں اخراج" + +msgid "sixth exit" +msgstr "چھٹا اخراج" + +#, c-format +msgid "%d m" +msgstr "%d میٹر" + +#, c-format +msgid "in %d m" +msgstr "%d میٹر میں" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d میٹر" + +#, c-format +msgid "in %d meters" +msgstr "%d میٹر میں" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d کلومیٹر" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "%d.%d کلومیٹر میں" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "ایک کلومیٹر" +msgstr[1] "%d کلومیٹر" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "ایک کلومیٹر میں" +msgstr[1] "%d کلومیٹر میں" + +msgid "exit" +msgstr "اخراج" + +msgid "into the ramp" +msgstr "ڈھلان میں" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s سڑک میں سے %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%s میں سے %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%s میں سے %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%s میں سے %s%s%s" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%sپر %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "دایئں" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "بایئں" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "آسانی سے " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "سختی سے " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "انتہایَ سختی سے " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "نا معلوم " + +msgid "When possible, please turn around" +msgstr "جب ممکن ہو گھومیں" + +msgid "Enter the roundabout soon" +msgstr "" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "پھر گول چوراہے کو %s پے چھوڑ دیں" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "گول چوراہے کو %s پے چھوڑ دیں" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "%s تک سڑک کے مطابق جایئں" + +msgid "soon" +msgstr "جلد ہی" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "سڑک تک %1$s سے %2$s" + +#, c-format +msgid "after %i roads" +msgstr "%i سڑکوں کے بعد" + +msgid "now" +msgstr "اب" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "پھر %1$s لے کر %2$s تک جائیں" + +msgid "error" +msgstr "غلطی" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "%1$s%2$s %3$s%4$s گومیں" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "%1$s%2$s %3$s%4$s پھر گومیں" + +#, c-format +msgid "You have reached your destination %s" +msgstr "آپ اپنی منزل %s پے پہنچ کئے ہیں" + +msgid "then you have reached your destination." +msgstr "پھر آپ اپنی منزل پہ پہنچ جایئں گے" + +msgid "Position" +msgstr "مقام" + +msgid "Command" +msgstr "کمانڈ" + +msgid "Length" +msgstr "لمبایئ" + +msgid "km" +msgstr "کلومیٹر" + +msgid "m" +msgstr "میٹر" + +msgid "Time" +msgstr "وقت" + +msgid "Destination Length" +msgstr "منزل تک دوری" + +msgid "Destination Time" +msgstr "منزل تک وقت" + +msgid "Roadbook" +msgstr "روڈ بک" + +msgid "Set as position" +msgstr "بطور موجودہ مقام انتخاب" + +msgid "Set as destination" +msgstr "بطور منزل انتخاب" + +msgid "Add as bookmark" +msgstr "بک مارک میں محفوظ کریں" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "0x%x 0x%x مقام" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "سکرین کورڈینیٹ : %d %d" + +#. 020 +msgid "Andorra" +msgstr "اندوررا" + +#. 784 +msgid "United Arab Emirates" +msgstr "متحدہ عرب امارات" + +#. 004 +msgid "Afghanistan" +msgstr "افغانستان" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "انٹگووا اور باربوڈا" + +#. 660 +msgid "Anguilla" +msgstr "انگویلا" + +#. 008 +msgid "Albania" +msgstr "البانیا" + +#. 051 +msgid "Armenia" +msgstr "ارمینیا" + +#. 530 +msgid "Netherlands Antilles" +msgstr "نیدرلینڈز انٹیلس" + +#. 024 +msgid "Angola" +msgstr "انگولا" + +#. 010 +msgid "Antarctica" +msgstr "انٹارٹیکا" + +#. 032 +msgid "Argentina" +msgstr "ارجنٹینا" + +#. 016 +msgid "American Samoa" +msgstr "امیریکن ساموا" + +#. 040 +msgid "Austria" +msgstr "آسٹریا" + +#. 036 +msgid "Australia" +msgstr "آسٹریلیا" + +#. 533 +msgid "Aruba" +msgstr "آروبا" + +#. 248 +msgid "Aland Islands" +msgstr "آلینڈ آئسلینڈ" + +#. 031 +msgid "Azerbaijan" +msgstr "آذر بائجان" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "بوسنیا حرذےگوینیا" + +#. 052 +msgid "Barbados" +msgstr "باربادوس" + +#. 050 +msgid "Bangladesh" +msgstr "بنگلادیش" + +#. 056 +msgid "Belgium" +msgstr "بلجیئم" + +#. 854 +msgid "Burkina Faso" +msgstr "برکینا فازو" + +#. 100 +msgid "Bulgaria" +msgstr "بلغاریہ" + +#. 048 +msgid "Bahrain" +msgstr "بحرین" + +#. 108 +msgid "Burundi" +msgstr "برنڈی" + +#. 204 +msgid "Benin" +msgstr "بینن" + +#. 652 +msgid "Saint Barthelemy" +msgstr "سینٹ باتھیلیمی" + +#. 060 +msgid "Bermuda" +msgstr "برمودا" + +#. 096 +msgid "Brunei Darussalam" +msgstr "برونائی دارالسلام" + +#. 068 +msgid "Bolivia" +msgstr "بولیویا" + +#. 076 +msgid "Brazil" +msgstr "برازیل" + +#. 044 +msgid "Bahamas" +msgstr "بھاماس" + +#. 064 +msgid "Bhutan" +msgstr "بھوٹان" + +#. 074 +msgid "Bouvet Island" +msgstr "بووٹ آئیسلیڈ" + +#. 072 +msgid "Botswana" +msgstr "بوٹسوانا" + +#. 112 +msgid "Belarus" +msgstr "بیلارس" + +#. 084 +msgid "Belize" +msgstr "بلیذ" + +#. 124 +msgid "Canada" +msgstr "کینیڈا" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "کوکوس آئیسلینڈز" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "کونگو ڈیموکریٹک" + +#. 140 +msgid "Central African Republic" +msgstr "مرکزی جمہوریہ افریقہ" + +#. 178 +msgid "Congo" +msgstr "کونگو" + +#. 756 +msgid "Switzerland" +msgstr "سوئیزرلینڈ" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "کوٹے ڈلوویر" + +#. 184 +msgid "Cook Islands" +msgstr "کک آئیسلینڈ" + +#. 152 +msgid "Chile" +msgstr "چیلی" + +#. 120 +msgid "Cameroon" +msgstr "کامیرون" + +#. 156 +msgid "China" +msgstr "چین" + +#. 170 +msgid "Colombia" +msgstr "کولمبیا" + +#. 188 +msgid "Costa Rica" +msgstr "کوسٹا ریکا" + +#. 192 +msgid "Cuba" +msgstr "کیوبا" + +#. 132 +msgid "Cape Verde" +msgstr "کاپے ویردے" + +#. 162 +msgid "Christmas Island" +msgstr "کرسمس آئیسلینڈ" + +#. 196 +msgid "Cyprus" +msgstr "سائپرس" + +#. 203 +msgid "Czech Republic" +msgstr "چیک ریپبلک" + +#. 276 +msgid "Germany" +msgstr "جرمن" + +#. 262 +msgid "Djibouti" +msgstr "ڈیجیبوٹی" + +#. 208 +msgid "Denmark" +msgstr "ڈنمارک" + +#. 212 +msgid "Dominica" +msgstr "ڈومینیکا" + +#. 214 +msgid "Dominican Republic" +msgstr "ڈومینیکن ریپبلک" + +#. 012 +msgid "Algeria" +msgstr "الجیریا" + +#. 218 +msgid "Ecuador" +msgstr "ایکواڈور" + +#. 233 +msgid "Estonia" +msgstr "استونیا" + +#. 818 +msgid "Egypt" +msgstr "مصر" + +#. 732 +msgid "Western Sahara" +msgstr "مغربی سحارا" + +#. 232 +msgid "Eritrea" +msgstr "اریٹیریا" + +#. 724 +msgid "Spain" +msgstr "سپین" + +#. 231 +msgid "Ethiopia" +msgstr "ایتھوپیا" + +#. 246 +msgid "Finland" +msgstr "فنلینڈ" + +#. 242 +msgid "Fiji" +msgstr "فیجی" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "فیکلینڈ آئیسلینڈ" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "میکرونیسیا فیڈرل سٹیٹ" + +#. 234 +msgid "Faroe Islands" +msgstr "فاروے آئیسلینڈز" + +#. 250 +msgid "France" +msgstr "فرانس" + +#. 266 +msgid "Gabon" +msgstr "گابون" + +#. 826 +msgid "United Kingdom" +msgstr "برطانیا" + +#. 308 +msgid "Grenada" +msgstr "گریناڈا" + +#. 268 +msgid "Georgia" +msgstr "جورجیا" + +#. 254 +msgid "French Guiana" +msgstr "فرینچ گویانا" + +#. 831 +msgid "Guernsey" +msgstr "گویرنسے" + +#. 288 +msgid "Ghana" +msgstr "گھانا" + +#. 292 +msgid "Gibraltar" +msgstr "جبرالٹر" + +#. 304 +msgid "Greenland" +msgstr "گرینلینڈ" + +#. 270 +msgid "Gambia" +msgstr "گامبیا" + +#. 324 +msgid "Guinea" +msgstr "گوینیا" + +#. 312 +msgid "Guadeloupe" +msgstr "گوادیلوپے" + +#. 226 +msgid "Equatorial Guinea" +msgstr "ایکواٹوریال گوینا" + +#. 300 +msgid "Greece" +msgstr "یونان" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "جنوبی جورجیا اور جنوبی سنڈوچ آئیسلینڈ" + +#. 320 +msgid "Guatemala" +msgstr "گوئٹیمالا" + +#. 316 +msgid "Guam" +msgstr "گوام" + +#. 624 +msgid "Guinea-Bissau" +msgstr "گواینیا-بیسساو" + +#. 328 +msgid "Guyana" +msgstr "گویانا" + +#. 344 +msgid "Hong Kong" +msgstr "ہانگ کانگ" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "ھیرڈ آئیسلینڈ اور میکڈونلڈ آئیسلینڈس" + +#. 340 +msgid "Honduras" +msgstr "حونڈورس" + +#. 191 +msgid "Croatia" +msgstr "کروشیا" + +#. 332 +msgid "Haiti" +msgstr "حایٹی" + +#. 348 +msgid "Hungary" +msgstr "ھنگری" + +#. 360 +msgid "Indonesia" +msgstr "انڈونیشیا" + +#. 372 +msgid "Ireland" +msgstr "آئرلینڈ" + +#. 376 +msgid "Israel" +msgstr "اسرائیل" + +#. 833 +msgid "Isle of Man" +msgstr "ایسلے آف مین" + +#. 356 +msgid "India" +msgstr "ہندوستان" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "برٹش انڈین اوشین ٹریٹوری" + +#. 368 +msgid "Iraq" +msgstr "عراق" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "ایران ، اسلامی جمہوریہ" + +#. 352 +msgid "Iceland" +msgstr "آئیسلینڈ" + +#. 380 +msgid "Italy" +msgstr "اٹلی" + +#. 832 +msgid "Jersey" +msgstr "جرسی" + +#. 388 +msgid "Jamaica" +msgstr "جامائیکا" + +#. 400 +msgid "Jordan" +msgstr "اردن" + +#. 392 +msgid "Japan" +msgstr "جاپان" + +#. 404 +msgid "Kenya" +msgstr "کینیا" + +#. 417 +msgid "Kyrgyzstan" +msgstr "کرگزستان" + +#. 116 +msgid "Cambodia" +msgstr "کمبوڈیا" + +#. 296 +msgid "Kiribati" +msgstr "کیریباٹی" + +#. 174 +msgid "Comoros" +msgstr "کوموروس" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "سینٹ کٹس اور نوس" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "کوریا ، ڈیموکریٹک" + +#. 410 +msgid "Korea, Republic of" +msgstr "کوریا، عوامی" + +#. 414 +msgid "Kuwait" +msgstr "کویت" + +#. 136 +msgid "Cayman Islands" +msgstr "کایمین آئیسلینڈز" + +#. 398 +msgid "Kazakhstan" +msgstr "کزاکستان" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "لاو عوامی جمہوری ڈیموکریٹک" + +#. 422 +msgid "Lebanon" +msgstr "لبنان" + +#. 662 +msgid "Saint Lucia" +msgstr "سینٹ لوچیا" + +#. 438 +msgid "Liechtenstein" +msgstr "لیخٹنسخٹین" + +#. 144 +msgid "Sri Lanka" +msgstr "سری لنکا" + +#. 430 +msgid "Liberia" +msgstr "لیبیریا" + +#. 426 +msgid "Lesotho" +msgstr "لیسودو" + +#. 440 +msgid "Lithuania" +msgstr "لیتھوانیا" + +#. 442 +msgid "Luxembourg" +msgstr "لیسمبرگ" + +#. 428 +msgid "Latvia" +msgstr "لاتویا" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "لیبیان عرب جمعحیریا" + +#. 504 +msgid "Morocco" +msgstr "مراکش" + +#. 492 +msgid "Monaco" +msgstr "موناکو" + +#. 498 +msgid "Moldova, Republic of" +msgstr "مولدوا، عوامی" + +#. 499 +msgid "Montenegro" +msgstr "مونٹے نیگرو" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "سینٹ مارٹن فرانسیسی حصہ" + +#. 450 +msgid "Madagascar" +msgstr "ماڈاگاسکر" + +#. 584 +msgid "Marshall Islands" +msgstr "مارشل آئیسلینڈ" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "ماچیدونیا" + +#. 466 +msgid "Mali" +msgstr "مالی" + +#. 104 +msgid "Myanmar" +msgstr "میانمار" + +#. 496 +msgid "Mongolia" +msgstr "مونگولیا" + +#. 446 +msgid "Macao" +msgstr "ماکاؤ" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "شمالی ماریانا آئیسلینڈز" + +#. 474 +msgid "Martinique" +msgstr "مارٹینیقئے" + +#. 478 +msgid "Mauritania" +msgstr "ماوریتانیا" + +#. 500 +msgid "Montserrat" +msgstr "ماؤنٹسیراٹ" + +#. 470 +msgid "Malta" +msgstr "مالٹا" + +#. 480 +msgid "Mauritius" +msgstr "ماؤریٹیوس" + +#. 462 +msgid "Maldives" +msgstr "مالدیپ" + +#. 454 +msgid "Malawi" +msgstr "مالاوی" + +#. 484 +msgid "Mexico" +msgstr "میکسیکو" + +#. 458 +msgid "Malaysia" +msgstr "مالائیشیا" + +#. 508 +msgid "Mozambique" +msgstr "موزمبیک" + +#. 516 +msgid "Namibia" +msgstr "نمیبیا" + +#. 540 +msgid "New Caledonia" +msgstr "نیو کالیدونیا" + +#. 562 +msgid "Niger" +msgstr "نیگر" + +#. 574 +msgid "Norfolk Island" +msgstr "نورفوک آئیسلینڈ" + +#. 566 +msgid "Nigeria" +msgstr "نائجیریا" + +#. 558 +msgid "Nicaragua" +msgstr "نکاراگوا" + +#. 528 +msgid "Netherlands" +msgstr "ہالینڈ" + +#. 578 +msgid "Norway" +msgstr "ناروے" + +#. 524 +msgid "Nepal" +msgstr "نیپال" + +#. 520 +msgid "Nauru" +msgstr "ناؤرو" + +#. 570 +msgid "Niue" +msgstr "نیوئے" + +#. 554 +msgid "New Zealand" +msgstr "نیوزیلینڈ" + +#. 512 +msgid "Oman" +msgstr "عمان" + +#. 591 +msgid "Panama" +msgstr "پاناما" + +#. 604 +msgid "Peru" +msgstr "پیرو" + +#. 258 +msgid "French Polynesia" +msgstr "فرنچ پولینسیا" + +#. 598 +msgid "Papua New Guinea" +msgstr "پاپوا نیو گویبیا" + +#. 608 +msgid "Philippines" +msgstr "فلپائن" + +#. 586 +msgid "Pakistan" +msgstr "پاکستان" + +#. 616 +msgid "Poland" +msgstr "پولینڈ" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "سینٹ پیعرر اور میقوئےلون" + +#. 612 +msgid "Pitcairn" +msgstr "پٹکائرن" + +#. 630 +msgid "Puerto Rico" +msgstr "پوئرٹو ریکو" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "فلسطین" + +#. 620 +msgid "Portugal" +msgstr "پرتگال" + +#. 585 +msgid "Palau" +msgstr "پالاؤ" + +#. 600 +msgid "Paraguay" +msgstr "پیراگوائے" + +#. 634 +msgid "Qatar" +msgstr "قطر" + +#. 638 +msgid "Reunion" +msgstr "ریونین" + +#. 642 +msgid "Romania" +msgstr "رومانیا" + +#. 688 +msgid "Serbia" +msgstr "سربیا" + +#. 643 +msgid "Russian Federation" +msgstr "روس" + +#. 646 +msgid "Rwanda" +msgstr "روانڈا" + +#. 682 +msgid "Saudi Arabia" +msgstr "سعودی عرب" + +#. 090 +msgid "Solomon Islands" +msgstr "سولومون آئیسلینڈز" + +#. 690 +msgid "Seychelles" +msgstr "سعیچیلز" + +#. 736 +msgid "Sudan" +msgstr "سوڈان" + +#. 752 +msgid "Sweden" +msgstr "سویڈن" + +#. 702 +msgid "Singapore" +msgstr "سنگاپور" + +#. 654 +msgid "Saint Helena" +msgstr "سیٹ حیلنا" + +#. 705 +msgid "Slovenia" +msgstr "سلوینیا" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "سویلبرڈ اور جان میان" + +#. 703 +msgid "Slovakia" +msgstr "سلواکیہ" + +#. 694 +msgid "Sierra Leone" +msgstr "سیعرا لیعون" + +#. 674 +msgid "San Marino" +msgstr "سان مارینو" + +#. 686 +msgid "Senegal" +msgstr "سینیگال" + +#. 706 +msgid "Somalia" +msgstr "صومالیہ" + +#. 740 +msgid "Suriname" +msgstr "سرینیم" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "ساو ٹوم اور پرینسپ" + +#. 222 +msgid "El Salvador" +msgstr "ال سالواڈور" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "ال سالواڈور" + +#. 748 +msgid "Swaziland" +msgstr "سوازیلینڈ" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "ٹرکس اور کایکس آئیسلینڈز" + +#. 148 +msgid "Chad" +msgstr "چاڈ" + +#. 260 +msgid "French Southern Territories" +msgstr "فرینچ جنوبی علاقہ جات" + +#. 768 +msgid "Togo" +msgstr "ٹوگو" + +#. 764 +msgid "Thailand" +msgstr "تھائی لینڈ" + +#. 762 +msgid "Tajikistan" +msgstr "تاجکستان" + +#. 772 +msgid "Tokelau" +msgstr "ٹوکلاؤ" + +#. 626 +msgid "Timor-Leste" +msgstr "ٹیمور-لیسٹے" + +#. 795 +msgid "Turkmenistan" +msgstr "ترکمانستان" + +#. 788 +msgid "Tunisia" +msgstr "تونس" + +#. 776 +msgid "Tonga" +msgstr "ٹونگا" + +#. 792 +msgid "Turkey" +msgstr "ترکی" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "ٹرینیداد اور ٹوباگو" + +#. 798 +msgid "Tuvalu" +msgstr "ٹوالا" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "تائیوان چائینہ کا صوبہ" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "تنزانیہ، عوامی متحدہ" + +#. 804 +msgid "Ukraine" +msgstr "یوکرائن" + +#. 800 +msgid "Uganda" +msgstr "یوگنڈا" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "یونائیٹد سٹیٹ مائنر آوٹلیئنگ آئیسلینڈز" + +#. 840 +msgid "United States" +msgstr "امریکہ" + +#. 858 +msgid "Uruguay" +msgstr "اوروگوائے" + +#. 860 +msgid "Uzbekistan" +msgstr "ازبکستان" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "مقدس شہر (ویٹیکن سٹی)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "سینٹ ونسنٹ اور گریناڈنز" + +#. 862 +msgid "Venezuela" +msgstr "ونزویلا" + +#. 092 +msgid "Virgin Islands, British" +msgstr "ورجن آئیسلینڈ، برطانیہ" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "ورجن آئیسلینڈ، امریکہ" + +#. 704 +msgid "Viet Nam" +msgstr "ویت نام" + +#. 548 +msgid "Vanuatu" +msgstr "وانوعاتو" + +#. 876 +msgid "Wallis and Futuna" +msgstr "والیز اور فوٹونا" + +#. 882 +msgid "Samoa" +msgstr "ساموا" + +#. 887 +msgid "Yemen" +msgstr "یمن" + +#. 175 +msgid "Mayotte" +msgstr "مائیوٹے" + +#. 710 +msgid "South Africa" +msgstr "جنوبی افریقہ" + +#. 894 +msgid "Zambia" +msgstr "زمبیا" + +#. 716 +msgid "Zimbabwe" +msgstr "زمبابوے" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* نامعلوم شہروں کیلیئے" + +msgid "Car" +msgstr "کار" + +msgid "Iso2" +msgstr "اسو 2" + +msgid "Iso3" +msgstr "اسو 3" + +msgid "Country" +msgstr "ملک" + +msgid "Postal" +msgstr "ڈاک" + +msgid "Town" +msgstr "ٹاؤن" + +msgid "District" +msgstr "ضلع" + +msgid "Street" +msgstr "سڑک" + +msgid "Number" +msgstr "نمبر" + +msgid "Enter Destination" +msgstr "منزل داخل کریں" + +msgid "Zip Code" +msgstr "زپ کوڈ" + +msgid "City" +msgstr "شہر" + +msgid "District/Township" +msgstr "ضلع/قصبہ" + +msgid "Map" +msgstr "نقشہ" + +msgid "Bookmark" +msgstr "بک مارک" + +msgid "Destination" +msgstr "منزل" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "ڈسپلئے" + +msgid "_Route" +msgstr "راستہ" + +msgid "_Former Destinations" +msgstr "سابقہ منازل" + +msgid "_Bookmarks" +msgstr "بک مارکس" + +msgid "_Map" +msgstr "نقشہ" + +msgid "_Layout" +msgstr "بناوٹ" + +msgid "_Projection" +msgstr "پروجیکشن" + +msgid "_Vehicle" +msgstr "گاڑی" + +msgid "Zoom_Out" +msgstr "چھوٹا کریں" + +msgid "Decrease zoom level" +msgstr "زوم لیول کم کریں" + +msgid "Zoom_In" +msgstr "بڑا کریں" + +msgid "Increase zoom level" +msgstr "زوم لیول بڑہائیں" + +msgid "_Recalculate" +msgstr "دوبارہ حساب" + +msgid "Redraw map" +msgstr "نقشہ دوبارہ بنائیں" + +msgid "_Info" +msgstr "معلومات" + +msgid "Set _destination" +msgstr "منزل منتخب کریں" + +msgid "Opens address search dialog" +msgstr "پتہ تلاش والا خانہ کھولیں" + +msgid "_Stop Navigation" +msgstr "نیویگیشن بند کریں" + +msgid "Test" +msgstr "ٹیسٹ" + +msgid "_Quit" +msgstr "_بند" + +msgid "Quit the application" +msgstr "پروگرام بند کریں" + +msgid "Show position _cursor" +msgstr "کرسر کا مقام دکھائیں" + +msgid "_Lock on Road" +msgstr "سڑک پر گرفت" + +msgid "_Keep orientation to the North" +msgstr "قطب نما کو شمال کی طرف رکھیں" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "قطب نما کو شمال یا گاڑی کی طرف کریں" + +msgid "_Roadbook" +msgstr "روڈ بک" + +msgid "Show/hide route description" +msgstr "دکھیں/نہ دیکھیں سفر کی تفصیل" + +msgid "_Autozoom" +msgstr "خودکار زوم" + +msgid "Enable/disable automatic zoom level changing" +msgstr "فعال/غیر فعال کریں زوم کی خود کار تبدیلی" + +msgid "_Fullscreen" +msgstr "پوری سکرین" + +msgid "Data" +msgstr "ڈیٹا" + +msgid "N" +msgstr "شمال" + +msgid "NE" +msgstr "شمال مشرق" + +msgid "E" +msgstr "مشرق" + +msgid "SE" +msgstr "جنوب مشرق" + +msgid "S" +msgstr "جنوب" + +msgid "SW" +msgstr "جنوب مغرب" + +msgid "W" +msgstr "مغرب" + +msgid "NW" +msgstr "شمال مغرب" + +msgid "No" +msgstr "نہیں" + +msgid "2D" +msgstr "2ڈی" + +msgid "3D" +msgstr "3ڈی" + +msgid "OT" +msgstr "او ٹی" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Route %4.0fكلومیٹر %02d:%02d ETA" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "سفر 0000 کلومیٹر 0+00:00 ETA" + +msgid "Back to map" +msgstr "نقشہ پہ واپس" + +msgid "Main Menu" +msgstr "مین مینو" + +msgid "Help" +msgstr "مدد" + +msgid "Back" +msgstr "واپس" + +msgid "Add Bookmark" +msgstr "بک مارک میں شامل" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "بک مارک فولڈر میں شامل" + +msgid "Rename" +msgstr "تبدیل نام" + +msgid "POIs" +msgstr "پسندیدہ جگہیں" + +msgid "View in Browser" +msgstr "براؤزر میں دیکھیں" + +msgid "Streets" +msgstr "سڑکیں" + +msgid "House numbers" +msgstr "مکان نمبر" + +msgid "View Attributes" +msgstr "خصوصیات دیکھں" + +msgid "View on map" +msgstr "نقشہ پہ دیکھیں" + +msgid "Cut Bookmark" +msgstr "بک مارک کو کاٹیں" + +msgid "Copy Bookmark" +msgstr "بک مارک کو کاپی کریں" + +msgid "Rename Bookmark" +msgstr "بک مارک کا نام تبدیل کریں" + +msgid "Paste Bookmark" +msgstr "بک مارک پیسٹ کریں" + +msgid "Delete Bookmark" +msgstr "ڈیلیٹ بک مارک" + +msgid "Bookmarks" +msgstr "بک مارکس" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "بک مارک پیسٹ کریں" + +#, c-format +msgid "Bookmark %s" +msgstr "بک مارک %s" + +msgid "Former Destinations" +msgstr "سابقہ منازل" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "مکان نمبر" + +msgid "Layout" +msgstr "بناوٹ" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "نقشے" + +msgid "Show Satellite Status" +msgstr "سٹلائٹ کی حالت دیکھیں" + +msgid " Elevation " +msgstr " ارتفاع " + +msgid " Azimuth " +msgstr " سمت " + +msgid "Show NMEA Data" +msgstr "NMEA ڈیٹا دیکھیں" + +msgid "car" +msgstr "کار" + +msgid "bike" +msgstr "سائیکل" + +msgid "pedestrian" +msgstr "پیدل" + +#, c-format +msgid "Current profile: %s" +msgstr "موجودہ پروفائل: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "پروفائل کو :%s میں بدلیں" + +msgid "Set as active" +msgstr "فعال کریں" + +msgid "Show Satellite status" +msgstr "سٹلائٹ کی حالت دیکھیں" + +msgid "Show NMEA data" +msgstr "NMEA ڈیٹا دیکھیں" + +msgid "Vehicle" +msgstr "گاڑی" + +msgid "Rules" +msgstr "قوانین" + +msgid "Lock on road" +msgstr "سڑک پہ مرکوز" + +msgid "Northing" +msgstr "شمالی سمت" + +msgid "Map follows Vehicle" +msgstr "نقشہ گاڑی کا تعاقب کرے" + +msgid "Message" +msgstr "پیغام" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "سفر کی تفصیل" + +msgid "Height Profile" +msgstr "اونچائی کی پروفائل" + +msgid "Show Locale" +msgstr "مقامی دیکھیں" + +msgid "About Navit" +msgstr "ناوٹ کے مطعلق" + +#. Authors +msgid "By" +msgstr "بنانے والے" + +#. Contributors +msgid "And all the Navit Team" +msgstr "اور ناوٹ کی ساری ٹیم" + +msgid "members and contributors." +msgstr "ممبر اور حصہ دار" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "نقشہ کا نقطہ" + +msgid "Vehicle Position" +msgstr "گاڑی کی حالت" + +msgid "Main menu" +msgstr "مین مینو" + +msgid "" +"Show\n" +"Map" +msgstr "" +"دیکھیں\n" +"نقشہ" + +msgid "Settings" +msgstr "تراتیب" + +msgid "Tools" +msgstr "ہتھیار" + +msgid "Route" +msgstr "راستہ" + +msgid "About" +msgstr "مطعلق" + +msgid "Actions" +msgstr "ایکشن" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "بند" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" +"روکیں\n" +"نیویگیشن" + +msgid "Display" +msgstr "ڈسپلئے" + +msgid "Fullscreen" +msgstr "پوری سکرین" + +msgid "Window Mode" +msgstr "ونڈو موڈ" + +msgid "Description" +msgstr "تفصیل" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "گھوڑا" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "Enter the roundabout soon and leave it at the %s" +#~ msgstr "گول چوراہے میں داخل ہوں اور %s سے باہر نکل جایئں" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "%s کے بعد گول چوراہے میں داخل ہو جایئں" diff --git a/po/vi.po.in b/po/vi.po.in new file mode 100644 index 0000000..e09aee9 --- /dev/null +++ b/po/vi.po.in @@ -0,0 +1,1755 @@ +# Vietnamese translation for navit +# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 +# This file is distributed under the same license as the navit package. +# Nguyễn Hào Khôi , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2009-12-20 21:38+0000\n" +"Last-Translator: Nguyễn Hào Khôi \n" +"Language-Team: Vietnamese \n" +"Language: vi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "Đang chạy từ thư mục nguồn\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "thiết lập '%s' đến '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "Thứ 0" + +msgid "first" +msgstr "thứ nhắt" + +msgid "second" +msgstr "giây" + +msgid "third" +msgstr "thứ ba" + +msgid "fourth" +msgstr "thứ tư" + +msgid "fifth" +msgstr "thứ năm" + +msgid "sixth" +msgstr "thứ sáu" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "Thoát thứ 0" + +msgid "first exit" +msgstr "Thoát thứ 1" + +msgid "second exit" +msgstr "Thoát thứ 2" + +msgid "third exit" +msgstr "Thoát thứ 3" + +msgid "fourth exit" +msgstr "Thoát thứ 4" + +msgid "fifth exit" +msgstr "Thoát thứ 5" + +msgid "sixth exit" +msgstr "Thoát thứ 6" + +#, c-format +msgid "%d m" +msgstr "%d m" + +#, c-format +msgid "in %d m" +msgstr "trong %d m" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d mét" + +#, c-format +msgid "in %d meters" +msgstr "trong %d mét" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "trong %d.%d km" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "%d km" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "trong %d km" + +msgid "exit" +msgstr "thoát" + +msgid "into the ramp" +msgstr "vào dốc" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%svào phố %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%svào %s%s%s|male form" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%svào %s%s%s|female form" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%svào %s%s%s|neutral form" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%svào %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "phải" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "trái" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "dễ dàng " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "mạnh " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "thực sự mạnh " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "không rõ " + +msgid "When possible, please turn around" +msgstr "Khi có thể, hãy quay vòng" + +msgid "Enter the roundabout soon" +msgstr "Sắp tới chỗ vòng" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "sau đó ra khỏi đường vòng tại %s" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "Ra khỏi đường vòng tại %s" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "Đường tiếp theo %s" + +msgid "soon" +msgstr "ngay" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "Có %1$s đường đến %2$s" + +#, c-format +msgid "after %i roads" +msgstr "sau %i đường" + +msgid "now" +msgstr "bây giờ" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "sau đó bắt %1$s đường đến %2$s" + +msgid "error" +msgstr "lỗi" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "Rẽ %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "sau đó rẽ %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "Bạn vừa tới điểm đích: %s" + +msgid "then you have reached your destination." +msgstr "sau đó bạn tới điểm đích" + +msgid "Position" +msgstr "Vị trí" + +msgid "Command" +msgstr "Lệnh" + +msgid "Length" +msgstr "Chiều dài" + +msgid "km" +msgstr "km" + +msgid "m" +msgstr "m" + +msgid "Time" +msgstr "Thời gian" + +msgid "Destination Length" +msgstr "Chiều dài tới" + +msgid "Destination Time" +msgstr "Thời gian tới" + +msgid "Roadbook" +msgstr "Roadbook" + +msgid "Set as position" +msgstr "Thiết lập thành vị trí" + +msgid "Set as destination" +msgstr "Thiết lập thành điểm tới" + +msgid "Add as bookmark" +msgstr "Thêm thành Bookmark" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "Điểm 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "Tọa độ : %d %d" + +#. 020 +msgid "Andorra" +msgstr "Andorra" + +#. 784 +msgid "United Arab Emirates" +msgstr "United Arab Emirates" + +#. 004 +msgid "Afghanistan" +msgstr "Afghanistan" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "Antigua and Barbuda" + +#. 660 +msgid "Anguilla" +msgstr "Anguilla" + +#. 008 +msgid "Albania" +msgstr "Albania" + +#. 051 +msgid "Armenia" +msgstr "Armenia" + +#. 530 +msgid "Netherlands Antilles" +msgstr "Netherlands Antilles" + +#. 024 +msgid "Angola" +msgstr "Angola" + +#. 010 +msgid "Antarctica" +msgstr "Antarctica" + +#. 032 +msgid "Argentina" +msgstr "Argentina" + +#. 016 +msgid "American Samoa" +msgstr "American Samoa" + +#. 040 +msgid "Austria" +msgstr "Austria" + +#. 036 +msgid "Australia" +msgstr "Australia" + +#. 533 +msgid "Aruba" +msgstr "Aruba" + +#. 248 +msgid "Aland Islands" +msgstr "Aland Islands" + +#. 031 +msgid "Azerbaijan" +msgstr "Azerbaijan" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "Bosnia and Herzegovina" + +#. 052 +msgid "Barbados" +msgstr "Barbados" + +#. 050 +msgid "Bangladesh" +msgstr "Bangladesh" + +#. 056 +msgid "Belgium" +msgstr "Bỉ" + +#. 854 +msgid "Burkina Faso" +msgstr "Burkina Faso" + +#. 100 +msgid "Bulgaria" +msgstr "Bulgaria" + +#. 048 +msgid "Bahrain" +msgstr "Bahrain" + +#. 108 +msgid "Burundi" +msgstr "Burundi" + +#. 204 +msgid "Benin" +msgstr "Benin" + +#. 652 +msgid "Saint Barthelemy" +msgstr "Saint Barthelemy" + +#. 060 +msgid "Bermuda" +msgstr "Bermuda" + +#. 096 +msgid "Brunei Darussalam" +msgstr "Bru nây" + +#. 068 +msgid "Bolivia" +msgstr "Bolivia" + +#. 076 +msgid "Brazil" +msgstr "Brazil" + +#. 044 +msgid "Bahamas" +msgstr "Bahamas" + +#. 064 +msgid "Bhutan" +msgstr "Bhutan" + +#. 074 +msgid "Bouvet Island" +msgstr "Đảo Bu-vê" + +#. 072 +msgid "Botswana" +msgstr "Botswana" + +#. 112 +msgid "Belarus" +msgstr "Belarus" + +#. 084 +msgid "Belize" +msgstr "Belize" + +#. 124 +msgid "Canada" +msgstr "Canada" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "Cocos (Keeling) Islands" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "Cộng Hoà Dân Chủ Công-gô" + +#. 140 +msgid "Central African Republic" +msgstr "Cộng Hoà Trung Phi" + +#. 178 +msgid "Congo" +msgstr "Công-gô" + +#. 756 +msgid "Switzerland" +msgstr "Thụy Sĩ" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "Bờ biển ngà" + +#. 184 +msgid "Cook Islands" +msgstr "Quần đảo Cook" + +#. 152 +msgid "Chile" +msgstr "Chile" + +#. 120 +msgid "Cameroon" +msgstr "Cameroon" + +#. 156 +msgid "China" +msgstr "Trung Quốc" + +#. 170 +msgid "Colombia" +msgstr "Colombia" + +#. 188 +msgid "Costa Rica" +msgstr "Costa Rica" + +#. 192 +msgid "Cuba" +msgstr "Cuba" + +#. 132 +msgid "Cape Verde" +msgstr "Cape Verde" + +#. 162 +msgid "Christmas Island" +msgstr "Đảo Christmas" + +#. 196 +msgid "Cyprus" +msgstr "Đảo Síp" + +#. 203 +msgid "Czech Republic" +msgstr "Cộng hoà Séc" + +#. 276 +msgid "Germany" +msgstr "Đức" + +#. 262 +msgid "Djibouti" +msgstr "Djibouti" + +#. 208 +msgid "Denmark" +msgstr "Đan Mạch" + +#. 212 +msgid "Dominica" +msgstr "Dominica" + +#. 214 +msgid "Dominican Republic" +msgstr "Dominican Republic" + +#. 012 +msgid "Algeria" +msgstr "Algeria" + +#. 218 +msgid "Ecuador" +msgstr "Ecuador" + +#. 233 +msgid "Estonia" +msgstr "Estonia" + +#. 818 +msgid "Egypt" +msgstr "Ai Cập" + +#. 732 +msgid "Western Sahara" +msgstr "Tây Sahara" + +#. 232 +msgid "Eritrea" +msgstr "Eritrea" + +#. 724 +msgid "Spain" +msgstr "Tây Ban Nha" + +#. 231 +msgid "Ethiopia" +msgstr "Ethiopia" + +#. 246 +msgid "Finland" +msgstr "Phần Lan" + +#. 242 +msgid "Fiji" +msgstr "Fiji" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "Falkland Islands (Malvinas)" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "Micronesia, Federated States of" + +#. 234 +msgid "Faroe Islands" +msgstr "Faroe Islands" + +#. 250 +msgid "France" +msgstr "Pháp" + +#. 266 +msgid "Gabon" +msgstr "Gabon" + +#. 826 +msgid "United Kingdom" +msgstr "Vương quốc Anh" + +#. 308 +msgid "Grenada" +msgstr "Grenada" + +#. 268 +msgid "Georgia" +msgstr "Georgia" + +#. 254 +msgid "French Guiana" +msgstr "French Guiana" + +#. 831 +msgid "Guernsey" +msgstr "Guernsey" + +#. 288 +msgid "Ghana" +msgstr "Ghana" + +#. 292 +msgid "Gibraltar" +msgstr "Gibraltar" + +#. 304 +msgid "Greenland" +msgstr "Greenland" + +#. 270 +msgid "Gambia" +msgstr "Gambia" + +#. 324 +msgid "Guinea" +msgstr "Guinea" + +#. 312 +msgid "Guadeloupe" +msgstr "Guadeloupe" + +#. 226 +msgid "Equatorial Guinea" +msgstr "Equatorial Guinea" + +#. 300 +msgid "Greece" +msgstr "Hy Lạp" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "South Georgia and the South Sandwich Islands" + +#. 320 +msgid "Guatemala" +msgstr "Guatemala" + +#. 316 +msgid "Guam" +msgstr "Guam" + +#. 624 +msgid "Guinea-Bissau" +msgstr "Guinea-Bissau" + +#. 328 +msgid "Guyana" +msgstr "Guyana" + +#. 344 +msgid "Hong Kong" +msgstr "Hồng Kông" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "Heard Island and McDonald Islands" + +#. 340 +msgid "Honduras" +msgstr "Honduras" + +#. 191 +msgid "Croatia" +msgstr "Croatia" + +#. 332 +msgid "Haiti" +msgstr "Haiti" + +#. 348 +msgid "Hungary" +msgstr "Hungary" + +#. 360 +msgid "Indonesia" +msgstr "Indonesia" + +#. 372 +msgid "Ireland" +msgstr "Ireland" + +#. 376 +msgid "Israel" +msgstr "Israel" + +#. 833 +msgid "Isle of Man" +msgstr "Isle of Man" + +#. 356 +msgid "India" +msgstr "Ấn Độ" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "British Indian Ocean Territory" + +#. 368 +msgid "Iraq" +msgstr "Iraq" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "Iran, Islamic Republic of" + +#. 352 +msgid "Iceland" +msgstr "Iceland" + +#. 380 +msgid "Italy" +msgstr "Ý" + +#. 832 +msgid "Jersey" +msgstr "Jersey" + +#. 388 +msgid "Jamaica" +msgstr "Jamaica" + +#. 400 +msgid "Jordan" +msgstr "Jordan" + +#. 392 +msgid "Japan" +msgstr "Nhật bản" + +#. 404 +msgid "Kenya" +msgstr "Kenya" + +#. 417 +msgid "Kyrgyzstan" +msgstr "Kyrgyzstan" + +#. 116 +msgid "Cambodia" +msgstr "Campuchia" + +#. 296 +msgid "Kiribati" +msgstr "Kiribati" + +#. 174 +msgid "Comoros" +msgstr "Comoros" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "Saint Kitts and Nevis" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "Bắc Triều Tiên" + +#. 410 +msgid "Korea, Republic of" +msgstr "Hàn quốc" + +#. 414 +msgid "Kuwait" +msgstr "Kuwait" + +#. 136 +msgid "Cayman Islands" +msgstr "Quần đảo Cayman" + +#. 398 +msgid "Kazakhstan" +msgstr "Kazakhstan" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "Cộng hoà Nhân dân Dân chủ Lào" + +#. 422 +msgid "Lebanon" +msgstr "Lebanon" + +#. 662 +msgid "Saint Lucia" +msgstr "Saint Lucia" + +#. 438 +msgid "Liechtenstein" +msgstr "Liechtenstein" + +#. 144 +msgid "Sri Lanka" +msgstr "Sri Lanka" + +#. 430 +msgid "Liberia" +msgstr "Liberia" + +#. 426 +msgid "Lesotho" +msgstr "Lesotho" + +#. 440 +msgid "Lithuania" +msgstr "Lithuania" + +#. 442 +msgid "Luxembourg" +msgstr "Luxembourg" + +#. 428 +msgid "Latvia" +msgstr "Latvia" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "Libyan Arab Jamahiriya" + +#. 504 +msgid "Morocco" +msgstr "Morocco" + +#. 492 +msgid "Monaco" +msgstr "Monaco" + +#. 498 +msgid "Moldova, Republic of" +msgstr "Moldova, Republic of" + +#. 499 +msgid "Montenegro" +msgstr "Montenegro" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "Saint Martin (French part)" + +#. 450 +msgid "Madagascar" +msgstr "Madagascar" + +#. 584 +msgid "Marshall Islands" +msgstr "Quần đảo Marshall" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "Macedonia, the former Yugoslav Republic of" + +#. 466 +msgid "Mali" +msgstr "Mali" + +#. 104 +msgid "Myanmar" +msgstr "Myanmar" + +#. 496 +msgid "Mongolia" +msgstr "Mông Cổ" + +#. 446 +msgid "Macao" +msgstr "Macao" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "Northern Mariana Islands" + +#. 474 +msgid "Martinique" +msgstr "Martinique" + +#. 478 +msgid "Mauritania" +msgstr "Mauritania" + +#. 500 +msgid "Montserrat" +msgstr "Montserrat" + +#. 470 +msgid "Malta" +msgstr "Malta" + +#. 480 +msgid "Mauritius" +msgstr "Mauritius" + +#. 462 +msgid "Maldives" +msgstr "Maldives" + +#. 454 +msgid "Malawi" +msgstr "Malawi" + +#. 484 +msgid "Mexico" +msgstr "Mexico" + +#. 458 +msgid "Malaysia" +msgstr "Malaysia" + +#. 508 +msgid "Mozambique" +msgstr "Mozambique" + +#. 516 +msgid "Namibia" +msgstr "Namibia" + +#. 540 +msgid "New Caledonia" +msgstr "New Caledonia" + +#. 562 +msgid "Niger" +msgstr "Niger" + +#. 574 +msgid "Norfolk Island" +msgstr "Norfolk Island" + +#. 566 +msgid "Nigeria" +msgstr "Nigeria" + +#. 558 +msgid "Nicaragua" +msgstr "Nicaragua" + +#. 528 +msgid "Netherlands" +msgstr "Hà Lan" + +#. 578 +msgid "Norway" +msgstr "Na Uy" + +#. 524 +msgid "Nepal" +msgstr "Nepal" + +#. 520 +msgid "Nauru" +msgstr "Nauru" + +#. 570 +msgid "Niue" +msgstr "Niue" + +#. 554 +msgid "New Zealand" +msgstr "New Zealand" + +#. 512 +msgid "Oman" +msgstr "Oman" + +#. 591 +msgid "Panama" +msgstr "Panama" + +#. 604 +msgid "Peru" +msgstr "Peru" + +#. 258 +msgid "French Polynesia" +msgstr "French Polynesia" + +#. 598 +msgid "Papua New Guinea" +msgstr "Papua New Guinea" + +#. 608 +msgid "Philippines" +msgstr "Philippines" + +#. 586 +msgid "Pakistan" +msgstr "Pakistan" + +#. 616 +msgid "Poland" +msgstr "Poland" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "Saint Pierre and Miquelon" + +#. 612 +msgid "Pitcairn" +msgstr "Pitcairn" + +#. 630 +msgid "Puerto Rico" +msgstr "Puerto Rico" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "Palestinian Territory, Occupied" + +#. 620 +msgid "Portugal" +msgstr "Bồ Đào Nha" + +#. 585 +msgid "Palau" +msgstr "Palau" + +#. 600 +msgid "Paraguay" +msgstr "Paraguay" + +#. 634 +msgid "Qatar" +msgstr "Qatar" + +#. 638 +msgid "Reunion" +msgstr "Reunion" + +#. 642 +msgid "Romania" +msgstr "Romania" + +#. 688 +msgid "Serbia" +msgstr "Serbia" + +#. 643 +msgid "Russian Federation" +msgstr "Liên bang Nga" + +#. 646 +msgid "Rwanda" +msgstr "Rwanda" + +#. 682 +msgid "Saudi Arabia" +msgstr "Saudi Arabia" + +#. 090 +msgid "Solomon Islands" +msgstr "Quần đảo Solomon" + +#. 690 +msgid "Seychelles" +msgstr "Seychelles" + +#. 736 +msgid "Sudan" +msgstr "Sudan" + +#. 752 +msgid "Sweden" +msgstr "Thụy Điển" + +#. 702 +msgid "Singapore" +msgstr "Singapore" + +#. 654 +msgid "Saint Helena" +msgstr "Saint Helena" + +#. 705 +msgid "Slovenia" +msgstr "Slovenia" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "Svalbard and Jan Mayen" + +#. 703 +msgid "Slovakia" +msgstr "Slovakia" + +#. 694 +msgid "Sierra Leone" +msgstr "Sierra Leone" + +#. 674 +msgid "San Marino" +msgstr "San Marino" + +#. 686 +msgid "Senegal" +msgstr "Senegal" + +#. 706 +msgid "Somalia" +msgstr "Somalia" + +#. 740 +msgid "Suriname" +msgstr "Suriname" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "Sao Tome and Principe" + +#. 222 +msgid "El Salvador" +msgstr "El Salvador" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "Syrian Arab Republic" + +#. 748 +msgid "Swaziland" +msgstr "Swaziland" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "Turks and Caicos Islands" + +#. 148 +msgid "Chad" +msgstr "Chad" + +#. 260 +msgid "French Southern Territories" +msgstr "French Southern Territories" + +#. 768 +msgid "Togo" +msgstr "Togo" + +#. 764 +msgid "Thailand" +msgstr "Thái Lan" + +#. 762 +msgid "Tajikistan" +msgstr "Tajikistan" + +#. 772 +msgid "Tokelau" +msgstr "Tokelau" + +#. 626 +msgid "Timor-Leste" +msgstr "Timor-Leste" + +#. 795 +msgid "Turkmenistan" +msgstr "Turkmenistan" + +#. 788 +msgid "Tunisia" +msgstr "Tunisia" + +#. 776 +msgid "Tonga" +msgstr "Tonga" + +#. 792 +msgid "Turkey" +msgstr "Thổ nhĩ kỳ" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "Trinidad and Tobago" + +#. 798 +msgid "Tuvalu" +msgstr "Tuvalu" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "Đài loan" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "Tanzania, United Republic of" + +#. 804 +msgid "Ukraine" +msgstr "Ukraine" + +#. 800 +msgid "Uganda" +msgstr "Uganda" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "United States Minor Outlying Islands" + +#. 840 +msgid "United States" +msgstr "Mỹ" + +#. 858 +msgid "Uruguay" +msgstr "Uruguay" + +#. 860 +msgid "Uzbekistan" +msgstr "Uzbekistan" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "Holy See (Vatican City State)" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "Saint Vincent and the Grenadines" + +#. 862 +msgid "Venezuela" +msgstr "Venezuela" + +#. 092 +msgid "Virgin Islands, British" +msgstr "Virgin Islands, British" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "Virgin Islands, U.S." + +#. 704 +msgid "Viet Nam" +msgstr "Việt Nam" + +#. 548 +msgid "Vanuatu" +msgstr "Vanuatu" + +#. 876 +msgid "Wallis and Futuna" +msgstr "Wallis and Futuna" + +#. 882 +msgid "Samoa" +msgstr "Samoa" + +#. 887 +msgid "Yemen" +msgstr "Yemen" + +#. 175 +msgid "Mayotte" +msgstr "Mayotte" + +#. 710 +msgid "South Africa" +msgstr "South Africa" + +#. 894 +msgid "Zambia" +msgstr "Zambia" + +#. 716 +msgid "Zimbabwe" +msgstr "Zimbabwe" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* Không xác định, gán thẻ \"is_in\" cho những thành phố đó" + +msgid "Car" +msgstr "Ô tô" + +msgid "Iso2" +msgstr "Iso2" + +msgid "Iso3" +msgstr "Iso3" + +msgid "Country" +msgstr "Quốc gia" + +msgid "Postal" +msgstr "Bưu điện" + +msgid "Town" +msgstr "Thị trấn" + +msgid "District" +msgstr "Huyện" + +msgid "Street" +msgstr "Phố" + +msgid "Number" +msgstr "Số" + +msgid "Enter Destination" +msgstr "Nhập nơi đến" + +msgid "Zip Code" +msgstr "Mã bưu điện" + +msgid "City" +msgstr "Thành phố" + +msgid "District/Township" +msgstr "Huyện/Thị trấn nhỏ" + +msgid "Map" +msgstr "Bản đồ" + +msgid "Bookmark" +msgstr "Đánh dấu" + +msgid "Destination" +msgstr "Điểm đến" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "Hiển thị" + +msgid "_Route" +msgstr "Tuyến" + +msgid "_Former Destinations" +msgstr "Điểm đến trước" + +msgid "_Bookmarks" +msgstr "Đánh dấu" + +msgid "_Map" +msgstr "Bản đồ" + +msgid "_Layout" +msgstr "Layout" + +msgid "_Projection" +msgstr "Phép chiếu" + +msgid "_Vehicle" +msgstr "Phương tiện" + +msgid "Zoom_Out" +msgstr "Thu nhỏ" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "Phóng to" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "Tính lại" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "Thông tin" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "Dừng dẫn đường" + +msgid "Test" +msgstr "Kiểm tra" + +msgid "_Quit" +msgstr "_Thoát" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "Bám vào đường" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "Roadbook" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "Tự động thu phóng" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "Toàn màn hình" + +msgid "Data" +msgstr "Dữ liệu" + +msgid "N" +msgstr "Bắc" + +msgid "NE" +msgstr "Đông Bắc" + +msgid "E" +msgstr "Đông" + +msgid "SE" +msgstr "Đông Nam" + +msgid "S" +msgstr "Nam" + +msgid "SW" +msgstr "Tây Nam" + +msgid "W" +msgstr "Tây" + +msgid "NW" +msgstr "Tây Bắc" + +msgid "No" +msgstr "Không" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "Tuyến %4.0fkm %02d:%02d ETA" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "Tuyến 0000km 0+00:00 ETA" + +msgid "Back to map" +msgstr "Quay lại bản đồ" + +msgid "Main Menu" +msgstr "Trình đơn chính" + +msgid "Help" +msgstr "Trợ giúp" + +msgid "Back" +msgstr "Quay lại" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "Điểm hữu ích (POI)" + +msgid "View in Browser" +msgstr "Xem trong trình duyệt" + +msgid "Streets" +msgstr "Phố" + +msgid "House numbers" +msgstr "Số nhà" + +msgid "View Attributes" +msgstr "Xem thuộc tính" + +msgid "View on map" +msgstr "Xem trên bản đồ" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "Đánh dấu" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "Đánh dấu %s" + +msgid "Former Destinations" +msgstr "Điểm đến trước" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "Số nhà" + +msgid "Layout" +msgstr "Layout" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "Bản đồ" + +msgid "Show Satellite Status" +msgstr "Xem thông tin vệ tinh" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "Xem dữ liệu dạng NMEA" + +msgid "car" +msgstr "ôtô" + +msgid "bike" +msgstr "gắn máy" + +msgid "pedestrian" +msgstr "khách bộ hành" + +#, c-format +msgid "Current profile: %s" +msgstr "Hồ sơ hiện hành: %s" + +#, c-format +msgid "Change profile to: %s" +msgstr "Đổi thành hồ sơ: %s" + +msgid "Set as active" +msgstr "Kích hoạt" + +msgid "Show Satellite status" +msgstr "Xem thông tin vệ tinh" + +msgid "Show NMEA data" +msgstr "Xem dữ liệu dạng NMEA" + +msgid "Vehicle" +msgstr "Phương tiện" + +msgid "Rules" +msgstr "Quy tắc" + +msgid "Lock on road" +msgstr "Bám vào đường" + +msgid "Northing" +msgstr "Hướng Bắc" + +msgid "Map follows Vehicle" +msgstr "Dịch bản đồ theo phương tiện khi di chuyển" + +msgid "Message" +msgstr "Thông điệp" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "Thông tin chiều cao" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "Map Point" + +msgid "Vehicle Position" +msgstr "Vị trí phương tiện" + +msgid "Main menu" +msgstr "Trình đơn chính" + +msgid "" +"Show\n" +"Map" +msgstr "Xem bản đồ" + +msgid "Settings" +msgstr "Thiết lập" + +msgid "Tools" +msgstr "Công cụ" + +msgid "Route" +msgstr "Tuyến" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "Thao tác" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "Thoát" + +msgid "" +"Stop\n" +"Navigation" +msgstr "Dừng dẫn đường" + +msgid "Display" +msgstr "Hiển thị" + +msgid "Fullscreen" +msgstr "Toàn màn hình" + +msgid "Window Mode" +msgstr "Chế độ cửa sổ" + +msgid "Description" +msgstr "Mô tả" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "Còn %s, đi vào đường vòng" + +#~ msgid "Cursor" +#~ msgstr "Con trỏ" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d km" diff --git a/po/zh_CN.po.in b/po/zh_CN.po.in new file mode 100644 index 0000000..cc0c595 --- /dev/null +++ b/po/zh_CN.po.in @@ -0,0 +1,1755 @@ +# Simplified Chinese translation for navit +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the navit package. +# Kyle, 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2009-12-20 20:38+0000\n" +"Last-Translator: Kyle WANG \n" +"Language-Team: Simplified Chinese \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "从根目录执行\n" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "'%s' 设置为 '%s'\n" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "第零个" + +msgid "first" +msgstr "第一个" + +msgid "second" +msgstr "第二个" + +msgid "third" +msgstr "第三个" + +msgid "fourth" +msgstr "第四个" + +msgid "fifth" +msgstr "第五个" + +msgid "sixth" +msgstr "第六个" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "第零个退出" + +msgid "first exit" +msgstr "第一个退出" + +msgid "second exit" +msgstr "第二个退出" + +msgid "third exit" +msgstr "第三个退出" + +msgid "fourth exit" +msgstr "第四个退出" + +msgid "fifth exit" +msgstr "第五个退出" + +msgid "sixth exit" +msgstr "第六个退出" + +#, c-format +msgid "%d m" +msgstr "%d米" + +#, c-format +msgid "in %d m" +msgstr "距离%d米" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "%d米" + +#, c-format +msgid "in %d meters" +msgstr "距离%d米" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "%d.%d千米" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "距离%d.%d千米" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "%d千米" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "距离%d千米" + +msgid "exit" +msgstr "退出" + +msgid "into the ramp" +msgstr "进入坡道" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "%s 到达街区 %s%s%s" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "%s 到达 %s%s%s | male form" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "%s 到达 %s%s%s | female form" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "%s 到达 %s%s%s | neutral form" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "%s 到达 %s" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "右" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "左" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "缓 " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "急转 " + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "非常大的急转 " + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "未知 " + +msgid "When possible, please turn around" +msgstr "当遇到路口的时候,请转弯" + +msgid "Enter the roundabout soon" +msgstr "不久将进入环形交叉路口" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "然后在%s处驶出环形区" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "还有%s就将驶离环形区" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "沿路继续行驶%s" + +msgid "soon" +msgstr "不久" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "可以经由道路 %1$s 到 %2$s" + +#, c-format +msgid "after %i roads" +msgstr "之后有 %i 条道路" + +msgid "now" +msgstr "现在" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "然后可以经由道路 %1$s 到 %2$s" + +msgid "error" +msgstr "错误" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "转向 %1$s%2$s %3$s%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "然后转向 %1$s%2$s %3$s%4$s" + +#, c-format +msgid "You have reached your destination %s" +msgstr "您已经抵达您的目的地 %s" + +msgid "then you have reached your destination." +msgstr "然后你就到达您的目的地" + +msgid "Position" +msgstr "位置" + +msgid "Command" +msgstr "命令" + +msgid "Length" +msgstr "长度" + +msgid "km" +msgstr "千米" + +msgid "m" +msgstr "米" + +msgid "Time" +msgstr "时间" + +msgid "Destination Length" +msgstr "目的地距离" + +msgid "Destination Time" +msgstr "距目的地时间" + +msgid "Roadbook" +msgstr "路线指南" + +msgid "Set as position" +msgstr "设置为起始位置" + +msgid "Set as destination" +msgstr "设置为目的地" + +msgid "Add as bookmark" +msgstr "添加为书签" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "位置 0x%x 0x%x" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "屏幕坐标:%d %d" + +#. 020 +msgid "Andorra" +msgstr "安道尔" + +#. 784 +msgid "United Arab Emirates" +msgstr "阿拉伯联合酋长国" + +#. 004 +msgid "Afghanistan" +msgstr "阿富汗" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "安提瓜和巴布达" + +#. 660 +msgid "Anguilla" +msgstr "安圭拉" + +#. 008 +msgid "Albania" +msgstr "阿尔巴尼亚" + +#. 051 +msgid "Armenia" +msgstr "亚美尼亚" + +#. 530 +msgid "Netherlands Antilles" +msgstr "荷兰安地列斯" + +#. 024 +msgid "Angola" +msgstr "安哥拉" + +#. 010 +msgid "Antarctica" +msgstr "南极洲" + +#. 032 +msgid "Argentina" +msgstr "阿根廷" + +#. 016 +msgid "American Samoa" +msgstr "美属萨摩亚" + +#. 040 +msgid "Austria" +msgstr "奥地利" + +#. 036 +msgid "Australia" +msgstr "澳大利亚" + +#. 533 +msgid "Aruba" +msgstr "阿鲁巴岛" + +#. 248 +msgid "Aland Islands" +msgstr "奥兰群岛" + +#. 031 +msgid "Azerbaijan" +msgstr "阿塞拜疆" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "波黑" + +#. 052 +msgid "Barbados" +msgstr "巴巴多斯" + +#. 050 +msgid "Bangladesh" +msgstr "孟加拉国" + +#. 056 +msgid "Belgium" +msgstr "比利时" + +#. 854 +msgid "Burkina Faso" +msgstr "布基纳法索" + +#. 100 +msgid "Bulgaria" +msgstr "保加利亚" + +#. 048 +msgid "Bahrain" +msgstr "巴林" + +#. 108 +msgid "Burundi" +msgstr "布隆迪" + +#. 204 +msgid "Benin" +msgstr "贝宁" + +#. 652 +msgid "Saint Barthelemy" +msgstr "圣巴泰勒米岛" + +#. 060 +msgid "Bermuda" +msgstr "百慕大群岛" + +#. 096 +msgid "Brunei Darussalam" +msgstr "文莱达鲁萨兰国" + +#. 068 +msgid "Bolivia" +msgstr "玻利维亚" + +#. 076 +msgid "Brazil" +msgstr "巴西" + +#. 044 +msgid "Bahamas" +msgstr "巴哈马群岛" + +#. 064 +msgid "Bhutan" +msgstr "不丹" + +#. 074 +msgid "Bouvet Island" +msgstr "布维岛" + +#. 072 +msgid "Botswana" +msgstr "博茨瓦那" + +#. 112 +msgid "Belarus" +msgstr "白俄罗斯" + +#. 084 +msgid "Belize" +msgstr "伯利兹" + +#. 124 +msgid "Canada" +msgstr "加拿大" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "科科斯群岛" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "刚果" + +#. 140 +msgid "Central African Republic" +msgstr "中非共和国" + +#. 178 +msgid "Congo" +msgstr "" + +#. 756 +msgid "Switzerland" +msgstr "瑞士" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "科特迪瓦" + +#. 184 +msgid "Cook Islands" +msgstr "库克群岛" + +#. 152 +msgid "Chile" +msgstr "智利" + +#. 120 +msgid "Cameroon" +msgstr "喀麦隆" + +#. 156 +msgid "China" +msgstr "中国" + +#. 170 +msgid "Colombia" +msgstr "哥伦比亚" + +#. 188 +msgid "Costa Rica" +msgstr "哥斯达黎加" + +#. 192 +msgid "Cuba" +msgstr "古巴" + +#. 132 +msgid "Cape Verde" +msgstr "佛得角" + +#. 162 +msgid "Christmas Island" +msgstr "圣诞岛" + +#. 196 +msgid "Cyprus" +msgstr "塞浦路斯" + +#. 203 +msgid "Czech Republic" +msgstr "捷克" + +#. 276 +msgid "Germany" +msgstr "德国" + +#. 262 +msgid "Djibouti" +msgstr "吉布提" + +#. 208 +msgid "Denmark" +msgstr "丹麦" + +#. 212 +msgid "Dominica" +msgstr "多米尼克" + +#. 214 +msgid "Dominican Republic" +msgstr "多米尼亚共和国" + +#. 012 +msgid "Algeria" +msgstr "阿尔及利亚" + +#. 218 +msgid "Ecuador" +msgstr "厄瓜多尔" + +#. 233 +msgid "Estonia" +msgstr "爱沙尼亚" + +#. 818 +msgid "Egypt" +msgstr "埃及" + +#. 732 +msgid "Western Sahara" +msgstr "西萨哈拉" + +#. 232 +msgid "Eritrea" +msgstr "厄立特里亚" + +#. 724 +msgid "Spain" +msgstr "西班牙" + +#. 231 +msgid "Ethiopia" +msgstr "埃塞额比亚" + +#. 246 +msgid "Finland" +msgstr "芬兰" + +#. 242 +msgid "Fiji" +msgstr "斐济" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "弗克兰群岛" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "密克罗尼西亚联邦" + +#. 234 +msgid "Faroe Islands" +msgstr "法罗群岛" + +#. 250 +msgid "France" +msgstr "法国" + +#. 266 +msgid "Gabon" +msgstr "加蓬" + +#. 826 +msgid "United Kingdom" +msgstr "英国" + +#. 308 +msgid "Grenada" +msgstr "格林纳达岛" + +#. 268 +msgid "Georgia" +msgstr "格鲁吉亚" + +#. 254 +msgid "French Guiana" +msgstr "法属圭亚那" + +#. 831 +msgid "Guernsey" +msgstr "格恩西岛" + +#. 288 +msgid "Ghana" +msgstr "加纳" + +#. 292 +msgid "Gibraltar" +msgstr "直布罗陀" + +#. 304 +msgid "Greenland" +msgstr "格陵兰岛" + +#. 270 +msgid "Gambia" +msgstr "冈比亚" + +#. 324 +msgid "Guinea" +msgstr "几内亚" + +#. 312 +msgid "Guadeloupe" +msgstr "瓜德罗普岛" + +#. 226 +msgid "Equatorial Guinea" +msgstr "赤道几内亚" + +#. 300 +msgid "Greece" +msgstr "希腊" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "南乔治亚岛和南桑德韦奇岛" + +#. 320 +msgid "Guatemala" +msgstr "危地马拉" + +#. 316 +msgid "Guam" +msgstr "关岛" + +#. 624 +msgid "Guinea-Bissau" +msgstr "几内亚比绍共和国" + +#. 328 +msgid "Guyana" +msgstr "盖亚那" + +#. 344 +msgid "Hong Kong" +msgstr "香港" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "赫德和麦克唐纳群岛" + +#. 340 +msgid "Honduras" +msgstr "洪都拉斯" + +#. 191 +msgid "Croatia" +msgstr "克罗地亚" + +#. 332 +msgid "Haiti" +msgstr "海地" + +#. 348 +msgid "Hungary" +msgstr "匈牙利" + +#. 360 +msgid "Indonesia" +msgstr "印度尼西亚" + +#. 372 +msgid "Ireland" +msgstr "爱尔兰" + +#. 376 +msgid "Israel" +msgstr "以色列" + +#. 833 +msgid "Isle of Man" +msgstr "马恩岛" + +#. 356 +msgid "India" +msgstr "印度" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "英属印度洋领地" + +#. 368 +msgid "Iraq" +msgstr "伊拉克" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "伊朗伊斯兰共和国" + +#. 352 +msgid "Iceland" +msgstr "冰岛" + +#. 380 +msgid "Italy" +msgstr "意大利" + +#. 832 +msgid "Jersey" +msgstr "泽西岛" + +#. 388 +msgid "Jamaica" +msgstr "牙买加" + +#. 400 +msgid "Jordan" +msgstr "约旦" + +#. 392 +msgid "Japan" +msgstr "日本" + +#. 404 +msgid "Kenya" +msgstr "肯尼亚" + +#. 417 +msgid "Kyrgyzstan" +msgstr "吉尔吉斯斯坦" + +#. 116 +msgid "Cambodia" +msgstr "柬埔寨" + +#. 296 +msgid "Kiribati" +msgstr "基里巴斯" + +#. 174 +msgid "Comoros" +msgstr "科摩罗" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "圣基茨和尼维斯" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "朝鲜" + +#. 410 +msgid "Korea, Republic of" +msgstr "韩国" + +#. 414 +msgid "Kuwait" +msgstr "科威特" + +#. 136 +msgid "Cayman Islands" +msgstr "开曼群岛" + +#. 398 +msgid "Kazakhstan" +msgstr "哈萨克斯坦" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "老挝人民民主共和国" + +#. 422 +msgid "Lebanon" +msgstr "黎巴嫩" + +#. 662 +msgid "Saint Lucia" +msgstr "圣卢西亚" + +#. 438 +msgid "Liechtenstein" +msgstr "列支敦士登" + +#. 144 +msgid "Sri Lanka" +msgstr "斯里兰卡" + +#. 430 +msgid "Liberia" +msgstr "利比里亚" + +#. 426 +msgid "Lesotho" +msgstr "莱索托" + +#. 440 +msgid "Lithuania" +msgstr "立陶宛" + +#. 442 +msgid "Luxembourg" +msgstr "卢森堡" + +#. 428 +msgid "Latvia" +msgstr "拉脱维亚" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "利比亚" + +#. 504 +msgid "Morocco" +msgstr "摩洛哥" + +#. 492 +msgid "Monaco" +msgstr "摩纳哥" + +#. 498 +msgid "Moldova, Republic of" +msgstr "摩尔多瓦共和国" + +#. 499 +msgid "Montenegro" +msgstr "黑山" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "圣马丁" + +#. 450 +msgid "Madagascar" +msgstr "马达加斯加" + +#. 584 +msgid "Marshall Islands" +msgstr "马绍尔群岛" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "马其顿" + +#. 466 +msgid "Mali" +msgstr "马里" + +#. 104 +msgid "Myanmar" +msgstr "缅甸" + +#. 496 +msgid "Mongolia" +msgstr "蒙古" + +#. 446 +msgid "Macao" +msgstr "澳门" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "北马里亚纳群岛" + +#. 474 +msgid "Martinique" +msgstr "马提尼克" + +#. 478 +msgid "Mauritania" +msgstr "毛里塔尼亚" + +#. 500 +msgid "Montserrat" +msgstr "蒙特萨拉特岛" + +#. 470 +msgid "Malta" +msgstr "马尔他" + +#. 480 +msgid "Mauritius" +msgstr "毛里求斯" + +#. 462 +msgid "Maldives" +msgstr "马尔代夫" + +#. 454 +msgid "Malawi" +msgstr "马拉威" + +#. 484 +msgid "Mexico" +msgstr "墨西哥" + +#. 458 +msgid "Malaysia" +msgstr "马来西亚" + +#. 508 +msgid "Mozambique" +msgstr "莫桑比克" + +#. 516 +msgid "Namibia" +msgstr "纳米比亚" + +#. 540 +msgid "New Caledonia" +msgstr "新喀里多尼亚" + +#. 562 +msgid "Niger" +msgstr "尼日尔" + +#. 574 +msgid "Norfolk Island" +msgstr "诺福克岛" + +#. 566 +msgid "Nigeria" +msgstr "尼日利亚" + +#. 558 +msgid "Nicaragua" +msgstr "尼加拉瓜" + +#. 528 +msgid "Netherlands" +msgstr "荷兰" + +#. 578 +msgid "Norway" +msgstr "挪威" + +#. 524 +msgid "Nepal" +msgstr "尼泊尔" + +#. 520 +msgid "Nauru" +msgstr "瑙鲁" + +#. 570 +msgid "Niue" +msgstr "纽埃岛" + +#. 554 +msgid "New Zealand" +msgstr "新西兰" + +#. 512 +msgid "Oman" +msgstr "阿曼" + +#. 591 +msgid "Panama" +msgstr "巴拿马" + +#. 604 +msgid "Peru" +msgstr "秘鲁" + +#. 258 +msgid "French Polynesia" +msgstr "法属波利尼西亚" + +#. 598 +msgid "Papua New Guinea" +msgstr "巴布亚新几内亚" + +#. 608 +msgid "Philippines" +msgstr "菲律宾" + +#. 586 +msgid "Pakistan" +msgstr "巴基斯坦" + +#. 616 +msgid "Poland" +msgstr "波兰" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "圣皮埃尔和密克隆" + +#. 612 +msgid "Pitcairn" +msgstr "皮特凯恩" + +#. 630 +msgid "Puerto Rico" +msgstr "波多黎各" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "巴勒斯坦领土被占领" + +#. 620 +msgid "Portugal" +msgstr "葡萄牙" + +#. 585 +msgid "Palau" +msgstr "帕劳" + +#. 600 +msgid "Paraguay" +msgstr "巴拉圭" + +#. 634 +msgid "Qatar" +msgstr "卡塔尔" + +#. 638 +msgid "Reunion" +msgstr "法属留尼旺岛" + +#. 642 +msgid "Romania" +msgstr "罗马尼亚" + +#. 688 +msgid "Serbia" +msgstr "塞尔维亚" + +#. 643 +msgid "Russian Federation" +msgstr "俄罗斯联邦" + +#. 646 +msgid "Rwanda" +msgstr "卢旺达" + +#. 682 +msgid "Saudi Arabia" +msgstr "沙特阿拉伯" + +#. 090 +msgid "Solomon Islands" +msgstr "所罗门群岛" + +#. 690 +msgid "Seychelles" +msgstr "塞舌尔" + +#. 736 +msgid "Sudan" +msgstr "苏丹" + +#. 752 +msgid "Sweden" +msgstr "瑞典" + +#. 702 +msgid "Singapore" +msgstr "新加坡" + +#. 654 +msgid "Saint Helena" +msgstr "圣赫勒拿" + +#. 705 +msgid "Slovenia" +msgstr "斯洛文尼亚" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "斯瓦尔巴群岛" + +#. 703 +msgid "Slovakia" +msgstr "斯洛伐克" + +#. 694 +msgid "Sierra Leone" +msgstr "塞拉利昂" + +#. 674 +msgid "San Marino" +msgstr "圣马力诺" + +#. 686 +msgid "Senegal" +msgstr "塞内加尔" + +#. 706 +msgid "Somalia" +msgstr "索马里" + +#. 740 +msgid "Suriname" +msgstr "苏里南" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "圣多美及普林西比" + +#. 222 +msgid "El Salvador" +msgstr "萨尔瓦多" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "阿拉伯叙利亚共和国" + +#. 748 +msgid "Swaziland" +msgstr "斯威士兰" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "特克斯和凯科斯群岛" + +#. 148 +msgid "Chad" +msgstr "乍得" + +#. 260 +msgid "French Southern Territories" +msgstr "法属南部占领地" + +#. 768 +msgid "Togo" +msgstr "多哥" + +#. 764 +msgid "Thailand" +msgstr "泰国" + +#. 762 +msgid "Tajikistan" +msgstr "塔吉克斯坦" + +#. 772 +msgid "Tokelau" +msgstr "托克劳" + +#. 626 +msgid "Timor-Leste" +msgstr "东帝汶" + +#. 795 +msgid "Turkmenistan" +msgstr "土库曼斯坦" + +#. 788 +msgid "Tunisia" +msgstr "突尼斯" + +#. 776 +msgid "Tonga" +msgstr "汤加" + +#. 792 +msgid "Turkey" +msgstr "土耳其" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "特立尼达和多巴哥" + +#. 798 +msgid "Tuvalu" +msgstr "图瓦卢" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "台湾(中国)" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "坦桑尼亚联合共和国" + +#. 804 +msgid "Ukraine" +msgstr "乌克兰" + +#. 800 +msgid "Uganda" +msgstr "乌干达" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "美国本土外小岛屿" + +#. 840 +msgid "United States" +msgstr "美国" + +#. 858 +msgid "Uruguay" +msgstr "乌拉圭" + +#. 860 +msgid "Uzbekistan" +msgstr "乌兹别克斯坦" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "圣座" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "圣文森特和格林纳丁斯" + +#. 862 +msgid "Venezuela" +msgstr "委内瑞拉" + +#. 092 +msgid "Virgin Islands, British" +msgstr "英属维京群岛" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "美属维京群岛" + +#. 704 +msgid "Viet Nam" +msgstr "越南" + +#. 548 +msgid "Vanuatu" +msgstr "瓦努阿图" + +#. 876 +msgid "Wallis and Futuna" +msgstr "瓦利斯和富图纳群岛" + +#. 882 +msgid "Samoa" +msgstr "萨摩亚群岛" + +#. 887 +msgid "Yemen" +msgstr "也门" + +#. 175 +msgid "Mayotte" +msgstr "马约特岛" + +#. 710 +msgid "South Africa" +msgstr "南非" + +#. 894 +msgid "Zambia" +msgstr "赞比亚" + +#. 716 +msgid "Zimbabwe" +msgstr "津巴布韦" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "* 未知,添加标签" + +msgid "Car" +msgstr "汽车" + +msgid "Iso2" +msgstr "" + +msgid "Iso3" +msgstr "" + +msgid "Country" +msgstr "国家" + +msgid "Postal" +msgstr "邮编" + +msgid "Town" +msgstr "区/镇" + +msgid "District" +msgstr "城区" + +msgid "Street" +msgstr "街区" + +msgid "Number" +msgstr "门牌号" + +msgid "Enter Destination" +msgstr "进入目标区域" + +msgid "Zip Code" +msgstr "区号(邮编)" + +msgid "City" +msgstr "城市" + +msgid "District/Township" +msgstr "市区/区镇" + +msgid "Map" +msgstr "地图" + +msgid "Bookmark" +msgstr "书签" + +msgid "Destination" +msgstr "目的地" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "显示" + +msgid "_Route" +msgstr "路线" + +msgid "_Former Destinations" +msgstr "前一目的地" + +msgid "_Bookmarks" +msgstr "书签" + +msgid "_Map" +msgstr "地图" + +msgid "_Layout" +msgstr "布局" + +msgid "_Projection" +msgstr "规划" + +msgid "_Vehicle" +msgstr "车辆" + +msgid "Zoom_Out" +msgstr "缩小" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "放大" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "重新计算" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "信息" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "停止导航" + +msgid "Test" +msgstr "测试" + +msgid "_Quit" +msgstr "退出(_Q)" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "锁定路线" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "路线指南" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "自动缩放" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "全屏" + +msgid "Data" +msgstr "数据" + +msgid "N" +msgstr "北" + +msgid "NE" +msgstr "东北" + +msgid "E" +msgstr "东" + +msgid "SE" +msgstr "东南" + +msgid "S" +msgstr "南" + +msgid "SW" +msgstr "西南" + +msgid "W" +msgstr "西" + +msgid "NW" +msgstr "西北" + +msgid "No" +msgstr "否" + +msgid "2D" +msgstr "2D" + +msgid "3D" +msgstr "3D" + +msgid "OT" +msgstr "OT" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "路线 %4.0f千米 %02d:%02d ETA" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "路线 0000千米 0+00:00 ETA" + +msgid "Back to map" +msgstr "返回到地图" + +msgid "Main Menu" +msgstr "主菜单" + +msgid "Help" +msgstr "帮助" + +msgid "Back" +msgstr "返回" + +msgid "Add Bookmark" +msgstr "增加书签" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "添加书签文件夹" + +msgid "Rename" +msgstr "重命名" + +msgid "POIs" +msgstr "您可能感兴趣的位置" + +msgid "View in Browser" +msgstr "在浏览器中查看" + +msgid "Streets" +msgstr "街道" + +msgid "House numbers" +msgstr "编号" + +msgid "View Attributes" +msgstr "查看属性" + +msgid "View on map" +msgstr "在地图中查看" + +msgid "Cut Bookmark" +msgstr "剪切标签" + +msgid "Copy Bookmark" +msgstr "复制标签" + +msgid "Rename Bookmark" +msgstr "重命名标签" + +msgid "Paste Bookmark" +msgstr "粘帖标签" + +msgid "Delete Bookmark" +msgstr "删除标签" + +msgid "Bookmarks" +msgstr "书签" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "粘帖标签" + +#, c-format +msgid "Bookmark %s" +msgstr "书签 %s" + +msgid "Former Destinations" +msgstr "前一目的地" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "房屋编号(门牌号)" + +msgid "Layout" +msgstr "布局" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "地图" + +msgid "Show Satellite Status" +msgstr "显示卫星状态" + +msgid " Elevation " +msgstr " 海拔" + +msgid " Azimuth " +msgstr " 地平经度" + +msgid "Show NMEA Data" +msgstr "显示NMEA数据" + +msgid "car" +msgstr "汽车" + +msgid "bike" +msgstr "自行车" + +msgid "pedestrian" +msgstr "步行" + +#, c-format +msgid "Current profile: %s" +msgstr "当前设定:%s" + +#, c-format +msgid "Change profile to: %s" +msgstr "更改设定到: %s" + +msgid "Set as active" +msgstr "保存生效" + +msgid "Show Satellite status" +msgstr "显示卫星状态" + +msgid "Show NMEA data" +msgstr "显示NMEA数据" + +msgid "Vehicle" +msgstr "车辆" + +msgid "Rules" +msgstr "规则" + +msgid "Lock on road" +msgstr "锁定路线" + +msgid "Northing" +msgstr "总指向北" + +msgid "Map follows Vehicle" +msgstr "随车显示地图" + +msgid "Message" +msgstr "信息" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "到目的地的路线" + +msgid "Height Profile" +msgstr "高度设定" + +msgid "Show Locale" +msgstr "显示本地" + +msgid "About Navit" +msgstr "关于Navit" + +#. Authors +msgid "By" +msgstr "作者" + +#. Contributors +msgid "And all the Navit Team" +msgstr "和整个的Navit组" + +msgid "members and contributors." +msgstr "成员和贡献者" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "地图位置点" + +msgid "Vehicle Position" +msgstr "车辆位置" + +msgid "Main menu" +msgstr "主菜单" + +msgid "" +"Show\n" +"Map" +msgstr "显示地图" + +msgid "Settings" +msgstr "设置" + +msgid "Tools" +msgstr "工具" + +msgid "Route" +msgstr "路线" + +msgid "About" +msgstr "关于" + +msgid "Actions" +msgstr "动作" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "退出" + +msgid "" +"Stop\n" +"Navigation" +msgstr "停止导航" + +msgid "Display" +msgstr "显示" + +msgid "Fullscreen" +msgstr "全屏" + +msgid "Window Mode" +msgstr "窗口模式" + +msgid "Description" +msgstr "描述" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "骑马" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "In %s, enter the roundabout" +#~ msgstr "还有%s进入环形环形交叉路口" + +#~ msgid "Cursor" +#~ msgstr "光标" + +#~ msgid "%d.%d kilometer" +#~ msgstr "%d.%d千米" diff --git a/po/zh_HK.po.in b/po/zh_HK.po.in new file mode 100644 index 0000000..b5e4dc3 --- /dev/null +++ b/po/zh_HK.po.in @@ -0,0 +1,1751 @@ +# Chinese (Hong Kong) translation for navit +# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 +# This file is distributed under the same license as the navit package. +# Kyle, 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: navit 0.5.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-12-05 18:13+0100\n" +"PO-Revision-Date: 2009-07-02 19:47+0000\n" +"Last-Translator: KaZeR \n" +"Language-Team: Chinese (Hong Kong) \n" +"Language: zh_HK\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Report-Errors: https://translations.launchpad.net/navit/trunk/+pots/navit\n" + +#, c-format +msgid "Running from source directory\n" +msgstr "" + +#, c-format +msgid "setting '%s' to '%s'\n" +msgstr "" + +#. TRANSLATORS: the following counts refer to streets +msgid "zeroth" +msgstr "" + +msgid "first" +msgstr "" + +msgid "second" +msgstr "" + +msgid "third" +msgstr "" + +msgid "fourth" +msgstr "" + +msgid "fifth" +msgstr "" + +msgid "sixth" +msgstr "" + +#. TRANSLATORS: the following counts refer to roundabout exits +msgid "zeroth exit" +msgstr "" + +msgid "first exit" +msgstr "" + +msgid "second exit" +msgstr "" + +msgid "third exit" +msgstr "" + +msgid "fourth exit" +msgstr "" + +msgid "fifth exit" +msgstr "" + +msgid "sixth exit" +msgstr "" + +#, c-format +msgid "%d m" +msgstr "" + +#, c-format +msgid "in %d m" +msgstr "" + +#, c-format +msgid "%d feet" +msgstr "" + +#, c-format +msgid "in %d feet" +msgstr "" + +#, c-format +msgid "%d meters" +msgstr "" + +#, c-format +msgid "in %d meters" +msgstr "" + +#, c-format +msgid "%d.%d miles" +msgstr "" + +#, c-format +msgid "in %d.%d miles" +msgstr "" + +#, c-format +msgid "%d.%d kilometers" +msgstr "" + +#, c-format +msgid "in %d.%d kilometers" +msgstr "" + +#, c-format +msgid "one mile" +msgid_plural "%d miles" +msgstr[0] "" + +#, c-format +msgid "in one mile" +msgid_plural "in %d miles" +msgstr[0] "" + +#, c-format +msgid "one kilometer" +msgid_plural "%d kilometers" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "in one kilometer" +msgid_plural "in %d kilometers" +msgstr[0] "" +msgstr[1] "" + +msgid "exit" +msgstr "退出" + +msgid "into the ramp" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name +#, c-format +msgid "%sinto the street %s%s%s" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Male form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|male form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Female form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|female form" +msgstr "" + +#. TRANSLATORS: Arguments: 1: Prefix (Space if required) 2: Street Name 3: Separator (Space if required), 4: Systematic Street Name. Neutral form. The stuff after | doesn't have to be included +#, c-format +msgid "%sinto the %s%s%s|neutral form" +msgstr "" + +#. TRANSLATORS: gives the name of the next road to turn into (into the E17) +#, c-format +msgid "%sinto the %s" +msgstr "" + +#. TRANSLATORS: right, as in 'Turn right' +msgid "right" +msgstr "右" + +#. TRANSLATORS: left, as in 'Turn left' +msgid "left" +msgstr "左" + +#. TRANSLATORS: Don't forget the ending space +msgid "easily " +msgstr "简单 " + +#. TRANSLATORS: Don't forget the ending space +msgid "strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "really strongly " +msgstr "" + +#. TRANSLATORS: Don't forget the ending space +msgid "unknown " +msgstr "" + +msgid "When possible, please turn around" +msgstr "" + +msgid "Enter the roundabout soon" +msgstr "" + +#. TRANSLATORS: %s is the distance to the roundabout +#, c-format +msgid "Enter the roundabout %s" +msgstr "" + +#, c-format +msgid "then leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Leave the roundabout at the %s" +msgstr "" + +#, c-format +msgid "Follow the road for the next %s" +msgstr "直走到下一个%s" + +msgid "soon" +msgstr "" + +#. TRANSLATORS: First argument is the how manieth street to take, second the direction +#, c-format +msgid "Take the %1$s road to the %2$s" +msgstr "" + +#, c-format +msgid "after %i roads" +msgstr "" + +msgid "now" +msgstr "現在" + +#, c-format +msgid "then take the %1$s road to the %2$s" +msgstr "" + +msgid "error" +msgstr "" + +#. TRANSLATORS: The first argument is strength, the second direction, the third distance and the fourth destination Example: 'Turn 'slightly' 'left' in '100 m' 'onto baker street' +#, c-format +msgid "Turn %1$s%2$s %3$s%4$s" +msgstr "%1$s转向%2$s %3$s至%4$s" + +#. TRANSLATORS: First argument is strength, second direction, third how many roads to skip, fourth destination +#, c-format +msgid "then turn %1$s%2$s %3$s%4$s" +msgstr "" + +#, c-format +msgid "You have reached your destination %s" +msgstr "" + +msgid "then you have reached your destination." +msgstr "" + +msgid "Position" +msgstr "" + +msgid "Command" +msgstr "指令" + +msgid "Length" +msgstr "長度" + +msgid "km" +msgstr "公里" + +msgid "m" +msgstr "米" + +msgid "Time" +msgstr "" + +msgid "Destination Length" +msgstr "抵达终点距离" + +msgid "Destination Time" +msgstr "抵达终点时间" + +msgid "Roadbook" +msgstr "" + +msgid "Set as position" +msgstr "设置您所在位置" + +msgid "Set as destination" +msgstr "设置目的地地址" + +msgid "Add as bookmark" +msgstr "添加书签" + +#, c-format +msgid "Point 0x%x 0x%x" +msgstr "" + +#, c-format +msgid "Screen coord : %d %d" +msgstr "" + +#. 020 +msgid "Andorra" +msgstr "安道爾" + +#. 784 +msgid "United Arab Emirates" +msgstr "阿聯酋" + +#. 004 +msgid "Afghanistan" +msgstr "阿富汗" + +#. 028 +msgid "Antigua and Barbuda" +msgstr "安提瓜和巴布達" + +#. 660 +msgid "Anguilla" +msgstr "安圭拉" + +#. 008 +msgid "Albania" +msgstr "阿爾巴尼亞" + +#. 051 +msgid "Armenia" +msgstr "亞美尼亞" + +#. 530 +msgid "Netherlands Antilles" +msgstr "" + +#. 024 +msgid "Angola" +msgstr "安哥拉" + +#. 010 +msgid "Antarctica" +msgstr "" + +#. 032 +msgid "Argentina" +msgstr "阿根廷" + +#. 016 +msgid "American Samoa" +msgstr "" + +#. 040 +msgid "Austria" +msgstr "奧地利" + +#. 036 +msgid "Australia" +msgstr "澳大利亞" + +#. 533 +msgid "Aruba" +msgstr "" + +#. 248 +msgid "Aland Islands" +msgstr "" + +#. 031 +msgid "Azerbaijan" +msgstr "" + +#. 070 +msgid "Bosnia and Herzegovina" +msgstr "" + +#. 052 +msgid "Barbados" +msgstr "" + +#. 050 +msgid "Bangladesh" +msgstr "孟加拉" + +#. 056 +msgid "Belgium" +msgstr "比利時" + +#. 854 +msgid "Burkina Faso" +msgstr "" + +#. 100 +msgid "Bulgaria" +msgstr "保加利亞" + +#. 048 +msgid "Bahrain" +msgstr "巴林" + +#. 108 +msgid "Burundi" +msgstr "" + +#. 204 +msgid "Benin" +msgstr "" + +#. 652 +msgid "Saint Barthelemy" +msgstr "" + +#. 060 +msgid "Bermuda" +msgstr "百慕達" + +#. 096 +msgid "Brunei Darussalam" +msgstr "汶萊" + +#. 068 +msgid "Bolivia" +msgstr "玻利維亞" + +#. 076 +msgid "Brazil" +msgstr "巴西" + +#. 044 +msgid "Bahamas" +msgstr "巴哈馬" + +#. 064 +msgid "Bhutan" +msgstr "不丹" + +#. 074 +msgid "Bouvet Island" +msgstr "" + +#. 072 +msgid "Botswana" +msgstr "" + +#. 112 +msgid "Belarus" +msgstr "" + +#. 084 +msgid "Belize" +msgstr "" + +#. 124 +msgid "Canada" +msgstr "加拿大" + +#. 166 +msgid "Cocos (Keeling) Islands" +msgstr "" + +#. 180 +msgid "Congo, Democratic Republic of the" +msgstr "" + +#. 140 +msgid "Central African Republic" +msgstr "中非共和國" + +#. 178 +msgid "Congo" +msgstr "剛果" + +#. 756 +msgid "Switzerland" +msgstr "瑞士" + +#. 384 +msgid "Cote d'Ivoire" +msgstr "象牙海岸" + +#. 184 +msgid "Cook Islands" +msgstr "" + +#. 152 +msgid "Chile" +msgstr "智利" + +#. 120 +msgid "Cameroon" +msgstr "喀麥隆" + +#. 156 +msgid "China" +msgstr "中國" + +#. 170 +msgid "Colombia" +msgstr "哥倫比亞" + +#. 188 +msgid "Costa Rica" +msgstr "" + +#. 192 +msgid "Cuba" +msgstr "古巴" + +#. 132 +msgid "Cape Verde" +msgstr "" + +#. 162 +msgid "Christmas Island" +msgstr "聖誕島" + +#. 196 +msgid "Cyprus" +msgstr "塞浦路斯" + +#. 203 +msgid "Czech Republic" +msgstr "捷克共和國" + +#. 276 +msgid "Germany" +msgstr "德國" + +#. 262 +msgid "Djibouti" +msgstr "" + +#. 208 +msgid "Denmark" +msgstr "丹麥" + +#. 212 +msgid "Dominica" +msgstr "" + +#. 214 +msgid "Dominican Republic" +msgstr "" + +#. 012 +msgid "Algeria" +msgstr "阿爾及利亞" + +#. 218 +msgid "Ecuador" +msgstr "厄瓜多爾" + +#. 233 +msgid "Estonia" +msgstr "爱尔沙尼亚" + +#. 818 +msgid "Egypt" +msgstr "埃及" + +#. 732 +msgid "Western Sahara" +msgstr "" + +#. 232 +msgid "Eritrea" +msgstr "" + +#. 724 +msgid "Spain" +msgstr "西班牙" + +#. 231 +msgid "Ethiopia" +msgstr "埃塞俄比亞" + +#. 246 +msgid "Finland" +msgstr "芬蘭" + +#. 242 +msgid "Fiji" +msgstr "斐濟群島" + +#. 238 +msgid "Falkland Islands (Malvinas)" +msgstr "" + +#. 583 +msgid "Micronesia, Federated States of" +msgstr "" + +#. 234 +msgid "Faroe Islands" +msgstr "" + +#. 250 +msgid "France" +msgstr "法國" + +#. 266 +msgid "Gabon" +msgstr "加彭" + +#. 826 +msgid "United Kingdom" +msgstr "英國" + +#. 308 +msgid "Grenada" +msgstr "格林纳达" + +#. 268 +msgid "Georgia" +msgstr "喬治亞州" + +#. 254 +msgid "French Guiana" +msgstr "" + +#. 831 +msgid "Guernsey" +msgstr "" + +#. 288 +msgid "Ghana" +msgstr "" + +#. 292 +msgid "Gibraltar" +msgstr "直布羅陀" + +#. 304 +msgid "Greenland" +msgstr "格陵蘭" + +#. 270 +msgid "Gambia" +msgstr "岡比亞" + +#. 324 +msgid "Guinea" +msgstr "几内亚" + +#. 312 +msgid "Guadeloupe" +msgstr "" + +#. 226 +msgid "Equatorial Guinea" +msgstr "" + +#. 300 +msgid "Greece" +msgstr "希腊" + +#. 239 +msgid "South Georgia and the South Sandwich Islands" +msgstr "" + +#. 320 +msgid "Guatemala" +msgstr "" + +#. 316 +msgid "Guam" +msgstr "" + +#. 624 +msgid "Guinea-Bissau" +msgstr "" + +#. 328 +msgid "Guyana" +msgstr "" + +#. 344 +msgid "Hong Kong" +msgstr "香港" + +#. 334 +msgid "Heard Island and McDonald Islands" +msgstr "" + +#. 340 +msgid "Honduras" +msgstr "" + +#. 191 +msgid "Croatia" +msgstr "克羅地亞" + +#. 332 +msgid "Haiti" +msgstr "海地" + +#. 348 +msgid "Hungary" +msgstr "" + +#. 360 +msgid "Indonesia" +msgstr "" + +#. 372 +msgid "Ireland" +msgstr "愛爾蘭" + +#. 376 +msgid "Israel" +msgstr "以色列" + +#. 833 +msgid "Isle of Man" +msgstr "" + +#. 356 +msgid "India" +msgstr "印度" + +#. 086 +msgid "British Indian Ocean Territory" +msgstr "" + +#. 368 +msgid "Iraq" +msgstr "伊拉克" + +#. 364 +msgid "Iran, Islamic Republic of" +msgstr "伊朗" + +#. 352 +msgid "Iceland" +msgstr "冰島" + +#. 380 +msgid "Italy" +msgstr "意大利" + +#. 832 +msgid "Jersey" +msgstr "" + +#. 388 +msgid "Jamaica" +msgstr "牙買加" + +#. 400 +msgid "Jordan" +msgstr "約旦" + +#. 392 +msgid "Japan" +msgstr "日本" + +#. 404 +msgid "Kenya" +msgstr "肯尼亞" + +#. 417 +msgid "Kyrgyzstan" +msgstr "" + +#. 116 +msgid "Cambodia" +msgstr "柬埔寨" + +#. 296 +msgid "Kiribati" +msgstr "" + +#. 174 +msgid "Comoros" +msgstr "" + +#. 659 +msgid "Saint Kitts and Nevis" +msgstr "" + +#. 408 +msgid "Korea, Democratic People's Republic of" +msgstr "北朝鲜" + +#. 410 +msgid "Korea, Republic of" +msgstr "" + +#. 414 +msgid "Kuwait" +msgstr "科威特" + +#. 136 +msgid "Cayman Islands" +msgstr "" + +#. 398 +msgid "Kazakhstan" +msgstr "哈薩克" + +#. 418 +msgid "Lao People's Democratic Republic" +msgstr "老撾" + +#. 422 +msgid "Lebanon" +msgstr "黎巴嫩" + +#. 662 +msgid "Saint Lucia" +msgstr "" + +#. 438 +msgid "Liechtenstein" +msgstr "列支敦士登" + +#. 144 +msgid "Sri Lanka" +msgstr "斯里蘭卡" + +#. 430 +msgid "Liberia" +msgstr "" + +#. 426 +msgid "Lesotho" +msgstr "" + +#. 440 +msgid "Lithuania" +msgstr "立陶宛" + +#. 442 +msgid "Luxembourg" +msgstr "卢森堡" + +#. 428 +msgid "Latvia" +msgstr "" + +#. 434 +msgid "Libyan Arab Jamahiriya" +msgstr "" + +#. 504 +msgid "Morocco" +msgstr "摩洛哥" + +#. 492 +msgid "Monaco" +msgstr "摩納哥" + +#. 498 +msgid "Moldova, Republic of" +msgstr "" + +#. 499 +msgid "Montenegro" +msgstr "" + +#. 663 +msgid "Saint Martin (French part)" +msgstr "" + +#. 450 +msgid "Madagascar" +msgstr "馬達加斯加" + +#. 584 +msgid "Marshall Islands" +msgstr "" + +#. 807 +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "" + +#. 466 +msgid "Mali" +msgstr "馬里" + +#. 104 +msgid "Myanmar" +msgstr "緬甸" + +#. 496 +msgid "Mongolia" +msgstr "蒙古" + +#. 446 +msgid "Macao" +msgstr "澳門" + +#. 580 +msgid "Northern Mariana Islands" +msgstr "" + +#. 474 +msgid "Martinique" +msgstr "" + +#. 478 +msgid "Mauritania" +msgstr "" + +#. 500 +msgid "Montserrat" +msgstr "" + +#. 470 +msgid "Malta" +msgstr "馬耳他" + +#. 480 +msgid "Mauritius" +msgstr "毛里求斯" + +#. 462 +msgid "Maldives" +msgstr "马尔代夫" + +#. 454 +msgid "Malawi" +msgstr "" + +#. 484 +msgid "Mexico" +msgstr "墨西哥" + +#. 458 +msgid "Malaysia" +msgstr "马來西亚" + +#. 508 +msgid "Mozambique" +msgstr "" + +#. 516 +msgid "Namibia" +msgstr "纳米比亚" + +#. 540 +msgid "New Caledonia" +msgstr "" + +#. 562 +msgid "Niger" +msgstr "尼日尔" + +#. 574 +msgid "Norfolk Island" +msgstr "" + +#. 566 +msgid "Nigeria" +msgstr "尼日利亚" + +#. 558 +msgid "Nicaragua" +msgstr "尼加拉瓜" + +#. 528 +msgid "Netherlands" +msgstr "荷兰" + +#. 578 +msgid "Norway" +msgstr "挪威" + +#. 524 +msgid "Nepal" +msgstr "尼泊尔" + +#. 520 +msgid "Nauru" +msgstr "" + +#. 570 +msgid "Niue" +msgstr "" + +#. 554 +msgid "New Zealand" +msgstr "新西兰" + +#. 512 +msgid "Oman" +msgstr "阿曼" + +#. 591 +msgid "Panama" +msgstr "巴拿馬" + +#. 604 +msgid "Peru" +msgstr "秘魯" + +#. 258 +msgid "French Polynesia" +msgstr "" + +#. 598 +msgid "Papua New Guinea" +msgstr "" + +#. 608 +msgid "Philippines" +msgstr "菲律賓" + +#. 586 +msgid "Pakistan" +msgstr "巴基斯坦" + +#. 616 +msgid "Poland" +msgstr "波兰" + +#. 666 +msgid "Saint Pierre and Miquelon" +msgstr "" + +#. 612 +msgid "Pitcairn" +msgstr "" + +#. 630 +msgid "Puerto Rico" +msgstr "波多黎各" + +#. 275 +msgid "Palestinian Territory, Occupied" +msgstr "" + +#. 620 +msgid "Portugal" +msgstr "葡萄牙" + +#. 585 +msgid "Palau" +msgstr "" + +#. 600 +msgid "Paraguay" +msgstr "巴拉圭" + +#. 634 +msgid "Qatar" +msgstr "卡塔尔" + +#. 638 +msgid "Reunion" +msgstr "" + +#. 642 +msgid "Romania" +msgstr "罗马尼亚" + +#. 688 +msgid "Serbia" +msgstr "塞尔维亚" + +#. 643 +msgid "Russian Federation" +msgstr "俄罗斯" + +#. 646 +msgid "Rwanda" +msgstr "卢旺达" + +#. 682 +msgid "Saudi Arabia" +msgstr "沙特阿拉伯" + +#. 090 +msgid "Solomon Islands" +msgstr "所罗门群島" + +#. 690 +msgid "Seychelles" +msgstr "" + +#. 736 +msgid "Sudan" +msgstr "苏丹" + +#. 752 +msgid "Sweden" +msgstr "瑞典" + +#. 702 +msgid "Singapore" +msgstr "新加坡" + +#. 654 +msgid "Saint Helena" +msgstr "" + +#. 705 +msgid "Slovenia" +msgstr "斯洛文尼亞" + +#. 744 +msgid "Svalbard and Jan Mayen" +msgstr "" + +#. 703 +msgid "Slovakia" +msgstr "斯洛伐克" + +#. 694 +msgid "Sierra Leone" +msgstr "塞拉利昂" + +#. 674 +msgid "San Marino" +msgstr "" + +#. 686 +msgid "Senegal" +msgstr "" + +#. 706 +msgid "Somalia" +msgstr "索馬里" + +#. 740 +msgid "Suriname" +msgstr "" + +#. 678 +msgid "Sao Tome and Principe" +msgstr "" + +#. 222 +msgid "El Salvador" +msgstr "" + +#. 760 +msgid "Syrian Arab Republic" +msgstr "" + +#. 748 +msgid "Swaziland" +msgstr "斯威士兰" + +#. 796 +msgid "Turks and Caicos Islands" +msgstr "" + +#. 148 +msgid "Chad" +msgstr "乍得" + +#. 260 +msgid "French Southern Territories" +msgstr "" + +#. 768 +msgid "Togo" +msgstr "多哥" + +#. 764 +msgid "Thailand" +msgstr "泰國" + +#. 762 +msgid "Tajikistan" +msgstr "塔吉克斯坦" + +#. 772 +msgid "Tokelau" +msgstr "" + +#. 626 +msgid "Timor-Leste" +msgstr "東帝汶" + +#. 795 +msgid "Turkmenistan" +msgstr "土庫曼" + +#. 788 +msgid "Tunisia" +msgstr "突尼斯" + +#. 776 +msgid "Tonga" +msgstr "汤加" + +#. 792 +msgid "Turkey" +msgstr "土耳其" + +#. 780 +msgid "Trinidad and Tobago" +msgstr "" + +#. 798 +msgid "Tuvalu" +msgstr "" + +#. 158 +msgid "Taiwan, Province of China" +msgstr "台湾" + +#. 834 +msgid "Tanzania, United Republic of" +msgstr "坦桑尼亞" + +#. 804 +msgid "Ukraine" +msgstr "乌克兰" + +#. 800 +msgid "Uganda" +msgstr "乌干达" + +#. 581 +msgid "United States Minor Outlying Islands" +msgstr "" + +#. 840 +msgid "United States" +msgstr "美國" + +#. 858 +msgid "Uruguay" +msgstr "乌拉圭" + +#. 860 +msgid "Uzbekistan" +msgstr "乌兹别克斯坦" + +#. 336 +msgid "Holy See (Vatican City State)" +msgstr "梵蒂岡" + +#. 670 +msgid "Saint Vincent and the Grenadines" +msgstr "" + +#. 862 +msgid "Venezuela" +msgstr "委內瑞拉" + +#. 092 +msgid "Virgin Islands, British" +msgstr "" + +#. 850 +msgid "Virgin Islands, U.S." +msgstr "" + +#. 704 +msgid "Viet Nam" +msgstr "越南" + +#. 548 +msgid "Vanuatu" +msgstr "" + +#. 876 +msgid "Wallis and Futuna" +msgstr "" + +#. 882 +msgid "Samoa" +msgstr "Samoa (薩摩亞)" + +#. 887 +msgid "Yemen" +msgstr "也门" + +#. 175 +msgid "Mayotte" +msgstr "" + +#. 710 +msgid "South Africa" +msgstr "南非" + +#. 894 +msgid "Zambia" +msgstr "赞比亚" + +#. 716 +msgid "Zimbabwe" +msgstr "津巴布韦" + +msgid "* Unknown, add is_in tags to those cities" +msgstr "" + +msgid "Car" +msgstr "" + +msgid "Iso2" +msgstr "" + +msgid "Iso3" +msgstr "" + +msgid "Country" +msgstr "国家" + +msgid "Postal" +msgstr "" + +msgid "Town" +msgstr "城镇" + +msgid "District" +msgstr "行政区" + +msgid "Street" +msgstr "街" + +msgid "Number" +msgstr "号" + +msgid "Enter Destination" +msgstr "输入目的地" + +msgid "Zip Code" +msgstr "邮政编码" + +msgid "City" +msgstr "城市" + +msgid "District/Township" +msgstr "" + +msgid "Map" +msgstr "" + +msgid "Bookmark" +msgstr "书签" + +msgid "Destination" +msgstr "目的地" + +#. TRANSLATORS: These texts are for menu items in GTK GUI. The _ indicates the mnemonic key (=underlined character) for this menu item. Please place the _ before a suitable character in the translation (or omit it if no mnemonic key is desired). +msgid "_Display" +msgstr "显示" + +msgid "_Route" +msgstr "路" + +msgid "_Former Destinations" +msgstr "前一个目的地" + +msgid "_Bookmarks" +msgstr "" + +msgid "_Map" +msgstr "" + +msgid "_Layout" +msgstr "" + +msgid "_Projection" +msgstr "投影" + +msgid "_Vehicle" +msgstr "机动车" + +msgid "Zoom_Out" +msgstr "放大" + +msgid "Decrease zoom level" +msgstr "" + +msgid "Zoom_In" +msgstr "缩小" + +msgid "Increase zoom level" +msgstr "" + +msgid "_Recalculate" +msgstr "" + +msgid "Redraw map" +msgstr "" + +msgid "_Info" +msgstr "信息" + +msgid "Set _destination" +msgstr "" + +msgid "Opens address search dialog" +msgstr "" + +msgid "_Stop Navigation" +msgstr "停止浏览" + +msgid "Test" +msgstr "测试" + +msgid "_Quit" +msgstr "退出" + +msgid "Quit the application" +msgstr "" + +msgid "Show position _cursor" +msgstr "" + +msgid "_Lock on Road" +msgstr "" + +msgid "_Keep orientation to the North" +msgstr "" + +msgid "Switches map orientation to the north or the vehicle" +msgstr "" + +msgid "_Roadbook" +msgstr "" + +msgid "Show/hide route description" +msgstr "" + +msgid "_Autozoom" +msgstr "" + +msgid "Enable/disable automatic zoom level changing" +msgstr "" + +msgid "_Fullscreen" +msgstr "全屏" + +msgid "Data" +msgstr "" + +msgid "N" +msgstr "北" + +msgid "NE" +msgstr "北偏东(东北)" + +msgid "E" +msgstr "東" + +msgid "SE" +msgstr "南偏东(东南)" + +msgid "S" +msgstr "南" + +msgid "SW" +msgstr "南偏西(西南)" + +msgid "W" +msgstr "西" + +msgid "NW" +msgstr "北偏西" + +msgid "No" +msgstr "" + +msgid "2D" +msgstr "" + +msgid "3D" +msgstr "" + +msgid "OT" +msgstr "" + +#, c-format +msgid "Route %4.0fkm %02d:%02d ETA" +msgstr "" + +msgid "Route 0000km 0+00:00 ETA" +msgstr "" + +msgid "Back to map" +msgstr "" + +msgid "Main Menu" +msgstr "" + +msgid "Help" +msgstr "" + +msgid "Back" +msgstr "" + +msgid "Add Bookmark" +msgstr "" + +#. Adds the Bookmark folders +msgid "Add Bookmark folder" +msgstr "" + +msgid "Rename" +msgstr "" + +msgid "POIs" +msgstr "" + +msgid "View in Browser" +msgstr "" + +msgid "Streets" +msgstr "" + +msgid "House numbers" +msgstr "" + +msgid "View Attributes" +msgstr "" + +msgid "View on map" +msgstr "" + +msgid "Cut Bookmark" +msgstr "" + +msgid "Copy Bookmark" +msgstr "" + +msgid "Rename Bookmark" +msgstr "" + +msgid "Paste Bookmark" +msgstr "" + +msgid "Delete Bookmark" +msgstr "" + +msgid "Bookmarks" +msgstr "" + +#. Pastes the Bookmark +msgid "Paste bookmark" +msgstr "" + +#, c-format +msgid "Bookmark %s" +msgstr "" + +msgid "Former Destinations" +msgstr "前一个目的地" + +msgid "- No former destinations available -" +msgstr "" + +msgid "House number" +msgstr "" + +msgid "Layout" +msgstr "" + +#, c-format +msgid "Download %s" +msgstr "" + +msgid "Map Download" +msgstr "" + +msgid "Active" +msgstr "" + +msgid "Download Enabled" +msgstr "" + +msgid "Download completely" +msgstr "" + +msgid "Maps" +msgstr "" + +msgid "Show Satellite Status" +msgstr "" + +msgid " Elevation " +msgstr "" + +msgid " Azimuth " +msgstr "" + +msgid "Show NMEA Data" +msgstr "" + +msgid "car" +msgstr "" + +msgid "bike" +msgstr "" + +msgid "pedestrian" +msgstr "" + +#, c-format +msgid "Current profile: %s" +msgstr "" + +#, c-format +msgid "Change profile to: %s" +msgstr "" + +msgid "Set as active" +msgstr "" + +msgid "Show Satellite status" +msgstr "" + +msgid "Show NMEA data" +msgstr "" + +msgid "Vehicle" +msgstr "机动车" + +msgid "Rules" +msgstr "" + +msgid "Lock on road" +msgstr "" + +msgid "Northing" +msgstr "" + +msgid "Map follows Vehicle" +msgstr "" + +msgid "Message" +msgstr "" + +msgid "Next" +msgstr "" + +msgid "Prev" +msgstr "" + +msgid "Route Description" +msgstr "" + +msgid "Height Profile" +msgstr "" + +msgid "Show Locale" +msgstr "" + +msgid "About Navit" +msgstr "" + +#. Authors +msgid "By" +msgstr "" + +#. Contributors +msgid "And all the Navit Team" +msgstr "" + +msgid "members and contributors." +msgstr "" + +msgid "Return to route!" +msgstr "" + +#. warning told +msgid "Look out! Camera!" +msgstr "" + +#. warning told +msgid "Please decrease your speed" +msgstr "" + +msgid "Map Point" +msgstr "" + +msgid "Vehicle Position" +msgstr "" + +msgid "Main menu" +msgstr "" + +msgid "" +"Show\n" +"Map" +msgstr "" + +msgid "Settings" +msgstr "" + +msgid "Tools" +msgstr "" + +msgid "Route" +msgstr "路" + +msgid "About" +msgstr "" + +msgid "Actions" +msgstr "" + +msgid "" +"Former\n" +"Destinations" +msgstr "" + +msgid "Quit" +msgstr "" + +msgid "" +"Stop\n" +"Navigation" +msgstr "" + +msgid "Display" +msgstr "显示" + +msgid "Fullscreen" +msgstr "全屏" + +msgid "Window Mode" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "car_shortest" +msgstr "" + +msgid "car_avoid_tolls" +msgstr "" + +msgid "horse" +msgstr "" + +#. chr: +#. flags used for a truck: (first flag number is 0) +#. 8: SIZE_OR_WEIGHT_LIMIT +#. 21: TRANSPORT_TRUCK +#. speed setup: +#. 'speed' data of the atkaction for a car is +#. reduced about 10 km/h. When the speed was at +#. 10 km/h, I reduced it to 5 km/h. +#. 'route_weight' data has been treated in the same way. +#. If you want to discourage the use of small roads, +#. just reduce this value. +#. size and weight setup: +#. This is an example, you have to use the data of your truck. +#. bobshaffer's standard truck: +#. (1 lb = 453.59237 g, 1 foot = .3048 m) +#. (data has to be in [cm] and [kg] according to 'atkaction.h') +#. vehicle_width= 9 feet, 274 cm +#. vehicle_height= 13.5 feet, 411 cm +#. vehicle_length= 70 feet, 2134 cm +#. vehicle_weight= 80000 lbs, 36287 kg +#. vehicle_axle_weight= 34000 lbs, 15422 kg +#. +msgid "Truck" +msgstr "" + +#~ msgid "Cursor" +#~ msgstr "游标" diff --git a/repomd.xml b/repomd.xml new file mode 100644 index 0000000..87b5314 --- /dev/null +++ b/repomd.xml @@ -0,0 +1,66 @@ + + 1342113227 + + + b619a854686e28945013f385a68795b8b997ffdbddd924bb7a2211f47114c933 + 1342113231.46 + 115598 + 429056 + 7f8ee6b23886be11669bd32dcf4d299e1921d57fbeba5d00a2eacec3f6bb2ee7 + 10 + + + e28991d7aaabf0150fde0e393a2fda63eca4302772148788a6854439e63e6843 + 1342113231 + 85022 + 469033 + 6453e09bcd6c22171d3cde66bb2a33eec19f2f0ddaace38c88eb9dd7a4f0371c + + + + + 0f30f8a09c7a3f377a9b4ae20758605f5d7a34b1481c7a80e9f75c09522f7358 + 1342113232.45 + 700022 + 3484672 + 18bbbce0e8f41218dcc28c3bb201a2cb93871fe4a9b47f8512a6c2a5afac3f1d + 10 + + + ceb27f7ab2621bc76e79816d6748b9d92473cea7982f9eb45d16ab2246aa21f9 + 1342113231 + 482048 + 6087434 + d78bbbb8c9a941d36a9cab4b19bbe26d15f53fa8b497e8303d04247dd7fb9278 + + + + + 7b565af7fe97b5284f39284e800f19d1e9a12463bb4141b3d7352fca2829caaa + 1342113233.08 + 542911 + 2233344 + ad6cefc9b9486718423b7a2f025f54844c4399a6845fdecd4ddbf56ac640278e + 10 + + + 3d130000345b899a5e1b8ea1b0959ce0a1e0f36f5a8a75f708704788674b64e4 + 1342113231 + 242564 + 2100525 + 7dc01cf3f71e57bd5bc74d2f3c142a9f27bcab4bb5f26a31be9ff120ee9cf1d6 + + + + + 9ee3f8ec5518c717bf9541e0a40c22c9582963e95478d49d9f0eb12c9622cb9c + 1342113233.41 + 33f72836b2ec598c753bc11ef8e1eb9d5ef7b94637b4ba57b09f5abda9237f2f + + + + 1130572454ee4b11cd69e86a04ce41c98db9b7a20251d9d3b9caf64a6804c32f + 1342113233.59 + 1065300ffc180f90f214d3a03c7b4d7d56561feb6540341a1cf6b8db237b3d64 + + -- 2.7.4

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 Y04DlMbfIwG)&Kwi07*qoM6N<$g6YzeumAu6 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SA_32_32.png b/navit/xpm/country_SA_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..5c57834d60722ab9fb6cb28c16ee02c56feb329f GIT binary patch literal 751 zcmV9oTPrL>e%N_mF}5o=%}5mbB;K^H0! zRwizUiDB)|f5NzSs|z)XOBNc?G(IS{LXisP+4swq&U;+2Gcz?bA%@7eJtyBU=YIFx z3&G=FaF{}e>V6FPKLEI1!EB&JSws*?s!U-<1R(%`A!r0)Y%is#iUL#|Vh}78PN!ilem(5Po{rx4GHg(rdMnm)Qm zG~C!f>KSaH?KLDrV#MvXOGb=X$!>)6TbdTm{;tZSGJFEnQ*L%NBy4?!C)rb zXYcN*gm2)QYUeiZA0|?+1_n8~b=Poq#;}D-Z zaVwBobo8+?P h+m8M%ItKiEz;8lO2TzN0w4(q3002ovPDHLkV1ijmT}l7| literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SA_48_48.png b/navit/xpm/country_SA_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..442ee910d76b6e8c8c4e82df665f0a5b01286c18 GIT binary patch literal 1334 zcmV-61JszA(lyP3FuJ&9V(Nx-5$!i<#49%cjhkF(D`@6L}J*C@K$w7HFY`K3(s5 zFHH7gFLt-BX1wV4^)L7TTB|vf|KyoEOawR}=%{UMQF01U2 zO_LJgX&s@~U}^+GIFVOD!lW|H(wL{%aEX0Il#dlya$^F600c!4h(Z-ca3Y_qG8hQ0 zfzYuchog{}1lhF^C3{(+HD8d#RaQre+GHa22U||ePs%8;&PzBO~L z!?HlhT8cocW;t?_X7iHJ9~|+~{>j+%*35OyqaAw|zSK80ghMRAgi7s&ZN6TJplVFj zHSwTpqK_AakGswy0J-hG+u^$(Vxw^bm1mcYNBsbRwP{WSAW=S6H{9Z-{aFUPRh?Y9 zbk`y0n_8SY)BAn8HnrI1#8HeEV(ZhFm1PteNgWCCtHZa*|_#uq*ck z41xU-@4Y}jF9~_3d2_UBR<&7@BqeJpxw>9cf`9dzdVW5UH5eOnP84_PLz-N=s=z^>(y+Rj}Ej?^uC6&=3(OyXNOx!>>$L_32bKdgyG4ti;~5M^?OH1%a6vZQH#I~;JZ_*|$5eLh1UE46RPe$C&ueHL}BDg>tY4^pa@I(Uu@X`V0SD10s6I<6nXR08b7WvSSVI);8b02uCkf_Vx2;ao$}2 sdo%7|mH^3>0LhgA$&~=fHRC{k0P?vIHFAVqjQ{`u07*qoM6N<$g5pt&R{#J2 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SA_8_8.png b/navit/xpm/country_SA_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..1fb9082ed092bb4e36f8f8f40079cdff8861156d GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}jPZ!4! zj+x0RGqMge@NRI>NMlP&Q+rnb|DU0O!Jot*%@aJX^8NYox?5-ck?-;M)#4*tCnO{% zg+7{G`SC5Uva+&E%ftrRMRS^pY=nGzeBRg9?fLzY)9KOI@88$&-=Ch4kdV?Kb+jez fP<`8f0XBw$c!ktiv!&dDHZyp-`njxgN@xNA{9H&4 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SA_96_96.png b/navit/xpm/country_SA_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..30bfc65bc63de42ad953ac44dd33f238e03508c1 GIT binary patch literal 4061 zcmb7H_cz;L-2Wi9mfDrpYKhU>qP1d=TD2(+6|<q5xo@m{iGha!0Dw#SdRk`W+ws3mM@c@t zj~9H%7mbsFt`>0d-^#-lrvLzRvc8tOMG$5)3+>N7mf7A`wuT)!$@Cw#?a^S>c*@#v z(@Xe;o=v=Rl0qK8jEJ&Uu5MCvADcSLUrYB&D1(Tg-uew@moI-@l9r#s(q)fSN zj0#fUjiXK+O30-I4!SsCDq*7km9gqRbQc6bUVGV=;Ss@AOOBPHUdd8cow1obDO?^S zk0!>hR<4K+xA8T39VoSl&ErHotUi_w5W#7ForbAbz=flC_jqu=Rx_RG7#C5&&FZf2z$6acZoF!;kXz%0F4dI_YPw@8r{caqsWX#3=%=opxM1IsbBFzR7a(M*wQ&OHeRk z>MWrwmEq+#drott>mOPH!JE#1#Z!7q?#0Te%Oc`}uWL%0*qB%Jver`D(}ZLeAtw>b zPF?`FxITG09F79I23L6IOp#qYxEc*5df+|?Pd~FDjk>yVL&dGuS+ubtFyUZ~FewP= zu|L*P9$znd>eepHgFNb>U{`m!b_Hmit%IqvunB&>-T=o=-*o(IcWajW1zH1#z}8zV zX=mj9u4bF$F1L}NQ*pgD|#&5 z?4>n>>tNIi006Pv)%Epgx~rQL1?;TV&lYBeV)%KYvg|%JUZ-g6a;y4X4o1d@mMi(} zPf;wK;QQ(|C!B(Ml@ipk(-tGv*0Xl&%(Tr+4GN@UG09#~VJtD_RVH?G%<7_KV1;`> zeO6#=WftN`@}OzdC#2vW)IlF6H`RLZ0jrqfjOwnbol&3Qp>K@&6#Tk5?{1iM(Q9;H z@y(clw=S&WPW8aJT|qC8FZfsfC>N80(gqn#i{d4{aWd-X zNTk8yV~0rx)@;53>wY7V0rP^1f%!f+Wb}-VkhLNY60M;s++;`)4F)fdx z_cJn>{-)bb`<(vDULKOYsSi0>b7*cj>9EsHSP%0D%?SNCa{0zvuK3S7&c|XPW$*4K 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SB_16_16.png b/navit/xpm/country_SB_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..cd3078db1220cd4cf18b16d34988495f5626a6b6 GIT binary patch literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lNlHoIXzt* zLo_BPr*Pa^s&lUN`%`l^HZ}`pZH@~Tn>8x9CT}#lKhG^WP0fv6_F!!9v7VkAq3*9` zV?}IK)0-78&wYOX+`ZplzTf}@`R{Y*ZYos#uwz#a{-6gm&eZc= z^!fcp1_pnAxBHtiGc#Y_U(fUZpJC2wGoG!J6jsb?Y;5FoT5J9F)wRv*Swf8s3=E7| z-d&pXblG!Yw_Wk<({{P`{ z`!Jcxpa1Rct_G+JmY8?(s;qRo=+KkZ!lo4JY$~uGq`p(-Di04&&;0WqqWOY1YG+TD c0Pz{RSIuqNwdpTEFqjxTUHx3vIVCg!00C=`QUCw| literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SB_32_32.png b/navit/xpm/country_SB_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..e8a723863b0699ce3064347b2889829ca802a248 GIT binary patch literal 646 zcmV;10(t$3P)txsyI-j-}CaXZ9|G+7THiC8AqCw0(^C7MC^(3ykb zYo|M8Mf)@_$%+Qx{GryXr(&hDn)xQwNg0bKy~#2GAVjcDFZNIuR3B z6*ANp5A?MAkN0lXw3_KJhsL*XQbA;fA2-b|ZlVF)f1N9@X%FB2FyG(f#qj+40Pdh|eY+0ENL6@1aX&mGtJIC%;rSCwA!i4hV(x(f+6< zu|o&InirQ(#x5R>P|zlxf0q>p==u(fQdMnx3*Q&t>=fN9c$&^jW%XIQ;1t~|*wYa> zd~=Fr=&GZ2&_PZSfY>(g+`+9J4g;h0jMgBP7<4RU2x-ES8^cw;7X5= zV@NuY*g1AAIytt>eEaI4>w-5Qi;)oL_p;KTw+v7FWz~Q5|$$Fr5_^1$k=r zmyu3qh2paO;mfj3x-RH$Yv{lAer{paNIS#)zU%M&UdARJ#wpsM?9gGk2aePKBd|~3 zNZ<(lp8}`o)dddHs|cK>TLq5O{}Q-CuLxYC>jL-a0BBd~0H{K`i~OaIJZYNAdz_^M gU_-p<(zlcP4P0QXlW>yDE&u=k07*qoM6N<$f;KTS=Kufz literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SB_48_48.png b/navit/xpm/country_SB_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..f73dfc94ec27c979be7db921c0839c35d70945e7 GIT binary patch literal 1029 zcmV+g1p51lP)K~z|U&DdLL6ImDs@c)^~rAgByy`@bRTN7!$pjG3g7gBQq#tn zOy=yv=r{?}+Dhgm-@{}$nKSuu=9_Q62|;@|002BkvNDBUm^e<7W!OZaFEqL)RZYilp4be>0f@wf6E{LUM|h4LzaCOG0RDcF=(-=~ z2r=_y|CIrwHBfWt_uh%DOeLA#el(Fc`KNm$lp;AT4M%2-)&MXmA4_U%V+j$Ub#BXe zLe$O=E_V-(q#R`?1{wf7R&)T^6{x-WAad`?J71mc-;rtUDfVovJ=ry6;>l2W=6yPA zs0IL03S*VS97|=iJ7pH`gD9&bgurb##iu1hHBfU%L1=dle&f}SPznYbXbWRrv~Mn0 zb)LTlYEo;X$z!XoFbDijU!5&2%8|IhOat8&I`w^{QYW8Z-Lhj%6-$ji==k+eG?@YL z=d<`P4oQyTIg6=$yp6VJNc$H$Tfm#>= zRFv_8B#ROSV6$*(QC7A9YMhqIDRHjT6i5T@3bnPk1OATBganZI3C)v?X%tFy;bnOG{Lu1#};eZ9|lbmwA@z;5OL z8%tBYj;K%?C^^J)By=t4ueSjh3eT)K_E7%xvmTcvbS>yEH&Nh^zRBGeo*1fua>=qX z-EpoD0HxS|_8(cZ2op(hU*`aTtR(Nf+;6l7>a#2y69h>H#aJT$ZW@mZS(zr&Ss|1E zYF2O!)TCb1ueYwO^w-)(ngxK^XyyxIrkNLr zrRK{Z#+omH*lXqj6-6^Es8||(P!TmcpyF!sK}FZ(fJ#C08B`*gkD$`g0N_eW1Aq+P zZ`J;@f9O{2c#1EU1^|)zJ*A_8+T<7gN~!TbwZpO@B<87e00000NkvXXu0mjf?d#WRTG`P5U`SS!7H0qde%^lO3@zs;(bw;s{yNcBEEQ4KEP8)oyT5&ai=>1EgT-?{Io?~# R0)WnA@O1TaS?83{1ORO#U(Emj literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SB_96_96.png b/navit/xpm/country_SB_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..13564c0c9a345497f954e2b9ce2b67eca9a04b4a GIT binary patch literal 2130 zcmV-Y2(9;tP)V+f7KDG!1F%R*;4e8x>iQ0VSOF?ZALJl*reUM(FA zuc4!ESE|?06s7d&CPPW$T~k3ecbi~#;Qmm{u&CCUqHsf@dYAkx! z45zq*S&jI*6Hbt)q64+m7-xMtMa>v>bXB>|S;yoSkkpw4fD2O3{=*ji6l<^>moGIc zYN@q`(QE0BdQ&3Z%u?d&oEV9A-_dHQs&ZYxL?{Y`$Zf3M!2npjtSpHRXEbtj08rs^ z&{G?#cR$n026zf^*bD$h-7HN(S3>__@1>(>rlU6V_Rl}J-dW+}LKRGjh0$^W-ZjG+ zb+qSJ;K5&<@^PWGy}_g+QwNcEv7Qr?11?{^&9I;Ypuui%*bJXsot4r7@ce57=F*bJ zN~49*0?=#erYd8#MgOaw;XKfR;5Ps0j&tr=f8?485Bub<3o#mVdARS0Hu%%A@gt|) ziaVZ>DAIud=%z2YdH2QeA|d$pu6`dI=Yw$gl>3e2li|ftH@o%VP$GR#f0XJ#JW%}L zyvI9#XGAdN^`9KLDW~C=kB*05_Z**O15tXA^(3GJF_4C)7` zmAO|Ylb8;~K#f(#5)BpN2~P-P&{USo8ZLG%F9Wb}{aV*np{(!ePr^D71Ffnz@r1ni z*0o(n#zH(<7~RCpdZ#52B42y4Z_Ldq9bu+B$>=}~^vG)KmC4)N-x=BV*Wu4*xUY6D zk<*D~m4a6-}Q@3TkiL@mpI*5GKkeL;=%z(?MXqU_A_0IY5-1JL0xbuBjopeT&F+3Q|^oc+_B^yxt6ZT|aTseScX zXNgAmoz8Wyzv(Cc%5GsStvZl-iXHsO_0La)1u#PJ&7BwWTL<#5L0kTKam>v|u6gP0 zkrS71B-wm2$$$>z1Nqp{Q@i`ai!KlMo42ke-+aQ!j1Cmt#V(A_gh}7~R>iWS17#QKPv>6kodCcS zvT6Id_WH~{(`QQuQX^@a1~2N2!)6$tW~COT_DVik)Ip3HW_31Us{#(eB7luu_7wJP zA=%Y|6wrOm<_B8Jl^*NKhf+L8G3z>z0_v%ypPE{ldUO!AU`A1>S)ynC%5F%`I)enPmLA)`!EP2#=Wxw%%YJ-9>e+o`m+jqO zt`R(z5n%6oLBtO#0L0H+t2Zf9YQ?$#&6HYsB9cPGyO{Mgka^RvALfe z98}Z~b?QKHk^aw+_t$SODuZo3G}Iqa28x;&UK_kLes3Gr&u`jsPEoZ;wK@>r#df?i zGIw`U;`A;5o}*)N58)5;k!RCij!%v#nYo~59f*N~Awu81pb#Q=BDq#`?>KI+f**OP zTnA#H%5q)l-8qUjvyPEBO>tF&3BbZ>wQhynXB748Kn&!pV|YRi|M&Wb7iI_{t@4J8 zUu?Gkc<#Ue>*qV<&DzTe9f*M*UTK-<_#f`O{JlLF{Q>d?c~!Ah4W@TbyZ`+D#MVPY zr8z} z2jVGswN^uTTyuJOw!v=vc+eaB5Or3=goh1J+&gyG)3w|zH8{vE9f&K6S`8ft@luOX zBi=@8ubk6?_!JYovA8->x5*nFBrt(0vE--@G6R&mI>-P}PU|4uK)J4iv;yUU4$=pd zA38`AP~PYu9YFb{gOmg1nGRA5lz%!%Ay8iGAXPy5s)LjO<*^Qu2g+|9Bng!FI!Fen z5Ok0*P=V+mF`&ZHK>|Ppr30lvg{A{VKn17+`9OuK1DQYts{=Veg{*_PKn1RY*g!=c z!~iPlEF?NmQ74=zKt-L%2!V<^f-C|m>WFg>sHhV)cYumIQlU}Qi5a@66Fb!Hz8b0j znDD|8Yws0x{bAP3hc4>GPL!Wy7SF862nUKq9YGcW6?MelfnE(I) literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SC.svgz b/navit/xpm/country_SC.svgz new file mode 100644 index 0000000000000000000000000000000000000000..db51e3811b6dbed0541846f54d78347ab19e243b GIT binary patch literal 270 zcmV+p0rCDHiwFoYD0)Z&17mM>Zgg^aUsFRab9QF{ZP2l9gD?<);T?&0I9=BW9}oyc zak6!4r*7R)FxaYVP_Sb9_H`_(R+Q;v`Tum5PnY>q!(H4aH5iU*LI{&>Oxx(e2##jJ z%Q=ot)4c~@nu(*dc04lXoJ(Au47Z+TM8tf7aTJ>4td;rLD$}~IS-3@rBd1y`Io3qu zj39;TrRBIU!cnyxpLNs2(1Dc#-o)2c3a!P2{z3jpV`C-w=#_Q^FFA!lJI~({I;Azo zC!)No4hZc07c6bLNxExW73G>NZT&maf?!44GOMy`O@HE`{OXl*QdzNO9%(T9|C@*o UP2Mi*@%4Uw1G*pWA(0BMhcvj6}9 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SC_16_16.png b/navit/xpm/country_SC_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..7a914edc3d4c2f607cbca5fe7c561cedad7137de GIT binary patch literal 477 zcmV<30V4j1P)V^Gqjr75&pH2nyTOB-%uQhT;@xX*hY&Lv>|SOY^f zPoG{V$zBkjee4wSZLt+IzMU`*!fu5(!i}5Sof&Kzu)k3*;(fQS%GLAoq8V%&u({my z;C<;(;6c-7#|j9$72bw=K3u&cwW3z=p8#B6{ZeK5Lh_G-=NKlBtn`Zq0<^faQV2mpX?(AN)GU7d6~B`?R75lzSOxo$AfH@iB` zvbjJeGlgh+#Tbk*{eV#&QIzCOCI!;rh#NrwfI>|a(LldjS7&f_nq_ko!z=+otl`i@ zx$t(9y)0h87Ex00000NkvXXu0mjfb4=OQ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SC_32_32.png b/navit/xpm/country_SC_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..2e5f089b4f181a996ec468738c67fd293cfa4a1c GIT binary patch literal 685 zcmV;e0#f~nP)L|qir46lZ6A*v0(u7y)n!Y0Km-sA4$xe@~TwAnxg|u zC9li3dhHS3U3K$HHnf|ESaWoM>~uxt-59!gsjXJ-1~Eqm$V}F__|U=EP7gNQd9yo{0;Qz-#n`|DIWpa`h))A@LH4d5%8`* z2zqR5Qa%D+{Mgk8X-&#Sz`K6T>cg}qMyvu%c5g_ri zR!_8kgf(;=$H|p;_E)40{j;(=YT5QU0F1W+koZ~X6QU>&EH96B#bVsn6w`a&n^u74 z`rDz$zH5)EKr^KVXyT`#=d})M>I=}s??umQO`7J~uvnbTdw(r?qyO zD#a1g4rl5MkeRF{)fa!!(^|hj{!;9usVl%#^158lX_tm}lO|iYOwad*P0Q-2sVl(q ziLYn+mXQ*2IeEKYxxKRb@}QvXr40MunYse}s>SL{^Ap;qw~K>y%eeDDOiBF#61C!? Tt4UXd00000NkvXXu0mjf<26Oc literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SC_48_48.png b/navit/xpm/country_SC_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..1febce739537cd4ba558486151015762c737002e GIT binary patch literal 855 zcmV-d1E~CoP)l@ArH- z=>%MV+yNp>^R?{W!-EL*{kL~t-yc26U#7kX0GL#HeE(+YkovY&ZI_Rp78X^$51<&} z)}f6GDYz8_VzsmOk6ap*4nqz=)kl{)3{n89K04K5kOENj(X9@H6o8_SZgm*a0Vw*IP=_HMKvo}9>M*1O z$m(NC9fni@S$#~Z!;lIfqmOBI7*YXb^f9dtLpXqpK4+m0LpXq_KJD-Aa`}0Y^iQ4) zmd|$*USHo44j`&eKAz2VP9Z=a%^SaMr=q*Nzt6{FS1pkTJ$<5He`i{qskyl?;Y1=m z9SZfoA+!MzeN0~+zip=$lS#nC0{{qZKt!M3)zRKQuXT*)21KrpDRrD$$9Qg_r;nrm zCe-n29pkwHFMV|XV2QMjaovE|_0g%0OzRle4Y*w&o$AQ8j&a?9n?5?O4z+cR;|AQW zj}CQITE{qU!0Gy^s-vTIjN=BJ^ijDwx?0C@H{f)AsOso$9mCxK@A^>HG0{4Py8)g) zvR7wncD52qBtFhWBG*&~q^6m42>BGFszS=IyzdH z9U3zb0P7>7j!Nq)Lt_R4V13-wp|-ATXiPr<*2hg9+15=Ajp+wq`Z%d0)4J)QG5r8c zAD%iQt)J!47z^O9KEvvGwf?V$##jJdeOlGF53A$U`Zx@Yu>iXI6z+A^;k7<)Lu0Jv zU@ginGfwQ65EeEZ^d hsMcyk;6E4|^9PyEv?HK8g{1%h002ovPDHLkV1jUplNkU2 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SC_8_8.png b/navit/xpm/country_SC_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..19d524718c21ceca0825a52ed70645b6721c0049 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^1JY5_^ zB&H^(Y{>tA{=k6)8+4u?Y&5w1o$tTh-`aBXhp*=U|1WVw0tjYEEI4re!D1a|X6D0( zC*9tjIH`cOZPWet1)Kf_|J(8S?#27->t-HSiTv@?-oVhnz+g(XP5r0ef9GGmUNm|VDJ*&BUspaIR>|E1qlzghmy@X!DJb2>VI!U|trieB^S(=;9+@Btb7=g!Ah zSKo*4Kf~(e+`mfJ>PvfQ+`Ugf7HgZ=icObIIC-i1&x60$?ss+F-X?qh|8Ld!CwmUf zc9)C$^ZWaK`%*SGw$f?&^JmmAX@9lP%E;dJ-}U?VgLpC+7#yEx$W92X00k3+r>mdK II;Vst0OYZiNB{r; literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SC_96_96.png b/navit/xpm/country_SC_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..83136d1281de71c73e0652526c9395ad58031e75 GIT binary patch literal 1423 zcmYLJ2~bl<7+#2G6oEL1D4;}aYCNbY3No4)AW^O=7^ompLP0qqM=MnA(;Sr}0@??7 zF&%^;gu_4rg*b`^&?v_!kc1HM;!sB50Twl{&`7W^)EQ@I_dE9g_xN{avjPu#TbS9I z0RSv~eHcs(BaM9t9vfd5oOZ_mALZ}O0H2LbD6hB-z+#3k!!!6y;nX#1vUP}crgO~i zWiBrHTb!P>7FaT_3fIMDeXzgnzjBk`Qa_>aJPoY%Q`j8ZoGw}}^1K$gkB-Z}aJ+iS z*}4`>H?JYs)jfmL`TpJ0NrOAc20KSn@1g`TXw)wiv3mS^As!D zLEgB1=BnmX>*^lzzq8$gUCp`BJ$XajG!ip$NAt->1)BDtNj}Jw)_F%yOiGFe!pR8* z6@tU%&6Mf!f=4f&tjOs^uZv?z1Me74{G3&9M@a*T&WTRKHT>Lk)cDEB2cXX#&iUy4uApqT*mp^iRw9 z{-1X`GuYcB!h+4mMLxj&|X6m{(7!>km(^x$$_eoPHlOfK^-v@MK~H2^M7kXNFSG6yTU zNnIaS-3Lij5`>FFOASa#9F@ezMM;UBNJ+v1l^7`&fVsNT_sB4tN;-p!k`ON;!&tx> zoR^fCh~!~u7)49RkvuFQ&gg!JQK{@sHedOfsxq02ZFa=2T!-3r%@_{w?Q{&IE zSS%L>k3vJ|^oG`#uVM**NRq0FJ6g?c-`p{g^buqbGlkQtyl4H+nxDh1?8Sviq1ml; zf&1d2o5am%nGzZ-p+oou5tqbys&u5{#zaIjG%k^<{UQ?3xD(XJO2-TnotjV%?UWTk zW4RAOwl1y8!J=k#&F->o{Pl*&O7BLLNf(UZ1Ivi!sE;f{p>(`!GBQp+Otq@%b4&F} z0>A0A4iRD}TnTIQZ9R&(UcHK5eQ>5_hxs~xS_$?#oNT(_7(Q1-WTAn#_o5~AM$>jR zEQL0PvC55NOasGE?NOHYix5M#Va=;DEuXFQsNjZc(o}l6TWY%m2r;puM=z)RFS0c& zp6l6TuO=4(G^osBP#Z#bjv)haF$JA%XtHbEv&SUVaIC6Lg!U>Gm9`&`&~6~(y;#P3 z&BbTxfV1(X#9L%3Hu+1HZM~>i8*miqU~^nkce9N@O5glBdF}j3)I0&R9N4tNLc{6! zn^c!me@A@mcp!T~f6Q*D$M@7!fbM^e20)dXAvj%3Zd;lHr8? Ou)ufUL59RD^89~Zfx*TA literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SD.svgz b/navit/xpm/country_SD.svgz new file mode 100644 index 0000000000000000000000000000000000000000..e1f0912530a707505272249643c693b499318e1f GIT binary patch literal 233 zcmVZgg^aUsFUbb9QF{jgLWU!!Qs<_c_Hd-MZFTHf|fD z1WM@%(gTE8mIca;v4xe~zDl5JR;9c7@ZM+sW_LaXSnM==VS`mk2$ql1d3FZB_MgwM z2y;AecL>7PAPerctIfPP$R^JQhZx7TQYob})ul{MX(CdYKuEregTa<^?O?qdqQUwa z7H`wLoDC8XR2o{$rIS6zAEna2Mm~EVg2AT`T~Xbj`WwDHDt+JogKzG9{{6;}5-v^{ jM)4f;OezSPq6RA32lhqlw;O)lyIp+)^;P~JPXPb`z4mKh literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SD_16_16.png b/navit/xpm/country_SD_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..828bd1b20dfa9a2a7e16550f037e548ae390977f GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^9JY5_^ zEP9jYtVsWH|D&KW^Uj8q_nxUAjz0JQiS&oY$M(+cNA*APCIG>Wl|R}Or$35^@G>^4 zoY&SdIL6-hpXaUUt$g#}+wQ5IW?*AuYm4Rg=g$9A5^520e{Kfzj0>!ru9+F``SWL5 z4f8)|#hYwrc(W5HJP=j9#W2O-!jmbrzcc<{y*>GRyy`6mw>Bl;j_Un?6B8mT`Wqiw zXTD^7*m_sr<64iwgKO$+ZM)}tUgI%*a9f_OZLj``OFWEHHUA|gBu*S-(D@K>v(~Wg Q2hdLpp00i_>zopr00?Jwo&W#< literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SD_32_32.png b/navit/xpm/country_SD_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..5ee1def586eabb798f46196e7db4c7aadd37b7ec GIT binary patch literal 406 zcmV;H0crk;P)M7#S-zOO+p+*YfU0q&Us%rLz3bB@jN6XbH213ZrvM5 zO}4z*r9B$T0Xicgr|Vrg06;AtP|F8$0D#JdOcg%>sVcI+FC?nS{=K2QiU>e=6%hdF zts=wWLTuhShW)x(a%LIxR07PT2QEGHY_YR?wO3ZTKfZ$RsX8`Q$Cd*C>|dYIdTGl6 zo?f3hxT(kiKy4MN006x}&C8GqU=@n&u58NyW+tY%+&NaVJQd)gbj0-dqzu3+6tN0L zWy|58PqE?Q&E0v9@qw=rkoYMM?1!Od!(CIk9Fi(%xL-%ZL;-I;+&*eq9uKIu;9cKu z*&sk;^ihE3=%WD5(GLOyqVEHQqVLaqE(FBRCrTic_CFaVZ2$lO07*qoM6N<$f_mDi AAOHXW literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SD_48_48.png b/navit/xpm/country_SD_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..79998cf9f268969883a7c390155a5ce8cca86631 GIT binary patch literal 484 zcmV3McPhx>k?&*DAk@ZxzdUgm6Vee2nPHd7~? z~5JbcIgCG|!5F`~Y5Coxc862#Jd|k-q9}aJdIg(Efy^T#2Jeg@qY-nFX#@rFhIl&b%)Fvgn_;+-1QhG&VoVreS8bN2?c;8V$u9S zLa}ImAfZ^ae;~P7G%rXr7R?J1jYXRSNynm1K^nxOO+gyOqA5U^STvAJ7 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SD_8_8.png b/navit/xpm/country_SD_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..d7f62e8cea7ebb7afb84008df3b9f3c82f647ccf GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^>o-U3d z5>u1stVsWH|D&KWv)+M_{Lhmg>OQZZ!zCfvW%A$J$a8<}p(kb1vzf%$*x1_s{-4Js z-+NJ*?`rw+ElkILeEn{or@bTYZ?$&mBmFRK2??W+|HcJI|I-r^4m6tn_~2pmhn?XM Xo3>5D_SCgN8yP%Z{an^LB{Ts54G}>j literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SD_96_96.png b/navit/xpm/country_SD_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..615d49d0b070938c7970ee9742c5e1a89dfc53b4 GIT binary patch literal 781 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlJ84tcsb zhE&XXJ8NUMNT5Kw`g0on{lE>YgXoy#YGzW>|2`*pt`uwFOgytKG?b?&+PSM_nxak0^H zPop$Uqg2`C_T7H@-y+Li-B*I8*81Kyb(oha$T?Y9#nfcpk%ki& zZsZ9}5SQAlP`R*Bjjg5iSWR=ok_(GCCW%PZCpq|J1OlZ6qg)(~oVqnSI{xvn2R<)% zaB=kJ?q2`?{gK)Cc?DVb?)v@X)Y8)*pOri7I7Yvo4MY>$$~{FuimJcQJ2K;rZ6M3Z z4(<=!Lc-z+Vk(+?2Xs7wVj6-cY}mmtTcNU$(aiDFBPN?Bmt(9FES|mG1{{;5#51%# z3StuaBREFEWx}Q%4jl@qg^jnGz8qzJ#Tg_izCzt2HD*DZ z!rH<{Eyu3MOrcF8$61$gU6K|5z#SwHB{(+iI5vfI(+(prA;JO=IQsOUU}VhY0Zgg^aUsFXcb9QF{eUD8`12GVW?*;$EbUd3$S}R&M zEx22XAX>00J#P0afi+t;p{f7g#8ah_={Rd01?Bnrk6tjkTAx1FgZ znhuwXt5Gt}UeoPvvjTf;VDtX?{FDOT5PeQlqHLSN+s7IN6GW>Q1XRu)=0x6m=BKRd z8(R1ILFvL$04ah&q7WtoD_x24MvM+^jFkiagmWHwJTEH{ye^#z^BoV(Rizu{!YjZr z5|X|u+&>J|x@{$1^Zkt9KOkK=lS}0!adxKGbrJRh>fdv}LEjQ@ht(whZ87=**VViw Hj{yJx=09|; literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SE_16_16.png b/navit/xpm/country_SE_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..4250fb10d2394e1dea9dd21f2558f05a1c828d49 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^Go-U3d z8WWSB@V!WJV2bBDEh!;U@hgyJBBQWg=fgFPsheI$`2?gMs0kuwZOpFvn}4c?_PeelF{r5}E)APb@b8 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SE_32_32.png b/navit/xpm/country_SE_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..738a57eb024e154c0d09000ff8a4105189cd2d14 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&)NJzX3_ zJUWw~@V!Vmz`IXm+Toive}9BLV)99OA-Of-N>d=W+ZBO+(|(}xr7WK22F9a}H7ob`FUm+;Cd6;n?nyf}Vv1?yt5o+t-)ZiX$^ W0#;hHt|S31WbkzLb6Mw<&;$SqQ$JJy literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SE_48_48.png b/navit/xpm/country_SE_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..84a0a78227bdb2f85e577e43e1ec1192c13f153c GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@Huz52oEBqY zvuvkl*}i)hm;6u3@xOSlI>xfO!|{khl7L}{gbR-n+r(E*hsrCLt(R-Jot5K$?3>8L zsQ0!TLQ2Eaz$$jFnf_LufAM_Y0|+gGKogeiS|I{uKbLh*2~7ZY C(olQ= literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SE_8_8.png b/navit/xpm/country_SE_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..3ae1ada4de52af822abcc0ec7b47a0ca3a34b170 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_b^PZ!4! zj+x0%_+F$WB&^tU=j?$47s~ETWn`NnQNS=qsONdOx3PhNM?rm3LPEvIsr?+XS2oKq YFu&%>KDOgSF3cmMzZ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SE_96_96.png b/navit/xpm/country_SE_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..34292ee5f45fa476f11eefd0620dae7654a7d3a7 GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlHoB|Tjn zLn`LHy|XaT*-^yd;vb)wATJZyBbS*}7pzd!YGPW^ppVx3l7oWuE0fUXf M)78&qol`;+0BWgm;s5{u literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SG.svgz b/navit/xpm/country_SG.svgz new file mode 100644 index 0000000000000000000000000000000000000000..75fd3840a53e371c26dcf74b093e3ff384df393e GIT binary patch literal 582 zcmV-M0=fMkiwFoZD0)Z&17mM>Zgg^aUsFdeb9QF{#Z=2~+b|Hk`zu)Hk^nMIE=h?r zEC)q_00o*``vHPQTS67tkl4uS*LOw5j~I69LxbwXogL1sc2}C+Z=Wji?3%V**C`c@ zQ{w8yIxp*0N`HKR7#m7jpVfI*t!tOkdQI==quHnNn0#qm=3P#@(ih}w{j*(U8%J&n z?>E!Qr0Y6XzJhGstR{D4JjR>t^J+v0LEE~WVvy3K3!My9;G9n|NB7L@SkrBVmgl&_ zT005Zz<%?>JUOzqo>Cf)6)yYj7_4HrOEv=FEV(<9!i%^8$-5K1JQp~$EUf9YXxuWTH=E2C0{Of0 z`gowB-Y3P*Ra^L;x73AhwZG34_FH*`q>Prmd35wJZsU;mq<_L`n!I zO`JeLIgg|k%*H4Y0BcwxV+4U273)`zgy~qD2(%p3K=)>`3_Pvvz>_*=_@x4(*fEaz zz)dtmc|d0@0br>6%-j4XSFOuwpWYuMSbb@L_Jarbm;Dk3n;GdiIa3>m|5}?c`ch%? UBMY1LKl%CS4?}~1Q>z950FU(`bN~PV literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SG_16_16.png b/navit/xpm/country_SG_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0f926db332a07f2db3cc86deee9a1b15305ec60a GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`BJY5_^ zG$tnhS@iUT16M*)0uZDo=If+g3P_wHpzOu$-N4Rl{CR&h|4iO35;r0^vlGm&{jGke zmEG}uzASr0vyJ48nH-j#6DKw{KK#DxEe{XRe)BgeKYsT&wCzvVGnCFSo-J*tb!y{| zn-9x{xS5#`&*!zCQF`V7{+hr4|1GxvF8}cQ0gtQ=M*sf*pRdCEgDEA1`KA;@QL*~n Uq?M~GfG%Y4boFyt=akR{02M)4Y5)KL literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SG_32_32.png b/navit/xpm/country_SG_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..6580f2a55237f85adb3fa6bcf25abe3f66c18cc9 GIT binary patch literal 466 zcmV;@0WJQCP)&q80OUAdk(?-rhCtY^W!_`o7uT0jD#^PsC^Zm)*)RZkT#n-y%W`Ed3Z*6l12hm+Z|-$6eoG{- zMak!`?H{311z?#RvrbRwcR-CMQ@7K3dj_Jf$q02hxlp9u9sr!mlGn}epL!h#BSVlx z?fC^&SzKMT%||$uV9YPlo|2FiVXz+#J0wxuUbjq*3&DW2 zw?%%h0RS$Q>z8qeHtS3nvQj_4;@7m6$*J)>&VT3uP;(cN$K^OZfTEOVml~sBh<*o+ zKMIwFRrN6`ZLUDH83mw!zfFmCZ=1i>aR(;A1egF5U;>QLH=4kWc-@|n9smFU07*qo IM6N<$f-t?t7XSbN literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SG_48_48.png b/navit/xpm/country_SG_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..f84c5426001c6caec36c6e8e3482f94b8d09ca2e GIT binary patch literal 706 zcmV;z0zLhSP)TJLv1xC^(7k4ZS9_nGU-_>~Is^w;KST4vXlQ^qfcL_*7WTFW3!IPPZ9?vDXIiU?Tvcu;jH{ zVkQEB2KEwfu}vV_+@LQ+_!9_GE}T{SF0(@iWMUPXCYR%MSC!gxQN7+nN~|(vff%DZ zeFiA@4N~IgGHVEk+0W@)#L`z%QH~;2CRQy1WzHc|S^`S+wT!O-kZZ~H!5};?tR()3 zBp(S$ja#I_zYa$I?BNsBe0(ac)Jr`bwoZfWEtByCgmEI1Eu{dAOOms#5Hfw6wIFaV zqD#iK+Ls)vH|q*pVi6ptq>M7lgpFazNVi zkiK9ij~SDf6ST5|zX=22lQYCyEFyE3zH4(pd~$}r{Q!V9258L=0Hkc|+Le9+0)Tiu zzi!@_>3^IxkquvrwBGM|{7`?nCj0JK`rDhvZkN|&U(4@5#QXwlYoY#HtR%$y**t>) z$ihPjqpknn+Z!n`s-*?jvibSBc^b00xruNBiMILs|JDCI_2IvL*OB|d v;u8P}53> literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SG_96_96.png b/navit/xpm/country_SG_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..70a6368c197f078a2d696337151139bd2332c71e GIT binary patch literal 1618 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SH_16_16.png b/navit/xpm/country_SH_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..46df18ad26fb83fb48792be17da67ac3a44e58d2 GIT binary patch literal 453 zcmV;$0XqJPP)v}u^XE&w ze$B$bz`&BtU{zl3Zt(cR*H7P>IM@ZXR8C%e+P>i-1H%ml1_oExw^3maKY#!H_%ZwP z<>Cws3@rBcYPy#WPPzEoTIko`zyEgKWUJEsUVNLOanThBzrTOa^e23wy4(=%hZkJeo|HXgU3&AG8PwAZ3~6}$;OqFq$m%hJ zdi9|N7x(YG$-uzC%)nrbN5fx6ZXWULR}UP%euMYR=Rbr)>F)iX^1>OPRi&Qq-3AdM vpn-vb;okNS|JXjjxdi-x37AMyO&1LS7qo|>HzD=c00000NkvXXu0mjfb!gwa literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SH_32_32.png b/navit/xpm/country_SH_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..853f71fea0782863f0e45f4b10aa43d068028283 GIT binary patch literal 1057 zcmV++1m63JP)@kM%|4(1 z)~&^S#|!{9D`VRSFBT7W#21KHd|I}3>kn;hzf%qXgctw3&U#avt=HX|oGz~0oRY%j zX?g)XSGh@ex+T6qoVv4Y`}R|>w_10dAuD}hz+npFRVp?Hai78k33g9IQ@DO@wg zc!_9k&M`b}0^srZ)~|1(7I1CXzR2o)S2uvf_umSu`#=*MFj5P+#LuLlW-@aAd6iNC zgOYk_3kEGKiw|IGYR=>Fg|jO@`7pBQAtS;8V{nBe{gssy_W2uP$->Z3W>ZsUXD1O7 zFql&qSc%11DJfig{{S=namUaofK}h@_RcNXwYobm2(^FQd&od*aDPe3#M-sz+m9C+ z41;-j{U(#Qv-8{0{g_rG<-Yc^ z)Y2pSVqIiELHGfrXN*ZCXWj05c_AZ`%ipQ3Ei%_B93z*N$)aOzy3*3z`?ONoLlA^Q zA+`7qZ_@t6sCiFT-xJ)=;;frCVeo%N1Z{@s^+<95|WH_TZA026*W z?(C<4e=9Qb!{k}0X=|!$%%-tP^hwI#cO@8x%F9C|A_8ANGCBFvr0GwaVp2qD z@vd7XR-pj^Z0z@$YI(joEf*oAP<$>H`@c+BZ0y1a?=EFxrYJ4m{hM_R!&nU{uC~WV zA=mt{Po0*FVW_w`BszM5Opz?keam{1G_6@vQeA!1T0mR?sHnIK@Ig*NdQ(ga0C>sbGc%VV zgmQAuzTn=qYk8Qnc7P@#oFq-b!KGHD0RRrbEC8shYw8wyFAHCwmKQL+gj2wrz`!Xz zJ$-?GLS5NG02uxC7d)Zs2Ddh4Vy0JWoG>!nWTL~uDi0sNVMQ7M;EW#aFA(4Y0e<(c zni@ZGamYM%dOkxCqXOqFTsV!=wf6&gY+UVvq~>k)EfuHeGOv-1-UI+MELr413+WrsG1tyi4!_DGipC}%0geH zxM2Ch}>vZ~>Gw-bvUk8A`K9`D$6%q+X(`FLf zwrP*!9HsJtyZb$gg7V!PKUrBO5|IF)(M`4lR)c zSOCH>Gzc{9-9MKs`N`j31po*!7{(6tj3y;pySvOsAy2qS?A!O-P^T&W+j0nps?_wnclhBjk++LYXX3YlTAjW@!SO-hr=Z) z9LF^TVWu8)2WXPAT8sCO+mkIl+hu{KU&Y0j9UXbOxhsW{;Q*kLX6(q=UTDtQ+xxV> zXBBdrLen(rxNf3ovWvvW%;X_tFeI6uAq1e>v9q=0fOlc`=A+G3RWG%_$;&&Z*Bkfj z2@yty(*}b!BOl=Xp*D)5xhF%Y8DAp5uq-4a1#1_;y?)$EUYLpSbc{vwoY`vR203k*{s* zxaBZTjJGxEDWDxlFO8PXZ}V!8_$JB(dV|V|=`(ShbcSB?@qJFW{(l4NAw(QIXlXP4 z^`wbJr0UFG?UAp})Ul?H%|F=#<8&YU+A%`cYbUEbN7)JfzSPTO3-Qz+ggwBHP04#yDRN#j|@|}ZC*P5tKPVC*$B{Z8UY$kBS6Dx i1ZX&o01c-%4(K0^ftudg;;4fF0000Qh+dPhU1RwrTelP0~L1=hxvQIjfaV9VnPP^>W9|neB}aS-W%J`K1WQ z*;IdcHeZgJnVFke%i`mKSK`LP%!iHL*xF3kavC^SYXD^!c0bXZ()~uD7w9SmPgg&e IbxsLQ0J1Dqr~m)} literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SH_96_96.png b/navit/xpm/country_SH_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..73d881d37aa457e16fdaaadd51b6cfb5d4bf7634 GIT binary patch literal 3621 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 HtV8|}Vf^X@ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SI.svgz b/navit/xpm/country_SI.svgz new file mode 100644 index 0000000000000000000000000000000000000000..21837fd5aae170b74f806992e2d4166598ab9d52 GIT binary patch literal 2859 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 JGeb@u005F_dT;;$ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SI_16_16.png b/navit/xpm/country_SI_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef326c79d2064512b4f6429287769b473b5d77f GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^#o-U3d z8WWTM{Qqyytl7}1a#cfWo!!sEw=emdq$C#l{rVZa>W3jS^Wn{Lk!)pUHc}A_Or)iy zx%HKqnVF@f8Ks@n_BL;@DY+>jAyF3duQi_e^sL~3^6sL)=?MuD#jn&Ec?+(6o&8=C zC@-<2<7&YJOU9)F4n;N_T0HhDdNM0#ayBnoVwhpVz~FpM$$W}hlQz&*44$rjF6*2U FngHZSM>hZf literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SI_32_32.png b/navit/xpm/country_SI_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..160b5d32a8b49e27df64704a15b42b5057eda625 GIT binary patch literal 367 zcmV-#0g(QQP)Tq&f<#N?=hy z5@1A6MV~%NR(|7ReZauL@b$OCi&hQ>0Rc)Zz;GZlGc&{g&p&vWnEo*{{%2rjro?mx zEOEfW!NL6R-FM+PUqv~X|1ofIP-p=bA8@cRm@2U{GBAGp_=AC!l~M~~cYO&PLilIwva>iG)^A@PsNA;d772wvHzVq>z^20%fjMgRpzZaTt{V29nvY?MDC@ zm2e#0px_BH#^^mj|6TXKoUjBK(+vuqP(02o0U+htT`e{MX7P6g0gTE9Ml$`e$^KXa zBaBK|+P8_Y$KIiQ>HCMNp*Vo*4!@!`enjoqXh z6t)CoJ+Z0=K+2`#={nsS1*lx|0C>Lid*Ros=TC zd*HW?M*s?Y?5oY5{(_JjpQj_xya^O>HTT76K&lK#l>w4J!!=3BCPJf=ym)e%Z>ee%f>6E=!?k7z2ZxjFgw(@rP4@rZafD`njxgN@xNA DOD;OV literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SI_96_96.png b/navit/xpm/country_SI_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..57a116ca79e2510922ec6c83696a032799ec6371 GIT binary patch literal 1249 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlITrg^$J zhE&XXdnY<4xK!rA$NT?ds{Ep3w4G0}Id2o$_VUgQzbP{h^fHW|4 zS;^h^pG&^ow>+JHf6lziThGqOoaG>`DF>ObC|Bz>$_yr?95oZPd_i;e7iXQUH_81H{WhNX~M%FZMg94j&+W!UWu46 zure&t{J!$x+?!ADaa;ep>1yB*x^~8ew3ze>t5*4(kDcJ+D|oqbw?S?uJCknt!-sAA zY|rl9seMjWUSsm^35H9y=skbSq$YW`Q`~HyI8^%9A}h^@7^7^^SPS)yDl#8pFB)6#8<4n zcQI`JleY{~8&rQUck^3twvL@4XJs)E{rRiPpz-tio1@+46AZ*(9CiOL_lU7601(f^psam>i4q3O6r^biU2qd#rcQW54C652iT( z{=QvI`Cj{sd3SaOYQ~rK9zH$iO{3V=rRrSLYa$BRin30Aix#h$b@|>Ji?1s0J&v{- zPcWD5R1w=V@w}Q(e%iG1C65kCYCMVg_%VQq!AIE5sd)PAi4&&PHtx>Xu+!GvoZ&RP zaNp{}i^0})c0aCI_dVDm*C&-dy?fIUH>X+0k7k8=J!d<9PBHv=gZ4y ztoiglD{NVE+i_JD<20?uA1aSH1Y~!zoU4jnBYQ<}PNRw1+WEWwymL5Y@{n(T&AaJ6 zDu>>he!4zAdC>v0xW7Lqe+tWH-^%@8y4~=k=uFQ!b|D*oRekLDv|T#0ZoY|G@|!BV zC7Ul*9-j8!yt4l8yIc9c)fTfcgiP(Oo6o{<*>G{zhcnez`6JC1-2K7qs#>0Gv0;6> z*Z$uWp-CfTfR+%@=wd}{%iMA8(+wa(Tch$o##%A~CR@wZ0wgnFgE;~9;=;N`y zezWS1#zJiq5jhS98MkH6XQ!tqU*7uj=#mu=*mbnTShR9gzZU$k4^UuXb;3^={Ce;B kzxNzrh4_s@mOV26ZnsO%N?GA7V420>>FVdQ&MBb@06&E`M*si- literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SJ.svgz b/navit/xpm/country_SJ.svgz new file mode 100644 index 0000000000000000000000000000000000000000..8971ba307fb284ff077dd37819f6cd2a78d34663 GIT binary patch literal 282 zcmV+#0pZgg^aUsFmhb9QF{jgZkw!!Q(v@B0+-c)gyaMJdvB zU^|8&I&dmp)+T8KH62Y{x3@PHWYbmj?i~2P|2s)K-@UbDD|@Ru!-0hqh%{9vw5d6~ zJ2gvySXUZRww;k2_R_*U3(~XVK3~7A7Q}9AvUnzLpa1?*Vnl0%T1#zi#~{B&_n3U7z>3H;1y%Dzs^`bfk%|mF%HMaGa!Q& zuJJRY{w0mnb>lcBe#ruo_Of!nCy3H*%i&zA=rt06KZ)oB*l~!DK&8|v_1*K?vHuS? gDZ4mOlt#&A@|TZ&`6kJ9{J|{v05fzdg#`it0B&xC$N&HU literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SJ_16_16.png b/navit/xpm/country_SJ_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f41c60918bd036fac4dee42b92a47bb1439fd7e1 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`fo-U3d z8WWRi)~`Lyz#Jo+yGgb^>F*iocW?d`zmZ@zJJ1p;!Y{!m6~VGD#!2vn#gPLC4j5;% z>GAgPNJ(xf6*^oWqL3CFb!X=@`@9369NqcX&0M{h_t1|?(+s69doVEk>v2@O)NwW( PXcdE}tDnm{r-UW|HH$kl literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SJ_32_32.png b/navit/xpm/country_SJ_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..24e15b1fd94609304dd1911deef40764cf9613bd GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&*AJzX3_ zJUWwW)~`L?z`G$L^5dCV3*|2qy?hqT#?~h8ZpCW0{{Owp-JynZ2V7RQ1#-LTN^DI~ zi8`QE@Kk7`*G=I^K;*f#;h9}R%7qgPR)_zW2{7k8{SK$vqJ>!P{+jy?KqncEu)bLCC~X;)1~JrVnypK n|7Ohp{Oe;eizYIB)|7Qiz literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SJ_8_8.png b/navit/xpm/country_SJ_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..9becd94bd5877d02f2345a700c2284a07102b6eb GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_b^PZ!4! zj+x0d>(`z>aKJ!&n^XJO=~wsIu}LH(9bhc*GPve{@63S%1#kY?77E&>MhYsG1e`Bo Y=!)S_oV|PH51zopr08+^-p8x;= literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SJ_96_96.png b/navit/xpm/country_SJ_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..da065743971cae85f71094eda539db6223291d88 GIT binary patch literal 405 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlHoy*ynU zLn`LHy|dS|IZ&kGp^LNCLCvN|=b65RNgg@nClG!?@Cc_$s8k_$A^%#PoTQ1zoN9ty zgdSF|imr*_(_jAg-G{d?Qa0FCZ$5taWJ=|}>WY24=KlS0^YY)PKW{$#^v803ea!te zg>7GN-TcCE+i!tFfPe;v2n!bzYh#mxBdJ`8xBK_ylr?=Uv6|;+Zhcrk2WDF9!v_zN zE*s~VN@Fp*^n+a literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SK.svgz b/navit/xpm/country_SK.svgz new file mode 100644 index 0000000000000000000000000000000000000000..e3d5fc0e6726aa84cfcc705e0eaea96ee832c810 GIT binary patch literal 1775 zcmVZgg^aUsFpib9QF{)mTk)8#fHS=U41(FU^cZ6W|x9 zSjkK?)02B^e}HStvRYg6$cmlh*Y|-d?Q&%&sZUAbL&&!z2m%iu)akpAw>QnhVtc>Z ztmiEm+ct~!#pZIgUe4RU{``F^ZF9dnUtgZzY}Si;yWX_#-o84$e^|b1ng*NK_cKi9 z?e%VVH#<3be0(&I&TO{J6Smf#;9J|T{N}2WA__dNE_c`SHrsA`y;v=;ck?#x=MSsJ z<8Paf^VT-D@xe9@AKvPh=5)Kb*p<;B1}oYFbP(n2fL*O_ZszSTS65f<$;+g0CFK*; ze=5{kC+G4~xipr`Pvu@Lh&c9g@6LDEhZUFe_KzkdBbLcek~M*{OQCt+Br++aRKT1P zOK6faK02GjB#Ci0*$9kHB8IL=Y^Y`jgTaou*Jw_PYn@9oXJg?37B9fv4>!fQyC-Z4qb?| z34u}sCdOhQ4LNUe&Vhm9E6ByVTh+2GIE9k|n=*F$V3LR2BGHj0Zg3kTlFGR*JC}5C zxiE)RH1sy*+>k^A6%sC-VZi_uVOkTd8{d~L?3Tr)Vi=Yju@^UXj^Gg@V3x86mJFrf z;zYpw5V03m3MImg@qsJs8G3wf zdXC-iKHVVbm1;8$3;cVdlj-K}{9?8HG^1|1{cy9GEglx@&E@5r``vc)?_#z_zSxha zh2b;0+Z}+L)p~JpemDF3!)}EAvstZYx2xS^dqDe>dZkw2wbC5+$*FA)%wHb9@3!ab z`>W0NcHZ8e@3yOtzv5~WtAF@^3VsB5+%KkJF#N3)c|8)oB$whojnsnsuOj`|qmb*v zj#H5g4o~-oIMLIx z3jW-@Pzi6vBt%`Tlt2ua5G}Au3nyN~!1DjnqODCc;!~HozCWL8PG!nHqmG^5yFbRt z{m&5KKmjBP1iMd@De@x{DaQyqqu`j7MWluuLNg{2@G}Nv0B>{Skic@*EIo~E7;$b% z_cNk6WMsW5ax8H`Lajk~2l>NOs0CzrkHtkzXw_L6BTaKsYXzSpk0Eu{HyA*88o5QR z)x!oD$XD*CHXl`YMOnn%W@`I6_Mv5T~8TM9>8!l0S!*weGwP~uudMj314d$+H zFo0*zd+dn9KWI`M)7YV|jd=VOmcj!lX_{yVUK2)vC?r9tMhf5>c1Qv!dJblX13W6M zGRHHL5_$+Y2!&Efq-<~wZA8clqnP@P%09xBn&>UK-tXZRjDjyT@6Yn6iC_a7l1eLx z^43|&^$i9P&crr2o>L7gM=$vSL{?}k-HM3+aAF9ya|3rx1-sJa_slzcz@Lu=>p z;=w~Fu!&_OsvaI++`SLLEIgnT^(fYO`IYuktY%`xiq755_A~5?5$Vz6E!3|_TIwMa z2Wq|(M>SU8utIw)4Dtp$9a-}U$wyB89#pQ#?9g%@k@>4kk#aY*H0sG>6l8w*w*pC9 z4=Hwn4J?XDsxjxx;fXhZ-s8cH$969-7H7xulH4DAeA$Y`4jj}~9#8O{LJ7A+@ zD{!x0tOa)0@ag!jKeQWzh<||_nT`XV?bCoq`&&`Hn+@Sm=6%Q<_WM4t_Gk2=hn4}o zDJLFQF!F#TTZb?+n=ZzxSl9LfrN_E1DNwSgCum+IxPl>fM62$0+^N^4m_0=m#RXCU zZH@wM-4MzUD6#a}&jo#r_Lkr-=%uz5{X{_zw(v`W-s@wgi_#(aqFKzEXrtQd5aNuc zAx3lx`lHbyg7hbvA@WjSs@5n8vi^ioiDH<#^I~`4*%K9haPvONsi!B)>PhH*J{{uRbZY$Fk007V@V0-`o literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SK_16_16.png b/navit/xpm/country_SK_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..7d271644dd0b18aadb7fb89593e78700c87dab1f GIT binary patch literal 326 zcmV-M0lEH(P)^J+rfB!qaYMuWlBA_g@@x2gE8(cqMWnf@n_{?xaR{!INKbJUURR1wR z1+f9fbAoCR)_)0!GST25*&mkM=HgO~qJe>dfmwj>@5j#!cvBY(GUxAyPk59<0PWKf Y08$`e=UP!I?*IS*07*qoM6N<$g8N3A4gdfE literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SK_32_32.png b/navit/xpm/country_SK_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c15639d802410881ce3ef5c176d8bcffa6281391 GIT binary patch literal 656 zcmV;B0&o3^P)dIF^5fQp@ zE3`{j)r|;J5EUbeXmnExwkV|~2wE2|ELF1;TPbm2p`|fROoA~nkICe9$3+mrSdm;( zM95j4|1AEGb2#@wG)==+hOnjX4L}1>mk@P2;(qY;`dt8oQp@2(%Hnb+poIH;SNBYoex&)18D_-!QRHyeEEBlrL)EzjzTc3<#Ny8 zh4MvKD}cZ?U9DG~OPQHx_VdHr$1YYX3Gdwc$f(KLciejJOH`>9pdXQtR{`YL*27ot z6eF?Fm^=IaBLJr4nww~??wbJ!0Z>k+;*&EhrzX5Fl_kGmmOzNnz_W7tEh-TKK-c(f zLq|J+{^bP#{(S>Pq>5Uu1Av*$0Alwi3W1<}2h;u^)^4D{0ickFs&ynntE1NTp#B60A$g& z_xGwcGJJZWbwg;8SYh^9zVqQN@P0lvKb&Oz(Th{eDa5^JsN=DR+Z})E000QFo;Z?z q?PDtEMg2EGo#Ow0lN*445BLeAlGLQi`Lo*q0000DkX*G4Rb-RYwl;1r;12rYMt}Rfi8O?|06kpBEpeaA5 zg(G66SN%6US3v6P2mtMMWXe7%{veTj^4tHbJDL_A8VA)JZ8ubnmKFmjZ~a^>FUvf6 z`s(!0S@e=^H~NDKo}j!{hmGb&Nc5I_nm1&(18w^NguXwPZ89b0a8iz%89-w0q$X5| z-@FThxi>aOe(jK|1Jvbw14^YGp7#WrxV(pU9RN_e_EY!9#!&lFEga45W~iFeUU1>y z2@(j1NDWnUu3RQocrw9|y<+fG75enR?`?0dT8i1-5MI>WdaSoIhx2SPm^)Ef@>{43euGAOK2;dM;e8Gyeaa zP}F=;s4qsHQY;eDrHn9rW;fN6EC0ycS49A%+tV;Zclz*mO&!K4u}v;65)!vpg_1x0 z!d(N?w+`3YlNY}%m5hmz@G|+@UVrk!rFWq*2kFsx{pE9K8U<=F0B)APy4$P$@FN(T z9T0$Y-@ux`uU*>eTuP#MzFtsv_Qb?3_8r9J9LmL3_d&(Zt*=gV!Y hjy}>d31nkqW61fXT;#dfxB_T5gQu&X%Q~loCIIoXNhkmS literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SK_96_96.png b/navit/xpm/country_SK_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..1e01c57df3d35f42fd09c39111c0011eb731d2f6 GIT binary patch literal 1990 zcmb7FX*3&(5>8b}RjeVkrIu2cS`x)YwL)6!(~735+GuNQtF~K_5UOGgR~M?5TwAEv zODL)Ba&1wRzEHFTt$m3lq7_S@{&@f2J9B2fbLPxBb7tnu_mQtST7yO8MF0Q**wzMx zKE&I<93*fU{rFP>hahy<-Wmn?`OET}X{i8!Fwqu;yh`|Mm2&?f1f$qGN%1h7C|C_~ z3k#}6OAK9;EVx+67LKuMO3q5K2ElXSLe5QXc~UYT<$+)r@;LRXQ<=t-#JVRsDPe^c zeq-1#oVtlsPF;;bjlttl`l4fcOUuL}tbaEmE0oLL9oXAsQ;Y+=^Qf9n0=Kr{v-X4kO1%UAII5%C&g0fZ$PTxt3&W0J6ADs!^$3 zp)NI1Y6D`v4MZ$N`?3hww2aVQ zk%^)3?{9D|bJt4hFN_B5Vf8%ajPQw%vE-8QsMX>6PFOdSL?5Vsus^*zS%(S*ON+4m zumc|vYtHIu#dMdA>#)O%X3nc9`lr?So~MDsESvy<&eOGTB5W~NrelX7rc~BbB?2i} zRGmLW>VOdgDPI{=Mt%sP`qz(Xsyi5w-5d}@RkdT15+NGT{@D%g zn~~~3yhM}&;j#vF<MtPm=T-Pk@gUj710|wmcQ0HAO6ih)1UW92AYo!Wbc^ZdGXZXdw^B zg_<@r#Xl3FeeU!(yW(l|Me6sCew`xG5=eJ7Yx7;^#jZ_+4=#DX`B}7=N-v12xNqp7 z$sj?PagdEhp+4>O3>RIw?05HeWifUGa}{cM6{{pP_4q%_cd4hWOg%+Y_Adp9~lJpfOB*DPDY{oJUwoW~rxdFWVoTY}o)Xs!xm}xU~cqS1Qer>a2`Ry9l z%`SbQWU$&bBN`sr=%thJ0{4%Chq%m)et#G2yD@Parc}NI*pG7>}n{kCm zUv$RGnM%gsb*zwOw+dXTU_(SWtC*~)a-3T;=4KPLkIa!v+sv6 zq#|rVZ<5~P#OWquH#)r^)l}5=s24Z;*cf}18of{{q|MW?zr-%f>oopbw-nv~~9yy)05oH6TsMhS$B?vJSN09bs<~N;5ANIK`$p zX*p=qqWvN6!2NS%c+a0u0?E^Lr@o&O#2I7rJ?K0~S}ah|iknu#ALbm+4#(o_x1?(Z`vPX22iE?ZL>KFyvqRRbvzRV8bE z-6=sEhSxmU1cbJ-CuaCV#;8oM?~)Ry4duQ7k|5{RaoU#Dn#W_8h;o7p$XN7DZKMAL zeHkSf^vyCxPeu!$d(*kvffmywV8@NmG%qc`khhU~xRiIbOi%Zy%8W({<6 zbPc!5iOc@W?Uzq?T9dWT{s?L1k2a{j=e9RILd@td(~{nC^!|QawNLgrhvR+hPBfPX zp;0BgsBZf?&$aO2S4gp)uzN_m$x8F@-&?qM+%dSVsIMd=_gtH&EzZgg^aUsFsjb9QF{g^%41f*=@%&%Fxvd7PkTH7B}i zc?ER=E(zEOnlQ<`5BoW5^Za?Aq7& zGYZ;3Q%98@ISQt>6ohk+5@YXu;`77|9A|_O90)*O_D)b(7a>+K$%Uhk69OS&U{{B3 zQYi{?dO8&O{y&}u9RGOhCKX1^S{b)(3uyWf%j&m^kZpF{yuED6n?Kai3qeengd+g} E0EV1aRsaA1 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SL_16_16.png b/navit/xpm/country_SL_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..874f2ecd928036c503f26642df1d936d064999e9 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^;o-U3d z7QM++ZfAX+-^g^prSn;062s%a>-+nIQx5$9|KGhzXM>O3r$;QRYz9UmveGXbJvK5j YY~RfH_?vq0B%lclp00i_>zopr0MFtqq5uE@ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SL_32_32.png b/navit/xpm/country_SL_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..4e19c49c97d86eb6f7de0b53d7d54f05d81faf78 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v}~CPZ!6K zh}PsOx3j*^Ph?=c>=0%5sv(fQ$133pBM%VhaB?ZCvt45B`TzgFyl$7ftN~a$hke6} wZFA)>ESmB3+--R==9dkO{Y_A9i}@HBW^?nZNIi_)4zz;7)78&qol`;+02bIZdH?_b literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SL_48_48.png b/navit/xpm/country_SL_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..bab63077c5fd8d979bc0b2c9ae28042dd84f8555 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H!hvbYhEuvCPN(Nyc3o`yLhyx1w*BJCk+L7s1q?eRTzHh&1e-e? zRg5<8dU)yG1ji!^Nigw=67N^$?bu?S0uul!e8PP51?vLQ6j@22WelFKelF{r5}E+T CcQ|kW literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SL_8_8.png b/navit/xpm/country_SL_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..45ae12319ea381ce825d8dd4be572d5446464ac9 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt^eo-U3d z5>u0>+|K$spOHV|kow63Krm^6KoQe?repvA{}0Y+&AMH=Cv3x=%HM~Zl(ZQt-|>9O T`6$u_)Xm`O>gTe~DWM4f8)_`= literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SL_96_96.png b/navit/xpm/country_SL_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..38a829cc93f71d3d1c6c6c412010a83bf2125626 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt`7JzX3_ zD(1YskFs@g8>}0f92^%Y1PEww zh_G-mu@cQaHmCS&+uBOfH9~Dkl=)sykpT}`>;JGZFh5q?2lO(7r>mdKI;Vst0Ozbz AD*ylh literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SM.svgz b/navit/xpm/country_SM.svgz new file mode 100644 index 0000000000000000000000000000000000000000..b1f0ec02835ff979a2743810858cb41d5eff71b6 GIT binary patch literal 24564 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SM_16_16.png b/navit/xpm/country_SM_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..50eaf42fdcbe48176c09844dd26c01a707abfba5 GIT binary patch literal 284 zcmV+%0ptFOP)D}x%t iUj_ySEXiyTrX>J^)K67fu-Zfb0000XV!&t(S6Yj`NoQfrH)Hl>XVU!)5+YS@@=Y>XTK zf~Fh0aH|XBLf0A>Caz43F?DG|f-baRgEkslE83Pcdbivtv z`MzJyJvZlGgfWI*mZ_)deLx@Z4*=~(rcvAIAt3c`dG-CPo&e-7pG-V#R`*-XLF(-z zxy%1$0L$!yTAmsgCPRYIDX~o1ppi6`-f4P$qm+`R8wI-D^}CMy0-suUT7i13-yXGPLhtY#Nq-&?1D=z5XvHcf7S%vSdXEAevv3r$WcsuYlRPF;vS z%aJyUdN6lO+pd2^FE-;6FWs=^o~uh)ZkUtMjBWQEEJu`REP7qnPNKVCwRD9hln%i% zmu5|aq@yK^$LxTyr&O13e-ajpcR&gOF|QGzGXoMIDA;61&ARN7YdLfrxkB8(vDT@a&e39e{v~3tGC#4a9JUw{6vx zu$X_EX1~{v+oIn5>}16tm}YbVhE@dtY_!df88t_q2sHC+#R!LuE-|A309dn3g9R8E mgFpF6{bw&)AJ7NHA0Edd?Ga8 zlBm`Q@oXg)iM1rEHA4Oy=Qi(MZb=ks=J_GZ^5U)8aPZG!<{rj`(fUlk`vu>DlLWEz z?`*0=p{+mC3IF)f)1JXS9`D%rk<;n;ui?OAGnr&Fn>9LFH^;dluGj$12Rh?$Pv}Gud1snJiTiA5VqCp*U8`6yA79J{yk5){EgT zlg(-FRu!&#hJxwn+2z?0+O-+@X;{jIt#583(_C&s6xerrucs=(130o0m-ZQZE!{&S zR*%|z)kkKbO$?jmv8=^;osRfEaj2+_?K2j7jU<9S-_?%O6yfc}eX`|M$4easv)X(T zomo|}T+9P9;sUuOFjE5+lU=8g6eE&(zHSu-y;!X)j$}!*9A>^<>WO4Off@yH7_jf( zS5Vm@%z|`5qOBS^osqSe)R;)5@MXKnNb9vdM#3o9F;X%G3gj?Uj6f#=N~$WTouOTr zi%9rIq+4Gtd#$=4iY^zm0!3NP23si|?bC^7T8=R^OY|UNT&ZONxgMnuA|%}yNULR< zEQy7p*2H^n{>&*-RaAoYA3Jgv5*_mEuG3CNZk_XKO_ zwg!&5C@#4va&bwUl#AT4r`fNU!6NZxTn6bI5HG5YS1BY`fxgdE32QDuDX!20=Mtp8 z-3G|Bpv4EfjfI*%9b2mq?&NS7;BCMsAF&W=fXbx8xi<$l>IxVI=F8vrer)T~ne9UY9jBspTld112Yy+`dtq_LSKUA@tkAmU6M&ys!k5BC1yGV6S4nLP?;AL~o zXX-CiUZIBG=&jXw8b6W-^-+;(tDL<<|bW1X?=5u0KR&E#Qe;0pjf6x7=|CFV_&YxL-*u5^ryKom5gW^y5 V?OseTj{|LF@O1TaS?83{1OOZ2L3scG literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SM_96_96.png b/navit/xpm/country_SM_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..c95fe188b1023a6bc5c81de83d18ff0556e8b073 GIT binary patch literal 3465 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 t zf_0mEfMm~)DG$sZ*fTRb&s0=C{Qv)dNrOpRhHMAkq^2Bs-{d%N!iyvZ2H)Mv8TU6X R>j%1z!PC{xWt~$(697k}TH62s literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SN_32_32.png b/navit/xpm/country_SN_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..898f82e34953996803e341107e012abd75fb24bc GIT binary patch literal 356 zcmV-q0h|7bP)#U6#5n*abB6`@m; zpZ#^s(WuBDCzcEVApABITW=uZ6^y1zt177GYp_w602Dabg5Gg%VEfTyMKE1~SLoIq z^3}9kcX;DKG&xX`JifIaF-`vWXOsXEKmter%g`snI7JFP%qwI70000>F+#3B7P^0&m_iFXvT><#s(sznARhIehq!uD8W%CChw6-Lvdgq%cD`~IP z;qXnat6)8FdB)~>VcJVC^!)rIm@mvw(O)6NeBh+)^J0b#4{u(Cwf2I-lKa08A5gdwr@S`6K84|UYSuKKhPoAJmhW@ED=7c=!qIt* zAAY*tRb)OrTaoQr?XESFOdLB_&D`UEYTnA0MG|YdjO;Cq*w%6_icnpWHS_(!_&;H5 p(x&fCy;g|k`8gAg>=*vU#`Zk2g)QaY0${W-c)I$ztaD0e0sx#azvKV_ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SN_8_8.png b/navit/xpm/country_SN_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..7745373fc3121e9f1cbdd59a00db28ab5527535b GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`9o-U3d z5>t~?GPeFdf8fA@35!oxBrVdN%*xEnd|3Ouy81txf7u6t5(kbrFlw&ZG>~!+bb9hD&0j#iRxL3~c8F3zM6?jeyoLc)I$z JtaD0e0svYVIY0ma literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SN_96_96.png b/navit/xpm/country_SN_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..ef7b57e07ee9e1e7b675175e55386d39519b6d74 GIT binary patch literal 842 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lNlJ8{(HJO zhE&XXd(%H#*iq)#$NOitY3iB?s3x@p={V_q4f?o1+;MT|k}84qznE&|_wnf8>fToM zO8$PM+FCAKEiKmBYAYQzbG1xveoUBMX83WV(>L=IpKWzZq?gGr+iWbY%)j2lKHHw- z*RP*bPj1~;x9{!i<^S0QIb0M38XZ`e$Y)H5cbK|twaMIX8cIJ|zhpVbb`o-Pp0lEM>dy*=fW0F_a7VRx|TyX!_E^YaJ?|1L{uhuKS>#*e+@dZayQ^wyrPuKBuxI zbk2=5?V5iVJ5Mav4Zl0}a@A~w!1<1+*;o7Iow3=Ow#Kk=;>EBiCZtRt@1Wg1^RYo$D1~*cGIt=QNkZgg^aUsF#mb9QF{b&p$1!$1&)-~AQi_);O+i|Lv~ zx-Hn&B8V1D6(2*c3+Zl1mPY@5HabQlIQ z1jKX|-E?VNtE{IEq$B7|)P-?Qa+{+&F($h*x|e_0Zx~}Ejxea)))Hgpn%0G?YAf;9 z3760nnT1j{jl`=dkK#Q4AE%CQP4iV54Yo^lUz%<&@iaE6EhbaJynr(zL>OE{pQTMP z;b)EKGi6yKv_@&`YBSI0KtvRVk?=^wV#Y)8Nh~-Mq34s}d-H4I|L~m3jo;3XSBJH) Hp8)^>m^PHL literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SO_16_16.png b/navit/xpm/country_SO_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..6e0bd4cac585911115605b6181e56b810d9aefd1 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`To-U3d z8WWRC-t0N;z?Gon`8D9ufuqNc9Bqr`+Pz|#%I-E5>o83*A4U0EJNeo;Hnuihar^w8 zKRP$?RbKx2TjFIqCcdI)TB{)z4*}Q$iB}+mKED literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SO_32_32.png b/navit/xpm/country_SO_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..2b93a3d3d12abaf21870e21ed2fc1c79fa184085 GIT binary patch literal 349 zcmV-j0iyniP)K~zYIV|47i%Ro!OL{rm8Ef}?6)B-XrU}9uoWTd49ilS_aB5WjS zVIfJimK4YT{|xtD{~}%sX+F@DWY?5pCrJxYK2Q{46XIrOU|`UZ;b8dBU@Xtcz`*eC z>)-ot2z!Mn3%>sR*B&Y%#tT*49WMFm)1SPh&xp}WR1m%T{HJ2|i_bs)LAam3|E*Z_ z;??IrRI`AAf#JcMUz;v`g0MGT`22u~z<~e~QjwA<+n;~`85tOqMM+4h#9F|}z@RC~ z-n8)*0|P^$n+PKV!++{pASuAQb#|L~hAml0X%v#~J#`tu(b v7Y`sdlF^JK(sU9mARCNYFlxc51q=)Tb#PG?01lFY00000NkvXXu0mjfW`vmN literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SO_48_48.png b/navit/xpm/country_SO_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..5ac96439cf7dadc70efb7e81f4e5e508f1924df3 GIT binary patch literal 482 zcmV<80UiE{P)vX@+Gg< z8VkpwW~kB}-B$ZwS8l5PN^^wC#13_%GyUaO0IbkLLF4-xD|Fyc0I0Vo_4Wh+4pZ2^ zMinCg$THgKOwWrh0OU`d>^3C;m~uqz5L-9BVUR1jGe4a9VXo+U!@yZX)g!_Djyc+~ zdoR8_@IO~ltH#!f@$f7@+NdMD|M6gV@Xb$vfBMBJ5hcV!3Gq-uJd_X*CB#Ds@mM;c YSJmEYUev8d_5c6?07*qoM6N<$f^_E73;+NC literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SO_8_8.png b/navit/xpm/country_SO_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..5e0316673d42ae5a5fe4df628b71d9176c79617a GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_cXPZ!4! zj+x0NZ}yyS;5A4Tb)A@yl#-BgMD5|4qmLIIWq!WtK;)bppa1`j6DHm${As*NmZLMi g{-3h+jB&97e*-Exe>@v3O8sEHb_s{q;@BN2LUtZlWC$0Csw#{w&XApmFg}HMT z!&O6p0}c$#j65s`WHTC~8iSHIUWxFj>Jr$>ba(UGHMyStf{Vfy^yH>pTJ}Xm(fJZ{ zOG>Ub$C7rAV2yw?7t+A1UdqQT=`lGpR&`@PS9n(owSwC(1ug%>KL zmO8xr?7%g5`Bbiy(mMf-T8+naAE&)~bH#XWSAX;>o@J+GHU}@ew`*npHWu9)=ijY6bbLJ*%d5S+SARG-p1tu^@vrl@>t;v3?2lJvmi%>7@!H0$+U)3S&n_)n`2DvsvwYBpo%u_J zlsOOQvwc3jTXyxepPS4k87vFtT*+yA(;@OU50h^EnzhsT_3rJCva5()!`k>EQ0?d0 zS95Z|#&5ODebXQ5rj{$Ze^(&iHNQ`yTmBtxUVZISRC4X@?zDO9O8)&{@b5`D?@=nG bz60_flOJVpG#DEKGZKTRtDnm{r-UW|PBD<< literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SR.svgz b/navit/xpm/country_SR.svgz new file mode 100644 index 0000000000000000000000000000000000000000..87bf42090446b827fba796137aa2ddb91e5422a9 GIT binary patch literal 1141 zcmV-*1d96~iwFodD0)Z&17mM>Zgg^aUsF;pb9QF{y;nISC4JR zYiYe(Yh5R<+jSi(1|?EW?!LDi2Rz%S{Km2@Shi{tk)`&4ueVLv<3#4lQf_3WTbCf> z+A}=47mr@51PP?l#e|D<&_P`YgUUH=v zV;5{Q@^z@Bg<{t5o#0bd_Uu>SCs8G}d;jg;9nlU(LW_eiqu0@@M+L6(q`h?!~n%^0iLwV2}%u+Q68w$P0SKNFkZp0wYHE*dgwr$z#3gsE3Zi2$enX z7Kq;`KYrgnasA_a@mSPS6#NWma!Bn@CC`7V)z7cnrZ5_0DtZUlrI4%E`0QyL$?%3A zb$jy^%6N&VLUuFQaIp7c&2yQlQZ=c4yXv38@SqwYo6!{X&yh(%eG9#tvplGYi8|Tw zWqZ5kLUpN4PmM21ZA?@~iFr=V*>h@pK0#hcsefjK^*l^b5Mj?dH9}Fh<}f+is?gB0 z_4AqgwrLEY1p)av-WA)f zw+&mok(vvx`Mj~C20FnfeVYIbj(76s{inSIa+W3ERr5HA@E8DpP+MSS-%aYJ$Pze^ z8?Nt)4eXaW%fG?_T)MO22&{LtoP+Mej`z~VyG>-9!Z^8Kby1d|%_2i;eMom8I;7zq zCXJXd$FrE+Jv~XJp31h)Ox0snjgAl<>6T9GOrVfoF zL_EUItqm~^MUfYo@qBKku!R8%V;r0td6N?}L1T}xfL%dQGcEm)1QD45({;Bhxi*MLGOgZ}^l_hHrB@dX>a@2XAla%=|S4~wxF5e$Q7!J-f`jA>wfvHCLkVN4f{c_?Ni zia<+Z9}zg2w8xT=hDJ-NnbZOH7Yt@L9ECVGSRbR1LBfJ2B`&mmxO&+JleFV>X5 zhO)F~2ExeYx+$LD!AlU1LN8um_)G#cJ7NKi78DZk8TH?fv)j$#9{@8_?{5AE_%P`3 Hc?Bl^xo^{HgNi8 z>X2YzFL-WU{)Ht9k$n$;-n>=A%KXyGsnt|#jc0h^;vJ=|b2Y!5WnQrF$2HM4YHW*z v)~|PTcrF)uDVI%T_S|5;In65n|NH32`kAiW%V*{UbUK5ltDnm{r-UW|+#g?) literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SR_32_32.png b/navit/xpm/country_SR_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..a960293c1edbb0155e1afa9b99c1ce1ebde01369 GIT binary patch literal 414 zcmV;P0b%}$P)Z7biBO~Q3lWK+U_1K=?#@1dFW>_RcB1DL zjZPeixG&%nw}&DD2t#6T*Ad1r>%{s8NSNEH0U!fG<7^(;6Mq9BdxGF4$4cn|p^vV< zxa%SNg2(-}NXbFL1FdTd@6dtp$7TrLkwg1tDyp2C37Zw0wmVAJy0vIlY!xZ>F32r^ z{<@ADN?oAm`(&58yq(X2CYj!9pid4M`1=0F`sRUtH z!z(*OBZlCWR|zA!|2xF%!AUv~BpMm_`99fsApIGo0AmmE1%k_LTHz+sGynhq07*qo IM6N<$f}b9-Pyhe` literal 0 HcmV?d00001 diff --git a/navit/xpm/country_SR_48_48.png b/navit/xpm/country_SR_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..d88bfa919fa39130e5adc4ead349f3a4399c06a1 GIT binary patch literal 587 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 Zzz;hin5^3ttPTJG002ovPDHLkV1jt8*)0G7 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ST_48_48.png b/navit/xpm/country_ST_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..325a84d78094b9b007147210dc56b9d8d8abfcf0 GIT binary patch literal 630 zcmV-+0*U>JP)h0 zkAbo7zr6kRMhjyi7T)&jW(Y;tuCQI98^ezPX5SekNdQJk>TsANsRLw=Bp<>MNj{Jv zl0pO~ND2X&ASt@Mc1ckn?UG8TZ#{W0*6f4gQDkC(uGjjPw)ckY!{TW;y=5{xtL1_@ zyu<@FoRNkzQZR~4*Ylf6(*AD_8aZ@SK$#@f>eT8vbW}iOk(47)%#?YNlG2RZw+$>S zhfV?zu(Mj8wB2q`|NdiZ7r=3`Eb5y8nrZTt+f7pQKlf(&T=nnV zy~U?xN`2Wn!6d&W6ep?F$I2pu1D&6P1FS4YS4z{#21HY}^V1ccEp)D*KW4ge#!d#H z@%c@4VdBK##I>F}G6{!z$UaP*vh@vyFVSwZ{-dW(DxmR4TM2&v)jDsU(r)wNV^5uA zpfq}bN}0I_0M+k3b!1dyuNe4Xc7HK;C3JDNj!f4>ol+0@3n*4f(@6kIb9&Ar@j&VI zShS#7*@8}SCUko QZU6uP07*qoM6N<$f<3VsfB*mh literal 0 HcmV?d00001 diff --git a/navit/xpm/country_ST_8_8.png b/navit/xpm/country_ST_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..be487d204640e4baeb70e860195ef882ef985cb4 GIT binary patch literal 189 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�p4;HR%gjYjpU*UoA zar@GiD%gD0WYuczfeG0F81KB1)|6E2Q8P*_Owm-?Br`7BMvV~G;sC6ks04w?*QZN8k|U0bGV(;0 zVp?WB%`PM44lC9ZP5&wGKB>DeXNetxzK5I&>o zW!58e?F=oCpq!%8P)o#GSAfHh#kw6A>I-m;1S=0)#t}f(6qy?zRTa5r!L&J{UL?<| z>UDZHql{9CZ4X8xP&$}e=@K3{_pQiP4IQ{;&Xa*W8Bq7>@%8;2V+N%Wp|=yzdXm%D z8}Rt_8?M>DQw!P#OYE~U)HI@q2fxMl zf*#yhHl*E&CyA{>S`m@tfqy`X%twae`>Pm09gg;JyAkSOz_JA#a}B@Ky?ef6DM5p! zERu(Q1Wp~k%%bZ%2;^Yqk)zokFnH)d@m7-dR~g2%t=^`;Ry8u|lVXGz^$%Iwme(AE z6h%3XkKvB}YzS*)-ky70;5FGoc;nsOqWGsn)Uy%K283bvCGy zNf(I|^1p!H&8=UXS<$~egl#*@w_AZ>;V_Cpj>$0|1k@!`8`D7{A@C1Bo`z>YF*x8a zkyS>$Fkyq^ifmT!g!CTan8ypbA?c#0JJKzXvXko0HpAxW+G`T1ye(srDr$-NERwd` zQ}+g^*ZcL@$l04NW`VEpC>oFo@TD zk%C^6_;AahD^Vkp-gAdBo=K}|yd!%@^DrrFtTrlfu(U|d1B!66T5CilsE$>5$I`P^ z#_+?EN5VHf>uP&IG;6!s{$c(GT*`Jln?Nz%j$@e=`jjPmZ#7I{Tut7$Y`gWx6_2CE zhOdSQmNd^mhg8y9958vR2X+~9=~iK(ADt^Y`4cCig>COlA#6DK2X!LeXy|xTw5C8& zbO-8QHPb3RyhZe~P$F&E-v?rv1Bj%vLD-(z^0(`~kTOge0*+~IavPxx7w^EK(c=Ay zdV(3kZ5x_TG{ZX3XIHLiO9NNJBpi;u9?LYHU`3itN#T0pvZK(j@ppNCPpGkmIwZHLq+=YAo|+p|K;f zp@X4hsnecIK^S}M%%_M5ghRyhQ2v5dTK9}fSh@OwghLo>Op18`0u=JR#>tLM#&-9y ze4pbY!=@r3Xzr!Ppdw^eUXy^^@Xm9|129@pX;Q>2cI(>7tHPKiex9FG_S<~ zfkTwWr!!RtP_et5p#8y6^&Ov+{e2uxCR^u#MXCLFW4e#{{$k%{ZJQXJ=oy}(uCGDj zP;-rQt&T76;L7|Eq1fH$%Mcd%!$4}(=`v1rD(e254ZE>9x{H2-j;yG2c(8d=_%-4f zDx7HY9fYxK`4e_KTBiRP}>rhql0=xux<^qnjmq6(3t2YysH0X2B}`Nv#y5E7BK&90eYh}>_V`U+z8RKHPCD&>Fb&1f9}r(DX(t|C*d3r&uf_2bCD03T zkxHOCEupbf?+D~k`YhufYzAhe0?k*rEZj0HJ7W{tCY-z%_(U<%|4`PyLu1zJ>K*D0 zJq1QLr^oQ61S_0_u?&x691?W^JymnS6yO{bagTcL%x1LlyZv){+jh5$;tNfeo8n7s zXMa~Nh+uRHF|2&s#`TjjUX?$LM-l!1v5N3*l9wo4!d;N0bfjYi51%xC{eCaZejs^J zvq4?!v5=*eUnd)VTcU%eGJ}UOp?MuFd%O?Nb)g?GT?)$5hRY9KF>pUO{| zZ36f@wdaBeo3!S5cYDG{bR^w$qZpdOS}kRxtgA29jEsRHLm}OUKy1*%6BRVo^BMKA zHWVg+u>p)YB z12l+zQ4>^(zAGn)m!FJhv*+H9wpGNG3ziCdv!IDFYK%M`kl0duy!zhNX)O9(-Bf|IC@t`I{ul3donvE>rCSou9E}@5ss_ENj zHj2hfk{7M~II=K6H_S8QRo=*=H@?G)Z;Xd%2sX)hl&Wm>D3{SV)lgP#FE-Y{nEI^; z+GMak^DReFLnIy%MJjxx4Nu5M?G(y1QpL&RAG9S+t-(fn^u%LS(PoKSfeD_-kdk#2 z&FFco8i4&bkGlUV6Sdnb;S6|NC3>Wa*p6C~WcIR+VpPGZnaeb{rnlMVj$Tkj%tRbl8xff(7?HH~~_=a=o zHK7q|!XM<+4;-8GPY|ih{spvgOHemw%hLBRQT1w6dHcz@(73 zkRhfjEAH82je1^dE6SUM>{&!J*tdqirL;upSJZ81Nr;xh0x2`wMP*u1v2KAO{Mvf9 z3#t=CF2CkNOzZ@zmef@rTPx4eRC{ziV$3mQ;>cR36-`Vn-6_gPF}#H&zfFBw-TsAZ zKIgHj?g{M~2@9@S;9a4#Khdnc_rU5ptW;*OE@L_Fli&aZd)#UaJe`4q#2AR8n;u($ z?J5M+s>Ss+bgnjxVs+W}zxtFjz@2Ok&hH)@EY2xuAZuQ{Hv#*%u3vK&ThFU%5Ztjm z!C%s^BA(cxVrQXk_U!|icB2T$dTFXziejCI8?SF3m#j3>3Im9U&keFoeM~ML4y{S zL1lnjpLTFrmF|o=vo&y8>!$3PKSQ-888H=f(ITfkXAzMxSY>m;(Tu~JGA4A7by%#l zfL@KBR>-hpWsArlwWU-$)8KT}X6GJ9^6C5y(EC^h6h z?MTdqibCTZWoxbDQ#YBe!ClcFwwj`*;xeHi6Xa6k-7>TxK^b^wsuvO6t=v`hkEBPP%quRXnU;ASWLiA<|6C-baO4Wu{e1^Tk)c;^zEbH&fRD3xboY1M0G9WEamh%PvrDJ;OtTK;)oW{)xiD291~u921~XoXGbWY)E{PU#|^-K%t1C|Vp1bEQJYZ(aAoUO`qlyOg+D6>M4cP3u$iWu(M>OJ&$=AzK$0e78 zQM=_u)DjGGAeGhuPkm`5>Iao7_Rl_q^J}IX7$-jad?qt2T7-LCWjO zKUdYU7Bn?s&D`_8xVSntI+qc>PU@(EsH8J|by>!c7bU1x8z1!(Q$>qKy0zQ(pxp@d zmS0=Vz_LMCjzZO*#m}r^8J?Y6FcfYrXv$$G*s_SQ5AEsAou*Xf?FKrss*{NysS`VU z{wY|ey=LO`JNYTJ-jY#5tAqZoqU*u*^xsIj&jje?q3D9FLOU!gFbKPpg! zump1M{dY*uP>=h0{OK;4s)IZ6xCk|koQ*^S38`YLVpWe#;5uk zAcL+ucFB+&n%8qlT%zZ0NlE zP6U4r2!Ag6zQ1;QPyJV>o%+X8R~LM+*tQzzc_@iVbQG%uffYaDS~(g%h$Dq3$#$8w zU)=}yV-mA?O3-zgg;-9(Ah;u=`t#P=Y`dmWGV~nGhvM3r1>4g}IL|=1J8W4pLx#EI zg%9|s0jXqYtQ4@|)1T!`OH*|mFt~uMx8Yw&RfiKBW%AjEy%4W$SBno}SAzdZ7*)9h z0qSMwMC0^5hb4BvO&&{lwq8~?a~4%Gi?a|7!mF{MwAFDMt_^&rX>zxL1^&i+bHu~u zD$tKtypPR?-HGCVGI8M6dF44Mj{PyF27-PeZHj6AFr0au3y=yIi~Ui|G&jY_5s4$= zG3m7>?O^k9i}KWEC-l=y8MX1Le=_U$4`BaAIzq0#qVVm#xKvp2aQhgj(QXnD%sh@| zDu*GF@up0iondGf&DMUd=-Y!pF!W@ca;#ZZ?Y|~a*?0cA{GYvnHANLAF32dn8?pr@iqFWy@XL6+k`OBDE_rw&is`yqlwERY118SfD{I?v`+jb_ z=*LGAv`}VDH23-|V>j1>kGabe;FIu|Vs8>H2H6}J$ZYDfnQ3CmfpY@eEys|t=C`=vO@S0PgHmVld1IfH<;25hfzq zx9-;z(aETHlC%k*pjD#pO`{)L%Y`%tijMiYMS^5#Y{&;0y5ZutYNA7kB{|@o`HOi} z(YI^N9qFT(K}K}z+9cLENR|z|?U4c7IZ9gMvJr6GyG9v;HqyJwWje-}b6hp{qLr7O z=;wf5>+x0fF8w7wdh;KEk!;>_Q?#-2Fj2D>g({p@i7rPYMpE*GSw#726Cw<3v|rV) zKSZjH3X$pIRE`{>>E!CZHpxMv-_kxz(|JulD{ZRXplc_OLMmcGk0zl5zQkj#;v+4x zQ4(_|iSuoA+%vP#XHmXYzXqiW_I=pvDGPn&5PKd`-nItK6Q=!?vCM3)(b=d^)iUs zzMC;EFnj%eQ_E0^Z$^iM)VBl9mW0Ysi~p=oVVl z;m;ytD4XJtpXbuU0%@P!{da5`u&-Ge9k73hMx8E0cPKWJXB)*1+-8{zmY4K=eRhZR zWzn5^CX`n1LQ(BUNTgBb(XAoertaFh3#dpLyC@!)lSwT{$$LFm7Lz=#TPm%^?+5M$ zgwsaSv7u=V$^+)q`U4#GW1PEZ9FETUj13WWSVI1@Z(icSKd>KpoV3HUA->ewkvmF& zK=X43{{$vZPr-8~SJAA@=fdo*gDZAuo3Q)R{4|Da`jRxEADzGYz*N_sQq_hfW7Sp& zbT84&rkO=%d1Y@fZmOZc^^ssv>%Xy!;Yry9hNs@|ev{u4nAYzjVzu6BCX~b}H9$Et zGHE->dv0Z{vEWG7j@ZfEudcjcEGaqOu~$1nqR`?M=u?zfn^SC2|2C7-c~8|i^6oAH zEaVrii6oir8HU))uXMbeq(S&R36yiDy5=8YzA#|84dV^Rf~A^?n@=E=G*Sr=4V5^q z?~;W)hl3hD0)xIHFM~@XRb&qQ2BQobmW z8)x<7hTqPQ&^EjN7V843M`8AIf=XK)hQ(H4(mzcvw7{>WD6aq%+0e|$r{Cm4f)lpvk);Zr;3^$(X4z$I&g7;SvTv#4X~of%Ahjt4ekHZ?7I*rN^ZE z$BC%t=i@5=TJG~!o6-*;0Rt-oe&j0@jbq{XJIR3rR?9Grj|ltN>eZB8I>MXI>AosE zmfwmcnzDB29&+6$QVl(9rm8x&e1Y%%ENy`1g%0^uhB?MA=~^!b^S#c=DYY3kImkrg zP@m){MkDy2R7v(Ebhud)XFfQ57o2pC9mjiH?BM z;3Hs7;VUWs3X-3BUjCdENo^IIuVX-Cj3S;;1+WWzMQ;6PURHl+*9_5m&1obON(;=J z<$G=O;2P(#q4_6#@2@3Qsgm%Z&G}*@Kp2|gd}BUhO1@gN&`bOOLI~bVNcjU|W)-5^ zCslThSs^vlEHUY*>F(ZdcDEB6^G0IVZ&-YrRWQOlTIgu@YOJ~U&Apd!mas#RS)bGu!qCxidQjrX(}V!DWcaL2L~bI2OJM|4X#1ZDQhI)3%W0tOx_mn8s!%ow z#BiEHknQ;^N-Tnb&oDQQB)zgh@kP0jH5_K}UC2XLz)!zvwJD3fOx7Ag7)uCB{MVeGk{vg6~n|_(O zq6td2A%wY155+ESw-zDcG6dw+j?BT5R#Fw-emX#EUed#)lv7Y>;(NUPE5N;n`Vkit6kRg@@EXx_Lg$9F))86TLY{g+u ziX~V$8TW97vF&clY4dd^Pk*HC_zoob5Rz|7Z7cGQ{eFFe@J?;Azh`xZjw`MzDs0PS z?Xd~E>OycMJA!BSv}r;Txe6KMT8}=Yy@l&fwnbkg>)nj2H}>x3sY&40*H<4I=|>2f zYDRUm`J-iSkL_HL77oL&2)ZA$uebE!Xd5XiA|@Tv-k{zs7^kI0BaQe^YU6^*@cY9v zuX-a%DMC@hw058B{95rC9GQN?xWC$C(9n{<0i5M9*W!L20OQE+O#)Q|0-3v+o12kN zxeM2J(#sij#@t*TqaO##(e;MayzEMdP_ z2>O@ovN8Cyt>LSuK|19EY})k7J;zLBPr3W6d`JAGhRs?o1sc=m$HJz`F!iWXv?A_? z%)ied@deAh!wvBSM`)%~%XEKORe)zRu0uY#oH_d!`Zp6K!Ryu=2uZ}$EQ)3@*rc(I z<=&3Sc%Gx5OzVV#W7t!hpXciY#aqBaO}%YYB~O)?P%KK5PHioU)4K*t8ggSL4wxT7 z#{TPFwXbYSrh3D}n2Y!1(c1J+oqjHDOQ^pIeWsazXXvED`KOS$W0|*^pc`}2+S8l& zmX0}y2NNo23uh+v_7h}ZyNx731!DpTlDK!nSd1Ah*$q?DWUbPV&@D=tjlB=V9=Y)D z7pN({ZhpHFtjK$ol8?q0Jwcje0HrA=39S8;O<;p7WHvSGPhYUda!d6HI?}h+x z3;4;=t00Ut^3U{6M1|(FqoAi65|~#5!b>Jt?hfkm(!2E!c~zgBbNi+088Vcl8@*?M z?PZR{sSWywnDWF9k)ib?JOc=`796W~A;`=Y@f0v$d}WBmI%ZGRvAl&-$2GcL4OZi$ zCmsq5nB~Ne(IQc=9606(CcB&tBjT+mLLHbbg=2&C0Ry~m7y zR~Ng9JikQRgb-4>M;UFIs$zzn`u6YsO)^$h!IQTrIt8cnQ?&=PfMA9}u508U$#@N^ zOS+&CL1g(@L3r%>TH5|*klJHPz+Rxt}R+U)0Brr<31Hr#6n3~ z3$OOGkT!IBqqQo4MxF4Q3BYv2G%F5;O?-Hk=(Emp%3Lxaj*o|D?&y8lMyOW*e+)CV zd?|2J0h6{hJ#(RqK=~1H=x+HpNp{;T!e(U-3=NZf8`MN#ZVgkpX;OSjaR)h0#J!F} ze4!4pr;=sxtW@tvupXxroS;f_PMn|Mr1-oMr|~dYc2++`gQ6`rZojWC}1y?gw*P z6x4ma+X%T;iR7iADfS{EFQ>{?NId|lAWq6dR;*Nu32;!LJ z(>qra=TlOJGBl|NnqgiD*sl+X>`rUYszejypa>wb)#q6VCcy?trZ5{E1;ZeiQQSZK z0$ofnYPh+b+-{i6}JDNka0Tq;U$6A-ezDJNq@^RTz!YBzMDdG8zu^=pT!Tx zW;ApAv&%ui$qD3p-dL@33&NbO%!NM?;|zTC-^Q}D^hZ?AhPaGi6FoS?4}n*WTeQ+% z35EIyPNoSF+HMRmAC~UJIT|Yf`bM+%2JY74WQrc^r=<_(lQQ_DPGfW~69b)y^IPYd ztbSI8zN<+dPiN`{7z4(alM-&xbJJCh4o2 zrUWzZq;uD~m1>esS|v^rD_|W6&SV_ssp4`{C^cf*TYnFGoUpK%PEsoCWnm16K{P2U zzJXR4&0oyYgCl^=p9)&i0c=(8lU}3iGcUeL)wL7NAX_CP#4}>^e}QopQ1?RL$~tNx6>GkpTIqHjsY#a-PGR^Pr8*;W<+EWIhH2y{uy~0Y?-!{(BPg^4AaN06kwTy^w78l zC^4`rME8jCSe)Afd*VnU@S9@FPp(jD6q#3 z%+nOkpzUyT8jzlC^)7#ySdD|LffIO(16`$c_WLVT+wh=kBhn3%BJPp_V7lI|LovSA9R4j)kMIjS+C_1!}vp2Ui zfn(`D2B?=Ioqpz)YIFzvMr*I>jq~81q?_7D{$6JE)=MKl27p)wps5&8zuST<(W|e+ z$Q&ls6h7Me)=j+QDh;o{I?pFSjQ73+YG7GC8(GlleU(2}`IBsd(~2pJs80a3s@7B8 zSAoVt*U;@7M@?kf$sx%{e+7dQ9v@;VRE39U6^%tRKuCW1`j#{^YIUKY)IXp%{&OsH zI&cLp{+eORgt5i6R+`!Z`C+oEk~`>^u{h$**&&jHj?>h~NG_;AM#FdzU3|KAk2i}^kq4~<2v$pYNT<_Ss%yH@?bgP=ugz-WvHQX} zc3@3>w%GptKIO8I#+s;G0#U30omQ(|8aGiR@pT1X)6mV$MxW@H_YJ499*;Z0SBtY= z{Lg5y*hp67w}U|#*lb2#CoAV%>$ZZ5{AihEb7@Y|kLe*CE1L7%+KL~?!>~l>tnpl- z;vg1KyEU_(yNq5?I%j^sdAT9t1sNTn@n%$=cGIBR_Kg>P#bp3-K`^h$E<&7eL6 z_3imB1W~BGwnzpp)gEy$P8l>SV2PY4OJIT^t+qh)^rr`}q>-fhtekOsxmoI;Ycb>U znN68v^%X_&`&3OBqG!m>JWJRFPE^)V{xE^;7Z8|9B5+c!mEJT@pY6R1YfG zAAxnEu;t8e!n)s{7>VmuCDk;_5ss(sSdTyb)m6 zIgT)OWnAANjV`*TnTY$wmeId?L+j@;U5-m_us|SL9h7T`p=fbLF$nq~pIRyrlVECq z6%*`=82e41<*hN=AJn9h&#nRL+;!1KY>?>aMe+z`kMgYtx!KFdY6P>6ArJqJio&qj z^AsbAmXV||5AwA@UQV0SG&1?|MLBL2zse%y^bMY8t;cNfq4h!eUT2fSDWMnt8Ky9K z0y|q?Te|^s_}oiITe`^^QDwV6$vjH1GQMhFuO(6|oERrs@2Zu--p=N)u?rIkboWpV z>B_lzH)L#~LsPj0q_g-2$HwM;5k~~s;$EriF1kiO3K*6SmTCS{t>Nxn5eXc+q)stN zt??G9Q823hGlLSLPI*3PhNR(7((!7J(CIm2?nQdsZ*X*23z!Zkoaoqng=N4W^h()k zQo8nO zW*li|5Ip$GNr5u(qpqQqzNOf1UKG1r5nhwSAFwRJZtnmle>1sfEyjh5r{z2NkVh(d z4$tJsn}p{%9KYi{;*`j^%Own&8jw@Jdauaot&t?_MH>u;5{*hZnp%w2CD~DZXK|2- zG=4T&Nls6PeHdsbYL)cLKj@+kY+~niBen!6afCQ}FDCY0HyGAws(+wQ|DB0-R`5() zO%ySS7E+RSDrBP+bxcA#nyFwG*}0k?MYCjH8IvRJR;At)_lrWtJy8Sag^s?&hi!!p zQ0`t8B+eW{wyQ=USHhuETN2b_y)m1{pf0*0wW*6b@JBo zPP8^mm$^;s#yRd&tez^dtR$~|-~`^nj;4;S4o*?uD9wj-s=Xtt?7uP4|Z2$Xor@K?HkRkw|eWD-wL~AntE>ce$@sFo& zuzC4L&PX!$NDRx?J@ZgD(g)kF*>qh<$D&t@2|F&tr$J!OCulHTpnD*eu#{MTQcQ0c2G?oEidM_tY*t?+ z)dUVy3^7Hi8@BYO*V;5I2^bOcgP#B}==^6MQ>;?<1SKv(7C*N%s}QTjW(1CArx$a# zrXv+fPa#fQl2ftJ*1Z|1ty8MxG$azD7o-yo{w^)fsJ<*uH{W_?~y-CNEuva50&j%1_MoaiMXS?hAt74Enr-s^}Ph9uIY+ z`W4Tn^?v~EKoYofEIZj zm_pTloce2Q6&Q`HkJFi)MY_GpLms+(JHr4>Z!Bcv@zRJXU z&a^UtM-59bVw^C)77RV*g_Wz4pr3+Gs8?Z(>SDpNIQ`zH6w`?6_GCJx#F*Nv2;8)( z%xDvr#|JUsr=oY^?G*3K#GmAw|99ynhqr)GmlX)VUI)-T*Zax3ldIHlNa6fd3F+~> zd%sH@P=q0kRyL6dh_xMEod(jSq)GIcaoN&m+3KVu7m*z0ZpoK|>QlT?=Hs`Jt(^y& zRWW=SU;s6P2wCsQre16^tfuHd0u@~j zTd6xU>*K6D(AQb+A)=2rnt%LO;01T+!ayZk`ei_i=}DzSmVoS}f=M`dK{2H@N~mCx zR#JPgQnT>#L>MqUd7N0Sqzo0vQ_9A(d!zgO`1{YKDQzste!UK`xLjC}%GiF- z`re!8ef%v#kJZN7^m-j2xoYFeEJ7umwAw6_o(w0Gu+@lK6*|JjP3okA)k)o`=ke`0 z+)0+hbvo>?*8vtSG>G2ET0-ZrQliNUC3tfm~)!U8|rKuUWdw z+|ISfH~Xx-^;&XKW%BF;#&}?LmADp_>aps()s%ND>SO^~o^^7dJqmSJ(UJdvRlr&x zMu#!XnalFAY884n%6$Ay!srU=BXAWkb}QUBLwGny%a ziakmNECISRVb>IAMUxI_$twfPVHPDan$wKz_ePnI zzkylbq?smn8L*m8cK>M>x7l=$uu5jNnYYVazbMDEQm-TTrLV}2mBCqwsB*E-w^R8y z+I;*SOnd1q^;`y|3Y+@y)vu+9_-CMw^;Wy=KpF9cP2T-hZ{YS5(n z8zrV^a9z+UMf%Inf7{xW%w?45`>?e-(`0F_@J#F;FDcNPrp6k(HcJ#x--(<3%%(M5 z#qr3ZpQf{~eC;OeLfUKK6mJy$_&W>B8zkYCWxJ=0En)1!!c@r8hroQp7&UpfhA8=n zO-!XE>>{UH%05^zc54eCf0NMFhU7)7q}yZ~sXhy$V8J5vB1z4<`k1enE#HWBcF~Hm z&0RbhQ%l!^ zwI)O&Oao(vaTGASJXszo)10H^`ph)vo3+^Zl3dxFy#OI`@jDFAOHCEw>|5B{_{Wn@xT7--~a84{zoRYhIAK{;R|~u_^)Hz z@^p~&v>sLeJ|6c845?=NBq{tjM9uq=1R}lTVlHA_0XJsvuwNFOtbsZ*Oe_yGf@1z= z4*X;@`jwO}YqWymbTaNXY5G`@pogY7`3np8UnD==UXnAS^@r>)B;oynUACncDH#2N zqLmt6P%gxG4(&LKNP%YM-FT~GXcDiDIfXjBfHdD$n2e6nJ9ctG5ntxJL2}+IPc$qx z{W1=%`0b>!!U8>Ie6W`nr2uS|B^7dB!g~vNCSORL=fAM>%)dxzNq)V5;kL>5CemAz z+_+F0PKWYMx6DaG{G+rs+4OmpZ!@s&@kcusT>l@p8Cbs$;7~+5Z_eB zNrGk09`h4*{_A@)S$dWP1|R(%D3EPf&);;F?Ah^1&lJsDRnb2pp=$V z678y(Rs2yH-6Td=?Q?EkOmehWX|0pknjp5O-T;@Ly_L2uXDRy^bT%2iu5oML*scQT z;7+BXrJ)!cqSerB8=pk4gU-Ij4RovlQe=#&q0HOAkfeaK3HRwNSmjhoRZvVawNmMj zbKwFWM+2Z(JZHiQXCX3M{Wc1fTHl+#h6%K^>2z+m@a@NUtLG4BDbO``vxY6t5pQFdakXwA4)yd^KtMyoiR_Ju< zQHZ#m2Te@$;!D=owtwHKq&&TK5eITPCE{(OxxD9w*k4w0^^q(ZA9@i8zqwfg(+bzab*eUSCyr10c4| z3oSKmev3e{p0r&i!`nr^V`pwVH9>+Wu7Zqhc1lGyQlHk6NRrI0OCn2O8(k9QB-)k)4f;BBaG%f>F;5_0 zSrPPazq%syRj!CRr??{KNk&(M`~+PP`IolVgG5KxdPtJ%E9(KYmcf>T3iI!i^3s&2 zo`lVJiNLJYARddos=J}C26fH1)u2w3t_IV=Wg5I)>lSq; zNIk~wb{ZDleW_Y-s@pqtR?JX^C+RKzN}-t##c$^&baE1wa{-0#tbIE*E1I!ge(Bpq zz601JI*RYbN!i^9N!r_*6xpmbmPWCYKT?tHT)D}%y2WhSiCuP@*Nd#H8BGi=F3JRF zahjG$KNA%cCw0At4@yqZp1u+_yJjmL&aem#ceu9l0Ik>1bc1m5)%Q zB-}S4=Ni;{B=kXA4hE1U%ogmKVjr^_v_ANA`t}ldPLsETS&mKF<#p7cDt8YO;>T%E zc&$*gae2C%fm^KNAARd``OUAl&vf&|HyXKUZ0a*z^$h?LGoOlQ80PJc&dz~5Dhhw_ zognI;;91XnLJZ)py9PA0_`-6iLhhwJmZyo}-D8@dluKdGqLDSb0z0ycA^YFnoeP

35>r#EX)2iv0O>ej_TIlIKrNLr zH*dOc-^R)nXWJJZJSc8%Vz3INC?Ny)dJy6}@o)TpY;NwqcrgJW()HCZUmyg4pxp+b z3{RSY0>=T7l1_)?-}e?>= literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KH_8_8.png b/navit/xpm/country_KH_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..0d64f59bdf8873f964fa9eeaa1f4816c5ccb51b8 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}TPZ!4! zj+x0R2{TSM@ERnFrY0mL*f1}Qh`90OiG+kioo&^Z|L5h|*x1B6_EeOb&hFq~WFM0C*`FTmt bGEoMlnX;$)SbP0l+XkK6Kg>N literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KH_96_96.png b/navit/xpm/country_KH_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..35693910262f27a0387f2a1a616d2da1f51147e3 GIT binary patch literal 2589 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KI_96_96.png b/navit/xpm/country_KI_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..58f873129d1a722cf6195c7cf4c339f09390a5ca GIT binary patch literal 5343 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 N@B=dFOpZeo006}@rbz$* literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KM_16_16.png b/navit/xpm/country_KM_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0450c0e8ac5da3f67370422301ab2c0abd50e687 GIT binary patch literal 346 zcmV-g0j2(lP)3Cxa^Ydi)xg7#JAZ{rk>7J}u2Jv+Men?mevpY|xg} z{rTs|?N>K=*m?i`|G)Y2dJ%5XM9VasHYf-wK6rbdk&#i7UkV~L|HQ2M$7kX50|NsC z6C*P-BQsp|ao?2ldwa3laQDp}B@vZBe}6yy_yi*4dGMF--k&&~bmQeU7G@STF%1oI zEk;I0tFym74&hYI012h4jm5@tW{=-LGQIFSeA^E^su>s<7;XEEA*}zOJ^y|2z^@u= s1M#Y%8i-fTz`(%t|En|csu>s<0JC~y6aKF*b^rhX07*qoM6N<$fi_@% literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KM_32_32.png b/navit/xpm/country_KM_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..6cf30a80bceb9993de9e02cbbc4e70e775bb33b1 GIT binary patch literal 662 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 K&t;ucLK6Tyq`+YS literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KN_32_32.png b/navit/xpm/country_KN_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..ed6c769aae4a2583feada346d429fd9d69ee3df1 GIT binary patch literal 674 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KP.svgz b/navit/xpm/country_KP.svgz new file mode 100644 index 0000000000000000000000000000000000000000..f45c8e8034b77563ea200ac12a263259611cf0af GIT binary patch literal 615 zcmV-t0+{_DiwFo5D0)Z&17mM>Zgg^aUrSIfb9QF{y_HRG(?Af0?@0WI)p99PoXpIA zP8GKYq+UQA5EW+=ZygKQjvUi8|DLfMDpEyIf#_bmA2ZMU&hFY?Uf$m}>Mr%$x@&Wd zbI>ZatFEluD%aPaud=Asb|~7iXu3A#y6yDk#p_qg?OmlLwcX}=Jq(-k#bUSH&39(r z_0@s^U?CCuA>{nNsoQU-0+E>))2e=AVpo^LTKd+?V4dn}J>)u&4C*r1S4~l=?nZs= z`eCi!cYP}K=&DjTb<^bf4H#P%G|nlt?9*yE4aA?o>&+(h>TB~o2_ZG5R*Prl?sM(o z!1&PZPB4~>>d09tu_X6LXVYLm&K~HWQu)MMB?q%_hv&@WJ(y%BSpO z{&OfU9@T!Dva0)4lho>7sv6^0l4!hidZGFQ;LDWyZVG*@aN0U~Zn|b)b?xIm$c5~+ z8v3H$-gNzKuBUEO4Czc1W&(e!wyUB^XXxBptu|fV4sugrmf?e`sllAcIy4+3MGj0p zdLrOJF1W}scw^Xv$R7MGgSi0)^vu=-%QjfD2t;fw1{4A^xEMW%=8*_H1m_)klAbdz z5Tdt2mKNAVLTju*yij-E=>0S?*7qdZ~O~f`~XT!dJAO+002U= BG{*n{ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KP_16_16.png b/navit/xpm/country_KP_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..3682d3577596a451eb3a994e0a0bd3d904744568 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_yJY5_^ zEP9huzQul--^g^pr8A8U2&U!4_X4;l$M-b-!Xrh9CBh7E1O5wuR$jH|Lj~BEue}Zx@GZT6XIw)q5f2BTnI@eN za&*lW=zjJT{Xl=PfY`(s(d-%A!ed0=9y%Z9&`dKJfUr_@T)hIo=8Kmo+eY8pNA%Lg zU;vS`r@_zxXq1;|EG+{NJ)iXqU~IeCzYn?c3012hSJ$Y&Dj||R2&>mK!1iarFxWVm zrII-ZN>ROikB#9BZoY`t-Q_>PI66e^=8eDS4j&>mI)X^0{09KUMy{g|9BiiRB<|n& zb1r-b$o0=)7zoR1PAEh={d>5!?ms{^L*%<NIS#5)@gJ~RT0l7t(ze-E zoF;PW1dYWq_0obT;r|4VwtvD-pF zGKf1<2nGP)OyzK&%mE-ju23DDMAd4Z0b1?{v_u^Bv+7y!R<+y@_z@0ZM2;VO~JppfTh``i1o@-rru3sfEHG%hjx7}{0upB^bZ9#kW z925l^jUl5kP!zP$m#F8Oi{V%h%K`k6FenNDG8#ulKBfb>8XL&W&XF1%%9~5} z4H#{IB#hE{GH+=W3)6eRRa;9%|6|-;o%`0fyE>`pe}wBqtu1nm&Mu!oB zK>mD90Bv*_gg{hQ+A3KH%jbZrz78$&G;dssgmKl^*&=1h$84d#v0=15J$DgRRYqS_ zSL5lv^WWNHV>-b0+S*P#kw8x-jlRCVj-J>x|1)8e-ocm-AiuAIlmKi;M>*Aqe=xV1 zv$JzXxXkp7{gwr=^cG5wPXf8+q>YUr{62)=hc-5nTVgdO~fPE+y$)QW*8rG2?u>euU{ n{6De7lmj?TIe^oY131ke8&~FZ+CN|<00000NkvXXu0mjfeTjAp literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KP_8_8.png b/navit/xpm/country_KP_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..2e609b8a9bb909a1372c05ec87b8c82c67e98e66 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt`Xo-U3d z5>t~?zQul-&&Z!(x#B~DwH<3uero7{V*>+&g6m<1HSt?o9^OCfuE8}!0tjX-St?N% zzwgX}wCvVICgCG8ZftI5W^Mo1ORu| literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KP_96_96.png b/navit/xpm/country_KP_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..24c179d7eef02918adbc6f3028d429e5df0414dc GIT binary patch literal 1646 zcma)-eLNF*9LImg*77)~9A%S-l9T8vYcj`-dG4PP=vaj#KyX_70R4BTsiWzJ6v||&-?FQpZDkcdA+``@893gr4S;)NPmky0Kmxq z5I%H0DgPP{Tc2b6^9R-gb~2EF2ikuncv^E~ePQR1_YODLU6R66MRP5DTSH!c^4 z9Q7mUZ}a2>5ituuAJH7%OWnJ^7rrdZ?5=rBsb+n9J;bteVH@L3#L5t>bigu znF3A@7oIpc?zb-`+u$QsvvbkXWRN#^R?ovqunYoVaLTR@D=NdpyG{Pl9j zM>B`42x(IQ<=q!qFWa(0bVyX_fWKKnZ>o?h4b5>J{Uc4rDua=iL=4_?CxskEQD#kRd6RDnK+F*%@qGQ6M1qscMNtYAcv&Vh zi1jR^JrGFd0z26EY`QaF#a^QS^$DIR3@*zSQCx4CVlP_gR5)4lNF<1Q%kKM@AHuzz zokjG$<%nV3m5&`QQ}-w4R~F+xx}3Nsxz7CZ;|8&LBoa5;VB(Ie3?x1qUm^#znjno53aru zCT^Xs-%DYa!hzHya*u;w=NxSHlkVH)0A(`bnlR8j2kzQm+Kg&0IQhD&iJtwQ;GcmOlU9hX$8lm=3qPJZ78)Q=Tw$#kj&&e?SLYSn8?V$oF0t;aA$_-uROQmKXd8EQk{Q4IV2f>Mf_qMp;zL7; zOoACYqwMs^^viHH866VZ$EY%{XsAxnOeRJta&MKlpM$2ESeDxl3mNST)p{Xs-(N-dxRbIKm0gmR7j}xdE4Dx rQ)6bAx9ueVZ}xL>H_EGE)Bi=PUAV2xwUkIi>jeV*eTn!w9EJN2!1D8~ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KR.svgz b/navit/xpm/country_KR.svgz new file mode 100644 index 0000000000000000000000000000000000000000..61b6112c60382299565368f62c2b2b77bc00553e GIT binary patch literal 475 zcmV<10VMt(iwFo6D0)Z&17mM>Zgg^aUrSOhb9QF{wNy=Sn?Mk~=T}T7suW9J?+4fc zi*?kG9IN)wOOMoEK2!qHvNi6%@3LUx$PQGEdH`mIeeccegN^PFj|J?NuJfvt$QKNu zHgUO&i>g!-%L?x|SJCySFCV{s|M~#+KDDX6LzC}JCNX3dk*Pe*jKo!&>~qz8s16dz zodDtoz-C|?%byZ6W1iNOHchi=yhWu`%EK_E?rp#H(jvhaqgEa_R{#+0 zR8qUBO|;q?$afNd#2SzN3IDl08@6q6f$-Zt1=0bVI-sz~8jr<+v!~+xZ>XkG{9K-< z-8^&{sN-lgmh4>zaKVw4waJmU%aXh(BsN)YR8MWkGCD5nq|%QPb!B3sZkMZt$7i^S zt_g|t)|!3mQ86QA=;l|gz!|a5v`Qr2bo+A3<-($+V{_sKvy)lQ(9RBc747?@=n3s5 zdxQ2w@}&$t!ZfEHdSmQ+|tA|LD{xcEYFet^S`rje}pd{S=$5|IKc; zigRI4HG6D)1~wNyya(a8PiE8hBCf`RIS+;!7q8GU<|V=1K-Xi11q@jBqQcKbc?UfG Rup;VC>_5b9a1`eS000Gb@2~&> literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KR_16_16.png b/navit/xpm/country_KR_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..1c198e39d2fe4b025fdadc3d8ea9752f97e076b7 GIT binary patch literal 526 zcmV+p0`dKcP)Ijbki}$W{iqSKIB7yd2!| z-TU%=_i#&L7^2%KMo$1h2>I7R2myfq1T;-E48wKZS-0!DhGA%$wip-;2HkGgvMk%S zX9KovTb9LfoacFSfkvajFbu;milX%2fBc?*{O$h3%MWcuQ3{1Zr_-s|>ydLg+DfI8 z<2boo?h1(g>dp9~j}Yp-eEs0_3D5JABo&LrY18nJ03Zm0^ZmmwYgxK*^*9Iu0HC&I zI&LbJLI{1boGd~Jp*?Bm7kl^M>rXKrkFMrMqB`?==gwxAU3n*NBZN+W`&;vdzX6P~ zAPD(KdG$x17AG6)(M4tN}lIctJPMkReF*aSJ|kTTuD4vUo@LdUDp?})@n73 zal744CHbS>XBjD(y(iS(K9$x5-}eE4Vx3YNjYgG9rCctXrWwx2G)+}ibzL70hjWxz zmK6jckx0n0Jo`jhmNS_Q#+c){sIo+VD*(h|F;Ns3xDi4olSw+AUJTq&*L_*;GeAe`jDen`dWdGgqBLjoM z(A?bYa5y57h}CLMZ(y}r!{M;Q;ZUp9^bG1MJRXlwDD3X;?&#>q%ggh4JXBh2Zf*($ zg7)_I-rnBg;^OV??Ic37fkvb0>+9q5`6DAEa=AP{ei_)``MP6WRIy%I8TjVAKY#l@ z9#W}PtE;PgKEJ1@N2Ads2{IBd8cC8Ok*KY$&Fyx3z23pW!RqR20Jzxld*zMf$yuDq z%HciuY4UcV2mp?ck5wuailXJ^yUywdnPmzy%pi964vQz85}h%dcML z2&qUUz))4%4_tu>k_sbKbZZrqMvj34mNdcG1 zV7%nyzU1VlM#Idk_da@%UV(m#EEY>B6as)d?As4N7F;(uA7wB(Yyb#_Lf6%H8UvTh zWipwJMq}*t%g3eH89e#waqPipG)_-XyIiiD4g7w8OG}GfF4ybz(P$I^aCvEQJ~wq{ zNdfQKlPUm+Mx%PYUM7>N)oQ;#`OaT4AW2dxmEt%)KR?go@fH>q0Dy%sZO=cye~+EW zDmu?(FgZp(XOtp;o)JQ&$qw7-`LogRP2)bK_C#|^Z6?)D_X5q zEEc=n?(_}E?RJYqBCS@twzig0!=WguzP?_s*JBvg-`|hpczOdI$F*85kH?#sm>>uu zl|XZfIy*bZ$H$dQB}Gw6r81R}h!~-^wsv4(07Yr49?eCotgPg6xn*T#0)arGP^33d zC={2Mms~D)V`HPDq9T<*U#`t&GmFKlsi{e?9*50lBT2HZt}au9e-Z!xpWnX#LP3%K T>~e4e00000NkvXXu0mjf>^CRV literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KR_48_48.png b/navit/xpm/country_KR_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..bfbf1aa650fcf5fdaafd3f28ac2a642d074256ee GIT binary patch literal 1844 zcmV-42g~@0P)59j8ReRKc3&wbzLKKH(td!P4(P!t8vlL-GdK)C(~ilx{j)Vl*20e7@W5j-STucJujslgUJ(Q1vH8(c{04`s?oRX5VYuB!-s;cDVTuDeskjv%q(*z}#%Y&l}K~Q630mX6N$vp(NVlWqoboR4Ao88sb1pv_Lbhv?vi;Ht} zbG2G60HC+GHzOlMBoc*rrv3i=J?E^O%D>HCKDcP*_re{nvlr3n=`fo}Bq}K>xp3hE z0HCw8GbbmfxVRV}klAbo031JleATK|`T6-LPo4w-7>&kI&tvEK_re|5Qx}I_BX7(6 zzdZoke{EwX3d&o$BqF2%w{tVpoWG98jYsc>j402wVKQ278VwU8Ul}| zhS$9@nEzYRgDt<`pOcfrs9okGnv#4E_+m`O(*dc=KaTSwsztP4S}K8iy&`^t^jy z>dO!BZFY@70Cj(dJaeG_2ZUXb;&;hZN$w^moCE;S&Cj_;Wz_v_dTe*%&5wJ^5Fh+w z!o1n>2G%P#&D3!X}U2@rAT$K4^7Li#+7 zb3Qd^CgLC^)iH}^J4X^zo%0vq&5!#VVr0&9+;)DDU34v(Q8+nvk4!zCo_8OnL^Rtn z!iVke2U@;3Yw)%c1<=_v&e=2$wi#tF!kZuWl&#KtA%1ffHy3aI7(i~fyR@{_Znw`w zgljoO0u)bb7@dCkt&*9h-EJ=}E%kUja|iNzy$FKz_4R2qnwcPjPTjC#Q9MBW7Z;>5 z|NN+1TU-13`i6#vu=jVd%MS!WOeWKvJ9iQj6NB+@f3UBp{B(L6YY~Krgzq#v^VsxY z)8p~5+3dAz*XHHr&87VC`FuS+JxNJPO-)TzRaFj$BUoGqwJbMt$Hr*u#}mD?dFc!d z06?qNIvfs}OxE1ooRpN*)6)}eoFW4$l}d?3QdwE)a=ENlYhhtwV`F3JST@y^tj=RZ zqgnML(+5NoZv}= zUat@JxE{JU?dt;TKMcD{YPHUZzwAweMZR9I=Wsad*RNM76a)gnVzJ;T@=+8O2n0+f zv$M04%jHf?Oe|cuP#_S5c>;my?#sikzkB+HvX2>}k6*3n&|X3UfympS$;nABm)q6V z#bh#Pr-}^}+;X(Hw<8ErU0tnEC?E(z5G0yEnh*qmAV{fHR##Ue2-4l%4d%8{L{W6< z(xod`u54*(0RR|{Mk6b2Dn)_h`ilQEmCo3zftgLMR{{18pslUI!qN2j@_s0+9_xmd< zD*F5TNhH#N0|$gcA%ns2dcAW5LQ%A?u8v3~UcGwt=?|=oMk9ehICA6&wm$}t!{MM% zC~~=6rBY$P8HT)GuUf6%vu95{GydEidd3E_*=!jZ8Q8nKc;xf>oK7c`8KY#wy-|GD i`VXGu|HFFjfPM${E1B7GGRpe>~%3cus*1w{rl`<{Rx#1$+-D z8B{#v5uW{aX@7dg+NnVexwj9j_f_aiR%Bst37n$BnZOh|ZRc0FSLgLNyRN@HHHhg+ z$S&J?tKV*YZO^a1bjr0`r&w2ZufA3ipVuS5-mYe)0*BYs?Uqu0Y-gLoxep6$U^rg* oZu{%J%`7bf^PV#v+kcmT-cHYZIv?!50iDd?>FVdQ&MBb@0M-s)O8@`> literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KR_96_96.png b/navit/xpm/country_KR_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..cb542e34cb69cab36c0463babf6f6b23c62e47a6 GIT binary patch literal 4542 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 HY|#Gz60o@o literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KW.svgz b/navit/xpm/country_KW.svgz new file mode 100644 index 0000000000000000000000000000000000000000..439d148acb529ca906e72b02be5408558d99b0e4 GIT binary patch literal 215 zcmV;|04V<-iwFo6D0)Z&17mM>Zgg^aUrSdmb9QF{jgL(Zf-n$9_ncxfZjlaP@F!Ff z7oI>*fTeAMErEv0?Jb&!E8}94naO)!@|D%&-ohyQL0iKyO$b4l+TOI09Iu!2dWY39 zDu+=*AkDy0IoBN+^WG;uPi!w)Mno(S2wvZu3Nhh>poEsnaV+Lz)WV`d{FdLxw R&CD&2(Gx^sfX_7n005T7W1s*4 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KW_16_16.png b/navit/xpm/country_KW_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f7f1cca7f8abb13bef518dcb1ee52eb2e1de284c GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`ZJzX3_ zEPBsQFyuPqAmVaAZ<@a13_k&G?zc7#+YP3F;D|eLO*}+eH?+L2 zol01EB2TK`+~D&J`>uxvF1>$PJ*$%K_#UPQ{~BHjtuyy$aHwl631wv1V0)nIIZr@C zE$2$ljpzNP^BEepe(V1F`Q`m-_3Sgs6_1HLzj>(sNZ}Qgi8od{{&Z5>SiB?W0%yyX wduk!?Ccg;CR0}+<&9lHgu{lp6F0n!V-4~T@k0b8L0G-a@>FVdQ&MBb@07FZEXKtPf zFmV+IK{<2tM1WqwF%4@X<}rW^V|gky2{1YUv#?HEAooOovAbd@l>1*9z;_Fd*K&uz s$gTcYHp;!BVh&&*&uesSpkfYi00j^^7i#tRg8%>k07*qoM6N<$f=DuoTL1t6 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KW_48_48.png b/navit/xpm/country_KW_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..c1f7136a1f2800b553316f0bd7745edae4559b5e GIT binary patch literal 390 zcmV;10eSw3P)I*eIm46M~(t#V+6GXLi3d&YfaTJ#Y^*rx=5~TTCwz4Hhr&xE`bEvrTF&etz+` z!0ZY=%a#EE3joV+d@V5+R)l8{Cc z(nvxYNk}6JY4p?+H?DXdUIb97P(Em9);$%cxe0fXT}!#i9`}wz+MrwLp?`R8T`-l3 zR-w5Y%-tZQN`=3n@aYJiNlH3`XO)tUuqnh!M_6l!n2ykFbJG!;d2TvFEksX8Fo+`^ kA&Vp(A-m5HVn|2$16%q+aKoqrrvLx|07*qoM6N<$f{|&Pd;kCd literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KW_8_8.png b/navit/xpm/country_KW_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..108eab5d401526b022c1ee0221e60d509ee80aa1 GIT binary patch literal 169 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 Z1^|J~k}FYTKvVz#002ovPDHLkV1g^0->(1w literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KY_32_32.png b/navit/xpm/country_KY_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..996d7b4676b8342f6ed963775fff9ab30160db5e GIT binary patch literal 1150 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 QPXGV_07*qoM6N<$f@;$u!vFvP literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KY_8_8.png b/navit/xpm/country_KY_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..646df5d7ab2ffe1862cce579b5db3ab29c5a0ab2 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}Ao-U3d z95a*e+_Cw7?ZXz1Dh`_Hevd+s^|=EJvTo_X(Asl0CZ z!NAC1iJ?NH=bP0l+XkKIp0}) literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KY_96_96.png b/navit/xpm/country_KY_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..b4d3ec909416fc9c6f67c43dfcbfb321bee4c4a5 GIT binary patch literal 4184 zcmbW5 zbX4?`<$%^mAa(mj>qf2@Tr@`bsX=x!fd4g7Zs4{472Uv=&z`(`ckNFhie0kaoI)C| z+881q?y_0%nqBVRNmpd0&3xsWguT&MJ%IKB-@oG0X8p6KFv;C%ZY^!MKt+GJhnrig zQpeUoED52uo7=SmbFlI2PYa2LdWcs}PVcAY^mTybqObMup4i7*+OIc+`0&wsh)bX& zt+$WUS<20*0ShQ}ac}l;C3MC5G0?B4$2K-PTXj~>+miFf<(ZmU_ClgG_i|4?5#Znu zqOgx80$#0|D9SkP$cp*dqrw*TvH3DGz8b&QP1Jk&?&l2#TQ9bLfaH`)p>SjZz;za{yZffI2KAm<3k>D4tZ1PmYsE~w#{s>Z)qS^%>G65z zba|~jXEDRM;2(aP&-)flv`3&^kXBYRi@cJTVzb$@22F^w5F z|0lGDh?9~qbP|Tmmf>2`T}EVQi*oodd3Q{QjSv%rnz(vweygj+3(5+_PFu!vaVZu0 zT$Y@Y$MYpgUyllu)@vvmFE1BnWkRk6#Kny&wGRqhq|Ol#KAx^G+I>|Pm5`u+6PZpI zw?t{8mQ@8D!_<>MkHr|y4>S*$+G@5qi}^ah;ct{oYC7`76F&E7*CjmLsg zJ*Z1Q>ST>inqbD)W?fvmcxr1~FS<(04NVid#0r?0#+I7ZDs7|FceaOoeA?oab$_px z7Dl#;mv5IPSd|Mudl`UiL35S0sWwM^&lorK50)5jCy$5@9~dNi#=0;WLkrmX}qY24Nyx^Qr5Bqw?J_4Rxr{&4oYZY$Yf(JS1w*oh0i zF|SF?t}eOnNz|2L8k1$Kk-E%3rN&|W)Z`IG$;!gQym}&(qYY(d!yEeNxYH9mGI6hb z>MP&s z2IcxEkT)ea2n>B`o_P2uxjH)#N<|H!a*mKbMPbl}%m_ZDCmVan34f%utDKKtr}KvP z^5tn81^FkYawk-n?F^ts%bi8c@RjX*vJ!%Jh<%%DROqd49TAaDGAY0Y(k(L$jY?)B zJhh^G$?%f6aWq4?m~4qxMj;8l8uo~kAavq|N5Ucius~$JU*!3Te~%JoKR>?QWSlB@ z@4=AhC&v5K;CUFDZS7pypAMq;Uf7tJbSH8Gp%lc33gOAkKhzH$rfa%GgbB~jKCiBR zVx6wD-!l|KeKMVA9n;Vr7PCy#pU%$B{S>I#z+GvzFfT*7cav0?baJ0KyO5<}>>jRy z(-B^~K)t`l7;tfH&Rbnq8yWf3wK`Z&zYT!^I(U$u)zqL4A{iNT5h~2FdwayMUhU(y z5TH0q5|im7)7lID8(QLhc|9$1R+>RpVrVemmXS`hudSdU5E|$Yg~MY_H$6Rb-0t-D z-g7wUmz9~>?-xo->%%zZ}Zi66ED`B1aKLcBR&b*g)e&keP%O;|xr-}ABXVCk0f`YKf0y%zl1QLlviSQSr z6Q^f3?zG!_pOsQ@ldveGe*?hhYGCsy^L9zEqI!3_Ms{0ziXrwmJv~20=wUexe3;Z@ zVZsGGz+Y7vQnmQ}0q&*Bwxg>Og?IS~o&BEH;d=_W!$wu+pI}+v+z-6OVF91DT4%ql zC2wDlwqJbCq~O=8pOG9lc{=L1Mae_S_e6z#?O!{^c4E$d9p!6nN|rde$-B6_RcLAC z*$R5f?EcQg6cQU{{ucDajO(cS(vPW~y8Sc|USC`5IgjR)z1bs|0`sN1EYnUKIiupM zPU_i;$nQFewuEg{Jr0Y(3^SnV2>|*y|CyPCJ6!t{zNPMa(_8J2+12j4b81<{X4)jU zaW^3IZJqho8XQW8HzwNY`tto`Dum4i?JKx7P zJp6T5c(Q@U$vv_r(YblS)iSDgOJ0hgV`6{OpRBnwc1)SP!ZVIk;;%$aUz0lxtM?^P zIRu`#EM-XU6)Ko92_R=THw%C;fP1dy8}{#i(3| zR^~l!e=BA87eh{klEm+bPNsi8n^V;Wvt0fZ3q~0KDuA)Ctc-qv+rBr#lv@ly(wu6IVsFlfgX5pRo+8V} z?}#zZazA0p{me8T5g3-VHW zv-yy-j5Doz54jMq3Jk07A+~qiM^=-V!np>$0go1K><^i9->rn=%Qyqd50*h8D^Q`5 z;cN?9pq{P5v3-2pU?b>!M+}ncdj4wyNQO7RaBm3qzs0N-SmFa3)ZZ2~TKHUAKHXK^ z;1~>X3Gmb7t|kpVpk#N>N-z{M1(ZxIy_?mKP*rc=3eRD2;Y>;JETMjpp?PE=r{Px0 z%#WYEz3L_M^R4`=6%8wKviH+R;)jln8v>S9Mv~hsPvw4$l}u~iW>-FxqG6ZJ*V9gQ z{tcyjRXTSCbQ~`n_U=+7WjfZvyc@rGoR*Z_?tzrM z+(Z75O4RV>-+ozV-cQ}p+QN-qUK&TAZ${}0GRF9?Z_Sdlvt&GJW>5ER&*|~F>tn25 z#(q9sj`;Z;rnU5xHY1=)QsQcCLDA4r*#qYpu2XA19A5!rQQi1K&luEjvsWWu)?<8N zt*akQZ>aE1u55*nm}=8Khclomf8FdOofX7lDepTY~5ahZ_ms zzUjj_TQ_X)IE#PCFykmD0p`;ZR2CxX>CMbo7Ak%Ul3ZN1)WsA~(QMOlti7b$&GC^L z$|3@si%F9dm6;A2NmTKe{Y2g$HJ|xWTf6w8TP!jtIbXr6E<8nfmV0 zW(%`Nr``_g9j6y!1DO@O638gQE4S00xx78-YgCv@0r!0K=r-er6U(8zhG1?wjw)Q{ zt~U?^QnS4(44!9E!fGT?lZ75C5v}Zj-G<~t=%R^uaDV@@nawgfqH}haXMbcs`vE;MP-*=RU33dW4rmP3&h(QZ zx9uG}M=%*0NldK@@pjMB6(`~Y@h=Uab%qJt|IT@*ug>g>uk8ZNwTwGK7Zqu$`$43C ztk*|yW!!Qt`Z*^QLS9tI(+sgq5`fj-v6U!Ud%(@@tp5~tDW~CRqWeJm-0{kO#bxRA zA+_u5ztNo&O2wP9MqG-$S)(jrN5;zX&2si=uiMS!c2M|;*%NU5f15IbNgSS#7E?WG zL>&~sb5U7a7|paAa(u$|AP%rHjX%g}D>>WEt&_U-G~RN3XV_aXqkLykAdoiG&&~4) zE9&IfeZf>t9v1nr2(zhvebY3m|KK&D*V{!YdU~k>3-(t9D?5MyWT`TOagK3-%s(g zxBWEjvhd>ZTgGwHgs5D_^J2x5!;BL(@g@SbyZP+Tb~|w%ZzZ2>U6`32Vd~dWMaXTW z?w>1MfL9Wh2)FH+kC*0y<|=r-A1IqL#ITvk6c4hA#PYZWK{z!$?{G?u%KMItMh|PQ zi%Eag+Y-dQyS!%`t=*@GuPTbR26t097A4FfCq(AB)J|!EGq6rweLkaK51C#xKam^J8cS?EY Ttl<0KRRBQMv{kEAtit~f%_%Cw literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KZ.svgz b/navit/xpm/country_KZ.svgz new file mode 100644 index 0000000000000000000000000000000000000000..78a1f442021be6b4d6f4729464d6755c91c431e5 GIT binary patch literal 8180 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 a_n7L3E%mYfe_VY1oBsplASb-NW&i-(4-^0Z literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KZ_16_16.png b/navit/xpm/country_KZ_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..6a76d537bc389ca2c40aae77ab31ff68d34ef649 GIT binary patch literal 377 zcmV-<0fzpGP)=F1v@VzDS%1MuU* zw=QH-n*)bu`9PUxOgb5v6t}I1w$;nMY%pXCsbzaSK6knT^cK7QxRC|k#Tn^JGO}oK zYCQcuaw=76>MDQfx7BBf=MyPTr08(Cqdu}10809OW7L3m@zoLFKn)||VO&iCW4-yN z%S%6sDz52Y&07Et)vG6Vwo;wFCjH&*$Bi2KE=?Q>wkUXx>RCVtK1#{xGCZrPX-)Yz z^J7UD2Ed-SB^`Ns<2F1J&|}oZiVT~=DHSv6Aa)0_yE+YkBjG^I+`n8I*J11b(*S+| Xv65??yHO|V00000NkvXXu0mjfxLKgI literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KZ_32_32.png b/navit/xpm/country_KZ_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..ba7800eae54610e925e8d50e97453a1e50a9f8f9 GIT binary patch literal 818 zcmV-21I_%2P)0etW{6U&0}uqh+O2$Q7LH}olLY74Z03_*6_Hxl_``JFR2Ev4H{TY5y zP#^|Hcdxa6M*X`x_nGMQ3xCM!3{%IWaM*fRRPfGt%Vs!2PRplMb6jj(>$`EadZRAe zr{q#mK~-$;qczPr`=Ez{i*6&m{=s?RQe0HfHofbn?;l;?1yZB~R$tl8^!B7`hAb5o z8a$CsQ7?ksAh0W97dxxADRC(hD71A1gAR)~`{h~|F(%pyNyO4;C(Q&<5tKqQZng6T z06<`-EaF0C?u5PUBA$;Y(#+#%(n0*Wd^uzPRY)MAW%dJg5TB6Cn_RgSOsAQf;nzMp zQ}%+$T-Aq=076zFR2I=o!GzViy*<@K!Oz`GWbj%KJW38-^cs)jgZTmiFX_>hq?Sdz zFnbcRHch2tyq2ySrY+-Y7QS&-O*LP@pql7D;R9JjBRY1@elqPWG@_%U`hNxe!tD9p zeK;2#Sxm-q1!7Qi`-Fc?y~-jM&FE=ose-Ud+t2mzq8^*H-YSm2v7bJS59fE#F_jkg zD#DuQYbX)T1yLo!1AR zCiS0se!m->neCo0QXM-}L|YS9D;G_Sob_jB{h5NL(+~g#MK||*@X;Xvyfy=-z&w0h wNC1bd)h%{Q5(onSoz!2M!IA{@$^Tuy2RP*_qJ_3FN&o-=07*qoM6N<$g6#Ty%>V!Z literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KZ_48_48.png b/navit/xpm/country_KZ_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..f5d6a9fd87faa15f53dffcdc27022244073ca0a9 GIT binary patch literal 1531 zcmVti znivd;JP<;7L48%D@l6f!_9TWU<0G*W0W~2aRU-z$iiArq^hPO^ExT>m-PxHr7avxk z;DdW1*?vzu=j4C#%bsuk-*?Us96f`%6tvU;4+jN6ptBG6ev~jcfTzu?TdW=l`p(^* zrRD(z(99+-c?%j?T!WOF2OIz=>UrPUN}3|jC1>IQrd8RL^4r=hISsN~W)L~4Dhwh@ z4FhC>6lfERO)Gz?VSp@94ZS-g!}I9fQo{h*9O@NOo0@)-DSQl+$gh=Wcg%>l^e{9eInX!49^~HH-@i@ z=w|CeQ9xs|x|vN>(NtbObjn@cCn67dPbEzciSS8hMNvQj>I{o;Gn>fEhqjtMt$ggi zP3BVL`t#QLqJWn1F-Bw~%{3DvG!Ed3Y|uak50nc}GfCJL(Fh<)69od<+Uzv@Np1-p zq4Bk5Z@V!pzzo?2K@qOyGb_!Z5m~D=Jz+mN zd-kZk+M?c|2(Pm)hv{^mj1&T75w9laLS08^Vk+3iM*w{1wzn9!zOdJ4r@pk;J;o=F zWjX*X=hw$%4cB?M4;+AxxWBrKJB-0x1Rhuei?{JnMr2x9o}!=iQ(nFe&W{CDME14dE$Qswl+KX;O}mWAiT$Gu4btFOv+XpqxR>m3zb zWAqu&r<~<~i6#vaqV{Fc7=)cK4YE1Z$l^n?Zb}7mG{%op+twHZ0(2pZ39t*I=^JO& z3FpZ_csnB2bByfUrJdPVe5<>9viT`!fL`Ml!L z_s&X1=o+K%aC%b#H2(leP1hTj`$eRQP39;|!FuiPp0~=o%80XfdcR9}T$S&ddOf9l z2mIf@l6WeFQx!pC=XH1;6ybN0I|1x0`!%i1ADlLmc&m+p^WLIyUHHL+ z1DH@1^L5~+tV-xWzIp<^&wsMVTl8-5$b2@rr|i@@(X#2z+eHE0l%W6|Ms$uoG&?lN zw)mS}p@Unk9!K*-sm<@DUYIK4nt%fcvD6jOu)-KA;GhT~qmB2IJ3dKn89 zeV`@mMgxmCu~@;Y{NyexlH*=b0C!YyA-g@P3VbgfZBPJ|s1aEgq=l58M;;V_tNA=S z<7r-M7$BQNmDH}H={a)gNdb78b!DC!5w#_!`3GoN*0u4`TdHa<+~gA+J#%lT=E|1c hgD5!-=HS<$zX2RHXfB->f3*Mr002ovPDHLkV1f?-*aH9n literal 0 HcmV?d00001 diff --git a/navit/xpm/country_KZ_8_8.png b/navit/xpm/country_KZ_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..f8ddefd32410777334a0319d25ce62121140c086 GIT binary patch literal 209 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 KL4Pn80RR9bvtFkF literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LA_16_16.png b/navit/xpm/country_LA_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..19d3090c84c0fd6f90a3198f764f92ce41c145a8 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^Vo-U3d z8WWRk)K?sH;7U;PG>tXcAkk@^*!AgSfq{WR&96_*8q#;xnBJFpUs=26_EoRR8oa_< zha)0q+>D6)rR~g_E%4;=rI2Y28@7h3u>Rb^k&%#+;_~d@|NrwF+REkk$L;^kbZB4I z^PlbK?{ofMxS;mxd;9wOzyE@7?2`(fHqlX;IatJhgArfz78VBfdM%-Tewq0|cQJUn L`njxgN@xNA$Kh0I literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LA_32_32.png b/navit/xpm/country_LA_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..3ffac30aa51d9f429ab188b65c53460e7d77cfd7 GIT binary patch literal 361 zcmV-v0ha!WP)~CQ#z0HJL{rm8Ef}?cDuBgE+=;dp5U-Svhr`uM^Z$Q_ z-N&wf{`!N;7MSZPZk(1OF3iWk!0_VDC*RCzXRbUXMk7&iAS%SOX<8=4bOr_n2@$@{ z)3byHxT$7Ad5XK3FfX!*ga}_*iW_w-U}R*B^)ts5$0|sU1xm6aXwHWKNl|_UX<;f@ zASud^OG;W?fC?5+2nbv7{Pjm%Qcqugpn?VW9>00@_A^$CA3S|a1q=TF|G#+CNlbC9 zg5+4hz`)QsXD6B`UcC9#HD?#qEO`Cyi(l6Cmv28oxX)jI^v#_1_QO|V^fEGNWDui{ zfq{XOgVn)Ije&vTz^Pl`fBYs=7YP=S2N*}&MWYssTEGARE38xX?8`&s00000NkvXX Hu0mjf6rh}_ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LA_48_48.png b/navit/xpm/country_LA_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..64766b2b5e2ac982de4e2ddb4c91cedc09ec2408 GIT binary patch literal 500 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H!okfJCW)qQNT#r-UnxEeBRKb1;f27cOrsW9E{mQFK{Y zr>5psuU;#ioXW=5b~ycA&Ykj?|NsA=B5~rxf{BjX(kwj}UKI{H`$gn|lDghKe%%>= zpB$~;bXLXwR1514emy;>GG1op=GJ|W4!XKJ{kg;ZV1XoWAlIcsGah+uQo8&~`NdlW zZ|0=}<;pRe66KC%D7qK3r@G&KJTWyT<;Z#leud+XK0ZBme7k;J{bBXW(8%c0Nyk}U zLVxzm`EixwQ(>k?=jD@*r-~LG(FmR-sCc-bNJizrY1ba3Pe%V2thPE)c;UDI{f@wI z-wuZx@u(kny#C%!-RtIF@e~QazUFs!b)VlUGv41{`Tyy`%iBweE&x4t{hd{R{MlJ^ zpPyL$?WE6@&(~#-EB^+H|9t&X^8oXSk_#WXzh8S})9zh%wQuusJ=+DVnSO@4vsR42(twPgg&ebxsLQ0Q=YCp8x;= literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LA_8_8.png b/navit/xpm/country_LA_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..a2a6c75a78d7c8089cfd0137a6ef6f583afe4921 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}|^PZ!4! zj+x0e>MM>l@ERnFrY0mL7z&j)Z8&7>`_K4K{MNrZEvHW`n0WBOfdhxme0h1MrT+ha z&KY8VfBxoA6j4@I-W4eD>ihitouS=8aE=Lm85Dr4~5%x_ScbVDNPHb6Mw< G&;$Vb3_X|t literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LA_96_96.png b/navit/xpm/country_LA_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..9e4c1e1e8ace38f05c200dc850edc37f69c6759e GIT binary patch literal 1095 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LB_16_16.png b/navit/xpm/country_LB_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..38a5cc33c81f8f3dcd59104e9388b8c28d840cff GIT binary patch literal 251 zcmVSB1tt}G%)J1)kd620w>Ly-c=Gl2yPuz4et%zoe*Uk2zX@n~^W)?Bx3|Cj`T67T zFLox@KmYy`(D3l<%V*!;%5aPFuyQ{9^77fYx9AQ)3xrqS-=BSR(|SvG-ib+n|NXuA z?hb)a66Fx!X5p+iOpxFd`uXp-o}e)vGmH_g2myZOzjZ**s002ovPDHLkV1n>2 BduRXv literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LB_32_32.png b/navit/xpm/country_LB_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..69b984e17689e53c601ae09b2c41180fa7757136 GIT binary patch literal 573 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 a&AWtzB#PVd+zNIz5P-45A}h{cCjA4rL1RS# literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LC.svgz b/navit/xpm/country_LC.svgz new file mode 100644 index 0000000000000000000000000000000000000000..7bcacff51738baa7025f6ab798ac3e62a1798da4 GIT binary patch literal 1018 zcmVZgg^aUra+Tb9QF{%~eZp<2De!=U1@GWf!&HZ>^O@ zu|a?Zwmmdk^b#PTN!nH;lLkdw@&5V_B}$eb>7^|Y8Uj2s-@HB!$@%BkO^xnnFzPp+KWZUSAWLPnZ+Dfg_SN_rvyk+Ra zTB&W}x^3G!l~FoEuH28vw!yR6uL}5X5JHfeHw7i7Wqh_fS$9}UTvoFU|GbI zv^>Y_SEo3fE82>xb!jC=T(fGmR;3jhxuT^7P5PZMR9uXCJSPl#oGD{!io#PbDu^z; zv>s}_dKSy)M_h6B{B1`n>8x~Lu~sLT)Y?{@iq;-_j-$TkON1dQjgxc07Oz;d#sDg< z;F?juHdU&p-PjjGQYJ@(e`X+}7P7Q%lWrN44mB8--5Qd?25FwobN>)xqhtGC7KUMT zZYD4pL7qD>|M`VY7ZrD75~Oc1(z(B3)9z_@5p^deY@uD_1CwT`klSw*TmzIXn`1{> z3a91`Q;J{2eA=gM&m4X!X)sANmUZ_Mz;yGg_W#cKZH)$t(gbE zQLrOFao}X8GuzMO)XCE5qY2TdLk*oTp}FEV3E{?He$s+%4twGEqTJQ2V0*>|rJoul z#S1GqJgMe?f8P}TRt<`};tWnvvDm2--Cv^O1#rsbpdB+!?g!0M?q$>Sw8d)O1Hk?( z^0RoBB)JnsVHBcoD2UEvKc2;T>;##YYxxxa16}LCzoy7ok&0OCvSrvLx| literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LC_16_16.png b/navit/xpm/country_LC_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..1bb82139cdcca0bcb80219521086b8e576495be8 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt^nJzX3_ zG$tnd*nOYhC~}}BbV_e$qv&oPKHg1pc#7sM$q@MY)$hr5Yax@GorS+%pEZtH8nK~k z-=3`j3zO9K1y_JhRWuNlZyO^C)S@-&PJ@rucY{ zLfiC&1c6`Qx*8pOHngqZelFFu;NSoAAD&)|WE1r_iPTy6<=?Z59R7Vk#Bbi0cxqAh zgQTO^DzMRA*G(jWL|NGgn-CWXt%q`H0Q)9v=QN$y>8Ec#^E##H zL4+(@F4LzQ0|=l@0pm8tY%_pmbhoPjpnGI6#Vi9)oig~%EQ4_z0t6U93;+c5ngNKY zIK|)E2211!YzBTK@EsG+1{rt?AG9W-=|}j<_G|!fCA8K=^i1L7?+gIfPWtV3JMI7_ z<}9v*9AU2&gkczlVXyTm$1Z3tpkiY~`*D9G@GET3T!5#bwT}B*YmZ$CT!5Pd@avf? zdGvU{)9KusumEhfzl|R616Mf{SsCOA-7h+dqL+2~;;D?H=vOmfdS(Ht0_)l@7pOiX z>NBF0r*-XD#qa>J;e}a|msC)+Fe~^PSb*5@(qkE4F3(G?wI_!MC=Ys0X=k!_x+5lQ z)>vV?Jm?JvU=emd>&3amk}uAQ-DYrw;W-^p6=*e9=N}|$_sK*1Yh#t;IUV3Bl*0GY zPQ0zOsd%!&spoWntD^gNx6Y1F-TCgS^phXh(zXJnv=5U!%T4TC!rcD|n?MB`C0F73=l3MF! zWlH)YK7;8K7@t79)|Jk18SWc#p-I(EBcTX$!Noy>D1|xaRJ!25It*XF{P=(Wb7lba zEZc*Nq`<5JMl}bTBr!lr5R{;hPJ)0|2l19nuzrxVaaBTy_B5kgw*db!ElO@Ko>0mCp1!w`~d0YI7prfHg{sfhp*Ff!^8 zLg@KL0E$UKyq`2f(OxGe$xVl=A@9g^0+wajw%zS^Ez9DMkpLjmH0fGMjCg^xKY?cN zkVe2T47xT9W5y1tA;3<%TrSg>rBVqyZ8bDIAe}%ypLd-8zH%I=P$+Pk#04}QAS(VC z@jCPmAZ4aNgG5vD=b9ZT5rSZ+RjpP5Ahjx8Ta^HyQmIJYR)Qnf>_9q!TrTIjE&v?t zDhCe~0B~J5pU?A{#11q_bS#3NZsRB0IHDln&NY`q6lnK0jzy3fMGx;_;J$%y0ntQf z(*1o!7o1OOj6lgSc&9(=_4>_q=|-ym3`5toS`FIGh4B9cqKWoAZ(t8qCarj$m&@gt zO=1M1_tZoj?QP-V>w8;RjUt}Yh}|L6G#}l?1f${W5d}TIhj}&{3lRFf=jquqqD)$$ zKjlk)b!)Yp8pIVVcTh==~c0 ze(pdi_f-J7(^Lin-n#SBZ-3vR4s^;Nk5${YCsu~S;e|-aZ+|rZuVaGdK$G+f75Df8 TjUh#<00000NkvXXu0mjfy3uJF literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LC_8_8.png b/navit/xpm/country_LC_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..6fdb8b6cfac5b38c051f74a0a79aef52cb1380c6 GIT binary patch literal 195 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LI_16_16.png b/navit/xpm/country_LI_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ea097900ba3aed491f2a9d3bc426fa848a3849aa GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lR*-mE{-7@ z6O&UetV>s5H8>dgN9VoA#Secu*VWBbGV{Az4=-`>x!dwlu8kpl-lythC7I$vi0|3A+YQhtBwmft^FV&TFs z@5K+#U(cg+hsP)9$dAUx#?Icx-iDwRyw6##b_BAs`?O5$$x?`AW_TN*+{C~_W48qn4R9Q-;=|2Jpyh6aD zFa6eSg#ZUd5v6rN^A}rv=#V?Z)E)CpB$Ei%g1A>EaM&Aeb~Ar8V=3P|(4+U!spm4$ zlmT)h5~*wR3}DI899vTX=MA(-D3ksTP!#-_rieV_KnS5td=A+((If$yJ0-_Qo#>TY z20jLC#nqyaT}=Wnuw{U+4icfCUBt_dy1ilU@0cxv`eWt=1DSLveDe9t>d?Eq_hUj} zcVHz9^YiG|mT>y-k3e?&D<12s?s b{{r{~wmw(Z?ZF&)00000NkvXXu0mjf`L3YL literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LI_48_48.png b/navit/xpm/country_LI_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..81270a6dd2e4d6b735e3cd1b902ee2be48989963 GIT binary patch literal 607 zcmV-l0-*hgP)U zF@yjB@{Y;??2Pi~iK4KK<{fq81@%veAr)ctvlRvbbGx)St&<>hUFs7C3^%%|csYZh zoO-;rnv*bW+;tE}Ypa%;lJDQ1#1c?|S*xBjs7cQ08h&)|{BG5I_N4IQ)xp!!h1z#= zYsK2QGo`9SK7x2bfY9qQ-9PkAL()|I_(9&z%2C87v+`!8`L=pJaS*`!YGLWBnRk>o z+b72-LHS*C<(iq&aKq06iv6!WBYl>q1;FR7%%#H9qbAMAg-pe3IG@j@T0`EeWm>dZ|@fOrWIF9G5u tK)eKqmjLk+AYKB*OMrL@5HA7Z^&2<+pL$0>vB&@b002ovPDHLkV1k!W8xQ~h literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LI_8_8.png b/navit/xpm/country_LI_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..6858789aa1677ab5a7712c1e81f19ee9120bf3a8 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_boPZ!4! zj+x0R7uKaG{`&h|UYl7fAt@nY!{j^bv?`cmnCp&p)FUwQu585=B= nK3d@y(90;Da7fE*8Vke4)4aS7vuZy9&13L%^>bP0l+XkK(FHJ_ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LI_96_96.png b/navit/xpm/country_LI_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..0b2550d4bc94ffef3e9163dbd6f58adf59b92fbd GIT binary patch literal 1613 zcmcJQ`#Tc~9L8sgS_rbd+aoPSX5+M41w3gD0-2iBZw8lo}@kcxY&lA+!mM26wl4CR}_+(SD z&loQxu<3c|aNDTvVO=$(E|p^Vt0u?R)^s?fUnO6rQ$;H^*GtJJRl*p?LmdX`iz!>@ zyi(B#l;JK8T=e!Z{x~mgqH|_jnOl?jO=R)(v)#%j8NU(Cw%d0vXz%<4%)}B=QWz(1 zDt|-5rVjxEgRI51OTe}moq+o~J`P5dd|uPqM^gvtqmoDom=27ZZw(*XmJEZBd1PsB z@u|zg0&&`tfILVck4$USt0USGtsP$PxgrP%7sV+}Sqxk{FDh!>w6T;we#gY`9)xc# z=E08BN<^SbuI0*v3*u6f_*cAHT?ytr?D~o2iu|;4xb5R$*@IIvX^JUY$+PP@(m}o7 zLN1+s+0l{VibCsU5C_zS$d$1c&E{BxfYAwe>4OdBc(fXIK-T2qeYSuc6eGO*#;5wR zfAqSa3oFf5=$@U+Pe2YVMK!j26C#nH7aWxmD^{d59uO-fSl&BZCH4@COY`!wbg3|G zPwB&!Qw32t-m+&RI=|WNf-V86AajPdzp{R0rnaX26tFuz=yb;;442DbJ1~H~S_CGMCwzYWp}@J16H}+F*R-^7xY;tpx=r58LDohK zZh|sZo4#{E+alM0N1->KoD4fB5<*o$2MiS@6%#6AM*IOhbtkC3Zfo|#$YjKC*b{(z z>tzrfw6O(+Wxl4NHv6te#O|qoCgWD$rYr->$XAG@&dj9TteM;pm+OS|Cy;*j*7I~I z%hi_ZO{!t+-yAcxF*~Sq)WL+MZ$Wu2NjEqBP>l!B)R>vqLS4iGD(cQv@zaH&4uj0Q zSnS2WWC0WxOP*1~s-snnCK7TzL(i81m17|MP5U|U`W9IDDhUWU(*GeVfj2gKu5$dg znnd{OQ8C*H>=1zg{VCSCTS%Roejq3Jq3(zx|cx3%t6oA9-2n=b+ujN+orvET@`ugxuPvxx?j(EdtCOY zk3f)oD=fary~@`w`*;ZbxxuIxf7ZAi2N_#5BleS**59A?ByRGygy4oZF#3xM67PJC z*H$v8!z4cH$QuQ>{)mOS7k%bLD|c@$XHdTwQCfAVwN|^kLlK}4O3qyAW=kh_aVE~L7IokD7GcRIuk}6EvRIwLX-ITg=Tp^!}>^t@J@O&XeE6_=*z)FoDfmO>Uo`$dVW;PzKl(_k*KQ8)?gPN?7e{2Jjn|F80ilBM0ssI2 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LK.svgz b/navit/xpm/country_LK.svgz new file mode 100644 index 0000000000000000000000000000000000000000..02a31a6ac57b949dc9bedaa91a055572ea539f80 GIT binary patch literal 6279 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LK_32_32.png b/navit/xpm/country_LK_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..33dd0e97dde7f12ad7f8056af7edb613a1e34209 GIT binary patch literal 952 zcmV;p14sOcP)4`(!@b`feP0{rE z(up^=BZ4_TxbW#igc(GyLCfY+bM^nm0RTYacmr{aQ3PQPqS*4+Ek4j&_Mw>FDBuM)e_>8M4}APy=zmq zK6$CIq~HELGxzpp&jd0>h^1z%)U4@yNK!r5;wz71fsdxoZ#z|?4c~E!c!>gn{I7|v zRqf<^MYAlvd37Z{Z}Kt)fUTAOUKR8WHwhn9|57Kq!B}2ik~p;`K5h001}?4P1+N8@vid_?4xtw=uJx}u9Gm%zuF}o@NfS}MyUNv$teL^y_vF-^5r!C`;zR>p^ZuRDH z=-WHO<2!=@kiVMYzI`Yoh=C acKtUVL0NJvSAu8&0000SBJ$mh}`qYPsm_euG z03P_^oxQP1)+`PT*H3>tya7~!a9VBY;|d&=oV8VhLffT=UA(|i<Ejg6Q!{mh}~# zErrUBpn5|OFJ?#~xf-&{Jp>30U+8Gsm&Qr0VjGN88UMa9a@Sc%kyQf$h&(y-vu|?? zit3v755iYS5fhjE4_K%M=utUaD-T~;W&%;HOxYB}OBkUA4<#6O& zy$e-M<7x+hs{uHP|~Cb_a#VJsED+mYlKi zQF`fiov(}Ue?3H46mHg*30n+}m>M#>qN-@e(OA!5xV|&z4hngWByCC|L%Ny^(?j*w zKW@MNQ9Er{2Hu!KalPh1G%INe!bh0C({mW5M#i1V8Mc@uD68V_%(Wkm7dTRg(@Vd* zF1_2UDaMo0%#cy60y+}AZ@>C}_kq{uF;YuRvy4-+`HJyLd*7M4;ByIgK**=4#1#9} z`7YgPfiM$@pfv#9-Ik{v@}J)|?L3%p2L+r~M=k~m9J%XM)Z&sxziwH$=^p%Gta*QW zal~MBn+n9JfB?nH&gOz5p(TOLEYntxlv%O>z}Pp<>vzWP+3k&@p%F8I%6o{apuvL) z(yH(gi+^`IyFvp3pabKS0t3m`XSvLx1wnN&P1YWWRuKd=6}j_eODRWm9*d=y8LLa` zI}>uZ=KZ^~2&w}>-<=^>x4Aqc7$vqWOn)^jq_xF=Jl zSrr2Q-mI|^vuJkgOB0mFIOWU|u)gB+Z%^Qq)+nJUu0MdX>Hg5L_tAFKJk)$3#m!p+ z0|@}w|H=YRX#jwcnjsAU=*G?F0nJ_a5{$}68LLNX?dP_=zr+)U?WTncrxd$iR28)A zL=@YcvgrUuYjQGV{AysDhlC`9V4$gJT|fW;eGN%fHXfnM8^>I&fpi5F5z}PU_Y|L5 zwrDE)5X97wFMP)tn{WVtEMk0=sV$JVBZt!}ZI>vU!p+*&_fAzt0AT)CZ{yRMmi|;^ z)CmCm3axLEh?@p9d#ye-XAKQ|Ca*MLlv;K`Nx%tOjf^>Oeb#1kmjEC+Yl}_THF?YD zng$dYNRU?5(Iie>@+(Drx#4G^-i?`}j8I?us#;3vB0s+9t#ekGwUD&Md5&)!^ET!CP3r^^u zgOtZ{N+lT8FgpWtcYCF@`uEz8#GiR}4gkcp_tEwv@ut0LAxRy2bIRQ&002g4vWV3d zXu~L_hDTklw!F0VNLfVl32N%9kM)*7gKU`Dsy6ts z494bTN>h=QzZ|qfW*m|UKp3jaB3jHCXEu+im3t0dgF?3Y`j8IsX*QoCHzybsXyJxi zh|v~TsahbE&?kRvSg$TrtRhc@$DHU|ri+xnbr@#2$hL!Zi@dl(ApjeN^U5Yl<o-U3d z95a(`_H|Ewd%RxxnEd%T?tgzyojCvos(-qdexEhrL;rr`efxLRIX^ncDcJU(2MBK2 z`A145JUFe*XSmhh%Pjw$oY3EIeRDe*ISV-dKb!hPFZ)wpVAdGg!m^~pd-+~fH3=MY!9 a9>Xgmiz9iP8BYM+%HZkh=d#Wzp$P!|wq*tY literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LK_96_96.png b/navit/xpm/country_LK_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..cf2251826299b60e2c226faafbd5a300efcf870b GIT binary patch literal 3764 zcmV;l4omTgP)G zje{gb0H;Zs8gYxjNm>Vi+dmq_D3UfnfB=aR1aJ(yiQ^+S1Y2?>$I%hpBE|b!lFPmC zYtH^L%jI%OksMjlj0^t$nw|N$^X9kjz3;vEy>Ey}mtY$k099K6tz(;@O|VVSCfFuu z6KoT-3APE^1lt5{0=)VI^6T!c|7Aco;Vp7o9X$ZhSw1}X3;&JR8@7IyYQ=KfmhiTdU{g(zdUv26(532d})<1>PRN=h@&;r`S4QD@dcYdr-}^K z@E?pi+OtQ$Gn`q_)m&2Tr_)rW>;P@|ELaim17& z8bKp(*9*%^WUUhM9s?&u??7BWp8n7gyk@N(aL+|5W8tdhjc0dx`xA|O;})-K1ev{g z6q6?2cg>x*2ZtE0RI4$n5d;9SNn>o%c>Q-?gR_JnAgK{E7SqK4esd3-yCn~55+p+u zkxYnI>+ZQIwebK=XY-U%P+J6T6Qr}0)D}V81nF(8+9GI}AVSBRJhgG{y@&cv`c^PH zSp-o$u`zXp{=W&3Mt<^-uIWEJ6jrU)fp!Vf+t^AZxfXVRHa=r)+8>=g=a9tm$@-ni zqu(7SbOHc0?T>|SGVj08mECNf+8Ek3G1|;Z0yd_&l(alhN%ynI3+y%yq4U@h7qF9R;rlT*h#l2Ao8=32Hv+P9vm{a z4o3Wg5t`wbhRjSufi#rMlK#Q){=c7+j~P#~^)$j3>UEJe_$1`&FmGV+yK zZ1Jk)t?%~jd~CtnpYZLAnLLGoFU%wZdK8y1N=OH3M{Abx6pLwsW;p-h2!g_qXGTR1 z@ef8Yq8uhIUbme2afi~dNTV8rQzAx))p2lmlo@;1J$v5H)D@>cbj+Q%$EJ-lXB{-d zySg%|1>MY9$6Md)USoO{l_&qP}({)N)SPd04odD zCU=pxaDj`qbHDUo_*HX#Uotjrbhc&s|2m+zm2g^MbNK98dorN^!*e?$W2VaY6q4kr z7rNg5x1A@R@0q`BHMxsBKC`Gu5{;Ue{L5Erj1B#XU7ri2=XHe?SPNh(I<(XF_!6Czo_)j?Lrl9Vu^rqV2(OWv#seyFYvA>*D|rzR4()wst z0D#Ckfxv|qTdcl(@Vdq1Dh7wluFkZ;qLhhG2J|A2RT zMUrThAW8rL1Y0@77cl@ZIEtV8!411V>*-B4^e5OXK7Yw(_2zY!t*(FcJw9JaKDGia znwZ|k5|nIWtCRvG#G}vNG`WfZ&^j0afWfE7bQV@o_CV+aS7#=8!@R}un$w_`Ly=?8 zUz2Asi!bl)PFF7N`TVTizp9sqsVgYWtpH%_>INDlh%yK~i=u=ii3n-nJ02=W#MY)< z&+&yjatjn!P<7QDL30;uCRfQ|EnR!f+j%q;n<_`iJB|gFmXmLVV!F0VY6EDFpnQV- z{Xg%{#VE#I7<#LI?4%n25EPp3i{7zYC@Gt1(Mcb8YC>n>coucGXPj-B@%LTnpiXDr z^0tQ!A@WFaUO_OeISm4U=?|SehoYDiy2+S4h24J}Fgos7n@1v`U%Q&L0ko(=Er%jT zdkGM5b!3bVR%c}m){W*JQ9!otp5oI+MZ#!NgRcM18y;ce(}w7jQ4Z?pH?k;%p=qrJrCF`N=>_6V)jprJSG^Dzp+#m0fSyK|*^K@ySw4;qw< zP;3qlUbCG1QCHwEHUMySrRV=*0{{ev~i5yOOxB?3SDM#g>N67$HilbFbBP;cK zLNA>ArN8pAlu-~v%g`c0r+?CU>V>X!Q1|jz_Bq=#H{NIf0H(eWxM;<2u~_wxr7HE| z3fPI~dtr5m!{+hDtCoe!XE$ZcEoI;BD!@u^$rVZ&JU2TKKBmn@IUoKbmsWqk8O`%1C2ERFmAW|tqbUhLz zXg;-|yYadg07w)6!B5+>;pMh`2~bP~fXJBX&1ZK-CyfA*3DL4&mmxR1ghm*7U4&8I zHmgN~yaREIH;+?--p0y%0mo0d7Oq%BLrf`)r-NmJvJqNuW6!_X^5%DTrGqQpck1*? z)j1i|$pw6QfV(^8{X{~MFj^!iI&SJd79?~+-(&OP5e5J#9Cn?2{SJRSgmLtmSC=leUWucnvi>%aAGT^KED5CHTZUub(U z?Cwghy~Hgi7Wp_e_)lZ&jwz#md{%a0WrVMGC7Ib5yfY42I%fTo}pfj@- zI`uYIk(FuJ#A;w|%;#cMAw@v~giBi`2Wu^}ijUM`i+p0nR-OmulnB|fO3BQdM2oCsPmF$K#o_ZsRGq%*Vb zp4;Eg^$}sND;S-n4OZ(_CP-)I_I`1eQMg6v4uUdspZnQ`<3GI8b8OLIUuStzO@fTh z(xI0*g+xHl7csj(d*4%&2cDX&-i9VaHG&8oKk$Vaxg~*L^GcC>1}=xs zoi7*In)b(Bowb>oYLa>PBw8N`%f~#c=44vE7)|JFU-hIKK}_AsmVi=P)tAszH|nq1 zMywh^NV&%sL;)$RdGFJ`M100jvGGi(HVaXWpj@;}N@j^xSA&XaV(N?w00a)@^0hye zYLaEb<+5?$lC6?|s)f;aU3>|fJngVHXXR~G6{toKr58^9sJrXai&JNmwZ7jCgh$Nb z5iZgg^aUrbUib9QF{rB+*Sqc{|P@2{}jm#H>@?Sx#| zkdbz)N+a#O?96JUQKgC)2iOvfu#>d?^?M8$NJCbuZKO8%eCK|?-&SV#7OC=h@)HlJi(^`qHRx6J%k1+={ z9Q9i0=*212?Z6Zg95ZEv5D&0k^S@~YFL_oxUrnY)htZ*dCH!>;R^T?Z?!Z#Gh0xyp z_xlcXh#Tv8;0By39+l!Ot`*kNi)b%Y8F8UJE3fSb6Q#A_l*Kv?vA-boF%?;o>JU#! zb3SI`^qYJMF+l_|vO<(LKo*A>I>8ug{McNBE&_3K|hHXEsDk;R6HoZhK-qfR{Ai~Hc}Aj_u%nf@$)U%c)-hlafFLV?~Ix?=B@~woi*{s$9E#O`7=lw%-f-~pA4_Q68 zNB9_pXbU-p7;if9I_3e)ejn*gwvQ5FNcIcNdhPYVnX-N@Menq6YZqp8>0-XmjFIF9uXWdCGt1bpr`5H?J7q;IPmbl8 zznJ22jh2`T=WIIXEpVg04yDC7;qvi}9k*SYeB%gQ`=9&fBN% zp%&%zy<%6>8~TdKWC5~T)PaqBbt$)LSHS)OLGy!n+GQe-&vPbZI$hYDyS=vbv%fE7 ztZ9U>`D}HiX~|{BqUvATrC~{xxhq3lKjx7ZpO`;k{v84)=i(Ff@9aID*vr$n=kNy8 zUB-i9SsW%66-jQ_vzv|K;}KDmBI3?FT3pSAOdNWLDyhwZF7Jl-??DZ&^ZKnJNGkzv zIkzLh2i}{)96F(Q_&jOw2#ZL&AZssa9|p0`BGqlUxs1_fykLEZKESjO@IU?1*=)?Q l|6#|B&c_@tKJIwA9CN&~%r%`}o1gH_%|8gEJ+(*+004+t6UqPp literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LR_16_16.png b/navit/xpm/country_LR_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d1cd7edde61be70883564ae6d348d65aafb0079e GIT binary patch literal 362 zcmV-w0hRuVP)RuH)x*W-Rom@c^l`x zpN0SwYlG|iC%m*eps6xy2ZzZoP%0@?kEP);r9Zj*2T6=zzOQueNGCi!|*fD4ro9zJ^$ zowLLHDBZhdGJvca!I`7`Dedfu&Q@WINjR`Ff_!(5LO#df-V*0W5AgWKduG4Q(_CDl z@p0A|T)OPK&|lHTt$Dt_yhAp#34nJWK67yF8poRf6Ru}00IamYss7^h<(mM6T65&m zxKZf8iZ0>2Q$=e{ZMlx?`G3ux?Q{?H8H0;R5Cu4Oc$kU1j~E>pLPXG7lNlPIck;Ti z0Dy`De46{t(^pg6fAX5%Vu6L9Rg>UI61R%amixGU?wC1v+Fp*`gpKJLoT+JJ0f5c1 zZ-HbpCgA|6D;H1Jy3%%TJ+o}3DENUnx|MQ8Yu)k=v_r8YXor+@W6~oG(}~cnR6}NV z9QwaUAhqXje}|rLzHjTn({{bn0{Jm^)z@pj4ci7sf=&y>UvOL<1c@vnQOfJIK<3IP oLO>GYYt>v_N(v5Zf6bE6A6ONTY4(i=sQ>@~07*qoM6N<$f~g}2*Z=?k literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LR_48_48.png b/navit/xpm/country_LR_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..668973e118532a5e2f0b84599ee6fe0341b98c52 GIT binary patch literal 712 zcmV;(0yq7MP)88R!(2Jgi z6>*-143UW7mCqdMM-c-Eox`TMy!NM*Z6m(RnUsF0p#aU~+C2126vOw$yNuc?_ z{7y~YH}LzD=gE_lVCOLv200_knd`FLVRXM8FlIJKRMl1TfXM)E#Pb1Yt&{E1jrh8d zt2!^lyRrH7iKa^#h49>R%>ZM=CvoY{W2maWzlDSQ5k5X(hnrDCHB0DlPZzdDTkV#y zM9lzg(G57%v)67HOK2suX?+XU2tlwcgO>1G4EDwFdgd)COY#2mHvoY6?h^`=Q%<>7 z6X1$ub&&PO_F(GyI4H~N_9SQL&^L4$0B})~Fj6ktFWLaDgp#v!xN+~PZZY>GkE3U= z*)C-UT@Q>unZV-rCGB`1aRs6z+b(5>swU1Y<+a~Zxniq~6{_aI)@UnI>5u5zwF85_ zF=W1EwYA7-0v+d1*(%rw!m?#u0G^|$C<^)$S8;dj9FD}h@#w{*w$20tVAq9h7i|F5 zl~8=&Zj9V|fPA5d3%4I4GoP(@p=;3Hf$3BllJxg6sVFLL-hbwZlo@mZR^{s*|9+Lk zqMPmt%dFIVnXAW2Dvh5rZ(*r@t^g83-Npa^5MXc0>FKb7ef$*%JW%|$^!rx&zF$r1JKB5LPSLgI4xoc zmJ$6y<}{uUK+6j`QI%y+_5k5Hk)+%D{T^@@@O1TaS?83{1OP{6SKI&q literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LR_96_96.png b/navit/xpm/country_LR_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..f9fa87f738a9d1dcf4527d51876fb18a965baee2 GIT binary patch literal 1152 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 TaqE9KkL~?m4VX{f^b!C7i00^W literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LS_16_16.png b/navit/xpm/country_LS_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..364494de505c0cb8b924da77845969fc4420334b GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt`bo-U3d z8WWRK0%n|d;7U;PG>tXcAn}r8@{-1n|NsA=vFP>n_30@oJRBScl9c{dqiH$}LpX9^L|K-}vMh>Xp65gaRaNmk&$4V;mP7aRn_%+B_hyu zeHeye7!1RJQwNs3EQ=rr+qU(6&oB&-I&gy|Nyc%UrYVXdIE8jtmSxd2?T)CbI?po@ zgbIQn_spot0rBng4N~{(VD$b%RPgv8&M7zrf6o_Hxny6_8NkS=o3WWqoFSlPE86o zaC(Q}QbSYq0i4^4JJcXXgD6zyP?>tXL(BW#I~?%z;yavY62XVZ-|;V?iXYTZf(|?2 zUq}!N5`=;Tp&&shNDvAVgaSyvcVRbt0rPpcvzNIC=^~Qj^lJ)#}wi&*?2rY91gE-!!QIvz!YLl$g-?rvH01R zNF+2(3vEJ@B&n+UdC&QL7Dds=c|Qg|6;Tv3nauw}mSu;-VPI|Ww|%$UbsT5E-z$n@ z+xBZ`qtU2VtDDV6mgQjDfI+9zsZyzwN~K&b7mvrw+1h28LlANSWmf>4kk6eI`*2|_`FP>>)Le*x(=Eixg9 REq(w1002ovPDHLkV1l3k0dW8T literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LS_8_8.png b/navit/xpm/country_LS_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..ad85404bbdebe5e765f6331a276101cea508dae2 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v}}vPZ!4! zj+x0R0W;1w@ERnFrY0mL%-Q)yt>x>_%e(*o|M!`b!&&v;|Ns1nb1e#+8XFHDI>dA+ zwefZA)+|wDW8;{n!e>`?1+Fz;4*&P}@A{O5+*1=~yz-f~n&I_4sqXAaZ+8PNVeoYI Kb6Mw<&;$Ugf5o3`h%i|Pg(nOJG6O&Mj zZH}hvG2H7h*KBAl&$z6SS7nXe_4oa&^E)3003Y&$^&*r zk+I(#sHBK7(y3TQQVH`y!T|DbR>`g{004G*pkVHp>!p%nFAswt&@G=3{ld#VS+Eqa zU&<%xZPtfQcwHFh%)X?s$_siHjnVL&{zPpYHC;_lv_E$PC8F)~jA_XRorXnKR${zt zG{e>Hh6aL9wT=f#Cfiu{5v#FtMu6!#E0MP=dDE;XM z0099%{(vJnI7VhSr04#iwom?LsW}{iAhIP zi%N$38^q)vGrHRF7wzq-$;tLsR=y4Xyzrc|uB#E`Wt<~9HnM{_G zlf&opeJWg>Z+yyS=$Ygymz0z&NhA%=p4~^zOE<-zS0*dU%WEWX;Ni4V?}+g5!zQpQ zbRYTZyH~9Y20}>E(pB2p-l0;d6v|#`pQ~os+FE=CH;F*-^dl=Y$;yfWxu?1s?5mSp zeiuP~Y^txWQs$i$7w0C-OLNQ4&R$qp$jtBPaAykHbo$zt)o^GQf_iUk5$c-nUr*+Q zO}5{BR9bpJV19l+#U<3vP_T%{i-12P$+NTJd9$6hXtchI)^MsX z8F4b;?vC=4nwt5!x$92lB$9!F0f)mG6)RfW1NHRsVuv)D=By!ob=V=Xfr0yjkM2LB z#1{zKiSpFgSf3pbQ28DEMnG`z>9HlpX3Y!=7`48>o}8R)WMo7ikqDWagzcpzvzTM3 zu({_10^x65sWC9!SPQD72KV&zG}Sp%hiT@IvpAH3f|qpqoI|D-iZa6E1=3D}ROjMb z^YZd68x0K&U!`uB6mj7Xfi^Za`1tsE-1`q7qVf3qMO@9{RG{Zo=GT$X0e$j3hosjm z0ZX+nzMMF8ua7Hs;vTnx;Xg+tBpkP}keJ!(-p*Q6o``0|*`@HAPFzh*&0gNZUel|2 zV`9E|^R?h?9Y*6$#$)iHDt#il3jOcc7%&}TZN2wkMSoSxaYskTsV{vr%+ra9KzA+L z^%46hd}8AA^0KA5xom#Z&(9A*T^)R6E3fCj?x3!#Idg@QZagqF)Z@MqiUu|}H;)bvqXPmyPjzJc>Qnx3@KV8F z_{BnrM51x0Yhj(8vPFOXJT5Zwx1p!tot0|t(2(Lg58d;?;jDUbX>P`b8aJHE>2!Ky zqa}%B?cy@DE*l>|mynPEhr^Av;vC8{^O1KCTuVx7yI{F>u$i@IMfH40$h*l&S65f= z;NUffGQ|oOwgdvfIrC4`T|ZTDnQS(j#j=Ayu-3&01j1amzq`Bp!LiU~QCls>jLBfk zn4g+9advWwKJiG^B&vmg#ZD=-?d|O^EM{tH?qoWu!did>I*~TKTs7ROk&%?sPUx-&AplAN# z>1mUFekI7=Orc053O;+5%8w!*h-vT-QVhZ4y=1db`%-osBYkz84{+-Pnq;X&8+|{s z!n(S;;^N|@<+rVg68&J?&Q90*Tq^B_93@PP9JQ23D5!B#UU+o&`_c1%a(%RY&=mo8 S4#g7{lm(#R-mpd}HvK;W$ELaf literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LT.svgz b/navit/xpm/country_LT.svgz new file mode 100644 index 0000000000000000000000000000000000000000..07b5472bfa243da6a7594cba330bf9668672d55b GIT binary patch literal 214 zcmV;{04e_;iwFo9D0)Z&17mM>Zgg^aUrbakb9QF{ea}k{f-n#U;Jv4qjB9Br4c>|<*sMD00AM(yN0j8&%(IQOcCMW+$xRc{t(Amcy&%RWcK7R;=@$)aLjibCM|o Z!|PofT#Fgx*nlQ5c)I$ztaD0e0suifDXahh literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LT_32_32.png b/navit/xpm/country_LT_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..1de321bf9dc68464b73b2899aebde34d47b69919 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&)%JzX3_ zJUWyA><*sMIIW>`*|Pp9gRFxqSb0D|Cwm^(rE5(ejJZsmdKI;Vst0ErPXx&QzG literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LT_48_48.png b/navit/xpm/country_LT_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..72b83aa362a0ed3ead8d55914e02200449920c66 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HPHtkzTeR6o(&QSWQ@`AMGLd_RmkBwTou*aVw9 z9FHhm>VMvscVmflihv_+}RS^IH literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LU.svgz b/navit/xpm/country_LU.svgz new file mode 100644 index 0000000000000000000000000000000000000000..c60b134872f4b4b13f38e3f4f463104733f9a2a1 GIT binary patch literal 194 zcmV;z06qU7iwFo9D0)Z&17mM>Zgg^aUrbdlb9QF{jgC7G!Y~j-`<%jBYGTI`5<=Oe z;{7JVH}5Akt4kSg#STm-GGzB&N}e z(FHFNe1M^^y0~akNFNbQN{m0(4v9T2b=oYT|;gnJvpl?|!e&e4b>-T;2257!8`5gfO07CIpAOHXW literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LU_16_16.png b/navit/xpm/country_LU_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..64596b6b751eefbac19554a06bb355ec9fd3aef2 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^;o-U3d z7QM+e>(~CC-^g^prSn;062s&3s^0yzopr0MxoH=l}o! literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LU_32_32.png b/navit/xpm/country_LU_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..b10a2f648efd956bb340755cdb117af7eaa08687 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v}|+PZ!6K zh}O4P0tFcaL|iVWURlr(=&PA}=7d6%;KR<3c6W3)Jb&F5J^N(g#m_Q84Gb!pM<*>; wSC}EG2{ib?{e~;oKl*Mwrgju4^+Wmt!>@Tf--2Fm+YM6c>FVdQ&MBb@0HcOCqW}N^ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LU_48_48.png b/navit/xpm/country_LU_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..078e97fc473834fbb04b13e950c0a28fc8814abf GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HBHV262EKJc8Z700;=SJ%xGxCa^IdB0nO6<=%^i+M6p{oCJ0x6q zlqSx+%G+Mn&ZER82p5mpIR90f^KNG(Aqf||qi@(WjM}YV0xe_kboFyt=akR{00?b5 A8vpu0F*023NpOHV|kow63KyXM!y_#u0)3N{m{|9Hd-g~+I$J&I5n(0Q`3`y!d$Fk!K RF9P*4c)I$ztaD0e0sxy8Dslh- literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LU_96_96.png b/navit/xpm/country_LU_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..e06e6e873e8ec137d28fc3b9f1fd99861dda0f57 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=AY)RhkE)4%caKYZ?lYt`7JzX3_ zD(1YsHAKYF1wc#$O2n!bzYh#mx z;{t^M0SyjfxdzYXtTxX%+f1@Xm@U_T{0qy!F^ioHyCFu%35K$DJeoD{CD6+Zp00i_ I>zopr0A24_AOHXW literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LV.svgz b/navit/xpm/country_LV.svgz new file mode 100644 index 0000000000000000000000000000000000000000..aa4fdc39a39cb7b631c15b8a6b9c24124eb43024 GIT binary patch literal 268 zcmV+n0rUPJiwFo7D0)Z&17mM>Zgg^aUrbgmb9QF{b&pX?!!Q&^pB?xgu6NJtO^`Yz9n$Z$(MZn{n^7wjaCmvAdeV=GW8&}X$5|{ zW|1LSR~cFLgHZy{%Hn!;JIn9Nmtz01+kic_uzP!WdMp4JM2DmxD)%M4zHfm?oM`im zfSq&4CDAlZ(Ue5P*wS{aj-9S8d5{9=CGs)OBk3fDH$vL)Gge&jW5!tE@$Y<&Flp&J zfhqG}>6C6eCou6BAH2y&RXfnqqb$3x|A(Q`eJ^mHr96!jq)U0;G|hE4_2;v%$G?fd S20ssDSF<0aE*o)j0RRA>M1O+- literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LV_16_16.png b/navit/xpm/country_LV_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f7832b9680917411a0bb950aa6877eec4091298c GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt@zo-U3d z8WWRqgoD!*SPdpFshW|IV6(r1HB;)}|Ns7z*e1e8MYpQj3LajGr1C+t!J!!kh#=5|IYgD!u#ij^WT{3;J82` zKtO{-goTTVwXumDZqN6RF?$oUlh5s}I(%(T1b)MI)X1&BD!t9DCho`iPBJY-aqJJK Yna!Mq$4Uf@f&ORkboFyt=akR{0MBMzWdHyG literal 0 HcmV?d00001 diff --git a/navit/xpm/country_LY.svgz b/navit/xpm/country_LY.svgz new file mode 100644 index 0000000000000000000000000000000000000000..d453d8bdfb0a3f5d7faade23688fef2d77cd628f GIT binary patch literal 239 zcmVZgg^aUrbppb9QF{eU42_#4r$s?}Gnf9M79cEDI`) z3%2Vbh%VSwJg!Ymf;C;zxbf#Zxr?Xa9iI22Uj2NHa2(?7r=U>@i7L&(fSbqT}p>*qMWnHm6)QX zP23-x?`L9=3dknnFr|b^21`eY<~d>3fA}w?l!Zsg-XzCc`GMdDZ(Y*3WWgB#P{*N9 p;El%jegA3W^c~DUCiw8A%`r|Is8>3~9H&^Xt1}XuAhQnfy=PVN1T6*{%HZkh=d#Wzp$PygTe~DWM4f>C98E literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MA.svgz b/navit/xpm/country_MA.svgz new file mode 100644 index 0000000000000000000000000000000000000000..794f083bd60d0dd77114f16375cb3064df6b21a5 GIT binary patch literal 1700 zcmV;V23z?biwFoHD0)Z&17mM>Zgg^aUrj+Sb9QF{?OAPa+cpsX-d`c8Us}wf_$rC6 zonl)MV899#U58q3=PTI6$^AZ%MIkBT_Wlezu-`x7Uyt*Q?5ILwM%&F#FfUmrc2RTs%K%d%i{UQOd@ zZlBlnYU;YHb(x`}Ox!qfRi>6IuPc`z;@X3GG?+)F3hVSjMa6PiFtLh-^`c2xSZRLhb@O=i%@I@jU$^huFt_QK+TNLRhpdFb316q z9T?L-1dJGMwre9CtGKs2D=s39N#oaPu{dr0LS2ITMT&L3TGyxQvQ~Ms8UQ*%*QoWh zUS=P`0<)#6!#J!%y;uW5C!x|g%(H4R8Mk$tJ5s|MQ>tTZttht zI@*Tej^dcPU6^JRt3@>+phwj2qVFMIL7p_RplmxY`$TCk=Ju{BYshcy9=d($X= zpckJP;2oj52JzdHcOL+VcRK)F7yxbv3PP7g%^oLm_9Y^J0QcF$xqk~jcf@>;z1$OD zJoc}GK}+JtAtwFGj^>9Z_6`*JEcWf@k`vCasm;AYyi&3-mHzkT`OUsK0A75r z^5ldC-}$8xAo%~<_;jz0kUsvMUmF1edSB|}Z?5`huI?b1Z~X+_#))+&>DlgHn>3G$ zjnnmwe9|3;`xafN2~)mru?iDaorhpGx9K5eu?nNK)^VdQ++>}`sxC5BhPm#pkddl{ ztqy96v%es1hjnK~8LP72iR>w&A}h+d{oFH8tJ1!8iiLUXp$nsXeC@D0FE-k%xxEOp zUfPGK8+xX(b_JOT@+c%j(qmL!QG%NcIK@a1kZVxaUBBxxvOT1W)@7;k+R4JLg0K?G zMRz#Nk|DT8-quUf-(djON_WQKBBQ@%VXa;`3<)YZp+q^s#79hzJfR%=a;F?&Nl*6e zw^<398k%Y5egg2B%S#-=t!D8`51ck((}CmTrshaEbT&uArYSlSXiWH6pgq&BuyJE9 z8T6x&mtkF|moG5lf=;mhL0kqC2QG%bPlPWfjzaQ%r?KCg)-g3Zp)aP7< z_4&BT3C_QP%P&DxObB6!1ir9-wFvhR_u#t`(oPCkKs+Gi1W4TqC7lrFBTs-vkG)_5 zxf>?=L1SyA{Ytw#ezeC?I?h3kC~9N2Rmh7?oedqT)2C>aFIfCE4Ue&A06 zh@DCyh=IgIL4XMdNc2ku;4zp`6cCSj04Ii7Op1O5u+;1On3(xeAdXoFprlM&9`fKY zuJTFYDs`+vqrw0yEOVtuZ42 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MA_16_16.png b/navit/xpm/country_MA_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..5c96c2463c2b7d9bb8d174ecda631c48699eea99 GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`FJzX3_ zEP9ttGR!;VAmDocjb6gdK5d5*lPQiJyPvQ;v5ILmQ)gUwWLeh~jfG573dg)1g$4N? zzfBK|%KS1v?O#tybDbZr<$-IAGpwG~GwzIuOFa<%#KSpUc0-TO>Gs=#Qy*RTJ$#Sj zzHal!L)8hKT>j4^?p$}2id5_8ly6KHm73Sixq8DM;gf8&@nJK*M%9?=bS(cJ{NYQb z2I~sRo^6(yIVYWtS1i6ii!0(t-(HTLg3mVY; l&FWBobJ{-69pPIU(+{&--0I6ZX9@HogQu&X%Q~loCIFi2cJ=@O literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MA_32_32.png b/navit/xpm/country_MA_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..916107a1443348c0f2d191a8923b62e3dc0fc07b GIT binary patch literal 561 zcmV-10?z%3P)|WK~z|U?Uv7K)KCqOLd$?k- zycklWDZr`|K-MWf1(*U<2Jn<*WQzI#Tu0%y&H4cPw!(E(C4frNecPxcUK!wxU9Ebk z&;nlxq|T5!!&l`8F?R`j4as2UxBDkcvNYD%NygJt7Tr+)Iy*N`nUB(3dBtFPG0Wo^ zO2N(EF}9qaQ@`%T2$Au8wsF93HHf+Y%BQJwrOgijuxm-Kubtq=aLk96!IjSu0MAZZ zbS5bex-A~Q^jHY!TPg z1oM&R^4AGF?Q%=0)D7%7ioR`-kl`DG$8#1d`zcWTdszy=Z7aT+f=4er0IsbaXS?Js zD%^rl3U*tPjlNH3qUlUD8-1UTO@mMtrzo@s0Ja>H_cI1p_YPk7lR1ksVM;GZ{x3kF z1Ws~z$Wdp1vcfGmN}#BCDS&@%Q-CQz?EpUjlTn{Qq-^u<00000NkvXXu0mjfDw+V+ literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MA_48_48.png b/navit/xpm/country_MA_48_48.png new file mode 100644 index 0000000000000000000000000000000000000000..a9f5650cbc1595a0de67d9f643b9551b0b125ade GIT binary patch literal 893 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 literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MC.svgz b/navit/xpm/country_MC.svgz new file mode 100644 index 0000000000000000000000000000000000000000..1ed62dd56341cc1f820ae583a7e4457d6b028e37 GIT binary patch literal 186 zcmV;r07d^FiwFoFD0)Z&17mM>Zgg^aUrj?Ub9QF{eU3p2!Y~j;_kwpA#$Sq`<-9#0MDG3A zyWmNo57?d7t2WLWvg)Hk!~8f3ky0vBU4%)CN=hj*fspLTM&W*!cMVx>SYab2E)x?C o3^(hX!p%TsSv9};I`bgDjASem!s}E2_m(d?-*8>u3GDy?0DA9J-T(jq literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MC_16_16.png b/navit/xpm/country_MC_16_16.png new file mode 100644 index 0000000000000000000000000000000000000000..96cc679409c67fe36d29679fad5332478ea19206 GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_No-U3d z8WWRk)K?sH;7U;P{JMfoiShCO|Nk?y53gWLVqm!E%c7|9yHE+Jn8DN4&t;ucLK6U! CoF5|q literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MC_32_32.png b/navit/xpm/country_MC_32_32.png new file mode 100644 index 0000000000000000000000000000000000000000..dc4de34f15e6d91030d45e3c359b744cbb2cc9e5 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W*pj^6T^Rm@;DWu&Cj&*yJY5_^ zJUWwY)K?sH@IK%YeA!)BVr#;cra*2t-33AkfByfs_tlm7DSFHPeGK>HK literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MC_8_8.png b/navit/xpm/country_MC_8_8.png new file mode 100644 index 0000000000000000000000000000000000000000..062f28471265b3065a38a00d8d2ae58d7d5142b5 GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^wj^(N7l!{JxM1({$v_clPZ!4! wj+x0e>MM>l@ERnFs(Lql{Qv*|mTk-o--KBN;}Rds0+lg%y85}Sb4q9e0M1|>=l}o! literal 0 HcmV?d00001 diff --git a/navit/xpm/country_MC_96_96.png b/navit/xpm/country_MC_96_96.png new file mode 100644 index 0000000000000000000000000000000000000000..fd693026b2119d936e4cf8907d9fb64704e2d396 GIT binary patch literal 298 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